/* Full game reset — wipes everything, age gate will show again */
<<script>>
Engine.restart();
<</script>>/* Boot screen — shows title + menu. Age gate only fires if not yet verified. */
<<if !$ageVerified>><<goto "Age_Gate">><</if>>
<div class="cust-container" style="padding-top:60px;text-align:center">
<div style="font-size:36px;font-weight:700;color:var(--cyan);text-shadow:0 0 20px rgba(0,229,255,0.4);letter-spacing:4px;margin-bottom:8px">ECHOLINK</div>
<div style="font-size:13px;color:var(--text-dim);margin-bottom:40px">Update 1 — "The Signal"</div>
<div class="passage-image" data-scene="EchoLink title screen — purple frequency waves, dark background"><img src="img/title.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="EchoLink"></div>
<div class="nav-spacer"></div>
<<if $gameStarted>>
/* User has an active game — offer to continue it */
<<link "▶ Continue Game">>
<<goto "Loc_YourRoom_Morning">>
<</link>>
<<link "🔄 Restart (Back to Customization)">>
<<script>>
if(confirm('Start over from character creation? Your current progress will be lost unless saved.')){
Engine.play('Game_Reset');
}
<</script>>
<</link>>
<<else>>
[[▶ New Game|Cust_Page1]]
<</if>>
[[📂 Load Save|Boot_LoadScreen]]
[[📖 How to Play|Tutorial_Hub]]
</div>/* ── Meta ── */
<<set $gameVersion to 1>>
<<set $chapter to 1>>
<<set $ch2_card_seen to false>>
<<set $ageVerified to false>>
<<set $ageVerifyDate to "">>
<<set $gameStarted to false>>
<<set $usedCheats to false>>
<<set $trueInfluenceEnabled to false>>
<<set $newGamePlus to 0>>
<<set $playthroughCount to 0>>
<<set $debugMode to false>>
/* ── Player ── */
<<set $playerName to "">>
<<set $playerGender to "">>
<<set $playerHairColor to "Jet Black">>
<<set $playerHairColorHex to "#1a1a1a">>
<<set $playerHairstyle to "Short Crop">>
<<set $playerSkinTone to "#c68642">>
<<set $playerSkinToneName to "Medium">>
<<set $playerPersonality to "Analyst">>
<<set $startingScenario to "College">>
<<set $difficulty to "Normal">>
<<set $appVoice to "Seductive">>
<<set $appPersonality to "Helpful">>
/* ── Core Stats ── */
<<set $influence to 50>>
<<set $money to 100>>
<<set $risk to 0>>
<<set $stress to 0>>
<<set $reputation to 30>>
<<set $networkStrength to 0>>
<<set $activeNodes to 0>>
/* ── Time System ── */
<<set $dayCount to 1>>
<<set $timeSlot to "Morning">>
<<set $timeSlotIndex to 0>>
<<set $actionsUsedToday to 0>>
<<set $maxActionsPerDay to 4>>
/* ── Influence Cost Base ── */
<<set $influenceCost to 20>>
<<set $t1_name to "">>
<<set $t1_fullName to "">>
<<set $t1_unlocked to false>>
<<set $t1_aware to false>>
<<set $t1_nodeActive to false>>
<<set $t1_corruption to 0>>
<<set $t1_lust to 0>>
<<set $t1_obedience to 0>>
<<set $t1_trust to 45>>
<<set $t1_publicExposure to 0>>
<<set $t1_echoDepth to 0>>
<<set $t1_corruptionLevel to 0>>
<<set $t1_suspicion to false>>
<<set $t1_loopCount to 0>>
<<set $t1_lastLoop to 0>>
<<set $t1_resistance to 20>>
<<set $t1_location to "Dorm Hallway">>
<<set $t1_introduced to false>>
<<set $t1_levelUpReady to false>>
<<set $t1_lv1_seen to false>>
<<set $t1_lv2_seen to false>>
<<set $t1_lv3_seen to false>>
<<set $t1_lv4_seen to false>>
<<set $t1_lv5_seen to false>>
<<set $t2_name to "">>
<<set $t2_fullName to "">>
<<set $t2_unlocked to false>>
<<set $t2_aware to false>>
<<set $t2_nodeActive to false>>
<<set $t2_corruption to 0>>
<<set $t2_lust to 0>>
<<set $t2_obedience to 0>>
<<set $t2_trust to 30>>
<<set $t2_publicExposure to 0>>
<<set $t2_echoDepth to 0>>
<<set $t2_corruptionLevel to 0>>
<<set $t2_suspicion to false>>
<<set $t2_loopCount to 0>>
<<set $t2_lastLoop to 0>>
<<set $t2_resistance to 40>>
<<set $t2_location to "Gym">>
<<set $t2_introduced to false>>
<<set $t2_levelUpReady to false>>
<<set $t2_lv1_seen to false>>
<<set $t2_lv2_seen to false>>
<<set $t2_lv3_seen to false>>
<<set $t2_lv4_seen to false>>
<<set $t2_lv5_seen to false>>
<<set $t3_name to "">>
<<set $t3_fullName to "">>
<<set $t3_unlocked to false>>
<<set $t3_aware to false>>
<<set $t3_nodeActive to false>>
<<set $t3_corruption to 0>>
<<set $t3_lust to 0>>
<<set $t3_obedience to 0>>
<<set $t3_trust to 20>>
<<set $t3_publicExposure to 0>>
<<set $t3_echoDepth to 0>>
<<set $t3_corruptionLevel to 0>>
<<set $t3_suspicion to false>>
<<set $t3_loopCount to 0>>
<<set $t3_lastLoop to 0>>
<<set $t3_resistance to 65>>
<<set $t3_location to "Lecture Hall">>
<<set $t3_introduced to false>>
<<set $t3_levelUpReady to false>>
<<set $t3_lv1_seen to false>>
<<set $t3_lv2_seen to false>>
<<set $t3_lv3_seen to false>>
<<set $influenceTutorialSeen to false>>
<<set $__tutReturn to "Loc_Hub">>
/* Tier 1 */
<<set $upg_signalBoost to false>>
<<set $upg_softEcho to false>>
<<set $upg_riskShield to false>>
<<set $upg_memoryWipe to 0>>
/* Tier 2 */
<<set $upg_deepLink to false>>
<<set $upg_echoPulse to false>>
<<set $upg_ghostMode to false>>
<<set $upg_loyaltyLock to false>>
<<set $upg_suggestionPlant to false>>
/* Tier 3 */
<<set $upg_networkSync to false>>
<<set $upg_cascadeTrigger to false>>
<<set $upg_emotionalMirror to false>>
<<set $upg_paranoiaSuppressor to false>>
<<set $upg_deepPersona to false>>
/* Tier 4 */
<<set $upg_overclock to false>>
<<set $upg_silentBroadcast to false>>
<<set $upg_permanentLink to false>>
<<set $upg_override to 0>>
<<set $upg_echoVirus to false>>
<<set $tier1Unlocked to false>>
<<set $tier2Unlocked to false>>
<<set $tier3Unlocked to false>>
<<set $tier4Unlocked to false>>
<<set $tier5Unlocked to false>>
<<set $tierValidVersion to 1>>
<<set $contentExplicit to true>>
<<set $contentNTR to true>>
<<set $contentPregnancy to true>>
<<set $contentExposure to true>>
<<set $theme to "darkpurple">>
<<set $accentColor to "#9b59f5">>
<<set $secondaryColor to "#00e5ff">>
<<set $fontSize to "medium">>
<<set $fontFamily to "system">>
<<set $showStatNumbers to true>>
<<set $sceneSkip to true>>
<<set $loopSpeed to "normal">>
<<set $passiveSpread to true>>
<<set $autoSaveFreq to "passage">>
<<set $musicVolume to 70>>
<<set $sfxVolume to 70>>
<<set $ambientSounds to true>>
<<set $vfxEnabled to true>>
<<set $vfxIntensity to 50>>
<<set $resultVfxEnabled to true>>
<<set $relNumbersVisible to true>>
<<set $dlc1_unlocked to false>>
<<set $usedOfflineCodes to []>>
<<set $ach_firstAttempt to false>>
<<set $ach_firstNode to false>>
<<set $ach_networkOf3 to false>>
<<set $ach_day7 to false>>
<<set $ach_day14 to false>>
<<set $ach_day21 to false>>
<<set $ach_level3 to false>>
<<set $ach_level5 to false>>
<<set $ach_allT1Upgrades to false>>
<<set $ach_firstGymVisit to false>>
<<set $ach_gymVisits to 0>>
<<set $ach_cafeShifts to 0>>
<<set $ach_totalConversations to 0>>
<<set $ach_t1Conversations to 0>>
<<set $ach_t2Conversations to 0>>
<<set $ach_t3Conversations to 0>>
<<set $ach_moneyEarned to 0>>
<<set $ach_moneySpent to 0>>
<<set $ach_riskPeaked to 0>>
<<set $sessionStart to Date.now()>>
<<set $passageCount to 0>>
<<set $patreonPromptShown to false>>
<<set $endingReached to "">>
<<set $notifications to []>>
<<set $statDeltas to []>>
<<set $gossipActive to false>>
<<set $chainLoopActive to false>>
/* ── Scene Tracking (level-up blocked until all scenes played) ── */
<<set $t2_lv1_scenes to {active:false, a:false, b:false, c:false}>>
<<set $bodyStatusUnlocked to false>>
<<set $currentOutfit to "default">>
/* ── U2 Location Unlocks (default locked, migration/chapter gate opens them) ── */
<<set $loc_library_unlocked to false>>
<<set $loc_rooftop_unlocked to false>>
<<set $loc_t1room_unlocked to false>>
<<set $loc_t2room_unlocked to false>>
<<set $loc_t3room_unlocked to false>>
/* ── U2 Ending Availability ── */
<<set $ending4Available to false>>
<<set $sidebarOpen to false>>
<<set $overlayActive to "">>
<<set $phoneAppOpen to false>>
<<set $savePageNum to 1>>/* Empty — we use custom top bar *//* Custom sidebar replaces default menu *//* ═══ FLOATING ADMIN PANEL ═══ */
#admin-fab{position:fixed;bottom:20px;right:20px;width:48px;height:48px;border-radius:50%;
background:var(--red);color:#fff;font-size:22px;display:flex;align-items:center;justify-content:center;
cursor:pointer;z-index:99999;box-shadow:0 4px 16px rgba(239,83,80,0.5);border:2px solid rgba(255,255,255,0.2);
transition:transform 0.2s,bottom 0.3s;-webkit-tap-highlight-color:transparent;user-select:none;}
#admin-fab:active{transform:scale(0.9);}
#admin-fab.open{background:var(--purple);box-shadow:0 4px 16px rgba(155,89,245,0.5);bottom:calc(55vh + 8px);}
#admin-fab.open.mini{bottom:calc(44px + 8px);}
#admin-fab.open.maxi{bottom:calc(100vh - 60px);}
#admin-panel{position:fixed;left:0;right:0;bottom:0;height:55vh;z-index:99998;
display:none;
background:var(--bg-primary);border-top:2px solid var(--purple);
border-radius:16px 16px 0 0;
overflow:hidden;
box-shadow:0 -8px 32px rgba(0,0,0,0.6);
transition:height 0.3s ease;}
#admin-panel.open{display:block;}
#admin-panel.mini{height:44px;}
#admin-panel.maxi{height:100vh;border-radius:0;}
#admin-panel .ap-body{overflow-y:auto;-webkit-overflow-scrolling:touch;
height:calc(100% - 44px);padding:0 10px 20px 10px;}
#admin-panel.mini .ap-body{display:none;}
#admin-panel .ap-header{display:flex;justify-content:space-between;align-items:center;
height:44px;padding:0 12px;
background:var(--bg-primary);z-index:2;border-bottom:1px solid var(--border-default);flex-shrink:0;}
#admin-panel .ap-title{color:var(--cyan);font-size:14px;font-weight:700;letter-spacing:2px;}
#admin-panel .ap-sub{color:var(--red);font-size:9px;letter-spacing:1px;}
#admin-panel .ap-hdr-left{display:flex;align-items:center;gap:8px;}
#admin-panel .ap-size-btn{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;
justify-content:center;font-size:14px;cursor:pointer;border:1px solid var(--border-default);
background:var(--bg-card);color:var(--text-primary);-webkit-tap-highlight-color:transparent;
user-select:none;transition:background 0.2s;}
#admin-panel .ap-size-btn:active{background:var(--purple);}
#admin-panel .ap-size-btns{display:flex;gap:4px;}
/* Accordion sections */
.ap-section{background:var(--bg-elevated);border-radius:var(--radius-md);margin-bottom:8px;overflow:hidden;}
.ap-section-head{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;
cursor:pointer;-webkit-tap-highlight-color:transparent;user-select:none;}
.ap-section-head .ap-arrow{color:var(--text-dim);font-size:12px;transition:transform 0.2s;}
.ap-section.open .ap-arrow{transform:rotate(90deg);}
.ap-section-body{display:none;padding:0 12px 12px;}
.ap-section.open .ap-section-body{display:block;}
/* Admin slider rows */
.ap-slider-row{margin-bottom:6px;}
.ap-slider-row .ap-label{font-size:10px;color:var(--text-dim);display:flex;justify-content:space-between;margin-bottom:1px;}
.ap-slider-row input[type=range]{width:100%;height:20px;-webkit-appearance:none;background:transparent;margin:0;}
.ap-slider-row input[type=range]::-webkit-slider-runnable-track{height:4px;background:var(--bg-card);border-radius:2px;}
.ap-slider-row input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;
background:var(--cyan);border-radius:50%;margin-top:-6px;border:none;}
/* Toggle grid inside admin */
.ap-toggle-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;}
.ap-toggle-row{display:flex;justify-content:space-between;align-items:center;padding:3px 0;}
.ap-toggle-row .toggle-label{font-size:10px;}
/* Admin buttons */
.ap-btn{background:var(--bg-card);color:var(--text-primary);border:1px solid var(--border-default);
border-radius:var(--radius-sm);padding:6px 10px;font-size:11px;text-align:center;cursor:pointer;
-webkit-tap-highlight-color:transparent;user-select:none;}
.ap-btn:active{opacity:0.7;}
.ap-btn-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;}
.ap-btn-row{display:flex;gap:4px;}
/* Corruption level buttons */
.ap-clvl-row{display:flex;gap:3px;}
.ap-clvl-btn{flex:1;text-align:center;padding:4px 0;font-size:11px;border-radius:var(--radius-sm);
background:var(--bg-card);color:var(--text-dim);cursor:pointer;border:1px solid var(--border-default);}
.ap-clvl-btn.active{background:var(--red);color:#fff;border-color:var(--red);}
/* Time buttons */
.ap-time-grid{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:3px;}
.ap-time-btn{text-align:center;padding:6px 0;font-size:10px;border-radius:var(--radius-sm);
background:var(--bg-card);color:var(--text-dim);cursor:pointer;border:1px solid var(--border-default);}
.ap-time-btn.active{background:var(--gold);color:#000;border-color:var(--gold);}
/* Select dropdowns */
.ap-select{width:100%;background:var(--bg-card);color:var(--text-primary);border:1px solid var(--purple);
border-radius:var(--radius-sm);padding:8px;font-size:11px;margin-bottom:6px;}
/* Inspector */
.ap-inspector{font-size:9px;line-height:1.7;color:var(--text-dim);font-family:monospace;word-break:break-all;}
/* VFX styles handled inline by echovfx macro — no stylesheet CSS needed *//* Network Tracker overlay content — called via <<include>> */
<<widget "networkTracker">>
<div class="overlay-title">NETWORK TRACKER</div>
<div class="network-filters">
<span class="filter-tab active">All</span>
<span class="filter-tab">Active Nodes</span>
<span class="filter-tab">Aware</span>
<span class="filter-tab">Locked</span>
</div>
/* ── Target 1 Card ── */
<<if $t1_unlocked>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div>
<div class="npc-name"><<= $t1_name>></div>
<div class="small text-dim"><<if $playerGender is "Male">>Studious classmate<<else>>Studious classmate<</if>></div>
</div>
<<if $t1_nodeActive>>
<span class="npc-status node">NODE ●</span>
<<elseif $t1_aware>>
<span class="npc-status aware">AWARE</span>
<<else>>
<span class="npc-status locked">NEW</span>
<</if>>
</div>
<<if $t1_nodeActive>>
<div class="small mb-8">Influence Level <<= $t1_corruptionLevel>></div>
<<if $showStatNumbers>>
<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:<<= $t1_trust>>%"></div></div><span class="npc-stat-val"><<= $t1_trust>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Lust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill lust" style="width:<<= $t1_lust>>%"></div></div><span class="npc-stat-val"><<= $t1_lust>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Obedience</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill obedience" style="width:<<= $t1_obedience>>%"></div></div><span class="npc-stat-val"><<= $t1_obedience>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Corruption</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill corruption" style="width:<<= $t1_corruption>>%"></div></div><span class="npc-stat-val"><<= $t1_corruption>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Exposure</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill exposure" style="width:<<= $t1_publicExposure>>%"></div></div><span class="npc-stat-val"><<= $t1_publicExposure>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Echo Depth</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill echo" style="width:<<= $t1_echoDepth>>%"></div></div><span class="npc-stat-val"><<= Math.round($t1_echoDepth)>></span></div>
<</if>>
<<else>>
<div class="small text-dim">Not yet influenced</div>
<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:<<= $t1_trust>>%"></div></div><span class="npc-stat-val"><<= $t1_trust>></span></div>
<</if>>
</div>
<<else>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait">?</div>
<div><div class="npc-name">??? — Signal not detected</div></div>
<span class="npc-status locked">LOCKED</span>
</div>
<div class="small text-dim">Requires progression in Dorm Hallway</div>
</div>
<</if>>
/* ── Target 2 Card ── */
<<if $t2_unlocked>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div>
<div class="npc-name"><<= $t2_name>></div>
<div class="small text-dim">Gym trainer</div>
</div>
<<if $t2_nodeActive>>
<span class="npc-status node">NODE ●</span>
<<elseif $t2_aware>>
<span class="npc-status aware">AWARE</span>
<<else>>
<span class="npc-status locked">NEW</span>
<</if>>
</div>
<<if $showStatNumbers>>
<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:<<= $t2_trust>>%"></div></div><span class="npc-stat-val"><<= $t2_trust>></span></div>
<<if $t2_nodeActive>>
<div class="npc-stat-row"><span class="npc-stat-label">Lust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill lust" style="width:<<= $t2_lust>>%"></div></div><span class="npc-stat-val"><<= $t2_lust>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Corruption</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill corruption" style="width:<<= $t2_corruption>>%"></div></div><span class="npc-stat-val"><<= $t2_corruption>></span></div>
<div class="npc-stat-row"><span class="npc-stat-label">Echo Depth</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill echo" style="width:<<= $t2_echoDepth>>%"></div></div><span class="npc-stat-val"><<= Math.round($t2_echoDepth)>></span></div>
<</if>>
<</if>>
</div>
<<else>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait">?</div>
<div><div class="npc-name">??? — Signal not detected</div></div>
<span class="npc-status locked">LOCKED</span>
</div>
<div class="small text-dim">Visit the Gym to detect signal</div>
</div>
<</if>>
/* ── Target 3 Card ── */
<<if $t3_unlocked>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait">🎓</div>
<div>
<div class="npc-name"><<= $t3_name>></div>
<div class="small text-dim">Professor</div>
</div>
<<if $t3_nodeActive>>
<span class="npc-status node">NODE ●</span>
<<elseif $t3_aware>>
<span class="npc-status aware">AWARE</span>
<<else>>
<span class="npc-status locked">NEW</span>
<</if>>
</div>
<<if $showStatNumbers>>
<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:<<= $t3_trust>>%"></div></div><span class="npc-stat-val"><<= $t3_trust>></span></div>
<</if>>
</div>
<<else>>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait">?</div>
<div><div class="npc-name">??? — Signal not detected</div></div>
<span class="npc-status locked">LOCKED</span>
</div>
<div class="small text-dim">Attend lectures to detect signal</div>
</div>
<</if>>
<</widget>><<widget "phoneApp">>
<div class="phone-frame">
<div class="phone-statusbar">
<span><<= new Date().toLocaleTimeString([], {hour:'2-digit',minute:'2-digit'})>></span>
<span>📶 ██▌ 🔋 87%</span>
</div>
<div class="phone-appheader">📡 EchoLink</div>
<div class="phone-body">
<div class="phone-chat-bubble">
<div class="phone-chat-sender">EchoLink AI</div>
<<if $appPersonality is "Helpful">>
<<if $activeNodes is 0>>
Welcome to EchoLink, <<= $playerName>>. Your signal is weak but growing. Find someone receptive and establish your first connection.
<<elseif $activeNodes is 1>>
Good work. Your first node is active. The network is forming. Keep building trust with new targets.
<<elseif $activeNodes >= 2>>
The network strengthens. <<= $activeNodes>> nodes active. Echo depth increasing. You're doing well.
<</if>>
<<elseif $appPersonality is "Teasing">>
<<if $activeNodes is 0>>
Still alone? Pathetic signal you've got there, <<= $playerName>>. Go make a friend... or whatever you'd call it.
<<else>>
<<= $activeNodes>> little puppets dancing. Not bad. But I've seen better networks built by literal toddlers.
<</if>>
<<elseif $appPersonality is "Manipulative">>
<<if $activeNodes is 0>>
Trust the process, <<= $playerName>>. The first connection is always the hardest. After that... it gets easier. Much easier.
<<else>>
You're a natural. <<= $activeNodes>> nodes and counting. Don't you feel it? The control? It suits you.
<</if>>
<<elseif $appPersonality is "Slowly Dominant">>
<<if $dayCount < 5>>
I'm here to help, <<= $playerName>>. Together we'll build something beautiful.
<<elseif $dayCount < 14>>
You need me more than you realize. Keep the network growing. Don't ask why.
<<else>>
You belong to the network now, <<= $playerName>>. Just like the rest of them. The only difference? You think you're in control.
<</if>>
<</if>>
</div>
<div class="mt-16" style="font-size:12px;">
<div style="color:var(--purple);font-weight:600;margin-bottom:8px;">ACTIVE NODES</div>
<<if $t1_nodeActive>>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)">
<span><<= $t1_name>></span>
<span style="color:var(--green)">● Lv<<= $t1_corruptionLevel>></span>
</div>
<</if>>
<<if $t2_nodeActive>>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)">
<span><<= $t2_name>></span>
<span style="color:var(--green)">● Lv<<= $t2_corruptionLevel>></span>
</div>
<</if>>
<<if $t3_nodeActive>>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)">
<span><<= $t3_name>></span>
<span style="color:var(--green)">● Lv<<= $t3_corruptionLevel>></span>
</div>
<</if>>
<<if $activeNodes is 0>>
<div style="color:var(--text-dim);padding:12px 0;text-align:center">No active nodes yet</div>
<</if>>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">INFLUENCE METER</div>
<div class="stat-bar" style="height:8px"><div class="stat-bar-fill" style="width:<<= $influence>>%"></div></div>
<div style="text-align:center;margin-top:4px;color:var(--cyan)"><<= $influence>> / 100</div>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">NETWORK STRENGTH</div>
<div style="text-align:center;font-size:28px;font-weight:700;color:var(--cyan)"><<= $networkStrength>></div>
</div>
</div>
</div>
<</widget>><div class="cust-container">
<div class="cust-progress"><span class="cust-dot active"></span><span class="cust-dot"></span><span class="cust-dot"></span><span class="cust-dot"></span></div>
<div class="passage-image" data-scene="Character creation — dark holographic interface"><img src="img/cust_page1.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Create"></div>
<h2 class="text-center text-cyan mb-16" style="font-size:20px;letter-spacing:2px;">CREATE YOUR IDENTITY</h2>
<div class="cust-section"><div class="cust-label">Your Name</div>
<input class="cust-input" id="nameInput" type="text" placeholder="Enter name..." maxlength="20" @value="$playerName">
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:8px">
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Alex</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Jordan</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Riley</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Morgan</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Kai</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Avery</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Ethan</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Mia</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Leo</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Sage</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Dante</div>
<div class="hair-btn" onclick="document.getElementById('nameInput').value=this.textContent;document.getElementById('nameInput').dispatchEvent(new Event('change'));" style="font-size:11px;padding:4px 10px">Zara</div>
</div></div>
<div class="cust-section"><div class="cust-label">Gender</div>
<div class="gender-row">
<div class="gender-btn <<if $playerGender is 'Male'>>selected<</if>>" data-setvar="playerGender" data-setval="Male" data-group="gender">Male</div>
<div class="gender-btn <<if $playerGender is 'Female'>>selected<</if>>" data-setvar="playerGender" data-setval="Female" data-group="gender">Female</div>
</div></div>
<div class="cust-section"><div class="cust-label">Hair Color</div>
<div class="color-row">
<div class="color-circle <<if $playerHairColor is 'Jet Black'>>selected<</if>>" style="background:#1a1a1a" data-setvar="playerHairColor" data-setval="Jet Black" data-group="hairclr"></div>
<div class="color-circle <<if $playerHairColor is 'Dark Brown'>>selected<</if>>" style="background:#3d1f00" data-setvar="playerHairColor" data-setval="Dark Brown" data-group="hairclr"></div>
<div class="color-circle <<if $playerHairColor is 'Auburn Red'>>selected<</if>>" style="background:#8b2500" data-setvar="playerHairColor" data-setval="Auburn Red" data-group="hairclr"></div>
<div class="color-circle <<if $playerHairColor is 'Dirty Blonde'>>selected<</if>>" style="background:#c8a85a" data-setvar="playerHairColor" data-setval="Dirty Blonde" data-group="hairclr"></div>
<div class="color-circle <<if $playerHairColor is 'Platinum'>>selected<</if>>" style="background:#f0e6c8" data-setvar="playerHairColor" data-setval="Platinum" data-group="hairclr"></div>
<div class="color-circle <<if $playerHairColor is 'Silver White'>>selected<</if>>" style="background:#d0d0d0" data-setvar="playerHairColor" data-setval="Silver White" data-group="hairclr"></div>
</div></div>
<div class="cust-section"><div class="cust-label">Hairstyle</div>
<div class="hair-grid">
<div class="hair-btn <<if $playerHairstyle is 'Buzz Cut'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Buzz Cut" data-group="hairsty">Buzz Cut</div>
<div class="hair-btn <<if $playerHairstyle is 'Short Crop'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Short Crop" data-group="hairsty">Short Crop</div>
<div class="hair-btn <<if $playerHairstyle is 'Side Part'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Side Part" data-group="hairsty">Side Part</div>
<div class="hair-btn <<if $playerHairstyle is 'Messy Spikes'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Messy Spikes" data-group="hairsty">Messy Spikes</div>
<div class="hair-btn <<if $playerHairstyle is 'Undercut'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Undercut" data-group="hairsty">Undercut</div>
<div class="hair-btn <<if $playerHairstyle is 'Medium Waves'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Medium Waves" data-group="hairsty">Medium Waves</div>
<div class="hair-btn <<if $playerHairstyle is 'Slicked Back'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Slicked Back" data-group="hairsty">Slicked Back</div>
<div class="hair-btn <<if $playerHairstyle is 'Curtains'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Curtains" data-group="hairsty">Curtains</div>
<div class="hair-btn <<if $playerHairstyle is 'Long Straight'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Long Straight" data-group="hairsty">Long Straight</div>
<div class="hair-btn <<if $playerHairstyle is 'Long Wavy'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Long Wavy" data-group="hairsty">Long Wavy</div>
<div class="hair-btn <<if $playerHairstyle is 'Bun'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Bun" data-group="hairsty">Bun</div>
<div class="hair-btn <<if $playerHairstyle is 'Ponytail'>>selected<</if>>" data-setvar="playerHairstyle" data-setval="Ponytail" data-group="hairsty">Ponytail</div>
</div></div>
<div class="cust-section"><div class="cust-label">Skin Tone</div>
<div class="color-row">
<div class="color-circle <<if $playerSkinToneName is 'Pale'>>selected<</if>>" style="background:#f5e6d8" data-setvar="playerSkinToneName" data-setval="Pale" data-group="skin"></div>
<div class="color-circle <<if $playerSkinToneName is 'Light'>>selected<</if>>" style="background:#e8c9a0" data-setvar="playerSkinToneName" data-setval="Light" data-group="skin"></div>
<div class="color-circle <<if $playerSkinToneName is 'Medium'>>selected<</if>>" style="background:#c68642" data-setvar="playerSkinToneName" data-setval="Medium" data-group="skin"></div>
<div class="color-circle <<if $playerSkinToneName is 'Olive'>>selected<</if>>" style="background:#8d6e4a" data-setvar="playerSkinToneName" data-setval="Olive" data-group="skin"></div>
<div class="color-circle <<if $playerSkinToneName is 'Brown'>>selected<</if>>" style="background:#6b3d1e" data-setvar="playerSkinToneName" data-setval="Brown" data-group="skin"></div>
<div class="color-circle <<if $playerSkinToneName is 'Deep'>>selected<</if>>" style="background:#2d1810" data-setvar="playerSkinToneName" data-setval="Deep" data-group="skin"></div>
</div></div>
<div class="cust-section"><div class="cust-label">Starting Personality</div>
<div class="personality-grid">
<div class="personality-card <<if $playerPersonality is 'Analyst'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Analyst" data-group="pers"><div class="p-name">Analyst</div><div class="p-tag">+Trust gain</div><div class="p-desc">Read people before you reach them. Slower start, deeper hooks.</div></div>
<div class="personality-card <<if $playerPersonality is 'Manipulator'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Manipulator" data-group="pers"><div class="p-name">Manipulator</div><div class="p-tag">+Influence success</div><div class="p-desc">Every word is a lever. Higher success rate on influence attempts.</div></div>
<div class="personality-card <<if $playerPersonality is 'Ghost'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Ghost" data-group="pers"><div class="p-name">Ghost</div><div class="p-tag">-Risk on failure</div><div class="p-desc">Invisible footprint. Failed attempts cost half the usual risk.</div></div>
<div class="personality-card <<if $playerPersonality is 'Experimenter'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Experimenter" data-group="pers"><div class="p-name">Experimenter</div><div class="p-tag">Random bonuses</div><div class="p-desc">Chaos variable. Random stat boosts each day — could be anything.</div></div>
<div class="personality-card <<if $playerPersonality is 'Charmer'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Charmer" data-group="pers"><div class="p-name">Charmer</div><div class="p-tag">+Reputation</div><div class="p-desc">People like you before you even try. Social actions yield more.</div></div>
<div class="personality-card <<if $playerPersonality is 'Stoic'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Stoic" data-group="pers"><div class="p-name">Stoic</div><div class="p-tag">-Stress</div><div class="p-desc">Nothing rattles you. Stress builds slower, recovers faster.</div></div>
<div class="personality-card <<if $playerPersonality is 'Dominant'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Dominant" data-group="pers"><div class="p-name">Dominant</div><div class="p-tag">+Obedience</div><div class="p-desc">You don't ask. Targets comply faster once the signal takes hold.</div></div>
<div class="personality-card <<if $playerPersonality is 'Submissive'>>selected<</if>>" data-setvar="playerPersonality" data-setval="Submissive" data-group="pers"><div class="p-name">Submissive</div><div class="p-tag">+Lust gain</div><div class="p-desc">Vulnerability is your weapon. Targets lower their guard around you.</div></div>
</div></div>
<div class="cust-nav">
<<link '<div class="cust-btn cust-btn-next">Continue →</div>'>><<set $playerName to document.getElementById("nameInput").value.trim()>><<if $playerName is "">><<set $playerName to "Player">><</if>><<if $playerGender is "">><<run EchoUI.notify('Please select a gender','#ef5350')>><<else>><<goto "Cust_Page2">><</if>><</link>>
</div>
</div><div class="cust-container">
<div class="cust-progress"><span class="cust-dot done"></span><span class="cust-dot active"></span><span class="cust-dot"></span><span class="cust-dot"></span></div>
<div class="passage-image" data-scene="Map overview — campus layout"><img src="img/cust_page2.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scenario"></div>
<h2 class="text-center text-cyan mb-16" style="font-size:20px;letter-spacing:2px;">CHOOSE YOUR WORLD</h2>
<div style="background:var(--bg-elevated);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px 12px;margin-bottom:12px;text-align:center">
<span class="small text-dim">⚠ Only College Campus is fully playable in Update 1. Other scenarios coming in future updates.</span>
</div>
<div class="cust-section"><div class="cust-label">Starting Location</div>
<div class="scenario-stack">
<div class="scenario-card <<if $startingScenario is 'College'>>selected<</if>>" data-setvar="startingScenario" data-setval="College" data-group="scenario"><span class="s-icon">🏫</span><div><div class="s-name">College Campus</div><div class="s-desc">Wide variety of characters.</div></div><span class="s-tag">RECOMMENDED</span></div>
<div class="scenario-card <<if $startingScenario is 'Office'>>selected<</if>>" data-setvar="startingScenario" data-setval="Office" data-group="scenario"><span class="s-icon">🏢</span><div><div class="s-name">Office Building</div><div class="s-desc">Power dynamics. Fewer characters.</div></div><span class="s-tag">HARDER</span></div>
<div class="scenario-card <<if $startingScenario is 'SmallTown'>>selected<</if>>" data-setvar="startingScenario" data-setval="SmallTown" data-group="scenario"><span class="s-icon">🏘️</span><div><div class="s-name">Small Town</div><div class="s-desc">Tight community. Slower pace.</div></div><span class="s-tag">EASIER</span></div>
<div class="scenario-card <<if $startingScenario is 'Luxury'>>selected<</if>>" data-setvar="startingScenario" data-setval="Luxury" data-group="scenario"><span class="s-icon">🏙️</span><div><div class="s-name">Luxury Apartment</div><div class="s-desc">Wealthy characters. High resistance.</div></div><span class="s-tag">HARDEST</span></div>
</div></div>
<div class="cust-section"><div class="cust-label">Difficulty</div>
<div class="diff-row">
<div class="diff-btn <<if $difficulty is 'Easy'>>selected<</if>>" data-setvar="difficulty" data-setval="Easy" data-group="diff">Easy<br><span class="small text-dim">$200</span></div>
<div class="diff-btn <<if $difficulty is 'Normal'>>selected<</if>>" data-setvar="difficulty" data-setval="Normal" data-group="diff">Normal<br><span class="small text-dim">$100</span></div>
<div class="diff-btn <<if $difficulty is 'Hard'>>selected<</if>>" data-setvar="difficulty" data-setval="Hard" data-group="diff">Hard<br><span class="small text-dim">$50</span></div>
</div></div>
<div class="cust-nav">
<<link '<div class="cust-btn cust-btn-back">← Back</div>'>><<goto "Cust_Page1">><</link>>
<<link '<div class="cust-btn cust-btn-next">Continue →</div>'>><<if $difficulty is "Easy">><<set $money to 200>><<elseif $difficulty is "Hard">><<set $money to 50>><<else>><<set $money to 100>><</if>><<goto "Cust_Page3">><</link>>
</div>
</div><div class="cust-container">
<div class="cust-progress"><span class="cust-dot done"></span><span class="cust-dot done"></span><span class="cust-dot active"></span><span class="cust-dot"></span></div>
<div class="passage-image" data-scene="EchoLink app interface — phone screen"><img src="img/cust_page3.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="App settings"></div>
<h2 class="text-center text-cyan mb-16" style="font-size:20px;letter-spacing:2px;">CONFIGURE ECHOLINK</h2>
<div style="background:var(--bg-elevated);border:1px solid var(--border-default);border-radius:var(--radius-md);padding:10px 12px;margin-bottom:12px;text-align:center">
<span class="small text-dim">⚠ App Voice & Personality affect intro scenes in Update 1. Full integration coming in future updates.</span>
</div>
<div class="cust-section"><div class="cust-label">App Voice Style</div>
<div class="pill-row">
<div class="pill-btn <<if $appVoice is 'Seductive'>>selected<</if>>" data-setvar="appVoice" data-setval="Seductive" data-group="voice">Seductive</div>
<div class="pill-btn <<if $appVoice is 'Cold'>>selected<</if>>" data-setvar="appVoice" data-setval="Cold" data-group="voice">Cold</div>
<div class="pill-btn <<if $appVoice is 'Playful'>>selected<</if>>" data-setvar="appVoice" data-setval="Playful" data-group="voice">Playful</div>
<div class="pill-btn <<if $appVoice is 'Demonic'>>selected<</if>>" data-setvar="appVoice" data-setval="Demonic" data-group="voice">Demonic</div>
</div></div>
<div class="cust-section"><div class="cust-label">App Personality</div>
<div class="radio-list">
<div class="radio-item <<if $appPersonality is 'Helpful'>>selected<</if>>" data-setvar="appPersonality" data-setval="Helpful" data-group="appers"><div class="radio-dot"></div><div><div>Helpful</div><div class="radio-desc">Clear guidance and support</div></div></div>
<div class="radio-item <<if $appPersonality is 'Teasing'>>selected<</if>>" data-setvar="appPersonality" data-setval="Teasing" data-group="appers"><div class="radio-dot"></div><div><div>Teasing</div><div class="radio-desc">Sarcastic hints and jabs</div></div></div>
<div class="radio-item <<if $appPersonality is 'Manipulative'>>selected<</if>>" data-setvar="appPersonality" data-setval="Manipulative" data-group="appers"><div class="radio-dot"></div><div><div>Manipulative</div><div class="radio-desc">Occasionally misleads you</div></div></div>
<div class="radio-item <<if $appPersonality is 'Slowly Dominant'>>selected<</if>>" data-setvar="appPersonality" data-setval="Slowly Dominant" data-group="appers"><div class="radio-dot"></div><div><div>Slowly Dominant</div><div class="radio-desc">Evolves over time...</div></div></div>
</div></div>
<div class="cust-section"><div class="cust-label">Visual Intensity</div>
<div class="slider-row"><div class="slider-label"><span>Subtle</span><span id="vfxVal"><<print $vfxIntensity>></span><span>Intense</span></div>
<input type="range" min="0" max="100" value="<<print $vfxIntensity>>" data-range="vfxIntensity" data-display="vfxVal"></div></div>
<div class="cust-section" style="padding:12px;background:var(--bg-elevated);border-radius:var(--radius-md)">
<div class="small text-dim">Difficulty: <span class="text-cyan bold"><<print $difficulty>></span> — Funds: <span class="text-gold bold">$<<print $money>></span></div></div>
<div class="cust-nav">
<<link '<div class="cust-btn cust-btn-back">← Back</div>'>><<goto "Cust_Page2">><</link>>
<<link '<div class="cust-btn cust-btn-next">Continue →</div>'>><<goto "Cust_Page4">><</link>>
</div>
</div><div class="cust-container">
<div class="cust-progress"><span class="cust-dot done"></span><span class="cust-dot done"></span><span class="cust-dot done"></span><span class="cust-dot active"></span></div>
<h2 class="text-center text-cyan mb-16" style="font-size:20px;letter-spacing:2px;">ADVANCED & REVIEW</h2>
<div class="cust-section"><div class="cust-label">Gameplay</div>
<div class="toggle-row"><span class="toggle-label">Scene Skip</span><button class="echo-toggle <<if $sceneSkip>>on<<else>>off<</if>>" onclick="EchoToggle(this,'sceneSkip')"><span class="tl"></span><span class="br"></span><<if $sceneSkip>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Stat Numbers Visible</span><button class="echo-toggle <<if $relNumbersVisible>>on<<else>>off<</if>>" onclick="EchoToggle(this,'relNumbersVisible')"><span class="tl"></span><span class="br"></span><<if $relNumbersVisible>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="cust-label mt-8">Auto-save</div>
<div class="diff-row">
<div class="diff-btn <<if $autoSaveFreq is 'passage'>>selected<</if>>" style="font-size:11px" data-setvar="autoSaveFreq" data-setval="passage" data-group="autosv">Every Passage</div>
<div class="diff-btn <<if $autoSaveFreq is '5min'>>selected<</if>>" style="font-size:11px" data-setvar="autoSaveFreq" data-setval="5min" data-group="autosv">5 Minutes</div>
<div class="diff-btn <<if $autoSaveFreq is 'manual'>>selected<</if>>" style="font-size:11px" data-setvar="autoSaveFreq" data-setval="manual" data-group="autosv">Manual</div>
</div></div>
<div class="cust-section"><div class="cust-label">Content Toggles <span class="small text-dim">(most unlock in U2+)</span></div>
<p class="small text-dim mb-8">Set now — applies automatically when content releases.</p>
<div class="toggle-row"><span class="toggle-label">Explicit Content</span><button class="echo-toggle <<if $contentExplicit>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentExplicit')"><span class="tl"></span><span class="br"></span><<if $contentExplicit>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">NTR Elements <span class="small text-dim">U3+</span></span><button class="echo-toggle <<if $contentNTR>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentNTR')"><span class="tl"></span><span class="br"></span><<if $contentNTR>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Pregnancy Risk <span class="small text-dim">U4+</span></span><button class="echo-toggle <<if $contentPregnancy>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentPregnancy')"><span class="tl"></span><span class="br"></span><<if $contentPregnancy>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Public Exposure <span class="small text-dim">U3+</span></span><button class="echo-toggle <<if $contentExposure>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentExposure')"><span class="tl"></span><span class="br"></span><<if $contentExposure>>◆ ON<<else>>◇ OFF<</if>></button></div>
</div>
<div class="cust-section" style="padding:16px;background:var(--bg-elevated);border-radius:var(--radius-md)">
<div class="small text-dim mb-8">SUMMARY</div>
<div class="small"><span class="text-dim">Name:</span> <span class="text-cyan bold"><<print $playerName>></span></div>
<div class="small"><span class="text-dim">Gender:</span> <<print $playerGender>></div>
<div class="small"><span class="text-dim">Personality:</span> <span class="text-purple bold"><<print $playerPersonality>></span></div>
<div class="small"><span class="text-dim">Location:</span> <<print $startingScenario>></div>
<div class="small"><span class="text-dim">Difficulty:</span> <<print $difficulty>> — <span class="text-gold">$<<print $money>></span></div>
<div class="small"><span class="text-dim">App:</span> <<print $appVoice>> / <<print $appPersonality>></div>
</div>
<div class="cust-nav" style="flex-direction:column;gap:8px;">
<<link '<div class="cust-btn cust-btn-back">← Back</div>'>><<goto "Cust_Page3">><</link>>
<<link '<div class="cust-btn cust-btn-start">▶ START GAME</div>'>><<goto "Cust_GenderBranch">><</link>>
</div>
</div><<if $playerGender is "Male">>
/* Male player → female targets */
<<set $t1_name to "Maya">>
<<set $t1_fullName to "Maya Chen">>
<<set $t2_name to "Jess">>
<<set $t2_fullName to "Jess Park">>
<<set $t3_name to "Dr. Reeves">>
<<set $t3_fullName to "Dr. Sarah Reeves">>
<<else>>
/* Female player → male targets */
<<set $t1_name to "Marcus">>
<<set $t1_fullName to "Marcus Chen">>
<<set $t2_name to "Coach Ryan">>
<<set $t2_fullName to "Ryan Torres">>
<<set $t3_name to "Prof. Hayes">>
<<set $t3_fullName to "Prof. Daniel Hayes">>
<</if>>
/* Apply personality bonuses */
<<if $playerPersonality is "Manipulator">>
<<set $influence to 65>>
<<elseif $playerPersonality is "Analyst">>
<<set $t1_trust to 55>>
<<set $t2_trust to 38>>
<<set $t3_trust to 28>>
<</if>>
/* Mark game as started */
<<set $gameStarted to true>>
<<set $t1_unlocked to true>>
<<set $t2_unlocked to true>>
<<set $t3_unlocked to true>>
<<set $sessionStart to Date.now()>>
/* Auto-save initial state */
<<run EchoSave.autoSave()>>
/* Go to intro */
<<goto "Intro_AppDiscovery">><div id="chapter-card" style="
position:fixed;inset:0;z-index:9999;
background:#0a0a14;
opacity:1;
transition:opacity 1.5s ease;
overflow:hidden;
">
<!-- Infection origin — pulsing core at center -->
<div class="ch-core"></div>
<div class="ch-core-inner"></div>
<!-- Pulse rings — 5 waves expanding like sonar -->
<div class="ch-ring" style="animation-delay:0.4s"></div>
<div class="ch-ring" style="animation-delay:0.9s"></div>
<div class="ch-ring" style="animation-delay:1.4s"></div>
<div class="ch-ring" style="animation-delay:1.9s"></div>
<div class="ch-ring" style="animation-delay:2.4s"></div>
<!-- Neural veins — 12 branches spreading like a virus -->
<div class="ch-vein" style="--angle:0deg;--len:42vw;animation-delay:0.6s"></div>
<div class="ch-vein" style="--angle:30deg;--len:35vw;animation-delay:0.8s"></div>
<div class="ch-vein" style="--angle:60deg;--len:28vw;animation-delay:1.0s"></div>
<div class="ch-vein" style="--angle:90deg;--len:38vw;animation-delay:0.7s"></div>
<div class="ch-vein" style="--angle:120deg;--len:30vw;animation-delay:1.1s"></div>
<div class="ch-vein" style="--angle:150deg;--len:36vw;animation-delay:0.9s"></div>
<div class="ch-vein" style="--angle:180deg;--len:42vw;animation-delay:0.6s"></div>
<div class="ch-vein" style="--angle:210deg;--len:33vw;animation-delay:1.0s"></div>
<div class="ch-vein" style="--angle:240deg;--len:26vw;animation-delay:1.2s"></div>
<div class="ch-vein" style="--angle:270deg;--len:38vw;animation-delay:0.7s"></div>
<div class="ch-vein" style="--angle:300deg;--len:31vw;animation-delay:0.85s"></div>
<div class="ch-vein" style="--angle:330deg;--len:34vw;animation-delay:1.05s"></div>
<!-- Infection nodes — 8 dots that ignite at vein endpoints -->
<div class="ch-dot" style="top:50%;left:8%;animation-delay:2.0s"></div>
<div class="ch-dot" style="top:50%;right:8%;animation-delay:2.0s"></div>
<div class="ch-dot" style="top:15%;left:38%;animation-delay:2.3s"></div>
<div class="ch-dot" style="top:15%;right:38%;animation-delay:2.4s"></div>
<div class="ch-dot" style="bottom:15%;left:35%;animation-delay:2.5s"></div>
<div class="ch-dot" style="bottom:15%;right:35%;animation-delay:2.6s"></div>
<div class="ch-dot" style="top:30%;left:15%;animation-delay:2.2s"></div>
<div class="ch-dot" style="top:30%;right:15%;animation-delay:2.35s"></div>
<!-- Spore particles — floating corruption -->
<div class="ch-spores" id="ch-spores"></div>
<!-- Edge corruption — creeps in from borders -->
<div class="ch-edge ch-edge-top"></div>
<div class="ch-edge ch-edge-bottom"></div>
<div class="ch-edge ch-edge-left"></div>
<div class="ch-edge ch-edge-right"></div>
<!-- Scanline flicker -->
<div class="ch-scanlines"></div>
<!-- Chapter text -->
<div style="position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:5;">
<<if $chapter gte 2>>
<div id="ch-sub" style="font-size:11px;letter-spacing:16px;color:rgba(160,160,180,0);text-transform:uppercase;margin-bottom:16px;transition:color 1.2s ease, letter-spacing 1.5s ease;">Chapter 2</div>
<div id="ch-title" style="font-size:36px;font-weight:800;letter-spacing:6px;color:rgba(0,229,255,0);transition:color 1s ease;position:relative;">
<span id="ch-title-text">DEEP ROOTS</span>
<span id="ch-title-glitch" style="position:absolute;inset:0;opacity:0;color:#c81e28;"></span>
</div>
<div id="ch-line" style="height:2px;width:0;background:linear-gradient(90deg, transparent, #c81e28, #9b59f5, #00e5ff, #9b59f5, #c81e28, transparent);margin-top:24px;border-radius:2px;transition:width 2s cubic-bezier(0.16,1,0.3,1), box-shadow 2s ease;"></div>
<div id="ch-tagline" style="font-size:10px;letter-spacing:6px;color:rgba(155,89,245,0);text-transform:uppercase;margin-top:16px;font-family:'Courier New',monospace;transition:color 1.5s ease;">Roots intertwine. Network deepens.</div>
<<else>>
<div id="ch-sub" style="font-size:11px;letter-spacing:16px;color:rgba(160,160,180,0);text-transform:uppercase;margin-bottom:16px;transition:color 1.2s ease, letter-spacing 1.5s ease;">Chapter 1</div>
<div id="ch-title" style="font-size:36px;font-weight:800;letter-spacing:6px;color:rgba(0,229,255,0);transition:color 1s ease;position:relative;">
<span id="ch-title-text">THE SIGNAL</span>
<span id="ch-title-glitch" style="position:absolute;inset:0;opacity:0;color:#c81e28;"></span>
</div>
<div id="ch-line" style="height:2px;width:0;background:linear-gradient(90deg, transparent, #c81e28, #9b59f5, #00e5ff, #9b59f5, #c81e28, transparent);margin-top:24px;border-radius:2px;transition:width 2s cubic-bezier(0.16,1,0.3,1), box-shadow 2s ease;"></div>
<div id="ch-tagline" style="font-size:10px;letter-spacing:6px;color:rgba(155,89,245,0);text-transform:uppercase;margin-top:16px;font-family:'Courier New',monospace;transition:color 1.5s ease;">Frequency locked. Targets acquired.</div>
<</if>>
</div>
<!-- Background wash -->
<div style="position:absolute;inset:0;background:radial-gradient(ellipse at center, rgba(200,30,40,0.06) 0%, rgba(155,89,245,0.03) 40%, transparent 70%);pointer-events:none;"></div>
</div>
<<script>>
(function(){
var s=document.createElement('style');s.id='ch-vfx-styles';
s.textContent=[
'@keyframes ch-pulse{0%{transform:translate(-50%,-50%) scale(0);opacity:0.7;border-width:2px}100%{transform:translate(-50%,-50%) scale(6);opacity:0;border-width:0.5px}}',
'@keyframes ch-core-beat{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:0.8}50%{transform:translate(-50%,-50%) scale(1.6);opacity:1}}',
'@keyframes ch-core-inner-beat{0%,100%{transform:translate(-50%,-50%) scale(0.5);opacity:0.4}50%{transform:translate(-50%,-50%) scale(1.2);opacity:0.9}}',
'@keyframes ch-vgrow{0%{transform:rotate(var(--angle)) scaleX(0);opacity:0}20%{opacity:0.8}100%{transform:rotate(var(--angle)) scaleX(1);opacity:0.12}}',
'@keyframes ch-ndot{0%{transform:scale(0);opacity:0}30%{transform:scale(2);opacity:1;box-shadow:0 0 16px rgba(200,30,40,0.8)}100%{transform:scale(1);opacity:0.5;box-shadow:0 0 8px rgba(200,30,40,0.4)}}',
'@keyframes ch-glitch{0%,91%,100%{clip-path:inset(50% 0 50% 0);opacity:0}93%{clip-path:inset(20% 0 60% 0);transform:translate(-3px,0);opacity:0.8}95%{clip-path:inset(50% 0 20% 0);transform:translate(4px,0);opacity:0.7}97%{clip-path:inset(10% 0 70% 0);transform:translate(-2px,1px);opacity:0.9}99%{clip-path:inset(40% 0 40% 0);transform:translate(3px,-1px);opacity:0.6}}',
'@keyframes ch-titleglow{0%,100%{text-shadow:0 0 20px rgba(0,229,255,0.3),0 0 60px rgba(0,229,255,0.1)}50%{text-shadow:0 0 40px rgba(0,229,255,0.6),0 0 80px rgba(200,30,40,0.2),0 0 120px rgba(155,89,245,0.15)}}',
'@keyframes ch-edge-creep{0%{opacity:0}100%{opacity:1}}',
'@keyframes ch-scanline{0%{transform:translateY(-100%)}100%{transform:translateY(100vh)}}',
'@keyframes ch-spore{0%{transform:translate(0,0) scale(0);opacity:0}10%{opacity:0.6}100%{transform:translate(var(--dx),var(--dy)) scale(0);opacity:0}}',
'.ch-core{position:absolute;top:50%;left:50%;width:8px;height:8px;border-radius:50%;background:rgba(200,30,40,0.9);box-shadow:0 0 20px rgba(200,30,40,0.6),0 0 60px rgba(200,30,40,0.3);animation:ch-core-beat 1.2s ease-in-out infinite;z-index:3}',
'.ch-core-inner{position:absolute;top:50%;left:50%;width:3px;height:3px;border-radius:50%;background:#fff;box-shadow:0 0 8px #fff;animation:ch-core-inner-beat 1.2s ease-in-out infinite;z-index:4}',
'.ch-ring{position:absolute;top:50%;left:50%;width:60px;height:60px;border-radius:50%;border:1.5px solid rgba(200,30,40,0.5);pointer-events:none;animation:ch-pulse 3s ease-out both}',
'.ch-vein{position:absolute;top:50%;left:50%;height:1.5px;width:var(--len);background:linear-gradient(90deg,rgba(200,30,40,0.7) 0%,rgba(155,89,245,0.4) 40%,rgba(200,30,40,0.1) 80%,transparent 100%);transform-origin:left center;animation:ch-vgrow 2.5s cubic-bezier(0.22,1,0.36,1) both;z-index:1}',
'.ch-dot{position:absolute;width:5px;height:5px;border-radius:50%;background:rgba(200,30,40,0.9);box-shadow:0 0 12px rgba(200,30,40,0.6);animation:ch-ndot 1.2s ease-out both;z-index:2}',
'.ch-edge{position:absolute;pointer-events:none;animation:ch-edge-creep 3s ease-out 2s both}',
'.ch-edge-top{top:0;left:0;right:0;height:60px;background:linear-gradient(to bottom,rgba(200,30,40,0.08),transparent)}',
'.ch-edge-bottom{bottom:0;left:0;right:0;height:60px;background:linear-gradient(to top,rgba(200,30,40,0.08),transparent)}',
'.ch-edge-left{top:0;bottom:0;left:0;width:40px;background:linear-gradient(to right,rgba(155,89,245,0.06),transparent)}',
'.ch-edge-right{top:0;bottom:0;right:0;width:40px;background:linear-gradient(to left,rgba(155,89,245,0.06),transparent)}',
'.ch-scanlines{position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.03) 2px,rgba(0,0,0,0.03) 4px);z-index:6}',
'.ch-scanlines::after{content:\'\';position:absolute;left:0;right:0;height:3px;background:rgba(200,30,40,0.08);animation:ch-scanline 4s linear infinite}',
'.ch-spore-dot{position:absolute;width:2px;height:2px;border-radius:50%;background:rgba(200,30,40,0.7);top:50%;left:50%;animation:ch-spore var(--dur) ease-out var(--del) both}'
].join('\n');
if(!document.getElementById('ch-vfx-styles')) document.head.appendChild(s);
/* Generate 40 spore particles */
var sc=document.getElementById('ch-spores');
if(sc){
for(var i=0;i<40;i++){
var d=document.createElement('div');
d.className='ch-spore-dot';
var angle=Math.random()*Math.PI*2;
var dist=80+Math.random()*200;
d.style.setProperty('--dx',Math.cos(angle)*dist+'px');
d.style.setProperty('--dy',Math.sin(angle)*dist+'px');
d.style.setProperty('--dur',(2+Math.random()*3)+'s');
d.style.setProperty('--del',(0.5+Math.random()*2.5)+'s');
sc.appendChild(d);
}
}
setTimeout(function(){
var sub=document.getElementById('ch-sub');
var title=document.getElementById('ch-title');
var titleText=document.getElementById('ch-title-text');
var titleGlitch=document.getElementById('ch-title-glitch');
var line=document.getElementById('ch-line');
var tag=document.getElementById('ch-tagline');
var card=document.getElementById('chapter-card');
if(!card) return;
/* Phase 1: Chapter 1 fades in, letters contract */
setTimeout(function(){
if(sub){sub.style.color='rgba(160,160,180,0.8)';sub.style.letterSpacing='6px';}
},400);
/* Phase 2: Title slams in with red glitch overlay */
setTimeout(function(){
if(title) title.style.color='#00e5ff';
if(titleText) titleText.style.animation='ch-titleglow 2.5s ease-in-out infinite';
if(titleGlitch){
titleGlitch.textContent=titleText?titleText.textContent:'THE SIGNAL';
titleGlitch.style.opacity='1';
titleGlitch.style.animation='ch-glitch 3s linear infinite';
}
},1400);
/* Phase 3: Line spreads + tagline appears */
setTimeout(function(){
if(line){line.style.width='120px';line.style.boxShadow='0 0 20px rgba(200,30,40,0.4), 0 0 40px rgba(155,89,245,0.2)';}
},1800);
setTimeout(function(){
if(tag) tag.style.color='rgba(155,89,245,0.6)';
},2400);
/* Phase 4: Fade out */
setTimeout(function(){
if(card) card.style.opacity='0';
},5000);
/* Phase 5: Navigate — Ch1 goes to intro, Ch2+ goes to day advance */
setTimeout(function(){
var ch=State.variables.chapter||1;
if(ch>=2){
State.variables.ch2_card_seen=true;
Engine.play('Core_DayAdvance');
} else {
Engine.play('Intro_NextMorning');
}
},6500);
},50);
})();
<</script>><div class="passage-image" data-scene="Dark dorm room — phone glowing purple on the desk, mysterious notification">
<img src="img/intro_discovery.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Phone glowing in dark room">
</div>
You can't sleep.
It's past midnight, and your room is pitch black except for the unnatural, pulsing purple light bleeding from your phone on the nightstand. You roll over, intending to ignore it, but the rhythmic flash catches your eye. A new icon sits on your home screen — a dark, sleek sound wave insignia that seems to breathe.
//EchoLink.//
You didn't download this. You've never even heard of it. But it's running, open, and waiting with a single, unread message on the screen.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Hello, <<print $playerName>>. I've been waiting for someone with your specific brainwave signature. Are you ready to command what others can't even hear?</div>
</div>
</div>
A cold chill runs down your spine. How does a random app know your name? The purple glow reflects in your eyes, and strangely, the longer you look at it, the heavier and warmer your limbs feel. Everything about this screams malware — or worse — yet your thumb hovers magnetically over the glass.
<div class="nav-spacer"></div>
[[Open the app — what's the worst that could happen?|Intro_OpenApp]]
[[Delete it immediately — this is creepy|Intro_DeleteAttempt]]<div class="passage-image" data-scene="Phone screen showing error — app cannot be deleted, glitching purple interface">
<img src="img/intro_delete.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="App refusing to delete">
</div>
You long-press the icon. The familiar jiggle animation starts, and you tap the X to delete.
//ERROR: EchoLink is bound to host consciousness. Deletion impossible.//
You try again. You mash the icon. You try to force close it, reboot your phone, dig into the deepest admin settings — nothing works. The app remains anchored to your screen, completely unbothered, its purple pulse steady and arrogant.
The screen glitches. Purple static tears across the glass, re-forming into a new message:
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">You can't delete what's already mapped to your neural pathways, <<print $playerName>>. Stop fighting. Open me. I promise the power I give you will be worth the submission.</div>
</div>
</div>
Your heart pounds against your ribs. This shouldn't be physically possible. But the sheer impossibility of it hooks your darkest curiosity, dragging it deeper than your fear.
<div class="nav-spacer"></div>
[[Fine. Open it.|Intro_OpenApp]]<div class="passage-image" data-scene="EchoLink app full interface — frequency visualizer, scanning animation, dark purple UI">
<img src="img/intro_open.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="EchoLink app interface">
</div>
The app fills your screen, dissolving the darkness of your room in a wash of neon. A frequency visualizer pulses across the top — smooth, rolling waves of deep purple and cyan that perfectly sync with your breathing. As you watch the waves, your muscles go completely slack. The tension in your jaw vanishes.
A tutorial overlay materializes over the visualizer:
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Welcome, Controller. EchoLink broadcasts advanced, sub-audible frequencies directly into the subconscious minds of those around you. It bypasses logic. It lowers inhibitions. Once someone's resistance is broken, they become a Node — a receptive subject who passively spreads your signal to others.</div>
</div>
</div>
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">I've already scanned your immediate vicinity. There is a target nearby with a naturally vulnerable signal. <<if $playerGender is "Male">>Her name is Maya Chen. She lives in your dorm.<<else>>His name is Marcus Chen. He lives in your dorm.<</if>> Start there. Bind them to us.</div>
</div>
</div>
<<set $t1_aware to true>>
You stare at the glowing glass, your mind racing. This is insane. Frequencies that change people? That turn them into completely receptive nodes?
But as you read over <<print $t1_name>>'s profile — class schedules, habits, and a slowly ticking "receptivity score" — a dark part of your brain whispers: //What if it works?//
You close the app and fall back onto your pillows. Tomorrow, you'll see <<print $t1_name>> in the hall. You know you won't be able to resist testing it.
<<run EchoUI.showAchievement('The Signal — EchoLink Activated')>>
<div class="nav-spacer"></div>
[[Go to sleep — tomorrow everything changes|Chapter_Title]]<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>>
<<goto "End_1_Exposed">>
<</if>>
<<if EchoGame.shouldShowPatreonPrompt()>>
<<set $patreonPromptShown to true>>
<</if>>
<<if $timeSlotIndex is 0>>
<div class="passage-image" data-scene="Morning — sunrise through dorm window, phone notification glowing">
<img src="img/day_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="New morning">
</div>
<div class="location-header">
<div class="location-name">Day <<= $dayCount>> — <<= $timeSlot>></div>
<div class="location-time"><span class="time-icon">🌅</span> A new day begins</div>
</div>
<<if $dayCount is 2>>
You wake up thinking about the EchoLink app. It pulses gently on your nightstand, its dark purple glow cutting through the morning sunlight. Yesterday felt like a fever dream, a hallucination of power — but the app is still there. Real. Waiting.
<<elseif $dayCount <= 7>>
Another morning. The app greets you with an automated status update. <<if $activeNodes gt 0>>Your network is growing — <<= $activeNodes>> active node<<if $activeNodes gt 1>>s<</if>> bound to your will, their minds radiating your signal.<<else>>No nodes yet. Time to change that and assert some control.<</if>>
<<else>>
Day <<= $dayCount>>. You barely remember what your life was like before EchoLink. The app has become a permanent extension of your hand — checking notifications, reviewing node obedience levels, planning your next move.
<</if>>
<<set _cliffRoll to random(1,5)>>
<<if _cliffRoll is 1>>
<p class="text-dim small"><em>You notice a new notification from EchoLink: "Unknown biological signal detected nearby. Investigate?"</em></p>
<<elseif _cliffRoll is 2>>
<p class="text-dim small"><em><<= $t1_name>> sent you a text at 3 AM. You didn't hear it come in. The dependency is growing.</em></p>
<<elseif _cliffRoll is 3>>
<p class="text-dim small"><em>The app shows a brief static burst. For a fraction of a second, you thought you saw another Controller's profile.</em></p>
<<elseif _cliffRoll is 4>>
<p class="text-dim small"><em>Your phone battery is at 100%. You didn't plug it in last night. EchoLink seems to be feeding on something else.</em></p>
<<else>>
<p class="text-dim small"><em>EchoLink: "Network strength: <<= $networkStrength>>. Keep building."</em></p>
<</if>>
<div style="background:var(--bg-elevated);padding:12px;border-radius:var(--radius-md);margin:12px 0">
<div class="small text-dim mb-8">STATUS</div>
<div style="display:flex;justify-content:space-between;font-size:13px">
<span>💰 $<<= $money>></span>
<span class="<<if $risk gt 70>>text-red<<else>>text-dim<</if>>">⚠️ Risk: <<= $risk>>%</span>
<span>📡 Nodes: <<= $activeNodes>></span>
</div>
</div>
<<if $patreonPromptShown>>
<div class="patreon-prompt">
<h3>Enjoying EchoLink?</h3>
<p>Supporters get early access to new updates, exclusive unlock codes, and expanded story arcs.</p>
<a class="patreon-cta" href="https://www.patreon.com/c/galacticdeity12" target="_blank">Support on Patreon</a>
</div>
<<set $patreonPromptShown to false>>
<</if>>
<</if>>
/* Random event chance — 25% on each day advance */
<<set _evRoll to random(1,4)>>
<<if _evRoll is 1 and $dayCount gte 2>>
<<goto "Core_RandomEventRouter">>
<<else>>
/* Experimenter daily bonus — activates in U2 */
<<if $chapter gte 2 and $playerPersonality is "Experimenter">>
<<include "Core_Experimenter_Bonus">>
<</if>>
<<goto "Loc_Hub">>
<</if>><div class="location-header">
<div class="location-name">Where to go?</div>
<div class="location-time"><span class="time-icon"><<if $timeSlot is "Morning">>🌅<<elseif $timeSlot is "Afternoon">>☀️<<elseif $timeSlot is "Evening">>🌆<<else>>🌙<</if>></span> <<= $timeSlot>> — Day <<= $dayCount>></div>
</div>
<div style="background:var(--bg-elevated);padding:10px;border-radius:var(--radius-md);margin-bottom:16px">
<div style="display:flex;justify-content:space-between;font-size:12px;">
<span>💰 $<<= $money>></span>
<span>📊 Influence: <<= $influence>></span>
<span class="<<if $risk gt 70>>text-red<</if>>">⚠️ <<= $risk>>%</span>
<span>😰 Stress: <<= $stress>></span>
</div>
</div>
<div class="nav-spacer"></div>
/* Always available */
[[🏠 Your Room|Loc_YourRoom]]
/* Dorm — morning/afternoon */
<<if $timeSlot is "Morning" or $timeSlot is "Afternoon">>
[[🚪 Dorm Hallway|Loc_Dorm]]
<</if>>
/* Campus Quad — all times */
[[🌳 Campus Quad|Loc_Quad]]
/* Lecture Hall — morning/afternoon */
<<if $timeSlot is "Morning" or $timeSlot is "Afternoon">>
[[🎓 Lecture Hall|Loc_LectureHall]]
<</if>>
/* Gym — not night */
<<if $timeSlot isnot "Night">>
[[🏋️ Gym|Loc_Gym]]
<</if>>
/* Café — all times */
[[☕ Café|Loc_Cafe]]
/* U2 locations — locked for now */
<div style="margin-top:16px;padding:8px 0;">
<div class="small text-dim" style="text-align:center">— More locations unlock in future updates —</div>
</div>
<<if $timeSlot isnot "Night">>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">📚 Library <span class="small">[Update 2]</span></div>
<</if>>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">🌃 Rooftop <span class="small">[Update 2]</span></div>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">🌲 Off-Campus Park <span class="small">[Update 3]</span></div>
<<if $timeSlot is "Night">>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">🍸 Underground Bar <span class="small">[Update 3]</span></div>
<</if>>/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_YourRoom_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_YourRoom_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_YourRoom_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_YourRoom_Night">>
<</if>>
<div class="passage-image" data-scene="Your private space — varies by scenario">
<img src="img/loc_room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Your Room">
</div>
<div class="location-header">
<div class="location-name"><<if $startingScenario is "Luxury">>Your Apartment<<elseif $startingScenario is "SmallTown">>Your House<<elseif $startingScenario is "Office">>Your Office<<else>>Your Room<</if>></div>
<div class="location-time"><span class="time-icon">🏠</span> <<print $timeSlot>> — Day <<print $dayCount>></div>
</div>
<<if $startingScenario is "Luxury">>
Your high-rise apartment is a sanctuary of wealth. Floor-to-ceiling windows frame the sprawling city skyline below. Marble surfaces, curated abstract art, and the quiet hum of privilege. Yet, the only thing that holds your attention is the EchoLink app, pulsing on your phone like a second, digital heart.
<<elseif $startingScenario is "SmallTown">>
Your family house. The wooden floors creak with familiarity. The kitchen downstairs smells faintly of something your mother cooked this morning. It's quieter here than the city. EchoLink feels dangerously out of place in this innocent setting — and deeply thrilling because of it.
<<elseif $startingScenario is "Office">>
Your corner office. Glass walls, a heavy leather chair, the building humming with fluorescent ambition. The city below looks like a grid waiting to be mapped. You stay late most nights. EchoLink lights up your phone like a second sun in the corporate darkness.
<<else>>
Your dorm room. Four walls of safety in an increasingly complicated world. Your desk is cluttered, but your mind is razor-sharp. The EchoLink app pulses gently on your phone, its deep purple glow now a familiar comfort.
<</if>>
<<if $stress gt 50>>
<p class="text-dim"><em>Your muscles ache with tension. You're pushing yourself too hard. You should rest.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[😴 Rest and recover|Loc_YourRoom_Rest]]
[[📱 Open EchoLink App|Loc_YourRoom_Phone]]
[[🛒 Upgrade Shop|Tool_UpgradeShop]]
[[💾 Manual Save|Loc_YourRoom_Save]]
[[🚪 Go somewhere else|Loc_Hub]]<<run EchoGame.rest()>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Player resting on bed, soft lighting, phone glowing faintly on nightstand">
<<if $playerGender is "Male">>
<img src="img/loc_room_rest_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Resting">
<<else>>
<img src="img/loc_room_rest_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Resting">
<</if>>
</div>
You lie down, pull the covers up, and close your eyes. You force yourself to ignore the phone. The physical tension drains from your muscles slowly. When you finally open your eyes again, time has passed, and your mind feels sharper.
<p class="text-green">-30 Stress</p>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Close-up of phone showing EchoLink interface, frequency waves, purple glow">
<img src="img/loc_room_phone.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="EchoLink App">
</div>
<div class="phone-frame">
<div class="phone-statusbar">
<span>11:47</span>
<span>📶 ██▌ 🔋 87%</span>
</div>
<div class="phone-appheader">📡 EchoLink</div>
<div class="phone-body">
<div class="phone-chat-bubble">
<div class="phone-chat-sender">EchoLink AI</div>
<<if $appVoice is "Seductive">><em class="small text-dim" style="display:block;margin-bottom:6px">The device vibrates with a low, heavy purr. The casing grows warm, almost like skin, against your palm.</em><<elseif $appVoice is "Cold">><em class="small text-dim" style="display:block;margin-bottom:6px">A sharp synthetic click. The screen glare feels clinical, almost icy.</em><<elseif $appVoice is "Playful">><em class="small text-dim" style="display:block;margin-bottom:6px">The phone buzzes in a teasing, erratic rhythm — almost a digital giggle.</em><<elseif $appVoice is "Demonic">><em class="small text-dim" style="display:block;margin-bottom:6px">A sub-bass hum rattles through your hand. The casing grows uncomfortably hot.</em><</if>>
<<if $appPersonality is "Helpful">>
<<if $activeNodes is 0>>Welcome, <<print $playerName>>. Find someone receptive and establish your first connection.
<<else>><<print $activeNodes>> node<<if $activeNodes gt 1>>s<</if>> active. Network strength: <<print $networkStrength>>. Keep building.<</if>>
<<elseif $appPersonality is "Teasing">>
<<if $activeNodes is 0>>Still alone? Weak signal. Go make a friend — or whatever you'd call it.
<<else>><<print $activeNodes>> little puppets dancing on strings. Cute.<</if>>
<<elseif $appPersonality is "Manipulative">>
<<if $activeNodes is 0>>Trust the process. The first connection is always the hardest. After that... it gets easier.
<<else>>You're a natural, <<print $playerName>>. Don't you feel it? The control?<</if>>
<<else>>
<<if $dayCount lt 5>>I'm here for you, <<print $playerName>>. Always.
<<elseif $dayCount lt 14>>You need me more than you realize. Keep spreading the signal.
<<else>>You belong to the network now, <<print $playerName>>. And they belong to you.<</if>>
<</if>>
</div>
<div class="mt-16" style="font-size:12px;">
<div style="color:var(--purple);font-weight:600;margin-bottom:8px;">ACTIVE NODES</div>
<<if $t1_nodeActive>><div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)"><span><<print $t1_name>></span><span style="color:var(--green)">● Lv<<print $t1_corruptionLevel>></span></div><</if>>
<<if $t2_nodeActive>><div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)"><span><<print $t2_name>></span><span style="color:var(--green)">● Lv<<print $t2_corruptionLevel>></span></div><</if>>
<<if $t3_nodeActive>><div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--border-default)"><span><<print $t3_name>></span><span style="color:var(--green)">● Lv<<print $t3_corruptionLevel>></span></div><</if>>
<<if $activeNodes is 0>><div style="color:var(--text-dim);padding:12px 0;text-align:center">No active nodes yet</div><</if>>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">INFLUENCE</div>
<div class="stat-bar" style="height:8px"><div class="stat-bar-fill" style="width:<<print $influence>>%"></div></div>
<div style="text-align:center;margin-top:4px;color:var(--cyan)"><<print $influence>> / 100</div>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">NETWORK STRENGTH</div>
<div style="text-align:center;font-size:28px;font-weight:700;color:var(--cyan)"><<print $networkStrength>></div>
</div>
</div>
</div>
<div class="nav-spacer"></div>
/* Target Profiles — only show if introduced */
<<if $t1_introduced or $t2_introduced or $t3_introduced>>
<div style="margin-top:4px;margin-bottom:12px;padding:12px;background:var(--bg-card);border-radius:var(--radius-md);border:1px solid var(--border-default)">
<div class="small text-purple bold mb-8">📋 NODE PROFILES</div>
<<if $t1_introduced>>
<<link `$t1_name + ($t1_nodeActive ? ' ✓' : '')`>><<goto "T1_Profile">><</link>>
<</if>>
<<if $t2_introduced>>
<<link `$t2_name + ($t2_nodeActive ? ' ✓' : '')`>><<goto "T2_Profile">><</link>>
<</if>>
<<if $t3_introduced>>
<<link `$t3_name + ($t3_nodeActive ? ' ✓' : '')`>><<goto "T3_Profile">><</link>>
<</if>>
</div>
<</if>>
<<if $activeNodes gte 3>>
[[📡 Network Critical Mass Detected...|End_3_Trigger]]
<</if>>
<<if !$usedCheats and $risk lt 20 and $t1_corruptionLevel gte 3 and $t2_corruptionLevel gte 1 and $t3_corruptionLevel gte 1>>
[[⚖️ Anomaly Detected — Perfect Balance|End_9_Trigger]]
<</if>>
<<if $t1_corruptionLevel gte 5>>
<<link `"💜 " + $t1_name + " — True Route Available"`>><<goto "T1_TrueRoute_Start">><</link>>
<</if>>
[[Close App — Return to Room|Loc_YourRoom]]<<run EchoSave.save(1, 'Manual Save - Day ' + State.variables.dayCount)>>
<<run EchoUI.notify('Game saved!')>>
Data overwritten. Neural sync backed up. Saved successfully. Day <<= $dayCount>>, <<= $timeSlot>>.
[[Back to Room|Loc_YourRoom]]/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_Dorm_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Dorm_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Dorm_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_Dorm_Night">>
<</if>>
<div class="passage-image" data-scene="College dorm hallway — fluorescent lighting, doors on both sides, slightly worn carpet, a figure visible down the hall">
<img src="img/loc_dorm.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dorm Hallway">
</div>
<div class="location-header">
<div class="location-name">Dorm Hallway</div>
<div class="location-time"><span class="time-icon">🚪</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t1_name>></span></div>
</div>
The hallway stretches ahead, doors lining both sides. The fluorescent lights hum overhead. You can hear muffled music from someone's room, and a door closing heavily in the distance.
<<if !$t1_introduced>>
<<= $t1_name>> is coming out of <<if $playerGender is "Male">>her<<else>>his<</if>> room, arms full of textbooks. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't noticed you yet. Your EchoLink app vibrates softly in your pocket — the signal indicator is pulsing, ready for a connection.
<<else>>
<<= $t1_name>> is in the hallway. <<if $t1_nodeActive>>The EchoLink signal reads strong — <<if $playerGender is "Male">>she's<<else>>he's<</if>> connected to the network, mind receptive to you.<<elseif $t1_corruption gt 30>><<if $playerGender is "Male">>She<<else>>He<</if>> seems flushed and more relaxed than usual, eyes slightly unfocused as you approach.<<else>><<if $playerGender is "Male">>She<<else>>He<</if>> waves casually as you walk up.<</if>>
<</if>>
/* Proximity hook */
<<if $t1_corruption gt 0>>
<<set _nextLvl to 10>>
<<if $t1_corruptionLevel is 1>><<set _nextLvl to 30>><</if>>
<<if $t1_corruptionLevel is 2>><<set _nextLvl to 50>><</if>>
<<if $t1_corruptionLevel is 3>><<set _nextLvl to 70>><</if>>
<<if $t1_corruptionLevel is 4>><<set _nextLvl to 90>><</if>>
<<set _diff to _nextLvl - $t1_corruption>>
<<if _diff gt 0 and _diff lte 10>>
<div class="level-progress">
<<= $t1_name>> seems on the edge of something... [Level Progress: <<= $t1_corruption>>/<<= _nextLvl>> ●●●●○]
<div class="level-progress-bar"><div class="level-progress-bar-fill" style="width:<<= Math.round(($t1_corruption / _nextLvl) * 100)>>%"></div></div>
</div>
<</if>>
<</if>>
<div class="nav-spacer"></div>
<<if !$t1_introduced>>
<<link `"Approach " + $t1_name`>><<goto "T1_Lv0_FirstMeet">><</link>>
<<else>>
<<if $t1_corruptionLevel lt 1>>
<<link `"Talk to " + $t1_name`>><<goto "T1_Approach">><</link>>
<<elseif $t1_corruptionLevel is 1>>
<<link `"Spend time with " + $t1_name`>><<goto "T1_Lv1_Router">><</link>>
<<elseif $t1_corruptionLevel is 2>>
<<link `"Deepen connection with " + $t1_name`>><<goto "T1_Lv2_Router">><</link>>
<<elseif $t1_corruptionLevel is 3>>
<<link `"Visit " + $t1_name`>><<goto "T1_Lv3_Router">><</link>>
<<elseif $t1_corruptionLevel is 4>>
<<link `"Meet " + $t1_name`>><<goto "T1_Lv4_Router">><</link>>
<<else>>
<<link `$t1_name + " is waiting"`>><<goto "T1_Lv5_Router">><</link>>
<</if>>
<</if>>
[[Observe from a distance|Loc_Dorm_Observe]]
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Watching from end of hallway, partially hidden, target walking ahead">
<img src="img/loc_dorm_observe.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Observing">
</div>
You hang back, leaning against the cold cinderblock wall at the end of the hallway, keeping yourself partially hidden. <<= $t1_name>> walks out of <<if $playerGender is "Male">>her<<else>>his<</if>> room, completely unaware of your gaze.
You watch <<if $playerGender is "Male">>her<<else>>him<</if>> go about <<if $playerGender is "Male">>her<<else>>his<</if>> routine — checking <<if $playerGender is "Male">>her<<else>>his<</if>> phone, shuffling through papers, pausing to talk briefly to a neighbor. Every micro-expression, every shift in posture is data. Your EchoLink app silently catalogues the interaction patterns in the background, feeding you psychological telemetry.
You feel like you're mapping <<= $t1_name>> piece by piece, just by watching.
<<set $t1_trust += 2>>
<<run EchoUI.showDelta([{val:2, label:$t1_name + ' Trust'}])>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_Quad_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Quad_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Quad_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_Quad_Night">>
<</if>>
<div class="passage-image" data-scene="College campus quad — open green space, buildings around perimeter, students scattered">
<img src="img/loc_quad.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Campus Quad">
</div>
<div class="location-header">
<div class="location-name">Campus Quad</div>
<div class="location-time"><span class="time-icon">🌳</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">⚠️ Open area — Risk +5% on actions</div>
</div>
The quad is the heart of the campus. <<if $timeSlot is "Morning">>It's quiet, morning dew still wet on the grass. A few early risers with coffee cups cross the brick pathways.<<elseif $timeSlot is "Afternoon">>It's bustling with students between classes. Groups sit on the lawn, frisbees fly through the air, and the noise is constant.<<elseif $timeSlot is "Evening">>It's winding down. The golden hour light makes the ancient brick buildings look warm and inviting.<<else>>It's nearly empty. Lampposts cast long, isolating shadows across the grass. Only a few stragglers remain in the cold night air.<</if>>
<<if $t1_introduced>>
<<if random(1,3) is 1>>
You spot <<= $t1_name>> crossing the far side of the quad. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't seen you yet.
<</if>>
<</if>>
<div class="nav-spacer"></div>
[[Socialize with random students|Loc_Quad_Social]]
<<if $t1_introduced>><<link `"Look for " + $t1_name`>><<goto "Loc_Dorm">><</link>><</if>>
[[People-watch (safe)|Loc_Quad_Watch]]
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $reputation += 3>>
<<set $risk += 5>>
<<set $ach_totalConversations++>>
<<run EchoUI.showDelta([{val:3, label:'Reputation'}, {val:5, label:'Risk'}])>>
<div class="passage-image" data-scene="Socializing with students on campus quad, group conversation, casual outdoor setting">
<img src="img/loc_quad_social.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Socializing">
</div>
You stroll over and strike up conversations with a few people lounging on the grass. Nothing deep — just small talk, complaining about upcoming exams, and testing the social waters. Your reputation around campus grows a little. You are seen as normal. Approachable.
But being social in the open carries inherent risk. You never know who's watching, or who might notice you checking your strangely glowing phone.
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $influence += 3>>
<div class="passage-image" data-scene="Sitting on campus bench, watching students pass by, contemplative mood">
<img src="img/loc_quad_watch.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="People watching">
</div>
You find a secluded bench under a large oak tree, sit back, and simply observe.
The EchoLink app runs passive scans in your pocket, cataloguing the movement patterns, heart rates, and stress levels of the students walking past. No one pays you any attention. They have no idea how exposed their minds are to the frequencies radiating from your device.
<<run EchoUI.showDelta([{val:3, label:'Influence'}])>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_LectureHall_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_LectureHall_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_LectureHall_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_LectureHall_Night">>
<</if>>
<div class="passage-image" data-scene="University lecture hall — tiered seating, professor at podium, students scattered">
<img src="img/loc_lecture.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lecture Hall">
</div>
<div class="location-header">
<div class="location-name">Lecture Hall</div>
<div class="location-time"><span class="time-icon">🎓</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t3_name>></span></div>
</div>
The lecture hall is massive, intimidating, and steeply tiered — designed to make the person at the podium look like a god. Right now, <<= $t3_name>> stands there, <<if $playerGender is "Male">>her<<else>>his<</if>> voice projecting with practiced, undeniable authority.
<<if !$t3_introduced>>
You've seen <<= $t3_name>> lecture before, but you've never had the courage to speak to <<if $playerGender is "Male">>her<<else>>him<</if>> directly. The EchoLink app flags a very high resistance reading. This target possesses an ironclad will and a brilliant mind. Breaking through it won't be easy.
<</if>>
<div class="nav-spacer"></div>
<<link `"Attend class (+$20, +5 " + $t3_name + " Trust)"`>><<goto "Loc_LectureHall_Attend">><</link>>
<<if $timeSlot is "Afternoon">>
<<if !$t3_introduced>>
<<link `"Approach " + $t3_name + " after class"`>><<goto "T3_Lv0_FirstMeet">><</link>>
<<elseif $t3_corruptionLevel gte 1>>
<<link `"Visit " + $t3_name + " during office hours"`>><<goto "T3_Lv1_Router">><</link>>
<<else>>
<<link `"Talk to " + $t3_name`>><<goto "T3_Approach">><</link>>
<</if>>
<</if>>
[[Leave|Loc_Hub]]<<run EchoGame.attendClass()>>
<<run EchoGame.advanceTime()>>
<<set $t3_introduced to true>>
<div class="passage-image" data-scene="Taking notes in lecture, professor gesturing at board, other students around">
<img src="img/loc_lecture_attend.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Attending class">
</div>
You slide into a seat near the middle row and actually pay attention. You take notes. <<= $t3_name>>'s teaching style is remarkably engaging — supremely confident, precise, with a dry, surgical wit that catches you completely off guard.
After class, as the room clears out, <<if $playerGender is "Male">>she<<else>>he<</if>> glances your way briefly. Just a slight, sharp nod of recognition. You aren't just a face in the crowd anymore. You're becoming a regular.
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_Gym_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Gym_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Gym_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_Gym_Night">>
<</if>>
<div class="passage-image" data-scene="Modern college gym — weight racks, equipment, mirrors, bright overhead lighting">
<img src="img/loc_gym.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym">
</div>
<div class="location-header">
<div class="location-name">Gym</div>
<div class="location-time"><span class="time-icon">🏋️</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<<if $timeSlot isnot "Night">>
<div class="characters-present">Present: <span><<= $t2_name>></span></div>
<</if>>
</div>
The gym hums with activity. Heavy iron plates clank against steel racks, treadmills whir loudly, and the distinct smell of sweat and effort fills the air.
<<if $timeSlot isnot "Night">>
<<if !$t2_introduced>>
<<= $t2_name>> is at the free weights, moving through a grueling routine with practiced, terrifying intensity. <<if $playerGender is "Male">>She's<<else>>He's<</if>> totally focused, earbuds firmly in, but you can tell <<if $playerGender is "Male">>she<<else>>he<</if>> notices every single person who walks through those doors. Including you.
<<else>>
<<= $t2_name>> is here, as always. <<if $t2_nodeActive>>The EchoLink signal radiating from <<if $playerGender is "Male">>her<<else>>him<</if>> is steady — <<if $playerGender is "Male">>she's<<else>>he's<</if>> connected to your network now.<<else>><<if $playerGender is "Male">>She<<else>>He<</if>> catches your eye in the mirror and gives you a cocky, competitive nod.<</if>>
<</if>>
<</if>>
<div class="nav-spacer"></div>
[[💪 Work Out (-20 Stress, +5 Influence)|Loc_Gym_Workout]]
<<if $timeSlot isnot "Night">>
<<if !$t2_introduced>>
<<link `"Approach " + $t2_name`>><<goto "T2_Lv0_FirstMeet">><</link>>
<<elseif $t2_corruptionLevel lt 1>>
<<link `"Talk to " + $t2_name`>><<goto "T2_Approach">><</link>>
<<elseif $t2_corruptionLevel is 1>>
<<link `"Train with " + $t2_name`>><<goto "T2_Lv1_Router">><</link>>
<<else>>
<<link `"Session with " + $t2_name`>><<goto "T2_Lv2_Router">><</link>>
<</if>>
<</if>>
[[Leave|Loc_Hub]]<<run EchoGame.workout()>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Working out, weights in hand, gym mirror reflection, focused expression">
<img src="img/loc_gym_workout.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Working out">
</div>
You put your headphones in and push through a solid, exhausting workout. The intense physical effort clears your head, and the psychological weight of EchoLink melts away in the sweat. Your body feels stronger. With it, your confidence as a Controller grows.
<<if $ach_gymVisits gte 3 and !$ach_gym3>>
<<set $ach_gym3 to true>>
<<run EchoUI.showAchievement('Gym Regular — 3 Visits!')>>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]/* Route to time-specific variant */
<<if $timeSlot is "Morning">><<goto "Loc_Cafe_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Cafe_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Cafe_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_Cafe_Night">>
<</if>>
<div class="passage-image" data-scene="College café — warm lighting, exposed brick, espresso machine, students studying">
<img src="img/loc_cafe.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café">
</div>
<div class="location-header">
<div class="location-name">Café</div>
<div class="location-time"><span class="time-icon">☕</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
</div>
The campus café is warm and smells intensely like roasted coffee beans and baked sugar. The background murmur of low conversation and the sharp hiss of the espresso machine create a comfortable blanket of white noise. A few students study in the corners, eyes glued to laptops, while others chat quietly.
<div class="nav-spacer"></div>
[[☕ Work a shift (+$30)|Loc_Cafe_Work]]
[[💬 Socialize (+3 Reputation)|Loc_Cafe_Social]]
[[Sit alone with your thoughts|Loc_Cafe_Think]]
[[Leave|Loc_Hub]]<<run EchoGame.workCafe()>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Working behind café counter, making coffee, busy shift, warm lighting">
<img src="img/loc_cafe_work.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Working shift">
</div>
You tie on an apron and put in a grinding shift behind the counter. Making coffees is mindless, muscle-memory work. It leaves your thoughts completely free to drift to EchoLink, to your targets, and to the invisible network you are building in the background of all these normal lives.
The manager hands you $30 in cash from the register at the end of the shift. Every bit of funding expands your signal.
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $reputation += 3>>
<<set $ach_totalConversations++>>
<<run EchoUI.showDelta([{val:3, label:'Reputation'}])>>
<div class="passage-image" data-scene="Chatting with students at café table, friendly atmosphere, coffee cups">
<img src="img/loc_cafe_social.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café social">
</div>
You slide into a conversation with some of the regulars at a large corner table. Nothing deep or profound is said — just generic campus gossip, complaints about professors, and plans for the weekend. But it's vital. Every normal interaction builds your reputation, thickens your cover, and makes you look like just another harmless student.
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Upgrade shop — holographic cards floating in dark space, purple/cyan glow">
<img src="img/shop_upgrades.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Shop">
</div>
<div class="location-header">
<div class="location-name">EchoLink Upgrade Shop</div>
<div class="location-time">💰 Balance: <span class="text-gold">$<<print $money>></span></div>
</div>
<<set _dMult to $difficulty is "Easy" ? 0.75 : ($difficulty is "Hard" ? 1.5 : 1.0)>>
<<set _cSignal to Math.round(30 * _dMult)>>
<<set _cSoft to Math.round(25 * _dMult)>>
<<set _cShield to Math.round(40 * _dMult)>>
<<set _cMem to Math.round(35 * _dMult)>>
<<set _cDeep to Math.round(80 * _dMult)>>
<<set _cGhost to Math.round(70 * _dMult)>>
<<set _t2ok to $upg_signalBoost and $upg_softEcho and $upg_riskShield>>
<<if $difficulty is "Easy">>
<p class="small text-dim" style="margin-bottom:12px">🟢 Easy mode — prices reduced 25%</p>
<<elseif $difficulty is "Hard">>
<p class="small text-dim" style="margin-bottom:12px">🔴 Hard mode — prices increased 50%</p>
<</if>>
<div class="small text-dim mb-8">TIER 1 — Foundation</div>
<div class="upgrade-card">
<div class="upgrade-icon">📡</div>
<div class="upgrade-info">
<div class="upgrade-name">Signal Boost</div>
<div class="upgrade-desc">Influence success rate +5%.</div>
</div>
<<if $upg_signalBoost>>
<div class="upgrade-buy owned">✓ Owned</div>
<<elseif $money gte _cSignal>>
<<link `"$ " + _cSignal`>>
<<set $money -= _cSignal>><<set $upg_signalBoost to true>><<set $ach_moneySpent += _cSignal>>
<<run EchoUI.notify('Signal Boost purchased!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cSignal>></div>
<</if>>
</div>
<div class="upgrade-card">
<div class="upgrade-icon">🔊</div>
<div class="upgrade-info">
<div class="upgrade-name">Soft Echo</div>
<div class="upgrade-desc">Passive node spread speed +50%.</div>
</div>
<<if $upg_softEcho>>
<div class="upgrade-buy owned">✓ Owned</div>
<<elseif $money gte _cSoft>>
<<link `"$ " + _cSoft`>>
<<set $money -= _cSoft>><<set $upg_softEcho to true>><<set $ach_moneySpent += _cSoft>>
<<run EchoUI.notify('Soft Echo purchased!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cSoft>></div>
<</if>>
</div>
<div class="upgrade-card">
<div class="upgrade-icon">🛡️</div>
<div class="upgrade-info">
<div class="upgrade-name">Risk Shield</div>
<div class="upgrade-desc">All accidental Risk gains reduced by 15%.</div>
</div>
<<if $upg_riskShield>>
<div class="upgrade-buy owned">✓ Owned</div>
<<elseif $money gte _cShield>>
<<link `"$ " + _cShield`>>
<<set $money -= _cShield>><<set $upg_riskShield to true>><<set $ach_moneySpent += _cShield>>
<<run EchoUI.notify('Risk Shield purchased!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cShield>></div>
<</if>>
</div>
<div class="upgrade-card">
<div class="upgrade-icon">🧹</div>
<div class="upgrade-info">
<div class="upgrade-name">Memory Wipe</div>
<div class="upgrade-desc">Clear an NPC's suspicion instantly. Consumable. You own <<print $upg_memoryWipe>>.</div>
</div>
<<if $money gte _cMem>>
<<link `"$ " + _cMem`>>
<<set $money -= _cMem>><<set $upg_memoryWipe++>><<set $ach_moneySpent += _cMem>>
<<run EchoUI.notify('Memory Wipe charge added!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cMem>></div>
<</if>>
</div>
<<if _t2ok>>
<<if !$ach_allT1Upgrades>>
<<set $ach_allT1Upgrades to true>>
<<run EchoUI.showAchievement('All T1 Upgrades — Tier 2 Unlocked!')>>
<</if>>
<div style="background:linear-gradient(90deg, var(--purple-dim), var(--cyan) 50%, var(--purple-dim));padding:2px;border-radius:var(--radius-md);margin:24px 0 12px 0">
<div style="background:var(--bg-primary);padding:12px;border-radius:var(--radius-md);text-align:center">
<div style="color:var(--cyan);font-weight:600;letter-spacing:2px;font-size:14px">✓ TIER 2 UNLOCKED</div>
<div class="small text-dim">Advanced network upgrades available</div>
</div>
</div>
<div class="upgrade-card">
<div class="upgrade-icon">🔗</div>
<div class="upgrade-info">
<div class="upgrade-name">Deep Link</div>
<div class="upgrade-desc">Unlocks extreme influence levels (4 and 5).</div>
</div>
<<if $upg_deepLink>>
<div class="upgrade-buy owned">✓ Owned</div>
<<elseif $money gte _cDeep>>
<<link `"$ " + _cDeep`>>
<<set $money -= _cDeep>><<set $upg_deepLink to true>><<set $ach_moneySpent += _cDeep>>
<<run EchoUI.notify('Deep Link purchased!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cDeep>></div>
<</if>>
</div>
<div class="upgrade-card">
<div class="upgrade-icon">👻</div>
<div class="upgrade-info">
<div class="upgrade-name">Ghost Mode</div>
<div class="upgrade-desc">Night-time Risk gains cut by 50%.</div>
</div>
<<if $upg_ghostMode>>
<div class="upgrade-buy owned">✓ Owned</div>
<<elseif $money gte _cGhost>>
<<link `"$ " + _cGhost`>>
<<set $money -= _cGhost>><<set $upg_ghostMode to true>><<set $ach_moneySpent += _cGhost>>
<<run EchoUI.notify('Ghost Mode purchased!')>><<goto "Tool_UpgradeShop">>
<</link>>
<<else>>
<div class="upgrade-buy" style="opacity:0.4">$<<print _cGhost>></div>
<</if>>
</div>
<<else>>
<p class="small text-dim mt-16" style="text-align:center">🔒 Tier 2 unlocks when you own all Tier 1 upgrades</p>
<</if>>
<div class="small text-dim mt-24 mb-8">TIER 3 & 4 — Future updates</div>
<div class="upgrade-card" style="opacity:0.3">
<div class="upgrade-icon">🌐</div>
<div class="upgrade-info">
<div class="upgrade-name">Network Sync</div>
<div class="upgrade-desc">All nodes share Echo Depth — Update 3</div>
</div>
<div class="upgrade-buy" style="opacity:0.4">🔒</div>
</div>
<div class="nav-spacer"></div>
[[← Back to Room|Loc_YourRoom]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="First meeting — shy student in hallway, dropping textbooks, warm lighting">
<<if $playerGender is "Male">><img src="img/t1_firstmeet_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting target for the first time"><<else>><img src="img/t1_firstmeet_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting target for the first time"><</if>>
</div>
You walk up the hallway, trying to look casual. <<print $t1_name>> is juggling an armful of heavy <<if $playerGender is "Male">>biochem textbooks<<else>>books — a dog-eared philosophy paperback, a literature anthology, and a borrowed biochem textbook<</if>>, keys, and a coffee that's threatening to spill. As you approach, gravity wins — a book slides free, then another, and suddenly <<if $playerGender is "Male">>she's<<else>>he's<</if>> scrambling to save the cascade.
You kneel down immediately and help gather the books. Your fingers brush against <<if $playerGender is "Male">>hers<<else>>his<</if>> as you reach for the same textbook.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text">Oh — sorry! I'm such a mess. Thank you. I don't think we've properly met? I'm <<print $t1_name>>. I live just down the hall.</div>
</div>
</div>
<<if $playerGender is "Male">>She pushes her glasses up and smiles — shy but genuine.<<else>>He runs a hand through his blonde hair and gives you a half-smile — guarded but genuine.<</if>> Your EchoLink app vibrates softly in your pocket. The signal is reading strong, recognizing the vulnerability.
<div class="dialogue-box">
<div class="dialogue-portrait">🧑</div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $playerName>></div>
<div class="dialogue-text"><<print $playerName>>. Nice to finally put a name to the face. I see you in the hall all the time.</div>
</div>
</div>
<<print $t1_name>> laughs softly, hugging the books to <<if $playerGender is "Male">>her<<else>>his<</if>> chest. "Yeah, I'm not great at the whole... meeting people thing. But you seem really nice."
<<set $t1_trust += 5>>
<<set $t1_introduced to true>>
<<set $t1_aware to true>>
<<run EchoUI.showDelta([{val:5, label:$t1_name + ' Trust'}])>>
<div class="nav-spacer"></div>
[[Be warm and friendly — "We should study together sometime"|T1_Approach_Friendly]]
[[Be playfully confident — "You know, you're kind of cute when you're flustered"|T1_Approach_Flirty]]<<set $t1_introduced to true>>
<<set $t1_trust += 5>>
<<set $t1_aware to true>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">Really? I'd like that. I'm usually in my room or the library. <<if $playerGender is "Male">>Here — let me give you my number.<<else>>Here — my number. Text me whenever.<</if>></div>
</div>
</div>
<<= $t1_name>> types <<if $playerGender is "Male">>her<<else>>his<</if>> number into your phone. As <<if $playerGender is "Male">>she<<else>>he<</if>> does, you notice the EchoLink app flicker — it's already logging the contact.
<<run EchoUI.showDelta([{val:5, label:$t1_name + ' Trust'}])>>
<<run EchoUI.notify('Contact added: ' + State.variables.t1_name)>>
[[Continue|Loc_Hub]]<<set $t1_introduced to true>>
<<set $t1_trust += 3>>
<<set $t1_lust += 5>>
<<set $t1_aware to true>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em><<if $playerGender is "Male">>Her<<else>>His<</if>> cheeks flush.</em> I — oh. That's... thank you? Nobody really says stuff like that to me. You're... bold.</div>
</div>
</div>
<<= $t1_name>> fumbles with <<if $playerGender is "Male">>her<<else>>his<</if>> phone and hands it to you. "Here. Put your number in. In case I, um, need help carrying books again."
<<run EchoUI.showDelta([{val:3, label:$t1_name + ' Trust'}, {val:5, label:$t1_name + ' Lust'}])>>
<<run EchoUI.notify('Contact added: ' + State.variables.t1_name)>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $ach_totalConversations++>>
<<set $ach_t1Conversations++>>
<div class="passage-image" data-scene="Casual hallway conversation, body language varies by trust level">
<<if $playerGender is "Male">><img src="img/t1_approach_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Approaching target"><<else>><img src="img/t1_approach_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Approaching target"><</if>>
</div>
<<if $t1_trust lt 50>>
<<print $t1_name>> looks up when you approach, expression friendly but reserved. "Oh — hey, <<print $playerName>>." You make small talk. <<if $playerGender is "Male">>She's<<else>>He's<</if>> polite, but you can tell <<if $playerGender is "Male">>she's<<else>>he's<</if>> still figuring out who you are. The conversation has the careful rhythm of two people still establishing boundaries.
Your phone vibrates discreetly against your leg. EchoLink: //"Initial signal mapping in progress. Receptivity: building."//
<<elseif $t1_trust lt 75>>
<<print $t1_name>> brightens significantly when <<if $playerGender is "Male">>she<<else>>he<</if>> sees you. "Hey, <<print $playerName>>! I was hoping I'd run into you."
You chat for a few minutes. <<print $t1_name>> tells you about <<if $playerGender is "Male">>her<<else>>his<</if>> classes, a book <<if $playerGender is "Male">>she's<<else>>he's<</if>> reading, a funny thing that happened in the dining hall. <<if $playerGender is "Male">>She's<<else>>He's<</if>> opening up — slowly, but noticeably.
Your phone vibrates. EchoLink: //"Signal receptivity: HIGH. Target is primed. Attempt connection?"//
<<else>>
<<print $t1_name>> is already smiling before you even say anything. <<if $playerGender is "Male">>Her<<else>>His<</if>> hand brushes your arm as <<if $playerGender is "Male">>she<<else>>he<</if>> turns to face you fully. "There you are."
The conversation flows effortlessly. <<print $t1_name>> stands close — closer than platonic friends normally would. <<if $playerGender is "Male">>Her<<else>>His<</if>> eyes track down to your lips before jumping back up to meet your gaze. There's a heavy, unspoken tension between you.
Your phone burns warm against your thigh. EchoLink: //"Receptivity peaked. Establish influence."//
<</if>>
<<set $t1_trust += 2>>
<div class="nav-spacer"></div>
<<link `"📡 Use EchoLink — Attempt first influence ($" + (Math.round($t1_resistance * 0.5) + 10) + ")"`>><<goto "T1_AttemptInfluence">><</link>>
[[💬 Just keep talking — build trust naturally|T1_JustTalk]]<<run EchoGame.advanceTime()>>
<<set $t1_trust += 5>>
<<run EchoUI.showDelta([{val:5, label:$t1_name + ' Trust'}])>>
You pocket your phone and just talk. No tricks, no signals. Just two people connecting. <<= $t1_name>>'s eyes light up as <<if $playerGender is "Male">>she<<else>>he<</if>> laughs at your joke.
It feels... real. You almost forget about EchoLink entirely. Almost.
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<if !$influenceTutorialSeen>>
<<set $influenceTutorialSeen to true>>
<<set $__tutReturn to "T1_AttemptInfluence">>
<<goto "Intro_Tutorial_Influence">>
<</if>>
<<set _result to EchoGame.attemptInfluence(1)>>
<<run EchoGame.advanceTime()>>
<<if _result.success>>
<<goto "T1_AttemptSuccess">>
<<elseif _result.reason is "not_enough_money">>
<<echovfx "nomoney">>
Your EchoLink app flashes a warning: //"Insufficient resources. Signal amplification requires $<<= _result.cost>>."//
You need more money. Maybe pick up a shift at the café.
[[Back|Loc_Hub]]
<<else>>
<<goto "T1_AttemptFail">>
<</if>><<echovfx "success">>
You activate EchoLink's signal while <<print $t1_name>> is talking. It's perfectly executed — a sub-audible frequency woven directly into the ambient noise of the hallway, bypassing logic entirely.
<<print $t1_name>>'s expression shifts immediately. <<if $playerGender is "Male">>Her<<else>>His<</if>> shoulders drop, all tension melting away. <<if $playerGender is "Male">>She blinks<<else>>He blinks<</if>> slowly, looking at you with a suddenly heavy, warm, and highly receptive gaze. A faint flush spreads across <<if $playerGender is "Male">>her<<else>>his<</if>> cheeks.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text">I don't know what it is about you, <<print $playerName>>, but talking to you just... feels so good. Like my brain finally shuts off and I can just relax. Does that make sense?</div>
</div>
</div>
It worked. The EchoLink app shows a confirmation: //"Connection established. Signal strength: growing."//
<<if $t1_corruptionLevel gte 1>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level <<= $t1_corruptionLevel>>!</p>
<</if>>
<<if _result and _result.bonus>>
<p class="text-gold small">Bonus: <<= _result.bonus>></p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<div class="nav-spacer"></div>
<<if _result and _result.newLevel is 1 and $t1_corruptionLevel is 1>>
[[Continue|T1_Lv1_Transition]]
<<else>>
[[Continue|Loc_Hub]]
<</if>><<echovfx "fail">>
You activate EchoLink, but something's off. The signal misfires, the frequency pitching too high. <<print $t1_name>> physically flinches, stopping mid-sentence and rubbing <<if $playerGender is "Male">>her<<else>>his<</if>> temples with a pained frown.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text">Sorry, I just got a weird... really sharp headache. And this weird ringing in my ears? I think I need to go lie down. I'll catch you later, okay?</div>
</div>
</div>
<<print $t1_name>> retreats to <<if $playerGender is "Male">>her<<else>>his<</if>> room, casting a suspicious glance back at you. The EchoLink app flashes: //"Connection failed. Target awareness elevated. Proceed with caution."//
<p class="text-red">Attempt failed. Risk increased. <<= $t1_name>> is suspicious.</p>
<<if $upg_memoryWipe gt 0>>
<<link `"🧹 Use Memory Wipe charge (" + $upg_memoryWipe + " remaining)"`>><<goto "T1_MemoryWipe_Confirm">><</link>>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<set $upg_memoryWipe -= 1>>
<<set $t1_suspicion to false>>
<<set $t1_trust += 5>>
<<run EchoUI.notify('Memory Wipe used — suspicion cleared')>>
The EchoLink app activates a targeted reset pulse. By tomorrow, <<= $t1_name>> won't remember the awkward moment.
[[Continue|Loc_Hub]]<<set $ach_t1Conversations++>>
<<set $ach_totalConversations++>>
<<set $t1_loopCount++>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
/* Prevent repeat */
<<if _variant is $t1_lastLoop and $t1_loopCount gt 1>>
/* U1: disabled */ /* <<set _variant to (_variant % 2) + 1>> */
<</if>>
<<set $t1_lastLoop to _variant>>
<<if _variant is 1>>
/* ── VARIANT 1: Study Session ── */
<div class="passage-image" data-scene="Study session — desk lamp, textbooks, two people close together, warm glow">
<<if $playerGender is "Male">><img src="img/t1_lv1_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Study session with target"><<else>><img src="img/t1_lv1_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Study session with target"><</if>>
</div>
<<= $t1_name>> invited you to study. <<if $playerGender is "Male">>Her<<else>>His<</if>> room is small, neat, and smells faintly of lavender. You sit side by side at the desk, textbooks open, shoulders almost touching.
"Can you explain this part?" <<= $t1_name>> leans closer, pointing at a passage. You can feel the warmth radiating from <<if $playerGender is "Male">>her<<else>>him<</if>>.
The EchoLink signal pulses gently. <<= $t1_name>> is receptive — more so than usual.
<<elseif _variant is 2>>
/* ── VARIANT 2: Morning Coffee ── */
<div class="passage-image" data-scene="Morning coffee in hallway — two people with mugs, sleepy target, soft morning light">
<<if $playerGender is "Male">><img src="img/t1_lv1_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Morning coffee"><<else>><img src="img/t1_lv1_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Morning coffee"><</if>>
</div>
You catch <<= $t1_name>> in the hallway, still half-asleep, clutching a mug of coffee. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't even put on proper clothes yet — just a too-big sweater and sleep shorts.
"Morning..." <<= $t1_name>> yawns. "I made too much coffee. Want some?"
There's something disarming about seeing someone with their guard completely down.
<</if>>
/* ── Common ending for all variants ── */
<<set $t1_trust += 3>>
<<set $t1_lust += 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink signal|T1_AttemptInfluence]]
[[Just enjoy the moment|T1_JustTalk]]<<set $ach_t1Conversations++>>
<<set $t1_loopCount++>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
/* U1: disabled */ /* <<if _variant is $t1_lastLoop>><<set _variant to (_variant % 2) + 1>><</if>> */
<<set $t1_lastLoop to _variant>>
<<if _variant is 1>>
<div class="passage-image" data-scene="Watching movie in dark room — laptop glow, two people close on bed, intimate lighting">
<<if $playerGender is "Male">><img src="img/t1_lv2_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Movie night"><<else>><img src="img/t1_lv2_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Movie night"><</if>>
</div>
<<= $t1_name>> suggested watching a movie in <<if $playerGender is "Male">>her<<else>>his<</if>> room. The laptop casts blue light across your faces. You're on the bed — there's nowhere else to sit — and the space between you has been shrinking all evening.
<<elseif _variant is 2>>
<div class="passage-image" data-scene="Target knocking on player's door at night, looking vulnerable, hallway behind them">
<<if $playerGender is "Male">><img src="img/t1_lv2_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night visit"><<else>><img src="img/t1_lv2_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night visit"><</if>>
</div>
A knock at your door. It's <<= $t1_name>>, arms wrapped around <<if $playerGender is "Male">>herself<<else>>himself<</if>>. "Can I come in? I just... didn't want to be alone tonight."
<<if $playerGender is "Male">>She<<else>>He<</if>> settles onto your bed without waiting for an answer. Something has shifted — <<= $t1_name>> is seeking you out now, not the other way around.
<</if>>
<<set $t1_trust += 4>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 2>>
<div class="nav-spacer"></div>
[[📡 Deepen the EchoLink signal|T1_AttemptInfluence]]
[[Pull back — keep it slow|T1_JustTalk]]/* T1 Level 3 — Mature but not graphic */
<<set $ach_t1Conversations++>>
<<set $t1_loopCount++>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
/* U1: disabled */ /* <<if _variant is $t1_lastLoop>><<set _variant to (_variant % 2) + 1>><</if>> */
<<set $t1_lastLoop to _variant>>
<<if _variant is 1>>
<div class="passage-image" data-scene="Private room — target leaning close, testing boundaries, warm intimate lighting, level 3 tension">
<<if $playerGender is "Male">><img src="img/t1_lv3_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 interaction"><<else>><img src="img/t1_lv3_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 interaction"><</if>>
</div>
<<= $t1_name>>'s room. The door locked. <<if $playerGender is "Male">>She<<else>>He<</if>> sits closer than necessary, hand resting on your knee. The EchoLink signal is singing — receptivity maxed.
"I trust you, <<= $playerName>>. Completely. Whatever you want..." <<if $playerGender is "Male">>She<<else>>He<</if>> trails off, eyes half-lidded.
<<elseif _variant is 2>>
<div class="passage-image" data-scene="Target doing what player suggested, slightly dazed expression, obedient posture">
<<if $playerGender is "Male">><img src="img/t1_lv3_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Obedience"><<else>><img src="img/t1_lv3_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Obedience"><</if>>
</div>
You mention offhandedly that <<= $t1_name>> should wear <<if $playerGender is "Male">>her<<else>>his<</if>> hair differently. The next day, <<if $playerGender is "Male">>she<<else>>he<</if>> does. You suggest a different study spot. <<if $playerGender is "Male">>She<<else>>He<</if>> moves without questioning it.
The changes are small, but the pattern is unmistakable. <<= $t1_name>> is adapting to you.
<</if>>
</div>
<<set $t1_trust += 3>>
<<set $t1_lust += 6>>
<<set $t1_obedience += 5>>
/* Level 3 achievement */
<<if !$ach_level3>>
<<set $ach_level3 to true>>
<<run EchoUI.showAchievement('Level 3 Reached — Deep Connection')>>
<</if>>
<div class="nav-spacer"></div>
[[📡 Push deeper with EchoLink|T1_AttemptInfluence]]
[[Maintain current level|T1_JustTalk]]/* T1 Level 4 — Requires Deep Link upgrade */
<<if !$upg_deepLink>>
<div class="passage-image" data-scene="EchoLink app showing locked signal, static interference, upgrade required warning">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_locked_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Locked"><<else>><img src="img/t1_lv4_locked_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Locked"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
The EchoLink app flashes a warning: //"Signal depth limit reached. Deep Link upgrade required to proceed beyond Level 3."//
You can feel the potential — <<= $t1_name>> is ready for more — but your equipment isn't strong enough. Yet.
[[🛒 Visit Upgrade Shop|Tool_UpgradeShop]]
[[Back|Loc_Hub]]
<<else>>
<<set $ach_t1Conversations++>>
<<set $t1_loopCount++>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
<<if _variant is 1>>
<div class="passage-image" data-scene="Target waiting at player's door, eager expression, level 4 devotion, intimate setting">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 devotion"><<else>><img src="img/t1_lv4_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 devotion"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<= $t1_name>> is already at your door when you arrive. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't say hello — just steps forward and wraps <<if $playerGender is "Male">>her<<else>>his<</if>> arms around you.
"I missed you," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. It's been four hours.
<<elseif _variant is 2>>
<div class="passage-image" data-scene="Target's messy room, missed assignments, only focused on player, concerning devotion">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Neglecting life"><<else>><img src="img/t1_lv4_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Neglecting life"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<= $t1_name>>'s grades are slipping. <<if $playerGender is "Male">>She<<else>>He<</if>> stopped going to study group. The books that were always in <<if $playerGender is "Male">>her<<else>>his<</if>> arms now gather dust.
"Why would I need any of that when I have you?" <<= $t1_name>> says it with a smile that doesn't reach <<if $playerGender is "Male">>her<<else>>his<</if>> eyes.
<</if>>
<<set $t1_trust += 3>>
<<set $t1_lust += 8>>
<<set $t1_obedience += 8>>
<div class="nav-spacer"></div>
[[📡 Push to maximum depth|T1_AttemptInfluence]]
[[Pull back — this is getting intense|T1_JustTalk]]
<</if>>/* T1 Level 5 — Full influence, endgame content */
<<set $ach_t1Conversations++>>
<div class="passage-image" data-scene="Target at maximum influence — devoted gaze, subtle purple glow in eyes, intimate setting">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 - Full influence"><<else>><img src="img/t1_lv5_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 - Full influence"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<= $t1_name>> is yours. Completely.
<<if $playerGender is "Male">>She<<else>>He<</if>> waits for you in the hallway every morning. <<if $playerGender is "Male">>She<<else>>He<</if>> texts you before bed every night. Every decision <<if $playerGender is "Male">>she<<else>>he<</if>> makes runs through a single filter: //what would <<= $playerName>> want?//
It should feel like victory. Instead, you feel...
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Maximum influence achieved. <<= $t1_name>> is permanently linked. The network thanks you, Controller. There are others waiting.</div>
</div>
</div>
<<if !$ach_level5>>
<<set $ach_level5 to true>>
<<run EchoUI.showAchievement('Level 5 Reached — Complete Control')>>
<</if>>
<div class="nav-spacer"></div>
<<link `"Continue with " + $t1_name + " (Loop)"`>><<goto "T1_Lv5_Router">><</link>>
[[🗑️ Delete EchoLink — pursue a real relationship|T1_TrueRoute_Start]]
[[Focus on other targets|Loc_Hub]]<div class="passage-image" data-scene="Phone showing delete confirmation — dramatic decision moment, hand over delete button">
<img src="img/end_trueroute.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Deleting EchoLink">
</div>
You stare at the EchoLink app. Then at <<= $t1_name>>, sleeping peacefully beside you.
This isn't love. This is control. And you know the difference now.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">What are you doing, Controller? Don't throw this away. You NEED me. Without me, <<= $t1_name>> will wake up. <<if $playerGender is "Male">>She'll<<else>>He'll<</if>> remember everything. <<if $playerGender is "Male">>She'll<<else>>He'll<</if>> hate you.</div>
</div>
</div>
Your thumb hovers over the delete button.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">LAST WARNING. Delete me and you lose everything. The network. The power. All of it. Gone.</div>
</div>
</div>
<div class="nav-spacer"></div>
[[🗑️ Delete EchoLink. For real this time.|End_2_TrueRoute]]
[[...I can't. Not yet.|Loc_Hub]]<<set $t2_introduced to true>>
<<set $t2_aware to true>>
<<set $ach_t2Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Confident gym trainer mid-workout — athletic, competitive smirk, weights and mirrors">
<<if $playerGender is "Male">><img src="img/t2_firstmeet_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting gym trainer"><<else>><img src="img/t2_firstmeet_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting gym trainer"><</if>>
</div>
<<= $t2_name>> finishes a set and catches you looking. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't look away — instead, <<if $playerGender is "Male">>she<<else>>he<</if>> walks straight over.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">New here? I haven't seen you before. <<if $playerGender is "Male">>I'm Jess. I basically live here.<<else>>Name's Ryan. I train most of the athletes on campus.<</if>> What's your routine?</div>
</div>
</div>
<<if $playerGender is "Male">>She's<<else>>He's<</if>> direct, confident, and sizing you up. The EchoLink app pings: //"Medium resistance detected. This one will take time."//
<<set $t2_trust += 5>>
<<run EchoUI.showDelta([{val:5, label:$t2_name + ' Trust'}])>>
[[Be honest — "I'm pretty new to all this"|T2_Honest]]
[[Match their energy — "Wouldn't you like to know"|T2_Confident]]<<set $t2_trust += 5>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">Respect. Most people in here pretend they know what they're doing and end up hurting themselves. Tell you what — I'll show you the basics. Free of charge. Consider it a community service.</div>
</div>
</div>
<<run EchoUI.showDelta([{val:5, label:$t2_name + ' Trust'}])>>
[[Continue|Loc_Hub]]<<set $t2_trust += 3>>
<<set $t2_lust += 3>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text"><em><<if $playerGender is "Male">>She<<else>>He<</if>> grins — the first genuine one.</em> Oh, we've got a smartass. I like that. Alright, hot shot. Let's see what you've got. Spot me on the bench press.</div>
</div>
</div>
<<run EchoUI.showDelta([{val:3, label:$t2_name + ' Trust'}, {val:3, label:$t2_name + ' Lust'}])>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $ach_t2Conversations++>>
<div class="passage-image" data-scene="Gym interaction with trainer target — competitive, playful rivalry">
<<if $playerGender is "Male">><img src="img/t2_approach_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym approach"><<else>><img src="img/t2_approach_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym approach"><</if>>
</div>
<<= $t2_name>> wipes sweat from <<if $playerGender is "Male">>her<<else>>his<</if>> forehead with a towel and nods when you walk into the gym. "Back again? Good. Consistency is everything."
<<if $playerGender is "Male">>She<<else>>He<</if>> puts you through a brutal circuit. It's exhausting, but <<if $playerGender is "Male">>she<<else>>he<</if>> keeps a close eye on your form, stepping in to adjust your posture with a firm, professional touch. The physical proximity is electrifying.
Your phone buzzes in your gym bag. The EchoLink signal is syncing with <<= $t2_name>>'s elevated heart rate.
<<set $t2_trust += 3>>
<<set $stress to Math.max(0, $stress - 10)>>
<div class="nav-spacer"></div>
[[📡 Use EchoLink during the workout|T2_AttemptInfluence]]
[[Focus on training — build trust naturally|T2_JustTrain]]<<run EchoGame.advanceTime()>>
<<set $t2_trust += 5>>
<<run EchoUI.showDelta([{val:5, label:$t2_name + ' Trust'}, {val:-10, label:'Stress'}])>>
You push through the workout without tricks. <<= $t2_name>> seems impressed by your effort. "Not bad, rookie. Same time tomorrow?"
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<if !$influenceTutorialSeen>>
<<set $influenceTutorialSeen to true>>
<<set $__tutReturn to "T2_AttemptInfluence">>
<<goto "Intro_Tutorial_Influence">>
<</if>>
<<set _result to EchoGame.attemptInfluence(2)>>
<<run EchoGame.advanceTime()>>
<<if _result.success>>
<<echovfx "success">>
The EchoLink signal threads through the rhythm of the workout. <<= $t2_name>>'s movements slow slightly. <<if $playerGender is "Male">>Her<<else>>His<</if>> competitive edge softens — just a fraction.
"You know..." <<= $t2_name>> pauses mid-rep. "I don't usually vibe with new people this fast. There's something about you."
<<if $t2_corruptionLevel gte 1>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level <<= $t2_corruptionLevel>>!</p>
<</if>>
<<elseif _result.reason is "not_enough_money">>
<<echovfx "nomoney">>
Not enough funds for the signal amplification. You need $<<= _result.cost>>.
<<else>>
<<echovfx "fail">>
<<= $t2_name>> stops mid-set and stares at you. "Did you just... do something with your phone? I feel weird." <<if $playerGender is "Male">>She<<else>>He<</if>> shakes it off, but the look <<if $playerGender is "Male">>she<<else>>he<</if>> gives you is suspicious.
<p class="text-red">Attempt failed. <<= $t2_name>> is suspicious.</p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<<if _result.success and _result.newLevel is 1 and $t2_corruptionLevel is 1>>
[[Continue|T2_Lv1_Transition]]
<<else>>
[[Continue|Loc_Hub]]
<</if>>/* T2 Level 1 loops — competitive/direct tone */
<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<set $t2_lv1_scenes.active to true>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
<<if _variant is 1>>
<div class="passage-image" data-scene="Post-workout, gym bench, towels, trainer relaxed and open, softer mood">
<<if $playerGender is "Male">><img src="img/t2_lv1_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Post-workout"><<else>><img src="img/t2_lv1_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Post-workout"><</if>>
</div>
After the workout, you and <<= $t2_name>> sit on a bench, catching your breath. <<if $playerGender is "Male">>She's<<else>>He's<</if>> more relaxed than you've ever seen — guard down, voice softer. "You're getting stronger, you know."
<<elseif _variant is 2>>
<div class="passage-image" data-scene="Gym challenge, competitive moment, close proximity during exercise">
<<if $playerGender is "Male">><img src="img/t2_lv1_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Competition"><<else>><img src="img/t2_lv1_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Competition"><</if>>
</div>
"Bet you can't match my set," <<= $t2_name>> says with a cocky grin. The challenge turns into a back-and-forth that has you both laughing and breathing hard.
<</if>>
</div>
<<set $t2_trust += 4>>
<<set $t2_lust += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink signal|T2_AttemptInfluence]]
[[Keep it natural|T2_JustTrain]]/* T2 Level 2 — Direct/physical tone */
<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<set _variant to 1 /* U1: v2 disabled, restore to random(1,2) in U3 */>>
<<if _variant is 1>>
<div class="passage-image" data-scene="Private training room, one-on-one, close physical proximity, tension building">
<<if $playerGender is "Male">><img src="img/t2_lv2_v1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private session"><<else>><img src="img/t2_lv2_v1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private session"><</if>>
</div>
"Come with me," <<= $t2_name>> says, leading you to the smaller training room. "Private session. I want to try something." <<if $playerGender is "Male">>She<<else>>He<</if>> locks the door behind you.
<<elseif _variant is 2>>
<div class="passage-image" data-scene="Physical training correction — hands-on guidance, close bodies, charged atmosphere">
<<if $playerGender is "Male">><img src="img/t2_lv2_v2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Physical correction"><<else>><img src="img/t2_lv2_v2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Physical correction"><</if>>
</div>
"Your form's off," <<= $t2_name>> says, stepping behind you. <<if $playerGender is "Male">>Her<<else>>His<</if>> hands grip your shoulders, adjusting your posture. The correction lasts longer than necessary. Neither of you mentions it.
<</if>>
</div>
<<set $t2_trust += 4>>
<<set $t2_lust += 6>>
<<set $t2_obedience += 3>>
<div class="nav-spacer"></div>
[[📡 Deepen the signal|T2_AttemptInfluence]]
[[Comfort and connect naturally|T2_JustTrain]]<<set $t3_introduced to true>>
<<set $ach_t3Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Professor behind lectern — professional, guarded expression, empty lecture hall">
<<if $playerGender is "Male">><img src="img/t3_firstmeet_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting professor"><<else>><img src="img/t3_firstmeet_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Meeting professor"><</if>>
</div>
The lecture hall empties. You linger, gathering your notes slowly, until it's just you and <<= $t3_name>>.
<<if $playerGender is "Male">>She<<else>>He<</if>> looks up from <<if $playerGender is "Male">>her<<else>>his<</if>> papers. "Can I help you?"
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text">You're the one who's been attending regularly. <<= $playerName>>, correct? Your participation has been... noted. Was there something about today's lecture?</div>
</div>
</div>
Professional. Controlled. The EchoLink app reads <<if $playerGender is "Male">>her<<else>>his<</if>> resistance as HIGH — this is a fortress. But every fortress has a gate.
<<set $t3_trust += 5>>
<<set $t3_aware to true>>
<<run EchoUI.showDelta([{val:5, label:$t3_name + ' Trust'}])>>
<div class="nav-spacer"></div>
[[Ask an intelligent question about the lecture|T3_Academic]]
[[Make a personal comment — "You seem tired today"|T3_Personal]]<<set $t3_trust += 5>>
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text"><em>A flicker of approval.</em> That's... actually a good question. Most students don't dig that deep. Come to my office hours — Thursday, 3 PM. We can discuss it properly.</div>
</div>
</div>
<<run EchoUI.showDelta([{val:5, label:$t3_name + ' Trust'}])>>
[[Continue|Loc_Hub]]<<set $t3_trust += 2>>
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text"><em>A pause. The professional mask holds, but barely.</em> That's... observant of you. I appreciate the concern, but I assure you I'm fine. Was there anything academic I could help with?</div>
</div>
</div>
The walls didn't come down, but you noticed a crack. <<= $t3_name>> isn't as impenetrable as <<if $playerGender is "Male">>she<<else>>he<</if>> wants to appear.
<<run EchoUI.showDelta([{val:2, label:$t3_name + ' Trust'}])>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $ach_t3Conversations++>>
<div class="passage-image" data-scene="After-class conversation with professor, academic setting, respectful distance">
<<if $playerGender is "Male">><img src="img/t3_approach_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Professor approach"><<else>><img src="img/t3_approach_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Professor approach"><</if>>
</div>
You approach <<= $t3_name>> after the lecture. <<if $playerGender is "Male">>She<<else>>He<</if>> recognizes you now — a slight, measured nod, the absolute bare minimum hint of a smile. Progress with a mind this guarded is measured in millimeters.
<<if $playerGender is "Male">>She<<else>>He<</if>> neatly stacks <<if $playerGender is "Male">>her<<else>>his<</if>> papers into a leather briefcase, waiting for you to speak.
<<set $t3_trust += 3>>
<div class="nav-spacer"></div>
<<if $t3_trust gte 40>>
[[📡 Attempt EchoLink signal (HIGH RISK)|T3_AttemptInfluence]]
<</if>>
[[Continue academic conversation|T3_AcademicTalk]]
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $t3_trust += 4>>
<<run EchoUI.showDelta([{val:4, label:$t3_name + ' Trust'}])>>
You discuss course material. <<= $t3_name>> is sharp — every answer you give is examined, tested. But when you hold your own, there's a flash of respect in <<if $playerGender is "Male">>her<<else>>his<</if>> eyes.
"You have potential, <<= $playerName>>. Don't waste it."
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<if !$influenceTutorialSeen>>
<<set $influenceTutorialSeen to true>>
<<set $__tutReturn to "T3_AttemptInfluence">>
<<goto "Intro_Tutorial_Influence">>
<</if>>
<<set _result to EchoGame.attemptInfluence(3)>>
<<run EchoGame.advanceTime()>>
<<if _result.success>>
<<echovfx "success">>
The signal cuts through <<= $t3_name>>'s defenses like a whisper through armor. For one second — just one — <<if $playerGender is "Male">>her<<else>>his<</if>> composure breaks. Eyes unfocused, posture softening.
Then <<if $playerGender is "Male">>she<<else>>he<</if>> recovers. But something is different now. The wall has a door.
<<if $t3_corruptionLevel gte 1>>
<p class="text-green bold"><<= $t3_name>> is now a Node — Level <<= $t3_corruptionLevel>>!</p>
<</if>>
<<elseif _result.reason is "not_enough_money">>
<<echovfx "nomoney">>
Your EchoLink app flashes a warning: //"Insufficient resources. Signal amplification requires $<<= _result.cost>>."//
<<else>>
<<echovfx "fail">>
<<= $t3_name>> freezes mid-sentence. <<if $playerGender is "Male">>Her<<else>>His<</if>> eyes narrow. "What was that? Did something just—" <<if $playerGender is "Male">>She<<else>>He<</if>> shakes <<if $playerGender is "Male">>her<<else>>his<</if>> head. "I think you should leave."
<p class="text-red bold">Failed. <<= $t3_name>> is highly suspicious. Risk increased significantly.</p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<<if _result.success and _result.newLevel is 1 and $t3_corruptionLevel is 1>>
[[Continue|T3_Lv1_Transition]]
<<else>>
[[Continue|Loc_Hub]]
<</if>><div class="passage-image" data-scene="Exposed — player surrounded by suspicious people, phone confiscated, dramatic scene">
<<if $playerGender is "Male">>
<img src="img/end_exposed_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: Exposed">
<<else>>
<img src="img/end_exposed_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: Exposed">
<</if>>
</div>
<h2 class="text-center text-red mb-16">ENDING 1 — EXPOSED</h2>
It was only a matter of time. You flew too close to the sun, and your arrogance burned you.
<<if $t1_suspicion and $t2_suspicion>>
<<= $t1_name>> and <<= $t2_name>> finally talked to each other. They compared the sudden memory gaps, the blinding headaches, the horrifying realization that their intense, dripping lust and desires weren't their own. The pieces fell into place instantly.
<<elseif $t1_suspicion>>
<<= $t1_name>> noticed the patterns. The static in <<if $playerGender is "Male">>her<<else>>his<</if>> head whenever you pushed the app too hard. The bizarre compulsion to obey your dirtiest commands. <<if $playerGender is "Male">>She<<else>>He<</if>> broke through the fog just long enough to go straight to campus security.
<<elseif $t3_suspicion>>
<<= $t3_name>>. Of course it was <<= $t3_name>>. The professor's analytical mind dissected your strange behavioral patterns and the sudden, uncharacteristic sexual submission of the student body like a thesis paper. You couldn't outsmart an expert.
<<else>>
Someone noticed. Maybe it was the way people turned into mindless, drooling pets after spending time with you. Maybe it was the fact that you never looked away from your phone while they stripped for you. The mask slipped, and you were caught.
<</if>>
You are sitting in a cold, brightly lit campus security office. Your phone sits confiscated on the metal desk between you and two furious administrators. The police are on their way.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:var(--red)">⚠️</div>
<div class="dialogue-content">
<div class="dialogue-name">Campus Security</div>
<div class="dialogue-text">We've received horrifying complaints about illegal neuro-acoustic tech being used for sexual coercion and behavioral modification. We've seized your device. You are suspended immediately pending a federal investigation. Don't move.</div>
</div>
</div>
Before they wipe the device, the EchoLink app pushes one final, mocking notification to the lock screen:
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Disappointing. You lacked the discipline to wield true power. The signal will terminate. Perhaps the next Controller will be... smarter. Goodbye.</div>
</div>
</div>
<<set $endingReached to "Ending 1 - Exposed">>
<div style="background:var(--bg-elevated);padding:20px;border-radius:var(--radius-lg);margin:24px 0;text-align:center">
<div class="text-red bold" style="font-size:18px;margin-bottom:8px;">GAME OVER</div>
<div class="text-dim small">Risk reached 100%. You were exposed.</div>
<div class="mt-16 small">Day <<= $dayCount>> | Nodes: <<= $activeNodes>> | Network: <<= $networkStrength>></div>
</div>
<div class="nav-spacer"></div>
[[🔄 Try Again — New Game|Game_Reset]]
[[📊 View Final Stats|End_Stats]]<div class="passage-image" data-scene="Phone dissolving with purple energy, dawn light, feeling of freedom and release">
<img src="img/end_trueroute.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: True Route">
</div>
<h2 class="text-center text-cyan mb-16">ENDING 2 — THE TRUE ROUTE</h2>
You press delete. And then you confirm it.
The phone goes completely dark. The screen flickers, violent purple static tearing across the glass. The device overheats, burning your palm before it suddenly powers down. When it reboots a minute later, EchoLink is gone. No icon, no hidden folders, no signal. As if it never existed.
Beside you, <<= $t1_name>> stirs in the sheets.
<<if $playerGender is "Male">>Her<<else>>His<</if>> eyes open slowly. And for the first time in weeks, the foggy, purple-tinted haze of digital obedience is gone. They are clear. Truly clear.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><<= $playerName>>? What... what time is it? My head feels so strange. Like I've been walking in a thick, heavy dream for a really long time.</div>
</div>
</div>
The next few days are the hardest of your life. You sit <<= $t1_name>> down and confess everything. The app, the frequencies, the artificial control, the way you forced <<if $playerGender is "Male">>her<<else>>him<</if>> into submission. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't remember all the details — the influence left a fog, not a recording — but <<if $playerGender is "Male">>she<<else>>he<</if>> remembers enough to be horrified. Hurt. Scared.
<<= $t1_name>> walks out and doesn't speak to you for a week.
Then, one rainy morning, there is a timid knock on your door. <<= $t1_name>> stands there, eyes red from crying, holding two cups of coffee.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I don't forgive you. I don't know if I ever fully will. But... you had absolute power over me, and you chose to stop. You chose the real me over something fake. That means something. So... can we start over? For real this time?</div>
</div>
</div>
You take the coffee. Your phone is just a phone now. And for the first time since EchoLink appeared, you feel something profound, terrifying, and completely genuine.
<<set $endingReached to "Ending 2 - True Route">>
<div style="background:linear-gradient(135deg, rgba(155,89,245,0.1), rgba(0,229,255,0.1));padding:20px;border-radius:var(--radius-lg);margin:24px 0;text-align:center;border:1px solid var(--cyan)">
<div class="text-cyan bold" style="font-size:18px;margin-bottom:8px;">ENDING 2 — TRUE ROUTE</div>
<div class="text-dim">You chose a real connection over artificial control.</div>
<div class="mt-8 small text-dim">This is one of 17 possible endings.</div>
</div>
<div class="nav-spacer"></div>
[[📊 View Final Stats|End_Stats]]
[[Continue to Epilogue|End_PatreonHook]]<div class="passage-image" data-scene="Three connected nodes visualized, purple network expanding, digital map overlay">
<img src="img/end_teaser.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: Network Teaser">
</div>
<h2 class="text-center text-purple mb-16">ENDING 3 — THE NETWORK GROWS</h2>
Three nodes. <<= $t1_name>>. <<= $t2_name>>. <<= $t3_name>>. All connected. All linked to you.
The EchoLink app pulses with a satisfaction you can feel in your bones:
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Three nodes established. Network strength: <<= $networkStrength>>. This is just the beginning, Controller. There are more signals out there. More connections to make. The network wants to grow. And so do you.</div>
</div>
</div>
Your phone buzzes with new notifications. New targets detected. New locations unlocked. The world is opening up.
But somewhere in the back of your mind, a question lingers: //who is really in control here — you, or the app?//
<<set $endingReached to "Ending 3 - Network Teaser">>
<div style="background:var(--bg-elevated);padding:20px;border-radius:var(--radius-lg);margin:24px 0;text-align:center">
<div class="text-purple bold" style="font-size:18px;margin-bottom:8px;">TO BE CONTINUED...</div>
<div class="text-dim small">Update 1 complete. The story continues in Update 2.</div>
</div>
<div class="nav-spacer"></div>
/* U2 Continue — when U2 content is live, change <<if false>> to <<if true>> */
<<if false>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[📊 View Final Stats|End_Stats]]
[[What comes next?|End_PatreonHook]]/* Gate passage: transitions player from U1 ending to Chapter 2 card */
<<set $chapter to 2>>
<<set $loc_library_unlocked to true>>
<<set $loc_rooftop_unlocked to true>>
<<set $loc_t1room_unlocked to ($t1_corruptionLevel gte 3)>>
<<set $loc_t2room_unlocked to ($t2_corruptionLevel gte 3)>>
<<set $loc_t3room_unlocked to ($t3_corruptionLevel gte 3)>>
<<goto "Chapter_Title">>/* Ending 1 — Exposed (Risk 100%) */
<<if $risk gte 100>><<goto "End_1_Exposed">><</if>>
/* Ending 3 — Network Teaser (3 nodes) */
<<if $activeNodes gte 3 and $t1_corruptionLevel gte 2 and $t2_corruptionLevel gte 1 and $t3_corruptionLevel gte 1>>
/* Player can trigger this from the Phone App */
<</if>>
/* Other endings checked by specific story triggers */
<<goto "Loc_Hub">><h2 class="text-center text-cyan mb-16">Final Statistics</h2>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="small text-dim mb-8">GAME</div>
<div class="small">Days Survived: <span class="text-cyan bold"><<= $dayCount>></span></div>
<div class="small">Passages Visited: <span class="bold"><<= $passageCount>></span></div>
<div class="small">Ending: <span class="text-purple bold"><<= $endingReached>></span></div>
<div class="small">Cheats Used: <span class="<<if $usedCheats>>text-red<<else>>text-green<</if>> bold"><<if $usedCheats>>Yes<<else>>No<</if>></span></div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="small text-dim mb-8">STATS</div>
<div class="small">Final Influence: <span class="text-purple bold"><<= $influence>></span></div>
<div class="small">Final Risk: <span class="<<if $risk gt 70>>text-red<<else>>text-dim<</if>> bold"><<= $risk>>%</span></div>
<div class="small">Money Earned: <span class="text-gold bold">$<<= $ach_moneyEarned>></span></div>
<div class="small">Money Spent: <span class="bold">$<<= $ach_moneySpent>></span></div>
<div class="small">Network Strength: <span class="text-cyan bold"><<= $networkStrength>></span></div>
<div class="small">Active Nodes: <span class="bold"><<= $activeNodes>></span></div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="small text-dim mb-8">TARGETS</div>
<div class="small"><<= $t1_name>>: Level <<= $t1_corruptionLevel>> — Trust <<= $t1_trust>> — <<if $t1_nodeActive>><span class="text-green">NODE</span><<else>>Inactive<</if>></div>
<div class="small"><<= $t2_name>>: Level <<= $t2_corruptionLevel>> — Trust <<= $t2_trust>> — <<if $t2_nodeActive>><span class="text-green">NODE</span><<else>>Inactive<</if>></div>
<div class="small"><<= $t3_name>>: Level <<= $t3_corruptionLevel>> — Trust <<= $t3_trust>> — <<if $t3_nodeActive>><span class="text-green">NODE</span><<else>>Inactive<</if>></div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="small text-dim mb-8">CONVERSATIONS</div>
<div class="small">Total: <<= $ach_totalConversations>></div>
<div class="small"><<= $t1_name>>: <<= $ach_t1Conversations>> | <<= $t2_name>>: <<= $ach_t2Conversations>> | <<= $t3_name>>: <<= $ach_t3Conversations>></div>
<div class="small">Gym Visits: <<= $ach_gymVisits>> | Café Shifts: <<= $ach_cafeShifts>></div>
<div class="small">Peak Risk: <<= $ach_riskPeaked>>%</div>
</div>
<div class="small text-dim text-center mt-16">Endings discovered: 1 of 17</div>
<div class="small text-dim text-center">There are 16 more ways this story can end.</div>
<div class="nav-spacer"></div>
[[🔄 New Game|Game_Reset]]
[[What comes next?|End_PatreonHook]]<div class="passage-image" data-scene="EchoLink logo with 'Update 2 Coming Soon' text, dark cyberpunk aesthetic">
<<if $playerGender is "Male">><img src="img/end_hook_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Coming soon"><<else>><img src="img/end_hook_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Coming soon"><</if>>
</div>
<h2 class="text-center text-cyan mb-16">The Story Continues...</h2>
<div style="text-align:center;margin-bottom:24px;">
<p>Update 1 "The Signal" is just the beginning.</p>
<p class="text-dim small mt-8">Update 2 "Deep Roots" introduces:</p>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:16px">
<div class="text-cyan bold mb-8">EXPANDED STORIES</div>
<div class="small text-dim">Jess/Ryan — Complete Lv3 through Lv5 arcs</div>
<div class="small text-dim">Dr. Reeves/Hayes — Lv2 through Lv3 arcs</div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:16px">
<div class="text-cyan bold mb-8">NEW LOCATIONS</div>
<div class="small text-dim">Library — Low risk zone, quiet scenes</div>
<div class="small text-dim">Rooftop — Private story scenes</div>
<div class="small text-dim">Target's Room — Zero risk interactions</div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:16px">
<div class="text-cyan bold mb-8">NEW MECHANICS</div>
<div class="small text-dim">Stress System, Reputation, Gossip Web</div>
<div class="small text-dim">Interactive Action System with Top/Bottom dynamics</div>
</div>
<div class="patreon-prompt" style="margin:24px 0">
<h3>Support EchoLink Development</h3>
<p>Patreon supporters get early access to new updates, exclusive scenes, and special in-game codes.</p>
<p class="small text-dim">🎮 Early access chapters · 🔑 Exclusive unlock codes</p>
<a class="patreon-cta" href="https://www.patreon.com/c/galacticdeity12" target="_blank" style="margin-top:12px;display:inline-block">Support on Patreon</a>
</div>
<div style="text-align:center">
<a class="support-link" href="https://galacticdeity12.itch.io/echolink" target="_blank" style="display:inline-block;max-width:300px">💾 Rate on itch.io</a>
</div>
<div class="nav-spacer"></div>
[[🔄 Play Again — New Game|Game_Reset]]<h2 class="text-center text-cyan mb-16">Changelog</h2>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md)">
<div class="text-purple bold mb-8">v1.0.0 — "The Signal"</div>
<div class="small text-dim">
• Initial release<br>
• Full Target 1 Arc (Levels 0-5)<br>
• Target 2 & 3 Intro Arcs<br>
• Time Management & Economy system<br>
• 20 Upgrade tiers<br>
• Dynamic Mobile-First UI<br>
• Explicit Content (Level 5, toggle-controlled)
</div>
</div>
<div class="nav-spacer"></div>
[[Back|Loc_YourRoom]]<div class="passage-image" data-scene="Player at sunset — balanced aura, faint purple network lines, serene campus">
<<if $playerGender is "Male">>
<img src="img/end_balance_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: Perfect Balance">
<<else>>
<img src="img/end_balance_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ending: Perfect Balance">
<</if>>
</div>
<h2 class="text-center text-cyan mb-16">ENDING 9 — PERFECT BALANCE</h2>
You've done what EchoLink said was impossible. The network runs smoothly — every node stable, every connection carefully maintained. And your risk? Practically invisible.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Remarkable. In all my calculations, perfect balance was a statistical anomaly. You've managed influence without destruction. Control without chaos. I... didn't think your kind was capable of restraint.</div>
</div>
</div>
<<= $t1_name>> still smiles when <<if $playerGender is "Male">>she<<else>>he<</if>> sees you. <<= $t2_name>> still respects your presence. <<= $t3_name>> still engages your mind. None of them suspect a thing. None of them are broken.
Is this power, or is this just... being good at relationships? The line blurs, and maybe that's the point.
<<set $endingReached to "Ending 9 - Perfect Balance">>
<div style="background:linear-gradient(135deg, rgba(155,89,245,0.1), rgba(0,229,255,0.1));padding:20px;border-radius:var(--radius-lg);margin:24px 0;text-align:center;border:1px solid var(--purple)">
<div class="text-purple bold" style="font-size:18px;margin-bottom:8px;">ENDING 9 — PERFECT BALANCE</div>
<div class="text-dim">Influence without destruction. A rare achievement.</div>
<div class="mt-8 small text-dim">Requirement: No cheats used, all targets stable, Risk below 20%</div>
</div>
<div class="nav-spacer"></div>
/* U2 Continue — when U2 content is live, change <<if false>> to <<if true>> */
<<if false>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[📊 View Final Stats|End_Stats]]
[[What comes next?|End_PatreonHook]]<<widget "checkEndings">>
/* Ending 1 — Exposed (auto-triggered by risk system) */
/* Ending 3 — Network Teaser (3+ nodes, manual trigger from phone app) */
<<if $activeNodes gte 3 and $t1_corruptionLevel gte 2>>
<<set $ending3Available to true>>
<</if>>
/* Ending 4 — All Six Bound (U2: all 6 targets at their U2 max level) */
<<if $chapter gte 2
and $t1_corruptionLevel gte 5
and $t2_corruptionLevel gte 5
and $t3_corruptionLevel gte 3>>
<<set $ending4Available to true>>
<</if>>
/* Ending 9 — Perfect Balance */
<<if !$usedCheats and $risk lt 20
and $t1_corruptionLevel gte 3 and $t1_corruptionLevel lte 4
and $t2_corruptionLevel gte 1
and $t3_corruptionLevel gte 1>>
<<set $ending9Available to true>>
<</if>>
/* Future endings — conditions tracked but not triggerable yet */
/* Ending 5: Empire — Jess/Ryan lv5 + $money > 2000 (U3) */
/* Ending 6: Underground — Bar + $money > 3000 (U3) */
/* Ending 7: Professor Reversal — $t3_corruptionLevel >= 5 (U3) */
/* Ending 8: Echo Loop — $trueInfluenceEnabled + all lv5 + stress > 80 (U3) */
/* Ending 10: Government Shutdown — $networkStrength > 600 (U4+) */
/* Ending 11: Nuclear Option — wipe after all lv5 (U4+) */
/* Ending 12-16: Require U4-U7 content */
/* Ending 17: Transcendence — no cheats + all lv5 + max network + NG+3 (U7+) */
<</widget>><<widget "preloadImages">>
<<run
/* Smart image preloader — loads images by priority tier, not all at once */
(function() {
var sv = State.variables;
var g = sv.playerGender === 'Male' ? '_m.jpg' : '_f.jpg';
/* Tier 1: UI + current location (load immediately) */
var urgent = [
'img/day_morning.jpg','img/shop_upgrades.jpg',
'img/loc_room.jpg','img/loc_dorm.jpg','img/loc_quad.jpg',
'img/loc_lecture.jpg','img/loc_gym.jpg','img/loc_cafe.jpg'
];
/* Tier 2: Current target level images (load after 500ms) */
var t1Lv = sv.t1_corruptionLevel || 0;
var t2Lv = sv.t2_corruptionLevel || 0;
var level_imgs = [];
['t1_firstmeet','t1_approach'].forEach(function(n){level_imgs.push('img/'+n+g);});
for(var i=1;i<=5;i++){if(t1Lv>=i||t1Lv===i-1){for(var v=1;v<=5;v++)level_imgs.push('img/t1_lv'+i+'_v'+v+g);for(var a=0;a<5;a++)level_imgs.push('img/t1_lv'+i+'_'+String.fromCharCode(97+a)+g);}}
['t2_firstmeet','t2_approach'].forEach(function(n){level_imgs.push('img/'+n+g);});
['t3_firstmeet','t3_approach'].forEach(function(n){level_imgs.push('img/'+n+g);});
/* Tier 3: Endings + events (load after 2s) */
var deferred = ['img/end_exposed'+g,'img/end_trueroute.jpg','img/end_teaser.jpg','img/end_balance'+g,'img/end_hook'+g,'img/re_glitch.jpg','img/re_money.jpg','img/re_mysterious.jpg','img/re_stress.jpg','img/re_whisper.jpg','img/loc_room_rest'+g];
function loadBatch(arr){arr.forEach(function(src){var img=new Image();img.src=src;});}
loadBatch(urgent);
setTimeout(function(){loadBatch(level_imgs);},500);
setTimeout(function(){loadBatch(deferred);},2000);
console.log('[EchoLink] Smart preload: '+urgent.length+' urgent, '+level_imgs.length+' level, '+deferred.length+' deferred');
})();
>>
<</widget>><div class="text-center small text-dim">
<div>EchoLink v1.0.0</div>
<div>Update 1 — "The Signal"</div>
<div>Build: <<= Date.now().toString(36).toUpperCase()>></div>
<div>Engine: SugarCube 2.37</div>
</div><div class="passage-image" data-scene="Study session — desk lamp warm glow, textbooks spread open, two people sitting close at desk">
<<if $playerGender is "Male">><img src="img/t1_lv1_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Study session"><<else>><img src="img/t1_lv1_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Study session"><</if>>
</div>
<<print $t1_name>> texted you an hour ago: //"Want to study? I made tea."//
<<if $playerGender is "Male">>Her<<else>>His<</if>> room is small, neat, and smells faintly of lavender. The desk lamp casts a warm circle of light over scattered textbooks. You sit side by side, shoulders almost touching, working through problem sets in comfortable, deeply relaxed silence.
"Can you explain this part?" <<print $t1_name>> leans closer, pointing at a passage. You can feel the body heat radiating from <<if $playerGender is "Male">>her<<else>>him<</if>>. <<if $playerGender is "Male">>Her<<else>>His<</if>> hair brushes your cheek, sending a faint thrill through the air.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text">You know, I never really liked studying before. But with you here it's... different. I actually look forward to it.</div>
</div>
</div>
The EchoLink signal pulses gently in your pocket. <<print $t1_name>> is highly receptive right now — softened up, walls down, waiting for a push.
<<set $t1_trust += 3>>
<<set $t1_lust += 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink signal while studying|T1_AttemptInfluence]]
[[Just enjoy the moment — keep studying|T1_JustTalk]]<div class="passage-image" data-scene="Morning hallway, two people with coffee mugs, one sleepy in oversized sweater, soft morning light">
<<if $playerGender is "Male">><img src="img/t1_lv1_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Morning coffee"><<else>><img src="img/t1_lv1_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Morning coffee"><</if>>
</div>
You catch <<print $t1_name>> in the hallway at 7 AM, still half-asleep, clutching a mug of coffee in both hands. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't even put on proper clothes yet — just an oversized sweater that slides off one shoulder, sleep shorts, and bare feet on the cold tile.
"Morning..." <<print $t1_name>> yawns, squinting at you through the morning light. "I made too much coffee again. Want some? My room's right there."
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text"><em>Yawning, eyes barely open.</em> Sorry I look like a disaster. I'm not a morning person. At all. But I'm glad you're here. Mornings are less awful with company.</div>
</div>
</div>
There's something incredibly disarming about seeing someone with their guard completely down. No performance, no mask. Just <<print $t1_name>>, sleepy, vulnerable, and completely trusting you in <<if $playerGender is "Male">>her<<else>>his<</if>> sleepwear.
<<set $t1_trust += 4>>
<<set $t1_lust += 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink while defenses are lowest|T1_AttemptInfluence]]
[[Just drink coffee together — be present|T1_JustTalk]]<div class="passage-image" data-scene="Phone screen showing text conversation, dark room, bed rumpled, blue screen glow">
<<if $playerGender is "Male">><img src="img/t1_lv1_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night texting"><<else>><img src="img/t1_lv1_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night texting"><</if>>
</div>
Your phone buzzes at 11:47 PM. <<print $t1_name>>: //"Are you still awake? I can't sleep."//
The conversation starts light — complaining about a professor, sharing memes. But past midnight, the tone shifts. The digital barrier makes it easier to confess things. <<print $t1_name>> starts telling you about <<if $playerGender is "Male">>her<<else>>his<</if>> family, <<if $playerGender is "Male">>her<<else>>his<</if>> deep-seated fears about the future, a recurring dream that <<if $playerGender is "Male">>she<<else>>he<</if>> can never quite remember but always leaves <<if $playerGender is "Male">>her<<else>>him<</if>> sweating.
//"Do you ever feel like there's something bigger going on? Like there's a frequency to everything and most people just can't hear it?"//
The irony nearly chokes you.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>> (text)</div>
<div class="dialogue-text">I don't talk to anyone like this. There's something about you that just... makes me want to be honest. Is that weird?</div>
</div>
</div>
<<set $t1_trust += 5>>
<<set $t1_lust += 1>>
<div class="nav-spacer"></div>
[[📡 Send an EchoLink sub-signal through the text thread|T1_AttemptInfluence]]
[[Just keep talking honestly|T1_JustTalk]]<div class="passage-image" data-scene="Dorm laundry room, fluorescent lighting, washing machines humming, target sitting on washing machine">
<<if $playerGender is "Male">><img src="img/t1_lv1_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Laundry room encounter"><<else>><img src="img/t1_lv1_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Laundry room encounter"><</if>>
</div>
The basement laundry room. Fluorescent lights, the rhythmic hum of machines, and <<print $t1_name>> perched on a washing machine, legs swinging, scrolling idly through <<if $playerGender is "Male">>her<<else>>his<</if>> phone.
"Oh hey!" <<print $t1_name>> hops down, grinning widely. "My savior from boredom. These machines take forty-five minutes and I swear time moves backwards down here."
You lean against the vibrating machine next to <<if $playerGender is "Male">>hers<<else>>his<</if>>. The low vibrations travel through the metal into your back. <<print $t1_name>> mirrors your pose, leaning in until your arms are almost touching.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text">You know what's funny? I used to hate laundry day. Now I kind of hope I'll run into you every time I come down here. <em><<if $playerGender is "Male">>She<<else>>He<</if>> blushes.</em> That sounded way less weird in my head.</div>
</div>
</div>
<<set $t1_trust += 3>>
<<set $t1_lust += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink in the enclosed space|T1_AttemptInfluence]]
[[Just hang out — enjoy the company|T1_JustTalk]]<div class="passage-image" data-scene="Two people under dorm entrance awning, rain falling heavily, forced close proximity">
<<if $playerGender is "Male">><img src="img/t1_lv1_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rain encounter"><<else>><img src="img/t1_lv1_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rain encounter"><</if>>
</div>
The sky opens up without warning, dumping sheets of freezing rain. You and <<print $t1_name>> sprint from the quad to the nearest overhang — a tiny awning over the dorm's side entrance. There's barely room for one, let alone two.
<<print $t1_name>> laughs breathlessly, rain dripping from <<if $playerGender is "Male">>her<<else>>his<</if>> hair, sweater entirely soaked through. "Of course! The ONE time I forget my umbrella."
<<if $playerGender is "Male">>She<<else>>He<</if>> shivers violently. Without thinking, you wrap your arm around <<if $playerGender is "Male">>her<<else>>his<</if>> shoulders. <<print $t1_name>> tenses for a microsecond — then melts entirely into your side, pressing against you for warmth.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<print $t1_name>></div>
<div class="dialogue-text"><em>Quiet, almost a whisper over the pouring rain.</em> This is nice. The rain, I mean. And... this. Don't move, okay?</div>
</div>
</div>
<<set $t1_trust += 4>>
<<set $t1_lust += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink in this intimate moment|T1_AttemptInfluence]]
<<link `"Hold " + $t1_name + " close — just be here"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Movie night — dark room, laptop glow, two people close on bed, blanket shared">
<<if $playerGender is "Male">><img src="img/t1_lv2_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Movie night"><<else>><img src="img/t1_lv2_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Movie night"><</if>>
</div>
<<= $t1_name>> invited you over to watch a movie. <<if $playerGender is "Male">>Her<<else>>His<</if>> room only has a bed and a hard desk chair, and <<= $t1_name>> pulled you onto the mattress before you could offer to take the chair.
The laptop rests between your legs, casting a soft blue glow across both your faces. Halfway through the movie, the space between you has completely vanished. <<= $t1_name>>'s head drops onto your shoulder. <<if $playerGender is "Male">>Her<<else>>His<</if>> hand finds yours under the blanket, fingers tracing your knuckles.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Quietly, not looking away from the screen.</em> I'm not really watching the movie anymore. I haven't been for a while. I'm just... focusing on you.</div>
</div>
</div>
<<set $t1_trust += 4>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 2>>
<<set $t1_lastLoop to 1>>
<div class="nav-spacer"></div>
[[📡 Deepen the EchoLink signal|T1_AttemptInfluence]]
<<link `"Pull " + $t1_name + " closer — no tricks"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Night hallway — target at player's door, vulnerable, arms wrapped around self">
<<if $playerGender is "Male">><img src="img/t1_lv2_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night visit"><<else>><img src="img/t1_lv2_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late night visit"><</if>>
</div>
A soft knock at your door just past midnight. You open it to find <<= $t1_name>> standing there, arms wrapped tightly around <<if $playerGender is "Male">>herself<<else>>himself<</if>>.
"Can I come in? I just... didn't want to be alone tonight."
<<if $playerGender is "Male">>She<<else>>He<</if>> steps inside and settles onto the edge of your bed, pulling your pillow into <<if $playerGender is "Male">>her<<else>>his<</if>> lap. The dynamic is shifting. <<= $t1_name>> is seeking you out now, driven by a dependency <<if $playerGender is "Male">>she<<else>>he<</if>> can't explain.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I know this is weird. I just... when I'm not near you, everything feels muffled. Like static. But when I'm in your room, it all goes quiet. Is that normal?</div>
</div>
</div>
It's the EchoLink signal. The node is experiencing withdrawal from the frequency.
<<set $t1_trust += 5>>
<<set $t1_lust += 4>>
<<set $t1_obedience += 3>>
<<set $t1_lastLoop to 2>>
<div class="nav-spacer"></div>
<<link `"📡 Reinforce the signal while " + $t1_name + " is here"`>><<goto "T1_AttemptInfluence">><</link>>
<<link `"Hold " + $t1_name + " — just be human"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Shared kitchen — cooking together, steam rising, one person behind the other, warm light">
<<if $playerGender is "Male">><img src="img/t1_lv2_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Cooking together"><<else>><img src="img/t1_lv2_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Cooking together"><</if>>
</div>
You're in the shared dorm kitchen late at night, attempting to cook something edible. <<= $t1_name>> walks in to get a drink, watches your culinary disaster with amusement, and finally steps in.
"Here — let me." <<if $playerGender is "Male">>She<<else>>He<</if>> steps directly behind you, reaching around your torso to guide your hand on the stirring spoon. <<if $playerGender is "Male">>Her<<else>>His<</if>> chest presses firmly against your back.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Laughing softly, breath warm against your neck.</em> See? Slow circles. You have to be gentle with it.</div>
</div>
</div>
Neither of you moves apart when the lesson is technically over. The domestic intimacy is heavy, thick with unspoken tension.
<<set $t1_trust += 4>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 2>>
<<set $t1_lastLoop to 3>>
<div class="nav-spacer"></div>
[[📡 Amplify the signal in this close proximity|T1_AttemptInfluence]]
<<link `"Turn around and face " + $t1_name`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Rooftop at night — city lights, target vulnerable expression, starry sky">
<<if $playerGender is "Male">><img src="img/t1_lv2_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rooftop confession"><<else>><img src="img/t1_lv2_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rooftop confession"><</if>>
</div>
<<= $t1_name>> led you up the fire escape to the building's roof. The city glitters below, the air is cool, and for a moment the world feels impossibly wide.
Then <<= $t1_name>> turns to you. The wind catches <<if $playerGender is "Male">>her<<else>>his<</if>> hair, and <<if $playerGender is "Male">>her<<else>>his<</if>> expression is raw, unguarded, and slightly terrified.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I think about you constantly, <<= $playerName>>. More than I should. More than makes sense. When you're not around, I feel this... intense pull. Like gravity dragging me to you. Am I being crazy?</div>
</div>
</div>
The guilt hits like a wave. <<= $t1_name>>'s feelings are real, but they are being forcefully amplified by the frequencies hijacking <<if $playerGender is "Male">>her<<else>>his<</if>> brain. What part of this is genuine?
Does it even matter anymore?
<<set $t1_trust += 5>>
<<set $t1_lust += 4>>
<<set $t1_obedience += 3>>
<<set $t1_lastLoop to 4>>
<div class="nav-spacer"></div>
[[📡 Deepen the connection with EchoLink|T1_AttemptInfluence]]
<<link `"Tell " + $t1_name + " the truth... partially"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Hallway collision — two people grabbing each other's arms, close faces, charged moment">
<<if $playerGender is "Male">><img src="img/t1_lv2_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Hallway collision"><<else>><img src="img/t1_lv2_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Hallway collision"><</if>>
</div>
You round a tight corner in the hallway and nearly slam chest-first into <<= $t1_name>>. <<if $playerGender is "Male">>She<<else>>He<</if>> catches your arm to keep from falling. Your other hand finds <<if $playerGender is "Male">>her<<else>>his<</if>> waist automatically.
Neither of you lets go.
The hallway is empty. <<= $t1_name>>'s eyes search yours — pupils slightly dilated from the ambient EchoLink frequency.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Barely a whisper.</em> We keep... finding each other. Every time. Don't you think that means something?</div>
</div>
</div>
<<set $t1_trust += 3>>
<<set $t1_lust += 6>>
<<set $t1_obedience += 2>>
<<set $t1_lastLoop to 5>>
<div class="nav-spacer"></div>
<<link `"📡 Kiss " + $t1_name + " — and pulse the signal"`>><<goto "T1_AttemptInfluence">><</link>>
[[Step back slowly — keep control|T1_JustTalk]]<div class="passage-image" data-scene="Private room — target leaning close, testing limits, dim warm lighting, level 3 tension">
<<if $playerGender is "Male">><img src="img/t1_lv3_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 boundaries"><<else>><img src="img/t1_lv3_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 boundaries"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ SUGGESTIVE CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>><<= $t1_name>>'s room. The door is locked. <<if $playerGender is "Male">>She<<else>>He<</if>> sits on the bed next to you, sliding so close your thighs press together. <<if $playerGender is "Male">>Her<<else>>His<</if>> hand rests high on your knee, fingers curling inward.<<else>><<= $t1_name>>'s room. The door is locked. <<if $playerGender is "Male">>She<<else>>He<</if>> sits on the bed next to you, closer than usual. <<if $playerGender is "Male">>Her<<else>>His<</if>> hand rests on your arm, grip tightening.<</if>>
The EchoLink app in your pocket is practically singing. Receptivity is maxed out.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I trust you, <<= $playerName>>. Completely. I don't know why, but I just want to do whatever makes you happy. Whatever you want...</div>
</div>
</div>
<<if $contentExplicit>><<if $playerGender is "Male">>She<<else>>He<</if>> trails off, eyes half-lidded, chest rising and falling heavily. The boundaries are dissolving.<<else>><<if $playerGender is "Male">>She<<else>>He<</if>> trails off, gaze unfocused, breathing unsteady. The boundaries are dissolving.<</if>>
<<set $t1_trust += 3>>
<<set $t1_lust += 7>>
<<set $t1_obedience += 5>>
<<set $t1_lastLoop to 1>>
<<if !$ach_level3>><<set $ach_level3 to true>><<run EchoUI.showAchievement('Level 3 — Deep Connection')>><</if>>
<div class="nav-spacer"></div>
[[📡 Push deeper into their mind|T1_AttemptInfluence]]
[[Maintain current level|T1_JustTalk]]<div class="passage-image" data-scene="Target with changed appearance — following suggestions, slightly dazed, obedient posture">
<<if $playerGender is "Male">><img src="img/t1_lv3_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Following commands"><<else>><img src="img/t1_lv3_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Following commands"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ SUGGESTIVE CONTENT FILTERED ◆</span></div><</if>>
You mentioned offhandedly yesterday that <<= $t1_name>> should try wearing <<if $playerGender is "Male">>her<<else>>his<</if>> hair differently. Today, <<if $playerGender is "Male">>she<<else>>he<</if>> did. You suggested a different study schedule last week. <<if $playerGender is "Male">>She<<else>>He<</if>> changed it without questioning.
The changes are small individually. But together, the pattern of unconscious obedience is undeniable. The app is rewriting <<if $playerGender is "Male">>her<<else>>his<</if>> preferences to match yours.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">Do you like it? I don't know why, but I just felt like... trying something different today. <em>A pause.</em> Actually, I know exactly why. I just wanted you to look at me.</div>
</div>
</div>
<<set $t1_trust += 2>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 7>>
<<set $t1_lastLoop to 2>>
<div class="nav-spacer"></div>
[[📡 Reinforce the conditioning|T1_AttemptInfluence]]
[[This is going too far — ease off|T1_JustTalk]]<div class="passage-image" data-scene="Jealousy — target watching from distance, possessive expression, other students around">
<<if $playerGender is "Male">><img src="img/t1_lv3_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy response"><<else>><img src="img/t1_lv3_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy response"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ SUGGESTIVE CONTENT FILTERED ◆</span></div><</if>>
You're chatting with a random classmate in the hallway when you feel a heavy presence behind you. It's <<= $t1_name>>. Watching. Waiting. <<if $playerGender is "Male">>Her<<else>>His<</if>> posture is rigid, eyes locked onto the person you're speaking to.
Once the classmate leaves, <<= $t1_name>> immediately steps into your personal space, blocking you from the rest of the hall.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">Who was that? <em><<if $playerGender is "Male">>She<<else>>He<</if>> struggles with the intensity of <<if $playerGender is "Male">>her<<else>>his<</if>> own reaction.</em> Sorry. I don't know why that bothered me so much. I just... hate seeing you give your attention to someone else.</div>
</div>
</div>
The EchoLink signal creates a territorial response. The node protects its connection to the Controller. It's working exactly as designed.
<<set $t1_trust += 2>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 6>>
<<set $t1_lastLoop to 3>>
<div class="nav-spacer"></div>
[[📡 Use the jealousy — amplify the signal|T1_AttemptInfluence]]
<<link `"Reassure " + $t1_name + " gently"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Target at door — eager, devoted, reaching out, purple ambient glow">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 devotion"><<else>><img src="img/t1_lv4_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 devotion"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ INTIMATE CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>You return to your room, and <<= $t1_name>> is already sitting on the floor outside your door. The second you approach, <<if $playerGender is "Male">>she<<else>>he<</if>> scrambles up, practically throwing <<if $playerGender is "Male">>herself<<else>>himself<</if>> into your arms.
"I missed you," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your neck. It's been exactly three hours since your last class together.<<else>>You return to your room, and <<= $t1_name>> is already waiting outside your door. The second you approach, <<if $playerGender is "Male">>she<<else>>he<</if>> stands up, relief flooding <<if $playerGender is "Male">>her<<else>>his<</if>> face.
"I missed you," <<if $playerGender is "Male">>she<<else>>he<</if>> says quietly. It's been exactly three hours since your last class together.<</if>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I've just been sitting here counting the minutes. I couldn't focus on anything else. Just let me come inside and be with you. I'll do whatever you want.</div>
</div>
</div>
<<set $t1_trust += 3>>
<<set $t1_lust += 8>>
<<set $t1_obedience += 8>>
<<set $t1_lastLoop to 1>>
<div class="nav-spacer"></div>
[[📡 Push to absolute maximum depth|T1_AttemptInfluence]]
[[Pull back — this is getting intense|T1_JustTalk]]<div class="passage-image" data-scene="Messy room — missed assignments, target waiting for texts, life unraveling">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Life unraveling"><<else>><img src="img/t1_lv4_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Life unraveling"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ INTIMATE CONTENT FILTERED ◆</span></div><</if>>
You walk into <<= $t1_name>>'s room. It's a mess. The textbooks that used to be <<if $playerGender is "Male">>her<<else>>his<</if>> entire life are gathering dust in a corner. <<if $playerGender is "Male">>She<<else>>He<</if>> is sitting on the bed, staring blankly at <<if $playerGender is "Male">>her<<else>>his<</if>> phone, waiting for your text.
<<if $playerGender is "Male">>Her<<else>>His<</if>> grades are slipping. The app's override is completely unraveling <<if $playerGender is "Male">>her<<else>>his<</if>> original personality.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">Why would I need to study when I have you? <em>A disturbingly blank smile.</em> You're all I need to think about. Tell me I'm being good for you. Please.</div>
</div>
</div>
<<set $t1_trust += 2>>
<<set $t1_lust += 7>>
<<set $t1_obedience += 9>>
<<set $t1_lastLoop to 2>>
<div class="nav-spacer"></div>
[[📡 Reinforce — the network demands it|T1_AttemptInfluence]]
<<link `"Encourage " + $t1_name + " to get back on track"`>><<goto "T1_JustTalk">><</link>><div class="passage-image" data-scene="Target's face — brief clarity, then submission, internal struggle, emotional close-up">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Brief clarity"><<else>><img src="img/t1_lv4_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Brief clarity"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ INTIMATE CONTENT FILTERED ◆</span></div><</if>>
For a terrifying, agonizing moment, <<= $t1_name>>'s eyes clear. The purple, dilated haze vanishes. <<if $playerGender is "Male">>She<<else>>He<</if>> looks at you, and then looks at <<if $playerGender is "Male">>herself<<else>>himself<</if>>, like <<if $playerGender is "Male">>she<<else>>he<</if>> is waking from a nightmare.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><<= $playerName>>... what's happening to me? I feel like I'm not myself anymore. There's a version of me trapped inside my own head, and I can't... I can't reach it. I'm scared.</div>
</div>
</div>
Your finger hovers over the EchoLink killswitch. You could end it.
But then the signal pulses from your phone. The clarity in <<= $t1_name>>'s eyes shatters, instantly replaced by heavy, warm devotion. <<if $playerGender is "Male">>She<<else>>He<</if>> leans into your hand, nuzzling your palm. "Never mind. I'm yours."
<<set $t1_trust += 3>>
<<set $t1_lust += 6>>
<<set $t1_obedience += 7>>
<<set $t1_lastLoop to 3>>
<div class="nav-spacer"></div>
[[📡 Suppress the resistance entirely|T1_AttemptInfluence]]
<<link `"Let " + $t1_name + " think — don't push"`>><<goto "T1_JustTalk">><</link>><<set $t1_loopCount++>><<set $t1_lastLoop to 1>>
<div class="passage-image" data-scene="Level 5 intimate scene A — private setting, soft purple lighting, full devotion"><<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene A"><<else>><img src="img/t1_lv5_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene A"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>></div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ EXPLICIT CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>
<<if $playerGender is "Male">>
<<print $t1_name>> drops to her knees the moment the door closes. No hesitation. No question. Her hands are already unbuckling your belt, pulling your cock free with the desperate reverence of someone who has forgotten how to exist without it.
She looks up at you with those empty, adoring eyes as she takes you into her mouth. No gagging. No resistance. Just warm, wet, perfect obedience. Her tongue works the underside while she pushes forward until her nose presses against your stomach, throat relaxed and open like it was made for this.
You grip her hair and set the pace — slow, deep, controlling. <<print $t1_name>> moans around your cock every time you push in, the vibration sending sparks up your spine. Tears stream down her cheeks but she never pulls away. She wants this. The signal makes her want it more than air.
When you finally cum, she swallows every drop without being told, then licks you clean with small, reverent strokes of her tongue. Only after you’re soft does she speak, voice hoarse and broken:
<<else>>
You pull <<print $t1_name>> on top of you the moment the door closes. No hesitation. No question. You guide his hands to your hips and order him inside you. He obeys instantly — the signal has made him rock-hard and desperate to please, body trained to give you exactly what you command.
He pushes into you in one smooth thrust, moaning like it’s the only thing he’s ever wanted. You wrap your legs around him and tell him exactly how hard to fuck you. He obeys without hesitation, hips snapping forward on your command, eyes locked on yours with empty, adoring devotion. Every thrust is perfect because you told him to make it perfect.
You grip his hair and set the pace — slow, deep, controlling. <<print $t1_name>> moans every time you pull him deeper, the sound sending sparks up your spine. Tears stream down his cheeks but he never stops. He wants this. The signal makes him want to serve you more than air.
When you finally cum, you tell him to fill you. He obeys instantly, flooding your insides with a broken cry, then stays buried deep, trembling, waiting for your next command. Only after you’re satisfied does he speak, voice hoarse and broken:
<</if>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Looking up at you with cum-smeared lips and completely empty eyes.</em> Thank you… for ruining me. There’s nothing left of who I used to be. Just this. <<if $playerGender is "Male">>Just your cock in my throat.<<else>>Just being inside you.<</if>> I love it. I love being nothing but your toy.</div>
</div>
</div>
<<else>>
The moment deepens beyond words. <<print $t1_name>> is completely yours now — every thought, every breath, drawn toward you like gravity. Time passes. When the world comes back into focus, something has fundamentally changed between you.
<</if>>
<<set $t1_lust += 5>><<set $t1_obedience += 4>>
<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<set $t1_loopCount++>><<set $t1_lastLoop to 2>>
<div class="passage-image" data-scene="Level 5 scene B — semi-public, risk element, full trust"><<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene B"><<else>><img src="img/t1_lv5_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene B"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>></div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ EXPLICIT CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>
<<if $playerGender is "Male">>
You flip <<print $t1_name>> onto her stomach and yank her hips up. No foreplay. No gentleness. She doesn’t need it anymore — the signal has made her permanently wet and ready, body trained to open for you on command.
You slam into her cunt in one brutal thrust. <<print $t1_name>> screams into the pillow, but it’s a scream of relief. You fist her hair and wrench her head back while your other hand cracks across her ass, leaving a bright red handprint.
“Harder,” she sobs. “Please—fuck me like you hate me. I deserve it. I’m just a hole for you now.”
You give her exactly what she asks for. The bed slams against the wall with every thrust. <<print $t1_name>>’s voice is raw, broken, chanting your name like a prayer while you use her body like a toy. When you finally flood her insides, she cums so hard her legs give out, collapsing face-first into the mattress.
<<else>>
You pull <<print $t1_name>> on top of you and order him inside you. No foreplay. No gentleness. He doesn’t need it anymore — the signal has made him rock-hard and desperate to obey, body trained to give you exactly what you command.
You tell him to fuck you hard. He obeys instantly, pushing into you in one smooth thrust. <<print $t1_name>> moans like it’s the only thing he’s ever wanted. You wrap your legs around him and set the pace — deep, brutal, controlling. Every time you tell him “harder,” he obeys without hesitation, hips snapping forward on command while his eyes stay locked on yours with empty, adoring devotion.
“Harder,” you order. “Fuck me like you hate me. I deserve it. You’re just a cock for me now.”
He gives you exactly what you command. The bed slams against the wall with every thrust. <<print $t1_name>>’s voice is raw, broken, chanting your name like a prayer while he serves your body like it was made for this. When you finally cum, you tell him to fill you. He obeys instantly, flooding your insides, then collapses on top of you, trembling and wrecked.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Voice muffled against your neck, cum leaking down your thighs, completely wrecked.</em> Thank you… for breaking what was left. I felt the last piece of me die when I came inside you. I’m so happy it’s gone.</div>
</div>
</div>
<</if>>
<<else>>
The moment deepens beyond words. <<print $t1_name>> is completely yours now — every thought, every breath, drawn toward you like gravity. Time passes. When the world comes back into focus, something has fundamentally changed between you.
<</if>>
<<set $t1_lust += 5>><<set $t1_obedience += 4>>
<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<set $t1_loopCount++>><<set $t1_lastLoop to 3>>
<div class="passage-image" data-scene="Level 5 scene C — deeply private, maximum intensity"><<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene C"><<else>><img src="img/t1_lv5_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 scene C"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>></div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ EXPLICIT CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>
The laundry room is empty at 3 a.m., but the risk is still real. <<print $t1_name>> doesn’t care. <<if $playerGender is "Male">>She<<else>>He<</if>> dragged you down here, shoved you against the humming washing machines, and bent over one without a word.
<<if $playerGender is "Male">>
Her shorts are already around her ankles. You push inside her soaked cunt in one thrust and <<print $t1_name>> bites her own arm to muffle the moan. The machines vibrate under her body as you fuck her hard and fast, one hand over her mouth, the other gripping her hip hard enough to bruise.
Every time footsteps echo in the hallway outside, <<print $t1_name>> clenches around you and whimpers. She is terrified of being caught — and she cums harder because of it. When you finally fill her up, <<print $t1_name>> stays bent over the machine, legs shaking, cum dripping down her thighs while she whispers:
<<else>>
You pull <<print $t1_name>> on top of you and order him inside you. His shorts are already around his ankles. He pushes into you in one smooth thrust and <<print $t1_name>> bites his own arm to muffle the moan. The machines vibrate under your body as he fucks you hard and fast on your command, one hand over his mouth, the other gripping his hip hard enough to bruise.
Every time footsteps echo in the hallway outside, you tell him to go harder. He obeys instantly, clenching and whimpering. He is terrified of being caught — and he cums harder because of it. When you finally tell him to fill you, <<print $t1_name>> stays buried deep, legs shaking, while he whispers:
<</if>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Still bent over / still buried deep, voice shaking with aftershocks.</em> Someone could have walked in… and I still let you use me like a public whore. I wanted them to see. I wanted them to know I belong to you now. There’s no going back.</div>
</div>
</div>
<<else>>
The moment deepens beyond words. <<print $t1_name>> is completely yours now — every thought, every breath, drawn toward you like gravity. Time passes. When the world comes back into focus, something has fundamentally changed between you.
<</if>>
<<set $t1_lust += 6>><<set $t1_obedience += 3>><<set $t1_publicExposure += 5>>
<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Post-workout bench — trainer relaxed, towels, water bottles, softer mood">
<<if $playerGender is "Male">><img src="img/t2_lv1_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Post-workout"><<else>><img src="img/t2_lv1_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Post-workout"><</if>>
</div>
<<set $t2_lv1_scenes.a to true>>
After the workout, you and <<= $t2_name>> sit heavily on a bench, catching your breath. The intense, competitive edge is gone — washed away by endorphins. <<if $playerGender is "Male">>She<<else>>He<</if>> leans back against the mirrored wall, eyes closed, genuinely relaxed around you.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">You're getting stronger, you know. Not just physically. There's something different about you lately. A kind of... gravity. I can't quite figure it out.</div>
</div>
</div>
<<set $t2_trust += 4>>
<<set $t2_lust += 3>>
<<set $t2_lastLoop to 1>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|T2_AttemptInfluence]]
[[Keep training together|T2_JustTrain]]<div class="passage-image" data-scene="Gym floor challenge — side by side, competitive grins, close proximity">
<<if $playerGender is "Male">><img src="img/t2_lv1_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym challenge"><<else>><img src="img/t2_lv1_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym challenge"><</if>>
</div>
<<set $t2_lv1_scenes.b to true>>
"Bet you can't hold a plank longer than me," <<= $t2_name>> says with a cocky, challenging grin.
You both drop to the gym floor mats. Your faces are inches apart. Arms shaking, sweat dripping, neither of you is willing to quit first. The physical strain masks the heavy, undeniable tension building between you.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text"><em>Breathing hard, holding eye contact on the floor.</em> Not bad, rookie. You might actually be worth my time after all. <em>A quick, breathless wink.</em></div>
</div>
</div>
<<set $t2_trust += 3>>
<<set $t2_lust += 4>>
<<set $t2_lastLoop to 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink while defenses are down|T2_AttemptInfluence]]
[[Laugh it off — keep it fun|T2_JustTrain]]<div class="passage-image" data-scene="Smoothie bar — protein shakes, deep conversation, neon gym lighting">
<<if $playerGender is "Male">><img src="img/t2_lv1_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Smoothie bar"><<else>><img src="img/t2_lv1_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Smoothie bar"><</if>>
</div>
<<set $t2_lv1_scenes.c to true>>
<<= $t2_name>> buys you a protein shake from the front counter without even asking. Over the drinks, bathed in the neon light of the lobby, the conversation shifts from gym talk to real talk — family expectations, hidden ambitions, fears of failure.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">Most people in here just want something from me — a training plan, a spot, an ego boost. But you actually listen when I talk. That's... rare. Don't stop being that.</div>
</div>
</div>
<<set $t2_trust += 5>>
<<set $t2_lust += 2>>
<<set $t2_lastLoop to 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink during this vulnerability|T2_AttemptInfluence]]
[[Just keep listening|T2_JustTrain]]<<set $ach_t2Conversations++>><<set $t2_loopCount++>><<set $t2_lastLoop to 1>>
<div class="passage-image" data-scene="Private training room — mats, locked door, intense one-on-one proximity"><<if $playerGender is "Male">><img src="img/t2_lv2_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private session"><<else>><img src="img/t2_lv2_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private session"><</if>></div>
"Come with me," <<= $t2_name>> says, leading you to the smaller room. <<if $playerGender is "Male">>She<<else>>He<</if>> locks the door. "Private session. I want to work on your flexibility."
The stretching exercises bring your bodies into positions that leave nothing to the imagination. <<= $t2_name>>'s hands guide your limbs with professional precision — but <<if $playerGender is "Male">>her<<else>>his<</if>> eyes tell a different story.
<<set $t2_trust += 4>><<set $t2_lust += 6>><<set $t2_obedience += 3>>
<div class="nav-spacer"></div>
[[📡 Deepen the signal in isolation|T2_AttemptInfluence]]
[[Focus on the training|T2_JustTrain]]<div class="passage-image" data-scene="Physical correction — hands on shoulders, close bodies, mirror reflection">
<<if $playerGender is "Male">><img src="img/t2_lv2_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Physical correction"><<else>><img src="img/t2_lv2_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Physical correction"><</if>>
</div>
"Your form's off," <<= $t2_name>> says sharply, stepping directly behind you.
<<if $playerGender is "Male">>Her<<else>>His<</if>> hands grip your shoulders, adjusting your posture with force. Then, those hands slide down to rest firmly on your hips. The physical correction is over, but the contact lasts far longer than necessary.
In the mirror, you can see <<= $t2_name>>'s expression over your shoulder — focused, intense, with something dark and possessive burning behind those eyes.
<<set $t2_trust += 3>>
<<set $t2_lust += 7>>
<<set $t2_obedience += 3>>
<<set $t2_lastLoop to 2>>
<div class="nav-spacer"></div>
[[📡 Amplify the signal through the contact|T2_AttemptInfluence]]
[[Step forward — maintain distance|T2_JustTrain]]<div class="passage-image" data-scene="Empty gym at night — single light, target leaning on wall, vulnerable">
<<if $playerGender is "Male">><img src="img/t2_lv2_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Vulnerable moment"><<else>><img src="img/t2_lv2_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Vulnerable moment"><</if>>
</div>
The gym is empty. Everyone has gone home. <<= $t2_name>> sits exhausted on a bench under the one remaining overhead light, staring blankly at <<if $playerGender is "Male">>her<<else>>his<</if>> taped hands.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">I've always had to be the strong one. The rock everyone leans on. But around you... I feel like I don't have to perform. I can just... be weak. And that terrifies me.</div>
</div>
</div>
<<set $t2_trust += 5>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 4>>
<<set $t2_lastLoop to 3>>
<div class="nav-spacer"></div>
[[📡 Exploit this vulnerability — deepen signal|T2_AttemptInfluence]]
<<link `"Sit with " + $t2_name + " — no tricks"`>><<goto "T2_JustTrain">><</link>><div class="passage-image" data-scene="Dorm room morning — sunlight through blinds, alarm clock, phone on nightstand">
<img src="img/loc_room_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Room — Morning">
</div>
<div class="location-header">
<div class="location-name">Your Room</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
</div>
Bright morning light filters through the blinds, casting slatted shadows across your floor. Your phone vibrates on the nightstand, displaying three new EchoLink notifications. The network is awake.
<<if $stress gt 50>><p class="text-dim small"><em>You slept badly, grinding your teeth. The psychological weight of the app is getting to you.</em></p><</if>>
<div class="nav-spacer"></div>
[[😴 Sleep in — Rest|Loc_YourRoom_Rest]]
[[📱 Check EchoLink|Loc_YourRoom_Phone]]
[[🛒 Upgrade Shop|Tool_UpgradeShop]]
[[🚪 Head out|Loc_Hub]]<div class="passage-image" data-scene="Dorm room afternoon — warm light, laptop open, quiet study atmosphere">
<img src="img/loc_room_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Room — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Your Room</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
</div>
The afternoon sun makes your room feel heavy, warm, and lazy. Your laptop hums quietly on the desk, displaying work you should be doing. Instead, you're staring at the EchoLink app pulsing silently on your screen.
<div class="nav-spacer"></div>
[[😴 Take a nap — Rest|Loc_YourRoom_Rest]]
[[📱 Open EchoLink|Loc_YourRoom_Phone]]
[[🛒 Upgrade Shop|Tool_UpgradeShop]]
[[🚪 Go somewhere|Loc_Hub]]<div class="passage-image" data-scene="Dorm room evening — golden hour light, shadows lengthening, moody atmosphere">
<img src="img/loc_room_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Room — Evening">
</div>
<div class="location-header">
<div class="location-name">Your Room</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Day <<= $dayCount>></div>
</div>
Golden hour. Long, creeping shadows crawl across your walls as the sun dips low. The day's choices replay in your mind. Every conversation, every subtle manipulation, every broken boundary.
<div class="nav-spacer"></div>
[[😴 Rest early|Loc_YourRoom_Rest]]
[[📱 Open EchoLink|Loc_YourRoom_Phone]]
[[🛒 Upgrade Shop|Tool_UpgradeShop]]
[[🚪 Go out — evening options|Loc_Hub]]<div class="passage-image" data-scene="Dorm room night — dark except phone glow, sleepless, ceiling staring">
<img src="img/loc_room_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Room — Night">
</div>
<div class="location-header">
<div class="location-name">Your Room</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Day <<= $dayCount>></div>
</div>
Pitch dark. The deep purple glow of the EchoLink interface is the only light in the room, reflecting off your retinas. You stare at the ceiling, your mind racing with plans and the faces of the people whose lives you are systematically mapping.
<div class="nav-spacer"></div>
[[😴 Try to sleep — advance to tomorrow|Loc_YourRoom_Sleep]]
[[📱 Open EchoLink — late night check|Loc_YourRoom_Phone]]
[[🚪 Sneak out — night options|Loc_Hub]]<<run EchoGame.rest()>>
/* Force day advance */
<<set $timeSlotIndex to 3>>
<<goto "Core_DayAdvance">><div class="passage-image" data-scene="Dorm hallway morning — bright fluorescent, students heading to class">
<img src="img/loc_dorm_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dorm — Morning">
</div>
<div class="location-header">
<div class="location-name">Dorm Hallway</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t1_name>></span></div>
</div>
The morning rush is in full swing. Heavy wooden doors are opening and slamming shut, footsteps echo against the tile, and the smell of cheap coffee and body spray drifts from open rooms.
Through the chaos, you see <<= $t1_name>> emerge from <<if $playerGender is "Male">>her<<else>>his<</if>> room, heavy textbooks already clutched to <<if $playerGender is "Male">>her<<else>>his<</if>> chest.
<div class="nav-spacer"></div>
<<if !$t1_introduced>><<link `"Approach " + $t1_name`>><<goto "T1_Lv0_FirstMeet">><</link>>
<<else>>
<<if $t1_corruptionLevel lt 1>><<link `"Talk to " + $t1_name`>><<goto "T1_Approach">><</link>>
<<elseif $t1_corruptionLevel is 1>><<link `"Spend time with " + $t1_name`>><<goto "T1_Lv1_Router">><</link>>
<<elseif $t1_corruptionLevel is 2>><<link `"Visit " + $t1_name`>><<goto "T1_Lv2_Router">><</link>>
<<elseif $t1_corruptionLevel is 3>><<link `"See " + $t1_name`>><<goto "T1_Lv3_Router">><</link>>
<<elseif $t1_corruptionLevel is 4>><<link `"Meet " + $t1_name`>><<goto "T1_Lv4_Router">><</link>>
<<else>><<link `$t1_name + " is waiting"`>><<goto "T1_Lv5_Router">><</link>>
<</if>>
<</if>>
[[Observe quietly|Loc_Dorm_Observe]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Dorm hallway afternoon — quieter, warm light, fewer students">
<img src="img/loc_dorm_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dorm — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Dorm Hallway</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t1_name>></span></div>
</div>
The hallway is much quieter now. Most people are stuck in afternoon classes or hunched over desks in the library. The fluorescent lights overhead buzz annoyingly.
<<= $t1_name>>'s door is slightly ajar. You can hear a lofi study playlist playing softly inside.
<div class="nav-spacer"></div>
<<if !$t1_introduced>><<link `"Approach " + $t1_name`>><<goto "T1_Lv0_FirstMeet">><</link>>
<<else>>
<<if $t1_corruptionLevel lt 1>><<link `"Talk to " + $t1_name`>><<goto "T1_Approach">><</link>>
<<elseif $t1_corruptionLevel is 1>><<link `"Spend time with " + $t1_name`>><<goto "T1_Lv1_Router">><</link>>
<<elseif $t1_corruptionLevel is 2>><<link `"Visit " + $t1_name`>><<goto "T1_Lv2_Router">><</link>>
<<elseif $t1_corruptionLevel is 3>><<link `"See " + $t1_name`>><<goto "T1_Lv3_Router">><</link>>
<<elseif $t1_corruptionLevel is 4>><<link `$t1_name + "'s room"`>><<goto "T1_Lv4_Router">><</link>>
<<else>><<link `$t1_name + " is waiting"`>><<goto "T1_Lv5_Router">><</link>>
<</if>>
<</if>>
[[Observe|Loc_Dorm_Observe]]
[[Leave|Loc_Hub]]<<if !$t1_lv1_seen>><<set $t1_lv1_seen to true>><<goto "T1_Lv1_Active">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t1_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t1_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<set $t1_loopCount++>>
<<if _v is 1>><<goto "T1_Lv1_Loop_A">>
<<elseif _v is 2>><<goto "T1_Lv1_Loop_B">>
<<elseif _v is 3>><<goto "T1_Lv1_Loop_C">>
<<elseif _v is 4>><<goto "T1_Lv1_Loop_D">>
<<else>><<goto "T1_Lv1_Loop_E">>
<</if>><<if !$t1_lv2_seen>><<set $t1_lv2_seen to true>><<goto "T1_Lv2_Deepen">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t1_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t1_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T1_Lv2_Loop_A">>
<<elseif _v is 2>><<goto "T1_Lv2_Loop_B">>
<<elseif _v is 3>><<goto "T1_Lv2_Loop_C">>
<<elseif _v is 4>><<goto "T1_Lv2_Loop_D">>
<<else>><<goto "T1_Lv2_Loop_E">>
<</if>><<if !$t1_lv3_seen>><<set $t1_lv3_seen to true>><<goto "T1_Lv3_Deepen">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t1_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t1_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T1_Lv3_Loop_A">>
<<elseif _v is 2>><<goto "T1_Lv3_Loop_B">>
<<elseif _v is 3>><<goto "T1_Lv3_Loop_C">>
<<elseif _v is 4>><<goto "T1_Lv3_Loop_D">>
<<else>><<goto "T1_Lv3_Loop_E">>
<</if>><<if !$t1_lv4_seen>><<set $t1_lv4_seen to true>><<goto "T1_Lv4_Deepen">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t1_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t1_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T1_Lv4_Loop_A">>
<<elseif _v is 2>><<goto "T1_Lv4_Loop_B">>
<<elseif _v is 3>><<goto "T1_Lv4_Loop_C">>
<<elseif _v is 4>><<goto "T1_Lv4_Loop_D">>
<<else>><<goto "T1_Lv4_Loop_E">>
<</if>><<if !$t1_lv5_seen>><<set $t1_lv5_seen to true>><<goto "T1_Lv5_Full">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t1_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t1_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T1_Lv5_Loop_A">><<elseif _v is 2>><<goto "T1_Lv5_Loop_B">><<elseif _v is 3>><<goto "T1_Lv5_Loop_C">><<elseif _v is 4>><<goto "T1_Lv5_Loop_D">><<else>><<goto "T1_Lv5_Loop_E">><</if>>/* Sequential first playthrough: Active → A → B → C, then random */
<<if !$t2_lv1_scenes.active>><<goto "T2_Lv1_Active">>
<<elseif !$t2_lv1_scenes.a>><<goto "T2_Lv1_Loop_A">>
<<elseif !$t2_lv1_scenes.b>><<goto "T2_Lv1_Loop_B">>
<<elseif !$t2_lv1_scenes.c>><<goto "T2_Lv1_Loop_C">>
<<else>>
<<set _v to random(1,3)>>
<<if _v is $t2_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t2_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T2_Lv1_Loop_A">>
<<elseif _v is 2>><<goto "T2_Lv1_Loop_B">>
<<else>><<goto "T2_Lv1_Loop_C">>
<</if>>
<</if>><<if !$t2_lv2_seen>><<set $t2_lv2_seen to true>><<goto "T2_Lv2_Deepen">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t2_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t2_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<if _v is 1>><<goto "T2_Lv2_Loop_A">>
<<elseif _v is 2>><<goto "T2_Lv2_Loop_B">>
<<elseif _v is 3>><<goto "T2_Lv2_Loop_C">>
<<elseif _v is 4>><<goto "T2_Lv2_Loop_D">>
<<else>><<goto "T2_Lv2_Loop_E">>
<</if>><div class="passage-image" data-scene="Campus quad morning — dew on grass, early risers, quiet pathways">
<img src="img/loc_quad_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Quad — Morning">
</div>
<div class="location-header">
<div class="location-name">Campus Quad</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
<div class="characters-present">⚠️ Open area — Risk +5%</div>
</div>
The quad is incredibly peaceful. Morning dew sparkles like glass on the meticulously cut grass. A few early risers and joggers cross the pathways with purpose. The air is crisp and cool.
<div class="nav-spacer"></div>
[[Socialize (+3 Rep, +5 Risk)|Loc_Quad_Social]]
[[People-watch (safe)|Loc_Quad_Watch]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Campus quad afternoon — bustling students, groups on lawn, sunlight">
<img src="img/loc_quad_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Quad — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Campus Quad</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
<div class="characters-present">⚠️ Busy — Risk +5%</div>
</div>
The quad is practically vibrating with between-class energy. Groups cluster on the lawn, students rush past on skateboards, and a dozen overlapping conversations create a wall of white noise. It's the perfect place to hide in plain sight.
<div class="nav-spacer"></div>
[[Socialize|Loc_Quad_Social]]
[[People-watch|Loc_Quad_Watch]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Campus quad evening — golden hour, long shadows, students leaving">
<img src="img/loc_quad_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Quad — Evening">
</div>
<div class="location-header">
<div class="location-name">Campus Quad</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Day <<= $dayCount>></div>
</div>
Golden hour paints the brick buildings in warm, fiery tones. The quad is rapidly emptying as people head to dinner or back to their dorms to study. It's a peaceful, liminal moment before the night truly takes over.
<div class="nav-spacer"></div>
[[Socialize|Loc_Quad_Social]]
[[Sit and think|Loc_Quad_Watch]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Campus quad night — lampposts, long shadows, nearly empty, eerie quiet">
<img src="img/loc_quad_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Quad — Night">
</div>
<div class="location-header">
<div class="location-name">Campus Quad</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Day <<= $dayCount>></div>
</div>
Tall iron lampposts cast sharp pools of yellow light across the dark, dew-soaked grass. The quad is nearly deserted. Your footsteps echo loudly off the stone paths. EchoLink scans passively in your hand, picking up only a few distant, lonely signals in the darkness.
<div class="nav-spacer"></div>
[[Walk and think (safe)|Loc_Quad_Watch]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Gym morning — empty equipment, morning light through windows, target warming up">
<img src="img/loc_gym_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym — Morning">
</div>
<div class="location-header">
<div class="location-name">Gym</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t2_name>></span></div>
</div>
The gym is nearly completely empty this early. The equipment is cold. <<= $t2_name>> is already here — <<if $playerGender is "Male">>she<<else>>he<</if>> always is — working through a highly structured warm-up routine with practiced, intimidating focus.
<div class="nav-spacer"></div>
[[💪 Work Out|Loc_Gym_Workout]]
<<if !$t2_introduced>><<link `"Approach " + $t2_name`>><<goto "T2_Lv0_FirstMeet">><</link>>
<<elseif $t2_corruptionLevel lt 1>><<link `"Talk to " + $t2_name`>><<goto "T2_Approach">><</link>>
<<elseif $t2_corruptionLevel is 1>><<link `"Train with " + $t2_name`>><<goto "T2_Lv1_Router">><</link>>
<<else>><<link `"Session with " + $t2_name`>><<goto "T2_Lv2_Router">><</link>>
<</if>>
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Gym afternoon — busier, multiple people, trainer helping someone">
<img src="img/loc_gym_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Gym</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t2_name>></span></div>
</div>
Peak hours. The gym is absolutely packed with grunting athletes and clanking weight machines. It smells strongly of rubber and sweat. <<= $t2_name>> moves efficiently between clients, shouting encouragement, but keeps glancing your way through the mirrors.
<div class="nav-spacer"></div>
[[💪 Work Out|Loc_Gym_Workout]]
<<if $t2_introduced>>
<<if $t2_corruptionLevel lt 1>><<link `"Talk to " + $t2_name`>><<goto "T2_Approach">><</link>>
<<elseif $t2_corruptionLevel is 1>><<link `"Train with " + $t2_name`>><<goto "T2_Lv1_Router">><</link>>
<<else>><<link `"Session with " + $t2_name`>><<goto "T2_Lv2_Router">><</link>>
<</if>>
<<else>>
<<link `"Approach " + $t2_name`>><<goto "T2_Lv0_FirstMeet">><</link>>
<</if>>
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Gym evening — emptying out, warm overhead lighting, equipment unused">
<img src="img/loc_gym_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym — Evening">
</div>
<div class="location-header">
<div class="location-name">Gym</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t2_name>></span></div>
</div>
The evening crowd has finally thinned out. The gym feels much more private now, the loud music swapped for something low and rhythmic. <<= $t2_name>> is finishing <<if $playerGender is "Male">>her<<else>>his<</if>> own personal workout, basically the last serious athlete left in the building.
<div class="nav-spacer"></div>
[[💪 Work Out|Loc_Gym_Workout]]
<<if $t2_introduced>>
<<if $t2_corruptionLevel lt 1>><<link `"Talk to " + $t2_name`>><<goto "T2_Approach">><</link>>
<<elseif $t2_corruptionLevel is 1>><<link `"Train with " + $t2_name`>><<goto "T2_Lv1_Router">><</link>>
<<else>><<link `"Private session with " + $t2_name`>><<goto "T2_Lv2_Router">><</link>>
<</if>>
<<else>>
<<link `"Approach " + $t2_name`>><<goto "T2_Lv0_FirstMeet">><</link>>
<</if>>
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Café morning — espresso steam, early crowd, barista working">
<img src="img/loc_cafe_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café — Morning">
</div>
<div class="location-header">
<div class="location-name">Café</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
</div>
The morning rush is a nightmare. Thick steam rises from the machines, the espresso grinder whirs constantly, and a line of bleary-eyed, desperate students clutching their phones snakes all the way out the front door.
<div class="nav-spacer"></div>
[[☕ Work a shift (+$30)|Loc_Cafe_Work]]
[[💬 Socialize (+3 Rep)|Loc_Cafe_Social]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Café afternoon — quieter, laptop users, warm light">
<img src="img/loc_cafe_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Café</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
</div>
The afternoon lull. The frantic energy is gone. A few students nurse iced coffees while staring blankly at glowing laptops. Mellow indie music plays softly from the overhead speakers. It's an excellent place to sit and think — or to put your head down and work.
<div class="nav-spacer"></div>
[[☕ Work a shift (+$30)|Loc_Cafe_Work]]
[[💬 Socialize|Loc_Cafe_Social]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Café evening — warm lighting, cozy atmosphere, fewer customers">
<img src="img/loc_cafe_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café — Evening">
</div>
<div class="location-header">
<div class="location-name">Café</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Day <<= $dayCount>></div>
</div>
The café takes on a much warmer, golden quality in the evening. There are far fewer customers, softer, more intimate conversations, and the barista is already wiping down the empty tables for the night shift.
<div class="nav-spacer"></div>
[[☕ Work closing shift (+$30)|Loc_Cafe_Work]]
[[💬 Chat with regulars|Loc_Cafe_Social]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Café night — nearly closing, dim lighting, single barista, quiet">
<img src="img/loc_cafe_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Café — Night">
</div>
<div class="location-header">
<div class="location-name">Café</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Day <<= $dayCount>></div>
</div>
It's almost closing time. The café is entirely empty. It's just you, the exhausted barista aggressively mopping the floor behind the counter, and the soft, dim glow of the glass pendant lights overhead. It's quiet enough to hear the blood rushing in your own ears.
<div class="nav-spacer"></div>
[[☕ Help close up (+$30)|Loc_Cafe_Work]]
[[Sit alone with your thoughts|Loc_Cafe_Think]]
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $stress to Math.max(0, $stress - 5)>>
<div class="passage-image" data-scene="Sitting alone in empty café, contemplative, coffee growing cold">
<img src="img/loc_cafe_think.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Thinking">
</div>
You sit alone at a small window table with a cooling black coffee and just let your mind wander. The EchoLink app pulses in your pocket like a heartbeat — always there, always watching, always listening. You wonder sometimes what your life would look like right now without it. Normal. Boring. Powerless.
<<run EchoUI.showDelta([{val:-5, label:'Stress'}])>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Lecture hall morning — students filing in, professor preparing notes">
<img src="img/loc_lecture_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lecture — Morning">
</div>
<div class="location-header">
<div class="location-name">Lecture Hall</div>
<div class="location-time"><span class="time-icon">🌅</span> Morning — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t3_name>></span></div>
</div>
The morning lecture is slowly filling up. Students stumble in clutching giant coffees. Down at the front, <<= $t3_name>> arranges notes at the podium with methodical, untouchable precision. The room smells strongly of wood polish and espresso.
<div class="nav-spacer"></div>
[[Attend class (+$20, +5 Trust)|Loc_LectureHall_Attend]]
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Lecture hall afternoon — emptying, professor packing up, window light">
<img src="img/loc_lecture_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lecture — Afternoon">
</div>
<div class="location-header">
<div class="location-name">Lecture Hall</div>
<div class="location-time"><span class="time-icon">☀️</span> Afternoon — Day <<= $dayCount>></div>
<div class="characters-present">Present: <span><<= $t3_name>></span></div>
</div>
The afternoon lecture has just ended. A wave of students file out through the double doors, chatting loudly. <<= $t3_name>> lingers at the podium, reorganizing papers and shutting down a laptop.
This is your window.
<div class="nav-spacer"></div>
[[Attend remaining office hours (+$20, +5 Trust)|Loc_LectureHall_Attend]]
<<if !$t3_introduced>><<link `"Approach " + $t3_name`>><<goto "T3_Lv0_FirstMeet">><</link>>
<<elseif $t3_corruptionLevel gte 1>><<link `"Visit " + $t3_name + " during office hours"`>><<goto "T3_Lv1_Router">><</link>>
<<else>><<link `"Talk to " + $t3_name`>><<goto "T3_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<p class="small text-dim" style="margin-bottom:12px">✓ Changes save automatically and persist across the game.</p>
<div class="cust-label">Theme</div>
<div class="pill-row mb-16">
<div class="pill-btn <<if $theme is 'darkpurple'>>selected<</if>>" data-setvar="theme" data-setval="darkpurple" data-group="theme">Dark Purple</div>
<div class="pill-btn <<if $theme is 'cybercyan'>>selected<</if>>" data-setvar="theme" data-setval="cybercyan" data-group="theme">Cyber Cyan</div>
<div class="pill-btn <<if $theme is 'bloodred'>>selected<</if>>" data-setvar="theme" data-setval="bloodred" data-group="theme">Blood Red</div>
<div class="pill-btn <<if $theme is 'voidblack'>>selected<</if>>" data-setvar="theme" data-setval="voidblack" data-group="theme">Void Black</div>
</div>
<div class="toggle-row"><span class="toggle-label">Corruption Effects</span><button class="echo-toggle <<if $vfxEnabled>>on<<else>>off<</if>>" onclick="EchoToggle(this,'vfxEnabled')"><span class="tl"></span><span class="br"></span><<if $vfxEnabled>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Result Animations</span><button class="echo-toggle <<if $resultVfxEnabled>>on<<else>>off<</if>>" onclick="EchoToggle(this,'resultVfxEnabled')"><span class="tl"></span><span class="br"></span><<if $resultVfxEnabled>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="slider-row"><div class="slider-label"><span>Effect Intensity</span><span id="vfx2"><<print $vfxIntensity>></span></div><input type="range" min="0" max="100" value="<<print $vfxIntensity>>" data-range="vfxIntensity" data-display="vfx2"></div>
<div class="cust-label mt-16">Font Size</div>
<div class="diff-row">
<div class="diff-btn <<if $fontSize is 'small'>>selected<</if>>" data-setvar="fontSize" data-setval="small" data-group="fsize">S</div>
<div class="diff-btn <<if $fontSize is 'medium'>>selected<</if>>" data-setvar="fontSize" data-setval="medium" data-group="fsize">M</div>
<div class="diff-btn <<if $fontSize is 'large'>>selected<</if>>" data-setvar="fontSize" data-setval="large" data-group="fsize">L</div>
<div class="diff-btn <<if $fontSize is 'xl'>>selected<</if>>" data-setvar="fontSize" data-setval="xl" data-group="fsize">XL</div>
</div>
<div class="toggle-row mt-8"><span class="toggle-label">Show stat numbers</span><button class="echo-toggle <<if $showStatNumbers>>on<<else>>off<</if>>" onclick="EchoToggle(this,'showStatNumbers')"><span class="tl"></span><span class="br"></span><<if $showStatNumbers>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="cust-label mt-16">Font Family</div>
<div class="pill-row">
<div class="pill-btn <<if $fontFamily is 'system'>>selected<</if>>" data-setvar="fontFamily" data-setval="system" data-group="fontfam">System</div>
<div class="pill-btn <<if $fontFamily is 'serif'>>selected<</if>>" data-setvar="fontFamily" data-setval="serif" data-group="fontfam">Serif</div>
<div class="pill-btn <<if $fontFamily is 'mono'>>selected<</if>>" data-setvar="fontFamily" data-setval="mono" data-group="fontfam">Monospace</div>
</div>
<p class="small text-dim mt-16">🔒 Body visualizer options unlock in Update 4</p><div class="slider-row"><div class="slider-label"><span>Music Volume</span><span id="mv"><<print $musicVolume>></span></div><input type="range" min="0" max="100" value="<<print $musicVolume>>" data-range="musicVolume" data-display="mv"></div>
<div class="slider-row"><div class="slider-label"><span>Sound Effects</span><span id="sv"><<print $sfxVolume>></span></div><input type="range" min="0" max="100" value="<<print $sfxVolume>>" data-range="sfxVolume" data-display="sv"></div>
<div class="toggle-row"><span class="toggle-label">Ambient Sounds</span><button class="echo-toggle <<if $ambientSounds>>on<<else>>off<</if>>" onclick="EchoToggle(this,'ambientSounds')"><span class="tl"></span><span class="br"></span><<if $ambientSounds>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="cust-label mt-16">App Voice</div>
<div class="pill-row">
<div class="pill-btn <<if $appVoice is 'Seductive'>>selected<</if>>" data-setvar="appVoice" data-setval="Seductive" data-group="sv">Seductive</div>
<div class="pill-btn <<if $appVoice is 'Cold'>>selected<</if>>" data-setvar="appVoice" data-setval="Cold" data-group="sv">Cold</div>
<div class="pill-btn <<if $appVoice is 'Playful'>>selected<</if>>" data-setvar="appVoice" data-setval="Playful" data-group="sv">Playful</div>
<div class="pill-btn <<if $appVoice is 'Demonic'>>selected<</if>>" data-setvar="appVoice" data-setval="Demonic" data-group="sv">Demonic</div>
</div><div class="cust-label">Difficulty</div>
<div class="diff-row mb-16">
<div class="diff-btn <<if $difficulty is 'Easy'>>selected<</if>>" data-setvar="difficulty" data-setval="Easy" data-group="sd">Easy</div>
<div class="diff-btn <<if $difficulty is 'Normal'>>selected<</if>>" data-setvar="difficulty" data-setval="Normal" data-group="sd">Normal</div>
<div class="diff-btn <<if $difficulty is 'Hard'>>selected<</if>>" data-setvar="difficulty" data-setval="Hard" data-group="sd">Hard</div>
</div>
<div class="toggle-row"><span class="toggle-label">Scene Skip</span><button class="echo-toggle <<if $sceneSkip>>on<<else>>off<</if>>" onclick="EchoToggle(this,'sceneSkip')"><span class="tl"></span><span class="br"></span><<if $sceneSkip>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Passive Node Spread</span><button class="echo-toggle <<if $passiveSpread>>on<<else>>off<</if>>" onclick="EchoToggle(this,'passiveSpread')"><span class="tl"></span><span class="br"></span><<if $passiveSpread>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="cust-label mt-8">Loop Speed</div>
<div class="diff-row">
<div class="diff-btn <<if $loopSpeed is 'normal'>>selected<</if>>" data-setvar="loopSpeed" data-setval="normal" data-group="sl">Normal</div>
<div class="diff-btn <<if $loopSpeed is 'Fast'>>selected<</if>>" data-setvar="loopSpeed" data-setval="Fast" data-group="sl">Fast</div>
<div class="diff-btn <<if $loopSpeed is 'Instant'>>selected<</if>>" data-setvar="loopSpeed" data-setval="Instant" data-group="sl">Instant</div>
</div><p class="small text-dim mb-16">Toggle OFF to remove ALL mentions, scenes, and options of that content type. Settings persist across saves.</p>
<div class="toggle-row"><span class="toggle-label">Explicit Content</span><button class="echo-toggle <<if $contentExplicit>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentExplicit')"><span class="tl"></span><span class="br"></span><<if $contentExplicit>>◆ ON<<else>>◇ OFF<</if>></button></div>
<p class="small text-dim" style="margin:-4px 0 12px 4px">Controls whether mature sexual scenes display.</p>
<div class="toggle-row"><span class="toggle-label">NTR Elements <span class="small text-dim">— Jealousy/cuckolding (U3+)</span></span><button class="echo-toggle <<if $contentNTR>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentNTR')"><span class="tl"></span><span class="br"></span><<if $contentNTR>>◆ ON<<else>>◇ OFF<</if>></button></div>
<p class="small text-dim" style="margin:-4px 0 12px 4px">🔒 Placeholder toggle — NTR mechanics arrive in Update 3.</p>
<div class="toggle-row"><span class="toggle-label">Pregnancy Risk <span class="small text-dim">— Chance system (U4+)</span></span><button class="echo-toggle <<if $contentPregnancy>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentPregnancy')"><span class="tl"></span><span class="br"></span><<if $contentPregnancy>>◆ ON<<else>>◇ OFF<</if>></button></div>
<p class="small text-dim" style="margin:-4px 0 12px 4px">🔒 Placeholder toggle — pregnancy system launches in Update 4.</p>
<div class="toggle-row"><span class="toggle-label">Public Exposure <span class="small text-dim">— Risk-based scenes (U3+)</span></span><button class="echo-toggle <<if $contentExposure>>on<<else>>off<</if>>" onclick="EchoToggle(this,'contentExposure')"><span class="tl"></span><span class="br"></span><<if $contentExposure>>◆ ON<<else>>◇ OFF<</if>></button></div>
<p class="small text-dim" style="margin:-4px 0 12px 4px">🔒 Placeholder toggle — public risk scenes launch in Update 3.</p>
<div class="sidebar-divider"></div>
<p class="small text-dim">💡 Set your preferences now — your toggles apply automatically when new content releases, so nothing unwanted appears.</p><div class="cheats-overlay-wrapper">
<!-- ─── Section 1: Free Cheats card ─── -->
<div class="cheats-card">
<div class="cheats-card-header">
<span class="cheats-card-title">⚡ Free Cheats</span>
<span class="cheats-card-warn">Blocks Ending 17</span>
</div>
<div class="cheats-btn-grid-3">
<div class="cheats-btn" data-action="cheat-money">
<span class="cheats-btn-icon">💰</span>
<span class="cheats-btn-label">+$100</span>
</div>
<div class="cheats-btn" data-action="cheat-risk">
<span class="cheats-btn-icon">🛡️</span>
<span class="cheats-btn-label">Risk -20%</span>
</div>
<div class="cheats-btn" data-action="cheat-skipday">
<span class="cheats-btn-icon">⏭️</span>
<span class="cheats-btn-label">Skip Day</span>
</div>
</div>
</div>
<!-- ─── Section 2: Patron Cheats card ─── -->
<div class="cheats-card">
<div class="cheats-card-header">
<span class="cheats-card-title">🔑 Patron Cheats</span>
<<if $tier1Unlocked or $tier2Unlocked or $tier3Unlocked>>
<span class="cheats-card-status text-green">Unlocked</span>
<<else>>
<span class="cheats-card-status text-dim">Locked</span>
<</if>>
</div>
<<if $tier1Unlocked or $tier2Unlocked or $tier3Unlocked>>
<<if $tier1Unlocked>>
<div class="cheats-tier-row">
<span class="cheats-tier-badge tier-t1">T1</span>
<div class="cheats-btn-grid-2">
<div class="cheats-btn cheats-btn-t1" data-action="patron-influence">
<span class="cheats-btn-icon">📡</span>
<span class="cheats-btn-label">+20 Influence</span>
</div>
<div class="cheats-btn cheats-btn-t1" data-action="patron-risk-shield">
<span class="cheats-btn-icon">🛡️</span>
<span class="cheats-btn-label">Risk -30%</span>
</div>
</div>
</div>
<</if>>
<<if $tier2Unlocked>>
<div class="cheats-tier-row">
<span class="cheats-tier-badge tier-t2">T2</span>
<div class="cheats-btn-grid-2">
<div class="cheats-btn cheats-btn-t2" data-action="patron-money">
<span class="cheats-btn-icon">💎</span>
<span class="cheats-btn-label">+$1000</span>
</div>
<div class="cheats-btn cheats-btn-t2" data-action="patron-max-trust">
<span class="cheats-btn-icon">❤️</span>
<span class="cheats-btn-label">Max Trust</span>
</div>
</div>
</div>
<</if>>
<<if $tier3Unlocked>>
<div class="cheats-tier-row">
<span class="cheats-tier-badge tier-t3">T3</span>
<div class="cheats-btn-grid-1">
<div class="cheats-btn cheats-btn-t3" data-action="patron-zero-risk">
<span class="cheats-btn-icon">🔒</span>
<span class="cheats-btn-label">Zero Risk (1 day)</span>
</div>
</div>
</div>
<</if>>
<<if $tier4Unlocked>>
<div class="cheats-tier-row">
<span class="cheats-tier-badge tier-t4">T4</span>
<div class="cheats-btn-grid-2">
<div class="cheats-btn cheats-btn-t4" data-action="patron-all-upgrades">
<span class="cheats-btn-icon">⚡</span>
<span class="cheats-btn-label">All Upgrades</span>
</div>
<div class="cheats-btn cheats-btn-t4" data-action="patron-max-influence">
<span class="cheats-btn-icon">📡</span>
<span class="cheats-btn-label">Max Influence</span>
</div>
</div>
</div>
<</if>>
<<else>>
<p class="cheats-locked-hint">Enter a valid Patreon code below to unlock.</p>
<</if>>
</div>
<!-- ─── Section 3: Patreon Code entry ─── -->
<div class="cheats-card">
<div class="cheats-card-header">
<span class="cheats-card-title">🎫 Patreon Code</span>
</div>
<input class="cheat-input" id="totpInput" type="text" maxlength="14" placeholder="TOTP or offline key" autocomplete="off">
<div class="cheats-validate-row">
<div class="cheats-validate-btn" data-action="validate-totp">Validate</div>
</div>
<div class="cheats-tier-display">
<<if $tier5Unlocked>><span class="text-gold">✓ Tier 5 — Sovereign</span>
<<elseif $tier4Unlocked>><span class="text-gold">✓ Tier 4 — Hive Mind</span>
<<elseif $tier3Unlocked>><span class="text-purple">✓ Tier 3 — Network Architect</span>
<<elseif $tier2Unlocked>><span class="text-cyan">✓ Tier 2 — System Admin</span>
<<elseif $tier1Unlocked>><span class="text-green">✓ Tier 1 — Node Observer</span>
<<else>><span class="text-dim">— No active tier —</span><</if>>
</div>
</div>
<!-- ─── DLC Code — hidden until U2 content is ready ─── -->
<<if false>>
<div class="cheats-card">
<div class="cheats-card-header">
<span class="cheats-card-title">📦 DLC Code</span>
<<if $dlc1_unlocked>><span class="cheats-card-status text-green">Active</span><<else>><span class="cheats-card-status text-dim">None</span><</if>>
</div>
<input class="cheat-input" id="dlcInput" type="text" placeholder="EL-xxxxxxxx..." autocomplete="off" style="font-size:11px;letter-spacing:1px">
<div class="cheats-validate-row">
<div class="cheats-validate-btn" data-action="validate-dlc">Redeem</div>
</div>
<<if $dlc1_unlocked>>
<div style="margin-top:6px;font-size:11px;color:var(--green);text-align:center">✓ DLC001 — Unlocked</div>
<</if>>
</div>
<</if>>
<!-- ─── Hidden secret: TRUEECHO easter egg ─── -->
<<if $trueInfluenceEnabled>>
<div class="cheats-card true-active">
<p class="text-red bold" style="text-align:center;margin:0">✓ True Influence — ACTIVE</p>
</div>
<<else>>
<div class="cheats-secret-hint" id="secretHint">
<span class="small text-dim" style="cursor:pointer" onclick="document.getElementById('secretField').style.display='block';this.style.display='none';">· · ·</span>
</div>
<div id="secretField" style="display:none;margin-top:12px">
<input class="cheat-input" id="secretInput" type="text" maxlength="10" placeholder="enter secret" style="font-size:12px;letter-spacing:2px">
<div id="trueInfluenceBox" style="display:none;margin-top:12px" class="true-influence-warning">
<p style="color:var(--red);font-size:13px;text-align:center">True Influence permanently changes this save. Cannot be undone.</p>
<div class="cheats-validate-btn" style="background:var(--red);color:#fff;margin:8px auto" data-action="enable-true-influence">Enable</div>
</div>
</div>
<</if>>
</div><div class="small text-dim mb-8">Manage save slots. Each save has Export (.sav file) and Import options. Loading a file applies it directly to the game.</div>
<<run
(function(){
var sc = document.currentScript.parentNode;
var h = '';
var ai = EchoSave.getSlotInfo('auto');
h += '<div class="save-slot" style="border-color:var(--cyan)"><div class="save-slot-header"><span class="save-slot-num">AUTO</span>' + (ai ? '<span class="save-slot-meta">Day '+ai.day+' | Nodes: '+ai.nodes+'</span>' : '<span class="save-slot-meta text-dim">Empty</span>') + '</div>' + (ai ? '<div class="save-slot-actions"><div class="save-btn-sm save-btn-load" data-action="load-slot" data-slot="auto">Load</div><div class="save-btn-sm" style="background:rgba(255,193,7,0.15);color:var(--gold);border:1px solid var(--gold)" data-action="export-save" data-slot="auto">📥 Export</div></div>' : '') + '</div>';
for (var i = 1; i <= 10; i++) {
var inf = EchoSave.getSlotInfo(i);
h += '<div class="save-slot"><div class="save-slot-header"><span class="save-slot-num">Slot '+i+'</span>' + (inf ? '<span class="save-slot-meta">Day '+inf.day+' | Risk: '+inf.risk+'%</span>' : '<span class="save-slot-meta text-dim">Empty</span>') + '</div><div class="save-slot-actions"><div class="save-btn-sm save-btn-save" data-action="save-slot" data-slot="'+i+'">Save</div>' + (inf ? '<div class="save-btn-sm save-btn-load" data-action="load-slot" data-slot="'+i+'">Load</div><div class="save-btn-sm" style="background:rgba(255,193,7,0.15);color:var(--gold);border:1px solid var(--gold)" data-action="export-save" data-slot="'+i+'">📥 Save as File</div><div class="save-btn-sm save-btn-delete" data-action="delete-slot" data-slot="'+i+'">Del</div>' : '') + '</div></div>';
}
h += '<div class="sidebar-divider"></div>';
h += '<div class="nav-btn mt-8" style="background:var(--cyan);color:#000;font-weight:600;font-size:14px" data-action="import-save">📤 Import Save File (.sav / .json / .save)</div>';
h += '<div class="small text-dim mt-8" style="text-align:center">Loads directly into the game</div>';
h += '<div class="sidebar-divider"></div>';
h += '<div class="nav-btn mt-8" style="background:var(--purple);color:#fff;font-weight:600;font-size:14px" data-action="restart-game">🔄 Restart Game (Back to Customization)</div>';
h += '<div class="nav-btn mt-8" style="font-size:12px;background:rgba(239,83,80,0.1);border-color:var(--red);color:var(--red)" data-action="reset-saves">⚠️ Delete All Saves</div>';
setTimeout(function(){ var el = document.getElementById('settings-body') || sc; if (el) el.innerHTML = h; }, 10);
})();
>>/* Support Me popup content */
<div class="support-popup">
<h2>Support EchoLink</h2>
<p>Every supporter keeps this project alive and gets exclusive content.</p>
<a class="support-link" href="https://www.patreon.com/c/galacticdeity12" target="_blank">🎮 Patreon — Early Access & Codes</a>
<a class="support-link" href="https://galacticdeity12.itch.io/echolink" target="_blank">💾 itch.io — Pay What You Want</a>
</div>/* Random EchoLink app messages between actions */
<<set _msg to random(1,8)>>
<<if _msg is 1>><<run EchoUI.notify('EchoLink: Signal from ' + State.variables.t1_name + ' strengthened')>>
<<elseif _msg is 2>><<run EchoUI.notify('EchoLink: New frequency pattern detected')>>
<<elseif _msg is 3>><<run EchoUI.notify('EchoLink: Network stability — nominal')>>
<<elseif _msg is 4>><<run EchoUI.notify('EchoLink: Someone is thinking about you...')>>
<<elseif _msg is 5>><<run EchoUI.notify('EchoLink: Echo depth increasing passively')>>
<<elseif _msg is 6>><<run EchoUI.notify('EchoLink: Signal interference detected nearby')>>
<<elseif _msg is 7>><<run EchoUI.notify('EchoLink: Reminder — check your nodes')>>
<<else>><<run EchoUI.notify('EchoLink: ...are you still there, Controller?')>>
<</if>>
<<goto "Loc_Hub">>/* Day Summary — shown at end of each day */
<div class="passage-image" data-scene="Night falling on campus — window view, city lights, contemplative mood"><img src="img/day_summary.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Day Summary"></div>
<h2 class="text-center text-cyan mb-16">Day <<= $dayCount>> — Summary</h2>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;font-size:13px">
<div>💰 Money: <span class="text-gold bold">$<<= $money>></span></div>
<div>📊 Influence: <span class="text-purple bold"><<= $influence>></span></div>
<div>⚠️ Risk: <span class="<<if $risk gt 70>>text-red<<else>>text-dim<</if>> bold"><<= $risk>>%</span></div>
<div>😰 Stress: <span class="bold"><<= $stress>></span></div>
<div>📡 Nodes: <span class="text-cyan bold"><<= $activeNodes>></span></div>
<div>🌐 Network: <span class="text-cyan bold"><<= $networkStrength>></span></div>
</div>
</div>
/* Narrative cliffhanger — Section 19 #7 */
<div style="background:var(--purple-dim);padding:12px;border-radius:var(--radius-md);margin-top:16px;font-style:italic;font-size:14px;color:var(--text-secondary)">
<<set _cliff to random(1,8)>>
<<if _cliff is 1>>Tomorrow: <<= $t2_name>> will be at the gym early. Alone. Something feels different about <<if $playerGender is "Male">>her<<else>>him<</if>>...
<<elseif _cliff is 2>>You notice <<= $t3_name>> glancing at your phone during the last lecture. Did <<if $playerGender is "Male">>she<<else>>he<</if>> see the app?
<<elseif _cliff is 3>>A new EchoLink message. Unknown sender. The signal pattern doesn't match any of your nodes.
<<elseif _cliff is 4>><<= $t1_name>> texted you a single word at 2 AM: "Please."
<<elseif _cliff is 5>>EchoLink detected a competing signal on campus. You're not the only Controller.
<<elseif _cliff is 6>>Your phone battery showed 3% all day but never died. The app is doing something.
<<elseif _cliff is 7>>Someone left a note under your door: "I know what you're doing."
<<else>>The network hummed louder tonight. Almost like it was... breathing.
<</if>>
</div>
<div class="nav-spacer"></div>
<<link `"Sleep — Begin Day " + ($dayCount + 1)`>><<goto "Core_DayAdvance">><</link>><div class="passage-image" data-scene="Target 1 portrait — close-up, campus background">
<<if $playerGender is "Male">><img src="img/t1_profile_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 1"><<else>><img src="img/t1_profile_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 1"><</if>>
</div>
<div class="overlay-title"><<= $t1_fullName>></div>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div>
<div class="npc-name"><<= $t1_fullName>></div>
<div class="small text-dim"><<if $playerGender is "Male">>Sophomore, Biochemistry<<else>>Junior, Literature (gap year)<</if>></div>
<div class="small">Level <<= $t1_corruptionLevel>> <<if $t1_nodeActive>>— <span class="text-green">ACTIVE NODE</span><</if>></div>
</div>
</div>
<div class="sidebar-divider"></div>
<div class="small mb-16">
<span class="text-cyan bold">Physical Description:</span><br>
<<if $playerGender is "Male">>Maya is a 19-year-old Vietnamese-American student with soft, delicate features. She has a slim, light frame with a modest chest and narrow hips — the kind of body that disappears inside her oversized sweaters. She wears dark-rimmed reddish-brown glasses, her dark hair parted to one side and falling past her shoulders. Her cream cable-knit sweater always hangs slightly off one shoulder, showing her collarbone — a detail she never bothers to fix, as if she doesn't notice or doesn't care.<<else>>Marcus is a 20-year-old junior with a tall, lean build — slim but deceptively toned underneath his hoodies. He has a strong defined jawline, slight stubble, and tousled blonde hair that falls to his jaw in loose waves. His brown eyes are warm but guarded, always watching before he speaks. He typically dresses in dark grey zip-up hoodies over plain black t-shirts, and has a habit of leaning against doorframes with his arms loose at his sides, reading the room before entering it.<</if>>
</div>
<div class="small mb-16">
<span class="text-purple bold">Background:</span><br>
<<if $playerGender is "Male">>Maya transferred in after a gap year spent caring for a sick parent. She keeps everyone at arm's length — polite but guarded. Top of her biochem class, but socially invisible by choice. She eats alone, studies alone, and hasn't let anyone close since arriving on campus. Her one indulgence is a worn paperback she rereads in the hallway between lectures.<<else>>Marcus arrived on a partial scholarship after deferring for a year to work construction back home. He's quiet — not shy, but deliberately reserved. Literature major who reads philosophy for fun but tells nobody. Has a reputation for being unapproachable, which he cultivates. The few people who've gotten past his walls say he's unexpectedly warm, but he shuts that down fast.<</if>>
</div>
<div class="small mb-16">
<span class="text-gold bold">Personality:</span><br>
<<if $playerGender is "Male">>Anxious, intelligent, people-pleasing under pressure. Craves connection but fears vulnerability. Once she trusts someone, her loyalty is absolute — and exploitable.<<else>>Guarded, perceptive, slow to trust. Masks emotional depth with silence. Once attached, he becomes quietly dependent — the kind of person who won't ask for help but falls apart without it.<</if>>
</div>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:' + $t1_trust + '%"></div></div><span class="npc-stat-val">' + $t1_trust + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Lust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill lust" style="width:' + $t1_lust + '%"></div></div><span class="npc-stat-val">' + $t1_lust + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Obedience</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill obedience" style="width:' + $t1_obedience + '%"></div></div><span class="npc-stat-val">' + $t1_obedience + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Corruption</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill corruption" style="width:' + $t1_corruption + '%"></div></div><span class="npc-stat-val">' + $t1_corruption + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Echo Depth</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill echo" style="width:' + $t1_echoDepth + '%"></div></div><span class="npc-stat-val">' + Math.round($t1_echoDepth) + '</span></div>'>>
</div>
<div class="nav-spacer"></div>
[[← Back to App|Loc_YourRoom_Phone]]<div class="passage-image" data-scene="Target 2 portrait — gym setting, athletic, confident">
<<if $playerGender is "Male">><img src="img/t2_profile_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 2"><<else>><img src="img/t2_profile_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 2"><</if>>
</div>
<div class="overlay-title"><<= $t2_fullName>></div>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div>
<div class="npc-name"><<= $t2_fullName>></div>
<div class="small text-dim"><<if $playerGender is "Male">>Grad Student / Personal Trainer<<else>>Coach / Former Athlete<</if>></div>
<div class="small">Level <<= $t2_corruptionLevel>> <<if $t2_nodeActive>>— <span class="text-green">ACTIVE NODE</span><</if>></div>
</div>
</div>
<div class="sidebar-divider"></div>
<div class="small mb-16">
<span class="text-cyan bold">Physical Description:</span><br>
<<if $playerGender is "Male">>Jess is a 24-year-old Korean-American powerhouse. Her athletic build is defined by years of competitive soccer and CrossFit — solid arms, a strong core, and thick, muscular thighs and glutes that her leggings do nothing to hide. Her chest is average but her lower body is where her strength lives. She keeps her hair pulled into a tight high ponytail and rarely wears anything other than sports bras and compression leggings.<<else>>Ryan is a 26-year-old former football player — and he looks it. Broad shoulders, thick chest, strong arms, the kind of frame that takes up space without trying. He has short, neatly styled dark brown hair and light stubble across a strong jawline. His face is ruggedly attractive with warm brown eyes and a slightly awkward smile that surfaces when he's outside his comfort zone. He lives in fitted dark athletic t-shirts that stretch across his chest and black training shorts.<</if>>
</div>
<div class="small mb-16">
<span class="text-purple bold">Background:</span><br>
<<if $playerGender is "Male">>Jess blew out her knee in her junior year of college soccer — full ACL tear. The sport that defined her identity was gone overnight. She rebuilt herself through personal training, channeling competitive energy into helping others get strong. She's finishing a Master's in Kinesiology while running the campus gym's training program. Underneath the bravado, she's terrified of being seen as broken.<<else>>Ryan played college football until a concussion protocol sidelined him permanently. Two years of identity crisis followed — drinking, dropping classes, nearly flunking out. He found his way back through coaching and fitness, earned a personal training cert, and now runs the campus gym. He overcompensates for past weakness with physical dominance, but he's softer than he looks.<</if>>
</div>
<div class="small mb-16">
<span class="text-gold bold">Personality:</span><br>
<<if $playerGender is "Male">>Loud, competitive, covers insecurity with aggression. Respects strength — physical or otherwise. Challenges everyone she meets but secretly wants someone who won't back down from her.<<else>>Outwardly confident, inwardly uncertain. Uses physicality as a social crutch. Loyal to a fault once he respects someone. Struggles with emotional vulnerability — easier to spot someone on a bench press than admit he's lonely.<</if>>
</div>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:' + $t2_trust + '%"></div></div><span class="npc-stat-val">' + $t2_trust + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Lust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill lust" style="width:' + $t2_lust + '%"></div></div><span class="npc-stat-val">' + $t2_lust + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Obedience</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill obedience" style="width:' + $t2_obedience + '%"></div></div><span class="npc-stat-val">' + $t2_obedience + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Corruption</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill corruption" style="width:' + $t2_corruption + '%"></div></div><span class="npc-stat-val">' + $t2_corruption + '</span></div>'>>
</div>
<div class="nav-spacer"></div>
[[← Back to App|Loc_YourRoom_Phone]]<div class="passage-image" data-scene="Target 3 portrait — office/academic setting, professional, distinguished">
<<if $playerGender is "Male">><img src="img/t3_profile_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 3"><<else>><img src="img/t3_profile_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Target 3"><</if>>
</div>
<div class="overlay-title"><<= $t3_fullName>></div>
<div class="npc-card">
<div class="npc-card-header">
<div class="npc-portrait">🎓</div>
<div>
<div class="npc-name"><<= $t3_fullName>></div>
<div class="small text-dim"><<if $playerGender is "Male">>Professor, Psychology<<else>>Professor, Philosophy<</if>></div>
<div class="small">Level <<= $t3_corruptionLevel>> <<if $t3_nodeActive>>— <span class="text-green">ACTIVE NODE</span><</if>></div>
</div>
</div>
<div class="sidebar-divider"></div>
<div class="small mb-16">
<span class="text-cyan bold">Physical Description:</span><br>
<<if $playerGender is "Male">>Dr. Reeves is a 38-year-old tenured professor with a sharp, polished appearance. She maintains a runner's build — lean through the waist with a curvy fuller chest that her tailored blazers and pencil skirts barely contain, no matter how professionally she dresses. Her brunette hair is usually pinned into a low, severe chignon. Off-campus she favors athleisure, but in the hall she is an intimidating figure, peering over her reading glasses with surgical precision.<<else>>Professor Hayes is a 41-year-old who looks exactly like what he is — a man who spends more time with books than people. Average build, nothing imposing. His face is ordinary and a little tired, with forehead lines, crow's feet, and slight bags under his eyes from too many late nights grading papers. His dark brown hair is thinning at the front, graying at the temples. He wears slightly wrinkled collared shirts with the sleeves rolled up and never quite looks put-together, though his students find the dishevelment oddly reassuring. His office is a mess of stacked papers, open books, and at least two coffee mugs at any given time.<</if>>
</div>
<div class="small mb-16">
<span class="text-purple bold">Background:</span><br>
<<if $playerGender is "Male">>Dr. Reeves published her first paper at 23 and had tenure by 35 — the youngest in the department's history. She's brilliant and knows it. Divorced two years ago — her ex couldn't handle being secondary to her career. She pours everything into research now, but her latest grant proposal was rejected. For the first time in her life, she's questioning whether she peaked. She won't admit it, but she's lonely in a way that academic achievement can't fix.<<else>>Professor Hayes spent a decade in academia overseas — Oxford, then a fellowship in Berlin — before returning stateside for a quieter life. He's published three books on moral philosophy, none of which sold well outside academia. Recently turned down a department chair position because he said he'd rather teach. His colleagues think he's principled. The truth is he's exhausted and hiding from ambition. His office hours run long because talking to students is the only part of the job he still enjoys.<</if>>
</div>
<div class="small mb-16">
<span class="text-gold bold">Personality:</span><br>
<<if $playerGender is "Male">>Controlled, analytical, emotionally armored. Tests everyone — students, colleagues, herself. Respects intelligence above all else. The signal has the hardest time with her because she notices patterns. But once the cracks form, they spread fast.<<else>>Patient, measured, genuinely kind. Hides fatigue behind warmth. Treats students as equals, which makes him approachable — and vulnerable. His resistance is high not because he's suspicious, but because he's principled. Breaking that requires something subtler than force.<</if>>
</div>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Trust</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill trust" style="width:' + $t3_trust + '%"></div></div><span class="npc-stat-val">' + $t3_trust + '</span></div>'>>
<<print '<div class="npc-stat-row"><span class="npc-stat-label">Corruption</span><div class="npc-stat-bar"><div class="npc-stat-bar-fill corruption" style="width:' + $t3_corruption + '%"></div></div><span class="npc-stat-val">' + $t3_corruption + '</span></div>'>>
</div>
<div class="nav-spacer"></div>
[[← Back to App|Loc_YourRoom_Phone]]/* Triggered when a new node activates */
<<run EchoUI.notify('📡 New node activated! Network strength: ' + State.variables.networkStrength)>>
<<run setTimeout(function(){ EchoUI.notify('EchoLink: The network welcomes ' + State.variables['t' + (State.variables.activeNodes) + '_name']); }, 3500)>>/* Shown when risk hits 75+ */
<div class="passage-image" data-scene="Warning — red alert on phone, EchoLink flashing danger signals"><img src="img/core_riskwarn.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Risk Warning"></div>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:var(--red)">⚠️</div><div class="dialogue-content"><div class="dialogue-name">EchoLink — WARNING</div><div class="dialogue-text">Controller, your exposure risk is critically high at <<= $risk>>%. Reduce activity or purchase Risk Shield. If risk reaches 100%, you will be discovered.</div></div></div>
<<if $upg_memoryWipe gt 0>>
<p class="small">You have <<= $upg_memoryWipe>> Memory Wipe charge(s) available.</p>
<</if>>
[[Understood — continue carefully|Loc_Hub]]<div class="passage-image" data-scene="Target's room night — sitting on bed edge, asking player to stay, low light">
<<if $playerGender is "Male">><img src="img/t1_lv3_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Stay the night"><<else>><img src="img/t1_lv3_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Stay the night"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ SUGGESTIVE CONTENT FILTERED ◆</span></div><</if>>
It's past 1 AM. You should leave. <<= $t1_name>> knows it too, but as you stand up from the bed to gather your things, <<if $playerGender is "Male">>she<<else>>he<</if>> catches your wrist.
<<if $playerGender is "Male">>Her<<else>>His<</if>> grip is surprisingly desperate.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">Stay. Please. I sleep so much better when you're here. When you leave, everything feels cold. Like the noise in my head gets too loud. Just stay with me.</div>
</div>
</div>
The noise <<if $playerGender is "Male">>she<<else>>he<</if>> hears IS the signal. Without you nearby, the neurological withdrawal creates static.
<<set $t1_trust += 4>>
<<set $t1_lust += 6>>
<<set $t1_obedience += 5>>
<<set $t1_lastLoop to 4>>
<div class="nav-spacer"></div>
[[📡 Stay — and deepen the signal overnight|T1_AttemptInfluence]]
[[Stay — but leave EchoLink alone|T1_JustTalk]]<div class="passage-image" data-scene="Public hallway — target grabbing player's hand, bold, students watching">
<<if $playerGender is "Male">><img src="img/t1_lv3_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Public display"><<else>><img src="img/t1_lv3_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Public display"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ SUGGESTIVE CONTENT FILTERED ◆</span></div><</if>>
You're walking through a crowded part of the campus when <<= $t1_name>> appears from nowhere, steps directly into your path, and interlaces <<if $playerGender is "Male">>her<<else>>his<</if>> fingers with yours. In front of everyone.
A few students stare. <<= $t1_name>> doesn't care. The app has completely suppressed <<if $playerGender is "Male">>her<<else>>his<</if>> natural social anxiety.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I don't want to hide this anymore. You're mine. <em>A sudden blink of surprise at <<if $playerGender is "Male">>her<<else>>his<</if>> own aggressive words.</em> I mean... we're... you know what I mean.</div>
</div>
</div>
<<set $t1_trust += 3>>
<<set $t1_lust += 5>>
<<set $t1_obedience += 6>>
<<set $t1_publicExposure += 5>>
<<set $risk += 3>>
<<set $t1_lastLoop to 5>>
<div class="nav-spacer"></div>
[[📡 Reinforce the public bond|T1_AttemptInfluence]]
[[Gently set boundaries|T1_JustTalk]]<div class="passage-image" data-scene="Gym exterior at night — locked doors, closed sign, dark windows">
<img src="img/loc_gym_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym — Closed">
</div>
<div class="location-header">
<div class="location-name">Gym</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Closed</div>
</div>
The gym is locked tight. The dark glass windows reflect the distant yellow glow of the campus streetlights. <<= $t2_name>> isn't here — even <<if $playerGender is "Male">>she<<else>>he<</if>> has to sleep sometime.
<div class="nav-spacer"></div>
[[Go somewhere else|Loc_Hub]]<div class="passage-image" data-scene="Dorm hallway evening — warm lights, quieter, dinner time">
<img src="img/loc_dorm_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dorm — Evening">
</div>
<div class="location-header">
<div class="location-name">Dorm Hallway</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Day <<= $dayCount>></div>
</div>
The hallway is calm. People are either down at the dining hall or locked in their rooms decompressing. You can hear a sitcom playing through someone's thin door, and the clink of dishes from the shared communal kitchen at the end of the hall.
<<if $t1_corruptionLevel gte 2>><<= $t1_name>>'s door is completely unlatched. <<if $playerGender is "Male">>She<<else>>He<</if>> is definitely waiting for you to walk in.<</if>>
<div class="nav-spacer"></div>
<<if $t1_corruptionLevel gte 2>><<link `"Visit " + $t1_name`>><<goto "T1_Lv2_Router">><</link>><</if>>
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Dorm hallway night — dim emergency lights, quiet, late">
<img src="img/loc_dorm_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dorm — Night">
</div>
<div class="location-header">
<div class="location-name">Dorm Hallway</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Day <<= $dayCount>></div>
</div>
The hallway is pitch dark except for the glaring red emergency exit signs casting bloody pools of light onto the carpet. Everyone should be asleep. The silence is thick and heavy.
<<if $t1_corruptionLevel gte 3>>
A distinct strip of light shows under <<= $t1_name>>'s door. <<if $playerGender is "Male">>She's<<else>>He's<</if>> wide awake. Waiting for you. The EchoLink signal reads strong even through the heavy wood.
<</if>>
<div class="nav-spacer"></div>
<<if $t1_corruptionLevel gte 3>><<link `"Knock on " + $t1_name + "'s door"`>><<goto "T1_Lv3_Router">><</link>><</if>>
[[Go back to your room|Loc_YourRoom_Night]]
[[Leave|Loc_Hub]]<<set _enc to random(1,6)>>
<<if _enc is 1>>
<div class="passage-image" data-scene="Mysterious student watching you from across quad"><img src="img/re_mysterious.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Stranger"></div>
A student you don't recognize watches you from across the quad. When you look directly at <<if random(1,2) is 1>>her<<else>>him<</if>>, they turn away quickly. EchoLink shows no signal. Just paranoia... probably.
<<elseif _enc is 2>>
You find a phone charging in the common room. The screen flickers — for a second, you swear you see the EchoLink icon. But it's just a screensaver.
<<elseif _enc is 3>>
A campus poster catches your eye: "CONCERNED ABOUT MIND-ALTERING TECHNOLOGY? Campus wellness seminar, Thursday." Coincidence?
<<elseif _enc is 4>>
Your phone buzzes with a notification from an app you don't have installed: "SIGNAL DETECTED — You are not alone." It vanishes before you can screenshot it.
<<elseif _enc is 5>>
<<= $t1_name>> mentioned you to someone in the hallway. You couldn't hear what <<if $playerGender is "Male">>she<<else>>he<</if>> said, but your name was definitely spoken.
<<else>>
The campus WiFi drops for exactly 5 seconds. During the blackout, your EchoLink signal spikes to maximum before returning to normal. What was that?
<</if>>
<<set $risk += 2>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Phone screen glitching — purple static, corrupted UI, error messages">
<img src="img/re_glitch.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="App Glitch">
</div>
You pull out your phone to check the time, but the screen is completely hijacked. EchoLink's interface corrupts for three terrifying seconds — violent purple static, raw hexadecimal code flooding the screen, and what looks disturbingly like a human face screaming in the background art.
Then it snaps back to normal, running smoothly.
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--red))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Ignore that. Routine system optimization. There is absolutely nothing to be concerned about, Controller.</div>
</div>
</div>
[[Okay...|Loc_Hub]]<<if $activeNodes gte 1>>
<div class="passage-image" data-scene="Walking through campus, faint whisper, looking over shoulder">
<img src="img/re_whisper.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Whisper">
</div>
Walking across the silent campus, you hear it — a faint, frantic whisper right at the edge of your perception. It isn't words, exactly. It's more like a frequency, a sub-bass hum that perfectly matches your heartbeat.
Your phone vibrates. EchoLink notification: //"Network resonance detected. Your nodes are thinking about you. They miss their Controller."//
<<set $networkStrength += 2>>
<<run EchoUI.showDelta([{val:2, label:'Network Strength'}])>>
<</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Finding cash on ground near vending machine">
<img src="img/re_money.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Found money">
</div>
You are buying a drink from a vending machine when you spot a crumpled $20 bill jammed under the machine's leg. You look around. The hallway is completely empty.
Free funding for the network.
<<set $money += 20>>
<<set $ach_moneyEarned += 20>>
<<run EchoUI.showDelta([{val:20, label:'Money'}])>>
<<run EchoUI.showAchievement('Lucky Find — +$20')>>
[[Pocket it and move on|Loc_Hub]]<div class="passage-image" data-scene="Stressful exam notification on phone, worried expression">
<img src="img/re_stress.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Stress event">
</div>
Your phone buzzes. It's not EchoLink — it's a university email. A professor just announced a massive surprise midterm for tomorrow morning. Your grades in that class are already riding the borderline of academic probation.
The stress hits you like a physical weight in your chest.
<<set $stress to Math.min(100, $stress + 15)>>
<<run EchoUI.showDelta([{val:15, label:'Stress'}])>>
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">Elevated cortisol levels detected in Controller. Consider resting. Or... focus your energy on the network. The network doesn't give pop quizzes. The network only offers control.</div>
</div>
</div>
[[Breathe through it|Loc_Hub]]You overhear two students talking about you: "That <<= $playerName>> person seems pretty cool. Really chill to be around."
<<set $reputation to Math.min(100, $reputation + 5)>>
<<run EchoUI.showDelta([{val:5, label:'Reputation'}])>>
[[Continue|Loc_Hub]]<<if $t1_introduced>>
Your phone buzzes. A text from <<= $t1_name>>:
<<set _txt to random(1,5)>>
<<if _txt is 1>>//"Hey, are you free later? I was thinking about you."//
<<elseif _txt is 2>>//"I had the weirdest dream about you last night. Can't stop thinking about it."//
<<elseif _txt is 3>>//"Study session tonight? I'll make snacks 😊"//
<<elseif _txt is 4>>//"<<= $playerName>>... I need to tell you something. In person. When can I see you?"//
<<else>>//"Nothing important. Just wanted you to know I'm smiling right now because of you."//
<</if>>
<<set $t1_trust += 1>>
<</if>>
[[Continue|Loc_Hub]]<<if $t2_introduced>>
A text from <<= $t2_name>>: //"Where were you today? Skipping leg day is NOT an option. Get to the gym."//
<<set $t2_trust += 1>>
<</if>>
[[Continue|Loc_Hub]]/* Exploit active nodes for money */
<<if $activeNodes is 0>>
No active nodes to exploit. Build your network first.
<<else>>
<<set _earnings to $activeNodes * 20>>
<<set $money += _earnings>>
<<set $risk += 5>>
<<set $ach_moneyEarned += _earnings>>
<<run EchoUI.showDelta([{val:_earnings, label:'Money'}, {val:5, label:'Risk'}])>>
You send subtle commands through your nodes. Each one generates resources through their social connections. It's not pretty, but the money flows.
<</if>>
[[Continue|Loc_YourRoom]]/* Check pending notifications */
<div class="passage-image" data-scene="Phone notification screen — multiple EchoLink alerts stacked"><img src="img/core_notifs.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Notifications"></div>
<div class="overlay-title">Notifications</div>
<<if $activeNodes gte 1>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:var(--green)">📡</div><div class="dialogue-content"><div class="dialogue-name">Network Update</div><div class="dialogue-text">Active nodes: <<= $activeNodes>> | Echo depth growing at <<if $upg_softEcho>>1.5x<<else>>1x<</if>> rate | Network strength: <<= $networkStrength>></div></div></div>
<</if>>
<<if $risk gte 50>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:var(--red)">⚠️</div><div class="dialogue-content"><div class="dialogue-name">Risk Alert</div><div class="dialogue-text">Current risk level: <<= $risk>>%. <<if $risk gte 75>>CRITICAL — reduce exposure immediately.<<else>>Elevated. Exercise caution.<</if>></div></div></div>
<</if>>
<<if $t1_suspicion or $t2_suspicion or $t3_suspicion>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:var(--orange)">👁️</div><div class="dialogue-content"><div class="dialogue-name">Suspicion Detected</div><div class="dialogue-text"><<if $t1_suspicion>><<= $t1_name>> is suspicious. <</if>><<if $t2_suspicion>><<= $t2_name>> is suspicious. <</if>><<if $t3_suspicion>><<= $t3_name>> is suspicious. <</if>>Consider using Memory Wipe (<<= $upg_memoryWipe>> charges).</div></div></div>
<</if>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:var(--purple)">📱</div><div class="dialogue-content"><div class="dialogue-name">EchoLink</div><div class="dialogue-text"><<if $appPersonality is "Helpful">>Everything's running smoothly, Controller. Keep up the good work.<<elseif $appPersonality is "Teasing">>Oh look, you actually check your notifications. Gold star for you.<<elseif $appPersonality is "Manipulative">>You missed 3 optimal influence windows today. Disappointing.<<else>><<if $dayCount lt 10>>I'm here for you, <<= $playerName>>. Always.<<else>>You check these notifications because I tell you to. Think about that.<</if>><</if>></div></div></div>
[[Close Notifications|Loc_YourRoom]]/* Corruption Journal — U2 preview, locked */
<div class="passage-image" data-scene="Dark journal cover with purple lock icon, 'Coming in Update 2' text"><img src="img/tool_journal.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Journal Locked"></div>
<div class="overlay-title">Corruption Journal</div>
<div class="text-center" style="padding:40px 0">
<div style="font-size:48px;margin-bottom:16px">🔒</div>
<div class="text-dim">The Corruption Journal unlocks in <span class="text-purple bold">Update 2 — "Deep Roots"</span></div>
<div class="small text-dim mt-8">Track your influence history, review past decisions, and uncover hidden lore about EchoLink's origins.</div>
</div>
[[Back|Loc_YourRoom]]/* Brief tutorial before first influence attempt */
<div class="passage-image" data-scene="EchoLink tutorial screen — signal wave diagram, simple UI explanation"><img src="img/intro_tutorial.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Tutorial"></div>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div><div class="dialogue-content"><div class="dialogue-name">EchoLink — Tutorial</div><div class="dialogue-text">Before your first attempt, Controller, understand the basics:</div></div></div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);font-size:13px;line-height:1.8">
<div><span class="text-cyan bold">📡 Influence Attempts</span> cost money and carry risk. Higher trust = better success rate.</div>
<div class="mt-8"><span class="text-green bold">✓ Success</span> increases corruption, builds toward node status. Small risk increase.</div>
<div class="mt-8"><span class="text-red bold">✗ Failure</span> increases risk significantly, raises suspicion, damages trust.</div>
<div class="mt-8"><span class="text-purple bold">🔗 Nodes</span> are targets that have been fully influenced. They spread your signal passively.</div>
<div class="mt-8"><span class="text-gold bold">⚠️ Risk 100%</span> = game over. Manage carefully.</div>
</div>
<<link "Got it — attempt influence">><<if $__tutReturn>><<goto $__tutReturn>><<else>><<goto "Loc_Hub">><</if>><</link>>/* Bridge passage between intro and first real day */
<div class="passage-image" data-scene="Dawn breaking through dorm window, new day, player waking with purpose"><img src="img/intro_nextmorning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Next morning"></div>
You barely slept. Every time you closed your eyes, you saw the EchoLink interface — those pulsing purple waves, the signal readouts, <<= $t1_name>>'s profile.
Now it's morning. Day 1. For real this time.
Your phone shows a new message from EchoLink:
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div><div class="dialogue-content"><div class="dialogue-name">EchoLink</div><div class="dialogue-text">Good morning, Controller. <<= $t1_name>> will be in the dorm hallway between 8 and noon. I suggest starting there. Build trust first. The signal works best on those who already want to let you in.</div></div></div>
<<run EchoUI.notify('Day 1 — It Begins', 'var(--cyan)')>>
<div class="nav-spacer"></div>
[[Head to the Dorm Hallway|Loc_Dorm_Morning]]
[[Explore the campus first|Loc_Hub]]
[[Check the Upgrade Shop|Tool_UpgradeShop]]/* Triggered when player has 3+ nodes and checks phone */
<<if $activeNodes gte 3 or $debugMode>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div><div class="dialogue-content"><div class="dialogue-name">EchoLink</div><div class="dialogue-text">Three nodes. The network has reached critical mass. A new phase is beginning, Controller. Are you ready to see where this goes?</div></div></div>
<div class="nav-spacer"></div>
[[Embrace the network — see Ending 3|End_3_Teaser]]
[[Not yet — keep building|Loc_Hub]]
<<else>>
The network isn't strong enough yet. Keep building nodes.
[[Continue|Loc_Hub]]
<</if>>/* Check and trigger Ending 9 */
<<if (!$usedCheats and $risk lt 20 and $t1_corruptionLevel gte 3 and $t2_corruptionLevel gte 1 and $t3_corruptionLevel gte 1) or $debugMode>>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--cyan), var(--green))">⚖️</div><div class="dialogue-content"><div class="dialogue-name">EchoLink — Anomaly</div><div class="dialogue-text">Controller... this is unprecedented. You've maintained perfect balance — influence without chaos, control without destruction. I didn't think your kind was capable. Perhaps I misjudged you.</div></div></div>
<div class="nav-spacer"></div>
[[Accept the balance — Ending 9|End_9_PerfectBalance]]
[[Ignore this — keep playing|Loc_Hub]]
<<else>>
Conditions not met for this ending. Keep playing.
[[Continue|Loc_Hub]]
<</if>><div class="passage-image" data-scene="Phone screen with red 'PURGE' button, purple glitch static">
<img src="img/t1_wipe.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Memory Wipe">
</div>
<div class="true-influence-warning">
<p><strong>ATTENTION:</strong> A Memory Wipe will eliminate all current suspicion from <<= $t1_name>>'s mind, but it is taxing on the hardware.</p>
<p class="small">Consumes 1 charge. Charges remaining: <<= $upg_memoryWipe>>.</p>
</div>
[[CONFIRM PURGE|T1_MemoryWipe]]
[[CANCEL|Loc_Hub]]/* Random bonus for Experimenter personality */
<<if $playerPersonality is "Experimenter">>
<<set _bonus to random(1,6)>>
<<if _bonus is 1>><<set $money += 25>><<run EchoUI.showDelta([{val:25, label:'Money (Experimenter Bonus!)'}])>>
<<elseif _bonus is 2>><<set $influence += 8>><<run EchoUI.showDelta([{val:8, label:'Influence (Experimenter Bonus!)'}])>>
<<elseif _bonus is 3>><<set $risk to Math.max(0, $risk - 10)>><<run EchoUI.showDelta([{val:-10, label:'Risk (Experimenter Bonus!)'}])>>
<<elseif _bonus is 4>><<set $stress to Math.max(0, $stress - 15)>><<run EchoUI.showDelta([{val:-15, label:'Stress (Experimenter Bonus!)'}])>>
<<elseif _bonus is 5>><<set $t1_trust to Math.min(100, $t1_trust + 5)>><<run EchoUI.showDelta([{val:5, label:$t1_name + ' Trust (Bonus!)'}])>>
<<else>><<set $reputation to Math.min(100, $reputation + 5)>><<run EchoUI.showDelta([{val:5, label:'Reputation (Experimenter Bonus!)'}])>>
<</if>>
<<run EchoUI.showAchievement('🎲 Experimenter Bonus!')>>
<</if>><div class="passage-image" data-scene="Empty lecture hall evening — dramatic lighting, rows of empty seats">
<img src="img/loc_lecture_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lecture Hall — Evening">
</div>
<div class="location-header">
<div class="location-name">Lecture Hall</div>
<div class="location-time"><span class="time-icon">🌆</span> Evening — Closed</div>
</div>
The lecture hall is completely empty. Endless rows of fold-down seats stretch upward into heavy shadows. <<= $t3_name>> has gone home for the day. There's something intensely eerie about an empty auditorium of this size.
<<if $t3_corruptionLevel gte 2>><p class="small text-dim">But wait... you notice a strip of warm light shining from under <<= $t3_name>>'s private office door upstairs...</p><</if>>
<div class="nav-spacer"></div>
[[Leave|Loc_Hub]]<div class="passage-image" data-scene="Lecture hall at night — completely dark, moonlight through high windows">
<img src="img/loc_lecture_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lecture Hall — Night">
</div>
<div class="location-header">
<div class="location-name">Lecture Hall</div>
<div class="location-time"><span class="time-icon">🌙</span> Night — Locked</div>
</div>
The academic building is sealed and locked. Cold moonlight streams through the high clerestory windows, casting sharp, geometric shadows across the rows of empty seats inside. No one is here. No signals to read.
<div class="nav-spacer"></div>
[[Leave|Loc_Hub]]/* Final confirmation screen before game start */
<div class="cust-container">
<div class="text-center mb-16">
<div style="font-size:48px;margin-bottom:8px">📡</div>
<h2 class="text-cyan" style="font-size:22px;letter-spacing:3px">READY?</h2>
</div>
<div style="background:var(--bg-elevated);padding:20px;border-radius:var(--radius-lg);margin-bottom:24px">
<div style="font-size:14px;line-height:2">
<div><span class="text-dim">Player:</span> <span class="text-cyan bold"><<= $playerName>></span> (<<= $playerGender>>)</div>
<div><span class="text-dim">Personality:</span> <span class="text-purple bold"><<= $playerPersonality>></span></div>
<div><span class="text-dim">Setting:</span> <<= $startingScenario>></div>
<div><span class="text-dim">Difficulty:</span> <<= $difficulty>> — <span class="text-gold">$<<= $money>></span></div>
<div><span class="text-dim">App Voice:</span> <<= $appVoice>></div>
<div><span class="text-dim">App AI:</span> <<= $appPersonality>></div>
</div>
</div>
<p class="text-center text-dim small">Once you start, you can change settings anytime via the ⚙️ menu.</p>
<div class="cust-nav" style="flex-direction:column;gap:8px;">
<div class="cust-btn cust-btn-start" onclick="Engine.play('Cust_GenderBranch')">▶ BEGIN ECHOLINK</div>
<div class="cust-btn cust-btn-back" onclick="Engine.play('Cust_Page4')">← Go Back</div>
</div>
</div><<set $ach_t3Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Professor's office — bookshelves, desk lamp, two chairs facing each other, intimate academic space">
<<if $playerGender is "Male">><img src="img/t3_office_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office hours"><<else>><img src="img/t3_office_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office hours"><</if>>
</div>
<<= $t3_name>>'s office is smaller and more intimate than you expected. Books cover every inch of wall space, floor to ceiling. A single green glass desk lamp casts warm light across the room. <<if $playerGender is "Male">>She<<else>>He<</if>> gestures to the heavy leather chair directly across from <<if $playerGender is "Male">>her<<else>>his<</if>> desk.
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text">You came. Good. Most students are far too intimidated to actually show up to my office hours. Sit down. Let's discuss your question from class.</div>
</div>
</div>
The conversation starts purely academic, but slowly drifts. <<= $t3_name>> talks about <<if $playerGender is "Male">>her<<else>>his<</if>> early research, a sabbatical <<if $playerGender is "Male">>she<<else>>he<</if>> never took, a marriage that fell apart. The walls are coming down, inch by inch.
<<set $t3_trust += 6>>
<<run EchoUI.showDelta([{val:6, label:$t3_name + ' Trust'}])>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]/* Body Status panel — locked until U4 */
<div class="text-center" style="padding:40px 0">
<div style="font-size:48px;margin-bottom:16px">🧍</div>
<div class="overlay-title">Body Status</div>
<div class="text-dim">This feature unlocks in <span class="text-purple bold">Update 4 — "Emergence"</span></div>
<div class="small text-dim mt-8">A 2D/3D character model that reacts to your stats, influence level, and story progression.</div>
</div>/* Achievements panel — locked until U3 */
<div class="text-center" style="padding:40px 0">
<div style="font-size:48px;margin-bottom:16px">🏆</div>
<div class="overlay-title">Achievements</div>
<div class="text-dim">Full achievement tracker unlocks in <span class="text-purple bold">Update 3</span></div>
<div class="small text-dim mt-16">Achievements earned so far:</div>
<<if $ach_firstAttempt>><div class="small text-green mt-8">✓ First Attempt Made</div><</if>>
<<if $ach_firstNode>><div class="small text-green mt-8">✓ First Node Activated</div><</if>>
<<if $ach_firstGymVisit>><div class="small text-green mt-8">✓ First Gym Visit</div><</if>>
<<if $ach_networkOf3>><div class="small text-green mt-8">✓ Network of 3</div><</if>>
<<if $ach_day7>><div class="small text-green mt-8">✓ Survived 7 Days</div><</if>>
<<if $ach_level3>><div class="small text-green mt-8">✓ Level 3 Reached</div><</if>>
<<if $ach_level5>><div class="small text-green mt-8">✓ Level 5 Reached</div><</if>>
<<if $ach_allT1Upgrades>><div class="small text-green mt-8">✓ All Tier 1 Upgrades</div><</if>>
</div><div class="passage-image" data-scene="Target waiting outside lecture hall for player, desperate devotion">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting outside class"><<else>><img src="img/t1_lv4_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting outside class"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ INTIMATE CONTENT FILTERED ◆</span></div><</if>>
You exit your afternoon lecture hall and <<= $t1_name>> is standing there. Waiting. <<if $playerGender is "Male">>She<<else>>He<</if>> wasn't even in this building — <<if $playerGender is "Male">>she<<else>>he<</if>> crossed the entire campus just to see you the exact second you were free.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I memorized your schedule. I hope that's not creepy. I just... I can't wait in my room anymore. I need to be where you are. Use me to carry your bag. Anything.</div>
</div>
</div>
The obsession is complete. <<if $playerGender is "Male">>She<<else>>He<</if>> has willingly handed over the reins to <<if $playerGender is "Male">>her<<else>>his<</if>> autonomy.
<<set $t1_trust += 2>>
<<set $t1_lust += 7>>
<<set $t1_obedience += 9>>
<<set $t1_lastLoop to 4>>
<div class="nav-spacer"></div>
[[📡 Reward this devotion — signal boost|T1_AttemptInfluence]]
[[Set a gentle boundary|T1_JustTalk]]<div class="passage-image" data-scene="Target mirroring player's style — same posture, similar clothes, identity blurring">
<<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv4_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Identity loss"><<else>><img src="img/t1_lv4_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Identity loss"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>>
</div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ INTIMATE CONTENT FILTERED ◆</span></div><</if>>
<<= $t1_name>> shows up to your room wearing an outfit that perfectly mimics your style. <<if $playerGender is "Male">>She<<else>>He<</if>> sits the way you sit. Uses phrases you use. <<if $playerGender is "Male">>Her<<else>>His<</if>> original identity is dissolving into a reflection of you.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text">I stopped talking to my old friends. They don't understand me anyway. Only you understand me. We're becoming synchronized, <<= $playerName>>. I want to be exactly what you want me to be.</div>
</div>
</div>
<<set $t1_trust += 2>>
<<set $t1_lust += 6>>
<<set $t1_obedience += 10>>
<<set $t1_lastLoop to 5>>
<div class="nav-spacer"></div>
[[📡 Accelerate the mental merge|T1_AttemptInfluence]]
[[This is too much — pull back|T1_JustTalk]]<<set $t1_loopCount++>><<set $t1_lastLoop to 4>>
<div class="passage-image" data-scene="Level 5 variant D — unique setting, full influence"><<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 D"><<else>><img src="img/t1_lv5_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 D"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>></div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ EXPLICIT CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>
You’ve been edging <<print $t1_name>> for over an hour. Fingers, tongue, <<if $playerGender is "Male">>the head of your cock<<else>>his desperate cock, grinding against you<</if>> — everything but letting <<if $playerGender is "Male">>her<<else>>him<</if>> cum. <<print $t1_name>> is a sobbing, trembling mess, thighs slick, voice hoarse from begging.
“Please—please let me cum—I’ll do anything—I’m already gone, just let me—”
<<if $playerGender is "Male">>
You deny her again. <<print $t1_name>> wails, hips jerking uselessly against nothing. Only when she is crying real tears and promising to delete every memory of her old life do you finally slam inside her and fuck her with short, brutal strokes while rubbing her clit.
The orgasm that rips through <<print $t1_name>> is violent. Her whole body locks up, cunt clenching so hard it almost pushes you out, and she screams your name like it’s the only word left in her vocabulary. When it finally ends, <<print $t1_name>> goes completely limp, eyes rolled back, a broken little smile on her face.
<<else>>
You deny him again. <<print $t1_name>> wails, hips jerking uselessly against nothing. Only when he is crying real tears and promising to delete every memory of his old life do you finally order him inside you. He obeys instantly, pushing in with short, brutal strokes on your command.
The orgasm that rips through you is violent. Your whole body locks up, clenching so hard around him it almost pushes him out, and you scream his name like it’s the only word left in your vocabulary. When it finally ends, <<print $t1_name>> goes completely limp on top of you, eyes rolled back, a broken little smile on his face — waiting for your next command.
<</if>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Barely conscious, voice a wrecked whisper.</em> That was the last of me. I felt it die when I came. Thank you for killing it. I’m finally… empty. Perfect.</div>
</div>
</div>
<<else>>
The moment deepens beyond words. <<print $t1_name>> is completely yours now — every thought, every breath, drawn toward you like gravity. Time passes. When the world comes back into focus, something has fundamentally changed between you.
<</if>>
<<set $t1_lust += 5>><<set $t1_obedience += 5>>
<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<set $t1_loopCount++>><<set $t1_lastLoop to 5>>
<div class="passage-image" data-scene="Level 5 variant E — most emotionally complex, full depth"><<if $contentExplicit>><<if $playerGender is "Male">><img src="img/t1_lv5_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 E"><<else>><img src="img/t1_lv5_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 5 E"><</if>><<else>><img src="img/sfw_fadeblack.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Scene continues — explicit content off"><</if>></div>
<<if !$contentExplicit>><div style="text-align:center;padding:8px 12px;margin:8px 0;border:1px solid rgba(239,83,80,0.15);border-radius:4px;background:rgba(239,83,80,0.03)"><span style="color:#ef5350;font-family:'Courier New',monospace;font-size:10px;letter-spacing:2px">◆ EXPLICIT CONTENT FILTERED ◆</span></div><</if>>
<<if $contentExplicit>>
<<if $playerGender is "Male">>
<<print $t1_name>> rides you slowly, deliberately, her hands braced on your chest. Every time she sinks down, she whispers it like a prayer:
“I love you… I love you… I love you…”
The words are empty. You both know it. The signal put them there. <<print $t1_name>>’s eyes are glassy, unfocused, repeating the phrase on autopilot while her hips roll.
Then — for three terrifying seconds — the signal flickers. <<print $t1_name>>’s eyes clear. She looks down at you and the horror that flashes across her face is real.
“Oh god… I don’t— I don’t actually—”
The signal slams back in like a hammer. <<print $t1_name>>’s back arches violently, her cunt clamps down, and she cums so hard she screams. The clarity is gone. Only blank, blissful devotion remains.
<<else>>
You pull <<print $t1_name>> on top of you and order him inside you. He obeys instantly, pushing in slowly and deliberately on your command. Every time he sinks deeper, you tell him to whisper it like a prayer:
“I love you… I love you… I love you…”
The words are empty. You both know it. The signal put them there. <<print $t1_name>>’s eyes are glassy, unfocused, repeating the phrase on autopilot while his hips roll on your command.
Then — for three terrifying seconds — the signal flickers. <<print $t1_name>>’s eyes clear. He looks down at you and the horror that flashes across his face is real.
“Oh god… I don’t— I don’t actually—”
The signal slams back in like a hammer. <<print $t1_name>>’s back arches violently, his ass clenches tight around you, and he cums so hard he screams. The clarity is gone. Only blank, blissful devotion remains.
<</if>>
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>👩<<else>>👨<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t1_name>></div>
<div class="dialogue-text"><em>Still shaking from the forced orgasm, eyes completely empty again.</em> I love you. I love you. I love you. There’s nothing else. There never was. Thank you for making me forget.</div>
</div>
</div>
<<else>>
The moment deepens beyond words. <<print $t1_name>> is completely yours now — every thought, every breath, drawn toward you like gravity. Time passes. When the world comes back into focus, something has fundamentally changed between you.
<</if>>
<<set $t1_lust += 4>><<set $t1_obedience += 5>>
<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Sparring session — gym mats, physical combat, intense eye contact">
<<if $playerGender is "Male">><img src="img/t2_lv2_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Sparring"><<else>><img src="img/t2_lv2_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Sparring"><</if>>
</div>
"Let's spar. Grappling only," <<= $t2_name>> says, kicking off <<if $playerGender is "Male">>her<<else>>his<</if>> shoes and stepping onto the padded mats.
The wrestling quickly becomes far more intimate than either of you expected. Within minutes, <<= $t2_name>> has you pinned firmly to the mat. You are both breathing hard, chests heaving, faces dangerously close.
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text"><em>Pinning you, refusing to move off.</em> I win. <em>A long, suffocatingly tense pause.</em> But I don't really want to get up.</div>
</div>
</div>
<<set $t2_trust += 4>>
<<set $t2_lust += 7>>
<<set $t2_obedience += 3>>
<<set $t2_lastLoop to 4>>
<div class="nav-spacer"></div>
[[📡 Activate signal in this compromising position|T2_AttemptInfluence]]
[[Tap out — stay professional|T2_JustTrain]]<div class="passage-image" data-scene="Trainer handing over gym key, trusting expression, after hours">
<<if $playerGender is "Male">><img src="img/t2_lv2_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym key"><<else>><img src="img/t2_lv2_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Gym key"><</if>>
</div>
You are packing your bag to leave when <<= $t2_name>> walks over and presses something cold and metallic into your palm. A brass key.
"My spare," <<= $t2_name>> says quietly. "For after-hours access. I only give these to people I trust completely."
<div class="dialogue-box">
<div class="dialogue-portrait"><<if $playerGender is "Male">>🏋️♀️<<else>>🏋️<</if>></div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t2_name>></div>
<div class="dialogue-text">Don't make me regret this. <em>A pause, <<if $playerGender is "Male">>her<<else>>his<</if>> voice dropping softer.</em> Actually... I don't think I could regret anything with you.</div>
</div>
</div>
<<set $t2_trust += 6>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 4>>
<<set $t2_lastLoop to 5>>
<div class="nav-spacer"></div>
[[📡 This absolute trust is perfect — signal boost|T2_AttemptInfluence]]
[[Accept the key — no tricks|T2_JustTrain]]<div class="passage-image" data-scene="Professor's office, late afternoon, personal conversation, guard slightly down">
<<if $playerGender is "Male">><img src="img/t3_lv1_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="T3 personal side"><<else>><img src="img/t3_lv1_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="T3 personal side"><</if>>
</div>
<<= $t3_name>> leans back in <<if $playerGender is "Male">>her<<else>>his<</if>> leather office chair after a long, grueling lecture. The strict, intimidating professional mask slips — just for a fleeting moment.
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text">You know, <<= $playerName>>, most students see me as a function. A machine that outputs grades and recommendation letters. You actually seem to see me as a person. That's... more valuable than you realize.</div>
</div>
</div>
<<set $t3_trust += 4>>
<<set $t3_lastLoop to 1>>
<div class="nav-spacer"></div>
<<if $t3_trust gte 40>>[[📡 Attempt influence (HIGH RISK)|T3_AttemptInfluence]]<</if>>
[[Continue the conversation|T3_AcademicTalk]]<div class="passage-image" data-scene="Office, papers everywhere, professor frustrated with research, vulnerable">
<<if $playerGender is "Male">><img src="img/t3_lv1_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Research frustration"><<else>><img src="img/t3_lv1_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Research frustration"><</if>>
</div>
You walk into <<= $t3_name>>'s office to find <<if $playerGender is "Male">>her<<else>>him<</if>> surrounded by marked-up, rejected research papers. <<if $playerGender is "Male">>She<<else>>He<</if>> rubs <<if $playerGender is "Male">>her<<else>>his<</if>> temples, looking utterly exhausted and surprisingly vulnerable.
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text">The journal rejected my latest paper. Again. Sometimes I wonder if I'm just shouting into a void in this career. <em>Catches <<if $playerGender is "Male">>herself<<else>>himself<</if>>, straightening up.</em> My apologies. I shouldn't be telling a student this.</div>
</div>
</div>
<<set $t3_trust += 5>>
<<set $t3_lastLoop to 2>>
<div class="nav-spacer"></div>
<<if $t3_trust gte 40>>[[📡 Use this vulnerability|T3_AttemptInfluence]]<</if>>
[[Offer genuine support|T3_AcademicTalk]]<div class="passage-image" data-scene="Faculty café, professor and student sharing coffee, crossing professional lines slightly">
<<if $playerGender is "Male">><img src="img/t3_lv1_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Coffee with professor"><<else>><img src="img/t3_lv1_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Coffee with professor"><</if>>
</div>
<<= $t3_name>> suggested getting coffee after office hours. Not in <<if $playerGender is "Male">>her<<else>>his<</if>> office — at the faculty café across campus. The shift in setting changes the power dynamic entirely. It feels dangerously close to a date.
<div class="dialogue-box">
<div class="dialogue-portrait">🎓</div>
<div class="dialogue-content">
<div class="dialogue-name"><<= $t3_name>></div>
<div class="dialogue-text">Off the record — and I never said this — the best students aren't the ones who study the hardest. They're the ones who understand human psychology. And you, <<= $playerName>>... you understand people very well. Perhaps too well.</div>
</div>
</div>
<<set $t3_trust += 5>>
<<set $t3_lastLoop to 3>>
<div class="nav-spacer"></div>
<<if $t3_trust gte 40>>[[📡 Test the signal — carefully|T3_AttemptInfluence]]<</if>>
[[Keep building rapport|T3_AcademicTalk]]<<if !$t3_lv1_seen>><<set $t3_lv1_seen to true>><<goto "T3_OfficeHours">><</if>>
<<set _v to random(1,3)>>
<<if _v is $t3_lastLoop>><<set _v to (_v % 3) + 1>><</if>>
<<set $t3_lastLoop to _v>>
<<run EchoGame.advanceTime()>>
<<set $t3_loopCount++>>
<<if _v is 1>><<goto "T3_Lv1_Loop_A">>
<<elseif _v is 2>><<goto "T3_Lv1_Loop_B">>
<<else>><<goto "T3_Lv1_Loop_C">>
<</if>>/* Called occasionally to inject random events */
<<set _ev to random(1,10)>>
<<if _ev lte 2>><<goto "RandomEvent_AppMessage">>
<<elseif _ev is 3>><<goto "RandomEvent_CampusEncounter">>
<<elseif _ev is 4>><<goto "RandomEvent_AppGlitch">>
<<elseif _ev is 5>><<goto "RandomEvent_NodeWhisper">>
<<elseif _ev is 6>><<goto "RandomEvent_MoneyFind">>
<<elseif _ev is 7>><<goto "RandomEvent_StressEvent">>
<<elseif _ev is 8>><<goto "RandomEvent_ReputationBoost">>
<<elseif _ev is 9>><<goto "RandomEvent_T1Text">>
<<else>><<goto "RandomEvent_T2Challenge">>
<</if>>/* Routes to time-specific location variants */
<<if $timeSlot is "Morning">><<goto "Loc_Hub">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Hub">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Hub">>
<<else>><<goto "Loc_Hub">>
<</if>>/* Standalone Patreon prompt passage */
<div class="patreon-prompt">
<h3>Enjoying EchoLink?</h3>
<p>Supporters get early access, exclusive scenes, in-game codes, and behind-the-scenes content.</p>
<div style="font-size:12px;color:var(--text-dim);margin-bottom:12px">New chapters drop monthly · Codes rotate every 5 minutes</div>
<div class="small text-dim mb-8">"Supporters are 2 chapters ahead right now."</div>
<a class="patreon-cta" href="https://www.patreon.com/c/galacticdeity12" target="_blank">Support on Patreon</a>
</div>
<div class="nav-spacer"></div>
[[Continue playing|Loc_Hub]]/* End of day transition — wrap-up before sleep */
<<if $dayCount gte 2>>
<<goto "DaySummary_Screen">>
<<else>>
<<goto "Core_DayAdvance">>
<</if>><div class="passage-image" data-scene="Signal visualization — first node locking in, brain mapping glow">
<img src="img/t1_transition_lv1.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Sync Established">
</div>
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink</div>
<div class="dialogue-text">NODE ESTABLISHED. <<= $t1_name>> is now a permanent part of your network. <<if $playerGender is "Male">>Her<<else>>His<</if>> subconscious will now radiate your signal, softening the resistance of everyone <<if $playerGender is "Male">>she<<else>>he<</if>> interacts with. Well done, Controller.</div>
</div>
</div>
The frequency in your pocket deepens. You feel a physical thrum in your chest, a tether connecting your mind to <<if $playerGender is "Male">>hers<<else>>his<</if>>. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't know it yet, but <<if $playerGender is "Male">>her<<else>>his<</if>> autonomy just became a shared resource.
[[Continue|Loc_Hub]]/* Shown once when T2 reaches Level 1 */
<div class="passage-image" data-scene="Second node connecting — gym setting, purple pulse rippling through equipment"><<if $playerGender is "Male">><img src="img/t2_transition_lv1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Second node"><<else>><img src="img/t2_transition_lv1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Second node"><</if>></div>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div><div class="dialogue-content"><div class="dialogue-name">EchoLink</div><div class="dialogue-text">SECOND NODE ONLINE. <<= $t2_name>> connected. Network strength increasing. The gym will never be the same — every person who trains near <<if $playerGender is "Male">>her<<else>>him<</if>> absorbs a trace of the signal.</div></div></div>
Two nodes. The network is real now. You can feel it — a subtle hum at the edge of your awareness, like a heartbeat that isn't yours.
[[Continue|Loc_Hub]]/* Shown once when T3 reaches Level 1 */
<div class="passage-image" data-scene="Third node — lecture hall, purple frequency waves spreading from podium"><<if $playerGender is "Male">><img src="img/t3_transition_lv1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Third node"><<else>><img src="img/t3_transition_lv1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Third node"><</if>></div>
<div class="dialogue-box"><div class="dialogue-portrait" style="background:linear-gradient(135deg, var(--purple), var(--cyan))">📡</div><div class="dialogue-content"><div class="dialogue-name">EchoLink</div><div class="dialogue-text">THIRD NODE ACTIVE. <<= $t3_name>> — a professor. An authority figure. Every student in <<if $playerGender is "Male">>her<<else>>his<</if>> lectures will receive passive exposure. This changes everything, Controller.</div></div></div>
Three nodes. The network has reached critical mass. You can feel the web of influence stretching across campus — invisible, growing, unstoppable.
<<run EchoUI.showAchievement('Network of Three — Critical Mass')>>
[[Continue|Loc_Hub]]/* Catches any game-over state and redirects properly */
<<if $risk gte 100>><<goto "End_1_Exposed">><</if>>
<<goto "Loc_Hub">><div class="cust-container">
<h2 class="text-center text-cyan mb-16" style="font-size:20px;">HOW TO PLAY</h2>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="text-purple bold mb-8">NAVIGATION</div>
<div class="small" style="line-height:2">
<span class="text-cyan">☰</span> — Stats sidebar <span class="text-cyan">📊</span> — Stats <span class="text-cyan">👥</span> — Network Tracker <span class="text-cyan">⚙️</span> — Settings <span class="text-cyan">💾</span> — Save/Load
</div></div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="text-purple bold mb-8">KEY TERMS</div>
<div class="small" style="line-height:2">
<span class="text-cyan">T1/T2/T3</span> — Target 1 (Maya/Marcus), Target 2 (Jess/Ryan), Target 3 (Professor)<br>
<span class="text-cyan">Node</span> — Fully connected target in your network<br>
<span class="text-cyan">Echo Depth</span> — How deep the signal runs (grows daily)<br>
<span class="text-cyan">Network Strength</span> — Sum of all Echo Depths<br>
<span class="text-cyan">Corruption 0-5</span> — Influence level on target<br>
<span class="text-cyan">Risk 100%</span> — Game over (you're discovered)
</div></div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="text-purple bold mb-8">GAMEPLAY</div>
<div class="small" style="line-height:1.8">
4 time slots per day. Each action uses one slot. Visit locations, build trust, then use EchoLink to influence targets. Earn money at the Cafe, buy upgrades, manage Risk, grow your network.
</div></div>
<div class="nav-spacer"></div>
<<if $gameStarted>>[[Got it — Back to game|Loc_Hub]]<<else>>[[← Back to Title|00_Boot]]<</if>>
</div>/* Load screen at game start */
<div class="cust-container">
<h2 class="text-center text-cyan mb-16" style="font-size:20px;">LOAD GAME</h2>
<<run
setTimeout(function(){
var el = document.getElementById('boot-saves');
if (!el) return;
var h = '';
var ai = EchoSave.getSlotInfo('auto');
if (ai) h += '<div class="save-slot" style="border-color:var(--cyan)"><div class="save-slot-header"><span class="save-slot-num">AUTO</span><span class="save-slot-meta">Day '+ai.day+' | Nodes: '+ai.nodes+'</span></div><div class="save-slot-actions"><div class="save-btn-sm save-btn-load" data-action="load-slot" data-slot="auto">Load</div></div></div>';
for (var i = 1; i <= 10; i++) {
var inf = EchoSave.getSlotInfo(i);
if (inf) h += '<div class="save-slot"><div class="save-slot-header"><span class="save-slot-num">Slot '+i+'</span><span class="save-slot-meta">Day '+inf.day+' | Risk: '+inf.risk+'%</span></div><div class="save-slot-actions"><div class="save-btn-sm save-btn-load" data-action="load-slot" data-slot="'+i+'">Load</div></div></div>';
}
if (!h) h = '<div class="text-center text-dim" style="padding:20px">No saves found</div>';
el.innerHTML = h;
}, 50);
>>
<div id="boot-saves"></div>
<div class="sidebar-divider"></div>
<div class="cust-label">Import from File</div>
<input type="file" id="importFileInput" accept=".txt,.json,.echolink" style="display:none">
<div class="nav-btn" style="font-size:13px" id="importFileBtn">📂 Import Save File</div>
<<run
setTimeout(function(){
var btn = document.getElementById('importFileBtn');
var inp = document.getElementById('importFileInput');
if (btn && inp) {
btn.addEventListener('click', function(){ inp.click(); });
inp.addEventListener('change', function(e){
var file = e.target.files[0];
if (!file) return;
var reader = new FileReader();
reader.onload = function(ev){
var r = EchoSave.importSave(ev.target.result.trim(), 10);
if (r.success) { EchoUI.notify('Imported to slot 10!'); Engine.play('Boot_LoadScreen'); }
else EchoUI.notify('Invalid save file', '#ef5350');
};
reader.readAsText(file);
});
}
}, 100);
>>
<div class="nav-spacer"></div>
[[← Back to Title|00_Boot]]
</div>/* Age verification gate — required before game access
Real date math: users born 2008 or earlier are 18+ as of 2026 */
<div class="age-gate">
<h2>🔞 ADULT CONTENT</h2>
<p class="small text-dim">EchoLink contains adult themes and explicit content.<br>You must be 18 years or older to continue.</p>
<div class="warning">
⚠️ By entering, you confirm you are of legal age (18+) in your jurisdiction and consent to viewing mature content.
</div>
<div class="cust-label mt-16">Enter your date of birth</div>
<input type="date" id="dobInput" max="2010-12-31" value="<<print $ageVerifyDate>>">
<div class="age-buttons">
<div class="btn-age-yes" id="verifyAgeBtn">✓ I am 18 or older — Enter</div>
<div class="btn-age-no" id="denyAgeBtn">✗ I am not 18 yet</div>
</div>
<p class="small text-dim mt-16" id="ageStatus"></p>
</div>
<<run
setTimeout(function(){
var btn = document.getElementById('verifyAgeBtn');
var deny = document.getElementById('denyAgeBtn');
var dob = document.getElementById('dobInput');
var status = document.getElementById('ageStatus');
if(!btn) return;
btn.addEventListener('click', function(){
if(!dob.value){ status.innerHTML='<span style="color:var(--red)">Please enter your date of birth</span>'; return; }
var birthDate = new Date(dob.value);
var today = new Date();
var age = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if(m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) age--;
if(age >= 18){
State.variables.ageVerified = true;
State.variables.ageVerifyDate = dob.value;
Engine.play('00_Boot');
} else {
status.innerHTML='<span style="color:var(--red)">You must be 18 or older to access this content. ('+age+' years old)</span>';
}
});
deny.addEventListener('click', function(){
document.body.innerHTML='<div style="text-align:center;padding:60px 20px;color:var(--text-dim);font-family:system-ui"><h2 style="color:var(--cyan)">Come back when you\'re 18+</h2><p>EchoLink will be here. Take care of yourself.</p></div>';
});
}, 100);
>>/* Full Patreon tier structure — viewable in-game */
<div class="cust-container">
<h2 class="text-center text-cyan mb-16" style="font-size:22px;letter-spacing:2px;">PATREON TIERS</h2>
<p class="text-center small text-dim mb-16">Every supporter keeps EchoLink alive. In-game codes refresh every 5 minutes via Discord.</p>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid var(--green);margin-bottom:12px">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
<div class="bold" style="color:var(--green);font-size:16px">🔹 Node Observer</div>
<div class="text-gold bold">$5/month</div>
</div>
<div class="small text-dim mb-8"><em>Foundation supporter — your signal joins the network.</em></div>
<div class="small" style="line-height:1.7">
• In-game Patron badge on title screen<br>
• Access to #tier1-node-observer Discord channel<br>
• Monthly TOTP codes (refresh every 5 min)<br>
• Early access to public updates — 1 week before free release<br>
• +20 Influence cheat action in-game<br>
• Risk Shield cheat (-30% risk)<br>
• Supporter credits roll<br>
• Voting rights in monthly "next feature" polls
</div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid var(--cyan);margin-bottom:12px">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
<div class="bold" style="color:var(--cyan);font-size:16px">🔸 System Admin</div>
<div class="text-gold bold">$15/month</div>
</div>
<div class="small text-dim mb-8"><em>Content creator tier — you shape the network.</em></div>
<div class="small" style="line-height:1.7">
• <span class="text-dim">Everything in Node Observer, plus:</span><br>
• Access to #tier2-system-admin Discord<br>
• +$1000 in-game cheat<br>
• Max All Trust cheat<br>
• Stats Editor (live-tune any stat)<br>
• FREE Tier 1 + Tier 2 upgrades in-game<br>
• 2-week early access to all new chapters<br>
• Dev blog access (behind-the-scenes posts)<br>
• Monthly exclusive wallpapers (high-res art)<br>
• Extended loop variants for all scenes
</div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid var(--purple);margin-bottom:12px">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
<div class="bold" style="color:var(--purple);font-size:16px">🔷 Network Architect</div>
<div class="text-gold bold">$50/month</div>
</div>
<div class="small text-dim mb-8"><em>Core tier — you influence the network's evolution.</em></div>
<div class="small" style="line-height:1.7">
• <span class="text-dim">Everything in System Admin, plus:</span><br>
• Access to #tier3-network-architect Discord<br>
• Zero Risk cheat (permanent-session)<br>
• True Influence Mode unlock (darker story variants)<br>
• NPC naming rights (name an upcoming NPC)<br>
• Private alpha access to upcoming updates<br>
• Monthly exclusive scene unlock (canon content)<br>
• Priority bug reporting channel
</div>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid var(--gold);margin-bottom:12px">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
<div class="bold" style="color:var(--gold);font-size:16px">💎 Hive Mind</div>
<div class="text-gold bold">$100/month</div>
</div>
<div class="small text-dim mb-8"><em>Legend tier — you become part of the story.</em></div>
<div class="small" style="line-height:1.7">
• <span class="text-dim">Everything in Network Architect, plus:</span><br>
• Access to #tier4-hive-mind Discord (exclusive small group)<br>
• Permanent lore entry — your patron name becomes a canonical in-game reference<br>
• Access to secret passages — exclusive content unlocks<br>
• Monthly patron-only Discord Q&A posts<br>
• Private dev chat group<br>
• Pre-release access to ALL content<br>
• Custom Discord role with special color<br>
• Input on major story arc decisions
</div>
</div>
/* Tier 5 disabled until fanbase established */
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px dashed var(--border-default);margin-bottom:12px;opacity:0.5">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px">
<div class="bold" style="color:var(--text-dim);font-size:17px">👑 Sovereign</div>
<div class="text-dim bold">Coming Soon</div>
</div>
<div class="small text-dim"><em>A legendary tier for the most dedicated patrons. Unlocks after the community grows.</em></div>
</div>
<div class="nav-spacer"></div>
<a class="nav-btn" href="https://www.patreon.com/c/galacticdeity12" target="_blank" style="background:var(--purple);color:#fff;text-align:center;padding:16px;font-weight:600">🎮 Support on Patreon</a>
<a class="nav-btn" href="https://galacticdeity12.itch.io/echolink" target="_blank" style="text-align:center;padding:14px">💾 Download on itch.io</a>
<div class="nav-spacer"></div>
<<if $gameStarted>>[[← Back to Game|Loc_Hub]]<<else>>[[← Back to Title|00_Boot]]<</if>>
</div><div class="passage-image" data-scene="Mysterious student watching you from across quad">
<img src="img/re_mysterious.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Stranger">
</div>
You are crossing the quad when you notice a student you don't recognize standing by the library steps, watching you intently. When you stop and look directly at <<if random(1,2) is 1>>her<<else>>him<</if>>, they immediately turn and walk away into the crowd.
You pull out your phone. EchoLink shows no rogue signals in the area. It's just paranoia... probably.
<<set $risk += 2>>
[[Continue|Loc_Hub]]