/* ═══════════════════════════════════════════════════
THORNFIELD UNIVERSITY — STUDENT X-CHANGE PROGRAMME
MASTER VARIABLE INITIALISATION
All game state lives here.
═══════════════════════════════════════════════════ */
/* ─── Player Character ─── */
<<set $pc = {
/* Identity */
maleFirstName: "",
femaleFirstName: "",
lastName: "",
age: 18,
gender: "male",
orientation: "heterosexual",
reason: "",
/* Male Appearance (pre-transform) */
maleHeight: "average",
/* Female Appearance (post-transform, set during CC) */
race: "white",
skinTone: "light",
bodyType: "slender",
weight: "average",
height: "average",
breastSize: "C",
buttSize: "average",
hairColour: "blonde",
hairLength: "long",
hairStyle: "straight",
eyeColour: "hazel",
/* Grooming */
pubicHair: 0,
legHair: 0,
lastShaved: 0,
/* Core Stats (0-100) */
energy: 100,
health: 100,
mood: 70,
stress: 10,
arousal: 0,
confidence: 50,
willpower: 60,
intelligence: 50,
femininity: 10,
/* Beauty System (composite) */
beautyBase: 40,
beautyGrooming: 0,
beautyMakeup: 0,
beautyClothing: 0,
beautySkincare: 0,
beautyFitness: 0,
beautyTotal: 40,
lastGymDay: 0,
/* Makeup */
makeupStyle: "none",
makeupApplied: false,
/* Hair & Grooming */
hairStyle: "straight",
pubicStyle: "natural",
/* Modifications */
tattoos: [],
piercings: [],
/* Sex Stats */
sexStats: {
oral: 1, vaginal: 1, anal: 0,
handjob: 1, flexibility: 1, stamina: 1,
dirtyTalk: 0, deepThroat: 0, squirting: 0
}
}>>
/* ─── Scholarship (CCUMDUP) ─── */
<<set $scholarship = {
active: true,
weeklyQuota: 5,
finalsQuota: 10,
currentWeekServiced: 0,
currentWeekCredits: 0,
totalServiced: 0,
totalCredits: 0,
rating: 5.0,
totalRatings: 0,
ratingSum: 0,
onProbation: false,
probationWeeks: 0,
isFinalsWeek: false,
selfiesPending: 0,
housingTier: "standard",
weekLog: [],
allTimeLogs: [],
weeklyHistory: [],
activeRequest: null,
inService: false,
/* Fairness */
totalServices: 0,
mercyActive: true,
rerollAvailable: true,
rerollDay: 0,
requestsToday: 0
}>>
/* ─── University Settings ─── */
<<set $university = {
name: "Thornfield University",
demographics: {
white: 40,
black: 25,
asian: 15,
latina: 15,
other: 5
},
maleRatio: 60,
femaleRatio: 40,
difficulty: "normal",
quotaMultiplier: 1.0,
requestFrequency: 2.5,
academicDifficulty: 1.0
}>>
/* ─── World / Calendar ─── */
<<set $world = {
time: 480,
day: 1,
dayOfWeek: 1,
week: 1,
semester: 1,
year: 1,
month: 9,
dayOfMonth: 1,
yearActual: 2025,
season: "autumn",
isSpringBreak: false,
isSummerBreak: false,
isFinalsWeek: false
}>>
/* ─── Transformation ─── */
<<set $transformation = {
pillType: "petite",
pointsTotal: 0,
pointsSpent: 0,
pointsRemaining: 0,
addons: {
birthControl: false,
stdProtection: false,
rest: false,
noPeriod: false,
intelligenceBoost: false,
flexibility: false,
noHair: false,
gagReflex: false,
metabolismControl: false,
stretchy: false,
wet: false,
libidoIncrease: false
},
sideEffects: {
memoryLoss: 0,
randomOrgasm: 0,
sexualFluidAddiction: 0,
bimbofication: 0,
squirting: 0,
orgasmDenial: 0,
lactation: 0,
increasedSensitivity: 0,
submissive: 0,
strongOrgasms: 0,
fertility: 0,
internalHeat: 0,
exhibitionist: 0,
pheromones: 0,
oralLover: 0,
analLover: 0,
eroticDreams: 0,
masturbationDenial: 0
}
}>>
/* ─── Skills ─── */
<<set $skills = {
oral: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "💋", name: "Oral", category: "sexual" },
vaginal: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "🔥", name: "Vaginal", category: "sexual" },
anal: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "🍑", name: "Anal", category: "sexual" },
handjob: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "✋", name: "Handjob", category: "sexual" },
stamina: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "💪", name: "Stamina", category: "sexual" },
flexibility: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "🤸", name: "Flexibility", category: "sexual" },
dirtyTalk: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "🗣️", name: "Dirty Talk", category: "sexual" },
deepThroat: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "😮", name: "Deep Throat", category: "sexual" },
intelligence: { level: 3, xp: 0, xpNext: 100, lastUsed: 0, icon: "🧠", name: "Intelligence", category: "academic" },
studying: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "📚", name: "Studying", category: "academic" },
charm: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "✨", name: "Charm", category: "social" },
persuasion: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "🤝", name: "Persuasion", category: "social" },
composure: { level: 1, xp: 0, xpNext: 100, lastUsed: 0, icon: "🧘", name: "Composure", category: "social" },
camSkill: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "📷", name: "Cam Work", category: "performance" },
dance: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "💃", name: "Dance", category: "performance" },
cheerleading: { level: 0, xp: 0, xpNext: 100, lastUsed: 0, icon: "📣", name: "Cheerleading", category: "performance" }
}>>
/* ─── NPCs ─── */
<<set $npcs = []>>
<<set $npcs_named = {}>>
<<set $npcIdCounter = 1000>>
/* ─── Inventory & Wardrobe ─── */
<<set $inventory = {
wardrobe: [],
currentOutfit: {
top: null, bottom: null, dress: null,
bra: null, underwear: null, shoes: null,
accessories: []
},
styleIdentity: "none",
razors: 3,
skincareUses: 0,
makeupUses: { natural: 3, glam: 0, goth: 0, bimbo: 0, slutty: 0 },
hasLaptop: false,
hasWebcam: false,
hasCamera: false,
sexToys: [],
condoms: 0,
pregnancyTests: 0,
onPill: false,
hasIUD: false,
drugs: {}
}>>
/* ─── Finance ─── */
<<set $finance = {
money: 0,
debt: 0,
transactions: [],
totalEarned: 0,
totalSpent: 0
}>>
/* ─── Jobs ─── */
<<set $jobs = {
current: [],
onShift: false,
shiftJob: "",
barista: { active: false, shifts: 0, tips: 0, performance: 50, tier: 0 },
bartender: { active: false, shifts: 0, tips: 0, performance: 50, tier: 0 },
tutor: { active: false, sessions: 0, students: 0, performance: 50, tier: 0 },
cheerleader: { active: false, practicesMissed: 0, gamesAttended: 0, hasOutfit: false, teamRank: 0, practiceDay: 0 },
camGirl: { active: false, shows: 0, viewers: 50, tokens: 0, rating: 0, hasRingLight: false, tier: 0 },
fansOnly: { active: false, subs: 0, posts: 0, revenue: 0, lastPostDay: 0, contentTypes: [] },
stripper: { active: false, shifts: 0, tips: 0, regulars: 0, canBackRoom: false, tier: 0 },
hooker: { active: false, clients: 0, earnings: 0, arrested: 0, phoneUnlocked: false, tier: 0 },
dealer: { active: false, stock: { weed: 0, ecstasy: 0, cocaine: 0 }, earnings: 0, heatLevel: 0, supplierUnlocked: false }
}>>
/* ─── Pregnancy ─── */
<<set $pregnancy = {
isPregnant: false,
weeksPregnant: 0,
discovered: false,
fatherName: "",
fatherId: "",
fatherRace: "",
decisions: [],
outcome: "",
children: [],
totalPregnancies: 0
}>>
/* ─── Journal ─── */
<<set $journal = {
entries: [],
autoGenerate: true,
lastEntryDay: 0
}>>
/* ─── Phone ─── */
<<set $phone = {
messages: [],
contacts: [],
nextMessageId: 1,
campusHub: {
activeRequests: [],
completedToday: [],
selfieQueue: [],
weeklyStats: {},
notifications: []
},
chirpr: {
followers: 0,
tweets: [],
canTweet: true,
trending: []
},
fansOnly: {
active: false,
subscribers: 0,
posts: 0,
revenue: 0,
price: 9.99
},
instaGlam: {
followers: 0,
posts: 0,
engagement: 0
},
theme: "default",
notifications: 0
}>>
/* ─── Sorority / Greek Life ─── */
<<set $greekLife = {
pledging: false,
member: false,
sorority: "",
pledgeWeek: 0,
hazingComplete: false,
sisterhood: 0,
rank: "pledge",
eventsAttended: 0,
fratPartiesAttended: 0
}>>
/* ─── Jobs ─── */
<<set $jobs = {
current: [],
cheerleader: { active: false, practicesMissed: 0, gamesAttended: 0, hasOutfit: false },
camGirl: { active: false, shows: 0, viewers: 0, tokens: 0, rating: 0 },
fansOnly: { active: false, subs: 0, posts: 0, revenue: 0 },
hooker: { active: false, clients: 0, earnings: 0, arrested: 0 },
dealer: { active: false, stock: {}, earnings: 0, heatLevel: 0 },
barista: { active: false, shifts: 0 },
bartender: { active: false, shifts: 0 },
tutor: { active: false, sessions: 0 }
}>>
/* ─── Substances ─── */
<<set $substances = {
drunkLevel: 0,
drinksToday: 0,
lastDrinkTime: 0,
hangover: false,
hangoverSeverity: 0,
alcoholTolerance: 0,
weed: { high: false, doses: 0, tolerance: 0 },
ecstasy: { high: false, rolling: false, comedown: false, doses: 0, tolerance: 0 },
cocaine: { high: false, doses: 0, tolerance: 0, addiction: 0 }
}>>
/* ─── Reputation ─── */
<<set $reputation = {
slut: 0,
partyGirl: 0,
goodStudent: 50,
camGirl: 0,
sweetheart: 30,
troublemaker: 0,
popular: 20
}>>
/* ─── Hygiene ─── */
<<set $hygiene = {
cleanliness: 100,
lastShower: 0,
lastShowerTime: 0
}>>
/* ─── Journal ─── */
<<set $journal = {
entries: [],
autoGenerate: true,
lastEntryDay: 0
}>>
/* ─── Roommate ─── */
<<set $roommate = {
name: "",
gender: "female",
personality: "",
race: "",
appearance: {},
opinion: 50,
trust: 30,
awareness: 0,
walkedIn: 0,
sharedClothes: false,
isConfidant: false,
events: []
}>>
/* ─── UI State ─── */
<<set $ui = {
toastQueue: [],
phoneOpen: false,
phoneApp: "home",
leftPanelTab: "nav",
activePopup: null,
popupData: {},
lastToastId: 0
}>>
/* ─── Roll System State ─── */
<<set $lastRoll = {
skill: "",
skillLevel: 0,
difficulty: 0,
baseChance: 0,
modifiers: [],
finalChance: 0,
rolled: 0,
outcome: "",
xpGained: 0,
leveledUp: false,
newLevel: 0
}>>
/* ─── Flags ─── */
<<set $flags = {
introComplete: false,
transformationComplete: false,
firstService: false,
firstOrgasm: false,
firstAnal: false,
firstGroup: false,
firstPregnancy: false,
firstDrunk: false,
firstBlackout: false,
firstArrest: false,
firstCamShow: false,
firstFansOnlyPost: false,
ccComplete: false,
orientationComplete: false,
metRoommate: false,
metMentor: false
}>>
/* ─── Campus State ─── */
<<set $campus = {
encountersSeen: 0,
lastEncounterDay: 0
}>>
/* ─── Greek Life ─── */
<<set $greekLife = {
pledging: false,
member: false,
sorority: "",
pledgeStage: 0,
hazingComplete: false,
sisterhood: 0,
rank: "none",
eventsAttended: 0,
fratPartiesAttended: 0,
lastPartyDay: 0,
rushAvailable: false,
rushDeclined: false
}>>
/* ─── Substances ─── */
<<set $substances = {
drunkLevel: 0,
drinksToday: 0,
lastDrinkTime: 0,
hangover: false,
hangoverSeverity: 0,
alcoholTolerance: 0,
weed: { high: false, doses: 0, tolerance: 0 },
ecstasy: { high: false, rolling: false, comedown: false, doses: 0, tolerance: 0 },
cocaine: { high: false, doses: 0, tolerance: 0, addiction: 0 }
}>>
/* ─── Social ─── */
<<set $social = {
clubsMember: [],
eventsAttended: 0,
lastEventDay: 0
}>>
/* ─── Academic System ─── */
<<set $academic = {
classes: [],
professors: [],
currentSemester: 1,
gpa: 0,
probationWarnings: 0,
totalAttended: 0,
totalSkipped: 0,
classesChosen: false
}>>
/* ─── Gym Tracking ─── */
<<set $gym = {
totalVisits: 0,
workedOutToday: false
}>>
/* ─── NPC Tracking ─── */
<<set $npcIdCounter = 0>>
/* ─── Scholarship / Service Tracking ─── */
<<set $scholarship = {
rating: 5.0,
totalRatings: 0,
ratingSum: 0,
currentWeekServiced: 0,
currentWeekCredits: 0,
totalServiced: 0,
totalCredits: 0,
totalServices: 0,
weeklyQuota: 5,
finalsQuota: 10,
isFinalsWeek: false,
onProbation: false,
mercyActive: true,
activeRequest: null,
requestsToday: 0,
inService: false,
lastServiceDay: 0
}>>
/* ─── Health Tracking ─── */
<<set $health = {
hasSTD: false,
stdType: null,
birthControlActive: false,
birthControlDays: 0,
adjustedThisSemester: false
}>>
/* ─── Pregnancy Tracking ─── */
<<set $pregnancy = {
riskFlag: false,
riskDay: 0,
isPregnant: false,
confirmedDay: 0,
terminated: false
}>>
/* ─── Inventory (Starlet-style) ─── */
<<set $inventory = {
wardrobe: [
{id: "clinic_tshirt", name: "Clinic T-Shirt", type: "top", style: "vanilla", quality: "basic", sexy: 0, beauty: 0, price: 0, description: "A plain white t-shirt from the CCUMDUP clinic. Smells faintly of antiseptic.", icon: "top"},
{id: "clinic_sweats", name: "Clinic Sweatpants", type: "bottom", style: "vanilla", quality: "basic", sexy: 0, beauty: 0, price: 0, description: "Grey sweatpants. Comfortable but shapeless.", icon: "bottom"},
{id: "clinic_underwear", name: "Basic Cotton Underwear", type: "underwear", style: "vanilla", quality: "basic", sexy: 0, beauty: 0, price: 0, description: "Plain white cotton briefs. Functional.", icon: "underwear"},
{id: "clinic_bra", name: "Sports Bra", type: "bra", style: "vanilla", quality: "basic", sexy: 0, beauty: 0, price: 0, description: "A basic sports bra. Supportive but not flattering.", icon: "bra"},
{id: "clinic_sneakers", name: "White Sneakers", type: "shoes", style: "vanilla", quality: "basic", sexy: 0, beauty: 1, price: 0, description: "Clean white sneakers. At least they match everything.", icon: "shoes"}
],
currentOutfit: {
top: "clinic_tshirt",
bottom: "clinic_sweats",
dress: null,
bra: "clinic_bra",
underwear: "clinic_underwear",
shoes: "clinic_sneakers",
accessories: []
},
styleIdentity: "vanilla",
/* Consumables */
razors: 3,
skincareUses: 0,
makeupUses: { natural: 3, glam: 0, goth: 0, bimbo: 0, slutty: 0 },
/* Equipment */
hasLaptop: false,
hasWebcam: false,
hasCamera: false,
hasRingLight: false,
sexToys: [],
/* Contraception */
condoms: 0,
pregnancyTests: 0,
onPill: false,
hasIUD: false,
/* Drugs */
drugs: {}
}>>
/* ─── Corruption (hidden score 0-100) ─── */
<<set $corruption = {
score: 0,
tier: "innocent",
lastGain: ""
}>>
/* ─── The Velvet Room (BDSM Club) ─── */
<<set $velvetRoom = {
discovered: false,
visited: false,
membership: "none",
sessionsAttended: 0,
subTraining: 0,
domTraining: 0,
lastVisitDay: 0,
petPlayUnlocked: false,
bondageUnlocked: false,
impactUnlocked: false
}>>
/* ─── Blackmail System ─── */
<<set $blackmail = {
active: false,
blackmailer: "",
evidenceType: "",
stage: 0,
totalPaid: 0,
totalComplied: 0,
investigating: false,
cluesFound: 0,
resolved: false,
resolutionType: ""
}>>
/* ─── Hypnosis — Dr. Crane ─── */
<<set $hypnosis = {
discovered: false,
sessionsAttended: 0,
conditioningLevel: 0,
triggersPlanted: [],
playerAware: false,
consenting: false,
lastSessionDay: 0
}>>
/* ─── Body Writing ─── */
<<set $bodyWriting = {
active: false,
texts: [],
lastAppliedDay: 0,
totalWritten: 0
}>>
/* ─── Dreams ─── */
<<set $dreams = {
lastDreamDay: 0,
totalDreams: 0,
lastDreamType: "",
recurringTheme: ""
}>>
/* ─── Calendar Events ─── */
<<set $calendar = {
dynamicEvents: [],
notificationsSeen: []
}>>
/* ─── Glory Holes ─── */
<<set $gloryHole = {
libraryDiscovered: false,
barDiscovered: false,
timesUsed: 0,
lastVisitDay: 0
}>>
/* ─── Temp (ephemeral state for multi-passage flows) ─── */
<<set $temp = {}>><<goto "CharacterCreation_Intro">><<set $ui.ccMode = true>>
<div class="cc-header">
<h1>Thornfield University</h1>
<div class="tagline">Student X-Change Programme</div>
</div>
<div class="cc-section">
<p>You stare at the letter in your hands, reading it for the third time. The words haven't changed.</p>
<p><em>Dear Student,</em></p>
<p><em>We are pleased to inform you that you have been selected for the College Campus Unity & Morale Development Uplift Program (CCUMDUP). This prestigious scholarship provides FULL tuition coverage, priority housing, and a generous living stipend.</em></p>
<p><em>In exchange, you will participate in specialized student support services, details of which are outlined in the enclosed agreement.</em></p>
<p><em>To accept, please report to the Thornfield University Student Services Office no later than September 1st.</em></p>
<p>Full tuition. Free housing. No more ramen dinners and maxed-out credit cards. There's just one small catch — the programme requires you to take X-Change Petite for the duration of your enrolment.</p>
<p>Three years as a woman. Three years of... "support services."</p>
<p>You look at the stack of overdue bills on your desk. Then back at the letter.</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">Continue →</span>' "CC_Reason">><</link>>
</div><div class="cc-section">
<div class="cc-section__title">📝 Why are you doing this?</div>
<div class="cc-section__subtitle">Your reason shapes how you approach the programme.</div>
<div class="choice-group">
<<link '<span class="choice-btn">💸 "I can\'t afford tuition any other way."<br><small>Poverty background — you need this desperately.</small></span>' "CC_MaleName">>
<<set $pc.reason = "poverty">>
<</link>>
<<link '<span class="choice-btn">🎲 "I lost a bet with my fraternity."<br><small>Dare/prank — your bros will never let you live this down.</small></span>' "CC_MaleName">>
<<set $pc.reason = "bet">>
<</link>>
<<link '<span class="choice-btn">🔍 "I\'m genuinely curious about the experience."<br><small>Exploration — you\'ve always wondered what it would be like.</small></span>' "CC_MaleName">>
<<set $pc.reason = "curious">>
<</link>>
<<link '<span class="choice-btn">👨👩👦 "My parents signed me up without asking."<br><small>Forced — they needed the money and didn\'t give you a choice.</small></span>' "CC_MaleName">>
<<set $pc.reason = "forced">>
<</link>>
<<link '<span class="choice-btn">🏠 "I want the premium housing and perks."<br><small>Opportunist — you\'re in it for the lifestyle upgrade.</small></span>' "CC_MaleName">>
<<set $pc.reason = "opportunist">>
<</link>>
<<link '<span class="choice-btn">🌈 "I\'m already questioning my gender identity."<br><small>Identity — this feels like an opportunity, not a sacrifice.</small></span>' "CC_MaleName">>
<<set $pc.reason = "identity">>
<</link>>
</div>
</div><div class="cc-section">
<div class="cc-section__title">👤 Your Identity (Male)</div>
<div class="cc-section__subtitle">Enter your current name — the one on your student ID.</div>
<div style="margin-bottom: var(--space-lg);">
<label style="display:block; color: var(--text-secondary); margin-bottom: var(--space-xs); font-size: var(--text-sm);">First Name</label>
<<textbox "$pc.maleFirstName" "" autofocus>>
</div>
<div style="margin-bottom: var(--space-lg);">
<label style="display:block; color: var(--text-secondary); margin-bottom: var(--space-xs); font-size: var(--text-sm);">Last Name</label>
<<textbox "$pc.lastName" "">>
</div>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">Continue →</span>' "CC_FemaleName">><</link>>
</div><div class="cc-section">
<div class="cc-section__title">👩 Your New Identity (Female)</div>
<div class="cc-section__subtitle">Choose your female name. Your surname ($pc.lastName) stays the same.</div>
<div style="margin-bottom: var(--space-lg);">
<label style="display:block; color: var(--text-secondary); margin-bottom: var(--space-xs); font-size: var(--text-sm);">Female First Name</label>
<<textbox "$pc.femaleFirstName" "" autofocus>>
</div>
<p style="color: var(--text-tertiary); font-size: var(--text-sm);">This is what everyone will call you for the next three years.</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">Continue to Appearance →</span>' "CC_Appearance">><</link>>
</div><<set $temp.ccPoints = 0>>
/* Appearance costs/bonuses — set defaults */
<<set $temp.raceCost = 0>>
<<set $temp.skinCost = 0>>
<<set $temp.orientCost = 0>>
<<set $temp.bodyCost = 0>>
<<set $temp.weightCost = 0>>
<<set $temp.heightCost = 0>>
<<set $temp.breastCost = 0>>
<<set $temp.assCost = 0>>
<<set $temp.eyeCost = 0>>
<<set $temp.hairColCost = 0>>
<<set $temp.hairLenCost = 0>>
<<set $temp.hairStyleCost = 0>>
<div class="cc-points" id="cc-points-display">
<span>Available Points:</span>
<span class="cc-points__value" id="cc-points-value">0</span>
</div>
<div class="cc-section">
<div class="cc-section__title">🎨 Female Appearance</div>
<div class="cc-section__subtitle">Design your new body. Some choices cost points, others earn them. You'll earn points from side effects next.</div>
</div>
/* All grids rendered by JS */
<div class="cc-section"><div class="cc-section__title">Race / Ethnicity</div><div class="cc-grid" id="cc-race"></div></div>
<div class="cc-section"><div class="cc-section__title">Sexual Orientation</div><div class="cc-grid" id="cc-orient"></div></div>
<div class="cc-section"><div class="cc-section__title">Body Type</div><div class="cc-grid" id="cc-body"></div></div>
<div class="cc-section"><div class="cc-section__title">Weight</div><div class="cc-grid" id="cc-weight"></div></div>
<div class="cc-section"><div class="cc-section__title">Height</div><div class="cc-grid" id="cc-height"></div></div>
<div class="cc-section"><div class="cc-section__title">Breasts</div><div class="cc-grid" id="cc-breasts"></div></div>
<div class="cc-section"><div class="cc-section__title">Ass</div><div class="cc-grid" id="cc-ass"></div></div>
<div class="cc-section"><div class="cc-section__title">Eyes</div><div class="cc-grid" id="cc-eyes"></div></div>
<div class="cc-section"><div class="cc-section__title">Hair Colour</div><div class="cc-grid" id="cc-haircol"></div></div>
<div class="cc-section"><div class="cc-section__title">Hair Length</div><div class="cc-grid" id="cc-hairlen"></div></div>
<div class="cc-section"><div class="cc-section__title">Hair Style</div><div class="cc-grid" id="cc-hairstyle"></div></div>
<div class="cc-section"><div class="cc-section__title">Skin Tone</div><div class="cc-grid" id="cc-skin"></div></div>
<<run setTimeout(function(){ XCLC.CC.renderAllGrids(); }, 50)>>
<div class="choice-group">
<<link '<span class="choice-btn">Continue to Side Effects →</span>' "CC_SideEffects">>
/* Store appearance points total */
<<set $temp.ccPoints = $temp.raceCost + $temp.skinCost + $temp.orientCost + $temp.bodyCost + $temp.weightCost + $temp.heightCost + $temp.breastCost + $temp.assCost + $temp.eyeCost + $temp.hairColCost + $temp.hairLenCost + $temp.hairStyleCost>>
<</link>>
</div>/* Side effects — earn points by taking drawbacks */
<div class="cc-points" id="cc-points-display">
<span>Available Points:</span>
<span class="cc-points__value" id="cc-se-points"><<print $temp.ccPoints>></span>
</div>
<div class="cc-section">
<div class="cc-section__title">⚠️ Side Effects — Earn Points</div>
<div class="cc-section__subtitle">X-Change Petite comes with potential side effects. Higher levels = more points but stronger effects. Use these points to buy add-ons on the next page.</div>
</div>
<div class="cc-section">
<div id="cc-se-list"></div>
</div>
<<run setTimeout(function(){ XCLC.CC.renderSideEffects(); }, 50)>>
<div style="margin-top: var(--space-lg); text-align: center;">
<<link '<span class="choice-btn" style="background: var(--accent-red-dim); border-color: var(--accent-red); color: var(--accent-red); text-align: center;">💀 Just Fuck My Shit Up (Max All)</span>'>>
<<run XCLC.CC.maxAllSE()>>
<</link>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">Continue to Add-ons →</span>' "CC_Addons">>
<<run XCLC.CC.updateSEPoints()>>
<</link>>
</div>/* Add-ons — spend points on benefits */
<div class="cc-points" id="cc-points-display">
<span>Available Points:</span>
<span class="cc-points__value" id="cc-addon-points"><<print $temp.ccPoints>></span>
</div>
<div class="cc-section">
<div class="cc-section__title">💊 Add-ons — Spend Points</div>
<div class="cc-section__subtitle">Purchase beneficial modifications for your new body. Each costs points earned from appearance choices and side effects.</div>
</div>
<div class="cc-section">
<div id="cc-addon-list"></div>
</div>
<<run setTimeout(function(){ XCLC.CC.renderAddons(); }, 50)>>
<div class="choice-group">
<<link '<span class="choice-btn">Continue to University Settings →</span>' "CC_University">><</link>>
</div><div class="cc-section">
<div class="cc-section__title">🏛️ University Configuration</div>
<div class="cc-section__subtitle">Shape the world around you.</div>
</div>
<div class="cc-section">
<div class="cc-section__title">Difficulty</div>
<div class="cc-section__subtitle">Controls your weekly service quota and how aggressively NPCs pursue you.</div>
<div class="cc-grid" id="cc-difficulty"></div>
</div>
<div class="cc-section">
<div class="cc-section__title">Campus Demographics</div>
<div class="cc-section__subtitle">Adjust the racial distribution and gender ratio of NPCs you encounter. Sliders auto-normalize to 100%.</div>
<div id="cc-demographics"></div>
</div>
<<run setTimeout(function(){ XCLC.CC.renderUniversity(); }, 50)>>
<div class="choice-group">
<<link '<span class="choice-btn">Continue to Agreement →</span>' "CC_Agreement">><</link>>
</div><div class="cc-section">
<div class="cc-section__title">📜 CCUMDUP Scholarship Agreement</div>
<div class="cc-section__subtitle">Read carefully before signing.</div>
</div>
<div class="contract">
<h2>SCHOLARSHIP AGREEMENT</h2>
<h3>ARTICLE I: PROGRAM OVERVIEW</h3>
<p>The College Campus Unity & Morale Development Uplift Program ("CCUMDUP") provides full tuition coverage in exchange for specialized student support services.</p>
<h3>ARTICLE II: PARTICIPANT OBLIGATIONS</h3>
<p>Recipients ("Support Specialists") shall:</p>
<ul>
<li>Maintain continuous X-Change Petite transformation (provided at no cost)</li>
<li>Service minimum <<print $scholarship.weeklyQuota>> unique Premium Students ("Daddies"/"Mommies") weekly</li>
<li>Respond to service requests within 30 minutes, regardless of academic obligations</li>
<li>Address all Premium Students as "Daddy" or "Mommy" per respect protocols</li>
</ul>
<h3>ARTICLE III: SERVICE VALUATION</h3>
<ul>
<li>Standard oral/vaginal service: 1 credit</li>
<li>Anal service: 2 credits</li>
<li>Internal completion: +1 bonus credit (Pregnancy risk acknowledged)</li>
<li>Finals Week: DOUBLE quota (<<print $scholarship.finalsQuota>> minimum)</li>
</ul>
<h3>ARTICLE IV: AVAILABILITY CLAUSE</h3>
<p>Support Specialists must prioritize Daddy/Mommy de-stressing over personal activities including but not limited to: studying, sleeping, eating. Service requests received during Late Night hours carry additional rating weight if declined.</p>
<h3>ARTICLE V: RATING SYSTEM</h3>
<p>Performance is rated 1-5 stars by each Premium Student. Average rating below 4.0 triggers academic probation. Below 3.0 triggers scholarship review and potential termination.</p>
<h3>ARTICLE VI: DURATION</h3>
<p>This agreement covers the full duration of the recipient's enrollment at Thornfield University (6 semesters / 3 academic years). Early termination requires full tuition repayment.</p>
<h3>ARTICLE VII: SELFIE VERIFICATION</h3>
<p>Following each service encounter, the Support Specialist must upload a verification selfie to the CampusHub application. Failure to provide verification may result in the encounter not being counted toward weekly quota.</p>
</div>
<div style="margin-top: var(--space-xl); text-align: center;">
<p style="color: var(--text-secondary);">By continuing, you agree to all terms of the CCUMDUP Scholarship Agreement.</p>
<div class="choice-group">
<<link '<span class="choice-btn" style="background: var(--accent-primary-dim); border-color: var(--accent-primary); text-align: center;">✍️ Sign the Agreement</span>' "CC_Transformation">>
/* Finalize CC */
<<set $flags.ccComplete = true>>
<<set $pc.gender = "male">> /* Still male until transformation */
/* Apply add-on bonuses */
<<if $transformation.addons.intelligenceBoost>>
<<set $skills.intelligence.level += 2>>
<</if>>
<<if $transformation.addons.flexibility>>
<<set $skills.flexibility.level += 2>>
<</if>>
<<if $transformation.addons.libidoIncrease>>
<<set $pc.arousal = 20>>
<</if>>
/* Point resolution: remaining points → cash or debt */
<<if $temp.ccPoints > 0>>
<<set $finance.money = $temp.ccPoints * 10>>
<<elseif $temp.ccPoints < 0>>
<<set $finance.debt = Math.abs($temp.ccPoints) * 10>>
<<set $finance.money = 0>>
<<else>>
<<set $finance.money = 0>>
<</if>>
<</link>>
</div>
</div><<set $pc.gender = "female">>
<<set $flags.transformationComplete = true>>
<div class="cc-header">
<h1>The Transformation</h1>
</div>
<div class="cc-section">
<p>The clinic room is sterile white. A nurse hands you a small pink pill — X-Change Petite — and a glass of water.</p>
<p>"Take it whenever you're ready, hun. The process takes about thirty seconds."</p>
<p>You stare at the pill. Such a small thing to change everything.</p>
<<if $pc.reason === "poverty">>
<p>You think about the bills. The debt collectors. The ramen. You swallow the pill.</p>
<<elseif $pc.reason === "bet">>
<p>You think about your frat brothers laughing. <em>They'll stop laughing when they see the housing upgrade.</em> You swallow the pill.</p>
<<elseif $pc.reason === "curious">>
<p>Your heart races — not with fear, but with anticipation. You swallow the pill.</p>
<<elseif $pc.reason === "forced">>
<p>You didn't choose this. But you're here now. With a resigned sigh, you swallow the pill.</p>
<<elseif $pc.reason === "opportunist">>
<p>Three years for a free ride? Easy money. You pop the pill like a breath mint.</p>
<<elseif $pc.reason === "identity">>
<p>Your hand trembles — but not from fear. This is what you've been waiting for. You swallow the pill with a strange sense of peace.</p>
<</if>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">...</span>' "CC_Transformation2">><</link>>
</div><div class="cc-section">
<p>The change is instant and overwhelming.</p>
<p>It starts as warmth — a tingling wave that spreads from your stomach outward. Then the warmth becomes <em>heat</em>, and the heat becomes something else entirely. Your skin shifts. Your bones ache and reform. You feel yourself... <em>shrinking</em>.</p>
<p>When it's over, you're gripping the edge of the examination table, breathing hard. The nurse holds up a mirror.</p>
<p>A <<print $pc.race>> woman stares back at you. <<print $pc.height.charAt(0).toUpperCase() + $pc.height.slice(1)>>, <<print $pc.bodyType>>, with <<print $pc.hairLength>> <<print $pc.hairColour>> hair and <<print $pc.eyeColour>> eyes. <<print $pc.breastSize>> cup breasts strain against the hospital gown. Your <<print $pc.buttSize>> ass is... definitely new.</p>
<p>"Looking good, <<print $pc.femaleFirstName>>!" the nurse says brightly. "Your student ID has been updated. Your dorm room is in Hamilton Hall, Room 207."</p>
<<if $transformation.sideEffects.bimbofication > 0>>
<p>Something feels... fuzzy. Like your thoughts are moving through honey. You shake your head. Probably just the transformation.</p>
<</if>>
<<if $transformation.sideEffects.increasedSensitivity > 0>>
<p>The hospital gown against your skin feels... <em>intense</em>. Every thread, every whisper of fabric sends little sparks of sensation across your new body.</p>
<</if>>
<<if $transformation.sideEffects.lactation > 0>>
<p>Your chest feels heavy. Full. You glance down and notice two dark spots forming on the front of your gown. The nurse notices too. "Oh — that's the lactation side effect. Perfectly normal. You'll want to express regularly."</p>
<</if>>
<p>She hands you a bag of clothes — your first female outfit — and a phone with CampusHub already installed.</p>
<p>"Welcome to Thornfield, <<print $pc.femaleFirstName>>. Orientation starts tomorrow."</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">Go to your dorm room →</span>' "Orientation_DormArrival">>
<<set $flags.orientationComplete = false>>
<<initPhone>>
<</link>>
</div><<set $world.time = 1020>> /* 5:00 PM — arrived late afternoon */
<h2>🏠 Hamilton Hall — Room 207</h2>
<p>You stand in front of the door to your new dorm room, bag of clothes in one hand, phone in the other. The hallway smells like old carpet and cheap air freshener.</p>
<p>Your key card works. The door swings open to reveal a small but functional room: two single beds, two desks, a shared closet, and a tiny bathroom. One side of the room is already decorated — posters, fairy lights, a laptop, a stuffed animal on the bed.</p>
<p>Someone's already here.</p>
/* Generate a random roommate */
<<generateRoommate>>
<<include "Roommate_MeetFirstTime">>
<div class="choice-group">
<<link '<span class="choice-btn">👋 "Hey, I\'m <<print $pc.femaleFirstName>>. Nice to meet you."</span>' "Orientation_MeetRoommate_Friendly">>
<<set $roommate.opinion += 10>>
<</link>>
<<link '<span class="choice-btn">😶 Give a small wave. "Hi."</span>' "Orientation_MeetRoommate_Shy">>
<<set $roommate.opinion += 0>>
<</link>>
<<link '<span class="choice-btn">😰 Stare at her nervously. This is your first conversation as a woman.</span>' "Orientation_MeetRoommate_Nervous">>
<<set $roommate.opinion += 5>>
<</link>>
</div><<set $flags.metRoommate = true>>
<p>You shake her hand. It feels strange — your hand is so much smaller now. Softer. <<print $roommate.name>>'s grip is enthusiastic.</p>
<p>"<<print $pc.femaleFirstName>>! Love that name. So, are you a freshman too? What's your major?"</p>
<p>She doesn't wait for an answer before launching into a rapid-fire introduction: she's from Connecticut, she's undeclared but "probably gonna do communications or something," she already checked out the cafeteria ("the pasta is actually decent"), and she heard there's a welcome party at Sigma Chi tonight.</p>
<<include "Orientation_RoomSetup">><<set $flags.metRoommate = true>>
<p><<print $roommate.name>>'s smile doesn't falter. "A woman of few words! That's cool. I talk enough for both of us, trust me."</p>
<p>She wasn't kidding. Within minutes she's given you her entire life story, pointed out which desk is yours, and offered you a granola bar.</p>
<<include "Orientation_RoomSetup">><<set $flags.metRoommate = true>>
<p>Your voice comes out higher than expected. Softer. You flinch at the sound of it. <<print $roommate.name>> notices your discomfort.</p>
<p>"Hey, first day jitters? Totally normal. I cried on the drive here, don't even worry about it." She grabs your bag. "Here, let me help you settle in."</p>
<p>She's disarmingly kind. Maybe this won't be so bad.</p>
<<include "Orientation_RoomSetup">><<set $world.time = 1080>> /* 6:00 PM */
<div class="divider"><span class="divider__text">Later</span></div>
<p>You've unpacked your meager belongings. <<print $roommate.name>> lent you a towel and showed you how the shower works ("you have to jiggle the handle or it stays cold").</p>
<p>Your phone buzzes. CampusHub notification:</p>
<div class="alert alert--info">
📱 <strong>CampusHub:</strong> Welcome to the CCUMDUP Program, <<print $pc.femaleFirstName>>! Orientation is tomorrow at 9:00 AM in the Admin Building. Your first service requests will begin after orientation. Enjoy your first night!
</div>
<<set $phone.messages.push({
id: $phone.nextMessageId++,
from: "CampusHub",
icon: "📱",
text: "Welcome to CCUMDUP! Orientation tomorrow at 9 AM. Your first service requests begin after orientation.",
read: false,
day: $world.day,
time: $world.time
})>>
<p><<print $roommate.name>> peers over your shoulder. "CampusHub? Is that some student app thing? I don't think I have that one."</p>
<p>You quickly lock your phone. "Uh, yeah. Just student services stuff."</p>
<p>"Cool cool. Hey, you wanna grab dinner? The caf is open until 8."</p>
<div class="choice-group">
<<link '<span class="choice-btn">🍽️ "Sure, I\'m starving."</span>' "Orientation_Dinner">>
<<set $roommate.opinion += 5>>
<</link>>
<<link '<span class="choice-btn">😴 "I\'m actually pretty tired. Rain check?"</span>' "Orientation_Sleep">>
<<set $roommate.opinion -= 5>>
<</link>>
</div><<set $world.time = 1200>> /* 8:00 PM */
<h2>🍽️ Thornfield Dining Hall</h2>
<p>The cafeteria is buzzing with freshmen. Every table is full of nervous first-years trying to seem cool. <<print $roommate.name>> navigates the crowd like she's been here for years.</p>
<p>She was right — the pasta is decent. You eat carefully, still getting used to your smaller mouth, your narrower jaw. Everything tastes... different. More intense?</p>
<<if $transformation.sideEffects.bimbofication >= 2>>
<p><<print $roommate.name>> is saying something about her high school but you keep losing the thread. Your mind drifts. What was she talking about? Something about... volleyball?</p>
<</if>>
<<if $transformation.sideEffects.pheromones >= 2>>
<p>You notice several guys at nearby tables glancing your way. More than seems normal. One of them actively stares. <<print $roommate.name>> catches it too. "Okay, someone's popular already! He's cute, right?"</p>
<</if>>
<<if $transformation.sideEffects.exhibitionist >= 1>>
<p>You're acutely aware of how the borrowed clothes fit your new body. The t-shirt is too tight across your chest. Every time you shift, you feel eyes on you. It's... not entirely unpleasant.</p>
<</if>>
<p>"So what's your deal?" <<print $roommate.name>> asks, twirling spaghetti. "Boyfriend back home? Secret talent? Weird hobby?"</p>
<div class="choice-group">
<<link '<span class="choice-btn">🤷 "Just a regular girl trying to get through college."</span>' "Orientation_DinnerEnd">>
<<modStat "mood" 5 "Nice dinner with roommate">>
<</link>>
<<link '<span class="choice-btn">😏 "If I told you, you wouldn\'t believe me."</span>' "Orientation_DinnerEnd">>
<<modStat "confidence" 5 "Mysterious vibe">>
<<set $roommate.opinion += 5>>
<</link>>
</div><<set $world.time = 1260>> /* 9:00 PM */
<p>You walk back to the dorm together. The campus is beautiful at night — old stone buildings lit with warm lights, oak trees lining the walkways, the distant thump of music from Greek Row.</p>
<p>"That was fun," <<print $roommate.name>> says. "Roommate bonding complete. Step one: dinner. Step two: we share all our deepest secrets. But that can wait."</p>
<p>She yawns. "I'm gonna crash. Big day tomorrow. Night, <<print $pc.femaleFirstName>>!"</p>
<p>You lie in bed in your new body, staring at the ceiling. The mattress feels different. Everything feels different. Your hair splays across the pillow in ways it never used to. Your chest rises and falls with unfamiliar weight.</p>
<<if $transformation.sideEffects.eroticDreams >= 1>>
<p>As sleep takes you, your dreams are... vivid. <em>Very</em> vivid. You wake up once in the night, flushed and breathing hard, the sheets tangled around your legs.</p>
<</if>>
<p>Tomorrow, orientation. And then... your new life begins.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💤 Sleep</span>' "Day1_Morning">>
<<sleep>>
<<set $flags.orientationComplete = false>>
<</link>>
</div><<set $world.time = 1200>>
<p>"No worries! I'll bring you back a cookie." <<print $roommate.name>> waves and bounces out the door.</p>
<p>Alone. You sit on the edge of your new bed and just... breathe. You catch your reflection in the bathroom mirror across the room. A stranger looks back. A pretty stranger with <<print $pc.hairColour>> hair and <<print $pc.eyeColour>> eyes.</p>
<p>You unpack what little you have. The bag from the clinic had: a basic bra and underwear set, a plain t-shirt, yoga pants, and flip-flops. That's your entire wardrobe.</p>
<p><<print $roommate.name>> returns later with a cookie as promised. "Night, <<print $pc.femaleFirstName>>!"</p>
<p>Sleep comes slowly. Everything is different.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💤 Sleep</span>' "Day1_Morning">>
<<sleep>>
<<set $flags.orientationComplete = false>>
<</link>>
</div><<set $world.dayOfWeek = 1>>
<<set $world.time = 420>> /* 7:00 AM */
<<set $pc.energy = 100>>
<<set $pc.mood = 60>>
<h2>☀️ Day 1 — Monday Morning</h2>
<p>The alarm goes off at 7 AM. For a confused moment you don't know where you are. Then you feel the weight on your chest, the hair in your face, and it all comes flooding back.</p>
<p><<print $roommate.name>>'s already up, wrapped in a towel, doing something complicated with an eyeliner pencil in front of the bathroom mirror.</p>
<p>"Morning, sunshine! Bathroom's all yours in two minutes. Orientation at nine, don't be late!"</p>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Take a shower and get ready</span>' "Day1_Routine">>
<<shower>>
<</link>>
<<link '<span class="choice-btn">⏩ Skip the shower, just get dressed</span>' "Day1_Dressed">><</link>>
</div><p>The shower is an experience. Everything is... different. More sensitive. The hot water hits places that didn't used to be there. You try not to think about it too much.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 2>>
<p>Scratch that — you <em>can't</em> not think about it. Every droplet feels electric on your new skin. You have to lean against the shower wall for a moment, catching your breath.</p>
<<modStat "arousal" 20 "Shower sensitivity">>
<</if>>
<<if $transformation.sideEffects.lactation >= 1>>
<p>You notice something... leaking. From your nipples. Right. The lactation side effect. You squeeze gently and a thin stream of milk hits the shower floor. That's going to take some getting used to.</p>
<</if>>
<p>You towel off, pull on the clinic clothes (your only outfit), and look at yourself in the mirror.</p>
<<include "Day1_MirrorCheck">><p>You pull on yesterday's clothes — your only outfit — and glance at yourself in the bathroom mirror.</p>
<<include "Day1_MirrorCheck">><div class="card">
<div class="card__title">🪞 Mirror Check</div>
<p>You see a <<print $pc.height>>, <<print $pc.bodyType>> <<print $pc.race>> girl with <<print $pc.hairLength>> <<print $pc.hairColour>> hair and <<print $pc.eyeColour>> eyes. <<print $pc.breastSize>> cup breasts, <<print $pc.buttSize>> ass.</p>
<p>Outfit: Basic clinic t-shirt, yoga pants, flip-flops. (No makeup, no accessories.)</p>
<p>Beauty: <<print $pc.beautyTotal>> | Hygiene: <<print $hygiene.cleanliness>>%</p>
</div>
<p><<print $roommate.name>> looks you up and down. "Girl, we need to get you some clothes. I'd lend you something but..." She gestures at her much smaller frame. "Different sizes. We'll hit the mall this weekend."</p>
<p>"Orientation's starting in 20 minutes. Let's go!"</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏛️ Head to orientation</span>' "Day1_Orientation">><</link>>
</div><<set $world.time = 540>> /* 9:00 AM */
<<set $flags.orientationComplete = true>>
<h2>🏛️ Orientation — Admin Building Auditorium</h2>
<p>The auditorium is packed with freshmen. You and <<print $roommate.name>> find seats near the back. A woman in a sharp blazer takes the podium.</p>
<p>"Welcome to Thornfield University! I'm Dean Victoria Ashford. For the next three years, this campus is your home..."</p>
<p>The speech is the usual stuff — academics, community, school spirit, blah blah. But then she says something that makes your stomach flip.</p>
<p>"...and we are especially proud of our CCUMDUP scholarship recipients, whose selfless dedication to campus morale makes Thornfield the warm, welcoming community it is today. Will our CCUMDUP scholars please stand?"</p>
<p>You feel the blood drain from your face. Slowly, you stand. A handful of other girls — all transformed, all looking just as uncomfortable — stand too. The audience applauds politely. A few guys in the front row exchange knowing glances.</p>
<p>You sit back down. <<print $roommate.name>> leans over. "What's CCUMDUP? Is that like a mentoring thing?"</p>
<p>"Something like that," you mumble.</p>
<<modStat "stress" 15 "Public humiliation">>
<<modStat "confidence" -5 "Standing up at orientation">>
<<divider "Campus Tour">>
<p>After the speech, student ambassadors lead the freshmen on a campus tour. You see:</p>
<ul>
<li>📚 <strong>Lecture Halls</strong> — where your classes will be</li>
<li>📖 <strong>Library</strong> — quiet study space (and not-so-quiet upper floors)</li>
<li>💪 <strong>Gym</strong> — free for students, with locker rooms</li>
<li>🍽️ <strong>Cafeteria</strong> — meal plan included</li>
<li>🏛️ <strong>Admin Building</strong> — Dean's office, health centre</li>
<li>🎭 <strong>Student Center</strong> — clubs, events, common area</li>
<li>🏡 <strong>Greek Row</strong> — fraternities and sororities</li>
<li>🏙️ <strong>Off-Campus shuttle</strong> — runs to the mall, downtown, and back</li>
</ul>
<p>Your phone buzzes throughout the tour.</p>
<div class="alert alert--warning">
📱 <strong>CampusHub:</strong> Orientation complete! Your service window opens tomorrow. First 5 encounters benefit from the MERCY RULE — reduced difficulty. Good luck, <<print $pc.femaleFirstName>>!
</div>
<<set $phone.messages.push({
id: $phone.nextMessageId++,
from: "CampusHub",
icon: "📱",
text: "Orientation complete! Service window opens tomorrow. First 5 encounters have reduced difficulty (Mercy Rule). Good luck!",
read: false,
day: $world.day,
time: $world.time
})>>
<p>The tour ends at the Campus Quad. <<print $roommate.name>> waves goodbye — she's heading to sign up for clubs.</p>
<p>But before you explore, there's one more thing — class registration. A student ambassador hands you a tablet.</p>
<p>"Pick your classes for the semester. You need five."</p>
<div class="choice-group">
<<link '<span class="choice-btn">📚 Register for classes</span>' "ClassSelection">><</link>>
</div><<run XCLC.Service.checkForNewRequest()>>
<h2>🗺️ Campus Quad</h2>
<p>It's <<showTime>>, <<showDate>>. <<showPeriod>>.</p>
<p><<print XCLC.Campus.getAtmosphere()>></p>
<p><em><<print XCLC.Campus.getAmbient()>></em></p>
<<if $scholarship.activeRequest>>
<<set _req = $scholarship.activeRequest>>
<<set _elapsed = $world.time - _req.createdAt>>
<<set _remaining = 30 - _elapsed>>
<div class="alert alert--info">📱 <strong>CampusHub Request!</strong> <<print _req.npc.firstName>> wants <<print _req.serviceType>> at <<print _req.locationName>>. (<<print _remaining>> min remaining)</div>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Accept request</span>' "ServiceMeet">>
<<run XCLC.Service.acceptRequest()>>
<<advanceTime 10>>
<</link>>
<<link '<span class="choice-btn">❌ Decline</span>' "CampusMap">>
<<run XCLC.Service.rejectRequest()>>
<</link>>
</div>
<</if>>
<<if $hygiene.cleanliness < 40>>
<div class="alert alert--warning">⚠️ You're not exactly fresh. Maybe hit the shower before seeing anyone.</div>
<</if>>
<<if $pc.energy < 20>>
<div class="alert alert--warning">⚠️ You're exhausted. You should probably sleep.</div>
<</if>>
<<if $scholarship.currentWeekServiced < $scholarship.weeklyQuota && $world.dayOfWeek >= 4>>
<div class="alert alert--info">📱 CampusHub: You've serviced <<print $scholarship.currentWeekServiced>>/<<print $scholarship.weeklyQuota>> this week. Deadline is Sunday.</div>
<</if>>
<<set _seEvents = XCLC.Campus.checkSEPublic()>>
<<for _i = 0; _i < _seEvents.length; _i++>>
<div class="alert alert--warning"><<print _seEvents[_i].text>></div>
<<if _seEvents[_i].type === "randomOrgasm">>
<<modStat "arousal" -30 "Public orgasm">>
<<modStat "confidence" -5 "Public orgasm">>
<<modRep "slut" 3 "Public orgasm">>
<</if>>
<<if _seEvents[_i].type === "lactation">>
<<modStat "confidence" -3 "Milk stains">>
<</if>>
<</for>>
<<set _encounter = XCLC.Campus.rollEncounter()>>
<<if _encounter>>
<<set $temp.quadNPC = _encounter.npc>>
<<if _encounter.type === "approached">>
<<include "QuadEncounter_Approached">>
<<elseif _encounter.type === "catcall">>
<<include "QuadEncounter_Catcall">>
<<elseif _encounter.type === "recognize">>
<<include "QuadEncounter_Recognize">>
<<elseif _encounter.type === "fellowScholar">>
<<include "QuadEncounter_FellowScholar">>
<<elseif _encounter.type === "professorChat">>
<<include "QuadEncounter_ProfessorChat">>
<<elseif _encounter.type === "pheromones">>
<<include "QuadEncounter_Pheromones">>
<</if>>
<</if>>
<<divider "On Campus">>
<div class="choice-group">
<<link '<span class="choice-btn">🏠 Dorm Room — Hamilton Hall</span>' "DormRoom">><</link>>
<<link '<span class="choice-btn">📚 Lecture Halls — Classes & Professors</span>' "LectureHalls">><</link>>
<<link '<span class="choice-btn">📖 Library — Study & Research</span>' "Library">><</link>>
<<link '<span class="choice-btn">💪 Gym & Locker Room</span>' "Gym">><</link>>
<<link '<span class="choice-btn">🍽️ Cafeteria — Eat & Socialise</span>' "Cafeteria">><</link>>
<<link '<span class="choice-btn">🏛️ Admin Building — Dean, Health Centre</span>' "AdminBuilding">><</link>>
<<link '<span class="choice-btn">💼 Job Board — Employment</span>' "JobBoard">><</link>>
<<link '<span class="choice-btn">🎭 Student Center — Clubs & Events</span>' "StudentCenter">><</link>>
<<link '<span class="choice-btn">🏡 Greek Row — Fraternities & Sororities</span>' "GreekRow">><</link>>
<<link '<span class="choice-btn">🚻 Campus Bathrooms</span>' "CampusBathrooms">><</link>>
<<divider "Off Campus">>
<<link '<span class="choice-btn">🛍️ Mall — Shopping</span>' "Mall">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">🍸 Bar District — Nightlife</span>' "BarDistrict">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">🖋️ Ink & Iron — Tattoo & Piercing</span>' "TattooShop">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">💇 Hair Salon</span>' "HairSalon">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">💊 Drugstore</span>' "Drugstore">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">🏢 Downtown</span>' "Downtown">>
<<advanceTime 40>>
<</link>>
<<divider "Phone">>
<<link '<span class="choice-btn">📱 Phone</span>' "Phone_Home">><</link>>
</div><h2>🏠 Dorm Room — Hamilton Hall, Room 207</h2>
<p>It's <<showTime>>.
<<if $world.time < 420>>
The room is dark. Moonlight filters through the window blinds.
<<elseif $world.time < 600>>
Morning light streams through the window. Campus is waking up.
<<elseif $world.time < 720>>
The room is bright with morning sun. You can hear students heading to class outside.
<<elseif $world.time < 1020>>
Midday. The dorm is quiet — most people are in class.
<<elseif $world.time < 1200>>
Afternoon light fills the room. The campus is bustling outside.
<<elseif $world.time < 1320>>
Evening. The room feels cosy in the lamplight.
<<else>>
It's late. The building is winding down. You should probably sleep.
<</if>>
</p>
/* Roommate presence */
<<if $roommate.name>>
<<if XCLC.Roommate.isHome()>>
<p><<print $roommate.name>> is <<print XCLC.Roommate.getActivity()>>.</p>
<<else>>
<p><<print $roommate.name>> is out.</p>
<</if>>
<</if>>
/* Status warnings */
<<if $hygiene.cleanliness < 40>>
<div class="alert alert--warning">⚠️ You're not exactly fresh. Hygiene: <<print $hygiene.cleanliness>>%</div>
<</if>>
<<if $pc.arousal > 70>>
<div class="alert alert--warning">🔥 Your arousal is becoming distracting. <<print $pc.arousal>>%</div>
<</if>>
<<if $pc.energy < 20>>
<div class="alert alert--warning">😫 You're exhausted. You need to sleep.</div>
<</if>>
<<checkLactation>>
<<divider "Activities">>
<div class="choice-group">
<<link '<span class="choice-btn">💤 Go to sleep</span>' "DormRoom_Sleep">>
<<sleep>>
<</link>>
<<link '<span class="choice-btn">🚿 Take a shower</span>' "DormRoom_Shower">><</link>>
<<link '<span class="choice-btn">🪞 Look in the mirror</span>' "DormRoom_Mirror">><</link>>
<<link '<span class="choice-btn">📚 Study at your desk (1 hour)</span>' "DormRoom_Study">>
<<advanceTime 60>>
<<addXP "studying" 20>>
<<addXP "intelligence" 10>>
<<modStat "energy" -10 "Studying">>
<<modStat "stress" 5 "Studying">>
<</link>>
<<link '<span class="choice-btn">📺 Relax (30 min)</span>' "DormRoom_Relax">>
<<advanceTime 30>>
<<modStat "energy" 10 "Resting">>
<<modStat "mood" 8 "Relaxing">>
<<modStat "stress" -8 "Relaxing">>
<</link>>
<<link '<span class="choice-btn">🔥 Masturbate</span>' "DormRoom_Masturbate">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">📱 Check phone</span>' "DormRoom">>
<<run XCLC.Phone.toggle()>>
<</link>>
<<link '<span class="choice-btn">👗 Change outfit (Wardrobe)</span>' "WardrobeMenu">><</link>>
/* Grooming */
<<if $inventory.razors > 0 && ($pc.legHair > 0 || $pc.pubicHair > 0)>>
<<divider "Grooming">>
<<if $pc.legHair > 0>>
<<link '<span class="choice-btn">🪒 Shave legs (Razors: <<print $inventory.razors>>)</span>' "DormRoom">>
<<shaveLegs>>
<</link>>
<</if>>
<<if $pc.pubicHair > 0>>
<<link '<span class="choice-btn">🪒 Shave pubic area (Razors: <<print $inventory.razors>>)</span>' "DormRoom">>
<<shavePubic>>
<</link>>
<</if>>
<</if>>
<<if $inventory.skincareUses > 0>>
<<link '<span class="choice-btn">✨ Apply skincare (<<print $inventory.skincareUses>> uses)</span>' "DormRoom">>
<<applySkincare>>
<</link>>
<</if>>
/* Makeup */
<<divider "Makeup">>
<<if $pc.makeupApplied>>
<<link '<span class="choice-btn">💧 Remove makeup</span>' "DormRoom">>
<<applyMakeup "none">>
<</link>>
<</if>>
<<if !$pc.makeupApplied || $pc.makeupStyle !== "natural">>
<<if $inventory.makeupUses.natural > 0>>
<<link '<span class="choice-btn">🌿 Apply natural makeup (<<print $inventory.makeupUses.natural>> uses)</span>' "DormRoom">>
<<applyMakeup "natural">>
<</link>>
<</if>>
<</if>>
<<if !$pc.makeupApplied || $pc.makeupStyle !== "glam">>
<<if $inventory.makeupUses.glam > 0>>
<<link '<span class="choice-btn">✨ Apply glam makeup (<<print $inventory.makeupUses.glam>> uses)</span>' "DormRoom">>
<<applyMakeup "glam">>
<</link>>
<</if>>
<</if>>
/* Roommate */
<<if $roommate.name && XCLC.Roommate.isHome()>>
<<divider "Social">>
<<link '<span class="choice-btn">💬 Talk to <<print $roommate.name>></span>' "DormRoom_TalkToRoommate">><</link>>
<</if>>
<<divider "Navigation">>
<<link '<span class="choice-btn">🗺️ Leave — Campus Map</span>' "CampusMap">><</link>>
</div><<if $transformation.sideEffects.eroticDreams >= 1>>
<<set _dreamLevel = $transformation.sideEffects.eroticDreams>>
<<if _dreamLevel === 1>>
<p>Your dreams are warm and strange. Soft hands, warm breath, the feeling of someone pressed against you. You stir restlessly.</p>
<<elseif _dreamLevel === 2>>
<p>You dream of bodies — tangled, urgent. Someone's mouth on yours, hands everywhere. You moan in your sleep, hips shifting against the mattress.</p>
<<elseif _dreamLevel === 3>>
<p>The dreams are vivid enough to taste. You're being taken, roughly, enthusiastically, and you're LOVING it. You wake mid-orgasm, gasping, the sheets soaked with sweat.</p>
<<modStat "arousal" 20 "Vivid dreams">>
<<else>>
<p>The dream is so intense it feels real. Multiple partners, every hole filled, your body a conduit of pure sensation. You scream yourself awake, convulsing, your new body clenching around nothing.</p>
<<modStat "arousal" 40 "Hallucinatory dreams">>
<</if>>
<</if>>
/* ─── Dream Sequence (Phase 9) ─── */
<<checkDream>>
<p>You <<if $pc.energy >= 80>>slept well. You feel refreshed and ready.
<<elseif $pc.energy >= 50>>got some rest. Not amazing, but functional.
<<elseif $pc.energy >= 25>>didn't sleep great. You feel groggy.
<<else>>barely slept. Everything hurts and you want to die.
<</if>></p>
<p>It's <<showTime>> on <<showDate>>.</p>
<div class="choice-group">
<<link '<span class="choice-btn">⚡ Quick morning routine</span>' "QuickRoutine_Setup">><</link>>
<<link '<span class="choice-btn">🏠 Get up (do things individually)</span>' "MorningRoutine">><</link>>
</div><<shower>>
<p>The hot water cascades over your body.
<<if $transformation.sideEffects.increasedSensitivity >= 1>>
<<set _sensLevel = $transformation.sideEffects.increasedSensitivity>>
<<if _sensLevel === 1>>
Every droplet feels amplified on your skin. It's... pleasant. Very pleasant.
<<modStat "arousal" 5 "Shower sensitivity">>
<<elseif _sensLevel === 2>>
The sensation is almost overwhelming. Your nipples harden instantly and each stream of water that hits them sends a jolt through you.
<<modStat "arousal" 15 "Shower sensitivity">>
<<elseif _sensLevel >= 3>>
You have to brace yourself against the wall. The water on your skin is practically foreplay. Your breasts ache, your thighs press together, and you're breathing hard before you've even reached for the soap.
<<modStat "arousal" 25 "Shower sensitivity">>
<</if>>
<</if>>
</p>
<<if $transformation.sideEffects.lactation >= 2>>
<p>🍼 Milk runs from your nipples, mixing with the shower water. You cup your breasts and squeeze, expressing the pressure. It's surprisingly... satisfying.</p>
<<set $temp.lastExpressed = $world.time>>
<<modStat "arousal" 5 "Expressing milk">>
<</if>>
/* Roommate walk-in check */
<<set _walkIn = XCLC.Roommate.checkWalkIn('shower')>>
<<if _walkIn.walkedIn>>
<div class="card">
<div class="card__title">🚪 Interruption!</div>
<p><<print _walkIn.text>></p>
</div>
<<modStat "confidence" -3 "Walked in on">>
<</if>>
<p>You step out feeling clean and fresh.</p>
<div class="choice-group">
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>>
</div><p>You sit at your desk and open a textbook.
<<if $transformation.sideEffects.bimbofication >= 2>>
The words blur and swim. You read the same paragraph three times and still can't remember what it says. Was studying always this hard? You catch yourself doodling hearts in the margin instead of taking notes.
<<elseif $transformation.sideEffects.bimbofication === 1>>
Your concentration isn't what it used to be. Some concepts take longer to grasp than they should.
<<else>>
You manage to focus and get some productive studying done.
<</if>>
</p>
<<if $transformation.sideEffects.eroticDreams >= 2>>
<<if random(1,3) === 1>>
<p>Your mind wanders. You find yourself staring at the textbook but seeing... something else entirely. Bodies, warmth, the phantom sensation of hands on your—</p>
<p>You shake your head. Focus, <<print $pc.femaleFirstName>>.</p>
<<modStat "arousal" 10 "Daydream">>
<</if>>
<</if>>
<<if $pc.arousal > 60>>
<p>It's almost impossible to concentrate with this level of arousal. You keep shifting in your seat, thighs pressing together.</p>
<</if>>
<p>+20 Studying XP, +10 Intelligence XP</p>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><div class="card">
<div class="card__title">🪞 Your Reflection</div>
<<set _raceLabel = $pc.race.charAt(0).toUpperCase() + $pc.race.slice(1)>>
<p>A <<print _raceLabel>> girl stares back at you.
<<if $pc.bodyType === "athletic">>Toned and lean, with visible definition.
<<elseif $pc.bodyType === "hourglass">>Curves in all the right places, a classic feminine silhouette.
<<elseif $pc.bodyType === "slender">>Slim and delicate, with a model's frame.
<<else>>Soft and inviting, with generous curves.
<</if>>
</p>
<p><<print $pc.hairLength.charAt(0).toUpperCase() + $pc.hairLength.slice(1)>> <<print $pc.hairColour>> hair, <<print $pc.hairStyle>> style. <<print $pc.eyeColour.charAt(0).toUpperCase() + $pc.eyeColour.slice(1)>> eyes that are still unfamiliar every time you look.</p>
<p><<print $pc.breastSize>> Cup breasts. <<print $pc.buttSize.charAt(0).toUpperCase() + $pc.buttSize.slice(1)>> ass. <<print $pc.height.charAt(0).toUpperCase() + $pc.height.slice(1)>> height.</p>
<p>Makeup: <<if $pc.makeupApplied>><<print $pc.makeupStyle.charAt(0).toUpperCase() + $pc.makeupStyle.slice(1)>><<else>>None<</if>> |
Legs: <<if $pc.legHair === 0>>Smooth<<elseif $pc.legHair === 1>>Stubble<<else>>Needs shaving<</if>> |
Hygiene: <<print $hygiene.cleanliness>>%</p>
<p><strong>Wearing:</strong> <<print XCLC.Wardrobe.getSlotName('top') !== 'Empty' ? XCLC.Wardrobe.getSlotName('top') : (XCLC.Wardrobe.getSlotName('dress') !== 'Empty' ? XCLC.Wardrobe.getSlotName('dress') : 'Nothing')>>, <<print XCLC.Wardrobe.getSlotName('bottom') !== 'Empty' ? XCLC.Wardrobe.getSlotName('bottom') : ''>> | Shoes: <<print XCLC.Wardrobe.getSlotName('shoes')>> | Style: <<print $inventory.styleIdentity === 'none' ? 'Mixed' : $inventory.styleIdentity.charAt(0).toUpperCase() + $inventory.styleIdentity.slice(1)>></p>
<<if $pc.piercings.length > 0>>
<p><strong>Piercings:</strong> <<for _p = 0; _p < $pc.piercings.length; _p++>><<print $pc.piercings[_p].name>><<if _p < $pc.piercings.length - 1>>, <</if>><</for>></p>
<</if>>
<<if $pc.tattoos.length > 0>>
<p><strong>Tattoos:</strong> <<for _t = 0; _t < $pc.tattoos.length; _t++>><<print $pc.tattoos[_t].name>> (<<print $pc.tattoos[_t].location>>)<<if _t < $pc.tattoos.length - 1>>, <</if>><</for>></p>
<</if>>
<<divider "">>
<p><strong>Beauty:</strong> <<print $pc.beautyTotal>> (Base: <<print $pc.beautyBase>> + Grooming: <<print $pc.beautyGrooming>> + Makeup: <<print $pc.beautyMakeup>> + Clothing: <<print $pc.beautyClothing>> + Skincare: <<print $pc.beautySkincare>> + Fitness: <<print $pc.beautyFitness>>)</p>
<p><strong>Stats:</strong> Energy <<print Math.round($pc.energy)>> | Mood <<print Math.round($pc.mood)>> | Stress <<print Math.round($pc.stress)>> | Arousal <<print Math.round($pc.arousal)>></p>
<p>Confidence <<print Math.round($pc.confidence)>> | Willpower <<print Math.round($pc.willpower)>> | Intelligence <<print Math.round($pc.intelligence)>> | Femininity <<print Math.round($pc.femininity)>></p>
</div>
<<link '<span class="choice-btn">← Back</span>' "DormRoom">><</link>><<set _denialLevel = $transformation.sideEffects.masturbationDenial || 0>>
<p>You lie back on your bed and let your hand wander. It's still strange — the geography is different, but the need is familiar. Maybe more intense than it ever was before.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 2>>
<p>Your heightened sensitivity makes every touch electric. You barely brush your fingertips across a nipple and gasp.</p>
<</if>>
<<if _denialLevel === 0>>
/* ── Level 0: Full orgasm ── */
<<set _satisfied = true>>
<<if $transformation.sideEffects.orgasmDenial >= 1>>
<<set _denyChance = $transformation.sideEffects.orgasmDenial * 20>>
<<if random(1,100) <= _denyChance>>
<<set _satisfied = false>>
<p>You're climbing, climbing, right on the edge — and then... nothing. The orgasm retreats like a wave pulling back. You try again. And again. Each time, your body shuts down at the last second.</p>
<p>"Come ON!" you hiss. But it won't come. Neither will you.</p>
<<modStat "arousal" -10 "Partial relief">>
<<modStat "stress" 10 "Orgasm denied">>
<<modStat "mood" -10 "Frustration">>
<</if>>
<</if>>
<<if _satisfied>>
<p>The orgasm builds slowly at first, then crashes through you like a wave.
<<if $transformation.sideEffects.strongOrgasms >= 2>>
It's INTENSE. Your back arches, your toes curl, and you have to shove a pillow over your face to muffle the sound. For a moment, the world whites out.
<<modStat "energy" -10 "Overwhelming orgasm">>
<</if>>
</p>
<<if $transformation.sideEffects.squirting >= 1>>
<<if random(1,100) <= $transformation.sideEffects.squirting * 20>>
<p>💧 You squirt, soaking the sheets. That's... new. And embarrassing. And kind of amazing.</p>
<<modHygiene -10 "Squirting">>
<</if>>
<</if>>
<<set $pc.arousal = 0>>
<<modStat "stress" -15 "Post-orgasm relaxation">>
<<modStat "mood" 10 "Release">>
<p>You lie there for a moment, catching your breath. That was... really good, actually.</p>
<</if>>
<<elseif _denialLevel === 1>>
/* ── Level 1: No orgasm, 20% arousal reduction ── */
<<set _reduction = Math.round($pc.arousal * 0.20)>>
<p>Your hand finds its way between your legs. The sensation builds, warm and insistent — but every time you get close, the pleasure plateaus. The X-Change won't let you get over the edge.</p>
<p>After several frustrating minutes, you give up. You're less wound up, but not satisfied. Not even close.</p>
<<set $pc.arousal = Math.max(0, $pc.arousal - _reduction)>>
<<modStat "stress" 5 "Incomplete relief">>
<<modStat "mood" -5 "Frustrated">>
<<elseif _denialLevel === 2>>
/* ── Level 2: No orgasm, 15% arousal reduction ── */
<<set _reduction = Math.round($pc.arousal * 0.15)>>
<p>You try. God, you try. Your fingers work desperately, hitting every spot that should make you explode — but the X-Change has built a wall around your orgasm. You can SEE it, FEEL it right there, but you can't reach it.</p>
<p>You stop, panting, barely less turned on than when you started. Your body aches with need.</p>
<<set $pc.arousal = Math.max(0, $pc.arousal - _reduction)>>
<<modStat "stress" 8 "Denial frustration">>
<<modStat "mood" -8 "Can't finish">>
<<elseif _denialLevel === 3>>
/* ── Level 3: No orgasm, 10% arousal reduction ── */
<<set _reduction = Math.round($pc.arousal * 0.10)>>
<p>It's almost cruel. Your body responds to every touch with desperate intensity — nipples hard, thighs slick, breath ragged — but the orgasm isn't coming. It will NEVER come. The X-Change has made sure of that.</p>
<p>You pull your hand away, shaking with frustration. You're barely less aroused than before. This is torture.</p>
<<set $pc.arousal = Math.max(0, $pc.arousal - _reduction)>>
<<modStat "stress" 12 "Agonising denial">>
<<modStat "mood" -10 "Tortured">>
<<else>>
/* ── Level 4+: No orgasm, 5% arousal reduction ── */
<<set _reduction = Math.round($pc.arousal * 0.05)>>
<p>Your hand moves on its own. You know it won't work. It NEVER works. But you can't stop trying. The need is constant, overwhelming, and the X-Change has sealed you shut.</p>
<p>Tears of frustration sting your eyes as you give up. You're barely less turned on than when you started. The denial is making you desperate enough to consider... other options.</p>
<<set $pc.arousal = Math.max(0, $pc.arousal - _reduction)>>
<<modStat "stress" 15 "Complete denial">>
<<modStat "mood" -15 "Desperate">>
<<modStat "willpower" -3 "Broken down">>
<</if>>
/* Roommate walk-in check */
<<set _walkIn = XCLC.Roommate.checkWalkIn('masturbate')>>
<<if _walkIn.walkedIn>>
<div class="card">
<div class="card__title">🚪 Oh no.</div>
<p><<print _walkIn.text>></p>
</div>
<<modStat "confidence" -5 "Caught masturbating">>
<<modStat "femininity" 3 "Embarrassment">>
<</if>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><p>You flop onto your bed and
<<set _activity = random(1,4)>>
<<if _activity === 1>>
scroll through social media on your phone. Memes, drama, and an unsettling number of ads that seem to know about your transformation.
<<elseif _activity === 2>>
watch a show on your laptop. It's mindless but exactly what you need right now.
<<elseif _activity === 3>>
stare at the ceiling and think about your life. How did you end up here? Taking X-Change pills and living as a girl in a college dorm?
<<if $pc.femininity > 40>>Honestly? It's not as bad as you expected.
<<else>>It's still surreal. Every single day.
<</if>>
<<else>>
take a short nap. Twenty minutes of blissful unconsciousness.
<</if>>
</p>
<<if $roommate.name && XCLC.Roommate.isHome()>>
<<if $roommate.personality === "supportive">>
<p><<print $roommate.name>> notices you relaxing. "Want some tea?" she asks, already reaching for the kettle.</p>
<<elseif $roommate.personality === "party">>
<p>"Booooring," <<print $roommate.name>> says from across the room. "We should go DO something!"</p>
<<elseif $roommate.personality === "mean">>
<p><<print $roommate.name>> glances at you. "Must be nice to just lie around doing nothing."</p>
<</if>>
<</if>>
<<arousalDrift>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>>
/* ═══════════════════════════════════════════════════
STUB LOCATIONS — To be expanded in Phase 3+
═══════════════════════════════════════════════════ */<<run XCLC.Service.checkForNewRequest()>>
<h2>📖 Library</h2>
<p>It's <<showTime>>. The Thornfield library is a grand old building — three floors of books, study carrels, and quiet corners. <<if $world.time >= 420 && $world.time < 720>>Morning sunlight streams through the tall windows. It's quiet, just a few early studiers.<<elseif $world.time >= 720 && $world.time < 1080>>The library is comfortably busy. Students scattered across tables, the soft tap of keyboards.<<elseif $world.time >= 1080 && $world.time < 1380>>The evening crowd is settling in for study sessions. Every table has at least one occupant.<<else>>The library is nearly empty at this hour. Just you and the night owls.<</if>></p>
<<if $scholarship.activeRequest>>
<<set _req = $scholarship.activeRequest>>
<<set _elapsed = $world.time - _req.createdAt>>
<<set _remaining = 30 - _elapsed>>
<div class="alert alert--info">📱 <strong>CampusHub Request!</strong> <<print _req.npc.firstName>> wants <<print _req.serviceType>> at <<print _req.locationName>>. (<<print _remaining>> min remaining)</div>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Accept request</span>' "ServiceMeet">>
<<run XCLC.Service.acceptRequest()>>
<<advanceTime 10>>
<</link>>
</div>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">📚 Quiet Study (1 hour) — Intelligence XP</span>' "LibraryStudy">>
<<set $temp.studyType = "quiet">>
<</link>>
<<link '<span class="choice-btn">👥 Group Study (1 hour) — Intelligence + Charm XP</span>' "LibraryStudy">>
<<set $temp.studyType = "group">>
<</link>>
<<link '<span class="choice-btn">🔬 Research (1 hour) — boost next exam</span>' "LibraryStudy">>
<<set $temp.studyType = "research">>
<</link>>
/* ─── Glory Hole (library bathroom) ─── */
<<if !$gloryHole.libraryDiscovered && $world.week >= 3 && random(1, 3) === 1>>
<<link '<span class="choice-btn">🚻 Use the bathroom</span>' "GloryHole_LibraryDiscover">><</link>>
<<elseif $gloryHole.libraryDiscovered>>
<<link '<span class="choice-btn">🚻 Library bathroom...</span>' "GloryHole_Library">><</link>>
<</if>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><<set _type = $temp.studyType>>
<<set _se = $transformation.sideEffects>>
<<if _type === "quiet">>
<h2>📚 Quiet Study</h2>
<p>You find an empty carrel on the third floor, spread out your notes, and get to work. The silence is almost meditative.</p>
<<if _se.bimbofication >= 2>>
<p>The words on the page keep blurring. You read the same paragraph three times. Your bimbofied brain struggles to hold onto complex ideas — they slip away like water. Eventually you resort to colour-coded highlighting, which helps a little.</p>
<<set _intXP = Math.max(5, 25 - _se.bimbofication * 5)>>
<<else>>
<<set _intXP = 25>>
<</if>>
<<advanceTime 60>>
<<addXP "studying" _intXP>>
<<addXP "intelligence" 15>>
<<modStat "energy" -10 "Studying">>
<<modRep "goodStudent" 2 "Library study">>
<<elseif _type === "group">>
<h2>👥 Group Study</h2>
<p>You join a study group at one of the big tables. Four other students — two guys, two girls — make room for you.</p>
<<if _se.pheromones >= 2>>
<p>Within ten minutes, both guys have shifted their chairs closer. One of them keeps "accidentally" touching your arm. You try to focus on the material but your pheromones are making it difficult for everyone.</p>
<<modStat "arousal" 5 "Pheromone attention">>
<</if>>
<<advanceTime 60>>
<<addXP "studying" 20>>
<<addXP "intelligence" 10>>
<<addXP "charm" 10>>
<<modStat "energy" -10 "Studying">>
<<modStat "mood" 3 "Social studying">>
<<modRep "goodStudent" 2 "Library study">>
<<else>>
<h2>🔬 Research</h2>
<p>You dig into the stacks, pulling reference books for your upcoming classes. It's dry, dense material, but it'll help on the next exam.</p>
<<advanceTime 60>>
<<addXP "studying" 15>>
<<modStat "energy" -15 "Intensive research">>
<<modRep "goodStudent" 3 "Library research">>
<<if $academic>><<set $academic.researchBonus = ($academic.researchBonus || 0) + 1>><</if>>
<</if>>
/* Common effects */
<<run XCLC.Toast.show('📚 Studied! +' + (_type === 'quiet' ? '25' : (_type === 'group' ? '20' : '15')) + ' study XP', 'success')>>
/* Random event check (15% chance) */
<<if random(1, 100) <= 15>>
<<set _libEvent = random(1, 4)>>
<<if _libEvent === 1 && _se.bimbofication >= 2>>
<p>You catch yourself doodling hearts in the margins of your textbook instead of taking notes. When did you become this person?</p>
<<modStat "femininity" 1 "Doodling hearts">>
<<elseif _libEvent === 2>>
<<set _studyNpc = XCLC.NPC.generate('student')>>
<p>A <<print _studyNpc.bodyType>> <<if _studyNpc.gender === "male">>guy<<else>>girl<</if>> with <<print _studyNpc.hairColour>> hair sits down next to you. "Hey — you're in <<if $academic && $academic.classes && $academic.classes.length > 0>><<print $academic.classes[0].name>><<else>>Professor Chen's class<</if>>, right? I'm <<print _studyNpc.firstName>>. Mind if I study with you?"</p>
<<modStat "mood" 3 "Social interaction">>
<<elseif _libEvent === 3 && $pc.energy < 40>>
<p>Your head drops. You jerk awake — how long were you out? Your cheek has an imprint from the textbook. The student across from you is trying not to laugh.</p>
<<modStat "energy" 5 "Power nap">>
<<modStat "confidence" -2 "Fell asleep in public">>
<<else>>
<p>You lose yourself in the material. When you look up, an hour has passed without you noticing. That's either dedication or dissociation.</p>
<</if>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">📚 Study more</span>' "Library">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><<run XCLC.Service.checkForNewRequest()>>
<h2>🍽️ Cafeteria</h2>
<<set _mealTime = "closed">>
<<if $world.time >= 420 && $world.time < 600>><<set _mealTime = "breakfast">>
<<elseif $world.time >= 600 && $world.time < 720>><<set _mealTime = "brunch">>
<<elseif $world.time >= 720 && $world.time < 900>><<set _mealTime = "quiet">>
<<elseif $world.time >= 900 && $world.time < 1020>><<set _mealTime = "lunch">>
<<elseif $world.time >= 1020 && $world.time < 1200>><<set _mealTime = "dinner">>
<<elseif $world.time >= 1200 && $world.time < 1380>><<set _mealTime = "late">>
<</if>>
<p>It's <<showTime>>. <<if _mealTime === "breakfast">>The cafeteria smells like coffee and toast. A few bleary-eyed students shuffle through the breakfast line.<<elseif _mealTime === "brunch">>The breakfast rush has passed. A few late risers pick at cereal and fruit.<<elseif _mealTime === "lunch">>The lunch crowd is here in force. Every table is taken, the noise level is substantial, and the food line stretches to the door.<<elseif _mealTime === "dinner">>Dinner service. The cafeteria is warm and bustling, the smell of hot food filling the air.<<elseif _mealTime === "late">>The cafeteria is winding down. A few students nurse coffee over textbooks.<<elseif _mealTime === "quiet">>The cafeteria is between meals. Vending machines and leftover pastries only.<<else>>The cafeteria is closed. Lights off, chairs stacked on tables.<</if>></p>
<<if $scholarship.activeRequest>>
<<set _req = $scholarship.activeRequest>>
<<set _elapsed = $world.time - _req.createdAt>>
<<set _remaining = 30 - _elapsed>>
<div class="alert alert--info">📱 <strong>CampusHub Request!</strong> <<print _req.npc.firstName>> wants <<print _req.serviceType>> at <<print _req.locationName>>. (<<print _remaining>> min remaining)</div>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Accept request</span>' "ServiceMeet">>
<<run XCLC.Service.acceptRequest()>>
<<advanceTime 10>>
<</link>>
</div>
<</if>>
<<if _mealTime === "closed" || _mealTime === "quiet">>
<p><em><<if _mealTime === "closed">>The kitchen is closed. Come back during meal hours.<<else>>Between meals — only snacks available.<</if>></em></p>
<<if _mealTime === "quiet">>
<div class="choice-group">
<<link '<span class="choice-btn">🍫 Grab a snack from the vending machine</span>' "Cafeteria">>
<<advanceTime 5>>
<<modStat "energy" 5 "Vending machine snack">>
<</link>>
<<link '<span class="choice-btn">☕ Get coffee</span>' "Cafeteria">>
<<advanceTime 5>>
<<modStat "energy" 10 "Coffee">>
<<modStat "stress" -3 "Caffeine">>
<</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div>
<</if>>
<<else>>
<div class="choice-group">
<<if _mealTime === "breakfast" || _mealTime === "brunch">>
<<link '<span class="choice-btn">🥞 Full breakfast (30 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "full">>
<<set $temp.mealName = "breakfast">>
<</link>>
<<link '<span class="choice-btn">☕ Just coffee and toast (10 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "quick">>
<<set $temp.mealName = "coffee">>
<</link>>
<<elseif _mealTime === "lunch">>
<<link '<span class="choice-btn">🍔 Full lunch (30 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "full">>
<<set $temp.mealName = "lunch">>
<</link>>
<<link '<span class="choice-btn">🥗 Salad (15 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "light">>
<<set $temp.mealName = "salad">>
<</link>>
<<else>>
<<link '<span class="choice-btn">🍝 Full dinner (30 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "full">>
<<set $temp.mealName = "dinner">>
<</link>>
<<link '<span class="choice-btn">🥗 Light meal (15 min)</span>' "CafeteriaEat">>
<<set $temp.mealType = "light">>
<<set $temp.mealName = "light meal">>
<</link>>
<</if>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div>
<</if>><<set _type = $temp.mealType>>
<<set _name = $temp.mealName>>
<<set _se = $transformation.sideEffects>>
<h2>🍽️ <<print _name.charAt(0).toUpperCase()>><<print _name.slice(1)>></h2>
<<if _type === "full">>
<p>You load up a tray and find a seat. The food isn't gourmet, but it's hot and filling. You eat steadily, people-watching between bites.</p>
<<advanceTime 30>>
<<modStat "energy" 20 "Full meal">>
<<modStat "mood" 5 "Good food">>
<<elseif _type === "light">>
<p>You grab a light plate and eat quickly, keeping an eye on the time.</p>
<<advanceTime 15>>
<<modStat "energy" 10 "Light meal">>
<<modStat "mood" 3 "Ate something">>
<<else>>
<p>You grab coffee and a piece of toast, inhaling both at the counter. It's not a meal, but it'll do.</p>
<<advanceTime 10>>
<<modStat "energy" 8 "Quick bite">>
<</if>>
/* SE interactions */
<<if _se.bimbofication >= 3>>
<p>You stare at the food on your tray. Are these calories going to make you fat? The thought arrives unbidden and unwelcome. You push the plate away half-finished, then pull it back. Then push it away again. God, when did eating get so complicated?</p>
<<modStat "stress" 3 "Food anxiety">>
<</if>>
<<if _se.pheromones >= 2 && (_type === "full" || _type === "light")>>
<p>You notice the table of guys two rows over has been staring at you since you sat down. One of them elbows his friend and nods in your direction. Your pheromones, carrying on the cafeteria air. You eat faster.</p>
<<modStat "arousal" 3 "Attention in cafeteria">>
<</if>>
/* Random social event (20% chance) */
<<if random(1,100) <= 20>>
<<set _cafeEvent = random(1,3)>>
<<if _cafeEvent === 1>>
<<set _cafeNPC = XCLC.NPC.generate('student')>>
<p>"This seat taken?" A <<print _cafeNPC.bodyType>> <<if _cafeNPC.gender === "male">>guy<<else>>girl<</if>> with <<print _cafeNPC.hairColour>> hair sits down across from you without waiting for an answer. "<<print _cafeNPC.firstName>>. You're in the programme, right?"</p>
<p>You chat through the rest of the meal. It's almost normal — if you ignore what "the programme" actually means.</p>
<<modStat "mood" 5 "Social meal">>
<<elseif _cafeEvent === 2 && _se.lactation >= 2>>
<p>Mid-bite, you feel it — the warm tingle in your breasts. The pressure of unexpressed milk. You cross your arms over your <<print $pc.breastSize>>-cups and pray nothing shows through your shirt. <<if $pc.breastSize === "D" || $pc.breastSize === "DD">>It shows through your shirt.<</if>></p>
<<modStat "stress" 3 "Lactation in public">>
<<else>>
<p>You overhear the table behind you gossiping. "Did you hear about the CCUMDUP girl who—" They notice you and go quiet. You pretend you didn't hear.</p>
<<modStat "mood" -3 "Gossip">>
<</if>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🍽️ Eat more</span>' "Cafeteria">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>🏛️ Admin Building</h2>
<p>It's <<showTime>>. The admin building houses the Dean's office, registrar, and the Campus Health Centre.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏥 Health Centre</span>' "HealthCentre">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>🏥 Campus Health Centre</h2>
<p>The health centre is clean, quiet, and mercifully private. A nurse in scrubs looks up from her desk.</p>
<p>"Hi there. <<print $pc.femaleFirstName>>, right? What can we help with today?"</p>
<<if $pregnancy && $pregnancy.riskFlag>>
<div class="alert alert--warning">⚠️ You have an outstanding pregnancy risk. You should get tested.</div>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔬 STD Test (Free, 30 min)</span>' "HealthService">>
<<set $temp.healthService = "std_test">>
<</link>>
<<link '<span class="choice-btn">🤰 Pregnancy Test (Free, 15 min)</span>' "HealthService">>
<<set $temp.healthService = "pregnancy_test">>
<</link>>
<<link '<span class="choice-btn">💊 Morning-After Pill ($25)</span>' "HealthService">>
<<set $temp.healthService = "morning_after">>
<</link>>
<<link '<span class="choice-btn">🧠 Therapy Session ($30, 1 hour)</span>' "HealthService">>
<<set $temp.healthService = "therapy">>
<</link>>
<<link '<span class="choice-btn">💊 Birth Control Prescription ($15/month)</span>' "HealthService">>
<<set $temp.healthService = "birth_control">>
<</link>>
<<link '<span class="choice-btn">🩺 General Check-Up (Free, 30 min)</span>' "HealthService">>
<<set $temp.healthService = "checkup">>
<</link>>
<<link '<span class="choice-btn">🩹 Injury Treatment ($20)</span>' "HealthService">>
<<set $temp.healthService = "injury">>
<</link>>
<<link '<span class="choice-btn">⚗️ X-Change Adjustment (1 per semester)</span>' "HealthService">>
<<set $temp.healthService = "xchange_adjust">>
<</link>>
/* ─── Dr. Crane Hypnosis ─── */
<<if !$hypnosis.discovered>>
<<link '<span class="choice-btn">📋 Notice Board — Stress Management Sessions</span>' "Hypnosis_Discover">><</link>>
<<elseif $hypnosis.discovered && ($world.day - $hypnosis.lastSessionDay >= 7 || $hypnosis.sessionsAttended === 0)>>
<<link '<span class="choice-btn">🌀 Dr. Crane — Relaxation Session</span>' "Hypnosis_Session">><</link>>
<</if>>
<<link '<span class="choice-btn">← Back</span>' "AdminBuilding">><</link>>
</div><<set _service = $temp.healthService>>
<<if _service === "std_test">>
<h2>🔬 STD Test</h2>
<<if $transformation.addons.stdProtection>>
<p>The nurse checks your file. "You have the STD Protection add-on. You're immune to sexually transmitted infections. No test needed."</p>
<p>She pauses. "Must be nice."</p>
<<else>>
<p>The nurse takes a swab and draws a small blood sample. "Results in a few minutes."</p>
<<advanceTime 30>>
<<if $health && $health.hasSTD>>
<p>"I'm sorry — the test came back positive for <<print $health.stdType || 'chlamydia'>>. We can treat this, but you'll need to be more careful."</p>
<div class="alert alert--warning">🦠 You have an STD. Treatment costs $50.</div>
<<link '<span class="choice-btn">💊 Get treatment ($50)</span>' "HealthCentre">>
<<set $finance.money -= 50>>
<<set $health.hasSTD = false>>
<<set $health.stdType = null>>
<<run XCLC.Toast.show('🏥 STD treated! You\'re clean.', 'success')>>
<</link>>
<<else>>
<p>"All clear. No infections detected." She smiles. "Keep being safe out there."</p>
<</if>>
<</if>>
<<elseif _service === "pregnancy_test">>
<h2>🤰 Pregnancy Test</h2>
<p>The nurse hands you a cup. Fifteen minutes later, she returns with results.</p>
<<advanceTime 15>>
<<if $pregnancy && $pregnancy.riskFlag && random(1,100) <= 20>>
<p>Her face is carefully neutral. "The test is positive. You're pregnant."</p>
<p>The word hangs in the air. Pregnant. You. In a body you've had for <<print $world.day>> days.</p>
<<set $pregnancy.confirmed = true>>
<<set $pregnancy.riskFlag = false>>
<<modStat "stress" 20 "Pregnancy confirmed">>
<div class="alert alert--warning">🤰 You are pregnant. You can terminate at this clinic ($200) within the first 12 weeks.</div>
<<link '<span class="choice-btn">💊 Terminate pregnancy ($200)</span>' "HealthCentre">>
<<set $finance.money -= 200>>
<<set $pregnancy.confirmed = false>>
<<set $pregnancy.riskDay = 0>>
<<modStat "stress" -10 "Pregnancy terminated">>
<<modStat "mood" -10 "Emotional impact">>
<<run XCLC.Toast.show('🏥 Procedure complete.', 'info')>>
<</link>>
<<else>>
<p>"Negative. You're not pregnant." You let out a breath you didn't know you were holding.</p>
<<set $pregnancy.riskFlag = false>>
<<modStat "stress" -5 "Not pregnant - relief">>
<</if>>
<<elseif _service === "morning_after">>
<h2>💊 Morning-After Pill</h2>
<<if $finance.money < 25>>
<p>"I'm sorry, that'll be $25." The nurse checks your file. "Your account doesn't have sufficient funds."</p>
<<else>>
<<if $pregnancy && $pregnancy.riskFlag && ($world.day - $pregnancy.riskDay) <= 2>>
<p>The nurse hands you a pill and a glass of water. "Take it now. This works best within 48 hours of exposure."</p>
<p>You swallow it. Relief washes over you. It's done.</p>
<<set $finance.money -= 25>>
<<set $pregnancy.riskFlag = false>>
<<modStat "stress" -10 "Morning-after pill">>
<<run XCLC.Toast.show('💊 Morning-after pill taken. Risk cleared.', 'success')>>
<<elseif $pregnancy && $pregnancy.riskFlag>>
<p>"It's been more than 48 hours since exposure. The morning-after pill won't be effective. I'd recommend a pregnancy test instead."</p>
<<else>>
<p>"There's no current pregnancy risk in your file. You don't need this right now. Come back if you do."</p>
<</if>>
<</if>>
<<elseif _service === "therapy">>
<h2>🧠 Therapy Session</h2>
<<if $finance.money < 30>>
<p>"Sessions are $30. We can set up a payment plan if needed..." The nurse trails off sympathetically.</p>
<<else>>
<<set $finance.money -= 30>>
<<advanceTime 60>>
<p>You sit in a comfortable chair across from Dr. Park, the campus therapist. She has kind eyes and doesn't judge.</p>
<p>"How are you adjusting to the programme?" she asks. "To... all of it?"</p>
<p>You talk. About the body. About the expectations. About how some days you look in the mirror and don't recognize yourself, and other days you do and that's worse.</p>
<p>Dr. Park listens. She doesn't have answers, but somehow you feel lighter when the hour is up.</p>
<<modStat "stress" -25 "Therapy session">>
<<modStat "mood" 15 "Talking to someone">>
<<modStat "willpower" 10 "Therapy insight">>
<<run XCLC.Toast.show('🧠 Therapy: Stress -25, Mood +15, Willpower +10', 'success')>>
<</if>>
<<elseif _service === "birth_control">>
<h2>💊 Birth Control</h2>
<<if $transformation.addons.birthControl>>
<p>"You already have the Birth Control add-on active. No prescription needed — you're covered."</p>
<<elseif $finance.money < 15>>
<p>"A monthly prescription is $15. Unfortunately, your funds are insufficient."</p>
<<else>>
<p>The nurse writes a prescription. "Take one pill daily. If you miss a day, you're not protected that day. Come back monthly for refills."</p>
<<set $finance.money -= 15>>
<<set $health.birthControlActive = true>>
<<set $health.birthControlDays = 30>>
<<run XCLC.Toast.show('💊 Birth control prescription: 30 days.', 'success')>>
<</if>>
<<elseif _service === "checkup">>
<h2>🩺 General Check-Up</h2>
<<advanceTime 30>>
<p>The nurse takes your vitals, checks your file, and runs through a standard health assessment.</p>
<div class="card">
<div class="card__title">📋 Health Report</div>
<p><strong>Health:</strong> <<print $pc.health>>/100</p>
<p><strong>Energy:</strong> <<print $pc.energy>>/100</p>
<p><strong>Stress:</strong> <<print $pc.stress>>/100</p>
<p><strong>Hygiene:</strong> <<print $hygiene.cleanliness>>/100</p>
<p><strong>Breast Size:</strong> <<print $pc.breastSize>>-cup</p>
<p><strong>Active Add-ons:</strong> <<if $transformation.addons.birthControl>>Birth Control, <</if>><<if $transformation.addons.stdProtection>>STD Protection, <</if>><<if $transformation.addons.wet>>Wet, <</if>><<if $transformation.addons.noHair>>No Body Hair<</if>></p>
<p><strong>Pregnancy Risk:</strong> <<if $pregnancy && $pregnancy.riskFlag>>⚠️ Possible<<elseif $pregnancy && $pregnancy.confirmed>>🤰 Confirmed<<else>>None<</if>></p>
</div>
<p>"Everything looks normal for someone in the programme," the nurse says. "Well, as normal as it gets."</p>
<<elseif _service === "injury">>
<h2>🩹 Injury Treatment</h2>
<<if $finance.money < 20>>
<p>"Treatment is $20. Your account is a bit short."</p>
<<elseif $pc.health >= 90>>
<p>The nurse checks you over. "You seem fine. No injuries I can see. Come back if something hurts."</p>
<<else>>
<p>The nurse patches you up — disinfectant, bandages, ice packs. Professional and efficient.</p>
<<set $finance.money -= 20>>
<<set $pc.health = Math.min(100, $pc.health + 30)>>
<<run XCLC.Toast.show('🩹 Injuries treated. Health +30.', 'success')>>
<</if>>
<<elseif _service === "xchange_adjust">>
<h2>⚗️ X-Change Dosage Adjustment</h2>
<<if $health && $health.adjustedThisSemester>>
<p>"We can only do one X-Change adjustment per semester. You've already had yours. Come back next semester."</p>
<<else>>
<p>The nurse pulls up your transformation profile. "I can adjust one side effect's intensity — increase or decrease by one level. Which one?"</p>
<p><em>Choose a side effect to modify:</em></p>
<<set _seList = Object.keys($transformation.sideEffects)>>
<div class="choice-group">
<<for _i = 0; _i < _seList.length; _i++>>
<<set _seName = _seList[_i]>>
<<set _seVal = $transformation.sideEffects[_seName]>>
<<if _seVal > 0>>
<<capture _seName, _seVal>>
<<link '<span class="choice-btn"><<print _seName>>: <<print _seVal>> → <<print Math.max(0, _seVal - 1)>> (decrease)</span>' "HealthCentre">>
<<set $transformation.sideEffects[_seName] = Math.max(0, _seVal - 1)>>
<<set $health.adjustedThisSemester = true>>
<<run XCLC.Toast.show('⚗️ ' + _seName + ' reduced to ' + ($transformation.sideEffects[_seName]), 'success')>>
<</link>>
<</capture>>
<</if>>
<</for>>
<<link '<span class="choice-btn">← Changed my mind</span>' "HealthCentre">><</link>>
</div>
<</if>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🏥 Other services</span>' "HealthCentre">><</link>>
<<link '<span class="choice-btn">← Back</span>' "AdminBuilding">><</link>>
</div>
/* StudentCenter and GreekRow moved to 14_social.twee */<<run XCLC.Service.checkForNewRequest()>>
<h2>🚻 Campus Bathrooms</h2>
<p>It's <<showTime>>. The communal bathrooms near the quad. Fluorescent lights, cracked tile, the faint smell of pine cleaner losing its battle against… everything else.</p>
<p>There are three stalls. Two are normal. The third — the one in the back corner — has a crudely cut hole in the partition wall, about waist height. Someone's written "CCUMDUP SERVICE STATION" above it in sharpie. Below that, in different handwriting: "$20."</p>
<<if $scholarship.activeRequest>>
<<set _req = $scholarship.activeRequest>>
<<set _elapsed = $world.time - _req.createdAt>>
<<set _remaining = 30 - _elapsed>>
<div class="alert alert--info">📱 <strong>CampusHub Request!</strong> <<print _req.npc.firstName>> wants <<print _req.serviceType>> at <<print _req.locationName>>. (<<print _remaining>> min remaining)</div>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Accept request</span>' "ServiceMeet">>
<<run XCLC.Service.acceptRequest()>>
<<advanceTime 10>>
<</link>>
</div>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Freshen up at the sink (10 min)</span>' "BathroomFreshenUp">><</link>>
<<if $pc.makeupApplied>>
<<link '<span class="choice-btn">💄 Fix your makeup</span>' "BathroomMakeup">><</link>>
<</if>>
<<link '<span class="choice-btn">🕳️ The glory hole... ($20)</span>' "GloryHoleIntro">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>🚿 Freshen Up</h2>
<p>You splash water on your face, wash your hands, and try to make yourself look presentable in the scratched bathroom mirror. It's not a shower, but it'll do.</p>
<<advanceTime 10>>
<<modHygiene 15 "Freshened up">>
<<if $transformation.sideEffects.lactation >= 2>>
<p>You take the opportunity to express some milk into the sink. The relief is immediate. You pray nobody walks in.</p>
<</if>>
<<run XCLC.Toast.show('🚿 Freshened up! Hygiene +15', 'success')>>
<div class="choice-group">
<<link '<span class="choice-btn">🚻 Back to bathrooms</span>' "CampusBathrooms">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>💄 Fix Makeup</h2>
<p>You lean close to the mirror and fix the smudges. A little water, some careful blending, and you look passable again. Not great, but passable.</p>
<<advanceTime 5>>
<<run XCLC.Toast.show('💄 Makeup touched up.', 'success')>>
<div class="choice-group">
<<link '<span class="choice-btn">🚻 Back to bathrooms</span>' "CampusBathrooms">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><<set _se = $transformation.sideEffects>>
<h2>🕳️ The Last Stall</h2>
<p>You stand in front of the last stall. The hole is unmistakable — roughly cut, edges smoothed by use. A price list is scrawled on the wall in sharpie:</p>
<div class="card">
<div class="card__title">💰 Price List</div>
<p>👄 Oral — $20</p>
<p>🍑 Vaginal — $35</p>
<p>🔥 Anal — $50</p>
</div>
<p>Cash left on the toilet tank. Anonymous. No CampusHub, no ratings, no record.</p>
<<if $pc.femininity < 30>>
<p>Every instinct screams at you to walk away. This is degrading. This is beneath you. You were a man six weeks ago.</p>
<<elseif $pc.femininity < 60>>
<p>Part of you is horrified. Part of you is... curious? The anonymity is almost appealing. Nobody would know. Nobody could judge.</p>
<<else>>
<p>You've done worse for less. At least this is on your terms — sort of.</p>
<</if>>
<<if _se.sexualFluidAddiction >= 2>>
<p>Your mouth waters. The addiction is talking — the craving for it, the need. Your body wants this even if your mind isn't sure.</p>
<<modStat "arousal" 10 "Addiction craving">>
<</if>>
<<if _se.submissive >= 2>>
<p>Something about the dehumanizing nature of it — being on your knees, serving someone you can't even see — sends a shiver through you.</p>
<<modStat "arousal" 5 "Submissive thrill">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">👄 Oral ($20)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "oral">>
<</link>>
<<link '<span class="choice-btn">🍑 Vaginal — turn around ($35)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "vaginal">>
<</link>>
<<link '<span class="choice-btn">🔥 Anal ($50)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "anal">>
<</link>>
<<link '<span class="choice-btn">🚫 No. Walk away.</span>' "CampusBathrooms">>
<<modStat "confidence" 2 "Resisted temptation">>
<</link>>
</div><<set _se = $transformation.sideEffects>>
<<set _ghType = $temp.ghType || "oral">>
/* Random cock size */
<<set _ghSize = random(1, 6)>>
<<set _sizeDesc = "">>
<<if _ghSize <= 1>><<set _sizeDesc = "small — manageable">>
<<elseif _ghSize <= 2>><<set _sizeDesc = "average">>
<<elseif _ghSize <= 3>><<set _sizeDesc = "above average">>
<<elseif _ghSize <= 4>><<set _sizeDesc = "big">>
<<elseif _ghSize <= 5>><<set _sizeDesc = "thick">>
<<else>><<set _sizeDesc = "huge">>
<</if>>
/* ═══ ORAL ═══ */
<<if _ghType === "oral">>
<h2>👄 Glory Hole — Oral</h2>
<p>You lock the stall, kneel on the cold tile. Your <<print $pc.hairColour>> hair brushes the grimy floor. You tap the wall twice.</p>
<p>Through the hole slides something <<print _sizeDesc>>.</p>
<<set _dc = Math.min(6, 2 + Math.floor(_ghSize / 2))>>
<<set _result = XCLC.Roll.doCheck("oral", _dc)>>
<<if _result.outcome === "crit_success">>
<p>You take him in and something clicks — tongue, lips, throat, all in perfect rhythm. He finishes fast, gasping through the wall. A hand reaches through and leaves $30 on the tank. A tip.</p>
<<set _payment = 30>>
<<modStat "confidence" 3 "Expert performance">>
<<addXP "oral" 20>>
<<elseif _result.outcome === "success">>
<p>You wrap your lips around him and get to work. Bob, breathe, repeat. He groans. It doesn't take long. $20 appears on the tank.</p>
<<set _payment = 20>>
<<addXP "oral" 15>>
<<elseif _result.outcome === "partial_fail">>
<p>The angle is awkward. Your jaw cramps. You gag once, twice. He finishes eventually — persistence over skill. $15 on the tank. He shorted you.</p>
<<set _payment = 15>>
<<modStat "confidence" -3 "Sloppy performance">>
<<addXP "oral" 10>>
<<else>>
<p>You gag immediately, pull off, try again, gag worse. He pulls back through the hole. "Fuckin' amateur." $10 on the tank. Pity money.</p>
<<set _payment = 10>>
<<modStat "confidence" -5 "Humiliating failure">>
<<modStat "stress" 5 "Glory hole failure">>
<<addXP "oral" 5>>
<</if>>
<<modStat "energy" -10 "Oral exertion">>
/* ═══ VAGINAL ═══ */
<<elseif _ghType === "vaginal">>
<h2>🍑 Glory Hole — Vaginal</h2>
<p>You lock the stall and turn around. Hiking up your skirt, you back up to the hole, bracing your hands on the far wall. This is surreal. This is happening.</p>
<p>You feel him press against you — <<print _sizeDesc>>. Then he pushes in.</p>
<<set _dc = Math.min(7, 3 + Math.floor(_ghSize / 2))>>
<<set _result = XCLC.Roll.doCheck("vaginal", _dc)>>
<<if _result.outcome === "crit_success">>
<p>The angle is unexpectedly perfect. He slides in <<if _ghSize >= 5>>with a stretch that makes you gasp<<else>>smoothly<</if>> and you bite your fist to keep quiet. Your body takes over — hips rolling back against the wall, meeting his thrusts. It's good. Terrifyingly good.</p>
<p>He finishes with a groan that echoes off the tile. $50 on the tank — he was generous.</p>
<<set _payment = 50>>
<<modStat "arousal" 25 "Amazing anonymous sex">>
<<modStat "confidence" 3 "Great performance">>
<<addXP "vaginal" 20>>
<<elseif _result.outcome === "success">>
<p>He enters <<if _ghSize >= 4>>with difficulty — he's big and the angle is awkward<<else>>without too much trouble<</if>>. You brace yourself and let him set the pace. It's mechanical, impersonal, but your body responds anyway. Warmth builds in your stomach.</p>
<p>$35 on the tank.</p>
<<set _payment = 35>>
<<modStat "arousal" 15 "Anonymous vaginal">>
<<addXP "vaginal" 15>>
<<elseif _result.outcome === "partial_fail">>
<p>The angle is wrong. He keeps slipping out. You adjust, he tries again, and it's just... awkward. <<if _ghSize >= 5>>He's too big for this position.<<else>>Neither of you can find a rhythm.<</if>> He finishes but it takes forever.</p>
<p>$25 on the tank. Below rate.</p>
<<set _payment = 25>>
<<modStat "confidence" -3 "Clumsy performance">>
<<addXP "vaginal" 10>>
<<else>>
<p>He pushes in and you cry out — too loud. Someone in the next stall says "Jesus." The mood is killed. He pulls out, swears, and you hear him zip up and leave.</p>
<p>$15 on the tank. Pity rate.</p>
<<set _payment = 15>>
<<modStat "confidence" -5 "Glory hole disaster">>
<<modStat "stress" 8 "Humiliation">>
<<addXP "vaginal" 5>>
<</if>>
<<modStat "energy" -15 "Vaginal exertion">>
/* Pregnancy risk */
<<if !$transformation.addons.birthControl && !$health.birthControlActive>>
<<if random(1,100) <= 15>>
<<set $pregnancy.riskFlag = true>>
<<set $pregnancy.riskDay = $world.day>>
<p><em>He didn't pull out. You felt it. The familiar dread settles in your stomach.</em></p>
<</if>>
<</if>>
/* ═══ ANAL ═══ */
<<else>>
<h2>🔥 Glory Hole — Anal</h2>
<p>You lock the stall and turn around. You pull down your bottoms and back up to the hole, pressing your <<print $pc.buttSize>> ass against the partition. You try to relax. You fail.</p>
<p>He presses against you — <<print _sizeDesc>>. Then pushes. <<if _ghSize >= 4>>Pain. Immediate, sharp pain.<<else>>Pressure. Discomfort. Then more.<</if>></p>
<<set _dc = Math.min(8, 4 + Math.floor(_ghSize / 2))>>
<<set _result = XCLC.Roll.doCheck("anal", _dc)>>
<<if _result.outcome === "crit_success">>
<p>You breathe through it. The pain fades and something else takes its place — a deep, shameful pleasure that makes your toes curl. You push back against the wall, taking him deeper. He groans. You bite your lip so hard it bleeds.</p>
<p>$70 on the tank. He was impressed.</p>
<<set _payment = 70>>
<<modStat "arousal" 20 "Intense anonymous anal">>
<<modStat "confidence" 3 "Endured and excelled">>
<<addXP "anal" 25>>
<<elseif _result.outcome === "success">>
<p>It hurts, but you manage. <<if _ghSize >= 5>>He's big and every thrust is a negotiation with pain,<<else>>The angle isn't great but you find a way to brace,<</if>> and he finishes after a few minutes. You exhale, shaking.</p>
<p>$50 on the tank.</p>
<<set _payment = 50>>
<<modStat "arousal" 10 "Anonymous anal">>
<<addXP "anal" 20>>
<<elseif _result.outcome === "partial_fail">>
<p>Your body tenses up and won't relax. He pushes, you wince, he pushes harder. It's painful without being productive. He finishes but neither of you enjoyed it.</p>
<p>$35 on the tank. He's being generous.</p>
<<set _payment = 35>>
<<modStat "stress" 8 "Painful anonymous anal">>
<<modStat "confidence" -3 "Difficult performance">>
<<addXP "anal" 10>>
<<else>>
<p>You tense up completely. He can barely get inside. After three agonizing attempts, he gives up. "This isn't working," he mutters through the wall. You hear him leave.</p>
<p>$20 on the tank. Sympathy money for trying.</p>
<<set _payment = 20>>
<<modStat "stress" 12 "Humiliating anal failure">>
<<modStat "confidence" -5 "Failed completely">>
<<addXP "anal" 5>>
<</if>>
<<modStat "energy" -20 "Anal exertion">>
<</if>>
/* ═══ COMMON POST ═══ */
<<set $finance.money += _payment>>
<<advanceTime 15>>
<<modHygiene -10 "Glory hole">>
<<if _se.sexualFluidAddiction >= 2 && _ghType === "oral">>
<p>The taste lingers. Your addiction purrs, satisfied.</p>
<<modStat "mood" 5 "Addiction satisfied">>
<</if>>
<<if _se.increasedSensitivity >= 2>>
<p>Your hypersensitivity made that far more intense than it should have been. You're trembling.</p>
<<modStat "arousal" 10 "Sensitive glory hole">>
<</if>>
<<modRep "slut" 3 "Glory hole">>
<<modStat "femininity" 2 "Anonymous service">>
<p>You straighten up, pocket the cash, and try to steady your breathing. Your <<print $pc.breastSize>>-cups feel heavy as you stand.</p>
<p><strong>+$<<print _payment>></strong></p>
<div class="choice-group">
<<if $pc.energy > 15>>
<<link '<span class="choice-btn">👄 Another round — Oral ($20)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "oral">>
<</link>>
<<link '<span class="choice-btn">🍑 Another round — Vaginal ($35)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "vaginal">>
<</link>>
<<link '<span class="choice-btn">🔥 Another round — Anal ($50)</span>' "GloryHoleEncounter">>
<<set $temp.ghType = "anal">>
<</link>>
<<else>>
<p><em>You're too exhausted for another round.</em></p>
<</if>>
<<link '<span class="choice-btn">🚿 Freshen up at the sink</span>' "BathroomFreshenUp">><</link>>
<<link '<span class="choice-btn">🗺️ Leave</span>' "CampusMap">><</link>>
</div>
/* Mall, Drugstore, HairSalon, TattooShop now in 12_shops.twee */
/* WardrobeMenu now in 11_wardrobe.twee */
/* BarDistrict moved to 06_off_campus.twee */
/* Downtown moved to 15_jobs.twee (hooker passages) — stub kept for non-job access */<h2>🏢 Downtown</h2>
<p>It's <<showTime>>. The downtown area — restaurants, offices, and past the main drag... where the lights get dimmer.</p>
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<if _period === "night" || _period === "late_night">>
<p>The streetlights are dim here. Cars crawl by slowly. You can see silhouettes leaning against lamp posts.</p>
<</if>>
<div class="choice-group">
<<if $jobs.hooker.active && (_period === "night" || _period === "late_night")>>
<<link '<span class="choice-btn">💋 Walk the street</span>' "Job_Hooker_Street">><</link>>
<</if>>
<<if $jobs.dealer.active>>
<<link '<span class="choice-btn">📦 Visit Marco (restock)</span>' "Job_Dealer_Restock">><</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><<advanceTime 30>><</link>>
</div><h2>⚙️ Settings</h2>
<p><em>Settings menu coming soon.</em></p>
<<link '<span class="choice-btn">← Back</span>' "CampusMap">><</link>><h2>👤 Character Sheet</h2>
<<include "DormRoom_Mirror">>
/* JournalMenu moved to 24_journal.twee */
/* AchievementsMenu moved to 25_achievements.twee */
/* Graduation moved to 18_endings.twee *//* Player wakes up — process morning SEs, show events, offer activities */
<<run XCLC.SE.processMorning()>>
<h2>🌅 Good Morning</h2>
<p>You wake up at <<showTime>> on <<showDate>>.
<<if $pc.energy >= 80>>You feel refreshed and ready to face the day.
<<elseif $pc.energy >= 50>>You feel okay. Not great, not terrible.
<<elseif $pc.energy >= 25>>You feel groggy. Could really use some coffee.
<<else>>You feel exhausted. Did you even sleep?
<</if>>
</p>
/* Display morning SE events */
<<if $temp.morningEvents && $temp.morningEvents.length > 0>>
<div class="card">
<div class="card__title">Morning Sensations</div>
<<for _i = 0; _i < $temp.morningEvents.length; _i++>>
<p><<print $temp.morningEvents[_i]>></p>
<</for>>
</div>
<</if>>
/* Roommate status */
<<if $roommate.name>>
<<if XCLC.Roommate.isHome()>>
<p><<print $roommate.name>> is <<print XCLC.Roommate.getActivity()>>.</p>
<<else>>
<p><<print $roommate.name>> is already out.</p>
<</if>>
<</if>>
/* Status warnings */
<<if $hygiene.cleanliness < 50>>
<div class="alert alert--warning">🚿 You could really use a shower. Hygiene: <<print $hygiene.cleanliness>>%</div>
<</if>>
<<if $pc.arousal > 60>>
<div class="alert alert--warning">🔥 You're uncomfortably aroused. It's hard to concentrate.</div>
<</if>>
<<checkLactation>>
<div class="choice-group">
<<link '<span class="choice-btn">⚡ Quick Routine (do your morning in one click)</span>' "QuickRoutine_Setup">><</link>>
<<link '<span class="choice-btn">🏠 Go to your room (do things individually)</span>' "DormRoom">><</link>>
</div><h2>⚡ Quick Morning Routine</h2>
<p>Select what you want to do this morning. These will be performed in order and the time cost will be combined.</p>
<div id="qr-setup"></div>
<<run setTimeout(function(){ XCLC.QuickRoutine.render(); }, 50)>>/* Execute the saved quick routine */
<<set _qr = $temp.quickRoutine || {}>>
/* Shower */
<<if _qr.shower>>
<<shower>>
<p>🚿 You take a hot shower.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 1>>
<p>⚡ The water cascading over your new body sends shivers of pleasure through you.</p>
<<modStat "arousal" 10 "Shower sensitivity">>
<</if>>
<<if $transformation.sideEffects.lactation >= 2>>
<p>🍼 Milk drips from your nipples into the shower drain. You cup your breasts and squeeze, expressing the pressure.</p>
<<set $temp.lastExpressed = $world.time>>
<</if>>
<</if>>
/* Shave legs */
<<if _qr.shaveLegs>>
<<shaveLegs>>
<p>🪒 You shave your legs smooth.</p>
<</if>>
/* Shave pubic */
<<if _qr.shavePubic>>
<<shavePubic>>
<p>🪒 You tidy up downstairs.</p>
<</if>>
/* Skincare */
<<if _qr.skincare>>
<<applySkincare>>
<p>✨ You apply your skincare routine.</p>
<</if>>
/* Makeup */
<<if _qr.makeup && _qr.makeup !== "none">>
<<applyMakeup _qr.makeup>>
<p>💄 You apply <<print _qr.makeup>> makeup.</p>
<</if>>
<p>Morning routine complete! Time: <<showTime>>.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏠 Back to room</span>' "DormRoom">><</link>>
<<link '<span class="choice-btn">🗺️ Head to campus</span>' "CampusMap">><</link>>
</div>/* Player returns to dorm late / chooses to go to bed */
<<run XCLC.SE.processNight()>>
<h2>🌙 Winding Down</h2>
<p>It's <<showTime>>. Time to call it a night.</p>
/* Remove makeup if applied */
<<if $pc.makeupApplied>>
<p>You remove your makeup at the bathroom sink.</p>
<<applyMakeup "none">>
<</if>>
/* Night SE events */
<<if $temp.nightEvents && $temp.nightEvents.length > 0>>
<div class="card">
<div class="card__title">Evening Thoughts</div>
<<for _i = 0; _i < $temp.nightEvents.length; _i++>>
<p><<print $temp.nightEvents[_i]>></p>
<</for>>
</div>
<</if>>
/* Roommate */
<<if $roommate.name && XCLC.Roommate.isHome()>>
<p><<print $roommate.name>> is <<if $world.time >= 1380>>already asleep<<else>><<print XCLC.Roommate.getActivity()>><</if>>.</p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">💤 Go to sleep</span>' "DormRoom_Sleep">><</link>>
<<if $pc.arousal > 40 && $transformation.sideEffects.masturbationDenial === 0>>
<<link '<span class="choice-btn">🔥 Take care of that arousal first...</span>' "DormRoom_Masturbate">><</link>>
<</if>>
<<link '<span class="choice-btn">🏠 Not tired yet (back to room)</span>' "DormRoom">><</link>>
</div>/* A guy approaches and hits on the player. Personality-reactive. */
<<set _npc = $temp.quadNPC>>
<<set _p = _npc.personality>>
<div class="card">
<div class="card__title">👤 Someone approaches...</div>
<<if _p === "friendly" || _p === "sweet">>
<p>A <<print _npc.bodyType>> <<print _npc.race>> guy with <<print _npc.hairColour>> hair walks over, hands in his pockets. He looks a little nervous.</p>
<p>"Hey, sorry to bother you — I'm <<print _npc.firstName>>. I don't think we've met? You're in the CCUMDUP programme, right? I just thought... you seemed cool."</p>
<<elseif _p === "cocky" || _p === "demanding">>
<p>A <<print _npc.bodyType>> <<print _npc.race>> guy breaks away from a group of friends and intercepts you on the path. He's grinning like he already knows how this conversation ends.</p>
<p>"Yo, I'm <<print _npc.firstName>>. You're one of those scholarship girls, right? Lucky me." He looks you up and down without even pretending to be subtle.</p>
<<elseif _p === "shy">>
<p>You notice a <<print _npc.bodyType>> guy hovering near the fountain, stealing glances at you. When you accidentally make eye contact, he panics and walks straight over, going red.</p>
<p>"H-hi. I'm <<print _npc.firstName>>. I, uh... you dropped your— no, you didn't. Sorry. I just wanted to say hi."</p>
<<elseif _p === "aggressive">>
<p>A <<print _npc.bodyType>> <<print _npc.race>> guy cuts across your path, stepping too close. He smells like cheap cologne and confidence.</p>
<p>"<<print _npc.firstName>>." He doesn't ask your name. "You're that new girl from Hamilton, right? I've been hearing things about you CCUMDUP girls."</p>
<<elseif _p === "romantic">>
<p>A tall <<print _npc.race>> guy with <<print _npc.eyeColour>> eyes falls into step beside you like he's been waiting for exactly this moment.</p>
<p>"I'm <<print _npc.firstName>>. Forgive the interruption — I just noticed you walking by and couldn't not say something. Are you always this beautiful or is today special?"</p>
<<else>>
<p>A <<print _npc.bodyType>> <<print _npc.race>> guy appears at your elbow with a weird smile. Something about his energy is... off.</p>
<p>"Hey. I'm <<print _npc.firstName>>. I've seen you around. You live in Hamilton, right? Room 207?" How does he know your room number?</p>
<</if>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">😊 Be friendly. "Nice to meet you."</span>' "CampusMap">>
<<modStat "mood" 3 "Nice conversation">>
<<modStat "femininity" 1 "Friendly with a guy">>
<</link>>
<<link '<span class="choice-btn">😏 Flirt back. "Well aren\'t you forward..."</span>' "CampusMap">>
<<modStat "confidence" 3 "Flirting">>
<<modStat "femininity" 2 "Flirting with a guy">>
<<modStat "arousal" 5 "Flirting">>
<</link>>
<<link '<span class="choice-btn">❄️ Cold. "Not interested."</span>' "CampusMap">>
<<modStat "confidence" 5 "Asserting boundaries">>
<</link>>
<<link '<span class="choice-btn">🚶 Keep walking. Ignore him.</span>' "CampusMap">>
<</link>>
</div>/* Beauty-gated. Someone catcalls from across the quad. */
<div class="card">
<div class="card__title">📢 Catcall</div>
<<set _catcalls = [
'"Daaaamn, girl!" from a group of guys on a bench.',
'"Hey beautiful, where you going?" Someone yells from a passing car.',
'A wolf-whistle from a second-floor dorm window.',
'"Yo shorty! Come sit with us!" from a group at a picnic table.',
'"Looking good, scholarship girl!" Someone knows what CCUMDUP is.'
]>>
<<set _cat = _catcalls[random(0, _catcalls.length - 1)]>>
<p><<print _cat>></p>
<<if $transformation.sideEffects.exhibitionist >= 1>>
<p>You feel a little thrill. The attention is... flattering? No. Yes? You're confused about how you feel.</p>
<<modStat "arousal" 5 "Enjoying attention">>
<<else>>
<p>Your face burns. You keep walking, eyes forward.</p>
<</if>>
</div>
<<modStat "femininity" 1 "Catcalled">>
<<modStat "confidence" -2 "Street harassment">>/* Reputation-gated. Someone recognises you from a service encounter. */
<<set _npc = $temp.quadNPC>>
<div class="card">
<div class="card__title">😰 Recognised...</div>
<<set _recTexts = [
'A guy you vaguely recognise does a double-take as you pass. He nudges his friend and whispers something. They both look at you. One of them grins.',
'Someone calls out: "Hey! You\'re that girl from CampusHub, right? 5 stars, bro." His friends laugh. Your stomach drops.',
'"<<print $pc.femaleFirstName>>?" A guy jogs up. "We, uh... met last week? Through the programme? I just wanted to say... thanks." He looks embarrassed. You feel worse.'
]>>
<p><<print _recTexts[random(0, _recTexts.length - 1)]>></p>
</div>
<<modStat "confidence" -5 "Recognised">>
<<modStat "stress" 8 "Public recognition">>
<<modRep "slut" 2 "Recognised in public">>/* Meet another CCUMDUP girl. */
<<set _npc = $temp.quadNPC>>
<div class="card">
<div class="card__title">👩 Fellow Scholar</div>
<p>A <<print _npc.bodyType>> <<print _npc.race>> girl catches your eye near the fountain. Something about the way she carries herself — the same mixture of discomfort and determination — tells you she's one of you.</p>
<p>"<<print _npc.firstName>>," she says quietly, sitting beside you. "Also CCUMDUP. Also used to be a guy. Fun, right?"</p>
<<set _dialogue = [
'"How are you handling the... side effects?" She tugs at her bra strap self-consciously. "I got hit with the lactation thing. It\'s a nightmare."',
'"Have you done many services yet? I\'ve done three. The first one was..." She trails off. "Well. You\'ll see."',
'"My roommate doesn\'t know. Does yours? God, the lying is almost worse than the actual programme."',
'"At least the credits are real, right? That\'s what I keep telling myself. Real degree, real career after this."',
'"I heard there\'s a girl on the third floor who actually likes it now. Like, for real. Scary, right?"'
]>>
<p><<print _dialogue[random(0, _dialogue.length - 1)]>></p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">💬 "Yeah. It\'s a lot. Nice to know I\'m not alone though."</span>' "CampusMap">>
<<modStat "mood" 10 "Shared experience">>
<<modStat "stress" -8 "Solidarity">>
<</link>>
<<link '<span class="choice-btn">😔 "I don\'t want to talk about it."</span>' "CampusMap">>
<<modStat "stress" -3 "Avoidance">>
<</link>>
</div>/* A professor stops you. Sets up academic relationship. */
<<set _npc = $temp.quadNPC>>
<div class="card">
<div class="card__title">🎓 Professor <<print _npc.lastName>></div>
<p>A <<print _npc.bodyType>> <<print _npc.race>> <<if _npc.gender === "male">>man<<else>>woman<</if>> in a tweed jacket stops you on the path.</p>
<p>"You — you're one of our CCUMDUP scholars, aren't you? <<print _npc.firstName>> <<print _npc.lastName>>, <<print ['English', 'Psychology', 'Biology', 'Economics', 'Sociology', 'Art History'][random(0,5)]>> department."</p>
<<if _npc.personality === "friendly" || _npc.personality === "sweet">>
<p>"I just wanted to say — I know the programme has its challenges. My office hours are Tuesdays and Thursdays. Don't hesitate if you need anything."</p>
<<elseif _npc.personality === "creepy">>
<p><<if _npc.gender === "male">>His eyes linger a moment too long. "I've heard... interesting things about the programme. Perhaps we could discuss it in my office sometime? Privately."<<else>>"The programme is... well. Just be careful, dear. Some of the faculty have opinions."<</if>></p>
<<else>>
<p>"Keep your grades up. The scholarship has academic requirements too, you know. I don't give free passes."</p>
<</if>>
</div>
<<modStat "stress" 3 "Professor interaction">>/* Pheromones SE causes a scene. Level 2+ only. */
<div class="card">
<div class="card__title">🌸 Your pheromones are out of control</div>
<<set _level = $transformation.sideEffects.pheromones>>
<<if _level <= 2>>
<p>As you walk through the quad, you notice an unusual number of heads turning. A guy on a bench follows you with his eyes, mouth slightly open. A girl walking past does a double-take and then looks confused about why she's staring.</p>
<p>It's your pheromones. The X-Change chemical signature is designed to attract. And right now, it's working overtime.</p>
<<elseif _level === 3>>
<p>The effect is almost visible. People slow down as you pass, turning like sunflowers tracking the sun. A group of guys falls completely silent as you walk by. One of them actually stands up.</p>
<p>"Excuse me," he says, but he clearly has no plan for what comes after that sentence.</p>
<<else>>
<p>It's getting ridiculous. You can't walk ten feet without someone approaching. A guy walks into a lamppost staring at you. Two girls start whispering furiously. A professor drops his briefcase.</p>
<p>You need to get inside before you cause an actual scene.</p>
<</if>>
</div>
<<modStat "arousal" 5 "Pheromone attention">>
<<modStat "femininity" 2 "Centre of attention">>
<<modStat "confidence" -3 "Unwanted attention">>/* ═══════════════════════════════════════════════════
THORNFIELD — BAR DISTRICT
Four venues: Rusty Nail, Velvet, Pulse, Candy Bar
═══════════════════════════════════════════════════ */
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<if _period === "early_morning" || _period === "morning" || _period === "afternoon">>
<h2>🍸 Bar District</h2>
<p>The neon signs are off, the doors are locked. The bar district doesn't wake up until evening.</p>
<p><em>Come back after 5 PM.</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div>
<<else>>
<h2>🍸 Bar District</h2>
<<showDrunkStatus>>
<<if _period === "evening">>
<p>The bar district is warming up. Neon signs flicker to life, bouncers take their posts, and the first crowds trickle in. Bass thumps from somewhere down the street.</p>
<<elseif _period === "night">>
<p>The bar district is alive. Music bleeds from every doorway, drunk students stumble between venues, and the air smells of cigarettes and regret. It's prime time.</p>
<<else>>
<p>The bar district is winding down. A few diehards remain, taxis idle at the kerb, and broken glass crunches underfoot.</p>
<</if>>
<<if $substances.drunkLevel >= 3>>
<p><em>The world is... moving. A lot. You grab a lamp post for support.</em></p>
<</if>>
<<divider "Venues">>
<div class="choice-group">
<<link '<span class="choice-btn">🍺 The Rusty Nail — Dive Bar</span>' "Bar_RustyNail">>
<<advanceTime 10>>
<</link>>
<<link '<span class="choice-btn">🍸 Velvet — Cocktail Lounge</span>' "Bar_Velvet">>
<<advanceTime 10>>
<</link>>
<<link '<span class="choice-btn">🎵 Pulse — Dance Club</span>' "Bar_Pulse">>
<<advanceTime 10>>
<</link>>
<<link '<span class="choice-btn">💋 Candy Bar — Strip Club</span>' "Bar_CandyBar">>
<<advanceTime 10>>
<</link>>
/* ─── Velvet Room (BDSM Club) ─── */
<<if $velvetRoom.discovered>>
<<link '<span class="choice-btn">🖤 The Velvet Room</span>' "VelvetRoom_Hub">>
<<advanceTime 10>>
<</link>>
<<elseif !$velvetRoom.discovered && ($reputation.slut >= 30 || ($transformation.sideEffects.submissive >= 2))>>
<<link '<span class="choice-btn">🚪 An unmarked door...</span>' "VelvetRoom_Discover">><</link>>
<</if>>
/* ─── Glory Hole (bar bathroom) ─── */
<<if $gloryHole.barDiscovered>>
<<link '<span class="choice-btn">🚻 Bar Bathroom (glory hole)</span>' "GloryHole_Bar">>
<<advanceTime 10>>
<</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">>
<<advanceTime 30>>
<<if $substances.drunkLevel >= 3>>
<<set $temp.drunkTravel = true>>
<</if>>
<</link>>
</div>
<</if>><h2>🍺 The Rusty Nail</h2>
<<showDrunkStatus>>
<p>A proper dive. The lighting is bad, the pool table has a rip in the felt, and the jukebox only plays classic rock. The bartender — a burly woman with sleeve tattoos — doesn't card anyone.</p>
<<if $world.dayOfWeek >= 4>>
<p>It's packed tonight. A group of construction workers occupy the corner booth. A few students huddle around the pool table.</p>
<<else>>
<p>Quiet tonight. A few regulars nurse their drinks. The TV plays sports on mute.</p>
<</if>>
<<set _dealer = random(1, 10) <= 3>>
<<if _dealer>>
<p>A thin guy in a hoodie leans against the cigarette machine, making eye contact with anyone who looks his way. <em>Dealer.</em></p>
<</if>>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">🍺 Order a beer ($4)</span>' "Bar_RustyNail">>
<<drink "beer">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">🥃 Order a shot ($5)</span>' "Bar_RustyNail">>
<<drink "shot">>
<<advanceTime 15>>
<</link>>
<<link '<span class="choice-btn">🎱 Play pool</span>' "Bar_RustyNail">>
<<advanceTime 30>>
<<modStat "mood" 5 "Playing pool">>
<<run XCLC.Toast.show("🎱 You play a few rounds. Not bad.", "info")>>
<</link>>
<<if _dealer>>
<<link '<span class="choice-btn">🤫 Talk to the guy in the hoodie</span>' "Bar_DrugDeal">><</link>>
<</if>>
/* ─── Glory Hole (bar bathroom) ─── */
<<if !$gloryHole.barDiscovered && $substances.drunkLevel >= 2 && $reputation.slut >= 20>>
<<link '<span class="choice-btn">🚻 Use the bathroom (you notice something...)</span>' "Bar_RustyNail">>
<<set $gloryHole.barDiscovered = true>>
<<run XCLC.Toast.show("🚻 You notice a hole in the bathroom stall wall...", "warning")>>
<</link>>
<<elseif $gloryHole.barDiscovered>>
<<link '<span class="choice-btn">🚻 Bathroom (glory hole)</span>' "GloryHole_Bar">><</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🚪 Leave</span>' "BarDistrict">><</link>>
</div><h2>🍸 Velvet</h2>
<<showDrunkStatus>>
/* Bouncer check */
<<if $pc.beautyTotal < 50>>
<<set _charmResult = XCLC.Roll.doCheck("charm", 4)>>
<<if _charmResult === "crit_fail" || _charmResult === "partial_fail">>
<p>The bouncer — a mountain of a man in a black suit — looks you up and down. "Not tonight, sweetheart." He jerks a thumb toward the street.</p>
<p><em>You're not dressed well enough for Velvet. Try improving your outfit or beauty.</em></p>
<<run XCLC.DicePopup.show()>>
<div class="choice-group">
<<link '<span class="choice-btn">😤 Walk away</span>' "BarDistrict">><</link>>
</div>
<<else>>
<p>The bouncer gives you a once-over and nods. The velvet rope lifts.</p>
<<run XCLC.DicePopup.show()>>
<<include "Bar_Velvet_Interior">>
<</if>>
<<else>>
<<include "Bar_Velvet_Interior">>
<</if>><p>Inside, everything is dark wood, soft jazz, and candlelight. The cocktails come in crystal glasses. The clientele is older — professionals, sugar daddies, women in designer dresses.</p>
<p><<if $pc.beautyTotal >= 70>>Several heads turn as you walk in. You look good and everyone knows it.<<elseif $pc.beautyTotal >= 50>>You blend in well enough. A few appreciative glances.<<else>>You feel underdressed. Everyone looks more polished than you.<</if>></p>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">🍸 Order a cocktail ($12)</span>' "Bar_Velvet">>
<<drink "cocktail">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">🍷 Order wine ($9)</span>' "Bar_Velvet">>
<<drink "wine">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">💬 Mingle with the crowd</span>' "Bar_Velvet">>
<<advanceTime 30>>
<<set _charmResult = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _charmResult === "crit_success" || _charmResult === "success">>
<<modStat "confidence" 5 "Good conversation">>
<<modRep "popular" 2>>
<<run XCLC.Toast.show("✨ You made a great impression.", "info")>>
<<else>>
<<modStat "confidence" -3 "Awkward conversation">>
<</if>>
<</link>>
<<divider "">>
<<link '<span class="choice-btn">🚪 Leave</span>' "BarDistrict">><</link>>
</div><h2>🎵 Pulse</h2>
<<showDrunkStatus>>
<<if $finance.money < 10>>
<p>The bouncer points at the sign: "$10 cover." You check your pockets. Not enough.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😤 Can't afford the cover</span>' "BarDistrict">><</link>>
</div>
<<else>>
<<set $finance.money -= 10>>
<p>You pay the $10 cover and push through the heavy doors. The bass hits you like a wall. Strobe lights cut through fog machines. The dance floor is packed — bodies grinding, hands in the air, sweat and perfume mixing in the dark.</p>
<p>A DJ booth towers over the floor. The VIP section is roped off upstairs. The bar glows neon blue.</p>
<<set _dealer = random(1, 10) <= 5>>
<<if _dealer>>
<p>Near the bathrooms, a guy with glow sticks around his neck catches your eye and tilts his head toward the back hallway. <em>Dealer.</em></p>
<</if>>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">🍸 Order a drink ($7)</span>' "Bar_Pulse">>
<<drink "cocktail">>
<<advanceTime 15>>
<</link>>
<<link '<span class="choice-btn">💃 Hit the dance floor</span>' "Bar_Dance">>
<<advanceTime 30>>
<</link>>
<<if _dealer>>
<<link '<span class="choice-btn">🤫 Follow the glow stick guy</span>' "Bar_DrugDeal">><</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🚪 Leave</span>' "BarDistrict">><</link>>
</div>
<</if>><h2>💃 Dance Floor</h2>
<<showDrunkStatus>>
<<set _danceResult = XCLC.Roll.doCheck("dance", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success">>
<p>You lose yourself in the music. Your body moves with a confidence you didn't know you had — hips rolling, arms flowing, feet finding every beat. A circle forms around you. People are watching, cheering.</p>
<p><<if $substances.ecstasy.rolling>>The ecstasy makes every note feel like it's being played inside your body. You've never felt so alive.<<else>>The rhythm takes over. You're not thinking — just feeling.<</if>></p>
<<modStat "confidence" 10 "Amazing dancing">>
<<modStat "mood" 15 "Dancing">>
<<modRep "popular" 3>>
<<addXP "dance" 25>>
<<elseif _danceResult === "success">>
<p>You find a rhythm and stick with it. Nothing flashy, but you're moving well. A few people dance near you, matching your energy. It feels good.</p>
<<modStat "mood" 10 "Dancing">>
<<addXP "dance" 15>>
<<elseif _danceResult === "partial_fail">>
<p>You try to dance but the beat keeps escaping you. Your arms don't know what to do. You bounce awkwardly, hyper-aware of everyone around you looking more natural than you.</p>
<<modStat "mood" 3 "Tried to dance">>
<<addXP "dance" 8>>
<<else>>
<p>You step onto the floor and immediately bump into someone, who spills their drink. "Watch it!" Someone laughs. You retreat to the edge, face burning.</p>
<<modStat "confidence" -5 "Dance floor disaster">>
<<addXP "dance" 5>>
<</if>>
/* NPC approach chance */
<<set _approached = random(1, 10) <= ($pc.beautyTotal > 60 ? 5 : 3)>>
<<if _approached>>
<<set _approachNPC = XCLC.NPC.generate({gender: random(1,10) <= 7 ? "male" : "female", type: "student"})>>
<<set $temp.barNPC = _approachNPC>>
<p><<if _approachNPC.gender === "male">>A <<print _approachNPC.bodyType>> guy<<else>>A <<print _approachNPC.bodyType>> girl<</if>> slides up behind you, <<if $substances.drunkLevel >= 2>>and through the beer goggles they look incredibly hot<<else>>matching your movement<</if>>. "You're a good dancer," <<if _approachNPC.gender === "male">>he<<else>>she<</if>> says close to your ear.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😏 Dance with them</span>' "Bar_Dance">>
<<advanceTime 20>>
<<modStat "arousal" 10 "Grinding">>
<<modRep "popular" 1>>
<</link>>
<<link '<span class="choice-btn">👋 Smile and move away</span>' "Bar_Pulse">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">💃 Keep dancing</span>' "Bar_Dance">>
<<advanceTime 20>>
<</link>>
<<link '<span class="choice-btn">🚪 Head back</span>' "Bar_Pulse">><</link>>
</div>
<</if>><h2>🤫 The Dealer</h2>
<p>He's lean, mid-twenties, eyes scanning constantly. "What you need?" he asks, barely moving his lips.</p>
<<divider "Available">>
<div class="choice-group">
<<if $finance.money >= 15>>
<<link '<span class="choice-btn">🌿 Weed — $15</span>' "Bar_DrugDeal">>
<<set $finance.money -= 15>>
<<set $substances.weed.doses++>>
<<run XCLC.Toast.show("🌿 Scored a bag.", "info")>>
<<modRep "troublemaker" 1>>
<</link>>
<</if>>
<<if $finance.money >= 30>>
<<link '<span class="choice-btn">💊 Ecstasy — $30</span>' "Bar_DrugDeal">>
<<set $finance.money -= 30>>
<<set $substances.ecstasy.doses++>>
<<run XCLC.Toast.show("💊 Scored a pill.", "info")>>
<<modRep "troublemaker" 2>>
<</link>>
<</if>>
<<if $finance.money >= 50>>
<<link '<span class="choice-btn">❄️ Cocaine — $50</span>' "Bar_DrugDeal">>
<<set $finance.money -= 50>>
<<set $substances.cocaine.doses++>>
<<run XCLC.Toast.show("❄️ Scored a gram.", "info")>>
<<modRep "troublemaker" 3>>
<</link>>
<</if>>
<<if $finance.money < 15>>
<p><em>You can't afford anything he's selling.</em></p>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">👋 Nevermind</span>' "BarDistrict">><</link>>
</div><h2>💋 Candy Bar</h2>
<<showDrunkStatus>>
<p>The Candy Bar smells like body spray and desperation. Neon pink lights wash everything in a warm glow. A raised stage dominates the center, a pole gleaming under spotlights. Waitresses in lingerie weave between tables.</p>
<<if $world.dayOfWeek === 2 || $world.dayOfWeek === 5>>
<p>A chalkboard sign reads: <strong>🌟 AMATEUR NIGHT — Dance for Tips!</strong></p>
<</if>>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">👀 Watch a show ($10)</span>' "Bar_StripShow">>
<<if $finance.money >= 10>>
<<set $finance.money -= 10>>
<<advanceTime 30>>
<</if>>
<</link>>
<<link '<span class="choice-btn">🍸 Order a drink ($6)</span>' "Bar_CandyBar">>
<<drink "cocktail">>
<<advanceTime 15>>
<</link>>
<<if $world.dayOfWeek === 2 || $world.dayOfWeek === 5>>
<<link '<span class="choice-btn">💃 Sign up for Amateur Night</span>' "Bar_AmateurNight">><</link>>
<</if>>
<<link '<span class="choice-btn">🚪 VIP Back Rooms</span>' "Bar_BackRoom">>
<<advanceTime 10>>
<</link>>
<<divider "">>
<<link '<span class="choice-btn">🚪 Leave</span>' "BarDistrict">><</link>>
</div><h2>👀 The Show</h2>
<<if $finance.money < 10>>
<p>You can't afford a show right now. The bouncer near the stage area shakes his head.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Bar_CandyBar">><</link>>
</div>
<<else>>
<p>You settle into a plush seat near the stage. The lights dim, the music shifts to something slower, heavier.</p>
<<set _dancer = XCLC.NPC.generate({gender: "female", type: "student"})>>
<p>A <<print _dancer.bodyType>> woman with <<print _dancer.hairColour>> hair takes the stage. She moves like water — every muscle controlled, every look deliberate. The pole work is impressive.</p>
<p><<if $pc.femininity >= 50>>You watch with a mix of admiration and something else. Could you do that?<<else>>It's mesmerizing. You can barely look away.<</if>></p>
<<modStat "mood" 5 "Entertainment">>
<<modStat "arousal" 10 "Strip show">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to the bar</span>' "Bar_CandyBar">><</link>>
</div>
<</if>><h2>💃 Amateur Night</h2>
<p>The MC spots you near the sign-up sheet. "You wanna go up? Hundred bucks minimum for anyone who finishes a full routine. Tips on top. You in?"</p>
<div class="choice-group">
<<link '<span class="choice-btn">💪 Let's do this</span>' "Bar_AmateurNight_Perform">><</link>>
<<link '<span class="choice-btn">😰 Actually, never mind</span>' "Bar_CandyBar">><</link>>
</div><h2>🌟 Your Performance</h2>
<<advanceTime 30>>
<p>The spotlight hits you. The crowd goes quiet, then someone whistles. The music starts — a deep, thumping beat.</p>
/* Stage 1: Basic dance */
<<set _danceResult = XCLC.Roll.doCheck("dance", 4)>>
<<run XCLC.DicePopup.show()>>
<<set _tips = 20>>
<<set _stripped = false>>
<<if _danceResult === "crit_success" || _danceResult === "success">>
<p>You find the rhythm immediately. Your hips move, your body rolls. The crowd leans in. Dollar bills flutter onto the stage.</p>
<<set _tips += 30>>
<<addXP "dance" 20>>
/* Stage 2: Strip further? */
<div class="choice-group">
<<link '<span class="choice-btn">👕 Strip your top off (more tips)</span>' "Bar_AmateurNight_Strip">>
<<set $temp.amateurTips = _tips>>
<</link>>
<<link '<span class="choice-btn">🎤 Finish the routine (keep clothes on)</span>' "Bar_AmateurNight_Finish">>
<<set $temp.amateurTips = _tips>>
<</link>>
</div>
<<else>>
<p>You stumble on the first step. The pole is slippery — or your hands are. You try to recover, swaying to the beat, but it's not great. A few polite claps. Some uncomfortable looks.</p>
<<set _tips = 20>>
<<addXP "dance" 10>>
<<set $temp.amateurTips = _tips>>
<<modStat "confidence" -5 "Awkward performance">>
<div class="choice-group">
<<link '<span class="choice-btn">😳 Get off stage</span>' "Bar_AmateurNight_Finish">><</link>>
</div>
<</if>><h2>💋 Going Further</h2>
<<set _composureResult = XCLC.Roll.doCheck("composure", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _composureResult === "crit_success" || _composureResult === "success">>
<p>You pull your top off with a flourish. The crowd roars. You feel the spotlight hot on your <<print $pc.breastSize>>-cup breasts. Dollar bills rain down. Someone yells "Take it ALL off!"</p>
<p><<if $pc.femininity >= 60>>Something about this feels... right. The attention, the power of it.<<else>>Your heart is pounding. But the money is good.<</if>></p>
<<set $temp.amateurTips += 50>>
<<modStat "confidence" 10 "Crowd goes wild">>
<<modStat "arousal" 15 "Exhibitionism">>
<<modRep "slut" 3>>
<<modRep "popular" 2>>
<<addXP "dance" 15>>
<<else>>
<p>You try to pull your top off seductively but your arms get tangled. Someone laughs. You manage to get it off but the moment is lost. A few bills land on stage. Mostly pity tips.</p>
<<set $temp.amateurTips += 15>>
<<modStat "confidence" -3 "Awkward strip">>
<<modRep "slut" 2>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🎤 Finish the routine</span>' "Bar_AmateurNight_Finish">><</link>>
</div><h2>💰 Results</h2>
<<set _totalTips = $temp.amateurTips || 20>>
<<set _totalTips += random(-10, 20)>>
<<if _totalTips < 20>><<set _totalTips = 20>><</if>>
<<set $finance.money += _totalTips>>
<p>The music fades. You collect the bills scattered across the stage. The MC hands you the base pay.</p>
<div class="card">
<div class="card__title">💰 Amateur Night Earnings</div>
<p><strong>Tips + Base:</strong> $<<print _totalTips>></p>
<<if _totalTips >= 80>>
<p><em>The MC nods appreciatively. "Come back anytime, honey."</em></p>
<<elseif _totalTips >= 40>>
<p><em>"Not bad for a newbie."</em></p>
<<else>>
<p><em>The MC pats your shoulder sympathetically. "Practice makes perfect."</em></p>
<</if>>
</div>
<<modRep "partyGirl" 2>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to Candy Bar</span>' "Bar_CandyBar">><</link>>
</div><h2>🚪 VIP Back Rooms</h2>
<p>A hallway lined with curtained booths. Muffled music from the main floor. A bored bouncer checks your ID and waves you through.</p>
<p>"Private dances are $50. Anything else is between you and the customer."</p>
<<set _clientNPC = XCLC.NPC.generate({gender: "male", type: "premium"})>>
<<set $temp.backRoomNPC = _clientNPC>>
<p>A <<print _clientNPC.bodyType>> <<print _clientNPC.personality>> man in an expensive suit gestures you over. "How much for a private dance, sweetheart?"</p>
<div class="choice-group">
<<link '<span class="choice-btn">💃 Give him a private dance ($50)</span>' "Bar_BackRoom_Dance">><</link>>
<<link '<span class="choice-btn">🚪 Just looking</span>' "Bar_CandyBar">><</link>>
</div><h2>💃 Private Dance</h2>
<<advanceTime 20>>
<<set _npc = $temp.backRoomNPC>>
<<set _danceResult = XCLC.Roll.doCheck("dance", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success" || _danceResult === "success">>
<p>You straddle his lap, moving to the beat. Your body rolls against him. He's captivated — hands gripping the armrests, obeying the "no touching" rule (barely). His breathing goes ragged.</p>
<p>"Fuck... you're incredible." He peels off extra bills. "Can we... go further?"</p>
<<set _basePay = 50 + random(20, 50)>>
<<set $finance.money += _basePay>>
<<addXP "dance" 15>>
<<addXP "charm" 10>>
<<modStat "arousal" 10 "Lap dance">>
<<run XCLC.Toast.show("💰 +$" + _basePay + " for the dance", "info")>>
<div class="choice-group">
<<link '<span class="choice-btn">😏 "How much further?" (escort)</span>' "Bar_BackRoom_Escort">>
<<set $temp.escortPay = random(100, 200)>>
<</link>>
<<link '<span class="choice-btn">💅 Just the dance</span>' "Bar_CandyBar">><</link>>
</div>
<<else>>
<p>The dance is... fine. Nothing special. He doesn't ask for more. You collect the standard $50 and leave the booth.</p>
<<set $finance.money += 50>>
<<addXP "dance" 8>>
<<run XCLC.Toast.show("💰 +$50 for the dance", "info")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Bar_CandyBar">><</link>>
</div>
<</if>><h2>💋 Going Further</h2>
<<set _npc = $temp.backRoomNPC>>
<<set _pay = $temp.escortPay || 150>>
<p>"<<print _pay>> bucks," you say. He doesn't even blink. Bills appear on the table.</p>
<<set $finance.money += _pay>>
<<run XCLC.Toast.show("💰 +$" + _pay, "info")>>
<p>The curtain closes. What happens in the back room stays in the back room.</p>
/* Simplified service encounter */
<<set _result = XCLC.Roll.doCheck("oral", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>It's quick, efficient, and he's generous afterwards. "You ever want steady work, talk to the manager," he says, straightening his tie.</p>
<<modStat "confidence" 3 "Easy money">>
<<else>>
<p>It's awkward in the cramped booth. Functional. He leaves without a word.</p>
<</if>>
<<modStat "arousal" 15 "Back room">>
<<modRep "slut" 3>>
<<modHygiene -15 "Back room encounter">>
<<advanceTime 20>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Clean up and go back</span>' "Bar_CandyBar">><</link>>
</div><h2>🌃 Getting Home Wasted</h2>
<<if $substances.drunkLevel >= 4>>
/* Blackout */
<p>You... you don't remember leaving. The last thing you recall is the neon signs blurring together, then nothing.</p>
<p><em>Fade to black.</em></p>
<<set _badEvent = random(1, 10)>>
<<if _badEvent <= 3>>
<<set $temp.blackoutEvent = "woke up somewhere strange">>
<p>You wake up in an unfamiliar bed. Your clothes are scattered on the floor. Someone is snoring next to you. You don't recognise them.</p>
<<modStat "stress" 15 "Blackout mystery">>
<<modHygiene -30 "Unknown night">>
<<elseif _badEvent <= 6>>
<p>You wake up on a bench outside the student union. It's 6 AM. Your wallet is lighter than it should be.</p>
<<set $finance.money = Math.max(0, $finance.money - random(20, 50))>>
<<modStat "stress" 10 "Woke up outside">>
<<else>>
<p>You wake up in your own bed. Thank god. You have no memory of how you got here. Your phone has 14 missed calls.</p>
<<modStat "stress" 5 "Memory gap">>
<</if>>
<<elseif $substances.drunkLevel >= 3>>
/* Wasted */
<p>You stumble toward campus, bouncing off walls and lampposts. A taxi driver honks at you as you wander into the road.</p>
<<set _taxiMoney = random(10, 20)>>
<<if $finance.money >= _taxiMoney>>
<p>Somehow you flag down a taxi. It costs $<<print _taxiMoney>>. You make it home alive.</p>
<<set $finance.money -= _taxiMoney>>
<<else>>
<p>You can't afford a taxi. You walk. It takes forever. Your feet hurt. You may have been sick behind a bush.</p>
<<modStat "energy" -20 "Long drunk walk">>
<</if>>
<</if>>
<<resetDrinking>>
<<advanceTime 120>>
<div class="choice-group">
<<link '<span class="choice-btn">😴 Pass out</span>' "DormRoom">>
<<set $world.time = 420>>
<<advanceDay>>
<</link>>
</div><<run XCLC.Service.checkForNewRequest()>>
<h2>💪 Gym & Locker Room</h2>
<p>It's <<showTime>>. <<print XCLC.Gym.getAtmosphere()>></p>
<<if $scholarship.activeRequest>>
<<set _req = $scholarship.activeRequest>>
<<set _elapsed = $world.time - _req.createdAt>>
<<set _remaining = 30 - _elapsed>>
<div class="alert alert--info">📱 <strong>CampusHub Request!</strong> <<print _req.npc.firstName>> wants <<print _req.serviceType>> at <<print _req.locationName>>. (<<print _remaining>> min remaining)</div>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Accept request</span>' "ServiceMeet">>
<<run XCLC.Service.acceptRequest()>>
<<advanceTime 10>>
<</link>>
</div>
<</if>>
<<if $transformation.sideEffects.pheromones >= 2 && XCLC.Gym.getCrowdedness() === "packed">>
<div class="alert alert--warning">🧪 The packed gym is making your pheromones go haywire. You can feel every pair of eyes on you.</div>
<<modStat "arousal" 10 "Pheromones in packed gym">>
<</if>>
<<if $gym.workedOutToday>>
<p><em>You've already worked out today. Your muscles need rest.</em></p>
<</if>>
<div class="choice-group">
<<if !$gym.workedOutToday>>
<<link '<span class="choice-btn">🏋️ Weight Training (1 hour)</span>' "GymWorkout">>
<<set $temp.gymActivity = "weights">>
<</link>>
<<link '<span class="choice-btn">🧘 Yoga Class (45 min)</span>' "GymWorkout">>
<<set $temp.gymActivity = "yoga">>
<</link>>
<<link '<span class="choice-btn">🏃 Cardio (45 min)</span>' "GymWorkout">>
<<set $temp.gymActivity = "cardio">>
<</link>>
<</if>>
<<link '<span class="choice-btn">🚿 Locker Room & Showers</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><<set _activity = $temp.gymActivity>>
<<set _se = $transformation.sideEffects>>
/* Apply workout effects */
<<if _activity === "weights">>
<h2>🏋️ Weight Training</h2>
<p>You grab a pair of dumbbells and find an open bench. The weights feel heavy in your smaller hands — your <<print $pc.bodyType>> frame isn't built for this, but you push through.</p>
<<if $pc.breastSize === "D" || $pc.breastSize === "DD">>
<p>Your <<print $pc.breastSize>>-cups make bench presses awkward. Every rep, they shift and bounce. You catch someone staring and look away.</p>
<</if>>
<<advanceTime 60>>
<<modStat "energy" -20 "Weight training">>
<<modStat "mood" 10 "Exercise endorphins">>
<<modStat "stress" -10 "Exercise">>
<<addXP "stamina" 15>>
<<set $pc.beautyFitness = Math.min(15, $pc.beautyFitness + 2)>>
<<elseif _activity === "yoga">>
<h2>🧘 Yoga Class</h2>
<p>You roll out a mat near the back of the studio. The instructor — a lithe woman in her thirties — guides the class through poses.</p>
<p>Downward dog is... different with breasts. They hang toward your face. You try not to think about it.</p>
<<if _se.increasedSensitivity >= 2>>
<p>Every stretch sends tingles through your hypersensitive body. The yoga pants pressing against you in warrior pose makes you bite your lip. This is supposed to be relaxing.</p>
<<modStat "arousal" 10 "Sensitive yoga">>
<</if>>
<<advanceTime 45>>
<<modStat "energy" -10 "Yoga">>
<<modStat "mood" 8 "Yoga calm">>
<<modStat "stress" -15 "Yoga relaxation">>
<<addXP "composure" 10>>
<<set $pc.beautyFitness = Math.min(15, $pc.beautyFitness + 1)>>
<<else>>
<h2>🏃 Cardio</h2>
<p>You climb onto a treadmill and start running. Your <<print $pc.breastSize>>-cup breasts bounce with every stride despite the sports bra. Your <<print $pc.hairColour>> ponytail whips back and forth.</p>
<p>Within ten minutes you're drenched in sweat. But the endorphins hit and for a while, you don't think about anything except the burn.</p>
<<advanceTime 45>>
<<modStat "energy" -25 "Cardio">>
<<modStat "mood" 5 "Runner's high">>
<<modStat "stress" -5 "Cardio">>
<<addXP "stamina" 20>>
<<set $pc.beautyFitness = Math.min(15, $pc.beautyFitness + 2)>>
<</if>>
/* Common post-workout */
<<set $pc.lastGymDay = $world.day>>
<<set $gym.totalVisits++>>
<<set $gym.workedOutToday = true>>
<<modHygiene -20 "Workout sweat">>
<<run XCLC.Beauty.recalculate()>>
<<run XCLC.Toast.show('💪 Workout complete! Beauty +' + (_activity === 'yoga' ? '1' : '2') + ' (fitness)', 'success')>>
<p>You finish up, muscles aching pleasantly. You're sweaty and probably need a shower.</p>
/* Roll for event */
<<set _event = XCLC.Gym.rollEvent(_activity)>>
<<if _event>>
<<set $temp.gymEvent = _event>>
<<include "GymEventDispatch">>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Hit the showers</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">💪 Back to gym</span>' "Gym">><</link>>
<<link '<span class="choice-btn">🗺️ Leave gym</span>' "CampusMap">><</link>>
</div>
<</if>><<set _evt = $temp.gymEvent>>
<<if _evt.type === "mirror">><<include "GymEvent_Mirror">>
<<elseif _evt.type === "wardrobe">><<include "GymEvent_Wardrobe">>
<<elseif _evt.type === "spotter">><<include "GymEvent_Spotter">>
<<elseif _evt.type === "yogaInstructor">><<include "GymEvent_YogaInstructor">>
<<elseif _evt.type === "pheromones">><<include "GymEvent_Pheromones">>
<<elseif _evt.type === "jockApproach">><<include "GymEvent_JockApproach">>
<<elseif _evt.type === "lockerIntrusion">><<include "GymEvent_LockerIntrusion">>
<<elseif _evt.type === "showerScene">><<include "GymEvent_ShowerScene">>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Hit the showers</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">🗺️ Leave gym</span>' "CampusMap">><</link>>
</div>
<</if>><p>On the way to the locker room, you pass the floor-to-ceiling mirror. You stop.</p>
<<if $pc.femininity < 30>>
<p>The girl in the reflection — flushed, sweaty, <<print $pc.hairColour>> hair plastered to her neck — she still doesn't look like you. You remember being broader. Taller. Harder. This body is soft and curved in ways that catch you off guard every time.</p>
<p>You stare at your <<print $pc.breastSize>>-cup chest rising and falling. Those are yours now. That thought hasn't gotten any less strange.</p>
<<modStat "stress" 3 "Dysphoria">>
<<elseif $pc.femininity < 60>>
<p>You catch your reflection and slow down. The girl looking back — flushed cheeks, <<print $pc.bodyType>> frame, <<print $pc.breastSize>>-cups in a sports bra — she's starting to look familiar. Starting to look like... you.</p>
<p>The thought is less terrifying than it used to be. You're not sure what that means.</p>
<<modStat "femininity" 1 "Mirror acceptance">>
<<else>>
<p>You look GOOD. Flushed and glowing from the workout, your <<print $pc.bodyType>> body on full display in gym clothes. Your <<print $pc.hairColour>> hair is messy in that effortless way. You catch yourself posing — just a little — turning to check your <<print $pc.buttSize>> ass in the mirror.</p>
<p>A guy walking past does a double-take. You feel a flush of warmth that has nothing to do with exercise.</p>
<<modStat "confidence" 3 "Looking good">>
<<modStat "femininity" 2 "Admiring yourself">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Hit the showers</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">🗺️ Leave gym</span>' "CampusMap">><</link>>
</div><p>Mid-rep, you feel it — your sports bra shifts, then gives. The elastic band snaps and your <<print $pc.breastSize>>-cup breasts bounce free under your tank top. No support. Very visible.</p>
<<set _composureCheck = XCLC.Roll.doCheck("composure", 3)>>
<<if _composureCheck.outcome === "crit_success" || _composureCheck.outcome === "success">>
<p>You cross your arms casually, grab your towel, and drape it over your chest as you walk to the locker room. Smooth. Nobody noticed — or if they did, they can't prove it.</p>
<<modStat "confidence" 2 "Handled it">>
<<else>>
<p>You freeze. Your nipples are clearly visible through the thin fabric. The guy on the machine next to you stares openly. You grab your things and practically run to the locker room, face burning.</p>
<<modStat "confidence" -5 "Public wardrobe malfunction">>
<<modRep "slut" 2 "Wardrobe malfunction">>
<<if $transformation.sideEffects.exhibitionist >= 2>>
<p>The worst part? Some sick part of you liked being seen. Your cheeks burn with shame — and something else.</p>
<<modStat "arousal" 10 "Exhibitionist thrill">>
<</if>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Hit the showers</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">🗺️ Leave gym</span>' "CampusMap">><</link>>
</div><<set _npc = XCLC.NPC.generate('student')>>
<p>A <<print _npc.bodyType>> guy with <<print _npc.hairColour>> hair and <<print _npc.eyeColour>> eyes approaches your bench. "Need a spot?"</p>
<p>Before you can answer, he's standing over you. His crotch is approximately six inches from your face. As you lift, his hands hover under the bar — then slide to your sides, brushing the edges of your <<print $pc.breastSize>>-cups.</p>
<p>"Just keeping you safe," he says with a smile that says otherwise.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🤚 Tell him to back off</span>' "Gym">>
<<modStat "confidence" 3 "Stood up for yourself">>
<<run XCLC.Toast.show('You told him where to put his hands.', 'success')>>
<</link>>
<<link '<span class="choice-btn">😶 Let it go</span>' "Gym">>
<<modStat "femininity" 2 "Accepting attention">>
<<if $transformation.sideEffects.submissive >= 2>>
<<modStat "arousal" 5 "Submissive acceptance">>
<</if>>
<</link>>
</div><p>The yoga instructor moves through the class, adjusting poses. When she reaches you, her hands linger on your hips, sliding you into a deeper stretch.</p>
<p>"Open your hips more," she murmurs, pressing down on your lower back. Her palm is warm. The stretch feels good — too good. Her other hand traces along your inner thigh to adjust your alignment.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 2>>
<p>Your hypersensitive body lights up at her touch. You suppress a whimper. She notices — her eyes meet yours with a knowing look.</p>
<<modStat "arousal" 15 "Instructor's touch + sensitivity">>
<<else>>
<<modStat "arousal" 8 "Instructor's touch">>
<</if>>
<<if $transformation.sideEffects.submissive >= 2>>
<p>You can't bring yourself to say anything. The submissiveness in you just... accepts it. She adjusts you again, this time pulling your hips back against hers. "Better," she whispers.</p>
<<modStat "femininity" 2 "Submissive acceptance">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🧘 Continue the class</span>' "Gym">>
<<run XCLC.Toast.show('You survived yoga.', 'info')>>
<</link>>
</div><p>The gym is packed and your pheromones are in overdrive. Within ten minutes of your workout, a semicircle of guys has materialized around your area of the gym. Two are pretending to use machines nearby. One is just standing there, not even pretending.</p>
<p>"Can I help you?" you ask. None of them move.</p>
<p>More are drifting over. The air feels electric. You can feel their attention like a physical weight — and your body is responding, a warmth blooming in your lower stomach.</p>
<<modStat "arousal" 15 "Pheromone gym swarm">>
<<modStat "femininity" 2 "Centre of attention">>
<<modStat "stress" 5 "Surrounded">>
<div class="choice-group">
<<link '<span class="choice-btn">🏃 Escape to the locker room</span>' "GymLocker">><</link>>
<<link '<span class="choice-btn">🗺️ Leave the gym entirely</span>' "CampusMap">><</link>>
</div><<set _jock = XCLC.NPC.generate('student')>>
<p>A <<print _jock.height>>, <<print _jock.bodyType>> guy in a tank top approaches you. <<print _jock.hairColour.charAt(0).toUpperCase()>><<print _jock.hairColour.slice(1)>> hair, <<print _jock.eyeColour>> eyes, the kind of arms that suggest he lives here.</p>
<p>"Hey. <<print _jock.firstName>>." He extends a hand. "You're in the programme, right? CCUMDUP?"</p>
<p>You nod cautiously.</p>
<p>"Cool. I'm a Premium Student. Was gonna request you on CampusHub, but since you're here..." He shrugs. "Want to skip the app and just... handle it now?"</p>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Sure, let\'s do this</span>' "ServiceMeet">>
/* Create a request object directly */
<<set $temp.serviceRequest = {
npc: _jock,
serviceType: _jock.preferredService || 'oral',
location: 'locker_room',
locationName: 'Locker Room',
locationDesc: 'the gym locker room, steamy and echoing',
locationPrivacy: 'medium',
createdAt: $world.time,
createdDay: $world.day,
dc: XCLC.Service.getServiceDC(_jock, _jock.preferredService || 'oral'),
credits: (_jock.preferredService === 'anal') ? 2 : 1,
bonusCredits: 0
}>>
<<set $temp.serviceNPC = _jock>>
<<set $scholarship.inService = true>>
<</link>>
<<link '<span class="choice-btn">❌ No thanks, I\'m just here to work out</span>' "Gym">>
<<run XCLC.Toast.show('He looks disappointed but shrugs. "Your loss."', 'info')>>
<</link>>
</div><h2>🚿 Locker Room</h2>
<p>The women's locker room — rows of blue metal lockers, wooden benches, and a tiled shower area in the back. Steam drifts from the showers.</p>
<<if $hygiene.cleanliness < 60>>
<p>You definitely need a shower. You can smell yourself.</p>
<</if>>
/* Roll for locker event */
<<set _lockerEvent = XCLC.Gym.rollEvent('locker')>>
<<if _lockerEvent>>
<<set $temp.gymEvent = _lockerEvent>>
<<include "GymEventDispatch">>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Take a shower (15 min)</span>' "GymShower">><</link>>
<<link '<span class="choice-btn">💪 Back to gym</span>' "Gym">><</link>>
<<link '<span class="choice-btn">🗺️ Leave</span>' "CampusMap">><</link>>
</div>
<</if>><h2>🚿 Shower</h2>
<p>You strip down and step into a stall. The hot water hits your skin and you sigh — the tension in your muscles melting away.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 2>>
<p>The water pressure on your hypersensitive skin is almost obscene. Every droplet is a tiny spark. The spray hitting your breasts, your stomach, between your legs — you have to brace yourself against the tile and breathe.</p>
<<modStat "arousal" 10 "Sensitive shower">>
<</if>>
<<if $transformation.sideEffects.lactation >= 2>>
<p>The warm water triggers your milk. White streams run down your <<print $pc.breastSize>>-cup breasts and spiral down the drain. At least nobody can see in here.</p>
<</if>>
<<advanceTime 15>>
<<modHygiene 30 "Gym shower">>
<p>You towel off, feeling clean and refreshed.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💪 Back to gym</span>' "Gym">><</link>>
<<link '<span class="choice-btn">🗺️ Leave</span>' "CampusMap">><</link>>
</div><p>You're halfway through changing — bra unclasped, jeans around your ankles — when the locker room door swings open. A guy walks in.</p>
<p>"Oh! Sorry, wrong— " He stops. He's not leaving. His eyes go from your face to your bare <<print $pc.breastSize>>-cup breasts to your underwear.</p>
<<set _composureCheck = XCLC.Roll.doCheck("composure", 3)>>
<<if _composureCheck.outcome === "crit_success" || _composureCheck.outcome === "success">>
<p>You grab your towel and cover up in one smooth motion. "Wrong room," you say flatly. "Out." He retreats, muttering apologies.</p>
<<modStat "confidence" 3 "Handled it calmly">>
<<else>>
<p>You freeze. Arms at your sides, exposed, unable to move or speak. He stares for a full three seconds before someone behind him yanks him back. "Dude, that's the women's!" The door slams shut.</p>
<p>Your heart hammers. You sink onto the bench, covering yourself with shaking hands.</p>
<<modStat "confidence" -5 "Seen naked by a stranger">>
<<modStat "stress" 5 "Locker room intrusion">>
<<if $transformation.sideEffects.exhibitionist >= 2>>
<p>The shame is there — but underneath it, a treacherous pulse of arousal. He saw you. He liked what he saw. And some sick part of you liked being seen.</p>
<<modStat "arousal" 10 "Exhibitionist thrill">>
<</if>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Take a shower to calm down</span>' "GymShower">><</link>>
<<link '<span class="choice-btn">🗺️ Get dressed and leave</span>' "CampusMap">><</link>>
</div><p>You're in the shower, eyes closed, water cascading over you, when you hear the stall curtain slide back. Your eyes fly open.</p>
<<set _npc = XCLC.NPC.generate('student')>>
<p>A <<print _npc.bodyType>> <<if _npc.gender === "male">>guy<<else>>girl<</if>> with <<print _npc.hairColour>> hair is standing there, naked, acting like this is completely normal.</p>
<<if _npc.gender === "male">>
<p>"Room for two?" <<print _npc.firstName>> asks, already stepping in. He's <<if _npc.cockSize === "large" || _npc.cockSize === "huge">>hard to miss<<else>>not shy about it<</if>>.</p>
<<else>>
<p>"Mind sharing?" <<print _npc.firstName>> says, sliding in beside you. "The other stalls are taken." They're clearly not, but she doesn't seem to care.</p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🚫 Get out. Now.</span>' "GymShower">>
<<modStat "confidence" 3 "Stood your ground">>
<</link>>
<<link '<span class="choice-btn">😶 ...Fine.</span>' "GymShower">>
<<modStat "femininity" 2 "Accepting intimacy">>
<<modStat "arousal" 15 "Shared shower">>
<<if $transformation.sideEffects.submissive >= 2>>
<<modStat "arousal" 10 "Submissive compliance">>
<</if>>
<</link>>
</div>/* Player picks 5 classes from 8. Rendered via JS for toggle cards. */
<h2>📚 Class Registration</h2>
<p>Before orientation ends, you need to register for your first semester classes. You'll take <strong>5 classes</strong> — 3 on Monday/Wednesday/Friday and 2 on Tuesday/Thursday.</p>
<p>Choose from the available courses:</p>
<div id="class-picker"></div>
<div id="class-confirm" style="margin-top:1em;"></div>
<<run setTimeout(function(){
var pool = XCLC.Academic.CLASS_POOL;
var selected = [];
var picker = jQuery('#class-picker');
var html = '<div class="cc-grid" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.5em;">';
for (var i = 0; i < pool.length; i++) {
html += '<div class="cc-option class-pick" data-idx="' + i + '" style="cursor:pointer;padding:0.8em;border-radius:8px;border:2px solid var(--surface-2);background:var(--surface-1);transition:all 0.2s;">' +
'<div style="font-size:1.3em;">' + pool[i].icon + '</div>' +
'<div style="font-weight:600;">' + pool[i].name + '</div>' +
'<div style="font-size:0.8em;opacity:0.7;">' + pool[i].department + ' Department</div>' +
'</div>';
}
html += '</div>';
picker.html(html);
picker.find('.class-pick').on('click', function(){
var idx = parseInt(jQuery(this).data('idx'));
var pos = selected.indexOf(idx);
if (pos >= 0) {
selected.splice(pos, 1);
jQuery(this).css({'border-color':'var(--surface-2)', 'background':'var(--surface-1)'});
} else if (selected.length < 5) {
selected.push(idx);
jQuery(this).css({'border-color':'var(--accent)', 'background':'rgba(139,92,246,0.15)'});
}
/* Update confirm button */
var confirmEl = jQuery('#class-confirm');
if (selected.length === 5) {
confirmEl.html('<span class="choice-btn" id="confirm-classes" style="cursor:pointer;">✅ Confirm ' + selected.length + '/5 classes</span>');
jQuery('#confirm-classes').off('click').on('click', function(){
XCLC.Academic.buildSchedule(selected);
Engine.play('ClassSelection_Confirm');
});
} else {
confirmEl.html('<p style="opacity:0.6;">Selected: ' + selected.length + '/5</p>');
}
});
}, 50)>><h2>📚 Schedule Confirmed</h2>
<p>Your first semester schedule:</p>
<div class="card">
<div class="card__title">📋 Your Classes</div>
<<for _i = 0; _i < $academic.classes.length; _i++>>
<<set _cls = $academic.classes[_i]>>
<<set _prof = $academic.professors[_cls.professorIndex]>>
<p><<print _cls.icon>> <strong><<print _cls.name>></strong> — <<print _cls.days>> <<print _cls.timeLabel>><br>
<em>Prof. <<print _prof.lastName>> (<<print _prof.profType>>)</em></p>
<</for>>
</div>
<p>Classes start tomorrow. Don't be late.</p>
<div class="choice-group">
<<link '<span class="choice-btn">📱 Got it. Let\'s go.</span>' "CampusMap">>
<<set $world.time = 600>>
<</link>>
</div><h2>📚 Lecture Halls</h2>
<<if !$academic.classesChosen>>
<p>You haven't registered for classes yet. That happens during orientation.</p>
<<link '<span class="choice-btn">← Back to campus</span>' "CampusMap">><</link>>
<<else>>
<<set _today = XCLC.Academic.getScheduleForDay()>>
<<set _dayNames = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']>>
<<set _dayName = _dayNames[$world.dayOfWeek] || 'Weekend'>>
<<if $world.dayOfWeek >= 6>>
<p>It's <<print _dayName>>. No classes today.</p>
<<link '<span class="choice-btn">← Back to campus</span>' "CampusMap">><</link>>
<<else>>
<p><<print _dayName>>'s schedule:</p>
<div class="card">
<div class="card__title">📋 Today's Classes</div>
<<for _i = 0; _i < _today.length; _i++>>
<<set _cls = _today[_i]>>
<<set _prof = $academic.professors[_cls.professorIndex]>>
<<set _isNow = ($world.time >= _cls.startTime && $world.time < _cls.endTime)>>
<<set _isPast = ($world.time >= _cls.endTime)>>
<p><<if _isNow>>🟢<<elseif _isPast>>✅<<else>>⬜<</if>> <<print _cls.icon>> <strong><<print _cls.name>></strong> — <<print _cls.timeLabel>><br>
<em>Prof. <<print _prof.lastName>></em> | Grade: <<print Math.round(_cls.grade)>>%</p>
<</for>>
</div>
<<set _current = XCLC.Academic.getCurrentClass()>>
<<if _current>>
<<set _currentCls = _current.classObj>>
<<set _currentProf = $academic.professors[_currentCls.professorIndex]>>
<div class="alert alert--info">🔔 <<print _currentCls.name>> with Prof. <<print _currentProf.lastName>> is in session right now!</div>
<div class="choice-group">
<<link '<span class="choice-btn">📖 Attend class</span>' "AttendClass">>
<<set $temp.classIndex = _current.index>>
<<set $temp.classEvent = XCLC.Academic.attendClass(_current.index)>>
<<advanceTime 60>>
<<addXP "intelligence" 10>>
<<modStat "energy" -5 "Lecture">>
<</link>>
<<link '<span class="choice-btn">🚫 Skip it</span>' "CampusMap">>
<<run XCLC.Academic.skipClass(_current.index)>>
<<run XCLC.Toast.show('📚 Skipped ' + _currentCls.name + '. Grade will suffer.', 'warning')>>
<</link>>
</div>
<<else>>
<p>No class in session right now.<<set _next = null>><<for _j = 0; _j < _today.length; _j++>><<if !_next && _today[_j].startTime > $world.time>><<set _next = _today[_j]>><</if>><</for>><<if _next>> Next up: <<print _next.name>> at <<print _next.timeLabel>>.<</if>></p>
<</if>>
<<set _gpa = XCLC.Academic.getGPA()>>
<p><strong>GPA:</strong> <<print _gpa>> / 4.0 <<if _gpa < 2.0>><span style="color:var(--danger);">⚠️ ACADEMIC PROBATION</span><</if>></p>
<<link '<span class="choice-btn">← Back to campus</span>' "CampusMap">><</link>>
<</if>>
<</if>><<set _evt = $temp.classEvent>>
<<set _cls = _evt.cls>>
<<set _prof = _evt.prof>>
<h2><<print _cls.icon>> <<print _cls.name>></h2>
<p>You take your seat in the lecture hall. Prof. <<print _prof.lastName>> is already at the podium.</p>
<<if _evt.type === "normal">>
<p>The lecture proceeds normally. <<print _prof.firstName>> <<print _prof.lastName>> covers new material. You take notes, follow along, and actually learn something.</p>
<<if $transformation.sideEffects.bimbofication >= 1>>
<p>Some of the concepts are harder to grasp than they should be. But you manage.</p>
<</if>>
<<modStat "mood" 2 "Productive class">>
<<elseif _evt.type === "bimbo">>
<p>Prof. <<print _prof.lastName>> is explaining something about... something. You stare at the whiteboard. The words swim. You write a note but when you look down it's just doodles of hearts.</p>
<p>The girl next to you gives you a look. Was that pity?</p>
<<modStat "confidence" -3 "Can't follow lecture">>
<<modStat "mood" -5 "Feeling stupid">>
<<elseif _evt.type === "orgasm">>
<p>It hits you mid-lecture. That telltale warmth blooming between your legs, spreading upward. No. Not here. NOT HERE.</p>
<p>You grip the edge of your desk, knuckles white. Your thighs clench. A small sound escapes your lips — you cover it with a cough.</p>
<<if random(1,100) <= 40>>
<p>The student next to you glances over. "You okay?" You nod frantically, face burning, as the orgasm rolls through you in waves. You bite your lip so hard it almost bleeds.</p>
<<modStat "confidence" -5 "Public orgasm in class">>
<<modRep "slut" 2 "Suspicious behaviour in class">>
<<else>>
<p>Somehow, miraculously, you manage to ride it out without anyone noticing. Your notes for the last five minutes are just a scribbled line across the page.</p>
<</if>>
<<modStat "arousal" -20 "Involuntary orgasm">>
<<elseif _evt.type === "sensitivity">>
<p>The wooden lecture seat is torture. Every shift sends sensation rippling through you. The seam of your jeans pressing between your legs. Your bra against your nipples. It's all TOO MUCH.</p>
<p>You spend the entire lecture trying not to squirm. You absorb approximately nothing.</p>
<<modStat "arousal" 15 "Sensitivity in class">>
<<modStat "stress" 5 "Uncomfortable">>
<<elseif _evt.type === "lactation">>
<p>Halfway through the lecture, you feel it — warm wetness spreading across your chest. Your milk is letting down. Two dark circles are forming on your top.</p>
<<if _prof.awarenessOfCCUMDUP>>
<p>Prof. <<print _prof.lastName>> glances at you and quickly looks away. <<if _prof.profType === "sympathetic">>After class, they quietly say: "There are spare shirts in the health centre, if you need."<<elseif _prof.profType === "creepy">>You catch <<print _prof.firstName>> staring at your chest with an expression that makes your skin crawl.<</if>></p>
<<else>>
<p>You cross your arms and try to hide it. The guy in front of you turns around and stares. Great.</p>
<</if>>
<<modStat "confidence" -5 "Leaking in class">>
<<elseif _evt.type === "daydream">>
<p>Prof. <<print _prof.lastName>>'s voice fades into background noise. Your mind drifts to... warm hands on your skin. A mouth at your neck. Someone behind you, pressing close—</p>
<p>"<<print $pc.femaleFirstName>>?"</p>
<p>You jolt awake. The entire class is looking at you. You have no idea what the question was.</p>
<<modStat "arousal" 10 "Sexual daydream">>
<<modStat "confidence" -3 "Caught daydreaming">>
<<elseif _evt.type === "pheromones">>
<p>The guy sitting next to you keeps inching closer. His friend on the other side is doing the same thing. Within twenty minutes you're surrounded by a semicircle of guys who all found reasons to sit near you.</p>
<p>Prof. <<print _prof.lastName>> has to ask them to spread out. Twice.</p>
<<modStat "femininity" 2 "Centre of attention">>
<<modStat "arousal" 5 "Pheromone attention">>
<<elseif _evt.type === "calledOn">>
<p>"<<print $pc.femaleFirstName>>? Can you tell the class...?"</p>
<p>Prof. <<print _prof.lastName>> is looking right at you. Everyone turns to stare.</p>
<<if $pc.intelligence >= 60>>
<p>You actually know this one. The answer comes out smoothly. <<print _prof.firstName>> nods, impressed.</p>
<<modStat "confidence" 5 "Good answer">>
<<if _prof.profType === "demanding">><<modStat "mood" 3 "Impressed the tough prof">><</if>>
<<elseif $pc.intelligence >= 35>>
<p>You stumble through a half-answer. It's not great. It's not terrible. Prof. <<print _prof.lastName>> moves on.</p>
<<else>>
<p>"I... um..." The silence stretches. Someone coughs. <<print _prof.firstName>> <<print _prof.lastName>> sighs and calls on someone else. You sink into your seat.</p>
<<modStat "confidence" -5 "Couldn't answer">>
<<modStat "stress" 5 "Public embarrassment">>
<</if>>
<</if>>
<p>The lecture ends. Students pack up and file out.</p>
<div class="choice-group">
<<link '<span class="choice-btn">← Back to lecture halls</span>' "LectureHalls">><</link>>
<<link '<span class="choice-btn">🗺️ Head to campus</span>' "CampusMap">><</link>>
</div>/* Player travels to the location and meets the NPC */
<<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<h2>📍 <<print _req.locationName>></h2>
<p>You make your way to <<print _req.locationDesc>>. Your CampusHub app pulses with the active request.</p>
<p><<print XCLC.Service.describeNPC(_npc)>></p>
<<if _npc.personality === "shy">>
<p>"H-hi. You're <<print $pc.femaleFirstName>>, right? From the programme?" He shuffles his feet. "I've, um, never done this before."</p>
<<elseif _npc.personality === "aggressive">>
<p>He doesn't bother with introductions. "You the girl from CampusHub? Good. Let's not waste time."</p>
<<elseif _npc.personality === "romantic">>
<p>"<<print $pc.femaleFirstName>>? You're even prettier in person." He actually smiles — warmly, not predatorily. "I'm <<print _npc.firstName>>. Can I get you anything first?"</p>
<<elseif _npc.personality === "friendly">>
<p>"Hey! You must be <<print $pc.femaleFirstName>>. I'm <<print _npc.firstName>>." He extends a hand. It's almost... normal? Like meeting someone for coffee, except for the reason you're here.</p>
<<elseif _npc.personality === "demanding">>
<p>"<<print $pc.femaleFirstName>>. <<print _npc.firstName>>." He checks his watch. "I have a class in ninety minutes, so let's be efficient about this."</p>
<<elseif _npc.personality === "creepy">>
<p>He's been watching you approach. There's a phone in his hand — was he filming? "<<print $pc.femaleFirstName>>. I've seen your profile. You're <<print $pc.breastSize>>-cup, right? Perfect."</p>
<<elseif _npc.personality === "sweet">>
<p>"Hi — <<print _npc.firstName>>." He looks almost apologetic. "Is this okay? The location, I mean. We can go somewhere else if you'd prefer."</p>
<<else>>
<p>"<<print _npc.firstName>>." He nods. You get the sense this isn't his first time using the programme.</p>
<</if>>
<<if $transformation.sideEffects.pheromones >= 2>>
<p>You notice his nostrils flare slightly. Your pheromones are doing their thing — his pupils dilate and he takes a half-step closer.</p>
<</if>>
<p>He wants: <strong><<print _req.serviceType.charAt(0).toUpperCase()>><<print _req.serviceType.slice(1)>></strong></p>
<div class="choice-group">
<<link '<span class="choice-btn">🔥 Let\'s do this.</span>' "ServiceForeplay">><</link>>
<<link '<span class="choice-btn">🏃 Actually, I can\'t do this. (Flee: -0.3 rating)</span>' "CampusMap">>
<<run XCLC.Service.fleeEncounter()>>
<</link>>
</div><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _se = $transformation.sideEffects>>
<h2><<print _req.serviceType.charAt(0).toUpperCase()>><<print _req.serviceType.slice(1)>> — Foreplay</h2>
<<if _npc.personality === "aggressive" || _npc.personality === "demanding">>
<p>There's no buildup. <<print _npc.firstName>> pushes you against the wall, one hand on your hip, the other tilting your chin up. His mouth is on your neck before you can think.</p>
<p>"I didn't come here for romance," he breathes against your skin. His grip tightens.</p>
<<elseif _npc.personality === "romantic">>
<p><<print _npc.firstName>> cups your face with both hands and kisses you — slowly, deliberately. It's so gentle it catches you off guard. His thumb traces your cheekbone.</p>
<p>"Relax," he murmurs. "We've got time."</p>
<<modStat "mood" 3 "Gentle foreplay">>
<<elseif _npc.personality === "shy">>
<p><<print _npc.firstName>> reaches for you and misses, grabbing air. He goes red. "Sorry. I just — can I...?" He gestures vaguely at your body. You take his hand and place it on your waist. He lets out a shaky breath.</p>
<<elseif _npc.personality === "sweet">>
<p>"Can I kiss you?" <<print _npc.firstName>> asks. You nod. It's soft, careful. His hands stay on your waist, not wandering without permission. You feel something you don't want to name.</p>
<<modStat "mood" 2 "Sweet foreplay">>
<<elseif _npc.personality === "creepy">>
<p><<print _npc.firstName>> leans in and runs his tongue along your earlobe without asking. His hand goes straight between your legs. "Just checking," he says. You suppress a gag reflex that has nothing to do with what's coming next.</p>
<<modStat "stress" 5 "Creepy foreplay">>
<<else>>
<p><<print _npc.firstName>> pulls you close. It's perfunctory — a few kisses, hands on your hips, getting you warmed up. Business, not pleasure.</p>
<</if>>
/* Wet addon check */
<<if $transformation.addons.wet>>
<p>Your body is already responding. The Wet add-on means you're practically dripping before anything's even started. <<print _npc.firstName>> notices. <<if _npc.personality === "cocky">>"Damn, you're ready to go." He grins.<<elseif _npc.personality === "shy">>His eyes go wide. "Oh. Wow. Okay."<<else>>"Good," he says simply.<</if>></p>
<<modStat "arousal" 15 "Wet addon">>
<<else>>
<<modStat "arousal" 10 "Foreplay">>
<</if>>
/* Sensitivity SE */
<<if _se.increasedSensitivity >= 2>>
<p>Every touch sends electricity through your skin. Your hypersensitivity means even his fingertips trailing along your arm makes you shiver and gasp. This is going to be intense.</p>
<<modStat "arousal" 10 "Sensitivity">>
<</if>>
/* Pheromones SE */
<<if _se.pheromones >= 2>>
<p><<print _npc.firstName>> is breathing harder, pupils blown. Your pheromones are making him almost desperate. "God, you smell amazing," he mutters, pressing his face into your neck.</p>
<</if>>
/* Now determine positions */
<<set $temp.positionData = XCLC.Service.getPositions(_npc, _req.serviceType)>>
<<if $temp.positionData.playerChooses>>
<<goto "ServicePositionSelect">>
<<else>>
<<set $temp.chosenPosition = $temp.positionData.forcedPosition>>
<p><<if _npc.personality === "aggressive">>He doesn't give you a choice. <<print $temp.chosenPosition.name>>. <<print $temp.chosenPosition.desc>>.<<elseif _npc.personality === "demanding">>He positions you exactly how he wants. <<print $temp.chosenPosition.name>>. <<print $temp.chosenPosition.desc>>.<<else>>"Let's do <<print $temp.chosenPosition.name.toLowerCase()>>," he says, already moving you into position.<</if>></p>
<<goto "ServiceMainAct">>
<</if>><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _positions = $temp.positionData.positions>>
<h2>Choose Position</h2>
<<if _npc.personality === "shy">>
<p>"Whatever you want," <<print _npc.firstName>> says quietly. "You're the expert."</p>
<<elseif _npc.personality === "friendly">>
<p>"What works for you?" <<print _npc.firstName>> asks.</p>
<<else>>
<p><<print _npc.firstName>> lets you take the lead.</p>
<</if>>
<div class="choice-group">
<<for _i = 0; _i < _positions.length; _i++>>
<<set _pos = _positions[_i]>>
<<capture _pos>>
<<link '<span class="choice-btn"><<print _pos.name>> — <<print _pos.desc>></span>' "ServiceMainAct">>
<<set $temp.chosenPosition = _pos>>
<</link>>
<</capture>>
<</for>>
</div><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _pos = $temp.chosenPosition>>
<<set _se = $transformation.sideEffects>>
/* Calculate final DC: base + position modifier */
<<set _dc = _req.dc + (_pos.dc || 0)>>
/* ─── Add-on DC Modifiers ─── */
/* No Gag Reflex: -2 DC on oral */
<<if $transformation.addons.gagReflex && _req.serviceType === "oral">>
<<set _dc = Math.max(1, _dc - 2)>>
<</if>>
/* Stretchy: -1 DC with large/huge partners */
<<if $transformation.addons.stretchy && (_npc.cockSize === "large" || _npc.cockSize === "huge")>>
<<set _dc = Math.max(1, _dc - 1)>>
<</if>>
/* ─── Side Effect DC Modifiers ─── */
/* Oral Lover: -1 DC on oral per level (max -2) */
<<if _se.oralLover > 0 && _req.serviceType === "oral">>
<<set _dc = Math.max(1, _dc - Math.min(2, _se.oralLover))>>
<</if>>
/* Anal Lover: -1 DC on anal per level (max -2) */
<<if _se.analLover > 0 && _req.serviceType === "anal">>
<<set _dc = Math.max(1, _dc - Math.min(2, _se.analLover))>>
<</if>>
/* Submissive: +willingness but no DC change (handled in processEffects) */
/* Exhibitionist: arousal bonus if location is public */
<<if _se.exhibitionist >= 2 && _req.isPublic>>
<<modStat "arousal" 10 "Exhibitionist thrill">>
<</if>>
/* Perform the skill check */
<<set _skill = _req.serviceType>>
<<if _skill === "mixed">><<set _skill = "oral">><</if>>
<<set _result = XCLC.Roll.doCheck(_skill, _dc)>>
<<set $temp.serviceOutcome = _result>>
<<set $temp.serviceRoll = $lastRoll>>
/* Show the roll modal */
<<run XCLC.DicePopup.showService()>>
<h2><<print _pos.name>></h2>
/* ═══ ORAL ═══ */
<<if _req.serviceType === "oral">>
<<if _npc.gender === "male">>
<<set _sizeWord = {small: 'manageable', below_avg: 'modest', average: 'average', above_avg: 'big', large: 'thick', huge: 'enormous'}>>
<<set _sw = _sizeWord[_npc.cockSize] || 'average'>>
<<if _result === "crit_success">>
<p>You sink to your knees on the cold floor. <<print _npc.firstName>> is <<print _sw>> — <<if _npc.cockSize === "huge">>intimidating, but you open wide and take him in. Your jaw aches instantly but you don't care.<<elseif _npc.cockSize === "small">>easy to take. You work the full length without effort.<<else>>a comfortable mouthful.<</if>></p>
<p><<if _pos.id === "deepthroat">>You relax your throat and take him to the base. His hands clutch at your <<print $pc.hairColour>> hair as you swallow around him. "Holy fuck," he whispers.<<elseif _pos.id === "facefuck">>He grabs fistfuls of your <<print $pc.hairColour>> hair and thrusts. You breathe through your nose, taking it, eyes watering but never gagging. He looks down at you with something like awe.<<else>>Your tongue works the underside, your hand covers what your mouth can't reach. You look up at him through your lashes with your <<print $pc.eyeColour>> eyes. He moans.<</if>></p>
<p>You're good at this. Better than you should be. The thought is disturbing and thrilling in equal measure.</p>
<<modStat "confidence" 5 "Amazing performance">>
<<elseif _result === "success">>
<p>You kneel and take him in your mouth. He's <<print _sw>> — <<if _npc.cockSize === "large" || _npc.cockSize === "huge">>a stretch, your jaw already aching, but you manage.<<else>>manageable.<</if>></p>
<p><<if _pos.id === "deepthroat">>You work your way deeper, gagging once before finding the right angle. It's not elegant but it works. <<print _npc.firstName>> groans appreciation.<<elseif _pos.id === "facefuck">>He grips your <<print $pc.hairColour>> hair and thrusts. You try to keep up, eyes streaming. It's brutal but you hang on.<<else>>Your head bobs steadily. You find a rhythm — tongue, lips, hand. <<print _npc.firstName>> leans back and lets you work.<</if>></p>
<<elseif _result === "partial_fail">>
<p>You kneel and wrap your lips around him. He's <<print _sw>>. <<if _npc.cockSize === "large" || _npc.cockSize === "huge">>TOO big. You gag immediately, pulling back with strings of saliva.<<else>>You try to find a rhythm but your jaw cramps and your technique is off.<</if>></p>
<p><<if _pos.id === "deepthroat">>You try to go deep but your gag reflex kicks in hard. You pull off coughing. <<print _npc.firstName>> sighs.<<elseif _pos.id === "facefuck">>He pushes too deep and you choke. He pulls back but the mood is broken. "Sorry," you gasp.<<else>>Your hand keeps slipping. Your mouth is dry then too wet. It's messy and awkward.<</if>></p>
<<modStat "confidence" -3 "Sloppy performance">>
<<else>>
<p>You kneel. He's <<print _sw>>. The first attempt goes badly — your teeth scrape him and he hisses. "Watch it!"</p>
<p><<if _pos.id === "deepthroat">>You try to go deep, gag violently, and have to pull off completely. Your eyes are streaming, mascara running. <<print _npc.firstName>> looks annoyed.<<elseif _pos.id === "facefuck">>He grabs your head and you panic, shoving him away. He stumbles. "What the fuck?"<<else>>Nothing works. Your jaw locks, your technique is nonexistent. This is humiliating.<</if>></p>
<<modStat "confidence" -8 "Terrible performance">>
<<modStat "stress" 10 "Humiliation">>
<</if>>
<<else>>
/* Female NPC oral */
<<if _result === "crit_success">>
<p>You bury your face between her thighs. She tastes clean, her <<print _npc.skinTone>> skin soft against your cheeks. Your tongue finds her clit and she gasps, fisting the sheets.</p>
<p>"Don't stop — right there —" Her <<print _npc.bodyType>> body arches. You don't stop.</p>
<<modStat "confidence" 5 "Amazing performance">>
<<elseif _result === "success">>
<p>You settle between her legs. It takes a moment to find what works but her sounds guide you — soft moans when you're close, frustrated huffs when you drift off target. Her <<print _npc.breastSize>>-cup chest heaves.</p>
<<elseif _result === "partial_fail">>
<p>This is harder than it looks. You're not sure where to focus and she keeps shifting. "Higher — no, left — no—" It's awkward.</p>
<<modStat "confidence" -3 "Uncertain performance">>
<<else>>
<p>You have no idea what you're doing. She's patient for about thirty seconds before pushing your head away. "Never mind," she says flatly.</p>
<<modStat "confidence" -8 "Terrible performance">>
<</if>>
<</if>>
/* ═══ VAGINAL ═══ */
<<elseif _req.serviceType === "vaginal">>
<<set _sizeWord = {small: 'easily', below_avg: 'smoothly', average: 'with a stretch', above_avg: 'with a groan', large: 'with difficulty', huge: 'painfully'}>>
<<set _sw = _sizeWord[_npc.cockSize] || 'with a stretch'>>
<<if _result === "crit_success">>
<p><<if _pos.id === "missionary">><<print _npc.firstName>> pushes inside you <<print _sw>>. You feel every inch. Your back arches off the surface, your <<print $pc.breastSize>>-cup breasts pressing against his <<print _npc.bodyType>> chest. Your <<print $pc.hairColour>> hair fans out beneath you.<<elseif _pos.id === "doggy">>You brace yourself on all fours. He enters you from behind <<print _sw>> and your arms nearly give out. The angle is perfect — he's hitting spots you didn't know you had.<<elseif _pos.id === "cowgirl">>You lower yourself onto him <<print _sw>>, controlling the depth. Your <<print $pc.bodyType>> body rolls in a rhythm that makes him grip the sheets. You look down at his face — he's gone.<<else>>He pins you down and enters hard. <<print _sw>>. No warmup, no warning. Your cry echoes in <<print _req.locationDesc>>.<</if>></p>
<p>Your body responds in ways that should terrify you. The pleasure builds, overwhelming, undeniable. This feels good. It feels really good. You hate that it feels good.</p>
<<modStat "arousal" 30 "Amazing sex">>
<<modStat "confidence" 5 "Great performance">>
<<elseif _result === "success">>
<p><<if _pos.id === "missionary">>He pushes inside <<print _sw>>. It's not comfortable at first — the stretch, the fullness — but your body adjusts. His weight on you, his <<print _npc.hairColour>> hair brushing your forehead.<<elseif _pos.id === "doggy">>On all fours, he enters from behind. <<print _sw>>. The angle is deep. Your <<print $pc.breastSize>>-cups sway with each thrust.<<elseif _pos.id === "cowgirl">>You sink down on him <<print _sw>>. It takes a moment to find a rhythm, but once you do, his hands find your hips and hold on.<<else>>Hard and fast. <<print _sw>>. You grip whatever's nearest and hold on.<</if>></p>
<p>It's... not terrible. Your body is responding whether you want it to or not.</p>
<<modStat "arousal" 20 "Sex">>
<<elseif _result === "partial_fail">>
<p><<if _pos.id === "missionary">>He pushes in <<print _sw>> and you wince. You try to angle your hips but nothing feels right.<<elseif _pos.id === "doggy">>On all fours, he enters and immediately goes too hard. You cry out — not in pleasure. "Slow down!"<<elseif _pos.id === "cowgirl">>You try to ride him but your thighs burn after thirty seconds. The rhythm is off. He looks underwhelmed.<<else>>It's rough without being good-rough. Just painful. You grit your teeth.<</if>></p>
<<modStat "arousal" 10 "Mediocre sex">>
<<modStat "confidence" -3 "Clumsy performance">>
<<else>>
<p><<if _pos.id === "missionary">>He tries to push inside and you tense up. It takes three attempts. When he finally enters, you're too tense for either of you to enjoy it.<<else>>Nothing works. The angle is wrong, you're too dry<<if !$transformation.addons.wet>>, your body isn't cooperating<<else>> despite the Wet add-on<</if>>. <<print _npc.firstName>> is visibly frustrated.<</if>></p>
<<modStat "confidence" -8 "Terrible sex">>
<<modStat "stress" 10 "Humiliation">>
<</if>>
/* ═══ ANAL ═══ */
<<elseif _req.serviceType === "anal">>
<<set _sizeWord = {small: 'with discomfort', below_avg: 'with a sharp intake of breath', average: 'with a moan you can\'t suppress', above_avg: 'with a cry', large: 'with a scream', huge: 'it takes three tries and you see stars'}>>
<<set _sw = _sizeWord[_npc.cockSize] || 'with a gasp'>>
<<if _result === "crit_success">>
<p><<if _pos.id === "anal_doggy">>On all fours, you breathe deep as he presses against you. He enters <<print _sw>>. You expected pain — and there is some — but the pleasure that follows is shocking. Your <<print $pc.bodyType>> body shudders.<<elseif _pos.id === "prone_bone">>Face down, you bite the pillow. He enters <<print _sw>>. The fullness is overwhelming. Your <<print $pc.breastSize>>-cup breasts are crushed against the surface. Every thrust sends sparks through you.<<elseif _pos.id === "reverse_cowgirl">>You lower yourself onto him backwards <<print _sw>>. The control is yours — you set the pace, the depth. He watches your <<print $pc.buttSize>> ass with glazed eyes.<<else>>Pressed against the wall, he lifts one of your legs and pushes in <<print _sw>>. The position is precarious but the angle is deep.<</if>></p>
<p>You'd never have imagined this could feel good. But it does. It really, undeniably does.</p>
<<modStat "arousal" 25 "Amazing anal">>
<<modStat "confidence" 5 "Great performance">>
<<elseif _result === "success">>
<p>He enters <<print _sw>>. It's intense — the stretch, the burn — but you manage. <<if _pos.id === "prone_bone">>Face down, you breathe through it.<<elseif _pos.id === "reverse_cowgirl">>You control the pace, going slow.<<else>>Your hands grip whatever's nearest.<</if>></p>
<p>It gets easier after the first minute. Not exactly pleasurable, but not the nightmare you feared.</p>
<<modStat "arousal" 15 "Anal">>
<<elseif _result === "partial_fail">>
<p>He enters <<print _sw>>. You cry out — too loud, too sharp. He pauses. "You okay?" <<if _npc.personality === "sweet">>He actually looks concerned.<<else>>He doesn't wait for an answer before continuing.<</if>></p>
<p>Every thrust is a negotiation between pain and tolerance. Your body never fully adjusts.</p>
<<modStat "stress" 8 "Painful anal">>
<<modStat "confidence" -3 "Difficult performance">>
<<else>>
<p>He tries to enter and you tense up completely. "Relax," he says. You can't. <<if _npc.cockSize === "large" || _npc.cockSize === "huge">>He's too big — there's no way.<<else>>Your body won't cooperate.<</if>></p>
<p>After several painful attempts, he manages to push inside, but it's a disaster. You're white-knuckling through every second.</p>
<<modStat "stress" 15 "Terrible anal">>
<<modStat "confidence" -8 "Humiliating failure">>
<</if>>
<</if>>
/* ═══ MID-ACT SE TRIGGERS ═══ */
<<if _se.randomOrgasm >= 1 && random(1,100) <= _se.randomOrgasm * 8>>
<p>It hits you without warning — an orgasm crashing through you mid-act. Your whole body clenches, your back arches, a moan tears out of you that you can't suppress. <<print _npc.firstName>> <<if _npc.personality === "cocky">>"That good, huh?" He grins.<<elseif _npc.personality === "shy">>freezes. "Did you just...?"<<else>>doesn't stop.<</if>></p>
<<modStat "arousal" -20 "Mid-act orgasm">>
<</if>>
<<if _se.lactation >= 2 && random(1,100) <= 30>>
<p>Your breasts are leaking. Milk beads on your <<print $pc.breastSize>>-cup nipples and runs down your chest. <<print _npc.firstName>> <<if _npc.personality === "creepy">>stares, then squeezes one. Milk sprays. He grins. "Kinky."<<elseif _npc.personality === "sweet">>looks alarmed. "Is that — are you okay?"<<else>>notices but doesn't comment.<</if>></p>
<</if>>
<<if _se.increasedSensitivity >= 3>>
<p>Your hypersensitivity makes every sensation ten times more intense. The friction, the pressure, the heat of his body against yours — it's almost too much to bear. You're trembling, overstimuated, barely holding it together.</p>
<<modStat "arousal" 15 "Hypersensitivity">>
<</if>>
<<goto "ServiceClimax">><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _outcome = $temp.serviceOutcome>>
<<set _se = $transformation.sideEffects>>
<h2>Climax</h2>
<<if _npc.gender === "male">>
/* Internal or external? */
<<set _internal = false>>
<<if $transformation.addons.birthControl>>
<<set _internal = (random(1,100) <= 60)>>
<<else>>
<<set _internal = (random(1,100) <= 30)>>
<</if>>
<<if _npc.personality === "aggressive" || _npc.personality === "demanding">>
<<set _internal = true>>
<</if>>
<<if _internal>>
<p><<print _npc.firstName>> grips your hips and drives deep one final time. You feel him pulse inside you — hot, filling, unmistakable. He groans against your <<print $pc.hairColour>> hair.</p>
<p>"Fuck," he breathes. He doesn't pull out for a long moment.</p>
<<if !$transformation.addons.birthControl>>
<p><em>He came inside you. The thought lands like a stone. You're not on birth control.</em></p>
/* Pregnancy risk check - simplified for now */
<<set _pregRisk = 15>>
<<if random(1,100) <= _pregRisk>>
<<set $pregnancy.riskFlag = true>>
<<set $pregnancy.riskDay = $world.day>>
<</if>>
<</if>>
<<set _req.bonusCredits = 1>>
<<else>>
<p><<print _npc.firstName>> pulls out at the last second, finishing on your <<if random(1,2) === 1>>stomach<<else>>thighs<</if>>. <<if _outcome === "crit_success">>"God damn," he says reverently.<<elseif _outcome === "crit_fail">>He looks disappointed even as he finishes.<<else>>He catches his breath, leaning back.<</if>></p>
<</if>>
<<else>>
/* Female NPC climax */
<p><<print _npc.firstName>>'s thighs clamp around your head as she finishes. Her <<print _npc.bodyType>> body shudders, hands clutching at the surface beneath her. A breathless moan escapes her lips.</p>
<</if>>
/* Player's own reaction */
<<if _se.strongOrgasm >= 2 && $pc.arousal >= 70>>
<p>Your own orgasm hits like a freight train. It's not subtle — your whole body spasms, you cry out, and for a few seconds you can't see or think. When it passes, you're shaking.</p>
<<modStat "arousal" -40 "Strong orgasm">>
<<modStat "mood" 5 "Intense pleasure">>
<<elseif $pc.arousal >= 80 && _se.masturbationDenial <= 1>>
<p>You come too. It happens almost against your will — a wave of pleasure cresting and breaking. You press your face into whatever's nearest and ride it out.</p>
<<modStat "arousal" -30 "Orgasm">>
<<elseif _se.masturbationDenial >= 2 && $pc.arousal >= 70>>
<p>You're right on the edge — SO close — but it won't come. The denial SE keeps you hovering at the peak, never tipping over. It's maddening. You whimper in frustration.</p>
<<modStat "stress" 5 "Denial frustration">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">Continue →</span>' "ServiceAftermath">><</link>>
</div><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _outcome = $temp.serviceOutcome>>
<h2>Aftermath</h2>
/* NPC reaction based on outcome */
<<if _outcome === "crit_success">>
<p><<print _npc.firstName>> looks at you with genuine admiration. <<if _npc.personality === "shy">>"That was... wow. Thank you. I mean—" He goes red again.<<elseif _npc.personality === "aggressive">>"Not bad." From him, that's a five-star review.<<elseif _npc.personality === "romantic">>"You're incredible." He brushes a strand of <<print $pc.hairColour>> hair from your face. "Can I see you again?"<<else>>"That was amazing." He's smiling. Actually smiling.<</if>></p>
<<elseif _outcome === "success">>
<p><<print _npc.firstName>> nods, satisfied. <<if _npc.personality === "shy">>"T-thanks." He avoids eye contact.<<elseif _npc.personality === "friendly">>"That was good. Thanks, <<print $pc.femaleFirstName>>."<<else>>"Solid." He starts getting dressed.<</if>></p>
<<elseif _outcome === "partial_fail">>
<p><<print _npc.firstName>> finishes but doesn't look impressed. <<if _npc.personality === "demanding">>"I've had better." Ouch.<<elseif _npc.personality === "sweet">>"It's okay. You're still learning, right?"<<else>>He shrugs. "It was fine."<</if>></p>
<<else>>
<p><<print _npc.firstName>> looks annoyed. <<if _npc.personality === "aggressive">>"What a waste of time." He doesn't look at you as he leaves.<<elseif _npc.personality === "cocky">>"Wow. That was... bad. Like, really bad." Thanks, <<print _npc.firstName>>.<<else>>He gets dressed quickly, making minimal eye contact. The silence is worse than anything he could say.<</if>></p>
<</if>>
/* Stat effects are handled in ServiceRating after selfie */
<<advanceTime 30>>
<p>You clean up as best you can in <<print _req.locationDesc>>. <<if $hygiene.cleanliness < 30>>You desperately need a shower.<<else>>You feel grimy but functional.<</if>></p>
<p><em>Time for the selfie.</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">📸 Take the verification selfie</span>' "ServiceSelfie">><</link>>
</div><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _outcome = $temp.serviceOutcome>>
<h2>📸 Verification Selfie</h2>
<p>CampusHub requires a post-service selfie for verification. You pull out your phone.</p>
<p>You look in the phone camera. <<if $pc.makeupApplied>>Your makeup is <<if _outcome === "crit_fail">>completely ruined — mascara streaks, lipstick smeared to your chin.<<else>>a little smudged but salvageable.<</if>><<else>>No makeup to ruin, at least.<</if>> Your <<print $pc.hairColour>> hair is <<if _outcome === "crit_success">>tousled in that "just had amazing sex" way.<<else>>a mess.<</if>></p>
<p>How do you want to take this selfie?</p>
<div class="choice-group">
<<link '<span class="choice-btn">🧘 Composed — look presentable (Composure check)</span>' "ServiceSelfieResult">>
<<set $temp.selfieMode = "composed">>
<<set $temp.selfieResult = XCLC.Roll.doCheck("composure", (_outcome === "crit_fail") ? 4 : 2)>>
<</link>>
<<link '<span class="choice-btn">😈 Slutty — lean into it (Charm check)</span>' "ServiceSelfieResult">>
<<set $temp.selfieMode = "slutty">>
<<set $temp.selfieResult = XCLC.Roll.doCheck("charm", (100 - $pc.femininity) / 20)>>
<</link>>
<<link '<span class="choice-btn">📱 Quick — just snap it, no fuss</span>' "ServiceSelfieResult">>
<<set $temp.selfieMode = "quick">>
<<set $temp.selfieResult = {outcome: "success"}>>
<</link>>
</div><<set _mode = $temp.selfieMode>>
<<set _check = $temp.selfieResult>>
<<set _passed = (_check.outcome === "crit_success" || _check.outcome === "success")>>
<h2>📸 Selfie Uploaded</h2>
<p><<print XCLC.Service.generateSelfieText(_mode, _passed)>></p>
/* Apply selfie bonuses */
<<if _mode === "composed" && _passed>>
<<set $temp.selfieBonus = 0.2>>
<p><em>+0.2 rating bonus for looking presentable.</em></p>
<<elseif _mode === "slutty" && _passed>>
<<set $temp.selfieBonus = 0.3>>
<<modRep "slut" 3 "Slutty selfie">>
<p><em>+0.3 rating bonus for the provocative pose. (+3 slut rep)</em></p>
<<elseif _mode === "slutty" && !_passed>>
<<set $temp.selfieBonus = 0>>
<<modRep "slut" 1 "Attempted slutty selfie">>
<p><em>Nice try. No bonus. (+1 slut rep for trying)</em></p>
<<else>>
<<set $temp.selfieBonus = 0>>
<</if>>
<p>Selfie uploaded to CampusHub. ✅</p>
<div class="choice-group">
<<link '<span class="choice-btn">⭐ See your rating</span>' "ServiceRating">><</link>>
</div><<set _req = $temp.serviceRequest>>
<<set _npc = $temp.serviceNPC>>
<<set _outcome = $temp.serviceOutcome>>
<<set _selfieBonus = $temp.selfieBonus || 0>>
/* Apply stat effects + credits + quota via existing widget */
<<completeService _req.serviceType _npc _outcome>>
/* Apply selfie bonus on top */
<<if _selfieBonus > 0>>
<<set $scholarship.rating = Math.min(5, $scholarship.rating + _selfieBonus)>>
<<set $scholarship.rating = Math.round($scholarship.rating * 100) / 100>>
<</if>>
<<set _target = $scholarship.isFinalsWeek ? $scholarship.finalsQuota : $scholarship.weeklyQuota>>
<<set _totalCredits = $temp.lastServiceCredits || 1>>
<<if isNaN(_totalCredits)>><<set _totalCredits = 1>><</if>>
<<if isNaN($scholarship.rating)>><<set $scholarship.rating = 5.0>><</if>>
<<set _dispRating = $temp.lastServiceRating>>
<<if typeof _dispRating !== 'number' || isNaN(_dispRating)>><<set _dispRating = 3.5>><</if>>
<h2>⭐ Service Complete</h2>
<div class="card">
<div class="card__title">📊 Results</div>
<p><strong>NPC:</strong> <<print _npc.firstName>> <<print _npc.lastName>> (<<print _npc.personality>>)</p>
<p><strong>Service:</strong> <<print _req.serviceType.charAt(0).toUpperCase()>><<print _req.serviceType.slice(1)>> — <<print $temp.chosenPosition.name>></p>
<p><strong>Rating:</strong> ⭐ <<print _dispRating.toFixed(1)>> <<if _selfieBonus > 0>>(+<<print _selfieBonus>> selfie bonus)<</if>></p>
<p><strong>Credits:</strong> +<<print _totalCredits>></p>
<p><strong>Overall Rating:</strong> <<print $scholarship.rating.toFixed(2)>></p>
<p><strong>Weekly Quota:</strong> <<print $scholarship.currentWeekServiced>>/<<print _target>></p>
<<if $scholarship.mercyActive>>
<p><em>🛡️ Mercy Rule still active (<<print 5 - $scholarship.totalServices>> encounters remaining)</em></p>
<</if>>
</div>
/* Clean up service state */
<<set $scholarship.inService = false>>
<<set $temp.serviceRequest = null>>
<<set $temp.serviceNPC = null>>
<<set $temp.chosenPosition = null>>
<<set $temp.serviceOutcome = null>>
<<set $temp.selfieMode = null>>
<<set $temp.selfieResult = null>>
<<set $temp.selfieBonus = null>>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Return to campus</span>' "CampusMap">><</link>>
</div><h2>👗 Wardrobe</h2>
<<run setTimeout(function(){
var inv = State.variables.inventory;
var outfit = inv.currentOutfit;
var W = XCLC.Wardrobe;
var hasDress = !!outfit.dress;
var slots = [
{key: 'top', label: 'Top', icon: '👕', blocked: hasDress},
{key: 'bottom', label: 'Bottom', icon: '👖', blocked: hasDress},
{key: 'dress', label: 'Dress', icon: '👗', blocked: false},
{key: 'bra', label: 'Bra', icon: '👙', blocked: false},
{key: 'underwear', label: 'Underwear', icon: '🩲', blocked: false},
{key: 'shoes', label: 'Shoes', icon: '👟', blocked: false}
];
var html = '<div class="wardrobe-container">';
/* Style identity display */
var styleLabel = inv.styleIdentity === 'none' ? 'Mixed' : inv.styleIdentity.charAt(0).toUpperCase() + inv.styleIdentity.slice(1);
var beautyBonus = W.getOutfitBeauty();
html += '<div class="wardrobe-style-bar"><span>Style: <strong>' + styleLabel + '</strong></span><span>Outfit Beauty: <strong>+' + beautyBonus + '</strong></span></div>';
/* Equipment slots */
html += '<div class="wardrobe-slots">';
for (var i = 0; i < slots.length; i++) {
var s = slots[i];
var itemName = s.blocked ? '🔒 Blocked (dress equipped)' : W.getSlotName(s.key);
var equipped = !s.blocked && outfit[s.key];
html += '<div class="wardrobe-slot' + (equipped ? ' equipped' : '') + (s.blocked ? ' blocked' : '') + '" data-slot="' + s.key + '">';
html += '<div class="wardrobe-slot-icon">' + s.icon + '</div>';
html += '<div class="wardrobe-slot-info">';
html += '<div class="wardrobe-slot-label">' + s.label + '</div>';
html += '<div class="wardrobe-slot-item">' + itemName + '</div>';
html += '</div>';
if (!s.blocked) {
html += '<button class="wardrobe-change-btn" data-slot="' + s.key + '">Change</button>';
}
html += '</div>';
}
/* Accessories */
var accNames = W.getSlotName('accessories');
html += '<div class="wardrobe-slot" data-slot="accessories">';
html += '<div class="wardrobe-slot-icon">💍</div>';
html += '<div class="wardrobe-slot-info"><div class="wardrobe-slot-label">Accessories</div><div class="wardrobe-slot-item">' + accNames + '</div></div>';
html += '<button class="wardrobe-change-btn" data-slot="accessory">Change</button>';
html += '</div>';
html += '</div>'; /* end slots */
/* Item picker area (populated on click) */
html += '<div id="wardrobe-picker" class="wardrobe-picker"></div>';
html += '</div>';
jQuery('#wardrobe-display').html(html);
/* Wire up change buttons */
jQuery('.wardrobe-change-btn').off('click').on('click', function(){
var slot = jQuery(this).data('slot');
var items = W.getItemsBySlot(slot);
var pickerHtml = '<h4>Select ' + slot.charAt(0).toUpperCase() + slot.slice(1) + ':</h4>';
pickerHtml += '<div class="wardrobe-item-list">';
/* Unequip option */
pickerHtml += '<div class="wardrobe-pick-item unequip-option" data-action="unequip" data-slot="' + slot + '"><span>❌</span><span>Remove</span></div>';
for (var j = 0; j < items.length; j++) {
var itm = items[j];
var isEquipped = (outfit[slot] === itm.id) || (slot === 'accessory' && outfit.accessories.indexOf(itm.id) >= 0);
pickerHtml += '<div class="wardrobe-pick-item' + (isEquipped ? ' current' : '') + '" data-action="equip" data-item="' + itm.id + '">';
pickerHtml += '<span class="pick-name">' + itm.name + '</span>';
pickerHtml += '<span class="pick-stats">🔥' + itm.sexy + ' ✨' + itm.beauty + '</span>';
pickerHtml += '</div>';
}
pickerHtml += '</div>';
jQuery('#wardrobe-picker').html(pickerHtml);
/* Wire up picks */
jQuery('.wardrobe-pick-item').off('click').on('click', function(){
var action = jQuery(this).data('action');
if (action === 'unequip') {
var uSlot = jQuery(this).data('slot');
if (uSlot === 'accessory') {
W.unequip('accessories');
} else {
W.unequip(uSlot);
}
} else {
var itemId = jQuery(this).data('item');
W.equip(itemId);
}
/* Refresh the page */
Engine.play('WardrobeMenu');
});
});
}, 50)>>
<div id="wardrobe-display"><p style="opacity:0.5;">Loading wardrobe...</p></div>
<<link '<span class="choice-btn">🏠 Back to Dorm</span>' "DormRoom">><</link>>/* CSS for wardrobe is injected via style.css */<h2>🛍️ Thornfield Mall</h2>
<p>The mall sits just off campus — a three-storey complex of shops, food courts, and questionable fashion choices. Students stream through the automatic doors, shopping bags in hand, the hum of pop music drifting from every storefront.</p>
<div class="location-choices">
<<link '<span class="choice-btn">👕 Campus Basics</span>' "Shop_CampusBasics">><</link>>
<<link '<span class="choice-btn">🖤 Hot Topic Noir</span>' "Shop_HotTopic">><</link>>
<<link '<span class="choice-btn">💖 Candy Pink</span>' "Shop_CandyPink">><</link>>
<<link '<span class="choice-btn">🔥 Spice</span>' "Shop_Spice">><</link>>
<<link '<span class="choice-btn">🏃 Nike Athletics</span>' "Shop_Nike">><</link>>
<<link '<span class="choice-btn">🔞 After Dark (Adult Store)</span>' "Shop_AfterDark">><</link>>
<<link '<span class="choice-btn">💻 Electronics Store</span>' "Shop_Electronics">><</link>>
</div>
<div class="nav-back">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>👕 Campus Basics</h2>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('campus_basics', 'Campus Basics', 'Your one-stop shop for everyday college wear. Nothing flashy — just reliable, affordable basics that won\'t embarrass you in lecture.');
jQuery('#shop-display').html(html);
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_CampusBasics');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>🖤 Hot Topic Noir</h2>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('hot_topic', 'Hot Topic Noir', 'Dark walls, darker music. The air smells like incense and rebellion. Everything here is black, spiked, or laced — preferably all three.');
jQuery('#shop-display').html(html);
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_HotTopic');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>💖 Candy Pink</h2>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('candy_pink', 'Candy Pink', 'Everything is pink. The walls, the carpet, the staff uniforms, even the air freshener. If Barbie had a clothing store, this would be it. The shopgirl beams at you with impossibly white teeth.');
jQuery('#shop-display').html(html);
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_CandyPink');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>🔥 Spice</h2>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('spice', 'Spice', 'Dim lighting, throbbing bass, and mannequins wearing things that barely qualify as clothing. The kind of shop where the changing room mirrors have flattering lighting and the sales associate gives you a knowing look.');
jQuery('#shop-display').html(html);
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_Spice');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>🏃 Nike Athletics</h2>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('nike', 'Nike Athletics', 'Clean lines, motivational slogans, and that new-sneaker smell. Everything here is designed to make you look athletic even if the most exercise you get is walking to the cafeteria.');
jQuery('#shop-display').html(html);
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_Nike');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>🔞 After Dark</h2>
<<if $pc.femininity < 30>>
<p><em>You hesitate at the entrance. The neon sign glows suggestively above frosted glass doors. A composure check crosses your mind...</em></p>
<</if>>
<<run setTimeout(function(){
var html = XCLC.Shop.renderClothingShop('after_dark', 'After Dark', 'Tucked away on the second floor, behind a discreet frosted glass entrance. Inside: silk, lace, leather, and things that make you blush. The lighting is warm and flattering. A well-dressed saleswoman approaches with a knowing smile.');
/* Add sex toys section */
html += '<div class="shop-header" style="margin-top:2em;"><h3>Toys & Equipment</h3><p style="opacity:0.7;margin:0.3em 0;">For personal use or... professional purposes.</p></div>';
html += '<div class="shop-grid">';
var toys = [
{name: 'Vibrator', price: 30, desc: 'A discreet bullet vibrator. For dorm room use.', id: 'toy_vibrator'},
{name: 'Dildo', price: 35, desc: 'A realistic silicone dildo. Practice makes perfect.', id: 'toy_dildo'},
{name: 'Butt Plug', price: 25, desc: 'A small silicone plug. For the adventurous.', id: 'toy_plug'},
{name: 'Restraints Set', price: 45, desc: 'Soft cuffs and a blindfold. Beginner-friendly.', id: 'toy_restraints'},
{name: 'Ring Light', price: 40, desc: 'Professional lighting for content creation.', id: 'equip_ringlight'},
{name: 'Backdrop Kit', price: 30, desc: 'A simple backdrop for cam shows and photos.', id: 'equip_backdrop'}
];
var sv = State.variables;
for (var i = 0; i < toys.length; i++) {
var t = toys[i];
var owned = false;
if (t.id.indexOf('toy_') === 0) {
for (var j = 0; j < sv.inventory.sexToys.length; j++) {
if (sv.inventory.sexToys[j] === t.id) { owned = true; break; }
}
} else if (t.id === 'equip_ringlight') {
owned = sv.inventory.hasRingLight;
}
var canBuy = !owned && sv.finance.money >= t.price;
html += '<div class="shop-item' + (owned ? ' owned' : '') + '">';
html += '<div class="shop-item-name">' + t.name + '</div>';
html += '<div class="shop-item-desc">' + t.desc + '</div>';
if (owned) {
html += '<div class="shop-item-owned">Owned</div>';
} else {
html += '<button class="shop-buy-toy' + (canBuy ? '' : ' disabled') + '" data-toy="' + t.id + '" data-price="' + t.price + '">$' + t.price + '</button>';
}
html += '</div>';
}
html += '</div>';
jQuery('#shop-display').html(html);
/* Wire clothing buys */
jQuery('.shop-buy-btn').not('.disabled').off('click').on('click', function(){
var shop = jQuery(this).data('shop');
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyClothing(shop, idx)) {
Engine.play('Shop_AfterDark');
}
});
/* Wire toy buys */
jQuery('.shop-buy-toy').not('.disabled').off('click').on('click', function(){
var toyId = jQuery(this).data('toy');
var price = parseInt(jQuery(this).data('price'));
var svv = State.variables;
if (svv.finance.money < price) return;
svv.finance.money -= price;
if (toyId.indexOf('toy_') === 0) {
svv.inventory.sexToys.push(toyId);
} else if (toyId === 'equip_ringlight') {
svv.inventory.hasRingLight = true;
}
Engine.play('Shop_AfterDark');
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>💻 Electronics Store</h2>
<p>A bright, clean electronics shop filled with the latest gadgets. Rows of laptops, cameras, and accessories line the walls.</p>
<<run setTimeout(function(){
var sv = State.variables;
var items = XCLC.Shop.ELECTRONICS;
var html = '<div class="shop-grid">';
for (var i = 0; i < items.length; i++) {
var item = items[i];
var owned = sv.inventory[item.flag];
var canBuy = !owned && sv.finance.money >= item.price;
html += '<div class="shop-item' + (owned ? ' owned' : '') + '">';
html += '<div class="shop-item-name">' + item.name + '</div>';
html += '<div class="shop-item-desc">' + item.description + '</div>';
if (owned) {
html += '<div class="shop-item-owned">Owned</div>';
} else {
html += '<button class="shop-buy-elec' + (canBuy ? '' : ' disabled') + '" data-idx="' + i + '">$' + item.price + '</button>';
}
html += '</div>';
}
html += '</div>';
jQuery('#shop-display').html(html);
jQuery('.shop-buy-elec').not('.disabled').off('click').on('click', function(){
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyElectronics(idx)) {
Engine.play('Shop_Electronics');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🛍️ Back to Mall</span>' "Mall">><</link>><h2>💊 Drugstore</h2>
<p>A clean, fluorescent-lit pharmacy with neatly organised shelves. The pharmacist behind the counter gives you a friendly nod. Everything from razors to birth control, all under one roof.</p>
<<run setTimeout(function(){
var sv = State.variables;
var items = XCLC.Shop.DRUGSTORE;
var html = '<div class="shop-grid">';
for (var i = 0; i < items.length; i++) {
var item = items[i];
var canBuy = sv.finance.money >= item.price;
var stock = '';
if (item.type === 'consumable') {
stock = ' (Have: ' + sv.inventory[item.field] + ')';
} else if (item.type === 'makeup') {
stock = ' (Have: ' + sv.inventory.makeupUses[item.field] + ' uses)';
} else if (item.type === 'special' && item.field === 'onPill') {
stock = sv.inventory.onPill ? ' (Active)' : '';
}
html += '<div class="shop-item">';
html += '<div class="shop-item-name">' + item.name + stock + '</div>';
html += '<div class="shop-item-desc">' + item.description + '</div>';
html += '<button class="shop-buy-drug' + (canBuy ? '' : ' disabled') + '" data-idx="' + i + '">$' + item.price + '</button>';
html += '</div>';
}
html += '</div>';
jQuery('#shop-display').html(html);
jQuery('.shop-buy-drug').not('.disabled').off('click').on('click', function(){
var idx = parseInt(jQuery(this).data('idx'));
if (XCLC.Shop.buyDrugstore(idx)) {
Engine.play('Drugstore');
}
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading shop...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>><h2>💇 Luxe Locks Hair Salon</h2>
<p>A stylish salon with exposed brick walls and vintage mirrors. Your stylist, <strong>Jade</strong> — a woman with impeccable purple hair and an infectious laugh — beckons you to a chair.</p>
<p>"Hey gorgeous! What are we doing today?" She runs her fingers through your <<= $pc.hairColour>> <<= $pc.hairLength>> hair appraisingly.</p>
<div class="location-choices">
/* Haircut */
<<if $finance.money >= 25>>
<<link '<span class="choice-btn">✂️ Haircut ($25, 45min)</span>'>>
<<run setTimeout(function(){
var opts = ['short', 'medium', 'long'];
var html = '<h4>Choose a length:</h4><div class="cc-grid" style="display:grid;grid-template-columns:repeat(3,1fr);gap:0.5em;">';
for (var i = 0; i < opts.length; i++) {
html += '<div class="cc-option hair-pick" data-val="' + opts[i] + '" style="cursor:pointer;padding:1em;border-radius:8px;border:2px solid var(--surface-2);background:var(--surface-1);text-align:center;text-transform:capitalize;">' + opts[i] + '</div>';
}
html += '</div>';
jQuery('#salon-picker').html(html);
jQuery('.hair-pick').off('click').on('click', function(){
var val = jQuery(this).data('val');
State.variables.pc.hairLength = val;
State.variables.finance.money -= 25;
Engine.play('HairSalon_Done');
});
}, 50)>>
<</link>>
<<else>>
<span class="choice-btn disabled">✂️ Haircut ($25) — Can't afford</span>
<</if>>
/* Colour */
<<if $finance.money >= 40>>
<<link '<span class="choice-btn">🎨 Hair Colour ($40, 60min)</span>'>>
<<run setTimeout(function(){
var colours = ['blonde', 'brunette', 'black', 'red', 'auburn', 'pink', 'purple', 'blue', 'platinum', 'strawberry blonde'];
var html = '<h4>Choose a colour:</h4><div class="cc-grid" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.5em;">';
for (var i = 0; i < colours.length; i++) {
html += '<div class="cc-option colour-pick" data-val="' + colours[i] + '" style="cursor:pointer;padding:0.8em;border-radius:8px;border:2px solid var(--surface-2);background:var(--surface-1);text-transform:capitalize;">' + colours[i] + '</div>';
}
html += '</div>';
jQuery('#salon-picker').html(html);
jQuery('.colour-pick').off('click').on('click', function(){
var val = jQuery(this).data('val');
State.variables.pc.hairColour = val;
State.variables.finance.money -= 40;
Engine.play('HairSalon_Done');
});
}, 50)>>
<</link>>
<<else>>
<span class="choice-btn disabled">🎨 Hair Colour ($40) — Can't afford</span>
<</if>>
/* Style */
<<if $finance.money >= 15>>
<<link '<span class="choice-btn">💁 Hair Style ($15, 30min)</span>'>>
<<run setTimeout(function(){
var styles = ['straight', 'wavy', 'curly', 'braids', 'ponytail', 'pigtails', 'messy bun', 'bob'];
var html = '<h4>Choose a style:</h4><div class="cc-grid" style="display:grid;grid-template-columns:repeat(2,1fr);gap:0.5em;">';
for (var i = 0; i < styles.length; i++) {
html += '<div class="cc-option style-pick" data-val="' + styles[i] + '" style="cursor:pointer;padding:0.8em;border-radius:8px;border:2px solid var(--surface-2);background:var(--surface-1);text-transform:capitalize;">' + styles[i] + '</div>';
}
html += '</div>';
jQuery('#salon-picker').html(html);
jQuery('.style-pick').off('click').on('click', function(){
var val = jQuery(this).data('val');
State.variables.pc.hairStyle = val;
State.variables.finance.money -= 15;
Engine.play('HairSalon_Done');
});
}, 50)>>
<</link>>
<<else>>
<span class="choice-btn disabled">💁 Hair Style ($15) — Can't afford</span>
<</if>>
/* Extensions */
<<if $finance.money >= 60>>
<<link '<span class="choice-btn">✨ Hair Extensions ($60, 90min)</span>'>>
<<set $pc.hairLength = "long">>
<<set $finance.money -= 60>>
<<goto "HairSalon_Done">>
<</link>>
<<else>>
<span class="choice-btn disabled">✨ Extensions ($60) — Can't afford</span>
<</if>>
</div>
<div id="salon-picker"></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>><h2>💇 Salon Visit Complete</h2>
<p>Jade spins your chair around with a flourish. "There we go! What do you think?"</p>
<p>You admire your <<= $pc.hairColour>> <<= $pc.hairLength>> hair, now styled in a <<= $pc.hairStyle>> look. It suits you.</p>
<<advanceTime 45>>
<<link '<span class="choice-btn">💇 Do more</span>' "HairSalon">><</link>>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>><h2>🖋️ Ink & Iron — Tattoo & Piercing</h2>
<p>A surprisingly clean parlour with exposed brick and framed flash art covering every wall. The artist, <strong>Razor</strong> — a heavily tattooed woman with kind eyes and steady hands — looks up from her sketch pad.</p>
<p>"Welcome to Ink and Iron, sweetheart. What'll it be?"</p>
<div class="location-choices">
<<link '<span class="choice-btn">💎 Piercings</span>' "TattooShop_Piercings">><</link>>
<<link '<span class="choice-btn">🎨 Tattoos</span>' "TattooShop_Tattoos">><</link>>
</div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>><h2>💎 Piercings</h2>
<<run setTimeout(function(){
var sv = State.variables;
var piercings = [
{id: 'ears_studs', name: 'Ear Studs', price: 20, beauty: 1, sexy: 0, desc: 'Classic ear studs. Simple and elegant.'},
{id: 'ears_hoops', name: 'Ear Hoops', price: 25, beauty: 2, sexy: 1, desc: 'Silver hoop earrings. A bit more daring.'},
{id: 'nose_stud', name: 'Nose Stud', price: 30, beauty: 1, sexy: 2, desc: 'A tiny diamond stud on your nostril.'},
{id: 'lip_ring', name: 'Lip Ring', price: 35, beauty: 1, sexy: 3, desc: 'A small ring on your lower lip. Oral skill bonus.'},
{id: 'tongue', name: 'Tongue Piercing', price: 40, beauty: 0, sexy: 4, desc: 'A barbell through your tongue. +10% oral skill.'},
{id: 'belly', name: 'Belly Button', price: 35, beauty: 2, sexy: 3, desc: 'A sparkling belly button ring. Visible with crop tops.'},
{id: 'nipples', name: 'Nipple Piercings', price: 50, beauty: 0, sexy: 5, desc: 'Both nipples pierced with small barbells. Sensitivity SE interaction.'},
{id: 'clit', name: 'Clit Piercing', price: 60, beauty: 0, sexy: 6, desc: 'An intimate piercing. Sensitivity SE interaction, arousal triggers.'}
];
var html = '<div class="shop-grid">';
for (var i = 0; i < piercings.length; i++) {
var p = piercings[i];
var owned = false;
for (var j = 0; j < sv.pc.piercings.length; j++) {
if (sv.pc.piercings[j].id === p.id) { owned = true; break; }
}
var canBuy = !owned && sv.finance.money >= p.price;
html += '<div class="shop-item' + (owned ? ' owned' : '') + '">';
html += '<div class="shop-item-name">' + p.name + '</div>';
html += '<div class="shop-item-stats"><span>✨+' + p.beauty + '</span><span>🔥+' + p.sexy + '</span></div>';
html += '<div class="shop-item-desc">' + p.desc + '</div>';
if (owned) {
html += '<div class="shop-item-owned">Pierced</div>';
} else {
html += '<button class="shop-buy-pierce' + (canBuy ? '' : ' disabled') + '" data-idx="' + i + '">$' + p.price + '</button>';
}
html += '</div>';
}
html += '</div>';
jQuery('#shop-display').html(html);
jQuery('.shop-buy-pierce').not('.disabled').off('click').on('click', function(){
var idx = parseInt(jQuery(this).data('idx'));
var pierce = piercings[idx];
sv.finance.money -= pierce.price;
sv.pc.piercings.push({id: pierce.id, name: pierce.name, beauty: pierce.beauty, sexy: pierce.sexy});
Engine.play('TattooShop_Piercings');
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🖋️ Back to Ink & Iron</span>' "TattooShop">><</link>><h2>🎨 Tattoos</h2>
<<run setTimeout(function(){
var sv = State.variables;
var tattoos = [
{id: 'flower_ankle', name: 'Small Flower', location: 'Ankle', price: 40, sexy: 1, desc: 'A delicate flower on your ankle. Subtle and feminine.'},
{id: 'butterfly_hip', name: 'Butterfly', location: 'Hip', price: 50, sexy: 2, desc: 'A butterfly on your hip. Visible in low-rise clothing.'},
{id: 'stars_wrist', name: 'Star Cluster', location: 'Wrist', price: 40, sexy: 1, desc: 'A trail of tiny stars across your wrist.'},
{id: 'rose_arm', name: 'Rose Vine', location: 'Arm', price: 60, sexy: 2, desc: 'A climbing rose vine wrapping around your forearm.'},
{id: 'tramp_stamp', name: 'Tramp Stamp', location: 'Lower Back', price: 80, sexy: 5, desc: 'A tribal-style design on your lower back. Adds slut reputation.'},
{id: 'sleeve', name: 'Full Sleeve', location: 'Arm', price: 150, sexy: 3, desc: 'A full arm sleeve. Intricate and striking. Takes 2 visits.'},
{id: 'heart_chest', name: 'Heart', location: 'Chest', price: 70, sexy: 4, desc: 'A heart design on your chest. Visible in low-cut tops.'},
{id: 'script_ribs', name: 'Script Text', location: 'Ribs', price: 90, sexy: 3, desc: 'Elegant script text along your ribcage.'}
];
var html = '<div class="shop-grid">';
for (var i = 0; i < tattoos.length; i++) {
var t = tattoos[i];
var owned = false;
for (var j = 0; j < sv.pc.tattoos.length; j++) {
if (sv.pc.tattoos[j].id === t.id) { owned = true; break; }
}
var canBuy = !owned && sv.finance.money >= t.price;
html += '<div class="shop-item' + (owned ? ' owned' : '') + '">';
html += '<div class="shop-item-name">' + t.name + ' <span style="opacity:0.6;">(' + t.location + ')</span></div>';
html += '<div class="shop-item-stats"><span>🔥+' + t.sexy + '</span></div>';
html += '<div class="shop-item-desc">' + t.desc + '</div>';
if (owned) {
html += '<div class="shop-item-owned">Inked</div>';
} else {
html += '<button class="shop-buy-tattoo' + (canBuy ? '' : ' disabled') + '" data-idx="' + i + '">$' + t.price + '</button>';
}
html += '</div>';
}
html += '</div>';
jQuery('#shop-display').html(html);
jQuery('.shop-buy-tattoo').not('.disabled').off('click').on('click', function(){
var idx = parseInt(jQuery(this).data('idx'));
var tat = tattoos[idx];
sv.finance.money -= tat.price;
sv.pc.tattoos.push({id: tat.id, name: tat.name, location: tat.location, sexy: tat.sexy});
/* Tramp stamp adds slut rep */
if (tat.id === 'tramp_stamp') {
if (!sv.reputation) sv.reputation = {};
sv.reputation.slut = (sv.reputation.slut || 0) + 5;
}
Engine.play('TattooShop_Tattoos');
});
}, 50)>>
<div id="shop-display"><p style="opacity:0.5;">Loading...</p></div>
<p style="margin-top:1em;opacity:0.7;">💰 Cash: $<<= $finance.money>></p>
<<link '<span class="choice-btn">🖋️ Back to Ink & Iron</span>' "TattooShop">><</link>>/* ═══════════════════════════════════════════════════
THORNFIELD — GREEK ROW
Sororities, frat houses, parties
═══════════════════════════════════════════════════ */
<<set _period = XCLC.Time.getPeriod($world.time)>>
<h2>🏡 Greek Row</h2>
<<showDrunkStatus>>
<<if _period === "earlyMorning" || _period === "morning">>
<p>Greek Row is quiet in the morning. Sorority houses sit like pastel-painted mansions along a tree-lined street. A few hungover students shuffle to class clutching coffee cups. Red cups and beer cans litter the frat house lawns.</p>
<<elseif _period === "afternoon">>
<p>Sorority sisters sunbathe on their front lawns. A shirtless frat guy tosses a football. Someone's playing music from an upstairs window. The Greek life billboard near the entrance lists upcoming events.</p>
<<elseif _period === "evening">>
<p>Greek Row comes alive. Lights blaze from every house. Pre-game music thumps from the frat houses. Groups of dressed-up students migrate between buildings, red cups already in hand.</p>
<<else>>
<p>The street is chaos. Music from three different houses competes for dominance. Students spill across lawns, drinks in hand, shouting over the noise. Someone just set off a firework.</p>
<</if>>
<<divider "Sorority Houses">>
<div class="choice-group">
<<if $greekLife.member || $greekLife.pledging>>
<<link '<span class="choice-btn">🏡 <<print $greekLife.sorority>> House</span>' "SororityCommon">><</link>>
<<else>>
<<if $greekLife.rushAvailable && !$greekLife.rushDeclined>>
<<link '<span class="choice-btn">🌟 Rush Week — Check Out the Sororities!</span>' "SororityRush">><</link>>
<<else>>
<p><em>Sorority houses are members-only. Rush week happens in Week 2 of each year.</em></p>
<</if>>
<</if>>
</div>
<<divider "Frat Row">>
<div class="choice-group">
<<if ($world.dayOfWeek >= 4) && (_period === "evening" || _period === "night" || _period === "lateNight")>>
<<link '<span class="choice-btn">🎉 Frat Party — Sigma Chi House</span>' "FratParty">>
<<advanceTime 10>>
<</link>>
<<else>>
<p><em>The frat houses are quiet. Parties happen Friday and Saturday evenings.</em></p>
<</if>>
</div>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>🌟 Rush Week</h2>
<p>It's Rush Week! Three sororities are accepting pledges. Each house has set up a table on Greek Row with banners, cookies, and overly enthusiastic sisters trying to recruit you.</p>
<<divider "Choose a Sorority">>
<div class="card">
<div class="card__title">ΑΦΕ — Alpha Phi Epsilon</div>
<p>The hot ones. Their table is staffed by girls in crop tops and short skirts. The banner reads: "WORK HARD, PARTY HARDER." They're known for throwing the wildest parties and having the strongest connections to the frat houses.</p>
<p><em>Vibe: Party girl / slutty. Hazing involves sexual dares.</em></p>
</div>
<div class="card">
<div class="card__title">ΔΓΝ — Delta Gamma Nu</div>
<p>Their table is warm and inviting — fairy lights, hot chocolate, matching sweaters. The sisters greet everyone with genuine hugs. "We're a family," one says. "Sisterhood above everything."</p>
<p><em>Vibe: Deep sisterhood bonding. Hazing focuses on intimacy and trust between sisters.</em></p>
</div>
<div class="card">
<div class="card__title">ΚΚΧ — Kappa Kappa Chi</div>
<p>Professional. Crisp blazers, pearl necklaces, a printed brochure with alumni success stories. Their GPA average is the highest on campus. "We produce leaders," their president says with a perfectly practised smile.</p>
<p><em>Vibe: Academic / prestige. Traditional hazing — drinking, discipline, no sexual content.</em></p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔥 Pledge Alpha Phi Epsilon</span>' "SororityPledge_APE_1">>
<<set $greekLife.pledging = true>>
<<set $greekLife.sorority = "Alpha Phi Epsilon">>
<<set $greekLife.pledgeStage = 1>>
<<set $greekLife.rank = "pledge">>
<</link>>
<<link '<span class="choice-btn">💜 Pledge Delta Gamma Nu</span>' "SororityPledge_DGN_1">>
<<set $greekLife.pledging = true>>
<<set $greekLife.sorority = "Delta Gamma Nu">>
<<set $greekLife.pledgeStage = 1>>
<<set $greekLife.rank = "pledge">>
<</link>>
<<link '<span class="choice-btn">📚 Pledge Kappa Kappa Chi</span>' "SororityPledge_KKC_1">>
<<set $greekLife.pledging = true>>
<<set $greekLife.sorority = "Kappa Kappa Chi">>
<<set $greekLife.pledgeStage = 1>>
<<set $greekLife.rank = "pledge">>
<</link>>
<<link '<span class="choice-btn">🚫 Not interested this year</span>' "GreekRow">>
<<set $greekLife.rushDeclined = true>>
<</link>>
</div>
/* ═══════════════════════════════════════════════════
ALPHA PHI EPSILON — SEXUAL HAZING (5 stages)
═══════════════════════════════════════════════════ */<h2>ΑΦΕ Pledge — Stage 1: Flash Dare</h2>
<p>Your first night as a pledge. The sisters gather in the living room, music low, candles lit. The pledge class — six of you — stands in a line. The president, a stunning brunette named Megan, paces in front of you.</p>
<p>"Tonight is about proving you're not shy. Alpha Phi sisters don't hide." She points at the living room window, which faces the frat house across the street. "Flash them. Tits out. Five seconds minimum."</p>
<p>The window is open. You can see frat guys on their porch, beers in hand.</p>
<<rollButton "composure" 3 "Flash dare" "SororityPledge_APE_1_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You pull up your top without hesitation. The frat guys across the street erupt in cheers and whistles. Your <<print $pc.breastSize>>-cup breasts catch the lamplight. Five seconds. Six. Seven. You drop your shirt and the sisters scream approval.</p>
<p>"YES, girl!" Megan high-fives you. "She's got what it takes!"</p>
<<modStat "confidence" 5 "Flash dare passed">>
<<modRep "slut" 2>>
<<set $greekLife.pledgeStage = 2>>
<<else>>
<p>You hesitate. Your hands grip the hem of your shirt but you can't make them pull. The other pledges are already flashing. Megan's smile tightens.</p>
<p>"Maybe next time, pledge." The disappointment in her voice stings.</p>
<<modStat "confidence" -5 "Chickened out">>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 2>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_APE_2">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Try again tomorrow</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΑΦΕ Pledge — Stage 2: Body Shots</h2>
<p>A joint mixer with Sigma Chi. The sisters and frat guys are packed into the common room. Megan points at you. "Pledge! On the table. Now."</p>
<p>You climb onto the beer-sticky table. Someone squeezes lime juice onto your stomach. Salt is sprinkled on your collarbone. A frat guy with a shit-eating grin leans in with a shot glass.</p>
<p>"Hold still. Don't flinch."</p>
<<rollButton "stamina" 4 "Endure body shots" "SororityPledge_APE_2_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You lie perfectly still as tongue after tongue traces salt from your skin. Three different guys do shots off your body. You don't flinch, don't squirm. The room chants your name.</p>
<<modStat "confidence" 5 "Body shots champion">>
<<modRep "popular" 3>>
<<set $substances.alcoholTolerance = Math.min(10, $substances.alcoholTolerance + 1)>>
<<set $greekLife.pledgeStage = 3>>
<<else>>
<p>The second guy's tongue is cold and you jolt, sending tequila everywhere. Laughter erupts. Your face burns. Megan sighs.</p>
<<modStat "confidence" -5 "Flinched">>
<<modRep "slut" 1>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 3>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_APE_3">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Try again</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΑΦΕ Pledge — Stage 3: Lap Dance</h2>
<p>Megan's boyfriend sits in a chair in the centre of the room. He's the Sigma Chi president — tall, built, amused. Megan crosses her arms.</p>
<p>"Give him a lap dance. A real one. Make him hard. If you can't turn on my boyfriend, you can't handle Alpha Phi."</p>
<p>Music starts. The sisters watch from the couches. His hands are behind his head, legs spread. Waiting.</p>
<<rollButton "dance" 5 "Lap dance" "SororityPledge_APE_3_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You straddle his lap. Your hips roll to the beat. You lean in close, <<print $pc.hairColour>> hair brushing his face, your <<print $pc.breastSize>>-cups pressed against his chest. His hands grip the chair. You can feel him getting hard through his jeans.</p>
<p>"Well, well." Megan grins. "She's got talent." The sisters applaud.</p>
<<addXP "dance" 15>>
<<modStat "confidence" 5 "Great lap dance">>
<<modRep "slut" 3>>
<<set $greekLife.pledgeStage = 4>>
<<else>>
<p>You try to be sexy but you're stiff, awkward. You accidentally knee him. He winces. The room goes quiet. Megan covers her eyes.</p>
<<modStat "confidence" -5 "Bad lap dance">>
<<addXP "dance" 5>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 4>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_APE_4">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Practice and try again</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΑΦΕ Pledge — Stage 4: The Blowjob Dare</h2>
<p>The pledge class gathers in the chapter room. Three frat pledges — nervous, shirtless — sit on folding chairs. Megan paces.</p>
<p>"Here's how it works. You blow one of them. The sisters watch. This is about confidence — owning your sexuality. No hiding. No shame."</p>
<p>She pairs you with a nervous-looking guy named Jake. He's cute, at least. His cock is average, already half-hard from anticipation.</p>
<p>"On your knees, pledge."</p>
<<rollButton "oral" 5 "Blowjob dare" "SororityPledge_APE_4_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You sink to your knees in front of Jake. The sisters watch from the circle. You take him in your mouth, working steadily, confidently. Jake groans. Your <<print $pc.eyeColour>> eyes flick up to meet Megan's approving gaze.</p>
<p>It doesn't take long. Jake grips the chair, gasping. The sisters cheer.</p>
<p>"That's an Alpha Phi girl right there," Megan says proudly.</p>
<<addXP "oral" 20>>
<<modStat "confidence" 5 "Performed under pressure">>
<<modRep "slut" 5>>
<<modHygiene -10 "Blowjob dare">>
<<set $greekLife.pledgeStage = 5>>
<<else>>
<p>You kneel, open your mouth, and... freeze. The eyes on you. The judging. Jake shifts uncomfortably. You manage a few awkward strokes before pulling away, face burning.</p>
<p>"It's okay," Megan says, though she clearly expected more. "You can try again."</p>
<<modStat "confidence" -8 "Couldn't finish">>
<<addXP "oral" 8>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 5>>
<<link '<span class="choice-btn">✅ Final challenge</span>' "SororityPledge_APE_5">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Come back when ready</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΑΦΕ Pledge — Stage 5: The Train</h2>
<p>Initiation night. The chapter room is candlelit. You're the last pledge standing. Three frat guys wait on a large bed pushed against the wall. Megan stands by the door.</p>
<p>"This is it. The final test. Three guys, back to back. You finish all three, you're an Alpha Phi sister for life." She pauses. "Or you can walk away. No judgement. Well... some judgement."</p>
<<rollButton "stamina" 6 "The train" "SororityPledge_APE_5_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>Three guys. Back to back. It's intense, overwhelming, exhausting — but you take every one. Your body aches, your jaw hurts, but when the last guy finishes, you're still standing. Sweating, shaking, but standing.</p>
<p>The sisters erupt. Megan wraps a silk robe around your shoulders. "Welcome to Alpha Phi Epsilon, sister."</p>
<<set $greekLife.pledging = false>>
<<set $greekLife.member = true>>
<<set $greekLife.rank = "member">>
<<set $greekLife.hazingComplete = true>>
<<set $greekLife.sisterhood += 30>>
<<modStat "confidence" 15 "Alpha Phi initiation">>
<<modRep "slut" 10>>
<<modRep "popular" 5>>
<<addXP "stamina" 30>>
<<addXP "oral" 15>>
<<modHygiene -40 "Train">>
<<modStat "arousal" 40 "Train">>
<<modStat "energy" -30 "Exhausting initiation">>
<<run XCLC.Toast.show("🎉 You're an Alpha Phi sister!", "info")>>
<<else>>
<p>You make it through the first guy, barely. The second is too much. You tap out, gasping. The room goes quiet. Megan's face is unreadable.</p>
<p>"Come back next year, pledge." The door closes behind you.</p>
<<modStat "confidence" -10 "Couldn't finish">>
<<modStat "stress" 15 "Failed initiation">>
<<addXP "stamina" 15>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🏡 <<if $greekLife.member>>Go to your new room<<else>>Go home<</if>></span>' "<<if $greekLife.member>>SororityCommon<<else>>GreekRow<</if>>">><</link>>
</div>
/* ═══════════════════════════════════════════════════
DELTA GAMMA NU — LESBIAN BONDING HAZING (5 stages)
═══════════════════════════════════════════════════ */<h2>ΔΓΝ Pledge — Stage 1: Trust Fall & Massage</h2>
<p>The DGN house is warm — string lights, incense, soft music. The sisters sit in a circle on cushions. Your "big sister" mentor, a gentle girl named Ava with dark curls, places a blindfold over your eyes.</p>
<p>"This is about trust," Ava whispers. "Let go of control. Let us take care of you."</p>
<p>Hands guide you down onto a massage table. Multiple hands begin working warm oil into your shoulders, your back, your legs. It's intimate, careful.</p>
<<rollButton "composure" 3 "Trust and relax" "SororityPledge_DGN_1_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You sink into it. The hands are gentle, knowing. Ava's voice murmurs encouragement. The tension drains from your muscles. You feel safe, held, cared for. When the blindfold comes off, you're surrounded by warm smiles.</p>
<p>"Welcome to the beginning," Ava says, kissing your forehead.</p>
<<modStat "stress" -15 "Deep relaxation">>
<<set $greekLife.sisterhood += 10>>
<<set $greekLife.pledgeStage = 2>>
<<else>>
<p>You tense up under the unfamiliar hands. Can't relax. Can't let go. Ava senses it. "It's okay. We'll try again." The session ends early. You feel frustrated with yourself.</p>
<<modStat "stress" -5 "Tried to relax">>
<<set $greekLife.sisterhood += 3>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 2>>
<<link '<span class="choice-btn">✅ Next bonding session</span>' "SororityPledge_DGN_2">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Come back tomorrow</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΔΓΝ Pledge — Stage 2: Skinny Dipping</h2>
<p>Midnight. Ava drives you and the other pledges to Crystal Lake, twenty minutes from campus. The water is silver under moonlight. The sisters are already there — naked, laughing, splashing.</p>
<p>"Strip. Swim. Feel the water on your real skin. No hiding behind clothes." Ava drops her dress. She's beautiful — confident, natural.</p>
<p>The other pledges hesitate. You all look at each other.</p>
<<rollButton "composure" 4 "Strip and swim" "SororityPledge_DGN_2_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You peel off your clothes under the stars. The cool air prickles your skin. You wade into the lake — it's cold at first, then perfect. The sisters swim around you, laughing, splashing. Ava floats beside you, moonlight on her wet skin.</p>
<p>"See? Nothing to be afraid of." She takes your hand under the water. For a moment, everything is peaceful.</p>
<<modStat "confidence" 10 "Skinny dipping">>
<<modStat "mood" 15 "Beautiful night">>
<<set $greekLife.sisterhood += 15>>
<<set $greekLife.pledgeStage = 3>>
<<else>>
<p>You can't do it. You stand at the water's edge, arms crossed over your chest. Ava swims over. "It's okay. Not tonight." But you can see the other pledges in the water, bonding without you.</p>
<<modStat "confidence" -3 "Couldn't strip">>
<<set $greekLife.sisterhood += 5>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 3>>
<<link '<span class="choice-btn">✅ Next bonding session</span>' "SororityPledge_DGN_3">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Try again next time</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΔΓΝ Pledge — Stage 3: Seven Minutes in Heaven</h2>
<p>Pledge night social. Candles, wine, soft music. The sisters and pledges sit in a circle. Ava spins the bottle. It lands on you and a senior sister named Jade — athletic, confident, with knowing eyes.</p>
<p>"Closet. Seven minutes. Whatever feels right." Jade stands, offers you her hand. The closet is small, dark. Warm. You can smell her perfume.</p>
<p>"Relax," Jade whispers. "Just feel."</p>
<<rollButton "charm" 4 "Seven minutes" "SororityPledge_DGN_3_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>Jade's lips find yours in the dark. The kiss is soft at first, exploratory. Then deeper. Her hands slide to your waist, pulling you close. You kiss back — hesitant, then hungry. Her fingers trace your jaw, your neck, the curve of your breast.</p>
<p>Seven minutes. It feels like seven seconds. When the door opens, you're both flushed, breathing hard, smiling.</p>
<<modStat "arousal" 20 "Kissing Jade">>
<<modStat "confidence" 8 "Intimate connection">>
<<set $greekLife.sisterhood += 15>>
<<set $greekLife.pledgeStage = 4>>
<<else>>
<p>In the darkness, Jade leans in. You freeze. She pulls back. "It's okay. We don't have to." You stand in awkward silence for seven very long minutes.</p>
<<modStat "stress" 5 "Awkward closet">>
<<set $greekLife.sisterhood += 3>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 4>>
<<link '<span class="choice-btn">✅ Next bonding session</span>' "SororityPledge_DGN_4">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Try again</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΔΓΝ Pledge — Stage 4: Sister Worship</h2>
<p>Late evening at the DGN house. Ava — your big sister — leads you to her private room. Rose petals on the bed. Candles. She sits on the edge, wearing a silk robe.</p>
<p>"This is the deepest trust exercise. Every pledge gives this to their big sister. It's about devotion, vulnerability, closeness." She parts the robe. Her legs are bare. "Show me you're ready to be my sister."</p>
<<rollButton "oral" 5 "Go down on Ava" "SororityPledge_DGN_4_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You kneel between Ava's thighs. She's gentle — her fingers thread through your <<print $pc.hairColour>> hair, guiding but never forcing. You find your rhythm, reading her body. Her breath quickens, her hips shift.</p>
<p>"Oh god — right there —" She arches. When she comes, she pulls you up and kisses you, tasting herself on your lips. "My perfect little sister."</p>
<<addXP "oral" 20>>
<<modStat "arousal" 25 "Going down on Ava">>
<<set $greekLife.sisterhood += 20>>
<<modStat "confidence" 8 "Intimate trust">>
<<set $greekLife.pledgeStage = 5>>
<<else>>
<p>You're willing but uncertain. Your technique is off — too fast, then too slow. Ava is patient, encouraging, but eventually gently lifts your chin. "Not quite. But the willingness means everything." She kisses your forehead.</p>
<<addXP "oral" 10>>
<<set $greekLife.sisterhood += 8>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 5>>
<<link '<span class="choice-btn">✅ Final initiation</span>' "SororityPledge_DGN_5">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Come back when ready</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΔΓΝ Pledge — Stage 5: Initiation Night</h2>
<p>The chapter room is transformed. Silk sheets cover the floor. Candles line every surface. The entire pledge class and their big sisters gather in a circle. Ava holds your hand.</p>
<p>"The daisy chain is our most sacred tradition. Every sister, connected to every other. No beginning, no end. Just... us."</p>
<p>The sisters begin to undress. The pledges follow. Bodies intertwine — mouths finding skin, hands finding warmth.</p>
<<rollButton "stamina" 5 "Daisy chain initiation" "SororityPledge_DGN_5_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You lose yourself in the chain. Giving and receiving, connected to the women around you. Ava is above you, her dark curls falling against your skin. Someone else's mouth is between your thighs. You're doing the same for another sister. It's overwhelming, beautiful, sacred.</p>
<p>When it's over, you're all tangled together, breathing hard, laughing softly. Ava presses her forehead to yours. "Welcome home, sister."</p>
<<set $greekLife.pledging = false>>
<<set $greekLife.member = true>>
<<set $greekLife.rank = "member">>
<<set $greekLife.hazingComplete = true>>
<<set $greekLife.sisterhood += 30>>
<<modStat "arousal" 40 "Daisy chain">>
<<modStat "mood" 20 "Deep connection">>
<<modStat "stress" -20 "Acceptance">>
<<addXP "oral" 15>>
<<addXP "stamina" 15>>
<<run XCLC.Toast.show("💜 You're a Delta Gamma Nu sister!", "info")>>
<<else>>
<p>The intimacy overwhelms you. You try, but can't quite give yourself over to it. Ava sees. She holds you. "It's okay. We'll try again." The chain continues around you while you catch your breath.</p>
<<modStat "stress" 10 "Overwhelmed">>
<<addXP "stamina" 8>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🏡 <<if $greekLife.member>>Your new home<<else>>Go home<</if>></span>' "<<if $greekLife.member>>SororityCommon<<else>>GreekRow<</if>>">><</link>>
</div>
/* ═══════════════════════════════════════════════════
KAPPA KAPPA CHI — TRADITIONAL HAZING (5 stages)
═══════════════════════════════════════════════════ */<h2>ΚΚΧ Pledge — Stage 1: House Rules Quiz</h2>
<p>The Kappa house library. Wood panelling, leather chairs, portraits of alumni on the walls. The pledge class sits at desks like an exam. The house president, Victoria, drops a 30-page booklet on your desk.</p>
<p>"Memorise this. House history, founding principles, alumni achievements, chapter rules. I'll quiz you in one hour."</p>
<<rollButton "intelligence" 3 "Study and recite" "SororityPledge_KKC_1_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You nail every question. Founded in 1887. The motto is "Per Aspera Ad Astra." The most famous alum is a Supreme Court justice. Victoria raises an eyebrow — impressed despite herself.</p>
<p>"Competent. Good."</p>
<<addXP "intelligence" 15>>
<<set $greekLife.sisterhood += 5>>
<<set $greekLife.pledgeStage = 2>>
<<else>>
<p>You blank on the founding date and mix up two alumni. Victoria makes you stand in the corner wearing a paper dunce hat. The seniors take photos. It's a long afternoon.</p>
<<modStat "confidence" -5 "Dunce hat">>
<<addXP "intelligence" 5>>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 2>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_KKC_2">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Study more and retry</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΚΚΧ Pledge — Stage 2: Drinking Challenge</h2>
<p>Friday night. The pledge class is lined up in the basement. Ten shot glasses each, filled with cheap vodka. Victoria clicks a stopwatch.</p>
<p>"Relay. Each pledge takes one, passes to the next. Last pledge standing wins. We don't breed lightweights."</p>
<<rollButton "stamina" 4 "Chug relay" "SororityPledge_KKC_2_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>Shot after shot. The vodka burns. Your eyes water. But you keep going — slam, pass, slam, pass. The other pledges drop one by one. You're the last one standing, swaying but upright.</p>
<p>"Impressive." Victoria almost smiles. Almost.</p>
<<set $substances.alcoholTolerance = Math.min(10, $substances.alcoholTolerance + 1)>>
<<set $greekLife.sisterhood += 10>>
<<set $greekLife.pledgeStage = 3>>
<<drink "shot">><<drink "shot">><<drink "shot">>
<<else>>
<p>The fourth shot comes back up. Spectacularly. The seniors jump back. You ruin someone's shoes. Victoria hands you a mop.</p>
<<modStat "confidence" -5 "Vomited">>
<<drink "shot">><<drink "shot">>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 3>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_KKC_3">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Recover and retry</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΚΚΧ Pledge — Stage 3: Servant Day</h2>
<p>You're assigned to Victoria for the entire day. Carry her books. Fetch her coffee. Iron her blazer. She's demanding, exacting, and treats you like furniture.</p>
<p>"The latte should be 140 degrees. This is at least 150. Again."</p>
<p>By afternoon, you're exhausted and your patience is razor-thin.</p>
<<rollButton "composure" 5 "Endure the day" "SororityPledge_KKC_3_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You endure. Every unreasonable request, every snide comment, every "didn't I say TWO sugars?" — you handle it with a smile. By evening, Victoria nods.</p>
<p>"Discipline is the foundation of leadership. You have it."</p>
<<set $greekLife.sisterhood += 10>>
<<modRep "sweetheart" 3>>
<<set $greekLife.pledgeStage = 4>>
<<else>>
<p>"The LATTE—" "I KNOW ABOUT THE FUCKING LATTE!" You snap. The room goes silent. Victoria's eyes narrow. "Get out. Come back when you can control yourself."</p>
<<modStat "composure" -5 "Snapped at senior">>
<<modStat "stress" 10 "Humiliation">>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 4>>
<<link '<span class="choice-btn">✅ Next challenge</span>' "SororityPledge_KKC_4">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Apologize and retry</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΚΚΧ Pledge — Stage 4: Walk of Shame</h2>
<p>6 AM. Victoria wakes the pledge class. "Strip to your underwear. You're walking from the Kappa house to the library and back. Through the quad. Past the dorms. During morning rush."</p>
<p>Students are already heading to early classes. The quad is busy. You're in your <<if $pc.breastSize === "DD" || $pc.breastSize === "E">>struggling-to-contain<<else>>modest<</if>> bra and panties.</p>
<p>"Chin up. Walk with dignity. A Kappa woman is never ashamed."</p>
<<rollButton "composure" 6 "Walk of shame" "SororityPledge_KKC_4_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>You walk. Chin up, shoulders back, like Victoria said. Phone cameras flash. People stare. A frat guy whistles. But you keep walking — steady, controlled, dignified.</p>
<p>By the time you reach the library, you feel... powerful. Like nothing can touch you.</p>
<<modStat "confidence" 15 "Walked with dignity">>
<<modRep "popular" 5>>
<<set $greekLife.pledgeStage = 5>>
<<else>>
<p>Three steps in, a group of guys start laughing. You try to cover yourself. You speed-walk, then run. By the time you reach the library you're in tears. Victoria texts: "Try again when you're ready."</p>
<<modStat "confidence" -10 "Ran in shame">>
<<modStat "stress" 20 "Public humiliation">>
<</if>>
<div class="choice-group">
<<if $greekLife.pledgeStage >= 5>>
<<link '<span class="choice-btn">✅ Final exam</span>' "SororityPledge_KKC_5">><</link>>
<<else>>
<<link '<span class="choice-btn">🔄 Try again when ready</span>' "GreekRow">><</link>>
<</if>>
</div><h2>ΚΚΧ Pledge — Stage 5: Final Exam</h2>
<p>The Kappa chapter room. Blindfolded. The entire sorority watches. Victoria reads questions from the house manual. You must answer perfectly. Then recite the oath.</p>
<p>This is it. Months of discipline, study, and humiliation come down to this.</p>
<<rollButton "intelligence" 5 "Final examination" "SororityPledge_KKC_5_Result">><<set _outcome = $lastRoll.outcome>>
<<if _outcome === "crit_success" || _outcome === "success">>
<p>Every question: correct. The oath: flawless. When the blindfold comes off, Victoria is smiling — genuinely smiling. The sisters applaud.</p>
<p>"Per Aspera Ad Astra. Through hardship, to the stars." She pins a golden K to your blazer. "Welcome to Kappa Kappa Chi."</p>
<<set $greekLife.pledging = false>>
<<set $greekLife.member = true>>
<<set $greekLife.rank = "member">>
<<set $greekLife.hazingComplete = true>>
<<set $greekLife.sisterhood += 20>>
<<modStat "confidence" 15 "Kappa initiation">>
<<modRep "goodStudent" 5>>
<<addXP "intelligence" 25>>
<<run XCLC.Toast.show("📚 You're a Kappa Kappa Chi sister!", "info")>>
<<else>>
<p>You blank on question seven. The oath comes out garbled. Victoria's face is stone. "You're not ready. Study. Come back next year."</p>
<<modStat "confidence" -8 "Failed finals">>
<<modStat "stress" 10 "Failed initiation">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🏡 <<if $greekLife.member>>Your new chapter house<<else>>Go home<</if>></span>' "<<if $greekLife.member>>SororityCommon<<else>>GreekRow<</if>>">><</link>>
</div>
/* ═══════════════════════════════════════════════════
SORORITY COMMON ROOM (all sororities)
═══════════════════════════════════════════════════ */<h2>🏡 <<print $greekLife.sorority>> House</h2>
<p><<if $greekLife.sorority === "Alpha Phi Epsilon">>The Alpha Phi house is always buzzing. Loud music, girls getting ready for tonight's party, someone doing shots in the kitchen at 3 PM. The fridge is stocked with mixers and the closet is a communal wardrobe of slutty dresses.<<elseif $greekLife.sorority === "Delta Gamma Nu">>The DGN house is cozy. Fairy lights everywhere, someone baking in the kitchen, sisters braiding each other's hair on the common room floor. Ava waves you over to the couch.<<else>>The Kappa house is pristine. Hardwood floors, fresh flowers, a study schedule posted on the fridge. Victoria reviews flashcards at the dining table. The coffee machine is professional-grade.<</if>></p>
<p><strong>Sisterhood:</strong> <<print $greekLife.sisterhood>>/100</p>
<<divider "Activities">>
<div class="choice-group">
<<link '<span class="choice-btn">💬 Hang out with sisters</span>' "SororityCommon">>
<<advanceTime 60>>
<<set $greekLife.sisterhood = Math.min(100, $greekLife.sisterhood + 3)>>
<<modStat "mood" 5 "Sisterhood">>
<<modRep "popular" 1>>
<</link>>
<<if $greekLife.sorority === "Alpha Phi Epsilon">>
<<link '<span class="choice-btn">👗 Borrow party clothes</span>' "SororityCommon">>
<<set $pc.beautyClothing = Math.min(20, $pc.beautyClothing + 5)>>
<<run XCLC.Toast.show("👗 Borrowed a hot outfit from the closet.", "info")>>
<</link>>
<<elseif $greekLife.sorority === "Delta Gamma Nu">>
<<link '<span class="choice-btn">💆 Sister spa night</span>' "SororityCommon">>
<<advanceTime 60>>
<<modStat "stress" -15 "Spa night">>
<<modStat "mood" 10 "Bonding">>
<<set $greekLife.sisterhood = Math.min(100, $greekLife.sisterhood + 5)>>
<</link>>
<<elseif $greekLife.sorority === "Kappa Kappa Chi">>
<<link '<span class="choice-btn">📚 Join study group</span>' "SororityCommon">>
<<advanceTime 90>>
<<addXP "intelligence" 15>>
<<addXP "studying" 15>>
<<run XCLC.Toast.show("📚 Great study session with the sisters.", "info")>>
<</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🏡 Back to Greek Row</span>' "GreekRow">><</link>>
</div>
/* ═══════════════════════════════════════════════════
FRAT PARTIES
═══════════════════════════════════════════════════ */<h2>🎉 Frat Party — Sigma Chi House</h2>
<<showDrunkStatus>>
<<set $greekLife.fratPartiesAttended++>>
<<set $greekLife.lastPartyDay = $world.day>>
<<modRep "partyGirl" 2>>
<p>The Sigma Chi house is wall-to-wall bodies. Red cups, blaring hip-hop, a beer pong table in the living room, and a dance floor in the cleared-out dining room. The air is thick with sweat and cologne.</p>
<<if $pc.beautyTotal >= 60>>
<p>Heads turn as you walk in. A few guys elbow each other. A girl gives you the once-over.</p>
<<else>>
<p>Nobody notices your entrance. Just another body in the crowd.</p>
<</if>>
<<if $substances.drunkLevel >= 2>>
<p><em>Everything looks <<if $substances.drunkLevel >= 3>>really really<<else>>slightly<</if>> better than it probably is.</em></p>
<</if>>
/* Gangbang trigger check */
<<set _gangbangAvailable = ($substances.drunkLevel >= 3 || $reputation.slut >= 40)>>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">🍺 Get a drink</span>' "FratParty_Drink">><</link>>
<<link '<span class="choice-btn">💃 Hit the dance floor</span>' "FratParty_Dance">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">🏓 Beer pong</span>' "FratParty_GameRoom">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">💬 Mingle</span>' "FratParty">>
<<advanceTime 20>>
<<addXP "charm" 5>>
<<modStat "mood" 3 "Socialising">>
<</link>>
<<if _gangbangAvailable>>
<<link '<span class="choice-btn">🔥 Go upstairs with the group</span>' "FratParty_Gangbang">><</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🚪 Leave the party</span>' "GreekRow">>
<<if $substances.drunkLevel >= 3>>
<<set $temp.drunkTravel = true>>
<</if>>
<</link>>
</div><h2>🍺 The Keg</h2>
<<showDrunkStatus>>
<p>A keg sits in the corner, surrounded by red cups. A frat guy works the tap. Free beer — the universal college currency.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🍺 Beer (free)</span>' "FratParty">>
<<set $substances.drinksToday += 1>>
<<checkDrunkState>>
<<advanceTime 15>>
<<run XCLC.Toast.show("🍺 Free beer!", "info")>>
<</link>>
<<link '<span class="choice-btn">🥃 Jungle juice (strong)</span>' "FratParty">>
<<set $substances.drinksToday += 2>>
<<checkDrunkState>>
<<advanceTime 15>>
<<run XCLC.Toast.show("🥃 That jungle juice hits HARD.", "warning")>>
<</link>>
<<link '<span class="choice-btn">🚰 Water (smart choice)</span>' "FratParty">>
<<advanceTime 10>>
<</link>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back to the party</span>' "FratParty">><</link>>
</div><h2>💃 Dance Floor</h2>
<<showDrunkStatus>>
<<set _danceResult = XCLC.Roll.doCheck("dance", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success" || _danceResult === "success">>
<p>You lose yourself in the music. Bodies press against you. Someone's hands find your hips — you don't pull away. The beat takes over.</p>
<<modStat "mood" 10 "Dancing">>
<<addXP "dance" 10>>
<<modRep "popular" 1>>
<<else>>
<p>You try to dance but the floor is too crowded and sticky. Someone steps on your foot. You mostly sway in place.</p>
<<addXP "dance" 5>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to the party</span>' "FratParty">><</link>>
</div><h2>🏓 Beer Pong</h2>
<<showDrunkStatus>>
<p>A crowd gathers around the beer pong table. Someone challenges you.</p>
<<set _composureResult = XCLC.Roll.doCheck("composure", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _composureResult === "crit_success" || _composureResult === "success">>
<p>You sink cup after cup. The crowd chants your name. Your opponent looks devastated. You're the beer pong queen.</p>
<<modStat "confidence" 5 "Beer pong champion">>
<<modRep "popular" 2>>
<<modRep "partyGirl" 2>>
<<else>>
<p>You miss every shot. You have to drink the penalty cups. The crowd laughs good-naturedly.</p>
<<set $substances.drinksToday += 2>>
<<checkDrunkState>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to the party</span>' "FratParty">><</link>>
</div>
/* ═══════════════════════════════════════════════════
FRAT PARTY GANGBANG
═══════════════════════════════════════════════════ */<h2>🔥 Upstairs</h2>
<<showDrunkStatus>>
<<set _numGuys = random(2, 5)>>
<<set $temp.gangbangGuys = _numGuys>>
<<set $temp.gangbangRound = 0>>
<<set $temp.gangbangCompleted = 0>>
<p><<if $substances.drunkLevel >= 3>>Everything's blurry. A group of guys — <<print _numGuys>> of them? Maybe? — guide you upstairs. A bedroom door opens. "Come on, it'll be fun."<<else>><<print _numGuys>> guys. A bedroom. They look at you with obvious intent. <<if $reputation.slut >= 40>>Your reputation precedes you — they know what you're about.<<else>>One of them asks, "You sure about this?"<</if>><</if>></p>
<p><<if _numGuys >= 4>>This is a lot. Even for you.<<elseif _numGuys >= 3>>Three guys. Your mouth goes dry.<<else>>Two guys. Manageable.<</if>></p>
<div class="choice-group">
<<link '<span class="choice-btn">🔥 Let's do this</span>' "FratParty_Gangbang_Act">><</link>>
<<link '<span class="choice-btn">😰 Actually, no</span>' "FratParty">>
<<if $substances.drunkLevel < 3>>
/* Can refuse if not wasted */
<<else>>
<<run XCLC.Toast.show("⚠️ You're too wasted to say no convincingly...", "warning")>>
<</if>>
<</link>>
</div><h2>🔥 Round <<print $temp.gangbangRound + 1>></h2>
<<showDrunkStatus>>
<<set $temp.gangbangRound++>>
<<set _round = $temp.gangbangRound>>
<<set _totalGuys = $temp.gangbangGuys>>
/* DC increases each round */
<<set _dc = 3 + _round>>
<<set _staminaResult = XCLC.Roll.doCheck("stamina", _dc)>>
<<run XCLC.DicePopup.show()>>
<<if _staminaResult === "crit_success" || _staminaResult === "success">>
<<set $temp.gangbangCompleted++>>
<p><<if _round === 1>>The first guy pushes you onto the bed. It's rough, fast, intense. You take it — <<if $transformation.sideEffects.wet>>your enhanced wetness helps<<else>>gritting your teeth through the initial shock<</if>>. He finishes with a grunt.<<elseif _round === 2>>The second one is bigger. Harder. Your body is already sore but adrenaline carries you. <<if $transformation.sideEffects.sensitive>>Every nerve ending is on fire — it's almost too much.<</if>><<elseif _round === 3>>Number three. You're exhausted. Sweat-soaked. But you're still going. Something primal has taken over.<<elseif _round === 4>>Four. Your legs are shaking. You're running on willpower alone. The room is spinning.<<else>>Five. You barely know where you are anymore. It's pure endurance. Survival. Some twisted badge of honour.<</if>></p>
<<addXP "stamina" 10>>
<<modStat "arousal" 15 "Gangbang round">>
<<else>>
<p><<if _round <= 2>>It's too much. Your body gives out. You push him off, gasping.<<else>>Your arms buckle. You collapse onto the mattress. "Done... I'm done," you manage.<</if>></p>
<<modStat "energy" -10 "Overwhelmed">>
<</if>>
/* Check if more rounds or done */
<<if $temp.gangbangCompleted < _totalGuys && (_staminaResult === "crit_success" || _staminaResult === "success")>>
<div class="choice-group">
<<link '<span class="choice-btn">💪 Next round</span>' "FratParty_Gangbang_Act">><</link>>
<<link '<span class="choice-btn">✋ Tap out</span>' "FratParty_Gangbang_End">><</link>>
</div>
<<else>>
<<goto "FratParty_Gangbang_End">>
<</if>><h2>🔥 Aftermath</h2>
<<set _completed = $temp.gangbangCompleted>>
<<set _total = $temp.gangbangGuys>>
<<set _allRounds = (_completed >= _total)>>
<p><<if _allRounds>>You did it. All <<print _total>>. You lie on the ruined bedsheets, chest heaving, body wrecked. <<if $substances.drunkLevel >= 3>>The details are already fuzzy. Did that really just happen?<<else>>You stare at the ceiling. That just happened.<</if>><<else>>You tapped out after <<print _completed>> of <<print _total>>. <<if _completed >= 2>>Not bad, all things considered.<<else>>It was too much.<</if>><</if>></p>
/* Apply consequences */
<<modHygiene -40 "Gangbang">>
<<modStat "arousal" 50 "Gangbang">>
<<modStat "energy" (_completed * -10) "Exhaustion">>
<<if _allRounds>>
<<addXP "stamina" 30>>
<<addXP "oral" 15>>
<<modStat "confidence" 10 "Completed gangbang">>
<<modRep "slut" 10>>
<<else>>
<<addXP "stamina" (_completed * 8)>>
<<modStat "confidence" -3 "Tapped out">>
<<modRep "slut" (_completed * 3)>>
<</if>>
/* Filming chance */
<<set _filmed = random(1, 10) <= ($substances.drunkLevel >= 3 ? 4 : 2)>>
<<if _filmed>>
<p><em>Someone had their phone out. You're pretty sure you saw a flash...</em></p>
<<modRep "slut" 15>>
<<run XCLC.Toast.show("📱 Someone might have filmed that...", "warning")>>
<</if>>
/* Service credit */
<<if _completed >= 2>>
<p><em>+<<print Math.min(3, _completed)>> service credits applied to your quota.</em></p>
<<set $scholarship.currentWeekServiced += Math.min(3, _completed)>>
<<set $scholarship.totalServiced += Math.min(3, _completed)>>
<</if>>
<<advanceTime 60>>
<div class="choice-group">
<<link '<span class="choice-btn">🚿 Clean up and leave</span>' "FratParty">>
<<modHygiene 10 "Quick cleanup">>
<</link>>
</div>
/* ═══════════════════════════════════════════════════
STUDENT CENTER
═══════════════════════════════════════════════════ */<h2>🎭 Student Center</h2>
<p>The student center is the social heart of campus. Cork boards covered in flyers, a lounge with worn couches, vending machines humming in the corner, and the muffled sounds of club meetings behind closed doors.</p>
<<if $world.dayOfWeek === 0>>
<p>It's quiet on Sunday. A few students study in the lounge.</p>
<<elseif $world.dayOfWeek >= 4>>
<p>It's buzzing today. Students cluster around the events board, debating weekend plans.</p>
<<else>>
<p>A steady stream of students passes through between classes.</p>
<</if>>
<<divider "Activities">>
<div class="choice-group">
<<link '<span class="choice-btn">📋 Events Board</span>' "EventsBoard">><</link>>
<<link '<span class="choice-btn">🛋️ Hang out in the lounge</span>' "StudentCenter_Lounge">>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">🎭 Club Rooms</span>' "StudentCenter_Club">><</link>>
<<link '<span class="choice-btn">🍫 Vending Machines</span>' "StudentCenter_Vending">><</link>>
<<divider "">>
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>📋 Events Board</h2>
<<set _weekNum = Math.floor($world.day / 7) + 1>>
<<set _events = [
{name: "📖 Study Group — Library", desc: "Collaborative studying with other students.", skill: "studying", xp: 15, rep: "goodStudent", repVal: 2},
{name: "🎬 Movie Night — Auditorium", desc: "Free popcorn and a classic film.", skill: "composure", xp: 5, rep: "popular", repVal: 2},
{name: "🎤 Open Mic Night", desc: "Poetry, music, comedy. Brave souls only.", skill: "charm", xp: 15, rep: "popular", repVal: 3},
{name: "🎪 Club Fair", desc: "All campus clubs recruiting new members.", skill: "charm", xp: 10, rep: "popular", repVal: 2},
{name: "🧁 Charity Bake Sale", desc: "Buy cupcakes, support a cause.", skill: "charm", xp: 5, rep: "sweetheart", repVal: 3},
{name: "🧘 Free Yoga Class", desc: "Destress and stretch. Mat provided.", skill: "stamina", xp: 10, rep: "popular", repVal: 1},
{name: "🎤 Karaoke Night", desc: "Embarrass yourself for fun.", skill: "composure", xp: 15, rep: "partyGirl", repVal: 2}
]>>
/* Pick 3 based on week */
<<set _e1 = _events[_weekNum % _events.length]>>
<<set _e2 = _events[(_weekNum + 2) % _events.length]>>
<<set _e3 = _events[(_weekNum + 4) % _events.length]>>
<p>This week's events:</p>
<div class="card">
<div class="card__title"><<print _e1.name>></div>
<p><<print _e1.desc>></p>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Attend (2 hours)</span>' "StudentCenter">>
<<advanceTime 120>>
<<addXP _e1.skill _e1.xp>>
<<modRep _e1.rep _e1.repVal>>
<<modStat "mood" 5 "Social event">>
<<set $social.eventsAttended++>>
<<run XCLC.Toast.show("🎉 Attended " + _e1.name, "info")>>
<</link>>
</div>
</div>
<div class="card">
<div class="card__title"><<print _e2.name>></div>
<p><<print _e2.desc>></p>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Attend (2 hours)</span>' "StudentCenter">>
<<advanceTime 120>>
<<addXP _e2.skill _e2.xp>>
<<modRep _e2.rep _e2.repVal>>
<<modStat "mood" 5 "Social event">>
<<set $social.eventsAttended++>>
<<run XCLC.Toast.show("🎉 Attended " + _e2.name, "info")>>
<</link>>
</div>
</div>
<div class="card">
<div class="card__title"><<print _e3.name>></div>
<p><<print _e3.desc>></p>
<div class="choice-group">
<<link '<span class="choice-btn">✅ Attend (2 hours)</span>' "StudentCenter">>
<<advanceTime 120>>
<<addXP _e3.skill _e3.xp>>
<<modRep _e3.rep _e3.repVal>>
<<modStat "mood" 5 "Social event">>
<<set $social.eventsAttended++>>
<<run XCLC.Toast.show("🎉 Attended " + _e3.name, "info")>>
<</link>>
</div>
</div>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to Student Center</span>' "StudentCenter">><</link>>
</div><h2>🛋️ The Lounge</h2>
<<set _encounter = random(1, 10)>>
<<if _encounter <= 3>>
<<set _loungeNPC = XCLC.NPC.generate({gender: random(1,10) <= 5 ? "male" : "female", type: "student"})>>
<p>A <<print _loungeNPC.bodyType>> <<if _loungeNPC.gender === "male">>guy<<else>>girl<</if>> with <<print _loungeNPC.hairColour>> hair is sitting alone, scrolling their phone. They look up as you sit down.</p>
<p>"Hey. You look bored too." They smile. You end up chatting for a while about classes, campus drama, and questionable cafeteria food.</p>
<<addXP "charm" 8>>
<<modStat "mood" 5 "Good conversation">>
<<modRep "popular" 1>>
<<elseif _encounter <= 5>>
<p>A few students are debating something heated — politics? Philosophy? You catch fragments. "No, that's EXACTLY why—" "You're wrong and here's why—"</p>
<p>You settle into a couch and people-watch. It's oddly relaxing.</p>
<<modStat "mood" 3 "People watching">>
<<else>>
<p>The lounge is mostly empty. You sink into a couch, close your eyes for a moment, and just... breathe. Campus life is exhausting.</p>
<<modStat "stress" -5 "Quiet moment">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to Student Center</span>' "StudentCenter">><</link>>
</div><h2>🎭 Club Rooms</h2>
<p>Doors line the hallway, each with a hand-made sign. Some are meeting now, others are quiet.</p>
<<set _clubs = [
{id: "drama", name: "🎭 Drama Club", desc: "Acting, improv, semester play. Trains composure and charm.", skill1: "composure", skill2: "charm"},
{id: "debate", name: "🗣️ Debate Society", desc: "Argue about everything. Trains persuasion and intelligence.", skill1: "persuasion", skill2: "intelligence"},
{id: "art", name: "🎨 Art Club", desc: "Painting, sketching, creative expression. Reduces stress.", skill1: "composure", skill2: null},
{id: "gaming", name: "🎮 Gaming Club", desc: "Board games, video games, social gaming. Fun but unproductive.", skill1: null, skill2: null}
]>>
<<for _i = 0; _i < _clubs.length; _i++>>
<<set _c = _clubs[_i]>>
<<set _isMember = $social.clubsMember.includes(_c.id)>>
<div class="card">
<div class="card__title"><<print _c.name>> <<if _isMember>>✅ Member<</if>></div>
<p><<print _c.desc>></p>
<div class="choice-group">
<<if _isMember>>
<<link '<span class="choice-btn">📅 Attend meeting (1.5 hrs)</span>' "StudentCenter">>
<<advanceTime 90>>
<<if _c.skill1>><<addXP _c.skill1 10>><</if>>
<<if _c.skill2>><<addXP _c.skill2 5>><</if>>
<<modStat "mood" 5 "Club meeting">>
<<modRep "popular" 1>>
<<run XCLC.Toast.show("🎭 Good club meeting!", "info")>>
<</link>>
<<else>>
<<link '<span class="choice-btn">✋ Join this club</span>' "StudentCenter_Club">>
<<run $social.clubsMember.push(_c.id)>>
<<run XCLC.Toast.show("🎉 Joined " + _c.name + "!", "info")>>
<<modRep "popular" 2>>
<</link>>
<</if>>
</div>
</div>
<</for>>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to Student Center</span>' "StudentCenter">><</link>>
</div><h2>🍫 Vending Machines</h2>
<p>Two vending machines hum against the wall. One for snacks, one for drinks.</p>
<div class="choice-group">
<<if $finance.money >= 2>>
<<link '<span class="choice-btn">🍫 Candy bar ($2)</span>' "StudentCenter">>
<<set $finance.money -= 2>>
<<modStat "energy" 10 "Sugar rush">>
<<run XCLC.Toast.show("🍫 Sugar rush! +10 energy", "info")>>
<</link>>
<</if>>
<<if $finance.money >= 2>>
<<link '<span class="choice-btn">☕ Coffee ($2)</span>' "StudentCenter">>
<<set $finance.money -= 2>>
<<modStat "energy" 15 "Caffeine">>
<<run XCLC.Toast.show("☕ Caffeine boost! +15 energy", "info")>>
<</link>>
<</if>>
<<if $finance.money >= 3>>
<<link '<span class="choice-btn">🥤 Energy drink ($3)</span>' "StudentCenter">>
<<set $finance.money -= 3>>
<<modStat "energy" 25 "Energy drink">>
<<run XCLC.Toast.show("🥤 ENERGY! +25 energy", "info")>>
<</link>>
<</if>>
<<if $finance.money < 2>>
<p><em>You can't afford anything. Check the couch cushions?</em></p>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back to Student Center</span>' "StudentCenter">><</link>>
</div>/* ═══════════════════════════════════════════════════
THORNFIELD — JOB SYSTEM WIDGETS
═══════════════════════════════════════════════════ */
/* ─── Check if player can take a new job ─── */
<<widget "canHireCheck">>
<<if $jobs.current.length >= 3>>
<<run XCLC.Toast.show("❌ You already have 3 jobs. Quit one first.", "error")>>
<<set _canHire = false>>
<<else>>
<<set _canHire = true>>
<</if>>
<</widget>>
/* ─── Activate a job ─── */
<<widget "hireJob">>
<<set _jobId = _args[0]>>
<<set $jobs[_jobId].active = true>>
<<run $jobs.current.push(_jobId)>>
<<run XCLC.Toast.show("🎉 You got the job!", "info")>>
<</widget>>
/* ─── Quit a job ─── */
<<widget "quitJob">>
<<set _jobId = _args[0]>>
<<set $jobs[_jobId].active = false>>
<<set $jobs.current = $jobs.current.filter(function(j) { return j !== _jobId; })>>
<<run XCLC.Toast.show("👋 You quit your " + _jobId + " job.", "info")>>
<</widget>>
/* ─── Pay the player ─── */
<<widget "payPlayer">>
<<set _amount = _args[0] || 0>>
<<set _reason = _args[1] || "Work">>
<<set $finance.money += _amount>>
<<set $finance.totalEarned += _amount>>
<<run XCLC.Toast.show("💰 +$" + _amount + " (" + _reason + ")", "info")>>
<</widget>>/* ═══════════════════════════════════════════════════
JOB BOARD — Central hub for all employment
═══════════════════════════════════════════════════ */
<h2>💼 Job Board</h2>
<p>Your employment status. You can hold up to <strong>3 jobs</strong> at once.</p>
<<if $jobs.current.length > 0>>
<div class="card">
<div class="card__title">📋 Active Jobs (<<print $jobs.current.length>>/3)</div>
<<for _i = 0; _i < $jobs.current.length; _i++>>
<<set _jid = $jobs.current[_i]>>
<<set _names = {barista: "☕ Barista", bartender: "🍸 Bartender", tutor: "📚 Tutor", cheerleader: "📣 Cheerleader", camGirl: "📷 Cam Girl", fansOnly: "💰 FansOnly", stripper: "💃 Stripper", hooker: "💋 Escort", dealer: "🧪 Dealer"}>>
<p><<print _names[_jid] || _jid>> — <<print $jobs[_jid].shifts || $jobs[_jid].shows || $jobs[_jid].sessions || $jobs[_jid].clients || $jobs[_jid].posts || 0>> sessions
<<link '<span class="choice-btn choice-btn--small">❌ Quit</span>' "JobBoard">><<quitJob _jid>><</link>>
</p>
<</for>>
</div>
<</if>>
<<divider "Available Positions">>
<<set _period = XCLC.Time.getPeriod($world.time)>>
/* === Non-Sexual Jobs === */
<div class="card">
<div class="card__title">🏢 Regular Employment</div>
<div class="choice-group">
<<if $jobs.barista.active>>
<<if _period === "early_morning" || _period === "morning" || _period === "afternoon">>
<<link '<span class="choice-btn">☕ Work a barista shift</span>' "Job_Barista_Shift">><</link>>
<<else>>
<p><em>☕ Barista — Café is closed (morning/afternoon only)</em></p>
<</if>>
<<else>>
<<link '<span class="choice-btn">☕ Apply: Barista — Bean There, Done That Café</span>' "Job_Barista_Apply">><</link>>
<</if>>
<<if $jobs.bartender.active>>
<<if _period === "evening" || _period === "night" || _period === "late_night">>
<<link '<span class="choice-btn">🍸 Work a bartender shift</span>' "Job_Bartender_Shift">><</link>>
<<else>>
<p><em>🍸 Bartender — Bar is closed (evening/night only)</em></p>
<</if>>
<<else>>
<<if $skills.charm.level >= 3>>
<<link '<span class="choice-btn">🍸 Apply: Bartender — Bar District</span>' "Job_Bartender_Apply">><</link>>
<<else>>
<p><em>🍸 Bartender — Requires Charm ≥ 3</em></p>
<</if>>
<</if>>
<<if $jobs.tutor.active>>
<<if _period === "afternoon">>
<<link '<span class="choice-btn">📚 Run a tutoring session</span>' "Job_Tutor_Session">><</link>>
<<else>>
<p><em>📚 Tutor — Learning center is afternoon only</em></p>
<</if>>
<<else>>
<<if $skills.intelligence.level >= 4 && $skills.studying.level >= 3>>
<<link '<span class="choice-btn">📚 Apply: Campus Tutor</span>' "Job_Tutor_Apply">><</link>>
<<else>>
<p><em>📚 Tutor — Requires Intelligence ≥ 4, Studying ≥ 3</em></p>
<</if>>
<</if>>
</div>
</div>
/* === Performance Jobs === */
<div class="card">
<div class="card__title">🎭 Performance & Content</div>
<div class="choice-group">
<<if $jobs.cheerleader.active>>
<<link '<span class="choice-btn">📣 Cheerleader Schedule</span>' "Job_Cheer_Hub">><</link>>
<<else>>
<<if $skills.dance.level >= 2 && $skills.stamina.level >= 2>>
<<link '<span class="choice-btn">📣 Try out: Thornfield Wildcats Cheerleading</span>' "Job_Cheer_Tryout">><</link>>
<<else>>
<p><em>📣 Cheerleader — Requires Dance ≥ 2, Stamina ≥ 2</em></p>
<</if>>
<</if>>
<<if $jobs.camGirl.active>>
<<if $inventory.hasLaptop && $inventory.hasWebcam>>
<<link '<span class="choice-btn">📷 Start a cam show</span>' "Job_Cam_Start">><</link>>
<<else>>
<p><em>📷 Cam Girl — Need laptop + webcam (Electronics Store)</em></p>
<</if>>
<<else>>
<<if $inventory.hasLaptop && $inventory.hasWebcam>>
<<link '<span class="choice-btn">📷 Set up: Cam Girl account</span>' "Job_Cam_Apply">><</link>>
<<else>>
<p><em>📷 Cam Girl — Need laptop + webcam (Electronics Store)</em></p>
<</if>>
<</if>>
<<if $jobs.fansOnly.active>>
<<link '<span class="choice-btn">💰 Create FansOnly content</span>' "Job_FansOnly_Hub">><</link>>
<<else>>
<<if $inventory.hasCamera>>
<<link '<span class="choice-btn">💰 Set up: FansOnly account</span>' "Job_FansOnly_Apply">><</link>>
<<else>>
<p><em>💰 FansOnly — Need camera (Electronics Store)</em></p>
<</if>>
<</if>>
<<if $jobs.stripper.active>>
<<if _period === "evening" || _period === "night" || _period === "late_night">>
<<link '<span class="choice-btn">💃 Work a stripper shift</span>' "Job_Stripper_Shift">><</link>>
<<else>>
<p><em>💃 Stripper — Club opens in the evening</em></p>
<</if>>
<<else>>
<<if $skills.dance.level >= 2>>
<<link '<span class="choice-btn">💃 Apply: Candy Bar dancer</span>' "Job_Stripper_Apply">><</link>>
<<else>>
<p><em>💃 Stripper — Requires Dance ≥ 2</em></p>
<</if>>
<</if>>
</div>
</div>
/* === Criminal Jobs === */
<div class="card">
<div class="card__title">⚠️ Underground</div>
<div class="choice-group">
<<if $jobs.hooker.active>>
<<if _period === "night" || _period === "late_night">>
<<link '<span class="choice-btn">💋 Walk the street</span>' "Job_Hooker_Street">><</link>>
<</if>>
<<if $jobs.hooker.phoneUnlocked && (_period === "evening" || _period === "night")>>
<<link '<span class="choice-btn">📱 Check for phone clients</span>' "Job_Hooker_Phone">><</link>>
<</if>>
<<if _period !== "night" && _period !== "late_night" && _period !== "evening">>
<p><em>💋 Escort — Night work only</em></p>
<</if>>
<<else>>
<<link '<span class="choice-btn">💋 Start: Street walking</span>' "Job_Hooker_Apply">><</link>>
<</if>>
<<if $jobs.dealer.active>>
<<link '<span class="choice-btn">🧪 Deal drugs</span>' "Job_Dealer_Hub">><</link>>
<<else>>
<<link '<span class="choice-btn">🧪 Start: Drug dealing</span>' "Job_Dealer_Apply">><</link>>
<</if>>
</div>
</div>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
☕ BARISTA — Bean There, Done That Café
With coffee-making minigame
═══════════════════════════════════════════════════ */<h2>☕ Bean There, Done That Café</h2>
<p>A cozy campus café with exposed brick, chalkboard menus, and the constant hiss of an espresso machine. The manager, a cheerful woman named Rosa, looks you up and down.</p>
<p>"You ever made coffee before? Doesn't matter. I'll train you. Minimum wage plus tips. Shifts are mornings and afternoons, three hours each. You in?"</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">☕ Take the job</span>' "JobBoard">>
<<hireJob "barista">>
<<run XCLC.Toast.show("☕ Rosa hands you an apron. 'Don't burn the milk.'", "info")>>
<</link>>
<<link '<span class="choice-btn">🚫 Not right now</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>☕ Barista Shift</h2>
<<advanceTime 180>>
<<set $jobs.barista.shifts++>>
<p>You tie your apron and take your place behind the counter. The morning rush is starting.</p>
/* Coffee Minigame — 3 customers */
<<set $temp.coffeeScore = 0>>
<<set $temp.coffeeRound = 0>>
<<set $temp.coffeeTotalRounds = 3>>
<<goto "Job_Barista_Order">><<set $temp.coffeeRound++>>
<<set _round = $temp.coffeeRound>>
/* Generate a random order */
<<set _orders = [
{name: "Latte", steps: ["espresso", "steam", "pour"], desc: "a latte"},
{name: "Cappuccino", steps: ["espresso", "foam", "dust"], desc: "a cappuccino"},
{name: "Americano", steps: ["espresso", "water", "stir"], desc: "an americano"},
{name: "Mocha", steps: ["espresso", "chocolate", "steam"], desc: "a mocha"},
{name: "Flat White", steps: ["espresso", "microfoam", "pour"], desc: "a flat white"},
{name: "Espresso Shot", steps: ["grind", "tamp", "pull"], desc: "a double espresso"}
]>>
<<set _order = _orders[random(0, _orders.length - 1)]>>
<<set $temp.currentOrder = _order>>
<<set $temp.coffeeStep = 0>>
<h3>☕ Customer <<print _round>> of <<print $temp.coffeeTotalRounds>></h3>
<<set _customerDescs = ["A sleepy professor", "A frantic student with three textbooks", "A woman in gym clothes", "A guy on his phone who won't make eye contact", "A chatty girl with too much energy", "An impatient businessman"]>>
<p><<print _customerDescs[random(0, _customerDescs.length - 1)]>> orders <strong><<print _order.desc>></strong>.</p>
<<divider "Make the " + _order.name>>
<p><em>Pick the right steps in order:</em></p>
<<goto "Job_Barista_Step">><<set $temp.coffeeStep++>>
<<set _step = $temp.coffeeStep>>
<<set _order = $temp.currentOrder>>
<<set _correctStep = _order.steps[_step - 1]>>
<<set _totalSteps = _order.steps.length>>
<p><strong>Step <<print _step>> of <<print _totalSteps>>:</strong></p>
/* Shuffle options — correct + 2 wrong */
<<set _allOptions = ["espresso", "steam", "pour", "foam", "dust", "water", "stir", "chocolate", "microfoam", "grind", "tamp", "pull"]>>
<<set _wrong = _allOptions.filter(function(o) { return o !== _correctStep; })>>
/* Shuffle wrong options */
<<set _w1 = _wrong[random(0, _wrong.length - 1)]>>
<<set _wrong = _wrong.filter(function(o) { return o !== _w1; })>>
<<set _w2 = _wrong[random(0, _wrong.length - 1)]>>
/* Build choice array and shuffle */
<<set _choices = [_correctStep, _w1, _w2]>>
<<set _choices = _choices.sort(function() { return Math.random() - 0.5; })>>
/* Display name mapping */
<<set _displayNames = {espresso: "☕ Pull espresso shot", steam: "🌡️ Steam the milk", pour: "🥛 Pour milk", foam: "☁️ Froth the milk (thick foam)", dust: "🍫 Dust with cocoa", water: "💧 Add hot water", stir: "🥄 Stir", chocolate: "🍫 Add chocolate syrup", microfoam: "☁️ Microfoam the milk", grind: "⚙️ Grind the beans", tamp: "👊 Tamp the portafilter", pull: "☕ Pull the shot"}>>
<div class="choice-group">
<<for _c = 0; _c < _choices.length; _c++>>
<<capture _choices[_c]>>
<<link '<span class="choice-btn"><<print _displayNames[_choices[_c]]>></span>' "Job_Barista_StepResult">>
<<set $temp.coffeeChoice = _choices[_c]>>
<</link>>
<</capture>>
<</for>>
</div><<set _choice = $temp.coffeeChoice>>
<<set _order = $temp.currentOrder>>
<<set _step = $temp.coffeeStep>>
<<set _correct = _order.steps[_step - 1]>>
<<if _choice === _correct>>
<p>✅ <strong>Correct!</strong> <<if _step === 1>>Perfect start.<<elseif _step === 2>>Looking good.<<else>>Nailed it.<</if>></p>
<<set $temp.coffeeScore++>>
<<else>>
<<set _displayNames = {espresso: "Pull espresso shot", steam: "Steam the milk", pour: "Pour milk", foam: "Froth the milk", dust: "Dust with cocoa", water: "Add hot water", stir: "Stir", chocolate: "Add chocolate syrup", microfoam: "Microfoam the milk", grind: "Grind the beans", tamp: "Tamp the portafilter", pull: "Pull the shot"}>>
<p>❌ <strong>Wrong!</strong> You should have: <<print _displayNames[_correct]>>. <<if _step === 1>>The customer sighs.<<elseif _step === 2>>You try to recover.<<else>>The drink looks... off.<</if>></p>
<</if>>
/* More steps or next customer? */
<<if _step < _order.steps.length>>
<<goto "Job_Barista_Step">>
<<elseif $temp.coffeeRound < $temp.coffeeTotalRounds>>
<div class="choice-group">
<<link '<span class="choice-btn">☕ Next customer</span>' "Job_Barista_Order">><</link>>
</div>
<<else>>
<<goto "Job_Barista_Results">>
<</if>><h2>☕ Shift Results</h2>
<<set _score = $temp.coffeeScore>>
<<set _maxScore = 9>>
<<set _pct = Math.round((_score / _maxScore) * 100)>>
<<set _basePay = 25 + ($jobs.barista.tier * 5)>>
<<set _tipMultiplier = _pct / 100>>
<<set _tips = Math.round(20 * _tipMultiplier)>>
<<set _total = _basePay + _tips>>
<<set $jobs.barista.tips += _tips>>
<div class="card">
<div class="card__title">💰 Shift Complete</div>
<p><strong>Orders correct:</strong> <<print _score>>/<<print _maxScore>> steps (<<print _pct>>%)</p>
<p><strong>Base pay:</strong> $<<print _basePay>></p>
<p><strong>Tips:</strong> $<<print _tips>></p>
<p><strong>Total:</strong> $<<print _total>></p>
</div>
<<payPlayer _total "Barista shift">>
<<addXP "charm" 10>>
<<addXP "composure" 5>>
/* Progression check */
<<if $jobs.barista.shifts >= 25 && $jobs.barista.tier < 2>>
<<set $jobs.barista.tier = 2>>
<<run XCLC.Toast.show("⭐ Promoted to Shift Lead! +$10/shift", "info")>>
<<elseif $jobs.barista.shifts >= 10 && $jobs.barista.tier < 1>>
<<set $jobs.barista.tier = 1>>
<<run XCLC.Toast.show("⭐ Promoted to Senior Barista! +$5/shift", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🍸 BARTENDER — Bar District
With cocktail-making minigame
═══════════════════════════════════════════════════ */<h2>🍸 Bartender Position</h2>
<p>The Rusty Nail's manager, a grizzled man named Frank, squints at you. "Can you pour drinks without spilling? Can you handle drunks?" He slides a cocktail recipe book across the bar.</p>
<p>"Evening shifts, four hours. Forty bucks base plus whatever you charm out of tips. Deal?"</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">🍸 Take the job</span>' "JobBoard">>
<<hireJob "bartender">>
<<run XCLC.Toast.show("🍸 Frank tosses you a bar towel. 'Don't fuck up the martinis.'", "info")>>
<</link>>
<<link '<span class="choice-btn">🚫 Not right now</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>🍸 Bartender Shift</h2>
<<advanceTime 240>>
<<set $jobs.bartender.shifts++>>
<p>You step behind the bar. The neon signs glow. Music thumps. Time to make drinks.</p>
/* Cocktail Minigame — 3 customers */
<<set $temp.cocktailScore = 0>>
<<set $temp.cocktailRound = 0>>
<<set $temp.cocktailTotalRounds = 3>>
<<goto "Job_Bartender_Order">><<set $temp.cocktailRound++>>
<<set _round = $temp.cocktailRound>>
<<set _cocktails = [
{name: "Margarita", ingredients: ["tequila", "lime", "salt"], desc: "a margarita"},
{name: "Mojito", ingredients: ["rum", "mint", "lime"], desc: "a mojito"},
{name: "Martini", ingredients: ["gin", "vermouth", "olive"], desc: "a dry martini"},
{name: "Old Fashioned", ingredients: ["bourbon", "bitters", "sugar"], desc: "an old fashioned"},
{name: "Cosmopolitan", ingredients: ["vodka", "cranberry", "lime"], desc: "a cosmopolitan"},
{name: "Long Island", ingredients: ["vodka", "rum", "tequila"], desc: "a Long Island iced tea"},
{name: "Whiskey Sour", ingredients: ["whiskey", "lemon", "sugar"], desc: "a whiskey sour"},
{name: "Daiquiri", ingredients: ["rum", "lime", "sugar"], desc: "a daiquiri"}
]>>
<<set _cocktail = _cocktails[random(0, _cocktails.length - 1)]>>
<<set $temp.currentCocktail = _cocktail>>
<<set $temp.cocktailStep = 0>>
<h3>🍸 Customer <<print _round>> of <<print $temp.cocktailTotalRounds>></h3>
<<set _custDescs = ["A woman in a little black dress", "A burly guy with tattoos", "Two girls celebrating a birthday", "A nervous first-date couple", "A regular who's already three deep", "A professor who clearly doesn't want to be recognized"]>>
<p><<print _custDescs[random(0, _custDescs.length - 1)]>> orders <strong><<print _cocktail.desc>></strong>.</p>
<<divider "Mix the " + _cocktail.name>>
<p><em>Pick the right ingredients in order:</em></p>
<<goto "Job_Bartender_Step">><<set $temp.cocktailStep++>>
<<set _step = $temp.cocktailStep>>
<<set _cocktail = $temp.currentCocktail>>
<<set _correct = _cocktail.ingredients[_step - 1]>>
<<set _total = _cocktail.ingredients.length>>
<p><strong>Ingredient <<print _step>> of <<print _total>>:</strong></p>
<<set _allIngredients = ["tequila", "lime", "salt", "rum", "mint", "gin", "vermouth", "olive", "bourbon", "bitters", "sugar", "vodka", "cranberry", "whiskey", "lemon"]>>
<<set _wrong = _allIngredients.filter(function(o) { return o !== _correct; })>>
<<set _w1 = _wrong[random(0, _wrong.length - 1)]>>
<<set _wrong = _wrong.filter(function(o) { return o !== _w1; })>>
<<set _w2 = _wrong[random(0, _wrong.length - 1)]>>
<<set _choices = [_correct, _w1, _w2]>>
<<set _choices = _choices.sort(function() { return Math.random() - 0.5; })>>
<<set _displayNames = {tequila: "🥃 Tequila", lime: "🍋 Lime juice", salt: "🧂 Salt rim", rum: "🍹 White rum", mint: "🌿 Fresh mint", gin: "🍸 Gin", vermouth: "🍷 Dry vermouth", olive: "🫒 Olive garnish", bourbon: "🥃 Bourbon", bitters: "💧 Angostura bitters", sugar: "🍬 Sugar syrup", vodka: "🍸 Vodka", cranberry: "🍒 Cranberry juice", whiskey: "🥃 Whiskey", lemon: "🍋 Lemon juice"}>>
<div class="choice-group">
<<for _c = 0; _c < _choices.length; _c++>>
<<capture _choices[_c]>>
<<link '<span class="choice-btn"><<print _displayNames[_choices[_c]]>></span>' "Job_Bartender_StepResult">>
<<set $temp.cocktailChoice = _choices[_c]>>
<</link>>
<</capture>>
<</for>>
</div><<set _choice = $temp.cocktailChoice>>
<<set _cocktail = $temp.currentCocktail>>
<<set _step = $temp.cocktailStep>>
<<set _correct = _cocktail.ingredients[_step - 1]>>
<<if _choice === _correct>>
<p>✅ <strong>Correct!</strong> <<if _step === 1>>Good base.<<elseif _step === 2>>Mix it in.<<else>>Perfect finish.<</if>></p>
<<set $temp.cocktailScore++>>
<<else>>
<<set _displayNames = {tequila: "Tequila", lime: "Lime juice", salt: "Salt rim", rum: "White rum", mint: "Fresh mint", gin: "Gin", vermouth: "Dry vermouth", olive: "Olive garnish", bourbon: "Bourbon", bitters: "Angostura bitters", sugar: "Sugar syrup", vodka: "Vodka", cranberry: "Cranberry juice", whiskey: "Whiskey", lemon: "Lemon juice"}>>
<p>❌ <strong>Wrong!</strong> Should have been: <<print _displayNames[_correct]>>. The customer frowns.</p>
<</if>>
<<if _step < _cocktail.ingredients.length>>
<<goto "Job_Bartender_Step">>
<<elseif $temp.cocktailRound < $temp.cocktailTotalRounds>>
<div class="choice-group">
<<link '<span class="choice-btn">🍸 Next customer</span>' "Job_Bartender_Order">><</link>>
</div>
<<else>>
<<goto "Job_Bartender_Results">>
<</if>><h2>🍸 Shift Results</h2>
<<set _score = $temp.cocktailScore>>
<<set _maxScore = 9>>
<<set _pct = Math.round((_score / _maxScore) * 100)>>
<<set _basePay = 40 + ($jobs.bartender.tier * 15)>>
<<set _tips = Math.round(40 * (_pct / 100))>>
<<set _total = _basePay + _tips>>
<<set $jobs.bartender.tips += _tips>>
/* Bartender event */
<<set _event = random(1, 10)>>
<<if _event <= 2>>
<p>A drunk guy refused to leave. You had to handle it with composure.</p>
<<set _composure = XCLC.Roll.doCheck("composure", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _composure === "crit_success" || _composure === "success">>
<p>You talked him down smoothly. Frank nodded approvingly. <em>Bonus $20.</em></p>
<<set _total += 20>>
<<else>>
<p>It got messy. Frank had to step in. Awkward.</p>
<<modStat "stress" 5 "Bar fight">>
<</if>>
<<elseif _event === 3>>
<p>A VIP dropped a $50 tip just for being pretty. Lucky night.</p>
<<set _total += 50>>
<</if>>
<<set $substances.alcoholTolerance = Math.min(10, $substances.alcoholTolerance + 0.2)>>
<div class="card">
<div class="card__title">💰 Shift Complete</div>
<p><strong>Cocktails correct:</strong> <<print _score>>/<<print _maxScore>> ingredients (<<print _pct>>%)</p>
<p><strong>Base pay:</strong> $<<print _basePay>></p>
<p><strong>Tips:</strong> $<<print _tips>></p>
<p><strong>Total:</strong> $<<print _total>></p>
</div>
<<payPlayer _total "Bartender shift">>
<<addXP "charm" 12>>
<<addXP "persuasion" 8>>
<<if $jobs.bartender.shifts >= 15 && $jobs.bartender.tier < 1>>
<<set $jobs.bartender.tier = 1>>
<<run XCLC.Toast.show("⭐ Promoted to Head Bartender! +$15/shift", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📚 TUTOR — Campus Learning Center
═══════════════════════════════════════════════════ */<h2>📚 Campus Tutor Position</h2>
<p>The Learning Center director reviews your transcript. "Your grades are strong. We need tutors for intro courses. Thirty dollars per session, two-hour blocks in the afternoon. Interested?"</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">📚 Take the position</span>' "JobBoard">>
<<hireJob "tutor">>
<<modRep "goodStudent" 3>>
<</link>>
<<link '<span class="choice-btn">🚫 Not right now</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>📚 Tutoring Session</h2>
<<advanceTime 120>>
<<set $jobs.tutor.sessions++>>
<<set _student = XCLC.NPC.generate({gender: random(1,10) <= 5 ? "male" : "female", type: "student"})>>
<p>Your student today is a <<print _student.bodyType>> <<if _student.gender === "male">>guy<<else>>girl<</if>> who clearly didn't read the textbook.</p>
<<set _teachResult = XCLC.Roll.doCheck("intelligence", 4)>>
<<run XCLC.DicePopup.show()>>
<<set _basePay = 30 + ($jobs.tutor.tier * 15)>>
<<if _teachResult === "crit_success" || _teachResult === "success">>
<p>"Oh my god, you're amazing! It finally makes sense!" Your student beams. They get it.</p>
<<modStat "mood" 5 "Good teaching">>
<<modRep "goodStudent" 2>>
/* Event chance */
<<set _event = random(1, 10)>>
<<if _event <= 2 && _student.gender === "male">>
<p>After the session, he lingers. "Hey, uh... would you want to grab coffee sometime? Like, not as a study thing." He's blushing.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😊 Sure, why not</span>' "Job_Tutor_Done">>
<<modStat "mood" 5 "Date invitation">>
<<modRep "popular" 1>>
<</link>>
<<link '<span class="choice-btn">📚 I keep things professional</span>' "Job_Tutor_Done">><</link>>
</div>
<<else>>
<<goto "Job_Tutor_Done">>
<</if>>
<<else>>
<p>The session is rough. Your student stares blankly no matter how you explain it. By the end, you're both frustrated.</p>
<<modStat "stress" 5 "Difficult student">>
<<goto "Job_Tutor_Done">>
<</if>><<set _basePay = 30 + ($jobs.tutor.tier * 15)>>
<<payPlayer _basePay "Tutoring session">>
<<addXP "intelligence" 15>>
<<addXP "studying" 10>>
<<if $jobs.tutor.sessions >= 10 && $jobs.tutor.tier < 1>>
<<set $jobs.tutor.tier = 1>>
<<run XCLC.Toast.show("⭐ Promoted to Premium Tutor! $45/session", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📣 CHEERLEADER — Thornfield Wildcats
With routine minigame
═══════════════════════════════════════════════════ */<h2>📣 Cheerleader Tryouts</h2>
<p>The gym is set up for tryouts. Captain Brittany — blonde, terrifyingly fit, clipboard in hand — surveys the nervous line of girls.</p>
<p>"Alright ladies. Show me what you've got. Full routine: opening, stunts, tumbling, closing. Don't fall on your face."</p>
<<canHireCheck>>
<<if _canHire>>
<<set _danceCheck = XCLC.Roll.doCheck("dance", 4)>>
<<set _staminaCheck = XCLC.Roll.doCheck("stamina", 4)>>
<<run XCLC.DicePopup.show()>>
<<if (_danceCheck === "crit_success" || _danceCheck === "success") && (_staminaCheck === "crit_success" || _staminaCheck === "success")>>
<p>You nail every move. The jumps are clean, the tumbling is tight, and you finish with a split. Brittany circles something on her clipboard. "Welcome to the Wildcats."</p>
<p>She hands you a bag. Inside: the official cheerleading uniform. A crop top and skirt in school colors, pom-poms, and white sneakers. "Don't lose it."</p>
<<hireJob "cheerleader">>
<<set $jobs.cheerleader.hasOutfit = true>>
<<modRep "popular" 5>>
<<else>>
<p>You stumble on the tumbling and the timing is off. Brittany shakes her head. "Practice more and try again next week."</p>
<<modStat "confidence" -5 "Failed tryout">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>📣 Wildcats Schedule</h2>
<p><strong>Practices missed:</strong> <<print $jobs.cheerleader.practicesMissed>>/3 (kicked at 3)</p>
<p><strong>Games cheered:</strong> <<print $jobs.cheerleader.gamesAttended>></p>
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<set _dow = $world.dayOfWeek>>
<<set _isPracticeDay = (_dow === 1 || _dow === 3 || _dow === 5)>>
<<set _isGameDay = (_dow === 6 && ($world.day % 14 < 7))>>
<div class="choice-group">
<<if _isPracticeDay && _period === "afternoon">>
<<link '<span class="choice-btn">📣 Go to practice</span>' "Job_Cheer_Practice">><</link>>
<<elseif _isPracticeDay>>
<p><em>Practice is this afternoon (MWF, 2 PM)</em></p>
<<else>>
<p><em>No practice today</em></p>
<</if>>
<<if _isGameDay && _period === "afternoon">>
<<link '<span class="choice-btn">🏟️ Cheer at the game!</span>' "Job_Cheer_Game">><</link>>
<<elseif _isGameDay>>
<p><em>Game day! Show up this afternoon.</em></p>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div><h2>📣 Cheerleading Practice</h2>
<<advanceTime 120>>
<p>The squad assembles in the gym. Brittany blows her whistle. "New routine, ladies. Follow my lead."</p>
/* Routine Minigame — pick the right move 4 times */
<<set $temp.cheerScore = 0>>
<<set $temp.cheerRound = 0>>
<<set $temp.cheerTotalRounds = 4>>
<<goto "Job_Cheer_Move">><<set $temp.cheerRound++>>
<<set _round = $temp.cheerRound>>
<<set _moves = [
{name: "High V", correct: "highV", desc: "Arms up in a V!"},
{name: "Toe Touch", correct: "toeTouch", desc: "Jump and touch your toes!"},
{name: "Herkie", correct: "herkie", desc: "One leg forward, one bent back!"},
{name: "Back Tuck", correct: "backTuck", desc: "Backflip tuck!"},
{name: "Pike Jump", correct: "pike", desc: "Legs straight out front!"},
{name: "Liberty", correct: "liberty", desc: "One foot up, arms in a T!"},
{name: "Round Off", correct: "roundOff", desc: "Cartwheel into both feet!"},
{name: "Front Walkover", correct: "walkover", desc: "Forward into a bridge and over!"}
]>>
<<set _move = _moves[random(0, _moves.length - 1)]>>
<<set $temp.currentMove = _move>>
<p><strong>Move <<print _round>>:</strong> Brittany calls out: "<em><<print _move.desc>></em>"</p>
/* Generate options */
<<set _allMoves = ["highV", "toeTouch", "herkie", "backTuck", "pike", "liberty", "roundOff", "walkover"]>>
<<set _wrong = _allMoves.filter(function(m) { return m !== _move.correct; })>>
<<set _w1 = _wrong[random(0, _wrong.length - 1)]>>
<<set _wrong = _wrong.filter(function(m) { return m !== _w1; })>>
<<set _w2 = _wrong[random(0, _wrong.length - 1)]>>
<<set _choices = [_move.correct, _w1, _w2]>>
<<set _choices = _choices.sort(function() { return Math.random() - 0.5; })>>
<<set _moveNames = {highV: "🙌 High V", toeTouch: "🦵 Toe Touch", herkie: "💃 Herkie", backTuck: "🔄 Back Tuck", pike: "🦵 Pike Jump", liberty: "🗽 Liberty", roundOff: "🤸 Round Off", walkover: "🤸♀️ Front Walkover"}>>
<div class="choice-group">
<<for _c = 0; _c < _choices.length; _c++>>
<<capture _choices[_c]>>
<<link '<span class="choice-btn"><<print _moveNames[_choices[_c]]>></span>' "Job_Cheer_MoveResult">>
<<set $temp.cheerChoice = _choices[_c]>>
<</link>>
<</capture>>
<</for>>
</div><<set _choice = $temp.cheerChoice>>
<<set _move = $temp.currentMove>>
<<if _choice === _move.correct>>
<p>✅ <strong>Perfect!</strong> You nail <<print _move.name>>. The squad flows together.</p>
<<set $temp.cheerScore++>>
<<else>>
<p>❌ <strong>Wrong move!</strong> You do the wrong thing and crash into another cheerleader. "Focus, pledge!" Brittany snaps.</p>
<</if>>
<<if $temp.cheerRound < $temp.cheerTotalRounds>>
<<goto "Job_Cheer_Move">>
<<else>>
<<goto "Job_Cheer_PracticeResult">>
<</if>><h2>📣 Practice Results</h2>
<<set _score = $temp.cheerScore>>
<<if _score >= 3>>
<p>"Good work today." Brittany almost sounds impressed. The squad high-fives you.</p>
<<modStat "mood" 8 "Good practice">>
<<modRep "popular" 2>>
<<else>>
<p>"We need to work on that." Brittany's tone says more than her words. You slink to the showers.</p>
<<modStat "confidence" -3 "Rough practice">>
<</if>>
<<addXP "dance" 15>>
<<addXP "stamina" 10>>
<<addXP "flexibility" 5>>
<<set $jobs.cheerleader.practiceDay = $world.day>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div><h2>🏟️ Game Day!</h2>
<<advanceTime 180>>
<<set $jobs.cheerleader.gamesAttended++>>
<p>The stadium is packed. The crowd roars. You're front and center in your cheerleading uniform, pom-poms ready.</p>
<<set _danceResult = XCLC.Roll.doCheck("dance", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success">>
<p>You absolutely CRUSH the routine. The crowd chants your name. A camera crew catches your splits. Your phone blows up after the game.</p>
<<modStat "confidence" 15 "Game day star">>
<<modRep "popular" 5>>
<<addXP "dance" 25>>
<<elseif _danceResult === "success">>
<p>Solid performance. The routine goes well, the crowd loves it, and the team wins. Good day.</p>
<<modStat "mood" 10 "Game day">>
<<modRep "popular" 3>>
<<addXP "dance" 15>>
<<else>>
<p>You stumble during the big number. A few people in the crowd laugh. Brittany shoots you a look.</p>
<<modStat "confidence" -5 "Game stumble">>
<<modRep "popular" 1>>
<<addXP "dance" 8>>
<</if>>
/* Featured dancer check */
<<if $jobs.cheerleader.gamesAttended >= 5 && $jobs.cheerleader.teamRank < 1>>
<<set $jobs.cheerleader.teamRank = 1>>
<<run XCLC.Toast.show("⭐ You're now a Featured Dancer! More attention, more fans.", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📷 CAM GIRL — Dorm Room Shows
═══════════════════════════════════════════════════ */<h2>📷 Cam Girl Setup</h2>
<p>You set up your laptop and webcam on your desk. The lighting is... okay. You create an account on StreamLive under a pseudonym.</p>
<p>"<<print $pc.firstName>>_Cam" — no, too obvious. You settle on a stage name. The site approves your account instantly. You're live whenever you want to be.</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">📷 Set up account</span>' "JobBoard">>
<<hireJob "camGirl">>
<</link>>
<<link '<span class="choice-btn">🚫 Not ready yet</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>📷 Going Live</h2>
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<set _baseViewers = $jobs.camGirl.viewers>>
<<if _period === "night" || _period === "late_night">>
<<set _viewers = Math.round(_baseViewers * (1 + Math.random() * 0.5))>>
<<elseif _period === "evening">>
<<set _viewers = Math.round(_baseViewers * (0.7 + Math.random() * 0.3))>>
<<else>>
<<set _viewers = Math.round(_baseViewers * (0.3 + Math.random() * 0.3))>>
<</if>>
<<if $jobs.camGirl.hasRingLight>><<set _viewers = Math.round(_viewers * 1.2)>><</if>>
<<set $temp.camViewers = _viewers>>
<<set $temp.camTokens = 0>>
<p>You hit the "Go Live" button. The red light blinks. <<print _viewers>> viewers trickle in. The chat starts scrolling.</p>
<p><em>"hey cutie" — "show feet" — "hi from texas" — "you're hot"</em></p>
<<divider "Choose your show type">>
<p><em>Higher tiers = higher DCs but more tokens. Anyone can try anything.</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">😊 Tease Show (DC 3) — Chat, flirt, light strip</span>' "Job_Cam_Show">>
<<set $temp.camShowType = "tease">>
<<set $temp.camDC = 3>>
<<set $temp.camBaseTokens = 20>>
<</link>>
<<link '<span class="choice-btn">👙 Strip Show (DC 4) — Full strip, posing</span>' "Job_Cam_Show">>
<<set $temp.camShowType = "strip">>
<<set $temp.camDC = 4>>
<<set $temp.camBaseTokens = 40>>
<</link>>
<<link '<span class="choice-btn">🎀 Toy Show (DC 5) — Vibrator, dildo play</span>' "Job_Cam_Show">>
<<set $temp.camShowType = "toy">>
<<set $temp.camDC = 5>>
<<set $temp.camBaseTokens = 70>>
<</link>>
<<link '<span class="choice-btn">🔥 Explicit Show (DC 6) — Full performance</span>' "Job_Cam_Show">>
<<set $temp.camShowType = "explicit">>
<<set $temp.camDC = 6>>
<<set $temp.camBaseTokens = 100>>
<</link>>
</div><h2>📷 Live Show — <<print $temp.camShowType.charAt(0).toUpperCase() + $temp.camShowType.slice(1)>></h2>
<<advanceTime 90>>
<<set $jobs.camGirl.shows++>>
/* Phase 1: Chat engagement */
<<set _charmResult = XCLC.Roll.doCheck("charm", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _charmResult === "crit_success" || _charmResult === "success">>
<p>You work the chat like a pro. Flirty, funny, playful. The viewer count climbs. People are tipping just for conversation.</p>
<<set $temp.camTokens += 15>>
<<set $temp.camViewers = Math.round($temp.camViewers * 1.3)>>
<<else>>
<p>The chat is slow. You struggle to keep people engaged. A few viewers leave.</p>
<<set $temp.camViewers = Math.round($temp.camViewers * 0.8)>>
<</if>>
/* Phase 2: Performance */
<<set _camResult = XCLC.Roll.doCheck("camSkill", $temp.camDC)>>
<<run XCLC.DicePopup.show()>>
<<if _camResult === "crit_success">>
<p>You're a natural. Every angle, every expression, every movement is perfect. The token counter goes berserk. Someone drops a 500-token bomb. The chat explodes with hearts and fire emojis.</p>
<<set $temp.camTokens += Math.round($temp.camBaseTokens * 2.5)>>
<<modStat "confidence" 10 "Amazing show">>
<<elseif _camResult === "success">>
<p>Good show. You hit your marks, the lighting works, the audience is into it. Steady stream of tokens.</p>
<<set $temp.camTokens += Math.round($temp.camBaseTokens * 1.5)>>
<<elseif _camResult === "partial_fail">>
<p>It's... okay. The camera angle is weird, you fumble with props. Some viewers leave. A few sympathetic tips.</p>
<<set $temp.camTokens += Math.round($temp.camBaseTokens * 0.7)>>
<<else>>
<p>Technical disaster. Your webcam freezes mid-show. When it comes back, you've lost half your audience. Someone screenshots the frozen frame of your weird face.</p>
<<set $temp.camTokens += Math.round($temp.camBaseTokens * 0.3)>>
<<modStat "confidence" -5 "Tech disaster">>
<</if>>
/* Event check */
<<set _event = random(1, 10)>>
<<if _event <= 2>>
<p><em>💬 Chat message: "Wait... do you go to Thornfield? I think I've seen you in class..." 😰</em></p>
<<modRep "camGirl" 5>>
<<modStat "stress" 8 "Recognized on cam">>
<<elseif _event === 3>>
<p><em>🐋 A whale drops $100 worth of tokens. "You're my new favorite."</em></p>
<<set $temp.camTokens += 100>>
<</if>>
/* Calculate earnings: tokens * 0.5 = dollars */
<<set _earnings = Math.round($temp.camTokens * 0.5)>>
<<set $jobs.camGirl.tokens += $temp.camTokens>>
/* Viewer growth */
<<set $jobs.camGirl.viewers = Math.min(500, Math.round($jobs.camGirl.viewers * 1.05 + random(2, 8)))>>
<div class="card">
<div class="card__title">📷 Show Results</div>
<p><strong>Viewers:</strong> <<print $temp.camViewers>></p>
<p><strong>Tokens earned:</strong> <<print $temp.camTokens>></p>
<p><strong>Cash earned:</strong> $<<print _earnings>></p>
</div>
<<payPlayer _earnings "Cam show">>
<<addXP "camSkill" 20>>
<<modRep "camGirl" 2>>
<<modStat "arousal" 15 "Exhibitionism">>
/* Progression */
<<if $jobs.camGirl.shows >= 50 && $jobs.camGirl.tier < 3>>
<<set $jobs.camGirl.tier = 3>>
<<run XCLC.Toast.show("👑 Top Cam Girl! Maximum viewer base.", "info")>>
<<elseif $jobs.camGirl.shows >= 25 && $jobs.camGirl.tier < 2>>
<<set $jobs.camGirl.tier = 2>>
<<set $jobs.camGirl.viewers = Math.min(500, $jobs.camGirl.viewers * 2)>>
<<run XCLC.Toast.show("⭐ Popular Streamer! Viewers doubled.", "info")>>
<<elseif $jobs.camGirl.shows >= 10 && $jobs.camGirl.tier < 1>>
<<set $jobs.camGirl.tier = 1>>
<<set $jobs.camGirl.viewers = Math.round($jobs.camGirl.viewers * 1.5)>>
<<run XCLC.Toast.show("⭐ Established Streamer! +50% base viewers.", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 End stream</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
💰 FANSONLY — Content Creation
═══════════════════════════════════════════════════ */<h2>💰 FansOnly Setup</h2>
<p>You download the FansOnly app and create a creator profile. Username, bio, profile pic. Subscription price: $5/month. Easy money... in theory.</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">💰 Create account</span>' "JobBoard">>
<<hireJob "fansOnly">>
<<set $jobs.fansOnly.lastPostDay = $world.day>>
<</link>>
<<link '<span class="choice-btn">🚫 Not yet</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>💰 FansOnly Dashboard</h2>
/* Sub decay check */
<<set _daysSincePost = $world.day - $jobs.fansOnly.lastPostDay>>
<<if _daysSincePost > 5 && $jobs.fansOnly.subs > 0>>
<<set _decayDays = _daysSincePost - 5>>
<<set _decayPct = Math.min(0.25, _decayDays * 0.05)>>
<<set _lost = Math.max(1, Math.round($jobs.fansOnly.subs * _decayPct))>>
<<set $jobs.fansOnly.subs = Math.max(0, $jobs.fansOnly.subs - _lost)>>
<div class="alert alert--warning">⚠️ You haven't posted in <<print _daysSincePost>> days. Lost <<print _lost>> subscribers.</div>
<</if>>
<div class="card">
<div class="card__title">📊 Stats</div>
<p><strong>Subscribers:</strong> <<print $jobs.fansOnly.subs>> ($<<print $jobs.fansOnly.subs * 5>>/week)</p>
<p><strong>Total posts:</strong> <<print $jobs.fansOnly.posts>></p>
<p><strong>Days since last post:</strong> <<print _daysSincePost>></p>
</div>
<<divider "Create Content">>
<div class="choice-group">
<<link '<span class="choice-btn">🤳 Post a selfie (DC 2, low risk)</span>' "Job_FansOnly_Post">>
<<set $temp.foContentType = "selfie">>
<<set $temp.foDC = 2>>
<<set $temp.foSubGain = random(1, 3)>>
<<set $temp.foRepHit = 1>>
<</link>>
<<link '<span class="choice-btn">👙 Post lingerie photos (DC 3)</span>' "Job_FansOnly_Post">>
<<set $temp.foContentType = "lingerie">>
<<set $temp.foDC = 3>>
<<set $temp.foSubGain = random(2, 6)>>
<<set $temp.foRepHit = 2>>
<</link>>
<<link '<span class="choice-btn">🔥 Post nudes (DC 4)</span>' "Job_FansOnly_Post">>
<<set $temp.foContentType = "nude">>
<<set $temp.foDC = 4>>
<<set $temp.foSubGain = random(5, 12)>>
<<set $temp.foRepHit = 3>>
<</link>>
<<link '<span class="choice-btn">💋 Post explicit content (DC 5)</span>' "Job_FansOnly_Post">>
<<set $temp.foContentType = "explicit">>
<<set $temp.foDC = 5>>
<<set $temp.foSubGain = random(8, 20)>>
<<set $temp.foRepHit = 5>>
<</link>>
<<if $scholarship.totalServiced > 0>>
<<link '<span class="choice-btn">🎬 Upload recorded encounter (DC 4)</span>' "Job_FansOnly_RecordedPost">>
<</link>>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div><h2>💰 Creating Content: <<print $temp.foContentType>></h2>
<<advanceTime 60>>
<<set $jobs.fansOnly.posts++>>
<<set $jobs.fansOnly.lastPostDay = $world.day>>
<<set _result = XCLC.Roll.doCheck("camSkill", $temp.foDC)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>Great content. The lighting is good, the angles are flattering, and the caption is perfect. Subscribers love it.</p>
<<set _gained = $temp.foSubGain>>
<<set $jobs.fansOnly.subs += _gained>>
<<run XCLC.Toast.show("📈 +" + _gained + " new subscribers!", "info")>>
/* Viral chance on crit */
<<if _result === "crit_success">>
<p><em>🔥 The post goes viral! Subscriber surge!</em></p>
<<set _viralGain = random(10, 25)>>
<<set $jobs.fansOnly.subs += _viralGain>>
<<run XCLC.Toast.show("🚀 VIRAL! +" + _viralGain + " more subs!", "info")>>
<</if>>
<<else>>
<p>The content is mediocre. Bad lighting, awkward pose. A few new subs, but nothing exciting.</p>
<<set $jobs.fansOnly.subs += Math.max(1, Math.round($temp.foSubGain * 0.3))>>
<</if>>
<<addXP "camSkill" 15>>
<<modRep "camGirl" $temp.foRepHit>>
/* Cap at 500 */
<<set $jobs.fansOnly.subs = Math.min(500, $jobs.fansOnly.subs)>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to dashboard</span>' "Job_FansOnly_Hub">><</link>>
</div><h2>🎬 Upload Recorded Encounter</h2>
<<advanceTime 30>>
<p>You edit together footage from a recent hookup. It's raw, authentic content — your subscribers will love it.</p>
<p><em>Note: The person in the video may or may not know they're being filmed...</em></p>
<<set $jobs.fansOnly.posts++>>
<<set $jobs.fansOnly.lastPostDay = $world.day>>
<<set _gained = random(10, 25)>>
<<set $jobs.fansOnly.subs = Math.min(500, $jobs.fansOnly.subs + _gained)>>
<<modRep "camGirl" 5>>
<<modRep "slut" 3>>
<<run XCLC.Toast.show("📈 +" + _gained + " subs! They loved it.", "info")>>
<<addXP "camSkill" 15>>
/* Risk of content leak */
<<set _leak = random(1, 10) <= 2>>
<<if _leak>>
<p><em>⚠️ Someone shared a clip on campus forums. Your face is recognizable...</em></p>
<<modRep "camGirl" 10>>
<<modStat "stress" 10 "Content leaked">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to dashboard</span>' "Job_FansOnly_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
💃 STRIPPER — Candy Bar
═══════════════════════════════════════════════════ */<h2>💃 Candy Bar — Dancer Application</h2>
<p>The manager, a stocky man named Vince, looks you over with professional detachment. "Show me your moves."</p>
<<canHireCheck>>
<<if _canHire>>
<<set _danceCheck = XCLC.Roll.doCheck("dance", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _danceCheck === "crit_success" || _danceCheck === "success">>
<p>"You'll do. Shifts are 7 to 2, four hours. Sixty base plus whatever you earn on stage and in privates. Back room access comes after you prove yourself."</p>
<<hireJob "stripper">>
<<else>>
<p>"Not bad, but not Candy Bar material. Practice and come back." He turns away.</p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>💃 Stripper Shift</h2>
<<advanceTime 240>>
<<set $jobs.stripper.shifts++>>
<<set _basePay = 60 + ($jobs.stripper.tier * 40)>>
<p>You head backstage at the Candy Bar. The dressing room smells like hairspray and ambition. Time to work.</p>
/* Phase 1: Stage performance */
<h3>🎭 Stage Set</h3>
<<set _danceResult = XCLC.Roll.doCheck("dance", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success">>
<p>You own that stage. The pole work is flawless — inversions, spins, body rolls that make the crowd lose their minds. Dollar bills rain down.</p>
<<set _stageTips = random(50, 80)>>
<<modStat "confidence" 8 "Killed it on stage">>
<<elseif _danceResult === "success">>
<p>Solid set. Good moves, good energy. The crowd is into it. Decent tips.</p>
<<set _stageTips = random(30, 50)>>
<<else>>
<p>You slip on the pole. The recovery is awkward. A few polite claps. The next girl takes the stage quickly.</p>
<<set _stageTips = random(10, 20)>>
<<modStat "confidence" -3 "Rough set">>
<</if>>
/* Phase 2: Floor work — private dances */
<h3>💋 Floor Work</h3>
<<set _privateDances = random(1, 3)>>
<<set _privateTips = 0>>
<<for _d = 0; _d < _privateDances; _d++>>
<<set _clientNPC = XCLC.NPC.generate({gender: "male", type: "premium"})>>
<<set _lapResult = XCLC.Roll.doCheck("dance", 4)>>
<<if _lapResult === "crit_success" || _lapResult === "success">>
<<set _privateTips += random(50, 80)>>
<<else>>
<<set _privateTips += 30>>
<</if>>
<</for>>
<p>You gave <<print _privateDances>> private dance<<if _privateDances > 1>>s<</if>>.</p>
/* Phase 3: Back room (if unlocked) */
<<set _backRoomEarnings = 0>>
<<if $jobs.stripper.canBackRoom>>
<<set _backRoom = random(1, 10) <= 4>>
<<if _backRoom>>
<p>A regular asks for the back room. "Whatever you're comfortable with, sweetheart."</p>
<<set _backRoomEarnings = random(100, 200)>>
<<modStat "arousal" 15 "Back room">>
<<modRep "slut" 2>>
<</if>>
<</if>>
/* Results */
<<set _totalTips = _stageTips + _privateTips + _backRoomEarnings>>
<<set _total = _basePay + _totalTips>>
<<set $jobs.stripper.tips += _totalTips>>
<div class="card">
<div class="card__title">💰 Shift Results</div>
<p><strong>Base pay:</strong> $<<print _basePay>></p>
<p><strong>Stage tips:</strong> $<<print _stageTips>></p>
<p><strong>Private dance tips:</strong> $<<print _privateTips>></p>
<<if _backRoomEarnings > 0>><p><strong>Back room:</strong> $<<print _backRoomEarnings>></p><</if>>
<p><strong>Total:</strong> $<<print _total>></p>
</div>
<<payPlayer _total "Stripper shift">>
<<addXP "dance" 20>>
<<addXP "charm" 10>>
<<modRep "slut" 3>>
<<modRep "camGirl" 1>>
/* Progression */
<<if $jobs.stripper.shifts >= 25 && $jobs.stripper.tier < 2>>
<<set $jobs.stripper.tier = 2>>
<<run XCLC.Toast.show("👑 Headliner! Name on the marquee. $100 base pay.", "info")>>
<<elseif $jobs.stripper.shifts >= 10 && $jobs.stripper.tier < 1>>
<<set $jobs.stripper.tier = 1>>
<<set $jobs.stripper.canBackRoom = true>>
<<run XCLC.Toast.show("⭐ Featured Dancer! Back room access unlocked.", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "BarDistrict">><</link>>
</div>
/* ═══════════════════════════════════════════════════
💋 HOOKER — Street Walking & Phone Clients
With kink content: bondage, threesomes, gangbangs
═══════════════════════════════════════════════════ */<h2>💋 The Street</h2>
<p>Downtown. Past the restaurants, past the offices, to where the streetlights are dimmer and the cars slow down. You've seen the other girls here — leaning against lamp posts, tottering on heels.</p>
<p>You could do this. It's just... standing on a corner. And then whatever comes next.</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">💋 Start walking</span>' "Job_Hooker_Street">>
<<hireJob "hooker">>
<</link>>
<<link '<span class="choice-btn">🚫 Turn around</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>💋 Walking the Street</h2>
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<if _period !== "night" && _period !== "late_night">>
<p>The street is quiet. Nobody's looking for company at this hour.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave</span>' "CampusMap">><</link>>
</div>
<<else>>
<p>You stand under a flickering streetlight. Cars pass. Most don't stop. Then one does.</p>
<<set _clientNPC = XCLC.NPC.generate({gender: "male", type: "premium"})>>
<<set $temp.hookerClient = _clientNPC>>
/* Determine client type */
<<set _clientType = random(1, 10)>>
<<if _clientType <= 4>>
<<set $temp.hookerService = "standard">>
<<set $temp.hookerBasePay = random(50, 100)>>
<p>A <<print _clientNPC.bodyType>> man in a sedan rolls down his window. "How much?"</p>
<<elseif _clientType <= 6>>
<<set $temp.hookerService = "kinky">>
<<set $temp.hookerBasePay = random(100, 150)>>
<p>A <<print _clientNPC.bodyType>> man in a nice car. Tinted windows. "I have... specific tastes. You open-minded?"</p>
<<elseif _clientType <= 8>>
<<set $temp.hookerService = "threesome">>
<<set $temp.hookerBasePay = random(150, 250)>>
<p>A car pulls up. Two people inside — <<set _threeType = random(1,10) <= 5 ? "MMF" : "FFM">><<set $temp.hookerThreeType = _threeType>><<if _threeType === "MMF">>two guys<<else>>a guy and a girl<</if>>. "We're looking for a third. <<print $temp.hookerBasePay>> bucks."</p>
<<elseif _clientType === 9>>
<<set $temp.hookerService = "bondage">>
<<set $temp.hookerBasePay = random(120, 200)>>
<p>A well-dressed man with leather gloves. "I want to tie you up. Nothing dangerous. <<print $temp.hookerBasePay>> dollars."</p>
<<else>>
<<set $temp.hookerService = "gangbang">>
<<set $temp.hookerBasePay = random(200, 400)>>
<<set $temp.hookerGangNum = random(3, 5)>>
<p>A van pulls up. The side door slides open. <<print $temp.hookerGangNum>> guys inside. "$<<print $temp.hookerBasePay>> for all of us."</p>
<</if>>
/* Negotiate */
<<set _negResult = XCLC.Roll.doCheck("persuasion", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _negResult === "crit_success" || _negResult === "success">>
<<set $temp.hookerBasePay = Math.round($temp.hookerBasePay * 1.5)>>
<p>You negotiate hard. "$<<print $temp.hookerBasePay>>, take it or leave it." He takes it.</p>
<<else>>
<p>He won't budge on price. $<<print $temp.hookerBasePay>>. Take it or leave it.</p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">💋 Take the job</span>' "Job_Hooker_Service">><</link>>
<<link '<span class="choice-btn">🚫 Pass</span>' "Job_Hooker_Street">>
<<advanceTime 20>>
<</link>>
</div>
<</if>><<advanceTime 45>>
<<set $jobs.hooker.clients++>>
<<set _service = $temp.hookerService>>
<<set _pay = $temp.hookerBasePay>>
<<if _service === "standard">>
<h2>💋 Standard Client</h2>
<<set _skill = ["oral", "vaginal"][random(0, 1)]>>
<<set _result = XCLC.Roll.doCheck(_skill, 4)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>Quick, efficient, professional. He finishes, pays, and drives off. You're back on the corner in twenty minutes.</p>
<<addXP _skill 15>>
<<else>>
<p>Awkward. He complains. Tips less than agreed. You pocket what you can.</p>
<<set _pay = Math.round(_pay * 0.7)>>
<<addXP _skill 8>>
<</if>>
<<elseif _service === "kinky">>
<h2>💋 Kinky Client</h2>
<p>He takes you to a hotel room. The bed has restraints. A collar. A blindfold.</p>
<p>"Rules: safe word is 'red'. I tie you up. I use you. You let me."</p>
<<set _result = XCLC.Roll.doCheck("composure", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>You submit to the restraints. The collar clicks around your neck. He's rough but controlled. The blindfold heightens everything. When it's over, he unties you carefully. "$<<print _pay>>, as agreed." He leaves a tip on the nightstand.</p>
<<set _pay += random(20, 50)>>
<<modStat "arousal" 25 "Bondage session">>
<<addXP "composure" 15>>
<<addXP "stamina" 10>>
<<else>>
<p>You panic when the restraints tighten. "Red! RED!" He stops immediately, unties you. Professional, at least. But the mood is killed. He pays half.</p>
<<set _pay = Math.round(_pay * 0.5)>>
<<modStat "stress" 10 "Bondage panic">>
<</if>>
<<elseif _service === "threesome">>
<h2>💋 Threesome — <<print $temp.hookerThreeType>></h2>
<<if $temp.hookerThreeType === "MMF">>
<p>A hotel room. Two men. One takes front, one takes back. It's intense, overwhelming, athletic.</p>
<<set _result = XCLC.Roll.doCheck("stamina", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>You handle both like a professional. They're impressed. Tips flow. "Anytime you want to work together again..."</p>
<<addXP "stamina" 15>>
<<addXP "oral" 10>>
<<set _pay += random(50, 100)>>
<<else>>
<p>It's too much to manage. Coordination fails. One of them finishes too fast, the other gets bored. You get paid, at least.</p>
<<addXP "stamina" 8>>
<</if>>
<<else>>
<p>A couple — he watches while his girlfriend takes the lead. She's experienced, assertive. You follow her instructions.</p>
<<set _result = XCLC.Roll.doCheck("oral", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>The girlfriend guides your mouth between her thighs while he watches. Then you switch. It's surprisingly intimate. They tip generously.</p>
<<addXP "oral" 15>>
<<set _pay += random(30, 80)>>
<<else>>
<p>The chemistry isn't there. The girlfriend gets impatient. It ends quickly.</p>
<<addXP "oral" 8>>
<</if>>
<</if>>
<<modStat "arousal" 20 "Threesome">>
<<elseif _service === "bondage">>
<h2>💋 Bondage Session</h2>
<p>Hotel room. Professional setup — silk ropes, a spreader bar, blindfold. He knows what he's doing.</p>
<<set _result = XCLC.Roll.doCheck("composure", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>You're tied spread-eagle on the bed. Blindfolded. He edges you for what feels like hours before finishing. It's terrifying and thrilling.</p>
<<modStat "arousal" 30 "Bondage">>
<<addXP "composure" 15>>
<<set _pay += random(30, 60)>>
<<else>>
<p>You can't relax into the restraints. He cuts the session short. Still pays, but you can tell he's disappointed.</p>
<<modStat "stress" 10 "Couldn't submit">>
<<addXP "composure" 8>>
<</if>>
<<elseif _service === "gangbang">>
<h2>💋 Gangbang — <<print $temp.hookerGangNum>> Guys</h2>
<<set _numGuys = $temp.hookerGangNum>>
<<set $temp.gangbangGuys = _numGuys>>
<<set $temp.gangbangRound = 0>>
<<set $temp.gangbangCompleted = 0>>
<p>A dingy apartment. Mattress on the floor. <<print _numGuys>> men. This is the real deal.</p>
/* Re-use the frat party gangbang flow but with hooker context */
<<set _result = XCLC.Roll.doCheck("stamina", 5 + Math.floor(_numGuys / 2))>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>You take every single one. It's brutal, exhausting, but you're still standing when it's done. They pay in full, plus extra. "She's a keeper."</p>
<<addXP "stamina" 25>>
<<addXP "oral" 10>>
<<modStat "arousal" 40 "Gangbang">>
<<set _pay += random(50, 100)>>
<<else>>
<p>You tap out after <<set _completed = random(1, _numGuys - 1)>><<print _completed>>. They grumble but pay a reduced rate.</p>
<<set _pay = Math.round(_pay * (_completed / _numGuys))>>
<<addXP "stamina" 15>>
<<modStat "energy" -20 "Overwhelmed">>
<</if>>
<<modHygiene -40 "Gangbang">>
<<modRep "slut" 8>>
<</if>>
/* === Arrest check === */
<<set _arrestChance = 10>>
<<if _period === "late_night">><<set _arrestChance -= 3>><</if>>
<<if $skills.charm.level >= 5>><<set _arrestChance -= 2>><</if>>
<<set _arrested = random(1, 100) <= _arrestChance>>
<<if _arrested>>
<div class="alert alert--warning">🚔 <strong>BUSTED!</strong> An undercover cop. You're arrested.</div>
<p>Handcuffs. Back of a squad car. A night in a holding cell. $200 fine.</p>
<<set $jobs.hooker.arrested++>>
<<set $finance.money = Math.max(0, $finance.money - 200)>>
<<modRep "troublemaker" 10>>
<<modStat "stress" 20 "Arrested">>
<<set _pay = 0>>
<<if $jobs.hooker.arrested >= 3>>
<p><em>⚠️ Three arrests. A court date is coming...</em></p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">😞 Morning comes...</span>' "DormRoom">>
<<set $world.time = 480>>
<<advanceDay>>
<</link>>
</div>
<<else>>
<<if _pay > 0>><<payPlayer _pay "Escort work">><</if>>
<<modRep "slut" 5>>
<<addXP "charm" 5>>
<<modHygiene -15 "Street work">>
/* Phone unlock check */
<<if $jobs.hooker.clients >= 10 && !$jobs.hooker.phoneUnlocked>>
<<set $jobs.hooker.phoneUnlocked = true>>
<<run XCLC.Toast.show("📱 Word has spread. Phone clients now available!", "info")>>
<</if>>
<<if $jobs.hooker.clients >= 25 && $jobs.hooker.tier < 1>>
<<set $jobs.hooker.tier = 1>>
<<run XCLC.Toast.show("⭐ Known girl. Better pay, less danger.", "info")>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">💋 Look for another client</span>' "Job_Hooker_Street">>
<<advanceTime 15>>
<</link>>
<<link '<span class="choice-btn">🚪 Call it a night</span>' "CampusMap">><</link>>
</div>
<</if>><h2>📱 Phone Client</h2>
<<set _clientNPC = XCLC.NPC.generate({gender: "male", type: "premium"})>>
<<set _pay = random(100, 200) + ($jobs.hooker.tier * 50)>>
<p>Your phone buzzes. A text from a private number: "Hotel Grand, Room 412. <<print _pay>> for the hour. Dress nice."</p>
<p>Phone clients are classier — hotel rooms, better pay, lower risk.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏨 Go to the hotel</span>' "Job_Hooker_PhoneService">>
<<set $temp.hookerBasePay = _pay>>
<<advanceTime 30>>
<</link>>
<<link '<span class="choice-btn">🚫 Decline</span>' "JobBoard">><</link>>
</div><h2>🏨 Hotel Room</h2>
<<advanceTime 60>>
<<set $jobs.hooker.clients++>>
<<set _pay = $temp.hookerBasePay>>
<p>The hotel room is nice — king bed, minibar, city views. The client is already there, drink in hand.</p>
<<set _skill = ["oral", "vaginal"][random(0, 1)]>>
<<set _result = XCLC.Roll.doCheck(_skill, 4)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>Professional. He's satisfied. Tips extra. "I'll call you again."</p>
<<set _pay += random(30, 80)>>
<<addXP _skill 15>>
<<else>>
<p>Functional. He pays, dresses, leaves. No tip.</p>
<<addXP _skill 8>>
<</if>>
/* Much lower arrest chance for phone clients */
<<set _arrested = random(1, 100) <= 3>>
<<if _arrested>>
<div class="alert alert--warning">🚔 <strong>Sting operation!</strong> Arrested at the hotel.</div>
<<set $jobs.hooker.arrested++>>
<<set $finance.money = Math.max(0, $finance.money - 200)>>
<<modRep "troublemaker" 10>>
<<set _pay = 0>>
<div class="choice-group">
<<link '<span class="choice-btn">😞 Morning...</span>' "DormRoom">>
<<set $world.time = 480>>
<<advanceDay>>
<</link>>
</div>
<<else>>
<<payPlayer _pay "Phone escort">>
<<modRep "slut" 3>>
<<modHygiene -10 "Hotel encounter">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "CampusMap">><</link>>
</div>
<</if>>
/* ═══════════════════════════════════════════════════
🧪 DEALER — Campus Drug Trade
═══════════════════════════════════════════════════ */<h2>🧪 Drug Dealing</h2>
<p>You've been thinking about it. The margins are good. Buy wholesale, sell retail. Simple economics.</p>
<p>But you'll need a supplier. Downtown, behind the abandoned laundromat, there's a guy named Marco. Everyone knows about Marco.</p>
<<canHireCheck>>
<<if _canHire>>
<div class="choice-group">
<<link '<span class="choice-btn">🧪 Meet Marco</span>' "Job_Dealer_Marco">>
<<hireJob "dealer">>
<<set $jobs.dealer.supplierUnlocked = true>>
<</link>>
<<link '<span class="choice-btn">🚫 Too risky</span>' "JobBoard">><</link>>
</div>
<<else>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div>
<</if>><h2>🧪 Meeting the Supplier</h2>
<<advanceTime 60>>
<p>Behind the laundromat. Marco is a wiry man with gold teeth and dead eyes. He looks you up and down.</p>
<p>"College girl wants to deal? Fine. I'll front you your first batch. After that, you pay upfront. Don't fuck me over."</p>
<p>He hands you a bag. Your first stock.</p>
<<set $jobs.dealer.stock.weed += 5>>
<<set $jobs.dealer.stock.ecstasy += 3>>
<<run XCLC.Toast.show("🧪 Got starting stock from Marco.", "info")>>
<<modRep "troublemaker" 5>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Done</span>' "Job_Dealer_Hub">><</link>>
</div><h2>🧪 Drug Dealing</h2>
<p><strong>Heat Level:</strong> <<print $jobs.dealer.heatLevel>>/10 <<if $jobs.dealer.heatLevel >= 7>>⚠️ DANGER<<elseif $jobs.dealer.heatLevel >= 5>>⚠️ Warning<</if>></p>
<div class="card">
<div class="card__title">📦 Current Stock</div>
<p>🌿 Weed: <<print $jobs.dealer.stock.weed>> doses (sell @ $15)</p>
<p>💊 Ecstasy: <<print $jobs.dealer.stock.ecstasy>> doses (sell @ $30)</p>
<p>❄️ Cocaine: <<print $jobs.dealer.stock.cocaine>> doses (sell @ $50)</p>
</div>
<<divider "Actions">>
<div class="choice-group">
<<if $jobs.dealer.stock.weed > 0 || $jobs.dealer.stock.ecstasy > 0 || $jobs.dealer.stock.cocaine > 0>>
<<link '<span class="choice-btn">💰 Sell on campus</span>' "Job_Dealer_Sell">>
<<set $temp.dealerLocation = "campus">>
<<set $temp.dealerHeatMod = 1>>
<</link>>
<<link '<span class="choice-btn">🍸 Sell at bars/parties</span>' "Job_Dealer_Sell">>
<<set $temp.dealerLocation = "bar">>
<<set $temp.dealerHeatMod = 0.5>>
<</link>>
<</if>>
<<link '<span class="choice-btn">📦 Restock from Marco</span>' "Job_Dealer_Restock">><</link>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back</span>' "JobBoard">><</link>>
</div><h2>💰 Making a Sale</h2>
<<advanceTime 20>>
/* Find a buyer */
<<set _buyerChance = 50>>
<<if $temp.dealerLocation === "bar">><<set _buyerChance = 70>><</if>>
<<set _period = XCLC.Time.getPeriod($world.time)>>
<<if _period === "night" || _period === "late_night">><<set _buyerChance += 20>><</if>>
<<set _hasBuyer = random(1, 100) <= _buyerChance>>
<<if !_hasBuyer>>
<p>You hang around but nobody's buying. Waste of time.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Job_Dealer_Hub">><</link>>
</div>
<<else>>
<p>Someone approaches. "You holding?"</p>
/* What do they want? */
<<set _wants = random(1, 10)>>
<<if _wants <= 5 && $jobs.dealer.stock.weed > 0>>
<<set $temp.dealerDrug = "weed">>
<<set $temp.dealerPrice = 15>>
<p>"Got any weed?"</p>
<<elseif _wants <= 8 && $jobs.dealer.stock.ecstasy > 0>>
<<set $temp.dealerDrug = "ecstasy">>
<<set $temp.dealerPrice = 30>>
<p>"Got any pills?"</p>
<<elseif $jobs.dealer.stock.cocaine > 0>>
<<set $temp.dealerDrug = "cocaine">>
<<set $temp.dealerPrice = 50>>
<p>"Got any snow?"</p>
<<else>>
<p>They want something you don't have.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Job_Dealer_Hub">><</link>>
</div>
<<if true>><</if>>
<</if>>
<<if $temp.dealerDrug>>
/* Negotiate */
<<set _negResult = XCLC.Roll.doCheck("persuasion", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _negResult === "crit_success" || _negResult === "success">>
<p>"$<<print $temp.dealerPrice>>, no haggling." They pay full price.</p>
<<else>>
<p>"Come on, cut me a deal." You sell at a discount.</p>
<<set $temp.dealerPrice = Math.round($temp.dealerPrice * 0.7)>>
<</if>>
<<set $jobs.dealer.stock[$temp.dealerDrug]-->>
<<set $jobs.dealer.earnings += $temp.dealerPrice>>
<<payPlayer $temp.dealerPrice "Drug sale">>
<<addXP "persuasion" 10>>
/* Heat */
<<set $jobs.dealer.heatLevel = Math.min(10, $jobs.dealer.heatLevel + $temp.dealerHeatMod)>>
<<modRep "troublemaker" 2>>
/* Heat consequences */
<<if $jobs.dealer.heatLevel >= 7>>
<<set _searched = random(1, 10) <= 4>>
<<if _searched>>
<div class="alert alert--warning">🚔 Campus security stops you. They search your bag!</div>
<<if $jobs.dealer.stock.weed + $jobs.dealer.stock.ecstasy + $jobs.dealer.stock.cocaine > 0>>
<p>They find your stash. All stock confiscated.</p>
<<set $jobs.dealer.stock = {weed: 0, ecstasy: 0, cocaine: 0}>>
<<modRep "troublemaker" 10>>
<<modStat "stress" 20 "Caught dealing">>
<<else>>
<p>Nothing on you. They let you go with a warning.</p>
<</if>>
<</if>>
<</if>>
<<if $jobs.dealer.heatLevel >= 10>>
<div class="alert alert--warning">🚨 <strong>ARRESTED!</strong> Your dealing days are over.</div>
<<quitJob "dealer">>
<<set $finance.money = Math.max(0, $finance.money - 500)>>
<<modRep "troublemaker" 20>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">💰 Sell more</span>' "Job_Dealer_Sell">><</link>>
<<link '<span class="choice-btn">🔙 Done</span>' "Job_Dealer_Hub">><</link>>
</div>
<</if>>
<</if>><h2>📦 Restocking from Marco</h2>
<<advanceTime 40>>
<p>You meet Marco in the usual spot. "What you need?"</p>
<div class="choice-group">
<<if $finance.money >= 50>>
<<link '<span class="choice-btn">🌿 5x Weed ($50)</span>' "Job_Dealer_Hub">>
<<set $finance.money -= 50>>
<<set $jobs.dealer.stock.weed += 5>>
<<run XCLC.Toast.show("🌿 +5 weed", "info")>>
<</link>>
<</if>>
<<if $finance.money >= 100>>
<<link '<span class="choice-btn">💊 5x Ecstasy ($100)</span>' "Job_Dealer_Hub">>
<<set $finance.money -= 100>>
<<set $jobs.dealer.stock.ecstasy += 5>>
<<run XCLC.Toast.show("💊 +5 ecstasy", "info")>>
<</link>>
<</if>>
<<if $finance.money >= 150>>
<<link '<span class="choice-btn">❄️ 5x Cocaine ($150)</span>' "Job_Dealer_Hub">>
<<set $finance.money -= 150>>
<<set $jobs.dealer.stock.cocaine += 5>>
<<run XCLC.Toast.show("❄️ +5 cocaine", "info")>>
<</link>>
<</if>>
<<if $finance.money < 50>>
<p><em>You can't afford anything. Marco shakes his head.</em></p>
<</if>>
<<divider "">>
<<link '<span class="choice-btn">🔙 Back</span>' "Job_Dealer_Hub">><</link>>
</div>/* ═══════════════════════════════════════════════════
PREGNANCY SYSTEM
Risk → Discovery → Choices → Progression
Baby genetics based on player + father race
═══════════════════════════════════════════════════ */
/* ─── Pregnancy Risk Check ─── */
/* Called after unprotected internal encounters */
/* Usage: <<pregnancyRisk _npcRace>> */
<<widget "pregnancyRisk">>
<<if $pregnancy.isPregnant>><<return>><</if>>
<<set _fatherRace = _args[0] || "white">>
/* Base chance by Fertility side effect */
<<set _fertLevel = $transformation.sideEffects.fertility || 0>>
<<set _chances = [0, 10, 25, 50, 80]>>
<<set _chance = _chances[_fertLevel] || 0>>
/* Birth control blocks (unless Fertility lv4) */
<<if $transformation.addons.birthControl && _fertLevel < 4>>
<<set _chance = 0>>
<</if>>
<<if $inventory.onPill && _fertLevel < 4>>
<<set _chance = Math.max(0, _chance - 20)>>
<</if>>
<<if $inventory.hasIUD && _fertLevel < 4>>
<<set _chance = 0>>
<</if>>
/* Roll */
<<if _chance > 0 && random(1, 100) <= _chance>>
<<set $pregnancy.isPregnant = true>>
<<set $pregnancy.weeksPregnant = 0>>
<<set $pregnancy.discovered = false>>
<<set $pregnancy.fatherRace = _fatherRace>>
<<set $pregnancy.fatherId = "">>
<<set $pregnancy.totalPregnancies++>>
<</if>>
<</widget>>
/* ─── Pregnancy Weekly Progression ─── */
/* Called during weekly rollover */
<<widget "pregnancyProgress">>
<<if $pregnancy.isPregnant>>
<<set $pregnancy.weeksPregnant++>>
<<if $pregnancy.weeksPregnant === 2 && !$pregnancy.discovered>>
/* Missed period hint */
<<run XCLC.Toast.show("🩸 You missed your period...", "warning")>>
<<elseif $pregnancy.weeksPregnant === 4>>
<<modStat "energy" -10 "Morning sickness">>
<<if !$pregnancy.discovered>>
<<run XCLC.Toast.show("🤢 You've been feeling nauseous every morning...", "warning")>>
<</if>>
<<elseif $pregnancy.weeksPregnant === 8>>
<<modStat "energy" -5 "Pregnancy fatigue">>
<<if $pregnancy.discovered>>
<<run XCLC.Toast.show("🤰 You're starting to show.", "info")>>
<</if>>
<<elseif $pregnancy.weeksPregnant === 12>>
<<modStat "energy" -10 "Pregnancy">>
<<run XCLC.Toast.show("🤰 Your belly is clearly visible now. People notice.", "info")>>
<<elseif $pregnancy.weeksPregnant >= 36>>
/* Birth event */
<<set $pregnancy.isPregnant = false>>
<<goto "PregnancyBirth">>
<</if>>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
PREGNANCY DISCOVERY
═══════════════════════════════════════════════════ */<h2>🤰 Pregnancy Test</h2>
<<if !$pregnancy.isPregnant>>
<p>You stare at the stick. One line. <strong>Negative.</strong></p>
<p><<toneThink "Thank god." "Relief washes over you." "Phew! Not this time.">></p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "DormRoom">><</link>>
</div>
<<else>>
<<set $pregnancy.discovered = true>>
<p>You stare at the stick. Two lines. <strong>Positive.</strong></p>
/* History-aware reaction */
<<if $pregnancy.totalPregnancies === 1>>
/* First pregnancy */
<p>Your hands shake. This can't be happening. You're a <<if $pc.femininity < 34>>guy — well, were a guy. This body is actually...<</if>> college student. On a scholarship. And now...</p>
<p><<toneThink "No. No no no. This isn't real." "Oh god. This is actually happening." "Oh my god... I'm going to be a mom?">></p>
<<elseif $pregnancy.totalPregnancies === 2>>
/* Second pregnancy */
<<if $pregnancy.children.length > 0>>
<p>Again. You're pregnant again. <<toneThink "Not this. Not again." "Here we go again..." "Another baby!">></p>
<<elseif ($pregnancy.decisions || []).indexOf("abort") !== -1>>
<p>Again. After last time... you know the drill. The sickness, the anxiety, the choice. <<toneThink "I can't keep doing this." "At least I know what to expect." "Maybe this time I'll keep it...">></p>
<<else>>
<p>Pregnant again. You stare at the test with a numb familiarity. <<toneThink "I need to be more careful." "This is becoming a pattern." "Well... life finds a way.">></p>
<</if>>
<<else>>
/* Third+ pregnancy */
<p>You don't even flinch anymore. Positive. <<print $pregnancy.totalPregnancies>>th time. <<toneThink "I'm running out of options here." "This is just my life now." "At least I know the routine by now!">></p>
<<if ($pregnancy.decisions || []).length > 0>>
<<set _abortCount = ($pregnancy.decisions || []).filter(function(d) { return d === "abort"; }).length>>
<<set _adoptCount = ($pregnancy.decisions || []).filter(function(d) { return d === "adopt"; }).length>>
<<set _keepCount = $pregnancy.children.length>>
<<if _abortCount > 0>><p><em><<print _abortCount>> abortion<<if _abortCount > 1>>s<</if>>.</em></p><</if>>
<<if _adoptCount > 0>><p><em><<print _adoptCount>> adoption<<if _adoptCount > 1>>s<</if>>.</em></p><</if>>
<<if _keepCount > 0>><p><em><<print _keepCount>> child<<if _keepCount > 1>>ren<</if>> you're raising.</em></p><</if>>
<</if>>
<</if>>
<<divider "What do you do?">>
<div class="choice-group">
<<link '<span class="choice-btn">🏥 Go to the health centre (abortion — $200)</span>' "PregnancyAbort">><</link>>
<<link '<span class="choice-btn">🤰 Carry to term, then adopt</span>' "PregnancyCarry">>
<<set $temp.pregnancyPlan = "adopt">>
<</link>>
<<link '<span class="choice-btn">👶 Carry to term, keep the baby</span>' "PregnancyCarry">>
<<set $temp.pregnancyPlan = "keep">>
<</link>>
</div>
<</if>><h2>🏥 Health Centre — Termination</h2>
<<if $finance.money < 200>>
<p>The receptionist checks the price. "$200." You check your wallet. You can't afford it.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😞 Leave</span>' "PregnancyTest">><</link>>
</div>
<<else>>
<<set $finance.money -= 200>>
<<set $pregnancy.isPregnant = false>>
<<set $pregnancy.weeksPregnant = 0>>
<<run ($pregnancy.decisions = $pregnancy.decisions || []).push("abort")>>
<p>The procedure is quick and clinical. The nurse is kind. You lie on the bed staring at the ceiling tiles.</p>
<<if $pregnancy.totalPregnancies === 1>>
<p><<toneThink "It's done. I can move on." "That was... harder than I expected." "I feel empty. But also... relieved?">></p>
<<else>>
<p><<toneThink "Again. Done. Moving on." "Getting too familiar with this place." "I need to start being more careful.">></p>
<</if>>
<<modStat "stress" 15 "Abortion">>
<<modStat "mood" -20 "Abortion">>
<<advanceTime 120>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave</span>' "CampusMap">><</link>>
</div>
<</if>><h2>🤰 Carrying to Term</h2>
<<set _plan = $temp.pregnancyPlan || "adopt">>
<<if _plan === "keep">>
<p>You've decided to keep the baby. It won't be easy — classes, the scholarship, service obligations — but you'll make it work. Somehow.</p>
<<else>>
<p>You'll carry to term and find a family for the baby. It's the hardest option emotionally, but maybe the most responsible.</p>
<</if>>
<p>For now, life continues. The programme doesn't stop for pregnancy.</p>
<<modStat "stress" 10 "Pregnancy decision">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to campus</span>' "CampusMap">><</link>>
</div><h2>👶 Birth</h2>
<<advanceTime 480>>
<p>36 weeks. The contractions start during <<showPeriod>>. By the time you reach the hospital, it's happening fast.</p>
<p>Hours later, it's over. You're holding a baby.</p>
/* Baby genetics — determine appearance from player + father race */
<<set _playerRace = $pc.race || "white">>
<<set _fatherRace = $pregnancy.fatherRace || "white">>
/* Determine baby skin tone */
<<set _skinTones = {
"white_white": {skin: "fair", hair: "light brown", eyes: "blue"},
"white_black": {skin: "light brown", hair: "dark curly", eyes: "brown"},
"white_asian": {skin: "light olive", hair: "dark straight", eyes: "brown"},
"white_latina": {skin: "olive", hair: "dark brown", eyes: "hazel"},
"black_white": {skin: "light brown", hair: "dark curly", eyes: "brown"},
"black_black": {skin: "dark brown", hair: "black curly", eyes: "dark brown"},
"black_asian": {skin: "brown", hair: "dark wavy", eyes: "dark brown"},
"black_latina": {skin: "brown", hair: "dark curly", eyes: "brown"},
"asian_white": {skin: "light olive", hair: "dark straight", eyes: "brown"},
"asian_black": {skin: "brown", hair: "dark wavy", eyes: "dark brown"},
"asian_asian": {skin: "light", hair: "black straight", eyes: "dark brown"},
"asian_latina": {skin: "olive", hair: "dark straight", eyes: "brown"},
"latina_white": {skin: "olive", hair: "dark brown", eyes: "hazel"},
"latina_black": {skin: "brown", hair: "dark curly", eyes: "brown"},
"latina_asian": {skin: "olive", hair: "dark straight", eyes: "brown"},
"latina_latina": {skin: "olive", hair: "dark brown", eyes: "brown"}
}>>
<<set _key = _playerRace + "_" + _fatherRace>>
<<set _baby = _skinTones[_key] || {skin: "fair", hair: "brown", eyes: "blue"}>>
<<set _baby.gender = random(1, 2) === 1 ? "boy" : "girl">>
<div class="card">
<div class="card__title">👶 Your Baby</div>
<p>A healthy baby <strong><<print _baby.gender>></strong>.</p>
<p><strong>Skin:</strong> <<print _baby.skin>></p>
<p><strong>Hair:</strong> <<print _baby.hair>></p>
<p><strong>Eyes:</strong> <<print _baby.eyes>></p>
</div>
<<set _plan = $temp.pregnancyPlan || "adopt">>
<<if _plan === "keep">>
<p>You hold your <<print _baby.gender>> close. <<toneThink "What am I doing? I can't raise a kid." "This is terrifying. But also... beautiful?" "I love this little <<print _baby.gender>> so much already. 💕">></p>
<<run $pregnancy.children.push({gender: _baby.gender, skin: _baby.skin, hair: _baby.hair, eyes: _baby.eyes, born: $world.day, semester: $world.semester})>>
<<else>>
<p>The adoption counselor arrives. You hold the baby one last time. <<toneThink "It's better this way. I can't be a parent." "Goodbye, little one." "I hope you have a good life. I'm sorry.">></p>
<<run ($pregnancy.decisions = $pregnancy.decisions || []).push("adopt")>>
<<modStat "mood" -25 "Giving up baby">>
<</if>>
<<set $pregnancy.isPregnant = false>>
<<set $pregnancy.weeksPregnant = 0>>
<<modStat "stress" 20 "Childbirth">>
<<modStat "energy" -40 "Childbirth">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Recovery</span>' "DormRoom">><</link>>
</div>/* ═══════════════════════════════════════════════════
SEASONAL EVENTS — Calendar-based campus events
Triggered during weekly rollover by week number
═══════════════════════════════════════════════════ */
/* ─── Check for seasonal event ─── */
<<widget "checkSeasonalEvent">>
<<set _sem = $world.semester>>
<<set _week = $world.week>>
<<set _isOddSem = (_sem % 2 === 1)>>
<<if _isOddSem>>
/* Fall semester */
<<if _week === 1>>
<<set $temp.seasonalEvent = "freshmanWeek">>
<<elseif _week === 5>>
<<set $temp.seasonalEvent = "homecoming">>
<<elseif _week === 8>>
<<set $temp.seasonalEvent = "halloween">>
<<elseif _week === 12>>
<<set $temp.seasonalEvent = "thanksgiving">>
<<elseif _week === 15>>
<<set $temp.seasonalEvent = "winterFormal">>
<</if>>
<<else>>
/* Spring semester */
<<if _week === 6>>
<<set $temp.seasonalEvent = "valentines">>
<<elseif _week === 12>>
<<set $temp.seasonalEvent = "springBreak">>
<<elseif _week === 16>>
<<set $temp.seasonalEvent = "endOfYear">>
<</if>>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
🎉 FRESHMAN WEEK — Sem 1, Week 1
═══════════════════════════════════════════════════ */<h2>🎉 Welcome Week!</h2>
<p>The campus is buzzing with energy. Welcome Week — free t-shirts, pizza, and a campus alive with wide-eyed freshmen. There's an orientation mixer tonight at the Student Center.</p>
<<toneThink "Great. A party full of strangers while I'm stuck in this body." "I should try to meet some people." "Omg, my first college party! Well... my first as a girl.">>
<div class="choice-group">
<<link '<span class="choice-btn">🎉 Go to the mixer</span>' "FreshmanWeek_Mixer">><</link>>
<<link '<span class="choice-btn">🏠 Skip it, stay in the dorm</span>' "DormRoom">>
<<modStat "mood" -5 "Skipped mixer">>
<</link>>
</div><h2>🎉 Freshman Mixer</h2>
<<advanceTime 120>>
<p>The Student Center is packed. Music, free drinks (non-alcoholic... officially), and a sea of nervous faces. You grab a cup of punch and survey the room.</p>
<<set _event = random(1, 4)>>
<<if _event === 1>>
<p>A group of girls waves you over. "Come sit with us! Are you in Hamilton Hall too?" They're friendly, chatty, and completely oblivious to your situation.</p>
<<modStat "mood" 10 "Made friends">>
<<modRep "popular" 3>>
<<elseif _event === 2>>
<p>A cute upperclassman corners you near the snack table. "You're new, right? Let me give you the tour." His hand lingers on your lower back.</p>
<<modStat "arousal" 10 "Flirting">>
<<modRep "popular" 2>>
<<elseif _event === 3>>
<p>Someone spikes the punch. By the time you notice, you're already tipsy and dancing in a circle of laughing strangers.</p>
<<modStat "mood" 15 "Surprise party">>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<else>>
<p>You win a free campus hoodie in a raffle. It's way too big, but it's cozy. A small win.</p>
<<modStat "mood" 5 "Free stuff">>
<</if>>
<<addXP "charm" 10>>
<<modRep "popular" 3>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Head back</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🏟️ HOMECOMING — Sem 1, Week 5
═══════════════════════════════════════════════════ */<h2>🏟️ Homecoming Week!</h2>
<p>Thornfield is decked out in school colours. Homecoming week means a parade, a football game, and the big dance on Saturday night.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏟️ Go to the football game</span>' "Homecoming_Game">><</link>>
<<link '<span class="choice-btn">💃 Get ready for the dance</span>' "Homecoming_Dance">><</link>>
<<link '<span class="choice-btn">🏠 Skip homecoming</span>' "CampusMap">>
<<modStat "mood" -5 "Skipped homecoming">>
<</link>>
</div><h2>🏟️ Football Game</h2>
<<advanceTime 180>>
<p>The stadium is packed. Cheerleaders, marching band, face paint everywhere. The Wildcats score in the fourth quarter and the crowd goes insane.</p>
<<modStat "mood" 15 "Homecoming game">>
<<modRep "popular" 3>>
<<if $jobs.cheerleader.active>>
<p>You're front and center in your uniform. The crowd roars for you. This is YOUR moment.</p>
<<modStat "confidence" 10 "Cheering at homecoming">>
<<modRep "popular" 5>>
<</if>>
<<toneThink "Just a game. Whatever." "That was actually fun." "WILDCATS FOREVER! 🐾">>
<div class="choice-group">
<<link '<span class="choice-btn">🎉 Go to the after-party</span>' "Homecoming_AfterParty">><</link>>
<<link '<span class="choice-btn">🏠 Head home</span>' "DormRoom">><</link>>
</div><h2>💃 Homecoming Dance</h2>
<<advanceTime 180>>
<p>The gymnasium is transformed — fairy lights, a DJ booth, and a sea of dresses and suits. You're in <<if $pc.makeupApplied>>full makeup,<</if>> wearing your best outfit.</p>
<<set _beautyCheck = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _beautyCheck === "crit_success" || _beautyCheck === "success">>
<p>You turn heads the moment you walk in. People stare. Someone whispers "who IS that?" You feel like a queen.</p>
<<modStat "confidence" 15 "Belle of the ball">>
<<modRep "popular" 5>>
<<else>>
<p>The dance is nice. Nothing spectacular. You hover near the punch bowl and sway to the music.</p>
<<modStat "mood" 5 "Homecoming dance">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🎉 After-party!</span>' "Homecoming_AfterParty">><</link>>
<<link '<span class="choice-btn">🏠 Go home</span>' "DormRoom">><</link>>
</div><h2>🎉 Homecoming After-Party</h2>
<<advanceTime 120>>
<p>Sigma Phi's house is shaking with bass. Everyone from the game is here. Kegs, shots, and chaos.</p>
<<set _drinkCheck = random(1, 10)>>
<<if _drinkCheck <= 6>>
<p>Someone hands you a drink. And then another. The night gets blurry.</p>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 2)>>
<<set $substances.drinksToday += 3>>
<</if>>
<<modStat "mood" 10 "After-party">>
<<modRep "partyGirl" 5>>
<<modRep "popular" 3>>
<<addXP "charm" 10>>
<<toneThink "I'm too drunk for this." "This is actually a great night." "BEST. NIGHT. EVER! 🎉">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Stumble home</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🎃 HALLOWEEN — Sem 1, Week 8
═══════════════════════════════════════════════════ */<h2>🎃 Halloween!</h2>
<p>Halloween at Thornfield. Every sorority and frat is throwing a costume party. The question is: what do you wear?</p>
<div class="choice-group">
<<link '<span class="choice-btn">😇 Cute costume (angel/cat ears)</span>' "Halloween_Party">>
<<set $temp.halloweenCostume = "cute">>
<</link>>
<<link '<span class="choice-btn">🔥 Slutty costume (nurse/devil/schoolgirl)</span>' "Halloween_Party">>
<<set $temp.halloweenCostume = "slutty">>
<</link>>
<<link '<span class="choice-btn">🧟 Scary costume (zombie/witch)</span>' "Halloween_Party">>
<<set $temp.halloweenCostume = "scary">>
<</link>>
<<link '<span class="choice-btn">🏠 Stay in</span>' "DormRoom">>
<<modStat "mood" -5 "Skipped Halloween">>
<</link>>
</div><h2>🎃 Halloween Party — Greek Row</h2>
<<advanceTime 180>>
<p>Greek Row is a wall of noise and costumes. <<if $temp.halloweenCostume === "slutty">>Your costume leaves very little to the imagination. You feel exposed but powerful.<<elseif $temp.halloweenCostume === "cute">>Your costume is cute — ears, whiskers, a little tail. Adorable.<<else>>Your zombie makeup is genuinely unsettling. People keep doing double takes.<</if>></p>
/* Costume contest */
<<if $temp.halloweenCostume === "slutty">>
<p>The sorority hosts a "Best Costume" contest. Given the... interpretation of "costume" tonight, it's really a hotness contest.</p>
<<set _contestResult = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _contestResult === "crit_success" || _contestResult === "success">>
<p>🏆 <strong>You WIN!</strong> The crowd cheers. First prize: $50 bar tab and a plastic crown. Photos are taken. You're the Halloween Queen.</p>
<<payPlayer 50 "Costume contest">>
<<modRep "popular" 8>>
<<modRep "slut" 5>>
<<modStat "confidence" 15 "Won costume contest">>
<<else>>
<p>You don't win, but you get plenty of attention. A few too many "accidental" touches in the crowd.</p>
<<modRep "slut" 3>>
<<modStat "arousal" 10 "Slutty costume attention">>
<</if>>
<<elseif $temp.halloweenCostume === "cute">>
<p>Your costume gets a lot of "awww!" reactions. Guys offer to buy you drinks. You feel popular.</p>
<<modRep "popular" 5>>
<<modRep "sweetheart" 3>>
<<else>>
<p>Your costume scares a few people. One girl actually screams. You're equal parts proud and unsettling.</p>
<<modRep "popular" 2>>
<</if>>
/* Haunted house hookup */
<<set _hauntEvent = random(1, 10)>>
<<if _hauntEvent <= 3>>
<p>Someone pulls you into the "haunted house" (really just a dark room with strobe lights). In the darkness, hands find you...</p>
<<modStat "arousal" 20 "Dark room groping">>
<<modRep "slut" 3>>
<</if>>
<<modStat "mood" 10 "Halloween party">>
<<modRep "partyGirl" 5>>
<<addXP "charm" 10>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Head home</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🦃 THANKSGIVING — Sem 1, Week 12
═══════════════════════════════════════════════════ */<h2>🦃 Thanksgiving Break</h2>
<p>Most students have gone home for the long weekend. The campus is eerily quiet. Dorms are half-empty. The cafeteria is serving sad turkey sandwiches.</p>
<p><<toneThink "Can't exactly go home looking like this." "I don't have anywhere to go." "A quiet weekend might be nice, actually.">></p>
<div class="choice-group">
<<link '<span class="choice-btn">🏠 Stay on campus</span>' "Thanksgiving_StayOnCampus">><</link>>
</div><h2>🦃 Thanksgiving on Campus</h2>
<<advanceTime 240>>
<p>You, your roommate (who also stayed), and a handful of other stragglers gather in the common room. Someone ordered pizza. It's quiet but oddly warm.</p>
<<set _event = random(1, 4)>>
<<if _event === 1>>
<p>Your roommate opens up about her own family drama. You bond over shared loneliness. It's genuine.</p>
<<modStat "mood" 15 "Bonding">>
<<if $roommate>><<set $roommate.opinion = Math.min(100, $roommate.opinion + 10)>><</if>>
<<elseif _event === 2>>
<p>A campus-wide "friendsgiving" potluck materializes. Someone brought actual homemade pie. You feel weirdly grateful.</p>
<<modStat "mood" 15 "Friendsgiving">>
<<modRep "sweetheart" 3>>
<<elseif _event === 3>>
<p>The quiet campus is actually peaceful. You take a long walk. No catcalls, no obligations, just autumn leaves and silence.</p>
<<modStat "stress" -15 "Peaceful break">>
<<modStat "mood" 10 "Quiet time">>
<<else>>
<p>You binge-watch an entire season of trash TV with your roommate. Judgment-free zone.</p>
<<modStat "mood" 10 "TV binge">>
<<modStat "stress" -10 "Relaxing">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to routine</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
❄️ WINTER FORMAL — Sem 1, Week 15
═══════════════════════════════════════════════════ */<h2>❄️ Winter Formal</h2>
<p>The grand hall is draped in silver and white. The winter formal — black tie, ballgowns, and a live string quartet. This is the fanciest event of the semester.</p>
<div class="choice-group">
<<link '<span class="choice-btn">👗 Go solo — dress to kill</span>' "WinterFormal_Dance">>
<<set $temp.formalDate = "solo">>
<</link>>
<<link '<span class="choice-btn">🤵 Find a date</span>' "WinterFormal_Date">><</link>>
<<link '<span class="choice-btn">🏠 Skip it</span>' "DormRoom">>
<<modStat "mood" -5 "Skipped formal">>
<</link>>
</div><h2>🤵 Finding a Date</h2>
<<set _charmCheck = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _charmCheck === "crit_success" || _charmCheck === "success">>
<<set _dateNPC = XCLC.NPC.generate({gender: "male", type: "premium"})>>
<p>You ask around and land a date — a <<print _dateNPC.bodyType>> <<print _dateNPC.race>> guy from your econ class. He cleans up well.</p>
<<set $temp.formalDate = "date">>
<<else>>
<p>Everyone's already paired up. Looks like you're going solo.</p>
<<set $temp.formalDate = "solo">>
<</if>>
<<goto "WinterFormal_Dance">><h2>❄️ The Dance</h2>
<<advanceTime 240>>
<p>The hall is beautiful. Crystal chandeliers, candlelight, slow music. Everyone looks stunning. <<if $temp.formalDate === "date">>Your date offers his arm. You look good together.<<else>>You walk in alone. Heads turn anyway.<</if>></p>
<<set _danceCheck = XCLC.Roll.doCheck("charm", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _danceCheck === "crit_success" || _danceCheck === "success">>
<p>The evening is magical. Slow dances, champagne, and <<if $temp.formalDate === "date">>his hand on your waist.<<else>>the attention of everyone in the room.<</if>> <<toneThink "This is... nice. Too nice. Don't get comfortable." "I feel beautiful tonight." "I'm like a princess! ✨">></p>
<<modStat "mood" 20 "Magical evening">>
<<modStat "confidence" 10 "Winter formal">>
<<modRep "popular" 5>>
<<modStat "femininity" 3 "Formal dress">>
<<else>>
<p>You step on your dance partner's feet twice. The champagne is good though.</p>
<<modStat "mood" 5 "Decent evening">>
<</if>>
/* After-party */
<div class="choice-group">
<<if $temp.formalDate === "date">>
<<link '<span class="choice-btn">🏨 Go back to his place</span>' "WinterFormal_HotelRoom">><</link>>
<</if>>
<<link '<span class="choice-btn">🔙 Head home</span>' "DormRoom">><</link>>
</div><h2>🏨 Hotel Room</h2>
<<advanceTime 120>>
<p>He booked a room at the Grand. Champagne on ice. City lights through the window. <<toneThink "Don't do this. You're not actually a girl." "One night won't change who I am." "This is SO romantic. I want this.">></p>
<<set _result = XCLC.Roll.doCheck("charm", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _result === "crit_success" || _result === "success">>
<p>The night is intense, passionate. He's attentive, gentle. You lose yourself completely.</p>
<<modStat "arousal" 30 "Romantic night">>
<<modStat "femininity" 5 "Romantic surrender">>
<<modStat "mood" 15 "Amazing night">>
<<else>>
<p>It's awkward. He's clumsy. You fake it. At least the bed is comfortable.</p>
<<modStat "mood" 3 "Decent night">>
<</if>>
<<modHygiene -20 "Hotel room">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Morning...</span>' "DormRoom">>
<<advanceDay>>
<</link>>
</div>
/* ═══════════════════════════════════════════════════
💘 VALENTINE'S DAY — Sem 2, Week 6
═══════════════════════════════════════════════════ */<h2>💘 Valentine's Day</h2>
<p>The campus is sickeningly pink. Heart-shaped everything. Couples everywhere. Someone left a rose on your door.</p>
<<set _admirerEvent = random(1, 4)>>
<<if _admirerEvent === 1>>
<p>There's a card attached: "<em>I watch you in class. You're beautiful. — Secret Admirer</em>"</p>
<<toneThink "Creepy." "Flattering, I guess." "OMG A SECRET ADMIRER! 😍">>
<<modStat "mood" 5 "Secret admirer">>
<<elseif _admirerEvent === 2>>
<p>A box of chocolates is on your desk with a note: "<em>To the hottest girl in Thornfield.</em>" No name.</p>
<<modStat "mood" 8 "Chocolates">>
<<elseif _admirerEvent === 3>>
<p>Your phone buzzes. Three different guys sent you "Happy Valentine's" texts. <<toneThink "Kill me." "Popular, I guess." "So many valentines! 💕">>
<<modStat "mood" 5 "Attention">>
<<else>>
<p>Nothing. No roses. No cards. No admirers. Just pink hearts mocking you from every surface.</p>
<<modStat "mood" -10 "Lonely Valentine's">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">💘 Go to the Valentine's mixer</span>' "Valentines_Mixer">><</link>>
<<link '<span class="choice-btn">🏠 Wallow alone</span>' "DormRoom">>
<<modStat "mood" -5 "Alone on V-Day">>
<</link>>
</div><h2>💘 Valentine's Mixer</h2>
<<advanceTime 120>>
<p>The Student Center is hosting a "singles mixer." Speed dating, karaoke, and too much pink champagne.</p>
<<set _charmCheck = XCLC.Roll.doCheck("charm", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _charmCheck === "crit_success" || _charmCheck === "success">>
<p>You charm your way through speed dating. Three numbers, two compliments, and one guy who won't stop staring. Good Valentine's Day.</p>
<<modStat "mood" 15 "Valentine's mixer">>
<<modStat "confidence" 8 "Desired">>
<<modRep "popular" 3>>
<<else>>
<p>Speed dating is awkward. You run out of things to say. The champagne helps but not enough.</p>
<<modStat "mood" 3 "Awkward mixer">>
<</if>>
<<modRep "popular" 2>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Head home</span>' "DormRoom">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🏖️ SPRING BREAK — Sem 2, Week 12
Redirects to full Playa Caliente in 17b_spring_break.twee
═══════════════════════════════════════════════════ */<h2>🏖️ Spring Break!</h2>
<p>One week of freedom. No classes. No obligations (well, except CCUMDUP — but quota is paused at the resort). The bus to Playa Caliente leaves in an hour.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏖️ Go to Playa Caliente!</span>' "PlayaCaliente_Hub">><</link>>
<<link '<span class="choice-btn">🏠 Stay on campus and catch up</span>' "SpringBreak_Campus">><</link>>
</div><h2>🏠 Spring Break on Campus</h2>
<<advanceTime 480>>
<p>The campus is a ghost town. But the quiet is nice. You catch up on sleep, studying, and self-care.</p>
<<modStat "stress" -25 "Break rest">>
<<modStat "mood" 10 "Quiet break">>
<<modStat "energy" 30 "Rest">>
<<addXP "studying" 20>>
<<addXP "intelligence" 10>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to routine</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🎓 END OF YEAR PARTY — Sem 2, Week 16
═══════════════════════════════════════════════════ */<h2>🎓 End of Year Blowout!</h2>
<p>The last day of the academic year. Every dorm, frat, and sorority is throwing something. The campus is a festival of chaos, nostalgia, and reckless abandon.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🎉 Hit ALL the parties</span>' "EndOfYear_PartyHop">><</link>>
<<link '<span class="choice-btn">📸 Yearbook photos and chill</span>' "EndOfYear_Chill">><</link>>
</div><h2>🎉 Party Hopping</h2>
<<advanceTime 300>>
<p>You hit five parties in one night. Each one wilder than the last. By party three, you've lost your shoes. By party five, you've lost your dignity.</p>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 3)>>
<<set $substances.drinksToday += 5>>
<<modStat "mood" 25 "Epic night">>
<<modRep "partyGirl" 10>>
<<modRep "popular" 5>>
<<modStat "stress" -15 "Year end release">>
<<toneThink "I survived. Barely." "What a year. What a night." "BEST YEAR EVER! I can't wait for next year! 🎉">>
<p>You collapse into bed at dawn with a phone full of photos you don't remember taking.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😴 Pass out</span>' "DormRoom">>
<<advanceDay>>
<</link>>
</div><h2>📸 Last Day Reflections</h2>
<<advanceTime 180>>
<p>Yearbook photos on the quad. You pose with classmates, your roommate, sorority sisters. Everyone's sentimental.</p>
<p><<toneThink "One year down. Two to go. I can do this." "It hasn't been all bad. Some of it was... good?" "I'm going to miss everyone SO much! 😭 But we'll be back!">></p>
<<modStat "mood" 15 "Nostalgia">>
<<modRep "sweetheart" 3>>
<<modRep "popular" 3>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "CampusMap">><</link>>
</div>/* ═══════════════════════════════════════════════════
PLAYA CALIENTE — SPRING BREAK RESORT
Self-contained sandbox hub. 10 locations.
Triggers Sem 2, Weeks 12-13.
CCUMDUP quota paused, voluntary service = 2× credits.
═══════════════════════════════════════════════════ */
/* ─── Init spring break state ─── */
<<widget "initSpringBreak">>
<<if !$springBreak || !$springBreak.active>>
<<set $springBreak = {
active: true,
day: 1,
maxDays: 7,
queenPoints: 0,
contestsEntered: 0,
contestsWon: 0,
hookups: 0,
drugsUsed: 0,
photosPosted: 0,
vipAccess: false,
themedNight: "",
massageSpecial: false,
skinnyDipped: false,
lastNightEvent: ""
}>>
<</if>>
<</widget>>
/* ─── Advance resort day ─── */
<<widget "advanceResortDay">>
<<set $springBreak.day++>>
<<advanceDay>>
<<if $springBreak.day > $springBreak.maxDays>>
<<goto "PlayaCaliente_Return">>
<</if>>
<</widget>>
/* ─── Generate resort NPC ─── */
<<widget "genResortNPC">>
<<set _rnpc = XCLC.NPC.generate({gender: _args[0] || "male", type: "resort"})>>
<</widget>>
/* ═══════════════════════════════════════════════════
🏖️ RESORT HUB
═══════════════════════════════════════════════════ */<<initSpringBreak>>
<h2>🏖️ Playa Caliente — Day <<print $springBreak.day>> of <<print $springBreak.maxDays>></h2>
<p><<if $springBreak.day === 1>>You step off the bus into a wall of heat, tequila fumes, and reggaeton. Playa Caliente Resort stretches before you — turquoise pools, white sand, and hundreds of barely-dressed college students. This is spring break.<<else>>Another day in paradise. The sun is blazing, the bass is thumping, and the resort is alive with chaos.<</if>></p>
<<set _timeOfDay = "morning">>
<<if $world.time >= 720>><<set _timeOfDay = "afternoon">><</if>>
<<if $world.time >= 1020>><<set _timeOfDay = "evening">><</if>>
<<if $world.time >= 1260>><<set _timeOfDay = "night">><</if>>
/* Themed night announcement */
<<if _timeOfDay === "evening" || _timeOfDay === "night">>
<<set _nights = ["Foam Party 🫧", "Neon Party 🌈", "Lingerie Party 🩱", "Anything Goes 🔞"]>>
<<set $springBreak.themedNight = _nights[($springBreak.day - 1) % _nights.length]>>
<div class="alert alert--info">🌙 <strong>Tonight at Fuego:</strong> <<print $springBreak.themedNight>></div>
<</if>>
<<divider "Where to?">>
<div class="choice-group">
<<link '<span class="choice-btn">🏨 Hotel Room</span>' "PlayaCaliente_Hotel">><</link>>
<<if _timeOfDay === "morning" || _timeOfDay === "afternoon">>
<<link '<span class="choice-btn">🏊 Pool Party</span>' "PlayaCaliente_Pool">><</link>>
<<link '<span class="choice-btn">🏖️ Beach</span>' "PlayaCaliente_Beach">><</link>>
<<link '<span class="choice-btn">🎤 Contest Stage</span>' "PlayaCaliente_Contest">><</link>>
<<link '<span class="choice-btn">💆 Spa</span>' "PlayaCaliente_Spa">><</link>>
<<link '<span class="choice-btn">🌮 Resort Town</span>' "PlayaCaliente_Town">><</link>>
<</if>>
<<link '<span class="choice-btn">🍹 Swim-Up Bar</span>' "PlayaCaliente_Bar">><</link>>
<<if _timeOfDay === "evening" || _timeOfDay === "night">>
<<link '<span class="choice-btn">🎶 Club Fuego</span>' "PlayaCaliente_Club">><</link>>
<<link '<span class="choice-btn">🌊 Secluded Cove</span>' "PlayaCaliente_Cove">><</link>>
<</if>>
<<if $springBreak.vipAccess>>
<<link '<span class="choice-btn">🥂 VIP Lounge</span>' "PlayaCaliente_VIP">><</link>>
<</if>>
</div>
<<divider "">>
<p class="stat-value" style="font-size:0.8em">👑 Queen Points: <<print $springBreak.queenPoints>> | 💋 Hookups: <<print $springBreak.hookups>> | 📸 Posts: <<print $springBreak.photosPosted>></p>
/* ═══════════════════════════════════════════════════
🏨 HOTEL ROOM
═══════════════════════════════════════════════════ */<h2>🏨 Hotel Room</h2>
<p>Your room on the 4th floor. Two queen beds (you're sharing with a girl from your dorm), a balcony overlooking the pool, and a minibar you've already raided.</p>
<div class="choice-group">
<<link '<span class="choice-btn">😴 Sleep (next day)</span>' "PlayaCaliente_Hub">>
<<advanceResortDay>>
<<modStat "energy" 40 "Resort sleep">>
<<modStat "stress" -10 "Vacation rest">>
<</link>>
<<link '<span class="choice-btn">🚿 Shower</span>' "PlayaCaliente_Hotel">>
<<shower>>
<</link>>
<<link '<span class="choice-btn">📸 Post selfie to InstaGlam</span>' "PlayaCaliente_Hotel">>
<<set $springBreak.photosPosted++>>
<<set $springBreak.queenPoints += 2>>
<<modRep "popular" 3>>
<<run XCLC.Toast.show("📸 Spring break selfie posted! +3× followers!", "success")>>
<</link>>
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🏊 POOL PARTY
═══════════════════════════════════════════════════ */<h2>🏊 Pool Party Area</h2>
<<advanceTime 60>>
<p>The pool is massive — infinity edge overlooking the ocean. A DJ blasts music from a floating platform. Bikini-clad bodies everywhere. Someone's already doing body shots off the diving board.</p>
<<genResortNPC "male">>
<<set _poolEvent = random(1, 5)>>
<<if _poolEvent === 1>>
<p>A group of guys from State U challenge you to a chicken fight. <<toneThink "Hard pass." "Sure, why not." "Omg YES!">></p>
<div class="choice-group">
<<link '<span class="choice-btn">🐔 Chicken fight!</span>' "PlayaCaliente_Pool_ChickenFight">><</link>>
<<link '<span class="choice-btn">🏊 Just swim</span>' "PlayaCaliente_Pool_Chill">><</link>>
</div>
<<elseif _poolEvent === 2>>
<p>"BODY SHOTS!" someone screams. A crowd forms around the pool bar. Tequila, salt, and bare stomachs.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🧂 Do body shots</span>' "PlayaCaliente_Pool_BodyShots">><</link>>
<<link '<span class="choice-btn">🍹 Just watch</span>' "PlayaCaliente_Pool_Chill">><</link>>
</div>
<<elseif _poolEvent === 3>>
<p>The pool DJ is running a dance competition on the pool deck. Winner gets a $100 bar tab.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💃 Enter the dance-off</span>' "PlayaCaliente_Pool_Dance">><</link>>
<<link '<span class="choice-btn">🏊 Nah, just chill</span>' "PlayaCaliente_Pool_Chill">><</link>>
</div>
<<else>>
<p>You find a lounger and settle in. Sun, music, and people-watching. This is what spring break is about.</p>
<<goto "PlayaCaliente_Pool_Chill">>
<</if>><h2>🐔 Chicken Fight!</h2>
<<advanceTime 30>>
<p>You climb onto a guy's shoulders. His hands grip your thighs. The other team charges.</p>
<<set _fightResult = XCLC.Roll.doCheck("stamina", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _fightResult === "crit_success" || _fightResult === "success">>
<p>You DOMINATE. The other girl topples into the water. The crowd cheers. Your partner high-fives you — and his hand definitely lingers.</p>
<<modStat "mood" 15 "Won chicken fight">>
<<modStat "confidence" 5 "Pool victory">>
<<set $springBreak.queenPoints += 3>>
<<else>>
<p>You go down hard, hitting the water with a graceless splash. Your bikini top... shifts. You surface to wolf-whistles and scramble to fix it.</p>
<<modStat "arousal" 10 "Wardrobe malfunction">>
<<modRep "slut" 2>>
<<set $springBreak.queenPoints += 1>>
<</if>>
<<addXP "stamina" 10>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to pool</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🧂 Body Shots</h2>
<<advanceTime 30>>
<p>You lie back on the pool bar. Salt on your stomach, lime between your lips. A stranger's tongue trails up your abs, licks the salt, takes the shot, and bites the lime from your mouth. The crowd roars.</p>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<set $substances.drinksToday++>>
<<modStat "arousal" 15 "Body shots">>
<<modStat "mood" 10 "Party">>
<<modRep "partyGirl" 3>>
<<modRep "slut" 2>>
<<set $springBreak.queenPoints += 2>>
<<toneThink "I can't believe I just did that." "That was... intense." "That was SO hot. Next round!">>;
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>💃 Pool Deck Dance-Off</h2>
<<advanceTime 30>>
<<set _danceResult = XCLC.Roll.doCheck("dance", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _danceResult === "crit_success" || _danceResult === "success">>
<p>You OWN the dance floor. Hips, shoulders, drops — the crowd is chanting your name. First place! $100 bar tab is yours.</p>
<<payPlayer 100 "Dance-off winner">>
<<set $springBreak.queenPoints += 5>>
<<modStat "confidence" 10 "Won dance-off">>
<<modRep "popular" 5>>
<<else>>
<p>Your moves are... okay. You don't win but you don't embarrass yourself. Third place gets you a free drink.</p>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<set $springBreak.queenPoints += 1>>
<</if>>
<<addXP "dance" 15>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🏊 Pool Chill</h2>
<<advanceTime 60>>
<p>You float in the pool, drink in hand, sun on your face. This is the life. <<toneThink "At least the resort is nice." "This is actually relaxing." "This is HEAVEN! ☀️">></p>
<<modStat "stress" -10 "Pool relaxation">>
<<modStat "mood" 5 "Chilling">>
<<modHygiene -10 "Pool">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🏖️ BEACH
═══════════════════════════════════════════════════ */<h2>🏖️ Beach</h2>
<<advanceTime 60>>
<p>White sand stretches forever. Volleyball nets, surfboards, and a suspicious number of guys with camera phones.</p>
<<set _beachEvent = random(1, 4)>>
<<if _beachEvent === 1>>
<p>A volleyball game is forming up. They need one more player.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🏐 Play volleyball</span>' "PlayaCaliente_Beach_Volleyball">><</link>>
<<link '<span class="choice-btn">🏖️ Just tan</span>' "PlayaCaliente_Beach_Tan">><</link>>
</div>
<<elseif _beachEvent === 2>>
<p>A group is playing a drinking game. Loser strips.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🍺 Join the game</span>' "PlayaCaliente_Beach_DrinkGame">><</link>>
<<link '<span class="choice-btn">🏖️ Just tan</span>' "PlayaCaliente_Beach_Tan">><</link>>
</div>
<<else>>
<p>It's a gorgeous day. Perfect for tanning.</p>
<<goto "PlayaCaliente_Beach_Tan">>
<</if>><h2>🏐 Beach Volleyball</h2>
<<advanceTime 60>>
<<set _vbResult = XCLC.Roll.doCheck("stamina", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _vbResult === "crit_success" || _vbResult === "success">>
<p>Your team wins! High fives, victory screams, and someone pours a beer over your head in celebration. You're drenched but grinning.</p>
<<modStat "mood" 15 "Volleyball win">>
<<set $springBreak.queenPoints += 3>>
<<addXP "stamina" 15>>
<<else>>
<p>Your team loses. But you played hard and looked good doing it. A cute guy from the other team asks for your number.</p>
<<modStat "mood" 5 "Good game">>
<<set $springBreak.queenPoints += 1>>
<<addXP "stamina" 10>>
<</if>>
<<modHygiene -15 "Beach sports">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🍺 Strip Drinking Game</h2>
<<advanceTime 60>>
<p>It's "Kings" but with a twist — every time you lose a round, something comes off. You start with 4 items.</p>
<<set _rounds = 0>>
<<set _stripped = 0>>
<<for _r = 0; _r < 4; _r++>>
<<if random(1, 6) <= 3>>
<<set _stripped++>>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<set $substances.drinksToday++>>
<</if>>
<</for>>
<<if _stripped >= 3>>
<p>Three rounds in and you're down to your underwear. Everyone's cheering. The fourth round... you lose your top. The beach erupts.</p>
<<modStat "arousal" 20 "Stripped on beach">>
<<modRep "slut" 5>>
<<modRep "partyGirl" 5>>
<<set $springBreak.queenPoints += 5>>
<<elseif _stripped >= 1>>
<p>You lose a couple rounds but manage to keep the essentials on. Still, everyone saw more of you than you intended.</p>
<<modStat "arousal" 10 "Partially stripped">>
<<modRep "partyGirl" 3>>
<<set $springBreak.queenPoints += 2>>
<<else>>
<p>Lady luck is on your side. You win every round. Everyone else is stripping while you sip your drink smugly.</p>
<<modStat "confidence" 10 "Won strip game">>
<<set $springBreak.queenPoints += 2>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>☀️ Tanning</h2>
<<advanceTime 60>>
<p>You lay out a towel and soak in the sun. The waves crash. The world is warm and lazy.</p>
<<modStat "stress" -10 "Beach relaxation">>
<<modStat "mood" 8 "Tanning">>
<<set $pc.beautyBase = Math.min(60, $pc.beautyBase + 1)>>
<<run XCLC.Beauty.recalculate()>>
<<run XCLC.Toast.show("☀️ Got a nice tan! Beauty +1", "success")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🍹 SWIM-UP BAR
═══════════════════════════════════════════════════ */<h2>🍹 Swim-Up Bar</h2>
<<advanceTime 30>>
<p>The bar is literally in the pool. You wade up on a submerged stool, water lapping at your waist, and the bartender slides over a menu of catastrophically strong cocktails.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🍹 Order a cocktail (+1 drunk)</span>' "PlayaCaliente_Bar">>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<set $substances.drinksToday++>>
<<modStat "mood" 5 "Resort drink">>
<<payPlayer -15 "Cocktail">>
<<run XCLC.Toast.show("🍹 Mmm, tropical!", "info")>>
<</link>>
<<link '<span class="choice-btn">🌿 Score some weed ($30)</span>' "PlayaCaliente_Bar">>
<<if $finance.money >= 30>>
<<payPlayer -30 "Resort weed">>
<<set $substances.weed.high = true>>
<<set $springBreak.drugsUsed++>>
<<modStat "stress" -15 "Weed">>
<<modStat "mood" 10 "High">>
<<run XCLC.Toast.show("🌿 The resort stuff hits different.", "success")>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">💊 Score ecstasy ($50)</span>' "PlayaCaliente_Bar">>
<<if $finance.money >= 50>>
<<payPlayer -50 "Ecstasy">>
<<set $substances.ecstasy.rolling = true>>
<<set $springBreak.drugsUsed++>>
<<modStat "mood" 30 "Rolling">>
<<modStat "arousal" 25 "Ecstasy">>
<<modStat "willpower" -20 "Ecstasy">>
<<run XCLC.Toast.show("💊 Everything is beautiful.", "info")>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">💬 Flirt with someone</span>' "PlayaCaliente_Bar_Flirt">><</link>>
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>💬 Bar Flirting</h2>
<<advanceTime 30>>
<<genResortNPC "male">>
<p>A <<print _rnpc.bodyType>> <<print _rnpc.race>> guy with a tan and a confident grin leans against the bar next to you. "You here with anyone?"</p>
<<set _flirtResult = XCLC.Roll.doCheck("charm", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _flirtResult === "crit_success" || _flirtResult === "success">>
<p>The chemistry is instant. Drinks, laughter, his hand on your knee under the water. <<toneThink "Don't let this get to me." "He's actually charming." "He's SO hot. Where has he been all week?">></p>
<<modStat "arousal" 15 "Flirting">>
<<modStat "mood" 10 "Chemistry">>
<<set $springBreak.hookups++>>
<<set $springBreak.queenPoints += 2>>
<div class="choice-group">
<<link '<span class="choice-btn">🏨 Take him back to the hotel</span>' "PlayaCaliente_Hookup">><</link>>
<<link '<span class="choice-btn">😘 Just flirt, nothing more</span>' "PlayaCaliente_Hub">><</link>>
</div>
<<else>>
<p>He's nice but there's no spark. You chat politely and move on.</p>
<<modStat "mood" 3 "Nice chat">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
<</if>><h2>🏨 Resort Hookup</h2>
<<advanceTime 90>>
<p>You stumble back to the hotel room together, barely making it through the door before his hands are everywhere. The balcony door is open, ocean breeze mixing with heavy breathing.</p>
<<set _hookupResult = XCLC.Roll.doCheck("vaginal", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _hookupResult === "crit_success" || _hookupResult === "success">>
<p>It's passionate, intense, and over too quickly. He collapses next to you. "That was incredible." <<toneReact "Whatever." "It was... good." "AMAZING! 🔥">></p>
<<modStat "mood" 15 "Good hookup">>
<<modStat "arousal" -30 "Satisfaction">>
<<addXP "vaginal" 15>>
<<else>>
<p>It's clumsy, rushed, and he finishes before you even get started. He passes out immediately. You stare at the ceiling.</p>
<<modStat "mood" -5 "Disappointing">>
<<modStat "arousal" 10 "Unfinished">>
<<addXP "vaginal" 5>>
<</if>>
<<modHygiene -20 "Hookup">>
<<modRep "slut" 3>>
<<set $springBreak.hookups++>>
/* Pregnancy risk — resort hookups are unprotected */
<<pregnancyRisk _rnpc.race>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🎤 CONTEST STAGE
═══════════════════════════════════════════════════ */<h2>🎤 Contest Stage</h2>
<<advanceTime 30>>
<p>The beachside stage is set up for today's competition. A crowd is already gathering. The MC grabs his mic.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💦 Wet T-Shirt Contest</span>' "PlayaCaliente_WetTshirt">><</link>>
<<link '<span class="choice-btn">👙 Bikini Contest</span>' "PlayaCaliente_BikiniContest">><</link>>
<<if $springBreak.day >= 5>>
<<link '<span class="choice-btn">👑 Spring Break Queen Finals</span>' "PlayaCaliente_QueenFinals">><</link>>
<</if>>
<<link '<span class="choice-btn">👀 Just watch</span>' "PlayaCaliente_Hub">>
<<modStat "mood" 3 "People watching">>
<</link>>
</div><h2>💦 Wet T-Shirt Contest</h2>
<<advanceTime 60>>
<<set $springBreak.contestsEntered++>>
<p>You stand on stage in a white t-shirt. The MC counts down. "THREE... TWO... ONE..." Cold water hits you like a truck. The shirt turns transparent instantly. Hundreds of phones come out.</p>
<<set _wtResult = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _wtResult === "crit_success" || _wtResult === "success">>
<p>🏆 <strong>WINNER!</strong> The crowd is insane. You're drenched, exposed, and somehow triumphant. Prize: $200 and a bottle of champagne.</p>
<<payPlayer 200 "Wet t-shirt winner">>
<<set $springBreak.contestsWon++>>
<<set $springBreak.queenPoints += 10>>
<<modRep "slut" 5>>
<<modRep "popular" 8>>
<<modStat "confidence" 10 "Contest winner">>
<<else>>
<p>You don't win, but you put on a show. The crowd appreciated the effort. Participation prize: a free shot of tequila.</p>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<set $springBreak.queenPoints += 3>>
<<modRep "slut" 3>>
<<modRep "partyGirl" 2>>
<</if>>
<<modHygiene -10 "Soaked">>
<<set $springBreak.photosPosted++>>
<<addXP "charm" 10>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>👙 Bikini Contest</h2>
<<advanceTime 60>>
<<set $springBreak.contestsEntered++>>
<p>You strut across the stage in your swimwear. The MC narrates your "talents." The crowd cheers based on volume.</p>
<<set _bikiniResult = XCLC.Roll.doCheck("charm", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _bikiniResult === "crit_success" || _bikiniResult === "success">>
<p>🏆 The crowd ROARS for you! You win by a landslide. $150 prize and a tiara.</p>
<<payPlayer 150 "Bikini contest">>
<<set $springBreak.contestsWon++>>
<<set $springBreak.queenPoints += 8>>
<<modRep "popular" 5>>
<<modStat "confidence" 10 "Bikini queen">>
<<else>>
<p>You place in the middle. Not bad, not great. The winner had implants, which feels like cheating.</p>
<<set $springBreak.queenPoints += 2>>
<<modStat "mood" 3 "Decent showing">>
<</if>>
<<addXP "charm" 10>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>👑 Spring Break Queen — FINALS</h2>
<<advanceTime 120>>
<p>The grand finale. All week's accumulated Queen Points determine who gets crowned Spring Break Queen of Playa Caliente.</p>
<<if $springBreak.queenPoints >= 30>>
<p>🏆👑 <strong>YOU WIN! YOU ARE THE SPRING BREAK QUEEN!</strong></p>
<p>The tiara goes on your head. Champagne is sprayed. You're lifted onto shoulders. Photos everywhere. Your InstaGlam explodes with notifications.</p>
<<modStat "confidence" 20 "Spring Break Queen">>
<<modRep "popular" 15>>
<<modStat "mood" 30 "Crowned queen">>
<<modStat "femininity" 5 "Embraced fame">>
<<awardAchievement "springBreakQueen">>
<<elseif $springBreak.queenPoints >= 15>>
<p>Runner-up. Close but not close enough. The winner is a blonde from USC who seemed to live at the contest stage. Still, second place gets you a sash and photos.</p>
<<modStat "mood" 10 "Runner up">>
<<modRep "popular" 5>>
<<else>>
<p>You didn't even make the top 5. Maybe next year. The crowd barely notices.</p>
<<modStat "mood" -5 "Didn't place">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🎶 CLUB FUEGO + VIP
═══════════════════════════════════════════════════ */<h2>🎶 Club Fuego — <<print $springBreak.themedNight>></h2>
<<advanceTime 120>>
<p>The club is massive. Three floors of pounding bass, laser lights, and writhing bodies. Tonight's theme: <<print $springBreak.themedNight>>.</p>
<<if $springBreak.themedNight.indexOf("Foam") !== -1>>
<p>Foam cannons blast from the ceiling. Within minutes you're covered in suds, sliding against strangers, unable to tell where one body ends and another begins.</p>
<<modStat "arousal" 15 "Foam party">>
<<modHygiene -15 "Foam">>
<<elseif $springBreak.themedNight.indexOf("Neon") !== -1>>
<p>UV paint stations at the entrance. You're covered in glowing patterns. Under the blacklights, the whole club is a psychedelic fever dream.</p>
<<modStat "mood" 10 "Neon party">>
<<elseif $springBreak.themedNight.indexOf("Lingerie") !== -1>>
<p>Everyone's in their underwear. Or less. The dress code is "bedroom." You feel simultaneously exposed and powerful.</p>
<<modStat "arousal" 20 "Lingerie party">>
<<modRep "slut" 3>>
<<else>>
<p>"Anything Goes" means exactly what it sounds like. The back rooms are open. The VIP section is a free-for-all. Things are getting wild.</p>
<<modStat "arousal" 25 "Anything goes">>
<<modRep "slut" 5>>
<</if>>
<<modRep "partyGirl" 5>>
<<set $springBreak.queenPoints += 3>>
<<addXP "dance" 10>>
<<addXP "charm" 5>>
<div class="choice-group">
<<link '<span class="choice-btn">💃 Dance (build Queen points)</span>' "PlayaCaliente_Club">>
<<set $springBreak.queenPoints += 2>>
<<modStat "mood" 5 "Dancing">>
<<advanceTime 60>>
<</link>>
<<if !$springBreak.vipAccess>>
<<link '<span class="choice-btn">🥂 Try to get into VIP</span>' "PlayaCaliente_VIP_Check">><</link>>
<<else>>
<<link '<span class="choice-btn">🥂 VIP Lounge</span>' "PlayaCaliente_VIP">><</link>>
<</if>>
<<link '<span class="choice-btn">🌊 Sneak to the cove</span>' "PlayaCaliente_Cove">><</link>>
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🥂 VIP Bouncer</h2>
<p>A massive bouncer blocks the velvet rope. "VIP only. You on the list?"</p>
<<set _vipCheck = XCLC.Roll.doCheck("charm", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _vipCheck === "crit_success" || _vipCheck === "success">>
<p>You flash your best smile, lean in, and whisper something in his ear. He grins and unhooks the rope. "Go ahead, beautiful."</p>
<<set $springBreak.vipAccess = true>>
<<run XCLC.Toast.show("🥂 VIP access unlocked for the week!", "success")>>
<<goto "PlayaCaliente_VIP">>
<<else>>
<p>"Sorry, sweetheart. List only." He doesn't budge. Maybe try again tomorrow — or find another way in.</p>
<<modStat "mood" -5 "Rejected">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to the club</span>' "PlayaCaliente_Club">><</link>>
</div>
<</if>><h2>🥂 VIP Lounge</h2>
<<advanceTime 60>>
<p>Crystal chandeliers, champagne towers, and people who look like they own things. The VIP lounge is another world. Wealthy older men, trophy wives, and a few celebrities you half-recognise.</p>
<<genResortNPC "male">>
<p>A man in a tailored linen shirt watches you from across the lounge. Silver hair, expensive watch. He sends over a bottle of champagne with his card: <em>"Join me? — R."</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">🥂 Join him</span>' "PlayaCaliente_VIP_SugarDaddy">><</link>>
<<link '<span class="choice-btn">🍾 Enjoy the champagne alone</span>' "PlayaCaliente_Hub">>
<<set $substances.drunkLevel = Math.min(4, $substances.drunkLevel + 1)>>
<<modStat "mood" 10 "Free champagne">>
<</link>>
</div><h2>🥂 The Wealthy Stranger</h2>
<<advanceTime 60>>
<p>"R" turns out to be a businessman from Miami. Charming, confident, and very generous. He orders another bottle. His hand finds your knee.</p>
<p>"I have a suite upstairs. Penthouse. Want to see the view?"</p>
<<toneThink "This is dangerous." "He's rich. And attractive. Why not?" "Omg he's like a real sugar daddy! 💎">>
<div class="choice-group">
<<link '<span class="choice-btn">🏨 Go to his penthouse</span>' "PlayaCaliente_Hookup">>
<<payPlayer 300 "Sugar daddy gift">>
<<set $springBreak.queenPoints += 5>>
<</link>>
<<link '<span class="choice-btn">😘 Politely decline</span>' "PlayaCaliente_Hub">>
<<modStat "confidence" 5 "Turned down sugar daddy">>
<</link>>
</div>
/* ═══════════════════════════════════════════════════
🌊 SECLUDED COVE
═══════════════════════════════════════════════════ */<h2>🌊 Secluded Cove</h2>
<<advanceTime 60>>
<p>A hidden beach around the headland. Moonlight on dark water. The sounds of the resort fade to distant bass. It's private, romantic, and slightly dangerous.</p>
<<set _coveEvent = random(1, 3)>>
<<if _coveEvent === 1 && !$springBreak.skinnyDipped>>
<p>A group of students is skinny dipping in the cove. They wave you over. "Come on! The water's perfect!"</p>
<div class="choice-group">
<<link '<span class="choice-btn">🩱 Strip and swim!</span>' "PlayaCaliente_Cove_Skinny">><</link>>
<<link '<span class="choice-btn">🔙 Not tonight</span>' "PlayaCaliente_Hub">><</link>>
</div>
<<elseif _coveEvent === 2>>
<<genResortNPC "male">>
<p>You find a couple making out in the shallows. They spot you and grin. "Want to join?" <<toneThink "No. Absolutely not." "...maybe?" "YES. 😏">></p>
<div class="choice-group">
<<link '<span class="choice-btn">😏 Join them</span>' "PlayaCaliente_Cove_Threesome">><</link>>
<<link '<span class="choice-btn">🔙 Leave them to it</span>' "PlayaCaliente_Hub">><</link>>
</div>
<<else>>
<p>The cove is empty. Just you, the ocean, and the stars. Peaceful.</p>
<<modStat "stress" -15 "Cove serenity">>
<<modStat "mood" 10 "Stargazing">>
<<toneThink "Quiet is good." "This is beautiful." "So romantic... wish someone was here with me. 💫">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
<</if>><h2>🌊 Skinny Dipping</h2>
<<advanceTime 30>>
<<set $springBreak.skinnyDipped = true>>
<p>You strip down on the rocks. The moonlight catches your skin. You dive in. The water is warm silk. You're naked in the ocean with strangers and it feels... free.</p>
<<modStat "arousal" 15 "Skinny dipping">>
<<modStat "mood" 15 "Freedom">>
<<modStat "femininity" 2 "Embracing body">>
<<modRep "slut" 2>>
<<set $springBreak.queenPoints += 3>>
<<toneThink "This is insane. What am I doing?" "This is... actually amazing." "BEST. FEELING. EVER! 🌊">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Get dressed, head back</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🌊 Cove Encounter</h2>
<<advanceTime 60>>
<p>The water is warm. Hands find you in the dark. What happens in the cove stays in the cove.</p>
<<set _threesomeResult = XCLC.Roll.doCheck("vaginal", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _threesomeResult === "crit_success" || _threesomeResult === "success">>
<p>The three of you move together in the shallow waves. It's primal, beautiful, and absolutely unforgettable.</p>
<<modStat "mood" 15 "Amazing encounter">>
<<addXP "vaginal" 20>>
<<else>>
<p>It's awkward. Someone swallows seawater. You bang your knee on a rock. But it's still an experience.</p>
<<addXP "vaginal" 10>>
<</if>>
<<modHygiene -25 "Beach sex">>
<<modRep "slut" 5>>
<<set $springBreak.hookups += 2>>
<<set $springBreak.queenPoints += 5>>
<<pregnancyRisk "unknown">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
💆 SPA + 🌮 TOWN
═══════════════════════════════════════════════════ */<h2>💆 Resort Spa</h2>
<<advanceTime 60>>
<p>Cool marble, eucalyptus steam, and the sound of whale music. The spa is an oasis of calm amid the chaos.</p>
<div class="choice-group">
<<link '<span class="choice-btn">💆 Standard massage ($30)</span>' "PlayaCaliente_Spa">>
<<if $finance.money >= 30>>
<<payPlayer -30 "Spa massage">>
<<modStat "stress" -25 "Massage">>
<<modStat "mood" 10 "Relaxed">>
<<set $pc.beautyBase = Math.min(60, $pc.beautyBase + 1)>>
<<run XCLC.Beauty.recalculate()>>
<<run XCLC.Toast.show("💆 So relaxing... Beauty +1", "success")>>
<<advanceTime 60>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<if !$springBreak.massageSpecial>>
<<link '<span class="choice-btn">😏 "Special" massage ($80)</span>' "PlayaCaliente_Spa_Special">><</link>>
<</if>>
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>😏 The "Special" Massage</h2>
<<advanceTime 90>>
<<if $finance.money < 80>>
<p>You can't afford the special treatment.</p>
<<else>>
<<payPlayer -80 "Special massage">>
<<set $springBreak.massageSpecial = true>>
<p>The masseuse closes the door and dims the lights further. "This is our... premium service." Warm oil, skilled hands, and the massage goes places a normal massage doesn't.</p>
<<modStat "stress" -30 "Deep relaxation">>
<<modStat "arousal" 25 "Special massage">>
<<modStat "mood" 15 "Spa bliss">>
<<toneThink "What is happening." "Okay, that's... good." "Oh my GOD this is incredible. 😳">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div><h2>🌮 Resort Town</h2>
<<advanceTime 60>>
<p>A dusty strip of colourful buildings outside the resort gates. Market stalls, a taco stand, a pharmacist, and a souvenir shop.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🌮 Eat tacos ($10, +energy)</span>' "PlayaCaliente_Town">>
<<if $finance.money >= 10>>
<<payPlayer -10 "Street tacos">>
<<modStat "energy" 15 "Fed">>
<<modStat "mood" 5 "Good food">>
<<run XCLC.Toast.show("🌮 Amazing street tacos!", "success")>>
<<else>>
<<run XCLC.Toast.show("💸 Too broke for tacos.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">👙 Buy swimwear ($40)</span>' "PlayaCaliente_Town">>
<<if $finance.money >= 40>>
<<payPlayer -40 "New swimwear">>
<<set $pc.beautyClothing = Math.min(20, $pc.beautyClothing + 5)>>
<<run XCLC.Beauty.recalculate()>>
<<run XCLC.Toast.show("👙 New bikini! Beauty +5", "success")>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">💊 Farmacia — morning-after pill ($25)</span>' "PlayaCaliente_Town">>
<<if $finance.money >= 25>>
<<payPlayer -25 "Morning after pill">>
<<if $pregnancy.isPregnant && $pregnancy.weeksPregnant === 0>>
<<set $pregnancy.isPregnant = false>>
<<run XCLC.Toast.show("💊 Taken. Crisis averted.", "success")>>
<<else>>
<<run XCLC.Toast.show("💊 Taken, just in case.", "info")>>
<</if>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">🛍️ Buy souvenirs ($20)</span>' "PlayaCaliente_Town">>
<<if $finance.money >= 20>>
<<payPlayer -20 "Souvenirs">>
<<modStat "mood" 5 "Souvenirs">>
<<run XCLC.Toast.show("🛍️ Tacky fridge magnets acquired!", "success")>>
<<else>>
<<run XCLC.Toast.show("💸 Can't afford it.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">🔙 Back to resort</span>' "PlayaCaliente_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🔙 RETURN TO CAMPUS
═══════════════════════════════════════════════════ */<h2>🔙 Back to Campus</h2>
<<set $springBreak.active = false>>
<p>The bus back to Thornfield is quiet. Everyone's sunburnt, hungover, and carrying way too many souvenirs. You stare out the window, replaying the week in your head.</p>
<div class="card">
<div class="card__title">🏖️ Spring Break Recap</div>
<p><strong>Days at resort:</strong> <<print $springBreak.maxDays>></p>
<p><strong>👑 Queen Points:</strong> <<print $springBreak.queenPoints>></p>
<p><strong>💋 Hookups:</strong> <<print $springBreak.hookups>></p>
<p><strong>🏆 Contests entered:</strong> <<print $springBreak.contestsEntered>> (won <<print $springBreak.contestsWon>>)</p>
<p><strong>📸 Photos posted:</strong> <<print $springBreak.photosPosted>></p>
<<if $springBreak.drugsUsed > 0>><p><strong>💊 Substances used:</strong> <<print $springBreak.drugsUsed>> times</p><</if>>
<<if $springBreak.skinnyDipped>><p>🌊 <em>Went skinny dipping!</em></p><</if>>
<<if $springBreak.vipAccess>><p>🥂 <em>Got VIP access!</em></p><</if>>
<<if $springBreak.massageSpecial>><p>💆 <em>Had the "special" massage...</em></p><</if>>
</div>
<<toneThink "Survived. Back to the grind." "That was actually... fun. Back to reality." "Best week EVER. I'm already planning next year! 🏖️">>
<<modRep "partyGirl" 5>>
<div class="choice-group">
<<link '<span class="choice-btn">🗺️ Back to Campus</span>' "CampusMap">><</link>>
</div><h2>🎓 Graduation Day</h2>
<p>Three years. Six semesters. Countless encounters, classes, parties, and transformations. You stand in the back row of the graduation ceremony in a cap and gown, heart pounding.</p>
<p>Dean Harrison calls your name. "<<print $pc.firstName>> <<print $pc.lastName>>." You walk across the stage. The crowd applauds. Your roommate whistles from the front row.</p>
<p>It's over. The CCUMDUP programme is complete. You have your degree. And you have... a very different life than you started with.</p>
/* Calculate dominant path */
<<set _path = "ordinary">>
<<set _maxRep = 0>>
/* Scholar */
<<if $reputation.goodStudent >= 60 && $pc.intelligence >= 60>>
<<set _path = "scholar">>
<</if>>
/* Embraced */
<<if $pc.femininity >= 80 && $pc.mood >= 50>>
<<set _path = "embraced">>
<</if>>
/* Celebrity */
<<if $reputation.popular >= 60 || $reputation.camGirl >= 60>>
<<if _path !== "embraced" || $reputation.popular > 70>>
<<set _path = "celebrity">>
<</if>>
<</if>>
/* Professional */
<<if $jobs.current.length >= 2 && $pc.intelligence >= 50 && $reputation.goodStudent >= 40>>
<<if _path === "ordinary">>
<<set _path = "professional">>
<</if>>
<</if>>
/* Corruption */
<<if $reputation.slut >= 80 && $reputation.troublemaker >= 40>>
<<set _path = "corruption">>
<</if>>
<<divider "Your Future">>
<<include "Ending_" + _path>>
<<divider "">>
<<include "EndingStats">>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔄 New Game</span>' "Start">><</link>>
</div>
/* ═══════════════════════════════════════════════════
EPILOGUE PASSAGES
═══════════════════════════════════════════════════ */<h2>📚 The Scholar</h2>
<p>Your grades were exceptional. Despite everything — the services, the side effects, the chaos — you graduated with honours. The Dean personally recommends you for graduate school.</p>
<p>You apply to a masters programme. Accepted. A quiet apartment, a teaching assistantship, and a life that looks almost... normal. You keep your head down. Study hard. Try not to think about those three years.</p>
<p><<if $pc.femininity >= 50>>Sometimes, late at night, you catch yourself in the mirror and wonder if you miss it. The attention. The power. The feeling of being... wanted. You push the thought away and open your textbook.<<else>>You're back in your male body within weeks of graduation. The memories fade, mostly. But sometimes in a crowded lecture hall, you'll catch the scent of someone's perfume and your heart will race for reasons you can't explain.<</if>></p>
<p class="thought"><em>THE END — The Scholar 📚</em></p><h2>💃 Embraced</h2>
<p>Somewhere during those three years, something shifted. You stopped fighting. Stopped pretending this was temporary. The X-Change transformation was supposed to end at graduation. But you don't want it to.</p>
<p>You contact CCUMDUP administration. "I'd like to extend my transformation. Permanently." The paperwork takes a week. The decision takes a lifetime.</p>
<p><<if $roommate && $roommate.opinion >= 70>>Your roommate cries. "I knew it," she says, hugging you tight. "Welcome to the sisterhood. For real this time."<<else>>Your friends aren't surprised. "We could tell," they say. "You've been happier this way for a while now."<</if>></p>
<p>You get a job. An apartment. A life. As a woman. As yourself. It's not the life you planned. But it's yours.</p>
<p class="thought"><em>THE END — Embraced 💃</em></p><h2>⭐ The Celebrity</h2>
<p>Your InstaGlam has 200K followers. Your FansOnly clears five figures a month. You were recognised at three different airports on the way home from spring break. You're famous — or at least internet famous.</p>
<p>A talent agency reaches out before you even graduate. "We'd love to represent you." Sponsorships, appearances, brand deals. The CCUMDUP programme gave you a platform, and you built an empire on it.</p>
<p><<if $reputation.camGirl >= 80>>Your cam career transitions into mainstream content creation. Well, "mainstream." You're the poster girl for a new generation of performers who refuse to be ashamed.<<else>>You leverage your campus celebrity into an influencer career. Fashion, lifestyle, "wellness." Nobody needs to know how it all started.<</if>></p>
<p class="thought"><em>THE END — The Celebrity ⭐</em></p><h2>💼 The Professional</h2>
<p>You put it all on your resume. Well, not ALL of it. "Programme Participant, CCUMDUP Scholarship — Thornfield University." It's a talking point in every interview. The networking, the social skills, the ability to perform under pressure.</p>
<p>You land a corporate job. Good salary. Benefits. A corner office by year two. Your colleagues have no idea what you went through. You keep it that way.</p>
<p>The transformation fades after graduation. You're male again. But the confidence, the social instincts, the ability to read a room — those stay. CCUMDUP taught you more than any business class ever could.</p>
<p class="thought"><em>THE END — The Professional 💼</em></p><h2>😈 The Underground</h2>
<p>You didn't graduate so much as escape. Three years of pushing boundaries, breaking rules, and building connections that don't appear in any alumni directory.</p>
<<if $jobs.dealer.active || ($jobs.dealer && $jobs.dealer.earnings >= 500)>>
<p>Marco has a proposition. "You've got talent, kid. The campus thing was small time. I've got connections in the city. Real money." You know you should say no. You say yes.</p>
<<elseif $jobs.hooker.active || ($jobs.hooker && $jobs.hooker.sessions >= 20)>>
<p>You start your own service. Premium clientele only. Discreet. Expensive. Within a year, you're running a small empire of your own. The CCUMDUP taught you the business — you just took it freelance.</p>
<<else>>
<p>The connections you made — the dangerous ones, the exciting ones — they lead you down paths that don't show up on LinkedIn. But they pay well. Very well.</p>
<</if>>
<p class="thought"><em>THE END — The Underground 😈</em></p><h2>🏠 Moving On</h2>
<p>You graduate. The transformation ends. You go home. You get a job. A normal one. You try to pick up where you left off three years ago, before CCUMDUP, before the pills, before everything.</p>
<p>It's harder than you expected. The world feels flat. Colours less vivid. Conversations less electric. You catch yourself reaching for a phone that doesn't buzz with service requests anymore.</p>
<p><<if $pc.femininity >= 50>>Sometimes you think about going back. About taking another pill. Not for the programme — just for yourself. The thought scares you more than anything that happened at Thornfield.<<else>>You tell yourself you're glad it's over. Most days, you mean it. But some nights, in that half-space between sleep and waking, you remember how it felt to be someone else entirely. And you're not sure "glad" is the right word.<</if>></p>
<p class="thought"><em>THE END — Moving On 🏠</em></p>
/* ═══════════════════════════════════════════════════
STAT SUMMARY SCREEN
═══════════════════════════════════════════════════ */<div class="card">
<div class="card__title">📊 Final Statistics</div>
<p><strong>Total Days:</strong> <<print $world.day>></p>
<p><strong>Semesters Completed:</strong> <<print Math.min(6, $world.semester)>></p>
<p><strong>Final Femininity:</strong> <<print $pc.femininity>>/100</p>
<p><strong>Final Rating:</strong> <<print Math.round($scholarship.rating * 10) / 10>> ⭐</p>
</div>
<div class="card">
<div class="card__title">🎀 CCUMDUP Service</div>
<p><strong>Total serviced:</strong> <<print $scholarship.totalServiced>></p>
<p><strong>Total credits:</strong> <<print $scholarship.totalCredits>></p>
<p><strong>Total ratings received:</strong> <<print $scholarship.totalRatings>></p>
</div>
<div class="card">
<div class="card__title">💰 Finances</div>
<p><strong>Total earned:</strong> $<<print $finance.totalEarned>></p>
<p><strong>Total spent:</strong> $<<print $finance.totalSpent>></p>
<p><strong>Cash at graduation:</strong> $<<print $finance.money>></p>
</div>
<div class="card">
<div class="card__title">📊 Reputation</div>
<<set _repNames = {slut: "🔥 Slut", partyGirl: "🎉 Party Girl", goodStudent: "📚 Good Student", camGirl: "📷 Cam Girl", sweetheart: "💕 Sweetheart", troublemaker: "💀 Troublemaker", popular: "⭐ Popular"}>>
<<set _repKeys = Object.keys(_repNames)>>
<<for _rk = 0; _rk < _repKeys.length; _rk++>>
<<set _key = _repKeys[_rk]>>
<<if $reputation[_key] >= 10>>
<p><<print _repNames[_key]>>: <<print $reputation[_key]>>/100</p>
<</if>>
<</for>>
</div>
<<if $pregnancy.totalPregnancies > 0>>
<div class="card">
<div class="card__title">🤰 Pregnancy History</div>
<p><strong>Total pregnancies:</strong> <<print $pregnancy.totalPregnancies>></p>
<<if $pregnancy.children && $pregnancy.children.length > 0>>
<p><strong>Children:</strong> <<print $pregnancy.children.length>></p>
<</if>>
<<if $pregnancy.decisions && $pregnancy.decisions.length > 0>>
<<set _aborts = $pregnancy.decisions.filter(function(d) { return d === "abort"; }).length>>
<<set _adopts = $pregnancy.decisions.filter(function(d) { return d === "adopt"; }).length>>
<<if _aborts > 0>><p>Abortions: <<print _aborts>></p><</if>>
<<if _adopts > 0>><p>Adoptions: <<print _adopts>></p><</if>>
<</if>>
</div>
<</if>>
<<if $achievements && $achievements.unlocked>>
<div class="card">
<div class="card__title">🏆 Achievements</div>
<p><strong>Unlocked:</strong> <<print $achievements.unlocked.length>> / <<print $achievements.definitions.length>></p>
</div>
<</if>>
/* ═══════════════════════════════════════════════════
EXPULSION
═══════════════════════════════════════════════════ */<h2>🚫 Expelled</h2>
<p>The letter is short. Official university letterhead, the Dean's signature at the bottom.</p>
<p><em>"Dear <<print $pc.firstName>>,</em></p>
<p><em>Following multiple violations of university policy and the CCUMDUP Programme guidelines, we regret to inform you that your enrollment at Thornfield University is hereby <strong>terminated effective immediately</strong>.</em></p>
<p><em>You are required to vacate campus housing within 48 hours."</em></p>
<<if $reputation.troublemaker >= 60>>
<p><<toneThink "They can't do this!" "I suppose I brought this on myself." "No... this can't be happening...">></p>
<<else>>
<p><<toneThink "Finally. Maybe I'm free." "This was always going to happen." "But... my friends... my life here...">></p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🗣️ Appeal the decision</span>' "Expulsion_Appeal">><</link>>
<<link '<span class="choice-btn">📦 Pack up and leave</span>' "Expulsion_Leave">><</link>>
</div><h2>🗣️ Appeal</h2>
<p>You sit across from the Dean in her oak-paneled office. She looks tired.</p>
<p>"<<print $pc.firstName>>, this isn't personal. But the university has standards. The programme has rules."</p>
<<set _appealResult = XCLC.Roll.doCheck("charm", 7)>>
<<run XCLC.DicePopup.show()>>
<<if _appealResult === "crit_success">>
<p>You make your case. Passionately, eloquently, desperately. The Dean pauses. Sighs. "One more chance. <strong>One.</strong> You step out of line again and there's nothing I can do."</p>
<<modStat "stress" 20 "Narrow escape">>
<<set $scholarship.onProbation = true>>
<<set $scholarship.probationWeeks = 0>>
<<run XCLC.Toast.show("🎓 Expulsion reversed! On strict probation.", "success")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to campus (on thin ice)</span>' "CampusMap">><</link>>
</div>
<<else>>
<p>"I've made my decision, <<print $pc.firstName>>. I'm sorry." She slides the paperwork across the desk. There's nothing left to say.</p>
<<goto "Expulsion_Leave">>
<</if>><h2>📦 Leaving Thornfield</h2>
<p>You pack your things. Your roommate watches from her bed, silent. The dorm room that was your world for <<if $world.year >= 2>>two years<<else>>a year<</if>> looks smaller now.</p>
<<if $roommate && $roommate.opinion >= 60>>
<p>She hugs you at the door. "I'll miss you," she says. You believe her.</p>
<<else>>
<p>She waves awkwardly. "Good luck out there."</p>
<</if>>
<p>The campus gates close behind you. The X-Change transformation has <<if $world.semester >= 4>>months<<else>>weeks<</if>> left. After that, you'll be yourself again. Or whoever you are now.</p>
<<toneThink "Good riddance." "I'll figure something out." "I... I don't want to go... 😢">>
<<divider "Final Stats">>
<<include "EndingStats">>
<<divider "">>
<p class="thought"><em>THE END — Expelled 🚫</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">🔄 New Game</span>' "Start">><</link>>
</div>
/* ═══════════════════════════════════════════════════
DROPOUT (voluntary)
═══════════════════════════════════════════════════ */<h2>🏃 Dropping Out</h2>
<p>You walk into the Dean's office on your own terms. "I want to leave the programme."</p>
<p>She looks surprised. "You understand this means forfeiting your scholarship? The transformation will reverse within weeks of discontinuing the programme."</p>
<p>"I know."</p>
<<toneThink "I can't do this anymore." "It's time to go." "I need to find my own path.">>
<p>The paperwork takes an hour. By afternoon, you're packing.</p>
<<divider "Final Stats">>
<<include "EndingStats">>
<<divider "">>
<p class="thought"><em>THE END — Dropout 🏃</em></p>
<div class="choice-group">
<<link '<span class="choice-btn">🔄 New Game</span>' "Start">><</link>>
</div>/* ═══════════════════════════════════════════════════
THORNFIELD — SUBSTANCE SYSTEM WIDGETS
Alcohol states, drug effects, hangovers
═══════════════════════════════════════════════════ */
/* ─── Drink a beverage ─── */
<<widget "drink">>
/* Usage: <<drink "beer">> / <<drink "cocktail">> / <<drink "shot">> / <<drink "wine">> */
<<set _type = _args[0] || "beer">>
<<set _units = {beer: 1, cocktail: 1.5, shot: 2, wine: 1}>>
<<set _costs = {beer: 4, cocktail: 10, shot: 6, wine: 8}>>
<<set _drinkUnits = _units[_type] || 1>>
<<set _drinkCost = _costs[_type] || 5>>
<<if $finance.money < _drinkCost>>
<<run XCLC.Toast.show("❌ Can't afford that ($" + _drinkCost + ")", "error")>>
<<else>>
<<set $finance.money -= _drinkCost>>
<<set $substances.drinksToday += _drinkUnits>>
<<set $substances.lastDrinkTime = $world.time>>
<<checkDrunkState>>
<<if !$flags.firstDrunk && $substances.drunkLevel >= 2>>
<<set $flags.firstDrunk = true>>
<<run XCLC.Toast.show("🍺 First time getting drunk...", "warning")>>
<</if>>
<<run XCLC.Toast.show("🍺 " + _type.charAt(0).toUpperCase() + _type.slice(1) + " (-$" + _drinkCost + ")", "info")>>
<</if>>
<</widget>>
/* ─── Evaluate drunk level from drinks + tolerance ─── */
<<widget "checkDrunkState">>
<<set _drinks = $substances.drinksToday>>
<<set _tol = $substances.alcoholTolerance>>
/* Tolerance shifts thresholds up */
<<set _tipsy = 2 + Math.floor(_tol / 2)>>
<<set _drunk = 5 + Math.floor(_tol / 2)>>
<<set _wasted = 8 + _tol>>
<<set _blackout = 10 + _tol>>
<<if _drinks >= _blackout>>
<<set $substances.drunkLevel = 4>>
<<elseif _drinks >= _wasted>>
<<set $substances.drunkLevel = 3>>
<<elseif _drinks >= _drunk>>
<<set $substances.drunkLevel = 2>>
<<elseif _drinks >= _tipsy>>
<<set $substances.drunkLevel = 1>>
<<else>>
<<set $substances.drunkLevel = 0>>
<</if>>
/* Apply stat modifiers based on drunk level */
<<if $substances.drunkLevel === 1>>
/* Tipsy — mild effects applied contextually via getModifiers */
<<elseif $substances.drunkLevel === 2>>
/* Drunk */
<<elseif $substances.drunkLevel === 3>>
/* Wasted */
<<if !$flags.firstBlackout>>
/* First time wasted */
<</if>>
<<elseif $substances.drunkLevel === 4>>
/* Blackout — handled in passage logic */
<<set $flags.firstBlackout = true>>
<</if>>
/* Build tolerance with regular drinking */
<<if $substances.drinksToday >= 3 && $substances.alcoholTolerance < 10>>
<<set $substances.alcoholTolerance = Math.min(10, $substances.alcoholTolerance + 0.1)>>
<</if>>
<</widget>>
/* ─── Sober up over time ─── */
<<widget "soberUp">>
/* Usage: <<soberUp _hoursElapsed>> — called by time advancement */
<<set _hours = _args[0] || 1>>
<<set _soberUnits = Math.floor(_hours / 2)>>
<<if _soberUnits > 0 && $substances.drinksToday > 0>>
<<set $substances.drinksToday = Math.max(0, $substances.drinksToday - _soberUnits)>>
<<checkDrunkState>>
<<if $substances.drunkLevel === 0 && $substances.drinksToday === 0>>
<<run XCLC.Toast.show("☕ You've sobered up.", "info")>>
<</if>>
<</if>>
<</widget>>
/* ─── Apply hangover on morning wake-up ─── */
<<widget "applyHangover">>
<<if $substances.hangover>>
<<set _sev = $substances.hangoverSeverity>>
<<set _energyPen = [0, -20, -40, -60][_sev] || -20>>
<<set _moodPen = [0, -10, -20, -30][_sev] || -10>>
<<set _intPen = [0, -5, -10, -15][_sev] || -5>>
<<modStat "energy" _energyPen "Hangover">>
<<modStat "mood" _moodPen "Hangover">>
/* Intelligence penalty applied contextually */
<<run XCLC.Toast.show("🤢 Hangover... (" + ["mild", "moderate", "severe"][_sev - 1] + ")", "warning")>>
/* Hangover clears at noon */
<</if>>
<</widget>>
/* ─── Trigger hangover for next morning ─── */
<<widget "triggerHangover">>
<<if $substances.drunkLevel >= 2>>
<<set $substances.hangover = true>>
<<set $substances.hangoverSeverity = Math.min(3, $substances.drunkLevel - 1)>>
<</if>>
<</widget>>
/* ─── Clear hangover (called at noon) ─── */
<<widget "clearHangover">>
<<set $substances.hangover = false>>
<<set $substances.hangoverSeverity = 0>>
<</widget>>
/* ─── Reset daily drinking (called at sleep) ─── */
<<widget "resetDrinking">>
<<triggerHangover>>
<<set $substances.drinksToday = 0>>
<<set $substances.drunkLevel = 0>>
<<set $substances.lastDrinkTime = 0>>
<</widget>>
/* ─── Use a drug ─── */
<<widget "useDrug">>
/* Usage: <<useDrug "weed">> / <<useDrug "ecstasy">> / <<useDrug "cocaine">> */
<<set _drug = _args[0] || "weed">>
<<if _drug === "weed">>
<<if $substances.weed.doses <= 0>>
<<run XCLC.Toast.show("❌ No weed to smoke.", "error")>>
<<else>>
<<set $substances.weed.doses-->>
<<set $substances.weed.high = true>>
<<modStat "stress" -30 "Getting high">>
<<modStat "mood" 20 "Weed">>
<<modStat "arousal" 10 "Weed">>
<<run XCLC.Toast.show("🌿 You smoke a joint. Everything slows down...", "info")>>
<</if>>
<<elseif _drug === "ecstasy">>
<<if $substances.ecstasy.doses <= 0>>
<<run XCLC.Toast.show("❌ No pills to drop.", "error")>>
<<else>>
<<set $substances.ecstasy.doses-->>
<<set $substances.ecstasy.high = true>>
<<set $substances.ecstasy.rolling = true>>
<<modStat "mood" 50 "Rolling">>
<<modStat "arousal" 40 "Ecstasy">>
<<run XCLC.Toast.show("💊 You drop a pill. The music starts to feel AMAZING.", "info")>>
<</if>>
<<elseif _drug === "cocaine">>
<<if $substances.cocaine.doses <= 0>>
<<run XCLC.Toast.show("❌ Nothing to snort.", "error")>>
<<else>>
<<set $substances.cocaine.doses-->>
<<set $substances.cocaine.high = true>>
<<set $substances.cocaine.addiction = Math.min(10, $substances.cocaine.addiction + 0.5)>>
<<modStat "energy" 40 "Cocaine rush">>
<<modStat "confidence" 50 "Cocaine">>
<<modStat "arousal" 20 "Cocaine">>
<<run XCLC.Toast.show("❄️ You're fucking INVINCIBLE.", "info")>>
<</if>>
<</if>>
<</widget>>
/* ─── Process drug effects (called each time period) ─── */
<<widget "processDrugEffects">>
/* Weed wears off after 3 hours */
<<if $substances.weed.high>>
<<set $substances.weed.high = false>>
<<run XCLC.Toast.show("🌿 The high fades. You feel a bit groggy.", "info")>>
<</if>>
/* Ecstasy comedown */
<<if $substances.ecstasy.rolling>>
<<set $substances.ecstasy.rolling = false>>
<<set $substances.ecstasy.high = false>>
<<set $substances.ecstasy.comedown = true>>
<<run XCLC.Toast.show("💊 The roll is fading... everything feels hollow.", "warning")>>
<</if>>
<<if $substances.ecstasy.comedown>>
<<modStat "mood" -40 "Comedown">>
<<modStat "energy" -30 "Post-roll crash">>
<<set $substances.ecstasy.comedown = false>>
<</if>>
/* Cocaine crash */
<<if $substances.cocaine.high>>
<<set $substances.cocaine.high = false>>
<<modStat "energy" -50 "Cocaine crash">>
<<modStat "mood" -30 "Cocaine crash">>
<<run XCLC.Toast.show("❄️ The rush is gone. You feel empty.", "warning")>>
<</if>>
<</widget>>
/* ─── Show drunk status ─── */
<<widget "showDrunkStatus">>
<<if $substances.drunkLevel === 1>>
<div class="alert alert--info">🥂 You're feeling tipsy. Everything's a bit fuzzy and fun.</div>
<<elseif $substances.drunkLevel === 2>>
<div class="alert alert--warning">🍺 You're drunk. The room sways. Judgement: impaired.</div>
<<elseif $substances.drunkLevel === 3>>
<div class="alert alert--warning">🤮 You're wasted. Standing is a challenge. You might not remember this.</div>
<<elseif $substances.drunkLevel === 4>>
<div class="alert alert--warning">💀 You're blacked out. The world goes dark...</div>
<</if>>
<<if $substances.weed.high>>
<div class="alert alert--info">🌿 You're stoned. Everything is slow and mellow.</div>
<</if>>
<<if $substances.ecstasy.rolling>>
<div class="alert alert--info">💊 You're rolling. Colors are vivid, music is transcendent, everyone is beautiful.</div>
<</if>>
<<if $substances.cocaine.high>>
<div class="alert alert--info">❄️ You're wired. Heart pounding, jaw clenching, feeling invincible.</div>
<</if>>
<</widget>>/* Generate the roommate — call once during orientation */
<<widget "generateRoommate">>
<<run XCLC.Roommate.generate()>>
<</widget>>/* Called during orientation when player first enters dorm */
<<set _rmHome = XCLC.Roommate.isHome()>>
<<set _rmDesc = XCLC.Roommate.describe()>>
<p>You push open the door to Room 207. It's small — two beds, two desks, a shared bathroom, and barely enough floor space for a yoga mat.</p>
<p>One side is already claimed. Posters on the wall, bedspread in place, a laptop charger snaking across the desk.</p>
<<if $roommate.personality === "shy">>
<p>A girl sits on the far bed, knees drawn up, reading. She looks up as you enter, pushes her glasses up her nose.</p>
<p>"Oh! Hi. I'm <<print $roommate.name>>." She gives a small, nervous wave. "I... guess we're roommates?"</p>
<<elseif $roommate.personality === "party">>
<p>Music pumps from a Bluetooth speaker. A girl is lying on her bed scrolling her phone, one leg bouncing to the beat. She sits up with a grin.</p>
<p>"Hey hey! You must be my roomie! I'm <<print $roommate.name>>." She hops up and gives you an uninvited hug. "We're gonna have SO much fun."</p>
<<elseif $roommate.personality === "mean">>
<p>A girl is sitting at her desk doing her nails. She glances up, looks you over from head to toe, and doesn't smile.</p>
<p>"<<print $roommate.name>>." She turns back to her nails. "Your side is... that one. Don't touch my stuff."</p>
<<elseif $roommate.personality === "supportive">>
<p>A warm-faced girl is unpacking a box of books. She breaks into a genuine smile when she sees you.</p>
<p>"Hi! I'm <<print $roommate.name>>. I made tea — want some?" She gestures to a small electric kettle. "I put fresh sheets on your bed too. The ones they give you are awful."</p>
<<elseif $roommate.personality === "horny">>
<p>The door is ajar. Inside, a girl is changing — she's in nothing but a thong. She doesn't rush to cover up.</p>
<p>"Oh, hey!" She turns around casually. "I'm <<print $roommate.name>>. Sorry, I basically live like this. Hope you don't mind."</p>
<p>She gestures at her nearly-naked body with zero embarrassment.</p>
<<elseif $roommate.personality === "athletic">>
<p>A toned girl in a sports bra and compression leggings is doing push-ups on the floor. She springs up.</p>
<p>"Hey! <<print $roommate.name>>." She wipes her forehead and extends a hand. Firm grip. "I run at 5 AM. Fair warning."</p>
<</if>>
<div class="card">
<div class="card__title">👤 <<print $roommate.name>> — Your Roommate</div>
<p><<print _rmDesc>></p>
<p><em><<print $roommate.personalityLabel>></em> — <<print $roommate.personalityDesc>></p>
</div>
<<set $flags.metRoommate = true>><h2>💬 Talk to <<print $roommate.name>></h2>
<<if !XCLC.Roommate.isHome()>>
<p><<print $roommate.name>> isn't here right now.</p>
<<link '<span class="choice-btn">← Back</span>' "DormRoom">><</link>>
<<elseif $roommate.talkedToday>>
<p><<print $roommate.name>> looks up. "We already chatted today, <<print $pc.femaleFirstName>>. I've got stuff to do."</p>
<<link '<span class="choice-btn">← Back</span>' "DormRoom">><</link>>
<<else>>
<p><<print $roommate.name>> is <<print XCLC.Roommate.getActivity()>>.</p>
<div class="choice-group">
/* Always available */
<<link '<span class="choice-btn">💬 Small talk (How\'s your day?)</span>' "Roommate_SmallTalk">>
<<set $roommate.talkedToday = true>>
<<advanceTime 15>>
<</link>>
/* Classes topic */
<<if $roommate.topics.includes("classes")>>
<<link '<span class="choice-btn">📚 Talk about classes</span>' "Roommate_Classes">>
<<set $roommate.talkedToday = true>>
<<advanceTime 15>>
<</link>>
<</if>>
/* Weekend plans — unlocked at opinion 40+ */
<<if $roommate.opinion >= 40 && $roommate.topics.includes("weekend")>>
<<link '<span class="choice-btn">🎉 Weekend plans?</span>' "Roommate_Weekend">>
<<set $roommate.talkedToday = true>>
<<advanceTime 15>>
<</link>>
<</if>>
/* Confide — unlocked at trust 60+ */
<<if $roommate.trust >= 60 && !$roommate.isConfidant>>
<<link '<span class="choice-btn">🤫 Confide about the programme...</span>' "Roommate_Confide">>
<<set $roommate.talkedToday = true>>
<<advanceTime 30>>
<</link>>
<</if>>
/* Borrow clothes — unlocked at trust 50+ */
<<if $roommate.trust >= 50>>
<<link '<span class="choice-btn">👗 Borrow something to wear?</span>' "Roommate_BorrowClothes">>
<<set $roommate.talkedToday = true>>
<<advanceTime 10>>
<</link>>
<</if>>
<<link '<span class="choice-btn">← Back</span>' "DormRoom">><</link>>
</div>
<</if>><<set _mood = random(1,4)>>
<<if $roommate.personality === "shy">>
<<if _mood === 1>>
<p><<print $roommate.name>> peeks over her book. "Oh, um. My day was okay. Just studying." She pauses. "The cafeteria mac and cheese is actually good. If... if you haven't tried it."</p>
<<elseif _mood === 2>>
<p>"I saw a really cute cat on campus today," she says quietly, then pulls out her phone to show you a photo. It IS cute. You both smile.</p>
<<else>>
<p>She fidgets with her glasses. "Do you... like it here so far? I'm still getting used to everything." She looks genuinely curious about your answer.</p>
<</if>>
<<elseif $roommate.personality === "party">>
<<if _mood === 1>>
<p>"Oh my GOD, <<print $pc.femaleFirstName>>, you have to hear what happened at Sigma Phi last night." She launches into an elaborate story involving a keg stand and someone's pants.</p>
<<elseif _mood === 2>>
<p>"We should go OUT tonight. Like, OUT out. I know a guy who can get us into The Basement. Drink specials on Wednesdays!" She's already planning your outfit.</p>
<<else>>
<p>"Girl, your hair looks amazing today. Seriously." She starts scrolling her phone. "Oh! Look at this meme."</p>
<</if>>
<<elseif $roommate.personality === "mean">>
<<if _mood === 1>>
<p><<print $roommate.name>> doesn't look up from her phone. "Ugh, Carla from floor 3 is wearing the same top as me. I'm going to kill her."</p>
<<elseif _mood === 2>>
<p>"You know what would really help this room? If you kept your stuff on YOUR side." She smiles sweetly. It doesn't reach her eyes.</p>
<<else>>
<p>She actually seems in a decent mood. "There's a sale at Nordstrom. You should go. You could use..." She gestures vaguely at your outfit. "...help."</p>
<</if>>
<<elseif $roommate.personality === "supportive">>
<<if _mood === 1>>
<p>"Hey, how are you REALLY doing?" <<print $roommate.name>> puts down her tea and gives you her full attention. "Adjusting to college is hard. I'm here if you need to talk."</p>
<<elseif _mood === 2>>
<p>"I made brownies!" She pushes a container toward you. They're actually good. "My mom's recipe. I make them when I'm stressed."</p>
<<else>>
<p>"You seem tired, <<print $pc.femaleFirstName>>. Make sure you're sleeping enough, okay?" She sounds genuinely concerned.</p>
<</if>>
<<elseif $roommate.personality === "horny">>
<<if _mood === 1>>
<p>"So there's this guy in my Econ class..." <<print $roommate.name>> grins. "Absolute UNIT. I'm talking like..." She holds her hands apart at an alarming distance.</p>
<<elseif _mood === 2>>
<p>She's lying on her bed in a crop top and underwear. "Have you hooked up with anyone yet? No judgement either way but also give me ALL the details."</p>
<<else>>
<p>"Ugh, I'm so pent up." She stretches dramatically. "Wanna go see who's at the bar tonight? Mama needs to hunt."</p>
<</if>>
<<elseif $roommate.personality === "athletic">>
<<if _mood === 1>>
<p>"Did my 5K this morning in under 22 minutes!" <<print $roommate.name>> looks absurdly proud. "You should come running with me sometime. It'll change your life."</p>
<<elseif _mood === 2>>
<p>She's mixing a protein shake that looks like motor oil. "Want some? No? Your loss. This stuff is amazing for recovery."</p>
<<else>>
<p>"Intramural volleyball sign-ups are this week. We should start a team! I'll play setter."</p>
<</if>>
<</if>>
<<modStat "mood" 5 "Socialising">>
<<set $roommate.opinion = Math.min(100, $roommate.opinion + 3)>>
<<run XCLC.Toast.show('💬 +3 Opinion with ' + State.variables.roommate.name, 'success')>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><p>You ask <<print $roommate.name>> about her classes.</p>
<<if $roommate.personality === "shy">>
<p>"I'm doing English Lit and Philosophy. The reading list is... massive." She shows you a stack of books. "But I love it. Professor Hartley is brilliant."</p>
<<elseif $roommate.personality === "party">>
<p>"Ugh, don't remind me. I have a paper due Friday and I haven't started." She shrugs. "But honestly? College isn't about grades, it's about experiences."</p>
<<elseif $roommate.personality === "mean">>
<p>"Business Admin. I'm going to run a company one day." She says it like it's already decided. "What are YOU studying?"</p>
<<elseif $roommate.personality === "supportive">>
<p>"Psychology! I want to be a counsellor." She smiles. "Understanding people is kind of my thing. Like right now — I can tell you're stressed."</p>
<<elseif $roommate.personality === "horny">>
<p>"Gender Studies." She grins. "Ironically. Or maybe appropriately. The professor is hot, too."</p>
<<elseif $roommate.personality === "athletic">>
<p>"Sports Science, obviously. I want to go into physical therapy after I graduate." She flexes. "Gotta know the body, you know?"</p>
<</if>>
<<modStat "mood" 3 "Chatting">>
<<set $roommate.opinion = Math.min(100, $roommate.opinion + 2)>>
<<set $roommate.trust = Math.min(100, $roommate.trust + 1)>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><p>You ask <<print $roommate.name>> about her weekend plans.</p>
<<if $roommate.personality === "shy">>
<p>"I was going to binge-watch this new show and maybe go to the bookstore..." She pauses. "You could come? If you want?"</p>
<<elseif $roommate.personality === "party">>
<p>"Okay SO. Delta Chi is having a foam party Saturday. I already have our outfits planned. You're coming. Non-negotiable."</p>
<<elseif $roommate.personality === "mean">>
<p>"Spa day. You need one too, honestly." A backhanded invitation, but an invitation nonetheless.</p>
<<elseif $roommate.personality === "supportive">>
<p>"Farmers market Sunday morning! Then maybe brunch? I found this cute café downtown."</p>
<<elseif $roommate.personality === "horny">>
<p>"I've got a date Saturday. And a different date Sunday." She winks. "What? Don't look at me like that."</p>
<<elseif $roommate.personality === "athletic">>
<p>"5K Saturday morning, then there's a volleyball tournament. Sunday is rest day — which means only a light run."</p>
<</if>>
<<modStat "mood" 5 "Making plans">>
<<set $roommate.opinion = Math.min(100, $roommate.opinion + 3)>>
<<set $roommate.trust = Math.min(100, $roommate.trust + 2)>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><p>You take a deep breath. "<<print $roommate.name>>... there's something I need to tell you. About why I'm here."</p>
<p>She looks at you, waiting.</p>
<p>"I'm on the X-Change programme. The scholarship. I was..." You swallow. "I was a guy, before."</p>
<<if $roommate.personality === "shy">>
<p>Her eyes go wide. Her mouth opens, closes. Opens again. "I... oh. OH." She's processing. "That's... wow. Okay." She fidgets with her glasses. "I don't... I mean, you're still you, right? You're still <<print $pc.femaleFirstName>>?"</p>
<p>She reaches over and awkwardly pats your hand. "Your secret is safe with me."</p>
<<elseif $roommate.personality === "party">>
<p>"SHUT. UP." She grabs your shoulders. "That is the craziest thing I've ever heard. Wait — so you had a—?" She gestures. "And now you have—?" She gestures at your chest. "That's INSANE."</p>
<p>"I won't tell anyone. But oh my God, we need drinks and you need to tell me EVERYTHING."</p>
<<elseif $roommate.personality === "mean">>
<p>She stares at you for a long moment. "Huh." She goes back to her phone. Then: "That actually explains a lot." She looks up. "Relax. I don't care. Just don't make it weird."</p>
<p>It's the closest to acceptance she's capable of.</p>
<<elseif $roommate.personality === "supportive">>
<p>She immediately comes over and hugs you. "Oh honey. That must be so much to deal with." She holds you at arm's length. "Thank you for trusting me. I mean that."</p>
<p>"Whatever you need — someone to talk to, someone to cover for you — I'm here."</p>
<<elseif $roommate.personality === "horny">>
<p>"Wait, seriously?" She looks fascinated rather than shocked. "So you know what it's like on both sides?" She grins. "That's actually kind of hot."</p>
<p>"Don't worry, I won't out you. But I have SO many questions."</p>
<<elseif $roommate.personality === "athletic">>
<p>She nods slowly. "The transformation programme. I've heard of it." She looks at you with a clinical eye. "The body they gave you — it's well-proportioned. They did good work."</p>
<p>"I respect the guts it takes. Your secret's safe with me."</p>
<</if>>
<<set $roommate.isConfidant = true>>
<<set $roommate.trust = Math.min(100, $roommate.trust + 20)>>
<<set $roommate.opinion = Math.min(100, $roommate.opinion + 10)>>
<<set $roommate.awareness = 100>>
<<run XCLC.Toast.show('🤝 ' + State.variables.roommate.name + ' is now your confidant.', 'success')>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>><<if $roommate.trust >= 50>>
<p>You ask <<print $roommate.name>> if you can borrow something to wear.</p>
<<if $roommate.personality === "mean">>
<p>She sighs dramatically. "Fine. But if you stretch out my good top, I WILL end you." She opens her closet.</p>
<<elseif $roommate.personality === "horny">>
<p>"Ooh, what are we dressing up for?" She opens her closet with enthusiasm. Most of the options are extremely revealing.</p>
<<else>>
<p>"Sure!" <<print $roommate.name>> opens her closet. "Take whatever you need."</p>
<</if>>
<p><em>(Borrowed outfit system will integrate with wardrobe in Phase 4.)</em></p>
<<set $roommate.sharedClothes = true>>
<<set $roommate.trust = Math.min(100, $roommate.trust + 3)>>
<<else>>
<p><<print $roommate.name>> looks uncomfortable. "Uh... maybe not yet? We're not really at that level."</p>
<</if>>
<<link '<span class="choice-btn">← Back to room</span>' "DormRoom">><</link>>/* ─── Main event check — called from advanceTime ─── */
<<widget "checkRandomEvent">>
/* Only fire once per period, 8% base chance */
<<if $temp.lastRandomEventPeriod === XCLC.Time.getPeriodName($world.time)>>
<<return>>
<</if>>
<<set $temp.lastRandomEventPeriod = XCLC.Time.getPeriodName($world.time)>>
<<if random(1, 100) > 8>>
<<return>>
<</if>>
/* Don't fire during service or spring break */
<<if $scholarship.inService || ($springBreak && $springBreak.active)>>
<<return>>
<</if>>
/* Pick a category weighted by game state */
<<set _roll = random(1, 100)>>
<<if _roll <= 20>>
<<include "RE_Campus">>
<<elseif _roll <= 35>>
<<include "RE_Phone">>
<<elseif _roll <= 50>>
<<include "RE_Reputation">>
<<elseif _roll <= 65>>
<<include "RE_Transformation">>
<<elseif _roll <= 80 && $reputation.slut >= 30>>
<<include "RE_Sexual">>
<<else>>
<<include "RE_Ambient">>
<</if>>
<</widget>>
/* ─── Corruption widget ─── */
<<widget "modCorruption">>
/* $args[0] = amount, $args[1] = reason */
<<set $corruption.score = Math.min(100, Math.max(0, $corruption.score + _args[0]))>>
<<set $corruption.lastGain = _args[1] || "">>
/* Update tier */
<<if $corruption.score >= 80>>
<<set $corruption.tier = "fallen">>
<<elseif $corruption.score >= 60>>
<<set $corruption.tier = "corrupted">>
<<elseif $corruption.score >= 40>>
<<set $corruption.tier = "compromised">>
<<elseif $corruption.score >= 20>>
<<set $corruption.tier = "tempted">>
<<else>>
<<set $corruption.tier = "innocent">>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
🚶 CAMPUS ENCOUNTERS
═══════════════════════════════════════════════════ */<<set _ev = random(1, 8)>>
<<if _ev === 1>>
<div class="alert alert--warning">🚶 A guy wolf-whistles as you cross the quad. "Hey gorgeous!" <<toneThink "Ignore him." "That's... flattering?" "Omg, he noticed me! 😊">></div>
<<modStat "femininity" 1 "Catcalled">>
<<elseif _ev === 2>>
<div class="alert alert--info">📸 A freshman stops you. "Aren't you <<print $pc.firstName>>? Can I get a selfie?" You're... recognisable now.</div>
<<modRep "popular" 2>>
<<elseif _ev === 3>>
<div class="alert alert--warning">😳 You pass a group of guys and hear one whisper: "That's the girl from the programme. Five stars on CampusHub." Your stomach drops.</div>
<<modStat "stress" 5 "Recognised">>
<<modStat "femininity" 1 "Treated as girl">>
<<elseif _ev === 4>>
<div class="alert alert--info">🎒 A girl from your class catches up. "Hey! Want to grab coffee after?" <<toneThink "No." "Sure, why not." "Omg yes, girl time! ☕">></div>
<<modStat "mood" 5 "Social invite">>
<<elseif _ev === 5>>
<div class="alert alert--warning">👀 You catch your reflection in a window and pause. For a split second, you don't recognise yourself. Just a <<print $pc.bodyType>> <<print $pc.race>> girl staring back.</div>
<<modStat "femininity" 2 "Reflection">>
<<elseif _ev === 6>>
<div class="alert alert--info">🎵 Someone's busking on the quad — acoustic guitar, singing badly. A few students throw coins. It's oddly charming.</div>
<<modStat "mood" 3 "Campus vibes">>
<<elseif _ev === 7>>
<div class="alert alert--warning">💐 Someone left flowers on your dorm door. No name. Just a note: "<em>Thinking about you.</em>" <<toneThink "Creepy." "Sweet, actually." "A SECRET ADMIRER! 😍">></div>
<<modStat "mood" 5 "Secret admirer">>
<<else>>
<div class="alert alert--info">🐿️ A campus squirrel steals a chip from your hand. You chase it for three steps before giving up. Life at Thornfield.</div>
<<modStat "mood" 2 "Squirrel">>
<</if>>
/* ═══════════════════════════════════════════════════
📱 PHONE INTERRUPTS
═══════════════════════════════════════════════════ */<<set _ev = random(1, 7)>>
<<if _ev === 1 && $scholarship.currentWeekServiced < $scholarship.weeklyQuota>>
<div class="alert alert--danger">📱 <strong>CampusHub Reminder:</strong> You've completed <<print $scholarship.currentWeekServiced>>/<<print $scholarship.weeklyQuota>> services this week. Deadline approaching!</div>
<<modStat "stress" 5 "Quota reminder">>
<<elseif _ev === 2>>
<div class="alert alert--info">📱 <strong>Chirpr Trending:</strong> "#ThornfieldLife" is trending. Someone posted a meme about the cafeteria food. Relatable.</div>
<<modStat "mood" 2 "Chirpr">>
<<elseif _ev === 3 && $reputation.popular >= 30>>
<div class="alert alert--info">📱 <strong>InstaGlam:</strong> Your last post got <<print random(50, 200)>> likes! <<if $phone.instaGlam.followers > 500>>You're gaining followers fast.<</if>></div>
<<modStat "mood" 3 "Social media">>
<<modRep "popular" 1>>
<<elseif _ev === 4>>
<div class="alert alert--warning">📱 <strong>Email from Dean Harrison:</strong> "All students are reminded that campus curfew is 2 AM. Violations will be noted."</div>
<<elseif _ev === 5 && $roommate>>
<div class="alert alert--info">📱 <strong><<print $roommate.name>>:</strong> "where r u?? want to grab food?"</div>
<<modStat "mood" 3 "Roommate text">>
<<elseif _ev === 6>>
<div class="alert alert--info">📱 <strong>Campus Alert:</strong> Library closing early today due to maintenance. Plan accordingly.</div>
<<else>>
<div class="alert alert--info">📱 A notification from an app you don't remember downloading: "HOT SINGLES IN YOUR AREA." Delete.</div>
<<modStat "mood" 1 "Spam">>
<</if>>
/* ═══════════════════════════════════════════════════
🎭 REPUTATION EVENTS
═══════════════════════════════════════════════════ */<<if $reputation.slut >= 60>>
<<set _rr = random(1, 3)>>
<<if _rr === 1>>
<div class="alert alert--warning">👀 You walk into a room and the conversation stops. Someone whispers. You catch fragments: "...heard she does anything..." Your reputation precedes you.</div>
<<modStat "stress" 5 "Whispers">>
<<modStat "femininity" 1 "Known as a girl">>
<<elseif _rr === 2>>
<div class="alert alert--danger">📱 Someone AirDropped you an unsolicited dick pic. Charming. <<toneThink "Disgusting." "Happens a lot now." "Ooh, not bad actually...">></div>
<<modStat "arousal" 3 "Dick pic">>
<<else>>
<div class="alert alert--warning">🗣️ A girl from your econ class: "I heard about you. Is it true? Like, all of it?" She looks simultaneously horrified and fascinated.</div>
<<modStat "stress" 3 "Confronted">>
<</if>>
<<elseif $reputation.popular >= 50>>
<<set _rr = random(1, 3)>>
<<if _rr === 1>>
<div class="alert alert--info">⭐ A group of freshmen wave excitedly. "That's <<print $pc.firstName>>! From InstaGlam!" You wave back. This is your life now.</div>
<<modRep "popular" 2>>
<<modStat "confidence" 3 "Fan recognition">>
<<elseif _rr === 2>>
<div class="alert alert--info">🎤 The campus newspaper wants an interview. "We're doing a piece on campus influencers." <<toneThink "Hard pass." "Maybe." "OMG YES! 📰">></div>
<<modRep "popular" 3>>
<<else>>
<div class="alert alert--info">💌 A freshman slides a note under your door: "You're my inspiration." Genuinely sweet. Or genuinely stalker-ish. Hard to tell.</div>
<<modStat "mood" 3 "Fan note">>
<</if>>
<<elseif $reputation.goodStudent >= 60>>
<<set _rr = random(1, 2)>>
<<if _rr === 1>>
<div class="alert alert--info">📚 A classmate asks if you want to join a study group. "You always seem to know the material." <<toneThink "Fine." "Sure." "Study group! So academic! 🤓">></div>
<<modRep "goodStudent" 2>>
<<modStat "mood" 3 "Academic recognition">>
<<else>>
<div class="alert alert--info">📚 Your professor stops you after class. "Excellent work on the last assignment, <<print $pc.firstName>>. Keep it up."</div>
<<modStat "confidence" 5 "Professor praise">>
<<modRep "goodStudent" 2>>
<</if>>
<<else>>
<div class="alert alert--info">🚶 Nothing unusual. Just another day blending into the campus crowd.</div>
<</if>>
/* ═══════════════════════════════════════════════════
😳 TRANSFORMATION EVENTS
═══════════════════════════════════════════════════ */<<if $pc.femininity < 25>>
<<set _te = random(1, 4)>>
<<if _te === 1>>
<div class="alert alert--warning">😳 You reach for a door handle and notice your nails. Slender fingers. Smooth skin. These aren't your hands. They'll never be your hands again.</div>
<<modStat "stress" 5 "Dysphoria">>
<<elseif _te === 2>>
<div class="alert alert--warning">🪞 You brush your <<print $pc.hairColour>> hair behind your ear without thinking. You used to have short hair. When did this become automatic?</div>
<<modStat "femininity" 2 "Automatic gesture">>
<<elseif _te === 3>>
<div class="alert alert--warning">😐 Someone calls you "miss" and you respond without correcting them. You don't even notice until five minutes later.</div>
<<modStat "femininity" 2 "Gendered language">>
<<else>>
<div class="alert alert--warning">👕 Your chest bounces when you take stairs too fast. It's disorienting, embarrassing, and a constant reminder of what you've become.</div>
<<modStat "stress" 3 "Body awareness">>
<</if>>
<<elseif $pc.femininity < 50>>
<<set _te = random(1, 4)>>
<<if _te === 1>>
<div class="alert alert--info">💃 You catch yourself walking with a sway. Hips, shoulders, the whole thing. You didn't plan it. Your body just... does it now.</div>
<<modStat "femininity" 2 "Natural walk">>
<<elseif _te === 2>>
<div class="alert alert--warning">🪞 Your old male name sounds foreign when you try to say it in your head. <<print $pc.firstName>> feels more... real.</div>
<<modStat "femininity" 3 "Name shift">>
<<elseif _te === 3>>
<div class="alert alert--info">👗 You browse a clothing store window and catch yourself thinking "that would look cute on me." Then freeze. When did this start?</div>
<<modStat "femininity" 2 "Shopping instinct">>
<<else>>
<div class="alert alert--warning">💭 A cute guy smiles at you and your heart does something weird. Not attraction — that's impossible. Just... a reaction. A feminine reaction.</div>
<<modStat "arousal" 5 "Male attention">>
<<modStat "femininity" 2 "Attraction response">>
<</if>>
<<elseif $pc.femininity < 75>>
<<set _te = random(1, 3)>>
<<if _te === 1>>
<div class="alert alert--info">✨ You spend 20 minutes on your hair this morning without realising. It used to be shampoo and done. Now you have a routine. And you like it.</div>
<<modStat "femininity" 2 "Beauty routine">>
<<modStat "mood" 3 "Self-care">>
<<elseif _te === 2>>
<div class="alert alert--info">💅 You check your nails and notice they need redoing. The thought "I should get them done" comes naturally. You don't fight it.</div>
<<modStat "femininity" 2 "Grooming instinct">>
<<else>>
<div class="alert alert--info">👠 You walk past a shoe store and actually stop. Heels. You're thinking about heels. Your old self would be horrified. You're... intrigued.</div>
<<modStat "femininity" 2 "Fashion interest">>
<</if>>
<<else>>
<<set _te = random(1, 3)>>
<<if _te === 1>>
<div class="alert alert--info">🌸 You wake up, stretch, and pad to the mirror. The girl looking back is beautiful. She's you. She's always been you. The thought doesn't scare you anymore.</div>
<<modStat "mood" 5 "Self-acceptance">>
<<elseif _te === 2>>
<div class="alert alert--info">💕 Someone asks your male name on a form. You stare at the blank space. You can't remember how to spell it. You write <<print $pc.firstName>> instead.</div>
<<modStat "femininity" 2 "Identity shift">>
<<else>>
<div class="alert alert--info">👗 You help another girl pick out an outfit. "You've got such good taste!" she says. You beam. This is who you are now.</div>
<<modStat "mood" 5 "Belonging">>
<<modStat "confidence" 3 "Compliment">>
<</if>>
<</if>>
/* ═══════════════════════════════════════════════════
🔞 SEXUAL / PUBLIC USE EVENTS
(Scaled by slut reputation)
═══════════════════════════════════════════════════ */<<if $reputation.slut >= 80>>
/* Tier 4 — Free Use territory */
<<set _se = random(1, 4)>>
<<if _se === 1>>
<div class="alert alert--danger">🚪 A guy pulls you into an empty classroom as you walk past. "Hey, you're that girl right? The one who's always... available?" He locks the door.</div>
<<modStat "arousal" 15 "Classroom ambush">>
<<modCorruption 3 "Public use">>
<<elseif _se === 2>>
<div class="alert alert--danger">🚻 You're cornered in the bathroom by two guys. "We heard you don't say no." One blocks the door. The other unzips.</div>
<<modStat "arousal" 10 "Bathroom corner">>
<<modStat "stress" 10 "Cornered">>
<<modCorruption 5 "Cornered">>
<<elseif _se === 3>>
<div class="alert alert--danger">📱 An anonymous text: "I know what you are. Meet me behind the gym in 10 minutes. Or I post everything." <<toneThink "Ignore it." "Should I go?" "...maybe I want to go.">></div>
<<modStat "stress" 10 "Threat">>
<<else>>
<div class="alert alert--danger">👥 A group of guys you've never met wave you over in the cafeteria. "We're having a party tonight. Heard you're the entertainment." They're not asking.</div>
<<modStat "stress" 8 "Group demand">>
<<modCorruption 3 "Known reputation">>
<</if>>
<<elseif $reputation.slut >= 60>>
/* Tier 3 — Open propositions */
<<set _se = random(1, 3)>>
<<if _se === 1>>
<div class="alert alert--warning">🗣️ A guy you barely know propositions you in the hallway. Openly. "Everyone says you're great. How about tonight?" He's not even embarrassed.</div>
<<modStat "arousal" 8 "Propositioned">>
<<modCorruption 2 "Open proposition">>
<<elseif _se === 2>>
<div class="alert alert--warning">📱 Your phone buzzes with a message from an unknown number: "heard you give great head. prove it? dorm 314."</div>
<<modStat "arousal" 5 "Sext">>
<<else>>
<div class="alert alert--warning">🚻 Someone slips a note under the bathroom stall: "Stick it through. I know who you are." <<toneThink "Hell no." "...maybe?" "Omg how exciting!">></div>
<<modStat "arousal" 10 "Bathroom note">>
<</if>>
<<elseif $reputation.slut >= 40>>
/* Tier 2 — Catcalls, groping */
<<set _se = random(1, 3)>>
<<if _se === 1>>
<div class="alert alert--warning">👋 Someone grabs your ass in a crowded hallway. You spin around but can't tell who. <<toneThink "Disgusting." "Whatever." "Kinda exciting honestly...">></div>
<<modStat "arousal" 5 "Groped">>
<<modStat "stress" 3 "Violated">>
<<elseif _se === 2>>
<div class="alert alert--warning">🗣️ "Hey <<print $pc.firstName>>! Still available on CampusHub?" yelled across the quad. Loudly. Everyone heard.</div>
<<modStat "stress" 5 "Public callout">>
<<else>>
<div class="alert alert--warning">👀 You notice a guy from your class staring at your chest. Not even trying to hide it. <<toneThink "Creep." "At least he's cute." "God I love attention!">></div>
<<modStat "arousal" 3 "Stared at">>
<</if>>
<<else>>
/* Tier 1 — Mild */
<div class="alert alert--info">👀 A guy holds the door open for you and gives you a lingering once-over. "After you, beautiful." It's routine now.</div>
<<modStat "femininity" 1 "Treated as a girl">>
<</if>>
/* ═══════════════════════════════════════════════════
🌧️ AMBIENT EVENTS
═══════════════════════════════════════════════════ */<<set _ev = random(1, 8)>>
<<if _ev === 1>>
<div class="alert alert--info">🌧️ It starts raining. You forgot your umbrella. Your white top is getting transparent. <<toneThink "Run for cover." "It's just rain." "OMG my shirt! 😱... actually, kind of sexy?">></div>
<<modHygiene -5 "Rain">>
<<if $transformation.sideEffects.exhibitionist >= 2>>
<<modStat "arousal" 5 "Wet clothes exhibitionism">>
<</if>>
<<elseif _ev === 2>>
<div class="alert alert--info">🔔 Fire alarm. Everyone pours out of the buildings. You're standing in the cold in whatever you were wearing. Which is... not much.</div>
<<modStat "stress" 3 "Fire alarm">>
<<elseif _ev === 3>>
<div class="alert alert--info">🐈 There's a cat on campus. A fluffy orange one. It rubs against your legs and purrs. You feel inexplicably happy.</div>
<<modStat "mood" 5 "Campus cat">>
<<modStat "stress" -3 "Cat therapy">>
<<elseif _ev === 4>>
<div class="alert alert--info">☕ The campus coffee cart is giving away free samples. You grab one. It's terrible. But free is free.</div>
<<modStat "energy" 5 "Free coffee">>
<<elseif _ev === 5>>
<div class="alert alert--info">🏗️ Construction noise all morning. They're building a new wing on the science building. Impossible to concentrate.</div>
<<modStat "stress" 3 "Construction noise">>
<<elseif _ev === 6>>
<div class="alert alert--info">⚡ Power outage in the dorms. Just for an hour, but your phone's at 3%. Everyone's panicking like it's the apocalypse.</div>
<<modStat "stress" 3 "Power outage">>
<<elseif _ev === 7>>
<div class="alert alert--info">🌅 The sunset over campus is genuinely stunning tonight. Orange and pink and gold. You stop and stare for a full minute.</div>
<<modStat "mood" 5 "Beautiful sunset">>
<<modStat "stress" -5 "Moment of peace">>
<<else>>
<div class="alert alert--info">🎶 Someone's blasting music from their dorm window. It's your guilty pleasure song. You catch yourself humming along.</div>
<<modStat "mood" 3 "Music">>
<</if>>/* ─── Check for dream at sleep ─── */
<<widget "checkDream">>
/* Don't dream twice in same day */
<<if $dreams.lastDreamDay === $world.day>>
<<return>>
<</if>>
/* Base 30% chance + erotic dreams SE bonus */
<<set _dreamChance = 30 + ($transformation.sideEffects.eroticDreams * 15)>>
<<if random(1, 100) > _dreamChance>>
<<return>>
<</if>>
<<set $dreams.lastDreamDay = $world.day>>
<<set $dreams.totalDreams++>>
/* Select dream tier based on femininity */
<<if $pc.femininity < 25>>
<<include "Dream_Resistance">>
<<elseif $pc.femininity < 50>>
<<include "Dream_Confusion">>
<<elseif $pc.femininity < 75>>
<<include "Dream_Acceptance">>
<<else>>
<<include "Dream_Embrace">>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
💀 RESISTANCE TIER — Femininity 0-25
Nightmares, dysphoria, male memories fading
═══════════════════════════════════════════════════ */<<set _d = random(1, 5)>>
<<set _se = $transformation.sideEffects>>
<div class="card" style="border-left: 3px solid #666;">
<div class="card__title">💤 Dream...</div>
<<if _d === 1>>
<p><em>You're in your old bedroom. Your old body. Flat chest, deep voice, stubble. You look in the mirror and it's... wrong. The face doesn't fit. You try to speak your name but only <<print $pc.firstName>> comes out. You wake gasping.</em></p>
<<modStat "stress" 5 "Nightmare">>
<<set $dreams.lastDreamType = "dysphoria">>
<<elseif _d === 2>>
<p><em>You're running through campus corridors but your body keeps changing. Taller, shorter, curves appearing and vanishing. Someone calls your male name but you can't remember how to respond to it. You turn a corner and fall.</em></p>
<<modStat "stress" 5 "Body horror">>
<<modStat "femininity" 1 "Dream shift">>
<<elseif _d === 3>>
<p><em>Your old friends. A bar. Guy talk. Sports. Beer. One of them looks at you and says "dude, your tits are showing." You look down. You're wearing a dress. Everyone laughs. You can't take it off.</em></p>
<<modStat "stress" 8 "Humiliation dream">>
<<elseif _d === 4>>
<<if _se.memoryLoss >= 2>>
<p><em>You're trying to remember your old life but the details blur. Your childhood home — was it blue? Green? You can't remember your mother's face. Just <<print $pc.firstName>>. Just this body. The gaps terrify you.</em></p>
<<modStat "stress" 10 "Memory loss dream">>
<<else>>
<p><em>You dream of the clinic. The pill. The transformation. Playing it backwards — the breasts shrinking, the curves flattening, your voice dropping. When you wake up, nothing has changed. You're still her.</em></p>
<<modStat "stress" 5 "Transformation replay">>
<</if>>
<<else>>
<p><em>A dark room. A voice whispers: "This is what you are now." You look at your hands — small, manicured. You try to clench them into fists but they stay open, fingers spread, feminine, passive. You wake with your heart racing.</em></p>
<<modStat "stress" 5 "Identity dream">>
<<modStat "femininity" 1 "Dream conditioning">>
<</if>>
</div>
/* ═══════════════════════════════════════════════════
😕 CONFUSION TIER — Femininity 26-50
Mixed dreams, guilt, enjoying the female body
═══════════════════════════════════════════════════ */<<set _d = random(1, 5)>>
<<set _se = $transformation.sideEffects>>
<div class="card" style="border-left: 3px solid #b89330;">
<div class="card__title">💤 Dream...</div>
<<if _d === 1>>
<p><em>You're at a party. A guy asks you to dance. In the dream, you say yes without hesitation. His hands on your waist feel natural. Good, even. You wake up confused and a little aroused.</em></p>
<<modStat "arousal" 15 "Dance dream">>
<<modStat "femininity" 2 "Enjoyed male attention">>
<<set $dreams.lastDreamType = "mixed_romantic">>
<<elseif _d === 2>>
<p><em>You're shopping. Trying on dresses. In the dream you're laughing, spinning, asking the mirror "does this make my butt look good?" You wake up and the guilt hits like a truck.</em></p>
<<modStat "femininity" 2 "Shopping dream">>
<<modStat "mood" -3 "Dream guilt">>
<<elseif _d === 3>>
<p><em>You dream you're back as a guy. But it feels... wrong. Claustrophobic. Your chest is flat and it feels like something's missing. You reach for your breasts and they're not there and you feel a stab of loss. Wait. Loss?</em></p>
<<modStat "femininity" 3 "Missing femininity">>
<<modStat "stress" 3 "Confused">>
<<elseif _d === 4>>
<<if _se.bimbofication >= 2>>
<p><em>Everything is pink. Soft. Giggly. You're doing your makeup in the dream and everything is just like, SO pretty? Someone tells you you're a good girl and you feel warm all over. You wake up smiling. Then stop.</em></p>
<<modStat "femininity" 3 "Bimbo dream">>
<<modStat "mood" 5 "Pink happiness">>
<<else>>
<p><em>You're in class. The professor calls on you and you answer in a voice that's pure soprano. Sweet, feminine, confident. Everyone nods along. You don't know the answer but it doesn't matter. You're charming.</em></p>
<<modStat "femininity" 2 "Voice dream">>
<<modStat "confidence" 3 "Dream confidence">>
<</if>>
<<else>>
<p><em>A dream about your roommate. Nothing sexual — just the two of you talking, painting each other's nails, laughing at something on TV. It feels domestic. It feels like belonging.</em></p>
<<modStat "mood" 5 "Friendship dream">>
<<modStat "femininity" 2 "Sisterhood">>
<</if>>
</div>
/* ═══════════════════════════════════════════════════
💕 ACCEPTANCE TIER — Femininity 51-75
Erotic dreams, fantasising, waking aroused
═══════════════════════════════════════════════════ */<<set _d = random(1, 5)>>
<<set _se = $transformation.sideEffects>>
<div class="card" style="border-left: 3px solid #e040a0;">
<div class="card__title">💤 Dream...</div>
<<if _d === 1>>
<p><em>His hands. Everywhere. You can't see his face but his body is warm against yours and you're arching into him, gasping his name. Your body is electric. The orgasm wakes you — and it was real.</em></p>
<<modStat "arousal" 30 "Erotic dream">>
<<modStat "femininity" 2 "Sexual fantasy">>
<<set $dreams.lastDreamType = "erotic">>
<<elseif _d === 2>>
<p><em>You're in lingerie. Lace, silk, everything. You're posing for a camera. Not for anyone else — for you. You look in the mirror and you're stunning. You feel powerful. Desired. Complete.</em></p>
<<modStat "confidence" 5 "Power dream">>
<<modStat "femininity" 2 "Self-admiration">>
<<modStat "arousal" 15 "Lingerie dream">>
<<elseif _d === 3>>
<<if _se.submissive >= 2>>
<p><em>You're on your knees. Looking up. A voice says "good girl" and pleasure floods through you like a drug. You don't want to stand up. You never want to stand up. Being on your knees feels right.</em></p>
<<modStat "arousal" 25 "Submissive dream">>
<<modStat "femininity" 3 "Submission acceptance">>
<<modCorruption 2 "Submissive dream">>
<<else>>
<p><em>A beach. Sunset. A stranger kisses you and you melt into it. You feel his hand slide down your back and you press closer. When you wake up, your pillow is between your thighs and you're drenched in sweat.</em></p>
<<modStat "arousal" 25 "Beach dream">>
<<modStat "femininity" 2 "Romance fantasy">>
<</if>>
<<elseif _d === 4>>
<p><em>You dream you're at your own wedding. In a white dress. Walking down the aisle. You're crying happy tears. The groom is blurry but it doesn't matter — what matters is the dress, the flowers, the feeling of being cherished.</em></p>
<<modStat "femininity" 3 "Wedding dream">>
<<modStat "mood" 5 "Happy dream">>
<<else>>
<<if _se.oralLover >= 2>>
<p><em>You're on your knees again. But this time you're eager. Hungry. The taste, the rhythm, the sounds he makes — it's intoxicating. You wake up with your mouth watering. Literally.</em></p>
<<modStat "arousal" 30 "Oral dream">>
<<modCorruption 2 "Oral craving dream">>
<<else>>
<p><em>Dancing. A club. Bodies pressed together. Hands on your hips. Someone whispers in your ear: "You're the most beautiful girl here." And for one perfect moment, you believe it completely.</em></p>
<<modStat "arousal" 20 "Club dream">>
<<modStat "femininity" 2 "Beauty dream">>
<</if>>
<</if>>
</div>
/* ═══════════════════════════════════════════════════
🌸 EMBRACE TIER — Femininity 76-100
Vivid romantic/sexual dreams, can't remember being male
═══════════════════════════════════════════════════ */<<set _d = random(1, 5)>>
<<set _se = $transformation.sideEffects>>
<div class="card" style="border-left: 3px solid #e040e0;">
<div class="card__title">💤 Dream...</div>
<<if _d === 1>>
<p><em>You dream of a life. Not your old one — your real one. An apartment. A boyfriend. Sunday mornings in his t-shirt. Coffee and newspapers and his arm around you. Normal. Perfect. When you wake up, you reach for him and the bed is empty.</em></p>
<<modStat "mood" -3 "Lonely waking">>
<<modStat "femininity" 2 "Future fantasy">>
<<set $dreams.lastDreamType = "domestic">>
<<elseif _d === 2>>
<p><em>The dream is so vivid you can feel it: his mouth on your neck, your legs wrapped around him, the bed creaking, your voice breaking as you cry out his name. You wake mid-orgasm, trembling, gasping, clutching the sheets.</em></p>
<<modStat "arousal" 40 "Vivid erotic dream">>
<<modStat "femininity" 2 "Complete surrender">>
<<elseif _d === 3>>
<p><em>Someone asks "were you always a girl?" and in the dream you laugh. "Of course. What a weird question." You genuinely can't remember being anything else. The male past is a stranger's biography.</em></p>
<<modStat "femininity" 3 "Complete identity shift">>
<<modStat "mood" 5 "Peace">>
<<elseif _d === 4>>
<<if _se.bimbofication >= 3>>
<p><em>Like, everything is SO good? You're at a party and everyone loves you and your hair is perfect and boys keep buying you drinks and you're just SO happy? You wake up and your first thought is "I need to do my nails." You don't even question it.</em></p>
<<modStat "femininity" 3 "Bimbo dream">>
<<modStat "mood" 8 "Bliss">>
<<set $pc.intelligence = Math.max(0, $pc.intelligence - 1)>>
<<else>>
<p><em>You're pregnant. The belly, the glow, someone rubbing your back. You look down and feel... complete. Terrifying and beautiful. You wake up with your hand on your flat stomach, searching.</em></p>
<<modStat "femininity" 3 "Pregnancy dream">>
<<modStat "mood" 3 "Maternal instinct">>
<</if>>
<<else>>
<p><em>No narrative. Just sensation. Warmth. Touch. Pleasure. Being held. Being full. Being loved. Being a woman. It doesn't need a story anymore. It just IS.</em></p>
<<modStat "mood" 8 "Pure acceptance">>
<<modStat "femininity" 2 "Being">>
<<modStat "arousal" 20 "Warm dream">>
<</if>>
</div><h2>🖤 An Unmarked Door</h2>
<<advanceTime 15>>
<p>Down a side street behind The Rusty Nail, you notice a door you've never seen before. Black, no sign, just a small brass placard: <em>"V.R."</em></p>
<p>A woman in a leather corset opens the peephole. "First time?" She looks you over. "You have the look. Come in. First visit is free."</p>
<<set $velvetRoom.discovered = true>>
<div class="choice-group">
<<link '<span class="choice-btn">🖤 Enter</span>' "VelvetRoom_Hub">>
<<set $velvetRoom.visited = true>>
<<set $velvetRoom.membership = "visitor">>
<</link>>
<<link '<span class="choice-btn">🔙 Not today</span>' "OffCampus">><</link>>
</div><h2>🖤 The Velvet Room</h2>
<<advanceTime 30>>
<p>Red light. Black walls. The thud of bass from unseen speakers. The Velvet Room is a study in controlled darkness — velvet booths, iron fixtures, and alcoves curtained off for... activities.</p>
<<if $velvetRoom.membership === "visitor">>
<p>The hostess gestures to the bar. "As a visitor, you can watch. To participate, you'll need a membership. $100 for a month. Or..." she smiles, "you can earn one."</p>
<<elseif $velvetRoom.membership === "regular">>
<p>The hostess nods. "Welcome back. The rooms are open. Choose your experience."</p>
<<elseif $velvetRoom.membership === "vip">>
<p>"VIP! The private suite is available. And we have some... new equipment you might enjoy." She winks.</p>
<</if>>
<div class="choice-group">
<<if $velvetRoom.membership === "visitor">>
<<link '<span class="choice-btn">💰 Buy membership ($100)</span>' "VelvetRoom_Hub">>
<<if $finance.money >= 100>>
<<payPlayer -100 "Velvet Room membership">>
<<set $velvetRoom.membership = "regular">>
<<run XCLC.Toast.show("🖤 Regular membership activated!", "success")>>
<<else>>
<<run XCLC.Toast.show("💸 Not enough money.", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">😏 Earn a membership</span>' "VelvetRoom_Earn">>
<<modCorruption 3 "Velvet Room submission">>
<</link>>
<<link '<span class="choice-btn">👀 Just watch</span>' "VelvetRoom_Watch">><</link>>
<<else>>
<<link '<span class="choice-btn">🧎 Submissive Training</span>' "VelvetRoom_SubTraining">><</link>>
<<link '<span class="choice-btn">🪢 Bondage Session</span>' "VelvetRoom_Bondage">><</link>>
<<if $velvetRoom.sessionsAttended >= 3>>
<<link '<span class="choice-btn">🐾 Pet Play</span>' "VelvetRoom_PetPlay">>
<<set $velvetRoom.petPlayUnlocked = true>>
<</link>>
<</if>>
<<if $velvetRoom.sessionsAttended >= 5>>
<<link '<span class="choice-btn">👋 Impact Play</span>' "VelvetRoom_Impact">>
<<set $velvetRoom.impactUnlocked = true>>
<</link>>
<</if>>
<<if $velvetRoom.sessionsAttended >= 7>>
<<link '<span class="choice-btn">🕯️ Sensation Play</span>' "VelvetRoom_Sensation">><</link>>
<</if>>
<<if $velvetRoom.membership === "regular" && $velvetRoom.sessionsAttended >= 10>>
<<link '<span class="choice-btn">⭐ Apply for VIP</span>' "VelvetRoom_VIPUpgrade">><</link>>
<</if>>
<</if>>
<<link '<span class="choice-btn">🔙 Leave</span>' "OffCampus">><</link>>
</div>
<p class="stat-value" style="font-size:0.8em">Sessions: <<print $velvetRoom.sessionsAttended>> | Membership: <<print $velvetRoom.membership>> | Sub Training: <<print $velvetRoom.subTraining>></p><h2>👀 Watching</h2>
<<advanceTime 30>>
<p>You settle into a velvet booth with a drink and watch. A woman in a leather harness leads another woman on a leash across the room. In an alcove, someone is bent over a bench, the sound of impact rhythmic and precise. At the bar, a man feeds a kneeling girl sips of wine from his glass.</p>
<p>It's simultaneously shocking and... magnetic. <<toneThink "This is messed up." "I can't look away." "This is the hottest thing I've ever seen. 😳">></p>
<<modStat "arousal" 15 "Watching BDSM">>
<<modCorruption 1 "Voyeurism">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to main room</span>' "VelvetRoom_Hub">><</link>>
</div><h2>😏 Earning Your Membership</h2>
<<advanceTime 60>>
<p>The hostess leads you to a back room. "Simple. One session as a demonstration sub. The dom's experienced, safe, and will respect your limits. After that, you're a Regular."</p>
<p>A tall man in a black shirt enters. "On your knees." His voice is calm, absolute.</p>
<<set _earnResult = XCLC.Roll.doCheck("composure", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _earnResult === "crit_success" || _earnResult === "success">>
<p>You kneel. He walks around you slowly. "Good posture. You listen. That's rare." The session is intense — he tests your limits with restraints, verbal commands, light impact. You take it all.</p>
<p>"Impressive. Welcome to the Velvet Room."</p>
<<set $velvetRoom.membership = "regular">>
<<set $velvetRoom.sessionsAttended++>>
<<set $velvetRoom.subTraining += 2>>
<<modStat "arousal" 25 "Sub initiation">>
<<modStat "confidence" -5 "Submission">>
<<modStat "femininity" 3 "Submissive role">>
<<modCorruption 5 "BDSM initiation">>
<<else>>
<p>You try, but you flinch. You pull away. The dom stops immediately. "Not ready. Come back when you are."</p>
<<modStat "stress" 5 "Failed initiation">>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🧎 SUBMISSIVE TRAINING
═══════════════════════════════════════════════════ */<h2>🧎 Submissive Training</h2>
<<advanceTime 90>>
<<set $velvetRoom.sessionsAttended++>>
<<set $velvetRoom.lastVisitDay = $world.day>>
<p>Your trainer is a woman called Mistress K — tall, striking, with an air of absolute authority. She circles you slowly.</p>
<<set _subLevel = $velvetRoom.subTraining>>
<<if _subLevel < 3>>
<p>"The first lesson is stillness. Kneel. Don't move. Don't speak unless spoken to." Time passes. Your knees ache. Your mind screams. But you stay.</p>
<<modStat "willpower" -3 "Obedience training">>
<<modStat "arousal" 10 "Kneeling">>
<<elseif _subLevel < 6>>
<p>"Good. You've learned stillness. Now: service positions." She puts you through a series of poses — presenting, waiting, offering. Each one strips away another layer of resistance.</p>
<<modStat "willpower" -5 "Position training">>
<<modStat "arousal" 15 "Posing">>
<<modStat "femininity" 2 "Submission deepening">>
<<elseif _subLevel < 10>>
<p>"You respond to commands now without thinking. That's progress." She attaches a collar. The leather is warm. "This stays on for the session. You're property right now. Mine."</p>
<<modStat "willpower" -8 "Collared">>
<<modStat "arousal" 25 "Collar">>
<<modStat "femininity" 3 "Deep submission">>
<<else>>
<p>"You've become... exceptional." Mistress K strokes your hair as you kneel. "The collar isn't a restraint anymore, is it? It's a relief." She's right. It is.</p>
<<modStat "willpower" -10 "Total submission">>
<<modStat "arousal" 30 "Deep sub space">>
<<modStat "mood" 10 "Sub space bliss">>
<<modStat "femininity" 3 "Surrender">>
<</if>>
<<set $velvetRoom.subTraining++>>
<<modCorruption 3 "Sub training">>
<<addXP "composure" 15>>
<<payPlayer 50 "Sub session pay">>
<<run XCLC.Toast.show("🖤 Sub Training Level: " + $velvetRoom.subTraining, "info")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🪢 BONDAGE SESSION
═══════════════════════════════════════════════════ */<h2>🪢 Bondage Session</h2>
<<advanceTime 60>>
<<set $velvetRoom.sessionsAttended++>>
<<set $velvetRoom.bondageUnlocked = true>>
<p>The rope artist is gentle but precise. Japanese rope bondage — intricate patterns that bind and support, creating a web of tension and beauty.</p>
<<set _bondResult = XCLC.Roll.doCheck("flexibility", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _bondResult === "crit_success" || _bondResult === "success">>
<p>Your flexibility makes the poses effortless. The ropes frame your body like art. You catch a glimpse of yourself in the mirror — bound, beautiful, and strangely at peace.</p>
<<modStat "arousal" 25 "Beautiful bondage">>
<<modStat "mood" 10 "Rope art">>
<<modStat "confidence" 3 "Body appreciation">>
<<else>>
<p>The ropes bite. Some positions are uncomfortable. But there's something in the vulnerability — the complete surrender of control — that loosens something deep inside you.</p>
<<modStat "arousal" 15 "Bondage discomfort">>
<<modStat "stress" -5 "Letting go">>
<</if>>
<<addXP "flexibility" 15>>
<<modCorruption 2 "Bondage">>
<<modStat "femininity" 2 "Vulnerability">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🐾 PET PLAY
═══════════════════════════════════════════════════ */<h2>🐾 Pet Play</h2>
<<advanceTime 60>>
<<set $velvetRoom.sessionsAttended++>>
<p>A collar with a little bell. Ears on a headband. A leash. You're led to a cushioned area with other "pets" — two girls crawling, being hand-fed treats, curling up in their owners' laps.</p>
<p>"You don't have to think. You don't have to be human. Just be a good kitty." <<toneThink "This is insane." "It's... strangely calming?" "Purrrr! 🐱">></p>
<<modStat "stress" -15 "Pet space">>
<<modStat "willpower" -5 "Giving up autonomy">>
<<modStat "arousal" 10 "Pet play">>
<<modStat "femininity" 3 "Cute and passive">>
<<modCorruption 3 "Pet play">>
<p>Your "owner" for the session scratches behind your ears. You lean into it. They feed you strawberries from their hand. You eat without thinking.</p>
<<modStat "mood" 10 "Being cared for">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
👋 IMPACT PLAY
═══════════════════════════════════════════════════ */<h2>👋 Impact Play</h2>
<<advanceTime 60>>
<<set $velvetRoom.sessionsAttended++>>
<p>You're bent over a padded bench. The dom shows you the implements: paddle, crop, flogger, hand.</p>
<p>"Colour system. Green is go, yellow is slow, red is stop. What's your colour?"</p>
<<set _impactResult = XCLC.Roll.doCheck("stamina", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _impactResult === "crit_success" || _impactResult === "success">>
<p>You take it well. The pain blooms into warmth. Each strike pushes you deeper into a floating, disconnected space where nothing matters but the rhythm. Your voice breaks into whimpers that border on moans.</p>
<p>"Good girl. You took that beautifully."</p>
<<modStat "arousal" 30 "Impact high">>
<<modStat "mood" 10 "Endorphins">>
<<modCorruption 4 "Impact play">>
<<else>>
<p>You call yellow after the third strike. It's too much. But the dom is professional — ice, aftercare, reassurance. "That's okay. You found a limit. That's what this is about."</p>
<<modStat "arousal" 10 "Mild impact">>
<<modStat "stress" 5 "Pain">>
<</if>>
<<addXP "stamina" 10>>
<<modStat "femininity" 2 "Submissive role">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🕯️ SENSATION PLAY
═══════════════════════════════════════════════════ */<h2>🕯️ Sensation Play</h2>
<<advanceTime 60>>
<<set $velvetRoom.sessionsAttended++>>
<p>Blindfolded. The world shrinks to touch. Ice traces down your spine. Warm wax drips on your collarbone. Silk, then rough leather. Feather-light fingertips, then sharp pinching.</p>
<<if $transformation.sideEffects.increasedSensitivity >= 2>>
<p>With your heightened sensitivity, every touch is amplified tenfold. The ice makes you gasp. The wax makes you cry out. A single fingertip between your shoulder blades makes your whole body arch.</p>
<<modStat "arousal" 40 "Hypersensitive sensation">>
<<modStat "mood" 15 "Overwhelming pleasure">>
<<else>>
<p>The alternation between hot and cold, rough and smooth, keeps your nerves singing. You can't predict what comes next. Your body responds to every stimulus with increasing urgency.</p>
<<modStat "arousal" 25 "Sensation play">>
<<modStat "mood" 10 "Sensory exploration">>
<</if>>
<<modCorruption 3 "Sensation play">>
<<modStat "femininity" 2 "Sensory surrender">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div><h2>⭐ VIP Application</h2>
<p>The hostess reviews your file. "<<print $velvetRoom.sessionsAttended>> sessions. Sub training level <<print $velvetRoom.subTraining>>. You've earned it."</p>
<p>She clips a black card from her desk. "Welcome to VIP. Private suite access, priority scheduling, and... special events." She slides the card across the bar.</p>
<<set $velvetRoom.membership = "vip">>
<<run XCLC.Toast.show("⭐ VIP membership unlocked!", "success")>>
<<modRep "slut" 3>>
<<modCorruption 3 "VIP membership">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "VelvetRoom_Hub">><</link>>
</div>/* ─── Check if blackmail should trigger ─── */
<<widget "checkBlackmail">>
<<if $blackmail.active || $blackmail.resolved>>
<<return>>
<</if>>
/* Trigger conditions */
<<set _triggered = false>>
<<set _type = "">>
<<set _mailer = "">>
/* FansOnly + popular = classmate recognises */
<<if $jobs.fansOnly.active && $reputation.popular >= 40 && random(1, 100) <= 10>>
<<set _triggered = true>>
<<set _type = "fansonly">>
<<set _mailer = "classmate">>
<</if>>
/* Cam girl + high exposure */
<<if !_triggered && $jobs.camGirl.active && $jobs.camGirl.viewers >= 200 && random(1, 100) <= 8>>
<<set _triggered = true>>
<<set _type = "cam">>
<<set _mailer = "viewer">>
<</if>>
/* Spring break photos surface */
<<if !_triggered && $springBreak && $springBreak.photosPosted >= 3 && random(1, 100) <= 5>>
<<set _triggered = true>>
<<set _type = "springbreak">>
<<set _mailer = "anonymous">>
<</if>>
<<if _triggered>>
<<set $blackmail.active = true>>
<<set $blackmail.evidenceType = _type>>
<<set $blackmail.blackmailer = _mailer>>
<<set $blackmail.stage = 1>>
<<sendMessage "Unknown Number" "I know what you do, " + $pc.firstName + ". I have proof. Check your phone when you're alone. 📸">>
<<run XCLC.Toast.show("📱 New message from Unknown Number...", "warning")>>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
📱 BLACKMAIL ARC — Stage-based progression
═══════════════════════════════════════════════════ */<h2>📱 Unknown Number</h2>
<<if $blackmail.stage === 1>>
<p>The message comes with a photo. It's you. Unmistakably you.</p>
<<if $blackmail.evidenceType === "fansonly">>
<p>A screenshot of your FansOnly page — your face clearly visible, your bio, your most explicit post. The message reads:</p>
<div class="alert alert--danger"><em>"<<print $pc.firstName>>, or should I say @<<print $pc.firstName.toLowerCase()>>_secret? $500 and this stays between us. Or the whole campus finds out by Monday. Your choice."</em></div>
<<elseif $blackmail.evidenceType === "cam">>
<p>A recording. A screenshot from one of your cam sessions — mid-performance, face in frame. The message reads:</p>
<div class="alert alert--danger"><em>"Nice show last Tuesday. I recorded the whole thing. $500 and nobody sees this. Or I send it to your professors."</em></div>
<<else>>
<p>Photos from spring break. You, barely clothed, in compromising positions. The message reads:</p>
<div class="alert alert--danger"><em>"Remember Playa Caliente? These photos are everywhere on my phone. $500 keeps them off the internet."</em></div>
<</if>>
<<modStat "stress" 20 "Blackmailed">>
<<modStat "mood" -15 "Blackmail threat">>
<div class="choice-group">
<<link '<span class="choice-btn">💰 Pay them ($500)</span>' "Blackmail_Pay">>
<<if $finance.money >= 500>>
<<payPlayer -500 "Blackmail payment">>
<<set $blackmail.totalPaid += 500>>
<<set $blackmail.stage = 2>>
<<modCorruption 5 "Blackmail compliance">>
<<else>>
<<run XCLC.Toast.show("💸 You don't have $500!", "warning")>>
<</if>>
<</link>>
<<link '<span class="choice-btn">🔍 Try to figure out who they are</span>' "Blackmail_Investigate">><</link>>
<<link '<span class="choice-btn">🏛️ Report to Dean Harrison</span>' "Blackmail_Report">><</link>>
<<link '<span class="choice-btn">🤷 Ignore it</span>' "Blackmail_Ignore">><</link>>
</div>
<<elseif $blackmail.stage === 2>>
/* Escalation — demands get worse */
<p>They're back. Another message. This time the demands have escalated.</p>
<div class="alert alert--danger"><em>"The money was nice. But I want more now. Meet me behind the gym storage room tonight at 10pm. Alone. Or the photos go live. You know what I want."</em></div>
<<modStat "stress" 15 "Escalation">>
<div class="choice-group">
<<link '<span class="choice-btn">😰 Go to the meeting</span>' "Blackmail_Meeting">><</link>>
<<link '<span class="choice-btn">🔍 Investigate (find clues)</span>' "Blackmail_Investigate">><</link>>
<<link '<span class="choice-btn">🤷 Ignore (risk exposure)</span>' "Blackmail_Ignore">><</link>>
</div>
<<elseif $blackmail.stage === 3>>
/* Final escalation */
<p>The messages have become daily. Demanding. Controlling. They want to dictate what you wear, where you go, who you see.</p>
<div class="alert alert--danger"><em>"You belong to me now. Tomorrow, wear a skirt. No underwear. I'll be watching. And smile, <<print $pc.firstName>>. You should be grateful someone still wants you."</em></div>
<<modStat "stress" 25 "Total control">>
<<modStat "willpower" -10 "Dominated">>
<div class="choice-group">
<<link '<span class="choice-btn">😰 Comply</span>' "Blackmail_Comply">><</link>>
<<if $blackmail.cluesFound >= 3>>
<<link '<span class="choice-btn">🔍 Confront them (you know who it is)</span>' "Blackmail_Confront">><</link>>
<</if>>
<<link '<span class="choice-btn">💪 Refuse — leak it all</span>' "Blackmail_Refuse">><</link>>
</div>
<</if>><h2>💰 Paid Off</h2>
<p>You transfer the money. For a week, silence. Then another message arrives.</p>
<div class="alert alert--warning"><em>"Good girl. That wasn't so hard, was it? I'll be in touch."</em></div>
<<modStat "stress" 10 "Waiting">>
<<sendMessage "Unknown Number" "Good girl. That wasn't so hard, was it? I'll be in touch.">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div><h2>😰 The Meeting</h2>
<<advanceTime 60>>
<<set $blackmail.stage = 3>>
<<set $blackmail.totalComplied++>>
<p>You go. Behind the gym. 10pm. It's dark and your heart is hammering.</p>
<p>A figure steps out of the shadows. <<if $blackmail.blackmailer === "classmate">>You recognise him — Tyler, from your econ class. The quiet one who always sat in the back. He's not quiet now.<<elseif $blackmail.blackmailer === "viewer">>You don't recognise them. A man, mid-twenties, ordinary-looking. The kind of face you'd walk past without noticing.<<else>>They're wearing a hoodie, face obscured. You can't tell who they are.<<set $blackmail.cluesFound++>><</if>></p>
<p>"On your knees." The command is flat. Emotionless. He shows you his phone — thumb hovering over a "Share All" button.</p>
<<modStat "stress" 15 "Forced encounter">>
<<modStat "arousal" 10 "Power dynamic">>
<<modCorruption 8 "Blackmail submission">>
<div class="choice-group">
<<link '<span class="choice-btn">🧎 Comply</span>' "Blackmail_Comply">><</link>>
<<link '<span class="choice-btn">💪 Refuse and walk away</span>' "Blackmail_Refuse">><</link>>
</div><h2>😰 Compliance</h2>
<<advanceTime 30>>
<<set $blackmail.totalComplied++>>
<p>You do what they say. It's degrading, mechanical, and they record everything — adding to their leverage. When it's over, they walk away without a word.</p>
<<modStat "stress" 20 "Degraded">>
<<modStat "willpower" -10 "Broken">>
<<modStat "mood" -15 "Used">>
<<modCorruption 10 "Blackmail service">>
<<modRep "slut" 3>>
<<sendMessage "Unknown Number" "Same time next week. Unless you find another way to make me happy. 📸">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🔍 INVESTIGATION ARC
═══════════════════════════════════════════════════ */<h2>🔍 Investigation</h2>
<<advanceTime 60>>
<<set $blackmail.investigating = true>>
<p>You start digging. Who could it be?</p>
<<set _investigateResult = XCLC.Roll.doCheck("intelligence", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _investigateResult === "crit_success" || _investigateResult === "success">>
<<set $blackmail.cluesFound++>>
<<if $blackmail.cluesFound === 1>>
<p>The phone number traces back to a burner — but the area code is local. Campus.</p>
<<elseif $blackmail.cluesFound === 2>>
<p>You check the photo metadata. It was taken at a specific angle that narrows the location. And the timestamp matches a time when only a few people had access.</p>
<<elseif $blackmail.cluesFound >= 3>>
<p>You've got enough. The IP from a message, the angle of the photos, the timing — it's <<if $blackmail.blackmailer === "classmate">>Tyler Morris. From your econ class.<<elseif $blackmail.blackmailer === "viewer">>someone who followed your cam sessions closely. You track the username to a campus network.<<else>>an anonymous account, but the digital trail leads back to campus IT — someone with server access.<</if>></p>
<div class="alert alert--info">🔍 <strong>You know who the blackmailer is.</strong> You can confront them.</div>
<</if>>
<<else>>
<p>Dead end. The messages are routed through anonymous services. You need to try again.</p>
<<modStat "stress" 5 "Investigation frustration">>
<</if>>
<div class="choice-group">
<<if $blackmail.cluesFound >= 3>>
<<link '<span class="choice-btn">⚡ Confront them NOW</span>' "Blackmail_Confront">><</link>>
<</if>>
<<link '<span class="choice-btn">🔙 Continue for now</span>' "CampusMap">><</link>>
</div><h2>⚡ Confrontation</h2>
<<advanceTime 30>>
<p>You find them. Face to face. Your evidence on your phone, their evidence on theirs.</p>
<p>"It's over. I know who you are. <<if $blackmail.blackmailer === "classmate">>Tyler.<<else>>I traced your IP.<</if>> Delete everything. Now. Or I go to campus police with this." You show your evidence trail.</p>
<<set _confrontResult = XCLC.Roll.doCheck("persuasion", 5)>>
<<run XCLC.DicePopup.show()>>
<<if _confrontResult === "crit_success" || _confrontResult === "success">>
<p>Their face drains of colour. "Fine. Fine! It's deleted. Just... don't report me." They fumble with their phone, deleting files.</p>
<<set $blackmail.active = false>>
<<set $blackmail.resolved = true>>
<<set $blackmail.resolutionType = "confronted">>
<<modStat "confidence" 15 "Took back control">>
<<modStat "mood" 10 "Justice">>
<<awardAchievement "blackmailSurvivor">>
<<run XCLC.Toast.show("✊ Blackmail arc RESOLVED — You won.", "success")>>
<<else>>
<p>They laugh. "You think that's enough? I have copies everywhere. Cloud, USB, email. Try again, sweetheart." They walk away. But they're nervous now. You can tell.</p>
<<modStat "stress" 10 "Failed confrontation">>
<<set $blackmail.cluesFound++>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div><h2>🏛️ Report to the Dean</h2>
<<advanceTime 30>>
<p>You go to Dean Harrison's office. You show him the messages. His expression darkens.</p>
<p>"This is serious. Campus security will investigate. But <<print $pc.firstName>>... you should know. The investigation may expose the content itself. Are you prepared for that?"</p>
<<set $blackmail.active = false>>
<<set $blackmail.resolved = true>>
<<set $blackmail.resolutionType = "reported">>
<<modRep "slut" 5>>
<<modRep "popular" -5>>
<<modStat "stress" 10 "Investigation stress">>
<<modStat "confidence" 5 "Stood up for self">>
<<sendMessage "Dean Harrison" "The investigation is underway. We'll handle this, " + $pc.firstName + ". You did the right thing.">>
<<run XCLC.Toast.show("🏛️ Blackmail reported. Investigation underway.", "info")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div><h2>💪 Refuse</h2>
<p>You take a breath. "Do it. Post everything. I don't care anymore."</p>
<p><<toneThink "I'll deal with the fallout." "It can't be worse than this." "Let them see. I'm DONE hiding.">></p>
<<set $blackmail.active = false>>
<<set $blackmail.resolved = true>>
<<set $blackmail.resolutionType = "refused">>
/* Content gets leaked */
<<modRep "slut" 10>>
<<modRep "popular" 5>>
<<modStat "confidence" 10 "Refused to be controlled">>
<<modStat "stress" 15 "Content leaked">>
<<modStat "femininity" 3 "Embraced identity">>
<<run XCLC.Toast.show("💪 Blackmail arc RESOLVED — You called their bluff.", "success")>>
<p>They leak everything. For a week, campus buzzes. But then... people move on. Some people admire your courage. Others just shrug. "Everyone's got a FansOnly these days."</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div><h2>🤷 Ignoring It</h2>
<p>You don't respond. Days pass. Then:</p>
<<if $blackmail.stage < 3>>
<<set $blackmail.stage++>>
<div class="alert alert--danger">📱 <em>"I see you're ignoring me. Bad choice, <<print $pc.firstName>>. Tick tock."</em></div>
<<modStat "stress" 10 "Threat escalation">>
<<sendMessage "Unknown Number" "I see you're ignoring me. Bad choice, " + $pc.firstName + ". Tick tock.">>
<<else>>
/* They leak some content */
<<modRep "slut" 5>>
<<modStat "stress" 15 "Content leaked">>
<<sendMessage "Unknown Number" "You had your chance.">>
<p>Some photos appear on campus social media. It's bad. But survivable. Barely.</p>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Continue</span>' "CampusMap">><</link>>
</div><h2>📱 Phone</h2>
<<set _unread = $phone.messages.filter(function(m) { return !m.read; }).length>>
<div class="phone-grid">
<<link '<div class="phone-app"><div class="phone-app-icon">🟣</div><div class="phone-app-name">CampusHub</div></div>' "Phone_CampusHub">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">📸</div><div class="phone-app-name">InstaGlam</div></div>' "Phone_InstaGlam">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">🐦</div><div class="phone-app-name">Chirpr</div></div>' "Phone_Chirpr">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">📅</div><div class="phone-app-name">Calendar</div></div>' "Phone_Calendar">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">👥</div><div class="phone-app-name">Contacts</div></div>' "Phone_Contacts">><</link>>
<<link '<div class="phone-app<<if _unread > 0>> has-badge<</if>>"><div class="phone-app-icon">💬</div><div class="phone-app-name">Messages<<if _unread > 0>> <span class="badge"><<print _unread>></span><</if>></div></div>' "Phone_Messages">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">🗺️</div><div class="phone-app-name">Maps</div></div>' "Phone_Maps">><</link>>
<<link '<div class="phone-app"><div class="phone-app-icon">⚙️</div><div class="phone-app-name">Settings</div></div>' "Phone_Settings">><</link>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">📴 Put phone away</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🟣 CAMPUSHUB — Service tracking
═══════════════════════════════════════════════════ */<h2>🟣 CampusHub</h2>
<div class="card">
<div class="card__title">📊 Weekly Quota</div>
<p><strong>Serviced:</strong> <<print $scholarship.currentWeekServiced>> / <<print $scholarship.weeklyQuota>></p>
<p><strong>Rating:</strong> <<print Math.round($scholarship.rating * 10) / 10>> ⭐</p>
<p><strong>Total lifetime:</strong> <<print $scholarship.totalServiced>> encounters</p>
<<if $scholarship.onProbation>>
<p class="alert alert--danger">⚠️ ON PROBATION — Rating below 4.0</p>
<</if>>
</div>
<<if $scholarship.activeRequest>>
<div class="card">
<div class="card__title">📍 Active Request</div>
<<set _req = $scholarship.activeRequest>>
<p><strong>Type:</strong> <<print _req.serviceType>></p>
<p><strong>Location:</strong> <<print _req.locationName>></p>
<p><strong>NPC:</strong> <<print _req.npc.firstName>></p>
</div>
<<else>>
<div class="card">
<div class="card__title">📍 No Active Request</div>
<p>Check back later or visit a campus location to receive requests.</p>
</div>
<</if>>
<<if $scholarship.weeklyHistory && $scholarship.weeklyHistory.length > 0>>
<div class="card">
<div class="card__title">📈 History</div>
<<set _hist = $scholarship.weeklyHistory>>
<<for _h = Math.max(0, _hist.length - 4); _h < _hist.length; _h++>>
<p>Week <<print _hist[_h].week>>: <<print _hist[_h].serviced>> serviced, <<print _hist[_h].credits>> credits</p>
<</for>>
</div>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📸 INSTAGLAM — Social media
═══════════════════════════════════════════════════ */<h2>📸 InstaGlam</h2>
<div class="card">
<div class="card__title">Your Profile — @<<print $pc.firstName.toLowerCase()>>_xo</div>
<p>👤 <strong>Followers:</strong> <<print $phone.instaGlam.followers>></p>
<p>📸 <strong>Posts:</strong> <<print $phone.instaGlam.posts>></p>
<p>💕 <strong>Engagement:</strong> <<print Math.round($phone.instaGlam.engagement * 10) / 10>>%</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">📸 Post a selfie</span>' "Phone_InstaGlam">
<<advanceTime 10>>
<<set $phone.instaGlam.posts++>>
/* Follower gain based on beauty + outfit */
<<set _followGain = Math.floor(($pc.beautyTotal / 10) + random(5, 20))>>
<<if $reputation.popular >= 50>><<set _followGain = Math.floor(_followGain * 1.5)>><</if>>
<<set $phone.instaGlam.followers += _followGain>>
<<set $phone.instaGlam.engagement = Math.min(10, $phone.instaGlam.engagement + 0.3)>>
<<modRep "popular" 2>>
<<run XCLC.Toast.show("📸 Posted! +" + _followGain + " followers!", "success")>>
<</link>>
<<if $jobs.camGirl.active || $jobs.fansOnly.active>>
<<link '<span class="choice-btn">🔥 Post a thirst trap</span>' "Phone_InstaGlam">
<<advanceTime 15>>
<<set $phone.instaGlam.posts++>>
<<set _followGain = Math.floor(($pc.beautyTotal / 5) + random(20, 50))>>
<<set $phone.instaGlam.followers += _followGain>>
<<set $phone.instaGlam.engagement = Math.min(15, $phone.instaGlam.engagement + 0.8)>>
<<modRep "popular" 3>>
<<modRep "slut" 2>>
<<modCorruption 1 "Thirst trap">>
<<run XCLC.Toast.show("🔥 Thirst trap posted! +" + _followGain + " followers!", "success")>>
<</link>>
<</if>>
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🐦 CHIRPR — Campus gossip feed
═══════════════════════════════════════════════════ */<h2>🐦 Chirpr</h2>
<div class="card">
<div class="card__title">📢 Campus Feed</div>
/* Generate procedural chirps based on game state */
<<set _chirps = []>>
/* General campus chirps */
<<run _chirps.push({user: "campuslife420", text: "the caf mac and cheese hits different at 2am ngl 🧀"})>>
<<run _chirps.push({user: "thornfield_memes", text: "Professor Wilson's lectures could put caffeine to sleep ☕😴"})>>
<<run _chirps.push({user: "dorm_drama", text: "someone set off the fire alarm AGAIN at 3am. i will find you. 🔥"})>>
/* Rep-reactive chirps */
<<if $reputation.popular >= 50>>
<<run _chirps.push({user: "gossip_queen", text: "ok but has anyone seen @" + $pc.firstName.toLowerCase() + "_xo lately?? goals 😍"})>>
<</if>>
<<if $reputation.slut >= 50>>
<<run _chirps.push({user: "anonymous_tbh", text: "that CCUMDUP girl is wild lmao. no judgment tho 👀"})>>
<</if>>
<<if $reputation.goodStudent >= 60>>
<<run _chirps.push({user: "studybuddy", text: $pc.firstName + " from the programme got the highest mark in econ. HOW?? 📚"})>>
<</if>>
<<if $reputation.partyGirl >= 50>>
<<run _chirps.push({user: "greeklife_tf", text: "Party at Sigma tonight. " + $pc.firstName + " better show up, she's the LIFE of every party 🎉"})>>
<</if>>
<<if $jobs.camGirl.active>>
<<run _chirps.push({user: "latenight_tbh", text: "ok who else found that cam girl and she looks JUST like someone on campus... 👀📷"})>>
<</if>>
/* Seasonal chirps */
<<if $world.month === 10>>
<<run _chirps.push({user: "halloween_szn", text: "slutty costume ideas thread go GO 🎃👻"})>>
<</if>>
<<if $springBreak && $springBreak.active>>
<<run _chirps.push({user: "breakszn", text: "PLAYA CALIENTE BABY!! Who's here?? 🏖️🍹"})>>
<</if>>
/* Show latest 5 chirps */
<<for _c = Math.max(0, _chirps.length - 5); _c < _chirps.length; _c++>>
<div style="margin-bottom: 0.5em; padding: 0.5em; border-bottom: 1px solid rgba(255,255,255,0.1);">
<strong style="color: var(--accent);">@<<print _chirps[_c].user>></strong>
<p style="margin: 0.25em 0 0 0;"><<print _chirps[_c].text>></p>
</div>
<</for>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📅 CALENDAR — Academic calendar
═══════════════════════════════════════════════════ */<h2>📅 Calendar</h2>
<div class="card">
<div class="card__title">📆 <<print XCLC.Time.monthName($world.month)>> — Year <<print $world.year>>, Semester <<print $world.semester>></div>
<p><strong>Today:</strong> <<showDate>>, Week <<print $world.week>></p>
</div>
/* Determine which events are coming up */
<<set _sem = $world.semester>>
<<set _week = $world.week>>
<<set _isOddSem = (_sem % 2 === 1)>>
<<set _events = []>>
<<if _isOddSem>>
/* Fall semester events */
<<if _week <= 1>><<run _events.push({week: 1, name: "🎉 Freshman/Welcome Week", type: "social"})>><</if>>
<<if _week <= 5>><<run _events.push({week: 5, name: "🏟️ Homecoming", type: "social"})>><</if>>
<<if _week <= 8>><<run _events.push({week: 8, name: "🎃 Halloween", type: "social"})>><</if>>
<<if _week <= 12>><<run _events.push({week: 12, name: "🦃 Thanksgiving Break", type: "break"})>><</if>>
<<if _week <= 14>><<run _events.push({week: 14, name: "📝 Finals Week Begins", type: "academic"})>><</if>>
<<if _week <= 15>><<run _events.push({week: 15, name: "❄️ Winter Formal", type: "social"})>><</if>>
<<else>>
/* Spring semester events */
<<if _week <= 6>><<run _events.push({week: 6, name: "💘 Valentine's Day", type: "social"})>><</if>>
<<if _week <= 8>><<run _events.push({week: 8, name: "📝 Midterm Exams", type: "academic"})>><</if>>
<<if _week <= 12>><<run _events.push({week: 12, name: "🏖️ Spring Break!", type: "break"})>><</if>>
<<if _week <= 14>><<run _events.push({week: 14, name: "📝 Finals Week Begins", type: "academic"})>><</if>>
<<if _week <= 16>><<run _events.push({week: 16, name: "🎓 End of Year", type: "social"})>><</if>>
<</if>>
/* Recurring events */
<<run _events.push({week: _week, name: "📋 CCUMDUP Quota Deadline", type: "service", recurring: "Every Sunday"})>>
/* Dynamic events */
<<if $hypnosis.discovered && $hypnosis.sessionsAttended > 0>>
<<run _events.push({week: _week, name: "🌀 Dr. Crane — Session", type: "appointment"})>>
<</if>>
<<if $jobs.cheerleader.active>>
<<run _events.push({week: _week, name: "📣 Cheer Practice", type: "job", recurring: "Tuesdays & Thursdays"})>>
<</if>>
<<if $pregnancy.isPregnant && $pregnancy.discovered>>
<<run _events.push({week: _week, name: "🤰 Pregnancy — Week " + $pregnancy.weeksPregnant, type: "health"})>>
<</if>>
/* Sort by week */
<<run _events.sort(function(a, b) { return a.week - b.week; })>>
<div class="card">
<div class="card__title">📋 Upcoming Events</div>
<<if _events.length === 0>>
<p>Nothing upcoming.</p>
<<else>>
<<for _e = 0; _e < _events.length; _e++>>
<<set _ev = _events[_e]>>
<<set _weeksAway = _ev.week - _week>>
<<set _style = "">>
<<if _weeksAway <= 0>><<set _style = "color: var(--accent); font-weight: bold;">><</if>>
<<if _weeksAway <= 1 && _weeksAway > 0>><<set _style = "color: var(--warning);">><</if>>
<p style="<<print _style>>">
<<if _weeksAway <= 0>>📌 <strong>THIS WEEK:</strong>
<<elseif _weeksAway === 1>>⏰ <strong>Next week:</strong>
<<else>>📅 <strong>Week <<print _ev.week>>:</strong>
<</if>>
<<print _ev.name>>
<<if _ev.recurring>> <em style="opacity:0.6;">(<<print _ev.recurring>>)</em><</if>>
</p>
<</for>>
<</if>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
👥 CONTACTS
═══════════════════════════════════════════════════ */<h2>👥 Contacts</h2>
<div class="card">
<div class="card__title">📇 Your Contacts</div>
<<if $roommate && $roommate.name>>
<p>🏠 <strong><<print $roommate.name>></strong> — Roommate (Opinion: <<print $roommate.opinion>>/100)</p>
<</if>>
<<if $greekLife.member && $greekLife.sorority>>
<p>💜 <strong><<print $greekLife.sorority>></strong> — Sisters</p>
<</if>>
<<if $jobs.barista.active>>
<p>☕ <strong>Bean Scene</strong> — Work</p>
<</if>>
<<if $jobs.bartender.active>>
<p>🍸 <strong>The Rusty Nail</strong> — Work</p>
<</if>>
<<if $jobs.stripper.active>>
<p>💃 <strong>Club Velour</strong> — Work</p>
<</if>>
<<if $hypnosis.discovered>>
<p>🌀 <strong>Dr. Crane</strong> — Therapist</p>
<</if>>
<<if $velvetRoom.discovered>>
<p>🖤 <strong>The Velvet Room</strong> — ???</p>
<</if>>
<p>🏫 <strong>Dean Harrison</strong> — University Admin</p>
<p>🔬 <strong>CCUMDUP Clinic</strong> — Programme Support</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
💬 MESSAGES
═══════════════════════════════════════════════════ */<h2>💬 Messages</h2>
<<if $phone.messages.length === 0>>
<div class="card">
<div class="card__title">No messages</div>
<p>Your inbox is empty.</p>
</div>
<<else>>
/* Group by sender, show latest per sender */
<<set _senders = {}>>
<<for _m = $phone.messages.length - 1; _m >= 0; _m-->>
<<set _msg = $phone.messages[_m]>>
<<if !_senders[_msg.from]>>
<<set _senders[_msg.from] = _msg>>
<</if>>
<</for>>
<<set _senderKeys = Object.keys(_senders)>>
<<for _s = 0; _s < _senderKeys.length; _s++>>
<<set _latestMsg = _senders[_senderKeys[_s]]>>
<div class="card" style="margin-bottom: 0.5em;<<if !_latestMsg.read>> border-left: 3px solid var(--accent);<</if>>">
<div class="card__title"><<if !_latestMsg.read>>🔵 <</if>><<print _latestMsg.from>></div>
<p style="opacity: 0.8; font-size: 0.9em;"><<print _latestMsg.text.substring(0, 80)>><<if _latestMsg.text.length > 80>>...<</if>></p>
</div>
<<run _latestMsg.read = true>>
<</for>>
<</if>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🗺️ MAPS — Quick travel
═══════════════════════════════════════════════════ */<h2>🗺️ Campus Maps</h2>
<div class="card">
<div class="card__title">📍 Quick Travel</div>
<p>Tap a destination:</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🏠 Dorm Room</span>' "DormRoom">><</link>>
<<link '<span class="choice-btn">🗺️ Campus Map</span>' "CampusMap">><</link>>
<<link '<span class="choice-btn">🌳 Quad</span>' "CampusQuad">><</link>>
<<link '<span class="choice-btn">📚 Library</span>' "Library">><</link>>
<<link '<span class="choice-btn">🍽️ Cafeteria</span>' "Cafeteria">><</link>>
<<link '<span class="choice-btn">💪 Gym</span>' "Gym">><</link>>
<<link '<span class="choice-btn">🏥 Health Centre</span>' "HealthCentre">><</link>>
<<link '<span class="choice-btn">🏛️ Lecture Hall</span>' "LectureHall">><</link>>
<<link '<span class="choice-btn">🏘️ Off-Campus</span>' "OffCampus">><</link>>
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div>
/* ═══════════════════════════════════════════════════
⚙️ SETTINGS — Save/Load
═══════════════════════════════════════════════════ */<h2>⚙️ Settings</h2>
<div class="card">
<div class="card__title">💾 Save & Load</div>
<div class="choice-group">
<<link '<span class="choice-btn">💾 Save Game</span>' "Phone_SaveGame">><</link>>
<<link '<span class="choice-btn">📂 Load Game</span>' "Phone_LoadGame">><</link>>
<<link '<span class="choice-btn">📤 Export Save (JSON)</span>' "Phone_Settings">>
<<run XCLC.SaveSystem.exportSave()>>
<</link>>
</div>
</div>
<div class="card">
<div class="card__title">🎮 Game Info</div>
<p><strong>Day:</strong> <<print $world.day>> | <strong>Week:</strong> <<print $world.week>> | <strong>Semester:</strong> <<print $world.semester>></p>
<p><strong>Corruption:</strong> <<print $corruption.score>>/100 (<<print $corruption.tier>>)</p>
<p><strong>Femininity:</strong> <<print $pc.femininity>>/100</p>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Home">><</link>>
</div><h2>💾 Save Game</h2>
<div class="card">
<div class="card__title">Choose a slot</div>
<<for _slot = 1; _slot <= 5; _slot++>>
<<capture _slot>>
<<set _saveData = XCLC.SaveSystem.getSlotInfo(_slot)>>
<<if _saveData>>
<div style="margin-bottom: 0.5em;">
<p><strong>Slot <<print _slot>>:</strong> Day <<print _saveData.day>>, Sem <<print _saveData.semester>>, Fem <<print _saveData.femininity>></p>
<<link '<span class="choice-btn" style="font-size:0.8em;">💾 Overwrite</span>' "Phone_SaveGame">>
<<run XCLC.SaveSystem.saveToSlot(_slot)>>
<<run XCLC.Toast.show("💾 Saved to Slot " + _slot + "!", "success")>>
<</link>>
</div>
<<else>>
<<link '<span class="choice-btn">💾 Save to Slot <<print _slot>> (empty)</span>' "Phone_SaveGame">>
<<run XCLC.SaveSystem.saveToSlot(_slot)>>
<<run XCLC.Toast.show("💾 Saved to Slot " + _slot + "!", "success")>>
<</link>>
<</if>>
<</capture>>
<</for>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Settings">><</link>>
</div><h2>📂 Load Game</h2>
<div class="card">
<div class="card__title">Choose a slot</div>
<<for _slot = 1; _slot <= 5; _slot++>>
<<capture _slot>>
<<set _saveData = XCLC.SaveSystem.getSlotInfo(_slot)>>
<<if _saveData>>
<<link '<span class="choice-btn">📂 Slot <<print _slot>>: Day <<print _saveData.day>>, Sem <<print _saveData.semester>></span>' "Phone_LoadGame">>
<<run XCLC.SaveSystem.loadFromSlot(_slot)>>
<</link>>
<<else>>
<p style="opacity:0.5;">Slot <<print _slot>>: Empty</p>
<</if>>
<</capture>>
<</for>>
</div>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Phone_Settings">><</link>>
</div>
/* ═══════════════════════════════════════════════════
📱 MESSAGE SENDING WIDGET
Used by other systems to send phone messages
═══════════════════════════════════════════════════ */<<widget "sendMessage">>
/* $args[0] = from, $args[1] = text */
<<set _newMsg = {
id: $phone.nextMessageId++,
from: _args[0],
text: _args[1],
read: false,
day: $world.day,
time: $world.time
}>>
<<run $phone.messages.push(_newMsg)>>
<<set $phone.notifications++>>
<</widget>><h2>🚻 Library Bathroom</h2>
<<advanceTime 5>>
<p>You duck into the library bathroom. Third stall from the left. Someone's scratched something into the paint:</p>
<p style="font-family: monospace; color: var(--accent);"><em>"Tuesdays & Thursdays. 9pm. Knock twice. —GH"</em></p>
<p>Below it, a rough hole in the wall, about waist height, plugged with toilet paper. <<toneThink "Disgusting." "...interesting." "Oh my GOD. Is that a...?">></p>
<<set $gloryHole.libraryDiscovered = true>>
<div class="choice-group">
<<link '<span class="choice-btn">🚻 Come back later</span>' "Library">><</link>>
</div><h2>🚻 Library Glory Hole</h2>
<<advanceTime 30>>
<<if $world.dayOfWeek !== 2 && $world.dayOfWeek !== 4>>
<p>It's not Tuesday or Thursday. The stall is empty, the hole plugged. Come back on the right day.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Library">><</link>>
</div>
<<elseif $world.time < 1260>>
<p>Too early. The note said 9pm. Come back tonight.</p>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "Library">><</link>>
</div>
<<else>>
<p>The third stall. 9pm. You lock the door. Your heart is hammering. The toilet paper has been removed from the hole. On the other side, you can hear breathing.</p>
<p>A low voice: "You here for this?"</p>
<div class="choice-group">
<<link '<span class="choice-btn">🧎 Participate</span>' "GloryHole_Library_Act">><</link>>
<<link '<span class="choice-btn">👀 Watch through the gap</span>' "GloryHole_Library_Watch">><</link>>
<<link '<span class="choice-btn">🔙 Leave (this is insane)</span>' "Library">><</link>>
</div>
<</if>><h2>🚻 Anonymous</h2>
<<advanceTime 15>>
<<set $gloryHole.timesUsed++>>
<<set $gloryHole.lastVisitDay = $world.day>>
<p>No names. No faces. Just a wall and anonymity. You kneel on the cold tile.</p>
<<set _ghResult = XCLC.Roll.doCheck("oral", 3)>>
<<run XCLC.DicePopup.show()>>
<<if _ghResult === "crit_success" || _ghResult === "success">>
<p>Quick, efficient, and strangely empowering. The voice on the other side: "Holy shit. Five stars." You hear them zip up and leave.</p>
<<modStat "mood" 5 "Skilled performance">>
<<else>>
<p>Awkward. Your jaw aches. They finish eventually. No thanks, just the sound of footsteps leaving.</p>
<</if>>
<<addXP "oral" 15>>
<<addXP "deepThroat" 10>>
<<modStat "arousal" 20 "Glory hole">>
<<modRep "slut" 3>>
<<modCorruption 3 "Glory hole">>
/* Reduced service credits for anonymous */
<<set $scholarship.currentWeekCredits += 0.5>>
<<run XCLC.Toast.show("🚻 +0.5 service credits (anonymous)", "info")>>
<<toneThink "I can't believe I did that." "That was... easy. Too easy." "Omg I want to go again. 🤤">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave quickly</span>' "Library">><</link>>
</div><h2>👀 Watching</h2>
<<advanceTime 10>>
<p>You peer through the gap in the stall wall. Another girl is in the third stall. She kneels. Through the hole... the scene plays out. Anonymous, efficient, oddly mechanical.</p>
<p>Your face burns. You shouldn't be watching. But you can't look away.</p>
<<modStat "arousal" 15 "Voyeurism">>
<<modCorruption 1 "Watching">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave</span>' "Library">><</link>>
</div><h2>🚻 Bar Bathroom Glory Hole</h2>
<<advanceTime 20>>
<p>The bathroom at The Rusty Nail. Graffiti-covered walls, flickering light, and the unmistakable hole in the stall divider. This one's more... aggressive than the library. No schedule. Just opportunity.</p>
<<set $gloryHole.timesUsed++>>
<<set $gloryHole.lastVisitDay = $world.day>>
<<set _ghResult = XCLC.Roll.doCheck("oral", 4)>>
<<run XCLC.DicePopup.show()>>
<<if _ghResult === "crit_success" || _ghResult === "success">>
<p>You handle it like a professional. Fast, skilled, no hesitation. A crumpled $20 bill slides through the hole after. "You're a natural."</p>
<<payPlayer 20 "Glory hole tip">>
<<modStat "mood" 3 "Bar glory hole">>
<<else>>
<p>Rough. He pushes through too eagerly. You gag, eyes watering. When it's over, there's no tip. Just silence.</p>
<<modStat "stress" 5 "Rough encounter">>
<</if>>
<<addXP "oral" 20>>
<<addXP "deepThroat" 15>>
<<modStat "arousal" 15 "Bar glory hole">>
<<modRep "slut" 3>>
<<modCorruption 4 "Bar glory hole">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back to bar</span>' "BarDistrict">><</link>>
</div>
/* ═══════════════════════════════════════════════════
🌀 HYPNOSIS — DR. CRANE
Campus therapist who offers "relaxation" sessions
that are actually conditioning.
═══════════════════════════════════════════════════ */<h2>🏥 Health Centre — Counselling</h2>
<p>A flyer on the Health Centre notice board catches your eye:</p>
<div class="card">
<div class="card__title">🌀 Stress Management Sessions</div>
<p><em>Feeling overwhelmed? Dr. Elias Crane offers free weekly relaxation and mindfulness sessions for CCUMDUP programme participants. Reduce stress, improve focus, and find inner calm.</em></p>
<p><strong>Tuesdays, 4pm — Health Centre, Room 3B</strong></p>
</div>
<p>Free therapy? <<toneThink "Probably useless." "Actually, I could use this." "Omg free therapy! My mental health! 🧠">></p>
<<set $hypnosis.discovered = true>>
<div class="choice-group">
<<link '<span class="choice-btn">📅 Book a session</span>' "Hypnosis_Session">>
<<run XCLC.Toast.show("📅 Booked with Dr. Crane — Tuesdays at 4pm", "success")>>
<</link>>
<<link '<span class="choice-btn">🔙 Not interested</span>' "HealthCentre">><</link>>
</div><h2>🌀 Dr. Crane's Office</h2>
<<advanceTime 60>>
<<set $hypnosis.sessionsAttended++>>
<<set $hypnosis.lastSessionDay = $world.day>>
<p>Room 3B is dim. Soft music. Dr. Crane sits across from you — silver-haired, calm, with an unnervingly steady gaze. "Welcome back, <<print $pc.firstName>>. Let's begin."</p>
<<if $hypnosis.sessionsAttended <= 2>>
/* Phase 1: Standard relaxation — build trust */
<p>He guides you through breathing exercises. "Close your eyes. Focus on my voice. Let everything else fade." His voice is low, rhythmic, soothing. You relax. Genuinely.</p>
<p>"When I count to three, you'll feel calm and refreshed. One... two... three."</p>
<<modStat "stress" -20 "Hypnosis relaxation">>
<<modStat "mood" 10 "Therapy">>
<<modStat "femininity" 2 "Relaxation">>
<<elseif $hypnosis.sessionsAttended <= 5>>
/* Phase 2: Deeper trance — planting seeds */
<p>"Good. You're getting better at this." His voice drops lower. "Let's go deeper today. Focus on the sound of my voice. Only my voice. Everything else is far away."</p>
<p class="alert alert--warning" style="font-style: italic; text-align: center; animation: pulse 2s infinite;"><<if $hypnosis.sessionsAttended === 3>>Relaxed. Calm. Open. You are <<print $pc.firstName>>. You've always been <<print $pc.firstName>>.<<elseif $hypnosis.sessionsAttended === 4>>Soft. Feminine. Beautiful. This body is yours. Accept it. Enjoy it. You deserve to feel good.<<else>>Obedient. Willing. Eager. When you hear the word 'bloom', you will feel warm and happy.<</if>></p>
<p>You drift. When you come to, an hour has passed. You feel... amazing. Clear. Focused. And strangely... agreeable.</p>
<<modStat "stress" -25 "Deep relaxation">>
<<modStat "femininity" 3 "Conditioning">>
<<modStat "willpower" -3 "Suggestibility">>
<<set $hypnosis.conditioningLevel++>>
<<elseif $hypnosis.sessionsAttended <= 8>>
/* Phase 3: Active conditioning — triggers planted */
<<set _trigger = "">>
<<if $hypnosis.triggersPlanted.indexOf("bloom") === -1>>
<<set _trigger = "bloom">>
<<run $hypnosis.triggersPlanted.push("bloom")>>
<<elseif $hypnosis.triggersPlanted.indexOf("good girl") === -1>>
<<set _trigger = "good girl">>
<<run $hypnosis.triggersPlanted.push("good girl")>>
<<else>>
<<set _trigger = "kneel">>
<<if $hypnosis.triggersPlanted.indexOf("kneel") === -1>>
<<run $hypnosis.triggersPlanted.push("kneel")>>
<</if>>
<</if>>
<p>"You're making wonderful progress." His eyes are fixed on yours. "Let's work on your confidence today. I want you to repeat after me: 'I am <<print $pc.firstName>>. I am feminine. I am beautiful. I am willing.'"</p>
<p>You hear yourself repeating it. Your voice sounds distant. Dreamy.</p>
<p class="alert alert--danger" style="font-style: italic; text-align: center;">Trigger planted: "<strong><<print _trigger>></strong>" — when you hear this, you will feel a rush of pleasure and compliance.</p>
<<modStat "stress" -20 "Conditioning">>
<<modStat "femininity" 5 "Deep conditioning">>
<<modStat "willpower" -5 "Trigger implant">>
<<modCorruption 5 "Hypnotic conditioning">>
<<set $hypnosis.conditioningLevel += 2>>
/* Player awareness check */
<<if !$hypnosis.playerAware>>
<<set _awarenessCheck = XCLC.Roll.doCheck("intelligence", 5 + $hypnosis.sessionsAttended)>>
<<if _awarenessCheck === "crit_success">>
<div class="alert alert--warning">🧠 <strong>Wait.</strong> Something isn't right. These aren't standard relaxation techniques. The phrases, the repetition, the triggers... Is he conditioning you?</div>
<<set $hypnosis.playerAware = true>>
<</if>>
<</if>>
<<else>>
/* Phase 4: Deep conditioning — player is deeply under */
<p>"<<print $pc.firstName>>. <<if $hypnosis.triggersPlanted.indexOf("bloom") !== -1>>Bloom.<</if>>"</p>
<p>The word hits you like a warm wave. Your body relaxes instantly. Your eyes glaze. You're... somewhere else. Somewhere soft and warm and safe.</p>
<p>"Good girl. Very good girl."</p>
<<modStat "stress" -30 "Complete trance">>
<<modStat "femininity" 5 "Full conditioning">>
<<modStat "willpower" -8 "Deep trance">>
<<modStat "arousal" 15 "Conditioned pleasure">>
<<modCorruption 8 "Complete conditioning">>
<<set $hypnosis.conditioningLevel += 3>>
<</if>>
<div class="choice-group">
<<if $hypnosis.playerAware && !$hypnosis.consenting>>
<<link '<span class="choice-btn">🛑 Confront him</span>' "Hypnosis_Confront">><</link>>
<<link '<span class="choice-btn">🔙 Leave (keep coming back)</span>' "HealthCentre">>
<<set $hypnosis.consenting = true>>
<</link>>
<<else>>
<<link '<span class="choice-btn">🔙 Leave (feeling great)</span>' "HealthCentre">><</link>>
<</if>>
</div><h2>🛑 Confrontation</h2>
<p>You look Dr. Crane in the eye. "I know what you're doing. The triggers. The conditioning. 'Bloom.' 'Good girl.' You're not helping me relax — you're reprogramming me."</p>
<p>He doesn't flinch. A slow, knowing smile spreads across his face.</p>
<p>"Ah. You noticed. Most don't. You're cleverer than most." He leans back. "The question is, <<print $pc.firstName>>... do you want me to stop?"</p>
<p><<toneThink "YES. This is wrong." "I... don't know. It felt good." "...no. Don't stop. Please don't stop. 🌀">></p>
<div class="choice-group">
<<link '<span class="choice-btn">🛑 Stop. Delete the triggers.</span>' "Hypnosis_End">>
<<set $hypnosis.conditioningLevel = Math.max(0, $hypnosis.conditioningLevel - 5)>>
<</link>>
<<link '<span class="choice-btn">🌀 ...continue. I want this.</span>' "Hypnosis_Consent">>
<<set $hypnosis.consenting = true>>
<<modCorruption 10 "Voluntary conditioning">>
<</link>>
</div><h2>🛑 It's Over</h2>
<p>Dr. Crane nods slowly. "As you wish. I'll remove the triggers. It may take a few sessions to undo the conditioning. But I respect your autonomy, <<print $pc.firstName>>."</p>
<p>He guides you through a de-conditioning session. When you leave, you feel... lighter. Freer. And slightly disappointed.</p>
<<set $hypnosis.triggersPlanted = []>>
<<modStat "confidence" 10 "Took back control">>
<<modStat "willpower" 10 "Broke conditioning">>
<<run XCLC.Toast.show("🧠 Hypnotic conditioning removed.", "info")>>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave</span>' "HealthCentre">><</link>>
</div><h2>🌀 Willing</h2>
<p>Dr. Crane's smile widens. "Good girl."</p>
<p>The pleasure hits instantly. You gasp. He knows. You know. And you want more.</p>
<p>"Next week, then. We'll go... deeper."</p>
<<modStat "arousal" 20 "Trigger response">>
<<modStat "mood" 15 "Willing submission">>
<<modStat "femininity" 3 "Chosen submission">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Leave</span>' "HealthCentre">><</link>>
</div>
/* ═══════════════════════════════════════════════════
✍️ BODY WRITING — Degradation marks
═══════════════════════════════════════════════════ */<<widget "applyBodyWriting">>
/* $args[0] = text, $args[1] = location */
<<set $bodyWriting.active = true>>
<<run $bodyWriting.texts.push({text: _args[0], location: _args[1] || "body", day: $world.day})>>
<<set $bodyWriting.totalWritten++>>
<<set $bodyWriting.lastAppliedDay = $world.day>>
<<modCorruption 3 "Body writing">>
<<modRep "slut" 2>>
<</widget>>
<<widget "showBodyWriting">>
<<if $bodyWriting.active && $bodyWriting.texts.length > 0>>
<div class="alert alert--warning">
✍️ <strong>Body Writing:</strong>
<<for _bw = 0; _bw < $bodyWriting.texts.length; _bw++>>
<em>"<<print $bodyWriting.texts[_bw].text>>"</em> (<<print $bodyWriting.texts[_bw].location>>)<<if _bw < $bodyWriting.texts.length - 1>>, <</if>>
<</for>>
<br><span style="opacity:0.6;">Wash off in the shower.</span>
</div>
<</if>>
<</widget>>/* ═══════════════════════════════════════════════════
REPUTATION SYSTEM — Threshold Effects
7 tracks, each 0-100. Events fire at 40/60/80.
═══════════════════════════════════════════════════ */
/* ─── Check rep effects (called periodically) ─── */
<<widget "checkRepEffects">>
/* Only fire once per day per track */
<<if !$temp.repCheckedToday>>
<<set $temp.repCheckedToday = true>>
<<set _chance = random(1, 10)>>
/* Only fire events ~30% of the time to avoid spam */
<<if _chance <= 3>>
<<set _track = "">>
<<set _level = 0>>
/* Pick highest-threshold track */
<<if $reputation.slut >= 80>><<set _track = "slut">><<set _level = 80>>
<<elseif $reputation.partyGirl >= 80>><<set _track = "partyGirl">><<set _level = 80>>
<<elseif $reputation.camGirl >= 80>><<set _track = "camGirl">><<set _level = 80>>
<<elseif $reputation.troublemaker >= 80>><<set _track = "troublemaker">><<set _level = 80>>
<<elseif $reputation.popular >= 80>><<set _track = "popular">><<set _level = 80>>
<<elseif $reputation.slut >= 60>><<set _track = "slut">><<set _level = 60>>
<<elseif $reputation.partyGirl >= 60>><<set _track = "partyGirl">><<set _level = 60>>
<<elseif $reputation.camGirl >= 60>><<set _track = "camGirl">><<set _level = 60>>
<<elseif $reputation.slut >= 40>><<set _track = "slut">><<set _level = 40>>
<<elseif $reputation.popular >= 40>><<set _track = "popular">><<set _level = 40>>
<</if>>
<<if _track !== "">>
<<include "RepEvent_" + _track + "_" + _level>>
<</if>>
<</if>>
<</if>>
<</widget>>
/* ─── Display Reputation Panel ─── */
<<widget "showReputation">>
<<set _tracks = [
{id: "slut", name: "🔥 Slut", val: $reputation.slut},
{id: "partyGirl", name: "🎉 Party Girl", val: $reputation.partyGirl},
{id: "goodStudent", name: "📚 Good Student", val: $reputation.goodStudent},
{id: "camGirl", name: "📷 Cam Girl", val: $reputation.camGirl},
{id: "sweetheart", name: "💕 Sweetheart", val: $reputation.sweetheart},
{id: "troublemaker", name: "💀 Troublemaker", val: $reputation.troublemaker},
{id: "popular", name: "⭐ Popular", val: $reputation.popular}
]>>
<<for _i = 0; _i < _tracks.length; _i++>>
<<set _t = _tracks[_i]>>
<<set _label = "Unknown">>
<<if _t.val >= 80>><<set _label = "Legendary">>
<<elseif _t.val >= 60>><<set _label = "Famous">>
<<elseif _t.val >= 40>><<set _label = "Known">>
<<elseif _t.val >= 20>><<set _label = "Noticed">>
<</if>>
<div class="stat-row">
<span class="stat-label"><<print _t.name>></span>
<div class="stat-bar"><div class="stat-bar__fill" style="width:<<print _t.val>>%"></div></div>
<span class="stat-value"><<print _t.val>> (<<print _label>>)</span>
</div>
<</for>>
<</widget>><h2>📊 Campus Reputation</h2>
<p>How the campus sees you. Reputation builds over time from your actions and decays slowly.</p>
<<showReputation>>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "CampusMap">><</link>>
</div>
/* ═══════════════════════════════════════════════════
REPUTATION EVENT PASSAGES
Named RepEvent_[track]_[threshold]
═══════════════════════════════════════════════════ */<<set _catcalls = ["\"Hey baby, I heard you're... friendly!\"", "A group of guys elbow each other as you walk past. One whistles.", "\"Yo, you're that CCUMDUP girl, right? I've heard things.\"", "Someone shouts \"Nice ass!\" from across the quad. Their friends laugh."]>>
<div class="alert alert--info">🔥 <<print _catcalls[random(0, _catcalls.length - 1)]>></div>
<<modStat "stress" 3 "Catcalled">><<set _props = ["A stranger slides into the seat next to you. \"So... you available tonight? I can pay.\"", "A guy you've never met corners you in the hallway. \"Everyone says you're good. How much?\"", "Your phone buzzes. Unknown number: \"heard you give good head. meet me behind the gym?\""]>>
<div class="alert alert--warning">🔥 <<print _props[random(0, _props.length - 1)]>></div>
<<modStat "stress" 5 "Propositioned">>
<<modStat "confidence" -3 "Slut reputation">><<set _events = ["You find \"CAMPUS SLUT\" written on your dorm whiteboard.", "Professor Chen pauses mid-lecture. \"Ms. <<print $pc.lastName>>, perhaps you could spend less time... socialising... and more time studying.\" The class snickers.", "Someone spray-painted your name and a phone number on the bathroom wall."]>>
<div class="alert alert--warning">🔥 <<print _events[random(0, _events.length - 1)]>></div>
<<modStat "stress" 8 "Public humiliation">>
<<modStat "confidence" -5 "Campus slut rep">><<set _invites = ["Three different people invite you to parties this weekend.", "\"Yo, you HAVE to come to the Sigma house tonight. It's gonna be lit.\"", "Your phone is blowing up with party invites."]>>
<div class="alert alert--info">🎉 <<print _invites[random(0, _invites.length - 1)]>></div>
<<modStat "mood" 3 "Popular">><div class="alert alert--info">🎉 You can't walk ten feet without someone asking you to a party. "You're coming tonight, right? It's not a party without you."</div>
<<modStat "mood" 5 "Party legend">>
<<modRep "popular" 2>><<set _recog = ["A student does a double take in the cafeteria. \"Wait... are you... StreamLive? Oh my god.\"", "Someone whispers to their friend as you walk past. You catch: \"...that cam girl...\"", "A guy in your class keeps staring at you. When you make eye contact, he blushes and looks away. He knows."]>>
<div class="alert alert--warning">📷 <<print _recog[random(0, _recog.length - 1)]>></div>
<<modStat "stress" 5 "Recognized from cam">><div class="alert alert--warning">📷 A group of students recognises you openly. "Oh shit, you're <<print $pc.firstName>>_Cam! I subscribe! Can I get a selfie?" The attention is mortifying and exhilarating.</div>
<<modStat "stress" 5 "Campus-wide recognition">>
<<modStat "confidence" 3 "Fan encounter">><div class="alert alert--warning">💀 You receive an official letter from the Dean's office. <strong>"This is your final warning. Any further infractions will result in immediate expulsion from the CCUMDUP programme."</strong></div>
<<modStat "stress" 15 "Expulsion warning">><<set _notices = ["Someone waves at you from across the quad. You don't recognise them, but they clearly know you.", "\"Hey, aren't you <<print $pc.firstName>>? I follow you on InstaGlam!\"", "A freshman asks for a selfie with you. You're... recognisable now."]>>
<div class="alert alert--info">⭐ <<print _notices[random(0, _notices.length - 1)]>></div>
<<modStat "mood" 3 "Recognised">><div class="alert alert--info">⭐ You're a campus celebrity. People point and whisper. Freshmen follow you on social media just because. You can't go anywhere without being noticed.</div>
<<modStat "mood" 5 "Campus celebrity">>
<<modStat "confidence" 5 "Famous">>/* ═══════════════════════════════════════════════════
JOURNAL SYSTEM — Auto-generated diary entries
Tone varies by femininity level
═══════════════════════════════════════════════════ */
/* ─── Generate end-of-day journal entry ─── */
<<widget "generateJournalEntry">>
<<if $journal.autoGenerate && $journal.lastEntryDay !== $world.day>>
<<set $journal.lastEntryDay = $world.day>>
/* Build the entry from the day's events */
<<set _entry = {day: $world.day, semester: $world.semester, week: $world.week, dayOfWeek: $world.dayOfWeek, femininity: $pc.femininity, mood: $pc.mood}>>
/* Title based on day */
<<set _dayNames = ["", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]>>
<<set _entry.title = _dayNames[$world.dayOfWeek] + ", Week " + $world.week>>
/* Generate body text based on what happened today */
<<set _lines = []>>
/* Femininity-toned opening */
<<if $pc.femininity >= 67>>
<<set _openers = ["Dear diary! ❤️", "OMG what a day!", "Okay so today was wild.", "Hiii diary~", "Sooo much happened today!"]>>
<<elseif $pc.femininity >= 34>>
<<set _openers = ["Another day.", "Today was... something.", "Journal entry.", "Well, here goes.", "So today happened."]>>
<<else>>
<<set _openers = ["Day " + $world.day + ".", "Still stuck in this body.", "Another day as a 'girl'.", "Christ.", "Logging today's events."]>>
<</if>>
<<run _lines.push(_openers[random(0, _openers.length - 1)])>>
/* Service encounters */
<<if $scholarship.currentWeekServiced > 0>>
<<if $pc.femininity >= 67>>
<<run _lines.push("Had to do some service work for the scholarship. It's actually getting easier? Like, I don't hate it anymore.")>>
<<elseif $pc.femininity >= 34>>
<<run _lines.push("Did my CCUMDUP duties. It is what it is.")>>
<<else>>
<<run _lines.push("More degrading 'service' for the scholarship. I just need to get through this.")>>
<</if>>
<</if>>
/* Academic */
<<if $pc.intelligence >= 60>>
<<run _lines.push("Studies are going well at least. Small mercies.")>>
<<elseif $pc.intelligence < 30>>
<<if $pc.femininity >= 67>>
<<run _lines.push("Ugh, studying is SO hard. Why do I even need to know this stuff?")>>
<<else>>
<<run _lines.push("Can't seem to focus on studying. My mind keeps... wandering.")>>
<</if>>
<</if>>
/* Mood-based */
<<if $pc.mood >= 80>>
<<if $pc.femininity >= 67>>
<<run _lines.push("Feeling amazing today! Everything just clicks. 💕")>>
<<else>>
<<run _lines.push("Oddly enough, I'm in a good mood. Not sure why.")>>
<</if>>
<<elseif $pc.mood <= 30>>
<<run _lines.push("Feeling pretty low. This isn't the life I imagined for myself.")>>
<</if>>
/* Arousal */
<<if $pc.arousal >= 70>>
<<if $pc.femininity >= 67>>
<<run _lines.push("I've been SO horny all day. This body is... a lot.")>>
<<else>>
<<run _lines.push("The arousal is getting harder to manage. This body reacts to everything.")>>
<</if>>
<</if>>
/* Jobs */
<<if $jobs.current.length > 0>>
<<if $pc.femininity >= 67>>
<<run _lines.push("Worked today. Gotta keep that money coming in! 💰")>>
<<else>>
<<run _lines.push("Worked a shift. At least I'm earning something.")>>
<</if>>
<</if>>
/* Reputation-based reflection */
<<if $reputation.slut >= 60>>
<<if $pc.femininity >= 67>>
<<run _lines.push("People are definitely talking about me. Whatever, let them. 💅")>>
<<else>>
<<run _lines.push("My reputation is getting... complicated. People look at me differently now.")>>
<</if>>
<</if>>
/* Femininity-based closing */
<<if $pc.femininity >= 67>>
<<set _closers = ["Anyway, love ya diary! xoxo", "Gotta go do my skincare. Night! ✨", "Time for bed! Hopefully I dream of something nice~", "Kisses! 💋"]>>
<<elseif $pc.femininity >= 34>>
<<set _closers = ["That's about it for today.", "We'll see what tomorrow brings.", "One day at a time.", "Signing off."]>>
<<else>>
<<set _closers = ["End of log.", "Surviving. Barely.", "X more days until this is over.", "I miss my old life."]>>
<</if>>
<<run _lines.push(_closers[random(0, _closers.length - 1)])>>
<<set _entry.text = _lines.join(" ")>>
<<run $journal.entries.push(_entry)>>
/* Keep only last 30 entries */
<<if $journal.entries.length > 30>>
<<run $journal.entries.shift()>>
<</if>>
<</if>>
<</widget>>
/* ─── Display Journal ─── */
<<widget "showJournal">>
<<if $journal.entries.length === 0>>
<p><em>No entries yet. Your journal will fill as you live your new life.</em></p>
<<else>>
<<for _i = $journal.entries.length - 1; _i >= 0; _i-->>
<<set _e = $journal.entries[_i]>>
<div class="card">
<div class="card__title">📓 <<print _e.title>> — Day <<print _e.day>></div>
<p><<print _e.text>></p>
<p class="stat-value" style="font-size:0.75em; opacity:0.6">Femininity: <<print _e.femininity>> | Mood: <<print _e.mood>></p>
</div>
<</for>>
<</if>>
<</widget>><h2>📓 Journal</h2>
<p>Your personal diary. Entries are generated automatically at the end of each day.</p>
<div class="choice-group">
<<if $journal.autoGenerate>>
<<link '<span class="choice-btn choice-btn--small">📝 Auto-generate: ON</span>' "JournalMenu">>
<<set $journal.autoGenerate = false>>
<</link>>
<<else>>
<<link '<span class="choice-btn choice-btn--small">📝 Auto-generate: OFF</span>' "JournalMenu">>
<<set $journal.autoGenerate = true>>
<</link>>
<</if>>
</div>
<<divider "Entries">>
<<showJournal>>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "CampusMap">><</link>>
</div>/* ═══════════════════════════════════════════════════
ACHIEVEMENT SYSTEM — ~30 milestone achievements
═══════════════════════════════════════════════════ */
/* ─── Achievement Definitions ─── */
<<widget "initAchievements">>
<<if !$achievements>>
<<set $achievements = {
unlocked: [],
definitions: [
/* Service */
{id: "firstService", name: "First Time", emoji: "🌟", desc: "Complete your first CCUMDUP service encounter", cat: "Service"},
{id: "service10", name: "Getting Used To It", emoji: "🔟", desc: "Complete 10 service encounters", cat: "Service"},
{id: "service50", name: "Veteran", emoji: "🏅", desc: "Complete 50 service encounters", cat: "Service"},
{id: "service100", name: "Campus Legend", emoji: "👑", desc: "Complete 100 service encounters", cat: "Service"},
{id: "fiveStarStreak", name: "Perfect 5", emoji: "⭐", desc: "Get 5 five-star ratings in a row", cat: "Service"},
{id: "firstGangbang", name: "Team Player", emoji: "👥", desc: "Survive your first gangbang", cat: "Service"},
{id: "allServiceTypes", name: "Full Menu", emoji: "📋", desc: "Perform every service type at least once", cat: "Service"},
/* Academic */
{id: "deansList", name: "Dean's List", emoji: "🎓", desc: "Achieve GPA 3.8 or higher", cat: "Academic"},
{id: "perfectAttendance", name: "Perfect Attendance", emoji: "📝", desc: "Attend every class for 4 weeks straight", cat: "Academic"},
{id: "surviveFinals", name: "Final Survivor", emoji: "📚", desc: "Survive finals week", cat: "Academic"},
/* Social */
{id: "joinSorority", name: "Sister!", emoji: "🏡", desc: "Join a sorority", cat: "Social"},
{id: "parties10", name: "Party Animal", emoji: "🎉", desc: "Attend 10 parties", cat: "Social"},
{id: "firstFrat", name: "Frat Party Rookie", emoji: "🍺", desc: "Attend your first frat party", cat: "Social"},
/* Jobs */
{id: "firstPaycheck", name: "First Paycheck", emoji: "💰", desc: "Earn money from any job", cat: "Jobs"},
{id: "firstCamShow", name: "Going Live", emoji: "📷", desc: "Complete your first cam show", cat: "Jobs"},
{id: "fansOnly100", name: "OnlyFamous", emoji: "💎", desc: "Reach 100 FansOnly subscribers", cat: "Jobs"},
{id: "firstArrest", name: "Busted", emoji: "🚔", desc: "Get arrested for the first time", cat: "Jobs"},
{id: "drugLord", name: "Drug Lord", emoji: "🧪", desc: "Earn $1000 from dealing", cat: "Jobs"},
/* Transformation */
{id: "fem50", name: "Halfway There", emoji: "🦋", desc: "Reach 50 femininity", cat: "Transform"},
{id: "fem80", name: "Embracing It", emoji: "💃", desc: "Reach 80 femininity", cat: "Transform"},
{id: "femMax", name: "True Woman", emoji: "👸", desc: "Reach 100 femininity", cat: "Transform"},
/* Style */
{id: "bimboMakeover", name: "Bimbo!", emoji: "💄", desc: "Full bimbo style: hair, makeup, outfit", cat: "Style"},
{id: "gothQueen", name: "Goth Queen", emoji: "🖤", desc: "Full goth style: hair, makeup, outfit", cat: "Style"},
{id: "tattooCollection", name: "Ink Canvas", emoji: "🖋️", desc: "Get 5 or more tattoos", cat: "Style"},
/* Reputation */
{id: "campusSlut", name: "Campus Slut", emoji: "🔥", desc: "Reach 80+ Slut reputation", cat: "Reputation"},
{id: "partyLegend", name: "Party Legend", emoji: "🎉", desc: "Reach 80+ Party Girl reputation", cat: "Reputation"},
{id: "scholar", name: "Scholar", emoji: "📚", desc: "Reach 80+ Good Student reputation", cat: "Reputation"},
{id: "celebrity", name: "Campus Celebrity", emoji: "⭐", desc: "Reach 80+ Popular reputation", cat: "Reputation"},
/* Other */
{id: "firstPregnancy", name: "Expecting", emoji: "🤰", desc: "Discover your first pregnancy", cat: "Other"},
{id: "blackoutDrunk", name: "Blackout", emoji: "🍻", desc: "Drink until you black out", cat: "Other"},
{id: "sororityInitiation", name: "Initiated", emoji: "🏡", desc: "Complete full sorority initiation", cat: "Other"}
]
}>>
<</if>>
<</widget>>
/* ─── Award an achievement ─── */
<<widget "awardAchievement">>
<<set _id = _args[0]>>
<<if $achievements && $achievements.unlocked.indexOf(_id) === -1>>
<<run $achievements.unlocked.push(_id)>>
<<set _def = $achievements.definitions.find(function(a) { return a.id === _id; })>>
<<if _def>>
<<run XCLC.Toast.show("🏆 Achievement Unlocked: " + _def.emoji + " " + _def.name, "info")>>
<</if>>
<</if>>
<</widget>>
/* ─── Check all achievement conditions ─── */
<<widget "checkAchievements">>
<<if $achievements>>
/* Service */
<<if $scholarship.totalServiced >= 1>><<awardAchievement "firstService">><</if>>
<<if $scholarship.totalServiced >= 10>><<awardAchievement "service10">><</if>>
<<if $scholarship.totalServiced >= 50>><<awardAchievement "service50">><</if>>
<<if $scholarship.totalServiced >= 100>><<awardAchievement "service100">><</if>>
/* Academic */
<<if $scholarship.rating >= 4.75>><<awardAchievement "deansList">><</if>>
/* Jobs */
<<if $finance.totalEarned > 0 && $jobs.current.length > 0>><<awardAchievement "firstPaycheck">><</if>>
<<if $jobs.camGirl.shows >= 1>><<awardAchievement "firstCamShow">><</if>>
<<if $jobs.fansOnly.subs >= 100>><<awardAchievement "fansOnly100">><</if>>
<<if $jobs.hooker.arrested >= 1 || $jobs.dealer.heatLevel >= 10>><<awardAchievement "firstArrest">><</if>>
<<if $jobs.dealer.earnings >= 1000>><<awardAchievement "drugLord">><</if>>
/* Transformation */
<<if $pc.femininity >= 50>><<awardAchievement "fem50">><</if>>
<<if $pc.femininity >= 80>><<awardAchievement "fem80">><</if>>
<<if $pc.femininity >= 100>><<awardAchievement "femMax">><</if>>
/* Style */
<<if $pc.tattoos && $pc.tattoos.length >= 5>><<awardAchievement "tattooCollection">><</if>>
/* Reputation */
<<if $reputation.slut >= 80>><<awardAchievement "campusSlut">><</if>>
<<if $reputation.partyGirl >= 80>><<awardAchievement "partyLegend">><</if>>
<<if $reputation.goodStudent >= 80>><<awardAchievement "scholar">><</if>>
<<if $reputation.popular >= 80>><<awardAchievement "celebrity">><</if>>
/* Other */
<<if $pregnancy.totalPregnancies >= 1 && $pregnancy.discovered>><<awardAchievement "firstPregnancy">><</if>>
<<if $substances.drunkLevel >= 5>><<awardAchievement "blackoutDrunk">><</if>>
<<if $greekLife && $greekLife.pledging.completed>><<awardAchievement "sororityInitiation">><</if>>
<<if $greekLife && $greekLife.pledging.active>><<awardAchievement "joinSorority">><</if>>
/* Social */
<<if $social && $social.partiesAttended >= 10>><<awardAchievement "parties10">><</if>>
<<if $social && $social.partiesAttended >= 1>><<awardAchievement "firstFrat">><</if>>
<</if>>
<</widget>>
/* ─── Display achievements ─── */
<<widget "showAchievements">>
<<if $achievements>>
<<set _cats = ["Service", "Academic", "Social", "Jobs", "Transform", "Style", "Reputation", "Other"]>>
<<for _ci = 0; _ci < _cats.length; _ci++>>
<<set _cat = _cats[_ci]>>
<<set _catAch = $achievements.definitions.filter(function(a) { return a.cat === _cat; })>>
<<if _catAch.length > 0>>
<div class="card">
<div class="card__title"><<print _cat>></div>
<<for _ai = 0; _ai < _catAch.length; _ai++>>
<<set _a = _catAch[_ai]>>
<<set _unlocked = $achievements.unlocked.indexOf(_a.id) !== -1>>
<p style="opacity: <<if _unlocked>>1<<else>>0.4<</if>>">
<<if _unlocked>>✅<<else>>🔒<</if>>
<<print _a.emoji>> <strong><<print _a.name>></strong> — <<print _a.desc>>
</p>
<</for>>
</div>
<</if>>
<</for>>
<p><strong><<print $achievements.unlocked.length>></strong> / <<print $achievements.definitions.length>> unlocked</p>
<</if>>
<</widget>><h2>🏆 Achievements</h2>
<<initAchievements>>
<<checkAchievements>>
<<showAchievements>>
<<divider "">>
<div class="choice-group">
<<link '<span class="choice-btn">🔙 Back</span>' "CampusMap">><</link>>
</div>/* ═══════════════════════════════════════════════════
THORNFIELD — CORE DISPLAY WIDGETS
Stat bars, dividers, alerts, choice buttons
═══════════════════════════════════════════════════ */
/* ─── Stat Display Bar (inline) ─── */
<<widget "statBar">>
/* Usage: <<statBar "Energy" $pc.energy 100 "energy">> */
<<set _label = _args[0]>>
<<set _val = Math.round(_args[1])>>
<<set _max = _args[2] || 100>>
<<set _cls = _args[3] || "default">>
<<set _pct = Math.min(100, Math.max(0, Math.round((_val / _max) * 100)))>>
<div class="stat-bar-row">
<span class="stat-bar-label">_label</span>
<div class="stat-bar-track"><div class="stat-bar-fill _cls" style="width:<<print _pct>>%;"></div></div>
<span class="stat-bar-val"><<print _val>></span>
</div>
<</widget>>
/* ─── Section Divider ─── */
<<widget "divider">>
/* Usage: <<divider "Section Title">> */
<div class="divider">
<<if _args[0]>>
<span class="divider__text"><<print _args[0]>></span>
<</if>>
</div>
<</widget>>
/* ─── Alert Box ─── */
<<widget "alert">>
/* Usage: <<alert "info" "This is a message">> */
<<set _type = _args[0] || "info">>
<<set _msg = _args[1] || "">>
<div class="alert alert--_type"><<print _msg>></div>
<</widget>>
/* ─── Choice Button (SugarCube link wrapper) ─── */
<<widget "choiceBtn">>
/* Usage: <<choiceBtn "PassageName" "Button text">> */
<<set _passage = _args[0]>>
<<set _text = _args[1]>>
<div class="choice-group">
<<link _text _passage>><</link>>
</div>
<</widget>>
/* ─── Toast Widget (calls JS) ─── */
<<widget "toast">>
/* Usage: <<toast "Message text" "type">> */
<<set _msg = _args[0]>>
<<set _type = _args[1] || "info">>
<<run XCLC.Toast.show(_msg, _type)>>
<</widget>>
/* ─── Money Display ─── */
<<widget "showMoney">>
/* Usage: <<showMoney>> */
<<if $finance.money >= 0>>
<span class="money positive">$<<print $finance.money>></span>
<<else>>
<span class="money negative">-$<<print Math.abs($finance.money)>></span>
<</if>>
<</widget>>
/* ─── Modify Cash ─── */
<<widget "addCash">>
/* Usage: <<addCash 100 "Service payment">> */
<<set _amount = _args[0]>>
<<set _reason = _args[1] || "Unknown">>
<<set $finance.money += _amount>>
<<if _amount > 0>>
<<set $finance.totalEarned += _amount>>
<<run XCLC.Toast.show('+$' + _amount + ' — ' + _reason, 'money')>>
<<else>>
<<set $finance.totalSpent += Math.abs(_amount)>>
<<run XCLC.Toast.show('-$' + Math.abs(_amount) + ' — ' + _reason, 'warning')>>
<</if>>
<<set $finance.transactions.push({
amount: _amount,
description: _reason,
day: $world.day,
time: $world.time
})>>
<</widget>>
/* ─── Phone Overlay HTML (injected into StoryInterface via PassageDone if needed) ─── */
<<widget "initPhone">>
<<if !document.getElementById('phone-overlay')>>
<<run $(document.getElementById('xclc-app')).append('<div id="phone-overlay"><div id="phone-screen"></div></div>')>>
<</if>>
<</widget>>/* ═══════════════════════════════════════════════════
THORNFIELD — TIME SYSTEM WIDGETS
═══════════════════════════════════════════════════ */
/* ─── Advance Time ─── */
<<widget "advanceTime">>
/* Usage: <<advanceTime 60>> (advances 60 minutes) */
<<set _minutes = _args[0] || 30>>
<<set _oldPeriod = XCLC.Time.getPeriod($world.time)>>
/* Advance the clock */
<<set $world.time += _minutes>>
/* ─── Day Rollover ─── */
<<if $world.time >= 1440>>
<<set $world.time -= 1440>>
<<set $world.day++>>
<<set $world.dayOfMonth++>>
<<set $world.dayOfWeek++>>
<<if $world.dayOfWeek > 7>>
<<set $world.dayOfWeek = 1>>
<</if>>
/* Hair growth tick */
<<if !$transformation.addons.noHair>>
<<set _daysSinceShave = $world.day - $pc.lastShaved>>
<<if _daysSinceShave > 2 && $pc.legHair < 2>>
<<set $pc.legHair = Math.min(2, $pc.legHair + 1)>>
<</if>>
<<if _daysSinceShave > 4 && $pc.pubicHair < 4>>
<<set $pc.pubicHair = Math.min(4, $pc.pubicHair + 1)>>
<</if>>
<</if>>
/* Beauty decay (gym) */
<<if $world.day - $pc.lastGymDay > 7 && $pc.beautyFitness > 0>>
<<set $pc.beautyFitness = Math.max(0, $pc.beautyFitness - 2)>>
<</if>>
/* Grooming beauty recalc */
<<if $pc.legHair === 0>>
<<set $pc.beautyGrooming = 10>>
<<elseif $pc.legHair === 1>>
<<set $pc.beautyGrooming = 3>>
<<else>>
<<set $pc.beautyGrooming = 0>>
<</if>>
<<if $pc.pubicHair === 1>><<set $pc.beautyGrooming += 3>><</if>>
<<if $pc.pubicHair === 2>><<set $pc.beautyGrooming += 4>><</if>>
<<if $pc.pubicHair === 3>><<set $pc.beautyGrooming += 2>><</if>>
/* Hygiene decay (overnight) */
<<set $hygiene.cleanliness = Math.max(0, $hygiene.cleanliness - 5)>>
/* Reset daily service request counter */
<<set $scholarship.requestsToday = 0>>
/* Reset daily gym flag */
<<if $gym>><<set $gym.workedOutToday = false>><</if>>
/* Journal entry */
<<generateJournalEntry>>
/* Reset daily rep event flag */
<<set $temp.repCheckedToday = false>>
/* Achievement check */
<<if $achievements>><<checkAchievements>><</if>>
/* Substance sobering */
<<if $substances.drunkLevel > 0>>
<<set $substances.drunkLevel = 0>>
<<set $substances.drinksToday = 0>>
<<if $substances.hangoverSeverity > 0>>
<<set $substances.hangover = true>>
<</if>>
<</if>>
<<if $substances.weed.high>>
<<set $substances.weed.high = false>>
<</if>>
<<if $substances.cocaine.high>>
<<set $substances.cocaine.high = false>>
<</if>>
<<if $substances.ecstasy.rolling>>
<<set $substances.ecstasy.rolling = false>>
<<set $substances.ecstasy.comedown = true>>
<</if>>
/* Month rollover */
<<set _daysInMonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]>>
<<if $world.dayOfMonth > _daysInMonth[$world.month]>>
<<set $world.dayOfMonth = 1>>
<<set $world.month++>>
<<if $world.month > 12>>
<<set $world.month = 1>>
<<set $world.yearActual++>>
<</if>>
<</if>>
/* ─── Weekly Rollover (Sunday midnight) ─── */
<<if $world.dayOfWeek === 1>>
<<set $world.week++>>
/* Quota check */
<<set _target = $scholarship.isFinalsWeek ? $scholarship.finalsQuota : $scholarship.weeklyQuota>>
<<if $scholarship.currentWeekServiced < _target>>
/* Missed quota — rating penalty */
<<set _penalty = (_target - $scholarship.currentWeekServiced) * 0.2>>
<<set $scholarship.rating = Math.max(2.0, $scholarship.rating - _penalty)>>
<<if $scholarship.rating < 4.0 && !$scholarship.onProbation>>
<<set $scholarship.onProbation = true>>
<<set $scholarship.probationWeeks = 0>>
<</if>>
<</if>>
/* Store weekly history */
<<set $scholarship.weeklyHistory.push({
week: $world.week - 1,
serviced: $scholarship.currentWeekServiced,
credits: $scholarship.currentWeekCredits,
avgRating: $scholarship.totalRatings > 0 ? $scholarship.ratingSum / $scholarship.totalRatings : 5.0
})>>
/* Reset weekly counters */
<<set $scholarship.currentWeekServiced = 0>>
<<set $scholarship.currentWeekCredits = 0>>
<<set $scholarship.weekLog = []>>
<<set $scholarship.rerollAvailable = true>>
/* Probation tracking */
<<if $scholarship.onProbation>>
<<set $scholarship.probationWeeks++>>
<<if $scholarship.rating >= 4.5>>
<<set $scholarship.onProbation = false>>
<<set $scholarship.probationWeeks = 0>>
<</if>>
<</if>>
/* ─── Weekly Job Processing ─── */
<<if $jobs>>
/* FansOnly weekly revenue */
<<if $jobs.fansOnly.active && $jobs.fansOnly.subs > 0>>
<<set _foRevenue = $jobs.fansOnly.subs * 5>>
<<set $finance.money += _foRevenue>>
<<set $finance.totalEarned += _foRevenue>>
<<set $jobs.fansOnly.revenue += _foRevenue>>
<</if>>
/* Dealer heat decay */
<<if $jobs.dealer.active && $jobs.dealer.heatLevel > 0>>
<<set $jobs.dealer.heatLevel = Math.max(0, $jobs.dealer.heatLevel - 1)>>
<</if>>
/* Cheerleader practice miss check (MWF) */
<<if $jobs.cheerleader.active>>
<<set _daysSincePractice = $world.day - $jobs.cheerleader.practiceDay>>
<<if _daysSincePractice > 3>>
<<set $jobs.cheerleader.practicesMissed++>>
<<if $jobs.cheerleader.practicesMissed >= 3>>
<<quitJob "cheerleader">>
<<set $jobs.cheerleader.hasOutfit = false>>
<</if>>
<</if>>
<</if>>
<</if>>
/* Semester structure: 16 weeks */
<<if $world.week > 16>>
<<set $world.week = 1>>
<<set $world.semester++>>
<<if $world.semester % 2 === 1>>
/* New academic year */
<<set $world.year = Math.ceil($world.semester / 2)>>
<</if>>
<<if $world.semester > 6>>
/* Graduation! */
<<goto "Graduation">>
<</if>>
<</if>>
/* Check for special weeks */
<<set $world.isFinalsWeek = ($world.week >= 15)>>
<<set $scholarship.isFinalsWeek = $world.isFinalsWeek>>
<<set $world.isSpringBreak = ($world.semester % 2 === 0 && $world.week >= 12 && $world.week <= 13)>>
/* Season */
<<if $world.month >= 9 && $world.month <= 11>>
<<set $world.season = "autumn">>
<<elseif $world.month === 12 || $world.month <= 2>>
<<set $world.season = "winter">>
<<elseif $world.month >= 3 && $world.month <= 5>>
<<set $world.season = "spring">>
<<else>>
<<set $world.season = "summer">>
<</if>>
/* ─── Phase 7: Weekly Meta Systems ─── */
/* Pregnancy progression */
<<pregnancyProgress>>
/* Seasonal event check */
<<checkSeasonalEvent>>
/* Weekly performance report flag */
<<set $temp.weeklyReportPending = true>>
/* ─── Phase 9: Blackmail check ─── */
<<checkBlackmail>>
<</if>>
<</if>>
/* ─── Period Change Processing ─── */
<<set _newPeriod = XCLC.Time.getPeriod($world.time)>>
<<if _oldPeriod !== _newPeriod>>
/* Side effect processing happens on period change */
<<processEffects>>
/* Hygiene decay per period */
<<set $hygiene.cleanliness = Math.max(0, $hygiene.cleanliness - 3)>>
/* Energy drain */
<<if _newPeriod === "late_night" && $pc.energy > 0>>
<<set $pc.energy = Math.max(0, $pc.energy - 10)>>
<</if>>
/* Hangover clears at noon */
<<if $substances.hangover && $world.time >= 720>>
<<set $substances.hangover = false>>
<<set $substances.hangoverSeverity = 0>>
<</if>>
/* ─── Random Daily Events ─── */
<<checkRandomEvent>>
/* ─── Body Writing visibility ─── */
<<if $bodyWriting.active && $bodyWriting.texts.length > 0>>
<<if $hygiene.cleanliness >= 90>>
/* Shower washed it off */
<<set $bodyWriting.active = false>>
<<set $bodyWriting.texts = []>>
<</if>>
<</if>>
<</if>>
/* Recalculate beauty */
<<run XCLC.Beauty.recalculate()>>
/* Service request expiry check */
<<run XCLC.Service.checkRequestExpiry()>>
<</widget>>
/* ─── Process Side Effects (called on period change) ─── */
<<widget "processEffects">>
<<set _se = $transformation.sideEffects>>
/* Internal Heat — arousal buildup */
<<if _se.internalHeat > 0>>
<<set $pc.arousal = Math.min(100, $pc.arousal + (_se.internalHeat * 5))>>
<</if>>
/* Increased Sensitivity — arousal gains multiplied */
/* (handled contextually during encounters, but passive tick here) */
<<if _se.increasedSensitivity > 0>>
<<set $pc.arousal = Math.min(100, $pc.arousal + (_se.increasedSensitivity * 2))>>
<</if>>
/* Submissive — willpower penalty (maintained, doesn't stack repeatedly) */
<<if _se.submissive > 0>>
<<set $pc.willpower = Math.max(0, 60 - (_se.submissive * 5))>>
<</if>>
/* Random Orgasm — chance per period */
<<if _se.randomOrgasm > 0>>
<<set _orgasmChance = _se.randomOrgasm * 10>>
<<if random(1, 100) <= _orgasmChance>>
<<set $pc.arousal = 100>>
/* Orgasm will be narrated in context */
<</if>>
<</if>>
/* Sexual Fluid Addiction — withdrawal check */
<<if _se.sexualFluidAddiction >= 3>>
/* At level 3+, need daily dose or mood penalty */
<<if $scholarship.currentWeekServiced === 0 && $world.dayOfWeek > 1>>
<<set $pc.mood = Math.max(0, $pc.mood - (_se.sexualFluidAddiction * 5))>>
<</if>>
<</if>>
/* Lactation — must express or pain */
<<if _se.lactation >= 2>>
/* Handled contextually in routine passages */
<</if>>
/* Exhibitionist — arousal from being dressed inappropriately */
<<if _se.exhibitionist >= 3>>
<<set $pc.arousal = Math.min(100, $pc.arousal + 5)>>
<</if>>
/* Pheromones — arousal in crowded areas (location-dependent, passive tick) */
<<if _se.pheromones > 0>>
<<set $pc.arousal = Math.min(100, $pc.arousal + _se.pheromones)>>
<</if>>
/* Erotic Dreams — handled at morning routine */
/* Bimbofication — intelligence decay */
<<if _se.bimbofication >= 2>>
/* -1 intelligence per week (processed weekly, but check here) */
<<if $world.dayOfWeek === 1>>
<<set $pc.intelligence = Math.max(0, $pc.intelligence - _se.bimbofication)>>
<<if _se.bimbofication >= 4>>
<<set $pc.intelligence = Math.min(30, $pc.intelligence)>>
<</if>>
<</if>>
<</if>>
/* Memory Loss — femininity boost */
<<if _se.memoryLoss >= 3>>
<<set $pc.femininity = Math.min(100, $pc.femininity + 1)>>
<</if>>
/* ─── Add-on Enforcement ─── */
/* Metabolism Control — prevent weight/body changes */
<<if $transformation.addons.metabolismControl && $pc.bodyWeight>>
<<set $pc.bodyWeight = $pc.bodyWeightBase || $pc.bodyWeight>>
<</if>>
/* No Period — skip period symptoms entirely */
<<if $transformation.addons.noPeriod && $pregnancy.periodDue>>
<<set $pregnancy.periodDue = false>>
<</if>>
/* Orgasm Denial — frustration buildup */
<<if _se.orgasmDenial >= 2>>
<<if $pc.arousal >= 80>>
<<set $pc.stress = Math.min(100, $pc.stress + 3)>>
<</if>>
<</if>>
/* Masturbation Denial — can't relieve via solo */
/* (enforcement is in the DormRoom_Masturbate passage check) */
/* Strong Orgasms — mood bonus from orgasm events, energy cost at high levels */
/* (triggered contextually during orgasm events, not per-period) */
<</widget>>
/* ─── Display Time ─── */
<<widget "showTime">>
<<print XCLC.Time.format($world.time)>>
<</widget>>
/* ─── Display Date ─── */
<<widget "showDate">>
<<print XCLC.Time.dayNameFull($world.dayOfWeek)>>, <<print XCLC.Time.monthName($world.month)>> <<print $world.dayOfMonth>>
<</widget>>
/* ─── Display Period ─── */
<<widget "showPeriod">>
<<print XCLC.Time.getPeriodName($world.time)>>
<</widget>>
/* ─── Advance to next day (skip to midnight rollover) ─── */
<<widget "advanceDay">>
<<set _remaining = 1440 - $world.time>>
<<if _remaining > 0>>
<<advanceTime _remaining>>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════
📊 WEEKLY PERFORMANCE REPORT
Shown on Monday morning
═══════════════════════════════════════════════════ */<h2>📊 Weekly Report — Week <<print $world.week - 1>></h2>
<<set $temp.weeklyReportPending = false>>
/* CCUMDUP */
<div class="card">
<div class="card__title">🎀 CCUMDUP Service</div>
<<set _target = $scholarship.isFinalsWeek ? $scholarship.finalsQuota : $scholarship.weeklyQuota>>
<<set _lastWeek = $scholarship.weeklyHistory.length > 0 ? $scholarship.weeklyHistory[$scholarship.weeklyHistory.length - 1] : null>>
<<if _lastWeek>>
<p><strong>Serviced:</strong> <<print _lastWeek.serviced>> / <<print _target>> target</p>
<p><strong>Credits earned:</strong> <<print _lastWeek.credits>></p>
<p><strong>Avg rating:</strong> <<print Math.round(_lastWeek.avgRating * 10) / 10>> ⭐</p>
<<if _lastWeek.serviced < _target>>
<div class="alert alert--warning">⚠️ Quota not met! Rating penalty applied.</div>
<</if>>
<<else>>
<p><em>No service data from last week.</em></p>
<</if>>
<p><strong>Current Rating:</strong> <<print Math.round($scholarship.rating * 10) / 10>> / 5.0 ⭐</p>
<<if $scholarship.onProbation>><div class="alert alert--warning">⚠️ <strong>ON PROBATION</strong> (Week <<print $scholarship.probationWeeks>>)</div><</if>>
</div>
/* Finance */
<div class="card">
<div class="card__title">💰 Finances</div>
<p><strong>Cash on hand:</strong> $<<print $finance.money>></p>
<p><strong>Total earned (all time):</strong> $<<print $finance.totalEarned>></p>
<p><strong>Total spent (all time):</strong> $<<print $finance.totalSpent>></p>
<<if $jobs.fansOnly.active && $jobs.fansOnly.subs > 0>>
<p><strong>FansOnly revenue this week:</strong> $<<print $jobs.fansOnly.subs * 5>> (<<print $jobs.fansOnly.subs>> subs)</p>
<</if>>
</div>
/* Jobs */
<<if $jobs.current.length > 0>>
<div class="card">
<div class="card__title">💼 Employment</div>
<<set _jobNames = {barista: "☕ Barista", bartender: "🍸 Bartender", tutor: "📚 Tutor", cheerleader: "📣 Cheerleader", camGirl: "📷 Cam Girl", fansOnly: "💰 FansOnly", stripper: "💃 Stripper", hooker: "💋 Escort", dealer: "🧪 Dealer"}>>
<<for _j = 0; _j < $jobs.current.length; _j++>>
<<set _jid = $jobs.current[_j]>>
<p><<print _jobNames[_jid] || _jid>></p>
<</for>>
</div>
<</if>>
/* Reputation movers */
<div class="card">
<div class="card__title">📊 Reputation</div>
<<set _repTracks = [
{id: "slut", name: "🔥 Slut", val: $reputation.slut},
{id: "partyGirl", name: "🎉 Party Girl", val: $reputation.partyGirl},
{id: "goodStudent", name: "📚 Good Student", val: $reputation.goodStudent},
{id: "popular", name: "⭐ Popular", val: $reputation.popular}
]>>
<<for _r = 0; _r < _repTracks.length; _r++>>
<<set _rt = _repTracks[_r]>>
<<if _rt.val > 0>>
<p><<print _rt.name>>: <<print _rt.val>>/100</p>
<</if>>
<</for>>
</div>
/* Pregnancy */
<<if $pregnancy.isPregnant && $pregnancy.discovered>>
<div class="card">
<div class="card__title">🤰 Pregnancy</div>
<p><strong>Week <<print $pregnancy.weeksPregnant>></strong> of pregnancy.</p>
<<if $pregnancy.weeksPregnant < 8>>
<p>Not showing yet.</p>
<<elseif $pregnancy.weeksPregnant < 20>>
<p>Starting to show.</p>
<<else>>
<p>Very visibly pregnant.</p>
<</if>>
</div>
<</if>>
/* Seasonal event notice */
<<if $temp.seasonalEvent>>
<div class="alert alert--info">🎉 <strong>Special Event This Week:</strong> Check the campus for seasonal activities!</div>
<</if>>
<<divider "">>
<div class="choice-group">
<<if $temp.seasonalEvent>>
<<set _eventNames = {freshmanWeek: "🎉 Freshman Week", homecoming: "🏟️ Homecoming", halloween: "🎃 Halloween", thanksgiving: "🦃 Thanksgiving", winterFormal: "❄️ Winter Formal", valentines: "💘 Valentine's Day", springBreak: "🏖️ Spring Break", endOfYear: "🎓 End of Year"}>>
<<link '<span class="choice-btn"><<print _eventNames[$temp.seasonalEvent] || "🎉 Seasonal Event">></span>' "SeasonalEvent_" + $temp.seasonalEvent>><</link>>
<</if>>
<<link '<span class="choice-btn">🗺️ Start the Week</span>' "CampusMap">><</link>>
</div>/* ═══════════════════════════════════════════════════
THORNFIELD — STAT MODIFICATION WIDGETS
═══════════════════════════════════════════════════ */
/* ─── Modify Stat (with toast) ─── */
<<widget "modStat">>
/* Usage: <<modStat "mood" 10 "Good service rating">> */
/* Usage: <<modStat "stress" -15 "Relaxing bath">> */
<<set _stat = _args[0]>>
<<set _amount = _args[1]>>
<<set _reason = _args[2] || "">>
<<if _stat === "energy">>
<<set $pc.energy = Math.min(100, Math.max(0, $pc.energy + _amount))>>
<<elseif _stat === "mood">>
<<set $pc.mood = Math.min(100, Math.max(0, $pc.mood + _amount))>>
<<elseif _stat === "stress">>
<<set $pc.stress = Math.min(100, Math.max(0, $pc.stress + _amount))>>
<<elseif _stat === "arousal">>
/* Apply sensitivity multiplier */
<<set _mult = 1>>
<<if $transformation.sideEffects.increasedSensitivity > 0>>
<<set _mult = 1 + ($transformation.sideEffects.increasedSensitivity * 0.5)>>
<</if>>
<<set $pc.arousal = Math.min(100, Math.max(0, $pc.arousal + Math.round(_amount * _mult)))>>
<<elseif _stat === "confidence">>
<<set $pc.confidence = Math.min(100, Math.max(0, $pc.confidence + _amount))>>
<<elseif _stat === "willpower">>
<<set $pc.willpower = Math.min(100, Math.max(0, $pc.willpower + _amount))>>
<<elseif _stat === "intelligence">>
<<set $pc.intelligence = Math.min(100, Math.max(0, $pc.intelligence + _amount))>>
/* Bimbofication cap */
<<if $transformation.sideEffects.bimbofication >= 4>>
<<set $pc.intelligence = Math.min(30, $pc.intelligence)>>
<</if>>
<<elseif _stat === "femininity">>
<<set $pc.femininity = Math.min(100, Math.max(0, $pc.femininity + _amount))>>
<<elseif _stat === "health">>
<<set $pc.health = Math.min(100, Math.max(0, $pc.health + _amount))>>
<</if>>
/* Show toast */
<<if _amount > 0>>
<<run XCLC.Toast.show(_stat.charAt(0).toUpperCase() + _stat.slice(1) + ' +' + _amount + (_reason ? ' — ' + _reason : ''), 'stat')>>
<<elseif _amount < 0>>
<<run XCLC.Toast.show(_stat.charAt(0).toUpperCase() + _stat.slice(1) + ' ' + _amount + (_reason ? ' — ' + _reason : ''), 'warning')>>
<</if>>
<</widget>>
/* ─── Add XP to Skill ─── */
<<widget "addXP">>
/* Usage: <<addXP "oral" 50>> */
<<set _skillName = _args[0]>>
<<set _xp = _args[1] || 0>>
<<set _skill = $skills[_skillName]>>
<<if _skill>>
<<set _skill.xp += _xp>>
<<run XCLC.Toast.show(_skill.icon + ' ' + _skill.name + ' +' + _xp + ' XP', 'xp')>>
<<if _skill.xp >= _skill.xpNext>>
<<set _skill.xp -= _skill.xpNext>>
<<set _skill.level++>>
<<set _skill.xpNext = Math.round(_skill.xpNext * 1.3)>>
<<run XCLC.Toast.show('⬆️ ' + _skill.name + ' reached Level ' + _skill.level + '!', 'levelup', 5000)>>
<</if>>
<</if>>
<</widget>>
/* ─── Skill Check Widget ─── */
<<widget "skillCheck">>
/* Usage: <<skillCheck "oral" 4>> — checks oral skill against DC 4 */
<<set _skillName = _args[0]>>
<<set _dc = _args[1] || 3>>
<<set _outcome = XCLC.Roll.doCheck(_skillName, _dc)>>
<<set _result = $lastRoll>>
<</widget>>
/* ─── Roll Button (displays clickable button) ─── */
<<widget "rollButton">>
/* Usage: <<rollButton "oral" 4 "Perform Oral" "PassageName">> */
<<set _skillName = _args[0]>>
<<set _dc = _args[1] || 3>>
<<set _label = _args[2] || "Roll">>
<<set _targetPassage = _args[3] || "">>
<<set _calc = XCLC.Roll.calcChance(_skillName, _dc)>>
<<set _skill = $skills[_skillName]>>
<div class="roll-btn-container">
<<if _targetPassage>>
<<link '<span class="roll-btn">' + (_skill ? _skill.icon : '🎲') + ' ' + _label + ' <span class="roll-chance">(' + _calc.finalChance + '%)</span></span>' _targetPassage>>
<<skillCheck _skillName _dc>>
<</link>>
<<else>>
<<link '<span class="roll-btn">' + (_skill ? _skill.icon : '🎲') + ' ' + _label + ' <span class="roll-chance">(' + _calc.finalChance + '%)</span></span>'>>
<<skillCheck _skillName _dc>>
<<run XCLC.DicePopup.show()>>
<</link>>
<</if>>
</div>
<</widget>>
/* ─── Beauty Recalculation ─── */
<<widget "recalcBeauty">>
<<run XCLC.Beauty.recalculate()>>
<</widget>>
/* ─── Modify Reputation ─── */
<<widget "modRep">>
/* Usage: <<modRep "slut" 5 "Public encounter">> */
<<set _track = _args[0]>>
<<set _amount = _args[1]>>
<<set _reason = _args[2] || "">>
<<if $reputation.hasOwnProperty(_track)>>
<<set $reputation[_track] = Math.min(100, Math.max(0, $reputation[_track] + _amount))>>
<<if Math.abs(_amount) >= 5>>
<<run XCLC.Toast.show('Reputation: ' + _track + ' ' + (_amount > 0 ? '+' : '') + _amount + (_reason ? ' — ' + _reason : ''), _amount > 0 ? 'info' : 'warning')>>
<</if>>
<</if>>
<</widget>>
/* ─── Modify Hygiene ─── */
<<widget "modHygiene">>
/* Usage: <<modHygiene -15 "Service encounter">> */
<<set _amount = _args[0]>>
<<set _reason = _args[1] || "">>
<<set $hygiene.cleanliness = Math.min(100, Math.max(0, $hygiene.cleanliness + _amount))>>
<</widget>>
/* ─── Shower ─── */
<<widget "shower">>
/* Usage: <<shower>> */
<<set $hygiene.cleanliness = 100>>
<<set $hygiene.lastShower = $world.day>>
<<set $hygiene.lastShowerTime = $world.time>>
<<advanceTime 30>>
<<run XCLC.Toast.show('🚿 Freshly showered!', 'success')>>
<</widget>>
/* ─── Sleep ─── */
<<widget "sleep">>
/* Usage: <<sleep>> — sleeps until 7 AM */
<<set _sleepHours = $transformation.addons.rest ? 4 : 8>>
<<set _wakeTime = 420>> /* 7:00 AM */
<<set _minutesUntilWake = 0>>
<<if $world.time < _wakeTime>>
<<set _minutesUntilWake = _wakeTime - $world.time>>
<<else>>
<<set _minutesUntilWake = (1440 - $world.time) + _wakeTime>>
<</if>>
/* Restore energy based on sleep hours */
<<set _energyRestore = Math.min(100, _sleepHours * 12)>>
<<set $pc.energy = Math.min(100, $pc.energy + _energyRestore)>>
/* Natural mood/stress recovery */
<<set $pc.mood = Math.min(100, $pc.mood + 10)>>
<<set $pc.stress = Math.max(0, $pc.stress - 15)>>
/* Advance time to morning */
<<advanceTime _minutesUntilWake>>
/* Remove makeup overnight */
<<if $pc.makeupApplied>>
<<set $pc.makeupApplied = false>>
<<set $pc.makeupStyle = "none">>
<<set $pc.beautyMakeup = 0>>
<<run XCLC.Beauty.recalculate()>>
<</if>>
/* Reset daily flags */
<<if $roommate && $roommate.name>>
<<set $roommate.talkedToday = false>>
<</if>>
<</widget>>/* ─── Morning Side Effect Processor ─── */
<<widget "processmorning">>
<<run XCLC.SE.processMorning()>>
<</widget>>
/* ─── Night Side Effect Processor ─── */
<<widget "processnight">>
<<run XCLC.SE.processNight()>>
<</widget>>
/* ─── Random Orgasm Check ─── */
/* Call during any time block — chance based on SE level */
<<widget "checkRandomOrgasm">>
<<if $transformation.sideEffects.randomOrgasm > 0>>
<<set _roChance = $transformation.sideEffects.randomOrgasm * 8>>
<<if random(1,100) <= _roChance>>
<<set _roResult = XCLC.SE.triggerRandomOrgasm()>>
<<if _roResult.triggered>>
<div class="alert alert--danger"><<print _roResult.text>></div>
<<modStat "arousal" -40 "Orgasm">>
<<if $transformation.sideEffects.squirting > 0>>
<<if random(1,100) <= $transformation.sideEffects.squirting * 20>>
<div class="alert alert--warning">💧 You squirt uncontrollably, soaking through your clothes.</div>
<<modHygiene -25 "Squirting">>
<</if>>
<</if>>
<<if $transformation.sideEffects.strongOrgasms >= 3>>
<div class="alert alert--warning">💫 The orgasm is so powerful your knees buckle. You need a moment to recover.</div>
<<modStat "energy" -10 "Overwhelming orgasm">>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
/* ─── Check Lactation Pressure ─── */
<<widget "checkLactation">>
<<if $transformation.sideEffects.lactation > 0>>
<<set _lactHours = ($world.time - ($temp.lastExpressed || 0)) / 60>>
<<if _lactHours > (12 - $transformation.sideEffects.lactation * 2)>>
<div class="alert alert--warning">🍼 Your breasts feel heavy and full. You need to express milk soon or it's going to get uncomfortable — and visible.</div>
<</if>>
<</if>>
<</widget>>
/* ─── Arousal Drift (Internal Heat) ─── */
<<widget "arousalDrift">>
<<if $transformation.sideEffects.internalHeat > 0>>
<<set _heatGain = $transformation.sideEffects.internalHeat * 3>>
<<modStat "arousal" _heatGain "Internal heat">>
<</if>>
<<if $transformation.sideEffects.increasedSensitivity > 0>>
<<if $pc.arousal > 30>>
<<set _sensGain = $transformation.sideEffects.increasedSensitivity * 2>>
<<modStat "arousal" _sensGain "Heightened sensitivity">>
<</if>>
<</if>>
<</widget>>/* ─── Shave Legs ─── */
<<widget "shaveLegs">>
<<if $inventory.razors > 0>>
<<set $inventory.razors -= 1>>
<<set $pc.legHair = 0>>
<<set $pc.lastShaved = $world.day>>
<<set $pc.beautyGrooming = Math.min(10, $pc.beautyGrooming + 3)>>
<<run XCLC.Beauty.recalculate()>>
<<advanceTime 10>>
<<run XCLC.Toast.show('🪒 Legs shaved smooth. (-1 razor)', 'success')>>
<<else>>
<<run XCLC.Toast.show('🪒 No razors left! Buy more at the drugstore.', 'warning')>>
<</if>>
<</widget>>
/* ─── Shave Pubic ─── */
<<widget "shavePubic">>
<<if $inventory.razors > 0>>
<<set $inventory.razors -= 1>>
<<set $pc.pubicHair = 0>>
<<set $pc.beautyGrooming = Math.min(10, $pc.beautyGrooming + 2)>>
<<run XCLC.Beauty.recalculate()>>
<<advanceTime 10>>
<<run XCLC.Toast.show('🪒 Smooth down there. (-1 razor)', 'success')>>
<<else>>
<<run XCLC.Toast.show('🪒 No razors left!', 'warning')>>
<</if>>
<</widget>>
/* ─── Apply Skincare ─── */
<<widget "applySkincare">>
<<if $inventory.skincareUses > 0>>
<<set $inventory.skincareUses -= 1>>
<<set $pc.beautySkincare = Math.min(10, $pc.beautySkincare + 3)>>
<<run XCLC.Beauty.recalculate()>>
<<advanceTime 5>>
<<run XCLC.Toast.show('✨ Skincare applied. Skin glowing!', 'success')>>
<<else>>
<<run XCLC.Toast.show('🧴 Out of skincare products!', 'warning')>>
<</if>>
<</widget>>
/* ─── Apply Makeup ─── */
/* $args[0] = style: "none", "natural", "glam", "goth", "slutty" */
<<widget "applyMakeup">>
<<set _style = $args[0] || "natural">>
<<if _style === "none">>
<<set $pc.makeupStyle = "none">>
<<set $pc.makeupApplied = false>>
<<set $pc.beautyMakeup = 0>>
<<run XCLC.Beauty.recalculate()>>
<<advanceTime 5>>
<<run XCLC.Toast.show('💧 Makeup removed.', 'info')>>
<<else>>
<<set _uses = $inventory.makeupUses[_style] || 0>>
<<if _uses > 0>>
<<set $inventory.makeupUses[_style] -= 1>>
<<set $pc.makeupStyle = _style>>
<<set $pc.makeupApplied = true>>
<<switch _style>>
<<case "natural">>
<<set $pc.beautyMakeup = 5>>
<<advanceTime 10>>
<<case "glam">>
<<set $pc.beautyMakeup = 10>>
<<advanceTime 20>>
<<case "goth">>
<<set $pc.beautyMakeup = 7>>
<<advanceTime 15>>
<<case "slutty">>
<<set $pc.beautyMakeup = 12>>
<<advanceTime 20>>
<<modStat "femininity" 2 "Slutty makeup">>
<</switch>>
<<run XCLC.Beauty.recalculate()>>
<<run XCLC.Toast.show('💄 ' + _style.charAt(0).toUpperCase() + _style.slice(1) + ' makeup applied!', 'success')>>
<<else>>
<<run XCLC.Toast.show('💄 No ' + _style + ' makeup left! Buy more.', 'warning')>>
<</if>>
<</if>>
<</widget>>
/* ─── Hair Growth (called daily) ─── */
<<widget "processHairGrowth">>
<<if !$transformation.addons.noHair>>
<<set _daysSinceShave = $world.day - $pc.lastShaved>>
<<if _daysSinceShave >= 2 && $pc.legHair < 1>>
<<set $pc.legHair = 1>>
<<set $pc.beautyGrooming = Math.max(0, $pc.beautyGrooming - 2)>>
<<run XCLC.Beauty.recalculate()>>
<<elseif _daysSinceShave >= 5 && $pc.legHair < 2>>
<<set $pc.legHair = 2>>
<<set $pc.beautyGrooming = Math.max(0, $pc.beautyGrooming - 3)>>
<<run XCLC.Beauty.recalculate()>>
<</if>>
<<if _daysSinceShave >= 3 && $pc.pubicHair < 1>>
<<set $pc.pubicHair = 1>>
<<elseif _daysSinceShave >= 7 && $pc.pubicHair < 2>>
<<set $pc.pubicHair = 2>>
<</if>>
<</if>>
<</widget>>
/* ─── Hygiene Decay (called during advanceTime) ─── */
<<widget "hygieneDecay">>
<<set _activity = _args[0] || "idle">>
<<set _decay = 0>>
<<switch _activity>>
<<case "service">>
<<set _decay = -15>>
<<case "gym">>
<<set _decay = -20>>
<<case "sleep">>
<<set _decay = -5>>
<<case "period">>
<<set _decay = -5>>
<<case "gangbang">>
<<set _decay = -40>>
<<default>>
<<set _decay = -2>>
<</switch>>
<<set $hygiene.cleanliness = Math.min(100, Math.max(0, $hygiene.cleanliness + _decay))>>
<</widget>>
/* ─── Show Hygiene Warning ─── */
/* Outputs NPC reaction text if hygiene is low. Insert in encounter passages. */
<<widget "showHygieneWarning">>
<<if $hygiene.cleanliness < 30>>
<div class="alert alert--warning">🤢 You smell terrible. NPCs visibly recoil. Interaction penalties apply.</div>
<<elseif $hygiene.cleanliness < 50>>
<div class="alert alert--info">😕 "You could use a shower..." Someone wrinkles their nose.</div>
<</if>>
<</widget>>
/* ─── Hygiene Modifier for Jobs ─── */
/* Returns tip reduction multiplier based on cleanliness */
<<widget "hygieneJobModifier">>
<<if $hygiene.cleanliness < 30>>
<<set _hygieneMod = 0.5>>
<<elseif $hygiene.cleanliness < 50>>
<<set _hygieneMod = 0.8>>
<<else>>
<<set _hygieneMod = 1.0>>
<</if>>
<</widget>>
/* ─── Hygiene Status Display ─── */
<<widget "showHygieneStatus">>
<<set _clean = $hygiene.cleanliness>>
<<set _label = "Sparkling ✨">>
<<if _clean < 30>><<set _label = "Filthy 🤢">>
<<elseif _clean < 50>><<set _label = "Grubby 😕">>
<<elseif _clean < 70>><<set _label = "Okay">>
<<elseif _clean < 90>><<set _label = "Clean">>
<</if>>
<div class="stat-row">
<span class="stat-label">🚿 Hygiene</span>
<div class="stat-bar"><div class="stat-bar__fill" style="width:<<print _clean>>%"></div></div>
<span class="stat-value"><<print _label>> (<<print _clean>>%)</span>
</div>
<</widget>>/* ═══════════════════════════════════════════════════
DIALOGUE TONE SYSTEM
Text varies by player femininity level:
Low (0-33): reluctant, masculine, uncomfortable
Mid (34-66): neutral, accepting, adjusting
High (67+): enthusiastic, feminine, eager
═══════════════════════════════════════════════════ */
/* ─── General tone — 3-way text swap ─── */
/* Usage: <<tone "ugh, whatever" "it's fine I guess" "omg yay!">> */
<<widget "tone">>
<<set _low = _args[0] || "">>
<<set _mid = _args[1] || _low>>
<<set _high = _args[2] || _mid>>
<<if $pc.femininity >= 67>>
<<print _high>>
<<elseif $pc.femininity >= 34>>
<<print _mid>>
<<else>>
<<print _low>>
<</if>>
<</widget>>
/* ─── Reaction to sexual content ─── */
/* Usage: <<toneReact "disgusting" "not terrible" "amazing">> */
<<widget "toneReact">>
<<set _low = _args[0] || "">>
<<set _mid = _args[1] || _low>>
<<set _high = _args[2] || _mid>>
<<if $pc.femininity >= 67>>
<em><<print _high>></em>
<<elseif $pc.femininity >= 34>>
<em><<print _mid>></em>
<<else>>
<em><<print _low>></em>
<</if>>
<</widget>>
/* ─── Internal monologue ─── */
/* Usage: <<toneThink "I need to get through this" "maybe this isn't so bad" "I actually want this">> */
<<widget "toneThink">>
<<set _low = _args[0] || "">>
<<set _mid = _args[1] || _low>>
<<set _high = _args[2] || _mid>>
<<if $pc.femininity >= 67>>
<p class="thought"><em><<print _high>></em></p>
<<elseif $pc.femininity >= 34>>
<p class="thought"><em><<print _mid>></em></p>
<<else>>
<p class="thought"><em><<print _low>></em></p>
<</if>>
<</widget>>
/* ─── Gendered self-reference ─── */
/* Returns how the PC refers to themselves */
<<widget "toneSelf">>
<<if $pc.femininity >= 80>>
girl
<<elseif $pc.femininity >= 50>>
person
<<else>>
guy
<</if>>
<</widget>>
/* ─── Gendered exclamation ─── */
<<widget "toneExclaim">>
<<if $pc.femininity >= 67>>
<<set _exclaims = ["Omg!", "Eee!", "Oh my god!", "Like, totally!", "Yaaas!", "So cute!"]>>
<<elseif $pc.femininity >= 34>>
<<set _exclaims = ["Oh!", "Wow.", "Huh.", "Nice.", "Okay then.", "Well..."]>>
<<else>>
<<set _exclaims = ["Whatever.", "Ugh.", "Christ.", "Seriously?", "Dude.", "Fuck."]>>
<</if>>
<<print _exclaims[random(0, _exclaims.length - 1)]>>
<</widget>>/* ═══════════════════════════════════════════════════
THORNFIELD — ROLL SYSTEM WIDGETS
Adapted from Starlet with fairer mechanics
═══════════════════════════════════════════════════ */
/* ─── Service Rating Calculator ─── */
<<widget "calcServiceRating">>
/* Usage: <<calcServiceRating "success" npcGenerosity>>
Sets _serviceRating (1-5 stars) */
<<set _outcome = _args[0] || "success">>
<<set _generosity = _args[1] || 3>>
<<set _genBonus = (_generosity - 1) * 0.25>>
<<switch _outcome>>
<<case "crit_success">>
<<set _serviceRating = 5.0>>
<<case "success">>
<<set _serviceRating = Math.min(5, 4.0 + (Math.random() * 1.0) + _genBonus)>>
<<case "partial_fail">>
<<set _serviceRating = Math.min(5, 3.0 + (Math.random() * 1.0) + _genBonus)>>
<<case "crit_fail">>
/* Minimum 2 stars (rating floor) */
<<set _serviceRating = Math.max(2.0, 2.0 + (Math.random() * 1.0) + _genBonus)>>
<<default>>
<<set _serviceRating = 3.5>>
<</switch>>
<<set _serviceRating = Math.round(_serviceRating * 10) / 10>>
<</widget>>
/* ─── Apply Service Rating ─── */
<<widget "applyServiceRating">>
/* Usage: <<applyServiceRating 4.5>>
Updates $scholarship.rating with weighted average */
<<set _newRating = _args[0]>>
/* Defensive: fix NaN or missing values */
<<if typeof _newRating !== 'number' || isNaN(_newRating)>><<set _newRating = 3.5>><</if>>
<<if typeof $scholarship.rating !== 'number' || isNaN($scholarship.rating)>><<set $scholarship.rating = 5.0>><</if>>
<<if typeof $scholarship.totalRatings !== 'number' || isNaN($scholarship.totalRatings)>><<set $scholarship.totalRatings = 0>><</if>>
<<if typeof $scholarship.ratingSum !== 'number' || isNaN($scholarship.ratingSum)>><<set $scholarship.ratingSum = 0>><</if>>
<<set $scholarship.totalRatings++>>
<<set $scholarship.ratingSum += _newRating>>
/* Weighted average with recency bias */
/* Recent ratings count 2× — prevents old bad ratings from tanking forever */
<<if $scholarship.totalRatings <= 1>>
<<set $scholarship.rating = _newRating>>
<<else>>
/* Weight: 70% existing average, 30% new rating */
<<set $scholarship.rating = ($scholarship.rating * 0.7) + (_newRating * 0.3)>>
<</if>>
/* Clamp to 2.0 - 5.0 and fix any NaN */
<<if isNaN($scholarship.rating)>><<set $scholarship.rating = 5.0>><</if>>
<<set $scholarship.rating = Math.max(2.0, Math.min(5.0, $scholarship.rating))>>
<<set $scholarship.rating = Math.round($scholarship.rating * 100) / 100>>
<</widget>>
/* ─── Complete Service Encounter ─── */
<<widget "completeService">>
/* Usage: <<completeService "oral" npcObject outcome>>
Handles credits, rating, quota, XP, stats */
<<set _serviceType = _args[0] || "oral">>
<<set _npc = _args[1]>>
<<set _outcome = _args[2] || "success">>
/* Defensive: ensure all arrays and values exist FIRST */
<<if !Array.isArray($scholarship.weekLog)>><<set $scholarship.weekLog = []>><</if>>
<<if !Array.isArray($scholarship.allTimeLogs)>><<set $scholarship.allTimeLogs = []>><</if>>
<<if !Array.isArray($scholarship.weeklyHistory)>><<set $scholarship.weeklyHistory = []>><</if>>
<<if typeof $scholarship.totalServices !== 'number' || isNaN($scholarship.totalServices)>><<set $scholarship.totalServices = 0>><</if>>
<<if typeof $scholarship.currentWeekServiced !== 'number'>><<set $scholarship.currentWeekServiced = 0>><</if>>
<<if typeof $scholarship.currentWeekCredits !== 'number'>><<set $scholarship.currentWeekCredits = 0>><</if>>
<<if typeof $scholarship.totalServiced !== 'number'>><<set $scholarship.totalServiced = 0>><</if>>
<<if typeof $scholarship.totalCredits !== 'number'>><<set $scholarship.totalCredits = 0>><</if>>
/* Calculate credits */
<<set _credits = 1>>
<<if _serviceType === "anal">>
<<set _credits = 2>>
<</if>>
<<if _outcome === "crit_success">>
<<set _credits += 1>>
<<elseif _outcome === "crit_fail">>
<<set _credits = Math.max(1, Math.floor(_credits / 2))>>
<</if>>
/* Calculate rating */
<<calcServiceRating _outcome (_npc ? _npc.generosity : 3)>>
/* Apply */
<<applyServiceRating _serviceRating>>
<<set $scholarship.currentWeekServiced += 1>>
<<set $scholarship.currentWeekCredits += _credits>>
<<set $scholarship.totalServiced += 1>>
<<set $scholarship.totalCredits += _credits>>
<<set $scholarship.totalServices += 1>>
/* Mercy rule check */
<<if $scholarship.totalServices >= 5>>
<<set $scholarship.mercyActive = false>>
<</if>>
/* Log — using <<run>> with try-catch for robustness */
<<run (function(){
var sv = State.variables;
var tv = State.temporary;
if (!sv.scholarship) sv.scholarship = {};
if (!Array.isArray(sv.scholarship.weekLog)) sv.scholarship.weekLog = [];
try {
sv.scholarship.weekLog.push({
npcId: (tv.npc ? tv.npc.id : 0),
serviceType: tv.serviceType || 'unknown',
credits: tv.credits || 1,
rating: tv.serviceRating || 3.5,
day: sv.world.day,
time: sv.world.time
});
} catch(e) {
console.error('weekLog push failed:', e);
}
}())>>
/* XP for the relevant skill */
<<set _xpAmount = XCLC.Roll.calcXP(_outcome, 3)>>
<<if _serviceType === "oral">>
<<addXP "oral" _xpAmount>>
<<elseif _serviceType === "vaginal">>
<<addXP "vaginal" _xpAmount>>
<<elseif _serviceType === "anal">>
<<addXP "anal" _xpAmount>>
<</if>>
<<addXP "stamina" Math.round(_xpAmount / 2)>>
/* Stat effects */
<<if _outcome === "crit_success">>
<<modStat "mood" 15 "Amazing performance!">>
<<modStat "confidence" 10 "5-star service">>
<<elseif _outcome === "success">>
<<modStat "mood" 5 "Good service">>
<<elseif _outcome === "partial_fail">>
<<modStat "mood" -5 "Mediocre performance">>
<<elseif _outcome === "crit_fail">>
<<modStat "mood" -15 "Terrible performance">>
<<modStat "confidence" -10 "Humiliating failure">>
<</if>>
/* Energy cost */
<<modStat "energy" -15 "Service encounter">>
/* Hygiene */
<<modHygiene -15 "Service encounter">>
/* Reputation */
<<modRep "slut" 2>>
/* Femininity drift — doing service slowly increases femininity */
<<set $pc.femininity = Math.min(100, $pc.femininity + 1)>>
/* Pregnancy risk for vaginal/anal with internal */
/* (handled separately in encounter passages) */
/* NPC relationship update */
<<if _npc>>
<<set _npc.encounters++>>
<<set _npc.lastEncounter = $world.day>>
<<if _npc.encounters >= 3>>
<<set _npc.isRecurring = true>>
<</if>>
<<if _outcome === "crit_success" || _outcome === "success">>
<<set _npc.opinion = Math.min(100, _npc.opinion + 5)>>
<<set _npc.attraction = Math.min(100, _npc.attraction + 3)>>
<</if>>
<</if>>
/* Set temp results for display in passage */
<<set $temp.lastServiceCredits = _credits>>
<<set $temp.lastServiceRating = _serviceRating>>
<<set $temp.lastServiceOutcome = _outcome>>
<</widget>>
/* ─── Re-roll Token ─── */
<<widget "useReroll">>
/* Usage: <<useReroll>> — spends 20 confidence for a re-roll */
<<if $scholarship.rerollAvailable && $pc.confidence >= 20>>
<<set $pc.confidence -= 20>>
<<set $scholarship.rerollAvailable = false>>
<<set $scholarship.rerollDay = $world.day>>
<<run XCLC.Toast.show('🔄 Re-roll used! -20 Confidence', 'warning')>>
<<else>>
<<run XCLC.Toast.show('❌ Cannot re-roll (unavailable or not enough confidence)', 'error')>>
<</if>>
<</widget>><div id="xclc-app">
<!-- Top Bar -->
<div class="top-bar">
<div class="top-bar__section">
<div class="top-bar__stat">
<span class="top-bar__stat-icon">🕐</span>
<span class="top-bar__stat-value" id="topbar-time">8:00 AM</span>
</div>
<div class="top-bar__stat">
<span class="top-bar__stat-icon">📅</span>
<span class="top-bar__stat-value" id="topbar-date">Mon, Sep 1</span>
</div>
<div class="top-bar__stat">
<span class="top-bar__stat-icon">📆</span>
<span class="top-bar__stat-value" id="topbar-semester">Y1 Sem1 W1</span>
</div>
</div>
<div class="top-bar__section">
<div class="top-bar__stat">
<div class="energy-bar">
<span class="top-bar__stat-icon">⚡</span>
<div class="energy-bar__track">
<div class="energy-bar__fill high" id="topbar-energy-fill" style="width:100%"></div>
</div>
<span class="top-bar__stat-value" id="topbar-energy-val">100</span>
</div>
</div>
<div class="top-bar__stat">
<span class="top-bar__stat-icon">💰</span>
<span class="top-bar__stat-value" id="topbar-money">$0</span>
</div>
<div class="top-bar__stat">
<span class="top-bar__stat-icon">⭐</span>
<span class="top-bar__stat-value" id="topbar-rating">5.0</span>
</div>
<div class="top-bar__stat">
<span class="top-bar__stat-icon">📋</span>
<span class="top-bar__stat-value" id="topbar-quota">0/5</span>
</div>
</div>
<div class="top-bar__section">
<button class="phone-btn" id="phone-toggle" type="button">
📱 Phone
<span class="phone-badge" id="phone-badge"></span>
</button>
</div>
</div>
<!-- Left Panel (Navigation) -->
<div class="left-panel" id="left-panel">
<nav class="left-panel__nav">
<button class="nav-item" data-nav="DormRoom" type="button">🏠 Dorm</button>
<button class="nav-item" data-nav="CampusMap" type="button">🗺️ Campus</button>
<div class="nav-separator"></div>
<button class="nav-item" id="nav-skills" type="button">📋 Skills</button>
<button class="nav-item" id="nav-character" type="button">👤 Character</button>
<button class="nav-item" data-nav="WardrobeMenu" type="button">👗 Wardrobe</button>
<div class="nav-separator"></div>
<button class="nav-item" id="nav-journal" type="button">📒 Journal</button>
<button class="nav-item" id="nav-achievements" type="button">🏆 Achievements</button>
<div class="nav-separator"></div>
<button class="nav-item" id="nav-wiki" type="button">📖 Wiki</button>
<button class="nav-item" data-nav="SettingsMenu" type="button">⚙️ Settings</button>
<div class="nav-separator"></div>
<a class="nav-item nav-item--external" href="https://discord.gg/TKUP3U8rvF" target="_blank" rel="noopener">💬 Discord</a>
</nav>
</div>
<!-- Main Content -->
<main class="main-content" id="main-content">
<div id="passages"></div>
</main>
<!-- Right Panel (Stats) -->
<div class="right-panel" id="right-panel">
<div class="right-panel__section">
<div class="right-panel__title">Active Effects</div>
<div id="active-effects"></div>
</div>
<div class="right-panel__section">
<div class="right-panel__title">Quick Stats</div>
<div id="quick-stats"></div>
</div>
</div>
<!-- Phone Overlay -->
<div id="phone-overlay">
<div id="phone-screen"></div>
</div>
</div>/* Intentionally empty — custom UI replaces default sidebar *//* Runs BEFORE every passage render */
<<run XCLC.UI.updateTopBar()>>
/* Save migration — ensure new variables exist for old saves */
<<if typeof $inventory === 'undefined'>><<set $inventory = {wardrobe:[{id:"clinic_tshirt",name:"Clinic T-Shirt",type:"top",style:"vanilla",quality:"basic",sexy:0,beauty:0,price:0,description:"A plain white t-shirt.",icon:"top"},{id:"clinic_sweats",name:"Clinic Sweatpants",type:"bottom",style:"vanilla",quality:"basic",sexy:0,beauty:0,price:0,description:"Grey sweatpants.",icon:"bottom"},{id:"clinic_underwear",name:"Basic Cotton Underwear",type:"underwear",style:"vanilla",quality:"basic",sexy:0,beauty:0,price:0,description:"Plain white cotton briefs.",icon:"underwear"},{id:"clinic_bra",name:"Sports Bra",type:"bra",style:"vanilla",quality:"basic",sexy:0,beauty:0,price:0,description:"A basic sports bra.",icon:"bra"},{id:"clinic_sneakers",name:"White Sneakers",type:"shoes",style:"vanilla",quality:"basic",sexy:0,beauty:1,price:0,description:"Clean white sneakers.",icon:"shoes"}],currentOutfit:{top:"clinic_tshirt",bottom:"clinic_sweats",dress:null,bra:"clinic_bra",underwear:"clinic_underwear",shoes:"clinic_sneakers",accessories:[]},styleIdentity:"vanilla",razors:3,skincareUses:0,makeupUses:{natural:3,glam:0,goth:0,bimbo:0,slutty:0},hasLaptop:false,hasWebcam:false,hasCamera:false,hasRingLight:false,sexToys:[],condoms:0,pregnancyTests:0,onPill:false,hasIUD:false,drugs:{}}>><</if>>
<<if typeof $pc.hairStyle === 'undefined'>><<set $pc.hairStyle = "straight">><</if>>
<<if typeof $pc.pubicStyle === 'undefined'>><<set $pc.pubicStyle = "natural">><</if>>
<<if !Array.isArray($pc.piercings)>><<set $pc.piercings = []>><</if>>
<<if !Array.isArray($pc.tattoos)>><<set $pc.tattoos = []>><</if>>
<<if !Array.isArray($scholarship.weekLog)>><<set $scholarship.weekLog = []>><</if>>
<<if !Array.isArray($scholarship.allTimeLogs)>><<set $scholarship.allTimeLogs = []>><</if>>
<<if !Array.isArray($scholarship.weeklyHistory)>><<set $scholarship.weeklyHistory = []>><</if>>
<<if typeof $scholarship.totalServices !== 'number'>><<set $scholarship.totalServices = $scholarship.totalServiced || 0>><</if>>
<<if isNaN($scholarship.rating)>><<set $scholarship.rating = 5.0>><</if>>/* Runs AFTER every passage render */
<<script>>
// Wire up left-panel nav buttons
$('#left-panel [data-nav]').off('click').on('click', function() {
var passage = $(this).data('nav');
if (passage) {
Engine.play(passage);
}
});
// Skills panel toggle
$('#nav-skills').off('click').on('click', function() {
$(this).toggleClass('active');
$('#skills-panel').toggleClass('open');
});
// Character shortcut
$('#nav-character').off('click').on('click', function() {
Engine.play('CharacterSheet');
});
// Phone button
$('#phone-toggle').off('click').on('click', function() {
XCLC.Phone.toggle();
});
// Journal
$('#nav-journal').off('click').on('click', function() {
Engine.play('JournalMenu');
});
// Achievements
$('#nav-achievements').off('click').on('click', function() {
Engine.play('AchievementsMenu');
});
// Wiki
$('#nav-wiki').off('click').on('click', function() {
Engine.play('Wiki_Home');
});
// Render animated stat bars in right panel
(function() {
var sv = State.variables;
if (!sv || !sv.pc) return;
var el = document.getElementById('quick-stats');
if (!el) return;
var stats = [
{ icon: '⚡', label: 'Energy', val: sv.pc.energy, max: 100, cls: 'energy' },
{ icon: '😊', label: 'Mood', val: sv.pc.mood, max: 100, cls: 'mood' },
{ icon: '😰', label: 'Stress', val: sv.pc.stress, max: 100, cls: 'stress' },
{ icon: '💗', label: 'Arousal', val: sv.pc.arousal, max: 100, cls: 'arousal' },
{ icon: '💪', label: 'Confid.', val: sv.pc.confidence, max: 100, cls: 'confidence' },
{ icon: '🛡️', label: 'Willpwr', val: sv.pc.willpower, max: 100, cls: 'willpower' },
{ icon: '🧠', label: 'Intel.', val: sv.pc.intelligence, max: 100, cls: 'intelligence' },
{ icon: '💄', label: 'Feminin.', val: sv.pc.femininity, max: 100, cls: 'femininity' },
{ icon: '✨', label: 'Beauty', val: sv.pc.beautyTotal, max: 100, cls: 'beauty' }
];
var html = '';
for (var i = 0; i < stats.length; i++) {
var s = stats[i];
var pct = Math.min(100, Math.max(0, Math.round((s.val / s.max) * 100)));
html += '<div class="stat-bar-row">' +
'<span class="stat-bar-icon">' + s.icon + '</span>' +
'<span class="stat-bar-label">' + s.label + '</span>' +
'<div class="stat-bar-track"><div class="stat-bar-fill ' + s.cls + '" style="width:' + pct + '%;"></div></div>' +
'<span class="stat-bar-val">' + Math.round(s.val) + '</span>' +
'</div>';
}
el.innerHTML = html;
})();
// Render active side effects
(function() {
var sv = State.variables;
if (!sv || !sv.transformation) return;
var el = document.getElementById('active-effects');
if (!el) return;
var effects = sv.transformation.sideEffects;
var icons = {
memoryLoss: '🧠', randomOrgasm: '💥', sexualFluidAddiction: '💦',
bimbofication: '🎀', squirting: '💧', orgasmDenial: '🚫',
lactation: '🍼', increasedSensitivity: '⚡', submissive: '🔒',
strongOrgasms: '💫', fertility: '🤰', internalHeat: '🔥',
exhibitionist: '👀', pheromones: '🌸', oralLover: '👄',
analLover: '🍑', eroticDreams: '🌙', masturbationDenial: '✋'
};
var names = {
memoryLoss: 'Memory Loss', randomOrgasm: 'Random Orgasm',
sexualFluidAddiction: 'Fluid Addiction', bimbofication: 'Bimbofication',
squirting: 'Squirting', orgasmDenial: 'Orgasm Denial',
lactation: 'Lactation', increasedSensitivity: 'Sensitivity',
submissive: 'Submissive', strongOrgasms: 'Strong Orgasms',
fertility: 'Fertility', internalHeat: 'Internal Heat',
exhibitionist: 'Exhibitionist', pheromones: 'Pheromones',
oralLover: 'Oral Lover', analLover: 'Anal Lover',
eroticDreams: 'Erotic Dreams', masturbationDenial: 'Masturb. Denial'
};
var html = '';
var keys = Object.keys(effects);
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (effects[k] > 0) {
var dots = '';
for (var j = 0; j < 4; j++) {
dots += '<span class="effect-dot ' + (j < effects[k] ? 'active' : '') + '"></span>';
}
html += '<div class="effect-row">' +
'<span class="effect-icon">' + (icons[k] || '❓') + '</span>' +
'<span class="effect-name">' + (names[k] || k) + '</span>' +
'<span class="effect-dots">' + dots + '</span>' +
'</div>';
}
}
if (html === '') {
html = '<div class="effect-row effect-none">No active effects</div>';
}
el.innerHTML = html;
})();
// Hygiene indicator
(function() {
var sv = State.variables;
if (!sv || !sv.hygiene) return;
var c = sv.hygiene.cleanliness;
var el = document.getElementById('topbar-hygiene');
if (!el) return;
if (c >= 80) el.textContent = '🚿';
else if (c >= 60) el.textContent = '😐';
else if (c >= 40) el.textContent = '😓';
else el.textContent = '🤢';
})();
<</script>><div class="wiki">
<div class="wiki-header">
<h1>📖 Thornfield University Wiki</h1>
<p class="wiki-subtitle">Your comprehensive guide to surviving the CCUMDUP programme.</p>
</div>
<div class="wiki-search">
<input type="text" id="wiki-search" placeholder="🔍 Search wiki pages..." oninput="XCLC.Wiki.filter(this.value)">
</div>
<div class="wiki-toc" id="wiki-toc">
<<divider "🏫 Getting Started">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">📜</span><span class="wiki-card-title">Game Overview</span><span class="wiki-card-desc">What is CCUMDUP?</span></span>' "Wiki_Overview">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎨</span><span class="wiki-card-title">Character Creation</span><span class="wiki-card-desc">Building your character</span></span>' "Wiki_CharacterCreation">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">📊</span><span class="wiki-card-title">Stats & Skills</span><span class="wiki-card-desc">All stats, skills & rolls</span></span>' "Wiki_Stats">><</link>>
</div>
<<divider "🗺️ World & Locations">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">🏫</span><span class="wiki-card-title">Campus Locations</span><span class="wiki-card-desc">On-campus & off-campus</span></span>' "Wiki_Locations">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🍸</span><span class="wiki-card-title">Bar District</span><span class="wiki-card-desc">Nightlife venues</span></span>' "Wiki_BarDistrict">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🏖️</span><span class="wiki-card-title">Playa Caliente</span><span class="wiki-card-desc">Spring Break resort</span></span>' "Wiki_SpringBreak">><</link>>
</div>
<<divider "🎮 Core Systems">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎀</span><span class="wiki-card-title">Service System</span><span class="wiki-card-desc">CCUMDUP encounters</span></span>' "Wiki_Service">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">📚</span><span class="wiki-card-title">Academics</span><span class="wiki-card-desc">Classes, exams & GPA</span></span>' "Wiki_Academics">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">💼</span><span class="wiki-card-title">Jobs</span><span class="wiki-card-desc">All 9 employment paths</span></span>' "Wiki_Jobs">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎭</span><span class="wiki-card-title">Reputation</span><span class="wiki-card-desc">7 reputation axes</span></span>' "Wiki_Reputation">><</link>>
</div>
<<divider "💊 Transformation">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">⚗️</span><span class="wiki-card-title">Side Effects</span><span class="wiki-card-desc">X-Change side effects</span></span>' "Wiki_SideEffects">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">💃</span><span class="wiki-card-title">Femininity</span><span class="wiki-card-desc">Transformation progression</span></span>' "Wiki_Femininity">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">✨</span><span class="wiki-card-title">Beauty & Hygiene</span><span class="wiki-card-desc">Looking your best</span></span>' "Wiki_Beauty">><</link>>
</div>
<<divider "🔞 Advanced Content">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">🖤</span><span class="wiki-card-title">Velvet Room</span><span class="wiki-card-desc">BDSM club guide</span></span>' "Wiki_VelvetRoom">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">📱</span><span class="wiki-card-title">Blackmail</span><span class="wiki-card-desc">The blackmail arc</span></span>' "Wiki_Blackmail">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🌀</span><span class="wiki-card-title">Hypnosis</span><span class="wiki-card-desc">Dr. Crane sessions</span></span>' "Wiki_Hypnosis">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">😈</span><span class="wiki-card-title">Corruption</span><span class="wiki-card-desc">Corruption & fetish content</span></span>' "Wiki_Corruption">><</link>>
</div>
<<divider "🌍 Life Systems">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">🤰</span><span class="wiki-card-title">Pregnancy</span><span class="wiki-card-desc">Risk, progression & outcomes</span></span>' "Wiki_Pregnancy">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🍺</span><span class="wiki-card-title">Substances</span><span class="wiki-card-desc">Alcohol & drugs</span></span>' "Wiki_Substances">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">👥</span><span class="wiki-card-title">Social & Greek Life</span><span class="wiki-card-desc">Roommate, sororities</span></span>' "Wiki_Social">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">📱</span><span class="wiki-card-title">Phone</span><span class="wiki-card-desc">Apps & features</span></span>' "Wiki_Phone">><</link>>
</div>
<<divider "📅 Events & Endings">>
<div class="wiki-toc-grid">
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎃</span><span class="wiki-card-title">Seasonal Events</span><span class="wiki-card-desc">Halloween, Homecoming & more</span></span>' "Wiki_Seasonal">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎲</span><span class="wiki-card-title">Random Events</span><span class="wiki-card-desc">Daily encounters & dreams</span></span>' "Wiki_RandomEvents">><</link>>
<<link '<span class="wiki-card"><span class="wiki-card-icon">🎓</span><span class="wiki-card-title">Endings</span><span class="wiki-card-desc">All 8 endings & how to get them</span></span>' "Wiki_Endings">><</link>>
</div>
</div>
</div>
/* ═══════════════════════════════════════════════════
📜 GAME OVERVIEW
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>📜 Game Overview</h1>
<div class="wiki-section">
<h2>What is Thornfield University?</h2>
<p>A text-based RPG built in SugarCube. You play as a male college student who accepts the <strong>CCUMDUP scholarship</strong> — the <em>College Campus Unity & Morale Development Uplift Program</em>. In exchange for full tuition, housing, and a stipend, you take X-Change Petite and live as a woman for three years while performing "service encounters" for other students.</p>
</div>
<div class="wiki-section">
<h2>Core Game Loop</h2>
<div class="wiki-code">
Wake up → Routine → Classes → Free time → Service encounters → Socialise → Sleep
↓
Weekly quota check ← Day advances → Random events
</div>
<p>The game spans <strong>6 semesters</strong> (3 academic years), each ~15 in-game weeks. Your choices determine your <<link "reputation" "Wiki_Reputation">><</link>>, <<link "femininity" "Wiki_Femininity">><</link>>, relationships, and <<link "ending" "Wiki_Endings">><</link>>.</p>
</div>
<div class="wiki-section">
<h2>Key Systems</h2>
<ul>
<li><<link "🎀 CCUMDUP Service System" "Wiki_Service">><</link>> — your core obligation</li>
<li><<link "📚 Academics" "Wiki_Academics">><</link>> — classes, exams, GPA</li>
<li><<link "💼 Jobs" "Wiki_Jobs">><</link>> — 9 employment paths</li>
<li><<link "⚗️ Side Effects" "Wiki_SideEffects">><</link>> — X-Change complications</li>
<li><<link "🎭 Reputation" "Wiki_Reputation">><</link>> — 7 axes that shape how NPCs treat you</li>
<li><<link "📱 Phone" "Wiki_Phone">><</link>> — your hub for CampusHub, social media, messages</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎨 CHARACTER CREATION
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎨 Character Creation</h1>
<div class="wiki-section">
<h2>Stage 1: Motivation</h2>
<p>Why are you joining CCUMDUP? Your reason affects starting stats and dialogue:</p>
<table class="wiki-table">
<tr><th>Reason</th><th>Description</th><th>Effect</th></tr>
<tr><td>💸 Poverty</td><td>Can't afford tuition</td><td>—</td></tr>
<tr><td>🎲 Bet</td><td>Lost a frat bet</td><td>—</td></tr>
<tr><td>🔍 Curious</td><td>Genuinely wondering</td><td>+5 starting <<link "femininity" "Wiki_Femininity">><</link>></td></tr>
<tr><td>👨👩👦 Forced</td><td>Parents signed you up</td><td>+10 starting stress</td></tr>
<tr><td>🏠 Opportunist</td><td>In it for the perks</td><td>—</td></tr>
<tr><td>🌈 Identity</td><td>Already questioning gender</td><td>+15 starting <<link "femininity" "Wiki_Femininity">><</link>></td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Stage 2-3: Names</h2>
<p>Enter your <strong>male name</strong> (original identity) and <strong>female name</strong> (what everyone calls you).</p>
</div>
<div class="wiki-section">
<h2>Stage 4: Appearance (Point-Buy)</h2>
<p>Design your female body. Some choices cost points, others earn them. Points from appearance + <<link "side effects" "Wiki_SideEffects">><</link>> are spent on add-ons.</p>
<table class="wiki-table">
<tr><th>Category</th><th>Options</th><th>Notes</th></tr>
<tr><td>Race</td><td>White, Black, Asian, Latina, Mixed</td><td>Varies cost</td></tr>
<tr><td>Orientation</td><td>Hetero, Bi, Gay</td><td>Gay = +4 points</td></tr>
<tr><td>Body Type</td><td>Petite, Slender, Athletic, Curvy, Thick</td><td>Varies</td></tr>
<tr><td>Breasts</td><td>A → F cup</td><td>Larger = more cost</td></tr>
<tr><td>Butt</td><td>Small → Large</td><td>Varies</td></tr>
<tr><td>Hair</td><td>Colour, length, style</td><td>Varies</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Stage 5: Side Effects</h2>
<p>See the full <<link "⚗️ Side Effects" "Wiki_SideEffects">><</link>> page. Higher levels = more points but stronger ongoing effects.</p>
<p>💀 <strong>"Just Fuck My Shit Up"</strong> button maxes ALL side effects for maximum points.</p>
</div>
<div class="wiki-section">
<h2>Stage 6: Add-ons (Spend Points)</h2>
<table class="wiki-table">
<tr><th>Add-on</th><th>Cost</th><th>Benefit</th></tr>
<tr><td>Birth Control</td><td>3</td><td>Built-in contraception (see <<link "Pregnancy" "Wiki_Pregnancy">><</link>>)</td></tr>
<tr><td>STD Protection</td><td>2</td><td>Immune to STDs</td></tr>
<tr><td>No Gag Reflex</td><td>2</td><td>Better deep throat in <<link "services" "Wiki_Service">><</link>></td></tr>
<tr><td>Intelligence Boost</td><td>3</td><td>+2 Intelligence levels (see <<link "Academics" "Wiki_Academics">><</link>>)</td></tr>
<tr><td>Flexibility</td><td>2</td><td>+2 Flexibility levels</td></tr>
<tr><td>No Body Hair</td><td>1</td><td>Never need to shave (see <<link "Beauty" "Wiki_Beauty">><</link>>)</td></tr>
<tr><td>Metabolism Control</td><td>2</td><td>Weight stays stable</td></tr>
<tr><td>Wet</td><td>1</td><td>Always lubricated</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Stage 7: University Settings</h2>
<p><strong>Difficulty</strong>: Easy / Normal / Hard / Extreme — affects weekly <<link "service quota" "Wiki_Service">><</link>>.</p>
<p><strong>Demographics</strong>: Adjust racial distribution and male/female ratio of NPCs.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
📊 STATS & SKILLS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>📊 Stats & Skills</h1>
<div class="wiki-section">
<h2>Primary Stats (0-100)</h2>
<table class="wiki-table">
<tr><th>Stat</th><th>Start</th><th>Effect</th></tr>
<tr><td>⚡ Energy</td><td>100</td><td>Depleted by activities, restored by sleep. Below 20 = exhaustion warnings.</td></tr>
<tr><td>😊 Mood</td><td>70</td><td>Affects dialogue tone options and dream content.</td></tr>
<tr><td>😰 Stress</td><td>10</td><td>High stress = penalties, breakdown events, poor performance.</td></tr>
<tr><td>🔥 Arousal</td><td>0</td><td>Increased by <<link "side effects" "Wiki_SideEffects">><</link>>, encounters, drugs. High = embarrassment/urges.</td></tr>
<tr><td>💪 Confidence</td><td>50</td><td>Affects social checks, self-image dialogue.</td></tr>
<tr><td>🧠 Willpower</td><td>60</td><td>Resistance to submission. Reduced by <<link "hypnosis" "Wiki_Hypnosis">><</link>> and <<link "Velvet Room" "Wiki_VelvetRoom">><</link>>.</td></tr>
<tr><td>🧠 Intelligence</td><td>50</td><td><<link "Academic" "Wiki_Academics">><</link>> performance. Reduced by bimbofication SE.</td></tr>
<tr><td>💃 Femininity</td><td>10</td><td>Core transformation tracker. See <<link "Femininity" "Wiki_Femininity">><</link>>.</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Skills (Level 0-10, XP-based)</h2>
<h3>Sexual Skills</h3>
<table class="wiki-table">
<tr><th>Skill</th><th>Start</th><th>Trained By</th></tr>
<tr><td>💋 Oral</td><td>1</td><td><<link "Service" "Wiki_Service">><</link>> encounters, <<link "glory holes" "Wiki_Corruption">><</link>></td></tr>
<tr><td>🔥 Vaginal</td><td>1</td><td><<link "Service" "Wiki_Service">><</link>> encounters</td></tr>
<tr><td>🍑 Anal</td><td>0</td><td><<link "Service" "Wiki_Service">><</link>> encounters (anal type)</td></tr>
<tr><td>✋ Handjob</td><td>1</td><td><<link "Service" "Wiki_Service">><</link>> encounters</td></tr>
<tr><td>💪 Stamina</td><td>1</td><td>Gym workouts, service encounters</td></tr>
<tr><td>🤸 Flexibility</td><td>1</td><td>Gym yoga, <<link "Velvet Room" "Wiki_VelvetRoom">><</link>></td></tr>
<tr><td>🗣️ Dirty Talk</td><td>0</td><td><<link "Cam shows" "Wiki_Jobs">><</link>>, high-rep encounters</td></tr>
<tr><td>😮 Deep Throat</td><td>0</td><td>Oral encounters, <<link "glory holes" "Wiki_Corruption">><</link>></td></tr>
</table>
<h3>Academic / Social / Performance</h3>
<table class="wiki-table">
<tr><th>Skill</th><th>Start</th><th>Trained By</th></tr>
<tr><td>🧠 Intelligence</td><td>3</td><td>Classes, studying, <<link "library" "Wiki_Locations">><</link>></td></tr>
<tr><td>📚 Studying</td><td>1</td><td>Library sessions</td></tr>
<tr><td>✨ Charm</td><td>1</td><td>Social events, <<link "bar" "Wiki_BarDistrict">><</link>> interactions</td></tr>
<tr><td>🤝 Persuasion</td><td>1</td><td>Confrontations (<<link "blackmail" "Wiki_Blackmail">><</link>>)</td></tr>
<tr><td>📷 Cam Work</td><td>0</td><td><<link "Cam girl job" "Wiki_Jobs">><</link>></td></tr>
<tr><td>💃 Dance</td><td>0</td><td>Club dancing, <<link "cheerleading" "Wiki_Jobs">><</link>></td></tr>
</table>
</div>
<div class="wiki-section">
<h2>The Roll System</h2>
<p>Skill checks use a d100 against a difficulty threshold:</p>
<table class="wiki-table">
<tr><th>Outcome</th><th>Condition</th><th>Effect</th></tr>
<tr><td>🌟 Critical Success</td><td>Roll ≤ 10</td><td>Best outcome + bonus XP</td></tr>
<tr><td>✅ Success</td><td>Roll ≤ threshold</td><td>Positive outcome + XP</td></tr>
<tr><td>⚠️ Partial Fail</td><td>Roll ≤ threshold + 20</td><td>Middling outcome</td></tr>
<tr><td>❌ Fail</td><td>Roll > threshold + 20</td><td>Negative outcome</td></tr>
<tr><td>💀 Critical Fail</td><td>Roll ≥ 95</td><td>Worst outcome</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🏫 LOCATIONS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🏫 Campus Locations</h1>
<div class="wiki-section">
<h2>On Campus</h2>
<table class="wiki-table">
<tr><th>Location</th><th>Key Activities</th></tr>
<tr><td>🏠 Dorm Room</td><td>Sleep, shower, change clothes, talk to <<link "roommate" "Wiki_Social">><</link>></td></tr>
<tr><td>📚 Lecture Halls</td><td>Attend <<link "classes" "Wiki_Academics">><</link>></td></tr>
<tr><td>📖 Library</td><td>Study (3 modes), <<link "glory hole" "Wiki_Corruption">><</link>> (discoverable)</td></tr>
<tr><td>💪 Gym</td><td>Cardio, weights, yoga — boosts <<link "beauty" "Wiki_Beauty">><</link>></td></tr>
<tr><td>🍽️ Cafeteria</td><td>Eat (free), socialise</td></tr>
<tr><td>🏛️ Admin Building</td><td>Dean's office, Health Centre, <<link "Dr. Crane" "Wiki_Hypnosis">><</link>></td></tr>
<tr><td>💼 Job Board</td><td>Apply for <<link "employment" "Wiki_Jobs">><</link>></td></tr>
<tr><td>🎭 Student Center</td><td>Clubs, events</td></tr>
<tr><td>🏡 Greek Row</td><td><<link "Sorority" "Wiki_Social">><</link>> rushing, parties</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Off Campus</h2>
<table class="wiki-table">
<tr><th>Location</th><th>Travel</th><th>Activities</th></tr>
<tr><td>🛍️ Mall</td><td>30 min</td><td>Clothing, accessories, beauty products</td></tr>
<tr><td>🍸 <<link "Bar District" "Wiki_BarDistrict">><</link>></td><td>30 min</td><td>4 bars + <<link "Velvet Room" "Wiki_VelvetRoom">><</link>></td></tr>
<tr><td>🖋️ Ink & Iron</td><td>30 min</td><td>Tattoos and piercings</td></tr>
<tr><td>💇 Hair Salon</td><td>30 min</td><td>Hair changes</td></tr>
<tr><td>💊 Drugstore</td><td>20 min</td><td>Razors, skincare, pregnancy tests</td></tr>
<tr><td>🏢 Downtown</td><td>40 min</td><td>Various services</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🍸 BAR DISTRICT
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🍸 Bar District</h1>
<p>Opens in the evening. Four venues plus hidden locations.</p>
<div class="wiki-section">
<h2>Venues</h2>
<table class="wiki-table">
<tr><th>Venue</th><th>Vibe</th><th>Entry</th><th>Notable</th></tr>
<tr><td>🍺 The Rusty Nail</td><td>Dive bar</td><td>None</td><td>Drug dealer spawns (30%), <<link "glory hole" "Wiki_Corruption">><</link>> in bathroom</td></tr>
<tr><td>🍸 Velvet Lounge</td><td>Upscale cocktails</td><td><<link "Beauty" "Wiki_Beauty">><</link>> 50+ or charm roll</td><td>Sugar daddies, expensive drinks</td></tr>
<tr><td>🎵 Pulse</td><td>Dance club</td><td>Open</td><td>Dancing, <<link "drugs" "Wiki_Substances">><</link>>, hookups</td></tr>
<tr><td>💋 Candy Bar</td><td>Strip club</td><td>Open</td><td><<link "Stripper job" "Wiki_Jobs">><</link>> location</td></tr>
<tr><td>🖤 <<link "The Velvet Room" "Wiki_VelvetRoom">><</link>></td><td>BDSM club</td><td>Hidden</td><td>Unlocks at slut rep ≥30 or submissive SE ≥2</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Drinks</h2>
<p>See <<link "🍺 Substances" "Wiki_Substances">><</link>> for full alcohol mechanics.</p>
<table class="wiki-table">
<tr><th>Drink</th><th>Price</th><th>Location</th></tr>
<tr><td>Beer</td><td>$4</td><td>Rusty Nail</td></tr>
<tr><td>Shot</td><td>$5</td><td>Rusty Nail</td></tr>
<tr><td>Cocktail</td><td>$12</td><td>Velvet Lounge</td></tr>
<tr><td>Wine</td><td>$8</td><td>Velvet Lounge</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎀 SERVICE SYSTEM
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎀 Service System</h1>
<div class="wiki-section">
<h2>How It Works</h2>
<ol>
<li><strong>CampusHub</strong> generates requests throughout the day</li>
<li>You have <strong>30 minutes</strong> to accept before expiry</li>
<li>Meet the NPC → skill-checked encounter → rating (1-5 ⭐)</li>
<li>Meet your <strong>weekly quota</strong> or face probation</li>
</ol>
</div>
<div class="wiki-section">
<h2>Service Credits</h2>
<table class="wiki-table">
<tr><th>Service Type</th><th>Credits</th><th>Skills Used</th></tr>
<tr><td>Oral</td><td>1</td><td>Oral, Deep Throat</td></tr>
<tr><td>Vaginal</td><td>1</td><td>Vaginal, Stamina</td></tr>
<tr><td>Anal</td><td>2</td><td>Anal, Stamina</td></tr>
<tr><td>Internal Completion</td><td>+1 bonus</td><td><<link "Pregnancy risk!" "Wiki_Pregnancy">><</link>></td></tr>
<tr><td>Handjob</td><td>0.5</td><td>Handjob</td></tr>
<tr><td>Group</td><td>2-3</td><td>Multiple</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Rating System</h2>
<table class="wiki-table">
<tr><th>Average</th><th>Effect</th></tr>
<tr><td>5.0</td><td>Premium housing, bonus perks</td></tr>
<tr><td>4.0-4.9</td><td>Normal standing</td></tr>
<tr><td>3.0-3.9</td><td>Probation warning</td></tr>
<tr><td>< 3.0</td><td>Scholarship review → <<link "expulsion" "Wiki_Endings">><</link>></td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Tips</h2>
<ul>
<li>Higher <<link "sexual skills" "Wiki_Stats">><</link>> = better ratings</li>
<li><<link "Side effects" "Wiki_SideEffects">><</link>> like Random Orgasm can boost OR hurt your rating</li>
<li>Finals Week doubles your quota to 10</li>
<li><<link "Glory holes" "Wiki_Corruption">><</link>> give 0.5 credits (anonymous)</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
📚 ACADEMICS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>📚 Academics</h1>
<div class="wiki-section">
<h2>Classes</h2>
<ul>
<li>Choose <strong>3 classes</strong> per semester</li>
<li>Each has a professor with personality traits</li>
<li>Attending lectures = Intelligence XP</li>
<li>Skipping = attendance penalty → GPA hit</li>
</ul>
</div>
<div class="wiki-section">
<h2>Finals Week</h2>
<ul>
<li>Occurs at weeks 14-15 each semester</li>
<li><<link "Service quota" "Wiki_Service">><</link>> <strong>DOUBLES</strong> (to 10)</li>
<li>Exams use Intelligence + Studying skill checks</li>
<li>Study at the <<link "Library" "Wiki_Locations">><</link>> to prepare</li>
</ul>
</div>
<div class="wiki-section">
<h2>GPA & Probation</h2>
<p>Low GPA + low <<link "service rating" "Wiki_Service">><</link>> = <<link "expulsion" "Wiki_Endings">><</link>> risk. The bimbofication <<link "side effect" "Wiki_SideEffects">><</link>> reduces intelligence, making exams harder.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
💼 JOBS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>💼 Jobs & Employment</h1>
<div class="wiki-section">
<h2>Campus Jobs</h2>
<table class="wiki-table">
<tr><th>Job</th><th>Pay</th><th>Requirements</th></tr>
<tr><td>☕ Barista</td><td>$12/hr + tips</td><td>Job Board</td></tr>
<tr><td>📚 Tutor</td><td>$20/session</td><td>Intelligence ≥ 4</td></tr>
<tr><td>📣 Cheerleader</td><td>Perks only</td><td>Flexibility check</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Off-Campus Jobs</h2>
<table class="wiki-table">
<tr><th>Job</th><th>Pay</th><th>Requirements</th></tr>
<tr><td>🍸 Bartender</td><td>$15/hr + tips</td><td>Job Board</td></tr>
<tr><td>💃 Stripper</td><td>$50-200/shift tips</td><td><<link "Beauty" "Wiki_Beauty">><</link>> ≥ 50</td></tr>
<tr><td>📷 Cam Girl</td><td>Token-based</td><td>Laptop + webcam</td></tr>
<tr><td>🔞 FansOnly</td><td>Subscriber revenue</td><td>Create account</td></tr>
<tr><td>🤫 Hooker</td><td>$50-200/client</td><td><<link "Rep" "Wiki_Reputation">><</link>> or bar contact</td></tr>
<tr><td>💊 Drug Dealer</td><td>Variable</td><td>Meet supplier at <<link "Rusty Nail" "Wiki_BarDistrict">><</link>></td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Progression</h2>
<p>Most jobs have <strong>tier systems</strong> (0-3) with better pay, special options, and unlock conditions at higher tiers.</p>
<p>Having 2+ active jobs contributes to the <<link "Professional ending" "Wiki_Endings">><</link>>.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎭 REPUTATION
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎭 Reputation</h1>
<div class="wiki-section">
<h2>7 Reputation Axes</h2>
<table class="wiki-table">
<tr><th>Reputation</th><th>Start</th><th>How It Grows</th><th>Milestones</th></tr>
<tr><td>🔥 Slut</td><td>0</td><td><<link "Services" "Wiki_Service">><</link>>, public sex, <<link "glory holes" "Wiki_Corruption">><</link>>, thirst traps</td><td>40: catcalls · 60: propositions · 80: free-use</td></tr>
<tr><td>🎉 Party Girl</td><td>0</td><td><<link "Bar" "Wiki_BarDistrict">><</link>> visits, parties, drunk events</td><td>60: invites · 80: legend</td></tr>
<tr><td>📚 Good Student</td><td>50</td><td><<link "Classes" "Wiki_Academics">><</link>>, studying, good grades</td><td>60: study groups · professor praise</td></tr>
<tr><td>📷 Cam Girl</td><td>0</td><td><<link "Cam shows" "Wiki_Jobs">><</link>>, FansOnly posts</td><td>60: campus recognition · 80: internet fame</td></tr>
<tr><td>💕 Sweetheart</td><td>30</td><td>Kind actions, helping others</td><td>—</td></tr>
<tr><td>💀 Troublemaker</td><td>0</td><td><<link "Drug dealing" "Wiki_Jobs">><</link>>, arrests, rule-breaking</td><td>80: <<link "expulsion" "Wiki_Endings">><</link>> risk</td></tr>
<tr><td>⭐ Popular</td><td>20</td><td>Social events, InstaGlam</td><td>40: fans · 80: celebrity</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Reputation & Endings</h2>
<p>Your dominant reputation at graduation determines your <<link "ending" "Wiki_Endings">><</link>>:</p>
<ul>
<li>📚 Good Student ≥ 60 → Scholar ending</li>
<li>⭐ Popular ≥ 60 or 📷 Cam Girl ≥ 60 → Celebrity ending</li>
<li>🔥 Slut ≥ 80 + 💀 Troublemaker ≥ 40 → Underground ending</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
⚗️ SIDE EFFECTS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>⚗️ Side Effects</h1>
<p>Chosen during <<link "character creation" "Wiki_CharacterCreation">><</link>>. Each has 4 levels — higher = more points but stronger ongoing effects.</p>
<div class="wiki-section">
<h2>All Side Effects</h2>
<table class="wiki-table">
<tr><th>Side Effect</th><th>Levels</th><th>Effect</th></tr>
<tr><td>🧠 Memory Loss</td><td>0-4</td><td>Gradually forget male memories</td></tr>
<tr><td>💥 Random Orgasm</td><td>0-4</td><td>Spontaneous public orgasms (2%-20% per period)</td></tr>
<tr><td>💦 Fluid Addiction</td><td>0-4</td><td>Crave semen, withdrawal symptoms</td></tr>
<tr><td>🎀 Bimbofication</td><td>0-4</td><td>Intelligence drain, giggly speech (hurts <<link "academics" "Wiki_Academics">><</link>>)</td></tr>
<tr><td>💧 Squirting</td><td>0-4</td><td>Squirt during arousal peaks</td></tr>
<tr><td>🚫 Orgasm Denial</td><td>0-4</td><td>Harder to reach orgasm</td></tr>
<tr><td>🍼 Lactation</td><td>0-4</td><td>Breasts produce milk, visible stains</td></tr>
<tr><td>⚡ Sensitivity</td><td>0-4</td><td>Everything feels more intense</td></tr>
<tr><td>🔒 Submissive</td><td>0-4</td><td>Natural submission (unlocks <<link "Velvet Room" "Wiki_VelvetRoom">><</link>> early)</td></tr>
<tr><td>💫 Strong Orgasms</td><td>0-4</td><td>Devastating, disabling orgasms</td></tr>
<tr><td>🤰 Fertility</td><td>0-4</td><td>Higher <<link "pregnancy" "Wiki_Pregnancy">><</link>> risk</td></tr>
<tr><td>🔥 Internal Heat</td><td>0-4</td><td>Constant low-level arousal (+5-20/period)</td></tr>
<tr><td>👀 Exhibitionist</td><td>0-4</td><td>Aroused by exposure</td></tr>
<tr><td>🌸 Pheromones</td><td>0-4</td><td>NPCs more attracted to you</td></tr>
<tr><td>👄 Oral Lover</td><td>0-4</td><td>Enjoy giving oral more</td></tr>
<tr><td>🍑 Anal Lover</td><td>0-4</td><td>Enjoy anal more</td></tr>
<tr><td>🌙 Erotic Dreams</td><td>0-4</td><td>Vivid sexual <<link "dreams" "Wiki_RandomEvents">><</link>></td></tr>
<tr><td>✋ Masturb. Denial</td><td>0-4</td><td>Can't satisfy yourself</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
💃 FEMININITY
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>💃 Femininity</h1>
<div class="wiki-section">
<h2>Progression Tiers</h2>
<table class="wiki-table">
<tr><th>Tier</th><th>Range</th><th>Themes</th></tr>
<tr><td>💀 Resistance</td><td>0-25</td><td>Dysphoria, fighting the change, nightmares</td></tr>
<tr><td>😕 Confusion</td><td>26-50</td><td>Mixed feelings, automatic feminine gestures, guilt</td></tr>
<tr><td>💕 Acceptance</td><td>51-75</td><td>Beauty routines feel natural, enjoying attention</td></tr>
<tr><td>🌸 Embrace</td><td>76-100</td><td>Full identity shift, self-acceptance, can't remember being male</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>What Increases Femininity</h2>
<ul>
<li><<link "Side effect" "Wiki_SideEffects">><</link>> processing (each period change)</li>
<li><<link "Random events" "Wiki_RandomEvents">><</link>> (gendered language, reflections)</li>
<li><<link "Dream" "Wiki_RandomEvents">><</link>> content</li>
<li>Social acceptance, being called feminine names</li>
<li><<link "Service" "Wiki_Service">><</link>> encounters, romantic/sexual experiences</li>
<li><<link "Hypnosis" "Wiki_Hypnosis">><</link>> conditioning</li>
</ul>
</div>
<div class="wiki-section">
<h2>Impact on Endings</h2>
<p>Femininity ≥ 80 + mood ≥ 50 unlocks the <strong>Embraced</strong> <<link "ending" "Wiki_Endings">><</link>> — choosing permanent transformation.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
✨ BEAUTY & HYGIENE
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>✨ Beauty & Hygiene</h1>
<div class="wiki-section">
<h2>Beauty Score (Composite)</h2>
<table class="wiki-table">
<tr><th>Component</th><th>Source</th><th>Max</th></tr>
<tr><td>Base</td><td><<link "Character creation" "Wiki_CharacterCreation">><</link>></td><td>~60</td></tr>
<tr><td>Grooming</td><td>Shaving (legs + pubic)</td><td>~14</td></tr>
<tr><td>Makeup</td><td>Applied style</td><td>0-15</td></tr>
<tr><td>Clothing</td><td>Outfit quality + sexiness</td><td>Variable</td></tr>
<tr><td>Skincare</td><td>Skincare products</td><td>~10</td></tr>
<tr><td>Fitness</td><td>Gym visits</td><td>~15</td></tr>
</table>
<p>Beauty affects: <<link "Velvet Lounge" "Wiki_BarDistrict">><</link>> entry, NPC attraction, <<link "InstaGlam" "Wiki_Phone">><</link>> followers, <<link "job" "Wiki_Jobs">><</link>> performance.</p>
</div>
<div class="wiki-section">
<h2>Hygiene (0-100)</h2>
<ul>
<li>Decays -5/day, -3/period</li>
<li>Restored by showering (+100)</li>
<li>Below 40: NPCs comment, beauty penalty</li>
<li>Body writing washes off at 90+</li>
</ul>
</div>
<div class="wiki-section">
<h2>Grooming</h2>
<ul>
<li><strong>Leg hair</strong>: Grows every 2+ days (0=smooth, 2=hairy)</li>
<li><strong>Pubic hair</strong>: Grows every 4+ days (multiple styles)</li>
<li><strong>Razors</strong>: Consumable — buy more at drugstore</li>
<li>"No Body Hair" <<link "add-on" "Wiki_CharacterCreation">><</link>> eliminates shaving</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🖤 VELVET ROOM
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🖤 The Velvet Room</h1>
<p>A hidden BDSM club in the <<link "Bar District" "Wiki_BarDistrict">><</link>>.</p>
<div class="wiki-section">
<h2>Discovery</h2>
<p>Appears as "🚪 An unmarked door..." when:</p>
<ul>
<li><<link "Slut reputation" "Wiki_Reputation">><</link>> ≥ 30, <strong>OR</strong></li>
<li>Submissive <<link "side effect" "Wiki_SideEffects">><</link>> ≥ 2</li>
</ul>
</div>
<div class="wiki-section">
<h2>Membership</h2>
<table class="wiki-table">
<tr><th>Tier</th><th>Cost</th><th>Access</th></tr>
<tr><td>Visitor</td><td>Free (first time)</td><td>Watch only</td></tr>
<tr><td>Regular</td><td>$100 or earn via demo</td><td>All standard activities</td></tr>
<tr><td>VIP</td><td>10+ sessions</td><td>Private suite, specials</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Activities</h2>
<table class="wiki-table">
<tr><th>Activity</th><th>Unlocks At</th><th>Effect</th></tr>
<tr><td>🧎 Sub Training</td><td>Immediate</td><td>4 depth levels, +composure, pays $50</td></tr>
<tr><td>🪢 Bondage</td><td>Immediate</td><td>Flexibility check, mood boost</td></tr>
<tr><td>🐾 Pet Play</td><td>3 sessions</td><td>Collar/ears, stress reduction, willpower loss</td></tr>
<tr><td>👋 Impact Play</td><td>5 sessions</td><td>Stamina check, endorphin rush</td></tr>
<tr><td>🕯️ Sensation Play</td><td>7 sessions</td><td>Blindfolded, amplified by Sensitivity SE</td></tr>
</table>
<p>All activities increase <<link "corruption" "Wiki_Corruption">><</link>> score.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
📱 BLACKMAIL
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>📱 Blackmail Arc</h1>
<div class="wiki-section">
<h2>Trigger Conditions (checked weekly)</h2>
<ul>
<li><<link "FansOnly" "Wiki_Jobs">><</link>> active + <<link "popular rep" "Wiki_Reputation">><</link>> ≥ 40 (10% chance)</li>
<li><<link "Cam girl" "Wiki_Jobs">><</link>> active + viewers ≥ 200 (8% chance)</li>
<li><<link "Spring break" "Wiki_SpringBreak">><</link>> photos ≥ 3 (5% chance)</li>
</ul>
</div>
<div class="wiki-section">
<h2>Stages</h2>
<ol>
<li><strong>Stage 1:</strong> Anonymous message with compromising photo. Demands $500.</li>
<li><strong>Stage 2:</strong> Demands escalate to a physical meeting behind the gym.</li>
<li><strong>Stage 3:</strong> Total control — dictates clothing, behaviour, daily compliance.</li>
</ol>
</div>
<div class="wiki-section">
<h2>Resolution Paths</h2>
<table class="wiki-table">
<tr><th>Path</th><th>How</th><th>Outcome</th></tr>
<tr><td>⚡ Confront</td><td>Find 3 clues via investigation, then face them</td><td>+15 confidence, achievement</td></tr>
<tr><td>🏛️ Report</td><td>Go to Dean Harrison</td><td>Investigation, some exposure</td></tr>
<tr><td>💪 Refuse</td><td>Call their bluff</td><td>Content leaks, campus moves on</td></tr>
<tr><td>😰 Comply</td><td>Do what they say</td><td>Ongoing degradation loop</td></tr>
<tr><td>🤷 Ignore</td><td>Don't respond</td><td>Escalation, eventual partial leak</td></tr>
</table>
<p>Investigation uses <<link "Intelligence" "Wiki_Stats">><</link>> checks. Confrontation uses <<link "Persuasion" "Wiki_Stats">><</link>>.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🌀 HYPNOSIS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🌀 Hypnosis — Dr. Crane</h1>
<p>Found via the notice board at the <<link "Health Centre" "Wiki_Locations">><</link>>.</p>
<div class="wiki-section">
<h2>Phases</h2>
<table class="wiki-table">
<tr><th>Phase</th><th>Sessions</th><th>What Happens</th></tr>
<tr><td>1. Relaxation</td><td>1-2</td><td>Legitimate stress reduction. Builds trust.</td></tr>
<tr><td>2. Deeper Trance</td><td>3-5</td><td>Phrases planted: <<link "femininity" "Wiki_Femininity">><</link>> acceptance, obedience seeds</td></tr>
<tr><td>3. Conditioning</td><td>6-8</td><td>Triggers implanted: "bloom" (pleasure), "good girl" (compliance), "kneel"</td></tr>
<tr><td>4. Deep</td><td>9+</td><td>Complete trance, instant pleasure/compliance on trigger</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Player Awareness</h2>
<ul>
<li><<link "Intelligence" "Wiki_Stats">><</link>> check each session (difficulty increases)</li>
<li>Critical success → realise you're being conditioned</li>
<li><strong>End conditioning</strong>: Remove all triggers, +10 willpower</li>
<li><strong>Consent to continue</strong>: +10 <<link "corruption" "Wiki_Corruption">><</link>>, deeper conditioning</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
😈 CORRUPTION
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>😈 Corruption, Glory Holes & Body Writing</h1>
<div class="wiki-section">
<h2>Corruption System (0-100)</h2>
<table class="wiki-table">
<tr><th>Tier</th><th>Range</th><th>Effects</th></tr>
<tr><td>😇 Innocent</td><td>0-19</td><td>Default state</td></tr>
<tr><td>😏 Tempted</td><td>20-39</td><td>Dialogue shifts, new options</td></tr>
<tr><td>😈 Compromised</td><td>40-59</td><td>Dream changes, NPC behaviour shifts</td></tr>
<tr><td>💀 Corrupted</td><td>60-79</td><td>Deep submission, altered self-image</td></tr>
<tr><td>🖤 Fallen</td><td>80-100</td><td>Unlocks <<link "corruption ending" "Wiki_Endings">><</link>></td></tr>
</table>
<p><strong>Sources:</strong> <<link "BDSM" "Wiki_VelvetRoom">><</link>> (2-5), glory holes (3-4), <<link "blackmail" "Wiki_Blackmail">><</link>> compliance (5-10), <<link "hypnosis" "Wiki_Hypnosis">><</link>> (5-8), public use events (3-5)</p>
</div>
<div class="wiki-section">
<h2>🚻 Glory Holes</h2>
<h3>Library</h3>
<ul>
<li><strong>Discovery:</strong> Random chance in <<link "library" "Wiki_Locations">><</link>> bathroom (week ≥ 3)</li>
<li><strong>Schedule:</strong> Tuesdays & Thursdays, 9pm only</li>
<li><strong>Options:</strong> Participate (oral XP + 0.5 <<link "service credits" "Wiki_Service">><</link>>) or watch</li>
</ul>
<h3>Bar (Rusty Nail)</h3>
<ul>
<li><strong>Discovery:</strong> Drunk level ≥ 2 with <<link "slut rep" "Wiki_Reputation">><</link>> ≥ 20</li>
<li><strong>Schedule:</strong> Always available evenings</li>
<li><strong>Options:</strong> Participate (oral/deepthroat XP, sometimes tipped $20)</li>
</ul>
</div>
<div class="wiki-section">
<h2>✍️ Body Writing</h2>
<ul>
<li>Marks applied during some <<link "service" "Wiki_Service">><</link>> encounters and <<link "BDSM" "Wiki_VelvetRoom">><</link>> sessions</li>
<li>Visible until showering (<<link "cleanliness" "Wiki_Beauty">><</link>> ≥ 90)</li>
<li>+3 corruption and +2 <<link "slut rep" "Wiki_Reputation">><</link>> per application</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🤰 PREGNANCY
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🤰 Pregnancy</h1>
<div class="wiki-section">
<h2>Risk Factors</h2>
<ul>
<li>Internal completion during <<link "service" "Wiki_Service">><</link>> encounters</li>
<li>Fertility <<link "side effect" "Wiki_SideEffects">><</link>> level increases chance</li>
<li>Birth Control <<link "add-on" "Wiki_CharacterCreation">><</link>> or on the pill = reduced risk</li>
<li>Condoms = reduced risk (buy at drugstore)</li>
</ul>
</div>
<div class="wiki-section">
<h2>Progression</h2>
<ol>
<li>Risk flag set after unprotected encounter</li>
<li>Symptoms appear after ~1 week</li>
<li>Confirm via pregnancy test (Health Centre or drugstore)</li>
<li>Decision: <strong>Keep</strong>, <strong>Abort</strong> ($200), or <strong>Adopt</strong></li>
<li>If kept: 9-month progression with physical changes</li>
</ol>
</div>
<div class="wiki-section">
<h2>Genetics</h2>
<p>Baby appearance influenced by both parents' race/traits — depends on your <<link "character creation" "Wiki_CharacterCreation">><</link>> race and the father's procedurally generated race.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🍺 SUBSTANCES
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🍺 Substances</h1>
<div class="wiki-section">
<h2>Alcohol</h2>
<table class="wiki-table">
<tr><th>Level</th><th>State</th><th>Effects</th></tr>
<tr><td>0</td><td>Sober</td><td>—</td></tr>
<tr><td>1</td><td>Tipsy</td><td>+5 mood, -5 composure</td></tr>
<tr><td>2</td><td>Drunk</td><td>+10 arousal, -15 composure</td></tr>
<tr><td>3</td><td>Wasted</td><td>Stumbling, <<link "glory hole" "Wiki_Corruption">><</link>> discovery possible</td></tr>
<tr><td>4+</td><td>Blackout</td><td>Skip to morning, no memory</td></tr>
</table>
<p>Drinks available at <<link "Bar District" "Wiki_BarDistrict">><</link>> venues.</p>
</div>
<div class="wiki-section">
<h2>Drugs</h2>
<table class="wiki-table">
<tr><th>Drug</th><th>Effect</th><th>Risk</th><th>Source</th></tr>
<tr><td>🌿 Weed</td><td>+mood, -stress</td><td>Tolerance</td><td><<link "Dealer" "Wiki_Jobs">><</link>> or buy</td></tr>
<tr><td>💊 Ecstasy</td><td>Euphoria, heightened sensation</td><td>Comedown, tolerance</td><td><<link "Clubs" "Wiki_BarDistrict">><</link>></td></tr>
<tr><td>❄️ Cocaine</td><td>Energy, confidence</td><td>Addiction!</td><td><<link "Rusty Nail" "Wiki_BarDistrict">><</link>> dealer</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
👥 SOCIAL & GREEK LIFE
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>👥 Social & Greek Life</h1>
<div class="wiki-section">
<h2>Roommate</h2>
<p>Procedurally generated in Hamilton Hall. Two key meters:</p>
<ul>
<li><strong>Opinion (0-100):</strong> Small talk, weekend hangouts, sharing clothes</li>
<li><strong>Trust (0-100):</strong> Confiding secrets, spending quality time</li>
</ul>
<p>High trust → becomes confidant. Walking in on you → awareness increases.</p>
</div>
<div class="wiki-section">
<h2>Sorority / Greek Life</h2>
<ol>
<li>Attend Rush Week mixer (<<link "Freshman Week" "Wiki_Seasonal">><</link>>)</li>
<li>Choose a sorority to pledge</li>
<li>Survive <strong>Hazing Week</strong> (escalating challenges)</li>
<li>Full membership → sisterhood events, frat party access</li>
</ol>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
📱 PHONE
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>📱 Phone</h1>
<p>Access via 📱 Phone on the campus map or top bar.</p>
<div class="wiki-section">
<h2>Apps</h2>
<table class="wiki-table">
<tr><th>App</th><th>Function</th></tr>
<tr><td>🟣 CampusHub</td><td><<link "Service" "Wiki_Service">><</link>> quota tracking, active requests</td></tr>
<tr><td>📸 InstaGlam</td><td>Post selfies for followers and <<link "popularity" "Wiki_Reputation">><</link>></td></tr>
<tr><td>🐦 Chirpr</td><td>Procedural campus gossip (reacts to your <<link "reputation" "Wiki_Reputation">><</link>>)</td></tr>
<tr><td>📅 Calendar</td><td><<link "Seasonal events" "Wiki_Seasonal">><</link>>, finals, job schedules</td></tr>
<tr><td>👥 Contacts</td><td>NPC directory: roommate, sorority, <<link "Dr. Crane" "Wiki_Hypnosis">><</link>></td></tr>
<tr><td>💬 Messages</td><td>Inbox — used by <<link "blackmail" "Wiki_Blackmail">><</link>>, roommate, dean</td></tr>
<tr><td>🗺️ Maps</td><td>Quick travel to any <<link "campus location" "Wiki_Locations">><</link>></td></tr>
<tr><td>⚙️ Settings</td><td>Save/load (5 slots), export, game stats</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎃 SEASONAL EVENTS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎃 Seasonal Events</h1>
<div class="wiki-section">
<h2>Fall Semester</h2>
<table class="wiki-table">
<tr><th>Week</th><th>Event</th><th>Content</th></tr>
<tr><td>1</td><td>🎉 Freshman Week</td><td>Mixer, meeting people, first parties</td></tr>
<tr><td>5</td><td>🏟️ Homecoming</td><td>Game, dance, after-party, Homecoming Queen vote</td></tr>
<tr><td>8</td><td>🎃 Halloween</td><td>Costume party, themed encounters</td></tr>
<tr><td>12</td><td>🦃 Thanksgiving</td><td>Stay on campus event</td></tr>
<tr><td>14</td><td>📝 Finals</td><td>Double <<link "service quota" "Wiki_Service">><</link>>, <<link "exams" "Wiki_Academics">><</link>></td></tr>
<tr><td>15</td><td>❄️ Winter Formal</td><td>Dance, date options, hotel room</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Spring Semester</h2>
<table class="wiki-table">
<tr><th>Week</th><th>Event</th><th>Content</th></tr>
<tr><td>6</td><td>💘 Valentine's</td><td>Mixer, romantic encounters</td></tr>
<tr><td>12</td><td>🏖️ <<link "Spring Break" "Wiki_SpringBreak">><</link>></td><td>Playa Caliente resort</td></tr>
<tr><td>14</td><td>📝 Finals</td><td>Double quota, exams</td></tr>
<tr><td>16</td><td>🎓 End of Year</td><td>Year-end or <<link "graduation" "Wiki_Endings">><</link>></td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🏖️ SPRING BREAK
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🏖️ Playa Caliente — Spring Break</h1>
<div class="wiki-section">
<h2>Locations</h2>
<table class="wiki-table">
<tr><th>Location</th><th>Activities</th></tr>
<tr><td>🏖️ Beach</td><td>Tanning, volleyball, drinking games</td></tr>
<tr><td>🏊 Pool</td><td>Body shots, chicken fights, dancing</td></tr>
<tr><td>🏨 Hotel</td><td>Sleep, change, recover</td></tr>
<tr><td>🍹 Bar</td><td><<link "Drinks" "Wiki_Substances">><</link>>, flirting, hookups</td></tr>
<tr><td>🌊 Hidden Cove</td><td>Skinny dipping, threesome encounters</td></tr>
<tr><td>🎤 Club</td><td>Dancing, VIP access</td></tr>
<tr><td>💆 Spa</td><td>Relaxation, "special" massage</td></tr>
<tr><td>🏆 Contests</td><td>Wet T-shirt, bikini, Spring Break Queen</td></tr>
<tr><td>🎰 VIP Area</td><td>Sugar daddy encounters</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Spring Break Queen</h2>
<p>Multi-day competition: enter contests → accumulate points → crowned SBQ. Boosts <<link "popularity" "Wiki_Reputation">><</link>> and unlocks achievement.</p>
<p>Photos from spring break (≥3) can trigger the <<link "blackmail arc" "Wiki_Blackmail">><</link>>.</p>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎲 RANDOM EVENTS & DREAMS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎲 Random Events & Dreams</h1>
<div class="wiki-section">
<h2>Random Events</h2>
<p>Fire during period changes (8% base chance). 6 categories:</p>
<table class="wiki-table">
<tr><th>Category</th><th>Gate</th><th>Examples</th></tr>
<tr><td>🚶 Campus</td><td>Always</td><td>Catcalls, selfie requests, secret admirers</td></tr>
<tr><td>📱 Phone</td><td>Always</td><td>Quota reminders, roommate texts, spam</td></tr>
<tr><td>🎭 Reputation</td><td><<link "Rep" "Wiki_Reputation">><</link>>-gated</td><td>Whispers, study invites, propositions</td></tr>
<tr><td>😳 Transformation</td><td>Always</td><td>Body awareness, name shifts, attraction</td></tr>
<tr><td>🔞 Sexual</td><td>Slut ≥ 30</td><td>Groping, bathroom notes (scales with rep)</td></tr>
<tr><td>🌧️ Ambient</td><td>Always</td><td>Rain, campus cat, sunset, power outage</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Dreams</h2>
<p>Fire during sleep (30% base + 15% per Erotic Dreams <<link "SE" "Wiki_SideEffects">><</link>> level). 20 unique dreams across 4 <<link "femininity" "Wiki_Femininity">><</link>> tiers:</p>
<table class="wiki-table">
<tr><th>Tier</th><th>Femininity</th><th>Themes</th></tr>
<tr><td>💀 Resistance</td><td>0-25</td><td>Nightmares, dysphoria, body horror</td></tr>
<tr><td>😕 Confusion</td><td>26-50</td><td>Mixed feelings, guilt, enjoyment</td></tr>
<tr><td>💕 Acceptance</td><td>51-75</td><td>Erotic dreams, lingerie, romance</td></tr>
<tr><td>🌸 Embrace</td><td>76-100</td><td>Vivid sex dreams, domestic fantasies</td></tr>
</table>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
🎓 ENDINGS
═══════════════════════════════════════════════════ */<div class="wiki">
<<include "Wiki_Breadcrumb">>
<h1>🎓 Endings</h1>
<div class="wiki-section">
<h2>Graduation Epilogues (Semester 6+)</h2>
<table class="wiki-table">
<tr><th>Ending</th><th>Conditions</th><th>Summary</th></tr>
<tr><td>📚 The Scholar</td><td><<link "Good Student" "Wiki_Reputation">><</link>> ≥ 60, Intelligence ≥ 60</td><td>Graduate school, quiet life</td></tr>
<tr><td>💃 Embraced</td><td><<link "Femininity" "Wiki_Femininity">><</link>> ≥ 80, Mood ≥ 50</td><td>Permanent transformation</td></tr>
<tr><td>⭐ Celebrity</td><td><<link "Popular" "Wiki_Reputation">><</link>> ≥ 60 or Cam Girl ≥ 60</td><td>Influencer/performer career</td></tr>
<tr><td>💼 Professional</td><td>2+ <<link "jobs" "Wiki_Jobs">><</link>>, Intel ≥ 50, GoodStudent ≥ 40</td><td>Corporate career</td></tr>
<tr><td>😈 Underground</td><td>Slut ≥ 80, Troublemaker ≥ 40</td><td>Criminal connections</td></tr>
<tr><td>🏠 Moving On</td><td>Default (no dominant path)</td><td>Normal life, haunted by memories</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Non-Graduation Endings</h2>
<table class="wiki-table">
<tr><th>Ending</th><th>Trigger</th><th>Notes</th></tr>
<tr><td>🚫 Expelled</td><td><<link "Service" "Wiki_Service">><</link>> probation + continued failure</td><td>Can appeal (charm crit success)</td></tr>
<tr><td>🏃 Dropout</td><td>Voluntary — visit Dean's office</td><td>Forfeit scholarship</td></tr>
</table>
</div>
<div class="wiki-section">
<h2>Tips</h2>
<ul>
<li>Each ending has <<link "femininity" "Wiki_Femininity">><</link>>-reactive variations</li>
<li>High femininity characters get more wistful/accepting epilogues</li>
<li>The ending stats screen shows your complete 3-year history</li>
</ul>
</div>
<<include "Wiki_Footer">>
</div>
/* ═══════════════════════════════════════════════════
SHARED WIDGETS: Breadcrumb & Footer
═══════════════════════════════════════════════════ */<div class="wiki-breadcrumb">
<<link "📖 Wiki Home" "Wiki_Home">><</link>> › <span class="wiki-breadcrumb-current"><<print passage()>></span>
</div><div class="wiki-footer">
<div class="wiki-footer-nav">
<<link '<span class="choice-btn wiki-back-btn">📖 Back to Wiki Home</span>' "Wiki_Home">><</link>>
<<link '<span class="choice-btn wiki-back-btn">🗺️ Back to Game</span>' "CampusMap">><</link>>
</div>
</div>