<h2>The Anchor, With $friend.name</h2>
<<set _settle = [
"Marie sets two pints down without being asked, the way she does for the regulars, and $friend.name slides one across to you. The first one goes down mostly in silence, the comfortable kind. By the second, the talk has found its own way in.",
"$friend.name gets the round before you can reach for your wallet, waving you off like the gesture offends him. You take the stools at the quiet end, away from the jukebox, and settle in. It isn't long before the conversation is going on its own.",
"You carry the pints over and $friend.name shifts his coat off the spare stool to make room. The bar is warm and low-lit and in no hurry, and neither are you. A few mouthfuls in, the easy back-and-forth starts up the way it always has."
]>>
<<= _settle.random()>>
<br><br>
<<switch $friend.topic>>
<<case "old">>
<<speech "You" $name>>
You remember freshman year? Splitting one pitcher four ways because that's all anyone had, and still strutting around like we owned the whole town.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Four guys, one warm pitcher, and we felt like the kings of college. I've got more in the bank now than I know what to do with, and I swear I have never felt as rich as I did broke on that porch. You think we'll ever feel freedom like that again?
<</speech>>
<<speech "You" $name>>
Sure hope so, dude. We gotta have hope.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Long time ago, man. Half those guys I couldn't tell you where they ended up. You and me were the only two who actually rolled the dice on anything. That counts for something. I think it does, anyway.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the old company back through my head some nights. The parts I'd do differently.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
'Course you do. I did the same thing after I sold mine, just from the winning side, which is its own kind of haunted. The gap between your ending and my ending is luck and timing, dude. Anybody who tells you it's genius is selling something. You stepped up and swung. Most of the guys we knew never even got out of the dugout.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, well. I cashed out of mine before it could turn on me, and I'm not gonna stand here and pretend that was all me being smart. Could've gone the other way. Could've been my turn to lose the house. Buy you a beer either way, man.
<</speech>>
<</if>>
<<case "work">>
<<speech "You" $name>>
What are you even doing these days? Still "advising," whatever that's supposed to mean?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Advising. Investing. Telling founders no, mostly. Honestly? Bored out of my skull half the time. I hit the number, and then it turns out nobody tells you what you're supposed to do once you've hit it. You still want something. You've got no idea how much I miss wanting something.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
I write checks, I take meetings, I golf more than any grown man should. It's a good problem, I'm not crying into my beer about it. But you'd have hated it, the boredom of it. You always needed the fight more than the money.
<</speech>>
<</if>>
<<case "ashley">>
<<speech "You" $name>>
Me and $wife.name are... I don't know, man. We're trying. Some days it's mostly just the trying.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Okay, I'm gonna say one dumb thing and then I'm gonna be serious, 'cause you know I love you. $wife.name is still an absolute smokeshow and a guy like you has no business waking up next to a rack like that. There. Out of my system.
<</speech>>
<<speech "Friend" $friend.name>>
Now the real part. She stayed. Through all of it, the money, the company, all of it, she stayed, and I watched her do it up close. That woman is the best thing that ever happened to you, full stop. Whatever you're doing to fix it, do more of it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She's out of your league, brother, always has been, and I say that with nothing but love. She stuck around through the absolute worst of you. Repair that shit between you guys. That's all I've got. I move money around, I don't fix marriages.
<</speech>>
<</if>>
<<case "sports">>
<<speech "You" $name>>
You catch the game?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Do not get me started. Blew a fourteen-point lead in the fourth. Our guys, our actual school, on national TV, in front of God and everybody. I aged a full year watching it. You and me were never built for hope, man. We should know that by now.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Caught the back half in here. These guys were hollering about it, same faces, same hot takes every week. You forget what it's like, talking to people who've known you longer than five minutes.
<</speech>>
<</if>>
<<case "checkin">>
<<speech "You" $name>>
I'm doing alright, you know. In case you were wondering.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
I wasn't wondering, I was watching. Those are different things. You're carrying it better than you were six months ago, I'll give you that much. Just don't go dark on me again. You do not have to be winning to pick up the phone. That was never the deal between us.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, you keep saying that. Said it for about three years straight while you went under, and all I ever got back was voicemail. I'm not busting your balls. I'm just telling you the line's open. Always was. You're the one who keeps forgetting it.
<</speech>>
<</if>>
<<case "cheat_ons">>
<<speech "You" $name>>
That girl I took home from here. I shouldn't have. But God, $friend.name, she was so damn hot, and me and $wife.name hadn't... I don't know. I keep finding new ways to make it not my fault.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Hey, you're talking to the wrong priest, brother. My hands aren't clean either. There was one a few months back, I was out of town, and she was... unreal, man. And I swear I had the whole excuse written in my head before I'd even crossed the lobby. Different city, so it doesn't count. Like there's a border on it.
<</speech>>
<<speech "Friend" $friend.name>>
And this is the part I only say to you. I knew. Every second of it, I knew exactly what I was doing, and I did it anyway, and I started blaming her for being that hot before I'd even touched her. So do you. We're not confused men, you and me. We just love pretending we are.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She was hot, right? So what's the actual problem. You didn't fall in love, you didn't move her into the guest room. Guys like us have got a lot of want and only one life, and I'm not about to sit here and act like I'm any better. You enjoy it, you regret it, and now just forget it. Pretend like it never happened and eventually you'll believe it.
<</speech>>
<</if>>
<<case "cheat_sw">>
<<speech "You" $name>>
That thing down by the canal. The... you know. Honestly, I don't even count it. There's no feelings in it, $friend.name. It's basically just a fancier way of jerking off.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Yeah. I've run that exact line on myself, word for word. No feelings, it's a transaction, it's self-care with a co-pay. It's incredible what a man can talk himself into around one in the morning.
<</speech>>
<<speech "Friend" $friend.name>>
But you and me both know if $wife.name found out, "there were no feelings involved" is not the sentence that walks you out of that room. We know right where the line is, man. We just stand on the wrong side of it and squint until we can't see it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Nah, that's different, you're right. No numbers exchanged, no second date, nobody's heart's in it. It's a service, you paid for it, it's done. I tell myself the same thing and I sleep just fine. You want a clean conscience, that's sold somewhere else.
<</speech>>
<</if>>
<<case "sw_suggest">>
<<speech "Friend" $friend.name>>
Okay. Dangerous idea, stop me if I'm out of line. That woman who works the towpath down by the canal. It's early enough, and I'm drunk enough, and you've got that look you get. Two grown men, a cab, a thing we both agree never happened.
<</speech>>
<<speech "You" $name>>
$friend.name. Christ.
<</speech>>
<<speech "Friend" $friend.name>>
I'll cover the cab. I'm not covering your half of the rest, I'm rich, not a charity. When did you last do something you'd actually have to lie about? ...Bad example. When did you last do a fun one?
<</speech>>
<<case "brag3">>
<<set $friend.braggedThreesome = true>>
<<set $friend.relationship += 2>>
<<speech "You" $name>>
So. The weekend. $wife.name and me came in here, and we didn't leave alone.
<</speech>>
<<speech "Friend" $friend.name>>
Meaning what. You got a lift home.
<</speech>>
<<speech "You" $name>>
Meaning she picked a woman off that bar stool, the one you're sitting on, talked her into a cab, and the three of us went back to ours.
<</speech>>
<br>
He looks at you. He looks at the stool. He looks back at you, and you watch him go through it in order: he doesn't believe you, then he does, then for about two seconds he hates you.
<br><br>
<<speech "Friend" $friend.name>>
Get out. Get out of here. //She// did the picking?
<</speech>>
<<speech "You" $name>>
She did the picking. She did all of it. I was just told where to sit.
<</speech>>
<<speech "Friend" $friend.name>>
I have dated actresses, models, a woman who owned a vineyard, and not one of them, not ONE...
<</speech>>
<br>
Marie tells him to keep it down. He keeps it down, but only just, and when the grin finally goes it doesn't go all the way.
<br><br>
<<speech "Friend" $friend.name>>
You know what that tells me? She trusts you. That's not a fun night, that's a woman who's decided she's safe with you. Don't waste that on something stupid.
<</speech>>
<<speech "You" $name>>
Noted.
<</speech>>
<<speech "Friend" $friend.name>>
And this is the first time in years I've heard you sound like you're winning. Get the next round in, I'm not letting you pay for it though.
<</speech>>
<<case "close_call">>
<<set $friend.closeCallTold = true>>
<<speech "You" $name>>
<<switch $wife.lastEvidence>>
<<case "cash">>
$wife.name had my banking app open before I was awake. Hundred bucks out of the machine on the canal, eight minutes to midnight. I told her the card reader was down at the bar.
<<case "shirt">>
She went through the laundry. Had my shirt up to her face. Perfume on the collar. I said some girl was climbing over me to get to the bar.
<<case "text">>
Text came in from a number I hadn't saved. "Good seeing you," kiss on the end. She read it before I did. I said it was one of your guys' girlfriends.
<<case "receipt">>
She found the Ring-A-Ding receipt. Smoothed it out and left it on the dresser for me. I said it was my round and I sat on my hands all night.
<<case "photo">>
She got into my phone. Found a picture from the back room at Ring-A-Ding. I said the guys were sending stuff round.
<</switch>>
<</speech>>
<br>
He puts his pint down. He does not laugh, which from him is a bad sign.
<br><br>
<<speech "Friend" $friend.name>>
<<switch $wife.lastEvidence>>
<<case "cash">>
Card reader was down. Every bar in this town has been cash only for you exactly once, and it's always the night you need it. That's a two out of ten, man.
<<case "shirt">>
Climbing over you. To get to the bar. And it ends up on the //inside// of your collar. I've heard better from guys who'd been drinking since noon.
<<case "text">>
One of my guys' girlfriends. Which one? Because I'm gonna need to brief him before she does. That's a three, and only because she can't check it without looking crazy.
<<case "receipt">>
Sat on your hands. At Ring-A-Ding. Where you know the dancers by name. That's a zero. I'd have gone with a bachelor party. Nobody checks a bachelor party.
<<case "photo">>
You //kept// it. On the phone she knows the code to. Man, I've watched you do a lot of stupid things over twenty years and that is the one I'd have bet against.
<</switch>>
<</speech>>
<<if $wife.lastEvidenceKind === "believed">>
<<speech "Friend" $friend.name>>
And she bought it?
<</speech>>
<<speech "You" $name>>
She said she was choosing to.
<</speech>>
<<speech "Friend" $friend.name>>
Oh, that's worse. That's not buying it, that's a loan. Interest on that comes due, brother. Go home and be boring for a month. Boring is the whole play.
<</speech>>
<<elseif $wife.lastEvidenceKind === "repeat">>
<<speech "Friend" $friend.name>>
And she's still in the house.
<</speech>>
<<speech "You" $name>>
She took it with her when she left the room.
<</speech>>
<<speech "Friend" $friend.name>>
She's keeping receipts. Literally. You're not getting caught, man, you're getting catalogued. Stop. For a while. I'm being serious for once, write it down.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
And she let it sit?
<</speech>>
<<speech "You" $name>>
She said she wanted to be wrong.
<</speech>>
<<speech "Friend" $friend.name>>
Then help her be wrong. Go home, be boring for a month. Boring is the whole play. And next time you need a story, call me first. I'm a professional.
<</speech>>
<</if>>
<<case "brag_anal">>
<<set $friend.braggedAnal = true>>
<<set $friend.relationship += 1>>
<<speech "You" $name>>
You know what $wife.name let me do the other night? Twice now, actually.
<</speech>>
<<speech "Friend" $friend.name>>
I'm gonna need you to be specific, and then I'm gonna need you to never be specific again.
<</speech>>
<<speech "You" $name>>
Back door. She hasn't let me near that since college. I'd written it off. Filed it under things I used to have.
<</speech>>
<br>
His pint stops halfway up. He looks at you over it for a good three seconds.
<br><br>
<<speech "Friend" $friend.name>>
Married. Kid. Mortgage. And she's opening the archives for you. You know what I get? Girls who tell me it's a fourth-date thing, and then there's no fourth date.
<</speech>>
<<speech "You" $name>>
So date them longer.
<</speech>>
<<speech "Friend" $friend.name>>
Or, hear me out, I keep doing what I'm doing. Twenty-two, twenty-three, straight out of school. They haven't figured out yet what they're supposed to say no to. It's all still on the table. Liberated, man. It's a beautiful age.
<</speech>>
<<speech "You" $name>>
That's the saddest thing you've ever said to me.
<</speech>>
<<speech "Friend" $friend.name>>
It's not sad, it's efficient. Anyway. Round's on you, college boy.
<</speech>>
<<case "brag_dancer">>
<<set $friend.braggedDancer = true>>
<<set $friend.relationship += 1>>
<<speech "You" $name>>
Took $dancer.name out. Properly. Not the club. The Marlowe, across town.
<</speech>>
<<speech "Friend" $friend.name>>
The Marlowe. The one with the shops in the lobby.
<</speech>>
<<speech "You" $name>>
That one.
<</speech>>
<<speech "Friend" $friend.name>>
So, what, dinner, and then...
<</speech>>
<<speech "You" $name>>
And then a room. Her name on it. Her rules.
<</speech>>
<br>
He puts the pint down and does the maths on his fingers, out loud, item by item, and arrives at a number that's close enough to make you look at your glass.
<br><br>
<<speech "Friend" $friend.name>>
Brother. I've paid that for a night and I've paid it for a wedding and I couldn't tell you which one I regret. Here's my only question. Did she look at you like she was working?
<</speech>>
<<speech "You" $name>>
<<if $dancer.relationship >= 35>>
No.
<<else>>
Not the whole time.
<</if>>
<</speech>>
<<speech "Friend" $friend.name>>
Then you got a deal. Everything else in your life is costing you more than that and looking at you worse. Next round's on the man with the mistress.
<</speech>>
<<case "club_suggest">>
<<speech "Friend" $friend.name>>
You know what this place is missing? Women. A stage. Drinks that cost three times as much.
<</speech>>
<<speech "You" $name>>
You're describing Ring-A-Ding.
<</speech>>
<<speech "Friend" $friend.name>>
I'm describing Ring-A-Ding. Come on. I'll cover the door, you get your own drinks, and we'll be home at a reasonable hour like the respectable men we are.
<</speech>>
<<if $club.job>>
<<speech "Friend" $friend.name>>
And you work the door there now, so we're basically VIPs. Do not ruin this for me.
<</speech>>
<</if>>
<</switch>>
<<if $friend.topic === "sw_suggest">>
<br>
<<if $money >= 75>>
<<link "Split a cab to the canal and go find her. ($75)" "Canal SW Friend">>
<<set $money -= 75>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $friend.relationship += 1>>
<<set $friend.swShared = true>>
<</link>>
<<else>>
//$friend.name is already eyeing the door for a cab, but your share would be $75 and you're short. He's generous, not that generous.//
<</if>>
<br>
<<link "Laugh him off and call it a night." $return>><</link>>
<<elseif $friend.topic === "club_suggest">>
<br>
<<if $money >= 20>>
<<link "Split a cab to Ring-A-Ding. ($20)" "Ring-A-Ding, Friend">>
<<set $money -= 20>>
<<set $time = $timeMax>>
<<set $drunk += 2>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set $friend.relationship += 3>>
<</link>>
<<else>>
//$friend.name is already calling a cab, but the drinks alone would be $20 and you're short.//
<</if>>
<br>
<<link "Laugh him off and call it a night." $return>><</link>>
<<else>>
<br>
<<link "Get the next round in, then head off." $return>><</link>>
<</if>><h2>Her Place</h2>
<<set $onsEver = true>>
<<if not $ex.live and random(1, 100) <= 60>>
<<set $ex.live = true>>
<<set $ex.saved = false>>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares = 0>>
<</if>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<sexEnergy 1>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"Her flat feels like a stranger’s place, the furniture and the scent of her life pressing in from every side, but the booze keeps your head quiet. You shove her against the hallway wall the second the door clicks shut. Your hands yank her dress up, fingers hooking her panties aside as you free your cock and slam into her wet pussy in one rough thrust. She gasps, legs wrapping around you, and you fuck her hard against the wall, hips snapping, balls slapping her ass with every deep plunge. Her cunt grips you tight, slick and hot, and you pound her until your thighs burn. Afterward she is already half asleep, and you find your clothes in the dark.",
"You barely register the room around you. Her breath tastes like whiskey when your mouths crash together. You shove her onto the unfamiliar bed, yank her jeans and panties down in one motion, then drive your cock straight into her soaked pussy. She moans and spreads wider as you slam into her, the mattress creaking under every brutal thrust. She claws at your back, pulling you harder into her cunt. You flip her onto her stomach, grip her hips, and fuck her from behind, burying yourself to the hilt again and again. Her pussy milks your cock as she comes, and you follow right after. When you finally pull out she is already drifting off, the sheets damp beneath her. You find your clothes in the dark and dress without looking back."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>The Anchor</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set _barImg = "images/characters/npc/bar" + random(1, 7) + ".jpeg">>
<<set _approach = [
"You carry your drink down the bar before the nerve goes, and find a line that isn't quite as smooth as it sounded in your head. She lets you finish it anyway.",
"You take the stool beside her and say something. She turns, looks you over without hurry, and decides whether you're worth the next five minutes.",
"You go over. The opener is nothing special, but she laughs, or is kind enough to, and for a moment the night could go either way."
]>>
<div class="intro-image">
<img @src="_barImg" width="100%">
</div>
<br>
<<= _approach.random()>>
<br><br>
/* Success roll. base + fitness + a drunkenness sweet spot peaking at $drunk 3
+ a little job-level swagger. Tune any of the four freely. */
<<set _chance = Math.max(5, Math.min(90,
10
+ ($fitnessTier * 8)
+ (20 - (Math.abs($drunk - 3) * 7))
+ (($job.level - 1) * 3)
))>>
<<if random(1, 100) <= _chance>>
<<set _win = [
"Whatever you said, it lands. The talk runs easy and the drinks keep coming. At some point you set your glass down and ask whether you should walk her home. She is down.",
"After a few drinks, she leans in closer than the noise strictly requires. When she says her place is two streets over, it isn't really a question, and you're already reaching for your coat."
]>>
<<= _win.random()>>
<br><br>
<<link "Go with her." "Anchor ONS">>
<<set $onsToday = true>>
<</link>>
<<else>>
<<if $drunk >= 6>>
<<set _lose = [
"The words slur heavier than you mean them to, and she watches you find the end of the drunken sentence with the patience of someone already deciding against it. She's gone to find her friends before you've quite landed the point.",
"You're drunker than you'd let yourself believe, and she can see it. She's polite about it, pats your arm like out of friendly pity, and turns back to the bar."
]>>
<<else>>
<<set _lose = [
"It just doesn't catch. She's friendly enough, gives you a couple of minutes, then her attention drifts back to her phone in the way that means the door is closed.",
"She clocks the pale band on your finger, or maybe just the married look that comes off you whether the ring is there or not, and the warmth goes out of it. She wishes you a good night and means goodbye."
]>>
<</if>>
<<= _lose.random()>>
<br><br>
<<link "Back to your drink." $return>><</link>>
<</if>><h2><<print passage()>></h2>
<<if $wife.location == "bathroom" and !($wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0))>>
<<include 'Bathroom, Eject'>>
<<else>>
<<include 'Bathroom, Description'>>
<<include 'Bathroom, Triggers'>>
<<include 'Bathroom, Basics'>>
<<include 'House, Transport'>>
<</if>><h2>Bathroom Door</h2>
The door is shut. You can hear water moving on the other side.
<br><br>
''What do you do?''
<br>
<<if $wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0)>>
<<link "Knock and step inside." "Bathroom">><</link>>
<<else>>
<<link "Knock and ask to come in." "Bathroom Refused">>
<<moodShift -1 -1>>
<</link>>
<</if>>
<br>
<<if !$wife.spiedToday>>
<<link "Try to peek through the gap." "Bathroom Spy">><</link>>
<<else>>
//You've already pushed your luck once today.//
<</if>>
<br>
<<link "Leave her be." $return>><</link>><h2>Bathroom Door</h2>
You knock. There's a pause, then her voice through the door, low and tight.
<br><br>
<<speech "Wife" $wife.name>>
Just give me five minutes. Please.
<</speech>>
<br><br>
<<link "Step away." $return>><</link>><h2>Bathroom Door</h2>
You ease toward the door and angle yourself to the narrow gap by the hinge.
<br><br>
<<set $wife.spiedToday = true>>
<<set _catchChance = Math.max(25, Math.min(90, 45 - $wife.mood * 15))>>
<<if random(1, 100) <= _catchChance>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
You catch a glimpse through the gap. Bare skin slick with water, the curve of her back as she rinses her hair. Then the latch shifts under your weight and gives you up. She turns sharply, sees you, and her face goes hard. <span class="arousal">Arousal increased.</span>
<br><br>
<<speech "Wife" $wife.name>>
Are you serious right now? What is wrong with you?
<</speech>>
</div>
</div>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<moodShift -2 -3>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
For a moment you watch unnoticed. The line of her shoulder, the curve of her hip, steam rising off the tile, water tracing every inch of her skin. Then a board creaks under your foot and you ease back before she turns. <span class="arousal">Arousal increased.</span>
</div>
</div>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</if>>
<<link "Step away." $return>><</link>>/* Shower */
The shower waits behind a thin curtain, the water always taking a moment to warm up.
<br>
<<if $time >= $timeMax>>
//It's too late in the day for a cold shower.//
<<elseif $arousal >= 3>>
<<link "Take a cold shower to clear your horny head a bit." $return>>
<<set $arousal = Math.max($arousal - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</link>>
<<else>>
//Clear-headed enough. A shower can wait.//
<</if>>
<<soloVent "bathroom">>/* Base description */
A small bathroom with a shower over the tub, a sink set into a narrow vanity, and a mirror that has seen better days. Tile runs halfway up the walls, the grout a shade darker than it should be in the corners. The window above the toilet is frosted glass, letting in light and nothing else.
/* Time */
<<switch $time>>
<<case 0>>Early morning light comes dimly through the frosted glass.
<<case 1>>It's late morning, and the air is still damp from the first shower.
<<case 2>>At midday the only sound is the tap dripping.
<<case 3>>In the afternoon the room is dim and a little stale.
<<case 4>>Late afternoon leaves the room in half-light.
<<case 5>>By early evening the only light comes in from the hallway.
<<case 6>>It's evening, and the bulb hums for a second when you flick the switch.
<<case 7>>It's late evening, and you can hear the pipes.
<<case 8>>It's night, and the tiles are cold under your feet.
<</switch>>
<br><br><<include 'Bathroom, Description'>>
$wife.name pushes the door open and stops short when she sees you still in here. Her jaw sets.
<br><br>
<<speech "Wife" $wife.name>>
Out. I'd like a minute to myself.
<</speech>>
<br><br>
<<moodShift -1>>
<<link [[Step out.|Living Room]]>><</link>><<if $wife.location == "bathroom">>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
/* SHOWER tier - she lets you see her naked */
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 2>>
$wife.name is in the shower, the curtain pulled half open. She catches your eye through the steam and doesn't bother covering up.
<<else>>
$wife.name is in the shower, water tracing down her skin. She glances over when you come in but doesn't reach for the curtain.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<elseif $wife.relationship >= 25 and $wife.mood >= 0>>
/* TOWEL tier - drying after a bath */
<div class="char-scene">
<img @src="either('images/characters/w/w_towel1.jpeg', 'images/characters/w/w_towel2.jpeg', 'images/characters/w/w_towel3.jpeg', 'images/characters/w/w_towel4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is drying herself after a bath, skin still pink from the heat. She catches your reflection and gives you a small look but keeps working the towel.
<<else>>
$wife.name is drying herself after a bath, the towel moving in slow, distracted strokes. She doesn't look up when you come in.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<else>>
/* CLOTHED tier - fully dressed routine */
<div class="char-scene">
<<if $time <= 1>>
<img @src="'images/characters/w/w_sleepwearBathroom1.jpeg'" class="char-img">
<<else>>
<img @src="either('images/characters/w/w_casualBathroom1.jpeg', 'images/characters/w/w_casualBathroom2.jpeg')" class="char-img">
<</if>>
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is at the mirror, going through her routine. She meets your eye in the glass.
<<elseif $wife.mood == 0>>
$wife.name is at the mirror, going through her routine.
<<else>>
$wife.name is at the mirror, her eyes fixed on her reflection, jaw set.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bathroom">><h2><<print passage()>></h2>
<<include 'Bedroom, Description'>>
<<include 'Bedroom, Triggers'>>
<<include 'Bedroom, Basics'>>
<<include 'House, Transport'>>/* Bed */
The bed rests against the wall, its presence steady and familiar.
<br>
<<if $time >= 6>>
<<link 'Sleep until tomorrow.' "Sleep">><</link>>
<<else>>
//It's too early to sleep.//
<</if>>
<<soloVent "bedroom">>
<br><br>
/* Desk */
<<if $items.pc>>
A small desk holds your computer, the screen dark for now.
<br>
<<link [[Use the computer.|Computer]]>><</link>>
<<else>>
A small desk sits against the wall, its surface mostly clear, a chair tucked in beneath it.
<br>
//If you had a computer, you could set it up here.//
<</if>>/* Base description */
A simple bedroom with a double bed against the main wall. Two bedside tables sit on either side, with a wardrobe and chest of drawers providing basic storage. A reading lamp rests within reach of the bed, and curtains cover the window.
/* Time description */
<<switch $time>>
<<case 0>>Early morning light comes in around the edges of the curtains.
<<case 1>>By late morning the room is bright.
<<case 2>>At midday the room is evenly lit.
<<case 3>>The afternoon sun sits on the far wall.
<<case 4>>Late afternoon light comes in low through the curtains.
<<case 5>>In the early evening the room starts to go dim.
<<case 6>>It's evening, and you'd need the lamp on to read.
<<case 7>>It's late evening, and only the reading lamp is on.
<<case 8>>It's night, and the room is dark.
<</switch>>
/* Chore State */
<<if $chores.bedroom>>
<span class="good">The room is tidy and in order.</span>
<<else>>
<span class="warning">The bed is unmade, and a few things have been left out of place.</span>
<</if>>
/* Bedroom Chore */
<<chore "bedroom" "Tidy the bedroom.">>
<br><br>/* Fitness Feedback */
<<fitnessFeedback>>
/* Wife is here */
<<if $time == 7>>
<<intimacyReady>>
<<if $wife.lingerieNightDay > 0 and $gameDay >= $wife.lingerieNightDay
and $wife.relationship >= 40 and $wife.mood >= 1
and _ready and not $wife.intimacyToday
and $gameDay >= $intimacyUnlockDay and not $wife.cycleOff>>
<<goto "Wife Lingerie Night">>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, getting ready for bed. She catches your eye in the mirror.
<<elseif $wife.mood == 0>>
$wife.name is here, getting ready for bed.
<<else>>
$wife.name is here, going through her routine without looking at you.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<elseif $time == 8>>
<<if $wife.wardrobeMalfunction>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearMalfunction1.jpeg', 'images/characters/w/w_sleepwearMalfunction2.jpeg','images/characters/w/w_sleepwearMalfunction3.jpeg','images/characters/w/w_sleepwearMalfunction4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from you. The blanket has slipped and her nightclothes have shifted up and she is unknowingly flashing her breasts. She'd probably be even more annoyed if she knew how you stood and took in the sight.
<<else>>
$wife.name is asleep, her breathing slow and steady. The blanket has slipped and her nightshirt has shifted up showing her breasts. You admire them for a while.
<</if>>
<<if not $wife.wardrobeSeen>> <span class="arousal">Arousal increased.</span><</if>>
</div>
</div>
<<if not $wife.wardrobeSeen>>
<<set $wife.wardrobeSeen = true>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<</if>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearSleeping1.jpeg', 'images/characters/w/w_sleepwearSleeping2.jpeg','images/characters/w/w_sleepwearSleeping3.jpeg','images/characters/w/w_sleepwearSleeping4.jpeg','images/characters/w/w_sleepwearSleeping5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from your side of the bed.
<<else>>
$wife.name is asleep, her breathing slow and steady.
<</if>>
</div>
</div>
<</if>>
<<elseif $weekday >= 6 and $time == 0>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is still in bed, relaxed in the soft morning light. She shifts to make room when you come in.
<<elseif $wife.mood == 0>>
$wife.name is still in bed, relaxing in the soft morning light.
<<else>>
$wife.name is still in bed, turned away from the door, the blanket pulled up high.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
<<if $wife.mood >= 0 and not $wife.lazyMorningToday>>
<br>
<<link "Crawl back in beside her for a while." "Lazy Morning">><</link>>
<</if>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bedroom">><h2>Lower Hill Boxing Club</h2>
A converted warehouse off the canal, the sign above the door faded to a ghost of itself. Inside it smells of sweat, old leather, and the kind of disinfectant that doesn't fool anyone. A ring takes up the center, heavy bags hang in two rows along the wall, and a couple of regulars are usually working a rhythm on the speed bags. The owner, a thickset man called Vance, runs the place more out of stubbornness than profit.
<<switch $time>>
<<case 0>>Early morning. A handful of older men are already here, working their rounds in silence. The radio is on low.
<<case 1>>Late morning. The place is quiet, just Vance behind the counter and one kid hitting the heavy bag with more anger than technique.
<<case 2>>Midday. The lunch crowd, such as it is. A few office shirts on hangers by the changing room door.
<<case 3>>Early afternoon. Quiet again. Vance is on a phone call he isn't enjoying.
<<case 4>>Late afternoon. The after-work rush is starting, the bags all in use, the air heavier already.
<<case 5>>Early evening. The place is busy. The smell is rich. Somebody on the bag has good form and is making sure everyone knows it.
<<case 6>>Evening. Last classes are wrapping up. Vance is rolling down the shutters at the front.
<<case 7>>The shutters are down. The club is closed.
<<case 8>>The club is closed.
<</switch>>
<br><br>
<<if $time >= 7>>
//The club is closed for the night.//
<<else>>
A session costs $15.
<br>
<<workout "Pay for a session and train hard." 2 1 3 15>>
<</if>>
/* Saturday bareknuckle fighting */
<<if $weekday == 6 and ($time == 5 or $time == 6)>>
<br><br>
The ring in the center is roped off and the heavy bags shoved back against the walls. There's a bareknuckle card tonight, the kind Vance doesn't advertise and the police don't drop in on. A crowd is already thickening around the ropes.
<br>
<<if $fitnessTier >= 1 and not $foughtToday and $energy >= 3>>
Vance leans in, voice low. //"Bare fists, no names, cash to the man left standing. You want in?"//
<br>
<<link "Enter the card." "Boxing Fight">><</link>>
<br>
<<elseif $fitnessTier < 1>>
//Vance shakes his head before you ask. You're not stepping in there in the shape you're in. But you can watch.//
<br>
<<elseif $foughtToday>>
//You've already left it all in the ring tonight. One card is enough.//
<br>
<<elseif $energy < 3>>
//You're dead on your feet. No fighting tonight, but you can stand at the ropes.//
<br>
<</if>>
<<link "Watch from the crowd." "Boxing Spectate">><</link>>
<</if>>
<br><br>
<<link [[Back out to the canal.|Canal Path]]>><</link>><h2>The Ring</h2>
<<set $foughtToday = true>>
<<addWorry 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<div class="intro-image wide">
<img @src="either('images/scenes/boxing/boxing_pov1.jpeg', 'images/scenes/boxing/boxing_pov2.jpeg')" width="100%">
</div>
<br>
/* Win chance scales with conditioning. Tune the 25 and 13. */
<<set _winChance = 25 + $fitnessTier * 13>>
<<set _won = (random(1, 100) <= _winChance)>>
<<if _won>>
<<set _purse = 50 + $fitnessTier * 25 + random(0, 20)>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $fitness += 2>>
<<set _winText = [
"The crowd packs in around the ropes, cigarette smoke and money already moving in folded handshakes. Your opponent is bigger and slower, and somewhere in the second round you find the old rhythm, the one that lived in your hands before the weight and the desk. You put him down on the canvas, and Vance counts the bills into your palm before you've got your breath back.",
"No gloves, no headgear, no scorecard, just two men and a crowd that paid to watch one of them fold. Your hands are wrecked by the end and your face will tell the story for a week, but you read him early and you drop him. The man with the bag pays out without meeting your eye."
]>>
<<= _winText.random()>>
<br><br>
<span class="good">You won the bout. Purse: $<<print _purse>>.</span>
<<else>>
<<set _purse = 15>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 4, 0)>>
<<set $fitness += 1>>
<<moodShift -1>>
<<set _lossText = [
"Bare knuckles punish the rusty, and the rust on you is realer than you let yourself believe. You catch one clean punch to chin and the lights swim and the canvas comes up to meet you. You last longer than the crowd expected though not as long as you needed to. Vance presses a few bills into your hand out of something like pity and tells you to ice the hand.",
"Your opponent is younger, hungrier, and he has done this more recently than you. Without gloves and headgear there's nowhere to hide, and he finds your face again and again until the round saves you. You stay upright to the end, which is the most that can be said. A thin fold of show money, and a walk home you'll feel for days."
]>>
<<= _lossText.random()>>
<br><br>
<span class="warning">You lost. Show money: $<<print _purse>>.</span>
<</if>>
<br><br>
<<link "Head back out." $return>><</link>><h2>At the Ropes</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.min($energy + 1, $energyMax)>>
<div class="intro-image wide">
<img src="images/scenes/boxing/boxing_ringside1.jpeg" width="100%">
</div>
<br>
<<set _watchText = [
"You find a gap at the ropes and watch. Two men you half recognize from the heavy bags trade bare-fisted shots until one of them stops getting up. It's ugly, and you can see why men keep coming back.",
"You stand in the crowd and let the night happen. A wiry kid with fast hands takes apart someone twice his size, and the money moves around you in folded handshakes. Nobody asks your name. For an hour you are nothing but another face at the ropes.",
"The card runs three bouts while you watch. One ends in seconds, one drags until both men can barely lift their arms, and the last is close enough that the room forgets to breathe. You leave before the cash is fully counted, the smell of it still on you."
]>>
<<= _watchText.random()>>
<br><br>
<<link "Head back out." $return>><</link>><h2><<print passage()>></h2>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _joggerImg = "images/characters/npc/jogger" + random(1, 5) + ".jpeg">>
<div class="char-scene">
<img @src="_joggerImg" class="char-img">
<div class="char-text">
<<set _lines = [
"A woman comes toward you on the path, moving at a good pace. She holds your eye for a beat longer than the narrow path requires, and neither of you slows.",
"You pass a jogger going the other way. She glances over as you draw level, and you catch yourself looking back over your shoulder once she's gone by.",
"A woman runs past close on the narrow stretch. For a second your eyes meet, and she's the one who doesn't look away first.",
"You nearly clip shoulders with a woman heading the other direction. She turns her head as you pass, and so do you, and the run feels different for the rest of it."
]>>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<<link "Finish your run." $return>><</link>><h2><<print passage()>></h2>
The canal cuts through the back of the neighborhood, the path along it cracked asphalt patched in places with rougher gravel. On one side a row of warehouses, mostly converted, mostly to nothing useful. On the other, water dark with algae and the occasional shopping cart. In the distance, the Helion tower catches whatever light the day has left.
<<switch $time>>
<<case 0>>The path is empty in the early morning. Mist hangs over the water, and the only sound is your own breathing.
<<case 1>>Late morning brings a few cyclists and dog walkers, all moving with the unhurried purpose of people who don't have anywhere to be.
<<case 2>>Midday sun flattens the canal into a dull metallic shine. The benches are taken by men with cans they aren't trying to hide.
<<case 3>>Afternoon light slants across the water. A heron stands on the far bank, indifferent to everything.
<<case 4>>Late afternoon, and the path is starting to fill with people heading home, hands deep in pockets, eyes down.
<<case 5>>Early evening turns the water gold for a few minutes before letting it go again.
<<case 6>>Evening dims the canal, lamps coming on along the far bank in patchy intervals.
<<case 7>>Late evening, and the path is almost empty. The water is a black slick, the warehouses dark behind it.
<<case 8>>Night. The path is unlit in long stretches, and only a fool would jog it now.
<</switch>>
<br><br>
/* Going for a run */
Not a bad place for getting some exercise.
<br>
<<if $time >= $timeMax>>
//It's too late for a run.//
<<elseif $arousal >= 8>>
//You can't focus on a run while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < 1>>
//You're too exhausted to train right now.//
<<else>>
<<link "Go for a run along the canal.">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
/* Roll for the jogger encounter on this run */
<<if random(1, 100) <= 40>>
<<goto "Canal Jogger">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
/* Boxing Club */
A converted warehouse sits back from the path, the faded sign of the Lower Hill Boxing Club above its door.
<br>
<<if $time <= 6>>
<<link [[🥊 Head into the boxing club.|Boxing Club]]>><</link>>
<<else>>
//The boxing club has its shutters down for the night.//
<</if>>
<br><br>
/* Ring-A-Ding */
Further along, a neon sign buzzes over a warehouse door. Ring-A-Ding. A doorman on a stool, a velvet rope, a thump of bass you can feel from the path.
<br>
<<if $time < 5>>
//Ring-A-Ding doesn't open until early evening.//
<<elseif $time >= $timeMax>>
//Ring-A-Ding has stopped letting people in for the night.//
<<elseif $club.job>>
<<link "💃 Nod to the door and head inside. They know you." "Ring-A-Ding">><</link>>
<<elseif $money >= 10>>
<<link "💃 Pay the cover and head into Ring-A-Ding. ($10)" "Ring-A-Ding">>
<<set $money -= 10>>
<</link>>
<<else>>
//The cover at Ring-A-Ding is $10, and you're short.//
<</if>>
/* Evening: Lady of the night */
<<if $time >= 5 and $time < $timeMax>>
<br><br>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
A blonde woman is waiting where the lamplight gives out, scanning the path. She catches your eye and holds it as you pass.
<br>
<<link '//"Looking for some company?"//' "Canal SW Approach">><</link>>
</div>
</div>
<<else>>
<br><br>
<</if>>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>Lady of the Night</h2>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
You slow, and she falls into step, steering the two of you into the dark stretch past the last working lamp. Up close she is older than the lamplight suggested, her smile worn smooth from use. She names her prices without much ceremony.
</div>
</div>
<<if $money >= 30>>
<<link "Pay for a handjob. ($30)" "Canal SW Physical">>
<<set $money -= 30>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<addSuspicion 1>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "hj">>
<</link>>
<<else>>
//A handjob ($30), but you're short.//
<</if>>
<br>
<<if $money >= 50>>
<<link "Pay for a blowjob. ($50)" "Canal SW Physical">>
<<set $money -= 50>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<addSuspicion 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "bj">>
<</link>>
<<else>>
//A blowjob ($50), but you're short.//
<</if>>
<br>
<<if $fitnessTier < 3 and $energy < 1>>
//Sex ($90), but you're too worn out to manage it tonight.//
<<elseif $money >= 90>>
<<link "Pay for sex. ($90)" "Canal SW Physical">>
<<set $money -= 90>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "sex">>
<<sexEnergy 1>>
<</link>>
<<else>>
//Sex ($90), but you're short.//
<</if>>
<br><br>
<<link "Think better of it and walk on." $return>><</link>><h2>Her Flat</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("sw1_mmf" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"She doesn't even blink at the pair of you on her step, just adjusts the number and stands aside. The flat is the same lamplit, lived-in dim as before, only now there's $friend.name filling the doorway behind you, drunk, loud and with a big grin on face. A couple of minutes later she is sitting on the edge of the bed sucking you off in turns, and the inital awkwardness lifts. Before long, she bends over the bed. You step in behind her and push your cock into her pussy while she opens her mouth for $friend.name. He grips her hair and feeds his dick between her lips. You fuck her from behind in hard thrusts, hips slapping her ass, while she gags around his cock and takes both of you without pause, like the professional she is. She stays on her hands and knees as you switch positions, $friend.name moving behind her to pound her pussy while you fuck her mouth. Afterward $friend.name is already telling it back to you like a story, and you both laugh, because the alternative is thinking about it.",
"The cab ride is all $friend.name, narrating the night like it's already legendary. She meets you at the foot of the stair, counts the cash without a word, and takes the two of you up. Inside the warm, lamplit flat she drops to her knees on the rug and gets to work fast. She wraps her lips around your cock first, sucking hard and wet, tongue sliding under the head while her hand pumps the base. She alternates between you, jerking whichever cock isn’t in her throat, keeping both of you rock hard. As she lies down on the bed and spreads her legs, $friend.name quickly gets between them first and push into her wet pussy while she angles her head to the side and opens her mouth for you. $friend.name grabs her tit and fucks her in short, rough thrusts. Her tongue works your cock as your hips slowly drive in and out. You switch places. You ram into her pussy while $friend.name feed his cock down her throat. The room fills with wet sounds, skin on skin, her muffled moans, the slap of balls against her. $friend.name cums first, shooting thick ropes straight down her throat. You pull out and paint her stomach with heavy spurts. She wipes her mouth, cleans up with a towel, and pulls her clothes on. Outside you catch each other’s eyes and break into the same drunk, guilty laugh."
]>>
<<= _scene.random()>>
<br><br>
<<link "Head home." "Living Room">><</link>><h2>Her Flat</h2>
<<set $swEver = true>>
<<switch $swService>>
<<case "hj">>
<<set _gifs = ["sw1_hj1.gif", "sw1_hj2.gif"]>>
<<case "bj">>
<<set _gifs = ["sw1_bj1.gif", "sw1_bj2.gif"]>>
<<case "sex">>
<<set _gifs = ["sw1_h1.gif", "sw1_h2.gif"]>>
<</switch>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<switch $swService>>
<<case "hj">>
She leads you up the narrow stair to the flat that reeks of someone else's stale smoke and sweat. Her grip is tight and slick from the lube she keeps by the bed, stroking your cock in fast, mechanical pumps while her eyes stay glued to the window like she's already thinking about the next client. Your cock throbs in her fist, balls tightening fast under the relentless tug, and you spill thick ropes of cum across her knuckles before you've even caught your breath. She wipes the mess off on the towel she keeps ready, then nods toward the door and tells you to mind the step on the way down.
<<case "bj">>
The flat is small and dim, lit only by a lamp draped in a scarf. She drops to her knees without a word, takes your cock into her mouth and works it with slow, practiced strokes. Her tongue slides along the shaft while her lips form a tight seal, sucking steadily until your balls tighten and you pump thick cum straight down her throat. She swallows without fuss, stands, and sees you to the door with the brisk, almost kind efficiency of a woman closing up a shop.
<<case "sex">>
Her flat is warmer than you expected, lived in, a kettle somewhere and a coat thrown over a chair. For a little while, in the lamplight, it is easy to mistake it for something it isn't, and she is good at letting you. She drops to her knees right there by the bed, pulls your cock out and sucks it down fast and wet, her mouth working in quick, practiced pulls until you're stiff and throbbing against her tongue. She lies down and spreads her legs for you. You get between them and grab her tit while pushing inside. She stays quiet while you fuck her in steady thrusts, then she shifts onto all fours. You follow, sliding back into her from behind, pounding harder now as her ass slaps against you. You don't last long. You fill the condom deep in her pussy while she stays on her hands and knees, breathing steady. She pulls off, ties the condom and tosses it, then starts pulling her clothes back on. You're still catching your breath in her sheets when she hands you your shoes.
<</switch>>
<br><br>
<<link "Head back out." $return>><</link>><h1>$name</h1>
''Physique''
<br>
Looking at your fitness and physique, you're
<<switch $fitnessTier>>
<<case 5>>
in peak condition, powerful and finely tuned. There's nothing soft left to find. Holding a body like this takes real discipline, but you've earned the right to it.
<<case 4>>
very athletic. You move with a strength and confidence you'd half forgotten was ever yours, and your reflection is something you don't mind catching anymore.
<<case 3>>
athletic, and clearly in good shape. Your body does what you ask of it without complaint. Sex, and the quieter moments you take to yourself, don't cost you anything now; you come away from them loose and easy rather than wrung out.
<<case 2>>
fit. The old softness has mostly burned off, and there's real stamina behind you; you reach the end of a day with something still in reserve. This is about as far as raw energy alone will carry you, though. From here, staying in shape starts to pay off in other ways.
<<case 1>>
getting in shape. The changes are just starting to show, and there's a little more in the tank than there used to be. A day doesn't empty you out quite as fast.
<<default>>
out of shape. Thirty pounds you didn't used to carry, and you feel every one of them on the stairs and in the mirror. Even a little training would start to give some of it back.
<</switch>>
<br>
<<if $fitnessTier >= 5>>
<<meter 1 1 "Peak condition" "#FF9F40">>
<<else>>
<<set _prev = [0, 10, 15, 20, 30][$fitnessTier]>>
<<set _next = [10, 15, 20, 30, 45][$fitnessTier]>>
<<set _progress = $fitness - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next level" "#FF9F40">>
<</if>>
<br><br>
''Home''
<br>
Home is a cramped two-bedroom flat off the bypass, the radiators loud and half the boxes still in the hall. It's a roof, and not much more than that. <strong>Rent runs $<<print $rent>> a week</strong>, due every Sunday.
<<if $money >= $rent>>
You've got enough on hand to cover the next one.
<<else>>
As things stand, you're short of the next one.
<</if>>
<br><br>
''Work''
<br>
You work at <strong>Helion Dynamics</strong> as a <strong>$job.title</strong>, earning $<<print $job.wage>> per day.
<br><br>
<<if $job.level >= 5>>
You've reached the top of the ladder here. There's nowhere left to climb.
<<else>>
<<set _prev = [0, 0, 10, 25, 45][$job.level]>>
<<set _next = [0, 10, 25, 45, 60][$job.level]>>
<<set _progress = $job.performance - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next promotion" "#3D73FC">>
<<if $job.promotionPending>>
<span class="good">Word is you're due a promotion. You'll hear about it next time you're in the office.</span>
<</if>>
<</if>>
<br><br>
<<if $club.job>>
You can also pick up shifts on the door at <strong>Ring-A-Ding</strong><<if $club.captain>> as door captain<</if>>, Thursday to Saturday evenings, whenever you feel like the work.
<br><br>
<</if>>
<<link 'Return' $return>>
<</link>>/* Trigger: Project choice pending */
<<if $project.pendingChoice === "genre">><<goto "Project Choice Genre">>
<<elseif $project.pendingChoice === "protagonist">><<goto "Project Choice Protagonist">>
<<elseif $project.pendingChoice === "feature">><<goto "Project Choice Feature">>
<</if>>
<h2>Computer</h2>
<<if $pcMsg !== "">>
<span class="good"><<= $pcMsg>></span>
<br><br>
<<set $pcMsg = "">>
<</if>>
You sit down at the desk and wake the screen.
<br><br>
''Your side project''
<br>
<<if $project.started>>
Your game sits at version <<print $project.version>>.0, with <<print $project.supporters>> supporters putting $<<print $project.weeklyIncome>> a week your way.
<<else>>
A blank project folder waits. You've thought for years about building your own game, the kind you can't find in stores. Maybe it's time you actually did.
<</if>>
<br>
<<if $energy < 1>>
//You're too drained to write a line of anything.//
<<elseif $time >= $timeMax>>
//It's too late to focus on it tonight.//
<<else>>
<<link "Work on your game." "Computer">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $project.started = true>>
<<set $project.dev += 1>>
<<if $project.dev >= $project.devNeeded>>
<<set $project.dev = 0>>
<<set $project.version += 1>>
/* Base gain, then genre modifier. Broad = wider reach,
niche = smaller but higher-paying crowd (mult set at choice). */
<<set _gain = random(3, 6) + ($project.version * 2)>>
<<if $project.choices.genre === "broad">>
<<set _gain += 2>>
<<elseif $project.choices.genre === "niche">>
<<set _gain = Math.max(_gain - 1, 1)>>
<</if>>
<<set $project.supporters += _gain>>
<<set $project.devNeeded = Math.min($project.devNeeded + 1, 8)>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
/* Milestone choices fire on reaching v1, v2, v3.
pendingChoice routes the next Computer visit to the fork. */
<<if $project.version === 1>>
<<set $project.pendingChoice = "genre">>
<<elseif $project.version === 2>>
<<set $project.pendingChoice = "protagonist">>
<<elseif $project.version === 3>>
<<set $project.pendingChoice = "feature">>
<</if>>
<<set $pcMsg = "You ship version " + $project.version + ".0. Word gets around, and " + _gain + " new supporters pledge. Your page now brings in $" + $project.weeklyIncome + " a week.">>
<<else>>
<<set $pcMsg = "You sink an hour into the project. It's coming along.">>
<</if>>
<</link>>
<</if>>
<<if $project.started>>
<br>
<<link "Check your supporter page." "Project Page">><</link>>
<</if>>
<br><br>
''Helion work''
<br>
<<if $job.wfhToday>>
//You've already put in extra hours from home today.//
<<elseif $arousal >= 8>>
//You can't focus on work while this wound up.//
<<elseif $energy < 2>>
//You're too drained for more of Helion's work tonight.//
<<elseif $time >= $timeMax>>
//It's too late to get any real work done.//
<<else>>
You could put in some extra hours, get ahead of the backlog, make yourself harder to overlook.
<br>
<<link "Work from home for Helion." "Computer">>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 0.5>>
<<set $job.wfhToday = true>>
<<promotionCheck>>
<<if $job.promotionPending>>
<<set $pcMsg = "You grind through a few extra tickets. Your standing's high enough now that a promotion feels close.">>
<<else>>
<<set $pcMsg = "You grind through a few extra tickets. It won't go unnoticed.">>
<</if>>
<</link>>
<</if>>
<br><br>
/* FUTURE: once $job.level reaches Lead+, the clock-in expectation in workCheck
could ease, with most work handled here and office visits optional. That arc
belongs with the assistant character and her romance, not here yet. */
<<link "Step away from the desk." $return>><</link>><h1><<print passage()>></h1>
''Time''
<br>
Time ($time):
<<link '+' 'Control Panel'>>
<<set $time += 1>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $time -= 1>>
<<if $time < 0>><<set $time = 0>><</if>>
<</link>>
<br>
Day ($gameDay):
<<link 'Next Day' 'Control Panel'>>
<<dayshift>>
<</link>>
/
<<link 'Previous Day' 'Control Panel'>>
<<set $gameDay -= 1>>
<<if $gameDay < 1>><<set $gameDay = 1>><</if>>
<<set $weekday -= 1>>
<<if $weekday < 1>><<set $weekday = 7>><</if>>
<</link>>
<br><br>
''Stats''
<br>
Energy ($energy):
<<link '+' 'Control Panel'>>
<<set $energy += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energy -= 1>>
<</link>>
<br>
Max Energy ($energyMax):
<<link '+' 'Control Panel'>>
<<set $energyMax += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energyMax -= 1>>
<</link>>
<br>
Fitness ($fitness):
<<link '+' 'Control Panel'>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<<fitnesscheck>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $fitness -= 1>>
<<fitnesscheck>>
<</link>>
<br>
Arousal ($arousal):
<<link '+' 'Control Panel'>>
<<set $arousal += 1>>
<<if $arousal > $arousalMax>><<set $arousal = $arousalMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $arousal -= 1>>
<<if $arousal < 0>><<set $arousal = 0>><</if>>
<</link>>
<br><br>
''Wife''
<br>
$wife.name Relationship ($wife.relationship):
<<link '+5' 'Control Panel'>>
<<set $wife.relationship += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.relationship += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.relationship -= 1>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.relationship -= 5>>
<</link>>
<br>
$wife.name Mood ($wife.mood):
<<link '+' 'Control Panel'>>
<<set $wife.mood += 1>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $wife.mood -= 1>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</link>>
<br>
$wife.name Suspicion ($wife.suspicion):
<<link '+5' 'Control Panel'>>
<<set $wife.suspicion += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.suspicion += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.suspicion -= 1>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.suspicion -= 5>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
<br>
Suspicion Locked ($wife.suspicionLocked):
<<link 'Toggle' 'Control Panel'>>
<<set $wife.suspicionLocked = not $wife.suspicionLocked>>
<</link>>
<br>
Near misses ($wife.nearMissCount) / last near miss day $wife.lastNearMissDay / armed day $wife.suspicionArmDay:
<<link 'Reset count' 'Control Panel'>>
<<set $wife.nearMissCount = 0>>
<</link>>
<br>
<<link 'Preview near miss: first' 'Wife Near Miss'>>
<<set $wife.nearMissKind = "first">>
<</link>>
/
<<link 'Preview near miss: repeat' 'Wife Near Miss'>>
<<set $wife.nearMissKind = "repeat">>
<</link>>
/
<<link 'Preview near miss: believed' 'Wife Near Miss'>>
<<set $wife.nearMissKind = "believed">>
<</link>>
<br>
<<link 'Preview discovery scene (non-destructive)' 'Wife Discovery'>>
<<set $wife.discoveryResult = 15>>
<</link>>
<br>
$wife.name Worry ($wife.worry):
<<link '+5' 'Control Panel'>>
<<set $wife.worry += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.worry += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.worry -= 1>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.worry -= 5>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
<br>
<<link 'Preview worry scold (non-destructive)' 'Wife Worry'>>
<<set $wife.worryResult = 4>>
<</link>>
<br><br>
''Work (debug)''
<br>
Performance ($job.performance):
<<link '+5' 'Control Panel'>>
<<set $job.performance += 5>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $job.performance -= 5>>
<</link>>
<br>
Level ($job.level): $job.title
<br>
<<link 'Level up (debug)' 'Control Panel'>>
<<if $job.level < 5>>
<<applyPromotion>>
<</if>>
<</link>>
<br>
<<link "Force promotion (debug)" $return>>
<<set $job.promotionPending = true>>
<</link>>
<br><br>
''Assistant / Nadia (debug)''
<br>
State: met=$assistant.met / unlocked=$assistant.unlocked / seed=$assistant.seedStage / flirt=$assistant.flirtStage / infl=$assistant.influence / tier=$assistant.tier
<br>
Trip: affair=$assistant.affair / taken=$assistant.tripTaken / pending=$assistant.tripPending / lastOffer=$assistant.lastTripOfferDay
<br>
Hookup: count=$assistant.hookupCount / heat=$assistant.heat / today=$assistant.hookupToday / lastLoc="$assistant.lastHookupLoc" / lastAct="$assistant.lastHookupAct" / lastDay=$assistant.lastHookupDay
<br>
Cool-off: pending=$assistant.coolOffPending / until=$assistant.coolOffUntil / <<if $gameDay < $assistant.coolOffUntil>><<= $assistant.coolOffUntil - $gameDay>> day(s) left<<else>>not locked<</if>>
<br>
Deferred morning: "$deferredMorning"
<br>
Influence ($assistant.influence):
<<link '+10' 'Control Panel'>>
<<set $assistant.influence += 10>>
<<assistantCheck>>
<</link>>
/
<<link '+2' 'Control Panel'>>
<<set $assistant.influence += 2>>
<<assistantCheck>>
<</link>>
/
<<link '-2' 'Control Panel'>>
<<set $assistant.influence = Math.max($assistant.influence - 2, 0)>>
<<assistantCheck>>
<</link>>
/
<<link '-10' 'Control Panel'>>
<<set $assistant.influence = Math.max($assistant.influence - 10, 0)>>
<<assistantCheck>>
<</link>>
<br>
Heat ($assistant.heat):
<<link '+3' 'Control Panel'>>
<<set $assistant.heat = Math.min($assistant.heat + 3, 10)>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $assistant.heat = Math.min($assistant.heat + 1, 10)>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $assistant.heat = Math.max($assistant.heat - 1, 0)>>
<</link>>
/
<<link '-3' 'Control Panel'>>
<<set $assistant.heat = Math.max($assistant.heat - 3, 0)>>
<</link>>
<br>
<<link 'Clear the hookup one-shot (go again today)' 'Control Panel'>>
<<set $assistant.hookupToday = false>>
<</link>>
<br>
<<link 'Clear the lockout (reopen the loop now)' 'Control Panel'>>
<<set $assistant.coolOffUntil = 0>>
<<set $assistant.coolOffPending = 0>>
<</link>>
<br>
/* Arms the cool-off without needing a discovery to land at home. The scene
fires on the next visit to Helion Dynamics between time 1 and 5. Requires
$assistant.affair to already be true. */
<<link 'Arm cool-off: discovery (5 days)' 'Control Panel'>>
<<set $assistant.coolOffPending = 5>>
<</link>>
/
<<link 'Arm cool-off: ultimatum (7 days)' 'Control Panel'>>
<<set $assistant.coolOffPending = 7>>
<</link>>
<br>
<<link 'Clear daily one-shots (probe/talk again today)' 'Control Panel'>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastAction = "">>
<</link>>
<br>
<<link 'Clear deferred morning' 'Control Panel'>>
<<set $deferredMorning = "">>
<</link>>
<br><br>
<<link 'Set up L4 start (full arc from the grad cohort)' 'Control Panel'>>
/* Force the level DOWN as well as up, so this works from a finished save */
<<set $job.level = 4>>
<<set $job.title = "Lead Engineer">>
<<set $job.wage = 325>>
<<set $job.performance = 45>>
<<set $job.promotionPending = false>>
/* Full wipe: every assistant field, including the ones added in 0.2.0 */
<<set $assistant.met = false>>
<<set $assistant.unlocked = false>>
<<set $assistant.seedStage = 0>>
<<set $assistant.lastSeedDay = 0>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.tierUp = false>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
/* 0.3.3 phone and dates */
<<set $assistant.numberKnown = false>>
<<set $assistant.textedToday = false>>
<<set $assistant.lastNudeDay = -99>>
<<set $assistant.lastNudeImg = "">>
<<set $assistant.dateCount = 0>>
<<set $assistant.lastDateDay = -99>>
<<set $assistant.lastDateIn = 0>>
<<set $assistant.lastDateOut = "">>
<<set $phone.assistantUnread = false>>
<<clearHookupState>>
<<assistantCheck>>
<</link>>
<br>
<<link 'Jump to L5: Nadia unlocked (hub-ready)' 'Helion Dynamics'>>
/* Job -> Engineering Manager, performance kept in sync with the level */
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Nadia -> past the seeds and the reunion, romance live at tier 0 */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
/* Land in the office inside the hub's daytime window so her desk link shows */
<<if $time < 1 or $time > 5>><<set $time = 1>><</if>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to L5: play the Reunion scene' 'Assistant, Reunion'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 70>><<set $job.performance = 70>><</if>>
<<set $job.promotionPending = false>>
/* Prereqs so the scene is legit; the Reunion passage itself flips unlocked */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = false>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to the trip gate (offer fires next clock-in)' 'Control Panel'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Everything the Workday trip branch tests for */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 3>>
<<set $assistant.lastFlirtDay = $gameDay - 3>>
<<set $assistant.influence = 30>>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
/* Put him on an unworked weekday morning so he can clock in */
<<if $weekday > 5>><<set $weekday = 1>><</if>>
<<set $time = 1>>
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to the office loop (affair live, in the window)' 'Helion Dynamics'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Past the trip, affair live, influence floored the way Trip Return leaves it */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 3>>
<<set $assistant.affair = true>>
<<set $assistant.tripTaken = true>>
<<set $assistant.tripPending = false>>
<<if $assistant.influence < 40>><<set $assistant.influence = 40>><</if>>
<<clearHookupState>>
<<assistantCheck>>
/* Everything the gate tests for, minus the affair clauses above */
<<if $weekday > 5>><<set $weekday = 1>><</if>>
<<set $job.attendedToday = true>>
<<set $job.missedToday = false>>
<<set $time = 4>>
<<if $energy < 2>><<set $energy = 2>><</if>>
<<set $deferredMorning = "">>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Force trip offer to re-fire (after a decline)' 'Control Panel'>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $assistant.lastFlirtDay = $gameDay - 3>>
<<set $assistant.tripPending = false>>
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<if $time > 1>><<set $time = 1>><</if>>
<</link>>
<br>
<<link 'Reset Nadia to untouched (keep job level)' 'Control Panel'>>
<<set $assistant.met = false>>
<<set $assistant.unlocked = false>>
<<set $assistant.seedStage = 0>>
<<set $assistant.lastSeedDay = 0>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.tier = 0>>
<<set $assistant.tierUp = false>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
/* 0.3.3 phone and dates */
<<set $assistant.numberKnown = false>>
<<set $assistant.textedToday = false>>
<<set $assistant.lastNudeDay = -99>>
<<set $assistant.lastNudeImg = "">>
<<set $assistant.dateCount = 0>>
<<set $assistant.lastDateDay = -99>>
<<set $assistant.lastDateIn = 0>>
<<set $assistant.lastDateOut = "">>
<<set $phone.assistantUnread = false>>
<<clearHookupState>>
<</link>>
<br><br>
''Nadia phone and dates (debug)''
<br>
Phone: number=$assistant.numberKnown / texted=$assistant.textedToday / lastPic=$assistant.lastNudeDay / unread=$phone.assistantUnread
<br>
Dates: count=$assistant.dateCount / last=$assistant.lastDateDay / lastIn=$assistant.lastDateIn / lastOut="$assistant.lastDateOut"
<br>
<<link 'Give her number' 'Control Panel'>>
<<set $assistant.numberKnown = true>>
<</link>>
/
<<link 'Clear phone and date cooldowns' 'Control Panel'>>
<<set $assistant.textedToday = false>>
<<set $assistant.lastNudeDay = -99>>
<<set $assistant.lastDateDay = -99>>
<</link>>
<br><br>
''Helion Gym vent (debug)''
<br>
workouts=$helionGym.workouts / found=$helionGym.peepFound / today=$helionGym.peepToday
<br>
<<link 'Unlock vent' 'Control Panel'>>
<<set $helionGym.peepFound = true>>
<</link>>
/
<<link 'Clear today' 'Control Panel'>>
<<set $helionGym.peepToday = false>>
<</link>>
<br><br>
''Phone (debug)''
<br>
Nude ask today ($phone.nudeAskedToday) / Last nude day ($phone.lastNudeDay) / Cooldown ends day <<= $phone.lastNudeDay + $phone.nudeCooldown>>
<br>
<<link 'Unlock nude ask now' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Clear "asked today" flag' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<</link>>
<br>
<<link 'Reset nude cooldown' 'Control Panel'>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Queue wife nude (unread)' 'Control Panel'>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _nudes.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "nude">>
<<set $phone.wifeMsgText = [
"thinking about you. no reason. carry on 🙈",
"house is empty and I'm bored. somehow this is your fault 😏",
"don't open this at work. actually, do. I don't care 😈",
"just out of the shower and you crossed my mind 💋",
"no occasion. just wanted you to know what's waiting at home 🔥",
"I miss you. that's the polite version 😘",
"you've been good lately. consider this the review 😌"
].random()>>
<</link>>
<br>
<<link 'Queue lingerie selfie (unread)' 'Control Panel'>>
<<set _ling = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _ling.push("w_phone_ling" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _ling.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "lingerie">>
<<set $phone.wifeMsgText = [
"couldn't resist trying it on again 😘 thank you for this, you've got better taste than you let on 💕",
"feeling dangerously good in what you picked out for me 🔥 thought you should see what's waiting at home...",
"thanks for the shopping spree, you officially have an eye for this 😏 here's a little preview, don't get distracted 💋",
"so. worth. it. 😍 just gonna leave this right here and let you think about it all day 😈"
].random()>>
<</link>>
<br><br>
''Dancer & Ring-A-Ding''
<br>
$dancer.name relationship ($dancer.relationship):
<<link '+5' 'Control Panel'>>
<<set $dancer.relationship = Math.min($dancer.relationship + 5, 40)>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $dancer.relationship = Math.min($dancer.relationship + 1, 40)>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $dancer.relationship = Math.max($dancer.relationship - 1, 0)>>
<</link>>
<br>
Name known: $dancer.nameKnown
<<link 'Toggle' 'Control Panel'>>
<<if $dancer.nameKnown>>
<<set $dancer.nameKnown = false>>
<<set $dancer.name = "Candy">>
<<else>>
<<set $dancer.nameKnown = true>>
<<set $dancer.name = $dancer.realName>>
<</if>>
<</link>>
<br>
Dance today: $dancer.danceToday
<<link 'Clear' 'Control Panel'>>
<<set $dancer.danceToday = false>>
<</link>>
<br>
Door hint given: $dancer.hintGiven
<<link 'Toggle' 'Control Panel'>>
<<set $dancer.hintGiven = !$dancer.hintGiven>>
<</link>>
<br>
Door job: $club.job
<<link 'Toggle' 'Control Panel'>>
<<set $club.job = !$club.job>>
<<set $club.offered = $club.job>>
<</link>>
<br>
Number known: $dancer.numberKnown
<<link 'Toggle' 'Control Panel'>>
<<set $dancer.numberKnown = !$dancer.numberKnown>>
<</link>>
<br>
Walks: $dancer.walkCount / last day $dancer.lastWalkDay
<<link '+1' 'Control Panel'>><<set $dancer.walkCount += 1>><</link>>
/
<<link 'Reset cooldown' 'Control Panel'>><<set $dancer.lastWalkDay = -99>><</link>>
<br>
Dates: $dancer.dateCount
<<link '+1' 'Control Panel'>><<set $dancer.dateCount += 1>><</link>>
/
<<link 'Reset cooldown' 'Control Panel'>><<set $dancer.lastDateDay = -99>><</link>>
<br>
Photos: $dancer.photoCount
<<link 'Reset cooldown' 'Control Panel'>><<set $dancer.lastPhotoDay = -99>><</link>>
<br>
Shifts: $club.shifts
<<link '+5' 'Control Panel'>><<set $club.shifts += 5>><</link>>
<br>
Shifts ($club.shifts):
<<link '+1' 'Control Panel'>>
<<set $club.shifts += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $club.shifts = Math.max($club.shifts - 1, 0)>>
<</link>>
<br>
Captain: $club.captain
<<link 'Toggle' 'Control Panel'>>
<<set $club.captain = !$club.captain>>
<</link>>
<br>
Team night pending: $club.celebPending
<<link 'Reset cooldown' 'Control Panel'>>
<<set $club.lastCelebDay = -99>>
<</link>>
<br><br>
''Inventory''
<br>
Money ($money):
<<link '+1000' 'Control Panel'>>
<<set $money += 1000>>
<</link>>
/
<<link '+100' 'Control Panel'>>
<<set $money += 100>>
<</link>>
/
<<link '-100' 'Control Panel'>>
<<set $money -= 100>>
<</link>>
<br><br>
<<if not $items.pc>>
<<link "Get PC" "Control Panel">>
<<set $items.pc = true>>
<</link>><br>
<<else>>
PC owned.<br>
<</if>>
<<if not $items.yogaMats>>
<<link "Get Yoga Mats" "Control Panel">>
<<set $items.yogaMats = true>>
<</link>><br>
<<else>>
Yoga Mats owned.<br>
<</if>>
<<if not $items.goodBed>>
<<link "Get Bed" "Control Panel">>
<<set $items.goodBed = true>>
<</link>><br>
<<else>>
Bed owned.<br>
<</if>>
<br>
<br>
<<link 'Return' $return>>
<</link>><h2>Sal's Pawn & Loan</h2>
A narrow shopfront wedged between the dead bakery and the Anchor. The window is a jumbled altar to other people's bad weeks: a saxophone, three wedding rings pinned to a velvet card, a drone still in its box, a stuffed marlin nobody came back for. Behind the counter sits Sal, a broad man in a cardigan who gives the impression of having been here longer than the building itself. Whatever you're after, his face suggests he's probably got it out the back.
<<set _greet = [
'Sal looks up from a watch he\'s prying open. //"Browsing, or buying? It\'s all the same in here."//',
'Sal doesn\'t look up. //"Take your time. Everything in here already waited longer than you will."//',
'Sal tips his head at the shelves. //"All sorts today. People had a rough month."//'
]>>
<<= _greet.random()>>
<br><br>
''On the shelves''
<br>
/* STOCK. Append an entry to add an item. Each needs:
flag - the $items key it sets to true on purchase
label - link text
price - cost in dollars
desc - what the player sees
patter - Sal's line about it
Items the player already owns drop out of the list automatically. */
<<set _stock = [
{
flag: "pc",
label: "Desktop computer",
price: 250,
desc: "A desktop tower with a flat monitor, a few years old but wiped clean and humming quietly at the end of the counter.",
patter: "Belonged to a kid who was going to be a streamer. They're all going to be a streamer. Runs fine, I checked it myself."
},
{
flag: "yogaMats",
label: "Set of yoga mats",
price: 60,
desc: "A pair of foam yoga mats, rolled up and barely scuffed.",
patter: "A lady buys these off me every January and sells them back every February. This year she didn't even make it to February."
},
{
flag: "goodBed",
label: "Solid oak bed frame and mattress",
price: 200,
desc: "A heavy oak frame and a barely-used mattress still in its wrapping, far better than the sagging thing you sleep on now. You'd sleep through the night more often on this.",
patter: "Memory foam, top of the line. Remembers your back so you don't have to. Only thing it can't remember is why the guy who owned it never came back for it."
}
]>>
<<set _anyStock = false>>
<<for _i = 0; _i < _stock.length; _i++>>
<<if not $items[_stock[_i].flag]>>
<<set _anyStock = true>>
<<capture _i>>
<<= _stock[_i].desc>>
<br>
//"<<= _stock[_i].patter>>"//
<br>
<<if $money >= _stock[_i].price>>
<<link `_stock[_i].label + " ($" + _stock[_i].price + ")"` "Eastgate Pawnbroker">>
<<set $items[_stock[_i].flag] = true>>
<<set $money -= _stock[_i].price>>
<</link>>
<<else>>
//<<= _stock[_i].label>> ($<<= _stock[_i].price>>), but you're short.//
<</if>>
<br><br>
<</capture>>
<</if>>
<</for>>
<<if not _anyStock>>
Sal spreads his hands. //"Nothing else here you need right now. Come back when you've worn something out."//
<br><br>
<</if>>
/* UNDER THE COUNTER. Opens once the marriage has hit 100 at least once. */
<<if $wife.favorUnlocked>>
<<costumeList>>
<<set _anyCos = false>>
<<for _i = 0; _i < _costumes.length; _i++>>
<<if _costumes[_i].flag !== "" and not $items[_costumes[_i].flag]>>
<<set _anyCos = true>>
<</if>>
<</for>>
''Under the counter''
<br>
<<if _anyCos>>
Sal reaches below the register without being asked and comes up with a garment bag.
<br><br>
<<for _i = 0; _i < _costumes.length; _i++>>
<<if _costumes[_i].flag !== "" and not $items[_costumes[_i].flag]>>
<<capture _i>>
//"<<= _costumes[_i].patter>>"//
<br>
<<if $money >= _costumes[_i].price>>
<<link `"Buy " + _costumes[_i].label + " ($" + _costumes[_i].price + ")"` "Eastgate Pawnbroker">>
<<set $items[_costumes[_i].flag] = true>>
<<set $money -= _costumes[_i].price>>
<</link>>
<<else>>
//<<= _costumes[_i].label.charAt(0).toUpperCase() + _costumes[_i].label.slice(1)>> ($<<= _costumes[_i].price>>), but you're short.//
<</if>>
<br><br>
<</capture>>
<</if>>
<</for>>
<<else>>
Sal pats the counter. //"You cleaned me out. If anything else comes in, you'll hear. You always seem to."//
<br><br>
<</if>>
<</if>>
/* SELLING (future): a second loop here over a sellable-inventory list,
paying out a fraction of value and clearing the $items flag, would slot
in cleanly. Sal already buys as well as sells in the fiction. */
<<link [[Back out to the plaza.|Eastgate Plaza]]>><</link>><h2><<print passage()>></h2>
A strip mall off the access road, the kind of place that was somebody's idea of progress back when the highway was new and has been managing decline ever since. A shuttered bakery, a barber that's only ever open when you don't need one, a laundromat with a hand-taped sign about the machines. At the end, lit a little too brightly, sits Karim's Liquor. Past it, a windowless bar called the Anchor with the blinds always down.
<<switch $time>>
<<case 0>>Early morning. The gates are mostly down. A man hoses the sidewalk outside the laundromat, more out of ritual than effect.
<<case 1>>Late morning. The liquor store is open, a delivery half-unloaded across its doorway. Two retirees share a bench and a thermos.
<<case 2>>Midday. The lot is as busy as it gets, which isn't very. Someone's stroller is parked outside the bakery that isn't a bakery anymore.
<<case 3>>Early afternoon. The light's flat and the stores are quiet. The barber's chair sits empty behind the glass.
<<case 4>>Late afternoon. School's out somewhere nearby; kids drift across the lot in twos and threes, eyeing the liquor store they can't get served in.
<<case 5>>Early evening. The gates are coming down one by one. Karim's is still lit, the last of the trade trickling in.
<<case 6>>Evening. Most of the plaza has pulled its gates down, but Karim's stays lit at the end of the row, the Anchor's blinds glowing past it.
<<case 7>>Late evening. The storefronts are dark. The Anchor's the only thing still open, and it isn't asking to be looked at.
<<case 8>>Night. The lot is empty and half-lit, the kind of place you cross quickly or not at all.
<</switch>>
<br><br>
/* Liquor store: wine for the evening */
<<if $time <= 6>>
Karim's is open. A decent bottle of wine runs $20.
<br>
<<if $money >= 20>>
<<link "Buy a bottle of wine. ($20)" $return>>
<<set $money -= 20>>
<<set $items.wine += 1>>
<</link>>
<<else>>
//A bottle's $20, but you're short.//
<</if>>
<<else>>
//Karim's has pulled the gate down for the night.//
<</if>>
<br><br>
Sal's Pawn & Loan sits at the end of the row, its window crammed with other people's misfortune.
<br>
<<if $time <= 6>>
<<link [[Step into Sal's.|Eastgate Pawnbroker]]>><</link>>
<<else>>
//Sal's has the shutters down for the night.//
<</if>>
<br><br>
The Anchor sits at the dark end of the row, blinds down, a muffled thump of jukebox bass leaking out under the door.
<br>
<<if $time >= ($weekday >= 6 ? 2 : 4)>>
<<link [[Push into the Anchor.|The Anchor]]>><</link>>
<<elseif $weekday >= 6>>
//The Anchor opens by noon on weekends, but it's too early yet.//
<<else>>
//On a weekday the Anchor doesn't open its doors until the afternoon.//
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h1>Game Over</h1>
<<switch $gameOverCause>>
<<case "divorce">>
You wake to the flat already changed. The hall is clearer than it has been in months, the boxes that never got unpacked packed again, by the door this time instead of against the wall.
<br><br>
$wife.name is dressed. Your son is dressed. There's a suitcase, and a smaller bag for him, the one with the cartoon zip he picked out himself.
<br><br>
She doesn't shout. That's the part that tells you it's real. The shouting was when there was still something to fight for.
<br><br>
<<speech "Wife" $wife.name>>
I gave it everything I had, longer than I should have. I kept waiting for the man I married to walk back through that door, and he didn't, and I can't keep teaching our son that this is what a marriage looks like.
<</speech>>
<br><br>
She tells you where she'll be. She tells you you'll still see him, that she would never take that from either of you. She is kind about it, in the careful way of someone who decided a long time ago and has run out of anger to spend.
<br><br>
Then she lifts the boy onto her hip, and he waves at you over her shoulder, not understanding, and the door closes, and the flat is very quiet.
<br><br>
You didn't earn it back. You ran out of time to try.
<<case "rent">>
The eviction notice arrived this morning. $wife.name didn't say much. You suspect she's been packing for days.
<br><br>
You stand in the entryway with a duffel bag at your feet, the home behind you already half-empty. The street outside is bright and indifferent.
<br><br>
You failed.
<<default>>
Whatever you were trying to rebuild has come apart in your hands. You didn't get there in time.
<</switch>>
<br><br>
<<link "Start over">>
<<script>>Engine.restart()<</script>>
<</link>><h2>Helion Dynamics</h2>
You leave with $wife.name's disappointment still hanging in the air behind you. She didn't argue. She just went back to getting the boy ready, her voice softening for him the way it wouldn't for you, and the door clicked shut behind you.
<br><br>
<<set $job.performance += 2>>
<<set _bonus = 80 + ($job.level * 40)>>
<<set $money += _bonus>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 3, $timeMax)>>
<<addWorry 1>>
<<switch $job.level>>
<<case 1>>
The floor is dead, half the lights off, and the crisis turns out to be the kind of unglamorous mess that rolls downhill to whoever answers the phone. You spend hours babysitting a rollback for a client whose name you're still not allowed to know, running the same checks over and over while a senior on a call somewhere takes the credit for the fix. It's dull, and it's your Saturday, and you'd rather be pushing a swing. But the overtime is real money, and when you finally clock out a manager you barely recognize claps you on the shoulder and says he'll remember you came in.
<<case 2>>
You're one of three who got the call, and the other two are visibly furious about it, which somehow makes it easier to be the one who stays calm. The fix isn't complicated once you find it, buried in someone else's undocumented shortcut, but finding it eats the whole afternoon. Nobody thanks you. Still, the extra pay lands in your account before you've left the building, and you catch your name in a thread going up to people you've never met.
<<case 3>>
They call you because the quieter work broke, and the quieter work isn't the kind you can hand to just anyone. You spend the day up on the floor your card now reaches, fixing a problem for a client with a name you wish you didn't know, and you keep remembering that it's Saturday and your son is at the park without you. You fix it. The money is good, and the right people see that you were the one who came in.
<<case 4>>
A crisis at this level means the client is important enough that someone senior has to be seen putting out the fire, and today that someone is you. You don't touch much code. You steer, you reassure, you make the calls that let the people below you do the actual work, and by evening it's contained and billable and yours. The bonus is good. On the way out you think about the park you didn't go to, and how easily you talked yourself out of it.
<<default>>
They call you in because the problem is big enough to need someone senior. You handle it the way you handle everything up here now, at a remove, through other people, and it's done by evening. The number attached to it is large, and the people who decide these things noticed. Your family spent the afternoon at the park without you.
<</switch>>
<br><br>
<span class="good">Overtime: $<<print _bonus>>. Work performance improved.</span>
<br>
<span class="warning">$wife.name spent the day out with your son. Without you.</span>
<br><br>
<<link "Head home." "Living Room">><</link>><h2><<print passage()>></h2>
<<hookupGate>>
<<include 'Helion Dynamics, Description'>>
<<include 'Helion Dynamics, Triggers'>>
<<include 'Helion Dynamics, Basics'>>
<<if $assistant.unlocked and $time >= 1 and $time <= 5>>
<br><br>
<<if _hookupOffer>>
$assistant.name is at her desk two rows down, looking up over her screen and catching your glance.
<<else>>
$assistant.name is at her desk two rows down, working through something on her screen.
<</if>>
<br>
<<link [[Go over to her.|Assistant Interact]]>><</link>>
<</if>>
<<if $job.level >= 3 and $time <= 6>>
<br><br>
Your card opens the gym now, and it's free to staff.
<br>
<<link [[🏋 Head to the gym.|Helion Gym]]>><</link>>
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>>/* Desk */
<<if !$job.attendedToday>>
Your desk waits in the third row from the window, monitor dark, keyboard slightly crooked from the cleaner.
<<else>>
Your desk sits as you left it after clocking in, monitor dimmed, chair shoved back at an angle, the day's work already behind you.
<</if>>
<br>
/* Clock in */
<<if !$job.attendedToday>>
<<if $time < 2>>
<<if $arousal >= 8 and not $job.promotionPending>>
<span class="warning">You're wound too tight to concentrate on anything today. Sit down like this and the day won't count toward a promotion.</span>
<br>
<</if>>
<<if $job.promotionPending>>
<<link [[Sit down and start the day.|Helion Dynamics, Promotion]]>><</link>>
<<else>>
<<link [[Sit down and start the day.|Helion Dynamics, Workday]]>><</link>>
<</if>>
<<else>>
//You're too late. The workday has already moved on without you.//
<</if>>
<<else>>
//You've already put in your hours today.//
<</if>>/* Base description */
The Helion Dynamics office occupies a single floor of a glass-and-steel tower off the bypass. Open-plan rows of desks stretch toward the windows, broken up by glass-walled meeting rooms and a bank of vending machines. The carpet is the color of cold coffee, and the air has the still, recycled quality of a building whose windows haven't opened in years.
/* Time */
<<switch $time>>
<<case 0>>Early morning. The floor is empty, the cleaners long gone and the first arrivals not yet through the door.
<<case 1>>Late morning hum of keyboards, low voices, the occasional cough. Most desks are filled, screens deep in spreadsheets and Slack threads.
<<case 2>>Midday slump. Half the floor is at lunch; the other half is pretending to work while they wait their turn.
<<case 3>>The early afternoon drags, the post-lunch lull settling thick over the rows of desks.
<<case 4>>Late afternoon, and the floor is thinning out. Coats come off the backs of chairs, monitors blink to lock screens.
<<case 5>>Early evening. The windows turn orange. A few desks are still occupied by the keen, the desperate, and people avoiding home.
<<case 6>>The office is mostly dark. Cleaning staff move between empty desks; a monitor or two still glows.
<<case 7>>Late evening. The floor is silent, the cleaners gone, only a security light or two marking the long rows of desks.
<<case 8>>The office is closed for the night, locked behind keycard doors.
<</switch>>
/* Office heat state. Mirrors the chore-state line in the home rooms:
standing state, shown every visit, no daily gate. Nothing below 3. */
<<if $assistant.affair and $assistant.heat >= 3 and $time >= 1 and $time <= 5>>
<<if $assistant.heat >= 9>>
<span class="warning">Upper management has noticed what is going on between you and $assistant.name.</span>
<<elseif $assistant.heat >= 6>>
<span class="warning">You get the feeling that people are gossiping about you and $assistant.name.</span>
<<else>>
<span class="warning">Some people have started paying attention to you and $assistant.name.</span>
<</if>>
<</if>>
<br><br><h2>Helion Dynamics</h2>
<<if $job.eventOutcome !== "">>
<div class="char-scene">
<img @src="$job.sceneGif" class="char-img">
<div class="char-text">
<<= $job.sceneText>>
</div>
</div>
<</if>>
<<if $job.drainType == "late" and not $job.stayedLate>>
<<link "Head back to your desk." "Helion Dynamics, Workday">>
<<set $job.eventOutcome = "">>
<</link>>
<<else>>
<<link "Head out." $return>>
<<set $job.eventOutcome = "">>
<</link>>
<</if>><<clockIn>>
<<set _oldTitle = $job.title>>
<<applyPromotion>>
<h2>Helion Dynamics</h2>
<<switch $job.level>>
<<case 2>>
A few minutes after you sit down, your manager leans over the partition and asks if you've got a second. In the break room he tells you the payment-flow fix from a few weeks back traveled further up than you'd realized, and that someone finally noticed whose name was on the original commit. It isn't a speech. It's a sentence and a handshake. But by the time you're back at your desk, your title in the directory has changed, and so has the number on your payslip.
<<case 3>>
You're called into one of the glass rooms before you've even opened your laptop. A director you've spoken to maybe twice slides a revised contract across the table and tells you the team needs someone senior who can be trusted with "the quieter work." You don't ask what that means. You sign where she points. On the way out she mentions, lightly, that your keycard will get you a little further into the building now.
<<case 4>>
They take you up a floor this time. The lift won't even stop there without your new card. The desks are quieter, the screens angled away from the door, and nobody introduces themselves. Your new manager walks you past a row of offices and into one with your name already on a label by the door. He calls you Lead, shakes your hand, and tells you the clients up here pay better because they ask for more. You spend the rest of the day learning what "more" looks like, and trying not to think too hard about it.
<<case 5>>
There's no meeting room this time, just a corner office and a man you've only ever seen in all-hands recordings. He pours you a drink you don't want and tells you you've earned a seat at the table. Then he tells you what the table actually does. The unnamed clients have names now. Project Kestrel has a purpose. You understand, finally, why the floor below isn't allowed up here. You take the title. You take the money. You tell yourself you'll work out the rest later.
<</switch>>
<br><br>
<span class="good">Promoted: $job.title. New pay: $<<print $job.wage>> per day.</span>
<<if $job.level == 3>>
<br>
<span class="good">Your keycard now opens the company gym. Free to staff.</span>
<</if>>
<br><br>
<<link 'Clock out for the day.' $return>><</link>>/* Cool-off. Fires once on the first office visit after a discovery or an
ultimatum armed it in Dayshift. Sits above the break-room roll and takes
the whole passage into its else branch, so a firing visit does not
consume that day's sighting. goto does not halt the include. */
<<if $assistant.affair and $assistant.coolOffPending > 0 and $time >= 1 and $time <= 5>>
<<goto "Assistant, Cool Off">>
<<else>>
/* Break room sighting: rolled once per game day, consumed on view. */
<<if $job.breakRoomRollDay !== $gameDay>>
<<set $job.breakRoomRollDay = $gameDay>>
<<set $job.breakRoomToday = (random(1, 100) <= 35)>>
<</if>>
/* Break room ambient sighting: shows once, consumes the day's roll, +1 arousal */
<<if $job.breakRoomToday and $time >= 1 and $time <= 5>>
<<set $job.breakRoomToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _breakLines = [
"One of the interns is at the coffee machine when you duck into the break room, stretched up on her toes to reach the good mugs on the high shelf. She gives you a quick smile over her shoulder and goes back to it.",
"An assistant is bent at the little fridge, sorting her lunch from everyone else's, the line of her skirt drawn tight as she leans. She straightens when she hears you and holds the door of it open in offer.",
"An intern is perched on the edge of the counter, phone in hand, one heel hooked on the cupboard below, skirt riding where she isn't thinking about it. She glances up, unbothered, and looks back down.",
"The break room is empty but for an assistant doing something complicated to the coffee machine, sleeves pushed up, blouse pulled loose from the reach. She blows the hair out of her face and asks if you know how the filter comes out. You don't.",
"An intern is at the water cooler as you come in, tipping her head back for the little paper cup, the long line of her throat and everything under it caught in the strip lighting. She crushes the cup, drops it, and is gone before you've quite collected yourself."
]>>
<div class="char-scene">
<img @src="_internImg" class="char-img">
<div class="char-text">
<<= _breakLines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<</if>>
<</if>><<clockIn>>
/* Define flirt gates after assisant unlocked */
<<set _flirtGate to [8, 16, 24]>>
/* Assistant: First meeting trigger at L4 + Seed stages before L5 and cooldown days between + Reunion at L5 + Flirts after unlock */
<<if $job.level >= 4 and not $assistant.met>>
<<goto 'Assistant, Meet'>>
<<elseif $assistant.met and not $assistant.unlocked and $assistant.seedStage < 4 and ($gameDay - $assistant.lastSeedDay) >= 2>>
<<set _seedTarget to "Assistant, Seed " + ($assistant.seedStage + 1)>>
<<goto _seedTarget>>
<<elseif $job.level >= 5 and $assistant.met and not $assistant.unlocked and $assistant.seedStage >= 4>>
<<goto 'Assistant, Reunion'>>
<<elseif $assistant.unlocked and $assistant.flirtStage < 3 and $assistant.influence >= _flirtGate[$assistant.flirtStage] and ($gameDay - $assistant.lastFlirtDay) >= 3>>
<<set _flirtTarget to "Assistant, Flirt " + ($assistant.flirtStage + 1)>>
<<goto _flirtTarget>>
<<elseif $assistant.unlocked and not $assistant.affair and not $assistant.tripPending and $assistant.flirtStage >= 3 and $assistant.influence >= 30 and ($gameDay - $assistant.lastFlirtDay) >= 3 and ($gameDay - $assistant.lastTripOfferDay) >= 5>>
<<goto 'Assistant, Trip Offer'>>
<</if>>
<h2><<print passage()>></h2>
/* Pick a description set based on job title */
<<switch $job.title>>
<<case "Junior Software Engineer">>
<<set _descriptions = [
"You spend the morning chasing a bug in a payment flow nobody above your pay grade wants to touch. The original author left before you arrived and half the comments are in a language you don't read. By lunch you've narrowed it to a single function older than the company's current logo. You patch it, push the fix, and watch a senior carry it into a meeting you weren't invited to. Your name isn't on the ticket when it closes.",
"A queue of small, unglamorous fixes eats the morning. A man with a visitor badge and a government-issue lanyard comes down from a floor your card won't open, hands a team lead a sealed drive, and is gone before anyone introduces him. You go back to a date-format bug on a dashboard whose client is listed only as a contract number. You've never once seen a client's actual name written down in this building.",
"The planning meeting opens with the quarterly slogan and a slide of numbers nobody explains. Renewals up. A new 'defense and analytics' line that wasn't there last quarter. Your team is asked to absorb a small additional scope from a division you've never been told the function of, with no extra headcount. The afternoon disappears into unit tests for a service whose purpose was described to you in one sentence and a non-disclosure agreement.",
"A senior pulls you into pair programming on something that has a code instead of a name. He explains the function he needs and refuses to explain what it feeds, then closes the repo the moment you stand up. In the second you saw it, the folder tree read like the inside of a missile: guidance, telemetry, payload. You write the function. It's clean work. You don't ask.",
"The printer eats your architecture diagrams again. You wrestle the tray open and somehow knock half your coffee across your pants in the process. The intern, newer than you and already less impressed, watches without comment. You spend the rest of the day in a damp brown stain and the smell of stale espresso, fixing a parser written by someone since promoted above you.",
"You build a small internal tool a senior architect demanded by message at 2 a.m. Before lunch the same architect says it's been deprioritized, please disregard. Your branch sits untouched. By the time you log off, the architect is asking someone else for something new with the same urgency, in the same channel, and you notice that nobody here ever explains why a thing is wanted, only how fast."
]>>
<<case "Software Engineer">>
<<set _descriptions = [
"You own real tickets now, your name on them from the start. This morning you trace a data pipeline you maintain back toward its source and find it doesn't begin inside the company at all. The records arrive pre-collected, from a vendor named like a law firm, already tagged by location and device and movement. You were told you were cleaning the data. You were never told it was gathered from people who don't know the company exists.",
"You get partial read access to the unnamed program. The fragments you saw as a junior have a shape now: ingestion, then enrichment, then a stage called matching that cross-references one dataset against another you aren't cleared to open. The inputs are phone identifiers and coordinates from places that turn up in the news with the word conflict attached. You write your part well, and try not to follow the arrow past the edge of your access.",
"A standup runs long over a slipped client deliverable. Nobody says the client. The deliverable is described purely in capability: what it can find, how fast, at what confidence, from how little. You catch yourself genuinely absorbed in the problem, sketching the architecture in your notebook, before you remember to wonder who is on the other end of the word 'find.'",
"You're loaned to a sister team to help untangle a build issue, and their work isn't software at all, or not only. There's hardware in their lab behind glass, components for something that flies, schematics stamped with an export-control warning you have to sign just to stand near. You fix their build. You understand almost nothing of what you saw, and you suspect that's deliberate.",
"Your manager takes you for the kind of coffee that means something. He says you're trusted now, that the people upstairs like that you don't ask questions that slow things down. He means it warmly and you take it warmly, the small clean hit of being seen. It's only on the walk back to your desk that the sentence turns over in your head and shows you its other side."
]>>
<<case "Senior Software Engineer">>
<<set _descriptions = [
"Your card reaches the floor above now and most days you have reason to use it. The quieter work lives up here. Today it's a tuning pass on the matching engine: feed it a fragment of a person, a number, a face, a pattern of movement, and it returns the rest, where they are, who they're near, where they'll likely be next. You're told it keeps clients safe. You stopped believing the things you're told and kept building them anyway, cleanly, on time.",
"A client escalation reaches you stripped of every name on its way down. What's left is a complaint that the system locates its subjects too slowly under load, in a region currently thick with soldiers and reporters. You spend the day making it faster. You're good at it. The better you make it, the less you like what it's for.",
"You sit in a review for a capability that has no name, only a spec, and you finally ask the question you keep swallowing: what happens to the output once it leaves us. The room goes politely quiet. The director who recruited you smiles and says the architecture is sound, let's stay focused. You stay focused. But you clocked who looked down at the table when you asked, and who looked at you, and the second list was the shorter one.",
"Half the floor up here isn't even your discipline. One group does nothing but locate, work commissioned by people with no business cards and email addresses that are mostly numbers. Another group's deliverables physically leave the building in crates. The official line is that the company merely finds things and builds things, and what the clients do afterward is a question above everyone's clearance, including, conveniently, the people asking.",
"You walk two mid-levels through their first work on the program, telling them only what they need and closing the repo when they stand up, exactly the way it was once done to you. One asks what the matching is for. You give the answer you were given. You watch them decide whether to push, and watch them decide not to."
]>>
<<case "Lead Engineer">>
<<set _descriptions = [
"You run a team on the floor above now, and in the rooms you're allowed into the clients have names. The names are worse than the silence was. This morning you sit across a table from people who speak about a population the way you once spoke about edge cases, and you translate what they want into a sprint plan. By the time you leave the room it's just engineering again. That's the only trick you've found for staying in the chair.",
"A new contract: a consumer technology company everyone has heard of wants a surveillance layer built quietly enough that it never surfaces in a product announcement. They have the users. They lack the stomach to build the watching themselves, so they pay you to, at arm's length, through a subsidiary with a clean and meaningless name. You scope it. It's elegant. You hate how elegant you can make it.",
"Budget season. The capability you helped build is presented as a growth line, and executives discuss expanding the locating service into a new market the way they'd discuss a feature flag. You're asked for an engineering estimate. You give an honest one. It's a good number, and it earns you a nod from a man whose name you now know and wish you didn't, and the approval lands somewhere in you that you'd rather it had missed.",
"An incident pulls you in before dawn. The system surfaced someone it shouldn't have, or surfaced them to the wrong client, and which of those it was changes nothing about the cleanup. You spend the day making it never have happened: no ticket, no postmortem anyone off this floor will read. As finally you get up from your desk, you can't recall the last conversation you had that wasn't about containment.",
"A junior on the floor below, the kind you used to be, sends a careful message asking to be considered for the program. They think it's the interesting problem. They're right, it is. You sit with the message a while. Then you reply that you'll keep them in mind, and you mean it, and the fact that you mean it is the part that rides home with you."
]>>
<<case "Engineering Manager">>
<<set _descriptions = [
"You don't write much code now. You manage the people who do, and the thing they build carries your design even when your hands are nowhere near it. Today is one-on-ones, six of them, each engineer sharp and earnest and a little proud, none of them holding the whole picture. You hold it. Six times you decide how much to hand over, and six times you decide on less, and you tell yourself it's mercy.",
"A seat at the table, the corner office, the calm register where the real decisions get made. A client wants something that crosses a line even this place mostly pretends to keep: locating done inside a country the company isn't supposed to operate in, for a private outfit that fields its own soldiers. You contribute, usefully, because that's what the seat is for. Far below, on the floor you started on, someone is fixing a date-format bug and has no idea you exist.",
"Headcount review. You decide who gets pulled up to this floor and who stays below, which means you decide who learns what the company actually is and who is spared it. You choose the ones who can carry it, you tell yourself, but you know you're really choosing the ones who won't ask. You can read the difference at a glance now. That instinct used to be the thing you most disliked about the people who once sat where you sit.",
"A reporter's email lands in your inbox, forwarded down with a single word: handle. The questions are close. Closer than anyone above you seems to believe, brushing against clients that span a foreign ministry, a domestic agency that doesn't advertise its address, and a technology company the public adores. You spend the day drafting a non-answer in the careful, capable language you taught yourself to write. You were going to build something everyone heard about. You did. They'll just never know it was yours.",
"A quiet day at the top, which has its own strangeness. In the afternoon you walk the floor below, the one with the carpet the color of cold coffee, and a junior you don't recognize gives you the wary nod people save for someone from upstairs. You remember being that nod. You remember the man who sat at that desk before the weight and the lost savings and the seat at the table. You take the lift back up. The card still works."
]>>
<<default>>
<<set _descriptions = [
"The workday passes."
]>>
<</switch>>
<<print _descriptions.random()>>
<br><br>
/* Worked with too high arousal */
<<if $job.distractedToday>>
<span class="warning">Your head wasn't in it today. Too horny to focus, and it showed. <strong>No progress toward a promotion.</strong></span>
<br><br>
<</if>>
/* Passive drain: flavor only, the energy hit already landed in clockIn.
Lines split by seniority so a Lead isn't shifting desks. */
<<if $job.drainType == "passive">>
<<if $job.level >= 4>>
<<set _drainLines = [
"A client escalation with no name on it swallows the afternoon, three back-to-back calls where you say the same reassuring nothing in three different registers. You leave wrung out.",
"You spend hours you'll never recover chairing a 'quick alignment' between two teams who despise each other, translating each side's contempt into something the other can sign off on.",
"A junior's mistake lands on your desk to make disappear before anyone above notices. No ticket, no thanks, just a long quiet afternoon of cleanup and a headache to take home.",
"Budget review runs three hours over. By the end you've defended headcount you don't care about to people whose names you're still not sure of, and there's nothing left in the tank."
]>>
<<else>>
<<set _drainLines = [
"Half the afternoon vanishes into helping shift the whole row of desks two meters left for a floor plan nobody asked for. You leave with your back complaining and nothing to show for it.",
"You get volunteered to onboard a new hire who asks the same three questions in rotation until the light outside has gone.",
"A senior dumps a merge conflict on you an hour before end of day, the kind with someone else's undocumented mess all through it. You untangle it, uncredited, long past when you meant to leave.",
"IT reimages your machine mid-morning and you spend the rest of the day reinstalling everything from scratch, achieving precisely nothing anyone will ever see."
]>>
<</if>>
<<run _drainLines.push(
"A production incident eats the day. By the time it's contained you've forgotten what you actually came in to do.",
"A server migration goes sideways and you spend hours babysitting a progress bar that keeps resetting to zero."
)>>
<<= _drainLines.random()>> <span class="bad">You're extra worn out from working today.</span><br><br>
<</if>>
/* Workday opportunity, surfaced under the day's description */
<<if $job.eventToday>>
<<if $job.level >= 4>>
<<set _mode = "participant">>
<<elseif $job.level == 3>>
<<set _mode = "complicit">>
<<else>>
<<set _mode = "witness">>
<</if>>
/* Shared gif pool. Each type carries only the tiers it actually supports.
Omit a tier entirely (or leave its array empty) and it drops out of the
pool automatically for that mode. No empty-string placeholders. */
<<set _office = {
bj: {
gifs: ["office_bj1.gif","office_bj2.gif","office_bj3.gif","office_bj4.gif","office_bj5.gif","office_bj6.gif","office_bj7.gif","office_bj8.gif","office_bj9.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care.", "You open the private office expecting a meeting and instead find the secretary on her knees while her boss exhales sharply above her.", "The door clicks open, and for one stunned second, everyone freezes except the woman already wrapped around him."],
participant: ["You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved.", "You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "You close the office door behind the assistant, and she gives you a teasing smile before slowly sinking to her knees."]
}
},
grope: {
gifs: ["office_gr1.gif","office_gr2.gif","office_gr3.gif"],
texts: {
witness: ["Through the half-open blinds, you catch the manager pressed against his intern while wandering hands slip beneath her clothing.", "You pause outside the office door just long enough to see a manager tangled close to his intern. He hushes her while cupping a feel."],
complicit: ["The moment the door opens, both of them turn toward you without stopping, her blouse still half undone beneath his hands.", "You pause outside the office door just long enough to see a manager tangled close to his intern."]
/* no participant tier: grope stays an ambient sighting, not an arousal vent */
}
},
sex: {
gifs: ["office_h1.gif","office_h2.gif","office_h3.gif","office_h4.gif","office_h5.gif","office_h6.gif"],
texts: {
witness: ["The conference room lights are dim, but not enough to hide the rhythm of two bodies moving against the polished table.", "You freeze outside the office when you spot an intern with her executive partner, papers scattered across the floor beneath them."],
participant: ["The empty office stays quiet except for muffled gasps and the creak of office furniture as you pull the intern closer.", "You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved."]
/* no complicit tier */
}
},
hj: {
gifs: ["office_hj1.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care."],
participant: ["You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "The intern kneels beside your desk in the empty office, looking up at you while her hand slowly slides higher."]
}
}
}>>
/* Tease pool per tier */
<<switch _mode>>
<<case "witness">>
<<set _pool = [
{id:"w1", teaseImg:"", setup:"You catch a sound from an office down the hall that doesn't belong in a workplace."}
]>>
<<case "complicit">>
<<set _pool = [
{id:"c1", teaseImg:"", setup:"A door on the quiet floor sits open a crack, and there's movement behind it."}
]>>
<<case "participant">>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _internLines = [
'//"Did you need anything else from me?"//',
'//"Anything else before I head off?"//',
'//"Is there something else you wanted?"//',
'//"Do you need me for anything else?"//',
'//"Was there anything else?"// she asks, lingering.',
'//"Anything else you need?"// she says, not quite turning to leave.'
]>>
<<set _pool = [
{id:"p1", teaseImg:_internImg, setup:"Some assistant lingers in the doorway after dropping off some files. " + _internLines.random()},
{id:"p2", teaseImg:_internImg, setup:"An intern you signed off on last month catches you alone by the printers and takes a beat too long over nothing. " + _internLines.random()},
{id:"p3", teaseImg:_internImg, setup:"An intern is still at her desk when the floor's gone quiet, and she looks up when you pass like she's been waiting for you to. " + _internLines.random()}
]>>
<</switch>>
<<if _pool.length > 0>>
<<set _scene = _pool.random()>>
<<if _pool.length > 1>>
<<for _i = 0; _scene.id === $job.lastWorkScene and _i < 5; _i++>>
<<set _scene = _pool.random()>>
<</for>>
<</if>>
<<set $job.lastWorkScene = _scene.id>>
/* Tease only. Payoff withheld until the player engages. */
<<if _scene.teaseImg !== "">>
<div class="char-scene">
<img @src="_scene.teaseImg" class="char-img">
<div class="char-text"><<= _scene.setup>></div>
</div>
<<else>>
<<= _scene.setup>>
<</if>>
<br>
<<set _validTypes = Object.keys(_office).filter(t =>
_office[t].texts[_mode] && _office[t].texts[_mode].length > 0
)>>
<<if _mode === "participant">>
<<link "Take her to an empty office." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<addSuspicion 1>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "engaged">>
<</link>>
<<else>>
<<link "Take a closer look." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "watched">>
<</link>>
<</if>>
<br><br>
<</if>>
<</if>>
/* Stay-late choice: accept for performance, decline for a nick to it.
Weekday version is career-only, no wife penalty by design. */
<<if $job.drainType == "late" and not $job.stayedLate>>
<<if $job.level >= 4>>A crisis lands at end of day and the room quietly expects you, of all people, to be the one who stays until it's put to bed.<<else>>Your manager catches you reaching for your coat. There's a deadline slipping, and he's asking, in the way that isn't really asking, if you can stay and see it through.<</if>>
<br>
<<if $energy >= 1>>
<<link "Stay late and grind it out." "Helion Dynamics, Workday">>
<<set $job.stayedLate = true>>
<<set $job.drainType = "">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 1>>
<</link>>
<br>
<<else>>
//You're running on empty. You couldn't give it another hour if you wanted to.//
<br>
<</if>>
<<link "Come up with a bad excuse and leave." $return>>
<<set $job.drainType = "">>
<<set $job.performance -= 1>>
<</link>>
<</if>>
/* Ring-A-Ding team night. Replaces the clock-out link while it stands. */
<<if $club.celebPending>>
<<if $club.celebHost>>
The release shipped at three and the client signed off at half past. By four you've stopped pretending to read the report and you know what the floor is waiting for. You stand up.
<br><br>
<<speech "You" $name>>
Ring-A-Ding, half an hour. Developers only. It's going on the team card, and I don't want to see anyone reading email.
<</speech>>
<br>
The juniors cheer. Rick, passing, gives you a look that says he'd have done the same and is glad it isn't his card.
<<if $assistant.unlocked>>
<br><br>
$assistant.name looks up from her screen, then back down. Not invited, and not the kind of night she'd want to be invited to. She'll hear about it, but only about how the developers went wild.
<</if>>
<<else>>
Just before four Rick climbs onto a chair and bangs a stapler on a desk until the floor goes quiet. The release shipped, the client signed off, and Helion is paying for the team to celebrate.
<br><br>
<<speech "Manager" "Rick">>
Ring-A-Ding, half an hour. Company card. Nobody goes home early, that's an order.
<</speech>>
<br>
Half the team cheers. The other half is already texting home.
<</if>>
<br>
<<link "Go with the team." "Ring-A-Ding, Celebration">>
<<set $club.celebPending = false>>
<<set $club.lastCelebDay = $gameDay>>
<<set $time = $timeMax>>
<<set $drunk += 3>>
<<set $arousal = Math.min($arousal + 3, $arousalMax)>>
<<set $job.performance += 1>>
<</link>>
<br>
<<link "Make your excuses and head home." $return>>
<<set $club.celebPending = false>>
<<set $club.lastCelebDay = $gameDay>>
<<if not $club.celebHost>><<set $job.performance -= 2>><</if>>
<</link>>
<<elseif not ($job.drainType == "late" and not $job.stayedLate)>>
<<link "Clock out for the day." $return>><</link>>
<</if>><br><br>
''Elsewhere in the house''
<br>
<<if !tags().includes("bedroom")>>
<<link [[🛏️ Bedroom|Bedroom]]>><</link>><<if $wife.location == "bedroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("kitchen")>>
<<link [[🍳 Kitchen|Kitchen]]>><</link>><<if $wife.location == "kitchen">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("livingroom")>>
<<link [[🛋️ Living Room|Living Room]]>><</link>><<if $wife.location == "livingroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("bathroom")>>
<<if $wife.location == "bathroom">>
<<link [[🚿 Bathroom|Bathroom Door]]>><</link>> 👩🦰
<<else>>
<<link [[🚿 Bathroom|Bathroom]]>><</link>>
<</if>>
<br>
<</if>>
/* Only show "Around town" when it makes sense */
<<if $time < $timeMax>>
<br>
''Around town''
<br>
<<if $weekday <= 5 and $time <= 1>>
<<link [[💼 Helion Dynamics|Helion Dynamics]]>><</link>>
<<if $time == 1 and not $job.attendedToday>>
<span class="warning">- Time to work!</span>
<</if>>
<br>
<</if>>
<<link [[🏃 Canal Path|Canal Path]]>><</link>>
<br>
<<link [[🛒 Eastgate Plaza|Eastgate Plaza]]>><</link>>
<</if>><h1>Twelve Years Ago</h1>
The bleachers were full and you were watching the wrong half of the field. Down at the front, the cheer squad came out in formation, and one of them caught your eye and didn't look away. Blue and white. Red hair pulled tight. A smile that wasn't for the crowd.
<br><br>
She found you outside afterward, hair already coming loose. She said you looked like a guy who already knew how this story ended.
<br><br>
Her name was <<textbox "$wife.name" "Ashley">>.
<br><br>
You told her yours: <<textbox "$name" "Dave">>.
<br><br>
She was studying acting. You were on the boxing team and halfway through a computer science degree that bored you to tears. You were both broke in the temporary, beautiful way only college can make broke feel.
<br><br>
You talked through dinner with her friends and then through the long walk back to her dorm. She didn't tell you to leave at her door.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro1.jpeg" width="100%">
</div>
<br>
Sex came easy in those days, and often. She'd come back from practice still in her uniform and lock the door behind you.
<br><br>
You were going to do everything. She would be on a stage by twenty-five. You would build something everyone heard about. You said it out loud to each other in cheap apartments and on long drives and in the kitchens of friends who would later stop calling.
<br><br>
You believed every word of it. So did she.
<br><br>
<<link "Continue." "Intro 2">><</link>><h1>The Years Between</h1>
You graduated. She graduated. You took the job your professor told you to take, in a building that smelled of carpet glue, and you wrote code that nobody outside the company would ever see. She got headshots done. She auditioned for things and didn't get them, then auditioned for things and got them, mostly background work, mostly unpaid.
<br><br>
Three years in, you had an idea you couldn't stop thinking about, and you knew, the way you'd known at twenty, that it was the one.
<br><br>
You raised a little. Then a little more. You hired two people, then four, then six. The runway got longer. The pitch got tighter. You lost weight from skipped meals and slept on the office couch more nights than you slept at home.
<br><br>
$wife.name went to fewer auditions. Then to a callback she didn't get, and another, and another. She stopped telling you about them.
<br><br>
She told you about the baby on a Tuesday. You remember it was a Tuesday because you had a board meeting on the Wednesday. You bought the house that summer. A small place with trees in the front yard, blocks from a park where she pictured pushing a stroller. $wife.name picked it. She said it had good light.
<br><br>
The baby came. You met your investors that morning. You held your son that afternoon. You were back at the office before he was a week old.
<br><br>
The startup had eighteen months left in it. You spent ten of them telling yourself the next quarter was the one. $wife.name took your son to his first doctor's appointment, and his second, and his first day at a daycare you couldn't afford and signed up for anyway. You don't remember what she looked like in any of those months. You weren't really there.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro2.jpeg" width="100%">
</div>
<br>
The company went under in a way you'd watched other people's companies go under. You'd always thought you'd see it coming. You didn't.
<br><br>
When the dust cleared, the savings were gone, the house was gone, and your son was almost two and didn't really know you.
<br><br>
$wife.name didn't say much. There was nothing to say.
<br><br>
<<link "Continue." "Intro 3">><</link>><h1>Now</h1>
The apartment is small. Two bedrooms, if you're generous about what a bedroom is. The radiators clank. The neighbor upstairs has a child the same age as your son, and you can hear both of them most mornings, before the kettle is on. Half the boxes are still in the hallway.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro3.jpeg" width="100%">
</div>
<br>
You took the job at Helion Dynamics six weeks ago. Junior Software Engineer. A hundred a day. You sit in row three of an open plan office in a building off the bypass, and you write code for things you don't understand for clients you've never been told the names of. The carpet is the color of cold coffee. You aren't allowed onto the floor above.
<br><br>
$wife.name now works as a waitress, feeling like the cliché of a failed actress. Daycare costs more than her shifts pay. The math doesn't work, and you both pretend not to notice.
<br><br>
You've put on thirty pounds. You can feel it on the stairs and in the mirror. The boxing gloves you used to own are in a box somewhere, or they aren't. You haven't looked yet.
<br><br>
Rent is due Sunday. The fridge is mostly empty. Your son will be home from daycare at five.
<br><br>
It is Monday morning. You should be on your way to work in an hour.
<br><br>
You haven't decided yet whether this is the rest of your life. Maybe it is. Maybe it's just the bottom, and the bottom is only the bottom if you stay there.
<br><br>
Nobody is going to hand you the way back. Whatever you want from here, the money, her trust, your own reflection, you take it the hard way or not at all.
<br><br>
You earn it.
<br><br>
<<link "Begin." "Bedroom">>
<<set $gameRunning to true>>
<</link>><h2><<print passage()>></h2>
<<include 'Kitchen, Description'>>
<<include 'Kitchen, Triggers'>>
<<include 'Kitchen, Basics'>>
<<include 'House, Transport'>>/* Cooking State */
<<if $chores.kitchen>>
The countertop is clear, utensils set within easy reach.
<<else>>
The counter is cluttered, tools and dishes left where they were used.
<</if>>
/* Weekend late-morning breakfast together (both in the kitchen) */
<<if $weekday >= 6 and $time == 1 and $wife.location == "kitchen">>
<br>
<<if $wife.mood < 0>>
//$wife.name is making her own breakfast, and the set of her shoulders says she'd rather do it alone.//
<<elseif $energy < 1>>
//You're too drained to put a proper breakfast together.//
<<else>>
<<link "Make a slow weekend breakfast together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<</if>>
/* Cook (Early Evening only) */
<<if $time == 5>>
<br>
<<if $energy < 1>>
//You're too drained to cook dinner.//
<<else>>
<<link "Cook dinner for everyone." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $wife.cookedToday = true>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<<elseif $time > 5>>
<br>
//Dinner's long done. Nothing to cook now.//
<<elseif $time > 0 and not ($weekday >= 6 and $time == 1)>>
<br>
//Too early to start on dinner.//
<<elseif $time == 0 and $weekday >= 6>>
<br>
//Too early to think about food.//
<</if>>
/* Eat together (weekday mornings) */
<<if $time == 0 and $weekday <= 5>>
<br>
<<if $wife.mood <= -2>>
//There is no breakfast on the table. $wife.name had hers before you were up, and the plate is already in the sink.//
<<else>>
<<link "$wife.name has made breakfast. Eat together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<</if>>/* Base description */
A modest kitchen with a wooden table at its center and chairs around it. On the countertop, the coffee maker sits beside the kettle. The fridge hums. A window above the sink looks out onto the backs of the apartments across the way.
/* Time */
<<switch $time>>
<<case 0>>Early morning light falls across the counter and an empty mug from last night.
<<case 1>>It's late morning. The kitchen still smells faintly of coffee, and a sippy cup is drying upside down by the sink.
<<case 2>>The midday sun lies flat on the table.
<<case 3>>In the afternoon, dust turns in the light by the window.
<<case 4>>Late afternoon sun reaches the table, and the building across the way is losing its light.
<<case 5>>In the early evening the apartments across the way turn amber.
<<case 6>>It's evening, and the kitchen still smells of dinner.
<<case 7>>It's late evening. Across the way, only one or two windows are still lit.
<<case 8>>It's night, and the block opposite is dark.
<</switch>>
/* Chore */
<<if $chores.kitchen>>
<span class="good">The counters are wiped down, dishes put away, the table cleared.</span>
<<else>>
<span class="warning">Dishes are stacked in the sink, a half-eaten toddler plate among them, and there are crumbs all over the table.</span>
<</if>>
/* Kitchen Chore */
<<chore "kitchen" "Clean the kitchen.">>
<br><br><<if $wife.location == "kitchen">>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualDay1.jpeg', 'images/characters/w/w_casualDay2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, moving around the counter. She glances over when you come in.
<<elseif $wife.mood == 0>>
$wife.name is here, moving quietly around the counter.
<<else>>
$wife.name is here, working at the counter without looking up.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "kitchen">><h2>With $wife.name</h2>
<<set $wife.lazyMorningToday = true>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_lazymorning1.jpeg', 'images/characters/w/w_lazymorning2.jpeg','images/characters/w/w_lazymorning3.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
You climb back under the covers and she folds into you without a word, her head on your chest, the morning in no hurry to start. For a while there's nothing to fix and nowhere to be, just her breathing slowing against you and the light moving across the ceiling.
<<elseif $wife.relationship >= 25>>
You slide back in beside her and she lets you, settling her back against your chest. Neither of you says much. It's easy in a way mornings haven't been in a while, and she doesn't pull away though the boy could wake any minute.
<<else>>
You get back under the covers and, after a moment, she shifts to make room rather than turning away. You lie there in the quiet, not talking, the small distance between you a little smaller than it was.
<</if>>
<br><br>
<<link "Get up." $return>><</link>><h2><<print passage()>></h2>
<<include 'Living Room, Description'>>
<<include 'Living Room, Triggers'>>
<<include 'Living Room, Basics'>>
<<include 'House, Transport'>>/* Relax */
The sofa faces the TV. Somewhere to sit and let an hour go by.
<br>
<<if $time >= $timeMax>>
//It's too late to properly unwind now.//
<<else>>
<<link "Pass some time in front of the TV.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<if random(1, 100) <= 50>>
<<goto "TV">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
<<if $items.yogaMats>>
A pair of yoga mats rest in the corner, rolled out and ready.
<br>
<<workout "Do some yoga." 1 1 1 0 1>>
<<else>>
The corner stands empty, open space against the wall.
<br>
//You could use a set of yoga mats here, something simple for a quiet workout at home.//
<</if>>
<<soloVent "livingroom">>/* Base description */
A living room with a sofa facing the television and an armchair angled beside it. A coffee table sits in the middle, a low bookshelf against the far wall. A window looks out onto the street below.
/* Time */
<<switch $time>>
<<case 0>>In the early morning the room is still, the television off.
<<case 1>>It's late morning, and yesterday's cartoon is still paused on the screen.
<<case 2>>The midday sun lands on the rug.
<<case 3>>In the afternoon, sunlight catches the dust above the coffee table.
<<case 4>>Late afternoon sun lies across the floor in long bars.
<<case 5>>In the early evening the light fades from the street, and nobody has switched the lamps on yet.
<<case 6>>It's evening, and one lamp is on.
<<case 7>>It's late evening. The streetlamps outside give the room a faint orange light.
<<case 8>>It's night, and the only light is the lamp in the corner.
<</switch>>
/* Chore State */
<<if $chores.livingroom>>
<span class="good">Cushions are straightened, toys put away, the coffee table clear.</span>
<<else>>
<span class="warning">Toys lie scattered across the rug, a blanket bunched on the sofa, mugs left ringing the coffee table.</span>
<</if>>
/* Living Room Chore */
<<chore "livingroom" "Tidy the living room.">>
<br><br><<if $wife.location == "livingroom">>
/* Wife doing yoga */
<<if $wife.doingYoga>>
<div class="char-scene">
<img @src="either('images/characters/w/w_yoga1.jpeg', 'images/characters/w/w_yoga2.jpeg', 'images/characters/w/w_yoga3.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name has the mats out, moving through her stretches in the cleared space by the wall. She catches you watching and carries on, unbothered by the audience.
<<elseif $wife.mood == 0>>
$wife.name has the mats out, working through her yoga by the wall, breathing slow and even.
<<else>>
$wife.name is on the mats with her back to you, moving through her stretches, making it plain she'd rather not be interrupted.
<</if>>
<<if not $wife.yogaViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
<<if $wife.mood >= 0>>
<br>
<<if $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $arousal >= 8>>
//You're in no state to focus on stretching beside her.//
<<elseif $energy < 1>>
//You're too drained to join in.//
<<else>>
<<link "Join her for a session." $return>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $wife.relationship += 2>>
<<moodShift 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</link>>
<</if>>
<</if>>
</div>
</div>
<<if not $wife.yogaViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.yogaViewedToday = true>>
<</if>>
/* Wife Tidying */
<<elseif $wife.tidyToday>>
<<set $wife.tidyToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualBent1.jpeg', 'images/characters/w/w_casualBent2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is gathering the kid's toys off the rug, bent over by the sofa with one arm buried beneath it, chasing something just out of reach.
<<elseif $wife.mood == 0>>
$wife.name is clearing the toys scattered across the rug, by the sofa with one arm stretched right under it after a stray one.
<<else>>
$wife.name is picking up after the kid, bent down by the sofa and reaching under it without a word to you, the set of her shoulders making it plain she'd rather you weren't watching.
<</if>>
<span class="arousal">Arousal increased.</span>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There's a whole second toybox under here, I swear. Don't just stand there enjoying the view, lend me a hand.
<</speech>>
<<elseif $wife.mood == 0>>
<<speech "Wife" $wife.name>>
Why does everything end up under here. Every single time.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't mind me. Someone has to do it.
<</speech>>
<</if>>
/* Wife on the couch */
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualRelax1.jpeg', 'images/characters/w/w_casualRelax2.jpeg', 'images/characters/w/w_casualRelax3.jpeg', 'images/characters/w/w_casualRelax4.jpeg', 'images/characters/w/w_casualRelax5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is on the couch. She looks up briefly when you come in.
<<elseif $wife.mood == 0>>
$wife.name is sitting on the couch.
<<else>>
$wife.name is on the couch, her eyes fixed somewhere across the room.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "livingroom">><h2>Her Place</h2>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<sexEnergy 1>>
<<set $ex.pending = false>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"You knock once and she opens the door without a word. Clothes come off fast. You push her against the wall, yank her jeans down, and drive your cock into her wet pussy in one hard thrust. She gasps and grabs your shoulders as you fuck her standing, hips snapping forward, skin slapping loud with every stroke. Her cunt grips you tight. A few minutes later in the bedroom, you bend her over the bed, and slam into her from behind, one hand fisted in her hair while the other works her clit. She moans and pushes back against your thrusts. You flip her onto her back, spread her legs wide, and pound deep, watching her tits bounce as your cock stretches her open. She claws your back and comes hard. You keep thrusting until you flood her insides. She lies there catching her breath while you pick up your clothes.",
"She buzzes you up, and clothes are already coming off as you move toward the bedroom. She drops to her knees the moment you reach the bed and takes your cock in her mouth. Her tongue works along the shaft while her lips slide up and down. She looks up once, then takes you deeper until you feel the back of her throat. After a few minutes she pulls off, climbs onto the bed, and straddles you. She grabs your cock, lines it up, and sinks down until you're buried inside her. Her hips start rolling, grinding and bouncing, her pussy gripping tight with every movement. She leans forward, hands on your chest, riding faster, her tits swaying above you. You grip her ass and thrust up to meet her, driving deeper each time she drops. She moans louder and slams down harder. Her cunt clamps around your cock as she comes. You keep thrusting from below until you can't hold back either. She stays on top for a moment, breathing heavy, then rolls off onto the sheets. You stand and start pulling on your clothes while she reaches for her phone."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>Round Two?</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
/* She sends a picture with the text. Avoid an immediate repeat, save it. */
<<set _ons = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _ons.push("ons_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _ons = _ons.filter(f => f !== $ex.lastNudeImg)>>
<<set _pick = _ons.random()>>
<<set $ex.lastNudeImg = _pick>>
<<set _img = "images/characters/npc/" + _pick>>
<<set _cap = "She was hungry for more. Day " + $gameDay + ".">>
<<set _newPic = not $phone.gallery.some(g => g.img === _img)>>
<<galleryAdd _img _cap true>>
Your phone goes again, and this time you're the only one who sees it. It's her, the girl from the Anchor you went home with and don't remember giving your number to.
<br><br>
<div class="chat">
<div class="bubble in">still got that itch 😉 you free?</div>
</div>
<br>
<div class="intro-image"><img @src="_img" width="100%"></div>
<<if _newPic>><span class="good">Saved to your gallery.</span><</if>>
<br><br>
''What do you do?''
<br>
/* EXTENSION POINT
Wire "Go see her" to a repeat-hookup scene mirroring Anchor ONS:
advance time, drop arousal, call <<addSuspicion 3>>, then route there.
For now it just returns. */
<<link "Go see her." "ONS Ex Hookup">>
<</link>>
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Leave it. Maybe another time." $return>>
/* stays live, will surface again */
<</link>><h2>The Phone on the Table</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares += 1>>
/* Her growing wariness. Raw bump, escalating each scare. Deliberately not
<<addSuspicion>>, since this is her noticing, not a fresh cheat. */
<<set $wife.suspicion = Math.min($wife.suspicion + $ex.scares, 20)>>
<<moodShift -1 -1>>
<<set _excuse = [
"someone from work chasing a ticket",
"a wrong number, some kid texting the wrong guy",
"spam, one of those delivery scams going around"
].random()>>
You left your phone face up on the table. It lights up and buzzes its way halfway across the surface, and the preview sits there in plain sight for a second before you can move.
<br><br>
<div class="chat">
<div class="bubble in">hey it's the girl from the Anchor 😉 you ducked out before I could even get your name properly. was thinking about you. we should do that again sometime</div>
</div>
<br>
And there it is. The night comes back to you in pieces, the drinks, the walk, her hand on your arm, and somewhere in the haze of it you'd given her your number and forgotten you'd ever done it. Sober you would never. Drunk you handed it over like a damned business card.
<<= $wife.name>>'s eyes get to the screen before yours do. You can't tell how much of the preview she caught, but you can see her reading your face for the answer, and your face is doing you no favors.
<br><br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_suspicious1.jpeg', 'images/characters/w/w_suspicious2.jpeg')" width="100%">
</div>
<<if $ex.scares == 1>>
You reach over a beat too fast and tell her it's <<= _excuse>>. She holds your eye a second longer than you'd like, then lets it go. The lie sits between you, and you both feel its weight even if only one of you knows its shape.
<<else>>
You give her <<= _excuse>>, the same easy lie as last time, and you can see her setting it down next to the last one. She doesn't argue. She just looks at you, and that's worse than if she did.
<</if>>
<br><br>
''What do you do?''
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Delete the text, but keep her number." $return>>
<<set $ex.saved = true>>
<</link>>/* INFO */
<<set $name = "Dave">>
<<set $energyMax = 5>>
<<set $energy = $energyMax>>
<<set $money = 100>>
/* Fitness and workout variables */
<<set $fitness = 0>>
<<set $fitnessTier = 0>>
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
<<set $lastWorkoutDay = 0>>
<<set $fitnessWarning = false>>
<<set $fitnessWarningShown = false>>
<<set $foughtToday = false>>
/* Arousal System */
<<set $arousal = 0>>
<<set $arousalMax = 10>>
<<set $ventedToday = false>>
/* Other variables */
<<set $drunk = 0>>
<<set $onsToday = false>>
/* ITEMS / OWNERSHIP */
<<set $items = {
pc: false,
yogaMats: false,
wine: 0,
goodBed: false,
cosElastigirl: false,
cosHarley: false,
cosKim: false,
cosCammy: false,
cosNurse: false
}>>/* Setup $return and tag "noreturn" functionality */
<<if not tags().includes("noreturn")>>
<<set $return to passage()>>
<</if>>
/* TRIGGERS */
<<if $gameRunning>>
<<wifeSchedule>>
<<workCheck>>
<<friendInviteCheck>>
<</if>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Messages</div></div>
<div class="phone-screen">
<div class="phone-list">
<a class="phone-row" data-passage="Phone Wife">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$wife.name</div>
<div class="pr-prev"><<if $phone.wifeUnread>>Sent you a photo<<else>>Tap to message<</if>></div>
</div>
<<if $phone.wifeUnread>><div class="pr-badge">●</div><</if>>
</a>
<<if $assistant.numberKnown>>
<a class="phone-row" data-passage="Phone Assistant">
<div class="p-avatar assistant"><<= $assistant.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$assistant.name</div>
<div class="pr-prev"><<if $phone.assistantUnread>>Sent you a message<<else>>Tap to message<</if>></div>
</div>
<<if $phone.assistantUnread>><div class="pr-badge">●</div><</if>>
</a>
<</if>>
<<if $dancer.numberKnown>>
<a class="phone-row" data-passage="Phone Dancer">
<div class="p-avatar dancer"><<= $dancer.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$dancer.name</div>
<div class="pr-prev">Tap to message</div>
</div>
</a>
<</if>>
<a class="phone-row" data-passage="Phone Friend">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$friend.name</div>
<div class="pr-prev"><<if $phone.friendUnread>>Sent you a message<<else>>Tap to message<</if>></div>
</div>
<<if $phone.friendUnread>><div class="pr-badge">●</div><</if>>
</a>
<<if $phone.gallery.length > 0>>
<a class="phone-row" data-passage="Phone Gallery">
<div class="p-avatar" style="background:#2c2c36;">🖼</div>
<div class="pr-body">
<div class="pr-name">Gallery</div>
<div class="pr-prev"><<= $phone.gallery.length>> saved<<if $phone.galleryNew > 0>> · <<= $phone.galleryNew>> new<</if>></div>
</div>
<<if $phone.galleryNew > 0>><div class="pr-badge">●</div><</if>>
</a>
<</if>>
<a class="phone-row" data-passage="Phone Services">
<div class="p-avatar" style="background:#2c2c36;">🧹</div>
<div class="pr-body">
<div class="pr-name">Services</div>
<div class="pr-prev"><<if $maid.active>>Cleaning active<<else>>Tap to arrange<</if>></div>
</div>
</a>
</div>
</div>
<div class="phone-foot"><<link "Put the phone away" $return>><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<<if $phone.friendPingTopic === "anchor" or $phone.friendPingTopic === "club">>
/* Invite. No reply: go straight there or decline. Expires at night. */
<<set $phone.friendUnread = false>>
<div class="chat">
<<if $phone.friendPingTopic === "club">>
<div class="bubble in">Ring-A-Ding tonight. I've got a booth and a very patient waitress. Get down here.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I've told the birthday girl about you. She's had three birthdays this month.</div>
<<else>>
<div class="bubble in">Door's on me, drinks are on you. That's the deal.</div>
<</if>>
<<else>>
<div class="bubble in">On my usual stool at the Anchor tonight if you can get out. Same as ever, brother.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I'll get the first round in and lie about whose it was.</div>
<<else>>
<div class="bubble in">It's been too long since you actually showed.</div>
<</if>>
<</if>>
</div>
<<friendInviteActions $phone.friendPingTopic>>
<<elseif $phone.friendPingTopic !== "">>
/* He texted first. Mark read on open; message stays until you reply. */
<<set $phone.friendUnread = false>>
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<</switch>>
</div>
<<if not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Reply" "Phone Friend Ping">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<</link>>
</div>
<<else>>
<div class="phone-note">You've replied to $friend.name today.</div>
<</if>>
<<elseif not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Text $friend.name">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<<set $phone.msgTopic = ["bored","checkin","gym","drink","memory","ribbing","advice"].random()>>
<<goto "Phone Friend Reply">>
<</link>>
</div>
<<else>>
<div class="phone-note">You've traded messages with $friend.name today already.</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<div class="bubble out">Still here. Heads down lately. Sorry, man.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">No apology needed. I just like knowing you're upright. That's the whole job of an old friend, checking you're still vertical.</div>
<<else>>
<div class="bubble in">Don't go dark on me again, that's all. Line's open.</div>
<</if>>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<div class="bubble out">God, that place. We practically lived in that booth.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Best years on the worst budget. I'd trade a chunk of what I've got now to be that broke and that happy again. Don't tell my accountant.</div>
<<else>>
<div class="bubble in">Long time ago now. Good times, though. We should make some new ones before we're too old to remember the old ones.</div>
<</if>>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<div class="bubble out">Big talk from a man I've watched miss the board entirely.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">One time. One time, eleven years ago, and you'll take it to my grave. This is exactly why I keep you around.</div>
<<else>>
<div class="bubble in">Talk's cheap. Anchor, darts, you and me. Prove it.</div>
<</if>>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<div class="bubble out">It's open. Means more than you'd think, you reaching out.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I know it does. That's why I do it. You spent long enough thinking you had to earn the phone call. You don't. Never did.</div>
<<else>>
<div class="bubble in">Good. Keep it that way. Not everything has to be a whole production, man.</div>
<</if>>
<</switch>>
</div>
</div>
<div class="phone-foot"><<link "Back" "Phone">>
<<set $phone.friendPingTopic = "">>
<</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="phone-note"><<= ["You text $friend.name, aware it's been a while. You're never quite sure how much of the old ease is left.","You tap out a message to $friend.name, already half-expecting the dry line you've got coming."].random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "bored">>
<div class="bubble out">Dying of boredom over here. Entertain me.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">You're texting a man who golfs on Tuesdays for fun, brother. We are not the entertainment we used to be. Tragic, really.</div>
<<else>>
<div class="bubble in">Ha. Join the club. Get yourself down the Anchor one of these nights and we'll fix that.</div>
<</if>>
<<case "checkin">>
<div class="bubble out">You alive?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Barely. Meetings all day with people who say "circle back" unironically. Good to see your name pop up, man. Means you're still upright.</div>
<<else>>
<div class="bubble in">Still here. Busy. You should come out, we never actually talk anymore.</div>
<</if>>
<<case "gym">>
<div class="bubble out">Trying to get back in shape. Don't laugh.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I would never. Proud of you, actually. The old you is in there under the takeout somewhere. Go dig him out.</div>
<<else>>
<div class="bubble in">About time. You used to be the fit one. Wild how that flips on a guy.</div>
<</if>>
<<case "drink">>
<div class="bubble out">We need a proper session soon.</div>
<<if ($weekday == 5 or $weekday == 6)>>
<div class="bubble in">Funny you should say it. I'm on my usual stool at the Anchor most of tonight. Get down here.</div>
<<else>>
<div class="bubble in">Weekend. Anchor. Same stool as ever. I'm not hard to find.</div>
<</if>>
<<case "memory">>
<div class="bubble out">Remember the road trip senior year? The car dying outside that diner?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Two days on gas-station hot dogs waiting on a tow that never came. Best forty-eight hours of my life, and I've owned a boat since. Tells you something.</div>
<<else>>
<div class="bubble in">Vaguely. That was a long time and a lot of brain cells ago, man. Good days, though.</div>
<</if>>
<<case "ribbing">>
<div class="bubble out">Admit it, you only keep me around to feel tall.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I keep you around because you knew me before the money and still pick up. Also yes, the height thing. Mostly the first one.</div>
<<else>>
<div class="bubble in">Ha. Something like that. Get yourself out for a pint and I'll insult you properly, in person.</div>
<</if>>
<<case "advice">>
<div class="bubble out">Straight question. You ever feel like you missed the version of your life where it all worked out?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Every damn day, brother. I hit the number and the feeling I was chasing wasn't in the account. You've still got the wanting. Don't waste it being miserable about the shape of it.</div>
<<else>>
<div class="bubble in">Heavy for a Tuesday. Yeah, sometimes. Everybody does. You're not as alone in it as you think.</div>
<</if>>
<</switch>>
</div>
</div>
<div class="phone-foot"><<link "Back" "Phone Friend">><</link>></div>
</div><<set $phone.galleryNew = 0>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Gallery</div></div>
<div class="phone-screen">
<<if $phone.gallery.length == 0>>
<div class="phone-note">Nothing saved.</div>
<<else>>
<<for _i = $phone.gallery.length - 1; _i >= 0; _i-->>
<div class="phone-photo"><img @src="$phone.gallery[_i].img" width="100%"></div>
<div class="phone-cap"><<= $phone.gallery[_i].caption>></div>
<</for>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Services</div></div>
<div class="phone-screen">
<div class="phone-note">A local outfit that handles the cleaning, so the flat stays in order without you or $wife.name having to keep on top of it.</div>
<br>
<<if $maid.active>>
<div class="phone-note"><span class="good">Cleaning service active.</span> $<<print $maid.cost>> a week, billed weekly. The place stays tidy on its own.</div>
<div class="phone-actions">
<<link "Cancel the service" "Phone Services">>
<<set $maid.active = false>>
<</link>>
</div>
<<else>>
<div class="phone-note">A cleaner twice a week, $<<print $maid.cost>> a week. The chores stop being your problem, and the house stays clean enough that $wife.name has one less thing to hold against you.</div>
<<if $money >= $maid.cost>>
<div class="phone-actions">
<<link `"Hire the cleaning service ($" + $maid.cost + ")"` "Phone Services">>
<<set $money -= $maid.cost>>
<<set $maid.active = true>>
<<set $maid.lastBilled = $gameDay>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<</link>>
</div>
<<else>>
<div class="phone-note">//You can't cover the first week ($<<print $maid.cost>>) right now.//</div>
<</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><<set _rp = Story.has($return) ? Story.get($return) : null>>
<<set _together = _rp ? _rp.tags.includes($wife.location) : false>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $phone.wifeUnread>>
<<if $phone.wifeMsgText !== "">>
<div class="chat">
<div class="bubble in"><<= $phone.wifeMsgText>></div>
<div class="bubble in">📷 Photo</div>
</div>
<<else>>
<div class="chat"><div class="bubble in">📷 Photo</div></div>
<</if>>
<div class="phone-actions">
<<link "Open photo" "Phone Wife Pic">>
<<set _img = "images/characters/w/" + $phone.wifePendingImg>>
<<if $phone.wifeMsgType == "lingerie">>
<<set _cap = "She sent this in the lingerie you bought her. Day " + $gameDay + ".">>
<<set _note = "She wanted you to see it again.">>
<<elseif $phone.wifeMsgType == "nude">>
<<set _cap = "She sent this out of nowhere. Day " + $gameDay + ".">>
<<set _note = "No prompting. She just sent it.">>
<<else>>
<<set _cap = $wife.name + " sent this. Day " + $gameDay + ".">>
<<set _note = "She really sent it.">>
<</if>>
<<set $phone.viewImg = _img>>
<<set $phone.viewNote = _note>>
<<galleryAdd _img _cap true>>
<<set $phone.wifeUnread = false>>
<<set $phone.wifePendingImg = "">>
<<set $phone.wifeMsgType = "">>
<<set $phone.wifeMsgText = "">>
<</link>>
</div>
<</if>>
<<if _together>>
<div class="phone-note">She's in the room with you. You could just talk to her.</div>
<<else>>
<div class="phone-actions">
<<if not $phone.wifeTextedToday>>
<<link "Send a message">>
<<set $phone.wifeTextedToday = true>>
<<set $phone.msgTopic = ["checkin","kid","miss","groceries","tonight","restaurant","weekend","apology"].random()>>
<<goto "Phone Wife Reply">>
<</link>>
<<else>>
<div class="phone-note">You've messaged her today already.</div>
<</if>>
<<if $gameDay >= $intimacyUnlockDay and not $phone.nudeAskedToday and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<link "Ask her to send something">>
<<set $phone.nudeAskedToday = true>>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.lastNudeDay = $gameDay>>
<<set _img = "images/characters/w/" + _pick>>
<<set $phone.viewImg = _img>>
<<set $phone.viewNote = "You asked. She delivered.">>
<<set $phone.msgTopic = "nude_yes">>
<<else>>
<<set $phone.msgTopic = "nude_no">>
<</if>>
<<goto "Phone Wife Reply">>
<</link>>
<</if>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<<if $phone.viewNote !== "">>
<div class="phone-note"><<= $phone.viewNote>></div>
<<else>>
<div class="phone-note">She really sent it.</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $wife.mood >= 1>>
<<set _intro = ["You catch a free minute and text her, just because. The thought of it lifts something small.","You thumb out a message to her. It's the kind of small reach you don't make often enough."]>>
<<elseif $wife.mood == 0>>
<<set _intro = ["You sit with the phone a moment, then text her. Ordinary, the way most days are now.","You tap out a message to her between one thing and the next, no particular weight to it."]>>
<<else>>
<<set _intro = ["You hesitate over the phone longer than you should, then text her anyway, bracing a little for how it lands.","You start and delete it twice before you send. Things have been thin between you lately."]>>
<</if>>
<div class="phone-note"><<= _intro.random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "checkin">>
<div class="bubble out">How's your day going?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Surviving. The lunch rush was a circus. Nice to get a text that isn't the daycare for once.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. You know how it is.</div>
<</if>>
<<case "kid">>
<div class="bubble out">How's the boy been today?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">A menace. Drew on the wall again. Your side of the family, clearly.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Fine. Handful, as usual. I've got it.</div>
<</if>>
<<case "miss">>
<div class="bubble out">Thinking about you.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Yeah? That's not like you. I'll take it though.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">That's nice. I'm up to my elbows here, but... thanks.</div>
<</if>>
<<case "groceries">>
<div class="bubble out">Need me to grab anything on the way back?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Milk. And whatever you're having, because I'm too tired to think about dinner. You're a lifesaver, actually.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Milk, if you remember. You usually don't.</div>
<</if>>
<<case "tonight">>
<div class="bubble out">What are you thinking for tonight?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Boy down by seven, then the sofa and something trashy. Don't fall asleep on me this time.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Same as every night. I'll believe the "we'll do something" when I see it.</div>
<</if>>
<<case "restaurant">>
<div class="bubble out">How's the shift? Tell me it's dead in there.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Slammed. A twelve-top that tipped in loose change and life advice. I'd rather be home losing the remote argument to you.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. Feet are gone. Can't really be on my phone.</div>
<</if>>
<<case "weekend">>
<div class="bubble out">Should we try to do something this weekend? The three of us.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Look at you, planning. The park if it's dry, and you're on bag duty this time. Deal.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">If you actually mean it, sure. I've heard "this weekend" before, though.</div>
<</if>>
<<case "apology">>
<div class="bubble out">I know I've been hard to live with lately. I'm sorry. I'm working on it.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">...That's not nothing. Thank you for saying it. Just let me see it too, alright?</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Okay. We'll see. Words have been cheap around here lately.</div>
<</if>>
<<case "nude_yes">>
<div class="bubble out">Send me something to get me through the day.</div>
<div class="bubble in">You're terrible. Lock your phone, for God's sake.</div>
<<case "nude_no">>
<div class="bubble out">Send me something. You know what I mean.</div>
<<if $wife.relationship >= 30>>
<div class="bubble in">Ha. Not today, tiger. Earn it first.</div>
<<else>>
<div class="bubble in">Are you serious? No.</div>
<<moodShift -1>>
<</if>>
<</switch>>
</div>
<<if $phone.msgTopic == "nude_yes">>
<<set _newPic = not $phone.gallery.some(g => g.img === $phone.viewImg)>>
<<galleryAdd $phone.viewImg ("She sent this when you asked. Day " + $gameDay + ".") true>>
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<<if _newPic>><div class="phone-note"><span class="good">Saved to your gallery.</span></div><</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><h2>Your Supporter Page</h2>
You pull up your project's page and check the numbers.
<br><br>
<<if $project.supporters > 0>>
<<print $project.supporters>> supporters, holding steady at $<<print $project.weeklyIncome>> a week. Not enough to quit anything over. Enough to feel like something you made is wanted.
<br><br>
''Recent activity''
<br>
<<set _names = ["xX_NightOwl_Xx", "GrumpyDad42", "anon_4417", "VelvetThunder", "tired_teacher", "lurkmaster99", "Sir_Reginald_III", "pixelpirate", "QuietStorm", "j_morrison", "GoonieX", "LumpY420", "basedBaby8", "Drunkencycle", "PrinceyDincey", "Shiggy", "KaxelAy", "SnyeSkark", "February_Fade", "Jameey", "bigkai542"]>>
<<set _comments = [
"keep it up, rare to see a dev who actually ships",
"the new build fixed my save bug. a hero, truly",
"take my money and just add more content",
"been here since v0.1, proud of you man",
"when's the next update dropping?? need it",
"worth every cent, don't burn out on us",
"finally a dev who reads the feedback",
"showed the game to my mom, but she didn't understand",
"soo psyched for next release!",
"are there any plans to add tentacles?!?!?!!?!",
"Is this game still getting updates? 👀 I find myself addicted to the game play, this has a lot of potential!",
"is there a way to auto max my stats",
"I know it is still in the early stages but seeing your game has an update got me excited. It is coming along really well. Poker night is interesting.",
"I like the improvements. Your game is coming along really well. <3",
"A lot of potential! No bugs so far, and I look forward to coming back and checking it out with each new update! Don't forget to take your time tho, and drink some water and rest! :)",
"more exhibitionism please!",
"How about actually researching Erotica instead of just feeding prompts in the AI, you pleb? Start with Aristotle's Poetics and return once you've learned this refined craft. There are no shortcuts to smut worth reading.",
"Why the hell does this work in progress game not have all features ready yet?!?!?!?!?!?!?!"
]>>
/* GENRE-tagged comments */
<<if $project.choices.genre === "broad">>
<<set _comments = _comments.concat([
"showed this to three friends and they all got it instantly",
"love that anyone can just pick this up and go",
"my kind of game, nothing gatekept about it"
])>>
<<elseif $project.choices.genre === "niche">>
<<set _comments = _comments.concat([
"niche as hell and i'm here for it, don't you dare go mainstream",
"finally something that isn't trying to please everyone",
"you get it. this is EXACTLY the thing nobody else makes"
])>>
<</if>>
/* PROTAGONIST-tagged comments */
<<if $project.choices.protagonist === "everyman">>
<<set _comments = _comments.concat([
"the MC actually feels like me, that's the whole appeal",
"love that the lead's just a normal guy for once"
])>>
<<elseif $project.choices.protagonist === "fantasy">>
<<set _comments = _comments.concat([
"the MC is such a legend, pure power fantasy and i love it",
"give me more of this larger-than-life lead",
"love all the fantastical horniness xD xD xD"
])>>
<</if>>
/* FEATURE-tagged comments */
<<if $project.choices.feature === "stats">>
<<set _comments = _comments.concat([
"the stat system has me in a chokehold, spreadsheet open and everything",
"min-maxing this is unreasonably satisfying",
"please never simplify the numbers, the depth is the point"
])>>
<<elseif $project.choices.feature === "variety">>
<<set _comments = _comments.concat([
"every update there's something new to stumble into, love it",
"the sheer amount of stuff to see keeps me coming back",
"so much variety, i keep finding scenes i missed"
])>>
<</if>>
<<set _picks = _comments.randomMany(3)>>
<<for _i = 0; _i < _picks.length; _i++>>
//<<= _names.random()>>//: <<= _picks[_i]>>
<br>
<</for>>
<br>
You could open the full dashboard over on <<link "FanForge">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>>, but there's not much more to see tonight.
<<else>>
The page is live, but it's quiet. No supporters yet, no comments, just the version number and a description you've rewritten four times. It's out there. That's the most you can say for it so far.
<</if>>
<br><br>
<<link "Close the page." "Computer">><</link>><h1>Relations</h1>
/* WIFE — always unlocked while the game is running */
<div class="rel-entry">
<div class="rel-portrait wife"></div>
<div class="rel-name">$wife.name</div>
<div class="rel-role">Your wife</div>
<div class="rel-body">
<<if $wife.mood >= 3>>
<p>Today she's bright and affectionate, leaning toward you whenever you cross paths.</p>
<<elseif $wife.mood == 2>>
<p>She's in a warm mood today, easy with you in a way she usually isn't.</p>
<<elseif $wife.mood == 1>>
<p>She seems content today, settled and unbothered.</p>
<<elseif $wife.mood == 0>>
<p>She's neither warm nor cold today, just going about her day.</p>
<<elseif $wife.mood == -1>>
<p>She's irritable today, her answers short and her patience thin.</p>
<<elseif $wife.mood == -2>>
<p>She's visibly upset, keeping her distance.</p>
<<else>>
<p>She's furious, her jaw set whenever she sees you.</p>
<</if>>
<<if $wife.relationship >= 80>>
<p>The two of you are close to what you were at the start. She trusts you, and she wants you to win.</p>
<<elseif $wife.relationship >= 50>>
<p>A real partnership is rebuilding. The resentment isn't gone, but it isn't the loudest thing in the room anymore.</p>
<<elseif $wife.relationship >= 25>>
<p>Things are slowly thawing between you. She gives you the benefit of the doubt more often than not.</p>
<<elseif $wife.relationship >= 0>>
<p>The two of you live alongside each other without much warmth, but without open conflict.</p>
<<elseif $wife.relationship >= -10>>
<p>Things are strained. She doesn't trust you and doesn't hide it.</p>
<<else>>
<p>It's effectively over. She's here because she has nowhere else to go.</p>
<</if>>
<<if $wife.favorUnlocked and $wife.relationship >= 95>>
<<if $wife.favor < 5>>
<p>She's in a giving mood these days, but you haven't quite earned anything yet.</p>
<<elseif $wife.favor < 10>>
<p>She's in a giving mood these days. Maybe you could ask for something special in bed.</p>
<<else>>
<p>She's in a giving mood these days. Maybe you could ask for something special in bed. And with this much goodwill banked, she might say yes to a different kind of night out.</p>
<</if>>
<</if>>
<<if $wife.suspicionLocked>>
<p>She knows. The worst of what you did behind her back is out, and now it's something to live down. Stay clean and it stays in the past.</p>
<<elseif $wife.suspicion >= 10>>
<p>You've cheated on her enough times that it's no longer a question of whether it comes out, only when.</p>
<<elseif $wife.suspicion >= 5>>
<p>You've been unfaithful more than once and left loose threads behind you. Things like that tend to surface.</p>
<<elseif $wife.suspicion >= 3>>
<p>There's what you did behind her back. It's small enough to tell yourself it meant nothing, but it won't stay buried on its own.</p>
<</if>>
</div>
</div>
/* ASSISTANT — appears once first seen with the grad cohort (L4).
Pre-unlock she reads as a mentee; post-unlock the frame shifts. */
<<if $assistant.met>>
<div class="rel-entry">
<div class="rel-portrait assistant"></div>
<div class="rel-name">$assistant.name</div>
<<if not $assistant.unlocked>>
<div class="rel-role">Graduate programme</div>
<<elseif $assistant.affair>>
<div class="rel-role">Your assistant</div>
<<else>>
<div class="rel-role">Your junior</div>
<</if>>
<div class="rel-body">
<<if not $assistant.unlocked>>
<p>Her name is on the graduate rotation list, and she keeps landing back at your desk. That stopped being the rota's doing weeks ago. You give her the work that gets noticed, and she turns it around faster than it deserves. She has never asked why you picked her.</p>
<<else>>
/* Where it stands */
<<if $assistant.tier == 0>>
<p>Kept on after the programme and assigned to you. Your junior, your call, your name on her reviews. She is careful, quick, and good at reading a room. Nothing has been said out loud.</p>
<<elseif $assistant.tier == 1>>
<p>The conversations at her desk run well past the work, and neither of you is ever the one to end them. You've started checking whether she's in before you decide what to wear.</p>
<<elseif $assistant.tier == 2>>
<p>You are sleeping with her. Inside the building it doesn't exist: on that floor she calls you by your title and hands you documents at arm's length. Off it, she answers within the minute.</p>
<<else>>
<p>She runs your calendar and your travel now, and the gaps in both that the two of you use. She stopped asking when she'll see you next, because she's the one who books it.</p>
<</if>>
/* What has actually happened */
<<if $assistant.hookupCount >= 10>>
<p>It started in the hotel room on the client trip. Now it happens in the building, in whatever room is empty at ten past five, often enough that you've both stopped counting. She knows which doors lock.</p>
<<elseif $assistant.hookupCount >= 1>>
<p>It started in the hotel room on the client trip. Since then it has moved inside the building, into the half hour after the floor thins out and rooms that were not built for it.</p>
<<elseif $assistant.tripTaken>>
<p>The client trip ended in her hotel room. On the flight home she said nothing changes on that floor, then asked you to put her name down for the next trip.</p>
<<elseif $assistant.flirtStage >= 3>>
<p>Nothing has happened yet. There was your jacket around her shoulders at the curb, her hand on your arm when the floor lights cut out, and the half hour in the third-floor gym where you could have reached for her.</p>
<<elseif $assistant.flirtStage == 2>>
<p>Two things you would not repeat to $wife.name: your jacket around her shoulders at the curb after drinks, and her hand finding your arm in the dark when the floor lights cut out.</p>
<<elseif $assistant.flirtStage == 1>>
<p>One night after drinks you put your jacket round her shoulders while you waited for cars, and she kissed you on the cheek before hers came. Neither of you has mentioned it since.</p>
<</if>>
/* Office attention. Same bands as the hub tell, but standing state
rather than an incident. Nothing below 3. */
<<if $assistant.affair and $assistant.heat >= 9>>
<p>The floor has stopped pretending not to notice. Nobody has said anything to your face yet, but people are watching for whatever you two do next.</p>
<<elseif $assistant.affair and $assistant.heat >= 6>>
<p>People have started putting things together. Not all of it, and not out loud, but you've left enough small oddities around the floor for someone to notice.</p>
<<elseif $assistant.affair and $assistant.heat >= 3>>
<p>People on the floor are paying the two of you a little more attention than they used to. Nothing anyone could act on yet.</p>
<</if>>
<<if $assistant.affair and $gameDay < $assistant.coolOffUntil>>
<p>For the moment she has drawn a line under all of it. She'll tell you when that changes.</p>
<</if>>
<</if>>
</div>
</div>
<</if>>
/* DANCER: appears after the first dance */
<<if $dancer.relationship > 0>>
<div class="rel-entry">
<div class="rel-portrait dancer"></div>
<div class="rel-name">$dancer.name</div>
<div class="rel-role">Dancer at Ring-A-Ding</div>
<div class="rel-body">
<<if $dancer.relationship >= 40 and $dancer.dateCount > 0>>
<p>She walks home on your arm, she gives up shifts for you, and there's a number in your phone she has told you not to use after midnight. It still costs money, and she'd tell you she's worth it.</p>
<<elseif $dancer.relationship >= 30 and $dancer.walkCount > 0>>
<p>You've walked her home. You know about the course and the flat and the boyfriend she doesn't talk about, and she knows a good deal more about you than you meant to tell her. She has your number. She has made the terms very clear.</p>
<<elseif $dancer.relationship >= 20>>
<p>You're one of her regulars now. She finds you the moment you're through the door. Money still changes hands, but less of the night feels like a transaction.</p>
<<elseif $dancer.nameKnown>>
<p>$dancer.name gave you her real name, which she says she doesn't do. It's still her job and your money, but she talks to you like a person between songs, and the back room is open to you when you can afford it.</p>
<<elseif $dancer.relationship >= 5>>
<p>$dancer.name remembers you. A nod when you come in, a little small talk with the dances. You're not a stranger anymore, but you're not much more than a good customer either.</p>
<<else>>
<p>A dancer at Ring-A-Ding who goes by $dancer.name. So far you're just another man with forty dollars.</p>
<</if>>
<<if $club.job>>
<p>She's the reason you got the job on the door, and she hasn't let you forget it.</p>
<</if>>
</div>
</div>
<</if>>
<div class="rel-foot"><<link 'Return' $return>><</link>></div><h2>Night</h2>
<<dayshift>>
/* Build event pool */
<<set _events = ["restful", "quick", "uneventful", "street_shout", "car_alarm", "radiator", "cold_room"]>>
/* Wife mood / relationship */
<<if $wife.mood <= -1 or $wife.relationship < 0>>
<<run _events.push("cold_bed", "wife_awake")>>
<</if>>
<<if $wife.mood >= 1 and $wife.relationship >= 25>>
<<run _events.push("wife_close", "watching_her")>>
<</if>>
/* Arousal: the higher the arousal, the worse the odds of a decent night */
<<if $arousal >= 7>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<<if $arousal >= 9>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<</if>>
<</if>>
/* Went to bed exhausted */
<<if $energy <= 1>>
<<run _events.push("dead_to_world")>>
<</if>>
/* Random nuisance events */
<<if random(1, 8) == 1>>
<<run _events.push("snoring")>>
<</if>>
<<if random(1, 6) == 1>>
<<run _events.push("kid_crying")>>
<</if>>
<<if random(1, 7) == 1>>
<<run _events.push("neighbors")>>
<</if>>
/* Pick one */
<<set _chosen = _events.random()>>
/* A good bed buys back the comfort-based bad nights (not the arousal ones,
which are meant to sting). One re-roll toward a restful outcome. */
<<if $items.goodBed and ["car_alarm", "street_shout", "radiator", "cold_room"].includes(_chosen)>>
<<if random(1, 100) <= 70>>
<<set _chosen = ["restful", "quick", "uneventful"].random()>>
<</if>>
<</if>>
<<switch _chosen>>
<<case "restful">>
You sleep deeply, and the night passes in what feels like minutes. You wake to soft morning light, the weight of the day not yet on you.
<<case "quick">>
You drift off quickly and wake when the first gray light pushes through the curtains. Nothing in between.
<<case "uneventful">>
Sleep comes easily and leaves the same way. The night passes without anything worth remembering.
<<case "street_shout">>
Sometime past midnight you wake to someone shouting in the street below. By the time you've worked out it's nothing to do with you, they've moved on. The street goes quiet again, and after a while so do you.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "car_alarm">>
A car alarm goes off somewhere on the block. It cuts out, starts again, cuts out, and finally stays quiet. You aren't sure when you fell back asleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "radiator">>
The radiator clanks at some godforsaken hour. You lie there listening to it until it settles, and you don't quite get the night back after that.
<<case "cold_room">>
You wake some time before dawn, cold, the blanket bunched somewhere on the floor. You drag it back over yourself and try to find the warm spot again. It takes a while.
<<case "cold_bed">>
$wife.name sleeps with her back to you, the duvet bunched between you like a wall. You match her posture and pretend it doesn't matter.
<<case "wife_awake">>
You wake briefly in the small hours. $wife.name is awake too, eyes open in the dark, not looking at you. Neither of you says anything. Eventually you both pretend to be asleep again.
<<case "wife_close">>
Sometime in the night $wife.name shifts against you in her sleep, her cheek finding your shoulder. You stay very still so as not to wake her.
<<case "watching_her">>
You wake before her and lie there for a while, listening to her breathing.
<<case "hot_dream">>
You dream of something hot and half-remembered. You wake with your heart still going, a hard on and the dream already slipping. By the time you sit up, only the heat is left. Your mind is racing with lust, and you have a hard time getting back to sleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "restless">>
Sleep doesn't come easy with a hard on. You lie there for what feels like hours, mind wandering somewhere it shouldn't, until exhaustion finally pulls you under.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "wound_up">>
You lie there wide awake, wound too tight to settle. Your thoughts keep circling back to the hottie from the office. It's too late to jerk off now, so you settle in and try to keep your head clean. Sleep, when it finally comes, is thin and grudging. You surface before the alarm, already tired.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "dead_to_world">>
You hit the pillow and that's the last thing you remember. You wake feeling like you barely moved all night.
<<case "snoring">>
$wife.name elbows you awake at some point in the night, mumbling that you're snoring. You grunt an apology and roll over. By morning she still seems kinda pissed about it.
<<moodShift -1>>
<<case "kid_crying">>
At some point in the small hours, your kid starts crying from down the hall. $wife.name is up before you've even processed it. You hear her low voice through the wall, soothing, patient. By the time she comes back to bed, you're already pretending to be asleep.
<<if $wife.mood <= 0>>
<<moodShift -1>>
<</if>>
<<case "neighbors">>
You're nearly under when it starts up through the ceiling. The couple upstairs, the headboard finding its rhythm, and then her voice, low at first and climbing. You lie still in the dark and listen to a stranger's wife work her way toward climaxing, the sound carrying clean through the thin plaster as though the wall were never there. $wife.name doesn't stir beside you. By the time it finishes overhead you're wide awake, and wishing it was you making a woman sound like that.
<br><br>
<span class="arousal">Arousal increased.</span>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<</switch>>
<br><br>
<<link "Get up." $morningScene>><</link>><h2>Taking the Edge Off</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 15; _i++>>
<<set _gifs.push("p" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/self/' + _gifs.random()" width="100%">
</div>
<br>
You need some quick relief, so you take out your phone, and find a good video. Before long, you've defiled a tissue.
<<set $arousal = Math.max($arousal - 3, 0)>>
<<sexEnergy 1>>
<<set $ventedToday = true>>
/* Costs a time phase during the day, so venting competes with everything else
you could be doing. Free at Night so it's never too late to take the edge off
before bed, though it carries the risk of $wife seeing you */
<<if $time < $timeMax>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</if>>
/* Catch roll: only if she's home but elsewhere in the house. If she's "out",
no risk at all. */
<<set _caught = false>>
<<if ["bedroom","kitchen","livingroom","bathroom"].includes($wife.location)>>
<<if random(1, 100) <= 50>>
<<set _caught = true>>
<</if>>
<</if>>
<<if _caught>>
<br><br>
Just as you ejaculate, you hear the door and suddenly $wife.name is there and catches you in the act.
<<if $wife.relationship < 0>>
<<speech "Wife" $wife.name>>
What the hell are you doing? I live here too, you know.
<</speech>>
<<moodShift -2 -2>>
<<else>>
<<speech "Wife" $wife.name>>
Seriously? Could you not? God.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br><br>
<<link "Continue." $return>><</link>><img src = "images/logo/earnit_logo_lastcall_transparent_tight.png" width = "100%"><<if $gameRunning>>
<div class="datetime"><<datetime>></div>
<<if $weekday <= 5 and $time == 1 and !$job.attendedToday>>
<span class="warning">You should be at work.</span><br>
<<elseif $weekday <= 5 and $job.missedToday>>
<span class="bad">You skipped work today.</span><br>
<</if>>
<<if $weekday == 6>>
<span class="warning">Rent is due tomorrow: $<<print $rent>>.</span><br>
<</if>>
<<paydayFeedback>>
<<rentFeedback>>
<<maidFeedback>>
<<projectPayoutFeedback>>
<<fitnessFeedback>>
<<meter $energy $energyMax "Energy">>
<<meter $arousal $arousalMax "Arousal" "#B23A6B">>
<<print 'Money: $' + $money>><br>
<<if $debugMode == true>>
<br><br>
<<link [[Control Panel|Control Panel]]>>
<</link>>
<br>
$wife.name Relationship: $wife.relationship
<br>
$wife.name Mood: $wife.mood
<br>
$wife.name Suspicion: $wife.suspicion
<br>
$wife.name Worry: $wife.worry
<br>
$wife.name Favor: $wife.favor
<br><br>
<</if>>
<div class="sidebar-nav">
<span @class="($phone.wifeUnread or $phone.friendUnread or $phone.assistantUnread or $phone.galleryNew > 0) ? 'nav-item nav-alert' : 'nav-item'"><<link "📱 Phone" "Phone">><</link>></span>
<<link $name "Character">><</link>>
<<link "Relations" "Relations">><</link>>
</div>
<<else>>
<</if>><<set $gameTitle = "Earn It">>
<<set $gameRunning = false>>
<<set $debugMode = false>>
<<include 'PC Setup'>>
/* Time Variables */
<<set $time = 0>>
<<set $timeMax = 8>>
<<set $weekday = 1>> /* 1 = Monday */
<<set $gameDay = 1>>
<<set $intimacyUnlockDay = 8>> /* no intimacy with wife before week 2 */
/* Chores */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false,
}>>
/* Wife Variables */
<<set $wife = {
name: "Ashley",
relationship: 0,
mood: 0,
location: "kitchen",
bailedOut: false,
choreToday: false,
choreCounter: 0,
choreThanks: false,
choreNeglect: 0,
choreScold: false,
careToday: false,
careCounter: 0,
careThanks: false,
careNeglect: 0,
careScold: false,
talkedToday: false,
cookedToday: false,
talkTopic: "",
intimacyToday: false,
obligation: false,
dutyCount: 0,
dutyScold: false,
lastInteraction: "",
spiedToday: false,
bathroomViewedToday: false,
arousalNoticedToday: false,
suspicion: 0,
suspicionLocked: false,
cheatedToday: false,
discoveryToday: false,
discoveryResult: 0,
suspicionArmDay: -99,
nearMissToday: false,
nearMissResult: 0,
nearMissKind: "",
nearMissCount: 0,
lastNearMissDay: -99,
ultimatumShown: false,
ultimatumToday: false,
worry: 0,
recklessToday: false,
worryScoldToday: false,
worryResult: 0,
tipsy: false,
wineToday: false,
lastWineDay: -3,
dateToday: false,
lastDateDay: -3,
dateType: "",
dateQuality: "",
doingYoga: false,
yogaViewedToday: false,
wardrobeMalfunction: false,
wardrobeRollDay: 0,
wardrobeSeen: false,
tidyRollDay: 0,
tidyToday: false,
lastIntimacyDay: -99,
cycleStart: random(0, 27),
cycleOff: false,
outingResolved: false,
outForDay: false,
lazyMorningToday: false,
affectionToday: false,
lingerieSelfieDay: 0,
lingerieNightDay: 0,
favor: 0, /* special-night currency, earned as overflow past 100 */
favorUnlocked: false, /* she has hit 100 at least once */
favorTextPending: false, /* Sal's one-time text is queued for the morning */
costume: "", /* which costume the current special night uses */
analCount: 0, /* 0.2.5: first-time vs repeat lines */
threesomeCount: 0, /* 0.2.5: repeat opener, brag eligibility */
lastEvidence: "", /* 0.3.0: key of what she found at the last near miss */
lastEvidenceKind: "" /* 0.3.0: first / repeat / believed, for Col */
}>>
/* Assistant Variables */
<<set $assistant = {
name: "Nadia",
met: false, /* first sight with the L4 grad cohort */
unlocked: false, /* assigned to him at L5; romance mechanics go live */
influence: 0, /* 0-100, the single axis; ratchet, no decay */
tier: 0, /* derived from influence + affair gate */
tierUp: false,
seedStage: 0, /* how many L4 tutoring scenes have fired (0-4) */
lastSeedDay: 0, /* $gameDay the last seed scene fired; spacing gate */
flirtStage: 0, /* how many L5 flirt milestones have fired (0-3) */
lastFlirtDay: 0, /* $gameDay the last flirt fired; spacing gate */
spokeToday: false, /* hub check-in daily one-shot */
probedToday: false, /* boundary-push daily one-shot */
lastProbe: "", /* id of last probe scene shown; avoids repeats (not reset daily) */
lastAction: "", /* drives assistantReact; cleared after it prints */
affair: false, /* trip crossed; lifts the tier-1 cap in assistantCheck */
tripTaken: false, /* the company-trip gate has been completed */
tripPending: false, /* accepted the offer; departure fires next morning via dayResolveMorning */
lastTripOfferDay: -99, /* $gameDay the offer last showed; re-offer cooldown after a decline */
/* Office hookup loop */
hookupToday: false, /* daily one-shot; reset in resetAssistantFlags */
lastHookupDay: -99, /* reference for later content */
hookupCount: 0, /* running total; feeds later content */
heat: 0, /* 0-10, office attention; decays 1 per day without */
lastHookupLoc: "", /* avoids the same location twice running */
lastHookupAct: "", /* weights her choice away from a repeat */
heatTellDay: 0, /* one heat tell per day, not one per hub visit */
coolOffPending: 0, /* days she will ask for; 0 = nothing owed */
coolOffUntil: 0, /* $gameDay the loop reopens */
/* Gym encounter */
lastGymDay: -99, /* $gameDay the encounter last fired; 3 day cooldown */
hookupSource: "", /* "office" | "gym" | "gymAM"; drives pool, intro and tail */
/* 0.3.3 Phone */
numberKnown: false, /* selfie probe or trip departure */
textedToday: false, /* idle text daily one-shot */
lastNudeDay: -99, /* 5 day cooldown between photos */
lastNudeImg: "", /* avoids the same photo twice running */
/* 0.3.3 Dates */
dateCount: 0,
lastDateDay: -99, /* 7 day cooldown */
lastDateIn: 0, /* last stay-in variant; avoids repeats */
lastDateOut: "" /* "lasertag" | "minigolf" | "karaoke" */
}>>
/* Friend Variables) */
<<set $friend = {
name: "Col",
relationship: 0,
drankToday: false,
topic: "",
lastTopic: "",
braggedThreesome: false,
closeCallTold: false,
braggedAnal: false,
braggedDancer: false,
clubViaText: false,
swShared: false,
backroomCount: 0
}>>
/* Work System */
<<set $job = {
title: "Junior Software Engineer",
wage: 100,
level: 1,
daysWorked: 0,
daysMissed: 0,
performance: 0,
attendedToday: false,
missedToday: false,
wfhToday : false,
breakRoomRollDay: 0,
breakRoomToday: false,
promotionPending: false,
paidThisWeek: null,
lastAttendance: 0,
eventToday: false,
lastEventDay: -99,
eventCooldown: 3,
distractedToday: false,
lastWorkScene: "",
eventOutcome: "",
sceneGif: "",
sceneText: "",
drainType: "",
lastDrainDay: -99,
drainCooldown: 5,
stayedLate: false,
lastCalloutDay: -99,
calloutCooldown: 10,
calloutPending: false
}>>
/* Rent System */
<<set $rent = 400>>
<<set $rentResult = null>>
/* Other variables */
<<set $gameOverCause = null>>
<<set $onsEver = false>>
<<set $swEver = false>>
<<set $sceneLoc = "">> /* Intimacy scene location snapshot */
<<set $morningScene = "Bedroom">>
<<set $deferredMorning = "">> /* a morning scene the trip preempted; replays after he's home */
/* Computer variables */
<<set $pcMsg = "">>
<<set $project = {
started: false,
dev: 0, /* progress toward the next release */
devNeeded: 3, /* sessions needed for the next release; grows each version */
version: 0, /* releases shipped */
supporters: 0, /* drives weekly income */
weeklyIncome: 0, /* paid out each Monday */
lastPayout: 0,
pendingChoice: "",
choices: {
genre: "",
protagonist: "",
feature: ""
},
supMult: 3
}>>
/* One Night Stand Ex Variables */
<<set $ex = {
live: false,
saved: false,
pending: false,
day: 0,
scares: 0,
lastNudeImg: ""
}>>
/* Phone Variables */
<<set $phone = {
unlocked: true, /* set false for a later tutorial unlock */
gallery: [], /* array of {img, caption, day} */
galleryNew: 0,
wifeUnread: false,
wifePendingImg: "",
wifeTextedToday: false,
wifeMsgText: "",
nudeAskedToday: false,
lastNudeDay: -3,
nudeCooldown: 7,
lastNudeImg: "",
intimacyPicToday: false,
friendTextedToday: false,
friendUnread: false,
lastFriendPing: 0,
friendCooldown: 4,
friendPingTopic: "",
friendInviteDue: "",
msgTopic: "",
viewImg: "",
viewNote: "",
wifeMsgType: "",
dancerTextedToday: false,
dancerDateAskedToday: false,
dancerMsgTopic: "",
assistantMsgTopic: "",
assistantUnread: false
}>>
/* Cleaning service (maid) */
<<set $maid = {
active: false,
cost: 75,
lastBilled: 0,
billedThisWeek: 0,
lapsed: false
}>>
/* Ring-A-Ding (strip club) */
<<set $club = {
managerName: "Dee", /* runs the club, hires and pays the door */
job: false, /* hired on the door */
offered: false, /* Dee has made her pitch once */
captain: false, /* door captain, set on the 10th shift */
shifts: 0,
celebPending: false, /* Helion team night on offer today */
lastCelebDay: -99, /* stamped when the offer is answered */
celebCooldown: 7,
celebHost: false /* 0.3.1: true when the team night is his to host (L4+) */
}>>
/* The dancer at Ring-A-Ding */
<<set $dancer = {
name: "Candy", /* stage name, swapped for realName on the reveal */
realName: "Naomi",
nameKnown: false, /* the reveal scene has played */
relationship: 0, /* 0-40, capped in dayshift */
danceToday: false, /* one dance or back room per night */
danceCount: 0, /* feeds later content */
backroomCount: 0, /* feeds later content */
hintGiven: false, /* she has mentioned the door job once */
numberKnown: false, /* 0.3.1: she has given him her number, unlocks Phone Dancer */
walkCount: 0, /* walks home completed */
lastWalkDay: -99, /* cooldown reference, 5 days */
dateCount: 0, /* dates completed */
lastDateDay: -99, /* cooldown reference, 10 days */
giftTier: 0, /* 0-3, what he bought on the current date */
dateScore: 0, /* giftTier + 1 for dinner, picks the hotel scene version */
photoCount: 0, /* back room photos taken */
lastPhotoDay: -99 /* cooldown reference, 7 days */
}>>
/* Helion Gym vent */
<<set $helionGym = {
workouts: 0, /* ordinary workouts; drives the vent discovery */
peepFound: false,
peepToday: false
}>><<link `"Version " + setup.gameVersion` "Version">><</link>>
<br>
<<link "Patreon">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>><h2>Living Room</h2>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _theme = ["oldies", "news", "sport"].random()>>
<<switch _theme>>
<<case "oldies">>
<<set _tvGif = "images/h/tv/vintage" + random(1, 8) + ".gif">>
<<set _lines = [
"You flick past the oldies channel and stop. One of those films from decades back, the picture soft and grainy, and a scene playing out that no one involved seems to have thought twice about. Back then the artistic freedom meant big old titties on display as much as possible. Absolute cinema.",
"The oldies channel is running one of the classics, the kind they made before everyone got nervous about showing a good old pair of jugs. A scene unfolds with an easy, unbothered frankness you don't see much anymore, the actors carrying on like it's the most natural thing in the world. You linger on it a while before moving on.",
"You land on the oldies channel mid-scene. Grain, warm color, a certain looseness to how these old films handled things, as if nobody had told them to be coy about it. Less about story and more about getting people going. It catches you off guard, and you sit with it longer than you'd admit before thumbing to the next channel.",
"An old film is playing on the retro channel, from back when this sort of thing turned up in a Tuesday-night picture without ceremony. Not to give some great cinematic experience. More for the purpose of watching some knockers or melons or whatever they called it back then. You watch it play out before you carry on flicking."
]>>
<<case "news">>
<<set _tvGif = "images/h/tv/show" + random(1, 5) + ".gif">>
<<set _lines = [
"The news is on, or something dressed up as news, an anchor at a curved desk reading autocue in a top a size too deliberate. Every cutaway to the weather graphic is really a cutaway to the woman standing in front of it. You watch a full forecast for a region you'll never visit.",
"Some panel show, minor celebrities you half recognize, and a presenter who spends the whole segment crossing and recrossing her legs in a way the director keeps finding excuses to frame. You couldn't tell anyone what they were discussing. You weren't listening.",
"A daytime magazine programme, the couch kind, and the co-host has one of those laughs that makes the guest lean in and the audience whoop. She's dressed for a warmer studio than the one she's in, and the show knows it, and so, after a minute, do you."
]>>
<<case "sport">>
<<set _tvGif = "images/h/tv/sport" + random(1, 5) + ".gif">>
<<set _lines = [
"You land on the sports channel, and it isn't the game that holds you. The camera is very keen on who it follows, and whoever's directing has strong opinions about where the lens belongs. Keeps viewers hooked, you guess. You stay on it far longer than a man with no team in the match has any business doing.",
"Some match you have no stake in, and you couldn't say who's ahead. What keeps you on the channel is everything happening at the edges of the play, the camera drifting off the action every chance it gets. You follow it with a focus you can't manage for anything that actually matters.",
"You tell yourself you're only waiting for something better to come on. But the camera keeps lingering where it shouldn't, and you don't change the channel, and the game plays on without you following a second of it."
]>>
<</switch>>
<div class="intro-image">
<img @src="_tvGif" width="100%">
</div>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Keep flicking." $return>><</link>><h2>The Anchor</h2>
A windowless box of a bar at the dead end of the plaza, lit the color of weak tea. A jukebox nobody's updated since the nineties, a couple of beers on tap, and a handful of regulars who treat the place like a second living room. The bartender, a heavyset woman called Marie, polishes a glass that was clean an hour ago.
<<switch $time>>
<<case 2>>Midday, and the Anchor is all but empty, a regular or two nursing the first of the day beneath the muted TV.
<<case 3>>The afternoon is slow and quiet, dust turning in the light from the propped-open door while Marie restocks the cooler.
<<case 4>>Late afternoon, and the first drinkers of the day drift in, shrugging off work or the lack of it.
<<case 5>>Early evening, and the after-work drinkers are trickling in, loosening ties they'll regret in the morning.
<<case 6>>The evening crowd has settled, the talk low and steady under the jukebox.
<<case 7>>Late, and the place has thinned to the committed, the ones with nowhere they'd rather be.
<<default>>Past closing for most places, but the Anchor keeps its own hours. A few stragglers nurse the last of the night.
<</switch>>
<br><br>
/* Drink */
<<if $time >= $timeMax>>
//It's late enough. One more and you won't make it home.//
<<elseif $money >= 8>>
A pint runs $8.
<br>
<<link "Buy a drink and settle in. ($8)" $return>>
<<set $money -= 8>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $drunk += 1>>
<</link>>
<<else>>
//A pint's $8, and you're short even for that.//
<</if>>
<<if $drunk == 1>>
<br>
//One in, and the day's edges have started to soften.//
<<elseif $drunk == 2>>
<br>
//Two deep. Warm, loose, the bar a friendlier place than it was.//
<<elseif $drunk >= 3>>
<br>
//You've had a few. The room has the gentle tilt of a night getting away from you.//
<</if>>
/* Friend, on Friday and Saturday evenings */
<<if ($weekday == 5 or $weekday == 6) and $time >= 5>>
<br><br>
<<if $friend.drankToday>>
//$friend.name is still propping up the far end of the bar, but you've had your session with him tonight.//
<<elseif $time >= $timeMax>>
$friend.name is here, but he's pulling his coat on. Too late to settle in with him now.
<<elseif $money < 16>>
$friend.name waves you over from his usual stool, but a proper session with him is a couple of rounds you can't cover tonight.
<<else>>
$friend.name is at the far end of the bar, same stool as ever, and lifts his glass when he spots you.
<br>
<<link "Have a few with $friend.name. ($16)" "Anchor Friend">>
<<friendDrinkSetup>>
<</link>>
<</if>>
<</if>>
/* Pickup: a stranger to take home. Needs a few drinks for the nerve, and
the night's one shot at it. */
<<if $time < $timeMax and $drunk >= 2 and not $onsToday>>
<br><br>
The bar is the kind of busy where a stranger could become the rest of your night, if you had the nerve to start it.
<br>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to be hitting on women tonight.//
<<else>>
<<link "Try your luck with someone." "Anchor Pickup">><</link>>
<</if>>
<</if>>
<br><br>
<<link [[Step back out to the plaza.|Eastgate Plaza]]>><</link>><h3>Version 0.3.3 - After Hours with your Assistant</h3>
More to do with $assistant.name outside the office.
<br><br>
- Train at the Helion gym often enough and you'll find a vent in the changing room that nobody has fixed.
<br>
- $assistant.name's number is now on your phone. Text her, and once things have gone that far, tell her to send you something. From the office bathroom or from home.
<br>
- Monday to Thursday evenings you can go over to her flat. Stay in, or take her out.
<br>
- Everyday intimacy with $wife.name has been rewritten. Longer scenes that change with the room you're in and how she feels about you, and she has more to say afterward.
<br>
- Prose tightened across the game.
<br><br>
<h3>Version 0.3.2</h3>
- Two new costumes under Sal's counter.
<br>
- $friend.name can now text you to meet him at Ring-A-Ding on Friday and Saturday evenings. The invite comes in the evening, so go straight there or turn him down.
<br>
- A night at Ring-A-Ding with $friend.name can now end in the back room.
<br><br>
<h3>Version 0.3.1 - $dancer.realName</h3>
More to do with the dancer from Ring-A-Ding.
<br><br>
- After enough shifts on the door, she sometimes asks you to walk her home, and may invite you up.
<br>
- She gives you her number. Wednesday to Saturday evenings you can ask her out. She picks the place, the terms and the price.
<br>
- If she trusts you, you can take a photo in the back room for your phone.
<br>
- Team nights at Ring-A-Ding continue after promotion. At Lead and above, you're the one with the company card.
<br><br>
<h3>Version 0.3.0 - Ring-A-Ding</h3>
The neon sign down the canal has been there all along. Now you can go in. The drinks are overpriced, and one of the dancers might be worth getting to know.
<br><br>
- Ring-A-Ding is open on the canal path from early to late evening. Buy a drink, watch the stage, buy a dance.
<br>
- Get to know one of the dancers. She has a stage name, a real name, and a back room for regulars.
<br>
- Get in shape and she may put in a word with the manager. You can work the door Thursday to Saturday for cash. Pay goes up with fitness, and some nights get rough.
<br>
- $friend.name knows the place too.
<br>
- When a release ships at Helion, the team sometimes heads to Ring-A-Ding on the company card. Going takes the whole evening. Skipping it is noticed at work.
<br>
- Near misses: $wife.name now looks closer, and can find something without it turning into a full discovery. It gives you more room to slip, but she remembers. $friend.name will want to hear how it went.
<br>
- Arousal from the TV, the gym, the canal and around the flat has been toned down.
<br>
- Fixed: multi-line text under character portraits is now left-aligned.
<br>
- Fixed: photos saved to the gallery before 0.2.0 showed as broken images. Old saves are repaired on load.
<br><br>
<h3>Version 0.2.5 - Favour, Part Two</h3>
Two new ways to spend favour with $wife.name.
<br><br>
- A new special request in the bedroom, for evenings when you've earned it. Something the two of you haven't done in years.
<br>
- On Friday and Saturday evenings, with enough favour banked, suggest a different kind of night at the Anchor. She sets the rules.
<br>
- $friend.name will want to hear about it, and he'll have opinions.
<br>
- Favour can now be banked a little higher before it caps out.
<br>
- Bug fixes and rebalancing.
<br><br>
<h3>Version 0.2.4 - Favour</h3>
The top of the marriage is no longer a dead end.
<br><br>
$wife.name used to stand in front of a camera as someone else, and with the right excuse she still can. The excuse arrives by text, from a guy who shouldn't have your number.
<br><br>
- Once the relationship is maxed, extra goodwill becomes favour. Keep the marriage warm and she pays it back in the bedroom.
<br>
- Sal has been to an estate sale. There's a new section under his counter for special customers.
<br>
- Her old cheerleader uniform is still in the closet, and three more outfits can be bought. Each has its own night.
<br>
- Special nights are asked for from a new option in the bedroom, on evenings when she's in the mood and you have favour to spend.
<br>
- If cheating, neglect or worry pulls the marriage down, favour is locked until you've repaired it.
<br>
- Bug fixes and rebalancing.
<br><br>
<h3>Version 0.2.3</h3>
//Earn It// now has a title screen and autosaves.
<br><br>
- New start screen with New Game, Load Game and the changelog.
<br>
- The game autosaves each morning.
<br>
- Saves are labelled by day and time instead of turn number.
<br>
- Saving is disabled during the prologue.
<br><br>
<h3>Version 0.2.2</h3>
Once you've climbed far enough, Helion's own gym opens up downstairs. $assistant.name uses it too, and not only to train.
<br><br>
- The Helion gym unlocks with promotion.
<br>
- Some sessions you'll catch colleagues working out, for a small arousal bump.
<br>
- The sauna is a new place to meet $assistant.name.
<br>
- Training at Helion costs less energy than the boxing club. The club has been improved to compete.
<br>
- You can go to the office before work, so a morning session competes with breakfast at home with $wife.name.
<br><br>
<h3>Version 0.2.1 - Obligation</h3>
You no longer have to wait weeks for intimacy with $wife.name.
<br><br>
From the second week, she will sometimes go along with you before she really wants to, mostly to avoid the argument. She doesn't hide that it's reluctant. It costs relationship, and if you rely on it she will eventually say so.
<br><br>
- A bad mood no longer means a flat refusal. You get a lesser version of what you asked for.
<br>
- New scenes for when she's going along with it reluctantly.
<br>
- Rebalanced when each act unlocks, so the middle stretch of the marriage has more to offer.
<br>
- Shorter waits between intimacy, especially early on, and far fewer refusals during her cycle.
<br><br>
<h3>Version 0.2.0 - Meet your new assistant</h3>
A second woman enters your life at work.
<br><br>
$assistant.name joins Helion as a graduate you're told to mentor. Keep getting promoted and she becomes your assistant, sitting two rows down. She's good at the job and never the one to push, but she doesn't stop you either.
<br><br>
At some point you're offered a choice that can't be undone. You can turn it down, but it will come up again. Take it and the affair becomes part of the workday, with its own routine, risks and costs. Colleagues start to notice before anyone says anything.
<br><br>
Late evenings at the office count as evenings away from home, and $wife.name notices.
<br><br>
- Fixes and balancing throughout.
<br><br>
<h3>Version 0.1.6</h3>
- Finished the erotica rewrite.
<br>
- You can now approach $wife.name in the bathroom, with new scenes there.
<br>
- Reworked the side project's income and pacing.
<br>
- New choices when building your game (genre, protagonist, signature feature). Supporters react to the direction you take.
<br>
- Code cleanup.
<br><br>
<h3>Version 0.1.5</h3>
- The first fitness levels add energy. Past that, once you're athletic, sex and solo relief no longer cost energy.
<br>
- A good lingerie date now leads somewhere. If things stay warm, $wife.name has plans for the new set a few nights later.
<br>
- Evened out intimacy costs. Receiving no longer costs energy. Going all the way costs a little until you're fit enough.
<br>
- A better bed is available at the pawnbroker. Sleep on it and night disturbances happen less often.
<br>
- More erotica revisions.
<br>
- Bug fixes.
<br><br>
<h3>Version 0.1.4</h3>
- Nights aren't always restful. A bad night can cost you energy the next day.
<br>
- Reworked how morning scenes are picked, so confrontations with $wife.name no longer overlap.
<br>
- A tense morning conversation with $wife.name now happens in the bedroom, with new art.
<br>
- Some workdays are harder and cost an extra point of energy. Sometimes you're asked to stay late: stay for standing at Helion, or leave and take a hit to performance.
<br>
- Housekeeping and your relationship with $wife.name are now separate. Let the flat go and she'll complain about the mess. Neglect her and she'll complain about you. The cleaning service only fixes the first.
<br>
- Helion may call you in on a Saturday. Go for money and career, or stay for the family outing.
<br>
- More erotica revisions.
<br>
- Fixes under the hood.
<br><br>
<h3>Version 0.1.3 - Intimacy with $wife.name</h3>
For everyone on F95Zone who asked for more with $wife.name.
<br><br>
- New option to hold $wife.name close from the interact menu. It lifts her mood and slowly builds the relationship, but if she's irritable she'll wave you off.
<br>
- Her mood now affects sex scenes: how present she is, how much she enjoys it, and which lines you get. A good day can warm her up even early on.
<br>
- New date: take $wife.name lingerie shopping once things warm up. A few days later she might send you something.
<br>
- More content in the office and one-night-stand scenes.
<br>
- Reworked sidebar: Phone, Character and Relations are now grouped as gold buttons, separate from the version and Patreon links.
<br>
- Energy rebalance for more challenge and more reason to work out, plus bug fixes.
<br><br>
<h3>Version 0.1.2</h3>
- Reworked the Relations menu for readability and room for more characters.
<br>
- Sex with $wife.name is now possible in the kitchen, not just the bedroom, bathroom and living room.
<br>
- Cleaning service available under Services on your phone. Pay weekly and the flat stays tidy.
<br>
- New images of $wife.name in the living room.
<br>
- Chores alone now cap your relationship with $wife.name at around 50%.
<br>
- Bug fixes and balancing.
<br><br>
<h3>Version 0.1.1 - Phone</h3>
- Added a phone to the sidebar. Text $wife.name, and as things warm up, ask for pictures that save to a gallery. She might also let you take one yourself.
<br>
- Text $friend.name. He may also invite you to the bar.
<br>
- A one-night stand may text you afterwards wanting more. Keeping that from $wife.name is up to you.
<br>
- Bug fixes and balancing.
<br><br>
<h3>Version 0.1.0 - First release</h3>
Welcome to //Earn It//.
<br><br>
You're $name. Thirty pounds heavier than you used to be, a failed company behind you, and a marriage held together mostly because your wife has nowhere better to go. There's a son who barely knows you, rent you can't always cover, and a job writing code for people whose names you're not allowed to know. Whatever you want back, her trust, the money, your own reflection, you have to earn it.
<br><br>
This first release covers the core of the game: work, chores and training, a marriage you can rebuild or wreck, the climb at Helion Dynamics, and a few ways to spend your evenings around town. It's playable start to finish, and some doors are still locked. They'll open in later versions.
<br><br>
Thanks for playing this early. Bug reports and feedback will shape what comes next.
<br><br>
//Albasaur//
<br><br>
<<link "Close version description." `$return || "Start Menu"`>><</link>>Your phone buzzes on the kitchen counter. Helion's name on the screen on a Saturday morning is never good.
<br><br>
<div class="chat">
<div class="bubble in">Production's down and the client's climbing the walls. Need you on-site. How soon can you be here?</div>
</div>
You look up. $wife.name is already in the doorway, the boy's little backpack over one shoulder, and she reads the whole thing off your face before you've said a word. Her arms fold slowly.
<br><br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_callout1.jpeg', 'images/characters/w/w_callout2.jpeg')" width="100%">
</div>
<<speech "Wife" $wife.name>>
I thought we were going out.
<</speech>>
<br>
She doesn't say it sharply. That's almost worse. She just waits, the bag still on her shoulder, watching you decide what kind of Saturday this is going to be.
<br><br>
''What do you do?''
<br>
<<link "Take the callout. The money's good and someone will notice." "Helion Callout">>
<<set $job.calloutPending = false>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>>
<br>
<<link "Stay. You promised, and you're keeping it." "Weekend Outing">>
<<set $job.calloutPending = false>>
<<set $job.performance -= 1>>
<<moodShift 1>>
<</link>><h2>Out with the Family</h2>
<<set $wife.outingResolved = true>>
<div class="intro-image wide">
<img src="images/dates/outing_parkbench.jpeg" width="100%">
</div>
<br>
<<set $time = 5>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 5)>>
<<if _score >= 80>>
<<set _q = "great">>
<<elseif _score >= 40>>
<<set _q = "good">>
<<else>>
<<set _q = "flat">>
<</if>>
<<switch _q>>
<<case "flat">>
<<set $wife.relationship += 1>>
The afternoon is fine. You push the swing, you carry the bag, you say the right things at the right times, but your head is somewhere else, and $wife.name notices. Still, the boy laughed at least once.
<<case "good">>
<<set $wife.relationship += 2>>
<<moodShift 1>>
It's an easy few hours. The park, an ice cream that ends up mostly on the boy, the slow walk back with him asleep against $wife.name's shoulder. The talk between you comes easily for once, about nothing in particular.
<<case "great">>
<<set $wife.relationship += 3>>
<<moodShift 1>>
It's a good day. The boy has you chasing him round the park until you're both breathless, and when you look up $wife.name is watching the two of you with a look you haven't seen from her in a long time. She takes your hand on the way back.
<</switch>>
<br><br>
<<link "Head home." "Living Room">><</link>><<set _outingImg = either('images/characters/w/w_casualOutingAsk1.jpeg', 'images/characters/w/w_casualOutingAsk2.jpeg')>>
<div class="intro-image wide">
<img @src="_outingImg" width="100%">
</div>
<br>
<<if $wife.mood >= 1>>
$wife.name has the boy's bag over one shoulder, gathering up the last of his things by the door.
<br><br>
<<speech "Wife" $wife.name>>
We're heading out for a bit. Come with us?
<</speech>>
<<else>>
$wife.name is getting the boy's things together, coat and bag by the door.
<br><br>
<<speech "Wife" $wife.name>>
I'm taking him out. You can come, if you want.
<</speech>>
<</if>>
<br>
<<link "Go with them for the afternoon." "Weekend Outing">>
<</link>>
<br>
<<link "Stay. You've got things to do." $return>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>><<widget "dayshift">>
/* ---- 1. TIME ---- */
<<set $gameDay += 1>>
<<set $time = 0>>
<<set $weekday += 1>>
<<if $weekday > 7>><<set $weekday = 1>><</if>>
/* ---- 2. PASSIVE INCOME (project payout, Mondays) ---- */
<<if $weekday == 1 and $project.weeklyIncome > 0>>
<<set $money += $project.weeklyIncome>>
<<set $project.lastPayout = $project.weeklyIncome>>
<<else>>
<<set $project.lastPayout = 0>>
<</if>>
/* ---- 3. FITNESS DECAY ---- */
<<set _daysInactive = $gameDay - $lastWorkoutDay>>
<<if _daysInactive >= 5 and not $fitnessWarningShown>>
<<set $fitnessWarning = true>>
<<set $fitnessWarningShown = true>>
<<else>>
<<set $fitnessWarning = false>>
<</if>>
<<if _daysInactive >= 7>>
<<set $fitness -= 1>>
<<if $fitness < 0>><<set $fitness = 0>><</if>>
<</if>>
<<fitnesscheck>>
/* ---- 4. WIFE FAVOUR AND MOOD ----
ORDER: must run BEFORE phase 5. moodReset sets the day's
baseline mood; the neglect scolds in phase 5 override it
downward. Reverse these and the scold's mood hit is wiped. */
/* Favour: once she has hit 100, anything past the cap becomes favour
instead of being thrown away. First time at the cap also queues
Sal's text for the morning. */
<<if $wife.relationship >= 100 and not $wife.favorUnlocked>>
<<set $wife.favorUnlocked = true>>
<<set $wife.favorTextPending = true>>
<</if>>
<<if $wife.relationship > 100>>
<<set $wife.favor = Math.min($wife.favor + ($wife.relationship - 100), 15)>>
<<set $wife.relationship = 100>>
<</if>>
/* Dancer: Relationship capped at 40. Dances, shifts and texts stall at 25 in their own passages. */
<<if $dancer.relationship > 40>>
<<set $dancer.relationship = 40>>
<</if>>
<<moodReset>>
/* ---- 5. WIFE UPKEEP / CARE NEGLECT ---- */
<<if not $wife.choreToday>>
<<set $wife.choreNeglect += 1>>
<<else>>
<<set $wife.choreNeglect = 0>>
<</if>>
<<if $wife.choreNeglect >= 2>>
<<set $wife.relationship -= 1>>
<<set $wife.choreNeglect = 0>>
<<set $wife.choreScold = true>>
<<set $wife.choreThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
<<if not $wife.careToday>>
<<set $wife.careNeglect += 1>>
<<else>>
<<set $wife.careNeglect = 0>>
<</if>>
<<if $wife.careNeglect >= 4>>
<<set $wife.relationship -= 2>>
<<set $wife.careNeglect = 0>>
<<set $wife.careScold = true>>
<<set $wife.careThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
/* ---- 6. HOUSE STATE (chore reset, then maid) ----
ORDER: chore reset first, so the maid re-cleans for today;
next dayshift's neglect check then sees yesterday done. */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false
}>>
<<if $maid.active and ($gameDay - $maid.lastBilled) >= 7>>
<<if $money >= $maid.cost>>
<<set $money -= $maid.cost>>
<<set $maid.lastBilled = $gameDay>>
<<set $maid.billedThisWeek = $maid.cost>>
<<else>>
<<set $maid.active = false>>
<<set $maid.lapsed = true>>
<</if>>
<</if>>
<<if $maid.active>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<<set $wife.choreNeglect = 0>>
<<set $wife.choreScold = false>>
<</if>>
/* ---- 7. WIFE DAILY FLAG RESET ---- */
<<resetWifeFlags>>
/* ---- 8. WEEKLY / CONFRONTATION CHECKS ----
ORDER: rent → suspicion → marriage → worry → ex.
marriageCheck and worryCheck both read discovery flags set
by suspicionCheck, so suspicion must precede them. */
<<if $weekday == 7>>
<<rentCheck>>
<</if>>
<<suspicionCheck>>
<<marriageCheck>>
<<worryCheck>>
<<exCheck>>
/* ---- 9. OFFICE COOL-OFF ARMING ----
ORDER: must run AFTER the phase 8 checks, which set discoveryToday and
ultimatumToday. Holds the length rather than a boolean, so the scene
doesn't need to know which event armed it. A second event while a
lockout is already running re-arms, and the scene restarts the clock
from the day he next reaches the office. */
<<if $assistant.affair>>
<<if $wife.discoveryToday>>
<<set $assistant.coolOffPending = Math.max($assistant.coolOffPending, 5)>>
<</if>>
<<if $wife.ultimatumToday>>
<<set $assistant.coolOffPending = Math.max($assistant.coolOffPending, 7)>>
<</if>>
<<if $wife.nearMissToday>>
<<set $assistant.coolOffPending = Math.max($assistant.coolOffPending, 3)>>
<</if>>
<</if>>
/* ---- 10. MORNING ARBITER ----
ORDER: must run LAST of the wife checks. It reads the
discovery/ultimatum/worry-scold flags the phase 8 checks set
and decides which scene greets the player on waking. */
<<dayResolveMorning>>
/* ---- 11. PLAYER / SYSTEM DAILY RESET ---- */
<<resetDailyState>>
<</widget>>/* START: RENT CHECK */
<<widget "rentCheck">>
<<if $money >= $rent>>
<<set $money -= $rent>>
<<set $rentResult = "paid">>
<<elseif !$wife.bailedOut>>
<<set $wife.bailedOut = true>>
<<set $wife.relationship -= 5>>
<<set $wife.mood = -3>>
<<set $rentResult = "bailed">>
<<else>>
<<set $rentResult = "gameover">>
<<set $gameOverCause = "rent">>
<<set $gameRunning = false>>
<<goto "Game Over">>
<</if>>
<</widget>>
/* END: RENT CHECK */
/* START: RENT FEEDBACK */
<<widget "rentFeedback">>
<<if $rentResult == "paid">>
<span class="good">Rent paid: $<<print $rent>>.</span>
<br>
<<elseif $rentResult == "bailed">>
<span class="warning">Ashley covered the rent. She won't do it again.</span>
<br>
<</if>>
<<set $rentResult = null>>
<</widget>>
/* END: RENT FEEDBACK */
/* START: MAID FEEDBACK */
<<widget "maidFeedback">>
<<if $maid.billedThisWeek > 0>>
<span class="warning">Cleaning service billed: $<<print $maid.billedThisWeek>>.</span><br>
<<set $maid.billedThisWeek = 0>>
<</if>>
<<if $maid.lapsed>>
<span class="bad">You couldn't cover the cleaning service. It's been cancelled.</span><br>
<<set $maid.lapsed = false>>
<</if>>
<</widget>>
/* END: MAID FEEDBACK */
/* START: WIFE MOOD SHIFT */
/* Usage:
<<moodShift 1>> mood +1, no relationship change
<<moodShift -1 -2>> mood -1 AND relationship -2
<<moodShift 1 1>> mood +1 AND relationship +1
*/
<<widget "moodShift">>
<<set $wife.mood += _args[0]>>
<<if _args.length > 1>>
<<set $wife.relationship += _args[1]>>
<</if>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</widget>>
/* END: WIFE MOOD SHIFT */
/* START: WIFE MOOD RESET (called on dayshift) */
<<widget "moodReset">>
<<if $wife.relationship >= 60>>
<<set $wife.mood = 2>>
<<elseif $wife.relationship >= 25>>
<<set $wife.mood = 1>>
<<elseif $wife.relationship >= 0>>
<<set $wife.mood = 0>>
<<elseif $wife.relationship >= -10>>
<<set $wife.mood = -1>>
<<else>>
<<set $wife.mood = -2>>
<</if>>
<</widget>>
/* END: WIFE MOOD RESET */
/* START: SOLO VENT WIDGET */
/* Usage: drop <<soloVent "bedroom">> into a room passage.
The arg is the wife-location key for THIS room, so the widget
knows when she's present and the option should hide. */
<<widget "soloVent">>
<<set _here = _args[0]>>
<<if $arousal >= 3 and $wife.location !== _here and not $ventedToday>>
<<if $energy < 1 and $fitnessTier < 3>>
<br>//You're too drained to jerk off right now.//
<<else>>
<br><<link "Jerk off to some porn." "Solo Vent">><</link>>
<</if>>
<</if>>
<</widget>>
/* START: WEEKEND OUTING */
<<widget "weekendOuting">>
/* Saturday emergency callout: rare branch that pre-empts the outing.
Same time slot and resolution gates as the outing itself; the random
roll sits last so it only fires when everything else already passed. */
<<if $weekday == 6 and $time == 2 and not $wife.outingResolved and not $wife.outForDay and not $job.calloutPending and ($gameDay - $job.lastCalloutDay) >= $job.calloutCooldown and random(1, 100) <= 10>>
<<set $job.calloutPending = true>>
<<set $job.lastCalloutDay = $gameDay>>
<<goto "Weekend Helion Callout">>
<<else>>
<<if $weekday >= 6 and $time == 2 and not $wife.outingResolved>>
<<if $wife.mood <= -2 or $wife.relationship < 0>>
/* Excluded: she takes him out without you. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is getting your son ready to go out, coat and little shoes by the door. She doesn't ask if you want to come. By the time you've thought of something to say, the door has already shut behind them.
<br>
<span class="warning">They've gone out without you.</span>
<br><br>
<<elseif $energy < 1>>
/* Offered, but you're too drained to join. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is taking the boy out for the afternoon and asks if you're coming. You're running on empty, and she reads it on you before you've finished the excuse. She lets it go and takes him without you.
<br><br>
<<else>>
/* She comes to ask, in her own passage. */
<<goto "Weekend Outing Ask">>
<</if>>
<</if>>
<</if>>
<</widget>>
/* END: WEEKEND OUTING */
/* START: FRIEND DRINK */
<<widget "friendDrinkSetup">>
<<set $friend.drankToday = true>>
<<set $money -= 16>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $drunk += 2>>
<<set $friend.relationship += 2>>
<<set _topics = ["old", "startup", "work", "ashley", "sports", "checkin"]>>
<<if $onsEver>><<set _topics.push("cheat_ons")>><</if>>
<<if $swEver>><<set _topics.push("cheat_sw")>><</if>>
<<if $swEver>>
<<set _topics.push("sw_suggest")>>
<<set _topics.push("sw_suggest")>>
<</if>>
<<if $wife.threesomeCount > 0 and not $friend.braggedThreesome>>
<<set _topics.push("brag3")>>
<<set _topics.push("brag3")>>
<</if>>
<<if $wife.lastEvidence !== "" and not $friend.closeCallTold>>
<<set _topics.push("close_call")>>
<<set _topics.push("close_call")>>
<</if>>
<<if $wife.analCount >= 2 and not $friend.braggedAnal>>
<<set _topics.push("brag_anal")>>
<<set _topics.push("brag_anal")>>
<</if>>
<<if $dancer.dateCount > 0 and not $friend.braggedDancer>>
<<set _topics.push("brag_dancer")>>
<<set _topics.push("brag_dancer")>>
<</if>>
<<if $friend.relationship >= 5>>
<<set _topics.push("club_suggest")>>
<<set _topics.push("club_suggest")>>
<</if>>
<<set $friend.topic = _topics.random()>>
<<for _i = 0; $friend.topic === $friend.lastTopic and _i < 5; _i++>>
<<set $friend.topic = _topics.random()>>
<</for>>
<<set $friend.lastTopic = $friend.topic>>
<</widget>>
/* END: FRIEND DRINK */
/* START: MORNING SCENE ARBITER */
/* Single authority on which scene greets the player on waking.
Reads flags already set by the daily checks and applies priority
once. Highest priority first; exactly one wins. To add a new
morning claimant, insert one line at the correct rung. */
<<widget "dayResolveMorning">>
<<if $assistant.tripPending>>
/* The trip outranks the wife scenes, but their mechanical hits already
landed back in phase 8. Stash the scene so it plays the morning after
he gets home rather than vanishing with the damage already done. */
<<if $wife.discoveryToday>>
<<set $deferredMorning = "Wife Discovery">>
<<elseif $wife.ultimatumToday>>
<<set $deferredMorning = "Wife Ultimatum">>
<<elseif $wife.nearMissToday>>
<<set $deferredMorning = "Wife Near Miss">>
<<elseif $wife.worryScoldToday>>
<<set $deferredMorning = "Wife Worry">>
<</if>>
<<set $morningScene = "Assistant, Trip Depart">>
<<elseif $wife.discoveryToday>>
<<set $morningScene = "Wife Discovery">>
<<elseif $wife.ultimatumToday>>
<<set $morningScene = "Wife Ultimatum">>
<<elseif $wife.nearMissToday>>
<<set $morningScene = "Wife Near Miss">>
<<elseif $wife.worryScoldToday>>
<<set $morningScene = "Wife Worry">>
<<elseif $deferredMorning !== "">>
/* Replay a scene the trip preempted. moodReset has since wiped the mood
the original check set, so restore it or she delivers the line in a
neutral mood. */
<<set $morningScene = $deferredMorning>>
<<if $deferredMorning === "Wife Worry" or $deferredMorning === "Wife Near Miss">>
<<set $wife.mood = -2>>
<<else>>
<<set $wife.mood = -3>>
<</if>>
<<set $deferredMorning = "">>
<<elseif $wife.favorTextPending>>
<<set $morningScene = "Sal Text">>
<<else>>
<<set $morningScene = "Bedroom">>
<</if>>
<</widget>>
/* END: MORNING SCENE ARBITER */<<widget "meter">>
/*
USAGE:
<<meter $energy $energyMax "Energy">>
OTHER EXAMPLES:
<<meter $fitness 45 "Fitness" "#FF9F40">>
<<meter $job.performance 20 "Promotion" "#3D73FC">>
<<meter $wife.relationship 50 "Ashley" "#FF9FB2">>
*/
<<set _current = Math.max(0, _args[0])>>
<<set _max = Math.max(1, _args[1])>>
<<set _label = _args.length > 2 ? _args[2] : "">>
<<set _color = _args.length > 3 ? _args[3] : "#6C9F56">>
<<set _pct = Math.floor((Math.min(_current, _max) / _max) * 100)>>
<<set _style = "width: " + _pct + "%; background: " + _color + ";">>
<div class="meter">
<div class="meter-fill" @style="_style"></div>
<span class="meter-text"><<= _label>> <<= _current>>/<<= _max>></span>
</div>
<</widget>><<widget "wifeSchedule">>
/* If she went out without you, she stays out until she's back in the early evening. Checked before the schedule so it overrides the time slot. */
<<if $wife.outForDay and $time < 5>>
<<set $wife.location = "out">>
<<else>>
/* Normal Schedule */
<<switch $time>>
/* Early Morning */
<<case 0>>
<<if $weekday >= 6>>
<<set $wife.location = "bedroom">>
<<else>>
<<set $wife.location = "kitchen">>
<</if>>
/* Late Morning */
<<case 1>>
<<if $weekday >= 6>>
<<set $wife.location = "kitchen">>
<<else>>
<<set $wife.location = "bathroom">>
<</if>>
/* Noon */
<<case 2>>
<<if $weekday >= 6>>
<<set $wife.location = "bathroom">>
<<else>>
<<set $wife.location = "out">>
<</if>>
/* Early Afternoon */
<<case 3>> <<set $wife.location = "out">>
/* Late Afternoon */
<<case 4>> <<set $wife.location = "out">>
/* Early Evening */
<<case 5>> <<set $wife.location = "kitchen">>
/* Evening */
<<case 6>> <<set $wife.location = "livingroom">>
/* Late Evening */
<<case 7>> <<set $wife.location = "bedroom">>
/* Night */
<<case 8>> <<set $wife.location = "bedroom">>
<</switch>>
<</if>>
/* Yoga sessions (requires mats): Wednesday late afternoon, Saturday late morning.
Overrides her normal location and flags the session for the living room.
doingYoga is recomputed every load, so it self-clears outside the slots. */
<<set $wife.doingYoga = false>>
<<if $items.yogaMats>>
<<if ($weekday == 3 and $time == 4) or ($weekday == 6 and $time == 1)>>
<<set $wife.location = "livingroom">>
<<set $wife.doingYoga = true>>
<</if>>
<</if>>
/* Wardrobe malfunction: rolled once per game day, cached for the night.
Only ever surfaces at Night (time 8) in the bedroom scene. Tune the rate. */
<<if $wife.wardrobeRollDay !== $gameDay>>
<<set $wife.wardrobeRollDay = $gameDay>>
<<set $wife.wardrobeMalfunction = (random(1, 100) <= 35)>>
<</if>>
/* Living-room tidying: rolled once per game day, cached. Only ever surfaces in
the evening living-room slot when she isn't doing yoga, and is consumed the
first time the player walks in on it. Tune the rate. */
<<if $wife.tidyRollDay !== $gameDay>>
<<set $wife.tidyRollDay = $gameDay>>
<<set $wife.tidyToday = (random(1, 100) <= 35)>>
<</if>>
/* Monthly cycle: a short window where sex is off the table (HJ/BJ depend on
relationship). Deterministic from $gameDay so it's consistent within a cycle;
cycleStart is randomized at game start so it isn't the same days every
playthrough. Recomputed each load, no caching needed. Tune the window (4) and
period (28). */
<<set _cyclePos = ($gameDay - $wife.cycleStart) % 28>>
<<if _cyclePos < 0>><<set _cyclePos += 28>><</if>>
<<set $wife.cycleOff = (_cyclePos < 4)>>
<</widget>>/* START OF: CHORE WIDGET */
/* Usage: <<chore "bedroom" "Tidy the bedroom.">> */
<<widget "chore">>
<<set _room = _args[0]>>
<<set _label = _args[1]>>
<<if !$chores[_room] and $arousal >= 8>>
//You're too horny to focus on this right now.//
<<elseif !$chores[_room] and $energy < 1>>
//You're too tired to do chores.//
<<elseif !$chores[_room] and $time >= $timeMax>>
//It's too late to start cleaning now.//
<<elseif !$chores[_room]>>
<<link _label $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $chores[_room] = true>>
<<choreCredit>>
<<moodShift 1>>
<</link>>
<<else>>
/* Nothing */
<</if>>
<</widget>>
/* END OF: CHORE WIDGET */
/* START: WIFE CREDIT (two tracks, same mechanics) */
/* UPKEEP. Called by <<chore>> and by the maid's daily auto-clean.
Keeps the house standing. She notices when it stops. */
<<widget "choreCredit">>
<<set $wife.choreToday = true>>
<<set $wife.choreCounter += 1>>
<<if $wife.choreCounter >= 4>>
<<set $wife.choreCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.choreThanks = true>>
<</if>>
<</if>>
<</widget>>
/* CARE. Cooking, breakfast together, lazy mornings, holding her.
Nothing to do with the dishes. She notices when this stops too,
and it's the one the cleaning service can never buy. */
<<widget "careCredit">>
<<set $wife.careToday = true>>
<<set $wife.careCounter += 1>>
<<if $wife.careCounter >= 4>>
<<set $wife.careCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.careThanks = true>>
<</if>>
<</if>>
<</widget>>
/* END: WIFE CREDIT *//* START OF: WORKOUT WIDGET */
/* Payment only. The gate and the link live in <<workout>>; call this
directly from any passage that needs its own link body, such as
Helion Gym, where an encounter roll sits inside the click.
Args: energyCost, timeCost, fitnessGain, moneyCost, arousalRelief.
Temp names are prefixed to avoid colliding with the caller's. */
<<widget "payWorkout">>
<<set _pwE = _args.length > 0 ? _args[0] : 1>>
<<set _pwT = _args.length > 1 ? _args[1] : 1>>
<<set _pwF = _args.length > 2 ? _args[2] : 1>>
<<set _pwM = _args.length > 3 ? _args[3] : 0>>
<<set _pwR = _args.length > 4 ? _args[4] : 0>>
<<set $energy = Math.max($energy - _pwE, 0)>>
<<set $time = Math.min($time + _pwT, $timeMax)>>
<<set $money -= _pwM>>
<<set $fitness += _pwF>>
<<set $arousal = Math.max($arousal - _pwR, 0)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</widget>>
/* Gate plus link. Usage unchanged:
<<workout "Go for a swim.">>
<<workout "Lift weights." 2 2>>
(label, energyCost, timeCost, fitnessGain, moneyCost, arousalRelief)
*/
<<widget "workout">>
<<set _label = _args[0]>>
<<set _energyCost = _args.length > 1 ? _args[1] : 1>>
<<set _timeCost = _args.length > 2 ? _args[2] : 1>>
<<set _fitnessGain = _args.length > 3 ? _args[3] : 1>>
<<set _moneyCost = _args.length > 4 ? _args[4] : 0>>
<<set _arousalRelief = _args.length > 5 ? _args[5] : 0>>
<<if $arousal >= 8>>
//You can't focus on training while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < _energyCost>>
//You're too exhausted to train right now.//
<<elseif $time >= $timeMax>>
//It's too late to get a proper workout in now.//
<<elseif $money < _moneyCost>>
//You can't afford a session right now.//
<<else>>
<<link _label $return>>
<<payWorkout _energyCost _timeCost _fitnessGain _moneyCost _arousalRelief>>
<</link>>
<</if>>
<</widget>>
/* END OF: WORKOUT WIDGET */
/* BEGIN: FITNESSCHECK */
<<widget "fitnesscheck">>
/* Store previous tier */
<<set _oldTier = $fitnessTier>>
/* Determine tier */
<<if $fitness >= 45>>
<<set $fitnessTier = 5>>
<<elseif $fitness >= 30>>
<<set $fitnessTier = 4>>
<<elseif $fitness >= 20>>
<<set $fitnessTier = 3>>
<<elseif $fitness >= 15>>
<<set $fitnessTier = 2>>
<<elseif $fitness >= 10>>
<<set $fitnessTier = 1>>
<<else>>
<<set $fitnessTier = 0>>
<</if>>
/* Energy cap climbs over the first two tiers, then plateaus at 7.
Tier 3+ rewards are perks, not more energy. */
<<if $fitnessTier >= 2>>
<<set $energyMax = 7>>
<<elseif $fitnessTier == 1>>
<<set $energyMax = 6>>
<<else>>
<<set $energyMax = 5>>
<</if>>
/* Reset flags */
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
/* Detect direction */
<<if $fitnessTier > _oldTier>>
<<set $fitnessTierUp = true>>
<<elseif $fitnessTier < _oldTier>>
<<set $fitnessTierDown = true>>
<</if>>
<</widget>>
/* END: FITNESSCHECK */
/* BEGIN: Fitness Feedback */
<<widget "fitnessFeedback">>
<<if $fitnessTierUp>>
<span class="good">Fitness level increased.</span><br>
<<set $fitnessTierUp = false>>
<</if>>
<<if $fitnessTierDown>>
<span class="bad">Fitness level dropped.</span><br>
<<set $fitnessTierDown = false>>
<</if>>
<<if $fitnessWarning>>
<span class="warning">You feel sluggish. It's been a while since you trained.</span><br>
<<set $fitnessWarning = false>>
<</if>>
<</widget>>
/* END: Fitness Feedback */
/* START: FITNESS-GATED ENERGY */
/* Energy cost for a sexual act or solo vent, waived once the body is
conditioned enough (tier 3+) to take it in stride. Usage: <<sexEnergy 1>> */
<<widget "sexEnergy">>
<<if $fitnessTier < 3>>
<<set $energy = Math.max($energy - _args[0], 0)>>
<</if>>
<</widget>>
/* END: FITNESS-GATED ENERGY */<<widget "exCheck">>
/* Runs once per dayshift. A few days after she gets your number,
a text queues up. Tune the 3-day delay and the 45% roll. */
<<if $ex.live and not $ex.pending and ($gameDay - $ex.day) >= 3>>
<<if random(1, 100) <= 45>>
<<set $ex.pending = true>>
<</if>>
<</if>>
<</widget>>
<<widget "exPing">>
/* _args: this room's wife-location key.
With her in the room, it's a scare. Alone, once you've kept the
number, it's the second-round text. */
<<if $ex.pending>>
<<if $ex.saved>>
<<goto "ONS Ex Opportunity">>
<<elseif $wife.location == _args[0]>>
<<goto "ONS Ex Scare">>
<</if>>
<</if>>
<</widget>>
<<widget "galleryAdd">>
/* _args[0] = full image path, _args[1] = caption,
_args[2] = true if the player is looking at the photo as it saves
(no "new" flag, no sidebar alert). Omit for off-screen saves.
Dedupes by path: an image already in the gallery is never stored twice. */
<<if not $phone.gallery.some(g => g.img === _args[0])>>
<<set $phone.gallery.push({img: _args[0], caption: _args[1], day: $gameDay})>>
<<if not _args[2]>>
<<set $phone.galleryNew += 1>>
<</if>>
<</if>>
<</widget>>/* TIME OF DAY */
<<widget "timeofday">>
<<switch $time>>
<<case 0>>Early Morning
<<case 1>>Late Morning
<<case 2>>Noon
<<case 3>>Early Afternoon
<<case 4>>Late Afternoon
<<case 5>>Early Evening
<<case 6>>Evening
<<case 7>>Late Evening
<<case 8>>Night
<</switch>>
<</widget>>
/* WEEKDAY */
<<widget "weekday">>
<<switch $weekday>>
<<case 1>>Monday
<<case 2>>Tuesday
<<case 3>>Wednesday
<<case 4>>Thursday
<<case 5>>Friday
<<case 6>>Saturday
<<case 7>>Sunday
<</switch>>
<</widget>>
/* START: DATETIME DISPLAY */
<<widget "datetime">>
<<weekday>> - <<timeofday>>
<</widget>>
/* END: DATETIME DISPLAY */
/* START: TIMELINK */
/*
<<timelink "Text" "Passage" cost>>
Creates a link that advances time by a set amount (cost)
before moving to another passage.
- cost = number of time phases added (0–6 total)
- Automatically blocks usage at Night
- Clamps time so it never exceeds Night
*/
<<widget "timelink">>
<<if $time >= $timeMax>>
<span class="disabled"> <<= _args[0] >> (too late)</span>
<<else>>
<<link _args[0]>>
<<set $time += _args[2]>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<<goto _args[1]>>
<</link>>
<</if>>
<</widget>>
/* END: TIMELINK *//* START: WIFE REACTIONS */
<<widget "wifeReact">>
/* Scold: the house */
<<if $wife.choreScold>>
<<set _l = [
"I came home to the sink again. I work a full shift and then I clean up after all three of us, and I can't keep doing it and pretending I don't mind.",
"Do you actually see it? The mess. Or does it just not register until I've dealt with it.",
"I'm not your mother. I've got a job and a four-year-old and somehow I've also got you. How hard can it be to help out with the housework?"
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreScold = false>>
<<set $wife.careScold = false>>
/* Scold: the distance */
<<elseif $wife.careScold>>
<<set _l = [
"You've been here all week. In the flat, I mean. I don't think you've actually looked at me once. Why aren't talking anymore?",
"We haven't had a real conversation in days. You should focus more on us. You're in the room and you're not in the room.",
"We never do anything together. I'd rather you shouted at me than this. At least then I'd know you'd noticed I was here."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careScold = false>>
/* Scold: the duty */
<<elseif $wife.dutyScold>>
<<set _l = [
"I get you off because you ask, and because it's easier than the argument. I'm aware of the difference, even if you're not.",
"You know I'm not there, right? When we're intimate. You know that, but you just wanna get off right? I keep waiting for you to notice and stop asking.",
"It's not that I mind. It's that you don't seem to care as long as you get to empty your balls. That's the part that's getting to me."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.dutyScold = false>>
/* Interaction responses */
<<elseif $wife.lastInteraction == "talked">>
<<switch $wife.talkTopic>>
<<case "kid">>
<<speech "You" $name>>
He's getting big, isn't he. Feels like it happened while I wasn't looking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
He is. Got your stubborn streak, God help me. Plants his feet exactly the way you do when he's decided something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
He is. And he notices more than you'd think. Worth remembering, next time you assume he doesn't.
<</speech>>
<</if>>
<<case "past">>
<<speech "You" $name>>
Remember that first apartment we got after college? The one with the screaming boiler.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
God, that place. We put a mattress on the floor and called it furnished. Broke as anything. I don't think I've been happier since.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't. I can't do the good-old-days thing right now. It just makes this one look worse.
<</speech>>
<</if>>
<<case "plans">>
<<speech "You" $name>>
You ever think about what's next? For us, I mean.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I don't know. Smaller plans than I used to make. But not none. That's something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Plans. Right. Let's just get through the month first, and then we'll dream big.
<</speech>>
<</if>>
<<case "cheer">>
<<speech "You" $name>>
So. Reckon you can still pull off any of those cheerleader moves, or is that strictly a museum piece now?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Watch it. I could still put my foot above your head, and don't think I won't demonstrate on the wrong part of you.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
That girl had a flat stomach and a future. Let's not poke at her.
<</speech>>
<</if>>
<<case "castings">>
<<speech "You" $name>>
Do you ever miss it? The auditions, the castings, all that.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I miss the work. Not the rest. Half those rooms were some sweaty producer telling me to "loosen up" with the door shut. You learn to keep your back to a wall.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Miss being looked up and down by men who'd "see what they could do" for me? No. I got very good at the polite no and the fast exit. That's the part nobody puts on a headshot.
<</speech>>
<</if>>
<<case "sofa">>
<<speech "You" $name>>
You still thinking about that sofa you showed me? The gray one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I am, actually. Ours has a spring that's basically trying to escape. But it can wait. I know money's money right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Forget the sofa. I shouldn't have brought it up. We can't, and we both know it.
<</speech>>
<</if>>
<<case "shower">>
<<speech "You" $name>>
That showerhead's still dripping, you know. Drives me up the wall.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
So fix it, big man. You used to be handy, somewhere under all that. I'll even pretend to be impressed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And? You're the man of the house, supposedly. Or do we wait for it to flood and call someone we can't pay?
<</speech>>
<</if>>
<<case "shape">>
<<speech "You" $name>>
I've been trying to get back in shape. Noticing any difference?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
A bit, actually. You stand differently. I clocked it before you said anything, if that tells you something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Trying. Okay. Ask me again when there's something to notice.
<</speech>>
<</if>>
<<case "restaurant">>
<<speech "You" $name>>
You never talk about the restaurant. How is it, really?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Loud. Hot. The owner's nephew treats the schedule as a suggestion, so I cover his shifts and he gets the thanks. But the girls are good. We laugh. It's mine, at least, the bit of it that is.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
It's a floor and a lot of plates. It pays for the daycare that lets me work it. Round and round. Let's not.
<</speech>>
<</if>>
<<case "boxing">>
<<speech "You" $name>>
I've been thinking about the ring again. Not just the bag down at Vance's. The real thing.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There he is. You used to talk about that with your whole face. Go on then, get your nose broken. I'll pretend to disapprove and secretly like it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Another comeback. The ring, the company, the grand plan. I married a man with a whole drawer of them. Show me one that finished.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the company through my head sometimes. The parts I'd do differently.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I know you do. I catch you at it across the table. I never thought you were a fool for trying. Just for doing it with your back to your own front door.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I can't go back there with you. I'm still living in what it cost. You get to replay it, I get to pay for it. That's the deal we ended up with.
<</speech>>
<</if>>
<<case "affection">>
<<speech "You" $name>>
I don't say it enough. That I'm glad it's still you and me here.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
No, you don't. But you said it now, and I'll take the now. Don't make me wait so long for the next one.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Glad. Right. You've a funny way of showing it most days. But... noted.
<</speech>>
<</if>>
<<case "coffee">>
<<speech "You" $name>>
We're nearly out of the decent coffee. The bag you hide behind the lentils.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You found it. Of course you found it. Fine, we ration it. One proper cup each on Sundays, like people with their lives together.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
So we drink the cheap stuff. It's not like we're hosting anyone. Save the good bag for a day that earns it.
<</speech>>
<</if>>
<<case "reality">>
<<speech "You" $name>>
Wait, which one's that, the one with the sex tape or the one with the make-up empire? They all blur into one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
The make-up one. The tape was the older sister, do keep up. For a man who can untangle code nobody else can read, you cannot hold three famous women apart to save your life.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Does it matter? They're famous for being famous. I'm not your search engine for people neither of us will ever meet.
<</speech>>
<</if>>
<<case "canal">>
<<speech "You" $name>>
Saw a backpack just floating in the canal on the way back. Makes you wonder what's in it.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Oh, that's a body. That's episode one. Jogger finds a bag, ominous narrator, and forty minutes later it's always the quiet husband. Always. You'd be perfect for the reenactment, you've got the face for it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Probably some kid's gym clothes. Not everything's a mystery. Some things are just rubbish in the water, like most things around here.
<</speech>>
<</if>>
<<case "series">>
<<speech "You" $name>>
Are we ever finishing that series, or is it just going to sit at three-episodes-in forever?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
We are finishing it. I've decided the brother did it and I need to be proved right. Tonight, once he's down. You make the tea, I'll fight you for the good end of the sofa.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
When, exactly? You're never on the sofa when I am, and when you are you're asleep in ten minutes. Watch it without me. Or don't.
<</speech>>
<</if>>
<<case "documentary">>
<<speech "You" $name>>
There was a documentary on about people who just walk away from their whole lives. Vanish, start again somewhere new.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Tempting, isn't it. I price it up some days. New name, a town by the sea, nobody who knows me. Then he shouts for me from the other room and that's that. You're stuck with me, sorry.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I caught a bit of it. Don't go reading anything into which bit.
<</speech>>
<</if>>
<<case "takeout">>
<<speech "You" $name>>
What I wouldn't give for a proper takeout tonight. The good place, not the one where everything's beige.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Don't, my stomach just filed a complaint. One day we get the good place, all the extra sides, and we don't even look at the prices. I'm picturing it. Vividly.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
We're not getting a takeout and you know it. Saying it out loud just makes the lentils taste worse.
<</speech>>
<</if>>
<<case "neighbor">>
<<speech "You" $name>>
The pair upstairs were going again this morning. Kid and the thumping, six on the dot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Our little alarm clock. At least ours sleeps to seven now, small mercies. I keep meaning to actually meet them. Shared a ceiling for months and I couldn't pick them out of a lineup.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And what would you like me to do about the neighbors? Add it to the list of things that are nobody's fault and somehow still mine.
<</speech>>
<</if>>
<<case "dream">>
<<speech "You" $name>>
You were talking in your sleep last night. Full sentences. Something about a swan.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I was not. Was I? God, what did I say, because if I'm narrating my dreams to you now I'd like to know what I'm working with. A swan. Wonderful. Very normal wife you landed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Was I. I probably get more said asleep than I manage awake in this place. Wouldn't take much.
<</speech>>
<</if>>
<<case "lottery">>
<<speech "You" $name>>
If a stupid amount of money landed tomorrow, no strings. First thing you'd do.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Easy. Sleep. A solid week of it, in a bed nobody climbs on at dawn. Then the coast, the good coffee, a door that locks. I've had this list a long while, if that wasn't obvious.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I don't play that game anymore. We did 'imagine when we're rich' for years, and look where the imagining landed us. I deal in what's in the account now.
<</speech>>
<</if>>
<<case "music">>
<<speech "You" $name>>
That song came on at the store the other day. The one that was always on, back then. Stood in the cereal aisle like an idiot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Ours. The one you butchered at that party, and somehow I still went home with you. Can't hear it without smelling cheap vodka. Best worst night of my life. Hum it and I'll deny all of this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
A song's a song. I can't go misty over a jingle with the rent where it is. Nice you've got the spare attention for it, though.
<</speech>>
<</if>>
<<default>>
<<speech "You" $name>>
No reason. Just felt like talking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Mm. It's been a while since we just talked like this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Yeah. Sure.
<</speech>>
<</if>>
<</switch>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_fail">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't even think about it.
<</speech>>
<<elseif $wife.mood <= -1>>
<<speech "Wife" $wife.name>>
Really? Right now?
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not now. I'm not feeling it.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_cold">>
<<speech "Wife" $wife.name>>
Not right now. It's been a day.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_notyet">>
<<speech "Wife" $wife.name>>
No. Not yet, not like this. You don't get to skip to that part because you feel like it tonight.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_spent">>
<<if $wife.relationship >= 60>>
<<speech "Wife" $wife.name>>
Mm, give me a little to recover first. You'll have me again soon enough.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not again so soon. I'm not a switch you get to flip whenever you want.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_period">>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I'm on my period, love. Cramping, exhausted, the whole show. Ask me again in a few days and I'll be a lot more fun.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I'm on my period, I've had four hours' sleep, and that's where your head goes? Read the fucking room.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_tooSoon">>
<<speech "Wife" $wife.name>>
Hey... not yet. I'm not in that place with you right now. We need to work more on us first.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "affection_refuse">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't. I'm not in the mood to be touched right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not right now. I just... not right now.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
/* Thanks: the house */
<<elseif $wife.choreThanks and $wife.mood >= 0>>
<<set _l = [
"The place has been... nice, lately. I keep walking in and there's nothing waiting for me. You've no idea what that's worth.",
"I came home to a clean kitchen. Twice this week. I nearly checked I was in the right flat.",
"You've been picking up after him without being asked. I noticed, and it means a lot to me."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreThanks = false>>
<<elseif $wife.choreThanks>>
<<set $wife.choreThanks = false>>
/* Thanks: the closeness */
<<elseif $wife.careThanks and $wife.mood >= 0>>
<<set _l = [
"You've been different lately. More present. I noticed a while ago, I just didn't want to say it out loud in case it stopped.",
"We've been talking with each other again. Properly, I mean. I'd forgotten what that was like.",
"We've been closer lately. Whatever it is you're doing, don't stop. That's all. That's the whole speech."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careThanks = false>>
<<elseif $wife.careThanks>>
<<set $wife.careThanks = false>>
/* High arousal: she clocks that you're somewhere else */
<<elseif $arousal >= 7 and not $wife.arousalNoticedToday>>
<<set $wife.arousalNoticedToday = true>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You're somewhere else today. I can tell. You get this look.
<</speech>>
<<elseif $wife.mood >= -1>>
<<speech "Wife" $wife.name>>
Why are you looking at me up and down like that, weirdo?
<</speech>>
<<moodShift -1>>
<<else>>
<<speech "Wife" $wife.name>>
Don't look at me like that. I'm not some piece of meat.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br class="react-br">
<</widget>>
/* END: WIFE REACTIONS */
/* START: WIFE SUSPICION */
/* Register a physical infidelity. Severity scales the suspicion gain.
Suggested: HJ 1, BJ 2, sex 3. Office tryst 1.
Re-arms the discovery system (lifts the lockout) and stamps the day so
suspicionCheck skips the roll on the night of the cheat. */
<<widget "addSuspicion">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.suspicion = Math.min($wife.suspicion + _amt, 20)>>
<<set $wife.cheatedToday = true>>
<<set $wife.suspicionLocked = false>>
<<set $wife.suspicionArmDay = $gameDay>>
<</widget>>
/* Daily. Roll on the current value first, then decay on a clean day.
Ladder: 0-2 nothing, 3-9 near miss, 10+ discovery, and discovery also
needs at least one near miss on the board first, so she never goes
nuclear without a warning shot. Suspicion is capped at 20.
Relationship barely affects whether she notices; it decides what she
does with it. In the discovery band a trusting wife may take your word
for it, which downgrades the hit to a "believed" near miss. A near miss
never touches suspicion or the lockout: the thread is still there.
nearMissKind is NOT cleared here; the scene clears it on exit, so a
trip-deferred replay still knows which variant to play.
Called once inside dayshift. */
<<widget "suspicionCheck">>
/* Clear yesterday's one-day scene flags */
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
<<set $wife.nearMissToday = false>>
<<set $wife.nearMissResult = 0>>
/* Roll: armed and in the ladder */
<<if not $wife.suspicionLocked and $wife.suspicion >= 3>>
<<set _chance = Math.max(0, Math.min(75, ($wife.suspicion - 2) * 4 - ($wife.relationship * 0.1)))>>
<<if random(1, 100) <= _chance>>
/* She never goes nuclear cold. The first thing that ever lands
is a near miss, however high suspicion has climbed. */
<<set _discover = $wife.suspicion >= 10 and $wife.nearMissCount >= 1>>
<<set _believed = false>>
/* Benefit of the doubt */
<<if _discover and random(1, 100) <= Math.floor($wife.relationship * 0.5)>>
<<set _discover = false>>
<<set _believed = true>>
<</if>>
<<if _discover>>
/* The higher she stood, the further she falls */
<<set _hit = Math.max(5, Math.min(25, 5 + $wife.suspicion + Math.floor(Math.max($wife.relationship, 0) / 10)))>>
<<set $wife.relationship -= _hit>>
<<set $wife.suspicion = Math.floor($wife.suspicion / 2)>>
<<set $wife.suspicionLocked = true>>
<<set $wife.mood = -3>>
<<set $wife.discoveryResult = _hit>>
<<set $wife.discoveryToday = true>>
<<set $wife.nearMissCount = 0>>
<<elseif _believed or (($gameDay - $wife.lastNearMissDay) >= 3 and $wife.relationship > -10)>>
<<if _believed>>
<<set _hit = 2>>
<<set $wife.nearMissKind = "believed">>
<<else>>
<<set _hit = Math.min(6, 3 + $wife.nearMissCount)>>
<<set $wife.nearMissKind = $wife.nearMissCount > 0 ? "repeat" : "first">>
<</if>>
<<set $wife.relationship -= _hit>>
<<set $wife.mood = -2>>
<<set $wife.nearMissResult = _hit>>
<<set $wife.nearMissToday = true>>
<<set $wife.nearMissCount += 1>>
<<set $wife.lastNearMissDay = $gameDay>>
<</if>>
<</if>>
<</if>>
/* Decay if no infidelity since the last dayshift */
<<if not $wife.cheatedToday>>
<<set $wife.suspicion = Math.max($wife.suspicion - 1, 0)>>
<</if>>
<<set $wife.cheatedToday = false>>
<</widget>>
/* END: WIFE SUSPICION */
/* START: WIFE WORRY */
/* Register reckless, self-destructive behaviour. Severity scales the gain.
Suggested: bare-knuckle fight 2. Drinking flows through $drunk, not here. */
<<widget "addWorry">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.worry += _amt>>
<<set $wife.recklessToday = true>>
<</widget>>
/* Daily: she reads the state you came home in, worry decays on clean days,
then she may finally say something. Called once inside dayshift. */
<<widget "worryCheck">>
/* Clear yesterday's scold scene flag */
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
/* She can tell when you've been drinking. Heavier nights land harder.
addWorry also sets recklessToday, so a drunk night won't then decay. */
<<if $drunk >= 4>>
<<addWorry 2>>
<<elseif $drunk >= 2>>
<<addWorry 1>>
<</if>>
<<set $drunk = 0>>
/* Decay on a clean, sober day */
<<if not $wife.recklessToday>>
<<set $wife.worry = Math.max($wife.worry - 1, 0)>>
<</if>>
<<set $wife.recklessToday = false>>
/* Fed up: a scold and a relationship hit, deliberately smaller than a
discovery. Deferred if a heavier confrontation is already playing today,
so worry stays intact and fires cleanly on the next eligible morning. */
<<if $wife.worry >= 6 and not $wife.discoveryToday and not $wife.ultimatumToday and not $wife.nearMissToday>>
<<set _hit = Math.max(3, Math.min(8, Math.floor($wife.worry / 2)))>>
<<set $wife.relationship -= _hit>>
<<set $wife.worry = Math.floor($wife.worry / 2)>>
<<set $wife.mood = -2>>
<<set $wife.worryResult = _hit>>
<<set $wife.worryScoldToday = true>>
<</if>>
<</widget>>
/* END: WIFE WORRY */
/* START: MARRIAGE ENDGAME */
<<widget "marriageCheck">>
/* Clear yesterday's one-day scene flag */
<<set $wife.ultimatumToday = false>>
/* Ongoing pressure once the warning has landed: a slow bleed so a marriage
parked at rock bottom keeps sliding toward divorce instead of stalling
forever in the -30 to -40 band. Applied before the threshold checks so it
can be the thing that tips the divorce. Tune the -1 to taste. */
<<if $wife.ultimatumShown and $wife.relationship > -20>>
<<set $wife.relationship -= 1>>
<</if>>
/* Terminal: the warning was given and things kept sliding. Held off while an
ultimatum is sitting in $deferredMorning, i.e. it was armed but the trip
preempted the scene and it hasn't been played back yet. Without this the
player can reach the divorce ending having never seen the warning, which
is the exact thing the deferral below exists to prevent. */
<<if $wife.ultimatumShown and $wife.relationship <= -20 and $deferredMorning !== "Wife Ultimatum">>
<<set $gameOverCause = "divorce">>
<<set $gameRunning = false>>
<<goto "Game Over">>
/* First time at rock bottom: deliver the ultimatum and arm the divorce.
Only commit ultimatumShown when we can actually SHOW the scene. If a
discovery confrontation is already playing today, defer: leave
ultimatumShown false so this fires on the next eligible dayshift. That
guarantees the player always gets the explicit warning before divorce
is ever possible. */
<<elseif not $wife.ultimatumShown and $wife.relationship <= -10>>
<<if not $wife.discoveryToday>>
<<set $wife.ultimatumShown = true>>
<<set $wife.ultimatumToday = true>>
<<set $wife.mood = -3>>
<</if>>
/* Recovery: clawed back to safer ground, re-arm for the future. */
<<elseif $wife.ultimatumShown and $wife.relationship >= -5>>
<<set $wife.ultimatumShown = false>>
<</if>>
<</widget>>
/* END: MARRIAGE ENDGAME */
/* START: DATE */
/* Usage: <<dateStart "picnic" 15 true>> (type, cost, alcohol) */
<<widget "dateStart">>
<<set $wife.dateType = _args[0]>>
<<set $money -= _args[1]>>
<<set $wife.dateToday = true>>
<<set $wife.lastDateDay = $gameDay>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<if _args[2]>>
<<set $wife.tipsy = true>>
<<set $wife.wineToday = true>>
<</if>>
<</widget>>
/* END: DATE */
/*START: WIFE INTIMACY COOLDOWN*/
/* One shared intimacy cooldown. Any act (HJ/BJ/sex) starts it; nothing is
available again until it expires. Gap shrinks as the marriage heals:
~5 days at the low end, 0 (daily) once she's fully back. Tune freely. */
<<widget "intimacyReady">>
<<if $wife.relationship >= 85>>
<<set _gap = 0>>
<<elseif $wife.relationship >= 70>>
<<set _gap = 1>>
<<elseif $wife.relationship >= 55>>
<<set _gap = 2>>
<<elseif $wife.relationship >= 40>>
<<set _gap = 3>>
<<else>>
<<set _gap = 3>>
<</if>>
<<set _ready = ($gameDay - $wife.lastIntimacyDay) >= _gap>>
<</widget>>
/*END: WIFE INTIMACY COOLDOWN*/
/* START: WIFE WARMTH (intimacy enjoyment tier) */
/* Sets _warmth: 0 reluctant, 1 warm, 2 eager.
Relationship sets the base band; mood nudges it one step either way,
so she can warm up on a good day or close off on a bad one even at the
same relationship. _args[0] and _args[1] are the relationship cutoffs
for this act (warm at >= first, eager at >= second), since each act
warms up at a different pace. */
<<widget "wifeWarmth">>
<<set _warmCut = _args[0]>>
<<set _eagerCut = _args[1]>>
/* Base band from relationship */
<<if $wife.relationship >= _eagerCut>>
<<set _w = 2>>
<<elseif $wife.relationship >= _warmCut>>
<<set _w = 1>>
<<else>>
<<set _w = 0>>
<</if>>
/* Mood nudge: a good mood can lift her a step, a sour one drops her */
<<if $wife.mood >= 2>>
<<set _w += 1>>
<<elseif $wife.mood <= -1>>
<<set _w -= 1>>
<</if>>
/* Clamp 0..2 */
<<set _warmth = Math.max(0, Math.min(2, _w))>>
<</widget>>
/* END: WIFE WARMTH *//* START: WORK CHECK */
<<widget "workCheck">>
<<if $weekday <= 5 and !$job.attendedToday and $time >= 2>>
<<set $job.daysMissed += 1>>
<<set $job.performance -= 1>>
<<set $job.attendedToday = true>>
<<set $job.missedToday = true>>
<<moodShift -1>>
/* Friday payday still triggers if missed */
<<if $weekday == 5>>
<<payday>>
<</if>>
<</if>>
<</widget>>
/* END: WORK CHECK */
/* START: PAYDAY */
<<widget "payday">>
<<set _totalDays = $job.daysWorked + $job.daysMissed>>
<<if _totalDays > 0>>
<<set _attendance = $job.daysWorked / _totalDays>>
<<else>>
<<set _attendance = 0>>
<</if>>
<<set _maxPay = $job.wage * 5>>
<<set _pay = Math.floor(_maxPay * _attendance)>>
<<set $money += _pay>>
/* Flag the result for paydayFeedback to display */
<<set $job.paidThisWeek = _pay>>
<<set $job.lastAttendance = _attendance>>
/* Reset week */
<<set $job.daysWorked = 0>>
<<set $job.daysMissed = 0>>
<<promotionCheck>>
<</widget>>
/* END: PAYDAY */
/* START: PAYDAY FEEDBACK */
<<widget "paydayFeedback">>
<<if $job.paidThisWeek !== null>>
<<if $job.lastAttendance >= 1>>
<span class="good">Payday: $<<print $job.paidThisWeek>> received for a full week.</span>
<<elseif $job.lastAttendance >= 0.6>>
<span class="warning">Payday: $<<print $job.paidThisWeek>> received (reduced).</span>
<<else>>
<span class="bad">Payday: Only $<<print $job.paidThisWeek>> after a poor week.</span>
<</if>>
<br>
<<set $job.paidThisWeek = null>>
<</if>>
<</widget>>
/* END: PAYDAY FEEDBACK */
/* START: CLOCK IN (shared by Workday and Promotion) */
<<widget "clockIn">>
<<if !$job.attendedToday>>
<<set $job.attendedToday = true>>
<<set $job.daysWorked += 1>>
/* Arousal sabotages focus: no performance gain if you came in wound up */
<<if $arousal >= 8>>
<<set $job.distractedToday = true>>
<<else>>
<<set $job.performance += 1>>
<<set $job.distractedToday = false>>
<</if>>
<<set $energy = Math.max($energy - 3, 0)>>
<<set $time = 4>>
<<if $weekday == 5>>
<<payday>>
<</if>>
/* Roll for a workday event (suppressed on promotion days) */
<<set $job.eventToday = false>>
<<set $job.eventOutcome = "">>
<<if not $job.promotionPending and ($gameDay - $job.lastEventDay) >= $job.eventCooldown>>
<<if $job.level >= 4>>
<<set _eventChance = 35>> /* participant tier: rarer on purpose */
<<else>>
<<set _eventChance = 20 + ($job.level * 8)>> /* L1=28%, L2=36%, L3=44% */
<</if>>
<<if random(1, 100) <= _eventChance>>
<<set $job.eventToday = true>>
<<set $job.lastEventDay = $gameDay>>
<</if>>
<</if>>
/* Roll for a draining work event. Rare, cooldowned, never on a
promotion day. Passive = silent extra energy hit, flavored at the
bottom of the Workday passage. Late = a choice offered in-passage. */
<<set $job.drainType = "">>
<<set $job.stayedLate = false>>
<<if not $job.promotionPending and ($gameDay - $job.lastDrainDay) >= $job.drainCooldown>>
<<if random(1, 100) <= 15>> /* ~15% on eligible days; tune freely */
<<set $job.lastDrainDay = $gameDay>>
<<if random(1, 100) <= 55>>
<<set $job.drainType = "passive">>
<<set $energy = Math.max($energy - 1, 0)>>
<<else>>
<<set $job.drainType = "late">>
<</if>>
<</if>>
<</if>>
/* Ring-A-Ding team night. L2 up. At L4+ the night is his to host. */
<<set $club.celebPending = false>>
<<set $club.celebHost = false>>
<<set _celebOk = $job.level >= 2 and not $job.promotionPending>>
<<set _celebOk = _celebOk and not $job.eventToday and $job.drainType !== "late">>
<<set _celebOk = _celebOk and ($gameDay - $club.lastCelebDay) >= $club.celebCooldown>>
<<if _celebOk and random(1, 100) <= 20>>
<<set $club.celebPending = true>>
<<set $club.celebHost = ($job.level >= 4)>>
<</if>>
<</if>>
<</widget>>
/* END: CLOCK IN */
/* START: PROMOTION CHECK (called inside payday) */
<<widget "promotionCheck">>
<<if not $job.promotionPending>>
<<set _next = $job.level + 1>>
<<set _qualified = false>>
<<switch _next>>
<<case 2>><<if $job.performance >= 10>><<set _qualified = true>><</if>>
<<case 3>><<if $job.performance >= 25>><<set _qualified = true>><</if>>
<<case 4>><<if $job.performance >= 45>><<set _qualified = true>><</if>>
<<case 5>><<if $job.performance >= 60>><<set _qualified = true>><</if>>
<</switch>>
<<if _qualified>>
<<set $job.promotionPending = true>>
<</if>>
<</if>>
<</widget>>
/* END: PROMOTION CHECK */
/* START: APPLY PROMOTION (called by the promotion event) */
<<widget "applyPromotion">>
<<set $job.level += 1>>
<<switch $job.level>>
<<case 2>>
<<set $job.title = "Software Engineer">>
<<set $job.wage = 150>>
<<case 3>>
<<set $job.title = "Senior Software Engineer">>
<<set $job.wage = 225>>
<<case 4>>
<<set $job.title = "Lead Engineer">>
<<set $job.wage = 325>>
<<case 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<</switch>>
<<set $job.promotionPending = false>>
<</widget>>
/* END: APPLY PROMOTION */
/* START: PROJECT PAYOUT FEEDBACK */
<<widget "projectPayoutFeedback">>
<<if $project.lastPayout > 0>>
<span class="good">Supporter income: $<<print $project.lastPayout>> from your project page.</span><br>
<<set $project.lastPayout = 0>>
<</if>>
<</widget>>
/* END: PROJECT PAYOUT FEEDBACK */<h2>With $wife.name</h2>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_affection1.jpeg', 'images/characters/w/w_affection2.jpeg', 'images/characters/w/w_affection3.jpeg', 'images/characters/w/w_affection4.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
<<set _lines = [
"You pull her in and she comes easily, folding against your chest. Her arms go round you and stay, and for a while neither of you says anything. You can feel her breathing slow against you.",
"She lets you draw her close and tucks her head under your chin, one hand flat against your back. She holds on a little longer than you expect.",
"You wrap her up and she melts into it, no hesitation, no bracing. Her fingers curl into your shirt. You stand like that for a while."
]>>
<<elseif $wife.relationship >= 25>>
<<set _lines = [
"You reach for her and she comes, after the smallest pause, settling into your arms. It isn't as easy as it once was, but she stays, her cheek against your shoulder.",
"She lets you hold her. Her arms come up around you, a little carefully. But she doesn't pull back, and after a moment she relaxes against you.",
"You draw her in and she allows it, resting against you with a quiet sigh. There's still some distance in it, but she doesn't seem in any hurry to step out of your arms."
]>>
<<else>>
<<set _lines = [
"You reach for her and she stiffens for a second before letting you hold her, her hands resting lightly at your sides. She doesn't push you away, though.",
"She lets you pull her into a loose embrace, more tolerated than returned. Her body is a little guarded against yours. Still, she stays put until you let go.",
"You hold her, and she lets you, though her arms are slow to come up around you. She's still wary. But she stays in your arms a moment before stepping back."
]>>
<</if>>
<<= _lines.random()>>
<br><br>
<<if $wife.relationship >= 50>>
<<set _say = [
"We don't do this enough anymore. I missed it.",
"Mm. Stay here a second. Just like this.",
"I needed that. More than I'd have admitted, if you'd asked."
]>>
<<elseif $wife.relationship >= 25>>
<<set _say = [
"...That's nice. It's been a while since you just held me.",
"Okay. Okay, that's... yeah. I'll take that.",
"Don't make a thing of it. But thank you."
]>>
<<else>>
<<set _say = [
"...Alright. That's enough for now.",
"I don't know what's gotten into you. But it's not the worst thing.",
"Hm. Well. Don't let it go to your head."
]>>
<</if>>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<link "Step back." "Wife Interact">><</link>><h2>With $wife.name</h2>
<<if $wife.mood >= 1>>
She raises an eyebrow, but there's a smile behind it.
<br><br>
<<speech "Wife" $wife.name>>
Alright. Where are you taking me?
<</speech>>
<br>
<<else>>
She looks at you for a moment, weighing something. Then she nods, once.
<br><br>
<<speech "Wife" $wife.name>>
Okay. Where?
<</speech>>
<br>
<</if>>
The girl from upstairs will watch the boy. Short notice, but for some cold cash, she always says yes.
<br><br>
''Where to?''
<br>
<<if $money >= 40>>
<<link "A picnic down by the canal. ($40)" "Wife Date Scene">>
<<dateStart "picnic" 40 true>>
<</link>>
<<else>>
//A picnic by the canal ($40), but you're short.//
<</if>>
<br>
<<if $money >= 60>>
<<link "Darts and drinks at the Anchor. ($60)" "Wife Date Scene">>
<<dateStart "bar" 60 true>>
<</link>>
<<else>>
//Darts at the Anchor ($60), but you're short.//
<</if>>
<br>
<<if $money >= 70>>
<<link "A film at the multiplex past the bypass. ($70)" "Wife Date Scene">>
<<dateStart "cinema" 70 false>>
<</link>>
<<else>>
//The multiplex ($70), but you're short.//
<</if>>
<br>
<<if $money >= 120>>
<<link "Dinner at the Italian place in town. ($120)" "Wife Date Scene">>
<<dateStart "restaurant" 120 true>>
<</link>>
<<else>>
//The Italian place ($120), but you're short.//
<</if>>
<<if $wife.relationship >= 25>>
<br>
<<if $money >= 90>>
<<link "Take her lingerie shopping in town. ($90)" "Wife Date Lingerie">>
<<dateStart "shop" 90 false>>
<</link>>
<<else>>
//Lingerie shopping in town ($90), but you're short.//
<</if>>
<</if>>
<br><br>
<<link "Maybe another night." $return>><</link>><h2>Out with $wife.name</h2>
/* Quality roll, same formula as the other dates. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
<<set _gain = 3>>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
<div class="lingerie-row">
<img src="images/dates/date_shop1.jpeg">
<img src="images/dates/date_shop2.jpeg">
<img src="images/dates/date_shop3.jpeg">
</div>
<br>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set _lines = [
"The shop is brighter and pricier than either of you expected, and for the first few minutes she's self-conscious about being in there at all, holding sets up against herself and pulling faces. But she warms to it, ducking behind the curtain and calling out for your verdict on each one. You like all three and tell her so, and she rolls her eyes at you but she's pleased. She picks the one she keeps coming back to, you pay, and you grab a coffee on the walk home. //\"This was a good idea,\"// she admits, like it costs her something to say.",
"She's a little stiff about it at first, muttering that you're both going to walk out of here broke. Still, she tries on the three she likes and steps out for each, asking what you think with her arms half-crossed. You tell her honestly that they all work, and a bit of the wariness goes out of her. You buy her favorite and split a coffee after, and on the bus home she's quiet but her shoulder stays against yours."
]>>
<<case "good">>
<<set _lines = [
"She takes to it faster than you'd have guessed, disappearing behind the curtain and reappearing in each new set with a little turn in the mirror, asking //\"this one, or the other one?\"// and not really waiting for your answer. You tell her, honestly, that you can't choose, and she calls you useless and means the opposite. She settles on the one she likes best, you pay without flinching at the price, and you split a coffee on the way back with her thigh warm against yours in the window seat.",
"It's easy in a way these afternoons usually aren't. She models each set with a running commentary, narrating her own fashion show, and catches you watching her in the fitting-room mirror more than once. //\"Eyes up here,\"// she says, not meaning it. She picks her favorite, you buy it, and the coffee afterward turns into a long, unhurried sit where neither of you is in a rush to get home."
]>>
<<case "great">>
<<set _lines = [
"It turns into the best afternoon the two of you have had in longer than you can remember. She models each set with a showmanship she'd forgotten she had, posing in the mirror, watching your face in the glass and plainly enjoying what she finds there. //\"You're enjoying this far too much,\"// she says, delighted. She can't choose, so you tell her to get the one that makes her feel the way she looks right now. She does. The coffee after stretches into an hour of the old, easy flirting.",
"She lights up the moment she realizes you actually mean it, that this is the whole date and not a chore on the way to something else. She tries on far more than three, parading each one out for you, laughing, twirling, biting back a grin every time she catches your expression. //\"Keep looking at me like that and we're not making it home,\"// she murmurs by the mirror. She picks the one that did exactly that to you, you pay gladly, and the walk home is slow and close."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">A bit awkward in places, but she's glad you did it.</span>
<<case "good">>
<span class="good">A fun afternoon, and she's grateful for the gesture.</span>
<<case "great">>
<span class="good">She hasn't had this much fun with you in years, and she's still glowing on the way home.</span>
<</switch>>
<br><br>
/* Schedule the flirty selfie a few days out. */
<<set $wife.lingerieSelfieDay = $gameDay + random(2, 4)>>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>><h2>Out with $wife.name</h2>
/* Quality roll. Tune the weights here. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
/* Relationship gain per type */
<<switch $wife.dateType>>
<<case "picnic">> <<set _gain = 2>>
<<case "bar">> <<set _gain = 3>>
<<case "cinema">> <<set _gain = 3>>
<<case "restaurant">><<set _gain = 4>>
<</switch>>
/* Apply outcome */
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
/* Date image, one per location */
<div class="intro-image wide">
<img @src="'images/dates/date_' + $wife.dateType + '.jpeg'" width="100%">
</div>
<br>
/* Scene text */
<<switch $wife.dateType>>
<<case "picnic">>
<<switch $wife.dateQuality>>
<<case "flat">>
The wind comes off the water colder than it looked from the flat, and the cheap wine never quite warms either of you. She keeps her jacket zipped to the chin and answers in short, pleasant sentences, and after a while you pack the blanket up early. On the walk home she takes your arm anyway.
<<case "good">>
You find a dry stretch of bank where the lamps give out and the water goes gold for a few minutes as the sun sets. The wine is cheap and does its job. She tells a story about one of the girls at the restaurant, doing all the voices, and somewhere in it she leans her shoulder against yours and leaves it there.
<<case "great">>
It turns into a lovely evening. She kicks her shoes off in the grass, drinks from the bottle, and laughs at the heron on the far bank standing there like an unpaid security guard. She walks home pressed against your side, in no hurry, and doesn't let go of your arm at the door.
<</switch>>
<<case "bar">>
<<switch $wife.dateQuality>>
<<case "flat">>
The Anchor is dead in the wrong way, three sad drunken regulars and a jukebox nobody's fed. The dartboard's lighting is broken and she beats you twice without seeming to enjoy it. The drinks land, at least. She softens a little by the second one, but the night never quite finds its footing.
<<case "good">>
Two drinks in, she gets competitive, and it's the best thing that's happened to you all week. She talks trash like she used to, lining up her throw with one eye shut, and when she wins she does a small victory shimmy she'd deny under oath. She's flushed and loose on the walk home, her hand finding yours.
<<case "great">>
She destroys you at darts. Properly, three games straight, and somewhere in the middle of it the years thin out and you're just a guy in a bar watching the best thing in the room run the table. The regulars start backing her. She curtsies to applause. On the way home she's warm and tipsy against you, still narrating her own highlights.
<</switch>>
<<case "cinema">>
<<switch $wife.dateQuality>>
<<case "flat">>
The film is bad in the boring way rather than the fun way, and the couple behind you conduct their entire relationship at speaking volume. She checks the time twice. On the bus home you both try to make a conversation out of it and it doesn't quite work. Still, it was an evening out.
<<case "good">>
The film is decent. Somewhere in the second act her head finds your shoulder and stays, and you stop following the plot entirely. Afterward she argues about the ending all the way to the bus stop, gesturing with the empty popcorn bag, and you take the losing side just to keep her going.
<<case "great">>
You laugh at the same wrong moments, the two of you setting each other off in the dark like teenagers until someone shushes you, which makes it worse. She quotes the worst line in the foyer, doing the actor's face, and you have to stop walking to laugh. The whole bus ride home is the two of you finishing each other's stories.
<</switch>>
<<case "restaurant">>
<<switch $wife.dateQuality>>
<<case "flat">>
The room is lovely and the two of you are stiff in it, like guests at a couple of strangers' anniversary. The talk keeps drifting to logistics, the boy, the week, and twice you catch yourself doing the math on the menu and once she catches you doing it. The food is good. The bill is steep. She thanks you on the way out.
<<case "good">>
It takes a glass of wine for both of you to remember how to sit in a place like this, and then it comes back. Candlelight, food neither of you had to cook, no dishes waiting. She talks about something that isn't money or the boy for the first time in months, an idea she's been carrying around, and you listen the way you used to. The walk to the bus is slow on purpose.
<<case "great">>
She came downstairs in the green dress and you forgot what you were going to say, and she noticed, and that set the tone for the night. Across the candlelight, two glasses in, telling a story with her hands, she is unmistakably the woman from twelve years ago, and she's looking at you like you're the man she married. The bill arrives and for once you don't even read it.
<</switch>>
<</switch>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">The night never quite came together, but it was still a night out.</span>
<<case "good">>
<span class="good">A good night out.</span>
<<case "great">>
<span class="good">A night like the old days. She hasn't looked at you like this in years.</span>
<</switch>>
<br><br>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>><h2>Morning</h2>
You wake to the overhead light already on and the sound of her breathing hard, and you know before your eyes are open that she knows.
<br><br>
$wife.name is standing over your side of the bed. She has something balled in her fist, and she throws it at you and misses. You don't see what it was, but can only guess. Condom wrapper? Another girl's phone number? Who knows...
<br>
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Don't. Don't you dare lie there and pretend you're still half asleep. I was doing your laundry. Yours. And I found that shit in your pocket.
<</speech>>
<<speech "You" $name>>
Wait. Wait, I can explain, just let me...
<</speech>>
<<speech "Wife" $wife.name>>
Explain? Go on then. I would fucking love to hear which version of this you think I'm stupid enough to swallow.
<</speech>>
<br>
She's louder now, past caring who hears it through the walls.
<br><br>
<<speech "Wife" $wife.name>>
I gave up everything for you. The auditions, the callbacks, the one thing that was ever mine, I let all of it go to trail around after you while you burned through our savings and our house and called it a vision. And I stayed. After every bit of it, I stayed, because I kept telling myself the man I married was still in there somewhere under the gut and the self-pity.
<</speech>>
<<speech "Wife" $wife.name>>
I cook, I clean, I raise our son on my own most days, I cover the rent you can't, and this is what you do with what's left of us? You absolute piece of shit. Look at me. Was she worth it? Was any of this shit worth it?
<</speech>>
<br>
You open your mouth. Nothing in it is going to help, and some animal part of you knows enough to keep it shut.
<br><br>
<<speech "Wife" $wife.name>>
No. I'm done talking to you. I have to get our son ready, because one of us still has to act like a person in this house.
<</speech>>
<br>
She turns and walks out, and you hear her voice change in the hall, going soft and ordinary for the boy in a way it will not be for you for a long while. You're left in the bed with it sitting on your chest and the day waiting outside the door as if nothing happened.
<br><br>
<<if $wife.relationship < -25>>
<span class="bad">You're not sure there's a way back from this one.</span>
<<else>>
<span class="bad">$wife.name found out. Your relationship has taken a serious hit.</span>
<</if>>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
<</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<if $wife.obligation>>
<<set $wife.dutyCount += 1>>
<<if $wife.dutyCount % 3 == 0>>
<<set $wife.dutyScold = true>>
<</if>>
<<moodShift -1>>
<<else>>
<<set $wife.relationship += 1>>
<</if>>
/* OPENER, per room. Act text below is location-neutral. */
<<switch $sceneLoc>>
<<case "bathroom">>
<<set _open = [
"She's at the sink in her dressing gown, taking her makeup off, when you step in behind her and push the door shut. You take her wrist and bring her hand back to the front of your trousers. She meets your eyes in the mirror for a long second, then turns round and leans back against the basin.",
"The shower's still running hot and the mirror has gone to fog. You catch her hand as she reaches for a towel and press it against your cock through your shorts. She looks down at it, then up at you, and the towel stays on the rail."
]>>
<<case "livingroom">>
<<set _open = [
"The TV is on low, something neither of you is really watching. You pull the blanket across both your laps and slide her hand underneath it, and she shifts along the cushion to get the angle.",
"She's curled into the corner of the sofa with her feet tucked under her. You lift the edge of the blanket, take her hand and draw it into your lap, and after a moment she lets it stay there."
]>>
<<case "kitchen">>
<<set _open = [
"She's at the counter with her back to you, rinsing a mug. You press up behind her, take her wet hand and guide it back between you. She dries her fingers on the tea towel, turns round, and leans against the counter edge with you close in front of her.",
"You come up behind her while she's waiting on the kettle and fit yourself against her back. You find her hand and pull it behind her, onto the hard line of you through your jeans. The kettle clicks off. She turns in your arms, her hip against the cupboard door."
]>>
<<default>>
<<set _open = [
"The lamp is off and the room is just the grey from the streetlight. You find her hand under the duvet and guide it across, and she turns onto her side to face you.",
"She's lying on her back with her book on her chest when you reach for her. She marks the page, sets it on the nightstand, and rolls toward you, letting you draw her hand down under the covers."
]>>
<</switch>>
<<= _open.random()>>
<br><br>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_hj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _gifs.push("w_hj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 35 65>>
<<if $wife.obligation>>
<<set _lines = [
"She pushes your waistband down and closes her fist around your cock without looking at it. The strokes start at one speed and stay there, a firm dry pull from root to tip, the skin dragging with her hand. She doesn't spit, doesn't reach for anything to slick it, doesn't adjust when you flinch. Her eyes are on the middle distance and her other hand rests flat on her own knee. When your balls draw up and you start twitching in her grip she speeds up to get it over with, and you come in thick spurts over her knuckles and wrist. She stops the instant the pulsing does.",
"She spits into her palm, once, the way you'd oil a hinge, and gets to work. Her grip is tight and her wrist turns on the upstroke in a short, practiced twist she clearly remembers works on you. It does. She doesn't look at you once. Your cock swells hard in her fist, the head flushing dark and shiny, and when you come it spills over her fingers and drips onto your stomach. She gives two more strokes to be thorough, then lets go.",
"She starts pumping before you're even fully hard, working you up with quick, impatient strokes. Her thumb stays pressed along the underside. Halfway through she switches hands, shakes out the tired wrist, and carries on without breaking rhythm. You're leaking over her fingers and she smears it down the shaft to keep things slick, nothing more. When you finally come, grunting, cum splashing up onto your shirt, she eases off and looks at the mess."
]>>
<<set _after = [
"She wipes her hand clean, one finger at a time, and goes to wash it properly.",
"She lets go, wipes her palm off without looking at it, and is already back to what she was doing before you've got your breath."
]>>
<<set _say = [
"Okay. That's done.",
"Better?",
"You'll want to clean yourself up."
]>>
<<else>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She gets your cock out and strokes it with brisk, even pulls, her palm sliding down to the root and back up over the head. Her mind is clearly elsewhere. Her rhythm never changes, not when you groan, not when your hips lift. You swell and throb in her grip and she tightens up just enough to see it through. Cum spurts over her fingers and pools in the crease of her hand, and she reaches for something to wipe it on.",
"Her fingers wrap round your shaft and start pumping at a steady, workmanlike tempo. She licks her palm once when the friction starts to drag, and that's the most attention she gives it. Your hips push up into her fist and she lets them without meeting you. You come hard, ropes of it landing across your belly, and she milks the last of it out of you with two slow squeezes from base to tip before letting go.",
"She jerks you off with her head resting against your shoulder, eyes half closed. Her grip is good, firm around the shaft, her thumb riding the ridge under the head on every pass. You're breathing hard long before her breathing changes at all. When you come, pulsing over her knuckles, she murmurs //there//, mostly to herself."
]>>
<<set _after = [
"She cleans her hand off and sits back, a little apart from you.",
"She wipes her fingers and shifts back to her side."
]>>
<<set _say = [
"Mm. Okay.",
"There. Feel better?",
"Right. I'm going to finish what I was doing."
]>>
<<case 1>>
<<set _lines = [
"She takes her time getting you out, letting her knuckles drag over you through the fabric first until you're straining against it. Then her hand closes round your bare cock and she strokes you slow, the full length, twisting a little over the head where you're most sensitive. She's watching your face. Every time your breath catches she does that stroke again, on purpose. Precum beads at the tip and she spreads it down with her thumb, slicking you, and the sound her hand makes gets wetter. She tucks her face into your neck and you feel her smile. You come with her name in your mouth and her fist squeezing slow and tight through every pulse, cum running down over her fingers.",
"Her hand slides down your stomach and wraps round you, warm and unhurried. She rests her head on your shoulder and strokes you with long, easy pulls, her free hand playing with the hair at the back of your neck. When you start pushing into her grip she tightens it and slows down instead of speeding up, making you feel every inch of the slide. She cups your balls and rolls them gently in her palm, and that's what finishes you. You spill over her hand in thick, hot spurts and she keeps stroking, softer and softer, until you're too sensitive and have to catch her wrist.",
"She spits in her hand, holding your eye while she does it, and wraps it round your cock. The first stroke is slow enough to make you groan. She finds the rhythm you like and holds it, her grip firm, her palm gliding wet over the head on every upstroke. She kisses your jaw, your neck, the corner of your mouth. //Close?// she asks, and you nod, and she speeds up just enough. You come with your hips lifting, cum spattering your stomach and her wrist, and she laughs softly against your cheek and keeps her hand right where it is."
]>>
<<set _after = [
"She stays close afterward, her sticky hand resting on your stomach, in no hurry to move.",
"She wipes her fingers on your thigh with a small smile and settles against you."
]>>
<<set _say = [
"That was nice. I mean it.",
"Look at the state of you.",
"Go on, clean up. I'll still be here."
]>>
<<case 2>>
<<set _lines = [
"She has your cock out before you've finished reaching for her, and she's grinning. //Look at that,// she murmurs, //all for me.// She strokes you fast, then slow, then fast again, playing you, her thumb rubbing tight circles under the head until your thighs shake. She leans in and talks against your ear, low and filthy, telling you how hard you are, how she's going to make you come all over her hand, how much she wants to watch it. She pumps you harder, her grip tight and wet with your precum, and when you tip over she keeps her eyes on your cock and watches every thick spurt land on her wrist, biting her lip.",
"She pulls back just enough to watch. Her fist works your cock in long, twisting strokes and her eyes go between your face and her hand, watching every reaction. She edges you twice, stopping dead with her fingers squeezed round the base until you're swearing at her, and she laughs and says she's enjoying this far too much to hurry. The third time she doesn't stop. You come so hard the first rope hits your chest, and she keeps milking you through it, murmuring //good, that's it, give me all of it,// until you're empty and twitching in her hand.",
"She presses her body into yours, one of your legs caught between hers, and you can feel how warm she is as she grinds against you. Her hand is fast and sure on your cock, spit-slick, squeezing on every upstroke. She's breathing hard, rocking her hips against your thigh in time with her strokes, and she tells you not to come until she says so. You barely manage it. When she finally whispers //now//, you erupt over her fingers, and she presses down hard against your leg with a shaky gasp of her own."
]>>
<<set _after = [
"She holds up her hand, glistening, and licks one finger clean while holding your eye.",
"She kisses you, deep and slow, her messy hand still wrapped round your softening cock."
]>>
<<set _say = [
"God. I love doing that to you.",
"Next time you're returning the favor. Just so we're clear.",
"Look what you did to my hand."
]>>
<</switch>>
<</if>>
<<= _lines.random()>>
<br><br>
<<= _after.random()>>
<br><br>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<link "Continue.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<wifeReact>>
''What do you do?''
<br>
/* TALK */
<<if !$wife.talkedToday>>
<<link "Talk to her.">>
<<set $wife.talkedToday = true>>
<<moodShift 1>>
<<set $wife.talkTopic = ["kid", "past", "plans", "cheer", "castings", "sofa", "shower", "shape", "restaurant", "boxing", "startup", "affection", "coffee", "reality", "canal", "series", "documentary", "takeout", "neighbor", "dream", "lottery", "music"].random()>>
<<set $wife.lastInteraction = "talked">>
<<goto "Wife Interact">>
<</link>>
<<else>>
//You've already had a moment to chat with her today.//
<</if>>
<br>
/* AFFECTION */
<<if not $wife.affectionToday>>
<<link "Hold her for a moment.">>
<<set $wife.affectionToday = true>>
<<if $wife.mood >= 0>>
<<moodShift 1>>
<<careCredit>>
<<goto "Wife Affection">>
<<else>>
<<set $wife.lastInteraction = "affection_refuse">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//You've already reached for her once today.//
<</if>>
<br>
/* WINE */
<<if $items.wine > 0 and not $wife.wineToday and $gameDay - $wife.lastWineDay >= 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
<<link "Open a bottle of wine with her." "Wife Wine">><</link>>
<br>
<<elseif $items.wine > 0 and $wife.wineToday>>
//You've already shared a bottle with her tonight.//
<br>
<<elseif $items.wine > 0 and $gameDay - $wife.lastWineDay < 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
//You shared a bottle with her not long ago.//
<br>
<</if>>
/* DATE */
<<if $time == 5 or $time == 6>>
<<if $wife.dateToday>>
/* Already out tonight - nothing shown */
<<elseif $gameDay - $wife.lastDateDay < 3>>
//You took her out recently. The sitter needs notice, and so does she.//
<br>
<<elseif $wife.mood <= -1>>
//She's in no mood to be charmed out the door tonight.//
<br>
<<elseif $energy < 1>>
//You're too worn out to make an evening of it.//
<br>
<<else>>
<<link "Ask her on a date for the evening." "Wife Date">><</link>>
<br>
<</if>>
<</if>>
/* THREESOME (favour). Fri/Sat evenings only, 10 favour, runs on the date bookkeeping. */
<<if ($time == 5 or $time == 6) and $wife.favorUnlocked and $wife.relationship >= 95 and not $wife.dateToday and $gameDay - $wife.lastDateDay >= 3>>
<<if $weekday != 5 and $weekday != 6>>
//That kind of night needs a weekend crowd.//
<br>
<<elseif $wife.favor < 10>>
//You've got something in mind for the two of you, but you haven't earned that much yet.//
<br>
<<elseif $wife.mood < 1 or $wife.cycleOff>>
//Not a night to push her.//
<br>
<<elseif $energy < 1>>
//You're too worn out to make an evening of it.//
<br>
<<elseif $money < 60>>
//A night like that needs cash for the drinks, and you're short.//
<br>
<<else>>
<<link "Suggest a different kind of night out." "Wife Threesome Ask">><</link>>
<br>
<</if>>
<</if>>
/* MAKE A MOVE */
<<if !$wife.intimacyToday>>
<<intimacyReady>>
<<if _ready>>
<<link "Make a move on her.">>
<<if $gameDay < $intimacyUnlockDay>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_tooSoon">>
<<goto "Wife Interact">>
<<elseif $wife.cycleOff and not ($wife.relationship >= 25 and $wife.mood >= 0)>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_period">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 25 and $wife.mood >= 1>>
<<set $wife.intimacyToday = true>>
<<set $wife.obligation = false>>
<<goto "Wife Physical">>
<<elseif $wife.relationship >= 10 and $wife.mood >= 0>>
<<set $wife.intimacyToday = true>>
<<set $wife.obligation = true>>
<<goto "Wife Physical">>
<<elseif $wife.relationship >= 10>>
<<set $wife.lastInteraction = "advance_cold">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 0>>
<<set $wife.lastInteraction = "advance_notyet">>
<<goto "Wife Interact">>
<<else>>
<<set $wife.intimacyToday = true>>
<<moodShift -1>>
<<set $wife.lastInteraction = "advance_fail">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//Too soon. She's not going to want it again this quick.//
<</if>>
<<else>>
//You've reached for her once today. That's enough.//
<</if>>
<br>
/* SPECIAL NIGHT (favour). Earned at 100, cashable down to 95. */
<<if $wife.favorUnlocked and $wife.relationship >= 95 and $wife.location == "bedroom" and $time >= 7 and not $wife.intimacyToday>>
<<costumeList>>
<<set _minCost = 99>>
<<for _i = 0; _i < _costumes.length; _i++>>
<<if (_costumes[_i].flag == "" or $items[_costumes[_i].flag]) and _costumes[_i].cost < _minCost>>
<<set _minCost = _costumes[_i].cost>>
<</if>>
<</for>>
<<intimacyReady>>
<<if $wife.favor < _minCost>>
//She's been in a giving mood lately, but you haven't quite earned a special night yet.//
<<elseif not _ready or $wife.cycleOff>>
//Not tonight. But you've earned something, and she knows it.//
<<elseif $wife.mood < 1>>
//You've earned a special night, but she's not in the mood for games tonight.//
<<elseif $fitnessTier < 3 and $energy < 1>>
//You've earned a special night, but you're too worn out to make anything of it.//
<<else>>
<<if $wife.favor >= 15>>
//She's been more than generous lately. Whatever you were saving up for, now's the time.//
<br>
<</if>>
<<link "Ask her for something special." "Wife Special">><</link>>
<</if>>
<br>
<</if>>
<br>
<<link "Step away." $return>><</link>><h2>With $wife.name</h2>
/* Consume the event */
<<set $wife.lingerieNightDay = 0>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.relationship += 2>>
<<moodShift 1>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
/* STILL: her on the bed in the set */
<<set _stills = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _stills.push("w_lingNight" + _i + ".jpeg")>>
<</for>>
<div class="intro-image">
<img @src="'images/characters/w/' + _stills.random()" width="100%">
</div>
<br>
/* OPENING BEAT */
<<set _open = [
"You push the bedroom door open and stop. The lamp is on low, and $wife.name is on the bed in the set you bought her, watching you take it in with a look that says she has been planning this since the fitting room.",
"The bedroom is warmer than you left it, one lamp lit, and $wife.name is waiting on the covers in the lingerie from that afternoon in town."
]>>
<<= _open.random()>>
<br><br>
<<set _l = [
"I was just trying out the new set you bought me, and it crossed my mind that I never really thanked you properly.",
"I just love this new set of lingerie you got me. You like it too? Does it turn you on, $name?",
"I thought you deserved a little surprise, after you spoiled me like that."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<br>
She takes your hand, pulls you over to the bed and sits you down on the edge. Then she sinks to her knees in front of you, slowly enough that you get a good look at the set on the way down, and opens your trousers.
<br>
/* GIF pool for the act */
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("w_bjLing" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
/* BJ Scene */
<<set _scene = [
"She takes your cock in her hand and licks slowly round the head, making sure you're watching. Then she slides her mouth down over you and takes you deep. She sucks you in long, wet strokes, lips tight, her hand following her mouth up and down the shaft. When you reach for her she catches your hand and puts it on her shoulder, under the strap, and keeps going. She pulls off once to catch her breath, spit dripping from her chin onto the lace between her breasts, then goes straight back down, faster. You come hard, pulsing into her mouth, and she keeps sucking until you're done, then swallows and wipes her lips with her thumb.",
"She pulls the cups of her bra down so her breasts spill over the lace, and leans in so you can feel them against your thighs. Then she takes you in her mouth. She bobs her head fast, her tongue working the underside, spit running down your shaft to her fingers. Every so often she takes you all the way to the back of her throat and holds you there, looking up at you with watering eyes. When you tell her you're close she pulls off, pumps you with her fist, and aims you at her chest. You come across her breasts and the lace, and she watches it run down, then leans in and sucks the last drops from the tip.",
"She's slow about it. She kisses the insides of your thighs, licks your balls, runs her tongue up the length of you, and only then lets the head slip between her lips. She sucks just the tip for a while, her tongue circling, until you're gripping the covers. Then she takes you deep and starts moving properly, moaning around your cock, one hand slipped inside her own panties. You can see her fingers working under the lace. She comes first, shuddering, her moan running right through your shaft, and that's enough to finish you. You come in her mouth and she swallows it all, breathing hard."
]>>
<<= _scene.random()>>
<br><br>
/* AFTERGLOW */
<<set _after = [
"When you lie back on the bed she crawls up beside you, one strap slipped off her shoulder, and settles across your chest.",
"She climbs up next to you and curls into your side, still in the set, looking very pleased with herself."
]>>
<<= _after.random()>>
<br><br>
<<set _say = [
"Money well spent, I'd say.",
"So. Worth the trip into town?",
"I'm keeping this one on for a while."
]>>
<<speech "Wife" $wife.name>><<= _say.random()>><</speech>>
<br>
<<link "Sleep." "Sleep">><</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<if $wife.obligation>>
<<set $wife.dutyCount += 1>>
<<if $wife.dutyCount % 3 == 0>>
<<set $wife.dutyScold = true>>
<</if>>
<<moodShift -1>>
<<else>>
<<set $wife.relationship += 1>>
<</if>>
/* OPENER, per room. Act text below is location-neutral. */
<<switch $sceneLoc>>
<<case "bathroom">>
<<set _open = [
"She's brushing her teeth when you put your hand on her shoulder. She spits, rinses, looks at you in the mirror, then turns round and sinks to her knees on the bath mat.",
"You catch her as she's stepping out of the shower, still dripping. Your hand goes to her shoulder and she follows the pressure down, kneeling on the wet tiles in front of you."
]>>
<<case "livingroom">>
<<set _open = [
"You're stretched out on the sofa when you touch the back of her neck and guide her toward your lap. She glances up at you, then lies down along the cushions with her head on your thigh and tugs your waistband down.",
"The film goes quiet for a stretch and you use it, easing her head down toward your lap. She curls up on her side along the sofa, pulls the blanket over her shoulders, and gets your jeans open."
]>>
<<case "kitchen">>
<<set _open = [
"You back her against the counter, close enough that she has to tip her head up to look at you, and ask. She holds your eye for a moment, then slides down the cupboard doors until she's kneeling on the tiles.",
"She's leaning against the counter with a glass of wine when you step in and ask her down. She sets the glass behind her, out of the way, and sinks to her knees on the kitchen floor."
]>>
<<default>>
<<set _open = [
"You're sitting up against the headboard when you ask. She looks at you for a moment, then pushes the covers back and moves down the bed between your legs.",
"She's just out of the shower, hair wrapped in a towel, when you ask. She takes her time crossing the room, then pushes you back onto the pillows and settles on her stomach between your knees."
]>>
<</switch>>
<<= _open.random()>>
<br><br>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_bj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 9; _i++>>
<<set _gifs.push("w_bj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 55 80>>
<<if $wife.obligation>>
<<set _lines = [
"She takes your cock in her mouth and starts bobbing at a steady, unchanging pace. Her lips stay loose, her tongue lies flat, and her hand works the base in time with her head so there's less for her mouth to do. Every so often she pulls off to breathe and wipes her chin with the back of her wrist before going back down. When you start to come she stays where she is and lets it fill her mouth, then swallows twice, quickly, the way you'd take a pill.",
"She starts sucking straight away, no teasing, no licking, her lips sealed round the shaft and her head moving in short, quick strokes. Saliva runs down to your balls and she doesn't bother catching it. Her eyes stay shut. When your hips start to jerk she holds your thigh down with one hand to keep you still and keeps going until you come in her mouth. She pulls off, swallows, and wipes her lips on her sleeve.",
"She takes the head in her mouth and works it with her lips and a tight fist, keeping you shallow, never taking more than she has to. The wet sounds are loud in the quiet room. When her jaw starts to ache she switches to stroking you with her hand for a while, mouth hovering, then goes back down when you groan. You come across her tongue in thick pulses. She holds it a second, swallows, and lifts her head."
]>>
<<set _after = [
"She goes to rinse her mouth out.",
"She wipes her mouth, straightens her clothes, and goes back to what she was doing."
]>>
<<set _say = [
"Okay. Are we good?",
"Done.",
"Next time, give me some warning."
]>>
<<else>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She pulls your cock out and takes it into her mouth with a small sigh through her nose. Her head moves in slow, even strokes, lips firm, her tongue pressing up along the underside because she knows that gets you there fastest. She doesn't look up. You grip the back of her head without meaning to and she lets you, keeping the same pace. You come hard in her mouth and she swallows it all, then gives the head one last suck to clean you off before letting go.",
"She sucks you with steady, practiced pulls, one hand wrapped round the base, cheeks hollowing on every upstroke. It's good. It's always been good. Her attention just isn't in it, and you can tell from how evenly she breathes. When you're close she pulls off and finishes you with her hand, aiming at her open mouth, and most of it lands on her tongue and the rest across her lips and chin.",
"She licks you once from base to tip to get you wet, then takes you deep and settles into a rhythm. Her free hand rests on your leg. Now and then she changes angle to rest her jaw, then carries on. The wet sucking sounds are the only noise either of you makes until you groan and come, and she takes it in her mouth, swallows, and pulls off with a soft pop."
]>>
<<set _after = [
"She wipes the corner of her mouth with her thumb and sits up.",
"She lifts her head and wipes her lips with the back of her hand."
]>>
<<set _say = [
"There you go.",
"Okay. Happy?",
"My jaw's going to feel that tomorrow."
]>>
<<case 1>>
<<set _lines = [
"She starts slow, kissing along the length of you, taking her time before she lets the head slip between her lips. Then she sinks down, inch by inch, and hums when she's taken as much as she can. Her tongue swirls round the head on every upstroke. She looks up at you through her lashes and keeps looking, even when you start to shake. You warn her and she stays where she is, sucking gently as you pulse into her mouth, and swallows with her eyes still on yours.",
"She wraps her hand round the base and takes you in her mouth, warm and wet and unhurried. She finds the pace you like and stays on it, sucking a little harder whenever you groan. Her free hand slides up under your shirt and rests flat on your stomach. When you come she pulls back and lets the last few spurts land on her lips and chin, then licks them clean slowly, holding your eye.",
"She teases you first, flicking her tongue against the underside of the head, pulling back whenever you push toward her mouth, until you say her name. Then she takes you in properly, lips tight, her head moving in long, deep strokes. She moans softly around you and you feel it all the way down. You come on her tongue in thick spurts and she swallows, then kisses the tip before letting go."
]>>
<<set _after = [
"She rests her cheek on your thigh for a moment, catching her breath.",
"She comes back up and settles against you, wiping her mouth with her thumb."
]>>
<<set _say = [
"Mm. Missed that.",
"Good?",
"Don't look so smug."
]>>
<<case 2>>
<<set _lines = [
"She takes you all the way down in one go, nose pressed to your stomach, and holds you there until her eyes water. Then she pulls off, gasping, spit stringing between her lips and your cock, and grins up at you. //Again?// She doesn't wait for an answer. She sucks you hard and fast, her hand twisting at the base, moaning around you. When you come she pulls back and takes it across her face and open mouth, then licks her lips and laughs.",
"She's hungry about it. She licks you from balls to tip, sucks each of your balls into her mouth in turn, then swallows your cock down deep and bobs fast. One of her hands has slipped between her own legs and you can see her arm moving. She pulls off to tell you how much she loves your cock in her mouth, then goes straight back down. When you come she moans and keeps sucking, swallowing every pulse, and doesn't stop until you're pushing her head away.",
"She takes her time making you desperate. She licks and kisses you everywhere except where you want her, then sucks just the head, slow and hard, while her fist pumps the shaft. Every time you get close she stops, looks up at you with wet lips, and asks if you want to come in her mouth. When you finally beg, she takes you deep and sucks until you do, cum flooding her tongue, and she opens her mouth to show you before she swallows."
]>>
<<set _after = [
"She wipes her chin with two fingers and sucks them clean.",
"She crawls up and kisses you, still tasting of you."
]>>
<<set _say = [
"I've missed doing that.",
"You're buying me a drink for that.",
"Tell me that wasn't the best one in months."
]>>
<</switch>>
<</if>>
<<= _lines.random()>>
<br><br>
<<= _after.random()>>
<br><br>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<if $wife.relationship >= 65 and $gameDay >= $intimacyUnlockDay and not $phone.intimacyPicToday>>
<<link "Reach for your phone. She lets you snap a memory.">>
<<set $phone.intimacyPicToday = true>>
<<set _bjPics = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _bjPics.push("w_phone_bj" + _i + ".jpeg")>>
<</for>>
<<set _img = "images/characters/w/" + _bjPics.random()>>
<<set _cap = "You took this on day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>>
<br>
<</if>>
<<link "Continue.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<set $sceneLoc = $wife.location>>
<<switch $wife.location>>
<<case "bedroom">> <<set _bjRel = 40>><<set _sexRel = 55>><<set _sexHere = true>>
<<case "bathroom">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<<case "livingroom">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<<case "kitchen">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<</switch>>
<<set _roomMaxTier = _sexHere ? 3 : 2>>
<<if $wife.obligation>>
/* Obligation route: she says yes because no is a conversation. */
<<set _maxTier = $wife.relationship >= 40 ? 2 : 1>>
<<else>>
<<set _sexMoodReq = 2>>
<<if $wife.tipsy>>
<<set _bjRel = Math.max(10, _bjRel - 8)>>
<<set _sexRel = Math.max(50, _sexRel - 8)>>
<<set _sexMoodReq = 1>>
<</if>>
<<set _maxTier = 1>>
<<if $wife.mood >= 1 and $wife.relationship >= _bjRel>>
<<set _maxTier = 2>>
<</if>>
<<if _sexHere and $wife.mood >= _sexMoodReq and $wife.relationship >= _sexRel>>
<<set _maxTier = 3>>
<</if>>
<<if $wife.cycleOff and _maxTier > 2>>
<<set _maxTier = 2>>
<</if>>
<</if>>
<<if $wife.obligation>>
<<set _open = [
"She looks at your hand on her, then at the clock, and you can see her doing the math. How long this takes against how long the conversation would take if she said no. She sighs through her nose and doesn't move away.",
"There's a pause where she could say something. She doesn't. She just shifts to give you the room, her face carefully neutral, the way she is with people at work she doesn't especially like.",
"She lets out a small breath and sets down what she was holding. Not a yes exactly. More that she's decided not to make it a thing tonight."
]>>
<<= _open.random()>>
<<elseif $wife.mood >= 2>>
She catches your hand, eyes curious, and waits to see what you have in mind.
<<elseif $wife.mood >= 1>>
She leans into the touch, a small smile pulling at the corner of her mouth.
<<else>>
She doesn't pull away. She waits.
<</if>>
<<if $wife.cycleOff and _sexHere and $wife.relationship >= _sexRel and $wife.mood >= _sexMoodReq>>
<br>//She murmurs that she's on her period, so you'll have to wait a few days to go all the way.//
<<elseif $wife.cycleOff>>
<br>//She's on her period and a bit tender, but she doesn't push you away.//
<</if>>
<br><br>
''What do you do?''
<br>
<<switch $wife.location>>
<<case "bedroom">>
<<link "Take her hand under the covers.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Ask her to use her mouth.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Make love to her.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "bathroom">>
<<link "Pull her hand to your cock.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Put your hand on her shoulder and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Lift her against the wall.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "livingroom">>
<<link "Slip her hand under the blanket.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Coax her head down to your lap.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Pull her down onto the couch with you.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "kitchen">>
<<link "Press up behind her and take her hand back.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Back her against the counter and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Bend her over the counter.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<</switch>>
<br>
<<link "Change your mind.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<sexEnergy 1>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<set $wife.relationship += 1>>
/* OPENER, per room. Sets the position and the entry. Act text below is position-neutral. */
<<switch $sceneLoc>>
<<case "bathroom">>
<<set _open = [
"You lift her by the backs of her thighs and press her against the wall, and her legs lock round your waist. The tiles are cold and she gasps when her back hits them. You shift her weight, find the angle, and lower her onto your cock.",
"The shower's running. You pick her up under the spray and pin her to the wall, her arms round your neck, and she reaches down between you to guide you in. You push up into her in one slow stroke."
]>>
<<case "livingroom">>
<<set _open = [
"You pull her down onto the sofa and she ends up on her back across the cushions, one leg hooked over the backrest. You get her underwear off and push into her, and the sofa creaks under both of you.",
"You pull her into your lap on the sofa, facing you, and drag her underwear aside. With your hands on her hips you lower her onto your cock until she's sitting on you, and the blanket slides to the floor."
]>>
<<case "kitchen">>
<<set _open = [
"You turn her round and bend her over the counter, her hands flat on the worktop. You push her skirt up, pull her underwear down to her knees, and slide into her from behind.",
"You press her forward over the counter and she braces on her forearms. Her leggings come down in one pull. You grip her hip with one hand, guide yourself with the other, and push into her until she's pinned against the edge."
]>>
<<default>>
<<set _open = [
"You ease her back onto the bed and she lets her legs fall open as you settle between them. The head of your cock drags against her once, twice, and then you push inside her, slow, until you're all the way in.",
"She's on her stomach when you climb onto the bed. You pull her hips up, nudge her knees apart, and guide your cock into her from behind, sinking in until your hips press against her ass."
]>>
<</switch>>
<<= _open.random()>>
<br><br>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_h" + _i + ".gif")>>
<</for>>
<<elseif $sceneLoc == "kitchen">>
<<set _gifs = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _gifs.push("w_kitchen_h" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 16; _i++>>
<<set _gifs.push("w_h" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 70 88>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She isn't very wet and the first strokes are tight and slow. She stays quiet. You find a rhythm and she lets you have it, her breathing even, her body moving only because you're moving it. Her pussy grips you anyway, warm and snug, and you fuck her in long, steady strokes that get faster as you get close. She doesn't make a sound when you come. You push as deep as you can and empty into her, and she waits for you to finish.",
"You fuck her at a steady pace, the slap of skin loud in the quiet. She looks away, somewhere past your shoulder. Once she shifts to get more comfortable and it changes the angle, and you groan at how tight she feels, but she doesn't react. You pull out at the end and come in thick spurts across her skin. She reaches for something to clean up with before you've caught your breath.",
"She lets you do most of the work. Your cock slides in and out of her in slow, deep strokes and she takes it with small, polite sounds that stop whenever you slow down. You speed up. Her hand rests on your arm. When you come inside her she lets out a breath and waits for you to pull out."
]>>
<<set _after = [
"You pull out and she goes to clean herself up.",
"She tidies herself up without looking at you."
]>>
<<set _say = [
"Okay.",
"You finished?",
"I need a shower."
]>>
<<case 1>>
<<set _lines = [
"She's wet and it gets easier with every stroke. She starts moving with you, meeting you halfway, and her breathing goes ragged. You fuck her slow and deep, and when you hit the right spot she grabs your wrist and tells you to stay there. You do. She comes quietly, her pussy clenching around your cock in slow pulses, and the feel of it pulls you after her. You come deep inside her and stay there, both of you breathing hard.",
"You find a rhythm together and hold it. She's warm and slick around you, and each time you push in all the way she makes a low sound in her throat. Her fingers dig into you. She tells you it feels good, then again, quieter. You go harder and she lets you, pushing back against every stroke, until you can't hold it any longer. You pull out and come across her skin in hot spurts. She finds your hand and holds it.",
"You take it slow. She's soaked, and you can hear it each time you pull back and push in. She rubs her clit in small circles while you fuck her, and you feel her tighten as she gets close. She doesn't quite get there. You come inside her, shaking, and she keeps touching herself with you still in her until she comes too, a moment later, her pussy squeezing your softening cock."
]>>
<<set _after = [
"She stays close to you for a while afterward, her breathing slowing.",
"She laughs softly, a little out of breath, and kisses you."
]>>
<<set _say = [
"We should do that more.",
"I forgot how good that can be.",
"Stay a minute."
]>>
<<case 2>>
<<set _lines = [
"She's dripping wet and she wants it hard. She tells you so, then tells you again, louder, when you don't give it to her fast enough. You fuck her hard and deep, the sound of it filling the room, her moans breaking up with every stroke. She comes with a sharp cry, clenching around you, and keeps urging you on through it. //Fill me up,// she gasps, and you do, driving into her one last time and coming so hard your legs shake.",
"She makes no effort to be quiet. Every stroke gets a moan out of her and she swears at you, filthy and breathless, telling you how good your cock feels and not to stop. You don't. She comes once, shuddering, and when you keep going she comes again, harder, her pussy squeezing you in waves. That finishes you. You pull out and come across her skin, and she reaches down and rubs it in with her fingers.",
"She's pushing against you before you've even started moving. You grab her hips and give her what she wants, fast and rough, and she meets every stroke. Her hand goes between her legs and rubs her clit hard. //Don't stop, don't stop,// she says, and you don't, until she comes, crying out, her whole body shaking around you. You fuck her through it and come deep inside her, and she keeps you pressed into her so you can't pull out."
]>>
<<set _after = [
"She's still trembling when you pull out, and your cum runs down her thighs.",
"She slumps, flushed and sweaty, grinning at nothing."
]>>
<<set _say = [
"Holy shit.",
"Round two in an hour. I'm serious.",
"I can barely stand."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<= _after.random()>>
<br><br>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<link "Continue." $return>><</link>><h2>Morning</h2>
She's waiting for you when you wake, sitting on the edge of the bed, already dressed. She doesn't look over when you stir. She's been rehearsing this, you can tell, and she means to get through it without losing the thread.
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Sit up. Don't talk, just listen, because I've said this to you in my head a hundred times and I need to say it once out loud.
<</speech>>
<<speech "Wife" $wife.name>>
I am almost done. Not angry-done. Done-done. I gave up the one thing that was ever mine to follow you, and I have spent years telling myself it would turn back into something. I don't tell myself that anymore.
<</speech>>
<<speech "Wife" $wife.name>>
So this is the last of it. The last of my patience, the last of the benefit of the doubt. Give me a reason. A real one. Because if this is still what it is a while from now, I'm taking our son and I'm going, and you will not talk me out of it.
<</speech>>
<br>
She holds your eye a moment longer, then gets up and goes to get your son ready, and her voice through the wall is soft and ordinary for him, the way it used to be for you.
<br><br>
<span class="bad">$wife.name has reached the end of her patience. Let things fall further and she will leave.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.ultimatumToday = false>>
<</link>><h2>With $wife.name</h2>
<<set $items.wine -= 1>>
<<set $wife.wineToday = true>>
<<set $wife.lastWineDay = $gameDay>>
<<set $wife.tipsy = true>>
<<moodShift 1 1>>
<div class="intro-image">
<img @src="either('images/characters/w/w_wine1.jpeg', 'images/characters/w/w_wine2.jpeg', 'images/characters/w/w_wine3.jpeg')" width="100%">
</div>
<<if $wife.relationship >= 40>>
You pour two glasses and she's smiling before you've even handed hers over. For an hour it's easy between you. She tells a story you've heard a dozen times and you let her, because she tells it well. By the bottom of the bottle she's leaning into you, warm and relaxed.
<<elseif $wife.relationship >= 25>>
You pour two glasses and she shifts to make room, tucking her feet up under her. The talk comes easily tonight, looping back through old jokes and half-finished stories. Somewhere in the second glass her hand ends up on your knee and stays there, and she looks at you the way she used to.
<<else>>
You pour two glasses and sit down beside her. She takes hers with a small, surprised look. The first glass goes down quietly. By the second she's turned toward you instead of the room, her shoulders relaxing, and she laughs at something you say, properly, like she's a little annoyed at herself for it.
<</if>>
<br><br>
<<if not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Make a move on her.">>
<<set $wife.intimacyToday = true>>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Enjoy the rest of the evening." $return>><</link>><h2>Morning</h2>
She's up before you, and she's waiting. She's sitting at the edge of the bed with her arms crossed, looking at you.
<div class="char-scene">
<img src="images/characters/w/w_worry1.jpeg" class="char-img">
</div>
<<speech "Wife" $wife.name>>
You came in late again. I could smell it on you from across the room. And don't think I haven't seen the state of your hands.
<</speech>>
<<speech "You" $name>>
It's nothing. I'm handling it.
<</speech>>
<<speech "Wife" $wife.name>>
You think this is handling it? The drinking and whatever it is you're doing to end up looking like that. I've watched you go down a hole once already. I held this family together at the bottom of it. I cannot do it twice.
<</speech>>
<<speech "Wife" $wife.name>>
I'm not asking you to be a saint. I'm asking you not to throw yourself away in front of me and our son. Because he sees more than you think, and so do I.
<</speech>>
<br>
She holds your eye a moment longer, then gets up to start the boy's morning, leaving the weight of it sitting on you.
<br><br>
<span class="warning">$wife.name is worried about the way you're living and it's straining your relationship.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
<</link>><<widget "resetWifeFlags">>
<<set $wife.talkedToday = false>>
<<set $wife.intimacyToday = false>>
<<set $wife.lastInteraction = "">>
<<set $wife.spiedToday = false>>
<<set $wife.bathroomViewedToday = false>>
<<set $wife.talkTopic = "">>
<<set $wife.cookedToday = false>>
<<set $wife.tipsy = false>>
<<set $wife.wineToday = false>>
<<set $wife.dateToday = false>>
<<set $wife.arousalNoticedToday = false>>
<<set $wife.yogaViewedToday = false>>
<<set $wife.outingResolved = false>>
<<set $wife.outForDay = false>>
<<set $wife.lazyMorningToday = false>>
<<set $wife.affectionToday = false>>
<<set $wife.wardrobeSeen = false>>
<<set $wife.choreToday = false>>
<<set $wife.careToday = false>>
<<set $wife.obligation = false>>
<</widget>><<widget "resetDailyState">>
/* Energy / player one-shots */
<<set $energy = $energyMax>>
<<set $ventedToday = false>>
<<set $foughtToday = false>>
/* Job flags */
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<set $job.distractedToday = false>>
<<set $job.wfhToday = false>>
/* Phone flags */
<<set $phone.wifeTextedToday = false>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.intimacyPicToday = false>>
<<set $phone.friendTextedToday = false>>
/* Assistant flags */
<<resetAssistantFlags>>
/* Lingerie selfie: fires a few days after the shopping date.
Waits a day if another wife photo is already pending. */
<<if $wife.lingerieSelfieDay > 0 and $gameDay >= $wife.lingerieSelfieDay and not $phone.wifeUnread>>
<<set _ling = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _ling.push("w_phone_ling" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _ling.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "lingerie">>
<<set $phone.wifeMsgText = [
"couldn't resist trying it on again 😘 thank you for this, you've got better taste than you let on 💕",
"feeling dangerously good in what you picked out for me 🔥 thought you should see what's waiting at home...",
"thanks for the shopping spree, you officially have an eye for this 😏 here's a little preview, don't get distracted 💋",
"so. worth. it. 😍 just gonna leave this right here and let you think about it all day 😈"
].random()>>
<<set $wife.lingerieSelfieDay = 0>>
<<set $wife.lingerieNightDay = $gameDay + random(3, 6)>>
<</if>>
/* Lingerie bedroom event expires if left unused too long */
<<if $wife.lingerieNightDay > 0 and $gameDay > $wife.lingerieNightDay + 10>>
<<set $wife.lingerieNightDay = 0>>
<</if>>
/* Wife-initiated nude at high relationship */
<<set _nudeOk = $wife.relationship >= 60 and $gameDay >= $intimacyUnlockDay and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<if _nudeOk and not $phone.wifeUnread and random(1, 100) <= 20>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifePendingImg = _pick>>
<<set $phone.wifeMsgType = "nude">>
<<set $phone.wifeMsgText = [
"thinking about you. no reason. carry on 🙈",
"house is empty and I'm bored. somehow this is your fault 😏",
"don't open this at work. actually, do. I don't care 😈",
"just out of the shower and you crossed my mind 💋",
"no occasion. just wanted you to know what's waiting at home 🔥",
"I miss you. that's the polite version 😘",
"you've been good lately. consider this the review 😌"
].random()>>
<<set $phone.lastNudeDay = $gameDay>>
<</if>>
/* Friend ping: yesterday's invite is dropped before today's roll;
evergreen pings persist until replied. Invites are held in
friendInviteDue, delivered by <<friendInviteCheck>> at early
evening and expired by it at night. */
<<set $phone.friendInviteDue = "">>
<<if $phone.friendPingTopic == "anchor" or $phone.friendPingTopic == "club">>
<<set $phone.friendPingTopic = "">>
<<set $phone.friendUnread = false>>
<</if>>
<<set _friendOk = ($gameDay - $phone.lastFriendPing) >= $phone.friendCooldown>>
<<if _friendOk and not $phone.friendUnread and random(1, 100) <= 40>>
<<set _pingPool = ["checkin", "memory", "ribbing", "lowkey"]>>
<<if $weekday == 5 or $weekday == 6>>
<<run _pingPool.push("anchor", "anchor")>>
<<if $friend.relationship >= 5>>
<<run _pingPool.push("club")>>
<</if>>
<</if>>
<<set _fPick = _pingPool.random()>>
<<if _fPick == "anchor" or _fPick == "club">>
<<set $phone.friendInviteDue = _fPick>>
<<else>>
<<set $phone.friendPingTopic = _fPick>>
<<set $phone.friendUnread = true>>
<</if>>
<<set $phone.lastFriendPing = $gameDay>>
<</if>>
/* Misc daily */
<<set $friend.drankToday = false>>
<<set $onsToday = false>>
<<set $dancer.danceToday = false>>
<<set $phone.dancerTextedToday = false>>
<<set $phone.dancerDateAskedToday = false>>
<<set $helionGym.peepToday = false>>
<</widget>><h2>Project Choice Genre</h2>
An early fork. Before you build much further, you have to decide what kind of game this really is.
<br><br>
<<link "Aim broad. Vanilla sex and the everyman's fantasies. Something accessible, easy to fall into.">>
<<set $project.choices.genre = "broad">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You commit to a broad, welcoming design. The kind of game a lot of people could enjoy.">>
<<goto "Computer">>
<</link>>
<br>
<<link "Go niche. We'll trawl dark the waters of human lust. Unapologetic and for people who know what they want.">>
<<set $project.choices.genre = "niche">>
<<set $project.supMult = 4>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You lean into a niche. A smaller crowd, maybe, but one that'll pay extra attention.">>
<<goto "Computer">>
<</link>><h2>Project Choice Protagonist</h2>
The game needs someone at its center. Who does the player get to be?
<br><br>
<<link "An everyman. Ordinary, relatable, easy to project onto and easy to do everything you wish you could in real life.">>
<<set $project.choices.protagonist = "everyman">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You write your lead as an everyman. Nothing flashy. Someone anyone could imagine being.">>
<<goto "Computer">>
<</link>>
<br>
<<link "A stylised fantasy lead from a magical realm. Larger than life, and with no limits to creative perversion.">>
<<set $project.choices.protagonist = "fantasy">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You build a lead from the realms of fantasy. Can do anything you can imagine, and unashamed of it.">>
<<goto "Computer">>
<</link>><h2>Project Choice Feature</h2>
You've got room for one real signature system, the thing people will talk about. Where does the effort go?
<br><br>
<<link "Deep stat management. Systems, numbers, optimisation. All working towards collecting those precious sex scenes.">>
<<set $project.choices.feature = "stats">>
<<set _rush = random(4, 7)>>
<<set $project.supporters += _rush>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You go deep on systems. A wave of " + _rush + " min-maxers finds the game and moves in. Your page now brings in $" + $project.weeklyIncome + " a week.">>
<<goto "Computer">>
<</link>>
<br>
<<link "Scene variety. More situations, more breadth, more to see.">>
<<set $project.choices.feature = "variety">>
<<set $project.supMult += 1>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You pour it into breadth. More to see, more to come back for. Word is your game keeps surprising people.">>
<<goto "Computer">>
<</link>><<widget "addInfluence">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<if _amt > 0>>
<<set $assistant.influence = Math.min(100, $assistant.influence + _amt)>>
<</if>>
<<assistantCheck>>
<</widget>>
<<widget "assistantCheck">>
<<set _oldTier = $assistant.tier>>
<<if $assistant.influence >= 75>>
<<set _t = 4>> /* Reversal, NOT built in 0.2.0 */
<<elseif $assistant.influence >= 55>>
<<set _t = 3>> /* Arrangement */
<<elseif $assistant.influence >= 35>>
<<set _t = 2>> /* Entanglement */
<<elseif $assistant.influence >= 15>>
<<set _t = 1>> /* Flirtation */
<<else>>
<<set _t = 0>> /* Professional */
<</if>>
/* Affair-gate cap: until the trip is crossed, the relationship can't
resolve past tier 1 (Flirtation) no matter how high influence climbs.
Crossing the trip sets $assistant.affair, which lifts the cap. */
<<if not $assistant.affair and _t > 1>>
<<set _t = 1>>
<</if>>
/* Tier 4 (Reversal) is not built. Until it is, influence above 74
resolves to tier 3 rather than dropping the player into a tier with
no content. DELETE THIS BLOCK when tier 4 ships. */
<<if _t > 3>>
<<set _t = 3>>
<</if>>
<<set $assistant.tier = _t>>
<<set $assistant.tierUp = false>>
<<if $assistant.tier > _oldTier>>
<<set $assistant.tierUp = true>>
<</if>>
<</widget>>
<<widget "assistantReact">>
/* Check-in: flavour only, no influence. One beat per visit, cleared after. */
<<if $assistant.lastAction == "talk">>
<<if $assistant.tier == 0>>
<<set _beat = random(1, 5)>>
<<if _beat == 1>>
You stop at her desk and read over her shoulder a moment before saying anything, long enough that she has to sit with not knowing what you think.
<br><br>
<<speech "You" $name>>
It's good. Bit pleased with itself in places, but good.
<</speech>>
<<speech "Assistant" $assistant.name>>
...Pleased with itself.
<</speech>>
<<speech "You" $name>>
You'll grow out of it. Most people do.
<</speech>>
<br>
She almost argues, then doesn't, and files the note away with a small nod she'd rather you hadn't seen.
<<elseif _beat == 2>>
She's been waiting for you to look at the thing she flagged, too composed to say so, which is its own tell.
<br><br>
<<speech "Assistant" $assistant.name>>
When you have a minute.
<</speech>>
<<speech "You" $name>>
I've had several. I was seeing whether you'd ask twice.
<</speech>>
<<speech "Assistant" $assistant.name>>
And?
<</speech>>
<<speech "You" $name>>
You didn't. Good.
<</speech>>
<br>
She sits back, and there's the smallest thing in her face: pleased to have passed a test she'd deny taking.
<<elseif _beat == 3>>
She leans in over your screen to point something out, closer than she needs to be, and waits to see if you'll give ground. You don't. You let her be the one to notice she's the one who leaned.
<br><br>
<<speech "You" $name>>
Careful. People will think you're keen.
<</speech>>
<<speech "Assistant" $assistant.name>>
To fix your bug? Devastating.
<</speech>>
<<speech "You" $name>>
Mm. Keep telling yourself that's the bug.
<</speech>>
<br>
She straightens up a half-second too slow, and goes back to her desk without the last word, for once.
<<elseif _beat == 4>>
You catch her on her way out, coat over her arm, and don't quite let her leave.
<br><br>
<<speech "You" $name>>
The Kessler thing. You could've done it faster.
<</speech>>
<<speech "Assistant" $assistant.name>>
You could've given it to me sooner.
<</speech>>
<<speech "You" $name>>
I could have. I wanted to see how you'd do without me holding the map.
<</speech>>
<br>
She weighs that and decides to take it as the compliment it half is, which is exactly as much as you meant her to have.
<<else>>
She hands you a report you hadn't asked for yet, done early. You take it without looking at it, and watch her instead.
<br><br>
<<speech "You" $name>>
You do this a lot. Get ahead of me.
<</speech>>
<<speech "Assistant" $assistant.name>>
Is that a problem?
<</speech>>
<<speech "You" $name>>
No. It's a habit I'll allow. For now.
<</speech>>
<br>
The "for now" lands the way you meant it to, and she doesn't quite manage to look unbothered by it.
<</if>>
<<else>>
You stop by her desk. The talk stays light and lands easy, the way most things do between you now.
<</if>>
<<set $assistant.lastAction = "">>
<</if>>
<br>
<</widget>>
/* Single source of truth for whether the office loop is on the table.
Sets three temps in the caller's scope:
_hookupOffer she is available and willing tonight
_hookupReady he can actually afford it
_hookupLocked a cool-off is live
Called at the top of Helion Dynamics and Assistant Interact. Governs
the office loop only. The gym encounter has its own ladder, inline in
Helion Gym. Add office-loop clauses here only. */
<<widget "hookupGate">>
<<set _hookupLocked = ($assistant.affair and $gameDay < $assistant.coolOffUntil)>>
<<set _hookupOffer =
$assistant.affair
and $assistant.tier >= 2
and not _hookupLocked
and $job.attendedToday
and $weekday <= 5
and $time >= 4
and $time <= 5
and not $assistant.hookupToday>>
/* Energy is deliberately NOT part of the offer. She still looks up;
he is the one who cannot. The option renders greyed instead of
vanishing, so the hub never promises something the desk withholds. */
<<set _hookupReady = (_hookupOffer and $energy >= 2)>>
<</widget>>
<<widget "resetAssistantFlags">>
/* Heat decay. Must run BEFORE hookupToday is cleared: the flag still
holds yesterday's value at this point, so no $gameDay maths is needed.
Weekends included, by design. */
<<if not $assistant.hookupToday>>
<<set $assistant.heat = Math.max($assistant.heat - 1, 0)>>
<</if>>
<<set $assistant.hookupToday = false>>
<<set $assistant.hookupSource = "">>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.textedToday = false>>
<</widget>>
/* Wipes every hookup-loop field. Called by the Control Panel reset and
jump buttons so they can't carry stale office state across a reset.
Add any new hookup variable here and the buttons stay correct. */
<<widget "clearHookupState">>
<<set $assistant.hookupToday = false>>
<<set $assistant.lastHookupDay = -99>>
<<set $assistant.hookupCount = 0>>
<<set $assistant.heat = 0>>
<<set $assistant.lastHookupLoc = "">>
<<set $assistant.lastHookupAct = "">>
<<set $assistant.heatTellDay = 0>>
<<set $assistant.coolOffPending = 0>>
<<set $assistant.coolOffUntil = 0>>
<<set $assistant.lastGymDay = -99>>
<<set $assistant.hookupSource = "">>
<</widget>>
<<widget "hookupLoc">>
<<set _locNames = {
bathroom : "the Bathroom",
office : "the Glass Office",
gym : "the Gym",
shower : "the Showers",
sauna : "the Sauna",
carpark : "the Car Park"
}>>
<<if _locNames.hasOwnProperty($assistant.lastHookupLoc)>>
<<print _locNames[$assistant.lastHookupLoc]>>
<<else>>
the Office
<</if>>
<</widget>><<set $assistant.met = true>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_meet1.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
The graduate intake is lined up in the glass room off the atrium, five of them in the careful clothes people wear before they've learned which rules are real, lanyards still stiff in their sleeves.
<br><br>
They sent you back down a floor for the morning. A week into the new job title and they already want you teaching the fresh college grads. New meat for the grinder, you think to yourself. A woman from HR runs the rotation schedule in the tone of someone reading a menu she's read a thousand times. You're down as a mentor now. Lead Engineer. Someone juniors get handed to.
<br><br>
Most of them watch HR. One of them watches you. She's near the end of the row, dressed a half step sharper than the rest without tipping into trying, and where the others have the bright, slightly frightened alertness of a first week, she has something quieter and more useful. She's reading the room, and she's most of the way through it. When HR pairs her to your rotation she doesn't look pleased, and she doesn't look nervous. She looks like someone who checked the org chart before she arrived and already knows what a Lead is worth.
<br><br>
Once the group breaks, she comes to find your desk rather than waiting to be fetched. She offers a hand and a level look.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm $assistant.name. They told me you're the one who actually knows how the building works.
<</speech>>
<<speech "You" $name>>
I know some of it.
<</speech>>
<<speech "Assistant" $assistant.name>>
That's more than anyone else has admitted to. I learn fast. You won't have to say things twice.
<</speech>>
<br>
You spend the rest of the morning showing her the shape of the place: which systems matter, which meetings are theatre, where the real decisions get made and by whom. She's taught up to her clearance, but you keep her mostly in the dark about the bulk of Helion's dealings. She stays a half step behind and to the side, close enough to read your screen, and she asks the kind of questions that tell you she's already three moves past the answer. You notice you're enjoying it.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed1.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Some days in and $assistant.name has a desk of her own now, two rows down from yours, and she is already carrying work the last graduate would have needed a month to touch. You come back from a meeting to find her waiting by your monitor, a laptop open against her arm.
<br><br>
<<speech "Assistant" $assistant.name>>
The migration script everyone's been rerunning by hand? It fails on the same record every night. I think someone hard-coded a date format in 2019 and no one's looked since.
<</speech>>
<<speech "You" $name>>
Show me.
<</speech>>
<br>
She does. She's right. It is a small thing and a real one, the kind most people walk past for years, and she found it on her first week.
<br><br>
<<speech "You" $name>>
Good catch. Write it up and put my name on the review, not yours. It'll go further with mine on it.
<</speech>>
<<speech "Assistant" $assistant.name>>
I know. That's why I brought it to you and not to them.
<</speech>>
<br>
She says it lightly, already turning back to her desk, and it takes you until she's gone to notice she has just told you exactly how she operates, and that she wanted you to hear it. Not bad for a grad.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed2.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
The all-hands runs forty minutes long on a deck that could have been an email. Halfway through, a VP says the word "synergies" without irony and you feel, rather than see, $assistant.name's glance flick to you across the room. You keep your face still. Hers is a study in attentive nothing. It is the most professional either of you has ever looked, and you both know exactly why.
<br><br>
Afterward, in the corridor:
<br><br>
<<speech "Assistant" $assistant.name>>
I counted four action items. None of them were actions. One of them was a feeling.
<</speech>>
<<speech "You" $name>>
That's the job. Most of this building is people performing work at each other. You'll learn to tell the part that's real.
<</speech>>
<<speech "Assistant" $assistant.name>>
I already can. I'm looking at it.
<</speech>>
<br>
She holds the line just long enough for it to mean the work, or to mean you, then she's gone down the corridor before you have to decide which. You notice you're smiling at nothing. You make yourself stop.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed3.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Late in the afternoon the floor has thinned out, and $assistant.name pulls a chair around to your side of the desk to look at something on your screen. Close, this time. Closer than the work strictly needs. You can smell whatever she wears, something clean and not cheap, and when she leans in to point at a line of code her shoulder comes to rest an inch from yours and stays there.
<br><br>
<<speech "Assistant" $assistant.name>>
There. That's the branch that never runs. You've been reading past it for twenty minutes.
<</speech>>
<br>
You have been reading past it because for twenty minutes you have been extremely aware of exactly how close she is sitting. You don't say that. She knows the branch is what you missed, and she is too sharp not to know why. She doesn't move away.
<br><br>
<<speech "You" $name>>
Right. Good. Fix it and push it.
<</speech>>
<<speech "Assistant" $assistant.name>>
Mm.
<</speech>>
<br>
She takes the mouse from under your hand, unhurried, her fingers passing over yours on the way, and does the fix herself while you sit there and let her. Nothing happens. By the time she rolls back to her own desk the line is somewhere well behind you, and you couldn't say when you crossed it.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed4.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Last week of the rotation, and a fault in the payments reconciliation has the two of you shut in a booked meeting room past one o'clock, half the whiteboard gone, two trays of supermarket sushi open between the laptops. Neither of you called it lunch. It just became lunch somewhere around the second failed theory.
<br><br>
<<speech "Assistant" $assistant.name>>
The total's right and every single line is wrong. It's balancing by coincidence.
<</speech>>
<<speech "You" $name>>
It's balancing the way Helion balances. Nobody knows why, nobody's brave enough to touch it, and there's a bonus attached to not asking.
<</speech>>
<br>
And she laughs. A real one, caught out of her, nothing careful left in it, and for a second she is just a person who found something funny instead of the most composed grad in the building. It's the first time you've seen it. You find you would like to see it again.
<br><br>
She picks a piece off the tray, and the room settles, and when she speaks again the register has changed by a degree you'd miss if you weren't already paying her too much attention.
<br><br>
<<speech "Assistant" $assistant.name>>
Placements for the graduates went out this morning. Everyone got theirs.
<</speech>>
<<speech "You" $name>>
And?
<</speech>>
<<speech "Assistant" $assistant.name>>
Everyone except me. Mine's still "under discussion." Someone's arguing to keep me on this team, specifically. I wondered if you knew who.
<</speech>>
<br>
You do know who. You put your name to it on Tuesday. You could tell her that. You could also say nothing and let her arrive at it, which she already has, because she asked the question in a room with exactly one other person in it.
<br><br>
<<speech "You" $name>>
I'd keep working the reconciliation, if I were you. Sounds like you'll be here a while.
<</speech>>
<br>
She holds your eye a moment, then nods once. She doesn't thank you. She just goes back to the sushi and the branch that never balances, and the rotation is all but over, and neither of you has to say where she's landing.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.unlocked = true>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_reunion1.jpeg">>
<h2>Helion Dynamics</h2>
The corner office comes with a team, and you don't read the roster properly until your second coffee. One row under your own name, where it lists who reports to you now, is a name you already know. Not a grad on rotation any more. Hired on, permanent, and assigned to you.
<br><br>
You're not surprised. You're the one who put your name down to keep her, back when her placement was still "under discussion." It went through.
<br><br>
When you look up she's already crossing the floor toward the glass, and she stops in your doorway, waiting, the way she does, until she's told.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
You wave her in. She sits.
<br><br>
<<speech "Assistant" $assistant.name>>
So they gave me to you. I asked for it, so I won't pretend I'm surprised.
<</speech>>
<<speech "You" $name>>
You asked.
<</speech>>
<<speech "Assistant" $assistant.name>>
I asked. You taught me how this place actually works when nobody else could be bothered. I'd rather work for someone who already understands me than someone I'd have to explain myself to. It's simpler. For both of us.
<</speech>>
<br>
Every word of it is true, and none of it is the whole of what she means.
<br><br>
<<speech "Assistant" $assistant.name>>
Anyway. I'm yours to point at whatever you need. Tell me where you want me and I'll make you look good doing it.
<</speech>>
<br>
You let that sit before you answer. She works for you now, and whatever this becomes, you're the one who decides what you ask of her and when.
<br><br>
Then she's back at the desk that's hers now, one row down and in your eyeline all day. She's made herself useful and left the next move to you.
<br><br>
<<link "Get to work." $return>><</link>><h2>With $assistant.name</h2>
<<hookupGate>>
/* Establishing shot, idle entry only. Once an action is chosen, its own
narration (via assistantReact) replaces this. */
<<if $assistant.lastAction == "">>
<<if $assistant.tier == 0>>
She looks up as you cross to her desk and sets her work aside, because you're the reason she can afford to. Professional to the last inch, and waiting to see what you want.
<<elseif $assistant.tier == 1>>
She clocks you coming before you're halfway there and doesn't pretend otherwise. Nothing's been said out loud, but it colours the way she turns her chair toward you.
<<elseif $assistant.tier == 2>>
She meets your eye as you reach her, a private steadiness in it the open-plan floor knows nothing about. She lets you set the register.
<<else>>
She's half-anticipated the reason you've come over, the way she anticipates most things now, and gives you the small unbothered look that means she'll follow your lead.
<</if>>
<</if>>
<<assistantReact>>
<br>
''What do you do?''
<br>
/* CHECK IN — daily one-shot, flavour only, no influence. */
<<if not $assistant.spokeToday>>
<<link "Stop by her desk a moment.">>
<<set $assistant.spokeToday = true>>
<<set $assistant.lastAction = "talk">>
<<goto "Assistant Interact">>
<</link>>
<<else>>
//You've already found a reason to stop at her desk today.//
<</if>>
<br>
/* PROBE */
<<if $assistant.tier <= 1>>
<<if not $assistant.probedToday>>
<<link "Find a reason to get closer than the work needs." "Assistant Probe">><</link>>
<<else>>
//You've pushed your luck with her once today. Leave it there.//
<</if>>
<br>
<</if>>
/* OFFICE LOOP — tier 2+, end of the workday. See the hookupGate widget
for the full condition. */
<<if _hookupOffer>>
<<if _hookupReady>>
<<link "Tell her you'll need ten minutes of her time." "Assistant, Hookup">>
<<set $assistant.hookupSource = "office">>
<</link>>
<<else>>
//You could ask her for ten minutes. There is nothing left in you to do anything with them.//
<</if>>
<br>
<<elseif _hookupLocked>>
//She has drawn a line under it for the moment, and you are not going to be the one who tests it.//
<br>
<</if>>
<br>
<<link "Back to your desk." $return>><</link>><<set $assistant.probedToday = true>>
/* ── Scene catalogue: id + influence needed to unlock. Escalates by band. ── */
<<set _scenes = [
/* Band A — testing the water (gaze and word only, no contact) */
{ id: "hemglance", min: 0 },
{ id: "holdgaze", min: 0 },
{ id: "noticed", min: 0 },
{ id: "nickname", min: 0 },
{ id: "lookover", min: 0 },
/* Band B — small liberties (first contact; her body; personal territory) */
{ id: "skirt", min: 8 },
{ id: "sorority", min: 8 },
{ id: "reachpast", min: 8 },
{ id: "shoulder", min: 8 },
{ id: "blouse", min: 8 },
{ id: "waiting", min: 8 },
{ id: "overhear", min: 8 },
/* Band C — charged and complicit (both know; he enjoys the effect) */
{ id: "chin", min: 18 },
{ id: "lift", min: 18 },
{ id: "lowerback", min: 18 },
{ id: "selfie", min: 18 },
{ id: "manspread", min: 18 },
{ id: "coatcollar", min: 18 },
{ id: "pen", min: 18 },
{ id: "chair", min: 18 }
]>>
/* Eligible = unlocked by influence, minus the one shown last time. */
<<set _pool = _scenes.filter(s => $assistant.influence >= s.min && s.id !== $assistant.lastProbe)>>
<<if _pool.length === 0>>
<<set _pool = _scenes.filter(s => $assistant.influence >= s.min)>>
<</if>>
<<set _pick = _pool.random()>>
<<set _img = "images/characters/a/a_probe_" + _pick.id + ".jpeg">>
<<set $assistant.lastProbe = _pick.id>>
<<addInfluence 2>>
<h2>With $assistant.name</h2>
<<switch _pick.id>>
/* ── BAND A ── */
<<case "hemglance">>
You're mid-sentence about the ticket she's working when your eyes leave her face and go down her, unhurried, to the hem of her shirt. You let them rest there, then bring them back up as though nothing had moved. She has lost whatever she was about to say. You don't help her find it.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "holdgaze">>
The sentence ends and you keep looking at her, past the point where a normal person would have glanced away. She lasts longer than most would.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She's the one who breaks, eyes dropping back to her monitor, and you let her think she chose to.
<<case "noticed">>
She's been reading something on her screen with a small crease between her brows, and when she turns to you it's still there.
<br><br>
<<speech "Assistant" $assistant.name>>
Can I ask you something about the numbers on the Vantage contract, the ones that don't...
<</speech>>
<br>
She stops herself. You watch her decide it's a thread better left alone, and she folds her hands back in her lap.
<br><br>
<<speech "Assistant" $assistant.name>>
No. I won't ask.
<</speech>>
<<speech "You" $name>>
Good girl.
<</speech>>
<br>
She holds your eye, colour just touching her face, and doesn't tell you not to say it again.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "nickname">>
She's turned the assignment around faster than you expected and hands it back almost sheepish about how quick she was.
<br><br>
<<speech "You" $name>>
That was fast. Quickie. Think that's what I'm calling you now.
<</speech>>
<br>
You say it like it's already settled, already turning back to your own screen before she can decide whether to be insulted.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "lookover">>
She's telling you something about the sprint board and you lean back in your chair and look her over, once, slow, top to bottom, while she talks. You don't hide it and you don't hurry it. Then, when you've finished:
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "You" $name>>
Sorry. Say the last part again.
<</speech>>
<br>
She knows you weren't listening. Her chin comes up a fraction, and she starts the sentence over.
/* ── BAND B ── */
<<case "skirt">>
You fall into step a pace behind her on the way to the meeting room, and as the glass corridor narrows you say it quietly, just for her.
<br><br>
<<speech "You" $name>>
That's a good skirt on you. In case nobody's told you today.
<</speech>>
Then you keep walking, past her, like you'd remarked on the weather.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<speech "Assistant" $assistant.name>>
...Thank you?
<</speech>>
<br>
She says it to your back, not sure what she's supposed to do with it.
<<case "sorority">>
She's telling you a story about undergrad, some group project that fell apart, and she lets slip which sorority house she was in.
<br><br>
<<speech "You" $name>>
Oh, I knew girls from that house. They knew how to throw a party.
<</speech>>
<<speech "Assistant" $assistant.name>>
We had a reputation. Most of it well earned.
<</speech>>
<<speech "You" $name>>
So I guess you did the naked run? The one across the quad. I heard that was a house tradition.
<</speech>>
<br>
She goes a little pink, caught out that you'd know about it, caught worse that you'd ask.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
That is so far above your pay grade to be asking me.
<</speech>>
<br>
But she's smiling when she says it, and she doesn't say no.
<<case "reachpast">>
There's a folder on the far side of her desk and you don't ask her to pass it.
<br><br>
<<speech "You" $name>>
Just gonna grab this.
<</speech>>
<br>
You lean in across her to reach it, close, your arm going past her shoulder, your weight resting against her longer than reaching takes.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
You could've just asked me for it.
<</speech>>
<<speech "You" $name>>
I could've.
<</speech>>
<br>
You straighten up with the folder, in no rush about it, and she lets out a breath she'd been holding.
<<case "shoulder">>
You come around to read something over her shoulder, and your hand settles on it while you look, your thumb coming to rest at the edge of her collar. You're in no hurry to move it.
<br><br>
<<speech "You" $name>>
There. That line. You've indented it into the wrong block.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
Her posture shifts under your hand, but she doesn't shrug it off. She fixes the line with your thumb still at her collar, and says nothing about it.
<<case "blouse">>
She's wearing a fine pendant today, worn outside the knit, and it hangs low enough that it sits well down her front. You look at it, and keep looking after the pendant stops being the reason.
<br><br>
<<speech "You" $name>>
That's nice. What's the stone?
<</speech>>
<br>
You lean in for a better look.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
It's, um. Garnet. My grandmother's.
<</speech>>
<br>
Her hand comes up to it, half to show you and half to cover, and she's colouring.
<<case "waiting">>
Her desk is stacked, two review queues deep and a deployment on top of it.
<br><br>
<<speech "You" $name>>
That's a long night you've got in front of you. Some lucky guy waiting at home for you, or does he get used to the wait?
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
No one's waiting. Just this pile.
<</speech>>
<br>
A guarded little laugh, thrown that you'd ask, and she goes back to her screen a touch too quickly.
<<case "overhear">>
You catch the tail of something as you pass her desk, her voice low on the phone, saying she can't tonight, she's swamped. She hangs up when she sees you and doesn't explain it.
<br><br>
<<speech "You" $name>>
Cancelling plans for this place. It gets its hooks in fast.
<</speech>>
<<speech "Assistant" $assistant.name>>
It wasn't plans. It was my mother.
<</speech>>
<<speech "You" $name>>
Good. I'd hate to think I was keeping you from something.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She holds your look, then goes back to her screen without arguing with the "I".
/* ── BAND C ── */
<<case "chin">>
Her attention has drifted off the screen and onto you again, and this time you don't let it pass. You take her chin between your finger and thumb and turn her head, slow, back toward the monitor, and hold it there.
<br><br>
<<speech "You" $name>>
Eyes front. You're no use to me distracted.
<</speech>>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She lets you, her eyes on yours the whole way round. When you let go she turns back to the work too fast, ears burning, and pretends it didn't happen.
<<case "lift">>
The lift doors close with just the two of you inside, and you shift, once, so you're standing nearer than the empty car gives you any excuse for, your shoulder almost to hers. Two floors down, without looking at her:
<br><br>
<<speech "You" $name>>
You can relax. I don't bite in lifts.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
I'm perfectly relaxed.
<</speech>>
<br>
She says it to the floor numbers, cheeks warm, and doesn't move away. When the doors open she's out a little too quickly.
<<case "lowerback">>
The meeting empties out and the two of you are last to the door. You reach it a half-step ahead, hold it, and stand aside for her.
<br><br>
<<speech "You" $name>>
Ladies first.
<</speech>>
<br>
As she passes through you settle your hand at the small of her back to guide her, and you let it ride a little lower than a hand has any business being, and you keep it there a pace or two into the corridor before you let her go.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She keeps walking, spine very straight and colour rising. Your hand is gone before she's decided what to say about it.
<<case "selfie">>
You come around the corner and catch her mid-pose over her own phone, tongue out and face aimed at the camera for a friend. She kills it the second she clocks you, mortified, screen to her chest.
<br><br>
<<speech "Assistant" $assistant.name>>
That was not, that's for my sister, she sends me stupid ones and I have to...
<</speech>>
<<speech "You" $name>>
Send it to me.
<</speech>>
<<speech "Assistant" $assistant.name>>
I'm not sending you that.
<</speech>>
<<speech "You" $name>>
Send it to me.
<</speech>>
<br>
You hold her eye and leave her unsure whether that was an order.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
A second later your phone buzzes in your pocket. She's gone bright red and won't look at you, already turning back to her monitor, but she sent it.
<<set _selfieImg = "images/characters/a/a_probe_selfie_phone.jpeg">>
<<set _selfieCap = $assistant.name + " sent it. Day " + $gameDay + ".">>
<<set _newPic = not $phone.gallery.some(g => g.img === _selfieImg)>>
<<galleryAdd _selfieImg _selfieCap true>>
<<set $assistant.numberKnown = true>>
<<if _newPic>><br><span class="good">Saved to your gallery.</span><</if>>
<<case "manspread">>
You've pulled a chair over to go through the roadmap with her, except the couch has put her down lower than you, knees together, notebook balanced, looking up to where you sit. You don't correct the height difference. You settle back, spread out, one ankle over the other knee, and carry on talking through the quarter.
<br><br>
<<speech "You" $name>>
So the second milestone slips a week. That's fine. What doesn't slip is the demo.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She keeps her eyes very deliberately on your face and answers the point about the demo a half-beat late. You can see what it costs her. You let the pause after her answer run long, and she fills it too quickly with the next line item.
<<case "coatcollar">>
She's shrugging into her coat to leave and it's caught, bunched up at the back, and you step in behind her and free it, smoothing the collar down flat with both hands, taking longer over it than it needs.
<br><br>
<<speech "You" $name>>
There. Presentable.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She holds still for it, arms half in her sleeves, letting you settle the coat on her shoulders. When she thanks you it comes out too quiet, and she's out the door quickly.
<<case "pen">>
She's clicking a pen while she reads, that fast nervous double-click people do without knowing, and you reach over without a word and close your hand over hers to still it. You leave it there while you finish reading the line on her screen.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
Her hand stops under yours, and she doesn't pull it back. When you've finished you take your hand away and go on with the point you were making. She sets the pen down very carefully and doesn't pick it up again while you're standing there.
<<case "chair">>
You need her looking at the same screen as you and you don't ask her to come over. You take hold of the back of her wheeled chair, both hands, and you pull, and she comes with it, rolled clean across the floor from her desk to yours before she's decided whether that's allowed. You park her where you want her, at your shoulder, facing your monitor.
<br><br>
<<speech "You" $name>>
There. Now look at this properly.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She lets herself be moved. She sits where you've put her, close at your side, and looks at the screen because it's easier than looking at how near you've parked her.
<</switch>>
<br><br>
<<link "Back to your desk." $return>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<set $time = 8>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt1.jpeg">>
<h2>Helion Dynamics</h2>
The build ships at half past five, clean, after a day where nobody expected it to survive. Somebody says the word "drinks" and it moves through the team like a decision that was already made. Somewhere in town with a cocktail list and filament bulbs and prices that assume you're expensing it.
<br><br>
You thumb a text to $wife.name on the walk down.
<br>
<div class="chat">
<div class="bubble out">team landed the big one, going out for a drink with them, back later</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Go you! Have one for me. Love you 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">ok</div>
<<else>>
<div class="bubble in">Sure. Don't be too late.</div>
<</if>>
</div>
You pocket it and go in.
<br><br>
It's a good night. The kind the job owes you and rarely pays. $assistant.name is three seats down at first. Around the second round a chair opens up across from you and you take it, because from there you can see her, and the shop talk burns off and what's left is easier than shop talk has any right to be. She's funny when she isn't being careful. She lets herself be funny.
<br><br>
Coworkers peel off in ones and twos until it's the two of you on the pavement, and even that arrives without anyone arranging it. Different directions home. Same cold. You both stand at the curb thumbing for cars that are eight minutes out.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She's not dressed for standing still this late and it shows, arms crossed, a shiver going through her before she can stop it. Your jacket's off and around her shoulders before the thought's all the way finished. She doesn't shrug it off. She pulls it a little closer.
<br><br>
<<speech "Assistant" $assistant.name>>
You'll freeze.
<</speech>>
<<speech "You" $name>>
I'll live. Keep it till your car comes.
<</speech>>
<br>
She gets the first car. She shrugs the jacket off and hands it back and for a second you're both holding it, and then she leans in and kisses you once on the cheek, quick, warm, gone before you've filed what it was.
<br><br>
<<speech "Assistant" $assistant.name>>
Goodnight. Thanks for the warmth.
<</speech>>
<br>
Then she's folded into the back seat and the door's shut and the car's pulling into the dark, and you're standing on a cold street with a jacket that smells faintly of her and a reply from your wife still sitting in your pocket. You put the jacket back on. It's warmer than it was. You know the peck on the cheek won't be mentioned come next workday, but right now it's all you can think of.
<br><br>
<<link [[Head home.|Living Room]]>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<set $time = 8>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt2.jpeg">>
<h2>Helion Dynamics</h2>
A latency spike in a service you own decides to reveal itself at four in the afternoon, which means it isn't getting fixed by six. $assistant.name stays without being asked. She just doesn't leave, orders Thai to the floor on the company account, and sets up across your desk with the log tailing on her screen. The floor empties out around the two of you until it's your lamp and hers and a long dark room.
<br><br>
You text $wife.name that it's going to be a late one. She'll picture a room full of engineers, and you let her.
<br>
<div class="chat">
<div class="bubble out">chasing a production issue, going to be late, don't wait up</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Poor you. There's leftovers in the fridge if you're starving when you're back. Don't work too hard 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">Of course you are.</div>
<<else>>
<div class="bubble in">Ok. I'll leave the hall light on.</div>
<</if>>
</div>
You put the phone face down and get back to it.
<br><br>
You find the bug around eleven, together, her hand landing flat on the desk when the graph goes flat with it, a small triumphant "there." It's a good feeling and it isn't only the fix. You pack up. She pulls her coat on. You kill your lamp and start across the floor for the lifts, and halfway there the building decides no one's here.
<br><br>
The lights go out. All of them, in a wave, the motion sensors giving up on a floor that reads as empty. Full dark, thirty floors up, the city a grid of little lights through the glass and nothing else.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She startles at the sudden black and her hand shoots out and finds your arm, closes on it, and for a second she's up against your side, gripping, before her brain catches up to the fact that it's only the lights. She doesn't let go straight away. You can hear her breathe.
<br><br>
<<speech "Assistant" $assistant.name>>
...I can't see a thing.
<</speech>>
<<speech "You" $name>>
Hold on.
<</speech>>
<br>
You lift your free arm and wave it at the ceiling, and the sensor catches it, and the floor floods back to light all at once. She's right there, her hand still on your arm, blinking in the brightness, and then she registers where her hand is and how she got there and takes it back, one clean step out of your space, colour climbing her throat.
<br><br>
<<speech "Assistant" $assistant.name>>
Motion sensors. Right. Obviously.
<</speech>>
<br>
She's flustered and trying to iron it flat, and it's a good look on someone usually so composed. You let her carry it into the lift without helping her out of it. Neither of you mentions how long her hand stayed on your arm.
<br><br>
<<link [[Head home.|Living Room]]>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt3.jpeg">>
<h2>Helion Dynamics</h2>
It's a light day. The sprint's ahead of itself, your calendar's a graveyard of cancelled check-ins, and by two o'clock you've done everything today actually needs. So you take the half hour the job owes you and go down to the gym.
<br><br>
You're on the mats when $assistant.name comes in, and you both do a small stall, two people recalibrating from the office version of each other to this one. Training kit. Hair up. No lanyard, no deference in how she's standing. Just someone who clearly uses this place, in at the same odd hour as you.
<br><br>
<<speech "Assistant" $assistant.name>>
Don't tell me you actually work out. I had you down as all-desk.
<</speech>>
<<speech "You" $name>>
Light day. Thought I'd remember what my legs are for. You?
<</speech>>
<<speech "Assistant" $assistant.name>>
Every day I can. Spot me and I won't tell anyone you skipped an afternoon.
<</speech>>
<br>
So you train together, and down here neither of you is anyone's boss. You spot her on the bench, close over the bar while she presses, near enough to catch the heat coming off her and the shine already on her skin. She counts your reps back at you. You end up matching pace on the machines without deciding to, both of you breathing hard, both of you damp with it.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
There's a charge in it, and it isn't the office kind, the one you build on purpose. This one just exists, in the sweat and the proximity, in her flushed and gasping and laughing at something and not bothering to smooth it away. The frame's off and nobody took it off. You could reach for her right now and she knows it as well as you do. You don't, and the not-doing sits between you and says more than a hand ever would.
<br><br>
She racks the last set and drops back against the pad, chest heaving, hair stuck to her temple, and grins up at you wrecked and unguarded. The look holds a beat too long, and it's one of you, and you couldn't say which, who breaks it.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm going to go die in the shower now. Good session.
<</speech>>
<<speech "You" $name>>
Good session.
<</speech>>
<br>
She goes, and you sit a moment longer than you need to, heart still up. That was the closest yet, and it happened with neither of you pushing. Whatever comes next won't happen in this building.
<br><br>
<<link "Hit the showers." $return>><</link>><<set $assistant.lastTripOfferDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _yes = "\"I'm in. I'll take " + $assistant.name + " to run support.\"">>
<h2>Helion Dynamics</h2>
It's past four when Rick from the deployment side puts his knuckles on your doorframe instead of knocking. He doesn't sit down. He never does.
<br><br>
<<speech "Manager" "Rick">>
Something's on fire and it's out of state. You know the model. We don't just ship the client software, we put one of ours inside their building. Forward deployed. On site, making the stack do what sales promised it would when the load is real.
<</speech>>
<<speech "You" $name>>
I know the model. Who fell over?
<</speech>>
<<speech "Manager" "Rick">>
The engineer embedded on this one stopped working here about three hours ago. Doesn't matter why. What matters is the client expects somebody in that chair at nine tomorrow morning, and it has to be somebody senior enough that they don't feel downgraded. That's you.
<</speech>>
<br>
He tells you almost nothing about the client. Three letters, a subdivision of them that doesn't appear on any org chart you'd be cleared to read, the kind of buyer that pays for the locating work and never turns up in a case study. What they want tuned is the part of the platform that takes one fragment of a person and hands back the rest of them. Where. Who with. Where next.
<br><br>
<<speech "Manager" "Rick">>
Two days. Out tomorrow, back the day after. Paid on top of salary, there's a bonus attached for stepping in this fast, and it's the kind of client you want to have been useful to. Take one of your people to run support so you're not doing the grunt work on your own.
<</speech>>
<br>
One of your people. Only one name fits, one row down, doing a very convincing job of reading her screen and not your office.
<br><br>
You could tell him to find somebody else, and go home tonight to the life you actually built.
<br><br>
<<speech "Manager" "Rick">>
I need the answer now, not in the morning. Wheels up at eight.
<</speech>>
<br>
<<link _yes>>
<<set $assistant.tripPending = true>>
<<goto 'Assistant, Trip Offer Accept'>>
<</link>>
<br>
<<link "\"Give it to someone else this time.\"">>
<<goto 'Assistant, Trip Offer Decline'>>
<</link>><h2>Helion Dynamics</h2>
Rick is thumbing his phone and halfway down the corridor before you've finished the sentence. The posting is yours, and so is the second seat, and you named who was going in it without a flicker, like it was the obvious call.
<br><br>
You cross to her desk. She's already half turned, having heard her own name travel across the floor.
<br><br>
<<speech "You" $name>>
Pack a bag tonight. Out of state tomorrow, two days. A client I can't name until we're on the plane. You're running support. Wheels up at eight.
<</speech>>
<<speech "Assistant" $assistant.name>>
Two days. With you.
<</speech>>
<<speech "You" $name>>
With me. Problem?
<</speech>>
<<speech "Assistant" $assistant.name>>
No. I'll be at the gate at seven.
<</speech>>
<br>
She keeps her face flat. Then she writes the time on the back of her hand instead of putting it in her calendar, presses harder with the pen than she needs to, and goes back to her screen.
<br><br>
You've got a bag to pack and $wife.name to tell, and the whole way home you're working out how much of the truth is going into the version she gets.
<br><br>
<<link "Head home." "Assistant, Trip Pack">><</link>><h2>Helion Dynamics</h2>
<<speech "You" $name>>
Not this one. Timing's bad at home. Find somebody else.
<</speech>>
<<speech "Manager" "Rick">>
Your call. I'll strong-arm someone off the other team before six.
<</speech>>
<br>
He's scrolling for the next name before he's out of your doorway, entirely unbothered.
<br><br>
It was the right call, or at least the safe one.
<br><br>
$assistant.name watched it through the glass, watched Rick leave, and watched you not come out after him. When you look over she's already back on her screen. At five thirty she stops at your door on her way out, says goodnight the same way she does every other day, and doesn't ask.
<br><br>
<<link "Get back to it." $return>><</link>><<set $time = 8>>
<<moodShift -1>>
<<set _img = "images/characters/w/w_trip_pack.jpeg">>
<h2>Home</h2>
You get the bag down from the top of the wardrobe and start filling it, and $wife.name appears in the doorway with a dish towel still in her hands, reading the suitcase before she reads you.
<br><br>
<<speech "Wife" $wife.name>>
You're going somewhere.
<</speech>>
<<speech "You" $name>>
Out of state, first thing tomorrow. A client thing went sideways and they need somebody senior on site. Two days. Back the night after.
<</speech>>
<<speech "Wife" $wife.name>>
Tomorrow. As in you're telling me the night before.
<</speech>>
<<speech "You" $name>>
As in they told me this afternoon. It isn't the kind of ask you say no to. It's paid on top, there's a bonus, and it gets noticed by the people who decide the next rung.
<</speech>>
<br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She watches you fold a shirt badly and doesn't come over to fix it. The fight doesn't come either. She's tired, the money is real, and she's spent long enough on the other end of that company's phone calls to know the difference between a thing you chose and a thing that chose you.
<br><br>
<<speech "Wife" $wife.name>>
Fine. Go be important. Anyone else going, or is it just you flying the flag?
<</speech>>
<br>
It's an ordinary question. She asks it the way she'd ask if you wanted the last of the coffee, already half turned back toward the kitchen.
<br><br>
<<speech "You" $name>>
Just me. In and out.
<</speech>>
<br>
And there it is. Not a thing left carefully unsaid, not a technically true sentence with a shadow in it, which is how you've played it for months. A flat lie, told to your wife's face over a half packed bag. The worst of it is how little it costs you. It comes out smooth, it lands unremarkable, she nods and goes back to the dishes, and you carry on folding.
<br><br>
<<link "Finish packing." "Living Room">><</link>><<set $assistant.tripPending = false>>
<<set $assistant.numberKnown = true>>
/* The trip is company business. Credit the day as worked so workCheck
in PassageReady doesn't fine him for never clocking in, and fire
payday manually since clockIn is what normally triggers it. */
<<set $job.attendedToday = true>>
<<if $weekday <= 5>>
<<set $job.daysWorked += 1>>
<</if>>
<<if $weekday == 5>>
<<payday>>
<</if>>
<<set _img = "images/characters/a/a_trip_airport.jpeg">>
<h2>The Airport</h2>
You're out of the flat before it's fully light, bag by the door from last night, the coffee you made going cold before you reach the end of the street. From the terminal you thumb a last word to $wife.name, a small confirmation of the version of this she was given.
<br><br>
<div class="chat">
<div class="bubble out">at the gate now. see you tomorrow night x</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Safe flight. Bring me back something terrible from the airport 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">Fine. Text me when you land.</div>
<<else>>
<div class="bubble in">Ok. Let me know when you're there.</div>
<</if>>
</div>
<br>
You put the phone away as you spot her.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
$assistant.name is already at the gate, one neat bag, coffee in hand, dressed for a client and not for a holiday and knowing the difference. She finds you in the crowd before you reach her, and there's a beat where neither of you is anyone's boss, just two people who agreed to get on a plane together and are only now feeling the weight of the yes.
<br><br>
<<speech "Assistant" $assistant.name>>
Seven, like I said. Are you going to tell me who the mystery client is, or do I guess for the whole flight?
<</speech>>
<<speech "You" $name>>
On the plane. It's the kind of name you say quietly or not at all.
<</speech>>
<br>
You board together. Her shoulder settles against yours somewhere over the first state line and stays there, and the two of you talk low the whole way about a client you would both deny knowing the name of the moment you're back on the ground.
<br><br>
<<link "Land." "Assistant, Trip Client">><</link>><<set $job.performance += 3>>
<<set _img = "images/characters/a/a_trip_client.jpeg">>
<h2>The Client Site</h2>
The building has no name on it. No logo, no plaque, a lobby with two chairs nobody has ever sat in and a guard who checks your passport against a list he holds at an angle you can't read. You badge through three doors that each want a different credential and sign a form that is mostly a list of things you agree never to have seen. Then a windowless floor, strip lighting, thirty-odd people who don't give you their names.
<br><br>
They're a subdivision of an agency with three letters in its name, and those three letters aren't printed anywhere in this building. What they buy from Helion is location. Feed the platform one fragment of a person, a handset identifier, a face, a card transaction, a pattern of movement, and it reaches back across everything it has ever been fed, ad exchange bid streams, telco records, border systems, purchased broker data, and returns that person anywhere on the planet to within a few meters and a few minutes. At scale, continuously, on a population that was never asked and will never be told.
<br><br>
The engineering problem itself is clean, which is a mercy. Their deployment chokes the moment queries climb past about four thousand a minute: the matching stage falls behind, the queue grows, and somebody restarts the service twice a shift and calls it a workaround. By ten you're in the profiler with your sleeves up, and $assistant.name has taken everything that isn't the core fix off your desk. Their ticket queue. Their change window. The two of their engineers who keep wanting to walk you through a theory they already tried. She's fast, she's quiet, and she doesn't ask this room a single question it would rather she didn't. By lunch a defence industry lifer in a company fleece has clocked how good she is and started routing his questions through her instead of you.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Over a bad sandwich in an empty briefing room you teach her the other half of the job, the half that isn't on any statement of work.
<br><br>
<<speech "You" $name>>
You think we're here to fix their latency. We are. But that's the ticket, not the trip. While we're inside, you keep your eyes open. What else are they buying. What are they about to need and don't know yet. Who in that room has budget and who just has opinions. We fix the fire, and we go home with a map of where the next three fires are going to be. That's what forward deployed actually means.
<</speech>>
<<speech "Assistant" $assistant.name>>
So the fix is the cover.
<</speech>>
<<speech "You" $name>>
The fix is real. The fix is also how you get to stand in the room long enough to see what the room needs next. Both true at once. You'll find most things worth doing are.
<</speech>>
<br>
She takes that the way she takes everything you give her, filing it somewhere it won't be lost, and by the time you're back at the terminals she's watching the room the way you told her to and coming back with names.
<br><br>
The fix holds under load by four. The lifer shakes your hand, says the words "next fiscal" without committing to anything, and means more work is coming. You walk out through the three doors into actual daylight with a signed-off deliverable, a page of notes Helion will be glad to have, and an assistant who ran the whole day at your side like she'd been doing it for years.
<br><br>
<<speech "Assistant" $assistant.name>>
We were good in there.
<</speech>>
<<speech "You" $name>>
We were. Get changed. That earned a drink.
<</speech>>
<br>
<<link "Back to the hotel." "Assistant, Trip Bar">><</link>><<set _img = "images/characters/a/a_trip_bar.jpeg">>
<h2>The Hotel Bar</h2>
The hotel bar is nine tables and most of them empty, low amber light, a barman doing a crossword between orders. You're a long way from anybody who would recognise either of you.
<br><br>
She comes down in a dress, dark and simple, nothing she would ever wear onto your floor. She takes the stool beside you, closer than an empty room requires, and doesn't move it.
<br><br>
The first drink is the day coming down. You run the win back between you, who said what, the moment the graph flattened, the lifer's handshake. By the second drink the shop talk has burned off, and there's nothing on either calendar until a flight you're both not thinking about.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
There's no office here, no door that could open and no one two rows down. Her knee has been against yours since the first drink, and nobody in this state knows either of your names.
<br><br>
<<speech "Assistant" $assistant.name>>
You've been very careful with me. For months. I noticed.
<</speech>>
<<speech "You" $name>>
And?
<</speech>>
<<speech "Assistant" $assistant.name>>
And we're not in the office anymore.
<</speech>>
<br>
She says it evenly, looking at you, and leaves it there. Your call.
<br><br>
You reach up and turn her face to yours the way you've wanted to endless times, and this time you don't stop there. You kiss her. She comes into it without a second's hesitation, one hand closing in your shirt, months of not-doing going up all at once, and the barman finds something to do at the far end of the room.
<br><br>
When you break it her forehead's against yours and you're both breathing like the decision got made somewhere back before the second drink.
<br><br>
<<speech "You" $name>>
Upstairs.
<</speech>>
<<speech "Assistant" $assistant.name>>
Yes.
<</speech>>
<br>
<<link "Take her up." "Assistant, Trip Night">><</link>><<set $assistant.affair = true>>
<<set $assistant.tripTaken = true>>
<<set $assistant.tripPending = false>>
<<set $arousal = Math.max($arousal - 6, 0)>>
/* Consummation is the tier 1 to 2 crossing. Floor influence so the affair
opens cleanly at Entanglement regardless of exact pre-trip influence,
then let assistantCheck resolve the tier now that the cap is lifted. */
<<if $assistant.influence < 40>>
<<set $assistant.influence = 40>>
<</if>>
<<assistantCheck>>
<<set _img1 = "images/h/a/a_trip_room1.jpeg">>
<<set _img2 = "images/h/a/a_trip_room2.gif">>
<<set _img3 = "images/h/a/a_trip_room3.gif">>
<h2>The Hotel Room</h2>
The door isn't fully shut before she's against it and you're kissing her again, and the careful, deniable, month-long version of the two of you doesn't survive the walk from the lift. Your jacket goes on the floor. You find the zip at the back of the dress and take your time with it, and she doesn't help you and doesn't hurry you, just watches your face the whole way down. Then the dress is at her feet and she stands there in her white lingerie, clearly picked for the occasion, letting you look, the same disciplined composure she wears at her desk, turned entirely toward you now and waiting to be told what you want.
<br><br>
<div class="intro-image">
<img @src="_img1" width="100%">
</div>
You pull her with you as you crawl back on the bed, and begin to unbuckle your belt. She watches, then leans up on one elbow, reaches out, and frees your cock. Her fingers wrap around the shaft, stroking once before she opens her mouth and takes you in. The wet heat of her tongue slides along the underside as she sucks you deeper, cheeks hollowing, saliva glistening on your skin. She works you with steady rhythm, one hand pumping the base while her lips stretch around you, soft moans vibrating through your cock every time you push forward.
<br><br>
<div class="intro-image">
<img @src="_img2" width="100%">
</div>
She pulls off, spit trailing from her lip to your cock. You yank the lingerie down her body, baring her breasts and hips. Climbing between her spread thighs, you thrust deep into her pussy. You fuck her hard in missionary, hips slamming, bed creaking. Her legs wrap tight around you, heels digging into your ass as you pound her. She moans your name, nails clawing your back, tits bouncing. You kiss her, tongues sliding while your cock drives in. Her pussy squeezes around you. You stay buried as you cum, pumping thick ropes inside her until you're both panting.
<br><br>
<div class="intro-image">
<img @src="_img3" width="100%">
</div>
Afterward she doesn't do the thing you half expected, the retreat, the ironing flat. She lies against you in the dark with one hand on your chest, unhurried, the dress and lingerie still wherever they fell, and neither of you says the enormous thing that just happened.
<br><br>
<<speech "Assistant" $assistant.name>>
Well. That's that, then.
<</speech>>
<<speech "You" $name>>
That's that.
<</speech>>
<br>
You sleep with her there, and it's the easiest you've slept in a long time.
<br><br>
<<link "Morning." "Assistant, Trip Return">><</link>>/* Advance the second (away) night manually. This deliberately skips the
home wife-upkeep/suspicion pass for the trip night, since he isn't home;
the next real Sleep runs a full dayshift and resumes normal cadence.
The weekly checks that live in dayshift are called explicitly below,
because skipping those is an exploit, not a design choice. */
<<set $gameDay += 1>>
<<set $weekday += 1>>
<<if $weekday > 7>><<set $weekday = 1>><</if>>
<<set $job.attendedToday = true>>
<<if $weekday <= 5>>
<<set $job.daysWorked += 1>>
<</if>>
<<if $weekday == 5>>
<<payday>>
<</if>>
<<if $weekday == 7>>
<<rentCheck>>
<</if>>
<<set $time = 6>>
<<set _bonus = 750>>
<<set $money += _bonus>>
<h2>The Flight Home</h2>
Morning is coffee neither of you needed, a checkout, a cab, the airport in reverse. In daylight you're careful again, and she matches it without being asked. But somewhere over the same state line where her shoulder found yours on the way out, she lets the back of her hand rest against yours on the armrest, out of sight, and leaves it there the whole descent.
<br><br>
<<speech "Assistant" $assistant.name>>
Back in the building we're exactly what we were. Nothing changes on that floor.
<</speech>>
<<speech "You" $name>>
Nothing changes on that floor.
<</speech>>
<<speech "Assistant" $assistant.name>>
Off it is a different question, and I'm not going to sit here and pretend this was the trip and now it's over. Next time somebody needs a body on a plane, put my name down.
<</speech>>
<<speech "You" $name>>
It'll be down before they ask.
<</speech>>
<br>
You land as the light's going. She peels off toward her own life with a look over her shoulder, and you get a cab home with a bonus in your account and a client that'll be back for more.
<br><br>
<span class="good">Special assignment complete. Bonus: $<<print _bonus>>. Work performance improved.</span>
<br>
<span class="warning">Something has started with $assistant.name that can't be undone.</span>
<br><br>
<<link "Go home." "Living Room">><</link>>/* Location roll. The office loop can go anywhere in the building. Coming
off the gym encounter, they are already downstairs and half changed, so
the pool is restricted to the three rooms down there.
Conditions test for the gym sources, not for "office", so an empty
hookupSource on a migrated save degrades to the office behaviour. */
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<set _locPool = ["gym", "shower", "sauna"]>>
<<else>>
<<set _locPool = ["bathroom", "office", "gym", "shower", "sauna", "carpark"]>>
<</if>>
<<set _locPool = _locPool.filter(l => l !== $assistant.lastHookupLoc)>>
<<set $assistant.lastHookupLoc = _locPool.random()>>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<switch $assistant.lastHookupLoc>>
<<case "gym">>
She is off the arc trainer before you have finished crossing the floor, and she takes you into the corner by the free weights where two mirrored walls meet. It is the nearest thing the room has to a blind spot, and it isn't much of one. The lights are on a motion timer that gives you eleven minutes at a stretch. She checks the door once, and then stops caring about the door.
<<case "shower">>
She tips her head toward the changing rooms and goes, and you give it a minute you spend entirely looking at the door she went through. Round the tiled corner one shower is already running, which explains itself to anyone who wanders in, in a way that the two of you would not. She doesn't fold anything this time. She is already in her kit, and her kit is already wet, and she pulls you in under the water still wearing most of it.
<<case "sauna">>
She nods at the door at the end of the changing rooms and goes through it without waiting to see whether you follow. Solid wood, no window in it, a brass slider on the outside that reads IN USE. Inside it is already up to temperature, because she put it on before she got on the arc trainer, which means she had decided how this was going before she ever said your name.
<</switch>>
<<else>>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
She goes first, and you count to thirty at your desk like an idiot before you follow, which is the part that makes you feel most like a man having an affair. The single-occupancy toilet at the far end of the floor, past the vending machines, a lock that reads OCCUPIED in red from twenty feet. She has the door open two inches before you knock.
<<case "office">>
One of the glass boxes along the north wall, blinds half drawn on a room nobody has been assigned since the reshuffle. The monitors are still on. Through the gaps in the slats you can see nine or ten desks still occupied, heads down, a floor that is nearly empty and not actually empty, and she picks this room because half-drawn blinds look deliberate and fully drawn blinds look like something.
<<case "gym">>
She says to meet you in the gym for a pretend late-day workout. Keycard access, lights on a motion timer that gives you eleven minutes at a stretch before the room decides it is empty. Mirrors on every wall and no corner that is not visible from some other corner. She walks in ahead of you with a towel over her arm like a woman who came here to use it, and she is already changed, hair up, because she thought about the walk back before you thought about any of it.
<<case "shower">>
Through the gym changing room and round the tiled corner, where the sound of a single running shower explains itself to anyone who wanders in and the sight of the two of you would not. The most private place in the building by line of sight, and the loudest by acoustics. She turns the water on before she touches you, for the noise and for the alibi both, and undresses like she is on a clock, folding, because she is going to have to put all of it back on.
<<case "sauna">>
The sauna off the changing rooms, which the building put in because a consultant said the word wellbeing, and which nobody uses because using it means putting your name on the sheet by the door. Solid wooden door, no window in it, a little brass slider on the outside that reads IN USE to anyone who thinks to look, and nobody does. She goes in ahead of you and has the towel off the rail before the door has swung shut. The heat takes the air out of the room and most of the sense out of you along with it.
<<case "carpark">>
She takes the keys to one of the company cars off the board, signs out the mid-range saloon nobody books with purposefully illegible handwriting, and is already in the second row of the underground level before you get down there. The car park is strip-lit and half empty and echoes. The risk here is the specific and stupid one: that somebody needs this exact car this evening, and that their name is on a sheet upstairs next to hers.
<</switch>>
<</if>>
<br><br>
<<link "Put her on her knees.">>
<<set $assistant.lastHookupAct = "oral">>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br>
<<link "Have her properly.">>
<<set $assistant.lastHookupAct = "sex">>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br>
<<link "Leave it to her.">>
/* Her call, weighted 3:1 away from whatever she got last time, so she
doesn't pick the same thing twice running. Resolved before the write. */
<<set _actPool = ["oral", "sex"]>>
<<set _other = _actPool.filter(a => a !== $assistant.lastHookupAct)>>
<<if _other.length > 0 and random(1, 100) <= 75>>
<<set $assistant.lastHookupAct = _other[0]>>
<<else>>
<<set $assistant.lastHookupAct = _actPool.random()>>
<</if>>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br><br>
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<link "Think better of it and get back to your session." "Helion Gym, Assistant Refused">><</link>>
<<else>>
<<link "Think better of it and go back to your desk." $return>><</link>>
<</if>>/* SHARED COSTS. Everything above the interruption roll is paid whether or
not anything happens: the walk there and back happened either way.
Near Miss therefore carries only its own deltas. */
<<set $assistant.hookupToday = true>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>> /* sneaking around; no exemption */
<<set $assistant.lastHookupDay = $gameDay>>
/* Interruption roll. Reads heat BEFORE this act's gain, which is what the
pacing maths in the spec assumes. Ceiling 60.
NOTE: goto does NOT halt the rest of the passage in SugarCube, so the
entire resolution must sit inside the else branch. Do not flatten this. */
<<set _risk = Math.min(60, $assistant.heat * 7)>>
<<if random(1, 100) <= _risk>>
<<goto "Assistant, Hookup Near Miss">>
<<else>>
<<sexEnergy 1>> /* the act; waived at fitness 3+ */
/* Resolution. Only reached on a clean roll. */
<<set $assistant.hookupCount++>>
<<if $assistant.lastHookupAct is "oral">>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<addInfluence 1>>
<<set $assistant.heat = Math.min($assistant.heat + 1, 10)>>
<<else>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<addInfluence 2>>
<<set $assistant.heat = Math.min($assistant.heat + 2, 10)>>
<</if>>
<<addSuspicion 1>>
/* Location tokens match the asset filenames, so no image branching. */
<<set _img = "images/h/a/a_hookup_" + $assistant.lastHookupLoc + ($assistant.lastHookupAct is "oral" ? "_bj" : "_h") + ".gif">>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
<<if $assistant.lastHookupAct is "oral">>
The lock turns and the strip light hums and she puts a finger against your mouth before she goes down, which is instruction, not affection. Someone is at the sinks outside the whole time, running water, taking a phone call about a delivery slot. $assistant.name drops to her knees, eyes locked on yours, and takes your cock into her mouth. She moves slowly, deliberately, savoring the risk. Every time the stranger outside pauses, she pushes deeper, forcing you to stay quiet. Your palm flattens against the cold tile. When the water finally stops, she swallows you to the root and works her throat until you pulse down it. She rises without a word, wipes the corner of her mouth, and smooths her hair twice in the mirror.
<<else>>
She turns to the sink herself, hikes her skirt, and looks at you in the mirror rather than over her shoulder, so the whole thing happens face to face through two feet of glass. It is slow because it has to be. Every time the outer door opens she reaches back, palm flat on your hip, freezing you mid-stroke. The pauses stretch the ache until you can barely breathe. When the coast is clear again she nods once and you drive harder, watching her bite her own wrist to stay silent. Her forehead presses to the mirror, fingers clamped over her mouth, and the sight of her fighting to stay quiet pushes you over. You empty yourself deep inside her while she shudders around you, both of you staring at each other’s reflection.
<</if>>
<<case "office">>
<<if $assistant.lastHookupAct is "oral">>
The office door clicks shut and she guides you into the chair with a single firm push. Your eyes stay fixed on the screen and floor pretending to work as her fingers work your belt open. She takes your cock into her mouth in one smooth motion, sucking steadily while footsteps pass the glass wall. Every time someone walks by she slows her rhythm, holding you deep until the footsteps fade. When the hallway finally empties she finishes you with quick, tight strokes of her tongue until you pulse down her throat. She swallows, wipes her lips on the inside of your thigh, and crawls out from under the desk without a word.
<<else>>
She sweeps everything off the desk in one motion, the same way she clears your calendar. Then she hops up, plants her palms behind her, and spreads her legs. You step between them and push your cock straight into her pussy. She watches your face while you thrust, as you watch the closed blinds over her shoulder. The desk inches forward with every stroke. When it scrapes the floor you both freeze, listen, then keep going harder. Her breath stays locked behind clenched teeth. When you come she clamps around you, milking every spurt while the desk rocks beneath her. Afterwards she slides off, straightens the stapler and the two dead pens exactly where they belong, and smooths her skirt like nothing happened.
<</if>>
<<case "gym">>
<<if $assistant.lastHookupAct is "oral">>
She takes you into the corner by the free weights, where two mirrored walls meet, and goes down in front of you with her ponytail already coming loose. You are both in training kit. You stand there with nothing to grab but her ponytail, while she works you steadily, her lips sliding up and down your shaft. The mirrors show you everything from three angles at once: her ponytail swinging, your cock disappearing between her lips, the way her shoulders move with each stroke. She catches you looking at the reflections and turns her head just enough to check the view herself. Satisfied, she goes back to sucking you deeper, tongue pressing flat against the underside, until you fill her mouth with your cum.
<<else>>
She pulls one of the exercise balls out from under the rack, folds herself forward over it with her forearms on the floor and her hair falling out of the tie, and looks back at you once to make sure you have understood. You step in behind her, shove your shorts down, and push your cock straight into her pussy. The ball gives with every thrust, rolling forward an inch then back, so nothing stays steady. Your grip on her hips tightens as you drive into her. The mirrors catch every angle: her tits swinging under her tank, your cock sliding in and out of her, the way her mouth falls open. When you cum she pushes back hard against you, taking every spurt deep. Afterwards she straightens up, rolls the ball back under the rack, wipes the mats with a towel, and drops the towel into her bag like it’s just another piece of equipment.
<</if>>
<<case "shower">>
<<if $assistant.lastHookupAct is "oral">>
The steam fills the narrow stall fast, thick and hot, clinging to the tiles. She’s already naked when she drops to her knees, water streaming over her shoulders and down her face. She doesn’t wipe it away. She just opens her mouth and takes your cock straight in, lips sealing tight around the head before she slides down the shaft. Your back hits the wall. One hand finds her wet hair, fingers threading through the soaked strands, while the other stays flat on the tile for balance. Your grip tightens in her hair. She doesn’t slow. She keeps the rhythm, water cascading over both of you, her knees shifting on the slick floor. When you cum she stays locked on, throat working as she swallows every pulse, water still pouring down her face and over your cock.
<<else>>
She braces on the slide bar with both hands and bends, and you take her from behind standing, the water coming down over both of your backs. You hold her hips and fuck her hard, water streaming over both your backs and down where your bodies meet. Her grip keeps sliding, fingers tightening and loosening on the bar as each thrust rocks her forward. The only sounds are skin on skin, water hitting tile, and the rough breaths you both give up. When you cum you stay buried deep, pulsing inside her while she pushes back to take every drop. Afterwards she straightens slowly, water still running. She grabs two towels from the hook, hands you one without a word, then starts drying herself off like it’s just another part of the routine.
<</if>>
<<case "sauna">>
<<if $assistant.lastHookupAct is "oral">>
The planks radiate heat that presses against your skin the moment you sit. She drops to her knees between your spread thighs, towel already damp beneath her. Sweat beads on her upper lip as she leans in and takes your cock into her mouth without hesitation. Her tongue slides along the underside while her lips seal tight, the wet heat of her mouth contrasting the dry furnace around you. Every slow bob of her head sends another drop of sweat rolling down your chest. The stones hiss when water hits them, steam rising in thick waves that cling to both of you. She keeps her rhythm steady, cheeks hollowing, throat working, until your fingers tighten in her hair and you pulse across her tongue. She swallows, sits back on her heels, and wipes her mouth with the back of her wrist before the next wave of heat forces her to breathe shallow.
<<else>>
She folds a towel twice and drapes it over the top bench, then leans forward onto her forearms, ass lifted. The position leaves her completely open. You step in behind her, grip her hips, and push inside in one steady thrust. Her pussy grips you hot and slick, the temperature inside the sauna making every movement feel heavier. The bench creaks under the force of your hips meeting her ass. Sweat runs down her spine and drips from your chest onto her lower back. She stays low, forehead resting on her folded arms, pushing back to meet each stroke. The slap of skin echoes off the wooden walls. You drive deeper until your grip tightens and you cum inside her, pulse after pulse, her walls fluttering around you while the heat keeps rising around your joined bodies.
<</if>>
<<case "carpark">>
<<if $assistant.lastHookupAct is "oral">>
The back seat of a company car smells of upholstery cleaner and other people's afternoons, and she goes down across the seat with her feet still in the footwell and one shoe off. Her mouth closes around you, wet and hot, tongue working in steady strokes while the car stays sealed around the two of you. Every quiet sound stays trapped inside: the soft suck of her lips, the faint creak of upholstery, the low hum of her throat when you push deeper. She keeps going until your hand tightens in her hair and you finish down her throat, swallowing without lifting her head. Only after the last pulse does she sit back, wiping her mouth with the back of her hand while another car reverses somewhere behind the tinted glass.
<<else>>
She climbs onto your lap in the locked back seat, skirt already shoved up around her hips. The roof forces her to keep her head tilted as she reaches down, frees your cock, and sinks onto it in one smooth motion. The car rocks on its suspension. She sets the pace herself, quick, deliberate rolls of her hips that make the leather creak. Her pussy grips you tight and wet, every rise and fall accompanied by the soft slap of skin. Headlights sweep the ceiling twice; she never breaks rhythm. Her breath stays even, forehead nearly touching yours, until your grip on her waist tightens and you cum deep inside her. She stays seated, pulsing around you, letting every throb fill her before she finally eases off and cracks the door open.
<</if>>
<</switch>>
<br><br>
<div class="intro-image">
<img @src="_img" width="100%">
</div>
<<if $assistant.hookupSource is "gymAM">>
She goes first. You give it five minutes, then use the showers properly, and take the stairs up with wet hair and a pulse that has nothing to do with a session you never actually did. The floor is filling up as you come through the doors. What a way to start your day.
<br><br>
<<link [[Head up to the office floor.|Helion Dynamics]]>><</link>>
<<else>>
She goes up first. You give it five minutes, then take the stairs down instead of up, and leave the last hour of the day to whoever is still at their desk.
<br><br>
<span class="warning">You check your watch on the way down. You are getting home late.</span>
<br><br>
<<link [[Head home.|Living Room]]>><</link>>
<</if>>
<</if>><<set $assistant.heat = Math.min($assistant.heat + 3, 10)>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _img = "images/h/a/a_hookup_nearmiss_" + $assistant.lastHookupLoc + ".jpeg">>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
The handle goes down while her hands are still on your belt. Not a try, a proper turn, someone who expects a door to open. It holds. Then the knock, twice, and a voice you know from the third row asking if anyone is in there. She is off you and flat against the door before you have understood the sound, one finger up against her lips, the rest of her entirely still. You say yes, sorry, one minute. He says take your time and then does not go away. You listen to him not going away for a long time.
<<case "office">>
A light comes on in the corridor and there is a man from facilities working down the north wall room by room with a clipboard, and there are two rooms between him and this one. She is off the desk with the blazer up against her chest before you have finished turning your head, and by the time he reaches the glass she is on the far side of the room with her back to it, and you are looking at a monitor that is showing nothing you could describe afterwards. He checks the room, marks his sheet and moves on. Neither of you moves for a while after that.
<<case "gym">>
The reader chirps on the outer door and the lights come up to full in the same second, the room announcing you both. She is off the bench and down behind the weight rack before it has finished opening, pulling her top straight, and you are alone in the middle of the floor doing an impression of a man between sets. It is someone from finance, bag over one shoulder, headphones in, and he goes to the mats at the far end without once looking over. She stays down there a full minute longer than she needs to.
<<case "shower">>
The changing room door bangs and a trolley comes through it, wheels loud on the tile. She kills the water with the flat of her hand, one movement, no fumbling, and has a towel round her and her back to the wall before you have found yours. The trolley stops on the other side of the tiled corner. Something metal gets set down. He hums a bar of something, drags a bin across the floor, and takes an amount of time over it that stops being funny after the first minute. She does not move the whole time, and she does not stop working out how this ends.
<<case "sauna">>
The brass slider scrapes across on the outside, and then the door opens anyway, because the slider means nothing to a man carrying a bucket. She is off you and along the top bench with the towel round her and her back against the cedar before the cold air has finished coming in. It is maintenance, checking the stones and the water level, and he does it slowly, the way a man does a job when he thinks he is the only one in the building who cares whether it gets done. He says it is a warm one today. She agrees that it is. He takes his time about the door on the way out.
<<case "carpark">>
Headlights come round the pillar and stop, engine running, and hold there. She is up off you and out of the car before you have finished turning your head, and by the time you are upright she is between two parked cars with her shoes in one hand and her blouse held shut in the other, looking back at you rather than at the car. It is somebody signing out a pool vehicle two bays down, taking three attempts at the reverse. She waits it out barefoot on the concrete. She does not come back.
<</switch>>
<br><br>
<div class="char-scene">
<img @src="_img" class="char-img">
</div>
<<if $assistant.hookupSource is "gymAM">>
Neither of you picks it back up, and she is the one who says so, which spares you having to. She goes first. You shower, and dress, and take the stairs up, and start the day not quite satisfied.
<br><br>
<<link [[Head up to the office floor.|Helion Dynamics]]>><</link>>
<<else>>
Neither of you picks it back up, and she is the one who says so, which spares you having to. She goes up first. You give it five minutes and take the stairs down, and there is nothing waiting for you at your desk anyway except a dark monitor and the hour you have already spent. Whatever she was going to give you tonight, you are not getting it.
<br><br>
<span class="warning">You check your watch on the way down. You are getting home late.</span>
<br><br>
<<link [[Head home.|Living Room]]>><</link>>
<</if>>/* Fired by goto from Helion Dynamics, Triggers when coolOffPending is above
zero. Sets the lockout from TODAY, so a second discovery during a live
lockout restarts the clock rather than extending it. Clears pending so it
fires exactly once.
Costs nothing but calendar days: influence, heat and tier are untouched
on purpose. The punishment already happened at home. */
<<set _ultimatum = ($assistant.coolOffPending >= 7)>>
<<set $assistant.coolOffUntil = $gameDay + $assistant.coolOffPending>>
<<set $assistant.coolOffPending = 0>>
<h2>With $assistant.name</h2>
<<if _ultimatum>>
She's at your desk before you've got your coat off, which she never does, and she doesn't sit down.
<br><br>
<<speech "Assistant" $assistant.name>>
You look like a man who got told something last night.
<</speech>>
<<speech "You" $name>>
It's fine.
<</speech>>
<<speech "Assistant" $assistant.name>>
It isn't, and I'd rather you didn't work quite so hard at it. You've been careless somewhere, and I'd like to know it wasn't here.
<</speech>>
<br>
You start to say something about it being handled. She lets you get about four words in.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm not asking. I'm telling you what happens now. Nothing happens now. Not this week, not next week. You come in, you give me work, I do it, and when someone looks at the two of us there is nothing there to find.
<</speech>>
<<speech "You" $name>>
And after that?
<</speech>>
<<speech "Assistant" $assistant.name>>
After that we'll see what's left standing.
<</speech>>
<br>
She says it without heat, which is worse than if she'd said it with some. Then she takes the folder off your desk that she came for in the first place, because she was always going to have a reason to be standing here, and goes back to her row.
<br><br>
<<else>>
She's already looking at you when you come round the end of the row, and she's worked it out somewhere between the lift and your desk, the way she works most things out.
<br><br>
<<speech "Assistant" $assistant.name>>
Something's happened at home.
<</speech>>
<<speech "You" $name>>
I didn't say anything.
<</speech>>
<<speech "Assistant" $assistant.name>>
No. You didn't.
<</speech>>
<br>
She lets that sit, and doesn't ask what, and you understand she isn't going to.
<br><br>
<<speech "Assistant" $assistant.name>>
We're going to leave it alone for a bit. Give it to the end of next week and see how things look then.
<</speech>>
<<speech "You" $name>>
You don't have to do that.
<</speech>>
<<speech "Assistant" $assistant.name>>
I know. I'm doing it anyway. Whatever's going on over there, it doesn't need me in the middle of it this week.
<</speech>>
<br>
Then she goes back to her desk, and by half past ten she's handed you two things ahead of schedule and called you by your title in front of the room, and the floor has no idea anything was decided at all.
<br><br>
<</if>>
<span class="warning">She's put a stop to it for the time being.</span>
<br><br>
<<link [[Get on with your day.|Helion Dynamics]]>><</link>><h2>Helion Dynamics</h2>
A proper gym, better kitted out than anything you'd pay for. Racks along the mirrored wall, a row of treadmills facing the glass, mats and free weights at the far end. Mirrors on every wall, and no corner that isn't visible from some other corner. A vinyl decal above the water fountain reads STRONG BODY. STRONG MIND. ALWAYS BE CLOSING. Somebody in Comms got paid for that. A chest cooler by the door is restocked every morning with free protein shakes and electrolyte water. Somebody worked out that a man who trains here at seven in the morning is a man who is ready to clock in soon after.
<<switch $time>>
<<case 0>>Early morning. Two of the treadmills are already going. Nobody talks at this hour.
<<case 1>>Late morning. The room is empty except for someone working through a program off their phone.
<<case 2>>Midday. The lunch hour crowd, lanyards piled on the bench by the door.
<<case 3>>Early afternoon. Quiet. Most people are at their desks.
<<case 4>>Late afternoon, and the after-work rush is starting. Every treadmill is taken.
<<case 5>>Early evening. Busy, warm, the mirrors fogging at the edges.
<<case 6>>Evening. The last few are finishing up, towels over shoulders, heading for the changing rooms.
<<case 7>>The place is locked for the night.
<<case 8>>The place is locked for the night.
<</switch>>
<br><br>
<<if $time >= 7>>
//The gym is closed.//
<<elseif $arousal >= 8>>
//You can't focus on training while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < 1>>
//You're too exhausted to train right now.//
<<else>>
<<link "Get a workout.">>
/* Her encounter is rolled first */
<<set _herEligible =
$assistant.affair
and $assistant.tier >= 2
and $weekday <= 5
and not $assistant.hookupToday
and $gameDay >= $assistant.coolOffUntil
and ($gameDay - $assistant.lastGymDay) >= 3
and (($time == 0 and not $job.attendedToday) or ($time >= 4 and $time <= 5))>>
<<if _herEligible and random(1, 100) <= 40>>
<<set $assistant.lastGymDay = $gameDay>>
<<goto "Helion Gym, Assistant">>
<<else>>
<<payWorkout 1 1 2>>
<<set $helionGym.workouts += 1>>
<<if not $helionGym.peepFound and $helionGym.workouts >= 5>>
<<goto "Helion Gym, Vent Found">>
<<elseif random(1, 100) <= 40>>
<<goto "Helion Gym, Sighting">>
<<else>>
<<goto $return>>
<</if>>
<</if>>
<</link>>
<</if>>
<br><br>
/* Vent */
<<if $helionGym.peepFound and $time <= 6>>
<<if $helionGym.peepToday>>
//You've already had your look today.//
<<else>>
<<link "Slip into the changing room and check the vent." "Helion Gym, Vent">><</link>>
<</if>>
<br><br>
<</if>>
<<link [[Back to the office floor.|Helion Dynamics]]>><</link>><h2>Helion Dynamics</h2>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _gymImg = "images/characters/npc/gym" + random(1, 8) + ".gif">>
<div class="intro-image">
<img @src="_gymImg" width="100%">
</div>
<<set _lines = [
"You catch it in the mirrors, which is the trouble with this room. Something you weren't looking for and can't now unsee, held a second too long in the glass before you make yourself look away. You get through the rest of the set on autopilot.",
"It happens at the edge of your vision partway through, and you lose the count entirely. By the time you've found it again you've watched longer than you meant to, and somehow your eyes just keep finding her in the mirrors.",
"Close enough to hear the effort of it, and you spend the whole rest of your session aware of exactly where in the room they are. The work gets done. Your head doesn't come back with you."
]>>
<<= _lines.random()>>
<br><br>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Finish up and get changed." $return>><</link>><h2>Helion Dynamics</h2>
<<set _img = "images/h/a/a_gym_flash.gif">>
You start alone. The room is yours for the first stretch of it, nothing in it but the hum of the air handling and your own count, and you get into the rhythm without thinking about much at all.
<br><br>
Somewhere behind you the door goes. A bag set down, the beep of a console waking up, and then the arc trainer at the far end starting its slow mechanical sweep and settling into a pace. You don't turn round. Somebody else is in, that's all.
<br><br>
Then, over the top of it:
<br><br>
<<speech "Assistant" $assistant.name>>
Having a good workout, $name?
<</speech>>
<br>
You know the voice before you've placed the room, and you look over.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
<br>
$assistant.name is on the arc trainer with her hair up and her feet still moving, watching you, nowhere near as out of breath as she ought to be. She has the hem of her training top caught up between her teeth, holding it there, and she keeps it there while she looks at you, and she doesn't break stride once.
<br><br>
She lets it go eventually. The hem drops. She raises her eyebrows at you like she is still waiting on the answer.
<br><br>
<<link "Leave the rack and go over.">>
<<if $time == 0 and not $job.attendedToday>>
<<set $assistant.hookupSource = "gymAM">>
<<else>>
<<set $assistant.hookupSource = "gym">>
<</if>>
<<goto "Assistant, Hookup">>
<</link>>
<br>
<<link "Tempting. You turn back to the rack anyway." "Helion Gym, Assistant Refused">><</link>><h2>Helion Dynamics</h2>
<<payWorkout 1 1 2>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
She holds the look a second longer, then shrugs with one shoulder and goes back to her own session as though none of it happened. She finishes ahead of you, takes her towel, and goes out without saying anything on the way, and the door clicks shut behind her.
<br><br>
You do the session. You do it properly, the numbers are the numbers, and it takes roughly four times the concentration it should. The mirrors are no help either. Whatever you just turned down is coming up the stairs with you, and it isn't going anywhere for a while.
<br><br>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Hit the showers." $return>><</link>><div class="title-screen">
/* Should probably be revised to 3:1 ratio */
<div class="title-banner">
<img src="images/logo/earnit_banner.jpeg" alt="Earn It">
</div>
<div class="title-blurb">
An adult life sim about hitting bottom and the messy climb back. Rebuild your marriage or wreck it, climb at a firm that won't say who it serves, and chase every temptation in town.
<br><br>
<i>You earn it, or you don't.</i>
</div>
<div class="title-buttons">
<div class="tb primary">
<<link "New Game" "Intro 1">><</link>>
</div>
<div class="tb">
<<link "Load Game">><<run UI.saves()>><</link>>
</div>
<div class="tb">
<<link `"Changelog (v" + setup.gameVersion + ")"` "Version">>
<<set $return to "Start Menu">>
<</link>>
</div>
</div>
<div class="title-support">
If you like the game and want to support its development, you can do that at <<link "Patreon">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>>.
</div>
<div class="title-legal">
<div class="title-adult">Adults only. 18+</div>
Disclaimers: Contains explicit sexual content and adult themes. All characters depicted are eighteen years of age or older, and entirely fictional. Saves live in your browser. Clearing browser data or using private browsing will delete them. Export your saves to disk before moving to a new version.
</div>
</div>/* COSTUME LIST. Shared by Eastgate Pawnbroker, Wife Interact and Wife Special.
id - image stem: w_cos_<id>.jpeg, w_cos_<id>_bj.gif, w_cos_<id>_h.gif
flag - $items key, or "" if she already owns it
label - descriptive phrase used at Sal's
name - short name used in Wife Special
price - Sal's price (ignored when flag is "")
patter - Sal's line
cost - favour spent for one night in it */
<<widget "costumeList">>
<<set _costumes = [
{
id: "che",
flag: "",
label: "her old cheerleader uniform",
name: "Cheerleader, her old uniform",
price: 0,
patter: "",
cost: 5
},
{
id: "ela",
flag: "cosElastigirl",
label: "the red and black superhero suit",
name: "Elastigirl, the red suit",
price: 180,
patter: "That stretchy, limber superheroine. Woman who sold it swore blind it was worn on set. I said love, that incredible film's a cartoon, there is no set. I gave her forty for it and she left incredibly happy.",
cost: 5
},
{
id: "har",
flag: "cosHarley",
label: "the red, white and blue top, rivet belt, shorts and fishnets",
name: "Harley Quinn, top and fishnets",
price: 220,
patter: "The Harley Quinn. The film one, with the squad, not the cartoon one with the jester hat, I've been told the difference more than once. Girlfriend of the Manbat fella. Top says SUICE QUAD on the front. Misprint from the costume department, they told me. I say it makes it rarer. Came with a baseball bat, I kept the bat. Man has to think about liability.",
cost: 5
},
{
id: "kim",
flag: "cosKim",
label: "the black crop top and cargo pants",
name: "Kim Possible, crop top and cargos",
price: 160,
patter: "The cheerleader spy. Kim Impossible or something. The lad who dropped it off did the theme tune at me for a full minute so I'd know which one, and I still had to look it up. Gloves are real leather, which is more than the show can say.",
cost: 5
},
{
id: "cam",
flag: "cosCammy",
label: "the green leotard, red beret and blonde wig",
name: "Cammy, the green leotard",
price: 200,
patter: "The street fighter. Not a real street fighter, I asked. Video game. A girl wore this at a shopping centre in 1999 to flog the Game Boy Color version, stood by the escalators doing high kicks at children. Wig is real hair, not hers. There's a badge on the beret I'm told means something. The leotard, I'd say, means everything.",
cost: 5
},
{
id: "nur",
flag: "cosNurse",
label: "the blue hospital scrubs",
name: "Nurse, the blue scrubs",
price: 140,
patter: "Don't pull that face, these are screen worn. Four seasons on Days of Our Lives, on a nurse who spent two of them in a coma, so they did a lot of lying down. That's why the knees are fine and the back's gone shiny. Says so on the label. Well, on a bit of tape. I'm asking less because frankly nobody else has asked at all.",
cost: 5
}
]>>
<</widget>><<set $wife.favorTextPending = false>>
<h2>Morning</h2>
Your phone buzzes on the nightstand before you're properly awake. A number you don't have saved.
<br><br>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar" style="background:#2c2c36;">?</div>
<div><div class="ph-name">Unknown number</div><div class="ph-sub">Unknown</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<div class="bubble in">DEAR VALUED CUSTOMER. This is Sal (Sal's Pawn & Loan, Eastgate, by the Anchor, you know the one). You are receiving this message because you are on my list of SPECIAL CUSTOMERS. Reply STOP to be removed. I will not remove you.</div>
<div class="bubble in">NEW STOCK. Attended the estate sale of a Hollywood studio that went under (won't say which, legal). Costumes, wardrobe, etc. Screen worn, allegedly. Not for the window. Under the counter, ask for it by name, I will pretend not to know what you mean and then I will get it.</div>
<div class="bubble in">📷 Photo</div>
<div class="bubble in">Thought of you specifically. No reason. Regards, Sal.</div>
</div>
<div class="phone-actions">
<<link "Open photo" "Sal Text Pic">><</link>>
</div>
</div>
</div><h2>Morning</h2>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar" style="background:#2c2c36;">?</div>
<div><div class="ph-name">Unknown number</div><div class="ph-sub">Unknown</div></div>
</div>
<div class="phone-screen">
<div class="phone-photo"><img src="images/h/w/sal_costumes.jpeg" width="100%"></div>
<div class="phone-note">Three costumes laid out on Sal's counter, price tags turned face down.</div>
</div>
</div>
<br>
You read the message twice. "Thought of you specifically," in a text that opens with "dear valued customer" and has clearly gone out to whoever else has bought a bed and a computer off the man. You have no idea what list you're on, and you're fairly sure you'd rather not.
<br><br>
Beside you, $wife.name is still asleep, one arm thrown over your side of the bed. She's been different lately. Easier. Like the two of you have arrived somewhere and she's stopped bracing for the next thing to go wrong.
<br><br>
You look at the photo again, then at her, and you can't quite stop yourself. The red suit. The sequins. She used to do this for a living, stand in front of a camera as someone else and make you believe it. You put the phone face down on the nightstand before the thought gets any further.
<br><br>
//A new section has opened up at Sal's Pawn & Loan. You also remember that $wife.name's old cheerleader uniform is still somewhere in the back of her closet.//
<br><br>
<<link "Put the phone down." "Bedroom">><</link>><h2>With $wife.name</h2>
<<costumeList>>
<<set _openPick = random(1, 3)>>
<<if _openPick == 1>>
You wait until she's sat on the edge of the bed, then tell her you've been thinking about something. A part. She raises an eyebrow, but she's smiling.
<br><br>
<<speech "Wife" $wife.name>>
A part. Listen to you. It's been a long time since anyone offered me one of those. Go on. What's the role?
<</speech>>
<<elseif _openPick == 2>>
She's brushing out her hair when you bring it up. She stops, meets your eyes in the mirror, and turns round slowly.
<br><br>
<<speech "Wife" $wife.name>>
You want me to play someone. You do know I was good at that, once. Better than good. Alright. Pitch it to me.
<</speech>>
<<else>>
You tell her you've got a request, and that she can say no. She laughs, low, and pats the bed beside her.
<br><br>
<<speech "Wife" $wife.name>>
I did four years of auditions saying yes to things I didn't want to do. This is the first time I've been asked by someone I do. Ask.
<</speech>>
<</if>>
<br>
''What do you ask for?''
<br>
<<for _i = 0; _i < _costumes.length; _i++>>
<<if _costumes[_i].flag == "" or $items[_costumes[_i].flag]>>
<<capture _i>>
<<if $wife.favor >= _costumes[_i].cost>>
<<link `"Ask for " + _costumes[_i].name + "."`>>
<<set $wife.favor -= _costumes[_i].cost>>
<<set $wife.costume = _costumes[_i].id>>
<<goto "Wife Costume Night">>
<</link>>
<<else>>
//Ask for <<= _costumes[_i].name>>. (Not earned yet.)//
<</if>>
<br>
<</capture>>
<</if>>
<</for>>
/* ANAL (5 favour). No item flag; always listed once favour is unlocked. */
<<if $wife.favor >= 5>>
<<link "Ask for her ass.">>
<<set $wife.favor -= 5>>
<<goto "Wife Anal Night">>
<</link>>
<<else>>
//Ask for her ass. (Not earned yet.)//
<</if>>
<br><br>
<<link "Never mind." "Wife Interact">><</link>><h2>With $wife.name</h2>
/* Consume the night */
<<set $wife.intimacyToday = true>>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.obligation = false>>
<<moodShift 1>>
<<sexEnergy 1>>
<<set $arousal = 0>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set _c = $wife.costume>>
/* REVEAL BEAT, per costume */
<<switch _c>>
<<case "che">>
She disappears into the closet for longer than it should take, swearing softly at a zip. When she comes out she's in the uniform, the skirt shorter than you remembered and the top tighter, and she does a half-turn with her hands on her hips like she's daring you to say it doesn't still fit. Then something shifts in her face, and it isn't your wife looking at you anymore. It's the girl on the sidelines who hadn't met you yet.
<br><br>
<<speech "Wife" $wife.name>>
Still got it. Don't say anything about the waistband, I had to breathe in. So. You're the new guy, right? Everyone's been talking about you.
<</speech>>
<<case "ela">>
She comes out of the bathroom in the red suit, still tugging it down over her hips, the black mask pushed up on her forehead. It clings everywhere. She catches you staring, pulls the mask down into place with two fingers, and squares her shoulders the way she used to before a take.
<br><br>
<<speech "Wife" $wife.name>>
Where did you even get this? No, I don't want to know. I want you to know that I am fully in character and that this woman does not have time for your nonsense, so come here and make it quick.
<</speech>>
<<case "har">>
You hear her laughing in the bathroom before she comes out, and then she does, hair in two rough bunches, the sequined jacket half off one shoulder, fishnets and the tiny shorts, and a grin you haven't seen on her in years. She stops, turns her back to you, and looks over her shoulder at the lettering across the jacket.
<br><br>
<<speech "Wife" $wife.name>>
What the hell is a SUICE QUAD?
<</speech>>
<<speech "You" $name>>
Misprint by the costume department, apparently. It was meant to be the one used in the film, if not for the mistake.
<</speech>>
<<speech "Wife" $wife.name>>
Fine. I guess unhinged villain girlfriend isn't too hard for me to pull off. Ready to ride your Harley?
<</speech>>
<br>
She throws herself onto the bed and rolls onto her stomach, chin in her hands, and the grin goes lopsided and dangerous.
<<case "kim">>
She steps out in the cargo pants and the little black crop top, and looks down at herself like she's not sure how she got there. Then she plants her feet, lifts her chin, and gives you a look of pure unflappable competence that has no business being as hot as it is.
<br><br>
<<speech "Wife" $wife.name>>
Okay. I don't know who you bought this from and I've decided not to ask. Your teenage fantasy is coming true tonight, and then I'll go save the world afterwards.
<</speech>>
<<case "cam">>
She comes out of the bathroom in the green leotard, red beret tilted just so, the blonde wig in two long braids, tugging at the high cut over her hips like it might grow another inch if she's stern with it. Then she drops into a fighting stance, fists up, bouncing on the balls of her feet.
<br><br>
<<speech "Wife" $wife.name>>
My cousin had this game. I used to lose to him with her on purpose so he'd let me keep playing. I'm not losing tonight. Round one. Fight.
<</speech>>
<<case "nur">>
She comes out in the blue scrubs, baggy trousers and a plain V-neck top, a lanyard she's found from somewhere round her neck, and stands in the doorway with her arms out, waiting for an explanation.
<br><br>
<div class="intro-image">
<img src="images/h/w/w_cos_nur.jpeg" width="100%">
</div>
<br>
<<speech "Wife" $wife.name>>
When you said nurse, I thought you meant a sexy nurse. Little white dress, the hat. These are just... scrubs.
<</speech>>
<<speech "You" $name>>
It's hard to explain. It just does it for me.
<</speech>>
<br>
She looks at you for a long moment, then shrugs, lifts the top up to her chin for a second with nothing on underneath, and lets it drop again.
<br><br>
<div class="intro-image">
<img src="images/h/w/w_cos_nur_flash.gif" width="100%">
</div>
<br>
<<speech "Wife" $wife.name>>
Fine. Lie back. This won't hurt a bit.
<</speech>>
<</switch>>
/* Outfit photo. The nurse case shows its own inside the reveal. */
<<if _c !== "nur">>
<br>
<div class="intro-image">
<img @src="'images/h/w/w_cos_' + _c + '.jpeg'" width="100%">
</div>
<</if>>
<br>
/* BJ BEAT */
<<set _bj = [
"She pushes you back onto the edge of the bed and kneels between your knees, still in the outfit, still in character, taking her time with your belt. When she finally takes you in her mouth she keeps her eyes on you, and she doesn't rush. Her lips slide down your shaft, her tongue working the underside, one hand cupping your balls while the other holds your hip. She sucks you slow and deep until you're leaking and twitching, then pulls off with a wet sound and smiles up at you like she's hit her mark.",
"She kneels, looks up at you from under the costume, and wraps her lips around the head of your cock. She hums, and you feel it. She works you steadily, cheeks hollowing on each pull, spit running down to her fingers at the base, and every time you get close she slows down and lets you settle. She's in no hurry. She's playing it, and she's enjoying the performance as much as you are.",
"Down on her knees, she strokes you with one hand and licks a long line from base to tip before swallowing you down. She bobs her head, faster now, her free hand pressing your thigh, and when you groan her name she moans around your cock in answer and doesn't break character for a second. She takes you to the back of her throat and holds you there, then comes up gasping and grinning."
]>>
<<= _bj.random()>>
<br>
<div class="intro-image">
<img @src="'images/h/w/w_cos_' + _c + '_bj.gif'" width="100%">
</div>
<br>
/* SEX BEAT */
<<set _sex = [
"She stands, hitches the outfit out of the way, and climbs onto your lap, sinking down onto your cock in one slow push. She rides you with her hands on your shoulders, still dressed, the fabric bunched between you. She goes hard, grinding down, taking you as deep as you'll go, until she shudders and clenches around you and you cum inside her with her name in your mouth. Her real name. She stays on you afterward, forehead on yours, both of you laughing a little.",
"She turns around, bends over the bed and looks back at you over her shoulder, and you don't need telling twice. You push into her from behind with the costume shoved aside, gripping her hips, and she pushes back to meet every thrust, moaning into the covers. She reaches down to touch herself and comes hard, and the way she squeezes you finishes it. You cum deep in her pussy and she stays bent over, catching her breath, the outfit half off her and ruined.",
"She pulls you down on top of her, legs wrapping around your waist, the costume still on and pushed up and out of the way. You fuck her slow at first, then not slow at all, her nails in your back and her heels pulling you in. She tells you not to stop. You don't, until you both come at once and you empty inside her, collapsing on her chest while she strokes your hair, the character gone and just her left."
]>>
<<= _sex.random()>>
<br>
<div class="intro-image">
<img @src="'images/h/w/w_cos_' + _c + '_h.gif'" width="100%">
</div>
<br>
/* AFTER */
<<set _afterPick = random(1, 3)>>
<<if _afterPick == 1>>
Afterward she lies with her head on your chest, still half in the outfit, and says nothing for a long while.
<br><br>
<<speech "Wife" $wife.name>>
That was the most fun I've had in a costume since a wrap party in 2014. Don't ask. Same time next week, then. Don't get greedy.
<</speech>>
<<elseif _afterPick == 2>>
She rolls off you, laughing, and starts peeling the costume off with the least sexy movements possible, hopping on one foot.
<br><br>
<<speech "Wife" $wife.name>>
That's going to the dry cleaner's and you're paying. God, I missed this. Not the sex. Well, the sex. But the pretending. I forgot I was good at it.
<</speech>>
<<else>>
She tucks herself under your arm and yawns, the costume in a heap somewhere at the foot of the bed.
<br><br>
<<speech "Wife" $wife.name>>
You know what I like about that? You asked. You didn't used to ask for anything. You just sulked. Now you cast me. I could get used to being cast.
<</speech>>
<</if>>
<br>
<<link "Sleep." "Sleep">><</link>><h2>With $wife.name</h2>
/* Consume the night */
<<set $wife.intimacyToday = true>>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.obligation = false>>
<<moodShift 1>>
<<sexEnergy 1>>
<<set $arousal = 0>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $wife.analCount += 1>>
/* THE ASK */
<<if $wife.analCount == 1>>
You tell her it isn't a part. Not tonight. You tell her what you actually want, and you watch it land. Her eyebrows go up. Then the corner of her mouth does.
<br><br>
<<speech "Wife" $wife.name>>
That. It's been years. I was starting to think you'd forgotten it was an option.
<</speech>>
<br>
She lets you wait a second longer than she needs to.
<br><br>
<<speech "Wife" $wife.name>>
Fine. Same rules as always, and I still know exactly where the lube is. Go slow or I'll finish this without you.
<</speech>>
<<else>>
You tell her it isn't a part you're after. She knows the look by now.
<br><br>
<<speech "Wife" $wife.name>>
Again? You've got a thing for this lately, haven't you.
<</speech>>
<<speech "Wife" $wife.name>>
Fine. The lube is in the bottom drawer.
<</speech>>
<</if>>
<br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_ah_ask1.jpeg', 'images/characters/w/w_ah_ask2.jpeg', 'images/characters/w/w_ah_ask3.jpeg')" width="100%">
</div>
<br>
/* THE ACT. Three variants, picked independently of the gif; none names a position. */
<<set _act = [
"There's no ceremony to it. She knows how she wants to be and gets there, and you know how she wants you to start and you do, slick fingers first, patient, until she tells you she's ready in a voice that means it. You push in slow. She is impossibly tight and impossibly hot and she breathes through the first inch with her hand clamped on your wrist, and then the breath goes out of her and she says //go// and you go. You fuck her ass the way you used to, steady and deep, her hand between her legs working herself in time with you, her moans getting shorter and higher until she comes with a shudder that squeezes you so hard you can't hold it. You cum inside her, buried to the hilt, her name half a groan in your throat.",
"She talks you through it, the way she always did. //Slower. There. Now.// You work her open with the lube and your fingers until she's pushing back against your hand, and when you finally press the head of your cock against her and ease inside, she goes quiet and still, taking you an inch at a time. Then she rocks. Small at first, then not small. You fill her ass with long slow strokes that get less slow, her gasps turning into a low steady sound you feel more than hear, her fingers rubbing her clit hard and fast. She comes first, clenching around you in waves, and it pulls you over with her. You empty yourself deep inside her and stay there, both of you shaking.",
"It's been long enough that she's almost as tight as the first time, and she swears at you, fondly, through the first slow push. You hold still. She reaches back and grips your thigh and tells you to move, so you do, careful and then less careful, every stroke of your cock into her ass drawing a sound out of her she doesn't make any other way. She tells you she's close. She tells you not to stop. She tells you a few things that aren't words. When she comes she bears down on you so hard it's almost pain and that finishes it; you cum in her ass with your teeth in her shoulder, and she laughs, breathless, and tells you that's still allowed."
]>>
<<= _act.random()>>
<br>
<<set _g = random(1, 5)>>
<div class="intro-image">
<img @src="'images/h/w/w_ah' + _g + '.gif'" width="100%">
</div>
<br>
/* AFTER */
<<set _afterPick = random(1, 3)>>
<<if _afterPick == 1>>
She lies face down for a while, then turns her head on the pillow to look at you, hair across her face.
<br><br>
<<speech "Wife" $wife.name>>
I forget, between times, that I like it. And then I remember. Come here.
<</speech>>
<<elseif _afterPick == 2>>
She rolls onto her side with a wince that turns into a grin.
<br><br>
<<speech "Wife" $wife.name>>
I've got a full day of sitting down tomorrow. You are going to hear about this. Repeatedly.
<</speech>>
<<else>>
She pulls the duvet up and tucks herself against you, quiet for long enough that you think she's asleep.
<br><br>
<<speech "Wife" $wife.name>>
You know I never let anyone else. Before you or since. Nobody. Just so you know what you got.
<</speech>>
<</if>>
<br>
<<link "Sleep." "Sleep">><</link>> <h2>With $wife.name</h2>
<<if $wife.threesomeCount == 0>>
She's on the sofa with her feet up, and then you say it. Not a date. Not exactly. The Anchor, the two of you, and someone the two of you bring home. You get it all out before you can stop yourself, and then you wait.
<br><br>
She doesn't laugh. She looks at you for a long moment, and the thing in her face isn't shock. It's closer to relief.
<br><br>
<<speech "Wife" $wife.name>>
Do you know how long I've been waiting for you to ask me that? Years. I'd started to think you'd got boring.
<</speech>>
<<speech "You" $name>>
So that's a yes.
<</speech>>
<<speech "Wife" $wife.name>>
That's a yes with terms. Listen, because I'm only saying them once.
<</speech>>
<<speech "Wife" $wife.name>>
I pick. You don't point, you don't suggest, you don't get a vote. I do the talking, all of it; you buy the drinks and look like a man who's lucky to be there, which shouldn't be hard. And you don't touch anyone I haven't touched first. That last one is the one you'll want to remember.
<</speech>>
<<speech "You" $name>>
Anything else?
<</speech>>
<<speech "Wife" $wife.name>>
Yes. Call the sitter now, before I change my mind, and tell her it'll be a late one.
<</speech>>
<br>
She's already up and heading for the bedroom, pulling her hair loose as she goes. Halfway down the hall she stops and looks back at you, and for a second it isn't your wife standing there. It's someone you'd have been afraid to talk to in a bar.
<<else>>
You don't have to spell it out this time. She sees it on you before you've finished the sentence, and she's already reaching for her phone.
<br><br>
<<speech "Wife" $wife.name>>
Same rules. I'll text the sitter. Give me twenty minutes, I'm not walking in there in this.
<</speech>>
<br>
It's closer to thirty minutes, but worth every one of them.
<</if>>
<br><br>
<<link "Get your coat.">>
<<set $wife.favor -= 10>>
<<dateStart "anchor3" 60 true>>
<<goto "Wife Threesome Night">>
<</link>>
<br>
<<link "Actually, forget it.">>
<<goto "Wife Interact">>
<</link>><h2>The Anchor, With $wife.name</h2>
/* Consume the night. dateStart has already handled money, dateToday, lastDateDay, energy and tipsy. */
<<set $wife.intimacyToday = true>>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.obligation = false>>
<<set $wife.mood = 3>>
<<sexEnergy 1>>
<<set $arousal = 0>>
<<set $time = $timeMax>>
<<set $wife.threesomeCount += 1>>
/* THE ANCHOR. No image. She hunts, she never misses. */
<<set _bar = [
"The bartender clocks $wife.name before she clocks you, and the way she sets the glasses down says she's worked out what kind of night this is. You take a stool and do as you were told: buy the drinks, look lucky. $wife.name doesn't sit. She stands with her back to the bar and her glass at her hip and reads the room like a script she's been handed before, two women near the jukebox dismissed with a glance, a third at the far table given a second look and then a third. Ten minutes later she's back at your elbow with the woman beside her, already laughing at something $wife.name has said, and a cab already ordered.",
"The weekend crowd is thick enough that you lose her for a minute. Then you find her again, at the end of the bar, her hand light on a stranger's forearm the way it was once light on yours. The bartender catches your eye over the taps and doesn't say anything. You haven't touched your drink when $wife.name brings the woman over, introduces you with your first name and nothing else, and says the cab's outside.",
"She works the room the way she used to work a casting call, without ever seeming to try. One woman gets a smile and no more. Another gets a full minute and a hand on the shoulder and is then let go, gently, like a fish. The third is sitting alone with a book she isn't reading, and $wife.name sits down opposite her without asking, and that's the one. You watch the whole thing from the bar. You don't have to do anything. That was the deal. When she comes to fetch you she's already got the woman's coat over her arm."
]>>
<<= _bar.random()>>
<br><br>
<h2>Home</h2>
/* WINE. The sofa. This is the beat that makes it hers. */
The sitter is paid and gone before the woman has her shoes off. $wife.name opens a bottle nobody needs and pours three, and her pick ends up on the sofa with $wife.name beside her and you across from them in the armchair, which is where you've been put. You watch your wife do this. Her hand on the stranger's arm before the stranger's hand is anywhere near you. Her voice low, the story she's telling not one you've heard, the woman's knee turning in toward her degree by degree. When $wife.name finally leans in and kisses her it isn't a question, and a wine glass goes down on the table without anyone looking where it lands.
<br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_mff_wine1.jpeg', 'images/characters/w/w_mff_wine2.jpeg','images/characters/w/w_mff_wine3.jpeg')" width="100%">
</div>
<br>
<<speech "Wife" $wife.name>>
Bedroom. Both of you. I'll say where.
<</speech>>
<br>
/* BEDROOM. Three variants, picked independently of the gif; each covers the whole night in general terms and he finishes inside his wife. */
<<set _sex = [
"She undresses the woman herself, slowly, and tells you where to stand while she does it. Then she lays her down and goes down on her, unhurried, and tells you to watch and not to touch, and you do, and the stranger's hands find $wife.name's hair and hold on. When $wife.name lifts her head she tells you where you're allowed now, and it's her mouth on the other woman's and your mouth between her own legs, and she comes like that, loud, with a stranger's tongue in her mouth. After, she puts the woman's mouth on you and watches, close, a hand on the back of her head, until you're shaking, and then she pulls her off and straddles you and sinks down and rides you hard while her pick lies beside you kissing her throat. You cum inside your wife with her nails in your chest and her eyes wide open.",
"It's her show and she runs it. The woman on her back, $wife.name kneeling over her face, you sent to kneel between a stranger's thighs and told, in a voice you've never heard your wife use, to be good at it. You are. $wife.name rides the woman's mouth and watches you work and gives you notes. When the stranger comes it's against your tongue with $wife.name's weight on her, and $wife.name comes a minute later with her hands in the woman's hair and her head thrown back. Then she climbs off, turns her pick onto her side facing you, pulls you in behind her own body instead and guides you into herself, the other woman's hand reaching back to touch you both where you join. You fuck your wife slow and deep from behind with a stranger watching from a foot away, and when you cum it's inside her, and she tells you good, quietly, like a director.",
"There's a moment when the three of you are on the bed and nobody's decided anything, and then $wife.name decides. The woman is put on her hands and knees and you're put behind her, and $wife.name lies under her with her mouth on her, and tells you to go slow so she can feel it through her. You do. You fuck a stranger with your wife's tongue working an inch away, until $wife.name says enough and pulls you out and pushes you down on your back. Then she sits on your face and puts the other woman astride your hips, not on you, just there, grinding, the two of them kissing above you and coming one after the other. Only then does she slide down your body, kiss the stranger's taste off your mouth, and take you inside her. She rides you slow while her pick sucks her nipples, and when you cum you cum deep in your wife, exactly where she wanted it."
]>>
<<= _sex.random()>>
<br>
<<set _g = random(1, 6)>>
<div class="intro-image">
<img @src="'images/h/w/w_mff' + _g + '.gif'" width="100%">
</div>
<br>
/* AFTER */
<<set _afterPick = random(1, 3)>>
<<if _afterPick == 1>>
The woman dresses in the dark, kisses $wife.name once at the door and you not at all, and is gone. $wife.name comes back to bed and lies on top of the covers, staring at the ceiling.
<br><br>
<<speech "Wife" $wife.name>>
The sitter texted. She wants to know if we're "doing anything special" next Friday too. I said I'd let her know.
<</speech>>
<<elseif _afterPick == 2>>
You hear the front door close and then her feet on the stairs, and she stands in the bedroom doorway with her arms folded and the look of a woman waiting for a review.
<br><br>
<<speech "Wife" $wife.name>>
I still know how to work a room. Say it.
<</speech>>
<<speech "You" $name>>
You still know how to work a room.
<</speech>>
<<speech "Wife" $wife.name>>
Damn right.
<</speech>>
<<else>>
The stranger lets herself out. $wife.name doesn't get up to see her off. She turns onto her side and looks at you for a long time, and when she speaks it's plain, no performance left in it.
<br><br>
<<speech "Wife" $wife.name>>
Are you happy? Not tonight. I know about tonight. Generally. Are you happy with me.
<</speech>>
<br>
You tell her the truth, and she nods once and closes her eyes.
<</if>>
<br>
<<link "Sleep." "Sleep">><</link>><<widget "clubShiftPay">>
/* Sets _hours and _pay for a shift started at the current $time.
Call it BEFORE $time is pushed to $timeMax, or the hours are lost. */
<<set _hours = Math.max($timeMax - $time, 1)>>
<<set _rate = 15 + (5 * $fitnessTier)>>
<<if $club.captain>>
<<set _rate += 10>>
<</if>>
<<set _pay = _rate * _hours>>
<</widget>><h2><<print passage()>></h2>
A converted warehouse at the far end of the canal path, done up a lot better on the inside than the rough exterior suggests. Amber light over a long bar, teal and pink neon along the steel beams, a raised stage with two poles and a row of booths down the wall. $club.managerName runs the place from the end of the bar, where she can see the door, the stage and the till without turning her head.
<<switch $time>>
<<case 5>>Early evening. The doors have only just opened. A few men in work clothes nurse their first drinks while a dancer does slow laps of the pole for nobody in particular.
<<case 6>>Evening. The booths are filling, the music has found its volume, and the girls are working the room in earnest.
<<case 7>>Late evening. It's loud and close now, a stag party across two booths and the stage lights running hot.
<<default>>Closing time. The house lights are up, $club.managerName is counting the till, and the last stragglers are being shown the door.
<</switch>>
<br><br>
/* Drink and stage */
<<if $time >= $timeMax>>
//The bar has called last orders and the stage is dark.//
<<elseif $money >= 12>>
Drinks are club prices, $12 a glass, and a seat at the rail comes with it.
<br>
<<link "Buy a drink and watch the stage for a while. ($12)" "Ring-A-Ding, Stage">>
<<set $money -= 12>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $drunk += 1>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<</link>>
<<else>>
//Drinks are $12 a glass here, and you're short.//
<</if>>
/* Dancer */
<br><br>
<div class="char-scene">
<img @src="'images/characters/d/d_club' + random(1, 5) + '.jpeg'" class="char-img">
<div class="char-text">
<<if $dancer.relationship >= 30>>
$dancer.name sees you from the stage steps and doesn't come over straight away. She finishes what she's doing, says something to the girl beside her that makes them both look at you, and then comes and sits down like she lives there.
<<elseif $dancer.relationship >= 20>>
$dancer.name spots you from the stage steps and comes straight over, dropping into the seat beside you like she saved it.
<<elseif $dancer.nameKnown>>
$dancer.name is finishing up with a booth near the bar. When she sees you she takes her time about it, then comes over to lean on the back of your chair.
<<elseif $dancer.relationship >= 5>>
$dancer.name is between songs at the end of the bar. She clocks you and lifts her chin, the look of a woman placing a regular.
<<else>>
A dancer is working her way along the bar, a practised smile for every man she passes. The other girls call her $dancer.name.
<</if>>
<br>
<<if $dancer.danceToday>>
//You've had your time with her tonight.//
<<elseif $time >= $timeMax>>
//She's done for the night.//
<<else>>
/* Private dance */
<<if $money >= 40>>
<<link "Buy a private dance. ($40)">>
<<set $money -= 40>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<if $dancer.relationship < 25>>
<<set $dancer.relationship += 2>>
<</if>>
<<set $dancer.danceCount += 1>>
<<set $dancer.danceToday = true>>
<<if $dancer.relationship >= 10 and not $dancer.nameKnown>>
<<goto "Ring-A-Ding, Reveal">>
<<else>>
<<goto "Ring-A-Ding, Dance">>
<</if>>
<</link>>
<<else>>
//A private dance is $40, and you're short.//
<</if>>
/* Back room */
<<if $dancer.nameKnown>>
<br>
<<if $dancer.relationship >= 20>>
<<set _backroomPrice = 75>>
<<else>>
<<set _backroomPrice = 100>>
<</if>>
<<if $money >= _backroomPrice>>
<<link `"Ask her about the back room. ($" + _backroomPrice + ")"` "Ring-A-Ding, Back Room">>
<<set $money -= _backroomPrice>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = 0>>
<<addSuspicion 2>>
<<set $dancer.relationship += 1>>
<<set $dancer.backroomCount += 1>>
<<set $dancer.danceToday = true>>
<</link>>
<<else>>
//The back room with her is $<<print _backroomPrice>>, and you're short.//
<</if>>
<</if>>
<</if>>
</div>
</div>
/* The door */
<<if $club.job>>
$club.managerName is in her usual spot at the end of the bar, clipboard in front of her and a soda water sweating beside it.
<br>
<<if $weekday < 4 or $weekday > 6>>
//$club.managerName only takes an extra man on the door Thursday to Saturday.//
<<elseif $fitnessTier < 2>>
//$club.managerName looks you up and down and shakes her head. You're not in shape to hold a door tonight.//
<<elseif $time >= $timeMax>>
//The night's over. There's nobody left to keep out.//
<<elseif $energy < 2>>
//You're too wiped out to stand a door all night.//
<<else>>
<<clubShiftPay>>
<<if _hours >= 3>>
<<link `"Tell " + $club.managerName + " you're up for a shift. (Full night: $" + _pay + ")"` "Ring-A-Ding, Shift">><</link>>
<<elseif _hours == 2>>
<<link `"Tell " + $club.managerName + " you're up for a shift. (Two hours: $" + _pay + ")"` "Ring-A-Ding, Shift">><</link>>
<<else>>
<<link `"Tell " + $club.managerName + " you're up for a shift. (Last hour: $" + _pay + ")"` "Ring-A-Ding, Shift">><</link>>
<</if>>
<</if>>
<br><br>
<<elseif $dancer.relationship >= 5 and $fitnessTier >= 2>>
<<if not $club.offered>>
$club.managerName has been watching you from the end of the bar. When she catches your eye, she crooks a finger.
<br>
<<link "See what she wants." "Ring-A-Ding, Hire">><</link>>
<<else>>
$club.managerName is at the end of the bar. The door is still there if you ever want the work.
<br>
<<link "Tell her you'll take the door job." "Ring-A-Ding, Hire">><</link>>
<</if>>
<br><br>
<</if>>
<<link [[Step back out onto the canal path.|Canal Path]]>><</link>><h2>The Stage</h2>
<<set _gif = "images/h/club/stage" + random(1, 7) + ".gif">>
<<set _lines = [
"You take a stool at the rail with your drink. A dancer with a sleek dark bob works the pole like it owes her money, slow and unbothered, and tucks a bill from the man beside you into her garter without once looking at him. The glass is empty before you notice you've been drinking it, and for a few songs the rest of the week goes quiet.",
"The lights drop to a deep pink and a tall redhead takes the stage to something with far too much bass. She finds your eyes on her second pass and holds them just long enough for you to forget the glass in your hand. Then she moves on to the next man, and you take a long swallow and remember why it costs what it costs.",
"Two girls share the stage for a double set, playing to each other as much as to the room, and the stag party at the front loses its mind. You nurse your drink at the back and let it all wash over you. It's the closest thing to a night off you've had in a while."
]>>
<div class="intro-image">
<img @src="_gif" width="100%">
</div>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Head back to the bar." "Ring-A-Ding">><</link>><h2>Private Dance</h2>
<<set _gif = "images/h/d/d_dance" + random(1, 7) + ".gif">>
<div class="intro-image">
<img @src="_gif" width="100%">
</div>
<br>
<<set _v = random(1, 2)>>
<<if $dancer.relationship >= 20>>
She pulls you to the booth by your collar before you've finished your drink. $dancer.name dances for you like the song is a private joke between the two of you, all slow heat and teasing, stopping now and then to steal a sip of your drink or complain about a customer. When the song ends she stays in your lap a little longer than you've paid for.
<<elseif $dancer.nameKnown>>
<<if _v == 1>>
$dancer.name draws the curtain across and lets the persona slip a notch. She still dances, and she's still very good at it, but halfway through the song she rests her forehead against yours and asks how your week actually was. You tell her more than you meant to.
<<else>>
She knows what you like by now and doesn't bother asking. The song is slow, her weight settles in your lap, and her hands wander further than the rules on the wall allow.
<br><br>
<<speech "Dancer" $dancer.name>>
Don't tell $club.managerName.
<</speech>>
<br>
She murmurs it against your ear, and you can feel her smile.
<</if>>
<<elseif $dancer.relationship >= 5>>
<<if _v == 1>>
<br><br>
<<speech "Dancer" $dancer.name>>
Back again.
<</speech>>
<br>
It's half a question. This time she talks while she dances, about the stag party that tipped in coins and the DJ who owns four songs, grinding slow in your lap between sentences. She laughs at something you say.
<<else>>
$dancer.name remembers how you take your drink and brings it into the booth with her. The dance is the same routine as ever, close and practised, but she hums along to the song in your ear, and at the end she tells you not to be a stranger.
<</if>>
<<if not $club.job and not $club.offered and not $dancer.hintGiven and $fitnessTier >= 2>>
<<set $dancer.hintGiven = true>>
<br><br>
On your way out she squeezes your arm, then squeezes it again, testing.
<br><br>
<<speech "Dancer" $dancer.name>>
You work out? $club.managerName could use an extra man on the door. I might mention you.
<</speech>>
<</if>>
<<else>>
<<if _v == 1>>
She leads you through a beaded curtain to a row of booths, sits you down and names the rules in the same breath as the song: hands on the seat, she does the touching. Then she climbs into your lap and moves like the music was written for her hips. It's good, and it's precise, and when the song ends she's already smoothing her hair and looking past you at the room.
<<else>>
The booth is small, the seat is leather and the light is kind to everyone. $dancer.name works you over for one song with a professional's timing, close enough that you can smell her perfume, never close enough to forget you're paying by the minute. She thanks you with a smile that's been used a lot tonight.
<</if>>
<</if>>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Head back out to the floor." "Ring-A-Ding">><</link>><h2>Private Dance</h2>
<<set _stageName = $dancer.name>>
<<set $dancer.nameKnown = true>>
<<set $dancer.name = $dancer.realName>>
<div class="intro-image">
<img @src="'images/h/d/d_dance' + random(1, 7) + '.gif'" width="100%">
</div>
<br>
Halfway through the song she stops, still in your lap, and looks at you like she's deciding something.
<br><br>
<<speech "Dancer" $dancer.name>>
$dancer.name. _stageName is for the guys who don't come back.
<</speech>>
<br>
You say it back to her, trying the weight of it, and she rolls her eyes and starts moving again. Slower now. The rest of the song feels like it belongs to a different kind of night. When you get up to leave she catches your wrist.
<br><br>
<<speech "Dancer" $dancer.name>>
There's a room in the back. For regulars. When you want it.
<</speech>>
<br>
<span class="good">She told you her real name: $dancer.name.</span>
<br><br>
<<link "Head back out to the floor." "Ring-A-Ding">><</link>><h2>The Back Room</h2>
<<set _shots = 3>>
<<set _photoAsk = ($dancer.relationship >= 30 and $dancer.backroomCount >= 3 and ($gameDay - $dancer.lastPhotoDay) >= 7)>>
<div class="intro-image">
<img @src="'images/h/d/d_bj' + random(1, 8) + '.gif'" width="100%">
</div>
<br>
<<if $dancer.relationship >= 20>>
She doesn't count the money anymore, just folds it into her bag without looking and locks the door behind you. $dancer.name climbs into your lap first, kissing your neck and grinding slow against the hard-on in your jeans, taking her time in a way she never does out on the floor. Only when you're both breathing hard does she slide off and kneel between your legs. She frees your cock and takes it into her mouth without hurry, lips tight, tongue working the underside, humming against you when your hand finds her hair. She pulls off to jerk you slick and wet, looks up at you, then swallows you down again, faster now, until you grip the edge of the couch and come hard in her mouth. She takes all of it and stays there a moment, forehead resting against your thigh, catching her breath.
<<if not _photoAsk>>
Afterwards she climbs back up onto the couch and sits with her head on your shoulder until someone knocks.
<</if>>
<<else>>
The back room is a short corridor past a bored security guard, then a door that locks. $dancer.name puts the money in her bag before anything else.
<<if $dancer.backroomCount == 1>>
<br><br>
<<speech "Dancer" $dancer.name>>
So you know. I don't usually do this. The other girls, sure. Half of what happens back here is the reason $club.managerName can afford the neon. But I dance, and that's it. I like you, so you get to be the exception.
<</speech>>
<br>
She looks at you for a second longer, then shrugs like she's settled an argument with herself.
<br><br>
<<speech "Dancer" $dancer.name>>
Sit down.
<</speech>>
<br>
<</if>>
She pushes you down onto the velvet couch, straddles you for half a song with her tits in your face, and slides down between your knees. She tugs your zipper open, pulls your cock out and wraps her lips around the head, sucking in slow, wet pulls while one hand pumps the base. She keeps her eyes on you the whole time, the way she has learned men pay for. The bass thuds through the wall as she takes you deeper, tongue flat along the shaft, until your balls tighten and you come in thick spurts down her throat. She swallows, sits back on her heels and wipes the corner of her mouth with her thumb. Then she fixes her lipstick in a compact mirror and tells you to go out through the bar, so it looks like you've been at the toilets. It's the least convincing lie in the building, and nobody has ever questioned it.
<</if>>
<<if _photoAsk>>
<br><br>
<<if $dancer.photoCount == 0>>
She hasn't moved. Your phone is in your hand before you've decided anything. She hears it come out of your pocket and looks up at you from where she is, still on her knees, still catching her breath, and doesn't cover up.
<br><br>
<<speech "Dancer" $dancer.name>>
One. And it never leaves that phone. Not the group chat, not Chris, not the guy you drink with. I find out it's been anywhere, you don't come in here again, and I'll know. I always know.
<</speech>>
<br>
Then she takes hold of you again and arranges herself for it, chin up, eyes on the lens, and holds it. Whatever ends up in the picture, she put it there.
<br><br>
<<else>>
She stays down between your knees and hears the phone come out, and this time she doesn't look up to check. She takes hold of you, tilts her head until the light's right, finds the pose she wants and holds it until you've got it.
<br><br>
<</if>>
<<link "Take the picture.">>
<<set $dancer.photoCount += 1>>
<<set $dancer.lastPhotoDay = $gameDay>>
<<set _img = "images/characters/d/d_phone_bj" + Math.min($dancer.photoCount, _shots) + ".jpeg">>
<<set _cap = "Ring-A-Ding, the back room. Day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
<<goto "Ring-A-Ding">>
<</link>>
<br>
<</if>>
<br><br>
<<link "Head back out to the floor." "Ring-A-Ding">><</link>><h2>The Door Job</h2>
<<if not $club.offered>>
<<set $club.offered = true>>
$club.managerName has reading glasses pushed up into grey-streaked hair and the calm of someone who has broken up a lot of fights without raising her voice. She pours you a soda water you didn't ask for and slides it across.
<br><br>
<<speech "Owner" $club.managerName>>
$dancer.name says you're alright. From her, that's practically a reference. And you look like you can handle yourself.
<</speech>>
<br>
She tips her head at the door, where a man the size of a wardrobe is checking IDs.
<br><br>
<<speech "Owner" $club.managerName>>
I can always use an extra man on that door, Thursday to Saturday. No rota, no promises either way. Nights you feel like it, you stand there, you keep the drunks polite and the girls safe, and there's cash at the end of it. More if you turn out to be any good.
<</speech>>
<<else>>
$club.managerName doesn't look up from her clipboard.
<br><br>
<<speech "Owner" $club.managerName>>
Offer's still open.
<</speech>>
<</if>>
<br><br>
<<link "Take the job." "Ring-A-Ding, Hired">>
<<set $club.job = true>>
<</link>>
<br>
<<link "Not right now." "Ring-A-Ding">><</link>><h2>The Door Job</h2>
She shakes your hand once, firm, and writes your name on the clipboard.
<br><br>
<<speech "Owner" $club.managerName>>
Thursday to Saturday, whenever you want the work. Turn up sober, turn up in black, and find me at the bar.
<</speech>>
<br>
<span class="good">You can pick up shifts on the door at Ring-A-Ding whenever you like, Thursday to Saturday evenings.</span>
<br><br>
<<link "Head back to the bar." "Ring-A-Ding">><</link>><h2>On the Door</h2>
<<clubShiftPay>>
<<set $energy = Math.max($energy - (_hours >= 2 ? 2 : 1), 0)>>
<<set $time = $timeMax>>
<<set $money += _pay>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $club.shifts += 1>>
<<if $dancer.relationship < 25>>
<<set $dancer.relationship += 1>>
<</if>>
/* Scuffle roll */
<<if $club.captain>>
<<set _scuffleChance = 10>>
<<else>>
<<set _scuffleChance = 20>>
<</if>>
<<set _scuffle = false>>
<<if random(1, 100) <= _scuffleChance>>
<<set _scuffle = true>>
<<addWorry 2>>
<</if>>
<div class="intro-image wide">
<img src="images/scenes/club/club_door1.jpeg" width="100%">
</div>
<br>
<<if _hours == 1>>
You turn up with the last hour left on the clock. $club.managerName looks at the clock, then at you, and shrugs.
<br><br>
<<speech "Owner" $club.managerName>>
An hour's an hour. I'll take it.
<</speech>>
<br>
<<elseif _hours == 2>>
The room is already full and loud when you get there. $club.managerName tips her head at the door without looking up from the till.
<br><br>
<<speech "Owner" $club.managerName>>
You missed the easy part. Rest of the night is yours.
<</speech>>
<br>
<</if>>
<<if _scuffle>>
<<set _v = random(1, 3)>>
<<if _v == 1>>
Around midnight a man who's been cut off decides the rule doesn't apply to him, reaches over the bar and comes up with a bottle. He swings it at you the moment you get there. You slip it by an inch and get an arm round his neck, and he pays you back with his forehead to your cheekbone on the way down. You walk him out through the door onto the gravel, where his friends collect him. Your hands shake afterwards, which you can hide. Your face is starting to swell, which you can't.
<<elseif _v == 2>>
Two stag parties find each other at the bar, and by the time you get there, a barstool has already been thrown. You haul the biggest one off a smaller one and catch an elbow in the mouth for your trouble. $club.managerName hands you a bag of ice from behind the bar without a word, and you finish the shift tasting blood.
<<else>>
<<set $dancer.relationship += 1>>
Halfway through the night the light over the booths starts flashing, the one the girls hit when a customer stops listening. You're through the beaded curtain before the bartender has finished pointing. In the second booth a man has $dancer.name pinned against the seat with a hand where it was never allowed, and she's still fighting him off when you get an arm round his throat and haul him backwards off her. He lands one wild punch on the way out, a knuckle above your eye, and then he's on the gravel outside learning the difference between a dancer and a doorman. When you come back in, $dancer.name is straightening her top with hands that aren't quite steady. She doesn't say thank you. She looks at you for a long moment, then goes back to work. At closing she finds you on the door.
<br><br>
<<speech "Dancer" $dancer.name>>
Most of the guys who've stood here would've let him finish the song first.
<</speech>>
<</if>>
<<else>>
<<set _v = random(1, 3)>>
<<if _v == 1>>
A quiet night, as these things go. You check IDs, turn away a kid with his cousin's driver's license, and spend long stretches standing in the cold with your hands folded in front of you, being large. At closing $dancer.name squeezes your arm on her way out.
<br><br>
<<speech "Dancer" $dancer.name>>
Nobody grabbed me all night. That's thanks to you.
<</speech>>
<<elseif _v == 2>>
A stag party tries to bring its own bottle in. A regular gets too friendly with one of the girls, and you walk him out by the elbow before he's realised he's leaving. The rest is noise, neon and the slow ache of standing still for hours. It turns out you're good at this. Nobody argues with you twice.
<<else>>
The night runs smooth. The other doorman, a slab of a man called Chris, tells you about his divorce in instalments between customers. By closing you know more about his ex-wife's lawyer than you ever wanted to, and he's decided you're alright.
<</if>>
<</if>>
<br><br>
<<if _hours >= 3>>
<span class="good">$club.managerName counts out the full night: $<<print _pay>>.</span>
<<else>>
<span class="good">$club.managerName counts out <<print _hours>> hours at $<<print _rate>>: $<<print _pay>>.</span>
<</if>>
<<if _scuffle>>
<br>
<span class="warning">You're wearing tonight on your face. $wife.name is going to notice.</span>
<</if>>
<<if $club.shifts >= 10 and not $club.captain>>
<<set $club.captain = true>>
<br>
<span class="good">$club.managerName makes a note on her clipboard as she pays you. From your next shift, you're door captain. Another $10 an hour.</span>
<</if>>
/* Walk home ask */
<<set _walkAsk = false>>
<<if $dancer.relationship >= 20 and $dancer.nameKnown and $club.shifts >= 5 and _hours >= 2 and not _scuffle>>
<<if ($gameDay - $dancer.lastWalkDay) >= 5>>
<<if $dancer.walkCount == 0 or random(1, 100) <= 60>>
<<set _walkAsk = true>>
<</if>>
<</if>>
<</if>>
<br><br>
<<if _walkAsk>>
The floor empties out. $dancer.name comes out of the back in a coat and flat shoes, hair still pinned up from the last set, and stops beside you on the step instead of walking past.
<br><br>
<<speech "Dancer" $dancer.name>>
<<if $dancer.walkCount == 0>>
I'm ten minutes that way and I hate the stretch past the lock gate. Walk me?
<<else>>
Lock gate. You know the drill.
<</if>>
<</speech>>
<br>
<<link "Walk her home." "Ring-A-Ding, Walk Home">>
<<set $energy = Math.max($energy - 1, 0)>>
<<addSuspicion 2>>
<</link>>
<br>
<<link "Tell her you need to get back." "Living Room">><</link>>
<<else>>
<<link [[🏠 Go home|Living Room]]>><</link>>
<</if>><h2>Ring-A-Ding, With $friend.name</h2>
<div class="intro-image wide">
<img src="images/scenes/club/club_friend1.jpeg" width="100%">
</div>
<br>
<<if $friend.clubViaText>>
<<set $friend.clubViaText = false>>
$friend.name is waiting outside under the neon when you get there, arguing with the doorman about something that doesn't matter.
<br><br>
<<elseif $time >= $timeMax>>
The rope is already up and the doorman is shaking his head, right up until $friend.name says a name at him and hands him something folded. The door opens.
<br><br>
<</if>>
/* Col's back room pitch. Fires on a coin flip if the player has used the
back room, or has been to the canal woman with Col. When it fires,
$dancer stays out of the night entirely. */
<<set _pitch = ($dancer.backroomCount > 0 or $friend.swShared) and random(1, 2) == 1>>
<<set _v = random(1, 3)>>
<<if _v == 1>>
$friend.name pays the cover for both of you with a fifty and doesn't wait for the change. Inside he claims a booth like he owns it and spends the next hour narrating the room like a nature documentary. When a dancer comes by, he buys her a drink just to get her honest opinion of his haircut. She is brutal about it. He tips her double.
<<elseif _v == 2>>
By the second drink $friend.name has decided the DJ is his nemesis and is sending requests up on napkins. None of them get played. Somewhere in there the conversation turns, the way it does with him after a few, and he tells you over the music that he envies you, going home to someone. You don't know what to say to that, so you get the next round.
<<else>>
$friend.name buys a dance for a girl who says it's her birthday, then another for her friend, whose birthday it apparently also is. You watch from the booth, laughing until your ribs hurt, and for a while it's like college again, just with worse knees and a better bar tab.
<</if>>
<<if $dancer.nameKnown and not _pitch>>
<br><br>
On her way to the stage $dancer.name trails a hand across your shoulders and says your name. $friend.name watches her go, then turns slowly to look at you.
<br><br>
<<speech "Friend" $friend.name>>
She knows your name. Your actual name. I've been going to places like this for fifteen years and not one of them knows mine.
<</speech>>
<</if>>
<br>
<span class="good">You and $friend.name are closer after tonight.</span>
<<if _pitch>>
<br><br>
Near closing, $friend.name leans across the booth and tips his glass toward the corridor past the bar, where the bored guard sits on his stool.
<br><br>
<<if $dancer.backroomCount > 0>>
<<speech "Friend" $friend.name>>
Don't give me that face. I've watched you disappear down that corridor on your own, so don't pretend you don't know the way.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
We've done worse on a towpath. At least in there the door locks.
<</speech>>
<</if>>
<<speech "Friend" $friend.name>>
One girl, one room, the two of us. I've already asked. My half's paid. Yours is your problem.
<</speech>>
<br>
<<if $money >= 100>>
<<link "Follow him down the corridor. ($100)" "Ring-A-Ding, Friend Back Room">>
<<set $money -= 100>>
<<set $arousal = 0>>
<<addSuspicion 2>>
<<set $friend.relationship += 1>>
<<set $friend.backroomCount += 1>>
<</link>>
<<else>>
//$friend.name is already on his feet, but your share would be $100 and you're short.//
<</if>>
<br>
<<link "Laugh him off and head home." "Living Room">><</link>>
<<else>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>>
<</if>><h2>Team Night</h2>
<div class="intro-image wide">
<img src="images/scenes/club/club_booths1.jpeg" width="100%">
</div>
<br>
<<if $club.celebHost>>
You take the three booths at the back and hand the team card over the bar yourself. Within the hour your developers are loud, the two newest are drinking like the bar's a rumour, somebody from QA is on the pole to scattered applause, and the one who never leaves a bug alone is fixing it on a laptop balanced on his knee with a dancer looking over his shoulder. None of it is your problem. That's the point of the card.
<<if $club.job>>
<br>
From the end of the bar $club.managerName catches your eye and gives you a small nod. A man spending a company card in her club is a man she has no notes on.
<</if>>
<br><br>
Around eleven $club.managerName comes past the booth on her way to the till and stops.
<br><br>
<<speech "Owner" $club.managerName>>
The room's free, if you want it. On the card or not, your call. Nobody at that table will remember either way.
<</speech>>
<br>
A dancer in red is waiting by the curtain with her arms folded. Nobody from your floor is watching. Nobody from your floor was invited who would.
<br><br>
<<link "Take the room." "Ring-A-Ding, Celebration Room">>
<<set $arousal = 0>>
<<addSuspicion 2>>
<<set $job.performance += 1>>
<</link>>
<br>
<<link "Tell her you're good, and get another round in for the table." "Ring-A-Ding, Celebration Pass">><</link>>
<<else>>
Rick commandeers three booths and hands the company card over the bar like he's surrendering a weapon. Within the hour the whole team is loud, the underpaid juniors are taking full advantage of the free bar, somebody from QA is attempting the pole to scattered applause, and a developer nobody can talk down is fixing one last bug on a laptop balanced on his knees.
<<if $club.job>>
<br>
From the end of the bar $club.managerName catches your eye and gives you a small nod. Nothing to say about it. A regular's a regular.
<</if>>
<br><br>
Around eleven Rick drops into the seat beside you, tie gone, eyes bright. He nods at a curtain at the back, where a dancer in red is waiting with her arms folded.
<br><br>
<<speech "Manager" "Rick">>
Back room's booked. Company's treat. You earned it this quarter.
<</speech>>
<br>
He claps you on the back, with a knowing smile.
<br><br>
<<speech "Manager" "Rick">>
Go on. Don't make it weird.
<</speech>>
<br>
<<link "Go with her." "Ring-A-Ding, Celebration Room">>
<<set $arousal = 0>>
<<addSuspicion 2>>
<<set $job.performance += 1>>
<</link>>
<br>
<<link "Tell him you'll pass." "Ring-A-Ding, Celebration Pass">><</link>>
<</if>><h2>Team Night</h2>
<<if $club.celebHost>>
$club.managerName shrugs and moves on. You get the round in. One of the juniors, very drunk, tells you you're the best lead he's had, and you don't point out you're the only one. You leave them to it around midnight with the card behind the bar and a limit on it, and walk home along the canal with the bass fading behind you.
<<else>>
He looks at you like you've told him you don't like money.
<br><br>
<<speech "Manager" "Rick">>
Boring. You're boring. I'm surrounded by boring people.
<</speech>>
<br>
He says it to the booth, loud enough to carry. Then he's up and waving across the table at one of your teammates, who takes the offer before he's finished making it. You finish your drink and find your coat. Nobody asks where you're going.
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>The Back Room</h2>
<div class="intro-image">
<img @src="'images/h/club/celeb' + random(1, 6) + '.gif'" width="100%">
</div>
<br>
The dancer in red doesn't give a name and you don't ask for one. It's the same small room with the lock that the regulars know about, and she has clearly been told exactly what the company is paying for. She starts with a dance, slow and practiced, unhooking her top halfway through the song and pressing her tits against your chest as she grinds down on your lap. Then she slides off onto her knees, works your belt open and pulls your cock out, stroking it once and looking up with a smile that costs extra. She takes you into her mouth in one long, wet slide, cheeks hollowing, and sucks you with a steady rhythm while her hand works what she can't fit. The bass thuds through the wall. You grab a fistful of her hair and she lets you set the pace, gagging a little when you push deeper, until your balls tighten and you come in thick ropes down her throat.
<br><br>
<<if $club.celebHost>>
She swallows, sits back, fixes her lipstick in the mirror and tells you $club.managerName said to look after you. When you get back to the booth nobody has noticed you were gone, which is exactly what you paid for.
<<else>>
She swallows, sits back, fixes her lipstick in the mirror and tells you Rick is a very generous man.
<br><br>
When you get back to the booth he raises his glass to you, a couple of your teammates cheer, and you understand this is something they'll all remember you did.
<</if>>
<br><br>
<span class="good">Work performance improved.</span>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>Morning</h2>
<<set _threads = [
{
key: "cash",
found: "Her phone is on the duvet between you, your banking app open on it. One line highlighted. Cash withdrawal, $100, 11:52pm, the machine outside the off-licence on the canal path.",
ask: "A hundred dollars. Eight minutes to midnight. At the canal. What did you need a hundred dollars in cash for at eight minutes to midnight?",
excuse: "The card reader was down at the bar. I got a round in, I took cash out, I paid, I came home. That's the whole thing.",
hole: "The bar is the other side of town from that machine."
},
{
key: "shirt",
found: "Your shirt from last night is in her hand, not in the basket. She's already had it up to her face.",
ask: "This smells of perfume. Not mine. Vanilla, something cheap. Who were you standing that close to?",
excuse: "It was rammed in there. Some girl was half on my lap trying to get to the bar. I didn't even get her name.",
hole: "It's on the inside of the collar. Nobody gets the inside of your collar by squeezing past you."
},
{
key: "text",
found: "Your phone is on her side of the bed, screen up. A text from a number you haven't saved. //Good seeing you x//",
ask: "Who's this? Good seeing you. With a kiss on it.",
excuse: "That's one of the guys' girlfriends. She was out with us, she'll have got my number for the tab. It's just what people put.",
hole: "It came in at half one. You were in bed at half one."
}
]>>
<<if $dancer.danceCount > 0>>
<<set _threads.push({
key: "receipt",
found: "There's a card receipt on the dresser, smoothed flat. RING-A-DING in capitals across the top. $60. Last night.",
ask: "Ring-A-Ding. The strip club on the canal. Sixty dollars on our card.",
excuse: "That's where the guys ended up, I didn't pick it. It was my round, I bought it, I sat there. I didn't do anything.",
hole: "Nobody else's round goes on your card."
})>>
<</if>>
<<if $dancer.photoCount > 0>>
<<set _threads.push({
key: "photo",
found: "Your phone is on her side of the bed, unlocked, the gallery open. She has it turned so you can see. A girl on her knees in a room with a red couch, and it isn't a girl you can pretend you don't know the name of.",
ask: "Who is this. And don't tell me it's a forward.",
excuse: "It's from the club. The guys were sending stuff round all night. I didn't even look at what I was saving.",
hole: "It's not in a chat. It's in your camera roll. You took it."
})>>
<</if>>
<<set _t = _threads.random()>>
<<set $wife.lastEvidence = _t.key>>
<<set $wife.lastEvidenceKind = $wife.nearMissKind>>
<<set $friend.closeCallTold = false>>
<<= _t.found>>
<div class="char-scene">
<<if $wife.nearMissKind === "repeat">>
<img @src="either('images/characters/w/w_suspicious1.jpeg', 'images/characters/w/w_suspicious2.jpeg')" class="char-img">
<<else>>
<img src="images/characters/w/w_worry1.jpeg" class="char-img">
<</if>>
</div>
<<if $wife.nearMissKind === "believed">>
<<speech "Wife" $wife.name>>
<<= _t.ask>>
<</speech>>
<<speech "You" $name>>
<<= _t.excuse>>
<</speech>>
<<speech "Wife" $wife.name>>
<<= _t.hole>>
<</speech>>
<<speech "You" $name>>
I know how it looks. I'm asking you to believe me anyway.
<</speech>>
<br>
She holds it a moment longer. Then she puts it down on the dresser, carefully, like something that might go off.
<br><br>
<<speech "Wife" $wife.name>>
Okay. I'm choosing to. I'm telling you I'm choosing, so you know what it costs me.
<</speech>>
<br>
She's gentle with you at breakfast. She makes your coffee. She doesn't look at you while she does it.
<br><br>
<span class="warning">$wife.name has decided to believe you. What she found hasn't gone anywhere.</span>
<<elseif $wife.nearMissKind === "repeat">>
<<speech "Wife" $wife.name>>
<<= _t.ask>>
<</speech>>
<<speech "You" $name>>
<<= _t.excuse>>
<</speech>>
<<speech "Wife" $wife.name>>
You've got an answer. You had an answer last time as well. I let it go, because I wanted to. That one's on me.
<</speech>>
<<speech "Wife" $wife.name>>
<<= _t.hole>> I'm not asking you to fix that. I'm telling you I've noticed.
<</speech>>
<br>
She takes it with her when she goes. The door closes normally. You hear her voice go soft on the other side of it, talking to the boy.
<br><br>
<span class="bad">$wife.name has stopped asking and started counting. Your relationship has taken a hit, and whatever she found is still out there.</span>
<<else>>
<<speech "Wife" $wife.name>>
<<= _t.ask>>
<</speech>>
<<speech "You" $name>>
<<= _t.excuse>>
<</speech>>
<<speech "Wife" $wife.name>>
<<= _t.hole>>
<</speech>>
<<speech "You" $name>>
I don't know what to tell you. That's what happened.
<</speech>>
<br>
She looks at you for a long time. Then she nods, once, like she's writing it down somewhere.
<br><br>
<<speech "Wife" $wife.name>>
Fine. I want to be wrong about this. Don't make me stupid for it.
<</speech>>
<br>
She goes to see to the boy. You lie there and listen to her being normal with him.
<br><br>
<span class="bad">$wife.name is asking questions. Your relationship has taken a hit, and whatever she found is still out there.</span>
<</if>>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.nearMissToday = false>>
<<set $wife.nearMissResult = 0>>
<<set $wife.nearMissKind = "">>
<</link>><h2>The Canal Path</h2>
<div class="intro-image wide">
<img src="images/characters/d/d_walk1.jpeg" width="100%">
</div>
<br>
The neon cuts out behind you and the path goes dark in stretches, the way it does. She walks on the water side with her hands in her coat pockets, and for the first fifty yards neither of you says anything, which turns out to be fine.
<br><br>
<<if $dancer.walkCount == 0>>
<<speech "Dancer" $dancer.name>>
You can stop doing the doorman thing. Nobody's going to jump us. I just don't like walking it alone at this hour with a bag full of cash.
<</speech>>
<br>
So you stop doing the doorman thing, and she tells you about the flat, a one bed over a nail salon that she has owned outright for three years, and the accountancy course she does two evenings a week, and how many of the girls think she's stuck up for it. She asks about Helion and listens to the answer. It occurs to you somewhere past the lock gate that in all this time she has never once asked what you do for a living. She just waited until you told her.
<<elseif $dancer.walkCount == 1>>
<<speech "Dancer" $dancer.name>>
Go on, then. Ask. Everyone asks on the second walk.
<</speech>>
<<speech "You" $name>>
Ask what?
<</speech>>
<<speech "Dancer" $dancer.name>>
Why a girl doing an accountancy course takes her top off for stag parties.
<</speech>>
<br>
You tell her you weren't going to. She looks at you for a moment, then tells you anyway. Nineteen, a boyfriend with a habit, a landlord who didn't care about either. The club cleared the arrears in a fortnight. The boyfriend went. The job stayed, because it turned out she was good at it, and nothing else she tried paid a third as well for a third of the hours.
<br><br>
<<speech "Dancer" $dancer.name>>
I'm not sad about it. Don't do the face.
<</speech>>
<<else>>
<<set _v = random(1, 2)>>
<<if _v == 1>>
She talks about after. Two more years, enough put by, an office somewhere with a plant on the desk, and a plan never to tell anyone in it where the deposit came from. She asks, not quite lightly, whether you'd still come in on a Thursday if she wasn't on the rota. You say something that makes her laugh, and she bumps her shoulder into yours and doesn't move away again.
<<else>>
<<speech "Dancer" $dancer.name>>
Chris thinks you're after me.
<</speech>>
<<speech "You" $name>>
Chris talks a lot.
<</speech>>
<<speech "Dancer" $dancer.name>>
He does. He's not wrong though, is he.
<</speech>>
<br>
She doesn't wait for an answer. She tells you about a customer that night who cried in a booth for a whole song and tipped her forty dollars for not asking why, and about a text from her mother that she hasn't answered, and by the lock gate her hand is through your arm and neither of you has mentioned it.
<</if>>
<</if>>
<br><br>
Her door is a plain one between the nail salon and a lettings agent. She finds the key, then stops with it in the lock.
<br><br>
<<speech "Dancer" $dancer.name>>
<<if $dancer.walkCount == 0>>
This isn't the back room. Different rules up here. You coming up or not?
<<else>>
Well?
<</if>>
<</speech>>
<br>
<<link "Go up." "Ring-A-Ding, Walk Home Scene">><</link>><h2>Her Flat</h2>
<div class="intro-image">
<img @src="'images/h/d/d_h' + random(1, 10) + '.gif'" width="100%">
</div>
<br>
The flat is small and very tidy, textbooks squared on the table, a rail of costumes by the window like it's nothing. She doesn't offer you a drink. She drops the coat on the floor, pushes you back against the door and kisses you like she's been waiting the whole shift to do it, and her hand is at your belt before the door has finished shutting. She drops to her knees on the mat and takes your cock into her mouth in one long pull, no build-up, no eye contact for the paying customer, sucking you hard and messy until you have to pull her off it by the hair. Then she's hauling you to the bed with the dress hiked up and nothing under it, on her back, guiding you into her pussy in one push, so wet there's no resistance at all. No music, no clock running on the song. Her legs lock round your waist and her hips drive up to meet every thrust, her nails in your back, her mouth at your ear telling you harder and then not telling you anything. She comes first, loud enough for the nail salon, clamping down on your cock so hard you can't hold it, and you slam up into her and come inside her in long pulses while she rocks slow on top of you, milking the last of it out until you stop shaking.
<br><br>
Afterwards she lies half across you with the streetlight striped over the pair of you, and she's back to herself, slow and dry and unimpressed by everything.
<br><br>
<<if $dancer.walkCount == 0>>
<<speech "Dancer" $dancer.name>>
Give me your phone.
<</speech>>
<br>
She types with one thumb, hands it back, and rolls over.
<br><br>
<<speech "Dancer" $dancer.name>>
That's me. Not for two in the morning. Not for pictures. If you want a night, ask like a grown-up and we'll talk about it.
<</speech>>
<br>
<span class="good">$dancer.name gave you her number.</span>
<br><br>
<</if>>
<<set $dancer.walkCount += 1>>
<<set $dancer.lastWalkDay = $gameDay>>
<<set $dancer.numberKnown = true>>
<<set $dancer.relationship += 3>>
<<set $arousal = 0>>
<<sexEnergy 1>>
You dress by streetlight. She props herself up on an elbow to watch you do it and makes no effort at all to hide that she is enjoying the view.
<br><br>
<<speech "Dancer" $dancer.name>>
Shoes are by the radiator. And don't go creeping out like you got away with something. You're allowed in here.
<</speech>>
<<speech "You" $name>>
Noted.
<</speech>>
<<speech "Dancer" $dancer.name>>
Good. Now go home before I get used to you.
<</speech>>
<br>
She is still grinning at the ceiling when you pull the door shut behind you, and you are still grinning yourself somewhere around the second flight of stairs.
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar dancer"><<= $dancer.name.charAt(0)>></div>
<div><div class="ph-name">$dancer.name</div><div class="ph-sub">Ring-A-Ding</div></div>
</div>
<div class="phone-screen">
/* Night out. Wednesday to Saturday evenings, 7-day cooldown, $450 cash.
The button always shows once you have her number; when it's
unavailable it's dimmed with the reason underneath. */
<<set _dateDay = ($weekday >= 3 and $weekday <= 6)>>
<<set _cool = ($gameDay - $dancer.lastDateDay) >= 7>>
<<set _dateNote = "">>
<<if not _dateDay>>
<<set _dateNote = "She only does nights out Wednesday to Saturday.">>
<<elseif $time < 5>>
<<set _dateNote = "Too early. Ask her in the evening.">>
<<elseif $time > 6>>
<<set _dateNote = "Too late to get a night out going now.">>
<<elseif not _cool>>
<<set _dateNote = "Too soon since the last date.">>
<<elseif $energy < 1>>
<<set _dateNote = "You're too worn out to make an evening of it.">>
<<elseif $money < 450>>
<<set _dateNote = "You'd need $450 in cash for a night with her.">>
<<elseif $phone.dancerDateAskedToday>>
<<set _dateNote = "You've already asked her tonight.">>
<</if>>
<div class="phone-actions">
<<if _dateNote === "">>
<<link "Ask her for a night out. ($450)">>
<<set $phone.dancerDateAskedToday = true>>
<<set $phone.dancerMsgTopic = "date">>
<<goto "Phone Dancer Reply">>
<</link>>
<<else>>
<span class="phone-btn-off">Ask her for a night out. ($450)</span>
<</if>>
</div>
<<if _dateNote !== "">>
<div class="phone-note">//<<= _dateNote>>//</div>
<</if>>
/* Idle. Once a day, separate from the date ask. */
<<if $phone.dancerTextedToday>>
<div class="phone-note">You've texted $dancer.name today.</div>
<<else>>
<div class="phone-actions">
<<link "Text $dancer.name.">>
<<set $phone.dancerTextedToday = true>>
<<set $phone.dancerMsgTopic = ["shift", "course", "checkin"].random()>>
<<goto "Phone Dancer Reply">>
<</link>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar dancer"><<= $dancer.name.charAt(0)>></div>
<div><div class="ph-name">$dancer.name</div><div class="ph-sub">Ring-A-Ding</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<<switch $phone.dancerMsgTopic>>
<<case "date">>
<div class="bubble out">Free tonight? Let me take you somewhere that isn't the club.</div>
<<if $dancer.dateCount == 0>>
<div class="bubble in">Ok. Here's how it goes, and it goes this way or not at all.</div>
<div class="bubble in">The Marlowe, across town. Room's in my name. You don't pick me up and you don't put me in a cab at the end. Cash for the room and the table. I'm not a line on your bank statement.</div>
<<if $weekday == 3>>
<div class="bubble in">And it's my one quiet night, so it had better be a good one.</div>
<<else>>
<<set _night = ["", "", "", "", "Thursday", "Friday", "Saturday"][$weekday]>>
<div class="bubble in">And I'm giving up a _night for this. <<= _night + "s">> pay. So it had better be a good one.</div>
<</if>>
<div class="bubble out">Understood.</div>
<div class="bubble in">Delete this thread before you go home. I mean it.</div>
<<else>>
<div class="bubble in">Same as last time. The Marlowe. Cash. Bring your manners.</div>
<div class="bubble in">And delete this.</div>
<</if>>
<<case "shift">>
<div class="bubble out">How was last night?</div>
<div class="bubble in">Dead till eleven, then a stag do from out of town. One of them was sick on Chris. Chris took it personally.</div>
<div class="bubble in">You should have been on. I'd have had someone to look at.</div>
<<case "course">>
<div class="bubble out">How's the course going?</div>
<div class="bubble in">Mock exam Thursday. If I fail I'm blaming you for the distraction.</div>
<div class="bubble out">You'll pass.</div>
<div class="bubble in">I know. I just like having someone to blame lined up.</div>
<<case "checkin">>
<div class="bubble out">Just checking you got home alright.</div>
<div class="bubble in">Careful. That's the sort of thing a man says when he's forgotten what this is.</div>
<div class="bubble in">I got home fine. Thanks for asking.</div>
<</switch>>
</div>
<<if $phone.dancerMsgTopic == "date">>
<div class="phone-note">She's already in a cab. Bring cash. Cash leaves no trail.</div>
<div class="phone-actions">
<<link "Head across town." "Dancer Date">>
<<set $dancer.lastDateDay = $gameDay>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<</link>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Dancer">><</link>></div>
</div><h2>The Marlowe</h2>
<<set $dancer.giftTier = 0>>
<<set $dancer.dateScore = 0>>
<div class="intro-image wide">
<img src="images/characters/d/d_date_taxi1.jpeg" width="100%">
</div>
<br>
The Marlowe is the hotel across town that Helion puts clients in, all brass and dark wood, with an arcade of shops off the lobby that keep one item in each window.
<br><br>
You send one text on the way over. Helion, a client, the Marlowe, don't wait up. None of it is quite a lie, which is what makes it easy. $wife.name sends back a thumbs up and tells you to eat something.
<br><br>
A black cab pulls in under the awning and she steps out of it in a coat you've never seen and heels she'd never wear to work, and looks you over like she's checking the order.
<br><br>
<<speech "Dancer" $dancer.name>>
You'll do. Come on. I want to look at something before they shut.
<</speech>>
<br>
<div class="intro-image wide">
<img src="images/characters/d/d_date_street1.jpeg" width="100%">
</div>
<br>
Something is in the first window. She doesn't point at it. She stands in front of it until you've seen what she's looking at, then moves on to the next window, and the next, so that by the time you've walked the arcade there are three things she has looked at and you know exactly which was which. She waits by the door of the first one with her hands in her pockets.
<br><br>
<<if $money >= 950>>
<<link "The earrings. The ones she looked at first. ($500)" "Dancer Date Dinner">>
<<set $money -= 500>>
<<set $dancer.giftTier = 3>>
<</link>>
<<else>>
//The earrings are $500 and you can't cover them and the night.//
<</if>>
<br>
<<if $money >= 750>>
<<link "The watch, from the second window. ($300)" "Dancer Date Dinner">>
<<set $money -= 300>>
<<set $dancer.giftTier = 2>>
<</link>>
<<else>>
//The watch is $300 and you can't cover it and the night.//
<</if>>
<br>
<<if $money >= 600>>
<<link "The bracelet, from the third. ($150)" "Dancer Date Dinner">>
<<set $money -= 150>>
<<set $dancer.giftTier = 1>>
<</link>>
<<else>>
//The bracelet is $150 and you can't cover it and the night.//
<</if>>
<br>
<<link "Say the shops are closing anyway, and steer her towards the restaurant." "Dancer Date Dinner">>
<<set $dancer.giftTier = 0>>
<</link>><h2>Dinner</h2>
<div class="intro-image wide">
<img src="images/characters/d/d_date_restaurant1.jpeg" width="100%">
</div>
<br>
The restaurant is off the lobby, white cloths and a man who folds your coat over his arm like it's worth something. She orders without opening the menu.
<br><br>
<<switch $dancer.giftTier>>
<<case 3>>
She opens the box at the table before the bread arrives, which she'd told you in the arcade she wasn't going to do. She puts the earrings in using the back of a spoon for a mirror, and doesn't say thank you.
<br><br>
<<speech "Dancer" $dancer.name>>
You paid attention. Most of them buy the last thing they saw.
<</speech>>
<br>
She's a different woman for the rest of the meal. Not warmer, exactly. Present. She asks about your week and remembers the answers, and once, when the waiter has gone, she reaches across and turns your wrist over to look at your watch, for no reason you can work out except that she wanted to.
<<case 2>>
She takes the watch out at the table, turns it over once, and puts it on. She doesn't mention it again all night.
<br><br>
<<speech "Dancer" $dancer.name>>
Good choice.
<</speech>>
<br>
Dinner is easy. She tells you about the course and a girl at the club who is trying to get her sacked, and lets you tell her about Helion for longer than anyone at home would.
<<case 1>>
She thanks you for the bracelet properly, in full sentences, and puts it in her bag rather than on her wrist.
<br><br>
<<speech "Dancer" $dancer.name>>
That's nice. That's a nice thing.
<</speech>>
<br>
She's good company over dinner, because she's good company. She keeps the conversation moving and laughs in the right places, and it's a while before you notice she hasn't asked you a single question.
<<default>>
She doesn't mention the arcade. She orders the second most expensive thing on the menu instead of the most, which you understand is a courtesy, and she is pleasant for the whole meal in the way she is pleasant to a booth.
<br><br>
<<speech "Dancer" $dancer.name>>
The lamb's good here. You should have the lamb.
<</speech>>
<br>
You have the lamb.
<</switch>>
<br><br>
She has never once asked about the ring. She doesn't ask now. When the bill comes she looks at it, then at you, and waits.
<br><br>
<<set $dancer.dateScore = $dancer.giftTier + 1>>
<<link "Pay the table. ($200)" "Dancer Date Hotel">>
<<set $money = Math.max($money - 200, 0)>>
<</link>><h2>Room 412</h2>
<<set $money = Math.max($money - 250, 0)>>
<div class="intro-image">
<img @src="'images/h/d/d_h' + random(1, 10) + '.gif'" width="100%">
</div>
<br>
You give her the cash for the room in the lift, and she puts it in her coat without counting it. The room is on the fourth floor and looks over the car park, and she has clearly been in it before.
<br><br>
<<if $dancer.dateScore >= 4>>
She kicks the heels off and comes at you before the door has shut, the earrings still in, and there is nothing of the booth in it at all. She strips you slowly, shirt, belt, jeans, her mouth following her hands down, and takes your cock in her mouth for a while just because she wants to, slow and deep and wet, looking up at you with nothing practised in her face. Then she stands, lets the dress fall, pushes you flat on the bed and climbs on, sinking down onto your cock in one long slide with her head thrown back. She rides you with her hands braced on your chest and her eyes on your face the whole way, telling you how good you feel inside her and what to do with your hands and when, her pussy hot and tight and dripping down over your balls. She holds the pace until her rhythm goes to pieces, folds forward against your neck and comes hard on top of you, shaking, with your name in it, and you come inside her with her heels locked at your back.
<br><br>
Afterwards she lies with her head on your chest and her fingers going over your ribs, and doesn't say anything for a long time. Then, into your chest:
<br><br>
<<speech "Dancer" $dancer.name>>
I'm keeping these. The earrings. I'm telling you now so you don't think I'm sentimental about it.
<</speech>>
<<elseif $dancer.dateScore >= 2>>
She's unhurried about it. The coat, the dress, her hair down, the underwear last, all of it watched from the end of the bed because she tells you to sit there and watch. When she's naked she kneels between your knees, unzips you and sucks your cock slow and thorough, cheeks hollow, one hand working the base, until you're rock hard and she's satisfied with the state you're in. Then she climbs onto the mattress on her hands and knees with her back to you and looks over her shoulder, and that's the instruction. You push into her from behind, her pussy slick and gripping, and the rest is her pace, deep and steady, her hand reaching back to hold your hip, her ass pushing back to meet you on every stroke. She talks you through it in a low voice until she stops being able to, and comes with her face pressed into the pillow. You take her hips and finish deep inside her with her still pushing back for it.
<br><br>
She lies against you afterwards with her back to your chest, and you talk about nothing for a while, and it's comfortable.
<br>
<<else>>
She's quick and good and clearly elsewhere. Dress up, underwear down, onto her back on the bedspread with the light still on. She reaches for your cock, gets it out and strokes it twice to check you're ready, and guides you in. You fuck her in missionary with the dress bunched round her waist, and she makes the right noises at the right times, hands on your shoulders, hips lifting, everything correct and nothing given. She comes, or says she does, a little before you do, and you finish inside her with her looking at the ceiling.
<br><br>
She's up and in the bathroom before you've caught your breath. When she comes out she's already half dressed.
<br><br>
<<speech "Dancer" $dancer.name>>
That was nice. Next time bring the whole evening.
<</speech>>
<</if>>
<br>
She sends you down first. Ten minutes, then the lift, then a cab from the rank and not the one outside. Her rules. The room is in her name, the bill was paid in cash, and nobody at the desk will remember your face. That's what the money buys. On the way past reception you delete the thread, and by the time you're on the ring road there's nothing on you that says where you've been except the smell of a hotel, which is the smell of Helion sending you anywhere.
<br><br>
<span class="good">Her rules kept tonight off $wife.name's radar.</span>
<br><br>
<<if $dancer.dateScore >= 4>>
<<set $dancer.relationship += 4>>
<span class="good">She got her money's worth out of you, and she wasn't counting the hours.</span>
<<elseif $dancer.dateScore >= 2>>
<<set $dancer.relationship += 3>>
<span class="good">A good night for both of you, which isn't what she books these rooms for.</span>
<<else>>
<<set $dancer.relationship += 1>>
<span class="warning">She was working, and she didn't pretend otherwise.</span>
<</if>>
<br><br>
<<set $dancer.dateCount += 1>>
<<set $dancer.lastDateDay = $gameDay>>
<<set $arousal = 0>>
<<sexEnergy 1>>
<<set $time = $timeMax>>
<<link [[🏠 Go home|Living Room]]>><</link>>/* Col's invites ("anchor" or "club"). Rolled at dayshift into
$phone.friendInviteDue, delivered by <<friendInviteCheck>> (PassageReady)
at early evening, and expired by the same check at night or once he's
had his night with Col. No reply: go now, or decline. */
/* Delivers a held invite at early evening; expires a live one. */
<<widget "friendInviteCheck">>
<<if $phone.friendInviteDue !== "">>
<<if $friend.drankToday or $time >= $timeMax>>
<<set $phone.friendInviteDue = "">>
<<elseif $time >= 5>>
<<set $phone.friendPingTopic = $phone.friendInviteDue>>
<<set $phone.friendUnread = true>>
<<set $phone.friendInviteDue = "">>
<</if>>
<</if>>
<<if ($phone.friendPingTopic === "anchor" or $phone.friendPingTopic === "club") and ($friend.drankToday or $time >= $timeMax)>>
<<set $phone.friendPingTopic = "">>
<<set $phone.friendUnread = false>>
<</if>>
<</widget>>
/* Go now, or decline. Going is dimmed with the reason if he's short. */
<<widget "friendInviteActions">>
<<if _args[0] === "club">>
<<set _inviteCost = 20>>
<<set _inviteLabel = "Meet him at Ring-A-Ding. ($20)">>
<<set _inviteNote = "Your share of the night would be $20, and you're short.">>
<<else>>
<<set _inviteCost = 16>>
<<set _inviteLabel = "Head down to the Anchor and meet him. ($16)">>
<<set _inviteNote = "A couple of rounds with him is more than you can cover tonight.">>
<</if>>
<div class="phone-actions">
<<if $money < _inviteCost>>
<span class="phone-btn-off"><<= _inviteLabel>></span>
<<elseif _args[0] === "club">>
<<link _inviteLabel "Ring-A-Ding, Friend">>
<<set $phone.friendPingTopic = "">>
<<set $friend.drankToday = true>>
<<set $friend.clubViaText = true>>
<<set $money -= 20>>
<<set $time = $timeMax>>
<<set $drunk += 2>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set $friend.relationship += 3>>
<</link>>
<<else>>
<<link _inviteLabel "Anchor Friend">>
<<set $phone.friendPingTopic = "">>
<<friendDrinkSetup>>
<</link>>
<</if>>
</div>
<<if $money < _inviteCost>>
<div class="phone-note">//<<= _inviteNote>>//</div>
<</if>>
<div class="phone-actions">
<<link "Not tonight." "Phone">>
<<set $phone.friendPingTopic = "">>
<<set $phone.friendUnread = false>>
<</link>>
</div>
<</widget>><h2>The Back Room</h2>
<div class="intro-image">
<img @src="'images/h/club/club_mmfbj' + random(1, 6) + '.gif'" width="100%">
</div>
<br>
<<set _scene = [
"The guard doesn't look up. The girl waiting inside is blonde and bored, and she has the money counted before the door locks behind the three of you. She sits you both down on the velvet couch, shoulder to shoulder, closer to $friend.name than you've been since college, and kneels between you. She gets both of your cocks out and works them in her fists for a while, then leans in and takes you in her mouth while she jerks $friend.name, slow and wet, before turning her head and swallowing him down instead. She goes back and forth like that, never letting either of you go soft, spit running down to her fingers. $friend.name tries to keep up a running commentary and loses the thread halfway through a sentence. Near the end she has both heads against her lips at once, tongue sliding between them, and that is what finishes you. You come across her mouth and chin, and $friend.name follows a moment later with a groan that must carry through the wall. She wipes her face with a tissue from her bag, checks her lipstick and unlocks the door. Out in the corridor $friend.name starts to say something, stops, and the two of you lose it laughing all the way past the guard.",
"She's a redhead in a mesh dress who takes the money without a word and points at the couch. You sit. She pushes your knees apart, then his, and kneels in the space between you. She starts on $friend.name, deep and noisy, holding your cock in her fist and stroking you in time, then switches and sucks you hard and fast while he watches with his mouth hanging open. Every time one of you gets close she moves to the other, and it goes on like that until you're both shaking and she has one of you in each hand, licking from one to the other. $friend.name comes first, in her mouth, and she swallows and turns straight back to you, taking you deep until you empty down her throat. She stands, straightens the dress and holds the door open. $friend.name gets as far as the bar before he says the two of you are never talking about this, and then talks about it the whole cab ride home.",
"The room is smaller with two of you in it. The dancer, dark-haired and all business, stands you side by side against the wall and sinks to her knees in front of you. She pulls you both out, one in each hand, and takes turns, a few long pulls of her mouth on you, then on him, her hands never stopping. $friend.name reaches over and bumps your shoulder like you've just hit a double at darts, you tell him to shut up, and she laughs around his cock. She speeds up, switching faster, cheeks hollowed, until you're both right at the edge, then holds both of you against her tongue and strokes you off together. You come within a second of each other and she takes it without flinching, spits into a tissue and is already reaching for the lock. Outside, $friend.name checks his reflection in the dark glass of the fire exit and asks if his hair looks alright. It doesn't. Neither of you mentions anything else."
]>>
<<= _scene.random()>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>Helion Dynamics</h2>
<<set $helionGym.peepFound = true>>
You're halfway into a clean shirt when you notice it. Low on the partition wall, behind the last bank of lockers, there's a ventilation grille nobody has looked at since the fit-out. One screw is missing. The panel sits a finger's width proud of the wall, and two of the slats have been bent apart, neatly, on purpose.
<br><br>
The women's changing room is on the other side of that wall. You can hear it. A locker door, a hairdryer, two voices comparing spin instructors.
<br><br>
You look round. The room is empty. Whoever bent those slats isn't here, and going by the dust on the sill, hasn't been for a while.
<br><br>
<<link "Crouch down and look." "Helion Gym, Vent">><</link>>
<br>
<<link "Finish getting dressed. You know where it is now." $return>><</link>><h2>Helion Dynamics</h2>
<<set $helionGym.peepToday = true>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _peepImg = "images/h/peep/peep" + random(1, 7) + ".gif">>
You wait for your side of the wall to empty, then go down on one knee by the last bank of lockers, as if you've dropped something.
<br><br>
<<switch $time>>
<<case 0>>The early crowd. Quick and practical, towels and bags, nobody lingering because everybody has to be upstairs by nine.
<<case 1 3>>The quiet hours. Whoever is in there thinks she has the place to herself, and she takes her time about it.
<<case 2>>Lunch hour. In and out in a hurry, lanyards on the bench and a lot of talk about a meeting you've never heard of.
<<case 4 5>>The after-work changeover. Busy and loud, steam coming off the showers, and nobody paying any attention to a vent low on the wall.
<<case 6>>The last few of the evening, slower now the rush is over, finishing up before the lights go off.
<</switch>>
<br><br>
<div class="intro-image">
<img @src="_peepImg" width="100%">
</div>
<<= [
"You stay down there longer than you meant to, knee aching on the tile, and only stand up when the door goes on your side of the wall.",
"It's a narrow view through two bent slats, and it's plenty. You watch until the room over there goes quiet and the hairdryer stops.",
"Nobody looks at the vent. Nobody ever looks at a vent. You go back to your locker with your pulse up and your face arranged."
].random()>>
<br><br>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Straighten up and get out of there." $return>><</link>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar assistant"><<= $assistant.name.charAt(0)>></div>
<div><div class="ph-name">$assistant.name</div><div class="ph-sub">Helion Dynamics</div></div>
</div>
<div class="phone-screen">
/* Unread message from her after a night out. Shown once, then cleared. */
<<if $phone.assistantUnread>>
<div class="chat">
<div class="bubble in">Home ok?</div>
<div class="bubble in">Don't answer that. I know what this is. I'm not stupid.</div>
<div class="bubble in">Tonight was still nice. See you at nine.</div>
</div>
<<set $phone.assistantUnread = false>>
<</if>>
<<if $assistant.affair>>
/* Date. Monday to Thursday evenings, 7 day cooldown. */
<<set _dateDay = ($weekday >= 1 and $weekday <= 4)>>
<<set _dateNote = "">>
<<if $gameDay < $assistant.coolOffUntil>>
<<set _dateNote = "You agreed to cool it. That includes her place.">>
<<elseif not _dateDay>>
<<set _dateNote = "She keeps her weekends to herself. Try Monday to Thursday.">>
<<elseif $time < 5>>
<<set _dateNote = "Too early. Ask her in the evening.">>
<<elseif $time > 6>>
<<set _dateNote = "Too late to head over now.">>
<<elseif ($gameDay - $assistant.lastDateDay) < 7>>
<<set _dateNote = "Too soon since the last time.">>
<<elseif $energy < 1>>
<<set _dateNote = "You're too worn out to make an evening of it.">>
<</if>>
<div class="phone-actions">
<<if _dateNote === "">>
<<link "Ask to come over tonight.">>
<<set $phone.assistantMsgTopic = "date">>
<<goto "Phone Assistant Reply">>
<</link>>
<<else>>
<span class="phone-btn-off">Ask to come over tonight.</span>
<</if>>
</div>
<<if _dateNote !== "">>
<div class="phone-note">//<<= _dateNote>>//</div>
<</if>>
/* Photo. Work window or home window, 5 day cooldown. */
<<set _atWork = ($weekday <= 5 and $job.attendedToday and $time >= 1 and $time <= 4)>>
<<set _atHome = ($time >= 5 and $time <= 8)>>
<<set _picNote = "">>
<<if $gameDay < $assistant.coolOffUntil>>
<<set _picNote = "You agreed to cool it. That includes this.">>
<<elseif ($gameDay - $assistant.lastNudeDay) < 5>>
<<set _picNote = "She sent one recently. Make her wait.">>
<<elseif not _atWork and not _atHome>>
<<set _picNote = "She's nowhere she could send anything. Try during work hours or in the evening.">>
<</if>>
<div class="phone-actions">
<<if _picNote === "">>
<<link "Tell her to send you something.">>
<<set $phone.assistantMsgTopic = _atWork ? "nudeWork" : "nudeHome">>
<<goto "Phone Assistant Reply">>
<</link>>
<<else>>
<span class="phone-btn-off">Tell her to send you something.</span>
<</if>>
</div>
<<if _picNote !== "">>
<div class="phone-note">//<<= _picNote>>//</div>
<</if>>
<</if>>
/* Idle text. Once a day. */
<<if $assistant.textedToday>>
<div class="phone-note">You've texted $assistant.name today.</div>
<<else>>
<div class="phone-actions">
<<link "Text $assistant.name.">>
<<set $assistant.textedToday = true>>
<<if $assistant.affair>>
<<set $phone.assistantMsgTopic = ["t2skirt", "t2hotel", "t2home"].random()>>
<<else>>
<<set $phone.assistantMsgTopic = ["t1report", "t1gym", "t1sister"].random()>>
<</if>>
<<goto "Phone Assistant Reply">>
<</link>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar assistant"><<= $assistant.name.charAt(0)>></div>
<div><div class="ph-name">$assistant.name</div><div class="ph-sub">Helion Dynamics</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<<switch $phone.assistantMsgTopic>>
/* Before the affair */
<<case "t1report">>
<div class="bubble out">Did the Kessler numbers come back?</div>
<div class="bubble in">At six. They're fine. You could have asked in the morning.</div>
<div class="bubble out">You were still up.</div>
<div class="bubble in">So were you.</div>
<<case "t1gym">>
<div class="bubble out">Saw you coming out of the gym. Didn't know you trained.</div>
<div class="bubble in">There's a lot you don't know. Most of it is none of your business.</div>
<div class="bubble out">Most of it.</div>
<div class="bubble in">Goodnight, boss.</div>
<<case "t1sister">>
<div class="bubble out">Your sister send you anything stupid today?</div>
<div class="bubble in">Stop. I'm never living that down, am I.</div>
<div class="bubble out">No.</div>
<div class="bubble in">...she did, though.</div>
/* After the affair */
<<case "t2skirt">>
<div class="bubble out">Wear the grey skirt tomorrow.</div>
<div class="bubble in">Is that a request?</div>
<div class="bubble out">No.</div>
<div class="bubble in">Fine. Grey skirt.</div>
<<case "t2hotel">>
<div class="bubble out">Still thinking about that hotel room.</div>
<div class="bubble in">Don't. I have a stand-up at nine and I'd like to be able to look at you in it.</div>
<div class="bubble in">Me too, though.</div>
<<case "t2home">>
<div class="bubble out">What are you doing?</div>
<div class="bubble in">Laundry. Very glamorous. You?</div>
<div class="bubble out">Pretending to watch TV.</div>
<div class="bubble in">Go be a husband. I'll see you in the morning.</div>
/* Photo asks */
<<case "nudeWork">>
<div class="bubble out">Bathroom. Five minutes. I want to see what's under that blouse.</div>
<<if $assistant.tier >= 3>>
<div class="bubble in">Already walking.</div>
<<else>>
<div class="bubble in">You're unbelievable. I'm in the middle of something.</div>
<div class="bubble out">Five minutes.</div>
<div class="bubble in">...Fine.</div>
<</if>>
<<case "nudeHome">>
<div class="bubble out">You were good today. Show me how good.</div>
<<if $assistant.tier >= 3>>
<div class="bubble in">I was wondering when you'd ask.</div>
<<else>>
<div class="bubble in">One. And don't get used to it.</div>
<</if>>
/* Date */
<<case "date">>
<<if $assistant.dateCount == 0>>
<div class="bubble out">Tell me where you live.</div>
<div class="bubble in">That's very forward.</div>
<div class="bubble out">It wasn't a question.</div>
<div class="bubble in">31 Harrow Street. Top buzzer, it's got my name on it. Don't park outside.</div>
<div class="bubble in">Don't bring anything. I'm cooking. Badly.</div>
<<else>>
<div class="bubble out">Tonight?</div>
<div class="bubble in">Door's on the latch after eight. Don't park outside.</div>
<</if>>
<</switch>>
</div>
/* Photo delivery. Rolled, shown and saved right here. */
<<if $phone.assistantMsgTopic == "nudeWork" or $phone.assistantMsgTopic == "nudeHome">>
<<if $phone.assistantMsgTopic == "nudeWork">>
<<set _kind = "work">>
<<set _cap = $assistant.name + ", from the office bathroom. Day " + $gameDay + ".">>
<<set $assistant.heat = Math.min($assistant.heat + 1, 10)>>
<<else>>
<<set _kind = "home">>
<<set _cap = $assistant.name + ", at home. Day " + $gameDay + ".">>
<</if>>
<<set _pool = [1, 2, 3, 4, 5].map(n => "images/characters/a/a_phone_" + _kind + n + ".jpeg").filter(p => p !== $assistant.lastNudeImg)>>
<<set _img = _pool.random()>>
<<set $assistant.lastNudeImg = _img>>
<<set $assistant.lastNudeDay = $gameDay>>
<<set _newPic = not $phone.gallery.some(g => g.img === _img)>>
<<galleryAdd _img _cap true>>
<div class="phone-photo"><img @src="_img" width="100%"></div>
<<if _newPic>><div class="phone-note"><span class="good">Saved to your gallery.</span></div><</if>>
<</if>>
/* Date departure */
<<if $phone.assistantMsgTopic == "date">>
<div class="phone-actions">
<<link "Head over." "Assistant, Date">>
<<set $energy = Math.max($energy - 1, 0)>>
<</link>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Assistant">><</link>></div>
</div><h2>$assistant.name's Flat</h2>
<<set _fromHome = Story.has($return) and ["bedroom", "kitchen", "livingroom", "bathroom"].some(t => tags($return).includes(t))>>
<<if _fromHome>>
You find $wife.name and tell her something has blown up at work and you need to go back in for a few hours.
<br><br>
<<if $wife.mood >= 1>>
She tells you not to work too hard.
<<elseif $wife.mood <= -1>>
"Again?" is all she says, and she doesn't look up.
<<else>>
She tells you to be quiet when you come in.
<</if>>
<br>
<<else>>
You text $wife.name on the way.
<br><br>
<div class="chat">
<div class="bubble out">work thing ran over. don't wait up x</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Ok. Don't work too hard 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">Again? Fine.</div>
<<else>>
<div class="bubble in">Ok. Be quiet when you come in.</div>
<</if>>
</div>
<</if>>
<br>
<<if $assistant.dateCount == 0>>
<<set _img = "images/characters/a/a_date_arrive1.jpeg">>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
She opens the door in baggy jeans and an oversized sweater. The flat is small and tidy, and she watches you look around it.
<br><br>
<<speech "Assistant" $assistant.name>>
It's not much. It's mine, though.
<</speech>>
<<speech "You" $name>>
It's nice.
<</speech>>
<<speech "Assistant" $assistant.name>>
Liar. So. What do you want to do? I've never had my boss over before. I don't know the rules.
<</speech>>
<<else>>
<<set _arrive = random(1, 4)>>
<<set _img = "images/characters/a/a_date_arrive" + _arrive + ".jpeg">>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<if _arrive == 1>>
She takes your coat at the door, then stands there holding it like she forgot what she meant to do with it.
<<elseif _arrive == 2>>
She's on the phone with her mum when she lets you in. She holds up one finger, wraps it up fast and puts the phone face down on the counter.
<<elseif _arrive == 3>>
She's already poured you a drink. She hands it to you at the door.
<<else>>
She's just out of the shower, hair still wet, in an old t-shirt and shorts. She kisses you before you're all the way through the door.
<</if>>
<br><br>
<<speech "Assistant" $assistant.name>>
So. What are we doing tonight?
<</speech>>
<</if>>
<br>
<<link "Stay in." "Assistant, Date In">><</link>>
<br>
<<if $money >= 70>>
<<link "Take her out. ($70)" "Assistant, Date Out">>
<<set $money -= 70>>
<</link>>
<<else>>
//You can't cover a night out right now. ($70)//
<</if>><h2>$assistant.name's Apartment</h2>
<<set $assistant.dateCount += 1>>
<<set $assistant.lastDateDay = $gameDay>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = 0>>
<<sexEnergy 1>>
<<addInfluence 1>>
<<addSuspicion 2>>
<<set _inPool = [1, 2, 3].filter(n => n !== $assistant.lastDateIn)>>
<<set _in = _inPool.random()>>
<<set $assistant.lastDateIn = _in>>
<<set _img = "images/characters/a/a_date_in" + _in + ".jpeg">>
<<set _sex = "images/h/a/a_h" + random(1, 10) + ".gif">>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<if _in == 1>>
She's halfway through a series and refuses to start it over for you, so she explains the first five episodes in two minutes.
<br><br>
<<speech "Assistant" $assistant.name>>
He's lying about the brother. Everyone knows except her. Keep up.
<</speech>>
<br>
You don't keep up. By the next episode she has her legs across your lap, and before it's over she's on it. She unbuttons your jeans without taking her eyes off the screen, then gives up on the screen. She peels her bike shorts off and lowers herself onto you slowly, because she's so tight it takes her a moment to take all of you. She rides you on the couch with her sweater still on, slow at first and then not, her hands on the backrest behind your head. You push the sweater up and get your mouth on her breasts, and she grinds down harder, gasping every time she takes you all the way in. When she comes she bites your shoulder through your shirt, her pussy squeezing you in hard pulses, and she keeps riding you until you come inside her.
<<elseif _in == 2>>
She picks a horror movie and says she isn't scared of horror movies. Twenty minutes in she has a grip on your arm.
<br><br>
<<speech "You" $name>>
Not scared.
<</speech>>
<<speech "Assistant" $assistant.name>>
Shut up. Distract me, then.
<</speech>>
<br>
You do. You pull her down onto the couch cushions and get her jeans off, and she keeps one eye on the TV until you're inside her. Then she forgets it's on. You fuck her on her back with her knee hooked over your arm, deep and slow, and she's so wet and tight that every stroke drags a moan out of her. She digs her nails into your back and tells you not to stop. Every scream from the TV makes her clench around you. She comes with the credits playing, squeezing your cock so hard you can barely move, and you pull her hips against you and come inside her.
<<else>>
You order pizza and argue about what to watch until it arrives. She wins. You eat on the floor on either side of the coffee table and don't really watch it.
<br><br>
<<speech "Assistant" $assistant.name>>
You're looking at me, not the movie.
<</speech>>
<<speech "You" $name>>
The movie's bad.
<</speech>>
<<speech "Assistant" $assistant.name>>
The movie's great.
<</speech>>
<br>
She drops her crust in the box, crawls around the table and kneels between your knees. She gets your jeans open and takes your cock in her mouth, slow and wet, looking up at you the whole time. When you groan she smiles around it and goes deeper. After a while she wriggles out of her jeans, climbs into your lap facing away from you and sinks down onto you, tight and slick. She leans back against your chest while you hold her hips, and you slide a hand between her legs and rub her clit until her thighs shake. She tightens around you with each roll of her hips, and when she comes she grinds down and holds you deep inside her. You finish inside her with the pizza going cold on the table.
<</if>>
<br><br>
<div class="intro-image"><img @src="_sex" width="100%"></div>
<br>
Afterward she lies against you for a while. Then she checks the time for you, because you didn't.
<br><br>
<<speech "Assistant" $assistant.name>>
You should go.
<</speech>>
<br>
<span class="warning">You get home later than you said you would.</span>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><<set _outPool = ["lasertag", "minigolf", "karaoke"].filter(d => d !== $assistant.lastDateOut)>>
<<set $assistant.lastDateOut = _outPool.random()>>
<<switch $assistant.lastDateOut>>
<<case "lasertag">><<goto "Assistant, Date Laser Tag">>
<<case "minigolf">><<goto "Assistant, Date Mini Golf">>
<<case "karaoke">><<goto "Assistant, Date Karaoke">>
<</switch>><h2>The Arcade</h2>
<<set _img = "images/characters/a/a_date_lasertag.jpeg">>
She takes five minutes to change. You take her to the old arcade out by the ring road. Most of the machines are the same ones that were there when you were a kid. At the back there's a laser tag arena.
<br><br>
<<speech "Assistant" $assistant.name>>
This is where you're taking me?
<</speech>>
<<speech "You" $name>>
This was the best thing in the world when I was in school.
<</speech>>
<<speech "Assistant" $assistant.name>>
How old are you? Is this an eighties thing?
<</speech>>
<<speech "You" $name>>
It was the two thousands. I'm not that old.
<</speech>>
<<speech "Assistant" $assistant.name>>
The two thousands is old.
<</speech>>
<br>
The kid at the counter straps you into vests that smell like everyone who has ever worn them. She laughs at yours. You're on opposite teams with a birthday party of eleven-year-olds.
<br><br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
She's good at it. She's patient, and she waits behind the same pillar for five minutes to shoot you in the back. Then she does it again. The eleven-year-olds love her.
<br><br>
<<speech "Assistant" $assistant.name>>
Best thing in the world, you said. How's it feel?
<</speech>>
<<speech "You" $name>>
I'm out of practice.
<</speech>>
<<speech "Assistant" $assistant.name>>
You're out of breath.
<</speech>>
<br>
She beats you three games out of three and makes you buy her a slushie with the prize tickets. In the car she's still smiling.
<br><br>
<<link "Back to hers." "Assistant, Date Back">><</link>><h2>The Mini Golf</h2>
<<set _img = "images/characters/a/a_date_minigolf.jpeg">>
<<set _flashA = "images/h/a/a_date_minigolf_flash1.jpeg">>
<<set _flashB = "images/h/a/a_date_minigolf_flash2.jpeg">>
<<set _repeat = $phone.gallery.some(g => g.img === _flashA)>>
<<if not _repeat>>
<<set _flash = _flashA>>
<<elseif not $phone.gallery.some(g => g.img === _flashB)>>
<<set _flash = _flashB>>
<<else>>
<<set _flash = [_flashA, _flashB].random()>>
<</if>>
<<set _newPic = not $phone.gallery.some(g => g.img === _flash)>>
She takes five minutes to change, and you drive out to the mini golf by the retail park. Eighteen holes, fake rocks, a windmill that doesn't turn. She takes her putter from the man at the hut like it's a serious piece of equipment.
<br><br>
<<speech "Assistant" $assistant.name>>
Let's make it interesting. Loser does a dare.
<</speech>>
<<speech "You" $name>>
Any dare?
<</speech>>
<<speech "Assistant" $assistant.name>>
Any dare. Scared?
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
She's competitive in a way she never is at work. She talks while you putt. She claims the fake rock moved. She's two up by the twelfth, and then she starts missing the short ones because she keeps looking at you instead of the ball. You win on the last hole by one stroke.
<br><br>
<<if _repeat>>
<<speech "Assistant" $assistant.name>>
Same dare?
<</speech>>
<<speech "You" $name>>
Same dare.
<</speech>>
<<else>>
<<speech "Assistant" $assistant.name>>
Fine. Go on, then.
<</speech>>
<<speech "You" $name>>
Flash me.
<</speech>>
<</if>>
<br>
She looks back at the hut. The man is reading his phone. She steps behind the windmill, where you're the only one who can see her.
<br><br>
<<speech "Assistant" $assistant.name>>
Get your phone out. You'll want something to remember me losing by.
<</speech>>
<br>
She pulls her top off over her head and holds it balled up in one hand.
<br><br>
<div class="intro-image"><img @src="_flash" width="100%"></div>
<<galleryAdd _flash ($assistant.name + " paid up. Day " + $gameDay + ".") true>>
<<if _newPic>><span class="good">Saved to your gallery.</span><</if>>
<br><br>
She pulls it back on and hands you her putter.
<br><br>
<<speech "Assistant" $assistant.name>>
<<if _repeat>>
You're going to run out of luck one of these days.
<<else>>
Rematch next time. Different dare.
<</if>>
<</speech>>
<br>
<<link "Back to hers." "Assistant, Date Back">><</link>><h2>The Karaoke Bar</h2>
<<set _img = "images/characters/a/a_date_karaoke.jpeg">>
<<set _handsy = "images/h/a/a_date_karaoke_handsy.gif">>
She takes five minutes to change, and you get a cab into town. You book a private room for an hour. It has a sofa, a screen, two microphones and a door that closes. She goes through the song list like she's reading a menu.
<br><br>
<<speech "Assistant" $assistant.name>>
You're singing.
<</speech>>
<<speech "You" $name>>
I'm watching.
<</speech>>
<<speech "Assistant" $assistant.name>>
You're my boss. You have to lead by example.
<</speech>>
<br>
She picks a power ballad and sings it standing on the sofa. She's terrible, and she knows, and she doesn't care.
<br><br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
Then she makes you do a duet. She picks something slow, and she stays on her feet while you stay on the sofa.
<br><br>
Halfway through the first verse she steps in close and sings her part right at you. She puts her knee up on the sofa between your legs, and by the chorus she has slid it up the inside of your thigh until it's pressed against your cock. She keeps it there and keeps singing. You lose your place in the lyrics.
<br><br>
<<speech "Assistant" $assistant.name>>
Your line.
<</speech>>
<br>
<div class="intro-image"><img @src="_handsy" width="100%"></div>
<br>
There's a knock on the door. She's back on her own side of the sofa by the time the waiter comes in with the drinks. He puts them down and leaves. She's laughing so hard she can't breathe.
<br><br>
<<speech "Assistant" $assistant.name>>
Your face.
<</speech>>
<<speech "You" $name>>
We're leaving.
<</speech>>
<<speech "Assistant" $assistant.name>>
We have forty minutes left.
<</speech>>
<<speech "You" $name>>
We're leaving.
<</speech>>
<br>
<<link "Back to hers." "Assistant, Date Back">><</link>><h2>$assistant.name's Apartment</h2>
<<set $assistant.dateCount += 1>>
<<set $assistant.lastDateDay = $gameDay>>
<<set $arousal = 0>>
<<sexEnergy 1>>
<<addInfluence 2>>
<<addSuspicion 3>>
<<set $phone.assistantUnread = true>>
<<set _sex = "images/h/a/a_h" + random(1, 10) + ".gif">>
<<set _back = random(1, 3)>>
<<switch $assistant.lastDateOut>>
<<case "lasertag">>She's still teasing you about the vest on the stairs up to her apartment. You shut her up against the door.
<<case "minigolf">>On the stairs she asks if you've looked at the photo yet. You have.
<<case "karaoke">>She doesn't let go of your belt the whole way up the stairs.
<</switch>>
<br><br>
<<if _back == 1>>
She doesn't turn the lights on. She pulls her top over her head in the hall and walks backward into the bedroom, and you follow. She pushes you down on the bed, gets your jeans off and climbs on top. She sinks onto you slowly, so tight that she has to stop halfway and catch her breath. Then she rides you hard, hands on your chest, her nails leaving marks. You hold her hips and pull her down onto every thrust until she's gasping. When she comes she says your name, her pussy clenching around you in long pulses. You roll her over and finish inside her with her legs wrapped around you.
<<elseif _back == 2>>
She kicks her shoes off and gets out of the rest of her clothes on the way across the bedroom, leaving them where they fall. She bends over the end of the bed and looks back at you over her shoulder. You take her from behind, one hand on her hip, the other in her hair. She's soaked and tight, and she pushes back on every stroke, taking you as deep as you'll go. You pull her hair a little and she moans into the sheets and asks for it harder. She comes squeezing you so hard you nearly lose it, and you follow a few strokes later, deep inside her.
<<else>>
She doesn't make it to the bedroom. In the kitchen she hops up onto the counter, pulls you in by the belt and kisses you while she gets your jeans open. You drag her jeans and panties off, and she wraps her legs around your waist and guides you in. She's tight and wet, and she gasps against your mouth as you push all the way inside. You fuck her on the edge of the counter, her arms around your neck, the mugs rattling on the shelf behind her. She comes with her heels digging into your back, squeezing you until you can't hold back, and you come deep inside her. Then you carry her to bed.
<</if>>
<br><br>
<div class="intro-image"><img @src="_sex" width="100%"></div>
<br>
She falls asleep on your chest. You wait until her breathing slows, then get dressed in the dark.
<br><br>
<<set $time = $timeMax>>
<span class="warning">It's very late when you get home.</span>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>>