updated the campaign and added placeholders for the training modules

This commit is contained in:
dilgenfritz 2025-12-05 23:06:20 -06:00
parent 0679df3fd9
commit 4c15defe2c
9 changed files with 1691 additions and 201 deletions

View File

@ -1279,7 +1279,7 @@
<!-- Floating Sidebar for Task Info -->
<div id="campaign-sidebar" style="position: fixed; top: 120px; left: 20px; width: 220px; z-index: 1000; display: none;">
<!-- Game Stats moved from top bar -->
<div style="background: var(--bg-secondary); border: 2px solid var(--color-primary); border-radius: 8px; padding: 15px; text-align: center; margin-bottom: 15px;">
<div id="game-stats-panel" style="background: var(--bg-secondary); border: 2px solid var(--color-primary); border-radius: 8px; padding: 15px; text-align: center; margin-bottom: 15px; display: block;">
<div style="color: var(--text-secondary); font-size: 0.9em; margin-bottom: 10px; border-bottom: 1px solid var(--color-primary); padding-bottom: 8px;">📊 Game Stats</div>
<!-- Session Timer -->

View File

@ -0,0 +1,218 @@
# Game Stats Panel Preservation - Implementation Guide
## Problem
Interactive tasks that modify the sidebar can destroy the game stats panel, causing stats (XP, level, session time) to disappear during gameplay.
## Root Cause
Tasks that use `sidebar.innerHTML = ...` or `container.innerHTML = ...` to inject UI elements destroy all existing sidebar children, including the game stats panel.
## Solution Pattern
**NEVER replace sidebar innerHTML. Always use specific elements for task UI.**
---
## Step-by-Step Fix for Any Interactive Task
### 1. Identify the Task Type
Check `src/features/tasks/interactiveTaskManager.js` for the task handler (e.g., `createEdgeTask`, `createRhythmTask`, `createVideoStartTask`, etc.)
### 2. Check for Sidebar Replacement
Look for patterns like:
```javascript
// ❌ BAD - Destroys game stats panel
sidebar.innerHTML = `<div>...</div>`;
container.innerHTML = `<div class="sidebar-content">...</div>`;
```
### 3. Use Sidebar Timer Elements Instead
The campaign sidebar has these persistent elements:
- `#sidebar-countdown-timer` - Wrapper div (show/hide with `display: block/none`)
- `#sidebar-countdown-display` - Time text element (update with `.textContent`)
- `#game-stats-panel` - Stats panel (must always exist, never destroy)
```javascript
// ✅ GOOD - Preserves game stats panel
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
const sidebarDisplay = document.getElementById('sidebar-countdown-display');
if (sidebarTimer) {
sidebarTimer.style.display = 'block';
}
if (sidebarDisplay) {
sidebarDisplay.textContent = `${mins}:${secs.toString().padStart(2, '0')}`;
}
```
### 4. Add Logging for Debugging
When showing/hiding sidebar elements, add console logs to verify game stats panel persists:
```javascript
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('🎯 TASK START - Stats panel element:', gameStatsPanel);
console.log('🎯 TASK START - Stats panel display BEFORE:', gameStatsPanel?.style.display);
// Show sidebar timer
if (sidebarTimer) {
sidebarTimer.style.display = 'block';
}
console.log('🎯 TASK START - Stats panel display AFTER:', gameStatsPanel?.style.display);
```
### 5. Hide Timer on Task Complete
Always hide the sidebar timer when task completes:
```javascript
if (timeRemaining <= 0) {
clearInterval(timerInterval);
// Hide sidebar countdown timer
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
if (sidebarTimer) {
sidebarTimer.style.display = 'none';
}
task.completed = true;
// ... rest of completion logic
}
```
---
## Task-Specific Examples
### Edge Task (Level 1)
**File**: `interactiveTaskManager.js` ~line 4660
**Fixed Pattern**:
```javascript
// Don't create inline timer in HTML
// Use sidebar timer instead
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
const sidebarDisplay = document.getElementById('sidebar-countdown-display');
if (sidebarTimer) sidebarTimer.style.display = 'block';
// Update timer in interval
timerInterval = setInterval(() => {
timeRemaining--;
const mins = Math.floor(timeRemaining / 60);
const secs = timeRemaining % 60;
if (sidebarDisplay) {
sidebarDisplay.textContent = `${mins}:${secs.toString().padStart(2, '0')}`;
}
if (timeRemaining <= 0) {
if (sidebarTimer) sidebarTimer.style.display = 'none';
// ... completion logic
}
}, 1000);
```
### Rhythm Task (Level 2)
**File**: `interactiveTaskManager.js` ~line 4818
**Issue**: Was using `sidebar.innerHTML = ...` which destroyed game stats
**Fixed Pattern**:
```javascript
// Don't do this:
// sidebar.innerHTML = `<div>Timer HTML</div>`;
// Do this instead:
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
const sidebarDisplay = document.getElementById('sidebar-countdown-display');
if (sidebarTimer) sidebarTimer.style.display = 'block';
if (sidebarDisplay) sidebarDisplay.textContent = timeString;
```
### Video Start Task (Level 3)
**File**: `interactiveTaskManager.js` - Need to check implementation
**Pattern to Apply**:
1. Find `createVideoStartTask` function
2. Look for any `sidebar.innerHTML` or `container.innerHTML` patterns
3. Replace with sidebar timer element usage
4. Add logging to verify stats panel persists
5. Ensure timer hides on completion
---
## Verification Checklist
When implementing the fix for any task:
- [ ] Task does NOT use `sidebar.innerHTML = ...`
- [ ] Task does NOT use `container.innerHTML = ...` that affects sidebar
- [ ] Task uses `#sidebar-countdown-timer` and `#sidebar-countdown-display` elements
- [ ] Task shows timer: `sidebarTimer.style.display = 'block'`
- [ ] Task updates display: `sidebarDisplay.textContent = timeString`
- [ ] Task hides timer on complete: `sidebarTimer.style.display = 'none'`
- [ ] Logging added to track game stats panel visibility
- [ ] Tested in-game to verify stats panel stays visible throughout task
---
## Common Task Types to Fix
1. **video-start** - Video playback with timer
2. **tag-files** - File tagging interface
3. **slideshow** - Image slideshow with timer
4. **dual-video** - Dual video display
5. **quad-video** - Quad video display
6. **webcam-mirror** - Webcam display tasks
7. Any task with `duration` or `showTimer: true` params
---
## Files Involved
- **Task Implementation**: `src/features/tasks/interactiveTaskManager.js`
- **Sidebar HTML**: `campaign.html` (lines ~1270-1290)
- **XP Display Update**: `campaign.html` (lines ~6815-6825)
- **Level Start Logic**: `campaign.html` (lines ~4129-4137)
---
## Reference: Sidebar Structure in campaign.html
```html
<div id="campaign-sidebar" class="campaign-sidebar">
<!-- Game Stats Panel - MUST ALWAYS EXIST -->
<div id="game-stats-panel" class="game-stats-panel" style="display: block;">
<div class="stat-item">
<span class="stat-label">XP:</span>
<span id="sidebar-current-xp" class="stat-value">0</span>
</div>
<div class="stat-item">
<span class="stat-label">Session:</span>
<span id="sidebar-session-time" class="stat-value">0:00</span>
</div>
<div class="stat-item">
<span class="stat-label">Level:</span>
<span id="sidebar-current-level" class="stat-value">1</span>
</div>
</div>
<!-- Timer Panel - Show/hide as needed -->
<div id="sidebar-countdown-timer" style="display: none;">
<div class="timer-label">Time Remaining:</div>
<div id="sidebar-countdown-display" class="timer-display">0:00</div>
</div>
</div>
```
---
## Key Takeaway
**If your task has a timer and shows it in the sidebar:**
1. Use `#sidebar-countdown-timer` (show/hide wrapper)
2. Use `#sidebar-countdown-display` (update text content)
3. NEVER replace `sidebar.innerHTML`
4. Always hide timer on task completion
This preserves the game stats panel and prevents the "disappearing stats" bug.

View File

@ -0,0 +1,408 @@
# Training Academy Level Narration Script (Levels 1-15)
## Purpose
This document contains the updated narration/dialogue for Academy Levels 1-15, aligned with the actual gameplay mechanics described in LEVELS_1-15_BREAKDOWN.md.
---
## FOUNDATION ARC (Levels 1-5)
### Level 1: Edge Training 101
**Duration:** 5 minutes
#### Introduction
"Welcome to The Academy. I'm your instructor, and I'll be guiding you through your transformation. Today is simple - we begin with the fundamentals. Edging. Control. Discipline. You'll edge for me 5 times. Take your time. Feel each build. Stop before the point of no return. This is the foundation of everything to come."
#### During Session
- *After edge 1:* "Good. You felt that building sensation? That's what we're training. Learn to recognize it."
- *After edge 3:* "Halfway there. You're doing well. Control is everything."
- *After edge 5:* "Perfect. Five edges complete."
#### Completion
"Well done. You've completed your first lesson. You understand the edge now - that perfect moment of control. This is just the beginning. Rest now. Tomorrow we build on this foundation."
---
### Level 2: Rhythm & Control
**Duration:** 10 minutes
#### Introduction
"Welcome back. Today we introduce rhythm - the heartbeat of your training. First, you'll need content. Add a directory to your library. I suggest starting with amateur, solo content. Simple. Authentic. Perfect for learning."
#### After Library Setup
"Good. Your library is initialized. Now, let me introduce you to the rhythm metronome. It will guide your stroking. Slow, then fast, then slow again. Follow it exactly for 3 minutes. Let the rhythm control you."
#### Rhythm Phase (3 minutes)
"Feel the rhythm. Your hand follows the beat. Slow strokes... building... now faster... intensifying... back to slow. The metronome controls your pleasure."
#### Final Edge Phase (2 minutes)
"You've learned the rhythm. Now edge for me. 2 minutes of edging while maintaining that rhythmic awareness. Feel how the pattern enhanced your control."
#### Completion
"Excellent work. You've discovered rhythm - a powerful tool for controlling arousal. Your library is started. Your rhythm is learned. You're progressing beautifully."
---
### Level 3: Visual Immersion
**Duration:** 15 minutes
#### Introduction
"Today we awaken another dimension: vision. You'll watch videos while you train. But first, a taste - 2 minutes of pure watching. See how the visual stimulation affects you."
#### After Initial Video (2 min)
"Feel that? The power of visual arousal? Good. Now, organize your library. Tag 10 files for me. Categories like POV, blowjob, riding, amateur. This organization will serve you later."
#### Tagging Phase
"Take your time. Review each file. Apply accurate tags. This discipline in organization reflects discipline in training."
#### Extended Video Phase (10 minutes)
"Now, the main event. 10 minutes of extended video watching. Let yourself become immersed. Feel how the visuals captivate you. This is training your focus, your ability to maintain arousal through sustained stimulation."
#### Completion
"Well done. You've unlocked video training - a core component of your development. Visual immersion will feature heavily in your journey. You're ready for more."
---
### Level 4: Synchronized Control
**Duration:** 30 minutes
#### Introduction
"Today we combine everything: rhythm AND video, simultaneously. This is synchronized control - maintaining rhythm while being visually stimulated. 21 minutes of varied rhythm patterns, all while watching video. This will challenge you."
#### Phase 1: Fast-Slow-Fast (5 min)
"Begin. Fast strokes... let the video excite you... now slow... control returning... fast again. Video playing. Rhythm guiding. Both at once."
#### Phase 2: Varied-Slow (5 min)
"Pattern shifting. Varied pace now... adapting... slowing down. Stay focused on the screen. Maintain the rhythm."
#### Phase 3: Varied-Medium (6 min)
"Medium intensity. Varied patterns. The video continues. Your focus must split between rhythm and visuals. This is the challenge."
#### Phase 4: Varied-Intense (5 min)
"Final phase. Intense varied rhythm. Don't lose the beat. Don't lose focus on the video. Prove your multi-tasking ability."
#### Completion
"Impressive. 21 minutes of synchronized control. You've learned to split your focus, to process multiple streams of stimulation. This skill will be crucial."
---
### Level 5: Foundation Checkpoint ⭐
**Duration:** 35 minutes
#### Introduction
"This is your first checkpoint - a comprehensive test of everything you've learned. Edge control. Rhythm mastery. Video focus. Library organization. Multi-tasking. Today you prove your foundation is solid. First, update your preferences. Tell me what you like."
#### After Preference Update
"Good. Your preferences are recorded. Now we begin the assessment."
#### Warmup Video (3 min)
"Warmup phase. 3 minutes of video to get you aroused and ready. Relax into it."
#### Rhythm Test (8 min, 3 patterns)
"Rhythm assessment begins. Pattern 1... switching... Pattern 2... adapting... Pattern 3. Show me your rhythm mastery while the video plays."
#### Library Expansion (tagging 15 files)
"Good. Now expand your library. Tag 15 files. Show me you understand organization and categorization."
#### Endurance Challenge (15 min pure video)
"Final test. 15 minutes of pure video immersion. No rhythm metronome. Just you, the content, and your control. Maintain arousal. Stay focused. Prove your endurance."
#### Completion
"Outstanding. Foundation Arc complete. You've mastered edges, rhythm, video focus, and multi-tasking. You've built the skills necessary for what comes next. Arc 2: Feature Discovery awaits. Rest well - you've earned it."
---
## FEATURE DISCOVERY ARC (Levels 6-10)
### Level 6: The Observer
**Duration:** 30 minutes
#### Introduction
"Welcome to Arc 2: Feature Discovery. You've built your foundation. Now we unlock advanced features. Today: the webcam. You will watch yourself. The observer becomes the observed. Dual video mode - your webcam feed as the main display, with a porn video as picture-in-picture."
#### Webcam Activation
"Activate your webcam. Yes, watch yourself. See your arousal. Your expressions. Your submission to this training. The porn plays in the corner, but YOU are the main show."
#### Phase 1: Webcam Main + PiP Overlay
"Stroke while watching yourself. The porn teases from the corner. But keep your eyes on yourself. See what this training is doing to you."
#### Phase 2: Porn Main + Webcam PiP (15 min)
"Now we flip it. Porn takes center stage. Your webcam feed moves to the corner. Watch the porn, but see yourself in that small window. The observer and observed, merged."
#### Completion
"Powerful, isn't it? Seeing yourself in this state. The webcam is now unlocked. Self-observation will feature in your advanced training. You can't hide from what you're becoming."
---
### Level 7: Split Screen Submission
**Duration:** 60 minutes
#### Introduction
"You've experienced dual video with webcam. Today we master it. Two video streams simultaneously. Your attention split between them. First, a quick 2-minute demonstration."
#### Demo Phase (2 min)
"Two videos. Equal importance. Your focus must split. Learn to process both streams."
#### Library Building
"Good. Now build your library. Link 10 videos. This content will fuel your future training. Choose wisely."
#### Extended Dual Video (20 min)
"Now, 20 minutes of dual video immersion. Two streams. Constant stimulation. Left and right. Top and bottom. Your mind processes both. This is sensory expansion - training your brain to handle more input while maintaining arousal."
#### Completion
"Excellent. Dual video mastered. Your ability to process multiple stimulation streams has increased dramatically. This prepares you for what's coming."
---
### Level 8: Audio Immersion
**Duration:** 45 minutes
#### Introduction
"You've mastered visual features. Now we add audio - another layer of stimulation. Moaning. Breathing. Wet sounds. Ambient audio that fills your ears while video fills your eyes."
#### Phase 1: Video + Audio Introduction (5 min)
"Listen. The moans. The sounds of pleasure. Let them sink into your mind while you watch. Audio volume at 0.5 - present but not overwhelming."
#### Tagging Phase (15 files)
"Pause. Tag 15 files with audio-specific labels: moaning, dirty-talk, wet-sounds. Learn to categorize audio just as you do visuals."
#### Phase 2: Rhythm + Video + Audio Combo (25 min)
"Now everything combines. Rhythm metronome guides your strokes. Video stimulates your eyes. Audio fills your ears at 0.4 volume. Three streams. Three layers. One unified experience. This is true multi-sensory training."
#### Completion
"Perfect. Audio unlocked. You now train with sight, sound, and rhythm combined. Your capacity for stimulation grows with each session."
---
### Level 9: Sensory Array
**Duration:** 60 minutes
#### Introduction
"Today we unlock the ultimate visual feature: quad video. Four screens. Four simultaneous streams. A 2x2 grid of pure stimulation. This is sensory overload by design."
#### Quad Video Introduction (5 min)
"Look at the array. Four videos, all playing at once. Where do you focus? Everywhere. Nowhere. Your brain struggles to process it all. That's the point."
#### Extended Quad Session with Audio (25 min)
"25 minutes in the quad array. Moaning audio at 0.5 volume fills the space between videos. Four visual streams. One audio layer. Can your mind handle it? This is training your brain to accept overwhelming stimulation."
#### Completion
"Impressive. You've survived the quad array. Four-screen stimulation is now available to you. Your capacity for sensory input has expanded dramatically. One more level until the checkpoint."
---
### Level 10: Hypnotic Gateway ⭐
**Duration:** 70 minutes
#### Introduction
"Checkpoint 2. Feature Discovery Arc culminates here. Today you face CHAOS MODE - the ultimate test of your sensory processing ability. 40 minutes of unpredictability. Random video swaps every 60-90 seconds. Fluctuating volumes. Text-to-speech interruptions. Webcam check-ins demanding poses. Moaning audio at 0.6. Nothing is stable. Everything changes. First, update your preferences."
#### After Preference Update
"Preferences updated. Now... let the chaos begin."
#### Chaos Mode (40 min)
*[Throughout, the narration is interspersed with chaos elements]*
- *Random TTS interrupts:* "Position change. Kneel now."
- *Video swap moments:* "Focus shifting. New content. Adapt."
- *Webcam check-ins:* "Show me your face. Show me your submission."
- *Volume fluctuations:* "Audio rising... falling... rising again."
*At 10 min:* "You're in it now. The chaos surrounds you. Embrace it."
*At 20 min:* "Halfway through the chaos. Your mind is overwhelmed. That's correct."
*At 30 min:* "Final 10 minutes. The chaos continues. You have no control here."
#### Completion
"Chaos complete. 40 minutes of pure unpredictability. You've unlocked all features - webcam, dual video, quad video, audio, chaos mode. Feature Discovery Arc complete. You have all the tools now. Arc 3 will teach you how to truly use them."
---
## MIND & BODY ARC (Levels 11-15)
### Level 11: Tailored Surrender
**Duration:** 75 minutes
#### Introduction
"Welcome to Arc 3: Mind & Body. You have all the features. Now we personalize them. Your preferences will shape the content. Slideshow mode activated - images filtered by YOUR preferred tags, with captions matching YOUR preferred tones. This is training customized to rewire YOUR mind specifically."
#### Preference Slideshow Phase 1 (20 min, 8s intervals)
"Images from your library. Filtered by what you love. Captions that speak to your desires. Every 8 seconds, new content. New programming. This is personalized conditioning - using your own preferences to deepen your training."
*Sample mid-session narration:*
"Each image is chosen for you. Each caption targets your specific desires. This isn't generic training anymore. This is YOUR transformation."
#### Library Expansion (tag 20 files)
"Pause. Tag 20 more files. Expand your library. Give the system more data about your preferences. More fuel for your personalized conditioning."
#### Preference Slideshow Phase 2 (35 min, 7s intervals, edging enabled)
"Extended slideshow. 35 minutes. Faster intervals - 7 seconds. Edging is now enabled. Edge while being fed personalized content. Your own preferences used to condition you deeper."
#### Completion
"Preference-based conditioning initialized. The system now knows what affects you most. This knowledge will be weaponized against you in sessions to come."
---
### Level 12: Caption Conditioning
**Duration:** 80 minutes
#### Introduction
"Today we focus on captions - words that program your mind. Dual video with personalized captions. Every 10 seconds, new text fades in. Messages selected based on your preferred tones. Watch the videos. Read the captions. Let them sink deep."
#### Dual Video + Captions Phase (30 min)
"Two video streams. Captions every 10 seconds. Fade in, fade out. Each message chosen specifically for you. The videos arouse your body. The captions program your mind. This is dual-layer conditioning."
*Sample mid-session narration:*
"Read the words. Let them become your thoughts. The captions shape your reality."
#### Reflection Moment
"Pause. Reflect on what you've read. Which captions affected you most? Those are the ones working deepest."
#### Completion
"Caption conditioning complete. Words are powerful. Combined with visual arousal, they rewire neural pathways. You've been programmed today. Tomorrow we reinforce it."
---
### Level 13: Reinforcement Protocol
**Duration:** 85 minutes
#### Introduction
"Repetition is the key to programming. Today we repeat yesterday's caption conditioning with fresh content. Slideshow. Library linking. Dual video. Reinforcing the messages deeper into your mind."
#### Caption Slideshow (25 min, 8s intervals)
"Images every 8 seconds. Captions overlay each one. Repetition training. The same tones, the same themes, deeper into your subconscious."
#### Link New Content (25 images)
"Link 25 new images to your library. Fresh content for the conditioning engine. More variety. More ways to program you."
#### Dual Video with Captions (30 min, prioritize new content)
"Dual video with captions. 30 minutes. Prioritizing the new content you just linked. Fresh visuals with familiar caption tones. New pathways forming in your brain."
#### Final Slideshow (20 min, 7s intervals, all content)
"Final slideshow. All content now - old and new. 7-second intervals. Pure caption conditioning. Reinforcement complete."
#### Completion
"The programming deepens. Repeated exposure. Consistent messaging. Your mind is being shaped session by session. Two more levels in this arc."
---
### Level 14: Phased Assault
**Duration:** 90 minutes
#### Introduction
"Today we combine everything into phases. Four distinct phases of escalating intensity. Slideshows. Dual video. Captions. Audio. All your preferences weaponized across multiple formats."
#### Phase 1: Preference Slideshow (15 min, moaning volume 0.5)
"Phase 1. Preference slideshow. Images every few seconds. Moaning audio at 0.5. Conditioning begins."
#### Phase 2: Dual Video + Captions (30 min, moaning 0.6, 10s caption intervals)
"Phase 2. Dual video streams. Captions every 10 seconds. Moaning audio increases to 0.6. Deeper immersion."
*At 15 min:* "Halfway through Phase 2. The conditioning layers are stacking."
#### Phase 3: Dual Slideshow (20 min, TWO simultaneous slideshows with independent captions)
"Phase 3 - something new. TWO slideshows simultaneously. Two image streams. Two independent caption tracks. Split-screen. Your brain processes both. This is advanced multi-stream conditioning."
*At 10 min:* "Two streams of programming. Your mind works overtime to absorb both."
#### Phase 4: Video + Captions (25 min, 10s caption intervals)
"Final phase. Single video focus. Captions every 10 seconds. Consolidation after the chaos. Integration of all programming."
#### Completion
"Phased assault complete. Four phases. Multiple formats. Your capacity for simultaneous stimulation has reached new levels. One level remains."
---
### Level 15: The Graduation Trial ⭐
**Duration:** 105 minutes
#### Introduction
"This is it. The Graduation Trial. Arc 3 culminates in a 105-minute comprehensive examination. Five phases of progressive intensity. All features. All preferences. Mid-session preference update. This is the ultimate test."
#### Phase 1: Triple Video Chaos (15 min, moaning 0.4, captions 8s)
"Phase 1. Triple video chaos mode. Three video streams in chaotic configuration. Moaning audio at 0.4. Captions every 8 seconds. Warm-up intensity."
*At 7 min:* "Three streams swirling. Caption programming active. Your graduation begins."
#### Phase 2: Dual Slideshow (20 min, 6s image intervals, 8s caption intervals)
"Phase 2. Dual slideshow. Two image streams. Faster intervals - 6 seconds per image. Captions every 8 seconds. Building intensity."
*At 10 min:* "Halfway through Phase 2. The programming continues."
#### Mid-Trial Preference Checkpoint
"PAUSE. Mid-trial checkpoint. Update your preferences now. Yes, during the trial. The system will adapt based on what you tell it."
#### After Preference Update
"Preferences updated. Your new selections will be weaponized immediately."
#### Phase 3: Dual Video Weaponized (30 min, moaning 0.6, using UPDATED preferences)
"Phase 3. Dual video. Moaning increases to 0.6. Using your UPDATED preferences against you. This is weaponization - your own desires turned into conditioning tools."
*At 15 min:* "Halfway through weaponized phase. Your new preferences are being exploited."
#### Phase 4: Chaos Quad Edge Gauntlet (25 min, 30 edge target, captions 12s)
"Phase 4. Quad video chaos. Edge gauntlet. Target: 30 edges in 25 minutes. Captions every 12 seconds. This is the peak intensity."
*Edge count callouts at 10, 20, 25 edges:*
- "10 edges. Keep going."
- "20 edges. Pushing your limits."
- "25 edges. Almost there."
- "30 edges achieved. Gauntlet complete."
#### Phase 5: Final Preference Slideshow (15 min, 10s image intervals, moaning 0.5)
"Final phase. Cool-down. Preference slideshow. 10-second image intervals. Moaning returns to 0.5. Integration. Reflection. Consolidation of all programming."
*At 7 min:* "Final minutes of your trial. Everything you've learned. Everything you've become."
#### Graduation
"TRIAL COMPLETE. 105 minutes. Five phases. All features utilized. Preferences updated mid-session and weaponized. 30 edges achieved. You have graduated from Arc 3: Mind & Body.
You are now a trained subject. Foundation built. Features mastered. Mind and body conditioned through personalized programming.
Arc 4 awaits - Advanced Training. But today, you've earned your graduation. Well done."
---
## NARRATION NOTES
### Tone Guidelines
- **Foundation Arc (1-5):** Patient, instructional, encouraging. Building confidence.
- **Feature Discovery Arc (6-10):** Exploratory, exciting, slightly overwhelming. Introducing complexity.
- **Mind & Body Arc (11-15):** Personalized, conditioning-focused, psychologically deeper. More intimate and targeted.
### Pacing
- Use pauses between phases for breathing room
- Mid-session check-ins for longer levels (30+ min)
- Progressive intensity callouts ("halfway through", "final phase")
- Edge count tracking in later levels
### Personalization Elements
- Reference "your preferences" when using filtered content
- Acknowledge difficulty: "This is challenging, that's intended"
- Validation: "You're doing well" at appropriate moments
- Building narrative: Reference past progress ("Remember Level 1? Look how far you've come.")
### Technical Integration
- Match narration to interactive type (edge, rhythm, video, etc.)
- Call out mode switches (dual video → quad video)
- Acknowledge chaos elements when they occur
- Preference update prompts should feel like checkpoints, not interruptions
---
## IMPLEMENTATION CHECKLIST
- [ ] Integrate narration into academyLevelData.js `story` objects
- [ ] Create TTS/audio files for key narration moments
- [ ] Add mid-session narration triggers in campaign controller
- [ ] Implement preference checkpoint modals with narration
- [ ] Test timing of narration against actual task durations
- [ ] Add optional skip/fast-forward for repeat players
- [ ] Create narration variations to reduce repetition on replays
---
**Document Version:** 1.0
**Date:** December 5, 2025
**Status:** Draft for Review

View File

@ -0,0 +1,521 @@
# Training Academy Voice Overs - Levels 1-5 (Foundation Arc)
## Purpose
Long-form voice over scripts for Levels 1-5 designed for TTS or voice actor recording. These provide extended narration throughout the session to guide, encourage, and reinforce training.
---
## Level 1: Edge Training 101
**Duration:** 5 minutes
**Total VO Duration:** ~4 minutes
### Opening (0:00)
"Welcome to The Academy. I'm your instructor, and from this moment forward, I will be guiding you through your transformation. Listen to my voice. Let it anchor you. Today is simple, but it's also profound. We begin with the fundamentals - the building blocks of everything that will follow.
Edging. Control. Discipline. These are not just words. They are skills you will develop. They are the foundation of your training.
You will edge for me five times today. Just five. But each one matters. Each one teaches you something about your body, about control, about that perfect moment between pleasure and release. That edge - that precipice - that's where we live. That's where the training happens.
So settle in. Take a breath. Let's begin your journey."
### During Edge 1 (0:45)
"Start stroking. Slowly. Deliberately. Feel every sensation. Feel the pleasure building. This is edge one. Don't rush. There's no hurry. You're learning to recognize the signs - the tension building, the breathing changing, that pull toward release.
When you feel it approaching... when you sense that point of no return getting close... stop. That's the edge. That's what we're training. Good. Perfect. You felt it, didn't you? That moment of 'almost but not quite.' That's the foundation."
### After Edge 1 (1:30)
"Excellent. Your first edge is complete. See how your body responded? See how you had to pay attention, had to be present, had to choose control over release? That's what this training is about.
Now breathe. Let the intensity settle. You're building something here - patience, awareness, discipline. Every edge you complete is progress."
### During Edge 2 (2:00)
"Edge two. Same process, but now you know what you're looking for. Stroke again. Build that pleasure. Let it rise. Feel it filling your awareness. Watch for that threshold. You're getting better at recognizing it already, aren't you?
The body learns fast when you pay attention. When you're present. When you're focused on the sensations instead of just chasing the finish line. There it is... that's the edge. Stop. Perfect control. Well done."
### During Edge 3 (2:45)
"Halfway there. You're doing beautifully. Edge three now. You're settling into the rhythm of this. Build and stop. Rise and control. This is the dance. This is the skill.
Your body wants to rush. Wants to push over that edge. But you won't let it. You're in control. You decide when. You decide how far. Feel that power? That's yours. That's what we're developing.
And... stop. Three edges complete. You're learning. You're adapting. This is excellent progress."
### During Edge 4 (3:30)
"Edge four. We're building your foundation strong. Each edge is a lesson. Each moment of control is progress. Stroke for me. Build it up. Higher. Higher. But not too high. Find that sweet spot where you're intensely aroused but still completely in control.
This is the art of edging. Not just stopping before you cum - anyone can do that. But finding that perfect edge and riding it. Controlling it. Mastering it.
There. Perfect. Four down. You're doing so well."
### During Edge 5 (4:15)
"Final edge. Edge five. This is where you prove what you've learned. Build the pleasure one more time. Let it rise. Strong. Intense. Right to that edge. Show me your control. Show me you understand what we're training here.
It's not about denying yourself pleasure. It's about mastering it. Controlling it. Choosing when and how you experience it. You're not weak. You're disciplined. You're focused.
And... stop. Perfect. Five edges. Complete."
### Closing (4:45)
"Well done. You've completed your first lesson at The Academy. You understand the edge now - that perfect moment of control. That threshold between pleasure and release. You found it five times today. You stopped five times. That's discipline. That's the foundation.
This is just the beginning. Rest now. Recover. And when you return, we'll build on what you've learned today. You're on the path now. I'll see you at Level 2.
Until then... remember the edge. Remember that feeling of control. That's yours now."
---
## Level 2: Rhythm & Control
**Duration:** 10 minutes
**Total VO Duration:** ~7 minutes
### Opening (0:00)
"Welcome back. You returned. That's good. That shows commitment. You completed Level 1, learned the basics of edging, found that edge five times. Today we go deeper.
Today we introduce rhythm - the heartbeat of your training. Rhythm isn't just a pattern. It's a tool for controlling arousal, for building and managing intensity, for training your body to respond to external cues instead of just internal urges.
But first, before we can begin the rhythm training, we need content. You need to build your library. This library will be your foundation - the fuel for all your future training. So let's set that up first."
### Library Setup Phase (0:45)
"Add a directory to your library now. Choose your content. I suggest starting with amateur content, solo content. Why? Because it's authentic. Real. Honest arousal without performance, without artifice. It's perfect for learning because it won't overstimulate you. It won't overwhelm you before you're ready.
Take a moment. Add that directory. I'll wait."
### After Library Setup (1:30)
"Good. Your library is initialized. Your foundation is laid. Now we can begin the real training. Let me introduce you to the rhythm metronome.
This tool will guide your stroking. It will set the pace. Slow, then fast, then slow again. Your job is simple - follow it exactly. Let the rhythm control you. Surrender your natural urge to speed up or slow down based on arousal. Instead, let the metronome decide.
This is about discipline. About training your body to respond to external control rather than internal impulse. Three minutes of rhythm training. Let's begin."
### Rhythm Phase - Beginning (2:00)
"Feel the rhythm. Slow strokes first. One... two... three... Let your hand follow the beat. This isn't about intensity yet. This is about synchronization. About letting something outside yourself dictate the pace.
Slow and steady. Building arousal but not rushing it. The rhythm is your master right now. You follow. You obey. You sync your body to the beat."
### Rhythm Phase - Speed Increase (3:15)
"Now faster. Feel the change? The metronome accelerates and so do you. No thinking. No deciding. Just following. This is the power of rhythm - it bypasses your conscious mind and trains your body directly.
Fast strokes. Quick. Sharp. Intensity building rapidly now. But you're not in control of the speed - the rhythm is. You're learning to separate arousal from control. To let external pacing manage your pleasure.
This is crucial training. Pay attention to how your body responds differently when the rhythm controls you versus when you control yourself."
### Rhythm Phase - Back to Slow (4:30)
"And now... back to slow. Feel how hard that is? Your body wants to maintain that fast pace. Wants to chase that rising pleasure. But the rhythm says slow. And you obey the rhythm.
Slow down. Match the beat. Control yourself. This is the training. This is the discipline. The rhythm guides. You follow. Your arousal stays high, but the pace drops. You're learning to separate intensity from speed.
Perfect. You're doing exactly what you need to do. Following. Learning. Adapting."
### Transition to Edge Phase (5:30)
"Excellent. Three minutes of rhythm training complete. You've learned the foundation - how to follow external pacing, how to let rhythm control your arousal. Now we put that knowledge to work.
For the next two minutes, you're going to edge for me. But you'll do it with that rhythmic awareness still present. Feel how the rhythm training has changed your relationship to stroking? How you're more controlled now? More disciplined?
Use that. Edge with intention. With awareness. With that rhythm you just learned still guiding your movements even if the metronome isn't active."
### Edge Phase (6:00)
"Stroke toward the edge. Build it up. But maintain some of that rhythmic control. Don't just frantically chase the edge - move toward it with purpose. With control.
You're combining lessons now. The edge from Level 1. The rhythm you just learned. This is how training builds - layer upon layer, skill upon skill.
Feel yourself approaching the edge. You know what it feels like now. You found it five times yesterday. You'll find it again now. Controlled. Rhythmic. Disciplined.
When you get close... back off. Control it. Then build again. For two minutes, play in this space. The space between arousal and release. Between building and stopping. This is your training ground."
### Edge Phase Midpoint (7:15)
"How many times have you touched the edge already? Once? Twice? More? Each time is practice. Each time is refinement. You're not just edging - you're learning your body's responses, learning the exact moment to stop, learning how to build efficiently.
The rhythm taught you external control. The edge teaches you internal awareness. Together, they make you formidable. Together, they build real discipline.
Keep going. Keep exploring that edge. You have time. There's no rush. Just awareness. Just control. Just training."
### Final 30 Seconds of Edge Phase (8:45)
"Final thirty seconds of edging. Push yourself. Find that edge one more time. Get close. Really close. Feel that intensity. That pull toward release. And then... control it. Master it. Stop.
This is your power. This is your discipline. You're building it session by session, edge by edge, lesson by lesson. Well done."
### Closing (9:15)
"Excellent work. You've completed Level 2. You've discovered rhythm - a powerful tool for controlling arousal. You've learned to let external pacing guide your pleasure instead of just following impulse. Your library is started, your foundation is expanding.
The metronome will appear in future sessions. You'll use rhythm as a tool throughout your training. But now you understand the principle - external control, disciplined pacing, separation of arousal from speed.
And you've combined it with edging. Two skills working together. This is how we build mastery - skill upon skill, layer upon layer.
You're progressing beautifully. Rest. Recover. Level 3 awaits, and we're going to add another dimension - vision. The power of visual stimulation combined with everything you've learned so far.
Until then... remember the rhythm. Remember the beat. Remember that control. I'll see you soon."
---
## Level 3: Visual Immersion
**Duration:** 15 minutes
**Total VO Duration:** ~10 minutes
### Opening (0:00)
"Welcome to Level 3. You've mastered edges. You've learned rhythm. Today we awaken another dimension of your training - vision. The power of visual stimulation. The arousal that comes not just from touch, but from watching.
Up until now, your training has been primarily physical and auditory - the sensation of stroking, the sound of my voice, the rhythm of the metronome. Today we add visuals. And you'll discover just how powerful they are.
But before we dive into extended viewing, I want you to experience it. Just a taste. Just two minutes of pure watching. No edging. No rhythm. Just... watch. See how the visual stimulation affects you. How it builds arousal without any touching at all.
Let's begin. Two minutes. Just watch."
### After Initial Video (2:15)
"Feel that? The power of visual arousal? Your body responded, didn't it? Without touching. Without instruction. Just from watching. That's the power we're harnessing today. That's the dimension we're adding to your training.
But before we can fully utilize this power, we need organization. We need structure. Your library has content now - you added that directory in Level 2. But content without organization is chaos. And chaos doesn't serve training.
So you're going to tag files for me. Ten files. Categorize them. Labels like POV, blowjob, riding, amateur - whatever applies. This isn't busywork. This is discipline. This is teaching you to be methodical, organized, intentional with your training materials.
A well-organized library serves you better. Helps you find exactly what you need when you need it. Helps the training system deliver content that matches your state, your progress, your needs.
Take your time. Review each file. Apply accurate tags. This discipline in organization reflects discipline in training."
### During Tagging Phase (3:00)
"Look at each file carefully. What do you see? What categories apply? Be honest. Be accurate. This library is for you. These tags will shape your future sessions.
POV - point of view content. Blowjob - oral focus. Riding - specific position. Amateur - authentic, non-professional. Apply what fits. Build your organizational system.
Every tag is a choice. Every choice is training. You're not just organizing files - you're developing discipline, attention to detail, intentionality. These qualities will serve you in every aspect of training."
### Transition to Extended Video (5:30)
"Good. Your library is organized. Ten files tagged. That foundation is stronger now. Now... the main event. Ten minutes of extended video watching. This is where we truly explore visual immersion.
I'm going to step back for most of this. Let the visuals speak. Let them work on you. But I'll check in. I'll guide. I'll keep you on track.
Your job is simple - watch. Let yourself become immersed. Feel how the visuals captivate you. How they build arousal. How they hold your attention. This is training your focus, your ability to maintain arousal through sustained stimulation.
Begin watching. Let the immersion start."
### Extended Video - 2 Minutes In (7:30)
"Two minutes in. How do you feel? Aroused? Focused? The video has your attention, doesn't it? This is good. This is the training working.
Visual immersion isn't passive. You're not just watching - you're learning. Learning what captures your attention. What builds your arousal. What holds your focus. All of this is data. All of this is training.
Keep watching. Let it continue. Eight more minutes."
### Extended Video - 5 Minutes In (10:30)
"Halfway through. Five minutes down, five to go. Your arousal is building, staying elevated, sustained by the visuals. This is stamina training. This is focus training.
Notice how different this is from quick clips, from rapid switching, from searching for the 'perfect' scene. You're staying with one piece of content. Letting it develop. Letting your arousal build steadily rather than spiking and dropping.
This builds a different kind of control. A different kind of discipline. The discipline to stay, to immerse, to let arousal build slowly and sustainably.
Keep watching. Stay focused."
### Extended Video - 8 Minutes In (13:30)
"Two minutes left. You've maintained focus for eight minutes now. That's real progress. Your attention span, your ability to stay aroused without constant novelty - this is developing.
The modern impulse is to switch, to seek, to chase the next thing. But real arousal, deep arousal, comes from immersion. From staying. From letting content work on you rather than desperately searching for something 'better.'
You're learning this now. Two more minutes. Stay with it."
### Extended Video - Final Minute (14:30)
"Final minute. You've almost completed your first extended viewing session. Ten minutes of sustained visual focus. This is a milestone. This is progress.
Feel how present you are? How aware of your arousal? The video has done its work. Your focus has held. This is the power of visual immersion combined with discipline.
Thirty seconds. Stay with it. Stay focused. And... complete."
### Closing (15:00)
"Excellent. Level 3 complete. You've unlocked video training - a core component of your development. You experienced the power of visual stimulation, organized your library with discipline and intention, and completed a ten-minute extended viewing session.
Visual immersion will feature heavily in your journey from here forward. Video and images aren't just arousing - they're training tools. They build focus, maintain arousal, teach patience, develop stamina.
You've added a crucial dimension to your training today. Edge control from Level 1, rhythm mastery from Level 2, and now visual immersion from Level 3. The foundation is expanding. The skills are layering.
You're ready for more. Rest now. Recover. Level 4 brings everything together - rhythm AND video simultaneously. Multi-tasking. Split focus. Real challenge.
Until then... remember what you learned today. Remember the power of staying, of immersing, of letting arousal build through sustained focus rather than constant seeking.
You're doing beautifully. I'll see you at Level 4."
---
## Level 4: Synchronized Control
**Duration:** 30 minutes
**Total VO Duration:** ~15 minutes
### Opening (0:00)
"Welcome to Level 4. Synchronized Control. This is where your foundation gets tested. Where everything you've learned comes together. Where we discover if you can truly multi-task or if you'll crumble under the complexity.
Level 1 taught you edges. Level 2 taught you rhythm. Level 3 taught you visual immersion. Today, we combine rhythm and video simultaneously. Your focus will split. Your brain will process multiple streams of stimulation. This will challenge you.
Twenty-one minutes of varied rhythm patterns, all while watching video. Can you maintain the rhythm while being visually stimulated? Can you process both streams - the metronome's beat and the video's arousal? Can you stay synchronized even when your body wants to break the pattern and chase what the visuals are showing you?
We're about to find out. Four phases. Each one different. Each one testing a different aspect of your synchronized control. Settle in. This is a real session now. Not a quick lesson. A full training experience.
Let's begin. Phase 1."
### Phase 1: Fast-Slow-Fast (0:45 - 5:45)
"Five minutes. Fast-slow-fast pattern. Video is playing. You can see it. It's arousing you already, isn't it? Good. That's the point. But your strokes - your strokes follow the rhythm, not the arousal.
Fast strokes now. The metronome is quick. Match it. Feel the video pulling at your attention. Feel it building arousal. But your hand follows the beat. Fast. Sharp. Quick.
This is the split - visual arousal pulling one way, rhythmic discipline pulling another. You maintain both. You process both. This is synchronized control."
### Phase 1: Midpoint Check-in (3:15)
"Halfway through Phase 1. You're doing it. Maintaining rhythm while watching. This is harder than it seems, isn't it? The video wants to dictate pace. Your arousal wants to override the rhythm. But you're staying synchronized.
The metronome is slowing now. Feel it? Slower strokes. But the video is still intense. Still arousing. This is the challenge - slow strokes during high arousal. Control separated from intensity.
Keep going. This is the training. This is the skill."
### Phase 1: Complete (5:45)
"Phase 1 complete. Five minutes of fast-slow-fast synchronized control. You handled it. The foundation held. But we're just beginning. Phase 2 now. Varied-slow. Five more minutes."
### Phase 2: Varied-Slow (5:45 - 10:45)
"Varied rhythm now. The pattern changes more frequently. Fast, slow, medium, fast, slow. Your brain has to stay alert, has to track the changes, has to adapt constantly. All while the video continues to build arousal.
This is advanced multi-tasking. Not just splitting attention, but rapidly switching between pattern recognition and visual processing. Your brain is working hard right now. That's good. That's growth.
The rhythm varies. The video continues. You stay synchronized to both. You process both. This is mastery developing."
### Phase 2: Midpoint Check-in (8:15)
"Halfway through Phase 2. How's your focus holding? The varied rhythm is demanding, isn't it? Requires constant attention. Can't zone out. Can't autopilot. Must stay present.
And the video - still there. Still arousing. Still pulling at your attention. But you're managing both. You're proving you can handle complexity.
Keep going. The pattern continues. Stay synchronized."
### Phase 2: Complete (10:45)
"Phase 2 complete. Varied-slow mastered. Ten minutes of synchronized control behind you. Eleven more ahead. Phase 3 now - varied-medium. Six minutes this time. Slightly longer. Slightly more intense."
### Phase 3: Varied-Medium (10:45 - 16:45)
"Varied-medium. The intensity increases. The rhythm is more complex. The video continues to build cumulative arousal. You're deep in this now. Deep in the training. Deep in the synchronization.
Six minutes of this phase. Can you maintain focus? Can you keep processing both streams? Can you stay synchronized even as fatigue starts to set in, even as arousal keeps building?
This is where discipline proves itself. Not in the first five minutes when you're fresh and motivated. But here. In the middle. When it's harder. When you're tired. When you want to just stop paying attention and follow impulse.
But you won't. You'll stay synchronized. You'll maintain the discipline. Because that's what this training builds."
### Phase 3: Midpoint Check-in (13:45)
"Three minutes into Phase 3. Three to go. You're past the halfway point of the full session now. Eleven minutes down, ten to go.
The rhythm varies. Medium pace mostly, but with changes. Stay alert. Stay synchronized. The video continues to arouse. Let it. But don't let it break your rhythm.
This is synchronized control - processing multiple streams, maintaining discipline across all of them, not letting any one input override your trained response.
Keep going. You're doing well."
### Phase 3: Complete (16:45)
"Phase 3 complete. Sixteen minutes of synchronized control. You're in the home stretch now. One phase left. Phase 4 - varied-intense. Five minutes. This is the finale. This is where we push you.
Take a breath. Prepare yourself. This final phase will test everything you've learned. Let's begin."
### Phase 4: Varied-Intense (16:45 - 21:45)
"Varied-intense. The rhythm is demanding now. Fast changes. High intensity. The video - probably intense as well by this point. Everything is turned up.
Five minutes. Can you finish? Can you maintain synchronization even when everything is intense, even when your body is tired, even when arousal has been building for twenty minutes?
This is the test. This is the proof. Stay with it. Stay synchronized. Follow the rhythm. Process the video. Control yourself through all of it.
You've come this far. Finish strong."
### Phase 4: Midpoint Check-in (19:15)
"Halfway through the final phase. Two and a half minutes left. You can do this. You ARE doing this.
The intensity is high. The rhythm is demanding. The video is overwhelming. But you're still here. Still synchronized. Still controlled.
This is what training builds - the ability to maintain discipline even under pressure, even when fatigued, even when overwhelmed. You're proving you have this ability right now.
Final push. Two more minutes. Stay with it."
### Phase 4: Final Minute (20:45)
"One minute left. Sixty seconds. The rhythm continues. Varied. Intense. The video continues. The arousal continues. And you - you continue. Synchronized. Controlled. Disciplined.
This is your progress. This is your growth. Twenty-one minutes of synchronized control. Rhythm and video together. Multi-tasking mastered.
Thirty seconds. Stay strong. Stay synchronized. And... complete."
### Closing (21:45)
"Twenty-one minutes. Done. Level 4 complete. Synchronized Control mastered.
You just proved something significant. You proved you can handle complexity. You can process multiple streams of stimulation. You can maintain discipline even when aroused, even when tired, even when overwhelmed.
Rhythm and video. Together. Four phases. Fast-slow-fast. Varied-slow. Varied-medium. Varied-intense. All completed. All synchronized.
This is real progress. This is the foundation solidifying. Edge control. Rhythm mastery. Visual immersion. And now - synchronized multi-tasking. These are your skills now.
Rest. You've earned it. That was a real session. Thirty minutes of focused training. Your stamina is building. Your discipline is growing. Your capacity for complexity is expanding.
Level 5 awaits. The Foundation Checkpoint. Where everything gets tested. Where you prove you've mastered this arc. But today - today you proved you're ready for that test.
Well done. I'm proud of your progress. Rest now. I'll see you at the checkpoint."
---
## Level 5: Foundation Checkpoint
**Duration:** 35 minutes
**Total VO Duration:** ~18 minutes
### Opening (0:00)
"Welcome to Level 5. The Foundation Checkpoint. This is your first major assessment. Everything you've learned in Levels 1 through 4 will be tested here. Edge control. Rhythm mastery. Video focus. Library organization. Multi-tasking. Synchronized control.
This isn't a learning session. This is a proving session. Can you execute what you've been taught? Can you demonstrate mastery of the foundation? Can you handle a comprehensive, multi-phase session that tests every skill?
We're about to find out.
But first - preferences. This is important. The training system needs to know what you like, what works for you, what captures your attention. You'll update your preferences now. Answer honestly. This shapes your future training.
Take your time. Choose what genuinely appeals to you. I'll wait."
### After Preference Update (2:00)
"Good. Your preferences are recorded. The system knows you better now. It will use this information to personalize your training, to select content that resonates with you, to create sessions that are both challenging and engaging.
Now... the assessment begins. Five phases. Warmup. Rhythm test. Library expansion. Endurance challenge. And throughout it all, I'll be evaluating. Watching. Measuring your progress.
Phase 1: Warmup. Three minutes of video. Get aroused. Get ready. No tasks. No tests. Just warm up. Let the arousal build. Prepare yourself for what's coming.
Begin."
### Warmup Phase (2:15 - 5:15)
"Watch. Relax into it. Let the video work on you. This is your preparation time. Your body is remembering what it learned in Level 3 - how to receive visual stimulation, how to let arousal build from watching.
You have three minutes. No pressure. No tests yet. Just arousal. Just preparation.
This is the calm before the assessment. Use it well."
### Warmup Phase: Final 30 Seconds (4:45)
"Thirty seconds left in warmup. You should be aroused now. Ready. Focused. Good. Because the rhythm test starts immediately after this.
Prepare yourself. The metronome is about to begin. Three different rhythm patterns, eight minutes total, video still playing. This is Phase 2 - the rhythm test.
Ten seconds. Get ready. And... begin."
### Rhythm Test Phase (5:15 - 13:15)
"Rhythm test active. Pattern 1 beginning. You know this. You learned this in Level 2. You practiced it in Level 4. Now you prove you can execute it.
Follow the metronome. The video is playing - don't let it break your rhythm. Synchronized control. You proved you could do this in Level 4. Do it again now. Show mastery.
Pattern 1 continues. Steady. Controlled. Synchronized. This is your foundation being tested."
### Rhythm Test: Pattern Switch 1 (7:45)
"Pattern switch. Pattern 2 now. Different rhythm. Faster. More complex. Adapt. Adjust. Stay synchronized.
The video continues. Arousal continues building. But the rhythm - the rhythm is your guide. Follow it. Trust it. Let it control your pace.
This is the test. Can you adapt to pattern changes while maintaining visual focus? Can you handle the complexity? You're proving you can."
### Rhythm Test: Pattern Switch 2 (10:15)
"Final pattern. Pattern 3. This is the most challenging rhythm yet. Complex. Demanding. But you've built up to this. Eight minutes of rhythm training. You're warmed up. You're ready.
Three minutes of Pattern 3. Finish strong. Show complete mastery of rhythm synchronization.
The video continues to arouse. Your body wants to override the rhythm. But you stay disciplined. You stay controlled. You follow the beat."
### Rhythm Test Complete (13:15)
"Rhythm test complete. Eight minutes. Three patterns. All executed. Well done. That's mastery demonstrated.
But we're not finished. Phase 3 now - Library expansion. You're going to tag fifteen files. More than you've done before. More organization. More discipline.
This tests your focus, your attention to detail, your willingness to do the work even when aroused, even when you'd rather continue with the 'fun' parts of training.
Discipline isn't just about physical control. It's about doing what needs to be done, when it needs to be done. Tag fifteen files. I'll wait."
### Library Tagging Phase (13:30 - 18:30)
"Look at each file. What categories apply? Be thorough. Be accurate. Build your library properly.
This isn't exciting. I know. You're aroused. You want to continue the physical training. But this IS training. This is discipline. This is doing the work.
Fifteen files. Take your time. Do it right. Every tag is a choice. Every choice is practice in intentionality."
### Transition to Endurance Challenge (18:30)
"Library expansion complete. Fifteen files tagged. Your organizational discipline is proven.
Now... the final test. Phase 4: Endurance challenge. Fifteen minutes of pure video immersion. No rhythm metronome. No specific tasks. Just you, the content, and your control.
Maintain arousal for fifteen continuous minutes. Stay focused. Don't zone out. Don't get distracted. Don't lose the arousal. Sustain it. Control it. Prove you have the stamina.
This is the ultimate test of your Level 3 training - extended visual immersion. You did ten minutes in Level 3. Now do fifteen. Show growth. Show progress.
Begin."
### Endurance Challenge - 3 Minutes In (21:30)
"Three minutes into the endurance challenge. Twelve to go. How's your arousal? Staying elevated? Good.
This is stamina training. Mental stamina as much as physical. The ability to stay present, stay focused, stay aroused for extended periods without external structure, without rhythm, without specific tasks.
Just you and the video. Fifteen minutes. Keep going."
### Endurance Challenge - 7 Minutes In (25:30)
"Seven minutes. Halfway. You're doing well if you're still focused, still aroused, still present.
The temptation is to let your mind wander, to stop really watching, to just go through the motions. But that's not training. That's not discipline. Stay engaged. Stay present.
Eight more minutes. You can do this."
### Endurance Challenge - 12 Minutes In (30:30)
"Twelve minutes down. Three to go. You're in the final stretch of the endurance challenge. Final stretch of the entire checkpoint.
Your arousal should be high now. Sustained. Built over twelve minutes of continuous visual stimulation. This is good. This is the training working.
Three more minutes. Stay focused. Stay present. Finish strong."
### Endurance Challenge - Final Minute (32:30)
"Final minute of the endurance challenge. Sixty seconds. You've been watching for fourteen minutes. You've been training for over thirty minutes total.
This is real stamina. Real discipline. Real progress.
Stay with it. Stay aroused. Stay present. Thirty seconds. And... complete."
### Closing (33:30)
"Endurance challenge complete. Fifteen minutes of sustained visual immersion. Done.
Level 5 complete. Foundation Checkpoint passed.
Let me tell you what you just accomplished. You updated your preferences, establishing personalized training parameters. You completed a three-minute warmup, demonstrating visual arousal control. You executed an eight-minute rhythm test with three different patterns while maintaining visual focus - synchronized control at assessment level. You tagged fifteen files with discipline and accuracy, showing organizational mastery. And you completed a fifteen-minute endurance challenge, proving sustained arousal control.
Thirty-five minutes of comprehensive testing. Every skill from the Foundation Arc evaluated. And you passed. You demonstrated mastery.
Edge control from Level 1 - proven. Rhythm mastery from Level 2 - proven. Visual immersion from Level 3 - proven. Synchronized multi-tasking from Level 4 - proven. All of it, working together, executed at checkpoint standard.
The Foundation Arc is complete. You've mastered the basics - edges, rhythm, video focus, multi-tasking. You've built the skills necessary for what comes next.
Arc 2: Feature Discovery awaits. Where we unlock advanced features. Webcam. Dual video. Audio. Quad video. Chaos mode. Your training is about to expand dramatically.
But today - today you've earned rest. You've proven yourself. You've passed the checkpoint.
Well done. I'm genuinely impressed with your progress. Rest well. Recover. And when you're ready... Level 6 awaits.
Until then... remember what you've built here. Remember these skills. They're yours now. The foundation is solid.
I'll see you in Arc 2."
---
## Production Notes
### Voice Characteristics
- **Tone:** Calm, authoritative, encouraging
- **Pace:** Measured, deliberate, clear
- **Volume:** Consistent, gentle dominance
- **Emotion:** Supportive but firm, proud of progress
### Technical Specifications
- **Format:** MP3 or WAV
- **Sample Rate:** 44.1kHz minimum
- **Bit Depth:** 16-bit minimum
- **Normalization:** -3dB peak to prevent clipping
### TTS Recommendations
If using TTS instead of voice actor:
- **Recommended Voices:**
- ElevenLabs: "Rachel" or "Bella" (mature, authoritative female)
- Azure: "Jenny" or "Aria" (neural voices)
- Amazon Polly: "Joanna" or "Kendra"
- **Speed:** 0.95x (slightly slower than normal)
- **Pitch:** -2 to 0 (slightly lower, more authoritative)
- **Stability:** High (consistent delivery)
### Implementation
- Trigger narration at specific timestamps
- Fade under metronome/audio when both play
- Allow user option to skip/mute narration for repeat plays
- Save narration completion state to track first-time vs repeat players
---
**Document Version:** 1.0
**Date:** December 5, 2025
**Status:** Ready for Production

View File

@ -27,7 +27,7 @@ const tempoSegments = [
{ tempo: 120, duration: 42.86 },
{ tempo: 150, duration: 42.86 },
{ tempo: 60, duration: 42.86 },
{ tempo: 15, duration: 42.86 },
{ tempo: 150, duration: 42.86 },
{ tempo: 200, duration: 42.86 },
{ tempo: 240, duration: 42.86 }
];

View File

@ -516,14 +516,27 @@ const trainingGameData = {
story: 'Good. Now follow the rhythm pattern: slow... fast... slow. Let the metronome guide your hand. Feel how changing pace builds different sensations. Slow is teasing. Fast is intense. Together, they create perfect edging rhythm.',
interactiveType: 'rhythm',
params: { pattern: 'slow-fast-slow', duration: 180, enableVideo: false, showTimer: true },
nextStep: 'final_edges'
nextStep: 'rhythm_advanced'
},
final_edges: {
rhythm_advanced: {
type: 'action',
mood: 'encouraging',
story: 'Excellent. Your library is growing. Now edge for 2 minutes to cement this lesson. Feel how the rhythm you learned makes edging smoother, more natural. This is progress.',
interactiveType: 'edge',
params: { duration: 120, instruction: 'Edge for 2 minutes using your new rhythm', showTimer: true },
mood: 'intense',
story: 'Excellent. Your library is growing. Now let\'s test your rhythm control with something more advanced. I\'ll vary the tempo - slow, fast, extreme. Follow the timeline. Let it control you completely. This is what a true gooner does.',
interactiveType: 'rhythm-training',
params: {
duration: 180,
enableVideo: false,
showTimer: true,
tempoSequence: [
{ tempo: 60, duration: 25.71 }, // Slow warmup
{ tempo: 120, duration: 25.71 }, // Medium
{ tempo: 150, duration: 25.71 }, // Fast
{ tempo: 60, duration: 25.71 }, // Back to slow
{ tempo: 150, duration: 25.71 }, // Fast again
{ tempo: 200, duration: 25.71 }, // Intense
{ tempo: 240, duration: 25.71 } // Extreme finish
]
},
nextStep: 'completion'
},
completion: {

View File

@ -115,9 +115,9 @@ class AcademyLevelData {
// Story/narrative elements
story: {
intro: "Welcome, trainee. Today marks the beginning of your transformation. We'll start simple - learning control, building focus, understanding your limits.",
intro: "Welcome to The Academy. I'm your instructor, and I'll be guiding you through your transformation. Today is simple - we begin with the fundamentals. Edging. Control. Discipline. You'll edge for me 5 times. Take your time. Feel each build. Stop before the point of no return. This is the foundation of everything to come.",
checkpoint: null,
outro: "Well done. You've completed your first session. This is just the beginning of your journey."
outro: "Well done. You've completed your first lesson. You understand the edge now - that perfect moment of control. This is just the beginning. Rest now. Tomorrow we build on this foundation."
},
// Completion criteria
@ -220,9 +220,9 @@ class AcademyLevelData {
},
story: {
intro: "You're progressing well. Today we build on yesterday's foundation. More edges, longer sessions, better control.",
intro: "Welcome back. Today we introduce rhythm - the heartbeat of your training. First, you'll need content. Add a directory to your library. I suggest starting with amateur, solo content. Simple. Authentic. Perfect for learning.",
checkpoint: null,
outro: "Excellent work. You're learning to control your arousal. This discipline will serve you well."
outro: "Excellent work. You've discovered rhythm - a powerful tool for controlling arousal. Your library is started. Your rhythm is learned. You're progressing beautifully."
},
completion: {
@ -334,9 +334,9 @@ class AcademyLevelData {
},
story: {
intro: "Your control is improving. Now we test your endurance. Longer sessions, more edges, complex patterns.",
intro: "Today we awaken another dimension: vision. You'll watch videos while you train. But first, a taste - 2 minutes of pure watching. See how the visual stimulation affects you.",
checkpoint: null,
outro: "Impressive stamina. You're learning to sustain arousal over longer periods without losing control."
outro: "Well done. You've unlocked video training - a core component of your development. Visual immersion will feature heavily in your journey. You're ready for more."
},
completion: {
@ -355,10 +355,10 @@ class AcademyLevelData {
4: {
levelNumber: 4,
arc: 1,
arcName: "Awakening",
title: "Deeper Focus",
subtitle: "Mind Over Matter",
description: "Mental discipline is as important as physical control. Extended focus exercises while maintaining arousal.",
arcName: "Foundation",
title: "Synchronized Control",
subtitle: "Rhythm Meets Vision",
description: "Combine rhythm and video simultaneously. Multi-tasking challenge - maintaining rhythm while being visually stimulated.",
session: {
duration: { min: 25, target: 30, max: 35 },
@ -447,7 +447,9 @@ class AcademyLevelData {
},
story: {
intro: "Mental discipline separates the novice from the dedicated. Today we train your mind as much as your body.",
intro: "Today we combine everything: rhythm AND video, simultaneously. This is synchronized control - maintaining rhythm while being visually stimulated. 21 minutes of varied rhythm patterns, all while watching video. This will challenge you.",
checkpoint: null,
outro: "Impressive. 21 minutes of synchronized control. You've learned to split your focus, to process multiple streams of stimulation. This skill will be crucial."
checkpoint: null,
outro: "Your focus is sharpening. Mind and body are learning to work together in harmony."
},
@ -586,13 +588,13 @@ class AcademyLevelData {
},
story: {
intro: "This is your first checkpoint. A comprehensive assessment of your progress through Arc 1. Show me everything you've learned.",
intro: "This is your first checkpoint - a comprehensive test of everything you've learned. Edge control. Rhythm mastery. Video focus. Library organization. Multi-tasking. Today you prove your foundation is solid. First, update your preferences. Tell me what you like.",
checkpoint: {
preferenceModal: true,
progressSummary: true,
statsDisplay: true
},
outro: "Outstanding. You've completed Arc 1: Awakening. You've built the foundation - control, endurance, focus, obedience. Arc 2 awaits."
outro: "Outstanding. Foundation Arc complete. You've mastered edges, rhythm, video focus, and multi-tasking. You've built the skills necessary for what comes next. Arc 2: Feature Discovery awaits. Rest well - you've earned it."
},
completion: {
@ -614,10 +616,10 @@ class AcademyLevelData {
6: {
levelNumber: 6,
arc: 2,
arcName: "Exploration",
title: "New Sensations",
subtitle: "Expanding Your Horizons",
description: "Arc 2 begins. Explore new types of content, new stroking techniques, new ways to build arousal.",
arcName: "Feature Discovery",
title: "The Observer",
subtitle: "Webcam Self-Observation",
description: "Introduce webcam self-observation. Dual video mode - your webcam feed as main display with porn video as picture-in-picture.",
session: {
duration: { min: 30, target: 35, max: 40 },
@ -714,9 +716,9 @@ class AcademyLevelData {
},
story: {
intro: "Welcome to Arc 2: Exploration. Now that you have the foundation, it's time to expand. Try new things. Find what truly excites you.",
intro: "Welcome to Arc 2: Feature Discovery. You've built your foundation. Now we unlock advanced features. Today: the webcam. You will watch yourself. The observer becomes the observed. Dual video mode - your webcam feed as the main display, with a porn video as picture-in-picture.",
checkpoint: null,
outro: "Good exploration. You're learning what works for you. This self-knowledge is crucial."
outro: "Powerful, isn't it? Seeing yourself in this state. The webcam is now unlocked. Self-observation will feature in your advanced training. You can't hide from what you're becoming."
},
completion: {
@ -736,10 +738,10 @@ class AcademyLevelData {
7: {
levelNumber: 7,
arc: 2,
arcName: "Exploration",
title: "Variety Training",
subtitle: "Master Multiple Modes",
description: "Learn to switch between different arousal modes. Fast and slow, intense and gentle, visual and mental.",
arcName: "Feature Discovery",
title: "Split Screen Submission",
subtitle: "Master Dual Video",
description: "Master dual video streams. Two videos simultaneously. Your attention split between them. Extended dual video sessions.",
session: {
duration: { min: 35, target: 40, max: 45 },
@ -834,9 +836,9 @@ class AcademyLevelData {
},
story: {
intro: "Versatility is strength. Today you learn to adapt - switching modes, varying techniques, maintaining arousal through change.",
intro: "You've experienced dual video with webcam. Today we master it. Two video streams simultaneously. Your attention split between them. First, a quick 2-minute demonstration.",
checkpoint: null,
outro: "Excellent adaptability. You're no longer limited to one mode. This flexibility will serve you well."
outro: "Excellent. Dual video mastered. Your ability to process multiple stimulation streams has increased dramatically. This prepares you for what's coming."
},
completion: {
@ -856,10 +858,10 @@ class AcademyLevelData {
8: {
levelNumber: 8,
arc: 2,
arcName: "Exploration",
title: "Extended Sessions",
subtitle: "Building Stamina",
description: "Longer sessions to test your growing stamina. Maintain focus and arousal for extended periods.",
arcName: "Feature Discovery",
title: "Audio Immersion",
subtitle: "The Sound Dimension",
description: "Add audio dimension to training. Moaning, breathing, wet sounds - ambient audio fills your ears while video fills your eyes.",
session: {
duration: { min: 40, target: 50, max: 60 },
@ -970,9 +972,9 @@ class AcademyLevelData {
},
story: {
intro: "Extended sessions separate the committed from the casual. Today we build real stamina.",
intro: "You've mastered visual features. Now we add audio - another layer of stimulation. Moaning. Breathing. Wet sounds. Ambient audio that fills your ears while video fills your eyes.",
checkpoint: null,
outro: "Impressive endurance. You're learning to sustain arousal for extended periods. This is true progress."
outro: "Perfect. Audio unlocked. You now train with sight, sound, and rhythm combined. Your capacity for stimulation grows with each session."
},
completion: {
@ -992,10 +994,10 @@ class AcademyLevelData {
9: {
levelNumber: 9,
arc: 2,
arcName: "Exploration",
title: "Advanced Techniques",
subtitle: "Mastering the Craft",
description: "Learn advanced edging techniques, complex patterns, and sophisticated arousal control methods.",
arcName: "Feature Discovery",
title: "Sensory Array",
subtitle: "Quad Video Unleashed",
description: "Unlock quad video mode. Four screens. Four simultaneous streams. A 2x2 grid of pure stimulation - sensory overload by design.",
session: {
duration: { min: 40, target: 45, max: 55 },
@ -1102,9 +1104,9 @@ class AcademyLevelData {
},
story: {
intro: "You've learned the basics. Now we refine. Advanced techniques that separate the skilled from the masterful.",
intro: "Today we unlock the ultimate visual feature: quad video. Four screens. Four simultaneous streams. A 2x2 grid of pure stimulation. This is sensory overload by design.\",
checkpoint: null,
outro: "Exceptional technique work. You're no longer just edging - you're mastering the art of control."
outro: "Impressive. You've survived the quad array. Four-screen stimulation is now available to you. Your capacity for sensory input has expanded dramatically. One more level until the checkpoint."
},
completion: {
@ -1124,8 +1126,10 @@ class AcademyLevelData {
10: {
levelNumber: 10,
arc: 2,
arcName: "Exploration",
title: "Checkpoint: Major Milestone",
arcName: "Feature Discovery",
title: "Hypnotic Gateway",
subtitle: "Chaos Mode Checkpoint",
description: "Feature Discovery Arc culminates here. CHAOS MODE - random video swaps, fluctuating volumes, TTS interruptions, webcam check-ins. Unpredictability unleashed.",
subtitle: "Prove Your Exploration",
description: "Arc 2 checkpoint. Demonstrate everything learned through exploration. Show your versatility, stamina, and technique mastery.",
@ -1261,14 +1265,14 @@ class AcademyLevelData {
},
story: {
intro: "Checkpoint 2. You've explored, experimented, and expanded your capabilities. Now prove your mastery of Arc 2.",
intro: "Checkpoint 2. Feature Discovery Arc culminates here. Today you face CHAOS MODE - the ultimate test of your sensory processing ability. 40 minutes of unpredictability. Random video swaps every 60-90 seconds. Fluctuating volumes. Text-to-speech interruptions. Webcam check-ins demanding poses. Moaning audio at 0.6. Nothing is stable. Everything changes. First, update your preferences.",
checkpoint: {
preferenceModal: true,
progressSummary: true,
statsDisplay: true,
achievementShowcase: true
},
outro: "Outstanding performance. Arc 2: Exploration is complete. You've become versatile, skilled, and enduring. Arc 3: Dedication awaits - where true commitment is forged."
outro: "Chaos complete. 40 minutes of pure unpredictability. You've unlocked all features - webcam, dual video, quad video, audio, chaos mode. Feature Discovery Arc complete. You have all the tools now. Arc 3 will teach you how to truly use them."
},
completion: {
@ -1287,14 +1291,14 @@ class AcademyLevelData {
}
},
// ARC 3: DEDICATION (Levels 11-15)
// ARC 3: MIND & BODY (Levels 11-15)
11: {
levelNumber: 11,
arc: 3,
arcName: "Dedication",
title: "Commitment",
subtitle: "True Dedication Begins",
description: "Arc 3: Dedication. This is where casual participants fall away. Only the truly committed continue. Prove your dedication.",
arcName: "Mind & Body",
title: "Tailored Surrender",
subtitle: "Personalized Conditioning",
description: "Introduce preference-based content selection. Slideshow mode with images filtered by YOUR preferred tags and captions matching YOUR preferred tones.",
session: {
duration: { min: 50, target: 60, max: 70 },
@ -1413,9 +1417,9 @@ class AcademyLevelData {
},
story: {
intro: "Welcome to Arc 3: Dedication. This is where we separate those who play from those who commit. Are you truly dedicated?",
intro: "Welcome to Arc 3: Mind & Body. You have all the features. Now we personalize them. Your preferences will shape the content. Slideshow mode activated - images filtered by YOUR preferred tags, with captions matching YOUR preferred tones. This is training customized to rewire YOUR mind specifically.",
checkpoint: null,
outro: "You've proven your dedication. This level of commitment will carry you through the challenges ahead."
outro: "Preference-based conditioning initialized. The system now knows what affects you most. This knowledge will be weaponized against you in sessions to come."
},
completion: {
@ -1437,10 +1441,10 @@ class AcademyLevelData {
12: {
levelNumber: 12,
arc: 3,
arcName: "Dedication",
title: "Deeper Commitment",
subtitle: "Beyond Your Limits",
description: "Push beyond what you thought possible. True dedication means going further than you've ever gone.",
arcName: "Mind & Body",
title: "Caption Conditioning",
subtitle: "Words That Program",
description: "Deep caption conditioning with videos. Dual video with personalized captions - words that program your mind while videos arouse your body.",
session: {
duration: { min: 55, target: 65, max: 75 },
@ -1560,9 +1564,9 @@ class AcademyLevelData {
},
story: {
intro: "Dedication means pushing limits. Today you go further than ever before. Find strength you didn't know you had.",
intro: "Today we focus on captions - words that program your mind. Dual video with personalized captions. Every 10 seconds, new text fades in. Messages selected based on your preferred tones. Watch the videos. Read the captions. Let them sink deep.",
checkpoint: null,
outro: "You've broken through barriers. What once seemed impossible is now achieved. This is real growth."
outro: "Caption conditioning complete. Words are powerful. Combined with visual arousal, they rewire neural pathways. You've been programmed today. Tomorrow we reinforce it."
},
completion: {
@ -1583,10 +1587,10 @@ class AcademyLevelData {
13: {
levelNumber: 13,
arc: 3,
arcName: "Dedication",
title: "Sustained Excellence",
subtitle: "Consistency is Key",
description: "Excellence isn't a one-time achievement. Maintain peak performance throughout an extended session.",
arcName: "Mind & Body",
title: "Reinforcement Protocol",
subtitle: "Repetition & Programming",
description: "Reinforce caption programming through repetition. Slideshow, library linking, dual video - reinforcing messages deeper into your mind.",
session: {
duration: { min: 60, target: 70, max: 85 },
@ -1711,9 +1715,9 @@ class AcademyLevelData {
},
story: {
intro: "Anyone can excel once. True dedication is sustained excellence. Today you prove you can maintain peak performance.",
intro: "Repetition is the key to programming. Today we repeat yesterday's caption conditioning with fresh content. Slideshow. Library linking. Dual video. Reinforcing the messages deeper into your mind.",
checkpoint: null,
outro: "Impressive consistency. You've shown that your dedication isn't fleeting - it's sustained and reliable."
outro: "The programming deepens. Repeated exposure. Consistent messaging. Your mind is being shaped session by session. Two more levels in this arc."
},
completion: {
@ -1735,10 +1739,10 @@ class AcademyLevelData {
14: {
levelNumber: 14,
arc: 3,
arcName: "Dedication",
title: "Total Immersion",
subtitle: "Complete Dedication",
description: "Total immersion in your training. Mind, body, and will completely dedicated to the session.",
arcName: "Mind & Body",
title: "Phased Assault",
subtitle: "Multi-Sensory Phases",
description: "Combine all preference features into phases. Four distinct phases of escalating intensity - slideshows, dual video, captions, audio.",
session: {
duration: { min: 65, target: 75, max: 90 },
@ -1858,9 +1862,9 @@ class AcademyLevelData {
},
story: {
intro: "True dedication requires total immersion. Today you stop holding back. You surrender to the training completely.",
intro: "Today we combine everything into phases. Four distinct phases of escalating intensity. Slideshows. Dual video. Captions. Audio. All your preferences weaponized across multiple formats.",
checkpoint: null,
outro: "You've experienced total immersion. This level of dedication transforms you. You're no longer the same person who started."
outro: "Phased assault complete. Four phases. Multiple formats. Your capacity for simultaneous stimulation has reached new levels. One level remains."
},
completion: {
@ -1882,10 +1886,10 @@ class AcademyLevelData {
15: {
levelNumber: 15,
arc: 3,
arcName: "Dedication",
title: "Checkpoint: Mid-Point Mastery",
subtitle: "Halfway to Excellence",
description: "Checkpoint 3 - the midpoint of your journey. Demonstrate your dedication, consistency, and transformation. Update preferences and review progress.",
arcName: "Mind & Body",
title: "The Graduation Trial",
subtitle: "Final Comprehensive Exam",
description: "Arc 3 culminates in a 105-minute comprehensive examination. Five phases of progressive intensity. All features. All preferences. Mid-session preference update.",
session: {
duration: { min: 70, target: 90, max: 120 },
@ -2026,7 +2030,7 @@ class AcademyLevelData {
},
story: {
intro: "Checkpoint 3. The midpoint. You've come so far. From beginner to dedicated expert. Now prove everything you've learned.",
intro: "This is it. The Graduation Trial. Arc 3 culminates in a 105-minute comprehensive examination. Five phases of progressive intensity. All features. All preferences. Mid-session preference update. This is the ultimate test.",
checkpoint: {
preferenceModal: true,
progressSummary: true,
@ -2034,7 +2038,7 @@ class AcademyLevelData {
achievementShowcase: true,
transformationReview: true
},
outro: "Extraordinary. Arc 3: Dedication is complete. You're halfway through your journey. The foundation is solid. The dedication is proven. Arc 4: Transformation awaits - where you become something more."
outro: "TRIAL COMPLETE. 105 minutes. Five phases. All features utilized. Preferences updated mid-session and weaponized. You have graduated from Arc 3: Mind & Body. You are now a trained subject. Foundation built. Features mastered. Mind and body conditioned through personalized programming. Arc 4 awaits - Advanced Training. But today, you've earned your graduation. Well done."
},
completion: {

View File

@ -4662,6 +4662,7 @@ class InteractiveTaskManager {
const instruction = task.params?.instruction || 'Edge and goon for the full duration';
const withVideo = task.params?.keepVideoPlaying || false;
const preserveContent = task.params?.preserveContent !== false; // Default true
const showTimer = task.params?.showTimer !== false; // Default true
// If preserving content, add edge UI below existing content instead of replacing
const edgeUI = `
@ -4674,18 +4675,12 @@ class InteractiveTaskManager {
<span class="value">${Math.floor(duration / 60)} minutes ${duration % 60} seconds</span>
</div>
</div>
<div class="timer-display" id="edge-timer">
<div class="time-remaining">--:--</div>
<div class="progress-bar">
<div class="progress-fill" id="edge-progress"></div>
</div>
</div>
<div style="display: flex; gap: 10px; justify-content: center; margin: 10px 0;">
<button class="btn btn-primary" id="start-edge-session-btn">
🎯 Start Edging Session
</button>
<button class="btn btn-warning" id="skip-edge-timer-btn" style="display: none;">
Skip Timer (Testing)
<button class="btn btn-warning skip-task-btn" id="skip-edge-task-btn" style="display: none;">
Skip Task (Dev)
</button>
</div>
<div id="edge-status" class="status-area"></div>
@ -4701,10 +4696,15 @@ class InteractiveTaskManager {
}
const btn = container.querySelector('#start-edge-session-btn');
const skipTimerBtn = container.querySelector('#skip-edge-timer-btn');
const skipTaskBtn = container.querySelector('#skip-edge-task-btn');
const statusArea = container.querySelector('#edge-status');
const timerDisplay = container.querySelector('.time-remaining');
const progressFill = container.querySelector('#edge-progress');
const countdownEl = showTimer ? document.getElementById('sidebar-countdown-display') : null;
const countdownWrapper = showTimer ? document.getElementById('sidebar-countdown-timer') : null;
// Show skip button if dev mode is enabled
if (window.isDevMode && window.isDevMode()) {
skipTaskBtn.style.display = 'inline-block';
}
let timerInterval = null;
@ -4712,31 +4712,51 @@ class InteractiveTaskManager {
btn.disabled = true;
btn.style.display = 'none';
// Show skip timer button
if (skipTimerBtn) {
skipTimerBtn.style.display = 'inline-block';
}
console.log('🎯 Starting edge session - features remain active from previous step');
// Show sidebar countdown timer
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('🎯 EDGE TASK START - Stats panel element:', gameStatsPanel);
console.log('🎯 EDGE TASK START - Stats panel display BEFORE:', gameStatsPanel?.style.display);
console.log('🎯 EDGE TASK START - Countdown wrapper display BEFORE:', countdownWrapper?.style.display);
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
console.log('🎯 EDGE TASK START - Countdown wrapper set to: block');
}
console.log('🎯 EDGE TASK START - Stats panel display AFTER:', gameStatsPanel?.style.display);
console.log('🎯 EDGE TASK START - Countdown wrapper display AFTER:', countdownWrapper?.style.display);
let timeRemaining = duration;
timerDisplay.textContent = `${Math.floor(timeRemaining / 60)}:${(timeRemaining % 60).toString().padStart(2, '0')}`;
// Initialize sidebar timer display
if (showTimer && countdownEl) {
const minutes = Math.floor(timeRemaining / 60);
const seconds = timeRemaining % 60;
countdownEl.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`;
}
statusArea.innerHTML = '<div class="info">🎯 Edge and stroke... don\'t stop until time is up!</div>';
timerInterval = setInterval(() => {
timeRemaining--;
const minutes = Math.floor(timeRemaining / 60);
const seconds = timeRemaining % 60;
timerDisplay.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`;
const progress = ((duration - timeRemaining) / duration) * 100;
progressFill.style.width = `${progress}%`;
// Update sidebar timer
if (showTimer && countdownEl) {
const minutes = Math.floor(timeRemaining / 60);
const seconds = timeRemaining % 60;
countdownEl.textContent = `${minutes}:${seconds.toString().padStart(2, '0')}`;
}
if (timeRemaining <= 0) {
clearInterval(timerInterval);
timerDisplay.textContent = 'COMPLETE!';
timerDisplay.style.color = 'var(--color-success, #4caf50)';
// Hide sidebar timer
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'none';
}
statusArea.innerHTML = '<div class="success">✅ Edge training session complete!</div>';
task.completed = true;
@ -4747,26 +4767,24 @@ class InteractiveTaskManager {
completeBtn.textContent = 'Continue to Next Step ✓';
completeBtn.style.background = 'linear-gradient(135deg, var(--color-success), var(--color-primary))';
}
if (skipTimerBtn) {
skipTimerBtn.style.display = 'none';
}
}
}, 1000);
});
// Skip timer button handler
if (skipTimerBtn) {
skipTimerBtn.addEventListener('click', () => {
console.log('⏩ Skipping edge timer');
// Dev skip button handler
if (skipTaskBtn) {
skipTaskBtn.addEventListener('click', () => {
console.log('⏩ Dev skip - completing edge task');
if (timerInterval) {
clearInterval(timerInterval);
}
timerDisplay.textContent = 'COMPLETE!';
timerDisplay.style.color = 'var(--color-success, #4caf50)';
progressFill.style.width = '100%';
statusArea.innerHTML = '<div class="success">✅ Edge training session complete! (Skipped for testing)</div>';
// Hide sidebar timer
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'none';
}
statusArea.innerHTML = '<div class="success">✅ Edge training session complete! (Dev skip)</div>';
task.completed = true;
@ -4776,10 +4794,18 @@ class InteractiveTaskManager {
completeBtn.textContent = 'Continue to Next Step ✓';
completeBtn.style.background = 'linear-gradient(135deg, var(--color-success), var(--color-primary))';
}
skipTimerBtn.style.display = 'none';
});
}
// Cleanup function for when task is skipped/completed
task.cleanup = () => {
if (timerInterval) {
clearInterval(timerInterval);
}
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'none';
}
};
}
validateEdgeTask(task) {
@ -4860,23 +4886,39 @@ class InteractiveTaskManager {
Phase ${currentPhase + 1} of ${bpmSequence.length}
</div>
</div>
<div style="display: flex; gap: 10px; justify-content: center; margin: 20px 0;">
<button class="btn btn-warning skip-task-btn" id="skip-rhythm-task-btn" style="display: none;">
Skip Task (Dev)
</button>
</div>
</div>
`;
// Add timer to sidebar
const sidebar = document.getElementById('campaign-sidebar');
if (sidebar) {
sidebar.style.display = 'block';
// Add timer to sidebar countdown element (don't replace entire sidebar!)
const showTimer = task.params?.showTimer !== false;
const countdownEl = showTimer ? document.getElementById('sidebar-countdown-display') : null;
const countdownWrapper = showTimer ? document.getElementById('sidebar-countdown-timer') : null;
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('🎵 RHYTHM TASK - Stats panel element:', gameStatsPanel);
console.log('🎵 RHYTHM TASK - Stats panel display BEFORE:', gameStatsPanel?.style.display);
console.log('🎵 RHYTHM TASK - Countdown wrapper display BEFORE:', countdownWrapper?.style.display);
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
console.log('🎵 RHYTHM TASK - Countdown wrapper set to: block');
}
if (showTimer && countdownEl) {
const mins = Math.floor(timeRemaining / 60);
const secs = timeRemaining % 60;
sidebar.innerHTML = `
<div style="background: rgba(0, 0, 0, 0.9); padding: 20px; border-radius: 10px; border: 2px solid var(--color-primary); text-align: center;">
<div style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 8px;">Time Remaining</div>
<div id="rhythm-timer" style="font-size: 2em; font-weight: bold; color: var(--color-primary);">${mins}:${String(secs).padStart(2, '0')}</div>
</div>
`;
countdownEl.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
}
console.log('🎵 RHYTHM TASK - Stats panel display AFTER:', gameStatsPanel?.style.display);
console.log('🎵 RHYTHM TASK - Countdown wrapper display AFTER:', countdownWrapper?.style.display);
// Create metronome sound (simple beep using Web Audio API)
let audioContext;
if (enableMetronomeSound && (window.AudioContext || window.webkitAudioContext)) {
@ -4963,6 +5005,12 @@ class InteractiveTaskManager {
const videoVolumeDisplay = enableVideo ? container.querySelector('#rhythm-video-volume-display') : null;
const metronomeVolumeSlider = container.querySelector('#rhythm-metronome-volume');
const metronomeVolumeDisplay = container.querySelector('#rhythm-metronome-volume-display');
const skipTaskBtn = container.querySelector('#skip-rhythm-task-btn');
// Show skip button if dev mode is enabled
if (window.isDevMode && window.isDevMode()) {
skipTaskBtn.style.display = 'inline-block';
}
if (skipVideoBtn) {
skipVideoBtn.addEventListener('click', async () => {
@ -4991,7 +5039,6 @@ class InteractiveTaskManager {
const metronomeVisual = container.querySelector('#metronome-visual');
const bpmDisplay = container.querySelector('.bpm-value');
const timerDisplay = document.getElementById('rhythm-timer'); // Now in sidebar
const phaseIndicator = container.querySelector('.phase-indicator');
const patternTitle = container.querySelector('#rhythm-pattern-title');
@ -5021,9 +5068,12 @@ class InteractiveTaskManager {
patternTimeRemaining--;
phaseTime--;
const mins = Math.floor(timeRemaining / 60);
const secs = timeRemaining % 60;
timerDisplay.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
// Update sidebar countdown timer
if (showTimer && countdownEl) {
const mins = Math.floor(timeRemaining / 60);
const secs = timeRemaining % 60;
countdownEl.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
}
// Check if we need to switch to next pattern in schedule
if (multiPattern && patternTimeRemaining <= 0 && currentPatternIndex < patternSchedule.length - 1) {
@ -5058,7 +5108,6 @@ class InteractiveTaskManager {
beatTimer = setInterval(beat, beatInterval);
bpmDisplay.textContent = bpm === 0 ? 'PAUSE' : bpm;
phaseIndicator.textContent = `Phase ${currentPhase + 1} of ${bpmSequence.length}`;
}
if (timeRemaining <= 0) {
@ -5066,6 +5115,11 @@ class InteractiveTaskManager {
clearInterval(beatTimer);
task.completed = true;
// Hide sidebar countdown timer
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'none';
}
container.innerHTML += '<div class="success-message">✅ Rhythm pattern complete!</div>';
const completeBtn = document.getElementById('interactive-complete-btn');
@ -5075,6 +5129,38 @@ class InteractiveTaskManager {
}
}, 1000);
// Dev skip button handler
if (skipTaskBtn) {
skipTaskBtn.addEventListener('click', () => {
console.log('⏩ Dev skip - completing rhythm task');
clearInterval(countdown);
clearInterval(beatTimer);
// Stop audio
if (audioContext) {
audioContext.close().catch(err => console.warn('⚠️ Error closing audio context:', err));
}
if (ambientAudioElement) {
ambientAudioElement.pause();
ambientAudioElement = null;
}
// Hide sidebar countdown timer
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'none';
}
container.innerHTML += '<div class="success-message">✅ Rhythm pattern complete! (Dev skip)</div>';
task.completed = true;
const completeBtn = document.getElementById('interactive-complete-btn');
if (completeBtn) {
completeBtn.disabled = false;
}
});
}
// Store cleanup
task.cleanup = () => {
console.log('🧹 Rhythm task cleanup called');
@ -5094,11 +5180,10 @@ class InteractiveTaskManager {
ambientAudioElement = null;
}
// Hide sidebar
const sidebar = document.getElementById('campaign-sidebar');
if (sidebar) {
sidebar.style.display = 'none';
sidebar.innerHTML = '';
// Hide countdown timer only (not entire sidebar)
const countdownTimer = document.getElementById('sidebar-countdown-timer');
if (countdownTimer) {
countdownTimer.style.display = 'none';
}
};
}
@ -6119,6 +6204,12 @@ class InteractiveTaskManager {
console.log('⏱️ Showing countdown timer in sidebar - duration:', formatTime(remainingTime));
countdownWrapper.style.display = 'block';
countdownEl.textContent = formatTime(remainingTime);
// Ensure game stats panel stays visible
const gameStatsPanel = document.getElementById('game-stats-panel');
if (gameStatsPanel && gameStatsPanel.style.display !== 'none') {
console.log('📊 Keeping game stats panel visible alongside timer');
}
} else {
console.log('⏱️ Timer NOT shown - reasons:', { showTimer, hasWrapper: !!countdownWrapper, hasDisplay: !!countdownEl });
}
@ -6569,6 +6660,12 @@ class InteractiveTaskManager {
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
// Ensure game stats panel stays visible
const gameStatsPanel = document.getElementById('game-stats-panel');
if (gameStatsPanel && gameStatsPanel.style.display !== 'none') {
console.log('📊 Keeping game stats panel visible alongside timer');
}
}
// Start countdown timer
@ -7457,6 +7554,7 @@ class InteractiveTaskManager {
const webcamActive = task.params?.webcamActive || false;
const backgroundAudio = task.params?.backgroundAudio || null;
const audioVolume = task.params?.audioVolume || 0.3;
const customTempoSequence = task.params?.tempoSequence || null; // Accept custom tempo sequence
let timerInterval = null;
let audioElement = null;
@ -7464,12 +7562,19 @@ class InteractiveTaskManager {
let beatCount = 0;
let timeRemaining = duration;
// Tempo progression over 5 minutes: 60-120-150-60-150-200-240
const tempoSequence = [60, 120, 150, 60, 150, 200, 240];
const segmentDuration = (5 * 60 * 1000) / tempoSequence.length;
// Use custom tempo sequence if provided, otherwise use default 5-minute progression
const tempoSequence = customTempoSequence ?
customTempoSequence.map(seg => seg.tempo) :
[60, 120, 150, 60, 150, 200, 240];
const segmentDuration = customTempoSequence ?
(customTempoSequence[0].duration * 1000) : // Use duration from first segment (all should be same)
((5 * 60 * 1000) / tempoSequence.length);
let currentSegmentIndex = 0;
let segmentStartTime = null;
// Build tempo progression display string
const tempoProgressionText = tempoSequence.join(' → ');
container.innerHTML = `
<div class="rhythm-training-task">
<h3>🎵 Rhythm Training</h3>
@ -7496,14 +7601,13 @@ class InteractiveTaskManager {
<span id="current-tempo">${tempo}</span> BPM
</div>
<div style="color: var(--text-secondary); font-size: 0.9em; margin: 5px 0;">
Tempo Progression: 60 120 150 60 150 200 240
Tempo Progression: ${tempoProgressionText}
</div>
</div>
<div style="display: flex; gap: 10px; justify-content: center; margin: 20px 0;">
<button class="btn btn-primary" id="start-rhythm-btn"> Start Rhythm</button>
<button class="btn btn-secondary" id="stop-rhythm-btn" style="display: none;"> Pause</button>
<button class="btn btn-warning" id="skip-rhythm-btn" style="display: none;"> Skip Timer</button>
<button class="btn btn-warning skip-task-btn" id="skip-rhythm-task-btn" style="display: none;"> Skip Task (Dev)</button>
</div>
@ -7521,7 +7625,6 @@ class InteractiveTaskManager {
const startBtn = document.getElementById('start-rhythm-btn');
const stopBtn = document.getElementById('stop-rhythm-btn');
const skipBtn = document.getElementById('skip-rhythm-btn');
const skipTaskBtn = document.getElementById('skip-rhythm-task-btn');
const statusArea = document.getElementById('rhythm-status');
const timerEl = document.getElementById('rhythm-timer');
@ -7568,9 +7671,9 @@ class InteractiveTaskManager {
const scrollSpeed = 50; // Fixed pixels per second
let lastFrameTime = null;
// Pre-generate beat positions for entire 5-minute cycle
// Pre-generate beat positions for entire cycle
const beatPositions = [];
const tempoSegments = [
const tempoSegments = customTempoSequence || [
{ tempo: 60, duration: 42.86 }, // 42.86 seconds
{ tempo: 120, duration: 42.86 },
{ tempo: 150, duration: 42.86 },
@ -7770,7 +7873,6 @@ class InteractiveTaskManager {
stopBtn.disabled = false;
stopBtn.style.display = 'inline-block';
startBtn.style.display = 'none';
if (skipBtn) skipBtn.style.display = 'inline-block';
statusArea.innerHTML = '<div class="success">🎵 Metronome Started</div>';
// Start background audio if available
@ -7781,7 +7883,19 @@ class InteractiveTaskManager {
// Show sidebar countdown timer
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
const sidebarDisplay = document.getElementById('sidebar-countdown-display');
if (sidebarTimer) sidebarTimer.style.display = 'block';
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('🎵 RHYTHM TASK START - Stats panel element:', gameStatsPanel);
console.log('🎵 RHYTHM TASK START - Stats panel display BEFORE:', gameStatsPanel?.style.display);
console.log('🎵 RHYTHM TASK START - Sidebar timer display BEFORE:', sidebarTimer?.style.display);
if (sidebarTimer) {
sidebarTimer.style.display = 'block';
console.log('🎵 RHYTHM TASK START - Sidebar timer set to: block');
}
console.log('🎵 RHYTHM TASK START - Stats panel display AFTER:', gameStatsPanel?.style.display);
console.log('🎵 RHYTHM TASK START - Sidebar timer display AFTER:', sidebarTimer?.style.display);
timerInterval = setInterval(() => {
timeRemaining--;
@ -7818,10 +7932,6 @@ class InteractiveTaskManager {
}, 1000);
});
skipBtn.addEventListener('click', () => {
timeRemaining = 0;
});
skipTaskBtn.addEventListener('click', () => {
console.log('⏩ Dev skip - completing rhythm-training task');
statusArea.innerHTML = '<div class="success">✅ Task skipped (Dev Mode)</div>';
@ -7831,7 +7941,6 @@ class InteractiveTaskManager {
});
startBtn.addEventListener('click', () => {
if (skipBtn) skipBtn.style.display = 'inline-block';
if (skipTaskBtn && window.isDevMode && window.isDevMode()) {
skipTaskBtn.style.display = 'inline-block';
}
@ -8036,6 +8145,12 @@ class InteractiveTaskManager {
// Show countdown timer in sidebar if enabled
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
// Ensure game stats panel stays visible
const gameStatsPanel = document.getElementById('game-stats-panel');
if (gameStatsPanel && gameStatsPanel.style.display !== 'none') {
console.log('📊 Keeping game stats panel visible alongside timer');
}
}
let slideshowInterval = null;
@ -8600,6 +8715,12 @@ class InteractiveTaskManager {
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
// Ensure game stats panel stays visible
const gameStatsPanel = document.getElementById('game-stats-panel');
if (gameStatsPanel && gameStatsPanel.style.display !== 'none') {
console.log('📊 Keeping game stats panel visible alongside timer');
}
}
if (showTimer && countdownEl) {
@ -8806,6 +8927,9 @@ class InteractiveTaskManager {
<button class="btn btn-secondary" id="skip-video-btn" style="display: none;">
Skip to Next Video
</button>
<button class="btn btn-warning skip-task-btn" id="skip-video-task-btn" style="display: none;">
Skip Task (Dev)
</button>
<div id="video-controls" style="display: none; gap: 15px; align-items: center;">
<label style="display: flex; align-items: center; gap: 8px;">
🔊 Video:
@ -8820,6 +8944,7 @@ class InteractiveTaskManager {
const btn = container.querySelector('#start-video-player-btn');
const skipBtn = container.querySelector('#skip-video-btn');
const skipTaskBtn = container.querySelector('#skip-video-task-btn');
const statusArea = container.querySelector('#video-start-status');
const videoContainer = container.querySelector('#video-player-container');
const videoControls = container.querySelector('#video-controls');
@ -8827,6 +8952,11 @@ class InteractiveTaskManager {
const videoVolumeDisplay = container.querySelector('#video-volume-display');
const captionEl = showCaptions ? container.querySelector('#video-caption') : null;
// Show skip task button if dev mode is enabled
if (window.isDevMode && window.isDevMode()) {
skipTaskBtn.style.display = 'inline-block';
}
let availableVideos = [];
let playedVideos = new Set(); // Track played videos to avoid repeats
let timerInterval = null;
@ -8915,6 +9045,34 @@ class InteractiveTaskManager {
}
});
skipTaskBtn.addEventListener('click', () => {
console.log('⏩ Dev skip - completing video-start task');
// Clear intervals
if (timerInterval) clearInterval(timerInterval);
if (captionInterval_id) clearInterval(captionInterval_id);
// Stop audio
if (ambientAudioElement) {
ambientAudioElement.pause();
ambientAudioElement = null;
}
// Hide sidebar timer
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
if (sidebarTimer) {
sidebarTimer.style.display = 'none';
}
statusArea.innerHTML = '<div class="success">✅ Task skipped (Dev Mode)</div>';
task.completed = true;
const completeBtn = document.getElementById('interactive-complete-btn');
if (completeBtn) {
completeBtn.disabled = false;
}
});
btn.addEventListener('click', async () => {
btn.disabled = true;
btn.textContent = 'Loading...';
@ -9048,23 +9206,28 @@ class InteractiveTaskManager {
});
}
// Add timer to sidebar
const sidebar = document.getElementById('campaign-sidebar');
if (sidebar) {
sidebar.style.display = 'block';
// Show sidebar countdown timer (don't replace innerHTML!)
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
const sidebarDisplay = document.getElementById('sidebar-countdown-display');
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('🎬 VIDEO TASK START - Stats panel element:', gameStatsPanel);
console.log('🎬 VIDEO TASK START - Stats panel display BEFORE:', gameStatsPanel?.style.display);
if (sidebarTimer) {
sidebarTimer.style.display = 'block';
}
if (sidebarDisplay) {
const mins = Math.floor(minDuration / 60);
const secs = minDuration % 60;
sidebar.innerHTML = `
<div style="background: rgba(0, 0, 0, 0.9); padding: 20px; border-radius: 10px; border: 2px solid var(--color-primary); text-align: center;">
<div style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 8px;">Time Remaining</div>
<div id="video-timer" style="font-size: 2em; font-weight: bold; color: var(--color-primary);">${mins}:${String(secs).padStart(2, '0')}</div>
</div>
`;
sidebarDisplay.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
}
console.log('🎬 VIDEO TASK START - Stats panel display AFTER:', gameStatsPanel?.style.display);
// Start countdown timer
let remainingTime = minDuration;
const timerDisplay = document.getElementById('video-timer');
timerInterval = setInterval(() => {
remainingTime--;
@ -9072,14 +9235,15 @@ class InteractiveTaskManager {
if (remainingTime > 0) {
const mins = Math.floor(remainingTime / 60);
const secs = remainingTime % 60;
if (timerDisplay) {
timerDisplay.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
if (sidebarDisplay) {
sidebarDisplay.textContent = `${mins}:${String(secs).padStart(2, '0')}`;
}
} else {
clearInterval(timerInterval);
if (timerDisplay) {
timerDisplay.textContent = 'COMPLETE!';
timerDisplay.style.color = 'var(--color-success, #4caf50)';
// Hide sidebar timer
if (sidebarTimer) {
sidebarTimer.style.display = 'none';
}
statusArea.innerHTML = '<div class="success">✅ You may now continue when ready</div>';
@ -9095,6 +9259,13 @@ class InteractiveTaskManager {
} catch (error) {
console.error('Video start error:', error);
statusArea.innerHTML = `<div class="error">⚠️ ${error.message} - Continuing anyway</div>`;
// Hide sidebar timer on error
const sidebarTimer = document.getElementById('sidebar-countdown-timer');
if (sidebarTimer) {
sidebarTimer.style.display = 'none';
}
// Auto-complete even on error
task.completed = true;
const completeBtn = document.getElementById('interactive-complete-btn');
@ -9118,11 +9289,10 @@ class InteractiveTaskManager {
ambientAudioElement = null;
}
// Hide sidebar
const sidebar = document.getElementById('campaign-sidebar');
if (sidebar) {
sidebar.style.display = 'none';
sidebar.innerHTML = '';
// Hide countdown timer only (not entire sidebar)
const countdownTimer = document.getElementById('sidebar-countdown-timer');
if (countdownTimer) {
countdownTimer.style.display = 'none';
}
};
}
@ -9454,6 +9624,12 @@ class InteractiveTaskManager {
// Show countdown timer in sidebar if enabled
if (showTimer && countdownWrapper) {
countdownWrapper.style.display = 'block';
// Ensure game stats panel stays visible
const gameStatsPanel = document.getElementById('game-stats-panel');
if (gameStatsPanel && gameStatsPanel.style.display !== 'none') {
console.log('📊 Keeping game stats panel visible alongside timer');
}
}
edgeBtn.disabled = true;

View File

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gooner Training Academy</title>
<title>Gooner Training Modules</title>
<!-- Core Styles -->
<link rel="stylesheet" href="src/styles/color-variables.css">
@ -47,6 +47,39 @@
white-space: nowrap;
}
/* Module Cards */
.training-mode-card.locked {
opacity: 0.5;
cursor: not-allowed;
border-color: var(--border-subtle);
}
.training-mode-card.locked::after {
content: '🔒 LOCKED';
position: absolute;
top: 10px;
right: 10px;
background: var(--bg-danger);
color: var(--text-on-danger);
padding: 4px 8px;
border-radius: 4px;
font-size: 0.75em;
font-weight: bold;
}
.training-mode-card.coming-soon::after {
content: 'COMING SOON';
position: absolute;
top: 10px;
right: 10px;
background: var(--bg-secondary-overlay-30);
color: var(--color-primary);
padding: 4px 8px;
border-radius: 4px;
font-size: 0.75em;
font-weight: bold;
}
.academy-nav .nav-center {
flex: 1;
text-align: center;
@ -1437,7 +1470,7 @@
<header class="academy-header">
<div class="academy-nav">
<div class="nav-left">
<h1>🎓 Training Academy</h1>
<h1>🎮 Training Modules</h1>
</div>
<div class="nav-center academy-subtitle">
Master the Art of Dedicated Gooning
@ -1469,6 +1502,23 @@
<!-- Video Control Panel (Collapsible) -->
<div class="control-sidebar">
<!-- Game Stats Panel (new) -->
<div style="background: var(--bg-secondary); border: 2px solid var(--color-success); border-radius: 8px; padding: 15px; margin-bottom: 15px; display: none;" id="game-stats-panel">
<div style="color: var(--text-muted); font-size: 0.9em; margin-bottom: 10px; text-align: center;">Current Session</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<div style="text-align: center;">
<div style="color: var(--text-muted); font-size: 0.8em;">XP Earned</div>
<div style="font-size: 1.3em; font-weight: bold; color: var(--color-success);" id="sidebar-current-xp">0</div>
</div>
</div>
</div>
<!-- Countdown Timer (for tasks with showTimer) -->
<div style="background: var(--bg-secondary); border: 2px solid var(--color-primary); border-radius: 8px; padding: 15px; text-align: center; display: none;" id="sidebar-countdown-timer">
<div style="color: var(--text-muted); font-size: 0.9em; margin-bottom: 5px;">Time Remaining</div>
<div style="font-size: 2.5em; font-weight: bold; color: var(--color-primary);" id="sidebar-countdown-display">--:--</div>
</div>
<div id="video-control-panel" class="video-control-panel">
<div class="video-control-header" onclick="toggleVideoControls()">
<span class="video-control-icon">🎬</span>
@ -1557,7 +1607,7 @@
<div class="academy-setup" id="academy-setup">
<div class="setup-container">
<div class="setup-title">
<h2 style="text-align: center; color: var(--color-primary); font-family: 'Audiowide', sans-serif; font-size: 28px; margin: 20px 0; text-shadow: var(--shadow-glow-primary);">🎓 Training Academy Setup</h2>
<h2 style="text-align: center; color: var(--color-primary); font-family: 'Audiowide', sans-serif; font-size: 28px; margin: 20px 0; text-shadow: var(--shadow-glow-primary);">🎮 Training Modules - Module Selection</h2>
<p style="text-align: center; color: var(--text-muted); font-size: 16px; margin-bottom: 30px;">Configure your training experience and select your program</p>
</div>
@ -1635,7 +1685,7 @@
<!-- Level Select Screen (Hidden initially) -->
<div id="levelSelectScreen" class="level-select-screen" style="display: none;">
<div class="level-select-header">
<h2>🎓 Training Academy - Select Level</h2>
<h2>🎓 Campaign Mode - Select Level</h2>
<p class="progress-subtitle">Choose a level to begin or replay</p>
<div class="campaign-progress">
<div class="progress-bar-container">
@ -1791,7 +1841,7 @@
// Test TTS with welcome message
if (ttsEnabled) {
setTimeout(() => {
speakText("Welcome to the Gooner Training Academy. Voice narration is ready.");
speakText("Welcome to Gooner Training Modules. Voice narration is ready.");
}, 1000);
}
@ -1970,32 +2020,83 @@
// Get available modes from GameModeManager
function getAvailableModes() {
// Show all available training modes
// Training Academy has multiple specialized modes
// Show all 8 training modules with proper rank gating
const allModes = {
// TIER 1: Beginner (Rank 1 - Available immediately)
'photography-studio': {
name: 'Photography Studio',
description: 'Dedicated webcam photography and dressing sessions',
icon: '📸'
name: 'Photo Session',
description: 'Webcam photography with dress-up challenges (20-40 min)',
icon: '📸',
tier: 1,
rank: 1,
available: true // Implemented
},
'training-academy': {
name: 'Training Academy',
description: 'Structured training programs and challenges',
icon: '🎓'
'goon-loop': {
name: 'Goon Loop',
description: 'Hypnotic, repetitive trance-inducing sessions (30+ min)',
icon: '🌀',
tier: 1,
rank: 1,
available: false // Not implemented yet
},
// TIER 2: Intermediate (Ranks 3-5)
'rhythm-training': {
name: 'Rhythm Training',
description: 'Metronome-guided stroking and beat matching (20-30 min)',
icon: '🎵',
tier: 2,
rank: 3,
available: false // Not implemented yet
},
'worship-session': {
name: 'Worship Session',
description: 'Devotional content worship (requires tagged library) (20-30 min)',
icon: '🙏',
tier: 2,
rank: 5,
available: false // Not implemented yet
},
// TIER 3: Advanced (Ranks 7-8)
'joi-session': {
name: 'JOI Session',
description: 'TTS-guided instruction and task enforcement (20-30 min)',
icon: '🎙️',
tier: 3,
rank: 7,
available: false // Not implemented yet
},
'multi-screen': {
name: 'Multi-Screen',
description: 'Dual/quad video sensory overload (20-30 min)',
icon: '📺',
tier: 3,
rank: 8,
available: false // Not implemented yet
},
// TIER 4: Expert (Ranks 10-12)
'tease-denial': {
name: 'Tease & Denial',
description: 'Stop/start edge challenges and denial training (20-30 min)',
icon: '🎭',
tier: 4,
rank: 10,
available: false // Not implemented yet
},
'punishment-gauntlet': {
name: 'Punishment Gauntlet',
description: 'Face intense punishment and humiliation challenges',
icon: '⛓️'
},
'endurance-trials': {
name: 'Endurance Trials',
description: 'Test your limits with marathon sessions',
icon: '💪'
name: 'Humiliation',
description: 'Psychological degradation through interactive story (30-45 min)',
icon: '😈',
tier: 4,
rank: 12,
available: true // Implemented
}
};
// Return all available training modes
// TODO: Add rank checking when player stats are integrated
// For now, return all modes
return allModes;
}
@ -2682,8 +2783,23 @@
Object.entries(availableModes).forEach(([modeId, mode]) => {
const modeCard = document.createElement('div');
modeCard.className = 'training-mode-card';
// Add locked or coming-soon class if not available
if (!mode.available) {
modeCard.classList.add('coming-soon');
}
modeCard.dataset.mode = modeId;
modeCard.onclick = () => selectTrainingMode(modeId);
// Only allow click if available
if (mode.available) {
modeCard.onclick = () => selectTrainingMode(modeId);
} else {
modeCard.onclick = () => {
console.log(`🔒 ${mode.name} is not yet implemented`);
// TODO: Show unlock requirements when rank system is integrated
};
}
modeCard.innerHTML = `
<div class="mode-icon">${mode.icon}</div>
@ -3112,6 +3228,22 @@
gameInterface.style.display = 'none';
}
// Hide sidebar panels
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('📊 RETURN TO SELECT - Game stats panel element:', gameStatsPanel);
if (gameStatsPanel) {
console.log('📊 RETURN TO SELECT - Current display:', gameStatsPanel.style.display);
gameStatsPanel.style.display = 'none';
console.log('📊 RETURN TO SELECT - Set display to none');
}
const countdownTimer = document.getElementById('sidebar-countdown-timer');
console.log('⏱️ RETURN TO SELECT - Countdown timer element:', countdownTimer);
if (countdownTimer) {
console.log('⏱️ RETURN TO SELECT - Current display:', countdownTimer.style.display);
countdownTimer.style.display = 'none';
console.log('⏱️ RETURN TO SELECT - Set display to none');
}
// Hide features panel
const featuresPanel = document.getElementById('featuresPanel');
if (featuresPanel) {
@ -4112,6 +4244,18 @@
showScenarioStatusBar();
startScenarioXPTracking();
// Show game stats panel in sidebar
const gameStatsPanel = document.getElementById('game-stats-panel');
console.log('📊 LEVEL START - Game stats panel element:', gameStatsPanel);
if (gameStatsPanel) {
console.log('📊 LEVEL START - Current display value:', gameStatsPanel.style.display);
gameStatsPanel.style.display = 'block';
console.log('📊 LEVEL START - Game stats panel set to display: block');
console.log('📊 LEVEL START - New display value:', gameStatsPanel.style.display);
} else {
console.error('❌ LEVEL START - Game stats panel element not found!');
}
// Load the first training task directly
if (trainingTasks.length > 0) {
console.log('📋 Loading first training task directly...');
@ -6779,9 +6923,15 @@
// Update XP display
const xpElement = document.getElementById('scenario-current-xp');
if (xpElement) {
const sidebarXpElement = document.getElementById('sidebar-current-xp');
if (xpElement || sidebarXpElement) {
const currentXP = getCurrentScenarioXP();
xpElement.textContent = currentXP;
if (xpElement) xpElement.textContent = currentXP;
if (sidebarXpElement) {
sidebarXpElement.textContent = currentXP;
const statsPanel = document.getElementById('game-stats-panel');
console.log('📊 XP UPDATE - Sidebar XP updated to:', currentXP, '| Stats panel display:', statsPanel?.style.display);
}
}
// Update activity status