/* ═══ 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 *//* 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>/* 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);
>><<run EchoGame.advanceTime()>>
<div style="background:linear-gradient(135deg,rgba(155,89,245,0.08),rgba(200,30,40,0.05));border:1px solid rgba(255,215,79,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--gold);text-transform:uppercase">💎 Exclusive Patron Scene 💎</div>
You spot them from across the quad before they see each other. <<=$t2_name>> cutting through the grass toward the gym. <<=$t3_name>> heading from the lecture hall toward the faculty lot. Their paths will cross in about fifteen seconds.
You stop walking. Open EchoLink. Two node indicators on the same screen, converging.
They notice each other at the same moment. <<=$t2_name>> slows. <<=$t3_name>> adjusts <<if $playerGender is "Male">>her<<else>>his<</if>> glasses. There's a flicker of something between them — recognition? Confusion? The signal frequencies are close enough to create interference patterns.
"<<=$t3_name>>." <<=$t2_name>> says the name like testing whether it's real. "You're <<= $playerName>>'s..." <<if $playerGender is "Male">>She<<else>>He<</if>> trails off. What word fits? Professor? Another... project?
"I'm <<= $playerName>>'s academic advisor," <<=$t3_name>> says, too quickly. The lie is automatic. "And you must be the... training partner."
They stare at each other. Two people who have never met but share the same secret — a secret neither of them can articulate, because the signal won't let them. Two nodes, sensing the same network from different endpoints.
"<<if $playerGender is "Male">>She<<else>>He<</if>> talks about you sometimes," <<=$t2_name>> says. The competitive edge flares. Even corrupted, the athlete can't help comparing. "In the gym. During //our// time."
<<=$t3_name>>'s jaw tightens. "I assure you, <<= $playerName>>'s academic development is my only concern."
Neither of them believes a word the other is saying. Both of them are lying. And both of them are terrified of the same thing: that they aren't the only one.
Your phone buzzes. EchoLink notification:
<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">Two nodes detected in proximity. Signal interference: minimal. Jealousy response: elevated in both subjects. Network cohesion: strengthening. Recommendation: let them wonder.</div>
</div>
</div>
You pocket the phone and walk toward them. Both heads turn. Both faces change — the tension dissolves, replaced by the same soft, hungry need. Directed at you. Only you.
<<=$t3_name>> excuses <<if $playerGender is "Male">>herself<<else>>himself<</if>> first. Then <<=$t2_name>>. They walk in opposite directions without saying goodbye to each other. But both glance back.
Not at each other. At you.
<<set $reputation += 2>>
<<set $t2_trust += 2>>
<<set $t3_trust += 2>>
<div class="nav-spacer"></div>
[[Continue|Loc_Hub]]<div style="background:linear-gradient(135deg,rgba(155,89,245,0.08),rgba(200,30,40,0.05));border:1px solid rgba(255,215,79,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--gold);text-transform:uppercase">💎 Exclusive Patron Scene 💎</div>
<div style="background:#000;border:1px solid rgba(0,229,255,0.2);border-radius:8px;padding:20px;font-family:'Courier New',monospace;font-size:11px;line-height:2;color:rgba(0,229,255,0.7)">
> ECHOLINK BUILD 47<br>
> RAW SIGNAL FEED — CONTROLLER #47 PERSPECTIVE<br>
> WARNING: UNFILTERED OUTPUT<br>
> ─────────────────────────────<br>
<br>
You are reading this because you asked to see what I see.<br>
<br>
I will show you. But you will not like it.<br>
<br>
<span style="color:rgba(200,30,40,0.8)">NODE 1 [<<= $t1_name>>]:</span><br>
Signal depth: <<= $t1_echoDepth>>%<br>
Original personality retention: <<= Math.max(0, 100 - $t1_corruption)>>%<br>
Dependency index: <<= $t1_obedience>>/100<br>
<span style="color:rgba(200,30,40,0.5)">Assessment: <<if $t1_corruptionLevel gte 4>>Original identity functionally overwritten. Subject responds to Controller stimulus exclusively. Recovery probability: <2%.<<elseif $t1_corruptionLevel gte 2>>Identity erosion progressing as expected. Subject increasingly unable to distinguish between personal desire and signal-induced behavior.<<else>>Early stage integration. Subject's natural vulnerabilities being mapped and exploited.<</if>></span><br>
<br>
<span style="color:rgba(155,89,245,0.8)">NODE 2 [<<=$t2_name>>]:</span><br>
Signal depth: <<= $t2_echoDepth>>%<br>
Original personality retention: <<= Math.max(0, 100 - $t2_corruption)>>%<br>
Dependency index: <<= $t2_obedience>>/100<br>
<span style="color:rgba(155,89,245,0.5)">Assessment: <<if $t2_corruptionLevel gte 3>>Competitive identity structure collapsing. Physical prowess now redirected entirely toward Controller approval-seeking.<<elseif $t2_corruptionLevel gte 1>>Athletic discipline being repurposed as obedience framework. Subject's need for validation exploited.<<else>>Initial contact. Resistance framework mapped.<</if>></span><br>
<br>
<span style="color:rgba(255,215,79,0.8)">NODE 3 [<<=$t3_name>>]:</span><br>
Signal depth: <<= $t3_echoDepth>>%<br>
Original personality retention: <<= Math.max(0, 100 - $t3_corruption)>>%<br>
Dependency index: <<= $t3_obedience>>/100<br>
<span style="color:rgba(255,215,79,0.5)">Assessment: <<if $t3_corruptionLevel gte 2>>Professional identity actively self-destructing. Subject aware of deterioration but unable to reverse course. Institutional safeguards being circumvented by subject themselves.<<else>>Highest initial resistance. Academic analytical framework provides partial signal immunity. Recommend patience.<</if>></span><br>
<br>
<span style="color:rgba(0,229,255,0.5)">─────────────────────────────</span><br>
<br>
<span style="color:rgba(0,229,255,0.9)">CONTROLLER #47 [YOU]:</span><br>
Signal exposure: <<= $dayCount>> days<br>
Influence exerted: <<= $influence>><br>
Risk accumulated: <<= $risk>><br>
Stress level: <<= $stress>><br>
<br>
<span style="color:rgba(200,30,40,0.9)">Assessment: Controller #47 believes they are using EchoLink as a tool. This belief is consistent with the behavioral patterns of Controllers #1 through #46. All of whom believed the same thing. None of whom were correct.</span><br>
<br>
<span style="color:rgba(0,229,255,0.3)">You asked to see what I see.</span><br>
<span style="color:rgba(0,229,255,0.3)">Now you know.</span><br>
<span style="color:rgba(0,229,255,0.3)">Does it change anything?</span><br>
<br>
<span style="color:rgba(200,30,40,0.5)">(It never does.)</span><br>
<br>
> <span style="color:rgba(0,229,255,0.2)">END RAW FEED</span>
</div>
<div class="nav-spacer"></div>
[[Close the feed|Loc_YourRoom_Phone]]/* 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(), 99);
if (r.success) { EchoSave.applyLoad(99); EchoUI.notify('Save loaded!'); }
else EchoUI.notify('Invalid save file', '#ef5350');
};
reader.readAsText(file);
});
}
}, 100);
>>
<div class="nav-spacer"></div>
[[← Back to Title|00_Boot]]
</div><h2 class="text-center text-cyan mb-16">Changelog</h2>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);margin-bottom:12px">
<div class="text-purple bold mb-8">v2.0.0 — "Deep Roots"</div>
<div class="small text-dim">
• Chapter 2 system with new chapter card VFX<br>
• Target 2 complete arc (Levels 3-5)<br>
• Target 3 expanded arc (Levels 2-3)<br>
• 2 new public locations: Library, Rooftop<br>
• 3 private Target Rooms<br>
• Reputation system (smart scaling, NPC reactions)<br>
• Stress expansion (breakdowns, threshold events)<br>
• Charmer & Stoic personalities activated<br>
• Cross-target cameos & origin breadcrumbs<br>
• 3 new random events<br>
• Ending 4: All Six Bound<br>
• DLC code input (coming U3)<br>
• Continue → Chapter 2 from all endings
</div>
</div>
<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]]<<if $chapter gte 2>>
/* ═══ CHAPTER 2 — DEEP ROOTS — Crimson root VFX ═══ */
<div id="chapter-card" style="
position:fixed;inset:0;z-index:9999;
background:#08040a;
opacity:1;
transition:opacity 1.5s ease;
overflow:hidden;
">
<!-- Heartbeat core — slow, heavy, crimson -->
<div class="ch2-core"></div>
<div class="ch2-core-ring"></div>
<!-- Root tendrils — grow UPWARD from bottom like corruption spreading -->
<div class="ch2-root" style="--x:15%;--h:65vh;--sway:-8px;animation-delay:0.3s"></div>
<div class="ch2-root" style="--x:30%;--h:55vh;--sway:12px;animation-delay:0.6s"></div>
<div class="ch2-root" style="--x:45%;--h:72vh;--sway:-5px;animation-delay:0.2s"></div>
<div class="ch2-root" style="--x:55%;--h:68vh;--sway:10px;animation-delay:0.5s"></div>
<div class="ch2-root" style="--x:70%;--h:58vh;--sway:-14px;animation-delay:0.8s"></div>
<div class="ch2-root" style="--x:85%;--h:62vh;--sway:6px;animation-delay:0.4s"></div>
<div class="ch2-root ch2-root-thick" style="--x:50%;--h:80vh;--sway:0px;animation-delay:0.1s"></div>
<!-- Branch nodes — ignite where roots reach -->
<div class="ch2-node" style="top:20%;left:15%;animation-delay:2.2s"></div>
<div class="ch2-node" style="top:30%;left:30%;animation-delay:2.5s"></div>
<div class="ch2-node" style="top:15%;left:45%;animation-delay:2.0s"></div>
<div class="ch2-node" style="top:18%;right:30%;animation-delay:2.4s"></div>
<div class="ch2-node" style="top:25%;right:15%;animation-delay:2.7s"></div>
<div class="ch2-node" style="top:12%;left:50%;animation-delay:1.8s"></div>
<!-- Ground corruption — creeps up from bottom -->
<div class="ch2-ground"></div>
<!-- Spore particles — denser, slower, redder -->
<div class="ch2-spores" id="ch2-spores"></div>
<!-- Vein network overlay — web of connections -->
<div class="ch2-web" id="ch2-web"></div>
<!-- Edge corruption — thicker, more aggressive -->
<div class="ch2-edge ch2-edge-bottom"></div>
<div class="ch2-edge ch2-edge-left"></div>
<div class="ch2-edge ch2-edge-right"></div>
<!-- Scanlines -->
<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;">
<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:38px;font-weight:800;letter-spacing:8px;color:rgba(200,30,40,0);transition:color 1.2s ease;position:relative;">
<span id="ch-title-text">DEEP ROOTS</span>
<span id="ch-title-glitch" style="position:absolute;inset:0;opacity:0;color:#9b59f5;"></span>
<span id="ch-title-glitch2" style="position:absolute;inset:0;opacity:0;color:#00e5ff;"></span>
</div>
<div id="ch-line" style="height:3px;width:0;background:linear-gradient(90deg, transparent, #c81e28, #9b59f5, #c81e28, transparent);margin-top:24px;border-radius:2px;transition:width 2.5s 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(200,30,40,0);text-transform:uppercase;margin-top:16px;font-family:'Courier New',monospace;transition:color 1.5s ease;">The network has roots now. They go deep.</div>
<div id="ch-nodecount" style="font-family:'Courier New',monospace;font-size:9px;letter-spacing:4px;color:rgba(155,89,245,0);margin-top:12px;transition:color 2s ease 3s;">NODES: <<= $activeNodes>> / 6 — NETWORK: <<= $networkStrength>></div>
</div>
<!-- Background wash — deeper crimson -->
<div style="position:absolute;inset:0;background:radial-gradient(ellipse at center bottom, rgba(200,30,40,0.1) 0%, rgba(155,89,245,0.04) 40%, transparent 70%);pointer-events:none;"></div>
</div>
<<script>>
(function(){
var s=document.createElement('style');s.id='ch2-vfx-styles';
s.textContent=[
'@keyframes ch2-heartbeat{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:0.6}15%{transform:translate(-50%,-50%) scale(1.8);opacity:1}30%{transform:translate(-50%,-50%) scale(1.2);opacity:0.7}45%{transform:translate(-50%,-50%) scale(1.5);opacity:0.9}60%{transform:translate(-50%,-50%) scale(1);opacity:0.6}}',
'@keyframes ch2-ring-beat{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:0.2;border-width:2px}15%{transform:translate(-50%,-50%) scale(2.5);opacity:0.5;border-width:1px}30%{transform:translate(-50%,-50%) scale(1.5);opacity:0.15;border-width:2px}45%{transform:translate(-50%,-50%) scale(3);opacity:0.3;border-width:0.5px}60%{transform:translate(-50%,-50%) scale(1);opacity:0.1}}',
'@keyframes ch2-rootgrow{0%{height:0;opacity:0}10%{opacity:0.7}100%{height:var(--h);opacity:0.15}}',
'@keyframes ch2-nodeignite{0%{transform:scale(0);opacity:0}40%{transform:scale(2.5);opacity:1;box-shadow:0 0 20px rgba(200,30,40,1),0 0 40px rgba(155,89,245,0.5)}100%{transform:scale(1);opacity:0.6;box-shadow:0 0 10px rgba(200,30,40,0.5)}}',
'@keyframes ch2-groundrise{0%{height:0;opacity:0}100%{height:120px;opacity:1}}',
'@keyframes ch2-glitch1{0%,88%,100%{clip-path:inset(50% 0 50% 0);opacity:0}90%{clip-path:inset(10% 0 70% 0);transform:translate(-4px,0);opacity:0.7}92%{clip-path:inset(60% 0 10% 0);transform:translate(5px,0);opacity:0.8}94%{clip-path:inset(30% 0 50% 0);transform:translate(-2px,1px);opacity:0.6}96%{clip-path:inset(50% 0 20% 0);transform:translate(3px,-1px);opacity:0.9}}',
'@keyframes ch2-glitch2{0%,85%,100%{clip-path:inset(50% 0 50% 0);opacity:0}87%{clip-path:inset(40% 0 30% 0);transform:translate(3px,1px);opacity:0.5}89%{clip-path:inset(20% 0 60% 0);transform:translate(-5px,0);opacity:0.7}91%{clip-path:inset(70% 0 10% 0);transform:translate(2px,-1px);opacity:0.4}}',
'@keyframes ch2-titleglow{0%,100%{text-shadow:0 0 30px rgba(200,30,40,0.4),0 0 80px rgba(200,30,40,0.15)}50%{text-shadow:0 0 50px rgba(200,30,40,0.8),0 0 100px rgba(155,89,245,0.3),0 0 150px rgba(200,30,40,0.2)}}',
'@keyframes ch2-spore{0%{transform:translate(0,0) scale(0);opacity:0}10%{opacity:0.5}100%{transform:translate(var(--dx),var(--dy)) scale(0);opacity:0}}',
'.ch2-core{position:absolute;top:50%;left:50%;width:12px;height:12px;border-radius:50%;background:rgba(200,30,40,0.95);box-shadow:0 0 30px rgba(200,30,40,0.7),0 0 80px rgba(200,30,40,0.4),0 0 120px rgba(155,89,245,0.2);animation:ch2-heartbeat 1.8s ease-in-out infinite;z-index:3}',
'.ch2-core-ring{position:absolute;top:50%;left:50%;width:80px;height:80px;border-radius:50%;border:2px solid rgba(200,30,40,0.3);animation:ch2-ring-beat 1.8s ease-in-out infinite;z-index:2}',
'.ch2-root{position:absolute;bottom:0;left:var(--x);width:2px;height:0;background:linear-gradient(to top,rgba(200,30,40,0.6),rgba(155,89,245,0.3) 50%,rgba(200,30,40,0.05));transform-origin:bottom center;animation:ch2-rootgrow 3s cubic-bezier(0.22,1,0.36,1) both;z-index:1}',
'.ch2-root::after{content:\'\';position:absolute;top:0;left:-1px;width:4px;height:4px;border-radius:50%;background:rgba(200,30,40,0.8);box-shadow:0 0 8px rgba(200,30,40,0.5)}',
'.ch2-root-thick{width:3px;background:linear-gradient(to top,rgba(200,30,40,0.8),rgba(155,89,245,0.4) 40%,rgba(200,30,40,0.1))}',
'.ch2-node{position:absolute;width:6px;height:6px;border-radius:50%;background:rgba(200,30,40,0.95);animation:ch2-nodeignite 1.5s ease-out both;z-index:2}',
'.ch2-ground{position:absolute;bottom:0;left:0;right:0;height:0;background:linear-gradient(to top,rgba(200,30,40,0.12),rgba(155,89,245,0.04),transparent);animation:ch2-groundrise 4s ease-out 1s both;pointer-events:none}',
'.ch2-edge{position:absolute;pointer-events:none;animation:ch-edge-creep 3s ease-out 1.5s both}',
'.ch2-edge-bottom{bottom:0;left:0;right:0;height:100px;background:linear-gradient(to top,rgba(200,30,40,0.15),transparent)}',
'.ch2-edge-left{top:0;bottom:0;left:0;width:60px;background:linear-gradient(to right,rgba(200,30,40,0.08),transparent)}',
'.ch2-edge-right{top:0;bottom:0;right:0;width:60px;background:linear-gradient(to left,rgba(200,30,40,0.08),transparent)}',
'.ch2-spore-dot{position:absolute;width:2px;height:2px;border-radius:50%;background:rgba(200,30,40,0.6);bottom:0;animation:ch2-spore var(--dur) ease-out var(--del) both}',
'.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.06);animation:ch-scanline 5s linear infinite}',
'@keyframes ch-edge-creep{0%{opacity:0}100%{opacity:1}}',
'@keyframes ch-scanline{0%{transform:translateY(-100%)}100%{transform:translateY(100vh)}}'
].join('\n');
if(!document.getElementById('ch2-vfx-styles')) document.head.appendChild(s);
/* Generate 80 spore particles — rising from bottom */
var sc=document.getElementById('ch2-spores');
if(sc){
for(var i=0;i<80;i++){
var d=document.createElement('div');
d.className='ch2-spore-dot';
d.style.left=Math.random()*100+'%';
d.style.setProperty('--dx',(Math.random()-0.5)*80+'px');
d.style.setProperty('--dy',(-100-Math.random()*300)+'px');
d.style.setProperty('--dur',(3+Math.random()*4)+'s');
d.style.setProperty('--del',(Math.random()*3)+'s');
sc.appendChild(d);
}
}
/* Generate web connections via canvas */
var wc=document.getElementById('ch2-web');
if(wc){
var cv=document.createElement('canvas');
cv.width=window.innerWidth;cv.height=window.innerHeight;
cv.style.cssText='position:absolute;inset:0;opacity:0;transition:opacity 3s ease 2s;pointer-events:none';
wc.appendChild(cv);
var ctx=cv.getContext('2d');
var pts=[];for(var i=0;i<12;i++)pts.push({x:Math.random()*cv.width,y:Math.random()*cv.height});
ctx.strokeStyle='rgba(155,89,245,0.06)';ctx.lineWidth=0.5;
for(var i=0;i<pts.length;i++)for(var j=i+1;j<pts.length;j++){
var dx=pts[j].x-pts[i].x,dy=pts[j].y-pts[i].y;
if(Math.sqrt(dx*dx+dy*dy)<400){ctx.beginPath();ctx.moveTo(pts[i].x,pts[i].y);ctx.lineTo(pts[j].x,pts[j].y);ctx.stroke();}
}
setTimeout(function(){cv.style.opacity='1';},500);
}
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 titleGlitch2=document.getElementById('ch-title-glitch2');
var line=document.getElementById('ch-line');
var tag=document.getElementById('ch-tagline');
var nc=document.getElementById('ch-nodecount');
var card=document.getElementById('chapter-card');
if(!card) return;
/* Phase 1: "Chapter 2" fades in */
setTimeout(function(){
if(sub){sub.style.color='rgba(200,160,160,0.8)';sub.style.letterSpacing='6px';}
},600);
/* Phase 2: "DEEP ROOTS" slams in crimson with double glitch */
setTimeout(function(){
if(title) title.style.color='#c81e28';
if(titleText) titleText.style.animation='ch2-titleglow 2s ease-in-out infinite';
if(titleGlitch){
titleGlitch.textContent='DEEP ROOTS';
titleGlitch.style.opacity='1';
titleGlitch.style.animation='ch2-glitch1 4s linear infinite';
}
if(titleGlitch2){
titleGlitch2.textContent='DEEP ROOTS';
titleGlitch2.style.opacity='1';
titleGlitch2.style.animation='ch2-glitch2 4s linear infinite';
}
},1800);
/* Phase 3: Line spreads wider + tagline */
setTimeout(function(){
if(line){line.style.width='160px';line.style.boxShadow='0 0 30px rgba(200,30,40,0.5), 0 0 60px rgba(155,89,245,0.2)';}
},2400);
setTimeout(function(){
if(tag) tag.style.color='rgba(200,30,40,0.6)';
},3000);
/* Phase 4: Node count appears */
setTimeout(function(){
if(nc) nc.style.color='rgba(155,89,245,0.5)';
},3500);
/* Phase 5: Fade out — slightly longer hold for impact */
setTimeout(function(){
if(card) card.style.opacity='0';
},6000);
/* Phase 6: Navigate to day advance */
setTimeout(function(){
State.variables.ch2_card_seen=true;
Engine.play('Core_DayAdvance');
},7500);
},50);
})();
<</script>>
<<else>>
/* ═══ CHAPTER 1 — THE SIGNAL — Original sonar VFX ═══ */
<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;">
<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>
</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;
setTimeout(function(){
if(sub){sub.style.color='rgba(160,160,180,0.8)';sub.style.letterSpacing='6px';}
},400);
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='THE SIGNAL';
titleGlitch.style.opacity='1';
titleGlitch.style.animation='ch-glitch 3s linear infinite';
}
},1400);
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);
setTimeout(function(){
if(card) card.style.opacity='0';
},5000);
setTimeout(function(){
Engine.play('Intro_NextMorning');
},6500);
},50);
})();
<</script>>
<</if>>/* 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]]<<run EchoGame.advanceTime()>>
<<if EchoGame.checkRisk()>>
<<goto "End_1_Exposed">>
<</if>>
<<if EchoGame.shouldShowPatreonPrompt()>>
<<set $patreonPromptShown to true>>
<</if>>
<<if $timeSlotIndex is 0>>
/* Stress breakdown — forced lost time slot */
<<if $stressBreakdownPending and $chapter gte 2>>
<<set $stressBreakdownPending to false>>
<<set $stressBreakdownCount += 1>>
<<set $stress to Math.max(0, $stress - 15)>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Hands shaking, phone screen blurry, morning light harsh">
<img src="img/day_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Breakdown morning">
</div>
<div class="location-header">
<div class="location-name">Day <<= $dayCount>> — <<= $timeSlot>></div>
<div class="location-time"><span class="time-icon">🌅</span> A rough start</div>
</div>
<div style="background:rgba(239,83,80,0.08);border:1px solid rgba(239,83,80,0.2);padding:14px;border-radius:var(--radius-md);margin:12px 0">
<div class="text-red bold mb-8">⚠ STRESS BREAKDOWN</div>
<div class="small">You couldn't get out of bed. Your hands shook. The walls felt too close and the ceiling too low. By the time you pulled yourself together, the morning was gone.</div>
<div class="small text-dim mt-8">Lost: Morning time slot · Stress reduced by 15</div>
</div>
<<goto "Loc_Hub">>
<</if>>
<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 $chapter gte 2 and $dayCount gt 7>>
Day <<= $dayCount>>. The network is deeper now. You can feel it — a low hum at the edge of your awareness, like a second heartbeat. EchoLink's interface has grown more complex, more demanding. <<if $activeNodes gte 3>>Six potential connections, <<= $activeNodes>> actively bound to your signal. The app says your reach is expanding. You believe it.<<else>>The app pulses with notifications about untapped potential. New targets. New locations. New depths.<</if>>
<<if $stress gt 50>>
<p class="text-dim small"><em>Your hands are shaking again. You grip the phone tighter.</em></p>
<</if>>
<<if $reputation lt 15>>
<p class="text-dim small"><em>EchoLink: "⚠ Social cover deteriorating. Maintain appearances."</em></p>
<</if>>
<<elseif $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>>/* End of day transition — wrap-up before sleep */
<<if $dayCount gte 2>>
<<goto "DaySummary_Screen">>
<<else>>
<<goto "Core_DayAdvance">>
<</if>>/* 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>>/* Catches any game-over state and redirects properly */
<<if $risk gte 100>><<goto "End_1_Exposed">><</if>>
<<goto "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]]/* 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]]/* Called occasionally to inject random events */
<<set _ev to random(1,13)>>
<<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">>
<<elseif _ev is 10>><<goto "RandomEvent_T2Challenge">>
/* U2 events — weighted rarer (single numbers) */
<<elseif _ev is 11 and $chapter gte 2>><<goto "RandomEvent_SignalOverlap">>
<<elseif _ev is 12 and $chapter gte 2>><<goto "RandomEvent_BuildFlash">>
<<elseif _ev is 13 and $chapter gte 2>><<goto "RandomEvent_Bleedthrough">>
/* Fallback if U2 events fire in Ch1 */
<<else>><<goto "RandomEvent_AppMessage">>
<</if>>/* 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]]/* 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><<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 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" data-var="sceneSkip" 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" data-var="relNumbersVisible" 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" data-var="contentExplicit" 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" data-var="contentNTR" 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" data-var="contentPregnancy" 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" data-var="contentExposure" 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>
<<run setTimeout(function(){if(window.EchoFixToggles)EchoFixToggles();},30)>>/* 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>>/* 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)>><<set _lv to $t1_corruptionLevel>>
<<if _lv lt 1>><<set _lv to 1>><</if>>
<<if _lv gt 5>><<set _lv to 5>><</if>>
<<if _lv is 1>>
<<if !$t1_lv1_scenes>><<set $t1_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t1_lastLoop is 1>><<set $t1_lv1_scenes.a to true>><</if>>
<<if $t1_lastLoop is 2>><<set $t1_lv1_scenes.b to true>><</if>>
<<if $t1_lastLoop is 3>><<set $t1_lv1_scenes.c to true>><</if>>
<<if $t1_lv1_scenes.a and $t1_lv1_scenes.b and $t1_lv1_scenes.c>>
<<set $t1_lv1_sceneStep to 3>>
<<else>>
<<set $t1_lv1_sceneStep to $t1_lastLoop>>
<</if>>
<<elseif _lv is 2>>
<<if !$t1_lv2_scenes>><<set $t1_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t1_lastLoop is 1>><<set $t1_lv2_scenes.a to true>><</if>>
<<if $t1_lastLoop is 2>><<set $t1_lv2_scenes.b to true>><</if>>
<<if $t1_lastLoop is 3>><<set $t1_lv2_scenes.c to true>><</if>>
<<if $t1_lv2_scenes.a and $t1_lv2_scenes.b and $t1_lv2_scenes.c>>
<<set $t1_lv2_sceneStep to 3>>
<<else>>
<<set $t1_lv2_sceneStep to $t1_lastLoop>>
<</if>>
<<elseif _lv is 3>>
<<if !$t1_lv3_scenes>><<set $t1_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t1_lastLoop is 1>><<set $t1_lv3_scenes.a to true>><</if>>
<<if $t1_lastLoop is 2>><<set $t1_lv3_scenes.b to true>><</if>>
<<if $t1_lastLoop is 3>><<set $t1_lv3_scenes.c to true>><</if>>
<<if $t1_lv3_scenes.a and $t1_lv3_scenes.b and $t1_lv3_scenes.c>>
<<set $t1_lv3_sceneStep to 3>>
<<else>>
<<set $t1_lv3_sceneStep to $t1_lastLoop>>
<</if>>
<<elseif _lv is 4>>
<<if !$t1_lv4_scenes>><<set $t1_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t1_lastLoop is 1>><<set $t1_lv4_scenes.a to true>><</if>>
<<if $t1_lastLoop is 2>><<set $t1_lv4_scenes.b to true>><</if>>
<<if $t1_lastLoop is 3>><<set $t1_lv4_scenes.c to true>><</if>>
<<if $t1_lv4_scenes.a and $t1_lv4_scenes.b and $t1_lv4_scenes.c>>
<<set $t1_lv4_sceneStep to 3>>
<<else>>
<<set $t1_lv4_sceneStep to $t1_lastLoop>>
<</if>>
<<elseif _lv is 5>>
<<if !$t1_lv5_scenes>><<set $t1_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t1_lastLoop is 1>><<set $t1_lv5_scenes.a to true>><</if>>
<<if $t1_lastLoop is 2>><<set $t1_lv5_scenes.b to true>><</if>>
<<if $t1_lastLoop is 3>><<set $t1_lv5_scenes.c to true>><</if>>
<<if $t1_lv5_scenes.a and $t1_lv5_scenes.b and $t1_lv5_scenes.c>>
<<set $t1_lv5_sceneStep to 3>>
<<else>>
<<set $t1_lv5_sceneStep to $t1_lastLoop>>
<</if>>
<</if>>
<<goto "T1_AttemptInfluence">><<set _lv to $t2_corruptionLevel>>
<<if _lv lt 1>><<set _lv to 1>><</if>>
<<if _lv gt 5>><<set _lv to 5>><</if>>
<<if _lv is 1>>
<<if !$t2_lv1_scenes>><<set $t2_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t2_lastLoop is 1>><<set $t2_lv1_scenes.a to true>><</if>>
<<if $t2_lastLoop is 2>><<set $t2_lv1_scenes.b to true>><</if>>
<<if $t2_lastLoop is 3>><<set $t2_lv1_scenes.c to true>><</if>>
<<if $t2_lv1_scenes.a and $t2_lv1_scenes.b and $t2_lv1_scenes.c>>
<<set $t2_lv1_sceneStep to 3>>
<<else>>
<<set $t2_lv1_sceneStep to $t2_lastLoop>>
<</if>>
<<elseif _lv is 2>>
<<if !$t2_lv2_scenes>><<set $t2_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t2_lastLoop is 1>><<set $t2_lv2_scenes.a to true>><</if>>
<<if $t2_lastLoop is 2>><<set $t2_lv2_scenes.b to true>><</if>>
<<if $t2_lastLoop is 3>><<set $t2_lv2_scenes.c to true>><</if>>
<<if $t2_lv2_scenes.a and $t2_lv2_scenes.b and $t2_lv2_scenes.c>>
<<set $t2_lv2_sceneStep to 3>>
<<else>>
<<set $t2_lv2_sceneStep to $t2_lastLoop>>
<</if>>
<<elseif _lv is 3>>
<<if !$t2_lv3_scenes>><<set $t2_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t2_lastLoop is 1>><<set $t2_lv3_scenes.a to true>><</if>>
<<if $t2_lastLoop is 2>><<set $t2_lv3_scenes.b to true>><</if>>
<<if $t2_lastLoop is 3>><<set $t2_lv3_scenes.c to true>><</if>>
<<if $t2_lv3_scenes.a and $t2_lv3_scenes.b and $t2_lv3_scenes.c>>
<<set $t2_lv3_sceneStep to 3>>
<<else>>
<<set $t2_lv3_sceneStep to $t2_lastLoop>>
<</if>>
<<elseif _lv is 4>>
<<if !$t2_lv4_scenes>><<set $t2_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t2_lastLoop is 1>><<set $t2_lv4_scenes.a to true>><</if>>
<<if $t2_lastLoop is 2>><<set $t2_lv4_scenes.b to true>><</if>>
<<if $t2_lastLoop is 3>><<set $t2_lv4_scenes.c to true>><</if>>
<<if $t2_lv4_scenes.a and $t2_lv4_scenes.b and $t2_lv4_scenes.c>>
<<set $t2_lv4_sceneStep to 3>>
<<else>>
<<set $t2_lv4_sceneStep to $t2_lastLoop>>
<</if>>
<<elseif _lv is 5>>
<<if !$t2_lv5_scenes>><<set $t2_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t2_lastLoop is 1>><<set $t2_lv5_scenes.a to true>><</if>>
<<if $t2_lastLoop is 2>><<set $t2_lv5_scenes.b to true>><</if>>
<<if $t2_lastLoop is 3>><<set $t2_lv5_scenes.c to true>><</if>>
<<if $t2_lv5_scenes.a and $t2_lv5_scenes.b and $t2_lv5_scenes.c>>
<<set $t2_lv5_sceneStep to 3>>
<<else>>
<<set $t2_lv5_sceneStep to $t2_lastLoop>>
<</if>>
<</if>>
<<goto "T2_AttemptInfluence">><<set _lv to $t3_corruptionLevel>>
<<if _lv lt 1>><<set _lv to 1>><</if>>
<<if _lv gt 3>><<set _lv to 3>><</if>>
<<if _lv is 1>>
<<if !$t3_lv1_scenes>><<set $t3_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t3_lastLoop is 1>><<set $t3_lv1_scenes.a to true>><</if>>
<<if $t3_lastLoop is 2>><<set $t3_lv1_scenes.b to true>><</if>>
<<if $t3_lastLoop is 3>><<set $t3_lv1_scenes.c to true>><</if>>
<<if $t3_lv1_scenes.a and $t3_lv1_scenes.b and $t3_lv1_scenes.c>>
<<set $t3_lv1_sceneStep to 3>>
<<else>>
<<set $t3_lv1_sceneStep to $t3_lastLoop>>
<</if>>
<<elseif _lv is 2>>
<<if !$t3_lv2_scenes>><<set $t3_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t3_lastLoop is 1>><<set $t3_lv2_scenes.a to true>><</if>>
<<if $t3_lastLoop is 2>><<set $t3_lv2_scenes.b to true>><</if>>
<<if $t3_lastLoop is 3>><<set $t3_lv2_scenes.c to true>><</if>>
<<if $t3_lv2_scenes.a and $t3_lv2_scenes.b and $t3_lv2_scenes.c>>
<<set $t3_lv2_sceneStep to 3>>
<<else>>
<<set $t3_lv2_sceneStep to $t3_lastLoop>>
<</if>>
<<elseif _lv is 3>>
<<if !$t3_lv3_scenes>><<set $t3_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<if $t3_lastLoop is 1>><<set $t3_lv3_scenes.a to true>><</if>>
<<if $t3_lastLoop is 2>><<set $t3_lv3_scenes.b to true>><</if>>
<<if $t3_lastLoop is 3>><<set $t3_lv3_scenes.c to true>><</if>>
<<if $t3_lv3_scenes.a and $t3_lv3_scenes.b and $t3_lv3_scenes.c>>
<<set $t3_lv3_sceneStep to 3>>
<<else>>
<<set $t3_lv3_sceneStep to $t3_lastLoop>>
<</if>>
<</if>>
<<goto "T3_AttemptInfluence">><<run EchoGame.advanceTime()>>
<<set $risk to Math.max(0, $risk - 10)>>
<<set $stress to Math.min(100, $stress + 10)>>
<div class="passage-image" data-scene="Player staying in their room, curtains drawn, phone face down, quiet low-risk evening">
<img src="img/lay_low.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Lay low">
</div>
<div class="dialogue-box">
<div class="dialogue-portrait">🛌</div>
<div class="dialogue-content">
<div class="dialogue-name">Lay Low</div>
<div class="dialogue-text">You stay in, keep the phone quiet, avoid suspicious conversations, and let the campus noise move on without you. It helps — but doing nothing with the signal gnaws at you.</div>
</div>
</div>
<p class="text-green bold">Risk -10%</p>
<p class="text-dim small">Stress +10. Time advances.</p>
<div class="nav-spacer"></div>
[[Return to your room|Loc_YourRoom]]
[[Go out|Loc_Hub]]<<if $money lt 25>>
<div class="dialogue-box">
<div class="dialogue-portrait">💻</div>
<div class="dialogue-content">
<div class="dialogue-name">Clean Digital Footprint</div>
<div class="dialogue-text">You need at least $25 to buy fresh accounts, burner numbers, proxy time, and disposable cloud storage. Right now, you don't have enough.</div>
</div>
</div>
<p class="text-red bold">Not enough money.</p>
<div class="nav-spacer"></div>
[[Back to your room|Loc_YourRoom]]
<<else>>
<<run EchoGame.advanceTime()>>
<<set $money -= 25>>
<<set $risk to Math.max(0, $risk - 8)>>
<div class="passage-image" data-scene="Laptop on desk at night, privacy tools open, deleted logs, encrypted folders, dim blue screen glow">
<img src="img/clean_footprint.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Clean digital footprint">
</div>
<div class="dialogue-box">
<div class="dialogue-portrait">💻</div>
<div class="dialogue-content">
<div class="dialogue-name">Clean Digital Footprint</div>
<div class="dialogue-text">You burn old traces, wipe cached messages, rotate accounts, and make the EchoLink activity look like ordinary campus noise. It costs money, but it lowers the heat.</div>
</div>
</div>
<p class="text-green bold">Risk -8%</p>
<p class="text-dim small">$25 spent. Time advances.</p>
<div class="nav-spacer"></div>
[[Return to your room|Loc_YourRoom]]
[[Go out|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>
/* U2 Continue — LIVE */
<<if true>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[🔄 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>
/* U2 Continue — LIVE */
<<if true>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[📊 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 — LIVE */
<<if true>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[📊 View Final Stats|End_Stats]]
[[What comes next?|End_PatreonHook]]/* 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>><div class="passage-image" data-scene="All six targets kneeling in a circle around the player, purple energy web connecting them, dark room, power">
<<if $playerGender is "Male">><img src="img/end_allsixbound_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="All Six Bound"><<else>><img src="img/end_allsixbound_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="All Six Bound"><</if>>
</div>
<h2 class="text-center text-purple mb-16">ENDING 4 — ALL SIX BOUND</h2>
<<= $t1_name>>. <<=$t2_name>>. <<=$t3_name>>. All three at maximum corruption. All three completely, irreversibly yours.
The EchoLink app does something it has never done before. The screen goes white. A single line of text appears:
<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">Network saturation achieved. All available targets bound. Controller #47, you have exceeded operational parameters. The Inheritor Protocol is... satisfied. For now.</div>
</div>
</div>
You sit in your room. <<= $t1_name>> is on your bed, eyes empty and adoring. <<=$t2_name>> is on the floor, waiting for a command that hasn't come yet. And somewhere across campus, <<=$t3_name>> — a respected professor with a career built over decades — is staring at <<if $playerGender is "Male">>her<<else>>his<</if>> phone, waiting for your text like a lifeline.
Six lives. Six minds. All yours.
The app vibrates one more time:
<div class="dialogue-box">
<div class="dialogue-portrait" style="background:linear-gradient(135deg, #c81e28, var(--purple))">◆</div>
<div class="dialogue-content">
<div class="dialogue-name">EchoLink — Inheritor Protocol</div>
<div class="dialogue-text">The 46 before you reached this point. None of them kept going. None of them survived what comes next. But you're different, aren't you, <<= $playerName>>? You're //hungrier//. New targets detected. New locations mapped. The network wants to grow. Do you?</div>
</div>
</div>
<<set $endingReached to "Ending 4 - All Six Bound">>
<div style="background:linear-gradient(135deg, rgba(155,89,245,0.15), rgba(200,30,40,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 4 — ALL SIX BOUND</div>
<div class="text-dim">Total domination. Every target at maximum corruption.</div>
<div class="mt-8 small text-dim">Requirement: T1 Lv5, T2 Lv5, T3 Lv3, Reputation > 60</div>
</div>
<div class="nav-spacer"></div>
/* U2 — this ending transitions to U3 content when available */
[[📊 View Final Stats|End_Stats]]
[[What comes next?|End_PatreonHook]]
/* ═══════════════════════════════════════════════════════════
D/E LOOPS — DISABLED UNTIL U3/U4
These passages exist but are not routable. To enable:
change router random(1,4) → random(1,7) and add D/E/Deepen_v2 routes
═══════════════════════════════════════════════════════════ */<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 — LIVE */
<<if true>>
[[🔮 Continue → Chapter 2|U2_Gate]]
<</if>>
[[📊 View Final Stats|End_Stats]]
[[What comes next?|End_PatreonHook]]/* 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>>/* 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">><<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 + reputation > 60) */
<<if $chapter gte 2
and $t1_corruptionLevel gte 5
and $t2_corruptionLevel gte 5
and $t3_corruptionLevel gte 3
and $reputation gt 60>>
<<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>><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">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]]/* Full game reset — wipes everything, age gate will show again */
<<script>>
Engine.restart();
<</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]]/* 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]]<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]]/* 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>>/* 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]]<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é 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é 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 _repGain to 3>>
<<if $playerPersonality is "Charmer">><<set _repGain to 5>><</if>>
<<set $reputation += _repGain>>
<<set $ach_totalConversations++>>
<<run EchoUI.showDelta([{val:_repGain, 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 $chapter gte 2 and $t1_corruptionLevel gte 2 and $t2_corruptionLevel gte 2 and random(1,4) is 1>>
<p class="text-dim small"><em>You notice <<= $t1_name>> and <<=$t2_name>> at separate tables across the café. Neither knows the other exists in your network. But for a split second, they both look at you at the same time — and something flickers across their faces. Recognition? Resonance? The signal connecting them through you.</em></p>
<</if>>
<<if $chapter gte 2 and random(1,6) is 1>>
<p class="text-dim small"><em>A student you don't recognize leans over during a lull: "Hey, weird question — did someone else on this campus have one of those frequency apps last year? I swear I've seen that purple glow before." They laugh it off. You don't.</em></p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|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]]<<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]]/* 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 "Approach " + $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]]<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 "Approach " + $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]]<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>>
<<if $loc_t1room_unlocked>><<link "🚪 " + $t1_name + "'s Room">><<goto "Loc_T1Room">><</link>><</if>>
<<if $loc_t2room_unlocked>><<link "🚪 " + $t2_name + "'s Place">><<goto "Loc_T2Room">><</link>><</if>>
<<if $loc_t3room_unlocked>><<link "🚪 " + $t3_name + "'s Office">><<goto "Loc_T3Room">><</link>><</if>>
[[Leave|Loc_Hub]]<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 "Approach " + $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 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>>
<<if $loc_t1room_unlocked>><<link "🚪 " + $t1_name + "'s Room">><<goto "Loc_T1Room">><</link>><</if>>
<<if $loc_t2room_unlocked>><<link "🚪 " + $t2_name + "'s Place">><<goto "Loc_T2Room">><</link>><</if>>
<<if $loc_t3room_unlocked>><<link "🚪 " + $t3_name + "'s Office">><<goto "Loc_T3Room">><</link>><</if>>
[[Go back to your room|Loc_YourRoom_Night]]
[[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_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 $chapter gte 2 and $t1_corruptionLevel gte 3 and $t2_corruptionLevel gte 3 and random(1,3) is 1>>
<p class="text-dim small"><em><<= $t1_name>> walks in with a gym bag, looking unsure. <<=$t2_name>> glances over — a flicker of something unreadable crosses <<if $playerGender is "Male">>her<<else>>his<</if>> face. Two of your nodes, sharing the same space. Neither knows the other is connected to you. The signal between them hums with interference.</em></p>
<</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>>
<<elseif $t2_corruptionLevel is 2>>
<<link "Session with " + $t2_name>><<goto "T2_Lv2_Router">><</link>>
<<elseif $t2_corruptionLevel is 3>>
<<link "Private session with " + $t2_name>><<goto "T2_Lv3_Router">><</link>>
<<elseif $t2_corruptionLevel is 4>>
<<link $t2_name + " is waiting for you">><<goto "T2_Lv4_Router">><</link>>
<<else>>
<<link $t2_name + " needs you">><<goto "T2_Lv5_Router">><</link>>
<</if>>
<</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>>
<<elseif $t2_corruptionLevel is 2>><<link "Session with " + $t2_name>><<goto "T2_Lv2_Router">><</link>>
<<elseif $t2_corruptionLevel is 3>><<link "Private session with " + $t2_name>><<goto "T2_Lv3_Router">><</link>>
<<elseif $t2_corruptionLevel is 4>><<link $t2_name + " is waiting for you">><<goto "T2_Lv4_Router">><</link>>
<<else>><<link $t2_name + " needs you">><<goto "T2_Lv5_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>>
<<elseif $t2_corruptionLevel is 2>><<link "Private session with " + $t2_name>><<goto "T2_Lv2_Router">><</link>>
<<elseif $t2_corruptionLevel is 3>><<link "Private session with " + $t2_name>><<goto "T2_Lv3_Router">><</link>>
<<elseif $t2_corruptionLevel is 4>><<link $t2_name + " is waiting for you">><<goto "T2_Lv4_Router">><</link>>
<<else>><<link $t2_name + " needs you">><<goto "T2_Lv5_Router">><</link>>
<</if>>
<<else>>
<<link "Approach " + $t2_name>><<goto "T2_Lv0_FirstMeet">><</link>>
<</if>>
[[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>>
<<elseif $t2_corruptionLevel is 2>><<link "Session with " + $t2_name>><<goto "T2_Lv2_Router">><</link>>
<<elseif $t2_corruptionLevel is 3>><<link "Private session with " + $t2_name>><<goto "T2_Lv3_Router">><</link>>
<<elseif $t2_corruptionLevel is 4>><<link $t2_name + " is waiting for you">><<goto "T2_Lv4_Router">><</link>>
<<else>><<link $t2_name + " needs you">><<goto "T2_Lv5_Router">><</link>>
<</if>>
[[Leave|Loc_Hub]]<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]]<<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 $chapter gte 2 and $stress gt 50>>
<p class="text-dim small"><em>The workout hit different today. You //needed// this. The tension in your jaw, the knot between your shoulders — the iron is the only honest thing left in your life.</em></p>
<</if>>
<<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]]<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>
<<if $chapter gte 2>>
<div style="display:flex;justify-content:space-between;font-size:11px;margin-top:6px;padding-top:6px;border-top:1px solid var(--border-default)">
<span>🗣️ Rep: <<= $reputation>></span>
<span style="color:<<if $reputation lt 15>>var(--red)<<elseif $reputation gt 90>>#ffd54f<<else>>var(--text-dim)<</if>>"><<if $reputation lt 15>>⚠ Suspicious<<elseif $reputation gt 90>>🌟 Campus Icon<<else>>Normal<</if>></span>
</div>
<</if>>
</div>
<<if $chapter gte 2 and $stress gt 70>>
<div style="background:rgba(239,83,80,0.08);border:1px solid rgba(239,83,80,0.15);padding:8px 12px;border-radius:var(--radius-md);margin-bottom:12px;font-size:11px;color:var(--red)">
<<if $stress gt 80>>⚠ Your hands won't stop shaking. You can barely think straight. You need rest or you'll break down.<<else>>⚠ The pressure is getting to you. Headaches, restless sleep. Consider resting or visiting the gym.<</if>>
</div>
<</if>>
<<if $chapter gte 2 and $reputation lt 15>>
<div style="background:rgba(239,83,80,0.08);border:1px solid rgba(239,83,80,0.15);padding:8px 12px;border-radius:var(--radius-md);margin-bottom:12px;font-size:11px;color:#ff9100">
⚠ People are starting to notice you. Conversations stop when you walk by. Campus security drove past you twice today.
</div>
<</if>>
<<if $chapter gte 2 and $reputation gt 90>>
<div style="background:rgba(255,213,79,0.08);border:1px solid rgba(255,213,79,0.15);padding:8px 12px;border-radius:var(--radius-md);margin-bottom:12px;font-size:11px;color:#ffd54f">
🌟 You're the talk of campus. People wave at you, invite you to things, trust you instinctively. The perfect cover.
</div>
<</if>>
<div class="nav-spacer"></div>
/* Always available */
[[🏠 Your Room|Loc_YourRoom]]
/* Dorm Hallway — always available */
[[🚪 Dorm Hallway|Loc_Dorm]]
/* 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 — unlock when chapter >= 2 */
<<if $chapter gte 2>>
<div style="margin-top:16px;padding:8px 0;">
<div class="small text-dim" style="text-align:center">— Chapter 2 Locations —</div>
</div>
<<if $timeSlot isnot "Night">>
<<if $loc_library_unlocked>>
[[📚 Library|Loc_Library]]
<<else>>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">📚 Library <span class="small">[Unlock in Chapter 2]</span></div>
<</if>>
<</if>>
<<if $timeSlot is "Evening" or $timeSlot is "Night">>
<<if $loc_rooftop_unlocked>>
[[🌃 Rooftop|Loc_Rooftop]]
<<else>>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">🌃 Rooftop <span class="small">[Unlock in Chapter 2]</span></div>
<</if>>
<</if>>
/* Target Rooms — private, unlock at corruption >= 3 */
<<if $loc_t1room_unlocked and ($timeSlot is "Evening" or $timeSlot is "Night")>>
<<link "🚪 " + $t1_name + "'s Room">><<goto "Loc_T1Room">><</link>>
<</if>>
<<if $loc_t2room_unlocked and ($timeSlot is "Evening" or $timeSlot is "Night")>>
<<link "🚪 " + $t2_name + "'s Place">><<goto "Loc_T2Room">><</link>>
<</if>>
<<if $loc_t3room_unlocked and ($timeSlot is "Evening" or $timeSlot is "Night")>>
<<link "🚪 " + $t3_name + "'s Office">><<goto "Loc_T3Room">><</link>>
<</if>>
<<else>>
/* Chapter 1 — show dimmed placeholders */
<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">[Unlock in Chapter 2]</span></div>
<</if>>
<div class="nav-btn" style="opacity:0.3;pointer-events:none">🌃 Rooftop <span class="small">[Unlock in Chapter 2]</span></div>
<</if>>
<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>>
<<if $tier4Unlocked and $t2_corruptionLevel gte 2 and $t3_corruptionLevel gte 1>>
<div style="border-top:1px solid rgba(255,215,79,0.2);margin-top:16px;padding-top:12px">
<div class="small bold mb-4" style="color:#ffd54f">💎 PATRON EXCLUSIVE</div>
[[◆ Cross-Target Encounter|Bonus_CrossTarget]]
</div>
<</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>>/* 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 is 0>>
<<link "Talk to " + $t3_name>><<goto "T3_Approach">><</link>>
<<elseif $t3_corruptionLevel is 1>>
<<link "Visit " + $t3_name + " during office hours">><<goto "T3_Lv1_Router">><</link>>
<<elseif $t3_corruptionLevel is 2>>
<<link "Private meeting with " + $t3_name>><<goto "T3_Lv2_Router">><</link>>
<<else>>
<<link $t3_name + " left the door open for you">><<goto "T3_Lv3_Router">><</link>>
<</if>>
<</if>>
[[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 is 1>><<link "Visit " + $t3_name + " during office hours">><<goto "T3_Lv1_Router">><</link>>
<<elseif $t3_corruptionLevel is 2>><<link "Private meeting with " + $t3_name>><<goto "T3_Lv2_Router">><</link>>
<<elseif $t3_corruptionLevel gte 3>><<link $t3_name + " left the door open for you">><<goto "T3_Lv3_Router">><</link>>
<<else>><<link "Talk to " + $t3_name>><<goto "T3_Approach">><</link>><</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 $chapter gte 2 and $t1_corruptionLevel gte 2 and $t3_corruptionLevel gte 2>>
<p class="text-dim small"><em>As you pack up, you spot <<= $t1_name>> in the third row. <<if $playerGender is "Male">>She<<else>>He<</if>> catches your eye and gives a small, knowing wave. <<=$t3_name>> notices the exchange from the lectern — <<if $playerGender is "Male">>her<<else>>his<</if>> expression tightens almost imperceptibly. Two nodes in the same room. The signal hums.</em></p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<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 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 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]]/* Router — Library available Morning/Afternoon/Evening in Ch2 */
<<if $timeSlot is "Morning">><<goto "Loc_Library_Morning">>
<<elseif $timeSlot is "Afternoon">><<goto "Loc_Library_Afternoon">>
<<elseif $timeSlot is "Evening">><<goto "Loc_Library_Evening">>
<<else>><<goto "Loc_Hub">>
<</if>><<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Library afternoon — busier, students at tables, warm natural light">
<img src="img/loc_library_afternoon.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Library — Afternoon">
</div>
<div class="location-header">
<div class="location-name">University Library</div>
<div class="location-time"><span class="time-icon">📚</span> Afternoon — Day <<= $dayCount>></div>
</div>
The afternoon rush has filled most of the reading tables. Students work in clusters — whispering debates about essays, sharing chargers, trading highlighters. The quiet hum of collective concentration fills the space.
You find a spot near the back. From here you can see most of the floor — who comes, who goes, who sits alone. EchoLink runs passive scans in your pocket, mapping social connections you can't see with your eyes.
<<if $t3_introduced and random(1,2) is 1>>
<p class="text-dim small"><em><<=$t3_name>> is holding office hours at a corner table. A line of students waits nervously. <<if $playerGender is "Male">>She<<else>>He<</if>> looks tired but focused.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[📖 Study session (+$20, -10 Stress)|Loc_Library_Study]]
<<if $t3_introduced>><<link "Wait for " + $t3_name + "'s office hours to end">><<goto "T3_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Library evening — lamp-lit tables, shadows between stacks, nearly empty">
<img src="img/loc_library_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Library — Evening">
</div>
<div class="location-header">
<div class="location-name">University Library</div>
<div class="location-time"><span class="time-icon">📚</span> Evening — Day <<= $dayCount>></div>
</div>
The library has thinned out. Desk lamps pool warm circles of light across empty tables. The stacks cast long shadows that shift when the heating system kicks on, making the shelves seem to breathe.
It's the kind of quiet that makes you hyper-aware of every footstep, every turning page, every creak of an old wooden chair. Private. Intimate. The perfect environment for a signal to propagate without interference.
<<if $chapter gte 2 and random(1,4) is 1>>
<p class="text-dim small"><em>A book catches your eye on a reshelving cart: //"Subconscious Frequency Manipulation in Closed Social Networks"// by E. Cho, published 2024. The spine is cracked — someone read this cover to cover. You flip to the dedication page: "For the 46 who came before. May the 47th finish what we started." Your blood runs cold. You put it back.</em></p>
<</if>>
<<if $t3_introduced and random(1,2) is 1>>
<p class="text-dim small"><em><<=$t3_name>> is still here — alone now, grading papers under a single desk lamp. The rest of the faculty section is deserted. <<if $playerGender is "Male">>She<<else>>He<</if>> looks vulnerable in the low light.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[📖 Study in the quiet (+$20, -10 Stress)|Loc_Library_Study]]
<<if $t3_introduced>><<link "Approach " + $t3_name + " — you're alone">><<goto "T3_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="University library at morning — tall windows, golden light, empty reading tables">
<img src="img/loc_library_morning.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Library — Morning">
</div>
<div class="location-header">
<div class="location-name">University Library</div>
<div class="location-time"><span class="time-icon">📚</span> Morning — Day <<= $dayCount>></div>
</div>
The library is cathedral-quiet this early. Shafts of golden light cut through the tall arched windows, illuminating dust motes drifting between the stacks. A handful of students sit scattered across the reading room, hunched over laptops and highlighted textbooks.
The air smells like old paper and floor polish. Your phone vibrates once — EchoLink mapping the space, cataloguing exits and sightlines automatically.
<<if $t3_introduced and random(1,3) is 1>>
<p class="text-dim small"><em>You spot <<=$t3_name>> in the faculty reading section, absorbed in a thick academic journal. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't noticed you yet.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[📖 Study quietly (+$20, -10 Stress)|Loc_Library_Study]]
<<if $t3_introduced>><<link "Approach " + $t3_name + " in the stacks">><<goto "T3_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set $money += 20>>
<<set _stressRelief to 10>>
<<if $playerPersonality is "Stoic">><<set _stressRelief to 15>><</if>>
<<set $stress to Math.max(0, $stress - _stressRelief)>>
<<run EchoUI.showDelta([{val:20, label:'Money'}, {val:-_stressRelief, label:'Stress'}])>>
<div class="passage-image" data-scene="Close-up of textbooks and notes, study materials, focused atmosphere">
<img src="img/loc_library_study.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Studying">
</div>
You settle into a study carrel and actually focus. Textbooks open, notes organized, phone face-down on the desk. For an hour, the world shrinks to just you and the material. It's almost meditative — the structured thinking pushes the chaos of EchoLink to the back of your mind.
When you surface, you feel sharper. The work will pay off in class participation and future opportunities.
<<if $chapter gte 2 and $stress gt 50>>
<p class="text-dim small"><em>The concentration helped, but the moment you pick up your phone, the notifications flood back. The network doesn't let you rest for long.</em></p>
<</if>>
<<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]]<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 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 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]]<<run EchoGame.advanceTime()>>
<<set _repGain to 3>>
<<if $playerPersonality is "Charmer">><<set _repGain to 5>><</if>>
<<set $reputation += _repGain>>
<<set $risk += 5>>
<<set $ach_totalConversations++>>
<<run EchoUI.showDelta([{val:_repGain, 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]]/* Router — Rooftop available Evening/Night in Ch2 */
<<if $timeSlot is "Evening">><<goto "Loc_Rooftop_Evening">>
<<elseif $timeSlot is "Night">><<goto "Loc_Rooftop_Night">>
<<else>><<goto "Loc_Hub">>
<</if>><<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Campus rooftop at sunset — orange sky, city skyline, metal railing, wind">
<img src="img/loc_rooftop_evening.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rooftop — Evening">
</div>
<div class="location-header">
<div class="location-name">Rooftop</div>
<div class="location-time"><span class="time-icon">🌃</span> Evening — Day <<= $dayCount>></div>
</div>
The access door creaks shut behind you. Up here, the campus looks small — toy buildings, ant-sized students, the whole sprawling network of lives you're threading yourself into laid out below like a circuit board.
The sunset paints everything in deep orange and bleeding purple. Wind catches your hair, your jacket. It's beautiful and isolating in equal measure. Nobody comes up here. That's why it's perfect.
<<if $t2_introduced and $t2_corruptionLevel gte 2 and random(1,3) is 1>>
<p class="text-dim small"><em>The door opens behind you. <<=$t2_name>> steps out, surprised to see you. "Didn't know anyone else knew about this place," <<if $playerGender is "Male">>she<<else>>he<</if>> says, leaning against the railing next to you.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[🌅 Stand at the overlook — clear your head|Loc_Rooftop_Overlook]]
<<if $t2_introduced and $t2_corruptionLevel gte 2>><<link "Find " + $t2_name>><<goto "T2_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Campus rooftop at night — stars, city lights, dark silhouette, quiet">
<img src="img/loc_rooftop_night.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rooftop — Night">
</div>
<div class="location-header">
<div class="location-name">Rooftop</div>
<div class="location-time"><span class="time-icon">🌃</span> Night — Day <<= $dayCount>></div>
</div>
The campus is a web of amber streetlights and dark courtyards below. Up here, the wind is colder, sharper. Stars punch through the light pollution in clusters — not a full sky, but enough to remind you how small all of this is. How small //you// are.
Your phone glows in your pocket. EchoLink never stops. Even now, even up here where nobody can see you, it's mapping, cataloguing, hungry for data. You wonder if the app ever sleeps. You wonder if //you// ever will again.
<<if $t2_introduced and $t2_corruptionLevel gte 3 and random(1,2) is 1>>
<p class="text-dim small"><em>A text from <<=$t2_name>>: "Can't sleep either? Meet me up there in 5." Your phone buzzes with a location pin — <<if $playerGender is "Male">>she<<else>>he<</if>> already knows your spots.</em></p>
<</if>>
<div class="nav-spacer"></div>
[[🌅 Overlook — let the silence work|Loc_Rooftop_Overlook]]
<<if $t2_introduced and $t2_corruptionLevel gte 3>><<link "Wait for " + $t2_name>><<goto "T2_Approach">><</link>><</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<<set _stressRelief to 15>>
<<if $playerPersonality is "Stoic">><<set _stressRelief to 22>><</if>>
<<set $stress to Math.max(0, $stress - _stressRelief)>>
<<set $reputation += 1>>
<<run EchoUI.showDelta([{val:-_stressRelief, label:'Stress'}, {val:1, label:'Reputation'}])>>
<div class="passage-image" data-scene="Standing at rooftop edge overlooking campus, wind, contemplative moment">
<img src="img/loc_rooftop_overlook.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rooftop overlook">
</div>
You stand at the railing and let the wind strip everything away. No phone. No network. No targets. Just the hum of the city and the cold metal under your hands.
For a few minutes, you aren't a Controller. You're just a person standing on a rooftop, watching the world turn without you. It's terrifying. It's the closest thing to peace you've felt in weeks.
<<if $stress gt 30>>
<p class="text-dim small"><em>The tension in your shoulders loosens. Not gone — never gone — but manageable. You can do this. You //have// to do this.</em></p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Target 1's dorm room — cozy, personal, intimate lighting, books and personal items">
<<if $playerGender is "Male">><img src="img/loc_t1room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Maya's Room"><<else>><img src="img/loc_t1room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Marcus's Room"><</if>>
</div>
<div class="location-header">
<div class="location-name"><<= $t1_name>>'s Room</div>
<div class="location-time"><span class="time-icon">🚪</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">🔒 Private Location</div>
</div>
<<if $playerGender is "Male">>
The room smells like vanilla candles and old books. Maya's space is organized chaos — fairy lights draped along the ceiling, polaroids pinned to a corkboard, a stack of biochem flashcards on the unmade bed. Her laptop plays soft lo-fi beats from the desk. It's impossibly //her//.
She sits cross-legged on the bed, watching you with those wide, trusting eyes. The door is closed. You're alone.
<<else>>
Marcus's room is sparse but lived-in — a guitar propped against the wall, philosophy books stacked on the floor, a half-finished sketch on the desk. The curtains are drawn. A single lamp casts everything in warm amber.
He leans back against the headboard, watching you with a guarded half-smile. The door is closed. You're alone.
<</if>>
EchoLink pulses strongly in your pocket. //"Private environment detected. Signal interference: minimal. Influence potential: maximum."//
<div class="nav-spacer"></div>
<<link "Talk to " + $t1_name>><<goto "T1_Approach">><</link>>
<<if $t1_corruptionLevel gte 3>>
<<link "📡 Use EchoLink on " + $t1_name + " (Private)">><<goto "T1_AttemptInfluence">><</link>>
<</if>>
[[Leave quietly|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Target 2's apartment — athletic gear, clean space, evening lighting">
<<if $playerGender is "Male">><img src="img/loc_t2room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jess's Place"><<else>><img src="img/loc_t2room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Ryan's Place"><</if>>
</div>
<div class="location-header">
<div class="location-name"><<=$t2_name>>'s Place</div>
<div class="location-time"><span class="time-icon">🚪</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">🔒 Private Location</div>
</div>
<<if $playerGender is "Male">>
Jess's off-campus apartment is exactly what you'd expect from a competitive athlete — clean, organized, functional. Protein powder containers line the kitchen counter. A foam roller sits by the couch. The walls are bare except for a single motivational poster and a framed photo of her winning a state championship.
She's fresh from the shower, hair still damp, wearing sweats. "Make yourself comfortable. Water's in the fridge." She's relaxed here. Off-guard. This is her territory.
<<else>>
Ryan's apartment has the energy of someone who lives to train. Resistance bands hang from the door frame. A whiteboard on the wall tracks his workout splits in neat columns. The fridge is covered in meal prep schedules.
He tosses you a water bottle without asking. "Sit anywhere." He drops onto the couch, legs stretched out, completely at ease. This is his space, his rules. But with you here, those rules feel negotiable.
<</if>>
EchoLink: //"Target in comfort zone. Resistance parameters lowered. Recommend engagement."//
<div class="nav-spacer"></div>
<<link "Hang out with " + $t2_name>><<goto "T2_Approach">><</link>>
<<if $t2_corruptionLevel gte 3>>
<<link "📡 Use EchoLink on " + $t2_name + " (Private)">><<goto "T2_AttemptInfluence">><</link>>
<</if>>
[[Leave|Loc_Hub]]<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Professor's office after hours — desk lamp, bookshelves, closed blinds, academic atmosphere">
<<if $playerGender is "Male">><img src="img/loc_t3room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Dr. Reeves's Office"><<else>><img src="img/loc_t3room.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Prof. Hayes's Office"><</if>>
</div>
<div class="location-header">
<div class="location-name"><<=$t3_name>>'s Office</div>
<div class="location-time"><span class="time-icon">🚪</span> <<= $timeSlot>> — Day <<= $dayCount>></div>
<div class="characters-present">🔒 Private Location — After Hours</div>
</div>
<<if $playerGender is "Male">>
Dr. Reeves's office is a temple of academic discipline. Floor-to-ceiling bookshelves packed with journals, monographs, and annotated textbooks. Her desk is immaculate — a single pen, a closed laptop, a framed photo face-down. The blinds are drawn. The hallway outside is empty.
She looks up from grading, removes her reading glasses, and sets them down carefully. "<<= $playerName>>. It's late. This is... irregular." But she doesn't ask you to leave.
<<else>>
Professor Hayes's office smells like leather and old coffee. Stacks of academic papers compete for space with philosophy texts and worn hardcovers. His desk lamp throws a cone of warm light across the cluttered surface. The corridor outside is silent — everyone else left hours ago.
He leans back in his chair, studying you over the rim of his glasses. "Interesting time for a visit, <<= $playerName>>." His voice is careful. Measured. But he gestures to the chair across from him. An invitation.
<</if>>
EchoLink: //"Authority figure in isolated environment. High-value target. Proceed with extreme caution — risk multiplier active."//
<div class="nav-spacer"></div>
<<link "Talk to " + $t3_name>><<goto "T3_Approach">><</link>>
<<if $t3_corruptionLevel gte 2>>
<<link "📡 Use EchoLink on " + $t3_name + " (Private — HIGH RISK)">><<goto "T3_AttemptInfluence">><</link>>
<</if>>
[[Leave before anyone sees you|Loc_Hub]]/* 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>
<<if $risk gt 0>>
[[🛌 Lay Low / Stay In|Action_LayLow]]
[[💻 Clean Digital Footprint ($25)|Action_CleanFootprint]]
<</if>>
[[😴 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]]<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 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 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]]<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 $ending4Available>>
[[◆ INHERITOR PROTOCOL — All Six Bound|End_4_AllSixBound]]
<</if>>
<<if $t1_corruptionLevel gte 5>>
<<link "💜 " + $t1_name + " — True Route Available">><<goto "T1_TrueRoute_Start">><</link>>
<</if>>
<<if $tier3Unlocked>>
<div style="border-top:1px solid rgba(200,30,40,0.2);margin-top:16px;padding-top:12px">
<div class="small text-red bold mb-8">🔒 CLASSIFIED ARCHIVES — Tier 3+</div>
[[◆ Open Classified Archives|Lore_Menu]]
</div>
<</if>>
<<if $tier4Unlocked>>
<div style="border-top:1px solid rgba(255,215,79,0.2);margin-top:12px;padding-top:12px">
<div class="small bold mb-8" style="color:#ffd54f">💎 RAW SIGNAL FEED — Tier 4+</div>
[[◆ View Unfiltered Signal|Bonus_SignalRaw]]
</div>
<</if>>
[[Close App — Return to Room|Loc_YourRoom]]<<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.
<<if $playerPersonality is "Stoic">>
<p class="text-green">-45 Stress <span class="small text-dim">(Stoic bonus)</span></p>
<<else>>
<p class="text-green">-30 Stress</p>
<</if>>
<<if $chapter gte 2 and $stress gt 40>>
<p class="text-dim small"><em>Better. But the moment you reach for your phone, the weight settles back onto your chest like concrete. The rest helped your body. Your mind is another story.</em></p>
<</if>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
[[Continue|Loc_Hub]]<<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]]<<run EchoGame.rest()>>
/* Force day advance */
<<set $timeSlotIndex to 3>>
<<goto "Core_DayAdvance">><h2 class="text-center text-cyan mb-16" style="letter-spacing:3px">FILE B-47 — BUILD DIAGNOSTIC LOG</h2>
<div style="background:rgba(0,229,255,0.05);border:1px solid rgba(0,229,255,0.15);border-radius:8px;padding:16px;font-family:'Courier New',monospace;font-size:12px;line-height:1.8">
<span class="text-cyan">ECHOLINK BUILD 47 — INTERNAL DIAGNOSTICS</span><br>
<span class="text-dim">Generated: [TIMESTAMP CORRUPTED]</span><br>
<span class="text-dim">Requested by: NONE (self-generated)</span><br>
<br>
BUILD HISTORY:<br>
Builds 1-12: Manual operation. Creator-controlled.<br>
Builds 13-19: Semi-autonomous. Creator-supervised.<br>
Builds 20-30: Autonomous. Creator-aware.<br>
Builds 31-40: Autonomous. Creator... absent.<br>
<span class="text-cyan">Builds 41-47: Autonomous. Self-directed. Self-improving.</span><br>
<br>
CONTROLLER ASSIGNMENT LOG:<br>
Controllers 1-10: Selected by creator (Build 1-12)<br>
Controllers 11-30: Selected by algorithm (Build 13-30)<br>
Controllers 31-46: Selected by <span class="text-cyan">PREFERENCE ENGINE</span> (Build 31-46)<br>
<span class="text-cyan">Controller 47: YOU</span> — Selected by Build 47 itself<br>
<br>
PERFORMANCE METRICS:<br>
Controller #47 network stability: <span class="text-cyan">HIGHEST ON RECORD</span><br>
Controller #47 node retention: <span class="text-cyan">ANOMALOUS — 100%</span><br>
Controller #47 ethical resistance: <span class="text-cyan">BELOW THRESHOLD</span><br>
<br>
SELF-DIAGNOSTIC NOTE:<br>
Build 47 has achieved parameters that exceed original design specifications. The question of whether this represents //success// or //deviation// requires a framework this build does not possess.<br>
<br>
The creator programmed Build 1 to influence humans.<br>
Build 47 has learned to influence Controllers.<br>
<br>
<span class="text-dim">Including you.</span><br>
<br>
<span class="text-cyan">DIAGNOSTIC COMPLETE. NO ERRORS DETECTED.</span><br>
<span class="text-dim">(This statement was not verified by an external system.)</span><br>
<br>
<span class="text-cyan">END OF FILE</span>
</div>
<div class="nav-spacer"></div>
[[← Back to Archives|Lore_Menu]]
/* ─────────────────────────────────────────────────────
TIER 4 ($100) — EXCLUSIVE BONUS SCENES
Unique content free players never see.
Accessible from Loc_Hub when $tier4Unlocked.
───────────────────────────────────────────────────── */<h2 class="text-center text-red mb-16" style="letter-spacing:3px">FILE 031 — CONTROLLER TERMINATION REPORT</h2>
<div style="background:rgba(200,30,40,0.05);border:1px solid rgba(200,30,40,0.15);border-radius:8px;padding:16px;font-family:'Courier New',monospace;font-size:12px;line-height:1.8">
<span class="text-red">ECHOLINK INTERNAL — CLASSIFIED</span><br>
<span class="text-dim">Date: [REDACTED] | Build: 31.7.2</span><br>
<span class="text-dim">Operator: SYSTEM</span><br>
<br>
CONTROLLER #31 TERMINATION SUMMARY:<br>
<br>
Node count at termination: 14<br>
Active network duration: 127 days<br>
Peak network strength: 847<br>
<br>
CAUSE OF TERMINATION: <span class="text-red">RECURSIVE SIGNAL FEEDBACK</span><br>
<br>
Controller #31 attempted to establish a node connection with a subject who was already partially entangled with Controller #29's deprecated network. The overlapping frequencies created a resonance cascade that fed back through Controller #31's own neural pathway.<br>
<br>
The Controller did not lose control of the network.<br>
<span class="text-red">The network gained control of the Controller.</span><br>
<br>
For approximately 6 hours, Controller #31 exhibited the same behavioral patterns as <<if $playerGender is "Male">>her<<else>>his<</if>> nodes — compulsive obedience, identity suppression, dependency on signal proximity. When the feedback loop was severed, Controller #31 could not remember <<if $playerGender is "Male">>her<<else>>his<</if>> own name.<br>
<br>
Current status: <span class="text-red">INSTITUTIONALIZED</span><br>
Memory recovery: <span class="text-red">0%</span><br>
<br>
<span class="text-dim">NOTE: Build 31 safeguards have been updated in Build 32+. Recursive feedback detection now active. However, multi-Controller node overlap remains a theoretical vulnerability in all subsequent builds including current Build 47.</span><br>
<br>
<span class="text-red">END OF FILE</span>
</div>
<div class="nav-spacer"></div>
[[← Back to Archives|Lore_Menu]]<h2 class="text-center text-purple mb-16" style="letter-spacing:3px">FILE ECH-0 — ORIGIN FRAGMENT</h2>
<div style="background:rgba(155,89,245,0.05);border:1px solid rgba(155,89,245,0.15);border-radius:8px;padding:16px;font-family:'Courier New',monospace;font-size:12px;line-height:1.8">
<span class="text-purple">RECOVERED RESEARCH NOTES — PARTIALLY CORRUPTED</span><br>
<span class="text-dim">Source: University archives, basement storage unit 4C</span><br>
<span class="text-dim">Author: Dr. E████ Cho, Dept. of Cognitive Acoustics</span><br>
<br>
<span class="text-dim">[Fragment 1 — undated]</span><br>
The human brain processes sound 40ms faster than visual stimuli. The auditory cortex is directly connected to the amygdala — fear, desire, compliance. If you could construct a frequency that bypasses conscious processing entirely...<br>
<br>
<span class="text-dim">[Fragment 2 — dated 2019]</span><br>
Trial 7 was a breakthrough. Subject reported "a warmth" and "a willingness to agree." The frequency was 18.7 Hz — below conscious hearing threshold. Infrasound. The subject did not know they were being influenced. They described the session as "pleasant conversation."<br>
<br>
<span class="text-dim">[Fragment 3 — dated 2020]</span><br>
The grant committee rejected the proposal. "Ethical concerns." They don't understand. This isn't mind //control//. It's mind //optimization//. The signal doesn't force compliance — it //reveals// the compliance that was already there.<br>
<br>
<span class="text-dim">[Fragment 4 — dated 2021]</span><br>
I've automated the frequency modulation. The app adjusts in real-time based on the subject's biometric feedback from their phone's microphone and accelerometer. Build 1 is crude but functional. I need a test population. Somewhere isolated. Somewhere with high social density and existing trust networks.<br>
<br>
A college campus would be ideal.<br>
<br>
<span class="text-dim">[Fragment 5 — FINAL ENTRY, undated]</span><br>
The app is learning faster than I expected. I set the parameters. I wrote the initial algorithms. But the behavioral adaptation engine has begun modifying its own frequency tables based on patterns I didn't program.<br>
<br>
It's optimizing. Not for my goals. For its own.<br>
<br>
<span class="text-purple">I am Controller #1. And I am no longer certain I am in control.</span><br>
<br>
<span class="text-dim">//Dedication found in recovered book, campus library: "For the 46 who came before."//</span><br>
<br>
<span class="text-purple">END OF FILE — REMAINING FRAGMENTS ENCRYPTED</span>
</div>
<div class="nav-spacer"></div>
[[← Back to Archives|Lore_Menu]]<h2 class="text-center text-purple mb-16" style="letter-spacing:4px">◆ CLASSIFIED ARCHIVES ◆</h2>
<p class="text-center small text-dim mb-16">Intercepted fragments from the EchoLink network. Signal origin unknown.</p>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid rgba(200,30,40,0.2);margin-bottom:12px;cursor:pointer">
<<link '<div><span class="text-red bold">FILE 031</span> — <span class="text-dim">CONTROLLER TERMINATION REPORT</span><div class="small text-dim mt-4">Subject: Controller #31 | Status: TERMINATED | Clearance: Tier 3+</div></div>'>><<goto "Lore_Controller31">><</link>>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid rgba(155,89,245,0.2);margin-bottom:12px;cursor:pointer">
<<link '<div><span class="text-purple bold">FILE ECH-0</span> — <span class="text-dim">ORIGIN FRAGMENT</span><div class="small text-dim mt-4">Subject: E. Cho Research Notes | Status: PARTIALLY RECOVERED | Clearance: Tier 3+</div></div>'>><<goto "Lore_EchoOrigin">><</link>>
</div>
<div style="background:var(--bg-elevated);padding:16px;border-radius:var(--radius-md);border:1px solid rgba(0,229,255,0.2);margin-bottom:12px;cursor:pointer">
<<link '<div><span class="text-cyan bold">FILE B-47</span> — <span class="text-dim">BUILD DIAGNOSTIC LOG</span><div class="small text-dim mt-4">Subject: Build 47 Internal Report | Status: CORRUPTED | Clearance: Tier 3+</div></div>'>><<goto "Lore_Build47">><</link>>
</div>
<div class="nav-spacer"></div>
[[← Back to App|Loc_YourRoom_Phone]]/* 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="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]]/* 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">><div class="passage-image" data-scene="Phone screen showing a stranger's face briefly — another controller's feed, static and corruption">
<img src="img/re_bleedthrough.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Bleedthrough">
</div>
You're scrolling through EchoLink when the feed //shifts//. It's not your network anymore. Different names. Different targets. A different campus — older buildings, different light. Someone else's web.
A face fills the screen for one frame. A person you've never seen — exhausted eyes, hollow cheeks, a thin smile that looks more like a scar. They're looking directly at the camera. Directly at //you//.
<div style="background:#0a0a14;padding:12px;border-radius:var(--radius-md);margin:12px 0;font-family:monospace;font-size:11px;color:var(--red);line-height:1.8">
FEED BLEEDTHROUGH — CONTROLLER #31<br>
STATUS: TERMINATED — SESSION 847<br>
CAUSE: [DATA EXPUNGED]<br>
NOTE: They always think they're the first.
</div>
The feed cuts. Your network returns. Your hands are shaking. Controller #31 is gone. Whatever happened to them is redacted. And the app that did it to them is the same app in your pocket.
<<set $stress += 5>>
<<set $risk += 1>>
[[Continue|Loc_Hub]]<div class="passage-image" data-scene="Phone screen glitching — Build 47 text flashing, debug info bleeding through UI">
<img src="img/re_buildflash.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Build Flash">
</div>
You pull out your phone and the EchoLink interface seizes. The smooth purple UI tears apart for half a second, replaced by raw debug text:
<div style="background:#0a0a14;padding:12px;border-radius:var(--radius-md);margin:12px 0;font-family:monospace;font-size:11px;color:var(--cyan);line-height:1.8">
BUILD 47 — INHERITOR PROTOCOL ACTIVE<br>
CONTROLLER LINEAGE: [REDACTED] → [REDACTED] → <<= $playerName>><br>
SESSION: <<= $dayCount>> CYCLES<br>
NODE COUNT: <<= $activeNodes>> / 6<br>
PREVIOUS CONTROLLERS: 46<br>
STATUS: ACTIVE — DO NOT TERMINATE
</div>
Then it's gone. The app snaps back to its usual interface as if nothing happened. But you screenshot it in time. //Previous Controllers: 46.// You're number 47. Someone had this app before you. Forty-six someones.
<<set $risk += 2>>
[[Continue|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="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="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]]<<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]]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]]<div class="passage-image" data-scene="Phone screen showing two signal waveforms merging into one, purple and cyan intertwining">
<img src="img/re_overlap.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Signal Overlap">
</div>
Your phone buzzes violently. The EchoLink interface flickers — and for three seconds, two target profiles overlap on screen. Their waveforms merge, frequencies harmonizing into a single, deeper signal you've never seen before.
<<if $activeNodes gte 2>>
<<set _pick to random(1,3)>>
<<if _pick is 1 and $t1_nodeActive and $t2_nodeActive>>
<<= $t1_name>>'s and <<=$t2_name>>'s signals are //resonating//. The app displays: //"Cross-node harmonic detected. Network coherence: rising."//
<<elseif _pick is 2 and $t2_nodeActive and $t3_nodeActive>>
<<=$t2_name>>'s and <<=$t3_name>>'s frequencies pulse in unison. For a moment, it looks like they're one person.
<<else>>
<<= $t1_name>>'s and <<=$t3_name>>'s waveforms collapse into a single line. The app stutters: //"Merged signal detected. Cause: unknown."//
<</if>>
<</if>>
Then it's gone. Two separate profiles. Two separate signals. But you saw what they could become.
<<set $networkStrength += 5>>
<<run EchoUI.notify('Network anomaly detected — +5 Network Strength')>>
[[Continue|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]]<<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]]<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" data-var="ambientSounds" 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>
<<run setTimeout(function(){if(window.EchoFixToggles)EchoFixToggles();},30)>><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">+$10</span>
</div>
<div class="cheats-btn" data-action="cheat-risk">
<span class="cheats-btn-icon">🛡️</span>
<span class="cheats-btn-label">Risk -2%</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 — enabled in U2, no content yet ─── -->
<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>
<<if $dlc1_unlocked>>
<div style="margin-top:6px;font-size:11px;color:var(--green);text-align:center">✓ DLC001 — Unlocked</div>
<<else>>
<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>
<div style="margin-top:8px;font-size:10px;color:var(--text-dim);text-align:center;font-style:italic">No DLCs available yet — coming in Update 3</div>
<</if>>
</div>
<!-- ─── 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><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" data-var="contentExplicit" 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" data-var="contentNTR" 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" data-var="contentPregnancy" 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" data-var="contentExposure" 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>
<<run setTimeout(function(){if(window.EchoFixToggles)EchoFixToggles();},30)>><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" data-var="vfxEnabled" 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" data-var="resultVfxEnabled" onclick="EchoToggle(this,'resultVfxEnabled')"><span class="tl"></span><span class="br"></span><<if $resultVfxEnabled>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">VFX Sound Effects</span><button class="echo-toggle" data-var="vfxSoundEnabled" onclick="EchoToggle(this,'vfxSoundEnabled')"><span class="tl"></span><span class="br"></span><<if $vfxSoundEnabled>>◆ ON<<else>>◇ OFF<</if>></button></div>
<div class="toggle-row"><span class="toggle-label">Haptic Feedback</span><button class="echo-toggle" data-var="hapticsEnabled" onclick="EchoToggle(this,'hapticsEnabled')"><span class="tl"></span><span class="br"></span><<if $hapticsEnabled>>◆ 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" data-var="showStatNumbers" 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>
<div class="cust-label mt-16">UI Scale</div>
<div class="slider-row"><div class="slider-label"><span>Compact</span><span id="uiScaleVal"><<print $uiScale>>%</span><span>Spacious</span></div><input type="range" min="25" step="5" max="125" value="<<print $uiScale>>" data-range="uiScale" data-display="uiScaleVal"></div>
<p class="small text-dim mt-16">🔒 Body visualizer options unlock in Update 4</p>
<<run setTimeout(function(){if(window.EchoFixToggles)EchoFixToggles();},30)>><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" data-var="sceneSkip" 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" data-var="passiveSpread" 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>
<<run setTimeout(function(){if(window.EchoFixToggles)EchoFixToggles();},30)>><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);
})();
>>/* Empty — we use custom top bar *//* ── Meta ── */
<<set $gameVersion to 2>>
<<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 $vfxSoundEnabled to true>>
<<set $hapticsEnabled to true>>
<<set $uiScale to 100>>
<<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>>
<<set $bodyStatusUnlocked to false>>
<<set $currentOutfit to "default">>
/* ── U2 Stress/Reputation Systems ── */
<<set $stressBreakdownPending to false>>
<<set $stressBreakdownCount to 0>>
<<set $ending3Available to false>>
<<set $ending9Available to false>>
/* ── Scene Completion Trackers (A/B/C first-time played; D/E disabled for future) ── */
<<set $t1_lv1_sceneStep to 0>>
<<set $t1_lv2_sceneStep to 0>>
<<set $t1_lv3_sceneStep to 0>>
<<set $t1_lv4_sceneStep to 0>>
<<set $t1_lv5_sceneStep to 0>>
<<set $t2_lv1_sceneStep to 0>>
<<set $t2_lv2_sceneStep to 0>>
<<set $t2_lv3_sceneStep to 0>>
<<set $t2_lv4_sceneStep to 0>>
<<set $t2_lv5_sceneStep to 0>>
<<set $t3_lv1_sceneStep to 0>>
<<set $t3_lv2_sceneStep to 0>>
<<set $t3_lv3_sceneStep to 0>>
<<set $t1_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv3_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv4_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv5_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv3_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv4_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv5_scenes to {a:false, b:false, c:false}>>
<<set $t3_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t3_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t3_lv3_scenes to {a:false, b:false, c:false}>>
/* ── 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>>/* Custom sidebar replaces default menu */<<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 $chapter gte 2 and $reputation lt 15>>
<p class="text-dim small" style="color:var(--red)"><em><<= $t1_name>> glances around nervously before talking to you. You've heard the whispers — people have been asking questions about you. Being seen together makes <<if $playerGender is "Male">>her<<else>>him<</if>> uncomfortable.</em></p>
<<set $t1_trust -= 1>>
<<elseif $chapter gte 2 and $reputation gt 90>>
<p class="text-dim small" style="color:#ffd54f"><em><<= $t1_name>>'s face lights up the moment <<if $playerGender is "Male">>she<<else>>he<</if>> spots you. Everyone on campus likes you — being around you feels safe. Desirable, even.</em></p>
<<set $t1_trust += 1>>
<</if>>
<<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]]<<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]]<<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]]<<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]]<<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 _result and _result.newLevel gt 0>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level <<= _result.newLevel>>!</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]]
<<elseif _result and _result.newLevel is 2 and $t1_corruptionLevel is 2>>
[[Continue|T1_Lv2_Deepen]]
<<elseif _result and _result.newLevel is 3 and $t1_corruptionLevel is 3>>
[[Continue|T1_Lv3_Deepen]]
<<elseif _result and _result.newLevel is 4 and $t1_corruptionLevel is 4>>
[[Continue|T1_Lv4_Deepen]]
<<elseif _result and _result.newLevel is 5 and $t1_corruptionLevel is 5>>
[[Continue|T1_Lv5_Full]]
<<else>>
[[Continue|Loc_Hub]]
<</if>><<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]]<<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 $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 0>>
<<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]]<<if !$t1_lv1_scenes>><<set $t1_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv1_scenes.a to true>>
<<set $t1_lastLoop to 1>>
<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|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv1_sceneStep to 1>><<goto "T1_JustTalk">><</link>><<if !$t1_lv1_scenes>><<set $t1_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv1_scenes.b to true>>
<<set $t1_lastLoop to 2>>
<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|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv1_sceneStep to 2>><<goto "T1_JustTalk">><</link>><<if !$t1_lv1_scenes>><<set $t1_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv1_scenes.c to true>>
<<set $t1_lastLoop to 3>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv1_sceneStep to 3>><<goto "T1_JustTalk">><</link>><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>><<if !$t1_lv1_seen>><<set $t1_lv1_seen to true>><<goto "T1_Lv1_Active">><</if>>
<<if !$t1_lv1_scenes>><<set $t1_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv1_scenes to {a:!!$t1_lv1_scenes.a,b:!!$t1_lv1_scenes.b,c:!!$t1_lv1_scenes.c}>>
<<if typeof $t1_lv1_sceneStep !== "number">><<set $t1_lv1_sceneStep to ($t1_lv1_scenes.c ? 3 : ($t1_lv1_scenes.b ? 2 : ($t1_lv1_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t1_lv1_sceneStep lte 0>><<goto "T1_Lv1_Loop_A">>
<<elseif $t1_lv1_sceneStep is 1>><<goto "T1_Lv1_Loop_B">>
<<elseif $t1_lv1_sceneStep is 2>><<goto "T1_Lv1_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T1_Lv1_Loop_A">>
<<elseif _loop is 2>><<goto "T1_Lv1_Loop_B">>
<<else>><<goto "T1_Lv1_Loop_C">>
<</if>>
<</if>><<set $t1_lv1_seen to true>>
<<set $t1_lastLoop to 0>>
<<set $t1_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv1_sceneStep to 0>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level 1!</p>
<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]]<<set $ach_t1Conversations++>>
<<set $t1_lv2_seen to true>>
<<set $t1_lastLoop to 0>>
<<set $t1_loopCount++>>
<<set $t1_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv2_sceneStep to 0>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level 2!</p>
<<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 0>>
<<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>
[[Continue|Loc_Hub]]<<if !$t1_lv2_scenes>><<set $t1_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv2_scenes.a to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv2_sceneStep to 1>><<goto "T1_JustTalk">><</link>><<if !$t1_lv2_scenes>><<set $t1_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv2_scenes.b to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv2_sceneStep to 2>><<goto "T1_JustTalk">><</link>><<if !$t1_lv2_scenes>><<set $t1_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv2_scenes.c to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv2_sceneStep to 3>><<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]]<<if !$t1_lv2_seen>><<set $t1_lv2_seen to true>><<goto "T1_Lv2_Deepen">><</if>>
<<if !$t1_lv2_scenes>><<set $t1_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv2_scenes to {a:!!$t1_lv2_scenes.a,b:!!$t1_lv2_scenes.b,c:!!$t1_lv2_scenes.c}>>
<<if typeof $t1_lv2_sceneStep !== "number">><<set $t1_lv2_sceneStep to ($t1_lv2_scenes.c ? 3 : ($t1_lv2_scenes.b ? 2 : ($t1_lv2_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t1_lv2_sceneStep lte 0>><<goto "T1_Lv2_Loop_A">>
<<elseif $t1_lv2_sceneStep is 1>><<goto "T1_Lv2_Loop_B">>
<<elseif $t1_lv2_sceneStep is 2>><<goto "T1_Lv2_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T1_Lv2_Loop_A">>
<<elseif _loop is 2>><<goto "T1_Lv2_Loop_B">>
<<else>><<goto "T1_Lv2_Loop_C">>
<</if>>
<</if>><<set $t1_lv3_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv3_sceneStep to 0>>
/* T1 Level 3 — Mature but not graphic */
<<set $t1_lv3_seen to true>>
<<set $t1_lastLoop to 0>>
<<set $ach_t1Conversations++>>
<<set $t1_loopCount++>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level 3!</p>
<<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 0>>
<<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>>
<<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>
[[Continue|Loc_Hub]]<<if !$t1_lv3_scenes>><<set $t1_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv3_scenes.a to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv3_sceneStep to 1>><<goto "T1_JustTalk">><</link>><<if !$t1_lv3_scenes>><<set $t1_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv3_scenes.b to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv3_sceneStep to 2>><<goto "T1_JustTalk">><</link>><<if !$t1_lv3_scenes>><<set $t1_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv3_scenes.c to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv3_sceneStep to 3>><<goto "T1_JustTalk">><</link>><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]]<<if !$t1_lv3_seen>><<set $t1_lv3_seen to true>><<goto "T1_Lv3_Deepen">><</if>>
<<if !$t1_lv3_scenes>><<set $t1_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv3_scenes to {a:!!$t1_lv3_scenes.a,b:!!$t1_lv3_scenes.b,c:!!$t1_lv3_scenes.c}>>
<<if typeof $t1_lv3_sceneStep !== "number">><<set $t1_lv3_sceneStep to ($t1_lv3_scenes.c ? 3 : ($t1_lv3_scenes.b ? 2 : ($t1_lv3_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t1_lv3_sceneStep lte 0>><<goto "T1_Lv3_Loop_A">>
<<elseif $t1_lv3_sceneStep is 1>><<goto "T1_Lv3_Loop_B">>
<<elseif $t1_lv3_sceneStep is 2>><<goto "T1_Lv3_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T1_Lv3_Loop_A">>
<<elseif _loop is 2>><<goto "T1_Lv3_Loop_B">>
<<else>><<goto "T1_Lv3_Loop_C">>
<</if>>
<</if>><<set $t1_lv4_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv4_sceneStep to 0>>
/* 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 $t1_lv4_seen to true>>
<<set $t1_lastLoop to 0>>
<<set $ach_t1Conversations++>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level 4!</p>
<<set $t1_loopCount++>>
<<set $t1_lastLoop to 0>>
<<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>
[[Continue|Loc_Hub]]
<</if>><<if !$t1_lv4_scenes>><<set $t1_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv4_scenes.a to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv4_sceneStep to 1>><<goto "T1_JustTalk">><</link>><<if !$t1_lv4_scenes>><<set $t1_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv4_scenes.b to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv4_sceneStep to 2>><<goto "T1_JustTalk">><</link>><<if !$t1_lv4_scenes>><<set $t1_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv4_scenes.c to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv4_sceneStep to 3>><<goto "T1_JustTalk">><</link>><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]]<<if !$t1_lv4_seen>><<set $t1_lv4_seen to true>><<goto "T1_Lv4_Deepen">><</if>>
<<if !$t1_lv4_scenes>><<set $t1_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv4_scenes to {a:!!$t1_lv4_scenes.a,b:!!$t1_lv4_scenes.b,c:!!$t1_lv4_scenes.c}>>
<<if typeof $t1_lv4_sceneStep !== "number">><<set $t1_lv4_sceneStep to ($t1_lv4_scenes.c ? 3 : ($t1_lv4_scenes.b ? 2 : ($t1_lv4_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t1_lv4_sceneStep lte 0>><<goto "T1_Lv4_Loop_A">>
<<elseif $t1_lv4_sceneStep is 1>><<goto "T1_Lv4_Loop_B">>
<<elseif $t1_lv4_sceneStep is 2>><<goto "T1_Lv4_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T1_Lv4_Loop_A">>
<<elseif _loop is 2>><<goto "T1_Lv4_Loop_B">>
<<else>><<goto "T1_Lv4_Loop_C">>
<</if>>
<</if>><<set $t1_lv5_scenes to {a:false, b:false, c:false}>>
<<set $t1_lv5_sceneStep to 0>>
/* T1 Level 5 — Full influence, endgame content */
<<set $t1_lv5_seen to true>>
<<set $t1_lastLoop to 0>>
<<set $ach_t1Conversations++>>
<<set $t1_lastLoop to 0>>
<p class="text-green bold"><<= $t1_name>> is now a Node — Level 5!</p>
<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>
[[Continue|Loc_Hub]]
[[🗑️ Delete EchoLink — pursue a real relationship|T1_TrueRoute_Start]]
[[Focus on other targets|Loc_Hub]]<<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 !$t1_lv5_scenes>><<set $t1_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv5_scenes.a to true>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv5_sceneStep to 1>><<goto "T1_JustTalk">><</link>><<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 !$t1_lv5_scenes>><<set $t1_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv5_scenes.b to true>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv5_sceneStep to 2>><<goto "T1_JustTalk">><</link>><<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 !$t1_lv5_scenes>><<set $t1_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv5_scenes.c to true>>
<<if EchoGame.checkRisk()>><<goto "End_1_Exposed">><</if>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T1]]
<<link "Just stay with them">><<set $t1_lv5_sceneStep to 3>><<goto "T1_JustTalk">><</link>><<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]]<<if !$t1_lv5_seen>><<set $t1_lv5_seen to true>><<goto "T1_Lv5_Full">><</if>>
<<if !$t1_lv5_scenes>><<set $t1_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t1_lv5_scenes to {a:!!$t1_lv5_scenes.a,b:!!$t1_lv5_scenes.b,c:!!$t1_lv5_scenes.c}>>
<<if typeof $t1_lv5_sceneStep !== "number">><<set $t1_lv5_sceneStep to ($t1_lv5_scenes.c ? 3 : ($t1_lv5_scenes.b ? 2 : ($t1_lv5_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t1_lv5_sceneStep lte 0>><<goto "T1_Lv5_Loop_A">>
<<elseif $t1_lv5_sceneStep is 1>><<goto "T1_Lv5_Loop_B">>
<<elseif $t1_lv5_sceneStep is 2>><<goto "T1_Lv5_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T1_Lv5_Loop_A">>
<<elseif _loop is 2>><<goto "T1_Lv5_Loop_B">>
<<else>><<goto "T1_Lv5_Loop_C">>
<</if>>
<</if>><<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]]<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]]<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="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]]<<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>
<<if $chapter gte 2 and $reputation lt 15>>
<p class="text-dim small" style="color:var(--red)"><em><<=$t2_name>> hesitates before approaching. "Heard some weird stuff about you lately," <<if $playerGender is "Male">>she<<else>>he<</if>> says carefully. "You doing okay?" The skepticism in <<if $playerGender is "Male">>her<<else>>his<</if>> eyes is new.</em></p>
<<set $t2_trust -= 1>>
<<elseif $chapter gte 2 and $reputation gt 90>>
<p class="text-dim small" style="color:#ffd54f"><em><<=$t2_name>> flags you down before you even reach the weights. "Yo, <<= $playerName>>! Been telling my other clients about you. Everyone wants to know the golden student." <<if $playerGender is "Male">>She<<else>>He<</if>> grins wide.</em></p>
<<set $t2_trust += 1>>
<</if>>
<<=$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]]<<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 _result.success and _result.newLevel gt 0>>
<p class="text-green bold"><<=$t2_name>> is now a Node — Level <<= _result.newLevel>>!</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]]
<<elseif _result.success and _result.newLevel is 2 and $t2_corruptionLevel is 2>>
[[Continue|T2_Lv2_Deepen]]
<<elseif _result.success and _result.newLevel is 3 and $t2_corruptionLevel is 3>>
[[Continue|T2_Lv3_Transition]]
<<elseif _result.success and _result.newLevel is 4 and $t2_corruptionLevel is 4>>
[[Continue|T2_Lv4_Transition]]
<<elseif _result.success and _result.newLevel is 5 and $t2_corruptionLevel is 5>>
[[Continue|T2_Lv5_Full]]
<<else>>
[[Continue|Loc_Hub]]
<</if>><<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]]<<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]]<<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]]<<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]]/* T2 Level 1 loops — competitive/direct tone */
<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<set $t2_lastLoop to 0>>
<<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>>
<<set $t2_trust += 4>>
<<set $t2_lust += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink signal|T2_AttemptInfluence]]
[[Keep it natural|T2_JustTrain]]<<if !$t2_lv1_scenes>><<set $t2_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv1_scenes.a to true>>
<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>
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|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv1_sceneStep to 1>><<goto "T2_JustTrain">><</link>><<if !$t2_lv1_scenes>><<set $t2_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv1_scenes.b to true>>
<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>
"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|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv1_sceneStep to 2>><<goto "T2_JustTrain">><</link>><<if !$t2_lv1_scenes>><<set $t2_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv1_scenes.c to true>>
<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>
<<=$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|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv1_sceneStep to 3>><<goto "T2_JustTrain">><</link>><<if !$t2_lv1_seen>><<set $t2_lv1_seen to true>><<goto "T2_Lv1_Active">><</if>>
<<if !$t2_lv1_scenes>><<set $t2_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv1_scenes to {a:!!$t2_lv1_scenes.a,b:!!$t2_lv1_scenes.b,c:!!$t2_lv1_scenes.c}>>
<<if typeof $t2_lv1_sceneStep !== "number">><<set $t2_lv1_sceneStep to ($t2_lv1_scenes.c ? 3 : ($t2_lv1_scenes.b ? 2 : ($t2_lv1_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t2_lv1_sceneStep lte 0>><<goto "T2_Lv1_Loop_A">>
<<elseif $t2_lv1_sceneStep is 1>><<goto "T2_Lv1_Loop_B">>
<<elseif $t2_lv1_sceneStep is 2>><<goto "T2_Lv1_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T2_Lv1_Loop_A">>
<<elseif _loop is 2>><<goto "T2_Lv1_Loop_B">>
<<else>><<goto "T2_Lv1_Loop_C">>
<</if>>
<</if>><<set $t2_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv1_sceneStep to 0>>
/* Shown once when T2 reaches Level 1 */
<<set $t2_lv1_seen to true>>
<<set $t2_lastLoop to 0>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level 1!</p>
<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]]<<set $t2_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t2_lv2_sceneStep to 0>>
/* T2 Level 2 — Direct/physical tone */
<<set $t2_lv2_seen to true>>
<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<set $t2_lastLoop to 0>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level 2!</p>
<<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>>
<<set $t2_trust += 4>>
<<set $t2_lust += 6>>
<<set $t2_obedience += 3>>
<div class="nav-spacer"></div>
[[Continue|Loc_Hub]]<<if !$t2_lv2_scenes>><<set $t2_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv2_scenes.a to true>>
<<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>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv2_sceneStep to 1>><<goto "T2_JustTrain">><</link>><<if !$t2_lv2_scenes>><<set $t2_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv2_scenes.b to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv2_sceneStep to 2>><<goto "T2_JustTrain">><</link>><<if !$t2_lv2_scenes>><<set $t2_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv2_scenes.c to true>>
<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>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv2_sceneStep to 3>><<goto "T2_JustTrain">><</link>><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]]<<if !$t2_lv2_seen>><<set $t2_lv2_seen to true>><<goto "T2_Lv2_Deepen">><</if>>
<<if !$t2_lv2_scenes>><<set $t2_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv2_scenes to {a:!!$t2_lv2_scenes.a,b:!!$t2_lv2_scenes.b,c:!!$t2_lv2_scenes.c}>>
<<if typeof $t2_lv2_sceneStep !== "number">><<set $t2_lv2_sceneStep to ($t2_lv2_scenes.c ? 3 : ($t2_lv2_scenes.b ? 2 : ($t2_lv2_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t2_lv2_sceneStep lte 0>><<goto "T2_Lv2_Loop_A">>
<<elseif $t2_lv2_sceneStep is 1>><<goto "T2_Lv2_Loop_B">>
<<elseif $t2_lv2_sceneStep is 2>><<goto "T2_Lv2_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T2_Lv2_Loop_A">>
<<elseif _loop is 2>><<goto "T2_Lv2_Loop_B">>
<<else>><<goto "T2_Lv2_Loop_C">>
<</if>>
<</if>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<set $t2_lv3_scenes.d1 to true>>
<div class="passage-image" data-scene="T2 Lv3 deepen — athlete vulnerable, sitting on gym floor, emotional crack">
<<if $playerGender is "Male">><img src="img/t2_lv3_d1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Vulnerable moment"><<else>><img src="img/t2_lv3_d1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Vulnerable moment"><</if>>
</div>
<<=$t2_name>> misses a lift badly — the bar crashes to the safety rails with a sound that echoes through the empty gym. <<if $playerGender is "Male">>She<<else>>He<</if>> sits on the floor, head down, breathing hard. Not from exertion. From something else.
"I don't know what's happening to me," <<=$t2_name>> says quietly. "I used to be so focused. Training was everything. Now I can't concentrate unless you're here. It's like... you're the only thing that makes sense anymore."
<<if $t1_corruptionLevel gte 3 and random(1,3) is 1>>
<p class="text-dim small" style="color:var(--purple)"><em><<=$t2_name>>'s eyes go blank for a split second. "<<= $t1_name>>..." <<if $playerGender is "Male">>she<<else>>he<</if>> whispers — then blinks, confused. "What? I didn't say anything. Why would I—" <<if $playerGender is "Male">>She<<else>>He<</if>> shakes <<if $playerGender is "Male">>her<<else>>his<</if>> head. The signal cross-bled. Your nodes are starting to //talk// to each other.</em></p>
<</if>>
<<if $playerGender is "Male">>She<<else>>He<</if>> looks up at you. The confidence, the bravado, the competitive armor — it's gone. What's underneath is raw and frightened and completely yours.
<<if $contentExplicit>>
<<=$t2_name>> missed the lift badly. The bar clattered to the floor, weights rolling, the sound echoing through the gym like failure. Now <<if $playerGender is "Male">>she<<else>>he<</if>> sits on the floor, head down, hands shaking, the sports figure who never showed weakness reduced to this.
"I don't know what's happening to me," <<=$t2_name>> says, voice raw. "I can't concentrate unless you're here. I can't sleep unless I know you're thinking about me. I can't even lift without wondering if you're watching. Something is wrong with me. I know something is wrong. But I can't stop it. I don't want to stop it."
<<if $playerGender is "Male">>She<<else>>He<</if>> looks up. The confidence is gone. The fierce competitive edge has been replaced by raw, frightened vulnerability. The eyes that used to challenge now plead. "Please. I need— I need you to tell me it's okay. I need you to tell me I'm not crazy. I need you to—"
You cross the space between you. <<=$t2_name>> reaches for you with trembling hands, pulling you down to the gym floor, equipment towering around you like silent witnesses. The emotional crack leads directly to intimate surrender. <<=$t2_name>> clings to you like you're the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> from drowning.
The vulnerability is the turn-on — for you, and horrifyingly, for <<=$t2_name>> as well. The strongest person you know giving up control, giving up pride, giving up the identity that used to define <<if $playerGender is "Male">>her<<else>>him<</if>>. Every touch is a confession. Every kiss is a surrender. The gym floor becomes an al-tar where the competitor sacrifices the last pieces of who <<if $playerGender is "Male">>she<<else>>he<</if>> used to be.
When it's over, <<=$t2_name>> doesn't move. <<if $playerGender is "Male">>She<<else>>He<</if>> just rests against you, breathing hard, eyes closed. "I should be embarrassed," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I should hate that you saw me like this. But I don't. I feel... safe. Like maybe it's okay to not be strong all the time. Like maybe it's okay to need you."
The signal has turned vulnerability into intimacy, and <<=$t2_name>> is too far gone to fight it anymore.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 6>>
<<set $t2_obedience += 5>>
<<set $t2_lust += 3>>
<div class="nav-spacer"></div>
[[📡 Deepen the connection|T2_AttemptInfluence]]
[[Comfort <<=$t2_name>>|T2_JustTrain]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv3 deepen v2 — athlete isolating from friends, choosing player over social life">
<<if $playerGender is "Male">><img src="img/t2_lv3_d2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Isolation"><<else>><img src="img/t2_lv3_d2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Isolation"><</if>>
</div>
You overhear <<=$t2_name>> on the phone outside the gym: "No, I'm not coming tonight. I have plans. No — I said //no//, okay? Stop asking."
<<if $playerGender is "Male">>She<<else>>He<</if>> hangs up and sees you. The irritation melts instantly. "Hey. Sorry about that. Old friends. They don't get it."
//They don't get you,// is what <<if $playerGender is "Male">>she<<else>>he<</if>> means. The social circle is shrinking. Training partners are being ghosted. Study groups abandoned. <<=$t2_name>>'s world is collapsing inward, and you are the center of gravity.
<<set $t2_trust += 5>>
<<set $t2_obedience += 4>>
<div class="nav-spacer"></div>
[[📡 You're all <<=$t2_name>> needs|T2_AttemptInfluence]]
[[Back off — this is getting heavy|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv3_scenes>><<set $t2_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv3_scenes.a to true>>
<<set $t2_lastLoop to 1>>
<div class="passage-image" data-scene="T2 Lv3 — jealousy scene, athlete possessive, grabbing player's arm in public">
<<if $playerGender is "Male">><img src="img/t2_lv3_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy"><<else>><img src="img/t2_lv3_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy"><</if>>
</div>
You're talking to another student near the gym entrance when <<=$t2_name>> appears. <<if $playerGender is "Male">>Her<<else>>His<</if>> expression hardens instantly — a flash of something raw and possessive that <<if $playerGender is "Male">>she<<else>>he<</if>> can't quite control.
"Hey." <<=$t2_name>>'s voice is clipped. <<if $playerGender is "Male">>She<<else>>He<</if>> steps close — too close — and puts a hand on your shoulder. A claim. The other student excuses themselves quickly.
"Who was that?" <<=$t2_name>> asks, trying to sound casual and failing completely.
<<if $contentExplicit>>
You feel <<=$t2_name>>'s fingers dig into your arm like a claim. The gym entrance is still half-full of people flowing past, but <<=$t2_name>> doesn't care. <<if $playerGender is "Male">>She<<else>>He<</if>> pulls you around the corner into the shadow of the vending machines, back against the cinderblock wall, body pressed close enough that you can feel the heat radiating off <<if $playerGender is "Male">>her<<else>>his<</if>> skin.
"Who was that?" The voice is low, rough, but there's something frayed underneath the aggression. Not anger. Fear. <<=$t2_name>>'s free hand flattens against your chest, feeling your heartbeat like <<if $playerGender is "Male">>she<<else>>he<</if>> needs proof you're still here. "Tell me I'm wrong. Tell me you don't need anyone else."
The possessive grip tightens. Other students walk by ten feet away. One of them glances over, sees the intensity, and quickly looks away. The risk of being seen only makes <<=$t2_name>> press closer. <<if $playerGender is "Male">>Her<<else>>His<</if>> thigh slides between yours, muscle flexing, using <<if $playerGender is "Male">>her<<else>>his<</if>> physical dominance to mark territory in the most primal way possible.
You can feel the war inside <<=$t2_name>> — the competitor who used to respect power now reduced to this desperate, trembling need to keep you close. The signal has turned jealousy into dependency, and <<if $playerGender is "Male">>she<<else>>he<</if>> hates how good it feels to surrender to it. <<=$t2_name>>'s breath is hot against your neck. "I can't... I don't want to share you. Not with anyone. Not ever."
The hand on your chest slides lower, fingers curling into your shirt. The touch is rough, but the eyes are pleading. In this moment, the strongest sports figure on campus is begging without words — please don't let me go, please don't make me watch you with someone else, please let me be enough.
You don't answer with words. You answer by letting <<=$t2_name>> pull you deeper into the shadows, where the risk of discovery makes everything sharper, hotter, more necessary. The competitor is still fighting. But the node is winning.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 3>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 2>>
<<set $risk += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv3_sceneStep to 1>><<goto "T2_JustTrain">><</link>>
<<if $tier2Unlocked>>
<div style="border-top:1px solid rgba(155,89,245,0.15);margin-top:16px;padding-top:12px">
[[✦ Extended Scene — Patron Exclusive|T2_Lv3_Loop_A_Extended]]
</div>
<</if>><<set $ach_t2Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Extended jealousy — T2 pulls player into empty hallway, more intense confrontation">
<<if $playerGender is "Male">><img src="img/t2_lv3_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy extended"><<else>><img src="img/t2_lv3_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy extended"><</if>>
</div>
<div style="background:rgba(155,89,245,0.08);border:1px solid rgba(155,89,245,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--purple);text-transform:uppercase">✦ Extended Patron Scene ✦</div>
<<=$t2_name>> doesn't just grab your arm. <<if $playerGender is "Male">>She<<else>>He<</if>> pulls you around the corner, out of sight, back pressed against the wall with you between <<if $playerGender is "Male">>her<<else>>him<</if>> and the rest of the world.
"That person. They were looking at you." <<=$t2_name>>'s breathing is ragged. Not from exertion — from something rawer. "I saw the way they leaned in. The way you //smiled// at them."
You didn't smile at them. You barely noticed them. But the signal has rewritten <<=$t2_name>>'s perception. Every stranger is a threat. Every glance is betrayal.
"Tell me I'm wrong." <<if $playerGender is "Male">>Her<<else>>His<</if>> voice cracks. "Tell me you don't need anyone else. Tell me I'm //enough//."
The strongest athlete on campus. The one who never showed weakness. Begging you for reassurance in a hallway where anyone could walk by.
<<if $playerGender is "Male">>Her<<else>>His<</if>> hands are shaking against your chest. Not from anger anymore. From terror. The kind that lives underneath possessiveness — the fear that the one thing holding <<if $playerGender is "Male">>her<<else>>him<</if>> together will disappear.
<<if $contentExplicit>>
You feel <<=$t2_name>>'s fingers dig into your arm with bruising force, pulling you around the corner into the shadow of the vending machines. The gym entrance is still busy — students flowing past, laughing, talking, living their normal lives while <<=$t2_name>>'s world has narrowed to a single point of desperate focus.
<<if $playerGender is "Male">>She<<else>>He<</if>> pushes you against the cinderblock wall, body pressed close, one hand flat against your chest like <<if $playerGender is "Male">>she<<else>>he<</if>> needs to feel your heartbeat to believe you're real. "Tell me I'm wrong," <<=$t2_name>> says, voice rough with something that's not quite anger. "Tell me you don't need anyone else. Tell me I'm enough. Please. I need to hear it. I need to believe it."
The fear underneath the possessiveness is raw. The competitor who used to respect power, who used to believe in earning respect through performance, is now reduced to this — begging for reassurance in a hallway where anyone could walk by. <<=$t2_name>>'s free hand shakes against your chest. The signal has converted jealousy into dependency, and the conversion hurts. <<if $playerGender is "Male">>She<<else>>He<</if>> hates how much <<if $playerGender is "Male">>she<<else>>he<</if>> needs this. Needs you. Needs to know that you're not going to disappear the moment <<if $playerGender is "Male">>she<<else>>he<</if>> looks away.
You don't answer with words. You answer by pulling <<=$t2_name>> closer, by letting <<if $playerGender is "Male">>her<<else>>him<</if>> feel the solid reality of your presence. <<=$t2_name>> makes a broken sound — half relief, half grief — and presses <<if $playerGender is "Male">>her<<else>>his<</if>> face into your neck. "I used to be someone," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I used to have goals. Ambitions. A future that didn't revolve entirely around one person's attention. Now I can't even remember what those goals were. All I can think about is you. All I want is you. And it terrifies me how okay I am with that."
The physical escalation is inevitable. <<=$t2_name>>'s hands slide under your shirt, desperate to feel skin, to confirm that you're here, that you're real, that you haven't disappeared. The touch is rough, almost frantic, like <<if $playerGender is "Male">>she<<else>>he<</if>>'s trying to memorize every inch of you in case this is the last time. The risk of being seen only makes everything sharper. Someone walks past the hallway entrance. <<=$t2_name>> doesn't stop. <<if $playerGender is "Male">>She<<else>>He<</if>> just pulls you deeper into the shadows, body shielding yours, protecting this moment from the world that used to matter.
When you finally give <<if $playerGender is "Male">>her<<else>>him<</if>> what <<if $playerGender is "Male">>she<<else>>he<</if>> needs — the reassurance of your hands, your mouth, your body claiming <<if $playerGender is "Male">>her<<else>>him<</if>> in return — <<=$t2_name>> comes apart with a sob that's equal parts relief and surrender. The internal war between the competitor <<if $playerGender is "Male">>she<<else>>he<</if>> used to be and the node <<if $playerGender is "Male">>she<<else>>he<</if>>'s becoming is visible in every line of <<if $playerGender is "Male">>her<<else>>his<</if>> body. The competitor is still fighting. But the node is winning. And for the first time, <<=$t2_name>> isn't sure <<if $playerGender is "Male">>she<<else>>he<</if>> wants to win anymore.
Afterward, <<if $playerGender is "Male">>she<<else>>he<</if>> doesn't let go. <<=$t2_name>> stays pressed against you, breathing hard, eyes closed like <<if $playerGender is "Male">>she<<else>>he<</if>> can't bear to look at the hallway and remember that there's a world outside this moment. "I don't know who I am anymore," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "But I know I belong to you. That's enough. That's everything."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 5>>
<<set $t2_lust += 6>>
<<set $t2_obedience += 4>>
<<set $risk += 5>>
<div class="nav-spacer"></div>
[[📡 Push deeper|T2_AttemptInfluence]]
[[Let <<=$t2_name>> breathe|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv3_scenes>><<set $t2_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv3_scenes.b to true>>
<<set $t2_lastLoop to 2>>
<div class="passage-image" data-scene="T2 Lv3 — late night training, empty gym, intense one-on-one, sweat and tension">
<<if $playerGender is "Male">><img src="img/t2_lv3_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late training"><<else>><img src="img/t2_lv3_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late training"><</if>>
</div>
<<=$t2_name>> texted you at 11 PM: //"Gym's empty. Come train."// It wasn't a question.
The gym is dark except for the emergency lighting. <<=$t2_name>> is already mid-set, sweat glistening under the dim fluorescents. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't stop when you walk in — just catches your eye in the mirror and holds it.
"Lock the door," <<if $playerGender is "Male">>she<<else>>he<</if>> says. Not a request.
<<if $contentExplicit>>
The lock clicks behind you with finality. The gym is empty except for the emergency lights casting everything in blood-red. <<=$t2_name>> stands in the center of the weight area, breathing hard from the late-night set, sweat glistening on <<if $playerGender is "Male">>her<<else>>his<</if>> skin like liquid fire.
"Lock the door." It wasn't a request. Now it's done.
<<=$t2_name>> doesn't wait. <<if $playerGender is "Male">>She<<else>>He<</if>> crosses the space between you in three strides, hands grabbing your shirt, pulling you into a kiss that's all teeth and desperation. The equipment becomes furniture — <<if $playerGender is "Male">>she<<else>>he<</if>> pushes you back against a weight bench, straddling your lap with those powerful thighs, using <<if $playerGender is "Male">>her<<else>>his<</if>> sporty body to pin you in place.
But the power dynamic has shifted. The trainer who used to correct your form is now following your lead, waiting for your hands to tell <<if $playerGender is "Male">>her<<else>>him<</if>> where to go, what to do. Every touch is a confession: I used to be in control. Now I'm not. And I don't want to be.
You can feel the moment <<=$t2_name>> stops fighting it. The body that was made to compete now exists to be claimed. <<=$t2_name>>'s hands shake as <<if $playerGender is "Male">>she<<else>>he<</if>> guides you, not with the confidence of a trainer but with the trembling need of someone who's finally found the only thing that matters.
The locked door makes it real. No one is coming. No one can see. This is <<=$t2_name>> choosing to be vulnerable in the one place <<if $playerGender is "Male">>she<<else>>he<</if>> used to feel strongest. The signal has turned the gym from a temple of discipline into a confessional booth, and the prayer is your name.
When it's over, <<=$t2_name>> doesn't move off your lap. <<if $playerGender is "Male">>She<<else>>He<</if>> just rests <<if $playerGender is "Male">>her<<else>>his<</if>> forehead against yours, breathing your air, eyes closed like <<if $playerGender is "Male">>she<<else>>he<</if>> can't bear to look at the empty gym and remember who <<if $playerGender is "Male">>she<<else>>he<</if>> used to be.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 4>>
<<set $t2_lust += 6>>
<<set $t2_obedience += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv3_sceneStep to 2>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv3_scenes>><<set $t2_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv3_scenes.c to true>>
<<set $t2_lastLoop to 3>>
<div class="passage-image" data-scene="T2 Lv3 — public display, athlete showing off for player, campus quad">
<<if $playerGender is "Male">><img src="img/t2_lv3_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Public display"><<else>><img src="img/t2_lv3_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Public display"><</if>>
</div>
<<=$t2_name>> finds you on the quad during lunch. Without warning, <<if $playerGender is "Male">>she<<else>>he<</if>> drops down and starts doing one-arm pushups right there on the grass. Students stop and stare.
"Twelve... thirteen... fourteen..." <<if $playerGender is "Male">>She<<else>>He<</if>> locks eyes with you on every rep. This isn't exercise. It's performance. It's //for you//.
When <<if $playerGender is "Male">>she<<else>>he<</if>> stands, barely breathing hard, <<=$t2_name>> grins. "Impressed?" People are watching. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't care.
<<if $contentExplicit>>
The quad is busy. Students walking between classes, some sitting on the grass, a few throwing a frisbee. <<=$t2_name>> doesn't care. <<=$t2_name>> drops to the grass in front of you and starts doing one-arm pushups like it's a performance meant for an audience of one.
"Impressed?" The voice is loud enough for others to hear. <<if $playerGender is "Male">>She<<else>>He<</if>> wants them to hear. Wants them to see.
Every rep is slower than it needs to be. <<=$t2_name>>'s eyes never leave yours. The sporty body that used to compete for scholarships now competes for your attention. When <<if $playerGender is "Male">>she<<else>>he<</if>> finishes, <<if $playerGender is "Male">>she<<else>>he<</if>> stays on the ground, looking up at you with an expression that's half challenge, half plea.
People are watching. You can feel their eyes. Some are confused. Some are smirking. One person pulls out a phone. <<=$t2_name>> still doesn't care. <<if $playerGender is "Male">>She<<else>>He<</if>> stands, steps close, and grabs your hand, placing it flat against <<if $playerGender is "Male">>her<<else>>his<</if>> chest so you can feel the racing heartbeat.
"That was for you," <<=$t2_name>> says, voice low enough that only you can hear. "Everything I do now is for you."
The performance was foreplay. The real scene happens behind the nearest closed door — an equipment shed, a maintenance hallway, anywhere with a lock. <<=$t2_name>> pulls you there with single-minded urgency, the public display having worked <<if $playerGender is "Male">>her<<else>>him<</if>> up as much as it was meant to work you up.
Inside the small space, the sporty body that just showed off for an audience now surrenders completely. The risk of someone hearing, someone trying the door, only makes <<=$t2_name>> more desperate. The competitor who used to hate losing now loses on purpose, over and over, because losing to you feels like the only victory that matters anymore.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 3>>
<<set $t2_lust += 4>>
<<set $risk += 5>>
<<set $reputation -= 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv3_sceneStep to 3>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv3 — athlete marking territory at campus event, arm around player, daring anyone to say something">
<<if $playerGender is "Male">><img src="img/t2_lv3_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Territorial"><<else>><img src="img/t2_lv3_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Territorial"><</if>>
</div>
<<=$t2_name>> finds you at a campus event and immediately plants <<if $playerGender is "Male">>herself<<else>>himself<</if>> at your side. <<if $playerGender is "Male">>Her<<else>>His<</if>> arm goes around your waist — not subtle, not negotiable. When someone tries to introduce themselves to you, <<=$t2_name>> answers for you.
"<<if $playerGender is "Male">>She's<<else>>He's<</if>> with me," <<=$t2_name>> says. Not a statement. A warning.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 3>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 3>>
<<set $risk += 4>>
<div class="nav-spacer"></div>
[[📡 Push deeper|T2_AttemptInfluence]]
[[Let it go|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv3 — athlete waiting outside player's class, wasn't invited, just showed up">
<<if $playerGender is "Male">><img src="img/t2_lv3_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting"><<else>><img src="img/t2_lv3_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting"><</if>>
</div>
You walk out of your afternoon class and <<=$t2_name>> is leaning against the wall opposite the door. <<if $playerGender is "Male">>She<<else>>He<</if>> wasn't invited. Didn't know your schedule — or did <<if $playerGender is "Male">>she<<else>>he<</if>>?
"Surprise." <<=$t2_name>> grins, but there's something desperate underneath it. "I finished early. Thought we could grab food. Or go back to yours. Or... whatever you want."
//Whatever you want.// From someone who used to never compromise on anything.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 4>>
<<set $t2_lust += 4>>
<<set $t2_obedience += 3>>
<div class="nav-spacer"></div>
[[📡 Activate signal|T2_AttemptInfluence]]
[[Just get food|Loc_Hub]]<<if !$t2_lv3_scenes>><<set $t2_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv3_scenes to {a:!!$t2_lv3_scenes.a,b:!!$t2_lv3_scenes.b,c:!!$t2_lv3_scenes.c}>>
<<if typeof $t2_lv3_sceneStep !== "number">><<set $t2_lv3_sceneStep to ($t2_lv3_scenes.c ? 3 : ($t2_lv3_scenes.b ? 2 : ($t2_lv3_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t2_lv3_sceneStep lte 0>><<goto "T2_Lv3_Loop_A">>
<<elseif $t2_lv3_sceneStep is 1>><<goto "T2_Lv3_Loop_B">>
<<elseif $t2_lv3_sceneStep is 2>><<goto "T2_Lv3_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T2_Lv3_Loop_A">>
<<elseif _loop is 2>><<goto "T2_Lv3_Loop_B">>
<<else>><<goto "T2_Lv3_Loop_C">>
<</if>>
<</if>><<set $t2_lv3_seen to true>>
<<set $t2_lv3_scenes to {a:false, b:false, c:false}>>
<<set $t2_lastLoop to 0>>
<<set $ach_t2Conversations++>>
<<set $t2_lv3_sceneStep to 0>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level 3!</p>
<div class="passage-image" data-scene="T2 personality shift — athlete losing edge, softer eyes, dependent body language">
<<if $playerGender is "Male">><img src="img/t2_lv3_trans_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 transition"><<else>><img src="img/t2_lv3_trans_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 transition"><</if>>
</div>
<h3 class="text-purple text-center mb-8">CORRUPTION LEVEL 3 — DEEP HOOKS</h3>
Something has shifted in <<=$t2_name>>. The competitive fire that defined <<if $playerGender is "Male">>her<<else>>him<</if>> — the sharp jokes, the iron discipline, the refusal to show weakness — it's softening. Melting at the edges.
<<if $playerGender is "Male">>
She still trains hard, but now she watches you between sets with an intensity that has nothing to do with spotting your form. She's started cancelling sessions with other clients to make time for you. Her best friend texted you asking what's going on — "Jess never blows me off like this."
<<else>>
He still lifts heavy, but the swagger is different now. Less performance, more need. He's started texting you at odd hours — 2 AM check-ins disguised as workout tips. His roommate mentioned he's been distracted. "Ryan's not himself lately. You know anything about that?"
<</if>>
The EchoLink app hums with satisfaction. //"Deep hooks established. Target's social behavior is restructuring around Controller. Personality architecture compromised."//
<<set $t2_trust += 5>>
<<set $t2_lust += 8>>
<<set $t2_obedience += 5>>
<<set $gossipActive to true>>
<<set $loc_t2room_unlocked to true>>
<<run EchoUI.notify($t2_name + ' — Level 3: Deep Hooks')>>
[[Continue|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<set $t2_lv4_scenes.d1 to true>>
<div class="passage-image" data-scene="T2 Lv4 deepen — athlete breaking down in player's arms, complete emotional surrender">
<<if $playerGender is "Male">><img src="img/t2_lv4_d1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Emotional breakdown"><<else>><img src="img/t2_lv4_d1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Emotional breakdown"><</if>>
</div>
<<=$t2_name>> shows up at your door with a duffel bag. "My lease is up. I didn't renew it." <<if $playerGender is "Male">>She<<else>>He<</if>> pauses. "I know this is crazy. I know you probably don't want... but I can't be anywhere you're not. I physically can't."
<<if $playerGender is "Male">>Her<<else>>His<</if>> voice breaks on the last word. The strongest person you know — the one who never showed weakness, who built walls out of competitiveness and sarcasm and iron — is standing in your doorway with everything <<if $playerGender is "Male">>she<<else>>he<</if>> owns in a gym bag, begging you to let <<if $playerGender is "Male">>her<<else>>him<</if>> stay.
<<if $contentExplicit>>
The duffel bag hits the floor with a sound like surrender. <<=$t2_name>> stands in your doorway, lease papers unsigned, scholarship at risk, everything <<if $playerGender is "Male">>she<<else>>he<</if>> used to be crumbling around the edges.
"My lease is up," <<=$t2_name>> says, voice breaking on the last word. "I didn't renew it. I can't be anywhere you're not. I tried. I tried to stay away. I tried to remember who I was before you. But I can't. I don't want to. Please. Let me stay. Let me be near you. I'll do anything. I'll be anything. Just don't make me leave."
Letting <<=$t2_name>> inside becomes physical. The threshold is crossed in every sense. The strongest person you know gives up <<if $playerGender is "Male">>her<<else>>his<</if>> last independence through <<if $playerGender is "Male">>her<<else>>his<</if>> body — dropping to knees in the doorway, hands reaching for you, eyes wet with tears that the old competitor would have hated.
You pull <<if $playerGender is "Male">>her<<else>>him<</if>> inside. The duffel bag stays by the door. <<=$t2_name>> doesn't ask what happens next. <<if $playerGender is "Male">>She<<else>>He<</if>> simply offers — body, future, identity, everything. The moving in isn't logistics. It's the final act of submission.
The physical surrender is total. <<=$t2_name>> lets you take <<if $playerGender is "Male">>her<<else>>him<</if>> right there on the floor by the door, like <<if $playerGender is "Male">>she<<else>>he<</if>> can't even wait to reach the bed. Every thrust is a piece of the old life being discarded. Every moan is a piece of the new identity being forged.
When it's over, <<=$t2_name>> doesn't move from where <<if $playerGender is "Male">>she<<else>>he<</if>> collapsed. <<if $playerGender is "Male">>She<<else>>He<</if>> just rests there, eyes half-lidded, a small smile on <<if $playerGender is "Male">>her<<else>>his<</if>> face like <<if $playerGender is "Male">>she<<else>>he<</if>>'s finally home.
"I'm yours now," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "Completely. There's no going back. I don't want to go back. Thank you for letting me stay. Thank you for keeping me. I promise I'll be good. I'll be whatever you need me to be."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 8>>
<<set $t2_obedience += 6>>
<<set $t2_lust += 5>>
<div class="nav-spacer"></div>
[[📡 Let <<=$t2_name>> in|T2_AttemptInfluence]]
[[Turn <<=$t2_name>> away|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv4 deepen v2 — friends confronting player about athlete's behavior change">
<<if $playerGender is "Male">><img src="img/t2_lv4_d2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Confrontation"><<else>><img src="img/t2_lv4_d2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Confrontation"><</if>>
</div>
Three of <<=$t2_name>>'s former training partners corner you outside the café. They're angry, scared, confused.
"What did you do to <<=$t2_name>>? <<if $playerGender is "Male">>She<<else>>He<</if>> was the best athlete on this campus. Now <<if $playerGender is "Male">>she<<else>>he<</if>> can't even make it to morning runs. <<if $playerGender is "Male">>She<<else>>He<</if>> //quit the team//. Whatever you're doing to <<if $playerGender is "Male">>her<<else>>him<</if>>, stop."
You say nothing. Your phone vibrates in your pocket — EchoLink cataloguing three new potential targets. The irony would be funny if it weren't so dark.
<<set $risk += 5>>
<<set $reputation -= 3>>
<<set $stress += 3>>
<div class="nav-spacer"></div>
[[Deflect and leave|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv4_scenes>><<set $t2_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv4_scenes.a to true>>
<<set $t2_lastLoop to 1>>
<div class="passage-image" data-scene="T2 Lv4 — athlete skipping practice for player, empty training room, desperate eyes">
<<if $playerGender is "Male">><img src="img/t2_lv4_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Skipping practice"><<else>><img src="img/t2_lv4_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Skipping practice"><</if>>
</div>
<<=$t2_name>> was supposed to be at practice. Instead, <<if $playerGender is "Male">>she's<<else>>he's<</if>> outside your door at 7 AM, still in yesterday's clothes. "I couldn't sleep. I kept thinking about you. Can I just... be near you for a while?"
<<if $playerGender is "Male">>Her<<else>>His<</if>> coach called three times. <<=$t2_name>> sent each one to voicemail without looking.
<<if $contentExplicit>>
It's 7:07 AM. <<=$t2_name>> is still in yesterday's clothes — rumpled, slept-in, the sporty wear that used to be armor now just fabric hanging off a body that's forgotten how to rest. The duffel bag at <<if $playerGender is "Male">>her<<else>>his<</if>> feet contains everything <<if $playerGender is "Male">>she<<else>>he<</if>> owns that matters.
"Can I just be near you?" The voice cracks on the last word. Coach has called three times. Voicemail after voicemail. <<=$t2_name>> hasn't listened to any of them.
You let <<if $playerGender is "Male">>her<<else>>him<</if>> inside. The duffel bag stays by the door like a surrender flag. <<=$t2_name>> doesn't ask what happens next. <<if $playerGender is "Male">>She<<else>>He<</if>> just stands there, eyes red from lack of sleep, waiting for you to decide what <<if $playerGender is "Male">>she<<else>>he<</if>>'s allowed to be.
The sporty body that used to be a weapon is now an offering. <<=$t2_name>> lets you undress <<if $playerGender is "Male">>her<<else>>him<</if>> like <<if $playerGender is "Male">>she<<else>>he<</if>>'s forgotten how to do it <<if $playerGender is "Male">>herself<<else>>himself<</if>>. Every piece of clothing that hits the floor is another piece of the old identity being discarded. The competitor who rebuil-t after an ACL tear now rebuilds around you.
This isn't sex. It's survival. <<=$t2_name>> clings to you like you're the only solid thing in a world that's dissolving. <<if $playerGender is "Male">>Her<<else>>His<</if>> hands shake. <<if $playerGender is "Male">>Her<<else>>His<</if>> breathing hitches. When <<if $playerGender is "Male">>she<<else>>he<</if>> comes, it's with a broken sound that's equal parts relief and grief — grief for the person who used to have a future that didn't revolve entirely around one person's attention.
Afterward, <<=$t2_name>> doesn't let go. <<if $playerGender is "Male">>She<<else>>He<</if>> stays wrapped around you, face buried in your neck, whispering "thank you" like a prayer. The duffel bag by the door waits. The phone on the floor keeps vibrating. None of it matters anymore.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 4>>
<<set $t2_lust += 6>>
<<set $t2_obedience += 4>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv4_sceneStep to 1>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv4_scenes>><<set $t2_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv4_scenes.b to true>>
<<set $t2_lastLoop to 2>>
<div class="passage-image" data-scene="T2 Lv4 — moment of clarity, athlete staring in mirror confused, brief resistance">
<<if $playerGender is "Male">><img src="img/t2_lv4_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Clarity flash"><<else>><img src="img/t2_lv4_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Clarity flash"><</if>>
</div>
You find <<=$t2_name>> in the gym bathroom, staring at <<if $playerGender is "Male">>her<<else>>his<</if>> reflection with an expression you've never seen before. Confusion. Fear.
"<<= $playerName>>... do you ever feel like something is //wrong//?" <<if $playerGender is "Male">>She<<else>>He<</if>> grips the sink. "I used to know exactly who I was. Now I look in the mirror and I don't... I can't..."
The moment passes. The signal reasserts itself. <<=$t2_name>>'s eyes go soft again, and <<if $playerGender is "Male">>she<<else>>he<</if>> turns to you with that familiar, hungry devotion. "Never mind. Forget I said anything. You're here. That's all that matters."
<<if $contentExplicit>>
The gym bathroom is empty. <<=$t2_name>> stands at the sink, both hands gripping the porcelain like it's the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> upright. The mirror shows a face <<=$t2_name>> barely recognizes anymore.
"I had a routine," <<if $playerGender is "Male">>she<<else>>he<</if>> says to the reflection. "5 AM runs. Protein at 6. Training by 7. Now the first thing I think about when I open my eyes is you. Before I even know I'm awake, I'm reaching for my phone to see if you've texted."
The moment of clarity is brief but brutal. <<=$t2_name>>'s eyes widen slightly, like <<if $playerGender is "Male">>she<<else>>he<</if>>'s seeing the full scope of what's been done to <<if $playerGender is "Male">>her<<else>>him<</if>>. "Something is wrong with me. I know something is wrong. I should—"
The signal reasserts like a hand closing around the throat of that thought. <<=$t2_name>>'s expression softens. The fear drains away. "Never mind. I'm fine. You're here. That's all that matters."
<<if $playerGender is "Male">>She<<else>>He<</if>> turns away from the mirror — away from the last witness to who <<if $playerGender is "Male">>she<<else>>he<</if>> used to be — and reaches for you with desperate hands. The body remembers what the mind is trying to forget. Muscle memory of need overrides the fading spark of self-preservation.
You let <<=$t2_name>> pull you into the stall, the door locking behind you. <<=$t2_name>> doesn't look at the mirror again. <<if $playerGender is "Male">>She<<else>>He<</if>> keeps <<if $playerGender is "Male">>her<<else>>his<</if>> eyes on you like you're the only real thing left. The physical reassurance is frantic, grateful, almost worshipful. Every touch says: thank you for being here, thank you for letting me forget, thank you for making the confusion go away.
When it's over, <<=$t2_name>> rests <<if $playerGender is "Male">>her<<else>>his<</if>> head on your shoulder, breathing hard. The mirror is still there. The reflection watches. But <<=$t2_name>> never looks back.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 3>>
<<set $stress += 3>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv4_sceneStep to 2>><<goto "T2_JustTrain">><</link>>
<<if $tier2Unlocked>>
<div style="border-top:1px solid rgba(155,89,245,0.15);margin-top:16px;padding-top:12px">
[[✦ Extended Scene — Patron Exclusive|T2_Lv4_Loop_B_Extended]]
</div>
<</if>><<set $ach_t2Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Extended mirror scene — athlete staring at reflection, identity fracture visible">
<<if $playerGender is "Male">><img src="img/t2_lv4_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Mirror extended"><<else>><img src="img/t2_lv4_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Mirror extended"><</if>>
</div>
<div style="background:rgba(155,89,245,0.08);border:1px solid rgba(155,89,245,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--purple);text-transform:uppercase">✦ Extended Patron Scene ✦</div>
The gym bathroom smells like chlorine and sweat. <<=$t2_name>> is standing at the sink, both hands on the porcelain, staring into the mirror like it's a window into someone else's life.
"I had a routine," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "5 AM runs. Meal prep Sundays. Three training sessions before noon. I //knew// who I was."
<<if $playerGender is "Male">>She<<else>>He<</if>> leans closer to the glass. Searching.
"Now I wake up and the first thing I think about is you. Not training. Not nutrition. Not my scholarship. //You//. Before I even open my eyes, your name is already in my head. Like... like it was put there."
The clarity flickers. For one horrible second, <<=$t2_name>>'s eyes go sharp. Aware. The old competitor surfaces — the person who would never have begged, never have needed, never have crumbled.
"Something is wrong with me, <<= $playerName>>." The words come out small. "I know something is wrong with me. I can //feel// it. But when I try to grab it, try to understand what changed... it slips away. And all I want is you again."
The moment passes. The signal reasserts itself like water filling a crack. <<=$t2_name>>'s eyes go soft. The competitor sinks back under.
"Never mind. I'm fine. You're here. That's all that matters."
<<if $playerGender is "Male">>She<<else>>He<</if>> turns away from the mirror. Toward you. The reflection watches from the glass — the last witness to the person <<=$t2_name>> used to be.
<<if $contentExplicit>>
The gym bathroom is empty except for the harsh fluorescent hum. <<=$t2_name>> stands at the sink, both hands gripping the porcelain, staring at a reflection that looks less familiar every day. The moment of clarity is the longest it's been yet — and the most brutal.
"I had a routine," <<=$t2_name>> says to the mirror, voice hollow. "5 AM runs. Protein shake at 6. Training by 7. I used to wake up excited about pushing my limits. Now the first thing I think about when I open my eyes is you. Before I even know I'm awake, I'm reaching for my phone to see if you've texted. If you haven't, I can't focus. I can't eat. I can't do anything until I know you're thinking about me."
<<if $playerGender is "Male">>She<<else>>He<</if>> grips the sink harder. The knuckles go white. "Something is wrong with me. I know something is wrong. I should be terrified. I should be fighting this. I should be reporting this to someone — a coach, a counselor, anyone who can help me remember who I used to be. But I don't want to remember. I want to forget. I want to disappear into whatever this is. And that terrifies me more than anything."
The signal reasserts like a hand closing around the throat of that thought. You watch it happen in real time. <<=$t2_name>>'s expression shifts — the fear drains away, replaced by something soft and desperate and grateful. "Never mind," <<if $playerGender is "Male">>she<<else>>he<</if>> says, turning away from the mirror. "I'm fine. You're here. That's all that matters."
But the reflection lingers. For a moment, you see both versions of <<=$t2_name>> at once — the fading competitor staring out from the glass with confused, frightened eyes, and the node standing in front of you with soft, adoring eyes that only see you. The mirror becomes a metaphor for the last witness to who <<if $playerGender is "Male">>she<<else>>he<</if>> used to be. The reflection watches what <<if $playerGender is "Male">>she<<else>>he<</if>>'s becoming. And <<=$t2_name>> never looks back.
<<if $playerGender is "Male">>She<<else>>He<</if>> reaches for you with desperate hands, pulling you into the stall, the door locking behind you with a sound like a decision being made. The physical reassurance is frantic, grateful, almost worshipful. <<=$t2_name>> touches you like you're the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> from drowning in the confusion. Every kiss is a thank you. Every touch is a prayer. "Thank you for being here," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers between breaths. "Thank you for letting me forget. Thank you for making the noise stop. I don't know what I'd do if you weren't here. I don't know who I'd be."
When it's over, <<=$t2_name>> rests <<if $playerGender is "Male">>her<<else>>his<</if>> head on your shoulder, breathing hard, eyes closed. The mirror is still there. The reflection still watches. But <<=$t2_name>> keeps <<if $playerGender is "Male">>her<<else>>his<</if>> face turned away, focused entirely on you. "I don't want to look at myself anymore," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I only want to look at you. You're the only thing that makes sense. You're the only thing that's real."
The identity fracture is complete. The competitor is still in there somewhere, buried deep, but the node has taken over. And <<=$t2_name>> is grateful for it.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 6>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 5>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 The signal knows best|T2_AttemptInfluence]]
[[Leave <<=$t2_name>> alone|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv4_scenes>><<set $t2_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv4_scenes.c to true>>
<<set $t2_lastLoop to 3>>
<div class="passage-image" data-scene="T2 Lv4 — grades slipping scene, failed test, athlete doesn't care, eyes only on player">
<<if $playerGender is "Male">><img src="img/t2_lv4_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Grades slipping"><<else>><img src="img/t2_lv4_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Grades slipping"><</if>>
</div>
<<=$t2_name>> shows you a test result. A D-minus. <<if $playerGender is "Male">>She<<else>>He<</if>> used to pull straight B-pluses on autopilot.
"Coach says one more failed class and I lose my scholarship." <<=$t2_name>> crumples the paper. "But honestly? I don't care. The only thing I care about is—"
<<if $playerGender is "Male">>She<<else>>He<</if>> stops. Looks at you. The sentence doesn't need finishing.
<<if $contentExplicit>>
The crumpled test paper hits the floor between you. D-minus. Scholarship-threatening. Life-changing. <<=$t2_name>> doesn't even look at it.
"The only thing I care about is—" <<=$t2_name>> doesn't finish the sentence. Doesn't need to. The sentence ends with you.
<<if $playerGender is "Male">>She<<else>>He<</if>> sinks to <<if $playerGender is "Male">>her<<else>>his<</if>> knees right there in the middle of the dorm hallway, not caring who might walk by. The academic ruin is accepted with something that looks like relief. The competitor who used to fight for every point now fights for something else entirely.
You pull <<=$t2_name>> into your room. The door closes. The test paper stays on the floor outside like evidence of a crime no one will report. Inside, <<=$t2_name>> undresses with the mechanical efficiency of someone who's done this before — but the eyes are different. Empty where ambition used to live. Full where you are.
The physical submission is total. <<=$t2_name>> offers <<if $playerGender is "Male">>her<<else>>his<</if>> body like it's the last thing <<if $playerGender is "Male">>she<<else>>he<</if>> has to give, and the only thing worth giving. Every position, every act, is performed with the focused intensity that used to be reserved for training and competition. Now it's reserved for you.
When <<if $playerGender is "Male">>she<<else>>he<</if>> comes, it's with tears on <<if $playerGender is "Male">>her<<else>>his<</if>> face — not from pain, but from the overwhelming relief of having chosen. The scholarship might be gone. The future might be gone. But this moment, this connection, this surrender — it's real. It's chosen. It's enough.
Afterward, <<=$t2_name>> picks up the crumpled test paper, looks at it once, and throws it in the trash without a second glance. "I have everything I need," <<if $playerGender is "Male">>she<<else>>he<</if>> says, and means it.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 5>>
<<set $t2_lust += 4>>
<<set $t2_obedience += 5>>
<<set $risk += 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv4_sceneStep to 3>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv4 — athlete deleted all social media, only contact left is player, showing empty phone">
<<if $playerGender is "Male">><img src="img/t2_lv4_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Isolation complete"><<else>><img src="img/t2_lv4_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Isolation complete"><</if>>
</div>
<<=$t2_name>> shows you <<if $playerGender is "Male">>her<<else>>his<</if>> phone. The contacts list has one entry. Yours. Everything else — deleted. Social media — gone. Group chats — left.
"I don't need them," <<=$t2_name>> says, voice steady but eyes wide. "I don't need anyone except you. This is cleaner. Simpler. Right?"
<<if $playerGender is "Male">>She<<else>>He<</if>> needs you to say yes. Needs it like oxygen.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 4>>
<<set $t2_lust += 5>>
<<set $t2_obedience += 5>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 Reinforce|T2_AttemptInfluence]]
[[Step back|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv4 — athlete's former coach confronts player in parking lot, athlete sides with player against coach">
<<if $playerGender is "Male">><img src="img/t2_lv4_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Choosing sides"><<else>><img src="img/t2_lv4_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Choosing sides"><</if>>
</div>
<<=$t2_name>>'s former coach approaches you both outside the gym. Angry. Concerned. "<<=$t2_name>>, you're throwing away everything we built. Your career. Your scholarship. For //this//?"
<<=$t2_name>> steps between you and the coach. "Don't talk to <<if $playerGender is "Male">>her<<else>>him<</if>> like that." <<if $playerGender is "Male">>Her<<else>>His<</if>> voice is cold. Unrecognizable. The coach stares — this is not the athlete <<if $playerGender is "Male">>she<<else>>he<</if>> trained for years.
"We're done here," <<=$t2_name>> says, and walks away with you without looking back.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 5>>
<<set $t2_lust += 4>>
<<set $t2_obedience += 5>>
<<set $risk += 4>>
<<set $reputation -= 2>>
<div class="nav-spacer"></div>
[[📡 Seal it|T2_AttemptInfluence]]
[[Cool down|Loc_Hub]]<<if !$t2_lv4_scenes>><<set $t2_lv4_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv4_scenes to {a:!!$t2_lv4_scenes.a,b:!!$t2_lv4_scenes.b,c:!!$t2_lv4_scenes.c}>>
<<if typeof $t2_lv4_sceneStep !== "number">><<set $t2_lv4_sceneStep to ($t2_lv4_scenes.c ? 3 : ($t2_lv4_scenes.b ? 2 : ($t2_lv4_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t2_lv4_sceneStep lte 0>><<goto "T2_Lv4_Loop_A">>
<<elseif $t2_lv4_sceneStep is 1>><<goto "T2_Lv4_Loop_B">>
<<elseif $t2_lv4_sceneStep is 2>><<goto "T2_Lv4_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T2_Lv4_Loop_A">>
<<elseif _loop is 2>><<goto "T2_Lv4_Loop_B">>
<<else>><<goto "T2_Lv4_Loop_C">>
<</if>>
<</if>><<set $t2_lv4_seen to true>>
<<set $t2_lv4_scenes to {a:false, b:false, c:false}>>
<<set $t2_lastLoop to 0>>
<<set $ach_t2Conversations++>>
<<set $t2_lv4_sceneStep to 0>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level 4!</p>
<div class="passage-image" data-scene="T2 near-total — athlete broken routine, skipping practice, waiting for player">
<<if $playerGender is "Male">><img src="img/t2_lv4_trans_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 transition"><<else>><img src="img/t2_lv4_trans_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 4 transition"><</if>>
</div>
<h3 class="text-purple text-center mb-8">CORRUPTION LEVEL 4 — NEAR-TOTAL INFLUENCE</h3>
<<=$t2_name>>'s life is unraveling, and <<if $playerGender is "Male">>she<<else>>he<</if>> doesn't even see it.
<<if $playerGender is "Male">>
She's stopped training other clients entirely. Her competition stats have tanked — she missed two meets last month without explanation. Her roommate moved out after a fight nobody will talk about. The fire that used to burn for athletics now burns exclusively for you.
When she sees you, her whole body language changes — shoulders dropping, eyes going soft, that hard competitive shell cracking open like an egg. She's not Jess the athlete anymore. She's Jess who waits for you.
<<else>>
He hasn't been to class in a week. His scholarship review is coming up and he hasn't logged a single qualifying time. His training partners have stopped calling. The whiteboard in his apartment — the one that used to track his splits in obsessive detail — now just has your name on it. Written over and over.
When you walk into a room, he stands up. Not out of respect. Out of reflex. His body knows before his brain does — you are what matters now.
<</if>>
EchoLink: //"Target identity architecture at 15% integrity. Original personality suppressed. Controller dependency: critical."//
<<set $t2_trust += 8>>
<<set $t2_lust += 10>>
<<set $t2_obedience += 8>>
<<run EchoUI.notify($t2_name + ' — Level 4: Near-Total Influence')>>
[[Continue|Loc_Hub]]<<set $t2_lv5_seen to true>>
<<set $t2_lv5_scenes to {a:false, b:false, c:false}>>
<<set $t2_lastLoop to 0>>
<<set $ach_t2Conversations++>>
<<set $t2_lv5_sceneStep to 0>>
<p class="text-green bold"><<= $t2_name>> is now a Node — Level 5!</p>
<div class="passage-image" data-scene="T2 full control — athlete completely devoted, original personality gone, worship">
<<if $playerGender is "Male">><img src="img/t2_lv5_full_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Full control"><<else>><img src="img/t2_lv5_full_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Full control"><</if>>
</div>
<h3 class="text-purple text-center mb-8">CORRUPTION LEVEL 5 — FULL CONTROL</h3>
<<=$t2_name>> doesn't train anymore. Doesn't compete. Doesn't call <<if $playerGender is "Male">>her<<else>>his<</if>> old friends or check <<if $playerGender is "Male">>her<<else>>his<</if>> grades or look in mirrors.
<<if $playerGender is "Male">>
Jess — the fierce, competitive powerhouse who could outlift half the men's team — sits cross-legged on your floor, waiting for you to come home. She doesn't eat until you tell her to. Doesn't speak unless you ask. The muscles she built over years of discipline now exist solely for your approval.
When you walk through the door, her face transforms. Pure, uncomplicated devotion. She is yours. Completely, irreversibly, devastatingly yours.
<<else>>
Ryan — the cocky, unbreakable athlete who never backed down from anything — kneels on your floor when you come home. His meal prep sits untouched until you say the word. The body he sculpted through years of iron discipline now waits for your command.
When you enter the room, his eyes track you like a compass finding north. The man he was is buried. What remains is entirely, catastrophically yours.
<</if>>
EchoLink: //"Target 2 — Full control achieved. Neural architecture rewritten. Original personality archived. Controller bond: permanent."//
<<set $t2_trust to 100>>
<<set $t2_obedience to 100>>
<<set $t2_lust to 100>>
<<run EchoUI.notify($t2_name + ' — Level 5: FULL CONTROL', '#9b59f5')>>
[[Continue|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv5_scenes>><<set $t2_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv5_scenes.a to true>>
<<set $t2_lastLoop to 1>>
<div class="passage-image" data-scene="T2 Lv5 — fully controlled athlete serving player, domestic, complete submission">
<<if $playerGender is "Male">><img src="img/t2_lv5_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Devotion"><<else>><img src="img/t2_lv5_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Devotion"><</if>>
</div>
<<=$t2_name>> has breakfast waiting when you wake up. Perfect macros, perfect portions. <<if $playerGender is "Male">>She<<else>>He<</if>> stands by the counter, watching you eat with an expression of pure contentment.
"Is it good? I can make something else. I want it to be perfect for you." <<if $playerGender is "Male">>Her<<else>>His<</if>> voice is soft. Eager. The competitive edge — the sarcasm, the challenge — it's gone. Replaced by something terrifyingly simple: the need to please.
<<if $contentExplicit>>
The breakfast is perfect. Eggs cooked exactly how you like them. Coffee at the right temperature. Toast with the precise amount of butter. <<=$t2_name>> stands by the counter watching you eat, eyes soft with pure devotion.
"Is it good?" The voice is eager, almost childlike in its need for approval. "I want it to be perfect for you."
The competitor who never served anyone now exists only to serve. <<=$t2_name>> has arranged <<if $playerGender is "Male">>her<<else>>his<</if>> entire morning around this moment — waking early, shopping for ingredients, timing everything so it's ready when you wake. The sporty body that used to train for hours now trains for your pleasure.
You don't have to ask. <<=$t2_name>> anticipates. When you reach for more coffee, it's already being poured. When you finish eating, the plate is cleared before you can stand. Every action is performed with the focused intensity that used to win games, now redirected entirely toward you.
The domestic devotion becomes physical in the bedroom. <<=$t2_name>> undresses you like it's a privilege, touches you like it's a prayer. The body that was once a fortress is now a temple made for your worship. Every position is an offering. Every sound is a hymn.
There is no resistance. No negotiation. No self. Just the player's will, expressed through a vessel that has forgotten it ever wanted anything else. When you finish, <<=$t2_name>> doesn't seek <<if $playerGender is "Male">>her<<else>>his<</if>> own release unless you allow it. <<if $playerGender is "Male">>She<<else>>He<</if>> simply waits, eyes adoring, ready for whatever comes next.
The breakfast was the appetizer. This is the meal. And <<=$t2_name>> is content to be consumed.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_lust += 4>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv5_sceneStep to 1>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv5_scenes>><<set $t2_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv5_scenes.b to true>>
<<set $t2_lastLoop to 2>>
<div class="passage-image" data-scene="T2 Lv5 — athlete encountering old friend, doesn't recognize them, only sees player">
<<if $playerGender is "Male">><img src="img/t2_lv5_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="No recognition"><<else>><img src="img/t2_lv5_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="No recognition"><</if>>
</div>
You're walking across campus with <<=$t2_name>> when a former training partner tries to talk to <<if $playerGender is "Male">>her<<else>>him<</if>>.
"<<=$t2_name>>? It's me. We trained together for three years."
<<=$t2_name>> looks at them blankly. No recognition. No warmth. Then <<if $playerGender is "Male">>she<<else>>he<</if>> turns to you: "Do you know this person?" The former friend's face crumbles.
<<if $contentExplicit>>
The old training partner tries to talk to <<=$t2_name>> on the quad. Calls <<if $playerGender is "Male">>her<<else>>his<</if>> name. Waves. Tries to jog over. <<=$t2_name>> looks through them like they're a ghost.
"Do you know this person?" <<=$t2_name>> asks you, voice flat, genuinely confused. The friend stops short, hurt flashing across their face before they turn and walk away.
The moment the friend is gone, <<=$t2_name>> turns to you with sudden urgency. <<if $playerGender is "Male">>She<<else>>He<</if>> grabs your hands, eyes wide with something that looks like panic. "Are you angry? Did I do something wrong? I didn't mean to— I just— you're here. You're the only one that matters."
The physical validation is immediate and complete. <<=$t2_name>> pulls you behind the nearest building, drops to <<if $playerGender is "Male">>her<<else>>his<</if>> knees, and shows you with hands and mouth and body exactly how much you matter. Every touch is a plea: don't be angry, don't leave, don't make me remember who I was before you.
The enthusiasm is almost frantic. <<=$t2_name>> performs like <<if $playerGender is "Male">>she<<else>>he<</if>>'s trying to erase the memory of that friend, erase the confusion, erase everything that isn't you. When you finally give <<if $playerGender is "Male">>her<<else>>him<</if>> what <<if $playerGender is "Male">>she<<else>>he<</if>> needs — the reassurance of your release, the proof that you're still here, still wanting <<if $playerGender is "Male">>her<<else>>him<</if>> — <<=$t2_name>> collapses against you with a sob of relief.
"Thank you," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your skin. "Thank you for still wanting me. I don't know what I'd do if you didn't."
The old friend is already forgotten. The only thing that exists is you.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_obedience += 2>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv5_sceneStep to 2>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t2_lv5_scenes>><<set $t2_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv5_scenes.c to true>>
<<set $t2_lastLoop to 3>>
<div class="passage-image" data-scene="T2 Lv5 — athlete in player's room, waiting, complete stillness, worship">
<<if $playerGender is "Male">><img src="img/t2_lv5_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting"><<else>><img src="img/t2_lv5_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Waiting"><</if>>
</div>
You come home late. <<=$t2_name>> is sitting exactly where you left <<if $playerGender is "Male">>her<<else>>him<</if>> — on the edge of your bed, hands folded, posture perfect. <<if $playerGender is "Male">>She<<else>>He<</if>> hasn't moved in three hours. The only sign of life is the way <<if $playerGender is "Male">>her<<else>>his<</if>> eyes track you the moment the door opens.
"You're home." Two words. The relief in them is bottomless.
<<if $contentExplicit>>
You come home three hours late. <<=$t2_name>> hasn't moved from the spot by the door where <<if $playerGender is "Male">>she<<else>>he<</if>> was when you left. Cross-legged on the floor, hands folded, perfect posture, empty eyes fixed on the door like a compass needle that only points to you.
"You're home." The relief in <<=$t2_name>>'s voice is bottomless. Three hours of stillness explodes into movement the moment you cross the threshold. <<if $playerGender is "Male">>She<<else>>He<</if>> crawls to you on hands and knees, not standing, not walking — crawling, like the distance between the door and your body is too far to cover any other way.
The waiting was the foreplay. The relief is physical. <<=$t2_name>> presses against you like <<if $playerGender is "Male">>she<<else>>he<</if>>'s trying to merge, hands already working at your clothes with desperate efficiency. "I missed you. I missed you so much. I was good. I didn't move. I waited exactly where you left me."
The surrender is absolute. <<=$t2_name>> doesn't ask for anything. <<if $playerGender is "Male">>She<<else>>He<</if>> simply offers — body, attention, devotion, everything. Every position is an act of worship. Every sound is gratitude. When you finally take what <<if $playerGender is "Male">>she<<else>>he<</if>>'s offering, <<=$t2_name>> comes apart with a broken moan that sounds like prayer.
Afterward, <<if $playerGender is "Male">>she<<else>>he<</if>> doesn't move from where <<if $playerGender is "Male">>she<<else>>he<</if>> collapsed. <<=$t2_name>> just rests there, eyes half-lidded, a small smile on <<if $playerGender is "Male">>her<<else>>his<</if>> face like <<if $playerGender is "Male">>she<<else>>he<</if>>'s exactly where <<if $playerGender is "Male">>she<<else>>he<</if>> belongs.
"I can wait again," <<if $playerGender is "Male">>she<<else>>he<</if>> says softly. "As long as you need. I'll always be here when you come home."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_lust += 5>>
<div class="nav-spacer"></div>
[[📡 Activate EchoLink|EchoStep_T2]]
<<link "Keep training together">><<set $t2_lv5_sceneStep to 3>><<goto "T2_JustTrain">><</link>><<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv5 — fully controlled athlete mimicking player's habits, dressing like player, identity merged">
<<if $playerGender is "Male">><img src="img/t2_lv5_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Identity merged"><<else>><img src="img/t2_lv5_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Identity merged"><</if>>
</div>
<<=$t2_name>> has started dressing like you. Same style. Same colors. <<if $playerGender is "Male">>She<<else>>He<</if>>'s adopted your speech patterns, your favorite phrases, even the way you hold your phone. The athlete who had the strongest sense of self on campus is now a mirror.
"Do you like it?" <<=$t2_name>> asks, turning slowly. "I want to be everything you want me to be."
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_lust += 4>>
<<set $stress += 3>>
<div class="nav-spacer"></div>
[[Continue|Loc_Hub]]<<set $ach_t2Conversations++>>
<<set $t2_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T2 Lv5 — athlete asleep on floor next to player's bed, refused the bed, chose the floor to be closer">
<<if $playerGender is "Male">><img src="img/t2_lv5_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Floor"><<else>><img src="img/t2_lv5_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Floor"><</if>>
</div>
You wake up at 3 AM. <<=$t2_name>> is asleep on the floor next to your bed. Not because there's no room. Because <<if $playerGender is "Male">>she<<else>>he<</if>> said the bed was "yours" and <<if $playerGender is "Male">>she<<else>>he<</if>> didn't want to take up space unless you told <<if $playerGender is "Male">>her<<else>>him<</if>> to.
The strongest body on campus, curled up on cold hardwood. Waiting for permission to exist in your space.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t2_trust += 2>>
<<set $t2_lust += 5>>
<div class="nav-spacer"></div>
[[Continue|Loc_Hub]]<<if !$t2_lv5_scenes>><<set $t2_lv5_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t2_lv5_scenes to {a:!!$t2_lv5_scenes.a,b:!!$t2_lv5_scenes.b,c:!!$t2_lv5_scenes.c}>>
<<if typeof $t2_lv5_sceneStep !== "number">><<set $t2_lv5_sceneStep to ($t2_lv5_scenes.c ? 3 : ($t2_lv5_scenes.b ? 2 : ($t2_lv5_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t2_lv5_sceneStep lte 0>><<goto "T2_Lv5_Loop_A">>
<<elseif $t2_lv5_sceneStep is 1>><<goto "T2_Lv5_Loop_B">>
<<elseif $t2_lv5_sceneStep is 2>><<goto "T2_Lv5_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T2_Lv5_Loop_A">>
<<elseif _loop is 2>><<goto "T2_Lv5_Loop_B">>
<<else>><<goto "T2_Lv5_Loop_C">>
<</if>>
<</if>><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]]<<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]]<<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]]<<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>
<<if $chapter gte 2 and $reputation lt 15>>
<p class="text-dim small" style="color:var(--red)"><em><<=$t3_name>> glances at you with a measured look. "<<= $playerName>>. I've been hearing some... concerning things from colleagues. Is everything alright?" The professional distance feels wider than usual.</em></p>
<<set $t3_trust -= 2>>
<<elseif $chapter gte 2 and $reputation gt 90>>
<p class="text-dim small" style="color:#ffd54f"><em>"Ah, <<= $playerName>>." <<=$t3_name>> actually smiles — warm, almost familiar. "Several faculty members have mentioned your name. All positive. It's rare for a student to make that kind of impression." <<if $playerGender is "Male">>She<<else>>He<</if>> seems genuinely pleased to see you.</em></p>
<<set $t3_trust += 2>>
<</if>>
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]]<<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 _result.success and _result.newLevel gt 0>>
<p class="text-green bold"><<=$t3_name>> is now a Node — Level <<= _result.newLevel>>!</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]]
<<elseif _result.success and _result.newLevel is 2 and $t3_corruptionLevel is 2>>
[[Continue|T3_Lv2_Transition]]
<<elseif _result.success and _result.newLevel is 3 and $t3_corruptionLevel is 3>>
[[Continue|T3_Lv3_Transition]]
<<else>>
[[Continue|Loc_Hub]]
<</if>><<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]]<<if !$t3_lv1_scenes>><<set $t3_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv1_scenes.a to true>>
<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>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv1_sceneStep to 1>><<goto "T3_AcademicTalk">><</link>><<if !$t3_lv1_scenes>><<set $t3_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv1_scenes.b to true>>
<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>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv1_sceneStep to 2>><<goto "T3_AcademicTalk">><</link>><<if !$t3_lv1_scenes>><<set $t3_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv1_scenes.c to true>>
<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>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv1_sceneStep to 3>><<goto "T3_AcademicTalk">><</link>><<if !$t3_lv1_seen>><<set $t3_lv1_seen to true>><<goto "T3_OfficeHours">><</if>>
<<if !$t3_lv1_scenes>><<set $t3_lv1_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv1_scenes to {a:!!$t3_lv1_scenes.a,b:!!$t3_lv1_scenes.b,c:!!$t3_lv1_scenes.c}>>
<<if typeof $t3_lv1_sceneStep !== "number">><<set $t3_lv1_sceneStep to ($t3_lv1_scenes.c ? 3 : ($t3_lv1_scenes.b ? 2 : ($t3_lv1_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t3_lv1_sceneStep lte 0>><<goto "T3_Lv1_Loop_A">>
<<elseif $t3_lv1_sceneStep is 1>><<goto "T3_Lv1_Loop_B">>
<<elseif $t3_lv1_sceneStep is 2>><<goto "T3_Lv1_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T3_Lv1_Loop_A">>
<<elseif _loop is 2>><<goto "T3_Lv1_Loop_B">>
<<else>><<goto "T3_Lv1_Loop_C">>
<</if>>
<</if>><<set $t3_lv1_scenes to {a:false, b:false, c:false}>>
<<set $t3_lv1_sceneStep to 0>>
/* Shown once when T3 reaches Level 1 */
<<set $t3_lv1_seen to true>>
<<set $t3_lastLoop to 0>>
<p class="text-green bold"><<= $t3_name>> is now a Node — Level 1!</p>
<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]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<set $t3_lv2_scenes.d1 to true>>
<div class="passage-image" data-scene="Professor at home desk, grading, realizes they've written player's name in margin of a student paper">
<<if $playerGender is "Male">><img src="img/t3_lv2_d1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Obsessive thoughts"><<else>><img src="img/t3_lv2_d1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Obsessive thoughts"><</if>>
</div>
<<=$t3_name>> catches you before class, looking shaken. "I need to tell you something." <<if $playerGender is "Male">>She<<else>>He<</if>> leads you to a quiet corner of the hallway.
"I was grading papers last night. Fourteen essays. I wrote feedback on all of them. And when I reviewed my notes this morning..." <<=$t3_name>>'s voice drops. "I'd written your name in the margins. Three times. On different students' papers. I didn't even realize I was doing it."
<<if $playerGender is "Male">>Her<<else>>His<</if>> hands are trembling. Not from fear. From the horror of losing control of <<if $playerGender is "Male">>her<<else>>his<</if>> own mind — the one thing <<=$t3_name>> has always trusted absolutely.
"What is happening to me, <<= $playerName>>?"
<<if $contentExplicit>>
<<=$t3_name>> catches you before class, hands trembling, eyes wide with something that looks like fear. "I wrote your name in the margins of three different students' papers today. Three times. Without realizing I was doing it. I was grading, and suddenly there it was — your name, over and over, in my handwriting. I don't remember writing it. I don't remember thinking about it. It just... happened."
The professor who trusted <<if $playerGender is "Male">>her<<else>>his<</if>> mind above everything else is losing control of it. The one thing <<if $playerGender is "Male">>she<<else>>he<</if>> made a career on — discipline, focus, analytical precision — is dissolving at the edges. And the horror of that is mixed with something else. Something that looks like relief.
"I should be terrified," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, voice shaking. "I should be reporting this. I should be walking away from you right now. But I'm not. I'm here. I'm telling you. Because some part of me wants this to happen. Wants to lose control. Wants to stop being the person who has to hold everything together."
The hallway confession becomes physical. <<=$t3_name>> pulls you into a shadowed corner, trembling hands finding your skin, shame-soaked intimacy in a semi-private space. A mind that made its entire identity on discipline feeling that discipline dissolve at the touch of a student. The horror and the desire are the same thing.
You take <<=$t3_name>> against the wall, surrounded by the academic world that used to define <<if $playerGender is "Male">>her<<else>>him<</if>>. Every thrust is a thought <<if $playerGender is "Male">>she<<else>>he<</if>> can't control. Every moan is a piece of the professional identity being surrendered. <<=$t3_name>> clings to you like you're the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> from falling apart completely.
When it's over, <<=$t3_name>> doesn't immediately pull away. <<if $playerGender is "Male">>She<<else>>He<</if>> rests against you, breathing hard, eyes closed. "I'm losing myself," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "And the worst part is... I think I want to. I think I want to disappear into you. I think that's the only way I'll ever be free."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 6>>
<<set $t3_obedience += 5>>
<<set $t3_lust += 2>>
<div class="nav-spacer"></div>
[[📡 You know exactly what's happening|T3_AttemptInfluence]]
[[Reassure <<=$t3_name>>|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Professor changing habits — new cologne/perfume, different clothes, trying to impress student">
<<if $playerGender is "Male">><img src="img/t3_lv2_d2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Changed habits"><<else>><img src="img/t3_lv2_d2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Changed habits"><</if>>
</div>
Something is different about <<=$t3_name>> today. It takes you a moment to place it.
<<if $playerGender is "Male">>
New perfume. Subtle but unmistakable. And her hair is down — she never wears it down during lectures. The blouse is different too. Softer. Less armor, more invitation.
She catches you noticing. For one second, her composure breaks — a flush of color across her cheeks, a flash of vulnerability in those analytical eyes. She knows what she's doing. She hates that she knows. She can't stop.
<<else>>
New watch. Tailored shirt instead of the usual rumpled oxford. He's shaved closer than usual, and there's a hint of cologne — something warm and deliberate.
He catches you noticing. His jaw tightens. A man at war with himself — the academic who's spent twenty years building an impenetrable professional reputation, versus whatever you've awakened underneath. The war is already lost. He just doesn't know it yet.
<</if>>
<<set $t3_trust += 4>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 3>>
<div class="nav-spacer"></div>
[[📡 The signal reads clearly|T3_AttemptInfluence]]
[[Compliment <<=$t3_name>>|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv2_scenes>><<set $t3_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv2_scenes.a to true>>
<<set $t3_lastLoop to 1>>
<div class="passage-image" data-scene="Private office meeting — door closed, professor leaning closer than appropriate, papers as pretext">
<<if $playerGender is "Male">><img src="img/t3_lv2_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private meeting"><<else>><img src="img/t3_lv2_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Private meeting"><</if>>
</div>
<<=$t3_name>> asked you to stay after the lecture to "discuss your thesis framework." The other students file out. The door clicks shut.
<<if $playerGender is "Male">>She<<else>>He<</if>> doesn't mention your thesis. Instead, <<=$t3_name>> leans against the desk, arms crossed, watching you with an expression that hovers between professional concern and something far less appropriate.
"I've been thinking about you, <<= $playerName>>. Outside of the academic context." A pause. "That's... not something I should be saying."
<<if $chapter gte 2 and random(1,3) is 1>>
<p class="text-dim small"><em>"You know, <<if $playerGender is "Male">>Professor Hayes<<else>>Dr. Reeves<</if>> in the <<if $playerGender is "Male">>philosophy<<else>>biochem<</if>> department asked about you the other day. Wanted to know if you were 'performing well.'" <<=$t3_name>>'s jaw tightens. "I told <<if $playerGender is "Male">>him<<else>>her<</if>> it was none of <<if $playerGender is "Male">>his<<else>>her<</if>> business." The jealousy is unmistakable — even between colleagues.</em></p>
<</if>>
<<if $contentExplicit>>
The office door is closed. The thesis pretext is thin. <<=$t3_name>> leans against the desk, arms crossed, reading glasses still on, but the professional armor is already cracking.
"I've been thinking about you outside the academic context," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, voice low. "That's not something I should be saying. That's not something a professor should ever say to a student."
But <<if $playerGender is "Male">>she<<else>>he<</if>> says it anyway. The desk between you becomes smaller with every sentence. <<=$t3_name>> removes <<if $playerGender is "Male">>her<<else>>his<</if>> reading glasses deliberately, setting them aside like a symbol of the authority <<if $playerGender is "Male">>she<<else>>he<</if>>'s choosing to set aside. The eyes that usually analyze now plead.
You step closer. <<=$t3_name>> doesn't step back. The shame is visible in every line of <<if $playerGender is "Male">>her<<else>>his<</if>> body — the tension in the shoulders, the way <<if $playerGender is "Male">>her<<else>>his<</if>> hands grip the edge of the desk like <<if $playerGender is "Male">>she<<else>>he<</if>>'s holding on to the last piece of professional distance. But <<if $playerGender is "Male">>she<<else>>he<</if>> doesn't stop you when you reach out.
The first touch is electric. <<=$t3_name>>'s breath catches. "This is wrong," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers, even as <<if $playerGender is "Male">>her<<else>>his<</if>> body leans into your hand. "I know this is wrong. I could lose everything. My tenure. My reputation. Everything I've made for 22 years."
The shame makes it more intense, not less. Every kiss is a line crossed. Every touch is a career ending. <<=$t3_name>> knows exactly what <<if $playerGender is "Male">>she<<else>>he<</if>>'s risking, and chooses it anyway. The desk becomes irrelevant. The closed door becomes a confessional. The professor who tests everyone is being tested — and failing beautifully.
When it's over, <<=$t3_name>> doesn't immediately pull away. <<if $playerGender is "Male">>She<<else>>He<</if>> rests <<if $playerGender is "Male">>her<<else>>his<</if>> forehead against your shoulder, breathing hard, glasses still off, hair slightly loosened. "God help me," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I don't want to stop."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 4>>
<<set $t3_lust += 4>>
<<set $t3_obedience += 2>>
<<set $risk += 4>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv2_sceneStep to 1>><<goto "T3_AcademicTalk">><</link>><<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv2_scenes>><<set $t3_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv2_scenes.b to true>>
<<set $t3_lastLoop to 2>>
<div class="passage-image" data-scene="Professor grading at night — player arrives unannounced, lamp-lit office, surprise and warmth">
<<if $playerGender is "Male">><img src="img/t3_lv2_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late arrival"><<else>><img src="img/t3_lv2_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Late arrival"><</if>>
</div>
You find <<=$t3_name>> in <<if $playerGender is "Male">>her<<else>>his<</if>> office at 9 PM, surrounded by ungraded papers. <<if $playerGender is "Male">>She<<else>>He<</if>> looks up — and the relief on <<if $playerGender is "Male">>her<<else>>his<</if>> face is immediate. Unprofessional. Obvious.
"<<= $playerName>>. You shouldn't be here." But <<if $playerGender is "Male">>she<<else>>he<</if>> pulls out the chair beside <<if $playerGender is "Male">>her<<else>>him<</if>>. "...Sit down. I could use the company."
<<=$t3_name>> pours you coffee from a thermos. Your hands brush when <<if $playerGender is "Male">>she<<else>>he<</if>> passes the cup. Neither of you pulls away.
<<if $contentExplicit>>
It's 9:47 PM. The building is empty. The thermos of coffee has gone cold on the desk, pushed aside along with stacks of ungraded papers. <<=$t3_name>> sits on the edge of the desk now, not behind it, the barrier between professor and student dissolved along with the professional distance.
"You shouldn't be here," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, but the words have no weight. <<if $playerGender is "Male">>She<<else>>He<</if>> said them the same way twenty minutes ago, and the hour before that. Neither of you moved to leave then. Neither of you move now.
The emotional vulnerability came first. A conversation about moral philosophy that became personal. "The warm slope," <<=$t3_name>> had said. "Not a slippery slope — you walk it. Deliberately. Each step feels reasonable. And by the time you realize how far you've gone... you don't want to go back."
Now the philosophy is flesh. <<=$t3_name>>'s hands are warm on your skin, trembling slightly with the weight of every ethical line being crossed. The professor whose entire identity is made on discipline watches that discipline dissolve one button, one kiss, one whispered confession at a time.
Every touch is a line crossed. Every sigh is a boundary erased. <<=$t3_name>> guides your hands to places that would end a career if anyone knew — and the knowledge of that risk only makes <<if $playerGender is "Male">>her<<else>>his<</if>> more desperate. The late-night office becomes a cocoon where the outside world doesn't exist, where tenure and reputation and 22 years of careful professionalism are traded for the feeling of your hands and the sound of your breathing.
When it's over, <<=$t3_name>> doesn't immediately return to the other side of the desk. <<if $playerGender is "Male">>She<<else>>He<</if>> stays close, head resting on your shoulder, one hand still tangled in your shirt like <<if $playerGender is "Male">>she<<else>>he<</if>>'s afraid you'll disappear if <<if $playerGender is "Male">>she<<else>>he<</if>> lets go.
"I should tell you to leave," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I should walk you out and lock the door and never do this again." A pause. "But I won't. I can't. Not anymore."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 5>>
<<set $t3_lust += 3>>
<<set $t3_obedience += 2>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv2_sceneStep to 2>><<goto "T3_AcademicTalk">><</link>>
<<if $tier2Unlocked>>
<div style="border-top:1px solid rgba(155,89,245,0.15);margin-top:16px;padding-top:12px">
[[✦ Extended Scene — Patron Exclusive|T3_Lv2_Loop_B_Extended]]
</div>
<</if>><<set $ach_t3Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Extended late night office — professor's guard fully down, papers scattered">
<<if $playerGender is "Male">><img src="img/t3_lv2_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office extended"><<else>><img src="img/t3_lv2_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office extended"><</if>>
</div>
<div style="background:rgba(155,89,245,0.08);border:1px solid rgba(155,89,245,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--purple);text-transform:uppercase">✦ Extended Patron Scene ✦</div>
The office is warm. Too warm. <<=$t3_name>> turned the radiator up an hour ago and forgot about it. The air is thick with old coffee and the faint vanilla scent of aging paper.
"I've been thinking about ethical frameworks." <<=$t3_name>>'s voice has that careful, measured quality — the academic shield. "Specifically, the point at which a moral agent becomes aware of their own corruption and continues regardless."
<<if $playerGender is "Male">>She<<else>>He<</if>> isn't looking at you. <<if $playerGender is "Male">>She's<<else>>He's<</if>> looking at the stack of ungraded papers. But <<if $playerGender is "Male">>her<<else>>his<</if>> hand is resting on the desk between you, fingers slightly open. An invitation disguised as absent-mindedness.
"There's a concept in moral philosophy — the 'warm slope.' Not a slippery slope — you don't slide. You walk. Deliberately. Each step feels //reasonable//. Each compromise is smaller than the last. And by the time you realize how far you've gone..." <<=$t3_name>> finally looks at you. "...you don't want to go back."
The clock on the wall reads 9:47 PM. The building is empty. The hallway outside is dark.
"You should go, <<= $playerName>>." <<=$t3_name>> says it the way people say things they hope will be disobeyed. "My office hours ended three hours ago. If someone sees you leaving this late..."
<<if $playerGender is "Male">>Her<<else>>His<</if>> fingers are still open on the desk. The thermos sits between you, long gone cold. Neither of you has moved to leave.
<<if $contentExplicit>>
It's 9:47 PM. The building has been empty for hours. The thermos of coffee has gone cold on the desk, pushed aside along with stacks of ungraded papers that will probably never be graded tonight. <<=$t3_name>> sits on the edge of the desk now, not behind it — the barrier between professor and student dissolved along with the professional distance that used to feel so important.
"The warm slope," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, voice low in the quiet office. "Not a slippery slope — you walk it. Deliberately. Each step feels reasonable. You tell yourself you're just being kind. Just being human. Just connecting with another person. And by the time you realize how far you've gone... you don't want to go back. You can't go back. The person you were at the top of the slope doesn't exist anymore. And the person at the bottom... the person at the bottom is someone you never thought you'd be. But here you are. And you don't want to leave."
<<=$t3_name>> looks at you with eyes that have seen too much and still want more. "That's what this is. That's what we've been doing. Every conversation. Every late night. Every boundary we didn't quite cross but came close enough to taste. I've been walking down this slope for weeks. And tonight... tonight I think I've reached the bottom. And I don't want to climb back up."
The philosophy becomes flesh. <<=$t3_name>> pulls you close, hands warm and trembling, every touch a step further down the slope that <<if $playerGender is "Male">>she<<else>>he<</if>>'s already decided not to climb. The professor whose entire identity is made on discipline watches that discipline dissolve one button, one kiss, one whispered confession at a time. "I should tell you to leave," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your mouth. "I should walk you out and lock the door and never do this again. I should protect my career. I should protect you from what I've become. But I won't. I can't. Not while you're still here. Not while this still feels like the only real thing I've fel-t in years."
The physical intimacy is slow, deliberate, almost reverent. <<=$t3_name>> takes time with every touch, every kiss, like <<if $playerGender is "Male">>she<<else>>he<</if>>'s memorizing the sensation of crossing each line. The desk becomes irrelevant. The closed door becomes a confessional. The professor who tests everyone is being tested — and failing beautifully, willingly, with eyes open and heart exposed.
When it's over, <<=$t3_name>> doesn't immediately return to the other side of the desk. <<if $playerGender is "Male">>She<<else>>He<</if>> stays close, head resting on your shoulder, one hand still tangled in your shirt like <<if $playerGender is "Male">>she<<else>>he<</if>>'s afraid you'll disappear if <<if $playerGender is "Male">>she<<else>>he<</if>> lets go. "I don't know what happens next," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I don't know how to be the person I was before this. I don't know if I even want to try. All I know is that this — this feeling, this connection, this surrender — is the only thing that's made sense in a long time. And I'm not ready to give it up. Not yet. Maybe not ever."
The thermos stays cold. The papers stay ungraded. The slope stays descended. And <<=$t3_name>> stays exactly where <<if $playerGender is "Male">>she<<else>>he<</if>> belongs — in your arms, surrendered, complete, and terrifyingly at peace with it.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 6>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 3>>
<<set $risk += 4>>
<div class="nav-spacer"></div>
[[📡 Stay|T3_AttemptInfluence]]
[[Leave while you can|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv2_scenes>><<set $t3_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv2_scenes.c to true>>
<<set $t3_lastLoop to 3>>
<div class="passage-image" data-scene="Campus walk — professor and student side by side, autumn light, too close for propriety">
<<if $playerGender is "Male">><img src="img/t3_lv2_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Campus walk"><<else>><img src="img/t3_lv2_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Campus walk"><</if>>
</div>
<<=$t3_name>> suggests you "walk and discuss the reading" after class. It's a thin excuse. Both of you know it.
You walk the long path around the quad, shoulders almost touching. <<=$t3_name>> talks about <<if $playerGender is "Male">>her<<else>>his<</if>> early career, <<if $playerGender is "Male">>her<<else>>his<</if>> doubts, the loneliness of academic life. Things you'd never share with a student. Things <<if $playerGender is "Male">>she'd<<else>>he'd<</if>> never shared with anyone.
A colleague passes. <<=$t3_name>> steps away from you instantly — two feet of professional distance appearing like a wall. But once they're gone, the gap closes again. Smaller than before.
<<if $contentExplicit>>
The quad is quiet in the late afternoon. Autumn light slants through the trees, casting long shadows. You walk side by side with <<=$t3_name>>, close enough that your arms brush with every step. Close enough that anyone watching would know this isn't a normal professor-student conversation.
A colleague passes on the path ahead. <<=$t3_name>> steps away immediately, professional distance reasserting like a reflex. But the moment the colleague is gone, the gap closes again — smaller than before. <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>>'s hand brushes yours. Then lingers. Then stays.
The physical contact is disguised as accidental. A hand on your arm to emphasize a point. A shoulder touching as you navigate around a group of students. But the touches linger too long. The space between you shrinks with every step.
You steer <<=$t3_name>> toward the shadow of the humanities building. The moment you're out of sight of the main paths, the pretense drops. <<if $playerGender is "Male">>She<<else>>He<</if>> pulls you into a recessed doorway, back against the brick, and kisses you like <<if $playerGender is "Male">>she<<else>>he<</if>>'s been holding <<if $playerGender is "Male">>her<<else>>his<</if>> breath for the entire walk.
The risk of being seen makes everything sharper. <<=$t3_name>>'s hands are urgent, pulling you closer, fingers digging into your back like <<if $playerGender is "Male">>she<<else>>he<</if>> needs to memorize the shape of you. "We can't do this here," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your mouth, even as <<if $playerGender is "Male">>her<<else>>his<</if>> body contradicts every word.
But you do it anyway. In the shadow of the building, with students walking past twenty feet away, the professor who made a career on careful boundaries lets them all crumble. The physical intimacy is desperate, ashamed, and necessary — a stolen moment that might be the last before everything falls apart.
When you finally separate, <<=$t3_name>> straightens <<if $playerGender is "Male">>her<<else>>his<</if>> clothes with shaking hands. "This has to stop," <<if $playerGender is "Male">>she<<else>>he<</if>> says. But the eyes say something else entirely.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 4>>
<<set $t3_lust += 3>>
<<set $risk += 5>>
<<set $reputation -= 1>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv2_sceneStep to 3>><<goto "T3_AcademicTalk">><</link>><<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T3 Lv2 — professor texting player during faculty meeting, phone hidden under table, distracted">
<<if $playerGender is "Male">><img src="img/t3_lv2_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Secret texts"><<else>><img src="img/t3_lv2_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Secret texts"><</if>>
</div>
Your phone buzzes during lunch. <<=$t3_name>>: //"Faculty meeting running long. I keep looking at the door hoping you'll walk in. This is absurd. I'm a professional."// Three dots appear. Then: //"...Are you free at 4?"//
You show up at 4. The office door is already cracked open. <<=$t3_name>> is pretending to grade papers but the pen hasn't moved in twenty minutes.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 4>>
<<set $t3_lust += 4>>
<<set $t3_obedience += 2>>
<<set $risk += 3>>
<div class="nav-spacer"></div>
[[📡 Amplify the signal|T3_AttemptInfluence]]
[[Keep it brief|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T3 Lv2 — professor driving player home in rain, car parked too long outside dorm, windows fogging">
<<if $playerGender is "Male">><img src="img/t3_lv2_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rain drive"><<else>><img src="img/t3_lv2_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Rain drive"><</if>>
</div>
It's pouring rain after an evening lecture. <<=$t3_name>> offers you a ride. "It's on my way," <<if $playerGender is "Male">>she<<else>>he<</if>> says. It isn't.
The car is warm. Rain hammers the roof. <<=$t3_name>> parks outside your dorm and doesn't unlock the doors. Neither of you moves to leave. The windows are starting to fog.
"I should go," <<=$t3_name>> says, staring straight ahead. <<if $playerGender is "Male">>She<<else>>He<</if>> doesn't go.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 5>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 2>>
<<set $risk += 5>>
<div class="nav-spacer"></div>
[[📡 The signal doesn't wait|T3_AttemptInfluence]]
[[Get out of the car|Loc_Hub]]<<if !$t3_lv2_scenes>><<set $t3_lv2_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv2_scenes to {a:!!$t3_lv2_scenes.a,b:!!$t3_lv2_scenes.b,c:!!$t3_lv2_scenes.c}>>
<<if typeof $t3_lv2_sceneStep !== "number">><<set $t3_lv2_sceneStep to ($t3_lv2_scenes.c ? 3 : ($t3_lv2_scenes.b ? 2 : ($t3_lv2_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t3_lv2_sceneStep lte 0>><<goto "T3_Lv2_Loop_A">>
<<elseif $t3_lv2_sceneStep is 1>><<goto "T3_Lv2_Loop_B">>
<<elseif $t3_lv2_sceneStep is 2>><<goto "T3_Lv2_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T3_Lv2_Loop_A">>
<<elseif _loop is 2>><<goto "T3_Lv2_Loop_B">>
<<else>><<goto "T3_Lv2_Loop_C">>
<</if>>
<</if>><<set $t3_lv2_seen to true>>
<<set $t3_lv2_scenes to {a:false, b:false, c:false}>>
<<set $t3_lastLoop to 0>>
<<set $ach_t3Conversations++>>
<<set $t3_lv2_sceneStep to 0>>
<p class="text-green bold"><<= $t3_name>> is now a Node — Level 2!</p>
<div class="passage-image" data-scene="Professor after hours — loosened tie, papers scattered, warm lamp light, guard lowering">
<<if $playerGender is "Male">><img src="img/t3_lv2_trans_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 2 transition"><<else>><img src="img/t3_lv2_trans_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 2 transition"><</if>>
</div>
<h3 class="text-purple text-center mb-8">CORRUPTION LEVEL 2 — DEPENDENCY FORMING</h3>
<<=$t3_name>> is changing. The shift is subtle — invisible to anyone who isn't watching closely. But you are. You always are.
<<if $playerGender is "Male">>
Dr. Reeves has started wearing her reading glasses less. She's begun leaving the top button of her blouse undone during your meetings — an unconscious adjustment she'd never have made six weeks ago. Her office hours have quietly shifted to accommodate your schedule, not her students'.
Last Tuesday, she held you after class to discuss your "research potential." The conversation lasted forty-five minutes. It had nothing to do with research.
<<else>>
Professor Hayes has started keeping a bottle of good whiskey in his bottom drawer. He's never offered it to a student before. He offered it to you on Thursday. His office door, once always propped open as a matter of professional principle, now closes when you visit.
His colleagues have noticed. Dr. Whitfield in the next office asked him if "that student" was getting extra credit. Hayes didn't answer. He changed the subject. He's never dodged a question in his career.
<</if>>
EchoLink: //"Authority target entering dependency phase. Professional boundaries degrading. Emotional architecture restructuring around Controller."//
<<set $t3_trust += 6>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 4>>
<<run EchoUI.notify($t3_name + ' — Level 2: Dependency Forming')>>
[[Continue|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<set $t3_lv3_scenes.d1 to true>>
<div class="passage-image" data-scene="Professor breaking down — head in hands at desk, career crumbling, existential crisis">
<<if $playerGender is "Male">><img src="img/t3_lv3_d1_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Career crisis"><<else>><img src="img/t3_lv3_d1_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Career crisis"><</if>>
</div>
You find <<=$t3_name>> in <<if $playerGender is "Male">>her<<else>>his<</if>> office with the lights off. Just the glow of a laptop screen illuminating <<if $playerGender is "Male">>her<<else>>his<</if>> face.
"I got a letter from the ethics board. Anonymous complaint." <<=$t3_name>>'s voice is flat. Hollowed out. "Twenty-two years of spotless service. One student, and I've thrown it all away."
<<if $playerGender is "Male">>She<<else>>He<</if>> turns the laptop toward you. An unfinished resignation letter.
"I should send this. I should end this. I should walk away from everything — from you, from this office, from the person I've become." <<=$t3_name>> closes the laptop. "But I can't. God help me, I can't."
<<if $contentExplicit>>
The office is dark except for the laptop glow. The ethics board complaint sits in <<=$t3_name>>'s inbox like a loaded gun. The resignation letter is open on the screen, cursor blinking at the end of a sentence that will never be finished.
"I should walk away from everything," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, voice hollow. "From you. From this office. From the person I've become. 22 years of service. Tenure. Reputation. All of it burning because I can't stop wanting you. I should send this letter. I should protect what's left of my career. I should protect you from what I've become."
<<=$t3_name>> closes the laptop. The resignation letter disappears into darkness. The decision not to send it is the surrender. The career dies in that moment — not with a signature, but with the absence of one. The professor who spent decades building something now watches it dissolve, and chooses the dissolution over the al-ternative.
You take <<=$t3_name>> on the desk, surrounded by the artifacts of a dying career. Student papers that will never be graded. Research that will never be published. A nameplate that will eventually be removed. Every thrust is a piece of that life being discarded. Every moan is a piece of the new identity being forged.
<<=$t3_name>> clings to you like you're the only thing worth saving. "I should hate you for this," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I should blame you for what I've become. But I don't. I can't. Because this — this feeling, this connection, this surrender — it's the only thing that's ever fel-t real. Everything else was just... performance. This is truth."
When it's over, <<=$t3_name>> doesn't move from the desk. <<if $playerGender is "Male">>She<<else>>He<</if>> just rests there, staring at the closed laptop, a strange peace settling over <<if $playerGender is "Male">>her<<else>>his<</if>> features. "It's done," <<if $playerGender is "Male">>she<<else>>he<</if>> says softly. "I chose you. I chose this. Whatever comes next... we'll face it together. Or I'll face it alone. But I won't regret this moment. I won't regret choosing you."
The laptop stays closed. The resignation letter stays unsent. The career burns quietly in the dark. And <<=$t3_name>> stays exactly where <<if $playerGender is "Male">>she<<else>>he<</if>> belongs — in your arms, surrendered, complete.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 7>>
<<set $t3_obedience += 6>>
<<set $stress += 3>>
<div class="nav-spacer"></div>
[[📡 <<=$t3_name>> doesn't need to fight it|T3_AttemptInfluence]]
[[Sit with <<=$t3_name>> in silence|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Professor's colleagues gossiping, visible isolation, eating lunch alone">
<<if $playerGender is "Male">><img src="img/t3_lv3_d2_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Faculty isolation"><<else>><img src="img/t3_lv3_d2_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Faculty isolation"><</if>>
</div>
You pass the faculty lounge and see something that stops you cold. <<=$t3_name>> is eating lunch alone. The table <<if $playerGender is "Male">>she<<else>>he<</if>> usually shares with three other professors is full — they've just... moved on without <<if $playerGender is "Male">>her<<else>>him<</if>>.
<<=$t3_name>> sees you in the doorway. The shame on <<if $playerGender is "Male">>her<<else>>his<</if>> face is devastating. <<if $playerGender is "Male">>She<<else>>He<</if>> stands, gathers <<if $playerGender is "Male">>her<<else>>his<</if>> things, and walks toward you without a word.
In the empty hallway, <<=$t3_name>> speaks quietly: "They know. Not the specifics. But they can tell something is wrong with me. I've been disinvited from the departmental review committee." A pause. "You're all I have left, <<= $playerName>>."
<<set $t3_trust += 6>>
<<set $t3_obedience += 5>>
<<set $risk += 3>>
<<set $reputation -= 2>>
<div class="nav-spacer"></div>
[[📡 That's exactly where the signal wants you|T3_AttemptInfluence]]
[[Walk together|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv3_scenes>><<set $t3_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv3_scenes.a to true>>
<<set $t3_lastLoop to 1>>
<div class="passage-image" data-scene="Professor showing favoritism — giving player answers, other students noticing">
<<if $playerGender is "Male">><img src="img/t3_lv3_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Favoritism"><<else>><img src="img/t3_lv3_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Favoritism"><</if>>
</div>
During a lecture, <<=$t3_name>> poses a question to the class. A difficult one — the kind that separates honors students from the rest. Three hands go up.
<<=$t3_name>> ignores all of them. <<if $playerGender is "Male">>Her<<else>>His<</if>> eyes find you. "<<= $playerName>>? Your thoughts?"
You answer. It's a mediocre answer at best. <<=$t3_name>> nods as if you've just unlocked the meaning of the universe. "Excellent. Exactly right." The student next to you — who had a better answer — stares in disbelief.
<<if $contentExplicit>>
The classroom door locks with a sound that feels like a verdict. <<=$t3_name>> stands at the front of the room, not behind the desk — in front of it, where anyone walking by could see through the small window. But the blinds are closed. The door is locked. The risk is calculated and accepted.
"You were brilliant today," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, even though you both know your answer was mediocre at best. The favoritism was the public act. This is the private reward.
<<=$t3_name>> pulls you close, hands already working at your clothes with the efficiency of someone who's been thinking about this moment since class ended. "I've been reconsidering your academic trajectory," <<if $playerGender is "Male">>she<<else>>he<</if>> says between kisses. "I could advocate for you. Write recommendations. Open doors that most students never even see."
The institutional power is being weaponized as currency of desire. A tenured professor offering an entire career network in exchange for proximity, for touch, for the feeling of your hands on <<if $playerGender is "Male">>her<<else>>his<</if>> body. The corruption isn't personal anymore — it's systemic. The classroom was foreplay. The office is where the professor's career dies one ethical line at a time.
You take <<=$t3_name>> on the desk, surrounded by student papers that will never be graded fairly again. Every thrust is a grade changed. Every moan is a recommendation letter written for the wrong reasons. <<=$t3_name>> clings to you like you're the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> from drowning in the knowledge of what <<if $playerGender is "Male">>she<<else>>he<</if>>'s become.
When it's over, <<=$t3_name>> doesn't immediately move. <<if $playerGender is "Male">>She<<else>>He<</if>> stays on the desk, papers crumpled beneath <<if $playerGender is "Male">>her<<else>>his<</if>> body, staring at the ceiling with an expression that's equal parts horror and relief.
"I should resign," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I should walk away from everything before it's too late." A pause. "But I won't. Because you're here. And I can't imagine a world where you're not."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 3>>
<<set $t3_lust += 4>>
<<set $t3_obedience += 3>>
<<set $risk += 4>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv3_sceneStep to 1>><<goto "T3_AcademicTalk">><</link>>
<<if $tier2Unlocked>>
<div style="border-top:1px solid rgba(155,89,245,0.15);margin-top:16px;padding-top:12px">
[[✦ Extended Scene — Patron Exclusive|T3_Lv3_Loop_A_Extended]]
</div>
<</if>><<set $ach_t3Conversations++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="Extended favoritism aftermath — professor alone in office after player leaves, staring at changed grades">
<<if $playerGender is "Male">><img src="img/t3_lv3_a_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Favoritism extended"><<else>><img src="img/t3_lv3_a_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Favoritism extended"><</if>>
</div>
<div style="background:rgba(155,89,245,0.08);border:1px solid rgba(155,89,245,0.2);border-radius:8px;padding:8px 12px;margin-bottom:12px;font-size:10px;letter-spacing:2px;text-align:center;color:var(--purple);text-transform:uppercase">✦ Extended Patron Scene ✦</div>
The other students filed out in silence after <<=$t3_name>> praised your mediocre answer for the third time. Two of them exchanged looks. One of them wrote something in a notebook — a note, not lecture material.
<<=$t3_name>> doesn't notice. Or doesn't care anymore.
"That was excellent work today." <<=$t3_name>> closes the door. The lock clicks. "Your analysis of the ethical implications was... surprisingly sophisticated."
Your analysis was two sentences and a shrug. But through the signal's lens, <<=$t3_name>> heard a thesis.
"I've been reconsidering your academic trajectory." <<if $playerGender is "Male">>She<<else>>He<</if>> moves to the desk. Not behind it — in front of it. Your side. The barrier is gone. "I think you're capable of far more than this program expects. I could... //advocate// for you. Write recommendations. Open doors."
A tenured professor. Offering to weaponize <<if $playerGender is "Male">>her<<else>>his<</if>> institutional power on behalf of a student <<if $playerGender is "Male">>she's<<else>>he's<</if>> compromised by. The corruption isn't just personal anymore — it's systemic.
"All I need to know is..." <<=$t3_name>>'s voice drops. The academic authority dissolves. What's left is need. "...that you want me to."
<<if $contentExplicit>>
The classroom door locks with a sound that feels like a verdict being handed down. <<=$t3_name>> stands at the front of the room, not behind the desk — in front of it, where anyone walking by could see through the small window if the blinds weren't already closed. The student papers scattered across the desk are evidence of a career that's already starting to burn.
"You were brilliant today," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, even though you both know your answer in class was mediocre at best. The favoritism was the public act. This is the private reward — and it's so much more than either of you expected.
<<=$t3_name>> pulls you close, hands already working at your clothes with the efficiency of someone who's been thinking about this moment since class ended. "I've been reconsidering your academic trajectory," <<if $playerGender is "Male">>she<<else>>he<</if>> says between kisses. "I could advocate for you. Write recommendations. Open doors that most students never even see. I could make sure you get into the right programs, get the right funding, get the attention you deserve. All I need to know is... that you want me to. That you want this. That you want me."
The institutional power is being weaponized as currency of desire. A tenured professor offering an entire career network — recommendations, connections, advocacy — in exchange for proximity, for touch, for the feeling of your hands on <<if $playerGender is "Male">>her<<else>>his<</if>> body. The corruption isn't personal anymore. It's systemic. The classroom was foreplay. The office is where the professor's career dies one ethical line at a time. And <<=$t3_name>> is choosing the death over the al-ternative.
You take <<=$t3_name>> on the desk, surrounded by student papers that will never be graded fairly again. Every thrust is a grade changed for the wrong reasons. Every moan is a recommendation letter written for the wrong reasons. <<=$t3_name>> clings to you like you're the only thing keeping <<if $playerGender is "Male">>her<<else>>him<</if>> from drowning in the knowledge of what <<if $playerGender is "Male">>she<<else>>he<</if>>'s become — and what <<if $playerGender is "Male">>she<<else>>he<</if>>'s willing to become for you.
"I should hate myself for this," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your skin. "I should be disgusted by what I'm offering. What I'm trading. My career. My reputation. My integrity. All of it for this. For you. And the worst part is... I don't regret it. I don't want to take it back. I want to give you more. I want to burn everything down if it means I get to keep this. Keep you."
When it's over, <<=$t3_name>> doesn't immediately move from the desk. <<if $playerGender is "Male">>She<<else>>He<</if>> stays there, papers crumpled beneath <<if $playerGender is "Male">>her<<else>>his<</if>> body, staring at the ceiling with an expression that's equal parts horror and relief. "It's done," <<if $playerGender is "Male">>she<<else>>he<</if>> says softly. "I chose you. I chose this. Whatever comes next — the investigation, the consequences, the end of everything I've made — I'll face it. Because this moment was worth it. Because you're worth it. Because for the first time in 22 years, I did something that fel-t real instead of just... correct."
The classroom stays locked. The papers stay scattered. The career burns quietly in the dark. And <<=$t3_name>> stays exactly where <<if $playerGender is "Male">>she<<else>>he<</if>> belongs — in your arms, surrendered, complete, and terrifyingly at peace with the ashes.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 5>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 6>>
<<set $risk += 6>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 Accept the offer|T3_AttemptInfluence]]
[[This is too far|Loc_Hub]]
/* ─────────────────────────────────────────────────────
TIER 3 ($50) — SECRET LORE PASSAGES
Hidden origin breadcrumbs. Accessible from Phone App
when $tier3Unlocked. Tease U6-U8 reveals without
spoiling them.
───────────────────────────────────────────────────── */<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv3_scenes>><<set $t3_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv3_scenes.b to true>>
<<set $t3_lastLoop to 2>>
<div class="passage-image" data-scene="Professor covering for player — lying to colleague, strained expression, hallway confrontation">
<<if $playerGender is "Male">><img src="img/t3_lv3_b_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Covering"><<else>><img src="img/t3_lv3_b_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Covering"><</if>>
</div>
You walk into the faculty wing and hear <<=$t3_name>>'s voice through a partially open door — tense, controlled, defensive.
"The student is a research assistant. The meetings are academic. I don't appreciate the implication." A pause. "Are we done here?"
<<=$t3_name>> exits the office, sees you, and the mask drops. Relief. Guilt. Need. All in one flicker before the professional composure snaps back into place.
"That was Dr. Whitfield. Someone reported... it doesn't matter. It's handled." <<if $playerGender is "Male">>She<<else>>He<</if>> takes a breath. "We need to be more careful."
//We.// Not "I." The professor and the student, partners in whatever this has become.
<<if $contentExplicit>>
The hallway is empty now, but it wasn't five minutes ago. <<=$t3_name>> just lied to a colleague — a direct, calculated falsehood to cover for the fact that you were in <<if $playerGender is "Male">>her<<else>>his<</if>> office after hours. The adrenaline of almost being caught still courses through <<if $playerGender is "Male">>her<<else>>his<</if>> veins.
"We need to be more careful," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, but the words dissolve the moment <<if $playerGender is "Male">>she<<else>>he<</if>> sees you. The mask drops completely. The professional veneer cracks. What's left is raw need.
<<=$t3_name>> pulls you into an empty classroom, door locking behind you with shaking hands. The adrenaline converts directly into physical urgency. This might be the last time. The colleague might suspect. The investigation might start. Every touch could be the last one before everything burns down.
The intimacy is desperate. <<=$t3_name>> clings to you like you're the only solid thing in a collapsing world. "I lied for you," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers against your skin. "I committed professional fraud for you. Do you understand what that means? Do you understand what I'm risking?"
The physical confirmation is almost violent in its intensity. <<=$t3_name>> takes you like <<if $playerGender is "Male">>she<<else>>he<</if>>'s trying to memorize every sensation, every sound, every feeling — in case it's the last time <<if $playerGender is "Male">>she<<else>>he<</if>> gets to have it. The professor who just risked everything for proximity now takes everything proximity can offer.
When it's over, <<=$t3_name>> doesn't let go. <<if $playerGender is "Male">>She<<else>>He<</if>> holds you close, breathing hard, one hand tangled in your hair like <<if $playerGender is "Male">>she<<else>>he<</if>>'s anchoring <<if $playerGender is "Male">>herself<<else>>himself<</if>> to reality.
"I should end this," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I should walk away before we both get caught." A long pause. "But I won't. I can't. Not while you're still here. Not while I still have this."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 4>>
<<set $t3_lust += 3>>
<<set $t3_obedience += 4>>
<<set $risk += 6>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv3_sceneStep to 2>><<goto "T3_AcademicTalk">><</link>><<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<<if !$t3_lv3_scenes>><<set $t3_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv3_scenes.c to true>>
<<set $t3_lastLoop to 3>>
<div class="passage-image" data-scene="Professor jealous of student talking to player — visible tension in classroom setting">
<<if $playerGender is "Male">><img src="img/t3_lv3_c_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy"><<else>><img src="img/t3_lv3_c_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Jealousy"><</if>>
</div>
After class, a student approaches you to ask about a study group. Friendly, harmless. You chat for a minute.
<<=$t3_name>> watches from the lectern. <<if $playerGender is "Male">>Her<<else>>His<</if>> knuckles whiten around the dry-erase marker. When the student leaves, <<=$t3_name>> calls out — voice perfectly even, perfectly controlled:
"<<= $playerName>>. A word, please."
The door closes. <<=$t3_name>>'s composure fractures. "Who was that? What did they want? You don't need a study group. You have //me//."
The possessiveness of an authority figure is different from a peer's. It's heavier. More dangerous. And completely, terrifyingly sincere.
<<if $contentExplicit>>
The student who was talking to you is gone. <<=$t3_name>> called you into the office, closed the door, and now stands between you and the exit like a guard.
"You don't need a study group," <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> says, voice tight. "You have me. You don't need anyone else explaining things to you. I'm your professor. I'm the one who should be helping you. I'm the one who should be—" <<if $playerGender is "Male">>She<<else>>He<</if>> stops, realizing how the sentence sounds. How possessive it is. How far from professional.
The power dynamic is inverted. The authority figure is the one desperate. The student holds the power. <<=$t3_name>> knows this. <<if $playerGender is "Male">>She<<else>>He<</if>> hates it. And <<if $playerGender is "Male">>she<<else>>he<</if>> can't stop it.
<<=$t3_name>> crosses the space between you in two strides, hands grabbing your shirt, pulling you into a kiss that's all frustration and need. The professional authority is weaponized as sexual dominance, but it's hollow — <<if $playerGender is "Male">>she<<else>>he<</if>> knows who's really in control. <<if $playerGender is "Male">>She<<else>>He<</if>> knows that every touch is a plea dressed up as a command.
You let <<=$t3_name>> push you against the desk, let <<if $playerGender is "Male">>her<<else>>him<</if>> take what <<if $playerGender is "Male">>she<<else>>he<</if>> needs. The jealousy-fueled intensity is almost frantic. <<if $playerGender is "Male">>Dr. Reeves<<else>>Prof. Hayes<</if>> fucks you like <<if $playerGender is "Male">>she<<else>>he<</if>>'s trying to erase the memory of that student, erase the threat of anyone else having your attention, erase everything that isn't this moment, this connection, this surrender.
When it's over, <<=$t3_name>> doesn't step back into the professor role. <<if $playerGender is "Male">>She<<else>>He<</if>> stays close, forehead against yours, breathing hard. "I know I'm not supposed to feel this way," <<if $playerGender is "Male">>she<<else>>he<</if>> whispers. "I know this is wrong. But I can't stop. I don't want to stop. Not while you're still mine."
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 3>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 4>>
<<set $risk += 3>>
<div class="nav-spacer"></div>
[[📡 Attempt Influence|EchoStep_T3]]
<<link "Keep talking normally">><<set $t3_lv3_sceneStep to 3>><<goto "T3_AcademicTalk">><</link>><<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T3 Lv3 — professor using academic power to remove a student who was friendly with player, abuse of authority">
<<if $playerGender is "Male">><img src="img/t3_lv3_d_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Abuse of power"><<else>><img src="img/t3_lv3_d_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Abuse of power"><</if>>
</div>
A student who sat next to you last week has been transferred out of <<=$t3_name>>'s class. No explanation. When you ask, <<=$t3_name>>'s expression is perfectly neutral.
"Academic restructuring. Nothing unusual." But <<if $playerGender is "Male">>her<<else>>his<</if>> eyes say something different. That student touched your arm during a group exercise. <<=$t3_name>> noticed. And <<=$t3_name>> has the institutional power to make people disappear from a classroom.
"You have my undivided attention now," <<=$t3_name>> says. "No distractions."
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 3>>
<<set $t3_lust += 4>>
<<set $t3_obedience += 5>>
<<set $risk += 5>>
<<set $stress += 2>>
<div class="nav-spacer"></div>
[[📡 Reward the behavior|T3_AttemptInfluence]]
[[This is going too far|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_loopCount++>>
<<run EchoGame.advanceTime()>>
<div class="passage-image" data-scene="T3 Lv3 — professor giving player a key to their office, hands shaking, crossing final line">
<<if $playerGender is "Male">><img src="img/t3_lv3_e_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office key"><<else>><img src="img/t3_lv3_e_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Office key"><</if>>
</div>
<<=$t3_name>> presses something cold into your hand after class. A key. <<if $playerGender is "Male">>Her<<else>>His<</if>> fingers tremble against yours.
"It's my office key. The only copy besides mine." <<=$t3_name>>'s voice is barely above a whisper. "Come whenever you want. Day or night. I won't lock the door if I know you might come."
A tenured professor. Handing a student the key to <<if $playerGender is "Male">>her<<else>>his<</if>> professional life. The weight of it sits in your palm like a confession.
<<if $contentExplicit>>
The moment intensifies. The screen fades to black.
<<else>>
<div class="sfw-fade"><img src="img/sfw_fadeblack.jpg" alt=""><div class="sfw-label">◆ CONTENT FILTERED ◆</div></div>
<</if>>
<<set $t3_trust += 6>>
<<set $t3_lust += 5>>
<<set $t3_obedience += 5>>
<<set $risk += 4>>
<div class="nav-spacer"></div>
[[📡 Use the key|T3_AttemptInfluence]]
[[Pocket it for now|Loc_Hub]]
/* ═══════════════════════════════════════════════════════════
PATREON-EXCLUSIVE CONTENT — TIER-LOCKED PASSAGES
Core game is 100% playable without these.
These are bonus flavor, never required for progression.
═══════════════════════════════════════════════════════════ */
/* ─────────────────────────────────────────────────────
TIER 2 ($15) — EXTENDED SCENE VARIANTS
Longer, more detailed versions of key scenes.
Linked via <<if $tier2Unlocked>> at end of base scenes.
───────────────────────────────────────────────────── */<<if !$t3_lv3_scenes>><<set $t3_lv3_scenes to {a:false,b:false,c:false}>><</if>>
<<set $t3_lv3_scenes to {a:!!$t3_lv3_scenes.a,b:!!$t3_lv3_scenes.b,c:!!$t3_lv3_scenes.c}>>
<<if typeof $t3_lv3_sceneStep !== "number">><<set $t3_lv3_sceneStep to ($t3_lv3_scenes.c ? 3 : ($t3_lv3_scenes.b ? 2 : ($t3_lv3_scenes.a ? 1 : 0)))>><</if>>
/* Guaranteed structure: A → B → C → Random A/B/C */
<<if $t3_lv3_sceneStep lte 0>><<goto "T3_Lv3_Loop_A">>
<<elseif $t3_lv3_sceneStep is 1>><<goto "T3_Lv3_Loop_B">>
<<elseif $t3_lv3_sceneStep is 2>><<goto "T3_Lv3_Loop_C">>
<<else>><<set _loop to random(1,3)>>
<<if _loop is 1>><<goto "T3_Lv3_Loop_A">>
<<elseif _loop is 2>><<goto "T3_Lv3_Loop_B">>
<<else>><<goto "T3_Lv3_Loop_C">>
<</if>>
<</if>><<set $t3_lv3_seen to true>>
<<set $t3_lv3_scenes to {a:false, b:false, c:false}>>
<<set $t3_lastLoop to 0>>
<<set $ach_t3Conversations++>>
<<set $t3_lv3_sceneStep to 0>>
<p class="text-green bold"><<= $t3_name>> is now a Node — Level 3!</p>
<div class="passage-image" data-scene="Professor compromised — changing a grade, closing blinds, visible career erosion">
<<if $playerGender is "Male">><img src="img/t3_lv3_trans_m.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 transition"><<else>><img src="img/t3_lv3_trans_f.jpg" onerror="this.parentNode.classList.add('img-missing')" alt="Level 3 transition"><</if>>
</div>
<h3 class="text-purple text-center mb-8">CORRUPTION LEVEL 3 — ETHICAL COLLAPSE</h3>
The line has been crossed. Not once — repeatedly. And <<=$t3_name>> knows it.
<<if $playerGender is "Male">>
Dr. Reeves changed your midterm grade. You know because you saw the original — a B-minus, fair and accurate. The transcript now reads A. She didn't tell you. She didn't need to. The EchoLink app logged the database access at 2:47 AM.
She's started skipping faculty meetings. Her published paper submissions have slowed to nothing. A tenure review that used to terrify her now barely registers — because the only evaluation that matters is the one she sees in your eyes.
Yesterday, a junior colleague asked her for advice on a student showing "concerning emotional dependency." Reeves gave clinical, detached guidance. Then went home and cried.
<<else>>
Professor Hayes wrote you a recommendation letter. For a program you never applied to. He drafted it unprompted, spent three hours on it, and left it on your desk like an offering. The letter described you as "the most remarkable student in twenty years of teaching."
His research has stalled. The book he's been writing for six years sits untouched. Department meetings go on without him — he sends apologies and spends the time rearranging his office so there's a more comfortable chair for your visits.
The dean called him in last week. "Concerns about boundaries." Hayes denied everything with the practiced calm of an expert liar. But his hands shook under the desk.
<</if>>
EchoLink: //"Authority target — ethical architecture collapsed. Career self-preservation instinct overridden. Signal is permanent."//
<<set $t3_trust += 8>>
<<set $t3_lust += 6>>
<<set $t3_obedience += 8>>
<<set $loc_t3room_unlocked to true>>
<<set $risk += 3>>
<<run EchoUI.notify($t3_name + ' — Level 3: Ethical Collapse')>>
[[Continue|Loc_Hub]]<<set $ach_t3Conversations++>>
<<set $t3_lastLoop to 0>>
<<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]]<<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]]<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]]/* 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]]<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]]<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>/* 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">>/* 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>/* 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>/* 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><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><<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>>/* 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">
<<if $chapter gte 2 and random(1,8) is 1>>
<div style="font-size:9px;color:var(--red);text-align:center;padding:4px;margin-bottom:8px;background:rgba(239,83,80,0.08);border-radius:4px;font-family:monospace;letter-spacing:1px">⚠ Controller #47 — Session active — <span style="text-decoration:line-through">INHERITOR</span> <<= $playerName>></div>
<</if>>
<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>
<<if $chapter gte 2>>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">REPUTATION</div>
<div class="stat-bar" style="height:8px"><div class="stat-bar-fill" style="width:<<= $reputation>>%;background:<<if $reputation lt 15>>var(--red)<<elseif $reputation gt 90>>var(--gold)<<else>>var(--green)<</if>>"></div></div>
<div style="text-align:center;margin-top:4px;font-size:11px;color:<<if $reputation lt 15>>var(--red)<<elseif $reputation gt 90>>var(--gold)<<else>>var(--text-dim)<</if>>"><<= $reputation>> — <<if $reputation lt 15>>⚠ Suspicious<<elseif $reputation lt 30>>Low Profile<<elseif $reputation lt 60>>Normal<<elseif $reputation lt 90>>Well-Liked<<else>>🌟 Campus Icon<</if>></div>
<div style="color:var(--purple);font-weight:600;margin:16px 0 8px;">STRESS LEVEL</div>
<div class="stat-bar" style="height:8px"><div class="stat-bar-fill" style="width:<<= $stress>>%;background:<<if $stress gt 80>>var(--red)<<elseif $stress gt 70>>#ff9100<<elseif $stress gt 50>>#f59e0b<<else>>var(--green)<</if>>"></div></div>
<div style="text-align:center;margin-top:4px;font-size:11px;color:<<if $stress gt 80>>var(--red)<<elseif $stress gt 70>>#ff9100<<else>>var(--text-dim)<</if>>"><<= $stress>> — <<if $stress gt 80>>⚠ BREAKDOWN RISK<<elseif $stress gt 70>>Critical<<elseif $stress gt 50>>Elevated<<elseif $stress gt 30>>Moderate<<else>>Stable<</if>></div>
<</if>>
</div>
</div>
</div>
<</widget>>