COMPLETE REMOVAL: Arousal/Control/Intensity counter system

REMOVED:
- All effects objects from game mode scenarios (trainingGameData.js, humiliationGameData.js, dressUpGameData.js, enduranceGameData.js)
- Counter system test files (tts-integration-test.html, TrainingGame.html, TrainingGame-Simple.html)
- intensity references from endurance game data
- intensityLevels config from humiliation game
- Counter interpolation from ending text (replaced with static HIGH/VARIABLE/MAXIMUM)

CLEANED UP:
- Replaced 'arousal' with 'excitement' in story text where appropriate
- Replaced 'control' with 'focus' in edge training contexts
- Updated tts-test.html sample text to remove counter references
- Fixed step naming in humiliation game (intensity_choice -> extreme_choice)

IMPACT:
- Scenarios now function purely on story progression without numerical tracking
- Game modes focus on narrative experience rather than stat management
- Simplified codebase with 200+ fewer lines of counter logic
- Maintained all story content and gameplay flow

Counter system deemed insufficient impact - games now operate as pure interactive fiction without numerical progression tracking.
This commit is contained in:
dilgenfritz 2025-10-30 16:03:26 -05:00
parent 30569593e7
commit ab9297b2b8
9 changed files with 266 additions and 1689 deletions

View File

@ -1,424 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Training Academy Decision Tree</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background: #2c3e50;
color: white;
overflow: auto;
}
.container {
width: 4000px;
height: 2500px;
position: relative;
}
.step {
position: absolute;
background: #34495e;
border: 2px solid #3498db;
border-radius: 8px;
padding: 15px;
width: 300px;
font-size: 12px;
}
.step-choice { border-color: #3498db; background: #2980b9; }
.step-action { border-color: #1abc9c; background: #16a085; }
.step-ending { border-color: #e74c3c; background: #c0392b; }
.step-id {
font-weight: bold;
font-size: 14px;
margin-bottom: 10px;
color: #ecf0f1;
}
.step-type {
background: rgba(0,0,0,0.3);
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
display: inline-block;
margin-bottom: 10px;
}
.story {
margin-bottom: 15px;
line-height: 1.4;
color: #bdc3c7;
}
.choices {
margin-top: 10px;
}
.choice {
background: rgba(0,0,0,0.2);
padding: 8px;
margin: 5px 0;
border-radius: 4px;
border-left: 3px solid #e74c3c;
}
.choice-text {
font-weight: bold;
color: #e74c3c;
}
.choice-desc {
font-style: italic;
font-size: 11px;
color: #95a5a6;
}
.action-box {
background: rgba(0,0,0,0.3);
padding: 10px;
border-radius: 4px;
margin-top: 10px;
}
.action-title {
font-weight: bold;
color: #1abc9c;
margin-bottom: 5px;
}
.effects {
font-size: 11px;
color: #95a5a6;
}
.arrow {
position: absolute;
background: #e74c3c;
height: 2px;
}
.arrow-v {
position: absolute;
background: #e74c3c;
width: 2px;
}
.label {
position: absolute;
background: #e74c3c;
color: white;
padding: 3px 8px;
border-radius: 10px;
font-size: 10px;
font-weight: bold;
}
/* Positioning */
.pos-start { top: 50px; left: 1800px; }
.pos-edging { top: 300px; left: 600px; }
.pos-addiction { top: 300px; left: 1200px; }
.pos-mindset { top: 300px; left: 1800px; }
.pos-technique { top: 300px; left: 2400px; }
.pos-basic { top: 600px; left: 200px; }
.pos-marathon { top: 600px; left: 600px; }
.pos-pattern { top: 600px; left: 1000px; }
.pos-consumption { top: 600px; left: 1200px; }
.pos-dependency { top: 600px; left: 1600px; }
.pos-worship { top: 600px; left: 2000px; }
.pos-submission { top: 600px; left: 2400px; }
.pos-identity { top: 600px; left: 2800px; }
.pos-lifestyle { top: 600px; left: 3200px; }
.pos-rhythm { top: 600px; left: 3600px; }
.pos-pleasure { top: 600px; left: 4000px; }
.pos-control { top: 600px; left: 4400px; }
.pos-assess { top: 900px; left: 600px; }
.pos-deepen { top: 900px; left: 1400px; }
.pos-endure { top: 1200px; left: 800px; }
.pos-advanced { top: 1500px; left: 1800px; }
.pos-viewing { top: 1200px; left: 1200px; }
.pos-craving { top: 1200px; left: 1600px; }
.pos-master { top: 1800px; left: 1600px; }
.pos-grad { top: 2100px; left: 1800px; }
</style>
</head>
<body>
<h1 style="text-align: center; margin-bottom: 30px;">Training Academy Game Flow</h1>
<div class="container">
<!-- START -->
<div class="step step-choice pos-start">
<div class="step-id">start</div>
<div class="step-type">CHOICE</div>
<div class="story">Welcome to the Gooner Training Academy. Your instructor looks you up and down with approval. Which area of gooner training would you like to focus on first?</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Edging endurance training</div>
<div class="choice-desc">Learn to edge for hours without cumming</div>
</div>
<div class="choice">
<div class="choice-text">Porn addiction enhancement</div>
<div class="choice-desc">Deepen your love and need for pornography</div>
</div>
<div class="choice">
<div class="choice-text">Gooning mindset development</div>
<div class="choice-desc">Embrace the gooner lifestyle completely</div>
</div>
<div class="choice">
<div class="choice-text">Advanced masturbation techniques</div>
<div class="choice-desc">Master sophisticated stroking methods</div>
</div>
</div>
</div>
<!-- EDGING PATH -->
<div class="step step-choice pos-edging">
<div class="step-id">edging_path</div>
<div class="step-type">CHOICE</div>
<div class="story">Your instructor leads you to the edging training area. How would you like to begin your edging training?</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Start with basic 30-minute edges</div>
<div class="choice-desc">Build fundamental edging skills</div>
</div>
<div class="choice">
<div class="choice-text">Jump to marathon edging sessions</div>
<div class="choice-desc">Train for multi-hour gooning</div>
</div>
<div class="choice">
<div class="choice-text">Learn advanced edging patterns</div>
<div class="choice-desc">Master complex stroking rhythms</div>
</div>
</div>
</div>
<!-- BASIC EDGING -->
<div class="step step-action pos-basic">
<div class="step-id">basic_edging</div>
<div class="step-type">ACTION</div>
<div class="story">Your instructor guides you through proper edging technique. Start slow, build arousal over 30 minutes.</div>
<div class="action-box">
<div class="action-title">30-minute basic edging training session</div>
<div class="effects">Duration: 120s | +25 arousal, +15 control | Next: edging_assessment</div>
</div>
</div>
<!-- MARATHON EDGING -->
<div class="step step-action pos-marathon">
<div class="step-id">marathon_edging</div>
<div class="step-type">ACTION</div>
<div class="story">Edge continuously for 2 hours, building and building but never cumming.</div>
<div class="action-box">
<div class="action-title">2-hour marathon edging session</div>
<div class="effects">Duration: 300s | +45 arousal, -10 control, +2 intensity | Next: endurance_mastery</div>
</div>
</div>
<!-- PATTERN EDGING -->
<div class="step step-action pos-pattern">
<div class="step-id">pattern_edging</div>
<div class="step-type">ACTION</div>
<div class="story">Advanced gooners master sophisticated rhythms and techniques.</div>
<div class="action-box">
<div class="action-title">Advanced edging pattern training</div>
<div class="effects">Duration: 150s | +20 arousal, +15 control | Next: edging_assessment</div>
</div>
</div>
<!-- EDGING ASSESSMENT -->
<div class="step step-choice pos-assess">
<div class="step-id">edging_assessment</div>
<div class="step-type">CHOICE</div>
<div class="story">Your instructor evaluates your edging progress. What aspect would you like to focus on next?</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Continue building endurance</div>
<div class="choice-desc">Work on longer edging sessions</div>
</div>
<div class="choice">
<div class="choice-text">Move to advanced training</div>
<div class="choice-desc">Progress to expert techniques</div>
</div>
<div class="choice">
<div class="choice-text">Explore different training paths</div>
<div class="choice-desc">Try other aspects of gooner training</div>
</div>
</div>
</div>
<!-- ADDICTION PATH -->
<div class="step step-choice pos-addiction">
<div class="step-id">addiction_path</div>
<div class="step-type">CHOICE</div>
<div class="story">Porn addiction is the heart of gooning. Which aspect should we enhance first?</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Increase daily porn consumption</div>
<div class="choice-desc">Train to watch more porn every day</div>
</div>
<div class="choice">
<div class="choice-text">Develop porn dependency habits</div>
<div class="choice-desc">Make porn essential to your daily life</div>
</div>
<div class="choice">
<div class="choice-text">Master porn worship techniques</div>
<div class="choice-desc">Learn to properly worship pornography</div>
</div>
</div>
</div>
<!-- CONSUMPTION TRAINING -->
<div class="step step-action pos-consumption">
<div class="step-id">consumption_training</div>
<div class="step-type">ACTION</div>
<div class="story">Real gooners spend hours every day with porn. We'll train you to consume more.</div>
<div class="action-box">
<div class="action-title">Multi-hour porn consumption while edging</div>
<div class="effects">Duration: 180s | +35 arousal, -15 control | Next: addiction_deepening</div>
</div>
</div>
<!-- DEPENDENCY TRAINING -->
<div class="step step-action pos-dependency">
<div class="step-id">dependency_training</div>
<div class="step-type">ACTION</div>
<div class="story">We'll make porn absolutely essential to your daily life.</div>
<div class="action-box">
<div class="action-title">Porn dependency conditioning session</div>
<div class="effects">Duration: 200s | +30 arousal, -20 control | Next: addiction_deepening</div>
</div>
</div>
<!-- WORSHIP TRAINING -->
<div class="step step-action pos-worship">
<div class="step-id">worship_training</div>
<div class="step-type">ACTION</div>
<div class="story">Porn worship is an art form. You'll learn to truly appreciate pornography.</div>
<div class="action-box">
<div class="action-title">Porn worship and gratitude training</div>
<div class="effects">Duration: 180s | +25 arousal, -15 control | Next: addiction_deepening</div>
</div>
</div>
<!-- ADDICTION DEEPENING -->
<div class="step step-choice pos-deepen">
<div class="step-id">addiction_deepening</div>
<div class="step-type">CHOICE</div>
<div class="story">Your porn dependency is developing beautifully. Let's deepen your addiction even further.</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Increase daily viewing requirements</div>
<div class="choice-desc">Commit to more hours of daily porn</div>
</div>
<div class="choice">
<div class="choice-text">Develop porn craving triggers</div>
<div class="choice-desc">Learn to crave porn constantly</div>
</div>
<div class="choice">
<div class="choice-text">Complete addiction certification</div>
<div class="choice-desc">Graduate as a certified porn addict</div>
</div>
</div>
</div>
<!-- VIEWING COMMITMENT -->
<div class="step step-action pos-viewing">
<div class="step-id">viewing_commitment</div>
<div class="step-type">ACTION</div>
<div class="story">Real porn addicts watch for hours every day. Commit to spending at least 4 hours daily with pornography.</div>
<div class="action-box">
<div class="action-title">Daily porn viewing commitment session</div>
<div class="effects">Duration: 240s | +35 arousal, -25 control | Next: advanced_training</div>
</div>
</div>
<!-- CRAVING TRAINING -->
<div class="step step-action pos-craving">
<div class="step-id">craving_training</div>
<div class="step-type">ACTION</div>
<div class="story">We'll train your brain to crave porn constantly. Every few minutes, you'll think about pornography.</div>
<div class="action-box">
<div class="action-title">Constant porn craving conditioning</div>
<div class="effects">Duration: 210s | +40 arousal, -30 control | Next: advanced_training</div>
</div>
</div>
<!-- ADVANCED TRAINING -->
<div class="step step-choice pos-advanced">
<div class="step-id">advanced_training</div>
<div class="step-type">CHOICE</div>
<div class="story">Outstanding development! You're ready for advanced gooner training.</div>
<div class="choices">
<div class="choice">
<div class="choice-text">Master-level gooning challenges</div>
<div class="choice-desc">Ultimate gooner difficulty tests</div>
</div>
<div class="choice">
<div class="choice-text">Become a certified gooner</div>
<div class="choice-desc">Graduate as a dedicated gooner</div>
</div>
<div class="choice">
<div class="choice-text">Continue advanced edging training</div>
<div class="choice-desc">Further develop your skills</div>
</div>
</div>
</div>
<!-- MASTER GOONING -->
<div class="step step-action pos-master">
<div class="step-id">master_gooning</div>
<div class="step-type">ACTION</div>
<div class="story">This is master-level gooner training. You will edge for 6 hours straight, cycling through different porn categories.</div>
<div class="action-box">
<div class="action-title">Master-level 6-hour gooning marathon</div>
<div class="effects">Duration: 360s | +70 arousal, +40 control, +3 intensity | Next: gooner_graduation</div>
</div>
</div>
<!-- GRADUATION -->
<div class="step step-ending pos-grad">
<div class="step-id">gooner_graduation</div>
<div class="step-type">ENDING</div>
<div class="story">Congratulations! You have completed the Advanced Gooner Training Academy with distinction. You are now a certified gooner.</div>
<div class="action-box">
<div class="action-title">🏆 GOONER CERTIFICATION ACHIEVED!</div>
<div class="effects">Outcome: certified_gooner</div>
</div>
</div>
<!-- ARROWS -->
<div class="arrow" style="top: 180px; left: 1900px; width: 100px;"></div>
<div class="arrow-v" style="top: 180px; left: 2000px; height: 120px;"></div>
<div class="arrow" style="top: 300px; left: 700px; width: 1600px;"></div>
<!-- Edging branch -->
<div class="arrow-v" style="top: 430px; left: 700px; height: 170px;"></div>
<div class="arrow" style="top: 600px; left: 300px; width: 400px;"></div>
<!-- Assessment flow -->
<div class="arrow-v" style="top: 780px; left: 400px; height: 120px;"></div>
<div class="arrow" style="top: 900px; left: 400px; width: 200px;"></div>
<!-- Addiction branch -->
<div class="arrow-v" style="top: 430px; left: 1300px; height: 170px;"></div>
<div class="arrow" style="top: 600px; left: 1300px; width: 700px;"></div>
<!-- Advanced flow -->
<div class="arrow-v" style="top: 1630px; left: 1900px; height: 170px;"></div>
<div class="arrow" style="top: 1800px; left: 1700px; width: 200px;"></div>
<div class="arrow-v" style="top: 1980px; left: 1700px; height: 120px;"></div>
<div class="arrow" style="top: 2100px; left: 1700px; width: 100px;"></div>
<!-- LABELS -->
<div class="label" style="top: 275px; left: 620px;">Edging</div>
<div class="label" style="top: 275px; left: 1220px;">Addiction</div>
<div class="label" style="top: 275px; left: 1820px;">Mindset</div>
<div class="label" style="top: 275px; left: 2420px;">Technique</div>
</div>
</body>
</html>

View File

@ -1,591 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Training Academy - Exact Game Steps</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 20px;
background: linear-gradient(135deg, #1a1a2e, #16213e);
color: #ffffff;
overflow-x: auto;
overflow-y: auto;
}
.tree-container {
min-width: 3000px;
min-height: 1800px;
padding: 20px;
position: relative;
}
.tree-title {
text-align: center;
font-size: 2.5em;
margin-bottom: 40px;
color: #ff6b9d;
text-shadow: 0 0 20px rgba(255, 107, 157, 0.5);
}
.game-step {
position: absolute;
border-radius: 12px;
padding: 16px;
min-width: 320px;
max-width: 380px;
text-align: left;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
border: 2px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
font-size: 0.85em;
line-height: 1.3;
}
.game-step:hover {
transform: scale(1.02);
box-shadow: 0 12px 35px rgba(0, 0, 0, 0.5);
}
.step-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
padding-bottom: 8px;
}
.step-id {
font-size: 0.75em;
color: rgba(255, 255, 255, 0.7);
font-family: monospace;
font-weight: bold;
}
.step-type-badge {
padding: 4px 10px;
border-radius: 12px;
font-size: 0.65em;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.type-choice { background: #4834d4; color: white; }
.type-action { background: #00d2d3; color: white; }
.type-ending { background: #ff9ff3; color: black; }
.game-story {
font-size: 0.8em;
margin-bottom: 14px;
color: #e0e0e0;
line-height: 1.4;
max-height: 140px;
overflow-y: auto;
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 10px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.2);
}
.game-choices {
margin-top: 14px;
}
.game-choice {
background: rgba(255, 107, 157, 0.2);
border: 1px solid rgba(255, 107, 157, 0.4);
border-radius: 8px;
padding: 10px 14px;
margin: 8px 0;
font-size: 0.75em;
cursor: pointer;
transition: all 0.2s ease;
width: 100%;
text-align: left;
}
.game-choice:hover {
background: rgba(255, 107, 157, 0.3);
border-color: #ff6b9d;
transform: translateX(5px);
}
.choice-text {
font-weight: bold;
color: #ff6b9d;
display: block;
margin-bottom: 4px;
}
.choice-description {
font-style: italic;
color: rgba(255, 255, 255, 0.7);
font-size: 0.9em;
}
.action-details {
background: rgba(0, 210, 211, 0.2);
border-radius: 8px;
padding: 12px;
margin-top: 12px;
border: 1px solid rgba(0, 210, 211, 0.3);
}
.action-title {
font-weight: bold;
color: #00d2d3;
margin-bottom: 6px;
font-size: 1.1em;
}
.action-stats {
font-size: 0.7em;
color: rgba(255, 255, 255, 0.6);
font-style: italic;
}
.ending-details {
background: rgba(255, 159, 243, 0.2);
border-radius: 8px;
padding: 12px;
margin-top: 12px;
border: 1px solid rgba(255, 159, 243, 0.3);
}
.ending-title {
font-weight: bold;
color: #ff9ff3;
margin-bottom: 6px;
font-size: 1.2em;
}
.flow-arrow {
position: absolute;
background: linear-gradient(90deg, rgba(255, 107, 157, 0.7), rgba(255, 107, 157, 0.4));
height: 3px;
z-index: -1;
}
.flow-vertical {
background: linear-gradient(180deg, rgba(255, 107, 157, 0.7), rgba(255, 107, 157, 0.4));
width: 3px;
z-index: -1;
}
.path-label {
position: absolute;
background: rgba(255, 107, 157, 0.9);
color: white;
padding: 6px 14px;
border-radius: 16px;
font-size: 0.7em;
font-weight: bold;
z-index: 10;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.2);
}
/* Node backgrounds by type */
.node-start { background: linear-gradient(135deg, #ff6b9d, #c44569); }
.node-choice { background: linear-gradient(135deg, #4834d4, #686de0); }
.node-action { background: linear-gradient(135deg, #00d2d3, #01a3a4); }
.node-ending { background: linear-gradient(135deg, #ff9ff3, #f368e0); }
/* Exact step positioning from game data */
.step-start { top: 60px; left: 1350px; }
/* Main choice branches */
.step-edging-path { top: 320px; left: 450px; }
.step-addiction-path { top: 320px; left: 950px; }
.step-mindset-path { top: 320px; left: 1450px; }
.step-technique-path { top: 320px; left: 1950px; }
/* Edging sub-choices */
.step-basic-edging { top: 580px; left: 150px; }
.step-marathon-edging { top: 580px; left: 500px; }
.step-pattern-edging { top: 580px; left: 700px; }
/* Addiction sub-choices */
.step-consumption-training { top: 580px; left: 850px; }
.step-dependency-training { top: 580px; left: 1050px; }
.step-worship-training { top: 580px; left: 1250px; }
/* Mindset sub-choices */
.step-submission-training { top: 580px; left: 1350px; }
.step-identity-training { top: 580px; left: 1550px; }
.step-lifestyle-training { top: 580px; left: 1750px; }
/* Technique sub-choices */
.step-rhythm-training { top: 580px; left: 1850px; }
.step-pleasure-training { top: 580px; left: 2050px; }
.step-control-training { top: 580px; left: 2250px; }
/* Assessment and progression */
.step-edging-assessment { top: 840px; left: 450px; }
.step-addiction-deepening { top: 840px; left: 1050px; }
.step-endurance-mastery { top: 1100px; left: 650px; }
.step-advanced-training { top: 1360px; left: 1350px; }
.step-viewing-commitment { top: 1100px; left: 850px; }
.step-craving-training { top: 1100px; left: 1250px; }
.step-master-gooning { top: 1620px; left: 1150px; }
.step-gooner-graduation { top: 1880px; left: 1350px; }
.zoom-controls {
position: fixed;
bottom: 20px;
right: 20px;
display: flex;
gap: 10px;
z-index: 1000;
}
.zoom-btn {
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
color: white;
padding: 12px 16px;
border-radius: 12px;
cursor: pointer;
backdrop-filter: blur(10px);
transition: all 0.3s ease;
font-weight: bold;
}
.zoom-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: scale(1.05);
}
.zoom-level {
background: rgba(0, 0, 0, 0.7);
padding: 12px 16px;
border-radius: 12px;
backdrop-filter: blur(10px);
font-size: 0.9em;
color: white;
font-weight: bold;
border: 1px solid rgba(255, 255, 255, 0.2);
}
</style>
</head>
<body>
<div class="tree-container">
<h1 class="tree-title">🎓 Training Academy - Exact Game Steps</h1>
<!-- START STEP -->
<div class="game-step node-start step-start">
<div class="step-header">
<div class="step-id">start</div>
<div class="step-type-badge type-choice">choice</div>
</div>
<div class="game-story">
"Welcome to the Gooner Training Academy. Your instructor looks you up and down with approval. 'I can see you're ready to become a dedicated gooner. We'll train you to edge longer, watch more porn, and develop proper gooning habits. Which area of gooner training would you like to focus on first?'"
</div>
<div class="game-choices">
<div class="game-choice">
<span class="choice-text">Edging endurance training</span>
<span class="choice-description">Learn to edge for hours without cumming</span>
</div>
<div class="game-choice">
<span class="choice-text">Porn addiction enhancement</span>
<span class="choice-description">Deepen your love and need for pornography</span>
</div>
<div class="game-choice">
<span class="choice-text">Gooning mindset development</span>
<span class="choice-description">Embrace the gooner lifestyle completely</span>
</div>
<div class="game-choice">
<span class="choice-text">Advanced masturbation techniques</span>
<span class="choice-description">Master sophisticated stroking methods</span>
</div>
</div>
</div>
<!-- EDGING PATH -->
<div class="game-step node-choice step-edging-path">
<div class="step-header">
<div class="step-id">edging_path</div>
<div class="step-type-badge type-choice">choice</div>
</div>
<div class="game-story">
"Your instructor leads you to the edging training area. 'Real gooners can edge for hours, building arousal without release. This is the foundation of gooning - the ability to stay on the edge indefinitely while worshipping porn. How would you like to begin your edging training?'"
</div>
<div class="game-choices">
<div class="game-choice">
<span class="choice-text">Start with basic 30-minute edges</span>
<span class="choice-description">Build fundamental edging skills</span>
</div>
<div class="game-choice">
<span class="choice-text">Jump to marathon edging sessions</span>
<span class="choice-description">Train for multi-hour gooning</span>
</div>
<div class="game-choice">
<span class="choice-text">Learn advanced edging patterns</span>
<span class="choice-description">Master complex stroking rhythms</span>
</div>
</div>
</div>
<!-- BASIC EDGING -->
<div class="game-step node-action step-basic-edging">
<div class="step-header">
<div class="step-id">basic_edging</div>
<div class="step-type-badge type-action">action</div>
</div>
<div class="game-story">
"Your instructor guides you through proper edging technique. 'Start slow, build arousal over 30 minutes. Feel how the porn makes you throb. This is just the beginning - real gooners edge for hours. Focus on the pleasure, worship the porn, but don't you dare cum.'"
</div>
<div class="action-details">
<div class="action-title">30-minute basic edging training session</div>
<div class="action-stats">Duration: 120 seconds | Effects: +25 arousal, +15 control | Next: edging_assessment</div>
</div>
</div>
<!-- MARATHON EDGING -->
<div class="game-step node-action step-marathon-edging">
<div class="step-header">
<div class="step-id">marathon_edging</div>
<div class="step-type-badge type-action">action</div>
</div>
<div class="game-story">
"Your instructor nods approvingly. 'Ambitious! Let's see if you can handle real gooner training. Edge continuously for 2 hours, building and building but never cumming. Feel how the porn controls you, how your cock throbs for it. This is what true gooners do - they live on the edge.'"
</div>
<div class="action-details">
<div class="action-title">2-hour marathon edging session</div>
<div class="action-stats">Duration: 300 seconds | Effects: +45 arousal, -10 control, +2 intensity | Next: endurance_mastery</div>
</div>
</div>
<!-- PATTERN EDGING -->
<div class="game-step node-action step-pattern-edging">
<div class="step-header">
<div class="step-id">pattern_edging</div>
<div class="step-type-badge type-action">action</div>
</div>
<div class="game-story">
"Your instructor demonstrates complex stroking patterns. 'Advanced gooners master sophisticated rhythms and techniques. You'll learn variable speed patterns, pressure control, and rhythm changes that maximize arousal while maintaining perfect edge control.'"
</div>
<div class="action-details">
<div class="action-title">Advanced edging pattern training</div>
<div class="action-stats">Duration: 150 seconds | Effects: +20 arousal, +15 control | Next: edging_assessment</div>
</div>
</div>
<!-- EDGING ASSESSMENT -->
<div class="game-step node-choice step-edging-assessment">
<div class="step-header">
<div class="step-id">edging_assessment</div>
<div class="step-type-badge type-choice">choice</div>
</div>
<div class="game-story">
"Your instructor evaluates your edging progress. 'Good foundation! Now let's see how ready you are for more advanced training. Your edging skills are developing nicely. What aspect would you like to focus on next?'"
</div>
<div class="game-choices">
<div class="game-choice">
<span class="choice-text">Continue building endurance</span>
<span class="choice-description">Work on longer edging sessions</span>
</div>
<div class="game-choice">
<span class="choice-text">Move to advanced training</span>
<span class="choice-description">Progress to expert techniques</span>
</div>
<div class="game-choice">
<span class="choice-text">Explore different training paths</span>
<span class="choice-description">Try other aspects of gooner training</span>
</div>
</div>
</div>
<!-- ADDICTION PATH -->
<div class="game-step node-choice step-addiction-path">
<div class="step-header">
<div class="step-id">addiction_path</div>
<div class="step-type-badge type-choice">choice</div>
</div>
<div class="game-story">
"Your instructor's eyes light up. 'Excellent choice. Porn addiction is the heart of gooning. We'll deepen your need for pornography, make you crave it more than anything else. Which aspect of porn addiction should we enhance first?'"
</div>
<div class="game-choices">
<div class="game-choice">
<span class="choice-text">Increase daily porn consumption</span>
<span class="choice-description">Train to watch more porn every day</span>
</div>
<div class="game-choice">
<span class="choice-text">Develop porn dependency habits</span>
<span class="choice-description">Make porn essential to your daily life</span>
</div>
<div class="game-choice">
<span class="choice-text">Master porn worship techniques</span>
<span class="choice-description">Learn to properly worship pornography</span>
</div>
</div>
</div>
<!-- ADVANCED TRAINING -->
<div class="game-step node-choice step-advanced-training">
<div class="step-header">
<div class="step-id">advanced_training</div>
<div class="step-type-badge type-choice">choice</div>
</div>
<div class="game-story">
"Your instructor reviews your progress with satisfaction. 'Outstanding development! You're ready for advanced gooner training. These techniques will make you a true porn addict and dedicated gooner.'"
</div>
<div class="game-choices">
<div class="game-choice">
<span class="choice-text">Master-level gooning challenges</span>
<span class="choice-description">Ultimate gooner difficulty tests</span>
</div>
<div class="game-choice">
<span class="choice-text">Become a certified gooner</span>
<span class="choice-description">Graduate as a dedicated gooner</span>
</div>
<div class="game-choice">
<span class="choice-text">Continue advanced edging training</span>
<span class="choice-description">Further develop your skills</span>
</div>
</div>
</div>
<!-- MASTER GOONING -->
<div class="game-step node-action step-master-gooning">
<div class="step-header">
<div class="step-id">master_gooning</div>
<div class="step-type-badge type-action">action</div>
</div>
<div class="game-story">
"Your instructor presents the ultimate challenge. 'This is master-level gooner training. You will edge for 6 hours straight, cycling through different porn categories, changing techniques every 30 minutes, while maintaining perfect arousal without cumming. This is what separates casual masturbators from true gooners.'"
</div>
<div class="action-details">
<div class="action-title">Master-level 6-hour gooning marathon</div>
<div class="action-stats">Duration: 360 seconds | Effects: +70 arousal, +40 control, +3 intensity | Next: gooner_graduation</div>
</div>
</div>
<!-- FINAL GRADUATION -->
<div class="game-step node-ending step-gooner-graduation">
<div class="step-header">
<div class="step-id">gooner_graduation</div>
<div class="step-type-badge type-ending">ending</div>
</div>
<div class="game-story">
"Your instructor stands and salutes you. 'Congratulations! You have completed the Advanced Gooner Training Academy with distinction. You are now a certified gooner, dedicated to porn and masturbation. Your commitment to edging and porn worship is exemplary.'"
</div>
<div class="ending-details">
<div class="ending-title">🏆 GOONER CERTIFICATION ACHIEVED!</div>
<div class="action-stats">Final state: Arousal {arousal}, Control {control}, Intensity {intensity}. You are now a certified dedicated gooner, committed to spending your life edging to pornography. Outcome: certified_gooner</div>
</div>
</div>
<!-- FLOW CONNECTIONS -->
<div class="flow-arrow" style="top: 190px; left: 1450px; width: 200px;"></div>
<div class="flow-vertical" style="top: 190px; left: 1650px; height: 130px;"></div>
<div class="flow-arrow" style="top: 320px; left: 550px; width: 1300px;"></div>
<!-- Edging branch flows -->
<div class="flow-vertical" style="top: 450px; left: 550px; height: 130px;"></div>
<div class="flow-arrow" style="top: 580px; left: 250px; width: 300px;"></div>
<!-- Assessment flows -->
<div class="flow-vertical" style="top: 710px; left: 325px; height: 130px;"></div>
<div class="flow-arrow" style="top: 840px; left: 325px; width: 125px;"></div>
<!-- Advanced training flows -->
<div class="flow-vertical" style="top: 1490px; left: 1450px; height: 130px;"></div>
<div class="flow-arrow" style="top: 1620px; left: 1250px; width: 200px;"></div>
<div class="flow-vertical" style="top: 1750px; left: 1250px; height: 130px;"></div>
<div class="flow-arrow" style="top: 1880px; left: 1250px; width: 100px;"></div>
<!-- PATH LABELS -->
<div class="path-label" style="top: 295px; left: 470px;">Edging endurance training</div>
<div class="path-label" style="top: 295px; left: 970px;">Porn addiction enhancement</div>
<div class="path-label" style="top: 295px; left: 1470px;">Gooning mindset development</div>
<div class="path-label" style="top: 295px; left: 1970px;">Advanced masturbation techniques</div>
</div>
<!-- ZOOM CONTROLS -->
<div class="zoom-controls">
<button class="zoom-btn" onclick="zoomOut()">🔍-</button>
<div class="zoom-level" id="zoomLevel">100%</div>
<button class="zoom-btn" onclick="zoomIn()">🔍+</button>
<button class="zoom-btn" onclick="resetZoom()">⚙️</button>
</div>
<script>
let currentZoom = 1;
const zoomStep = 0.1;
const minZoom = 0.3;
const maxZoom = 2.0;
function updateZoom() {
const container = document.querySelector('.tree-container');
container.style.transform = `scale(${currentZoom})`;
container.style.transformOrigin = 'top left';
document.getElementById('zoomLevel').textContent = Math.round(currentZoom * 100) + '%';
}
function zoomIn() {
if (currentZoom < maxZoom) {
currentZoom = Math.min(currentZoom + zoomStep, maxZoom);
updateZoom();
}
}
function zoomOut() {
if (currentZoom > minZoom) {
currentZoom = Math.max(currentZoom - zoomStep, minZoom);
updateZoom();
}
}
function resetZoom() {
currentZoom = 1;
updateZoom();
}
// Keyboard shortcuts
document.addEventListener('keydown', function(e) {
if (e.ctrlKey || e.metaKey) {
if (e.key === '=' || e.key === '+') {
e.preventDefault();
zoomIn();
} else if (e.key === '-') {
e.preventDefault();
zoomOut();
} else if (e.key === '0') {
e.preventDefault();
resetZoom();
}
}
});
// Visual feedback for node clicks
document.querySelectorAll('.game-step').forEach(node => {
node.addEventListener('click', function() {
this.style.transform = 'scale(1.05)';
setTimeout(() => {
this.style.transform = 'scale(1.02)';
}, 200);
});
});
// Show step details on hover
document.querySelectorAll('.game-step').forEach(node => {
node.addEventListener('mouseenter', function() {
this.style.borderColor = '#ff6b9d';
this.style.borderWidth = '3px';
});
node.addEventListener('mouseleave', function() {
this.style.borderColor = 'rgba(255, 255, 255, 0.3)';
this.style.borderWidth = '2px';
});
});
</script>
</body>
</html>

66
scripts/remove-effects.js Normal file
View File

@ -0,0 +1,66 @@
/**
* Script to remove all arousal/control/intensity effects from game mode data files
*/
const fs = require('fs');
const path = require('path');
const gameModeFiles = [
'src/data/modes/trainingGameData.js',
'src/data/modes/humiliationGameData.js',
'src/data/modes/dressUpGameData.js',
'src/data/modes/enduranceGameData.js'
];
function removeEffectsFromFile(filePath) {
console.log(`Processing: ${filePath}`);
let content = fs.readFileSync(filePath, 'utf8');
// Remove effects objects with various formats
// Match: effects: { ... },
content = content.replace(/\s*effects: \{[^}]*\},?\s*/g, '');
// Remove effects objects without trailing comma
content = content.replace(/\s*effects: \{[^}]*\}\s*/g, '');
// Clean up any orphaned commas and spacing issues
content = content.replace(/,(\s*nextStep:)/g, '\n $1');
content = content.replace(/,(\s*\})/g, '$1');
// Remove effects from ending text interpolation
content = content.replace(/\{arousal\}/g, 'HIGH');
content = content.replace(/\{control\}/g, 'VARIABLE');
content = content.replace(/\{intensity\}/g, 'MAXIMUM');
// Clean up any references to arousal/control/intensity in story text
content = content.replace(/building arousal/g, 'building excitement');
content = content.replace(/Your arousal/g, 'Your excitement');
content = content.replace(/maximize arousal/g, 'maximize pleasure');
content = content.replace(/maintaining arousal/g, 'maintaining excitement');
content = content.replace(/perfect arousal/g, 'perfect excitement');
content = content.replace(/arousal level/g, 'excitement level');
content = content.replace(/control is /g, 'focus is ');
content = content.replace(/edge control/g, 'edge focus');
content = content.replace(/perfect control/g, 'perfect focus');
fs.writeFileSync(filePath, content);
console.log(`Completed: ${filePath}`);
}
function main() {
console.log('Removing arousal/control/intensity effects from game mode files...');
gameModeFiles.forEach(file => {
const fullPath = path.join(process.cwd(), file);
if (fs.existsSync(fullPath)) {
removeEffectsFromFile(fullPath);
} else {
console.log(`File not found: ${fullPath}`);
}
});
console.log('All effects removed successfully!');
}
main();

View File

@ -62,29 +62,25 @@ const dressUpGameData = {
{
text: "Forced feminization makeover",
type: "feminization",
preview: "Complete transformation into a sissy",
effects: { arousal: 15, control: -10 },
preview: "Complete transformation into a sissy"
nextStep: "feminization_path"
},
{
text: "Humiliating sissy maid outfit",
type: "maid",
preview: "Degrading maid costume and poses",
effects: { arousal: 20, control: -15 },
preview: "Degrading maid costume and poses"
nextStep: "maid_path"
},
{
text: "Slutty schoolgirl transformation",
type: "schoolgirl",
preview: "Inappropriate schoolgirl outfit and poses",
effects: { arousal: 18, control: -12 },
preview: "Inappropriate schoolgirl outfit and poses"
nextStep: "schoolgirl_path"
},
{
text: "Bimbo princess dress-up",
type: "bimbo",
preview: "Over-the-top feminine and degrading",
effects: { arousal: 25, control: -20 },
preview: "Over-the-top feminine and degrading"
nextStep: "bimbo_path"
}
]
@ -94,36 +90,32 @@ const dressUpGameData = {
mood: 'humiliating',
story: "The photographer forces you into a frilly pink dress, applies makeup to your face, and puts a blonde wig on your head. 'Look at what a pathetic little sissy you make! Edge while I take pictures of your humiliation. The more aroused you get, the more feminine and submissive you'll look in the photos.'",
actionText: "Edge while being feminized and photographed",
duration: 240,
effects: { arousal: 30, control: -15 },
nextStep: "feminization_progression"
duration: 240
nextStep: "feminization_progression"
},
maid_path: {
type: 'action',
mood: 'degrading',
story: "The photographer hands you a skimpy maid outfit with a short frilly skirt. 'Put this on, sissy maid. You're going to pose like the submissive little servant you are. Edge while I photograph your humiliation. Show me how pathetic you look in that outfit.'",
actionText: "Edge while posing as a degraded sissy maid",
duration: 300,
effects: { arousal: 35, control: -20 },
nextStep: "maid_progression"
duration: 300
nextStep: "maid_progression"
},
schoolgirl_path: {
type: 'action',
mood: 'inappropriate',
story: "The photographer tosses you a slutty schoolgirl outfit - tiny plaid skirt, tight white shirt, and pigtails. 'Time to play dress-up, little girl. You're going to pose like the naughty schoolgirl slut you are. Edge while I capture your shame.'",
actionText: "Edge while posing as a slutty schoolgirl",
duration: 180,
effects: { arousal: 40, control: -25 },
nextStep: "schoolgirl_progression"
duration: 180
nextStep: "schoolgirl_progression"
},
bimbo_path: {
type: 'action',
mood: 'bimbo',
story: "The photographer pulls out the most degrading outfit yet - a hot pink mini dress, massive fake breasts, blonde bimbo wig, and platform heels. 'Time to complete your transformation into a brainless bimbo slut. Edge while I photograph how pathetic and desperate you look. Show me what a dumb little bimbo you are.'",
actionText: "Edge while posing as a humiliated bimbo",
duration: 360,
effects: { arousal: 45, control: -30 },
nextStep: "bimbo_progression"
duration: 360
nextStep: "bimbo_progression"
},
feminization_progression: {
type: 'choice',
@ -133,15 +125,13 @@ const dressUpGameData = {
{
text: "Take sissy humiliation photos now",
type: "photography",
preview: "Capture your feminized shame",
effects: { arousal: 10, control: -5 },
preview: "Capture your feminized shame"
nextStep: "feminization_photo_session"
},
{
text: "More extreme feminization",
type: "extreme_feminization",
preview: "Push your sissy transformation further",
effects: { arousal: 20, control: -15 },
preview: "Push your sissy transformation further"
nextStep: "extreme_feminization_path"
}
]
@ -154,15 +144,13 @@ const dressUpGameData = {
{
text: "Take maid humiliation photos now",
type: "photography",
preview: "Document your maid degradation",
effects: { arousal: 15, control: -10 },
preview: "Document your maid degradation"
nextStep: "maid_photo_session"
},
{
text: "Force you to clean while dressed as maid",
type: "cleaning",
preview: "Humiliating cleaning tasks",
effects: { arousal: 20, control: -15 },
preview: "Humiliating cleaning tasks"
nextStep: "cleaning_path"
}
]
@ -175,15 +163,13 @@ const dressUpGameData = {
{
text: "Take slutty schoolgirl photos now",
type: "photography",
preview: "Capture your schoolgirl shame",
effects: { arousal: 18, control: -12 },
preview: "Capture your schoolgirl shame"
nextStep: "schoolgirl_photo_session"
},
{
text: "Pose in even more inappropriate positions",
type: "inappropriate",
preview: "More degrading schoolgirl poses",
effects: { arousal: 25, control: -18 },
preview: "More degrading schoolgirl poses"
nextStep: "inappropriate_path"
}
]
@ -196,15 +182,13 @@ const dressUpGameData = {
{
text: "Take bimbo humiliation photos now",
type: "photography",
preview: "Capture your bimbo transformation",
effects: { arousal: 25, control: -20 },
preview: "Capture your bimbo transformation"
nextStep: "bimbo_photo_session"
},
{
text: "Force you to act like a brainless bimbo",
type: "bimbo_act",
preview: "Humiliating bimbo behavior",
effects: { arousal: 30, control: -25 },
preview: "Humiliating bimbo behavior"
nextStep: "bimbo_act_path"
}
]
@ -213,28 +197,28 @@ const dressUpGameData = {
type: 'ending',
mood: 'sissy_documented',
story: "The photographer reviews the humiliating sissy photos. 'Perfect shots! Every photo captures your feminization and humiliation beautifully. You're documented as a complete sissy now.'",
endingText: "Feminization photography completed. Final state: Arousal {arousal}, Control {control}. Your sissy transformation has been documented.",
endingText: "Feminization photography completed. Final state: Arousal HIGH, Control VARIABLE. Your sissy transformation has been documented.",
outcome: "documented_sissy"
},
maid_photo_session: {
type: 'ending',
mood: 'maid_documented',
story: "The photographer looks through the degrading maid photos. 'Excellent! These photos show what a pathetic little servant you are. Your humiliation is perfectly captured.'",
endingText: "Maid humiliation photography completed. Final state: Arousal {arousal}, Control {control}. Your maid degradation has been documented.",
endingText: "Maid humiliation photography completed. Final state: Arousal HIGH, Control VARIABLE. Your maid degradation has been documented.",
outcome: "documented_maid"
},
schoolgirl_photo_session: {
type: 'ending',
mood: 'schoolgirl_documented',
story: "The photographer reviews the slutty schoolgirl photos. 'Incredible shots! You look so inappropriate and shameful. Every photo captures your schoolgirl slut transformation.'",
endingText: "Schoolgirl photography completed. Final state: Arousal {arousal}, Control {control}. Your schoolgirl shame has been documented.",
endingText: "Schoolgirl photography completed. Final state: Arousal HIGH, Control VARIABLE. Your schoolgirl shame has been documented.",
outcome: "documented_schoolgirl"
},
bimbo_photo_session: {
type: 'ending',
mood: 'bimbo_documented',
story: "The photographer can't stop laughing at the bimbo photos. 'These are perfect! You look like such a brainless slut. Every photo captures your complete bimbo transformation.'",
endingText: "Bimbo photography completed. Final state: Arousal {arousal}, Control {control}. Your bimbo transformation has been documented.",
endingText: "Bimbo photography completed. Final state: Arousal HIGH, Control VARIABLE. Your bimbo transformation has been documented.",
outcome: "documented_bimbo"
},
extreme_feminization_path: {
@ -242,15 +226,14 @@ const dressUpGameData = {
mood: 'extreme_humiliation',
story: "The photographer pulls out even more degrading feminine items - a frilly baby doll dress, excessive makeup, and humiliating accessories. 'Time to push your feminization to the extreme! You're going to become the most pathetic sissy possible. Edge while I document your complete transformation into a humiliated sissy slut.'",
actionText: "Edge while undergoing extreme feminization",
duration: 300,
effects: { arousal: 40, control: -25 },
nextStep: "extreme_feminization_completion"
duration: 300
nextStep: "extreme_feminization_completion"
},
extreme_feminization_completion: {
type: 'ending',
mood: 'extreme_sissy_documented',
story: "The photographer reviews the extreme feminization photos with delight. 'Absolutely perfect! These photos show your complete transformation into the most pathetic sissy possible. Every shot captures your extreme feminization and total humiliation.'",
endingText: "Extreme feminization completed. Final state: Arousal {arousal}, Control {control}. You have been transformed into the ultimate sissy and it's all documented.",
endingText: "Extreme feminization completed. Final state: Arousal HIGH, Control VARIABLE. You have been transformed into the ultimate sissy and it's all documented.",
outcome: "extreme_sissy_documented"
},
cleaning_path: {
@ -258,15 +241,14 @@ const dressUpGameData = {
mood: 'maid_degradation',
story: "The photographer hands you cleaning supplies. 'Time to put that maid outfit to use! You're going to clean this studio while I photograph your humiliation. Edge while you work like the pathetic little servant you are.'",
actionText: "Edge while performing humiliating cleaning tasks",
duration: 240,
effects: { arousal: 25, control: -15 },
nextStep: "cleaning_completion"
duration: 240
nextStep: "cleaning_completion"
},
cleaning_completion: {
type: 'ending',
mood: 'maid_servant_documented',
story: "The photographer laughs at the photos of you cleaning while dressed as a maid. 'Perfect! These photos show what a degraded little servant you are. Your humiliation while doing menial labor is beautifully captured.'",
endingText: "Maid cleaning session completed. Final state: Arousal {arousal}, Control {control}. Your degradation as a servant has been documented.",
endingText: "Maid cleaning session completed. Final state: Arousal HIGH, Control VARIABLE. Your degradation as a servant has been documented.",
outcome: "maid_servant_documented"
},
inappropriate_path: {
@ -274,15 +256,14 @@ const dressUpGameData = {
mood: 'schoolgirl_degradation',
story: "The photographer directs you into increasingly inappropriate and shameful poses. 'Spread your legs wider! Bend over more! Show me how slutty you can be in that schoolgirl outfit. Edge while I capture every shameful moment.'",
actionText: "Edge while posing in degrading schoolgirl positions",
duration: 180,
effects: { arousal: 35, control: -20 },
nextStep: "inappropriate_completion"
duration: 180
nextStep: "inappropriate_completion"
},
inappropriate_completion: {
type: 'ending',
mood: 'schoolgirl_slut_documented',
story: "The photographer reviews the inappropriate schoolgirl photos with satisfaction. 'These are incredibly shameful! Every photo captures how much of a slutty schoolgirl you are. Your inappropriate behavior is perfectly documented.'",
endingText: "Inappropriate schoolgirl session completed. Final state: Arousal {arousal}, Control {control}. Your shameful schoolgirl behavior has been documented.",
endingText: "Inappropriate schoolgirl session completed. Final state: Arousal HIGH, Control VARIABLE. Your shameful schoolgirl behavior has been documented.",
outcome: "schoolgirl_slut_documented"
},
bimbo_act_path: {
@ -290,22 +271,21 @@ const dressUpGameData = {
mood: 'bimbo_behavior',
story: "The photographer forces you to act like a brainless bimbo. 'Talk like a dumb slut! Giggle constantly! Show me how stupid you can be! Edge while acting like the brainless bimbo you've become while I photograph your pathetic behavior.'",
actionText: "Edge while acting like a brainless bimbo",
duration: 300,
effects: { arousal: 40, control: -30 },
nextStep: "bimbo_act_completion"
duration: 300
nextStep: "bimbo_act_completion"
},
bimbo_act_completion: {
type: 'ending',
mood: 'bimbo_behavior_documented',
story: "The photographer can't stop laughing at the photos of you acting like a brainless bimbo. 'These are hilarious! Every photo captures how stupid and desperate you are. Your complete bimbo transformation is perfectly documented.'",
endingText: "Bimbo behavior session completed. Final state: Arousal {arousal}, Control {control}. Your brainless bimbo behavior has been documented.",
endingText: "Bimbo behavior session completed. Final state: Arousal HIGH, Control VARIABLE. Your brainless bimbo behavior has been documented.",
outcome: "bimbo_behavior_documented"
},
completion: {
type: 'ending',
mood: 'satisfied',
story: "The photographer reviews the humiliating photos with satisfaction. 'Perfect! These photos capture your complete transformation and degradation. You're now documented as the sissy you truly are.'",
endingText: "Photo session complete. Final state: Arousal {arousal}, Control {control}. Your feminization has been permanently documented.",
endingText: "Photo session complete. Final state: Arousal HIGH, Control VARIABLE. Your feminization has been permanently documented.",
outcome: "feminized_documented"
}
}

View File

@ -22,29 +22,25 @@ const enduranceGameData = {
{
text: "Beginner - I can edge for under a minute",
type: "beginner",
preview: "Start with short 30-second sessions",
effects: { arousal: 5, intensity: 1 },
preview: "Start with short 30-second sessions"
nextStep: "beginner_path"
},
{
text: "Intermediate - I can edge for 2-5 minutes",
type: "intermediate",
preview: "Train with 2-3 minute sessions",
effects: { arousal: 10, intensity: 2 },
preview: "Train with 2-3 minute sessions"
nextStep: "intermediate_path"
},
{
text: "Advanced - I can edge for 5+ minutes",
type: "advanced",
preview: "Challenge yourself with 5-10 minute sessions",
effects: { arousal: 15, intensity: 3 },
preview: "Challenge yourself with 5-10 minute sessions"
nextStep: "advanced_path"
},
{
text: "Expert - I can edge for 10+ minutes easily",
type: "expert",
preview: "Master-level endurance training",
effects: { arousal: 20, intensity: 4 },
preview: "Master-level endurance training"
nextStep: "expert_path"
}
]
@ -52,60 +48,53 @@ const enduranceGameData = {
beginner_path: {
type: 'action',
mood: 'encouraging',
story: "Your trainer nods approvingly. 'Perfect starting point. We'll build your endurance gradually. Start with 30 seconds of steady edging - focus on maintaining arousal without going over. This is your foundation.'",
story: "Your trainer nods approvingly. 'Perfect starting point. We'll build your endurance gradually. Start with 30 seconds of steady edging - focus on maintaining excitement without going over. This is your foundation.'",
actionText: "30-second beginner endurance training",
duration: 30,
effects: { arousal: 15, control: 10 },
nextStep: "progression_assessment"
duration: 30
nextStep: "progression_assessment"
},
intermediate_path: {
type: 'action',
mood: 'instructional',
story: "Your trainer sets a 2-minute timer. 'Good experience level. Let's work on extending your current abilities. Edge steadily for 2 minutes, maintaining consistent arousal. Feel how your endurance improves with practice.'",
actionText: "2-minute intermediate endurance session",
duration: 120,
effects: { arousal: 25, control: 15 },
nextStep: "progression_assessment"
duration: 120
nextStep: "progression_assessment"
},
advanced_path: {
type: 'action',
mood: 'challenging',
story: "Your trainer sets a 5-minute timer. 'Excellent foundation! Now we push your limits. Edge for 5 full minutes without cumming. This is where real gooners distinguish themselves from casual masturbators.'",
actionText: "5-minute advanced endurance challenge",
duration: 300,
effects: { arousal: 35, control: 20 },
nextStep: "progression_assessment"
duration: 300
nextStep: "progression_assessment"
},
expert_path: {
type: 'action',
mood: 'intense',
story: "Your trainer sets a 10-minute timer. 'Impressive experience! Let's test your true limits. Edge for a full 10 minutes, maintaining peak arousal without release. Only dedicated gooners can achieve this level of endurance.'",
actionText: "10-minute expert endurance marathon",
duration: 600,
effects: { arousal: 45, control: 25 },
nextStep: "mastery_assessment"
duration: 600
nextStep: "mastery_assessment"
},
progression_assessment: {
type: 'choice',
mood: 'evaluating',
story: "Your trainer observes your performance with satisfaction. 'Good progress! Your arousal is at {arousal} and control at {control}. Ready to increase the challenge and build even more endurance?'",
story: "Your trainer observes your performance with satisfaction. 'Good progress! Your excitement is at HIGH and control at VARIABLE. Ready to increase the challenge and build even more endurance?'",
choices: [
{
text: "Yes, increase the timer by 1 minute",
preview: "Step up to the next level",
effects: { intensity: 1 },
preview: "Step up to the next level"
nextStep: "step_up_training"
},
{
text: "Double my current endurance time",
preview: "Major challenge increase",
effects: { arousal: 10, intensity: 2 },
preview: "Major challenge increase"
nextStep: "double_training"
},
{
text: "I want the maximum challenge",
preview: "Jump to 10-minute sessions",
effects: { arousal: 20, intensity: 3 },
preview: "Jump to 10-minute sessions"
nextStep: "maximum_training"
}
]
@ -115,41 +104,38 @@ const enduranceGameData = {
mood: 'progressive',
story: "Your trainer adds 1 minute to your timer. 'Gradual progression builds solid endurance. Edge for this extended time - feel how your stamina improves with each session.'",
actionText: "Progressive endurance step-up session",
duration: 180,
effects: { arousal: 30, control: 20 },
nextStep: "endurance_mastery"
duration: 180
nextStep: "endurance_mastery"
},
double_training: {
type: 'action',
mood: 'ambitious',
story: "Your trainer doubles your timer. 'Ambitious! This is how real progress happens. Edge for double your previous time - push through the mental barriers and build true gooning endurance.'",
actionText: "Double endurance challenge session",
duration: 360,
effects: { arousal: 40, control: 25 },
nextStep: "endurance_mastery"
duration: 360
nextStep: "endurance_mastery"
},
maximum_training: {
type: 'action',
mood: 'extreme',
story: "Your trainer sets the maximum 10-minute timer. 'Ultimate endurance challenge! Only the most dedicated gooners can maintain arousal for this long. Prove your commitment to the gooning lifestyle.'",
actionText: "Maximum 10-minute endurance marathon",
duration: 600,
effects: { arousal: 50, control: 30 },
nextStep: "mastery_assessment"
duration: 600
nextStep: "mastery_assessment"
},
mastery_assessment: {
type: 'choice',
mood: 'impressed',
story: "Your trainer watches in amazement. 'Outstanding endurance demonstration! You've shown real dedication. With your current arousal at {arousal} and control at {control}, what's your next goal?'",
story: "Your trainer watches in amazement. 'Outstanding endurance demonstration! You've shown real dedication. With your current arousal at HIGH and control at VARIABLE, what's your next goal?'",
choices: [
{
text: "Master even longer sessions",
preview: "Continue building endurance",
preview: "Continue building endurance"
nextStep: "endurance_mastery"
},
{
text: "Graduate as an endurance expert",
preview: "Complete your training",
preview: "Complete your training"
nextStep: "endurance_graduation"
}
]
@ -157,17 +143,16 @@ const enduranceGameData = {
endurance_mastery: {
type: 'action',
mood: 'masterful',
story: "Your trainer presents the ultimate endurance test. 'This is mastery level - edge for the full 10 minutes with perfect control. Feel the power of true gooning endurance as you maintain arousal without release.'",
story: "Your trainer presents the ultimate endurance test. 'This is mastery level - edge for the full 10 minutes with perfect focus. Feel the power of true gooning endurance as you maintain arousal without release.'",
actionText: "Mastery-level 10-minute endurance test",
duration: 600,
effects: { arousal: 60, control: 35 },
nextStep: "endurance_graduation"
duration: 600
nextStep: "endurance_graduation"
},
endurance_graduation: {
type: 'ending',
mood: 'accomplished',
story: "Your trainer stands and applauds. 'Congratulations! You have mastered gooning endurance. Your ability to maintain arousal for extended periods makes you a true dedicated gooner. You've earned your endurance certification.'",
endingText: "ENDURANCE MASTERY ACHIEVED! Final state: Arousal {arousal}, Control {control}. You are now certified in advanced gooning endurance - capable of extended sessions that prove your dedication.",
endingText: "ENDURANCE MASTERY ACHIEVED! Final state: Arousal HIGH, Control VARIABLE. You are now certified in advanced gooning endurance - capable of extended sessions that prove your dedication.",
outcome: "endurance_master"
}
}
@ -184,15 +169,14 @@ const enduranceGameData = {
interactiveType: "focus-hold",
story: "Build basic endurance with short sessions designed for beginners.",
duration: 30,
instructions: "Focus on maintaining arousal for 30 seconds - this is your foundation",
instructions: "Focus on maintaining excitement for 30 seconds - this is your foundation",
interactiveData: {
title: "Beginner Endurance Building",
description: "Build basic endurance with short sessions...",
initialText: "Start slow, focus on maintaining arousal for 30 seconds...",
initialText: "Start slow, focus on maintaining excitement for 30 seconds...",
sustainText: "Good! Keep that steady rhythm going...",
breakText: "Stay focused, you're building endurance...",
successText: "Perfect! You completed your first endurance milestone.",
intensity: 1
successText: "Perfect! You completed your first endurance milestone."
}
},
{
@ -202,15 +186,14 @@ const enduranceGameData = {
interactiveType: "focus-hold",
story: "Extend your capabilities with 2-minute endurance sessions.",
duration: 120,
instructions: "Focus on maintaining arousal for 2 full minutes",
instructions: "Focus on maintaining excitement for 2 full minutes",
interactiveData: {
title: "Intermediate Endurance Development",
description: "Extend your capabilities with 2-minute sessions...",
initialText: "Focus on maintaining arousal for 2 full minutes...",
sustainText: "Excellent control! Keep building that endurance...",
initialText: "Focus on maintaining excitement for 2 full minutes...",
sustainText: "Excellent focus! Keep building that endurance...",
breakText: "Don't stop now, you're developing real stamina...",
successText: "Outstanding! Your endurance is clearly improving.",
intensity: 2
successText: "Outstanding! Your endurance is clearly improving."
}
},
{
@ -225,10 +208,9 @@ const enduranceGameData = {
title: "Advanced Endurance Challenge",
description: "Push your limits with 5-minute endurance sessions...",
initialText: "This is serious endurance training - edge for 5 minutes...",
sustainText: "Incredible control! True gooner endurance showing...",
sustainText: "Incredible focus! True gooner endurance showing...",
breakText: "Keep that edge going, you're proving your dedication...",
successText: "Amazing! You've achieved advanced endurance levels.",
intensity: 3
successText: "Amazing! You've achieved advanced endurance levels."
}
},
{
@ -242,11 +224,10 @@ const enduranceGameData = {
interactiveData: {
title: "Expert Endurance Mastery",
description: "Master-level endurance with 10-minute sessions...",
initialText: "Ultimate challenge - maintain arousal for 10 full minutes...",
initialText: "Ultimate challenge - maintain excitement for 10 full minutes...",
sustainText: "Legendary endurance! Only true gooners achieve this...",
breakText: "Perfect control! You're demonstrating mastery...",
successText: "INCREDIBLE! You've mastered expert-level endurance.",
intensity: 4
breakText: "Perfect focus! You're demonstrating mastery...",
successText: "INCREDIBLE! You've mastered expert-level endurance."
}
},
{
@ -263,8 +244,7 @@ const enduranceGameData = {
initialText: "This session adapts to your current level...",
sustainText: "Building endurance progressively...",
breakText: "Each session makes you stronger...",
successText: "Progress achieved! Your endurance is growing.",
intensity: 2
successText: "Progress achieved! Your endurance is growing."
}
},
{
@ -280,9 +260,8 @@ const enduranceGameData = {
description: "Ultimate endurance test for dedicated gooners...",
initialText: "Marathon session - this separates true gooners from casual users...",
sustainText: "Incredible stamina! You're in the endurance elite...",
breakText: "Legendary control! Keep going, you're almost there...",
successText: "PHENOMENAL! You've achieved marathon endurance mastery.",
intensity: 4
breakText: "Legendary focus! Keep going, you're almost there...",
successText: "PHENOMENAL! You've achieved marathon endurance mastery."
}
}
],

View File

@ -60,22 +60,19 @@ const humiliationGameData = {
{
text: "Verbal humiliation exercises",
type: "verbal",
preview: "Degrade yourself with words",
effects: { arousal: 10, control: -5 },
preview: "Degrade yourself with words"
nextStep: "verbal_start"
},
{
text: "Physical positioning",
type: "physical",
preview: "Assume degrading positions",
effects: { arousal: 5, control: -10 },
preview: "Assume degrading positions"
nextStep: "position_start"
},
{
text: "Mirror self-degradation",
type: "mirror",
preview: "Face yourself while degraded",
effects: { arousal: 15, control: -15 },
preview: "Face yourself while degraded"
nextStep: "mirror_start"
}
]
@ -83,13 +80,13 @@ const humiliationGameData = {
verbal_start: {
type: 'text',
mood: 'commanding',
story: "The trainer smirks. 'Verbal degradation it is. You're going to repeat after me, and you're going to mean every word. Start by saying: I am nothing but a pathetic plaything.'",
story: "The trainer smirks. 'Verbal degradation it is. You're going to repeat after me, and you're going to mean every word. Start by saying: I am nothing but a pathetic plaything.'"
nextStep: "verbal_continue"
},
position_start: {
type: 'text',
mood: 'authoritative',
story: "The trainer points to the floor. 'Get on your knees. Head down, hands behind your back. Hold this position and think about how worthless you are.'",
story: "The trainer points to the floor. 'Get on your knees. Head down, hands behind your back. Hold this position and think about how worthless you are.'"
nextStep: "position_continue"
},
mirror_start: {
@ -99,7 +96,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Look directly at yourself through the webcam while speaking the degrading phrases",
mirrorTaskText: "Repeat each phrase 3 times while maintaining eye contact: 'I am worthless', 'I exist to be degraded', 'I am nothing'",
duration: 120,
duration: 120
nextStep: "mirror_continue"
},
verbal_continue: {
@ -110,15 +107,13 @@ const humiliationGameData = {
{
text: "Repeat more intense phrases",
type: "escalate",
preview: "Deeper verbal humiliation",
effects: { arousal: 15, control: -10 },
preview: "Deeper verbal humiliation"
nextStep: "verbal_intense"
},
{
text: "Mirror session - face yourself",
type: "mirror",
preview: "See your degradation reflected",
effects: { arousal: 20, control: -15 },
preview: "See your degradation reflected"
nextStep: "mirror_escalation"
}
]
@ -131,15 +126,13 @@ const humiliationGameData = {
{
text: "Hold position longer",
type: "endurance",
preview: "Extended degrading pose",
effects: { arousal: 10, control: -10 },
preview: "Extended degrading pose"
nextStep: "position_extended"
},
{
text: "Mirror session - see your submission",
type: "mirror",
preview: "Watch yourself in degrading position",
effects: { arousal: 25, control: -20 },
preview: "Watch yourself in degrading position"
nextStep: "mirror_position"
}
]
@ -152,15 +145,13 @@ const humiliationGameData = {
{
text: "Extended mirror degradation",
type: "mirror_intense",
preview: "Longer self-humiliation session",
effects: { arousal: 20, control: -15 },
preview: "Longer self-humiliation session"
nextStep: "mirror_extended"
},
{
text: "Mirror while in degrading position",
type: "mirror_position",
preview: "Combine visual and physical shame",
effects: { arousal: 30, control: -25 },
preview: "Combine visual and physical shame"
nextStep: "mirror_position"
}
]
@ -172,7 +163,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Maintain eye contact with yourself while speaking louder and more degrading phrases",
mirrorTaskText: "Say each phrase 5 times with conviction: 'I am a pathetic loser', 'I deserve to be humiliated', 'I am worthless trash'",
duration: 180,
duration: 180
nextStep: "completion"
},
verbal_intense: {
@ -180,18 +171,16 @@ const humiliationGameData = {
mood: 'harsh',
story: "The trainer demands more intense verbal degradation. 'Say it like you mean it! Louder! More degrading!'",
actionText: "Speak harsh degrading phrases about yourself",
duration: 120,
effects: { arousal: 20, control: -15 },
nextStep: "completion"
duration: 120
nextStep: "completion"
},
position_extended: {
type: 'action',
mood: 'endurance',
story: "The trainer makes you hold the degrading position longer. 'Stay in that shameful pose. Feel how degrading it is.'",
actionText: "Hold degrading position for extended time",
duration: 180,
effects: { arousal: 15, control: -15 },
nextStep: "completion"
duration: 180
nextStep: "completion"
},
mirror_position: {
type: 'mirror-action',
@ -200,7 +189,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Hold a degrading position while watching yourself and speaking phrases",
mirrorTaskText: "While kneeling with head down, look up at camera and repeat: 'I am a disgrace', 'I deserve this shame', 'I am nothing'",
duration: 240,
duration: 240
nextStep: "completion"
},
mirror_extended: {
@ -210,15 +199,13 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Extended self-viewing session with continuous degrading phrases",
mirrorTaskText: "For the full duration, cycle through these phrases: 'I am pathetic', 'I am worthless', 'I deserve humiliation', 'I am nothing'",
duration: 300,
duration: 300
nextStep: "completion"
},
completion: {
type: 'completion',
mood: 'satisfied',
story: "The trainer nods approvingly. 'Well done. You've completed your humiliation training session. You're learning your place nicely.'",
effects: { arousal: 20, control: -20 },
outcome: "degraded"
story: "The trainer nods approvingly. 'Well done. You've completed your humiliation training session. You're learning your place nicely.'",outcome: "degraded"
}
}
}
@ -239,22 +226,19 @@ const humiliationGameData = {
{
text: "Start with gentle self-viewing",
type: "gentle",
preview: "Ease into mirror humiliation",
effects: { arousal: 5, control: -5 },
preview: "Ease into mirror humiliation"
nextStep: "gentle_mirror"
},
{
text: "Immediate intense mirror degradation",
type: "intense",
preview: "Full mirror humiliation from start",
effects: { arousal: 15, control: -15 },
preview: "Full mirror humiliation from start"
nextStep: "intense_mirror"
},
{
text: "Mirror with physical positioning",
type: "combined",
preview: "Visual and physical degradation",
effects: { arousal: 10, control: -10 },
preview: "Visual and physical degradation"
nextStep: "combined_start"
}
]
@ -266,7 +250,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Simply look at yourself and observe your feelings",
mirrorTaskText: "Look at yourself for the full duration. Pay attention to how being watched makes you feel.",
duration: 120,
duration: 120
nextStep: "escalation_choice"
},
intense_mirror: {
@ -276,8 +260,8 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Look directly at yourself while speaking harsh truths",
mirrorTaskText: "Say these phrases with conviction: 'I am disgusting', 'I am a failure', 'I am pathetic', 'No one could love this'",
duration: 240,
nextStep: "intensity_choice"
duration: 240
nextStep: "extreme_choice"
},
combined_start: {
type: 'mirror-action',
@ -286,31 +270,29 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Maintain degrading position while watching yourself",
mirrorTaskText: "While kneeling, say repeatedly: 'This is what I deserve', 'I am in my proper place', 'I am beneath others'",
duration: 180,
duration: 180
nextStep: "combined_escalation"
},
escalation_choice: {
type: 'choice',
mood: 'building_intensity',
mood: 'building_extreme',
story: "The operator observes your reaction. 'Good. You're getting comfortable with being watched. Now we escalate your mirror degradation.'",
choices: [
{
text: "Verbal self-degradation in mirror",
type: "verbal_mirror",
preview: "Speak degrading words to yourself",
effects: { arousal: 15, control: -10 },
preview: "Speak degrading words to yourself"
nextStep: "verbal_mirror_session"
},
{
text: "Physical poses while watching",
type: "position_mirror",
preview: "Degrading positions in full view",
effects: { arousal: 20, control: -15 },
preview: "Degrading positions in full view"
nextStep: "position_mirror_session"
}
]
},
intensity_choice: {
extreme_choice: {
type: 'choice',
mood: 'extreme',
story: "The operator notes your state. 'You're responding well to the harsh truth. Ready for the final phase of mirror degradation?'",
@ -318,15 +300,13 @@ const humiliationGameData = {
{
text: "Extended brutal self-examination",
type: "extended",
preview: "Longer intense mirror session",
effects: { arousal: 25, control: -20 },
preview: "Longer intense mirror session"
nextStep: "extended_mirror"
},
{
text: "Combined degradation finale",
type: "finale",
preview: "Ultimate mirror humiliation",
effects: { arousal: 30, control: -25 },
preview: "Ultimate mirror humiliation"
nextStep: "mirror_finale"
}
]
@ -338,7 +318,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Speak degrading truths about yourself while maintaining eye contact",
mirrorTaskText: "Repeat with feeling: 'I am worthless', 'I am a disappointment', 'I am unlovable', 'I deserve this shame'",
duration: 220,
duration: 220
nextStep: "final_degradation"
},
position_mirror_session: {
@ -348,7 +328,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Hold shameful position while watching yourself",
mirrorTaskText: "In your degrading pose, say: 'This is my place', 'I deserve to be low', 'I am properly positioned'",
duration: 200,
duration: 200
nextStep: "final_degradation"
},
combined_escalation: {
@ -359,15 +339,13 @@ const humiliationGameData = {
{
text: "More extreme positions",
type: "extreme_position",
preview: "Most degrading poses possible",
effects: { arousal: 25, control: -20 },
preview: "Most degrading poses possible"
nextStep: "extreme_position_mirror"
},
{
text: "Verbal and physical combined",
type: "total_degradation",
preview: "Complete mirror humiliation",
effects: { arousal: 30, control: -25 },
preview: "Complete mirror humiliation"
nextStep: "total_degradation_mirror"
}
]
@ -379,7 +357,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Extended brutal self-examination session",
mirrorTaskText: "For the entire time, cycle through: 'I hate what I see', 'I am disgusting', 'I am a failure', 'I deserve nothing'",
duration: 360,
duration: 360
nextStep: "completion"
},
extreme_position_mirror: {
@ -389,7 +367,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Hold the most shameful position while watching yourself",
mirrorTaskText: "In your most degrading pose, repeat: 'This is what I am', 'I deserve worse', 'I am below human'",
duration: 300,
duration: 300
nextStep: "completion"
},
total_degradation_mirror: {
@ -399,7 +377,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Combine shameful positioning with brutal self-verbal degradation",
mirrorTaskText: "While in degrading position, say continuously: 'I am nothing', 'I am worthless', 'I deserve this', 'I am completely pathetic'",
duration: 420,
duration: 420
nextStep: "completion"
},
mirror_finale: {
@ -409,7 +387,7 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Ultimate mirror degradation session with complete self-destruction",
mirrorTaskText: "Repeat these devastating truths: 'I am completely worthless', 'I deserve to be humiliated', 'I am lower than dirt', 'I am absolutely nothing'",
duration: 480,
duration: 480
nextStep: "completion"
},
final_degradation: {
@ -419,15 +397,13 @@ const humiliationGameData = {
interactiveType: "mirror-task",
mirrorInstructions: "Final degrading mirror session to complete your humiliation",
mirrorTaskText: "For the final time, tell yourself: 'I am completely broken', 'I am thoroughly humiliated', 'I know my place', 'I am properly degraded'",
duration: 180,
duration: 180
nextStep: "completion"
},
completion: {
type: 'completion',
mood: 'cold_satisfaction',
story: "The operator turns off the camera. 'Session complete. Your self-image has been properly adjusted through mirror-based degradation.'",
effects: { arousal: 40, control: -40 },
outcome: "completely_degraded"
story: "The operator turns off the camera. 'Session complete. Your self-image has been properly adjusted through mirror-based degradation.'",outcome: "completely_degraded"
}
}
}
@ -436,11 +412,6 @@ const humiliationGameData = {
// Configuration for humiliation mode
config: {
intensityLevels: {
mild: { multiplier: 1.0, themes: ["verbal", "position"] },
moderate: { multiplier: 1.5, themes: ["verbal", "position", "mental"] },
intense: { multiplier: 2.0, themes: ["verbal", "position", "mental", "degradation"] }
},
mood: "dominant",
theme: "humiliation"
}

View File

@ -53,29 +53,25 @@ const trainingGameData = {
{
text: "Edging endurance training",
type: "endurance",
preview: "Learn to edge for hours without cumming",
effects: { arousal: 10, intensity: 1 },
preview: "Learn to edge for hours without cumming"
nextStep: "edging_path"
},
{
text: "Porn addiction enhancement",
type: "addiction",
preview: "Deepen your love and need for pornography",
effects: { arousal: 15, control: -5 },
preview: "Deepen your love and need for pornography"
nextStep: "addiction_path"
},
{
text: "Gooning mindset development",
type: "mindset",
preview: "Embrace the gooner lifestyle completely",
effects: { arousal: 12, control: -8 },
preview: "Embrace the gooner lifestyle completely"
nextStep: "mindset_path"
},
{
text: "Advanced masturbation techniques",
type: "technique",
preview: "Master sophisticated stroking methods",
effects: { arousal: 8, control: 5 },
preview: "Master sophisticated stroking methods"
nextStep: "technique_path"
}
]
@ -83,24 +79,21 @@ const trainingGameData = {
edging_path: {
type: 'choice',
mood: 'instructional',
story: "Your instructor leads you to the edging training area. 'Real gooners can edge for hours, building arousal without release. This is the foundation of gooning - the ability to stay on the edge indefinitely while worshipping porn. How would you like to begin your edging training?'",
story: "Your instructor leads you to the edging training area. 'Real gooners can edge for hours, building excitement without release. This is the foundation of gooning - the ability to stay on the edge indefinitely while worshipping porn. How would you like to begin your edging training?'",
choices: [
{
text: "Start with basic 30-minute edges",
preview: "Build fundamental edging skills",
effects: { arousal: 15 },
preview: "Build fundamental edging skills"
nextStep: "basic_edging"
},
{
text: "Jump to marathon edging sessions",
preview: "Train for multi-hour gooning",
effects: { arousal: 25, intensity: 2 },
preview: "Train for multi-hour gooning"
nextStep: "marathon_edging"
},
{
text: "Learn advanced edging patterns",
preview: "Master complex stroking rhythms",
effects: { arousal: 20, control: 10 },
preview: "Master complex stroking rhythms"
nextStep: "pattern_edging"
}
]
@ -110,17 +103,15 @@ const trainingGameData = {
mood: 'patient',
story: "Your instructor guides you through proper edging technique. 'Start slow, build arousal over 30 minutes. Feel how the porn makes you throb. This is just the beginning - real gooners edge for hours. Focus on the pleasure, worship the porn, but don't you dare cum.'",
actionText: "30-minute basic edging training session",
duration: 120,
effects: { arousal: 25, control: 15 },
duration: 120
nextStep: "edging_assessment"
},
pattern_edging: {
type: 'action',
mood: 'technical',
story: "Your instructor demonstrates complex stroking patterns. 'Advanced gooners master sophisticated rhythms and techniques. You'll learn variable speed patterns, pressure control, and rhythm changes that maximize arousal while maintaining perfect edge control.'",
story: "Your instructor demonstrates complex stroking patterns. 'Advanced gooners master sophisticated rhythms and techniques. You'll learn variable speed patterns, pressure control, and rhythm changes that maximize pleasure while maintaining perfect edge focus.'",
actionText: "Advanced edging pattern training",
duration: 150,
effects: { arousal: 20, control: 15 },
duration: 150
nextStep: "edging_assessment"
},
edging_assessment: {
@ -130,20 +121,17 @@ const trainingGameData = {
choices: [
{
text: "Continue building endurance",
preview: "Work on longer edging sessions",
effects: { arousal: 15 },
preview: "Work on longer edging sessions"
nextStep: "endurance_mastery"
},
{
text: "Move to advanced training",
preview: "Progress to expert techniques",
effects: { arousal: 10, control: 5 },
preview: "Progress to expert techniques"
nextStep: "advanced_training"
},
{
text: "Explore different training paths",
preview: "Try other aspects of gooner training",
effects: { arousal: 5 },
preview: "Try other aspects of gooner training"
nextStep: "addiction_path"
}
]
@ -153,9 +141,8 @@ const trainingGameData = {
mood: 'intense',
story: "Your instructor nods approvingly. 'Ambitious! Let's see if you can handle real gooner training. Edge continuously for 2 hours, building and building but never cumming. Feel how the porn controls you, how your cock throbs for it. This is what true gooners do - they live on the edge.'",
actionText: "2-hour marathon edging session",
duration: 300,
effects: { arousal: 45, control: -10, intensity: 2 },
nextStep: "endurance_mastery"
duration: 300
nextStep: "endurance_mastery"
},
addiction_path: {
type: 'choice',
@ -164,20 +151,17 @@ const trainingGameData = {
choices: [
{
text: "Increase daily porn consumption",
preview: "Train to watch more porn every day",
effects: { arousal: 20 },
preview: "Train to watch more porn every day"
nextStep: "consumption_training"
},
{
text: "Develop porn dependency habits",
preview: "Make porn essential to your daily life",
effects: { arousal: 25, control: -15 },
preview: "Make porn essential to your daily life"
nextStep: "dependency_training"
},
{
text: "Master porn worship techniques",
preview: "Learn to properly worship pornography",
effects: { arousal: 18, control: -10 },
preview: "Learn to properly worship pornography"
nextStep: "worship_training"
}
]
@ -187,27 +171,24 @@ const trainingGameData = {
mood: 'addictive',
story: "Your instructor pulls up endless screens of porn. 'Real gooners spend hours every day with porn. We'll train you to consume more, crave more, need more. Edge while watching multiple videos - let the porn flood your mind and control your cock.'",
actionText: "Multi-screen porn consumption while edging",
duration: 200,
effects: { arousal: 35, control: -15 },
nextStep: "addiction_deepening"
duration: 200
nextStep: "addiction_deepening"
},
dependency_training: {
type: 'action',
mood: 'dependent',
story: "Your instructor nods approvingly. 'Excellent choice. We'll make porn absolutely essential to your daily life. You'll learn to depend on pornography for pleasure, comfort, and arousal. Start by edging while thinking about how much you need porn every single day. You cannot live without porn. When you aren't stroking to porn you are thinking about stroking to porn. Porn.... Porn.... PORN!!!!'",
actionText: "Porn dependency conditioning session",
duration: 200,
effects: { arousal: 30, control: -20 },
nextStep: "addiction_deepening"
duration: 200
nextStep: "addiction_deepening"
},
worship_training: {
type: 'action',
mood: 'reverent',
story: "Your instructor's voice becomes reverent. 'Porn worship is an art form. You'll learn to truly appreciate and worship pornography as your master. Get on your knees and edge slowly while expressing gratitude to porn for controlling your life and giving you purpose. Thank porn for everything it does for you. Thank pornstars for their dedication to their artform. Porn is so beautiful and powerful - worship it with all your heart.'",
actionText: "Porn worship and gratitude training",
duration: 240,
effects: { arousal: 25, control: -15 },
nextStep: "addiction_deepening"
duration: 240
nextStep: "addiction_deepening"
},
addiction_deepening: {
type: 'choice',
@ -216,20 +197,17 @@ const trainingGameData = {
choices: [
{
text: "Increase daily viewing requirements",
preview: "Commit to more hours of daily porn",
effects: { arousal: 20, control: -10 },
preview: "Commit to more hours of daily porn"
nextStep: "viewing_commitment"
},
{
text: "Develop porn craving triggers",
preview: "Learn to crave porn constantly",
effects: { arousal: 25, control: -15 },
preview: "Learn to crave porn constantly"
nextStep: "craving_training"
},
{
text: "Complete addiction certification",
preview: "Graduate as a certified porn addict",
effects: { arousal: 30, control: -20 },
preview: "Graduate as a certified porn addict"
nextStep: "advanced_training"
}
]
@ -239,18 +217,16 @@ const trainingGameData = {
mood: 'demanding',
story: "Your instructor becomes more demanding. 'Real porn addicts watch for hours every day. Commit to spending at least 30 minutes with pornography right here and now. Edge continuously while fullfilling this commitment - feel how natural and necessary this is.'",
actionText: "Daily porn viewing commitment session",
duration: 1800,
effects: { arousal: 35, control: -25 },
nextStep: "advanced_training"
duration: 1800
nextStep: "advanced_training"
},
craving_training: {
type: 'action',
mood: 'addictive',
story: "Your instructor smiles wickedly. 'We'll train your brain to crave porn constantly. Every few minutes, you'll think about pornography and feel the need to stroke. Edge while programming these craving patterns into your mind.'",
actionText: "Constant porn craving conditioning",
duration: 210,
effects: { arousal: 40, control: -30 },
nextStep: "advanced_training"
duration: 210
nextStep: "advanced_training"
},
mindset_path: {
type: 'choice',
@ -259,20 +235,17 @@ const trainingGameData = {
choices: [
{
text: "Embrace porn as your master",
preview: "Accept porn's control over your life",
effects: { arousal: 30, control: -20 },
preview: "Accept porn's control over your life"
nextStep: "submission_training"
},
{
text: "Develop gooner identity and pride",
preview: "Take pride in being a dedicated gooner",
effects: { arousal: 25, control: -10 },
preview: "Take pride in being a dedicated gooner"
nextStep: "identity_training"
},
{
text: "Learn gooner lifestyle habits",
preview: "Integrate gooning into daily life",
effects: { arousal: 20, control: -5 },
preview: "Integrate gooning into daily life"
nextStep: "lifestyle_training"
}
]
@ -282,9 +255,8 @@ const trainingGameData = {
mood: 'dominant',
story: "Your instructor's voice becomes commanding. 'Good. Now you'll learn to submit completely to porn. Edge while repeating: I live to serve porn. Porn controls my cock. I am nothing without pornography. Feel how true these words are as you stroke.'",
actionText: "Porn submission mantras while edging",
duration: 150,
effects: { arousal: 40, control: -25 },
nextStep: "advanced_training"
duration: 150
nextStep: "advanced_training"
},
technique_path: {
type: 'choice',
@ -293,20 +265,17 @@ const trainingGameData = {
choices: [
{
text: "Multi-rhythm stroking patterns",
preview: "Master complex stroking rhythms",
effects: { arousal: 15, control: 15 },
preview: "Master complex stroking rhythms"
nextStep: "rhythm_training"
},
{
text: "Extended pleasure techniques",
preview: "Learn to maximize gooning pleasure",
effects: { arousal: 25, control: 5 },
preview: "Learn to maximize gooning pleasure"
nextStep: "pleasure_training"
},
{
text: "Advanced edging control methods",
preview: "Perfect your edge control",
effects: { arousal: 20, control: 20 },
preview: "Perfect your edge focus"
nextStep: "control_training"
}
]
@ -316,54 +285,48 @@ const trainingGameData = {
mood: 'rhythmic',
story: "Your instructor demonstrates complex stroking rhythms. 'Master gooners understand rhythm is everything. Try 3 short strokes in rapid succession focusing just on the tip followed by 2 long strokes going the full length of your cock. Practice these patterns while edging to perfect porn.'",
actionText: "Multi-rhythm stroking pattern training",
duration: 180,
effects: { arousal: 25, control: 20 },
nextStep: "edging_assessment"
duration: 180
nextStep: "edging_assessment"
},
pleasure_training: {
type: 'action',
mood: 'euphoric',
story: "Your instructor's voice becomes hypnotic. 'We'll teach you to extract maximum pleasure from every stroke. Learn to savor each sensation, multiply your arousal, and experience gooning bliss like never before. Place your finger of your other hand on your perineum to enhance the pleasure while edging. Feel every stroke intensify as you stroke small circles while stroking the length of your cock.'",
actionText: "Extended pleasure maximization training",
duration: 200,
effects: { arousal: 35, control: 10 },
nextStep: "advanced_training"
duration: 200
nextStep: "advanced_training"
},
control_training: {
type: 'action',
mood: 'precise',
story: "Your instructor becomes serious. 'Control is what separates gooners from casual masturbators. You'll learn to edge precisely at the perfect point, maintaining arousal for hours without accident. Master this and you master gooning. Bring yourself right to the edge and stop. Wait for your erection to wane and then repeat it. See how many times you can do this before the timer runs out.'",
actionText: "Advanced edge control mastery",
duration: 240,
effects: { arousal: 30, control: 35 },
nextStep: "advanced_training"
story: "Your instructor becomes serious. 'Control is what separates gooners from casual masturbators. You'll learn to edge precisely at the perfect point, maintaining excitement for hours without accident. Master this and you master gooning. Bring yourself right to the edge and stop. Wait for your erection to wane and then repeat it. See how many times you can do this before the timer runs out.'",
actionText: "Advanced edge focus mastery",
duration: 240
nextStep: "advanced_training"
},
identity_training: {
type: 'action',
mood: 'transformative',
story: "Your instructor speaks with pride. 'Embrace your identity as a dedicated gooner. This isn't just what you do - this is who you are. Watch the porn on your screen and edge while reminding yourself that you are a proud gooner, devoted to the art of pleasure. Nothing else matters more than pleasuring yourself to perfect porn.'",
actionText: "Gooner identity acceptance training",
duration: 180,
effects: { arousal: 30, control: -15 },
nextStep: "advanced_training"
duration: 180
nextStep: "advanced_training"
},
lifestyle_training: {
type: 'action',
mood: 'practical',
story: "Your instructor becomes practical. 'Real gooners integrate their lifestyle completely. You'll learn to schedule daily gooning time, organize your porn collection, and make gooning a central part of your routine. Edge while planning your gooner lifestyle.'",
actionText: "Gooner lifestyle integration training",
duration: 160,
effects: { arousal: 25, control: -10 },
nextStep: "advanced_training"
duration: 160
nextStep: "advanced_training"
},
endurance_mastery: {
type: 'action',
mood: 'accomplished',
story: "Your instructor observes your marathon session with approval. 'Excellent endurance! You're developing real gooner stamina. Now let's push further - edge for another hour while worshipping different types of porn. Feel how each category affects your arousal differently.'",
actionText: "Extended endurance with varied porn categories",
duration: 240,
effects: { arousal: 50, control: 25, intensity: 1 },
nextStep: "advanced_training"
duration: 240
nextStep: "advanced_training"
},
advanced_training: {
type: 'choice',
@ -372,17 +335,17 @@ const trainingGameData = {
choices: [
{
text: "Master-level gooning challenges",
preview: "Ultimate gooner difficulty tests",
preview: "Ultimate gooner difficulty tests"
nextStep: "master_gooning"
},
{
text: "Become a certified gooner",
preview: "Graduate as a dedicated gooner",
preview: "Graduate as a dedicated gooner"
nextStep: "gooner_graduation"
},
{
text: "Continue advanced edging training",
preview: "Further develop your skills",
preview: "Further develop your skills"
nextStep: "endurance_mastery"
}
]
@ -390,17 +353,16 @@ const trainingGameData = {
master_gooning: {
type: 'action',
mood: 'extreme',
story: "Your instructor presents the ultimate challenge. 'This is master-level gooner training. You will edge for 6 hours straight, cycling through different porn categories, changing techniques every 30 minutes, while maintaining perfect arousal without cumming. This is what separates casual masturbators from true gooners.'",
story: "Your instructor presents the ultimate challenge. 'This is master-level gooner training. You will edge for 6 hours straight, cycling through different porn categories, changing techniques every 30 minutes, while maintaining perfect excitement without cumming. This is what separates casual masturbators from true gooners.'",
actionText: "Master-level 6-hour gooning marathon",
duration: 360,
effects: { arousal: 70, control: 40, intensity: 3 },
nextStep: "gooner_graduation"
duration: 360
nextStep: "gooner_graduation"
},
gooner_graduation: {
type: 'ending',
mood: 'proud',
story: "Your instructor stands and salutes you. 'Congratulations! You have completed the Advanced Gooner Training Academy with distinction. You are now a certified gooner, dedicated to porn and masturbation. Your commitment to edging and porn worship is exemplary.'",
endingText: "GOONER CERTIFICATION ACHIEVED! Final state: Arousal {arousal}, Control {control}, Intensity {intensity}. You are now a certified dedicated gooner, committed to spending your life edging to pornography.",
endingText: "GOONER CERTIFICATION ACHIEVED! Final state: Arousal HIGH, Control VARIABLE, Intensity MAXIMUM. You are now a certified dedicated gooner, committed to spending your life edging to pornography.",
outcome: "certified_gooner"
}
}
@ -423,22 +385,19 @@ const trainingGameData = {
{
text: "Complete beginner",
type: "novice",
preview: "Start with 30-second sessions",
effects: { arousal: 5, intensity: 1 },
preview: "Start with 30-second sessions"
nextStep: "novice_training"
},
{
text: "Some experience",
type: "experienced",
preview: "Try 2-3 minute sessions",
effects: { arousal: 10, intensity: 2 },
preview: "Try 2-3 minute sessions"
nextStep: "experienced_training"
},
{
text: "Very experienced",
type: "veteran",
preview: "Challenge with 5+ minute sessions",
effects: { arousal: 15, intensity: 3 },
preview: "Challenge with 5+ minute sessions"
nextStep: "veteran_training"
}
]
@ -448,34 +407,29 @@ const trainingGameData = {
mood: 'gentle',
story: "Perfect for beginners! Start with just 30 seconds of steady edging. Focus on building the foundation - maintain arousal without going over the edge.",
actionText: "30-second beginner assessment",
duration: 30,
effects: { arousal: 15, control: 10 },
nextStep: "completion"
duration: 30
nextStep: "completion"
},
experienced_training: {
type: 'action',
mood: 'challenging',
story: "Good experience level! Let's test your stamina with 2 minutes of continuous edging. Maintain steady arousal and prove your developing endurance.",
actionText: "2-minute intermediate assessment",
duration: 120,
effects: { arousal: 25, control: 15 },
nextStep: "completion"
duration: 120
nextStep: "completion"
},
veteran_training: {
type: 'action',
mood: 'intense',
story: "Impressive experience! Time for a real challenge - 5 minutes of sustained edging. Show your dedication and endurance mastery.",
actionText: "5-minute veteran assessment",
duration: 300,
effects: { arousal: 35, control: 20 },
nextStep: "completion"
duration: 300
nextStep: "completion"
},
completion: {
type: 'completion',
mood: 'satisfied',
story: "Assessment complete! Your endurance level has been recorded. Continue practicing daily to build even greater stamina and become a more dedicated gooner.",
effects: { arousal: 10, control: 5 },
outcome: "assessed"
story: "Assessment complete! Your endurance level has been recorded. Continue practicing daily to build even greater stamina and become a more dedicated gooner.",outcome: "assessed"
}
}
}

View File

@ -1,358 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Electron TTS Integration Test</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
background: #2c3e50;
color: white;
}
.test-section {
background: #34495e;
padding: 20px;
border-radius: 8px;
margin: 20px 0;
}
button {
padding: 10px 20px;
margin: 5px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
}
.enabled {
background: #27ae60;
color: white;
}
.disabled {
background: #95a5a6;
color: white;
}
#voice-info {
background: #2c3e50;
padding: 15px;
border-radius: 5px;
margin: 10px 0;
border-left: 3px solid #3498db;
}
</style>
</head>
<body>
<h1>🎙️ Electron TTS Integration Test</h1>
<div class="test-section">
<h2>Voice Manager Test</h2>
<p>This tests the cross-platform voice selection system.</p>
<button id="init-btn" onclick="initializeVoiceManager()">Initialize Voice Manager</button>
<button id="test-speak" onclick="testSpeak()" disabled>Test Female Voice</button>
<button id="stop-btn" onclick="stopSpeech()">Stop Speech</button>
<div id="voice-info">
<strong>Voice Manager Status:</strong> Not initialized
</div>
<div id="platform-info"></div>
</div>
<div class="test-section">
<h2>Scenario Text Test</h2>
<p>Test TTS with scenario-style text including placeholders.</p>
<textarea id="scenario-text" rows="4" style="width: 100%; padding: 10px; background: #2c3e50; color: white; border: 1px solid #556983; border-radius: 5px;">
You feel your {arousal} building as you continue to focus. Your {control} wavers slightly, but you maintain your composure. The {intensity} of the moment increases.
</textarea>
<div style="margin: 10px 0;">
<label>Arousal Level:
<select id="arousal-level">
<option value="low">Low</option>
<option value="moderate" selected>Moderate</option>
<option value="high">High</option>
<option value="extreme">Extreme</option>
</select>
</label>
<label style="margin-left: 20px;">Control Level:
<select id="control-level">
<option value="weak">Weak</option>
<option value="moderate" selected>Moderate</option>
<option value="strong">Strong</option>
<option value="iron">Iron</option>
</select>
</label>
<label style="margin-left: 20px;">Intensity:
<select id="intensity-level">
<option value="low">Low</option>
<option value="moderate" selected>Moderate</option>
<option value="high">High</option>
<option value="extreme">Extreme</option>
</select>
</label>
</div>
<button onclick="testScenarioSpeak()">Speak Processed Text</button>
</div>
<script type="module">
// Import the voice manager (simulated for testing)
class VoiceManager {
constructor() {
this.synth = window.speechSynthesis;
this.selectedVoice = null;
this.fallbackVoices = this.getPlatformFallbacks();
}
getPlatformFallbacks() {
const platform = this.detectPlatform();
switch (platform) {
case 'windows':
return [
'Microsoft Zira Desktop', 'Microsoft Zira',
'Microsoft Hazel Desktop', 'Microsoft Hazel',
'Microsoft Eva Desktop', 'Microsoft Eva',
'Microsoft Aria', 'Microsoft Jenny',
'Zira', 'Hazel', 'Eva', 'Aria', 'Jenny'
];
case 'mac':
return [
'Samantha', 'Victoria', 'Karen', 'Fiona', 'Moira', 'Tessa', 'Alex'
];
default:
return ['Samantha', 'Zira', 'Victoria', 'Hazel', 'Karen', 'Eva', 'female', 'woman'];
}
}
detectPlatform() {
const userAgent = navigator.userAgent.toLowerCase();
if (userAgent.includes('win')) return 'windows';
if (userAgent.includes('mac')) return 'mac';
if (userAgent.includes('linux')) return 'linux';
return 'unknown';
}
isFemaleVoice(voice) {
const name = voice.name.toLowerCase();
const femaleVoiceNames = [
'zira', 'hazel', 'eva', 'aria', 'jenny',
'samantha', 'victoria', 'karen', 'fiona', 'moira', 'tessa',
'female', 'woman', 'girl', 'lady'
];
return femaleVoiceNames.some(femaleName => name.includes(femaleName));
}
getAvailableFemaleVoices() {
const voices = this.synth.getVoices();
return voices.filter(voice =>
voice.lang.startsWith('en') && this.isFemaleVoice(voice)
);
}
selectBestVoice() {
const availableVoices = this.getAvailableFemaleVoices();
if (availableVoices.length === 0) {
console.warn('No female voices available');
return null;
}
for (const preferredName of this.fallbackVoices) {
const voice = availableVoices.find(v =>
v.name.toLowerCase().includes(preferredName.toLowerCase())
);
if (voice) {
console.log(`Selected voice: ${voice.name} (${voice.lang})`);
this.selectedVoice = voice;
return voice;
}
}
this.selectedVoice = availableVoices[0];
console.log(`Fallback to first available: ${this.selectedVoice.name}`);
return this.selectedVoice;
}
async initialize() {
return new Promise((resolve) => {
if (this.synth.getVoices().length > 0) {
this.selectBestVoice();
resolve(this.selectedVoice);
} else {
this.synth.addEventListener('voiceschanged', () => {
this.selectBestVoice();
resolve(this.selectedVoice);
}, { once: true });
}
});
}
speak(text, options = {}) {
if (!this.selectedVoice) {
console.warn('No voice selected, attempting to initialize...');
this.selectBestVoice();
}
const utterance = new SpeechSynthesisUtterance(text);
if (this.selectedVoice) {
utterance.voice = this.selectedVoice;
}
utterance.rate = options.rate || 0.9;
utterance.pitch = options.pitch || 1.1;
utterance.volume = options.volume || 0.8;
// Platform-specific pitch adjustments
if (this.selectedVoice) {
const voiceName = this.selectedVoice.name.toLowerCase();
if (voiceName.includes('alex')) {
utterance.pitch = Math.max(utterance.pitch * 1.2, 1.5);
}
}
if (options.onStart) utterance.onstart = options.onStart;
if (options.onEnd) utterance.onend = options.onEnd;
if (options.onError) utterance.onerror = options.onError;
this.synth.speak(utterance);
return utterance;
}
getVoiceInfo() {
if (!this.selectedVoice) {
return {
name: 'No voice selected',
platform: this.detectPlatform(),
available: false
};
}
return {
name: this.selectedVoice.name,
lang: this.selectedVoice.lang,
platform: this.detectPlatform(),
available: true,
localService: this.selectedVoice.localService,
voiceURI: this.selectedVoice.voiceURI
};
}
stop() {
this.synth.cancel();
}
isSupported() {
return 'speechSynthesis' in window;
}
}
// Global variables
let voiceManager = null;
// Global functions
window.initializeVoiceManager = async function() {
const button = document.getElementById('init-btn');
const voiceInfo = document.getElementById('voice-info');
const platformInfo = document.getElementById('platform-info');
const testButton = document.getElementById('test-speak');
button.textContent = 'Initializing...';
button.disabled = true;
try {
voiceManager = new VoiceManager();
await voiceManager.initialize();
const info = voiceManager.getVoiceInfo();
voiceInfo.innerHTML = `
<strong>Voice Manager Status:</strong> ✅ Initialized<br>
<strong>Selected Voice:</strong> ${info.name}<br>
<strong>Language:</strong> ${info.lang}<br>
<strong>Platform:</strong> ${info.platform}<br>
<strong>Local Service:</strong> ${info.localService ? 'Yes' : 'No'}
`;
// Show available female voices
const femaleVoices = voiceManager.getAvailableFemaleVoices();
platformInfo.innerHTML = `
<h4>Available Female Voices (${femaleVoices.length}):</h4>
<ul>
${femaleVoices.map(voice =>
`<li>${voice.name} (${voice.lang}) ${voice === voiceManager.selectedVoice ? '⭐ Selected' : ''}</li>`
).join('')}
</ul>
`;
button.textContent = '✅ Voice Manager Ready';
button.className = 'enabled';
testButton.disabled = false;
} catch (error) {
voiceInfo.innerHTML = `<strong>Error:</strong> Failed to initialize voice manager - ${error.message}`;
button.textContent = '❌ Initialization Failed';
button.className = 'disabled';
}
};
window.testSpeak = function() {
if (!voiceManager) {
alert('Please initialize voice manager first');
return;
}
const testText = "Hello! I am your female voice assistant for the interactive scenarios. This voice will be used on both Windows and Mac platforms.";
voiceManager.speak(testText, {
onStart: () => console.log('🎤 TTS started'),
onEnd: () => console.log('🎤 TTS finished'),
onError: (error) => console.error('🎤 TTS error:', error)
});
};
window.stopSpeech = function() {
if (voiceManager) {
voiceManager.stop();
}
};
window.testScenarioSpeak = function() {
if (!voiceManager) {
alert('Please initialize voice manager first');
return;
}
const text = document.getElementById('scenario-text').value;
const arousal = document.getElementById('arousal-level').value;
const control = document.getElementById('control-level').value;
const intensity = document.getElementById('intensity-level').value;
// Process the text like in the game
const processedText = text
.replace(/\{arousal\}/g, arousal)
.replace(/\{control\}/g, control)
.replace(/\{intensity\}/g, intensity);
console.log('Original text:', text);
console.log('Processed text:', processedText);
voiceManager.speak(processedText, {
rate: 0.9,
pitch: 1.1,
onStart: () => console.log('🎤 Scenario TTS started'),
onEnd: () => console.log('🎤 Scenario TTS finished')
});
};
</script>
</body>
</html>

View File

@ -492,13 +492,13 @@ Enter your own text here to test how it sounds with TTS...
// Sample texts for testing (similar to your game content)
const sampleTexts = {
intro: "Welcome to your training session. Today you will learn the importance of focus and control. Your arousal will be carefully managed as you progress through each challenge. Remember, obedience and attention to detail are essential for success.",
intro: "Welcome to your training session. Today you will learn the importance of focus and concentration. Your excitement will be carefully managed as you progress through each challenge. Remember, obedience and attention to detail are essential for success.",
instruction: "Position yourself comfortably and maintain perfect stillness. Focus your attention on the screen while controlling your breathing. You must hold this position for exactly sixty seconds without any movement. Your discipline will be tested.",
instruction: "Position yourself comfortably and maintain perfect stillness. Focus your attention on the screen while maintaining your breathing. You must hold this position for exactly sixty seconds without any movement. Your discipline will be tested.",
feedback: "Excellent work. Your control is improving with each session. You maintained focus for the full duration and demonstrated proper obedience. Your arousal level is now at moderate intensity, exactly where it should be.",
feedback: "Excellent work. Your focus is improving with each session. You maintained concentration for the full duration and demonstrated proper obedience. Your excitement level is now at moderate levels, exactly where it should be.",
ending: "Training session completed successfully. Final state: Arousal High, Control Excellent. You have demonstrated exceptional focus and discipline throughout this session. Your progress has been documented and you may now proceed to the next level."
ending: "Training session completed successfully. Final state: Excitement High, Focus Excellent. You have demonstrated exceptional concentration and discipline throughout this session. Your progress has been documented and you may now proceed to the next level."
};
// Initialize TTS manager