Major humiliation game expansion: Added 6 choice steps, 5 unique endings, expanded from 17 to 29 total steps. Includes determine_ending mechanic for player agency and rare defiant escape path. Duration now 20-25 minutes with natural cascading choices.

This commit is contained in:
dilgenfritz 2025-11-26 21:26:57 -06:00
parent cbdea7bf3b
commit 61569291f1
18 changed files with 4079 additions and 614 deletions

View File

@ -937,6 +937,39 @@ webGame/
## 📋 Recent Major Updates
### v4.1 - Critical Stability & Performance Update (November 26, 2025)
- ✅ **Quick Play Session Cleanup**: Complete timer and video cleanup on end session
- Fixed timers continuing after end session (taskTimer, gameTimerInterval, xpDisplayInterval, recordingTimerInterval)
- Enhanced video stopping with comprehensive cleanup (pause, mute, reset, clear source)
- Added debug logging to track timer IDs and video element cleanup
- ✅ **Function Spam Prevention**: Added game state guards to prevent functions running after session ends
- Guards in syncTaskWithOverlay(), updateRecordingOverlay(), updateTimerDisplay()
- Checks `!isGameRunning || window.isEndingGame` before execution
- Eliminated console spam and unnecessary processing
- ✅ **Porn Cinema Memory Leak Fix**: CRITICAL fix preventing crashes from event listener accumulation
- Changed from individual button listeners to event delegation pattern
- Single parent listener handles all playlist button clicks via event bubbling
- Prevents exponential memory growth during extended sessions
- ✅ **Porn Cinema Error Handling**: User-friendly error recovery system
- Try-catch wrapper for initialization with styled error overlay
- Retry and home buttons for crash recovery
- Null checks for missing DOM elements (theater mode buttons)
- ✅ **Porn Cinema Cleanup System**: Comprehensive destroy() method for proper resource cleanup
- Removes event listeners, stops and unloads videos, clears playlist data
- Window close handlers (beforeunload, pagehide) trigger automatic cleanup
- Prevents memory leaks when closing porn cinema window
- ✅ **Enhanced Theme System**: 6 visual themes with dynamic Library theme option
- Static themes: Hentai, Pornstars, BBC, Feet
- Dynamic Library theme: Pinterest-style layout using user's personal image collection
- Theme customization via dropdown in Options menu
- None option to disable all background images
- ✅ **Desktop Photo Storage**: Webcam photos now saved to file system in desktop app
- Photos saved to `photos/captured/` directory
- Organized by session type (training-academy, dress-up, etc.)
- File-based storage instead of localStorage for better performance
- Automatic fallback to data URLs in browser mode
- Photo gallery access with download and management options
### v4.0 - Comprehensive Backup System (November 12, 2025)
- ✅ **Automatic Data Protection**: 30-minute backup intervals
- ✅ **Manual Backup Controls**: User-initiated backup/restore

View File

@ -0,0 +1,241 @@
# Humiliation Game Expansion Plan
## Current State
- **17 total steps** in current design
- **3 choice steps** (start, choice_deeper, resistance_noted, domme_shift - actually 4)
- **6 mirror/action steps** (timed tasks)
- **5 verification steps** (position holds)
- **2 endings** (broken_willing, broken_forced)
- **Flow**: Very linear - most users experience same path with minor variations
## Expansion Goals
1. **More choices**: Make every other step a choice (alternating pattern)
2. **More endings**: Create 4-5 distinct endings instead of 2
3. **Decision tree feel**: Choices actually branch to different experiences
4. **Maintain duration**: Keep ~15-20 minute target
## New Structure Concept
### Pattern: Choice → Task → Choice → Task → Choice → Task...
With 17 current steps, we can expand to ~25-30 steps by adding choices between tasks:
- **~12-15 choice steps** (decision points)
- **~6-8 mirror/action steps** (timed tasks)
- **~5-6 verification steps** (position holds)
- **~5 endings** (multiple outcomes)
## Proposed Endings
### 1. **Willing Submission** (Current: broken_willing_ending)
- Path: Accept → Obey → Beg for more → Complete surrender
- Tone: "You gave yourself to me completely and beautifully"
- Outcome: Happy submission, consensual breaking
### 2. **Forced Submission** (Current: broken_forced_ending)
- Path: Resist → Break under pressure → Crushed into obedience
- Tone: "You tried to resist and I broke you anyway"
- Outcome: Conquered, dominated against initial will
### 3. **Desperate Addiction** (NEW)
- Path: Accept → Obey → Become obsessed → Can't stop gooning
- Tone: "You're addicted now. You'll come back for more."
- Outcome: Lost in gooning, can't escape the addiction
### 4. **Humiliated Surrender** (NEW)
- Path: Accept → Question → Submit through shame → Broken by humiliation
- Tone: "The humiliation broke you more than the pleasure"
- Outcome: Broken by embarrassment and exposure
### 5. **Defiant Escape** (Current defiant path - keep rare)
- Path: Resist → Resist → Strong boundary → Escape
- Tone: "You know yourself too well to break"
- Outcome: Maintained autonomy (1% chance)
## Expanded Flow Outline
### Act 1: Introduction & First Choice (Steps 1-8)
**1. START** (choice)
- Current: Accept vs Question
- Keep as-is
**2. mirror_desperation** (mirror task)
- Current: Edge while watching yourself
- Keep as-is
**3. NEW CHOICE: "How Does This Feel?"**
- After first mirror task, Domme asks how you feel
- Option A: "This feels amazing" → Eager path (leads to Willing Submission or Desperate Addiction)
- Option B: "This is intense but I'm nervous" → Hesitant path (leads to Humiliated Surrender)
- Option C: "This feels wrong" → Resistance path (leads to Forced Submission or Defiant Escape)
**4. kneel_for_her** (verification)
- Current: Submissive position
- Keep but adjust story based on previous choice
**5. NEW CHOICE: "Submit Further?"**
- Domme tests your willingness
- Option A: "Yes, I want more" → Deeper submission
- Option B: "I need a moment to think" → Questioning path
- Option C: "I'm not sure I can continue" → Resistance builds
**6. edge_on_command** (action task)
- Current: Edge on her rhythm
- Keep but adjust intensity/dialogue based on path
**7. choice_deeper** (choice)
- Current: Beg for more vs Too much
- Keep as-is (this is a major branching point)
**8. watch_yourself_obey** OR **forced_mirror** (mirror task)
- Current paths diverge here
- Keep as-is
### Act 2: Deepening & Path Divergence (Steps 9-18)
**9. NEW CHOICE: "What Are You?"**
- Domme makes you state what you're becoming
- Option A: "I'm your toy" → Objectification path → Willing Submission
- Option B: "I'm a gooner" → Addiction path → Desperate Addiction
- Option C: "I'm... ashamed" → Humiliation path → Humiliated Surrender
- Option D: "I don't know" → Resistance continues → Forced Submission
**10. display_position** OR **forced_position** (verification)
- Current: Humiliating position
- Branch based on previous choice
**11. NEW CHOICE: "The Turning Point"**
- Critical decision that determines final ending
- Different options available based on which path you're on:
- **Eager path**: "Take me deeper" vs "I'm scared of how much I need this"
- **Hesitant path**: "The shame is overwhelming" vs "I can accept this"
- **Resistance path**: "Please stop" vs "I'll submit"
**12. goon_for_her** OR **forced_edging** (action task)
- Current: Intense gooning session
- Adjust based on path
**13. NEW CHOICE: "Identity Crisis"**
- Domme forces you to choose your identity
- Option A: "I'm yours forever" → Lock in Willing Submission
- Option B: "I need this addiction" → Lock in Desperate Addiction
- Option C: "I'm so humiliated but I accept it" → Lock in Humiliated Surrender
- Option D: "I refuse" → Trigger Defiant check or Force Submission
**14. see_what_you_are** OR **forced_mirror_breaking** (mirror task)
- Current: Watch yourself broken
- Keep as-is
**15. NEW CHOICE: "Final Offer"**
- One last chance before ending
- Option A: "Yes, completely" → Proceed to chosen ending
- Option B: "I'm terrified but yes" → Alt version of ending
- Option C: (Only if resistance path) "No" → Defiant escape check
**16-17. final_submission** OR **forced_final_position** (verification)
- Current: Ultimate submission pose
- Keep as-is
**18. ENDING**
- Branch to one of 5 endings based on choices
## New Choice Content Examples
### Choice 3: "How Does This Feel?"
**Story**:
"She watches you come down from the edge, your reflection still visible in the mirror. She leans forward, her voice soft but probing. 'How does this feel? Tell me the truth. I can see it in your eyes, but I want to hear you say it.'"
**Options**:
- A: "This feels amazing, Miss" → Sets eager/willing path
- B: "It's intense... I'm a bit overwhelmed" → Sets hesitant/shame path
- C: "This feels wrong" → Sets resistance path
### Choice 5: "Submit Further?"
**Story** (varies by path):
- **Eager path**: "She smiles, satisfied. 'Good. You're enjoying this. Are you ready to go deeper? To really give yourself to me?'"
- **Hesitant path**: "She notices your nervousness. 'You're uncertain. That's okay. But I need to know - will you trust me and continue?'"
- **Resistance path**: "She sees your discomfort. 'You don't like this, do you? But you're still hard. Still here. Will you submit, or keep fighting?'"
**Options**:
- A: "Yes, I want more" / "I trust you" / "I'll... I'll submit"
- B: "Can I have a moment?" / "I need to think" / "This is too fast"
- C: "No" / "I'm not ready" / "I want to stop"
### Choice 9: "What Are You?"
**Story**:
"She circles you slowly, her presence overwhelming. 'Tell me what you are. Right now. In this moment. What have you become under my control? Choose your words carefully - they define you.'"
**Options**:
- A: "I'm your toy, Miss" → Objectification/Willing path
- B: "I'm a gooner... I can't stop" → Addiction path
- C: "I'm... so ashamed but I can't resist" → Humiliation path
- D: "I don't know what I am" → Resistance/Forced path
## Ending Variations
### Ending 1: Willing Submission
"She stands over you, radiating satisfaction. 'Perfect. You gave yourself to me so beautifully. No resistance, no hesitation. Just pure, willing submission. You're mine now - my perfect, obedient toy. And you love it, don't you?'"
**Outcome**: "willingly_broken"
### Ending 2: Forced Submission
"She places her heel on your back, pressing you down. 'There we go. Broken at last. You fought, you resisted, but I crushed every bit of defiance. You're mine because I took you, not because you gave yourself. And that makes it even sweeter.'"
**Outcome**: "forcefully_broken"
### Ending 3: Desperate Addiction
"She steps back, watching you still stroking, unable to stop. 'Look at you. You can't even stop when I tell you to, can you? You're addicted now. Addicted to gooning, to edging, to me. You'll come crawling back for more. Again and again. Forever.'"
**Outcome**: "addicted"
### Ending 4: Humiliated Surrender
"She kneels beside you, her voice almost gentle. 'The humiliation broke you more than anything else, didn't it? Not the pleasure, not the commands - but the shame. Watching yourself. Being exposed. That's what destroyed your resistance. You're mine because you're too embarrassed to resist anymore.'"
**Outcome**: "humiliated_broken"
### Ending 5: Defiant Escape (1% chance)
"She pauses, then steps back with a small smile. 'You actually know who you are. That's... rare. Most break. Most give in. But you held your boundaries even when your body wanted to surrender. Go. You've earned your freedom. But remember - the offer stands if you ever change your mind.'"
**Outcome**: "escaped"
## Implementation Plan
### Phase 1: Add New Choices
- Insert choice steps at positions 3, 5, 9, 11, 13, 15
- Write branching dialogue for each based on previous path
- Update nextStep logic to branch appropriately
### Phase 2: Adjust Existing Tasks
- Modify story/dialogue in existing tasks to reflect which path player is on
- Add path tracking variable (eager/hesitant/resistance)
- Adjust Domme's tone based on path
### Phase 3: Create New Endings
- Write 3 new ending steps (Desperate Addiction, Humiliated Surrender, keep Defiant Escape)
- Update routing logic to reach appropriate ending
- Set outcome values for tracking
### Phase 4: Test All Paths
- Map out all possible routes
- Ensure every path leads to an ending
- Verify timing still ~15-20 minutes
- Check that choice consequences feel meaningful
## Questions
1. **Choice frequency**: Every other step = ~12-15 choices. Too many? Or good variety?
2. **Path tracking**: Should we track player path explicitly (eager/hesitant/resistance) or let choices cascade naturally?
3. **Ending distribution**: Should some endings be more common than others? Or equal chance based on choices?
4. **Duration impact**: More choices = more reading time. Target 20-25 minutes instead of 15?
5. **Dialogue variation**: Should existing tasks have 3-4 different dialogues based on path? Or keep same task text but different Domme responses?
6. **Point of no return**: Should there be a moment where the path is locked, or can choices continue to shift the outcome until the very end?
Ready to implement once you approve the design!

View File

@ -0,0 +1,229 @@
# Humiliation Game Redesign Plan
## Overview
Redesigning the psychological journey scenario to focus more on interactive gooning tasks rather than branching story choices, with a beautiful female domme as the figure.
## Current State Analysis
- **Current duration**: ~40+ steps, but mostly choices (instant)
- **Current balance**: Too many text/choice steps, not enough physical actions
- **Current paths**: Multiple paths to defiant ending (~40% chance)
- **Current tone**: Heavy psychological self-degradation focus
- **Current figure**: Clinical/lab coat authority figure (gender neutral)
## Target Changes
### 1. Duration & Pacing
- **Target time**: 15 minutes total
- **Choice card reading time**: 30 seconds each
- **Calculation**:
- 15 min = 900 seconds
- Let's say 5-6 choice cards × 30s = 150-180s for reading
- Remaining: ~720-750s for timed actions
- Timed actions should be: 4-5 mirror tasks (180s each) + 3-4 position verifications (60s each) + 2-3 action tasks (120-240s each)
### 2. Step Type Distribution (New)
- **Choice steps**: 5-6 total (down from 25+)
- **Mirror tasks**: 4-5 (up from 3)
- **Position verification**: 3-4 (up from 2)
- **Action tasks**: 3-4 (up from 5)
- **Total interactive steps**: ~15-17 steps
- **Total estimated time**: ~14-16 minutes
### 3. Path Structure Changes
#### Current Paths (Too Many)
- Submission → Broken ✓
- Questioning → Acceptance → Broken ✓
- Questioning → Ethics → Defiant ✗
- Defiance → Strong → Autonomy → Defiant ✗
- Defiance → Strong → Moral → Defiant ✗
- Defiance → Strong → Pure → Defiant ✗
- Defiance → Weak → Trap Recognized → Defiant ✗
- Negotiation → Safety → Control Maintained → Defiant ✗
- Negotiation → Reversal → Defiant ✗
- Plus many more defiant paths...
#### New Path Structure (Simplified)
**Main Linear Path** (95% of users):
1. **Entrance** (Choice: Accept or Question)
2. **Initial Submission Task** (Mirror: Self-objectification)
3. **Compliance Check** (Position: Kneeling)
4. **Deepening** (Action: Edging while repeating mantras)
5. **Objectification** (Mirror: Watch yourself as an object)
6. **Endurance Test** (Position: Hold degrading pose)
7. **Breaking Point** (Action: Intense edging session)
8. **Acceptance** (Mirror: Accept your role)
9. **Final Submission** (Position: Ultimate submission pose)
10. **Broken Ending**
**Hidden Defiant Path** (~1% - requires specific choices):
- Only accessible by making the "wrong" choice at Step 1 (Question)
- Then making another specific choice at one critical junction
- If user shows strong resistance twice, they escape
- Otherwise, they merge back to main path
### 4. Tone & Content Changes
#### Remove/Reduce:
- ❌ Self-degradation focus ("I am worthless", "I am a failure")
- ❌ Clinical/analytical psychological breaking
- ❌ Heavy intellectual/philosophical debates
- ❌ Multiple complex branching narratives
#### Add/Increase:
- ✅ Physical humiliation (positions, poses, exposure)
- ✅ Edging and gooning focus (stroking patterns, edge denial)
- ✅ Objectification (being watched, displayed, used)
- ✅ Submission to female authority (the Domme)
- ✅ Sensory focus (how it feels, what you see in mirror)
- ✅ Progressive arousal building
- ✅ Gooner mantras (focus on porn, obedience, arousal)
#### Female Domme Character:
- **Appearance**: Beautiful, commanding, elegant but cruel
- **Attitude**: Confident, teasing, knows she has power over you
- **Style**: Uses your arousal against you, controls through pleasure
- **Voice**: Seductive but firm, mocking but alluring
- **Goal**: Turn you into an obedient gooning toy
### 5. New Scenario Flow
#### Act 1: Submission Initiation (3-4 min)
1. **CHOICE**: "The Domme's Invitation"
- Story: Beautiful woman invites you to a private session. She knows what you crave.
- Option A: "Accept eagerly" → Main path
- Option B: "Ask what this is about" → Resistance check
2. **MIRROR TASK**: "Look at Your Desperation" (180s)
- She positions you in front of a mirror, stroking
- Task: Edge while watching yourself, admit how desperate you are
- Mantras: "I need this", "I'm so desperate", "I can't resist her"
3. **POSITION VERIFICATION**: "Kneel for Her" (60s)
- She commands you to kneel, hands behind back
- Task: Hold position while she circles you
- Instruction: "Good toy. Stay just like that."
#### Act 2: Deepening Control (5-6 min)
4. **ACTION TASK**: "Edge on Her Command" (240s)
- She sits back and watches you stroke
- Task: Edge repeatedly on her count, slower and slower
- Pattern: "Stroke. Slower. Stop. Edge. Don't cum. Good toy."
5. **MIRROR TASK**: "Watch Yourself Obey" (180s)
- Mirror positioned to show you stroking
- Task: Watch yourself edge while she narrates
- Mantras: "I obey", "I'm her toy", "Stroking feels so good"
6. **CHOICE**: "How Far Will You Go?"
- She offers two options
- Option A: "Deeper submission" → Continue main path
- Option B: "This is too much" → Last chance for defiant path (requires another resistance later)
7. **POSITION VERIFICATION**: "Display Position" (90s)
- She orders you into a humiliating display pose
- Task: Legs spread, exposed, vulnerable
- Instruction: "Let me see what a desperate gooner looks like"
#### Act 3: Breaking Point (4-5 min)
8. **ACTION TASK**: "Goon for Her" (300s)
- She starts playing with you mentally
- Task: Rapid edging, can't stop, can't think
- Mantras: "I'm a gooner", "Porn is my purpose", "I serve her"
9. **MIRROR TASK**: "See What You've Become" (180s)
- Final mirror session
- Task: Watch yourself completely lost in gooning
- Mantras: "This is what I am", "I'm broken", "I accept this"
10. **POSITION VERIFICATION**: "Final Submission" (90s)
- Ultimate submission pose (forehead to ground, ass up, still stroking)
- Task: Complete surrender position
- Instruction: "Stay broken. Stay mine."
11. **BROKEN ENDING**
- She stands over you
- "You're mine now. A perfect gooning toy. Broken, obedient, desperate."
- Outcome: "broken"
#### Alternate Path: Defiant Ending (1% chance)
- Only if user chose "Question" at step 1 AND "Too much" at step 6
- Leads to one more check:
**CHOICE**: "Final Decision"
- She gets frustrated: "You keep resisting. Why?"
- Option A: "I know myself too well to break" → DEFIANT ENDING
- Option B: "Maybe I should just give in" → Back to main path (step 8)
**DEFIANT ENDING** (if reached):
- She steps back, smirks
- "You're stronger than most. You know who you are. I can't break that."
- Outcome: "defiant"
### 6. Example Content Updates
#### Old Style (Too Clinical):
```
Story: "The figure tilts their head, studying you. 'Questioning is natural...'"
Action: "Suppress your protective instincts and continue deeper into conditioning"
```
#### New Style (Gooning Focused):
```
Story: "She leans forward, her eyes locked on yours. 'I can see how hard you are. How desperate. You want to goon for me, don't you?'"
Action: "Kneel and stroke, slowly, while staring up at her - edge three times while repeating 'I want to goon for you, Miss'"
```
### 7. Implementation Checklist
#### Step 1: Create New Scenario Structure
- [ ] Define 10 main path steps (entrance → broken)
- [ ] Define 2-3 resistance path steps (hidden defiant)
- [ ] Ensure total time = ~15 minutes
- [ ] Verify step distribution (5-6 choice, 4-5 mirror, 3-4 verification, 3-4 action)
#### Step 2: Write New Content
- [ ] Rewrite all stories with female Domme voice
- [ ] Focus on humiliation, edging, gooning themes
- [ ] Remove self-degradation, add objectification
- [ ] Add specific physical instructions to all tasks
- [ ] Create gooner-focused mantras for each task
#### Step 3: Set Durations
- [ ] Mirror tasks: 180s each
- [ ] Position verification: 60-90s each
- [ ] Action tasks: 120-300s each
- [ ] Calculate total to hit 14-16 minute target
#### Step 4: Test Path Logic
- [ ] Verify main path flows smoothly
- [ ] Verify defiant path requires 2 specific choices
- [ ] Ensure all paths lead to an ending
- [ ] Check that ~99% of users hit broken ending
## Questions for Review
1. **Duration**: Is 15 minutes the right target? Or should it be longer/shorter?
2. **Step count**: ~15-17 interactive steps feel right? Or need more/less?
3. **Defiant path**: Is 1% too rare? Should it be 5%? Or remove entirely?
4. **Tone**: Is the shift from "clinical degradation" to "sensual domination" the right direction?
5. **Balance**: Current plan is:
- ~30% mirror tasks (watching yourself)
- ~25% position verification (holding poses)
- ~25% action tasks (edging/stroking)
- ~20% choices (story decisions)
- Does this feel right?
6. **Domme character**: Any specific personality traits or dialogue style you want emphasized?
7. **Content themes**: Priority order correct?
1. Gooning/edging
2. Humiliation/objectification
3. Submission to Domme
4. Physical positions/exposure
Please review and provide feedback before I implement!

View File

@ -0,0 +1,117 @@
# Random Position Verification Library
All positions available for random selection during verification tasks in the Humiliation Game.
## Submissive Positions (5 total)
### 1. Kneeling Submission
- **Instruction:** Kneel with hands behind your back, head bowed in submission
- **Description:** Classic submissive kneeling pose showing complete obedience
### 2. Present Position
- **Instruction:** On hands and knees, arch your back and present yourself for inspection
- **Description:** Degrading presentation pose for thorough examination
### 3. Worship Pose
- **Instruction:** Sit on your heels with hands on thighs, mouth open in worship position
- **Description:** Ready to worship and serve in proper position
### 4. Display Spread
- **Instruction:** Lying back with legs spread wide, hands above head in surrender
- **Description:** Complete exposure and vulnerability display
### 5. Begging Position
- **Instruction:** On knees with hands clasped together, looking up desperately
- **Description:** Pathetic begging pose showing your desperate need
---
## Degrading Positions (5 total)
### 1. Object Display
- **Instruction:** On your back with legs pulled up and spread, completely exposed like a piece of furniture
- **Description:** Reduced to nothing but an object for use and display
### 2. Mouth Service Position
- **Instruction:** Squatting low with mouth open wide, ready to be used
- **Description:** Ultimate degradation pose prepared to service
### 3. Fuck-Doll Display
- **Instruction:** Lying with limbs spread, completely limp like a broken sex doll
- **Description:** Objectified as nothing but a mindless fuck toy
### 4. Cock-Socket Ready
- **Instruction:** Kneeling with mouth wide open, hands holding face open
- **Description:** Prepared to be nothing but a hole for use
### 5. Pain Slut Pose
- **Instruction:** Bent over with back arched, presenting for punishment
- **Description:** Ready to receive pain and discipline like the slut you are
---
## Humiliating Positions (5 total)
### 1. Embarrassed Display
- **Instruction:** Standing with hands covering face in shame while body exposed
- **Description:** Showing your humiliation and embarrassment
### 2. Pathetic Grovel
- **Instruction:** Face down on ground, ass up in the air, groveling pathetically
- **Description:** Ultimate humiliation and subservience position
### 3. Shame Spread
- **Instruction:** Squatting with legs wide, hands pulling yourself open
- **Description:** Shameful self-exposure for maximum humiliation
### 4. Desperate Beg
- **Instruction:** On back with legs in the air, begging desperately for attention
- **Description:** Pathetic attention-seeking humiliation pose
### 5. Slut Presentation
- **Instruction:** Bent forward touching toes, looking back with slutty expression
- **Description:** Presenting yourself like the desperate slut you are
---
## Extreme Positions (5 total)
### 1. Complete Surrender
- **Instruction:** Spread eagle on back, completely exposed and helpless
- **Description:** Total vulnerability and surrender to be used
### 2. Breeding Position
- **Instruction:** Face down ass up, legs spread wide for breeding access
- **Description:** Perfect position for being bred like an animal
### 3. Inspection Pose
- **Instruction:** Squatting with hands spreading yourself open for inspection
- **Description:** Allowing complete inspection of your worthless holes
### 4. Punishment Ready
- **Instruction:** Bent over grabbing ankles, presenting for harsh punishment
- **Description:** Ready to receive the brutal punishment you deserve
### 5. Broken Toy
- **Instruction:** Collapsed in heap, limbs akimbo like a discarded fuck toy
- **Description:** Completely broken and used up, nothing left but a toy
---
## How Positions Are Selected
- **verificationInstructions: "submissive"** → Selects randomly from 5 Submissive positions
- **verificationInstructions: "degrading"** → Selects randomly from 5 Degrading positions
- **verificationInstructions: "humiliating"** → Selects randomly from 5 Humiliating positions
- **verificationInstructions: "extreme"** → Selects randomly from 5 Extreme positions
- **verificationInstructions: "mixed"** → Selects randomly from all 20 positions
## Current Scenario Usage
- **kneel_for_her:** uses "submissive" (5 positions)
- **display_position:** uses "humiliating" (5 positions)
- **final_submission:** uses "extreme" (5 positions)
- **forced_position:** uses "submissive" (5 positions)
- **forced_final_position:** uses "extreme" (5 positions)
**Total Position Pool:** 20 unique positions across 4 intensity levels

View File

@ -163,6 +163,80 @@
cursor: not-allowed;
}
/* Loading Overlay */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--bg-primary);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
backdrop-filter: blur(10px);
}
.loading-content {
text-align: center;
}
.loading-content h2 {
font-family: 'Audiowide', cursive;
font-size: var(--font-xxxl);
background: linear-gradient(45deg, var(--color-primary), var(--color-secondary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: var(--space-lg);
animation: titleGlow 2s ease-in-out infinite alternate;
}
.loading-spinner {
width: 60px;
height: 60px;
border: 4px solid var(--border-color);
border-top: 4px solid var(--color-primary);
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto var(--space-lg);
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loading-status {
color: var(--text-secondary);
font-size: var(--font-lg);
margin-bottom: var(--space-lg);
}
.loading-progress {
width: 300px;
height: 8px;
background: var(--bg-tertiary);
border-radius: 4px;
overflow: hidden;
margin: 0 auto var(--space-base);
}
.loading-progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--color-primary), var(--color-secondary));
border-radius: 4px;
width: 0%;
transition: width 0.3s ease;
}
.loading-percentage {
color: var(--text-primary);
font-size: var(--font-lg);
font-weight: 600;
}
/* Main Content Area */
body {
margin: 0;
@ -603,6 +677,19 @@
</style>
</head>
<body>
<!-- Loading Overlay -->
<div id="library-loading" class="loading-overlay" style="display: flex;">
<div class="loading-content">
<div class="loading-spinner"></div>
<h2>📚 Loading Media Library...</h2>
<p class="loading-status" id="loading-status">Initializing file systems...</p>
<div class="loading-progress">
<div class="loading-progress-fill" id="loading-progress-fill"></div>
</div>
<div class="loading-percentage" id="loading-percentage">0%</div>
</div>
</div>
<!-- Library Header -->
<header class="library-header">
<nav class="library-nav">
@ -929,15 +1016,59 @@
});
// Initialize library on page load
window.addEventListener('DOMContentLoaded', () => {
window.addEventListener('DOMContentLoaded', async () => {
console.log('Library page loaded');
const loadingStatus = document.getElementById('loading-status');
const loadingProgressFill = document.getElementById('loading-progress-fill');
const loadingPercentage = document.getElementById('loading-percentage');
function updateProgress(percent, status) {
if (loadingProgressFill) loadingProgressFill.style.width = `${percent}%`;
if (loadingPercentage) loadingPercentage.textContent = `${percent}%`;
if (loadingStatus) loadingStatus.textContent = status;
}
updateProgress(10, 'Initializing desktop file manager...');
// Initialize desktop file manager first
if (window.electronAPI) {
console.log('📸 Initializing desktop file manager for library...');
if (!window.desktopFileManager) {
window.desktopFileManager = new DesktopFileManager();
}
// Wait for initialization to complete
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('📸 Desktop file manager ready:', !!window.desktopFileManager);
console.log('📸 isElectron:', window.desktopFileManager?.isElectron);
console.log('📸 photoDirectory:', window.desktopFileManager?.photoDirectory);
}
updateProgress(30, 'Loading image library...');
await new Promise(resolve => setTimeout(resolve, 100));
// Initialize all library tabs
setupLibraryImagesTab();
updateProgress(50, 'Loading audio library...');
await new Promise(resolve => setTimeout(resolve, 100));
setupLibraryAudioTab();
updateProgress(70, 'Loading video library...');
await new Promise(resolve => setTimeout(resolve, 100));
setupLibraryVideoTab();
updateProgress(90, 'Loading photo gallery...');
await new Promise(resolve => setTimeout(resolve, 100));
setupLibraryGalleryTab();
updateProgress(100, 'Library ready!');
// Hide loading overlay after brief delay
setTimeout(() => {
setupLibraryImagesTab();
setupLibraryAudioTab();
setupLibraryVideoTab();
setupLibraryGalleryTab();
const loadingOverlay = document.getElementById('library-loading');
if (loadingOverlay) {
loadingOverlay.style.display = 'none';
}
}, 500);
});

File diff suppressed because it is too large Load Diff

192
src/dataOld/gameData.js Normal file
View File

@ -0,0 +1,192 @@
// Game data - legacy fallback and configuration
const gameData = {
// Main tasks - now sourced from mainGameData.js via GameDataManager
mainTasks: [],
// Consequence tasks - now sourced from mainGameData.js via GameDataManager
consequenceTasks: [],
// Image configuration
supportedImageFormats: ['.jpg', '.jpeg', '.png', '.gif'],
discoveredTaskImages: [], // Will be populated automatically
discoveredConsequenceImages: [], // Will be populated automatically
// Placeholder images for tasks that don't have specific images
defaultImage: "images/placeholder.jpg",
// Flash Message System - Training focused messages
defaultFlashMessages: [
// Motivational messages
{
id: 1,
text: "Good goon! Keep stroking and watching!",
category: "motivational",
enabled: true
},
{
id: 2,
text: "Every edge makes you more submissive!",
category: "motivational",
enabled: true
},
{
id: 3,
text: "Porn is your new reality!",
category: "motivational",
enabled: true
},
{
id: 4,
text: "You're becoming such a good little gooner!",
category: "motivational",
enabled: true
},
{
id: 5,
text: "Real men fuck while you watch!",
category: "motivational",
enabled: true
},
// Encouraging messages
{
id: 6,
text: "Your dedication to gooning is impressive!",
category: "encouraging",
enabled: true
},
{
id: 7,
text: "Look how much porn you can handle now!",
category: "encouraging",
enabled: true
},
{
id: 8,
text: "You're building incredible porn tolerance!",
category: "encouraging",
enabled: true
},
{
id: 9,
text: "Accept your place as a beta watcher!",
category: "encouraging",
enabled: true
},
{
id: 10,
text: "Your future is endless gooning sessions!",
category: "encouraging",
enabled: true
},
// Achievement messages
{
id: 11,
text: "Excellent edging performance!",
category: "achievement",
enabled: true
},
{
id: 12,
text: "You're such a dedicated gooner!",
category: "achievement",
enabled: true
},
{
id: 13,
text: "Another victory for porn addiction!",
category: "achievement",
enabled: true
},
{
id: 14,
text: "Perfect submission!",
category: "achievement",
enabled: true
},
{
id: 15,
text: "You're mastering the art of denial!",
category: "achievement",
enabled: true
},
// Persistence messages
{
id: 16,
text: "Don't stop gooning now - embrace it!",
category: "persistence",
enabled: true
},
{
id: 17,
text: "Every stroke makes you weaker!",
category: "persistence",
enabled: true
},
{
id: 18,
text: "Push deeper into submission!",
category: "persistence",
enabled: true
},
{
id: 19,
text: "You belong on your knees watching!",
category: "persistence",
enabled: true
},
{
id: 20,
text: "True submission is forged through endless edging!",
category: "persistence",
enabled: true
}
],
// Flash message configuration defaults
defaultFlashConfig: {
enabled: true,
displayDuration: 3000, // 3 seconds
intervalDelay: 45000, // 45 seconds
position: 'center',
animation: 'fade',
fontSize: '24px',
fontWeight: 'bold',
color: '#ffffff',
backgroundColor: 'rgba(0, 123, 255, 0.9)',
borderRadius: '15px',
padding: '20px 30px',
maxWidth: '400px',
zIndex: 10000
},
// Default Popup Image Configuration (Punishment System)
defaultPopupImageConfig: {
enabled: true,
imageCount: 3, // Number of images to show
imageCountMode: 'fixed', // 'fixed', 'random', 'range'
minCount: 2, // For range mode
maxCount: 10, // For range mode - increased from 5
displayDuration: 8000, // 8 seconds default
durationMode: 'fixed', // 'fixed', 'random', 'range'
minDuration: 5000, // For range mode (5s)
maxDuration: 15000, // For range mode (15s)
positioning: 'random', // 'random', 'cascade', 'grid', 'center'
allowOverlap: true,
fadeAnimation: true,
blurBackground: true,
preventClose: true, // Users cannot close these
showTimer: true, // Show countdown timer
triggerOnSkip: true, // Trigger when tasks are skipped
intensity: 'medium', // 'low', 'medium', 'high' - affects default values
// Size constraints for dynamic sizing
minWidth: 200,
maxWidth: 500,
minHeight: 150,
maxHeight: 400,
viewportWidthRatio: 0.35, // Max 35% of viewport width
viewportHeightRatio: 0.4 // Max 40% of viewport height
}
};
// Make gameData available globally
window.gameData = gameData;

View File

@ -0,0 +1,166 @@
/**
* Game Data Manager
* Central system for loading game mode-specific data
*/
class GameDataManager {
constructor() {
this.loadedData = {};
this.currentMode = 'standard';
// Define which data files map to which game modes
this.modeDataMapping = {
'standard': 'mainGameData',
'timed': 'mainGameData',
'scored': 'mainGameData',
'photography-studio': 'dressUpGameData',
'training-academy': 'trainingGameData',
'punishment-gauntlet': 'humiliationGameData',
'endurance-trials': 'enduranceGameData'
};
}
/**
* Get data for a specific game mode
*/
getDataForMode(mode) {
const dataType = this.modeDataMapping[mode] || 'mainGameData';
// Return the appropriate data based on mode
switch(dataType) {
case 'mainGameData':
return window.mainGameData || this.getFallbackMainData();
case 'humiliationGameData':
return window.humiliationGameData || this.getFallbackHumiliationData();
case 'trainingGameData':
return window.trainingGameData || this.getFallbackTrainingData();
case 'enduranceGameData':
return window.enduranceGameData || this.getFallbackEnduranceData();
case 'dressUpGameData':
return window.dressUpGameData || this.getFallbackDressUpData();
default:
return this.getFallbackMainData();
}
}
/**
* Get tasks for a specific mode
*/
getTasksForMode(mode) {
const data = this.getDataForMode(mode);
return data.mainTasks || [];
}
/**
* Get scenarios for a specific mode
*/
getScenariosForMode(mode) {
const data = this.getDataForMode(mode);
return data.scenarios || [];
}
/**
* Get consequence tasks for a specific mode
*/
getConsequenceTasksForMode(mode) {
const data = this.getDataForMode(mode);
return data.consequenceTasks || [];
}
/**
* Get configuration for a specific mode
*/
getConfigForMode(mode) {
const data = this.getDataForMode(mode);
return data.config || {};
}
/**
* Find a specific task by ID across all loaded data
*/
findTaskById(taskId, mode = null) {
if (mode) {
const data = this.getDataForMode(mode);
const allTasks = [...(data.mainTasks || []), ...(data.scenarios || [])];
return allTasks.find(task => task.id === taskId);
}
// Search across all data types if no mode specified
const allDataTypes = ['mainGameData', 'humiliationGameData', 'trainingGameData', 'enduranceGameData', 'dressUpGameData'];
for (const dataType of allDataTypes) {
const data = window[dataType];
if (data) {
const allTasks = [...(data.mainTasks || []), ...(data.scenarios || [])];
const found = allTasks.find(task => task.id === taskId);
if (found) return found;
}
}
return null;
}
/**
* Get all tasks from all modes (for backwards compatibility)
*/
getAllTasks() {
const allTasks = [];
const allDataTypes = ['mainGameData', 'humiliationGameData', 'trainingGameData', 'enduranceGameData', 'dressUpGameData'];
for (const dataType of allDataTypes) {
const data = window[dataType];
if (data) {
if (data.mainTasks) allTasks.push(...data.mainTasks);
if (data.scenarios) allTasks.push(...data.scenarios);
}
}
return allTasks;
}
// Fallback data methods (simplified versions for testing)
getFallbackMainData() {
return {
mainTasks: [
{ id: 1, text: "Basic task", difficulty: "Easy" }
],
consequenceTasks: [
{ id: 1, text: "Basic consequence", difficulty: "Medium" }
]
};
}
getFallbackHumiliationData() {
return {
mainTasks: [
{
id: 'mirror-humiliation-task',
text: "Webcam Mirror Self-Humiliation",
difficulty: "Medium",
interactiveType: "mirror-task",
story: "Look at yourself through your webcam and repeat degrading phrases.",
mirrorInstructions: "Look directly at yourself through the webcam while speaking the degrading phrases",
mirrorTaskText: "Repeat each phrase 5 times while maintaining eye contact with yourself: 'I am a pathetic toy', 'I exist for others' pleasure', 'I have no dignity'"
}
],
scenarios: []
};
}
getFallbackTrainingData() {
return { mainTasks: [], scenarios: [] };
}
getFallbackEnduranceData() {
return { mainTasks: [], scenarios: [] };
}
getFallbackDressUpData() {
return { mainTasks: [], scenarios: [] };
}
}
// Create global instance
window.gameDataManager = new GameDataManager();
console.log('🎮 Game Data Manager initialized');

View File

@ -0,0 +1,314 @@
/**
* Dress-Up/Photography Game Mode Data
* Webcam photography and dressing challenges
*/
const dressUpGameData = {
// Photography and dress-up tasks
mainTasks: [
{
id: 'photo-session-1',
text: "Basic Photo Session",
difficulty: "Easy",
interactiveType: "photo-challenge",
story: "Take photos of yourself following the specified requirements.",
photoRequirements: {
count: 3,
poses: ["standing", "sitting", "profile"],
timer: 30
}
},
{
id: 'outfit-challenge-1',
text: "Outfit Coordination Challenge",
difficulty: "Medium",
interactiveType: "choice-challenge",
story: "Choose and model different outfit combinations.",
choices: [
{ text: "Casual wear", value: "casual", points: 10 },
{ text: "Formal attire", value: "formal", points: 15 },
{ text: "Creative costume", value: "creative", points: 20 }
]
},
{
id: 'pose-sequence-1',
text: "Pose Sequence Challenge",
difficulty: "Hard",
interactiveType: "photo-challenge",
story: "Execute a sequence of poses for a professional photo shoot.",
photoRequirements: {
count: 6,
poses: ["elegant", "playful", "serious", "dynamic", "artistic", "confident"],
timer: 45
}
}
],
// Dress-up scenarios
scenarios: [
{
id: 'scenario-dress-up-photo',
text: "Sissy Dress-Up Photo Session",
difficulty: "Medium",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Feminization Photography Studio",
steps: {
start: {
type: 'choice',
mood: 'dominant',
story: "You've been brought to a private studio for a special photo session. The photographer looks you up and down with a smirk. 'Today we're going to transform you into the perfect little sissy and document every humiliating moment. Which type of feminization session should we start with?'",
choices: [
{
text: "Forced feminization makeover",
type: "feminization",
preview: "Complete transformation into a sissy",
nextStep: "feminization_path"
},
{
text: "Humiliating sissy maid outfit",
type: "maid",
preview: "Degrading maid costume and poses",
nextStep: "maid_path"
},
{
text: "Slutty schoolgirl transformation",
type: "schoolgirl",
preview: "Inappropriate schoolgirl outfit and poses",
nextStep: "schoolgirl_path"
},
{
text: "Bimbo princess dress-up",
type: "bimbo",
preview: "Over-the-top feminine and degrading",
nextStep: "bimbo_path"
}
]
},
feminization_path: {
type: 'action',
mood: 'humiliating',
story: "The photographer forces you into a frilly pink dress, applies makeup to your face, and puts a blonde wig on your head. 'Look at what a pathetic little sissy you make! Edge while I take pictures of your humiliation. The more aroused you get, the more feminine and submissive you'll look in the photos.'",
actionText: "Edge while being feminized and photographed",
duration: 240,
nextStep: "feminization_progression"
},
maid_path: {
type: 'action',
mood: 'degrading',
story: "The photographer hands you a skimpy maid outfit with a short frilly skirt. 'Put this on, sissy maid. You're going to pose like the submissive little servant you are. Edge while I photograph your humiliation. Show me how pathetic you look in that outfit.'",
actionText: "Edge while posing as a degraded sissy maid",
duration: 300,
nextStep: "maid_progression"
},
schoolgirl_path: {
type: 'action',
mood: 'inappropriate',
story: "The photographer tosses you a slutty schoolgirl outfit - tiny plaid skirt, tight white shirt, and pigtails. 'Time to play dress-up, little girl. You're going to pose like the naughty schoolgirl slut you are. Edge while I capture your shame.'",
actionText: "Edge while posing as a slutty schoolgirl",
duration: 180,
nextStep: "schoolgirl_progression"
},
bimbo_path: {
type: 'action',
mood: 'bimbo',
story: "The photographer pulls out the most degrading outfit yet - a hot pink mini dress, massive fake breasts, blonde bimbo wig, and platform heels. 'Time to complete your transformation into a brainless bimbo slut. Edge while I photograph how pathetic and desperate you look. Show me what a dumb little bimbo you are.'",
actionText: "Edge while posing as a humiliated bimbo",
duration: 360,
nextStep: "bimbo_progression"
},
feminization_progression: {
type: 'choice',
mood: 'sissy_humiliation',
story: "The photographer reviews the humiliating feminization photos. 'Look at these pictures - you make such a pathetic little sissy! The camera captured every moment of your shame. Ready to take it further?'",
choices: [
{
text: "Take sissy humiliation photos now",
type: "photography",
preview: "Capture your feminized shame",
nextStep: "feminization_photo_session"
},
{
text: "More extreme feminization",
type: "extreme_feminization",
preview: "Push your sissy transformation further",
nextStep: "extreme_feminization_path"
}
]
},
maid_progression: {
type: 'choice',
mood: 'maid_humiliation',
story: "The photographer laughs at the photos of you in the maid outfit. 'Such a pathetic little servant! You look so degraded and humiliated. But maybe we should explore other forms of humiliation too...'",
choices: [
{
text: "Take maid humiliation photos now",
type: "photography",
preview: "Document your maid degradation",
nextStep: "maid_photo_session"
},
{
text: "Force you to clean while dressed as maid",
type: "cleaning",
preview: "Humiliating cleaning tasks",
nextStep: "cleaning_path"
}
]
},
schoolgirl_progression: {
type: 'choice',
mood: 'schoolgirl_shame',
story: "The photographer reviews the slutty schoolgirl photos. 'Look how inappropriate you look! Such a naughty little schoolgirl slut. But I think we can make you even more shameful...'",
choices: [
{
text: "Take slutty schoolgirl photos now",
type: "photography",
preview: "Capture your schoolgirl shame",
nextStep: "schoolgirl_photo_session"
},
{
text: "Pose in even more inappropriate positions",
type: "inappropriate",
preview: "More degrading schoolgirl poses",
nextStep: "inappropriate_path"
}
]
},
bimbo_progression: {
type: 'choice',
mood: 'bimbo_degradation',
story: "The photographer can't stop laughing at how ridiculous you look as a bimbo. 'You're the perfect brainless slut! So dumb and desperate. But maybe we can combine this with other humiliating styles...'",
choices: [
{
text: "Take bimbo humiliation photos now",
type: "photography",
preview: "Capture your bimbo transformation",
nextStep: "bimbo_photo_session"
},
{
text: "Force you to act like a brainless bimbo",
type: "bimbo_act",
preview: "Humiliating bimbo behavior",
nextStep: "bimbo_act_path"
}
]
},
feminization_photo_session: {
type: 'ending',
mood: 'sissy_documented',
story: "The photographer reviews the humiliating sissy photos. 'Perfect shots! Every photo captures your feminization and humiliation beautifully. You're documented as a complete sissy now.'",
endingText: "Feminization photography completed. Final state: Arousal HIGH, Control VARIABLE. Your sissy transformation has been documented.",
outcome: "documented_sissy"
},
maid_photo_session: {
type: 'ending',
mood: 'maid_documented',
story: "The photographer looks through the degrading maid photos. 'Excellent! These photos show what a pathetic little servant you are. Your humiliation is perfectly captured.'",
endingText: "Maid humiliation photography completed. Final state: Arousal HIGH, Control VARIABLE. Your maid degradation has been documented.",
outcome: "documented_maid"
},
schoolgirl_photo_session: {
type: 'ending',
mood: 'schoolgirl_documented',
story: "The photographer reviews the slutty schoolgirl photos. 'Incredible shots! You look so inappropriate and shameful. Every photo captures your schoolgirl slut transformation.'",
endingText: "Schoolgirl photography completed. Final state: Arousal HIGH, Control VARIABLE. Your schoolgirl shame has been documented.",
outcome: "documented_schoolgirl"
},
bimbo_photo_session: {
type: 'ending',
mood: 'bimbo_documented',
story: "The photographer can't stop laughing at the bimbo photos. 'These are perfect! You look like such a brainless slut. Every photo captures your complete bimbo transformation.'",
endingText: "Bimbo photography completed. Final state: Arousal HIGH, Control VARIABLE. Your bimbo transformation has been documented.",
outcome: "documented_bimbo"
},
extreme_feminization_path: {
type: 'action',
mood: 'extreme_humiliation',
story: "The photographer pulls out even more degrading feminine items - a frilly baby doll dress, excessive makeup, and humiliating accessories. 'Time to push your feminization to the extreme! You're going to become the most pathetic sissy possible. Edge while I document your complete transformation into a humiliated sissy slut.'",
actionText: "Edge while undergoing extreme feminization",
duration: 300,
nextStep: "extreme_feminization_completion"
},
extreme_feminization_completion: {
type: 'ending',
mood: 'extreme_sissy_documented',
story: "The photographer reviews the extreme feminization photos with delight. 'Absolutely perfect! These photos show your complete transformation into the most pathetic sissy possible. Every shot captures your extreme feminization and total humiliation.'",
endingText: "Extreme feminization completed. You have been transformed into the ultimate sissy and it's all documented.",
outcome: "extreme_sissy_documented"
},
cleaning_path: {
type: 'action',
mood: 'maid_degradation',
story: "The photographer hands you cleaning supplies. 'Time to put that maid outfit to use! You're going to clean this studio while I photograph your humiliation. Edge while you work like the pathetic little servant you are.'",
actionText: "Edge while performing humiliating cleaning tasks",
duration: 240,
nextStep: "cleaning_completion"
},
cleaning_completion: {
type: 'ending',
mood: 'maid_servant_documented',
story: "The photographer laughs at the photos of you cleaning while dressed as a maid. 'Perfect! These photos show what a degraded little servant you are. Your humiliation while doing menial labor is beautifully captured.'",
endingText: "Maid cleaning session completed. Your degradation as a servant has been documented.",
outcome: "maid_servant_documented"
},
inappropriate_path: {
type: 'action',
mood: 'schoolgirl_degradation',
story: "The photographer directs you into increasingly inappropriate and shameful poses. 'Spread your legs wider! Bend over more! Show me how slutty you can be in that schoolgirl outfit. Edge while I capture every shameful moment.'",
actionText: "Edge while posing in degrading schoolgirl positions",
duration: 180,
nextStep: "inappropriate_completion"
},
inappropriate_completion: {
type: 'ending',
mood: 'schoolgirl_slut_documented',
story: "The photographer reviews the inappropriate schoolgirl photos with satisfaction. 'These are incredibly shameful! Every photo captures how much of a slutty schoolgirl you are. Your inappropriate behavior is perfectly documented.'",
endingText: "Inappropriate schoolgirl session completed. Final state: Arousal HIGH, Control VARIABLE. Your shameful schoolgirl behavior has been documented.",
outcome: "schoolgirl_slut_documented"
},
bimbo_act_path: {
type: 'action',
mood: 'bimbo_behavior',
story: "The photographer forces you to act like a brainless bimbo. 'Talk like a dumb slut! Giggle constantly! Show me how stupid you can be! Edge while acting like the brainless bimbo you've become while I photograph your pathetic behavior.'",
actionText: "Edge while acting like a brainless bimbo",
duration: 300,
nextStep: "bimbo_act_completion"
},
bimbo_act_completion: {
type: 'ending',
mood: 'bimbo_behavior_documented',
story: "The photographer can't stop laughing at the photos of you acting like a brainless bimbo. 'These are hilarious! Every photo captures how stupid and desperate you are. Your complete bimbo transformation is perfectly documented.'",
endingText: "Bimbo behavior session completed. Your brainless bimbo behavior has been documented.",
outcome: "bimbo_behavior_documented"
},
completion: {
type: 'ending',
mood: 'satisfied',
story: "The photographer reviews the humiliating photos with satisfaction. 'Perfect! These photos capture your complete transformation and degradation. You're now documented as the sissy you truly are.'",
endingText: "Photo session complete. Your feminization has been permanently documented.",
outcome: "feminized_documented"
}
}
}
}
],
// Configuration for dress-up mode
config: {
photoSettings: {
defaultTimer: 30,
maxPhotos: 10,
qualityRequirements: {
lighting: "good",
focus: "sharp",
composition: "centered"
}
},
themes: ["elegant", "playful", "artistic", "professional", "creative"],
mood: "creative",
theme: "expression"
}
};
// Make dress-up game data available globally
window.dressUpGameData = dressUpGameData;

View File

@ -0,0 +1,288 @@
/**
* Endurance Game Mode Data
* Progressive endurance training with adaptive timers
*/
const enduranceGameData = {
// Progressive endurance scenarios
scenarios: [
{
id: 'scenario-endurance-assessment',
text: "Progressive Endurance Training",
difficulty: "Medium",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Gooning Endurance Academy",
steps: {
start: {
type: 'choice',
mood: 'assessment',
story: "Welcome to the Gooning Endurance Academy. Your trainer evaluates you carefully. 'Endurance is everything in gooning. We'll assess your current level and build your stamina progressively. What's your current experience level with extended edging sessions?'",
choices: [
{
text: "Beginner - I can edge for under a minute",
type: "beginner",
preview: "Start with short 30-second sessions",
nextStep: "beginner_path"
},
{
text: "Intermediate - I can edge for 2-5 minutes",
type: "intermediate",
preview: "Train with 2-3 minute sessions",
nextStep: "intermediate_path"
},
{
text: "Advanced - I can edge for 5+ minutes",
type: "advanced",
preview: "Challenge yourself with 5-10 minute sessions",
nextStep: "advanced_path"
},
{
text: "Expert - I can edge for 10+ minutes easily",
type: "expert",
preview: "Master-level endurance training",
nextStep: "expert_path"
}
]
},
beginner_path: {
type: 'action',
mood: 'encouraging',
story: "Your trainer nods approvingly. 'Perfect starting point. We'll build your endurance gradually. Start with 30 seconds of steady edging - focus on maintaining excitement without going over. This is your foundation.'",
actionText: "30-second beginner endurance training",
duration: 30,
nextStep: "progression_assessment"
},
intermediate_path: {
type: 'action',
mood: 'instructional',
story: "Your trainer sets a 2-minute timer. 'Good experience level. Let's work on extending your current abilities. Edge steadily for 2 minutes, maintaining consistent arousal. Feel how your endurance improves with practice.'",
actionText: "2-minute intermediate endurance session",
duration: 120,
nextStep: "progression_assessment"
},
advanced_path: {
type: 'action',
mood: 'challenging',
story: "Your trainer sets a 5-minute timer. 'Excellent foundation! Now we push your limits. Edge for 5 full minutes without cumming. This is where real gooners distinguish themselves from casual masturbators.'",
actionText: "5-minute advanced endurance challenge",
duration: 300,
nextStep: "progression_assessment"
},
expert_path: {
type: 'action',
mood: 'intense',
story: "Your trainer sets a 10-minute timer. 'Impressive experience! Let's test your true limits. Edge for a full 10 minutes, maintaining peak arousal without release. Only dedicated gooners can achieve this level of endurance.'",
actionText: "10-minute expert endurance marathon",
duration: 600,
nextStep: "mastery_assessment"
},
progression_assessment: {
type: 'choice',
mood: 'evaluating',
story: "Your trainer observes your performance with satisfaction. 'Good progress! Your excitement is at HIGH and control at VARIABLE. Ready to increase the challenge and build even more endurance?'",
choices: [
{
text: "Yes, increase the timer by 1 minute",
preview: "Step up to the next level",
nextStep: "step_up_training"
},
{
text: "Double my current endurance time",
preview: "Major challenge increase",
nextStep: "double_training"
},
{
text: "I want the maximum challenge",
preview: "Jump to 10-minute sessions",
nextStep: "maximum_training"
}
]
},
step_up_training: {
type: 'action',
mood: 'progressive',
story: "Your trainer adds 1 minute to your timer. 'Gradual progression builds solid endurance. Edge for this extended time - feel how your stamina improves with each session.'",
actionText: "Progressive endurance step-up session",
duration: 180,
nextStep: "endurance_mastery"
},
double_training: {
type: 'action',
mood: 'ambitious',
story: "Your trainer doubles your timer. 'Ambitious! This is how real progress happens. Edge for double your previous time - push through the mental barriers and build true gooning endurance.'",
actionText: "Double endurance challenge session",
duration: 360,
nextStep: "endurance_mastery"
},
maximum_training: {
type: 'action',
mood: 'extreme',
story: "Your trainer sets the maximum 10-minute timer. 'Ultimate endurance challenge! Only the most dedicated gooners can maintain arousal for this long. Prove your commitment to the gooning lifestyle.'",
actionText: "Maximum 10-minute endurance marathon",
duration: 600,
nextStep: "mastery_assessment"
},
mastery_assessment: {
type: 'choice',
mood: 'impressed',
story: "Your trainer watches in amazement. 'Outstanding endurance demonstration! You've shown real dedication. With your current arousal at HIGH and control at VARIABLE, what's your next goal?'",
choices: [
{
text: "Master even longer sessions",
preview: "Continue building endurance",
nextStep: "endurance_mastery"
},
{
text: "Graduate as an endurance expert",
preview: "Complete your training",
nextStep: "endurance_graduation"
}
]
},
endurance_mastery: {
type: 'action',
mood: 'masterful',
story: "Your trainer presents the ultimate endurance test. 'This is mastery level - edge for the full 10 minutes with perfect focus. Feel the power of true gooning endurance as you maintain arousal without release.'",
actionText: "Mastery-level 10-minute endurance test",
duration: 600,
nextStep: "endurance_graduation"
},
endurance_graduation: {
type: 'ending',
mood: 'accomplished',
story: "Your trainer stands and applauds. 'Congratulations! You have mastered gooning endurance. Your ability to maintain arousal for extended periods makes you a true dedicated gooner. You've earned your endurance certification.'",
endingText: "ENDURANCE MASTERY ACHIEVED! You are now certified in advanced gooning endurance - capable of extended sessions that prove your dedication.",
outcome: "endurance_master"
}
}
}
}
],
// Progressive endurance training tasks (timer-based only)
mainTasks: [
{
id: 'beginner-endurance-timer',
text: "Beginner endurance training (30 seconds)",
difficulty: "Easy",
interactiveType: "focus-hold",
story: "Build basic endurance with short sessions designed for beginners.",
duration: 30,
instructions: "Focus on maintaining excitement for 30 seconds - this is your foundation",
interactiveData: {
title: "Beginner Endurance Building",
description: "Build basic endurance with short sessions...",
initialText: "Start slow, focus on maintaining excitement for 30 seconds...",
sustainText: "Good! Keep that steady rhythm going...",
breakText: "Stay focused, you're building endurance...",
successText: "Perfect! You completed your first endurance milestone."
}
},
{
id: 'intermediate-endurance-timer',
text: "Intermediate endurance training (2 minutes)",
difficulty: "Medium",
interactiveType: "focus-hold",
story: "Extend your capabilities with 2-minute endurance sessions.",
duration: 120,
instructions: "Focus on maintaining excitement for 2 full minutes",
interactiveData: {
title: "Intermediate Endurance Development",
description: "Extend your capabilities with 2-minute sessions...",
initialText: "Focus on maintaining excitement for 2 full minutes...",
sustainText: "Excellent focus! Keep building that endurance...",
breakText: "Don't stop now, you're developing real stamina...",
successText: "Outstanding! Your endurance is clearly improving."
}
},
{
id: 'advanced-endurance-timer',
text: "Advanced endurance training (5 minutes)",
difficulty: "Hard",
interactiveType: "focus-hold",
story: "Push your limits with 5-minute endurance sessions.",
duration: 300,
instructions: "Edge for 5 minutes without cumming - this is serious endurance training",
interactiveData: {
title: "Advanced Endurance Challenge",
description: "Push your limits with 5-minute endurance sessions...",
initialText: "This is serious endurance training - edge for 5 minutes...",
sustainText: "Incredible focus! True gooner endurance showing...",
breakText: "Keep that edge going, you're proving your dedication...",
successText: "Amazing! You've achieved advanced endurance levels."
}
},
{
id: 'expert-endurance-timer',
text: "Expert endurance training (10 minutes)",
difficulty: "Extreme",
interactiveType: "focus-hold",
story: "Master-level endurance with 10-minute sessions for true gooners.",
duration: 600,
instructions: "Ultimate challenge - maintain arousal for 10 full minutes",
interactiveData: {
title: "Expert Endurance Mastery",
description: "Master-level endurance with 10-minute sessions...",
initialText: "Ultimate challenge - maintain excitement for 10 full minutes...",
sustainText: "Legendary endurance! Only true gooners achieve this...",
breakText: "Perfect focus! You're demonstrating mastery...",
successText: "INCREDIBLE! You've mastered expert-level endurance."
}
},
{
id: 'progressive-endurance-timer',
text: "Progressive endurance building (4 minutes)",
difficulty: "Variable",
interactiveType: "focus-hold",
story: "Adaptive training that increases with your ability.",
duration: 240,
instructions: "This session adapts to your current level - build progressively",
interactiveData: {
title: "Progressive Endurance Training",
description: "Adaptive training that increases with your ability...",
initialText: "This session adapts to your current level...",
sustainText: "Building endurance progressively...",
breakText: "Each session makes you stronger...",
successText: "Progress achieved! Your endurance is growing."
}
},
{
id: 'marathon-endurance-timer',
text: "Marathon endurance session (10 minutes)",
difficulty: "Extreme",
interactiveType: "focus-hold",
story: "Ultimate endurance test for dedicated gooners.",
duration: 600,
instructions: "Marathon session - this separates true gooners from casual users",
interactiveData: {
title: "Marathon Endurance Challenge",
description: "Ultimate endurance test for dedicated gooners...",
initialText: "Marathon session - this separates true gooners from casual users...",
sustainText: "Incredible stamina! You're in the endurance elite...",
breakText: "Legendary focus! Keep going, you're almost there...",
successText: "PHENOMENAL! You've achieved marathon endurance mastery."
}
}
],
// Configuration for progressive endurance mode
config: {
durationLevels: {
beginner: { duration: 30, maxDuration: 60 }, // 30 seconds to 1 minute
intermediate: { duration: 120, maxDuration: 180 }, // 2-3 minutes
advanced: { duration: 300, maxDuration: 480 }, // 5-8 minutes
expert: { duration: 600, maxDuration: 600 } // 10 minutes maximum
},
progressionRules: {
minSuccessRate: 0.8, // 80% success rate to advance
timeBetweenLevels: 3, // 3 successful sessions before advancing
maxTimerDuration: 600 // 10 minutes maximum as requested
},
mood: "progressive",
theme: "endurance_training"
}
};
// Make endurance game data available globally
window.enduranceGameData = enduranceGameData;

View File

@ -0,0 +1,680 @@
/**
* Humiliation Game Mode Data
* Tasks and challenges specific to humiliation themes
*/
const humiliationGameData = {
// Humiliation-themed tasks
mainTasks: [
{
id: 'verbal-humiliation-1',
text: "Verbal Self-Degradation",
difficulty: "Easy",
interactiveType: "text-input",
story: "Write out degrading statements about yourself. Type 'I am worthless' followed by a reason why.",
prompt: "Complete this sentence: 'I am worthless because...'",
minLength: 20
},
{
id: 'position-humiliation-1',
text: "Humiliating Position Hold",
difficulty: "Medium",
interactiveType: "focus-hold",
story: "Get on your knees and hold this degrading position while focusing on your complete submission.",
duration: 60,
instructions: "Kneel with your head down, hands behind your back"
}
],
// Consequence tasks for humiliation mode
consequenceTasks: [
{
id: 'humiliation-consequence-1',
text: "Extended Verbal Degradation",
difficulty: "Hard",
story: "Write 'I am a failure who deserves punishment' 50 times as punishment for avoiding your humiliation task."
},
{
id: 'humiliation-consequence-2',
text: "Submission Position",
difficulty: "Medium",
story: "Hold a submissive position for 5 minutes as punishment for your defiance."
}
],
// Scenarios specific to humiliation mode
scenarios: [
{
id: 'scenario-punishment-session',
text: "Punishment Gauntlet Session",
difficulty: "Hard",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Punishment Gauntlet",
steps: {
start: {
type: 'choice',
mood: 'severe',
story: "Welcome to the Punishment Gauntlet - the most intense humiliation and degradation training available. This is where failures are corrected and worthless subjects learn their proper place. Your supervisor looks at you with disgust. 'So, another pathetic failure who needs to be properly punished. We'll break you down completely. Choose your punishment.'",
choices: [
{
text: "Verbal degradation punishment",
type: "verbal",
preview: "Harsh verbal humiliation and self-degradation",
nextStep: "verbal_punishment"
},
{
text: "Position punishment",
type: "physical",
preview: "Degrading physical positioning",
nextStep: "position_punishment"
},
{
text: "Mirror punishment session",
type: "mirror",
preview: "Watch yourself be completely humiliated",
nextStep: "mirror_punishment"
},
{
text: "Complete punishment gauntlet",
type: "ultimate",
preview: "All punishments combined - maximum degradation",
nextStep: "ultimate_gauntlet"
}
]
},
verbal_punishment: {
type: 'text',
mood: 'cruel',
story: "The supervisor smirks coldly. 'Verbal punishment it is. You're going to degrade yourself completely. Start by repeating: I am a worthless failure who deserves to be punished.' Say it louder each time until you believe it.",
nextStep: "verbal_escalation"
},
position_punishment: {
type: 'verification-required',
mood: 'authoritative',
story: "The supervisor points to the floor aggressively. 'Get on your knees immediately. Hands behind your back, head down in shame. This is your punishment position. You will hold this degrading pose while thinking about what a complete failure you are.'",
verificationInstructions: "Get on your knees with hands behind your back and head down",
verificationDuration: 45,
verificationText: "Maintain this humiliating position while the camera captures your shame",
nextStep: "position_escalation"
},
mirror_punishment: {
type: 'mirror-action',
mood: 'psychological_torture',
story: "The supervisor activates your webcam with cruel satisfaction. 'Perfect. Now you'll watch yourself be completely humiliated. Look at yourself - really look at what a pathetic, worthless creature you are.'",
interactiveType: "mirror-task",
mirrorInstructions: "Look directly at yourself while repeating punishment phrases",
mirrorTaskText: "Stare at yourself and repeat with conviction: 'I am a failure', 'I deserve punishment', 'I am worthless', 'I am completely pathetic'",
duration: 180,
nextStep: "mirror_escalation"
},
ultimate_gauntlet: {
type: 'text',
mood: 'extreme_punishment',
story: "The supervisor's eyes light up with sadistic pleasure. 'The complete gauntlet? Excellent. You're about to experience the most degrading punishment we have. This will break you completely and leave you knowing exactly what you are - absolutely nothing.'",
nextStep: "gauntlet_phase_one"
},
verbal_escalation: {
type: 'choice',
mood: 'escalating_cruelty',
story: "The supervisor watches you degrade yourself and smiles cruelly. 'Good. Now we escalate your verbal punishment. Choose your next level of self-destruction.'",
choices: [
{
text: "Harsher self-degradation",
type: "extreme_verbal",
preview: "More brutal verbal self-punishment",
nextStep: "extreme_verbal_punishment"
},
{
text: "Mirror verbal punishment",
type: "mirror_verbal",
preview: "Degrade yourself while watching",
nextStep: "mirror_verbal_punishment"
},
{
text: "Complete verbal destruction",
type: "verbal_destruction",
preview: "Total verbal self-annihilation",
nextStep: "verbal_destruction"
}
]
},
position_escalation: {
type: 'choice',
mood: 'physical_domination',
story: "The supervisor observes your shameful position with satisfaction. 'Holding that degrading pose well. Now we add to your physical punishment.'",
choices: [
{
text: "More degrading positions",
type: "extreme_positions",
preview: "Even more shameful physical poses",
nextStep: "extreme_position_punishment"
},
{
text: "Extended position holding",
type: "endurance_position",
preview: "Hold degrading poses for longer",
nextStep: "endurance_position_punishment"
},
{
text: "Mirror position punishment",
type: "mirror_position",
preview: "Watch yourself in degrading positions",
nextStep: "mirror_position_punishment"
}
]
},
mirror_escalation: {
type: 'choice',
mood: 'psychological_breaking',
story: "The supervisor watches you stare at yourself in humiliation. 'Perfect. You can see exactly how pathetic you are. Ready for the next level of mirror punishment?'",
choices: [
{
text: "Extended mirror degradation",
type: "extended_mirror",
preview: "Longer self-humiliation viewing",
nextStep: "extended_mirror_punishment"
},
{
text: "Mirror with position punishment",
type: "combined_mirror",
preview: "Combine visual and physical punishment",
nextStep: "combined_mirror_punishment"
},
{
text: "Ultimate mirror destruction",
type: "mirror_destruction",
preview: "Complete psychological breakdown via mirror",
nextStep: "mirror_destruction"
}
]
},
gauntlet_phase_one: {
type: 'mirror-action',
mood: 'gauntlet_beginning',
story: "The supervisor begins the gauntlet. 'Phase One: Look at yourself while we break down your self-worth completely. This is just the beginning of your total humiliation.'",
interactiveType: "mirror-task",
mirrorInstructions: "Begin gauntlet by staring at yourself while repeating degrading phrases",
mirrorTaskText: "Repeat continuously: 'I am nothing', 'I deserve to be broken', 'I am completely worthless', 'I am lower than dirt'",
duration: 240,
nextStep: "gauntlet_phase_two"
},
extreme_verbal_punishment: {
type: 'action',
mood: 'verbal_brutality',
story: "The supervisor demands brutal self-degradation. 'Say it louder! More degrading! Destroy yourself with words!'",
actionText: "Speak the most degrading phrases about yourself with conviction",
duration: 180,
nextStep: "punishment_completion"
},
mirror_verbal_punishment: {
type: 'mirror-action',
mood: 'combined_cruelty',
story: "The supervisor combines mirror and verbal punishment. 'Look at yourself and tell yourself exactly what you are - completely worthless!'",
interactiveType: "mirror-task",
mirrorInstructions: "Stare at yourself while speaking brutal self-degradation",
mirrorTaskText: "While looking at yourself, say: 'I am disgusting', 'I am a complete failure', 'I deserve to be punished', 'I am absolutely nothing'",
duration: 240,
nextStep: "punishment_completion"
},
verbal_destruction: {
type: 'action',
mood: 'complete_verbal_annihilation',
story: "The supervisor pushes you to complete verbal self-destruction. 'Destroy yourself completely with words. Leave nothing of your self-worth intact!'",
actionText: "Engage in total verbal self-annihilation - destroy your self-worth completely",
duration: 300,
nextStep: "punishment_completion"
},
extreme_position_punishment: {
type: 'verification-required',
mood: 'physical_degradation',
story: "The supervisor forces you into the most degrading positions possible. 'Lower! More shameful! Show how worthless you are through your posture!'",
verificationInstructions: "Assume the most degrading physical position you can imagine",
verificationDuration: 60,
verificationText: "Hold your most shameful position while the camera documents your disgrace",
nextStep: "punishment_completion"
},
endurance_position_punishment: {
type: 'verification-required',
mood: 'endurance_humiliation',
story: "The supervisor makes you hold degrading positions for extended time. 'Hold that shameful pose longer! Feel how degrading it is!'",
verificationInstructions: "Get on your knees, hands behind back, head down in complete submission",
verificationDuration: 90,
verificationText: "Maintain this humiliating position for the full duration as your punishment",
nextStep: "punishment_completion"
},
mirror_position_punishment: {
type: 'mirror-action',
mood: 'visual_physical_punishment',
story: "The supervisor combines position and mirror punishment. 'Hold that degrading position while watching yourself! See how shameful you look!'",
interactiveType: "mirror-task",
mirrorInstructions: "Maintain degrading position while watching yourself",
mirrorTaskText: "While holding shameful pose, say: 'This is what I deserve', 'I look pathetic', 'I am properly positioned', 'I am in my place'",
duration: 300,
nextStep: "punishment_completion"
},
extended_mirror_punishment: {
type: 'mirror-action',
mood: 'extended_psychological_torture',
story: "The supervisor extends your mirror punishment to break you completely. 'Keep looking. Keep seeing what you really are. Let it destroy any remaining pride.'",
interactiveType: "mirror-task",
mirrorInstructions: "Extended mirror session to completely break down self-image",
mirrorTaskText: "For the entire duration, repeat: 'I hate what I see', 'I am completely disgusting', 'I deserve this punishment', 'I am absolutely worthless'",
duration: 420,
nextStep: "punishment_completion"
},
combined_mirror_punishment: {
type: 'mirror-action',
mood: 'combined_torture',
story: "The supervisor combines all forms of mirror punishment. 'Position yourself shamefully while watching and degrading yourself! Complete humiliation!'",
interactiveType: "mirror-task",
mirrorInstructions: "Combine shameful positioning with mirror viewing and verbal degradation",
mirrorTaskText: "In degrading position, while watching yourself, say: 'I am completely broken', 'I deserve all punishment', 'I am lower than human', 'I am absolutely nothing'",
duration: 360,
nextStep: "punishment_completion"
},
mirror_destruction: {
type: 'mirror-action',
mood: 'complete_psychological_destruction',
story: "The supervisor prepares to completely destroy you via mirror punishment. 'This will shatter what's left of your self-worth. Watch yourself become nothing.'",
interactiveType: "mirror-task",
mirrorInstructions: "Ultimate mirror session designed to completely destroy self-worth",
mirrorTaskText: "Stare at yourself and repeat these truths: 'I am completely worthless', 'I deserve to be destroyed', 'I am lower than dirt', 'I am absolutely nothing'",
duration: 480,
nextStep: "punishment_completion"
},
gauntlet_phase_two: {
type: 'choice',
mood: 'gauntlet_escalation',
story: "The supervisor continues the gauntlet with cruel satisfaction. 'Phase One complete. You're beginning to understand what you are. Phase Two will break you further. Choose your next level of punishment.'",
choices: [
{
text: "Physical degradation phase",
type: "physical_gauntlet",
preview: "Degrading physical punishment phase",
nextStep: "gauntlet_physical_phase"
},
{
text: "Verbal destruction phase",
type: "verbal_gauntlet",
preview: "Complete verbal self-destruction phase",
nextStep: "gauntlet_verbal_phase"
},
{
text: "Ultimate destruction phase",
type: "ultimate_destruction",
preview: "Final phase - complete destruction",
nextStep: "gauntlet_ultimate_phase"
}
]
},
gauntlet_physical_phase: {
type: 'mirror-action',
mood: 'gauntlet_physical',
story: "The supervisor begins the physical degradation phase. 'Now we break your body posture while you watch. Get into the most shameful position possible while staring at yourself!'",
interactiveType: "mirror-task",
mirrorInstructions: "Gauntlet physical phase - degrading positions while watching yourself",
mirrorTaskText: "In the most shameful position possible, while watching yourself, repeat: 'I am physically pathetic', 'My body shows my worthlessness', 'I deserve this shame'",
duration: 360,
nextStep: "gauntlet_final_phase"
},
gauntlet_verbal_phase: {
type: 'mirror-action',
mood: 'gauntlet_verbal',
story: "The supervisor begins the verbal destruction phase. 'Now we destroy your mind completely. Look at yourself and speak the most brutal truths about what you are!'",
interactiveType: "mirror-task",
mirrorInstructions: "Gauntlet verbal phase - complete self-destruction while watching",
mirrorTaskText: "While staring at yourself, repeat these devastating truths: 'I am completely worthless', 'I am a total failure', 'I deserve to be broken', 'I am absolutely nothing'",
duration: 420,
nextStep: "gauntlet_final_phase"
},
gauntlet_ultimate_phase: {
type: 'mirror-action',
mood: 'gauntlet_ultimate',
story: "The supervisor prepares the ultimate destruction phase. 'This is it - complete annihilation of your self-worth. Everything combined for maximum degradation!'",
interactiveType: "mirror-task",
mirrorInstructions: "Ultimate gauntlet phase - complete destruction through all methods",
mirrorTaskText: "In degrading position, while watching yourself, speak continuously: 'I am completely destroyed', 'I am thoroughly broken', 'I am lower than dirt', 'I am absolutely nothing'",
duration: 600,
nextStep: "gauntlet_completion"
},
gauntlet_final_phase: {
type: 'mirror-action',
mood: 'gauntlet_finishing',
story: "The supervisor prepares the final phase of your punishment gauntlet. 'One final phase to cement your complete degradation. You'll never forget what you truly are after this.'",
interactiveType: "mirror-task",
mirrorInstructions: "Final gauntlet phase - complete your transformation into nothing",
mirrorTaskText: "For the final phase, repeat continuously: 'I am completely broken', 'I have been properly punished', 'I know my place', 'I am thoroughly degraded'",
duration: 300,
nextStep: "gauntlet_completion"
},
punishment_completion: {
type: 'completion',
mood: 'satisfied_cruelty',
story: "The supervisor nods with cruel satisfaction. 'Punishment complete. You've been properly degraded and know your place. That's what happens to failures in this facility.'",
outcome: "punished"
},
gauntlet_completion: {
type: 'completion',
mood: 'ultimate_satisfaction',
story: "The supervisor looks at your broken state with complete satisfaction. 'Punishment Gauntlet complete. You have been thoroughly broken, completely degraded, and properly punished. You now know exactly what you are - absolutely nothing. Congratulations on surviving the gauntlet, though you'll never be the same.'",
outcome: "completely_broken"
}
}
}
},
{
id: 'scenario-humiliation-task',
text: "Advanced Humiliation Challenge",
difficulty: "Hard",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Advanced Humiliation Training",
steps: {
start: {
type: 'choice',
mood: 'clinical',
story: "You've been selected for advanced humiliation training. The instructor looks at you with cold analysis. 'This session will test your ability to handle intense psychological degradation. We'll push your limits until you break. Choose your humiliation path.'",
choices: [
{
text: "Psychological degradation",
type: "psychological",
preview: "Mental humiliation and self-worth destruction",
nextStep: "psychological_start"
},
{
text: "Physical humiliation tasks",
type: "physical",
preview: "Degrading physical tasks and positions",
nextStep: "physical_start"
},
{
text: "Mirror-based self-destruction",
type: "mirror",
preview: "Watch yourself be completely humiliated",
nextStep: "mirror_start"
},
{
text: "Complete humiliation protocol",
type: "complete",
preview: "All humiliation methods combined",
nextStep: "complete_protocol"
}
]
},
psychological_start: {
type: 'text',
mood: 'psychological_attack',
story: "The instructor begins your psychological breakdown. 'We're going to destroy your self-worth systematically. You'll understand exactly how worthless you are by the end of this.'",
nextStep: "psychological_escalation"
},
physical_start: {
type: 'text',
mood: 'physical_domination',
story: "The instructor points to specific positions. 'Your body will show your submission. Every pose will demonstrate your worthlessness. Begin with the most degrading position you can imagine.'",
nextStep: "physical_escalation"
},
mirror_start: {
type: 'mirror-action',
mood: 'visual_destruction',
story: "The instructor activates the visual humiliation system. 'Now you'll see yourself for what you truly are. Watch your own degradation and let it break you.'",
interactiveType: "mirror-task",
mirrorInstructions: "Begin by simply watching yourself while the instructor explains your worthlessness",
mirrorTaskText: "Look at yourself while repeating: 'I am looking at failure', 'I see worthlessness', 'This is what pathetic looks like'",
duration: 150,
nextStep: "mirror_escalation"
},
complete_protocol: {
type: 'text',
mood: 'complete_domination',
story: "The instructor's eyes light up. 'Complete protocol? Excellent. You'll experience every form of humiliation we have. This will break you completely and rebuild you as the worthless thing you are.'",
nextStep: "protocol_phase_one"
},
psychological_escalation: {
type: 'choice',
mood: 'mind_breaking',
story: "The instructor analyzes your response. 'Good. Your psychological defenses are weakening. Now we escalate your mental degradation.'",
choices: [
{
text: "Self-worth destruction",
type: "self_worth",
preview: "Systematic destruction of self-esteem",
nextStep: "self_worth_destruction"
},
{
text: "Identity dissolution",
type: "identity",
preview: "Complete breakdown of personal identity",
nextStep: "identity_dissolution"
},
{
text: "Mirror psychological assault",
type: "mirror_psych",
preview: "Visual psychological breakdown",
nextStep: "mirror_psychological"
}
]
},
physical_escalation: {
type: 'choice',
mood: 'physical_breakdown',
story: "The instructor observes your compliance. 'Your body is learning its place. Now we increase the physical humiliation.'",
choices: [
{
text: "More degrading positions",
type: "extreme_positions",
preview: "Increasingly shameful physical poses",
nextStep: "extreme_positions"
},
{
text: "Endurance humiliation",
type: "endurance",
preview: "Extended degrading position holding",
nextStep: "endurance_humiliation"
},
{
text: "Mirror physical shame",
type: "mirror_physical",
preview: "Watch your physical degradation",
nextStep: "mirror_physical"
}
]
},
mirror_escalation: {
type: 'choice',
mood: 'visual_intensification',
story: "The instructor watches you stare at yourself. 'Perfect. You're seeing the truth. Now we intensify your visual humiliation.'",
choices: [
{
text: "Extended self-viewing",
type: "extended_viewing",
preview: "Longer sessions of self-observation",
nextStep: "extended_viewing"
},
{
text: "Verbal mirror degradation",
type: "verbal_mirror",
preview: "Speak degradingly while watching yourself",
nextStep: "verbal_mirror"
},
{
text: "Complete mirror destruction",
type: "mirror_destruction",
preview: "Total visual-based breakdown",
nextStep: "mirror_destruction"
}
]
},
protocol_phase_one: {
type: 'mirror-action',
mood: 'protocol_beginning',
story: "The instructor begins the complete protocol. 'Phase One: Visual recognition of your worthlessness. Look at yourself and begin to understand what you are.'",
interactiveType: "mirror-task",
mirrorInstructions: "Protocol Phase One - comprehensive visual self-analysis",
mirrorTaskText: "Study yourself carefully while repeating: 'I am analyzing my worthlessness', 'I see complete failure', 'I understand what I am', 'I recognize my pathetic nature'",
duration: 240,
nextStep: "protocol_phase_two"
},
self_worth_destruction: {
type: 'action',
mood: 'systematic_destruction',
story: "The instructor systematically destroys your self-worth. 'Every positive thought about yourself is a lie. We'll eliminate them all.'",
actionText: "Allow systematic destruction of all self-worth and positive self-image",
duration: 300,
nextStep: "humiliation_completion"
},
identity_dissolution: {
type: 'action',
mood: 'identity_breakdown',
story: "The instructor works to dissolve your identity completely. 'Who you think you are is irrelevant. You'll become nothing but what we make you.'",
actionText: "Experience complete dissolution of personal identity and self-concept",
duration: 360,
nextStep: "humiliation_completion"
},
mirror_psychological: {
type: 'mirror-action',
mood: 'visual_mind_break',
story: "The instructor combines mirror viewing with psychological assault. 'Look at yourself while we destroy your mind. See your worthlessness reflected back.'",
interactiveType: "mirror-task",
mirrorInstructions: "Visual psychological breakdown - watch yourself while experiencing mental degradation",
mirrorTaskText: "While staring at yourself, repeat: 'My mind is being broken', 'I see my psychological destruction', 'I am mentally worthless', 'My thoughts are being crushed'",
duration: 300,
nextStep: "humiliation_completion"
},
extreme_positions: {
type: 'action',
mood: 'physical_extremity',
story: "The instructor pushes you to the most degrading physical positions possible. 'Show me how low you can go. Demonstrate your complete physical submission.'",
actionText: "Assume the most extremely degrading physical positions possible",
duration: 270,
nextStep: "humiliation_completion"
},
endurance_humiliation: {
type: 'action',
mood: 'physical_endurance_break',
story: "The instructor makes you hold degrading positions for extended periods. 'Your body will learn to stay in shameful poses until you're broken.'",
actionText: "Hold degrading positions for extended periods to break physical resistance",
duration: 450,
nextStep: "humiliation_completion"
},
mirror_physical: {
type: 'mirror-action',
mood: 'visual_physical_shame',
story: "The instructor combines physical degradation with mirror viewing. 'Hold shameful positions while watching yourself. See how physically pathetic you are.'",
interactiveType: "mirror-task",
mirrorInstructions: "Hold degrading positions while watching yourself in full view",
mirrorTaskText: "While maintaining shameful pose, say: 'I see my physical shame', 'My body shows my worthlessness', 'I look completely pathetic', 'This is my proper position'",
duration: 330,
nextStep: "humiliation_completion"
},
extended_viewing: {
type: 'mirror-action',
mood: 'extended_visual_torture',
story: "The instructor extends your mirror session to break you through prolonged self-viewing. 'Keep looking. Let the image of your worthlessness burn into your mind.'",
interactiveType: "mirror-task",
mirrorInstructions: "Extended self-viewing session designed to create lasting psychological impact",
mirrorTaskText: "For the entire extended period, repeat: 'I cannot escape what I see', 'This image will haunt me', 'I am permanently viewing my shame', 'I see eternal worthlessness'",
duration: 480,
nextStep: "humiliation_completion"
},
verbal_mirror: {
type: 'mirror-action',
mood: 'combined_verbal_visual',
story: "The instructor has you degrade yourself verbally while watching. 'Speak the truth about what you see. Be brutal. Be honest. Destroy yourself with words while watching.'",
interactiveType: "mirror-task",
mirrorInstructions: "Combine visual self-viewing with brutal verbal self-degradation",
mirrorTaskText: "While watching yourself, speak continuously: 'I am looking at complete failure', 'I see worthless trash', 'I am verbally destroying what I see', 'I hate what looks back at me'",
duration: 360,
nextStep: "humiliation_completion"
},
mirror_destruction: {
type: 'mirror-action',
mood: 'total_visual_annihilation',
story: "The instructor prepares for complete mirror-based destruction. 'This will shatter you completely. Watch yourself be utterly destroyed through your own reflection.'",
interactiveType: "mirror-task",
mirrorInstructions: "Ultimate mirror session designed for complete psychological destruction",
mirrorTaskText: "Stare at yourself while experiencing complete destruction: 'I am watching my complete annihilation', 'I see total destruction', 'I am being utterly destroyed', 'I am becoming nothing'",
duration: 540,
nextStep: "humiliation_completion"
},
protocol_phase_two: {
type: 'choice',
mood: 'protocol_escalation',
story: "The instructor moves to the next phase. 'Phase One complete. You're beginning to see what you are. Phase Two will break you further through combined methods.'",
choices: [
{
text: "Physical protocol phase",
type: "physical_protocol",
preview: "Physical degradation as part of complete protocol",
nextStep: "protocol_physical"
},
{
text: "Psychological protocol phase",
type: "psychological_protocol",
preview: "Mental breakdown as part of complete protocol",
nextStep: "protocol_psychological"
},
{
text: "Ultimate protocol completion",
type: "ultimate_protocol",
preview: "Final phase of complete humiliation protocol",
nextStep: "protocol_ultimate"
}
]
},
protocol_physical: {
type: 'mirror-action',
mood: 'protocol_physical_phase',
story: "The instructor begins the physical phase of the complete protocol. 'Now your body will be broken while you watch. Physical degradation while viewing your shame.'",
interactiveType: "mirror-task",
mirrorInstructions: "Protocol physical phase - degrading positions while watching yourself",
mirrorTaskText: "In degrading position while watching, repeat: 'My body is being broken', 'I see my physical submission', 'I am physically worthless', 'My pose shows my truth'",
duration: 360,
nextStep: "protocol_completion"
},
protocol_psychological: {
type: 'mirror-action',
mood: 'protocol_mental_phase',
story: "The instructor begins the psychological phase of the complete protocol. 'Now we break your mind while you watch it happen. Mental destruction in full view.'",
interactiveType: "mirror-task",
mirrorInstructions: "Protocol psychological phase - mental breakdown while watching yourself",
mirrorTaskText: "While watching your psychological breakdown, repeat: 'I see my mind breaking', 'I watch my thoughts crumble', 'I am mentally worthless', 'I observe my psychological destruction'",
duration: 420,
nextStep: "protocol_completion"
},
protocol_ultimate: {
type: 'mirror-action',
mood: 'protocol_ultimate_phase',
story: "The instructor begins the ultimate phase of the complete protocol. 'Final phase - total annihilation through all methods combined. Watch yourself be completely destroyed.'",
interactiveType: "mirror-task",
mirrorInstructions: "Ultimate protocol phase - complete destruction through all humiliation methods",
mirrorTaskText: "Experience and watch total destruction: 'I am completely destroyed', 'I see total annihilation', 'I am utterly broken', 'I am absolutely nothing'",
duration: 600,
nextStep: "protocol_completion"
},
humiliation_completion: {
type: 'completion',
mood: 'clinical_satisfaction',
story: "The instructor observes your broken state with clinical satisfaction. 'Humiliation training complete. You've been properly degraded and understand your worthlessness.'",
outcome: "humiliated"
},
protocol_completion: {
type: 'completion',
mood: 'protocol_satisfaction',
story: "The instructor completes the protocol with satisfaction. 'Complete humiliation protocol finished. You have been systematically broken through every method available. You are now properly educated about your true nature - absolutely worthless.'",
outcome: "completely_processed"
}
}
}
}
],
// Configuration for humiliation mode
config: {
mood: "dominant",
theme: "humiliation"
}
};
// Make humiliation game data available globally
window.humiliationGameData = humiliationGameData;

View File

@ -0,0 +1,487 @@
/**
* Main Game Data
* Standard task mode data - regular tasks and challenges
*/
const mainGameData = {
// Standard tasks for the main game mode
mainTasks: [
{
id: 1,
text: "Watch porn and stroke slowly, no cumming",
baseDuration: 5,
tags: []
},
{
id: 2,
text: "Edge while watching BBC content sitting in chair",
baseDuration: 6,
tags: ["bbc"]
},
{
id: 3,
text: "Change your panties and get on your knees",
baseDuration: 5,
tags: ["sissy"]
},
{
id: 4,
text: "Watch cuckold videos standing up and edge without release",
baseDuration: 8,
tags: ["cuckold"]
},
{
id: 5,
text: "Goon to compilation videos sitting, multiple edges",
baseDuration: 10,
tags: ["compilation"]
},
{
id: 6,
text: "Watch interracial in the captain morgan pose, stroke",
baseDuration: 10,
tags: ["interracial"]
},
{
id: 7,
text: "Edge to humiliation content while kneeling down",
baseDuration: 8,
tags: ["humiliation"]
},
{
id: 8,
text: "Watch sissy hypno standing while stroking with your non-dominant hand",
baseDuration: 6,
tags: ["sissy", "hypno"]
},
{
id: 9,
text: "Goon to gangbang videos sitting in chair",
baseDuration: 9,
tags: ["gangbang"]
},
{
id: 10,
text: "Watch MILF porn while standing, stroke",
baseDuration: 5,
tags: ["milf"]
},
{
id: 11,
text: "Edge to cuckold captions standing with multiple stops",
baseDuration: 9,
tags: ["cuckold", "captions"]
},
{
id: 12,
text: "Squeeze your balls while watching sissy porn",
baseDuration: 5,
tags: ["cbt", "sissy"]
},
{
id: 13,
text: "Slap your cock 10 times while watching humiliation content",
baseDuration: 5,
tags: ["cbt", "humiliation"]
},
{
id: 14,
text: "Call yourself a pathetic gooner while stroking",
baseDuration: 8,
tags: ["humiliation", "verbal"]
},
{
id: 15,
text: "Pinch your nipples and balls while edging to BBC content",
baseDuration: 5,
tags: ["cbt", "bbc"]
},
{
id: 16,
text: "Admit you're addicted to porn out loud while edging",
baseDuration: 6,
tags: ["humiliation", "verbal"]
},
{
id: 17,
text: "Flick your cock head 15 times then edge without cumming",
baseDuration: 8,
tags: ["cbt"]
},
{
id: 18,
text: "Watch trans porn while stroking sitting and standing alternately",
baseDuration: 10,
tags: ["trans"]
},
{
id: 19,
text: "Continuous stroking sitting to random videos",
baseDuration: 9,
tags: []
},
{
id: 20,
text: "Watch hotwife content while edging on knees",
baseDuration: 5,
tags: ["cuckold"]
},
{
id: 21,
text: "Get naked and edge standing to BBC compilations",
baseDuration: 9,
tags: ["bbc", "compilation"]
},
{
id: 22,
text: "Change your panties and then stand while watching porn",
baseDuration: 9,
tags: ["sissy"]
},
{
id: 23,
text: "Put panties and a bra on and edge in doggy position to humiliation content",
baseDuration: 9,
tags: ["sissy", "humiliation"]
},
{
id: 24,
text: "Stroke with your left hand only while watching BBC",
baseDuration: 6,
tags: ["bbc"]
},
{
id: 25,
text: "Edge to sissy captions while on your knees",
baseDuration: 8,
tags: ["sissy", "captions"]
},
{
id: 26,
text: "Slap your balls 5 times then edge to interracial porn",
baseDuration: 9,
tags: ["cbt", "interracial"]
},
{
id: 27,
text: "Watch gangbang videos while alternating hands every 30 seconds",
baseDuration: 8,
tags: ["gangbang"]
},
{
id: 28,
text: "Edge to femdom content while lying on your back",
baseDuration: 10,
tags: ["femdom"]
},
{
id: 29,
text: "Stroke while looking at yourself in the mirror and calling yourself a slut",
baseDuration: 5,
tags: ["humiliation", "verbal"]
},
{
id: 30,
text: "Slap your cock 10 times while watching humiliation videos",
baseDuration: 5,
tags: ["cbt", "humiliation"]
},
{
id: 31,
text: "Practice moaning like a girl while edging to sissy content",
baseDuration: 8,
tags: ["sissy", "vocal", "feminization"]
},
{
id: 32,
text: "Edge to sissy hypno while wearing your wife's panties",
baseDuration: 8,
tags: ["sissy", "hypno"]
},
{
id: 33,
text: "Slap your thighs 20 times then stroke to BBC content",
baseDuration: 6,
tags: ["cbt", "bbc"]
},
{
id: 34,
text: "Stroke while reciting \"I'm a pathetic cuckold\" 10 times to humiliation content",
baseDuration: 6,
tags: ["humiliation", "verbal", "cuckold"]
},
{
id: 35,
text: "Edge to cuckold videos while doing squats",
baseDuration: 6,
tags: ["cuckold"]
},
{
id: 36,
text: "Watch BBC content while crawling on all fours and stroking",
baseDuration: 5,
tags: ["bbc", "pet-play"]
},
{
id: 37,
text: "Slap your ass 15 times then edge to sissy content",
baseDuration: 8,
tags: ["cbt", "sissy"]
},
{
id: 38,
text: "Stroke to gangbang videos while switching hands every minute",
baseDuration: 9,
tags: ["gangbang"]
},
{
id: 39,
text: "Edge to humiliation content while wearing your wife's bra",
baseDuration: 8,
tags: ["humiliation", "sissy"]
},
{
id: 40,
text: "Stroke to BBC while chanting \"bigger is better\"",
baseDuration: 5,
tags: ["bbc", "verbal", "humiliation"]
},
{
id: 41,
text: "Stroke to compilation videos while on your knees",
baseDuration: 9,
tags: ["compilation"]
},
{
id: 42,
text: "Edge to sissy captions while touching your nipples",
baseDuration: 6,
tags: ["sissy", "captions", "nipple-play"]
},
{
id: 43,
text: "Watch interracial while alternating fast and slow strokes every 30 seconds",
baseDuration: 8,
tags: ["interracial"]
},
{
id: 44,
text: "Watch humiliation content while stroking with just your fingertips",
baseDuration: 8,
tags: ["humiliation"]
},
{
id: 45,
text: "Edge to sissy hypno while practicing feminine poses",
baseDuration: 9,
tags: ["sissy", "hypno", "feminization"]
}
],
// Consequence tasks for when main tasks are skipped
consequenceTasks: [
{
id: 101,
text: "Eat your own precum while watching your wife's photos and imagining her with better men",
baseDuration: 8,
tags: ["humiliation", "cuckold"]
},
{
id: 102,
text: "Do 20 push-ups while wearing your wife's panties",
baseDuration: 5,
tags: ["exercise", "sissy", "humiliation"]
},
{
id: 103,
text: "Practice begging on your knees: 'Please let other men have my wife, I'm not worthy of her'",
baseDuration: 10,
tags: ["begging", "cuckold", "humiliation"]
},
{
id: 104,
text: "Gently push a finger inside your ass and hold it there",
baseDuration: 5,
tags: ["anal", "humiliation"]
},
{
id: 105,
text: "Slap your cock 10 times while looking at your wife's photos and saying 'I don't deserve her' after each slap",
baseDuration: 5,
tags: ["cbt", "cuckold", "humiliation"]
},
{
id: 106,
text: "Look at your wife's sexiest pictures while imagining her showing them to alpha males and chanting 'I'm a pathetic cuckold'",
baseDuration: 10,
tags: ["cuckold", "humiliation", "mental"]
},
{
id: 107,
text: "Find your wife's dirtiest panties and sniff them while stroking",
baseDuration: 5,
tags: ["panty-worship", "humiliation", "scent"]
},
{
id: 108,
text: "Find your wife's sexiest lingerie, put it on, and practice crawling on all fours like a submissive pet",
baseDuration: 8,
tags: ["sissy", "pet-play", "humiliation"]
},
{
id: 109,
text: "Put on your wife's dress or skirt and pose femininely in the mirror",
baseDuration: 10,
tags: ["sissy", "posing"]
},
{
id: 110,
text: "Find your wife's dirtiest panties and sniff them while stroking",
baseDuration: 5,
tags: ["panty-worship", "humiliation", "scent"]
},
{
id: 111,
text: "Find your wife's dirtiest panties and sniff them while stroking",
baseDuration: 5,
tags: ["panty-worship", "humiliation", "scent"]
},
{
id: 112,
text: "Jerk off while imagining you're a cum dump for your bull, begging for him to fill you up",
baseDuration: 5,
tags: ["fantasy", "humiliation", "cuckold"]
},
{
id: 113,
text: "Lick your wife's dirty panties while edging and repeating 'I'm not man enough for her'",
baseDuration: 6,
tags: ["panty-worship", "humiliation"]
},
{
id: 114,
text: "Push two fingers in your ass and fuck yourself while begging to be used like a sissy",
baseDuration: 5,
tags: ["anal", "sissy", "humiliation"]
},
{
id: 115,
text: "Find your wife's sexiest outfit and wear it while practicing sucking motions on a dildo",
baseDuration: 10,
tags: ["sissy", "oral-training", "toy"]
},
{
id: 116,
text: "Sniff your wife's worn shoes while jerking off and imagining her walking to meet her lover",
baseDuration: 8,
tags: ["foot-worship", "scent", "cuckold", "fantasy"]
},
{
id: 117,
text: "Finger your ass with one hand while slapping your cock with the other",
baseDuration: 6,
tags: ["anal", "cbt", "dual-stimulation"]
},
{
id: 118,
text: "Wear your wife's bra and panties while doing jumping jacks",
baseDuration: 5,
tags: ["exercise", "sissy", "humiliation"]
},
{
id: 119,
text: "Lick the inside of your wife's high heels while edging and saying 'She walks to better men'",
baseDuration: 5,
tags: ["foot-worship", "humiliation"]
},
{
id: 120,
text: "Push three fingers in your ass and stretch yourself while begging to be filled by a real man",
baseDuration: 5,
tags: ["anal", "humiliation"]
},
{
id: 121,
text: "Do 30 squats while wearing your wife's thong and chanting 'I'm a sissy cuck' with each squat",
baseDuration: 5,
tags: ["exercise", "sissy", "humiliation"]
},
{
id: 122,
text: "Lick your wife's dirty socks while edging and repeating 'Real men deserve her pussy I deserve her feet'",
baseDuration: 8,
tags: ["foot-worship", "humiliation"]
},
{
id: 123,
text: "Wear your wife's shortest dress and practice walking slutty while stroking",
baseDuration: 10,
tags: ["sissy"]
},
{
id: 124,
text: "Do planks while wearing your wife's sports bra and saying 'She's stronger than me'",
baseDuration: 5,
tags: ["exercise", "sissy", "humiliation"]
}
],
// Configuration for main game mode
config: {
// Duration scaling system
durationSettings: {
short: {
name: "Short",
description: "1-5 minute sessions",
multiplier: 0.5,
minDuration: 1,
maxDuration: 5
},
medium: {
name: "Medium",
description: "5-10 minute sessions",
multiplier: 1.0,
minDuration: 5,
maxDuration: 10
},
long: {
name: "Long",
description: "15-20 minute sessions",
multiplier: 2.5,
minDuration: 15,
maxDuration: 20
}
},
// Function to calculate actual duration based on setting
calculateDuration: function(baseDuration, setting = 'medium') {
const config = this.durationSettings[setting];
if (!config) return baseDuration;
let calculatedDuration = Math.round(baseDuration * config.multiplier);
// Enforce min/max bounds
if (calculatedDuration < config.minDuration) {
calculatedDuration = config.minDuration;
} else if (calculatedDuration > config.maxDuration) {
calculatedDuration = config.maxDuration;
}
return calculatedDuration;
},
difficultySystem: {
easy: { points: 10, timeBonus: 5 },
medium: { points: 20, timeBonus: 10 },
hard: { points: 30, timeBonus: 15 }
},
streakBonuses: {
5: 50, // 5 task streak bonus
10: 100, // 10 task streak bonus
20: 250 // 20 task streak bonus
}
}
};
// Make main game data available globally
window.mainGameData = mainGameData;

View File

@ -0,0 +1,453 @@
/**
* Gooner Training Academy Game Mode Data
* Focused on edging, porn worship, and developing dedicated gooning habits
*/
const trainingGameData = {
// Gooning-focused training tasks
mainTasks: [
{
id: 'edge-focus-training',
text: "Edging Focus Training",
difficulty: "Medium",
interactiveType: "focus-hold",
story: "Train your ability to stay focused on porn while edging. Maintain perfect concentration on the screen while stroking - no distractions allowed.",
duration: 60,
instructions: "Keep your eyes on the porn and focus only on gooning"
},
{
id: 'stroking-endurance-training',
text: "Stroking Endurance Training",
difficulty: "Easy",
interactiveType: "focus-hold",
story: "Build your stroking stamina and endurance. Maintain continuous stroking motion for the full duration while staying focused on the porn.",
duration: 90,
instructions: "Stroke continuously without stopping - build your gooning endurance"
},
{
id: 'extended-edging-session',
text: "Extended Edging Marathon",
difficulty: "Hard",
interactiveType: "focus-hold",
story: "Build your gooning endurance by maintaining the perfect edge for an extended period. Real gooners can edge for hours - let's build that stamina.",
duration: 180,
instructions: "Edge continuously without cumming - prove your gooner dedication"
}
],
// Training scenarios
scenarios: [
{
id: 'scenario-training-regimen',
text: "Gooner Training Academy",
difficulty: "Medium",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Advanced Gooner Training Academy",
steps: {
start: {
type: 'choice',
mood: 'encouraging',
story: "Welcome to the Gooner Training Academy. Your instructor looks you up and down with approval. 'I can see you're ready to become a dedicated gooner. We'll train you to edge longer, watch more porn, and develop proper gooning habits. Which area of gooner training would you like to focus on first?'",
choices: [
{
text: "Edging endurance training",
type: "endurance",
preview: "Learn to edge for hours without cumming",
nextStep: "edging_path"
},
{
text: "Porn addiction enhancement",
type: "addiction",
preview: "Deepen your love and need for pornography",
nextStep: "addiction_path"
},
{
text: "Gooning mindset development",
type: "mindset",
preview: "Embrace the gooner lifestyle completely",
nextStep: "mindset_path"
},
{
text: "Advanced masturbation techniques",
type: "technique",
preview: "Master sophisticated stroking methods",
nextStep: "technique_path"
}
]
},
edging_path: {
type: 'choice',
mood: 'instructional',
story: "Your instructor leads you to the edging training area. 'Real gooners can edge for hours, building excitement without release. This is the foundation of gooning - the ability to stay on the edge indefinitely while worshipping porn. How would you like to begin your edging training?'",
choices: [
{
text: "Start with basic 30-minute edges",
preview: "Build fundamental edging skills",
nextStep: "basic_edging"
},
{
text: "Jump to marathon edging sessions",
preview: "Train for multi-hour gooning",
nextStep: "marathon_edging"
},
{
text: "Learn advanced edging patterns",
preview: "Master complex stroking rhythms",
nextStep: "pattern_edging"
}
]
},
basic_edging: {
type: 'action',
mood: 'patient',
story: "Your instructor guides you through proper edging technique. 'Start slow, build arousal over 30 minutes. Feel how the porn makes you throb. This is just the beginning - real gooners edge for hours. Focus on the pleasure, worship the porn, but don't you dare cum.'",
actionText: "30-minute basic edging training session",
duration: 120,
nextStep: "edging_assessment"
},
pattern_edging: {
type: 'action',
mood: 'technical',
story: "Your instructor demonstrates complex stroking patterns. 'Advanced gooners master sophisticated rhythms and techniques. You'll learn variable speed patterns, pressure control, and rhythm changes that maximize pleasure while maintaining perfect edge focus.'",
actionText: "Advanced edging pattern training",
duration: 150,
nextStep: "edging_assessment"
},
edging_assessment: {
type: 'choice',
mood: 'evaluative',
story: "Your instructor evaluates your edging progress. 'Good foundation! Now let's see how ready you are for more advanced training. Your edging skills are developing nicely. What aspect would you like to focus on next?'",
choices: [
{
text: "Continue building endurance",
preview: "Work on longer edging sessions",
nextStep: "endurance_mastery"
},
{
text: "Move to advanced training",
preview: "Progress to expert techniques",
nextStep: "advanced_training"
},
{
text: "Explore different training paths",
preview: "Try other aspects of gooner training",
nextStep: "addiction_path"
}
]
},
marathon_edging: {
type: 'action',
mood: 'intense',
story: "Your instructor nods approvingly. 'Ambitious! Let's see if you can handle real gooner training. Edge continuously for 2 hours, building and building but never cumming. Feel how the porn controls you, how your cock throbs for it. This is what true gooners do - they live on the edge.'",
actionText: "2-hour marathon edging session",
duration: 300,
nextStep: "endurance_mastery"
},
addiction_path: {
type: 'choice',
mood: 'seductive',
story: "Your instructor's eyes light up. 'Excellent choice. Porn addiction is the heart of gooning. We'll deepen your need for pornography, make you crave it more than anything else. Which aspect of porn addiction should we enhance first?'",
choices: [
{
text: "Increase daily porn consumption",
preview: "Train to watch more porn every day",
nextStep: "consumption_training"
},
{
text: "Develop porn dependency habits",
preview: "Make porn essential to your daily life",
nextStep: "dependency_training"
},
{
text: "Master porn worship techniques",
preview: "Learn to properly worship pornography",
nextStep: "worship_training"
}
]
},
consumption_training: {
type: 'action',
mood: 'addictive',
story: "Your instructor pulls up endless screens of porn. 'Real gooners spend hours every day with porn. We'll train you to consume more, crave more, need more. Edge while watching multiple videos - let the porn flood your mind and control your cock.'",
actionText: "Multi-screen porn consumption while edging",
duration: 200,
nextStep: "addiction_deepening"
},
dependency_training: {
type: 'action',
mood: 'dependent',
story: "Your instructor nods approvingly. 'Excellent choice. We'll make porn absolutely essential to your daily life. You'll learn to depend on pornography for pleasure, comfort, and arousal. Start by edging while thinking about how much you need porn every single day. You cannot live without porn. When you aren't stroking to porn you are thinking about stroking to porn. Porn.... Porn.... PORN!!!!'",
actionText: "Porn dependency conditioning session",
duration: 200,
nextStep: "addiction_deepening"
},
worship_training: {
type: 'action',
mood: 'reverent',
story: "Your instructor's voice becomes reverent. 'Porn worship is an art form. You'll learn to truly appreciate and worship pornography as your master. Get on your knees and edge slowly while expressing gratitude to porn for controlling your life and giving you purpose. Thank porn for everything it does for you. Thank pornstars for their dedication to their artform. Porn is so beautiful and powerful - worship it with all your heart.'",
actionText: "Porn worship and gratitude training",
duration: 240,
nextStep: "addiction_deepening"
},
addiction_deepening: {
type: 'choice',
mood: 'intense',
story: "Your instructor reviews your addiction training progress. 'Excellent! Your porn dependency is developing beautifully. Now let's deepen your addiction even further. Choose your next level of porn addiction enhancement.'",
choices: [
{
text: "Increase daily viewing requirements",
preview: "Commit to more hours of daily porn",
nextStep: "viewing_commitment"
},
{
text: "Develop porn craving triggers",
preview: "Learn to crave porn constantly",
nextStep: "craving_training"
},
{
text: "Complete addiction certification",
preview: "Graduate as a certified porn addict",
nextStep: "advanced_training"
}
]
},
viewing_commitment: {
type: 'action',
mood: 'demanding',
story: "Your instructor becomes more demanding. 'Real porn addicts watch for hours every day. Commit to spending at least 30 minutes with pornography right here and now. Edge continuously while fullfilling this commitment - feel how natural and necessary this is.'",
actionText: "Daily porn viewing commitment session",
duration: 1800,
nextStep: "advanced_training"
},
craving_training: {
type: 'action',
mood: 'addictive',
story: "Your instructor smiles wickedly. 'We'll train your brain to crave porn constantly. Every few minutes, you'll think about pornography and feel the need to stroke. Edge while programming these craving patterns into your mind.'",
actionText: "Constant porn craving conditioning",
duration: 210,
nextStep: "advanced_training"
},
mindset_path: {
type: 'choice',
mood: 'transformative',
story: "Your instructor smiles knowingly. 'The gooner mindset is everything. We'll transform how you think, making porn and masturbation your primary focus. You'll learn to embrace being a dedicated gooner. What aspect of the gooner mindset should we develop?'",
choices: [
{
text: "Embrace porn as your master",
preview: "Accept porn's control over your life",
nextStep: "submission_training"
},
{
text: "Develop gooner identity and pride",
preview: "Take pride in being a dedicated gooner",
nextStep: "identity_training"
},
{
text: "Learn gooner lifestyle habits",
preview: "Integrate gooning into daily life",
nextStep: "lifestyle_training"
}
]
},
submission_training: {
type: 'action',
mood: 'dominant',
story: "Your instructor's voice becomes commanding. 'Good. Now you'll learn to submit completely to porn. Edge while repeating: I live to serve porn. Porn controls my cock. I am nothing without pornography. Feel how true these words are as you stroke.'",
actionText: "Porn submission mantras while edging",
duration: 150,
nextStep: "advanced_training"
},
technique_path: {
type: 'choice',
mood: 'expert',
story: "Your instructor leads you to an advanced training area. 'Masturbation technique is crucial for gooners. We'll teach you sophisticated stroking methods, rhythm control, and edging patterns that will make your sessions more intense and satisfying. Which technique interests you most?'",
choices: [
{
text: "Multi-rhythm stroking patterns",
preview: "Master complex stroking rhythms",
nextStep: "rhythm_training"
},
{
text: "Extended pleasure techniques",
preview: "Learn to maximize gooning pleasure",
nextStep: "pleasure_training"
},
{
text: "Advanced edging control methods",
preview: "Perfect your edge focus",
nextStep: "control_training"
}
]
},
rhythm_training: {
type: 'action',
mood: 'rhythmic',
story: "Your instructor demonstrates complex stroking rhythms. 'Master gooners understand rhythm is everything. Try 3 short strokes in rapid succession focusing just on the tip followed by 2 long strokes going the full length of your cock. Practice these patterns while edging to perfect porn.'",
actionText: "Multi-rhythm stroking pattern training",
duration: 180,
nextStep: "edging_assessment"
},
pleasure_training: {
type: 'action',
mood: 'euphoric',
story: "Your instructor's voice becomes hypnotic. 'We'll teach you to extract maximum pleasure from every stroke. Learn to savor each sensation, multiply your arousal, and experience gooning bliss like never before. Place your finger of your other hand on your perineum to enhance the pleasure while edging. Feel every stroke intensify as you stroke small circles while stroking the length of your cock.'",
actionText: "Extended pleasure maximization training",
duration: 200,
nextStep: "advanced_training"
},
control_training: {
type: 'action',
mood: 'precise',
story: "Your instructor becomes serious. 'Control is what separates gooners from casual masturbators. You'll learn to edge precisely at the perfect point, maintaining excitement for hours without accident. Master this and you master gooning. Bring yourself right to the edge and stop. Wait for your erection to wane and then repeat it. See how many times you can do this before the timer runs out.'",
actionText: "Advanced edge focus mastery",
duration: 240,
nextStep: "advanced_training"
},
identity_training: {
type: 'action',
mood: 'transformative',
story: "Your instructor speaks with pride. 'Embrace your identity as a dedicated gooner. This isn't just what you do - this is who you are. Watch the porn on your screen and edge while reminding yourself that you are a proud gooner, devoted to the art of pleasure. Nothing else matters more than pleasuring yourself to perfect porn.'",
actionText: "Gooner identity acceptance training",
duration: 180,
nextStep: "advanced_training"
},
lifestyle_training: {
type: 'action',
mood: 'practical',
story: "Your instructor becomes practical. 'Real gooners integrate their lifestyle completely. You'll learn to schedule daily gooning time, organize your porn collection, and make gooning a central part of your routine. Edge while planning your gooner lifestyle.'",
actionText: "Gooner lifestyle integration training",
duration: 160,
nextStep: "advanced_training"
},
endurance_mastery: {
type: 'action',
mood: 'accomplished',
story: "Your instructor observes your marathon session with approval. 'Excellent endurance! You're developing real gooner stamina. Now let's push further - edge for another hour while worshipping different types of porn. Feel how each category affects your arousal differently.'",
actionText: "Extended endurance with varied porn categories",
duration: 240,
nextStep: "advanced_training"
},
advanced_training: {
type: 'choice',
mood: 'expert',
story: "Your instructor reviews your progress with satisfaction. 'Outstanding development! You're ready for advanced gooner training. These techniques will make you a true porn addict and dedicated gooner.'",
choices: [
{
text: "Master-level gooning challenges",
preview: "Ultimate gooner difficulty tests",
nextStep: "master_gooning"
},
{
text: "Become a certified gooner",
preview: "Graduate as a dedicated gooner",
nextStep: "gooner_graduation"
},
{
text: "Continue advanced edging training",
preview: "Further develop your skills",
nextStep: "endurance_mastery"
}
]
},
master_gooning: {
type: 'action',
mood: 'extreme',
story: "Your instructor presents the ultimate challenge. 'This is master-level gooner training. You will edge for 6 hours straight, cycling through different porn categories, changing techniques every 30 minutes, while maintaining perfect excitement without cumming. This is what separates casual masturbators from true gooners.'",
actionText: "Master-level 6-hour gooning marathon",
duration: 360,
nextStep: "gooner_graduation"
},
gooner_graduation: {
type: 'ending',
mood: 'proud',
story: "Your instructor stands and salutes you. 'Congratulations! You have completed the Advanced Gooner Training Academy with distinction. You are now a certified gooner, dedicated to porn and masturbation. Your commitment to edging and porn worship is exemplary.'",
endingText: "GOONER CERTIFICATION ACHIEVED! You are now a certified dedicated gooner, committed to spending your life edging to pornography.",
outcome: "certified_gooner"
}
}
}
},
/*
{
id: 'scenario-training-session',
text: "Quick Endurance Assessment",
difficulty: "Easy",
interactiveType: "scenario-adventure",
interactiveData: {
title: "Endurance Level Assessment",
steps: {
start: {
type: 'choice',
mood: 'assessment',
story: "Welcome to your endurance assessment. We'll quickly determine your current stamina level and provide appropriate training. How much edging experience do you have?",
choices: [
{
text: "Complete beginner",
type: "novice",
preview: "Start with 30-second sessions",
nextStep: "novice_training"
},
{
text: "Some experience",
type: "experienced",
preview: "Try 2-3 minute sessions",
nextStep: "experienced_training"
},
{
text: "Very experienced",
type: "veteran",
preview: "Challenge with 5+ minute sessions",
nextStep: "veteran_training"
}
]
},
novice_training: {
type: 'action',
mood: 'gentle',
story: "Perfect for beginners! Start with just 30 seconds of steady edging. Focus on building the foundation - maintain arousal without going over the edge.",
actionText: "30-second beginner assessment",
duration: 30,
nextStep: "completion"
},
experienced_training: {
type: 'action',
mood: 'challenging',
story: "Good experience level! Let's test your stamina with 2 minutes of continuous edging. Maintain steady arousal and prove your developing endurance.",
actionText: "2-minute intermediate assessment",
duration: 120,
nextStep: "completion"
},
veteran_training: {
type: 'action',
mood: 'intense',
story: "Impressive experience! Time for a real challenge - 5 minutes of sustained edging. Show your dedication and endurance mastery.",
actionText: "5-minute veteran assessment",
duration: 300,
nextStep: "completion"
},
completion: {
type: 'completion',
mood: 'satisfied',
story: "Assessment complete! Your endurance level has been recorded. Continue practicing daily to build even greater stamina and become a more dedicated gooner.",outcome: "assessed"
}
}
}
}
*/
],
// Configuration for gooner training mode
config: {
progressionSystem: {
beginner: { multiplier: 1.0, unlocks: ["basic"] },
intermediate: { multiplier: 1.3, unlocks: ["basic", "advanced"] },
expert: { multiplier: 1.7, unlocks: ["basic", "advanced", "master"] }
},
mood: "addictive",
theme: "gooning_enhancement"
}
};
// Make training game data available globally
window.trainingGameData = trainingGameData;

View File

@ -1997,6 +1997,9 @@ class InteractiveTaskManager {
actionBtn.innerHTML = `
<div class="action-text">${step.actionText}</div>
<div class="action-timer" id="action-timer">${step.duration || 30}s</div>
<button id="skip-action-timer-btn" class="btn btn-warning skip-timer-btn" style="margin-top: 10px;">
Skip Timer (Testing)
</button>
`;
actionBtn.addEventListener('click', () => {
@ -2099,6 +2102,14 @@ class InteractiveTaskManager {
actionBtn.disabled = true;
actionBtn.classList.add('active');
// Add skip button handler
const skipBtn = document.getElementById('skip-action-timer-btn');
if (skipBtn) {
skipBtn.addEventListener('click', () => {
timeLeft = 0; // This will trigger completion on next interval
});
}
const countdown = setInterval(() => {
timeLeft--;
timerEl.textContent = `${timeLeft}s`;
@ -2156,6 +2167,9 @@ class InteractiveTaskManager {
<div class="progress-bar" id="mirror-progress-bar"></div>
</div>
<div class="timer-text">Time remaining: <span id="mirror-time">${step.duration || 60}</span>s</div>
<button id="skip-scenario-mirror-timer-btn" class="btn btn-warning skip-timer-btn" style="margin-top: 10px;">
Skip Timer (Testing)
</button>
</div>
`;
@ -2264,6 +2278,14 @@ class InteractiveTaskManager {
this.game.webcamManager.preventClose = true;
}
// Add skip button handler
const skipBtn = document.getElementById('skip-scenario-mirror-timer-btn');
if (skipBtn) {
skipBtn.addEventListener('click', () => {
timeLeft = 0; // This will trigger completion on next interval
});
}
const countdown = setInterval(() => {
timeLeft--;
timeEl.textContent = timeLeft;
@ -2358,6 +2380,14 @@ class InteractiveTaskManager {
this.game.webcamManager.preventClose = true;
}
// Add skip button handler
const skipBtn = container.querySelector('#skip-mirror-timer-btn');
if (skipBtn) {
skipBtn.addEventListener('click', () => {
timeLeft = 0; // This will trigger completion on next interval
});
}
const countdown = setInterval(() => {
timeLeft--;
timeDisplay.textContent = `${timeLeft}s`;
@ -2752,6 +2782,9 @@ class InteractiveTaskManager {
${task.duration || 60}s
</div>
<div class="timer-label">Mirror session in progress...</div>
<button id="skip-mirror-timer-btn" class="btn btn-warning skip-timer-btn" style="margin-top: 15px;">
Skip Timer (Testing)
</button>
</div>
</div>
</div>
@ -2847,6 +2880,9 @@ class InteractiveTaskManager {
${verificationDuration}s
</div>
<div class="timer-label">Verification in progress...</div>
<button id="skip-pose-timer-btn" class="btn btn-warning skip-timer-btn" style="margin-top: 15px;">
Skip Timer (Testing)
</button>
</div>
</div>
</div>
@ -2936,6 +2972,15 @@ class InteractiveTaskManager {
startBtn.style.display = 'none';
let timeLeft = duration;
// Add skip button handler
const skipBtn = container.querySelector('#skip-pose-timer-btn');
if (skipBtn) {
skipBtn.addEventListener('click', () => {
timeLeft = 0; // This will trigger completion on next interval
});
}
const interval = setInterval(() => {
timeLeft--;
timeDisplay.textContent = `${timeLeft}s`;
@ -3358,13 +3403,74 @@ class InteractiveTaskManager {
completeMirrorTask(taskData) {
console.log('🪞 Mirror task completed through webcam');
// Check if game is still running
if (!this.game.gameState.isRunning) {
// Check if this is a scenario step (not a standalone task)
const currentTask = this.game?.gameState?.currentTask;
console.log('🔍 Current task check:', currentTask);
console.log('🔍 Task details:', {
hasTask: !!currentTask,
taskId: currentTask?.id,
interactiveType: currentTask?.interactiveType,
hasScenarioState: !!currentTask?.scenarioState,
scenarioState: currentTask?.scenarioState,
currentStep: currentTask?.scenarioState?.currentStep
});
if (currentTask && currentTask.interactiveType === 'scenario-adventure' && currentTask.scenarioState) {
console.log('✅ IS SCENARIO - Completing scenario mirror step');
// Get the current step
const scenario = currentTask.interactiveData;
const currentStepId = currentTask.scenarioState.currentStep;
const step = scenario.steps[currentStepId];
console.log('🔍 Step info:', {
currentStepId,
stepType: step?.type,
hasNextStep: !!(step?.nextStep || step?.next),
nextStep: step?.nextStep || step?.next,
step: step
});
if (step && (step.nextStep || step.next)) {
// Apply step effects
this.applyActionEffects(step, currentTask.scenarioState);
// Move to next step
const nextStep = step.next || step.nextStep || this.getDefaultNextStep(currentTask.scenarioState);
console.log('⏭️ Advancing to next step:', nextStep);
setTimeout(() => {
currentTask.scenarioState.currentStep = nextStep;
currentTask.scenarioState.stepNumber++;
// Check if we're in training academy mode
if (window.proceedToNextStep && typeof window.proceedToNextStep === 'function') {
console.log('🎓 Using training academy progression');
window.proceedToNextStep(nextStep);
} else {
// Standard scenario progression
this.displayScenarioStep(currentTask, scenario, nextStep);
}
}, 1000);
return; // Don't complete the whole task, just advance the scenario
} else {
console.log('❌ Step has no nextStep property');
}
} else {
console.log('❌ NOT A SCENARIO - will complete task normally');
console.log(' - currentTask exists:', !!currentTask);
console.log(' - is scenario-adventure:', currentTask?.interactiveType === 'scenario-adventure');
console.log(' - has scenarioState:', !!currentTask?.scenarioState);
}
// Only try to complete the task if game is running
if (!this.game?.gameState?.isRunning) {
console.log('Mirror task completion cancelled - game no longer running');
return;
}
// Show completion message
// Show completion message for standalone tasks
if (this.game && this.game.showNotification) {
this.game.showNotification('Mirror task completed! 🪞', 'success', 3000);
}
@ -3375,6 +3481,7 @@ class InteractiveTaskManager {
}
// Complete the task
console.log('📞 Calling game.completeTask()');
setTimeout(() => {
if (this.game.gameState.isRunning) {
this.game.completeTask();
@ -3708,6 +3815,31 @@ class InteractiveTaskManager {
backdrop-filter: blur(10px);
}
/* Skip Timer Button Styling */
.skip-timer-btn {
background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);
color: white;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
padding: 10px 20px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(255, 152, 0, 0.4);
}
.skip-timer-btn:hover {
background: linear-gradient(135deg, #fb8c00 0%, #e65100 100%);
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(255, 152, 0, 0.5);
}
.skip-timer-btn:active {
transform: translateY(0);
box-shadow: 0 2px 8px rgba(255, 152, 0, 0.3);
}
@keyframes actionPulse {
0%, 100% {
opacity: 1;

View File

@ -1181,14 +1181,14 @@ class WebcamManager {
],
degrading: [
{
name: "Pet Crawl",
instruction: "On all fours like an animal, tongue out panting like a dog",
description: "Dehumanizing animal position for complete degradation"
name: "Object Display",
instruction: "On your back with legs pulled up and spread, completely exposed like a piece of furniture",
description: "Reduced to nothing but an object for use and display"
},
{
name: "Toilet Position",
name: "Mouth Service Position",
instruction: "Squatting low with mouth open wide, ready to be used",
description: "Ultimate degradation pose as a human toilet"
description: "Ultimate degradation pose prepared to service"
},
{
name: "Fuck-Doll Display",
@ -1407,6 +1407,9 @@ class WebcamManager {
<button id="verification-force-close-btn" class="btn btn-danger" style="background: #dc3545; margin-left: 10px;">
🚨 Force Close
</button>
<button id="verification-skip-btn" class="skip-timer-btn" style="display: none; margin-left: 10px;">
Skip Timer (Testing)
</button>
</div>
${verificationData?.verificationText ? `<div class="verification-task-text">${verificationData.verificationText}</div>` : ''}
</div>
@ -1536,11 +1539,25 @@ class WebcamManager {
const timerElement = overlay.querySelector('#verification-timer');
const statusElement = overlay.querySelector('#verification-status');
const startBtn = overlay.querySelector('#verification-start-btn');
const skipBtn = overlay.querySelector('#verification-skip-btn');
// Hide start button and show timer
if (startBtn) startBtn.style.display = 'none';
if (timerElement) timerElement.style.display = 'block';
// Show skip button for testing
if (skipBtn) {
skipBtn.style.display = 'inline-block';
skipBtn.addEventListener('click', () => {
console.log('⏩ Skip button clicked - completing verification timer');
// Clear all timers
if (this.preparationTimer) clearInterval(this.preparationTimer);
if (this.verificationTimer) clearInterval(this.verificationTimer);
// Complete verification immediately
this.completeVerification(overlay);
});
}
// Start preparation phase directly (no initial photo yet)
this.startPreparationPhase(duration, overlay);
}
@ -2145,6 +2162,9 @@ class WebcamManager {
<div class="progress-bar" id="mirror-progress-bar"></div>
</div>
<div class="timer-text">Time remaining: <span id="mirror-time">${taskData?.duration || 60}</span>s</div>
<button id="skip-mirror-overlay-timer-btn" class="btn btn-warning skip-timer-btn" style="margin-top: 10px;">
Skip Timer (Testing)
</button>
</div>
<div class="mirror-controls">
<button id="mirror-complete-btn" class="btn btn-primary" disabled>
@ -2386,6 +2406,42 @@ class WebcamManager {
let timeLeft = duration;
const completeBtn = overlay.querySelector('#mirror-complete-btn');
const skipBtn = overlay.querySelector('#skip-mirror-overlay-timer-btn');
// Add skip button handler
if (skipBtn) {
skipBtn.addEventListener('click', () => {
console.log('⏩ Skip button clicked - completing timer');
timeLeft = 0; // This will trigger completion on next interval
});
// Style the skip button
skipBtn.style.cssText = `
background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%);
color: white;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
padding: 10px 20px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(255, 152, 0, 0.4);
margin-top: 10px;
`;
skipBtn.addEventListener('mouseenter', () => {
skipBtn.style.background = 'linear-gradient(135deg, #fb8c00 0%, #e65100 100%)';
skipBtn.style.transform = 'translateY(-2px)';
skipBtn.style.boxShadow = '0 6px 16px rgba(255, 152, 0, 0.5)';
});
skipBtn.addEventListener('mouseleave', () => {
skipBtn.style.background = 'linear-gradient(135deg, #ff9800 0%, #f57c00 100%)';
skipBtn.style.transform = 'translateY(0)';
skipBtn.style.boxShadow = '0 4px 12px rgba(255, 152, 0, 0.4)';
});
}
const timer = setInterval(() => {
timeLeft--;

View File

@ -410,12 +410,30 @@ async function setupLibraryVideoTab(retryCount = 0) {
function setupLibraryGalleryTab() {
console.log('Setting up gallery tab functionality...');
// Load captured photos from localStorage
const capturedPhotos = JSON.parse(localStorage.getItem('capturedPhotos') || '[]');
console.log(`📸 Found ${capturedPhotos.length} captured photos`);
// Load captured photos from file system (Electron only)
loadCapturedPhotosForGallery();
}
async function loadCapturedPhotosForGallery() {
let capturedPhotos = [];
let verificationPhotos = [];
// Load verification photos from localStorage
const verificationPhotos = JSON.parse(localStorage.getItem('verificationPhotos') || '[]');
// Try loading from file system first (Electron)
if (window.desktopFileManager && window.desktopFileManager.isElectron) {
console.log('📸 Loading captured photos from file system...');
const filePhotos = await window.desktopFileManager.loadCapturedPhotos();
if (filePhotos && filePhotos.length > 0) {
capturedPhotos = filePhotos;
console.log(`📸 Loaded ${capturedPhotos.length} photos from file system (photos/captured/)`);
} else {
console.log('📸 No captured photos found in file system');
}
} else {
console.log('📸 Desktop file manager not available - browser mode (no persistent photo storage)');
}
// Load verification photos from localStorage (these are always in localStorage)
verificationPhotos = JSON.parse(localStorage.getItem('verificationPhotos') || '[]');
console.log(`📷 Found ${verificationPhotos.length} verification photos`);
const allPhotosGrid = document.getElementById('lib-all-photos-grid');
@ -435,7 +453,7 @@ function setupLibraryGalleryTab() {
let photosHtml = '';
capturedPhotos.forEach((photo, index) => {
const timestamp = new Date(photo.timestamp || Date.now()).toLocaleDateString();
const imageData = photo.imageData || photo.dataURL; // Support both formats
const imageData = photo.url || photo.path || photo.imageData || photo.dataURL; // Support file URLs and data URLs
if (imageData) {
photosHtml += `
@ -448,10 +466,10 @@ function setupLibraryGalleryTab() {
<img src="${imageData}" alt="Captured Photo ${index + 1}"
onclick="showPhotoPreview('${imageData}', 'Photo ${index + 1}')">
<div class="photo-actions">
<button class="photo-download-btn" onclick="downloadSinglePhoto(${index})" title="Download Photo">
<button class="photo-download-btn" onclick="downloadSinglePhoto(${index}, '${photo.filename || ''}', '${photo.path || ''}')" title="Download Photo">
📥
</button>
<button class="photo-delete-btn" onclick="deletePhoto(${index})" title="Delete Photo">
<button class="photo-delete-btn" onclick="deletePhoto(${index}, '${photo.path || ''}')" title="Delete Photo">
🗑
</button>
</div>
@ -513,8 +531,12 @@ function setupLibraryGalleryTab() {
}
// Delete a photo from the gallery
function deletePhoto(index) {
const capturedPhotos = JSON.parse(localStorage.getItem('capturedPhotos') || '[]');
async function deletePhoto(index, filePath = '') {
// Load photos from file system if available
let capturedPhotos = [];
if (window.desktopFileManager && window.desktopFileManager.isElectron) {
capturedPhotos = await window.desktopFileManager.loadCapturedPhotos();
}
if (index < 0 || index >= capturedPhotos.length) {
console.error('Invalid photo index:', index);
@ -529,15 +551,21 @@ function deletePhoto(index) {
const confirmed = confirm(`Are you sure you want to delete this photo?\n\nType: ${photoType}\nDate: ${photoDate}\n\nThis action cannot be undone.`);
if (confirmed) {
// Remove photo from array
capturedPhotos.splice(index, 1);
// Update localStorage
localStorage.setItem('capturedPhotos', JSON.stringify(capturedPhotos));
// Show success message
if (window.game && window.game.flashMessageManager) {
window.game.flashMessageManager.show(`📸 Photo deleted successfully!`, 'info');
// Delete from file system if in Electron
if (window.desktopFileManager && window.desktopFileManager.isElectron) {
const deleteSuccess = await window.desktopFileManager.deletePhoto(photo.path || filePath);
if (deleteSuccess) {
console.log(`🗑️ Deleted photo from file system: ${photo.filename}`);
if (window.game && window.game.flashMessageManager) {
window.game.flashMessageManager.show(`📸 Photo deleted successfully!`, 'info');
}
} else {
console.error('Failed to delete photo from file system');
if (window.game && window.game.flashMessageManager) {
window.game.flashMessageManager.show(`❌ Failed to delete photo`, 'error');
}
return;
}
}
// Refresh the photo galleries
@ -581,8 +609,12 @@ function deselectAllPhotos() {
}
// Download single photo
function downloadSinglePhoto(index) {
const capturedPhotos = JSON.parse(localStorage.getItem('capturedPhotos') || '[]');
async function downloadSinglePhoto(index, photoFilename = '', filePath = '') {
// Load photos from file system if available
let capturedPhotos = [];
if (window.desktopFileManager && window.desktopFileManager.isElectron) {
capturedPhotos = await window.desktopFileManager.loadCapturedPhotos();
}
if (index < 0 || index >= capturedPhotos.length) {
console.error('Invalid photo index:', index);
@ -602,26 +634,29 @@ function downloadSinglePhoto(index) {
} else if (photo.imageData) {
// Fallback for other formats
imageData = photo.imageData;
} else if (photo.url || photo.path) {
// File system photos - use the file URL
imageData = photo.url || photo.path;
} else {
console.error('Photo missing image data:', photo);
return;
}
const timestamp = new Date(photo.timestamp || Date.now()).toISOString().slice(0, 19).replace(/:/g, '-');
const filename = `photo-${timestamp}.png`;
const downloadFilename = photoFilename || photo.filename || `photo-${timestamp}.png`;
// Create download link
const link = document.createElement('a');
link.href = imageData;
link.download = filename;
link.download = downloadFilename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
if (window.game && window.game.flashMessageManager) {
window.game.flashMessageManager.show(`📥 Photo downloaded: ${filename}`, 'info');
window.game.flashMessageManager.show(`📥 Photo downloaded: ${downloadFilename}`, 'info');
}
console.log(`📥 Downloaded photo: ${filename}`);
console.log(`📥 Downloaded photo: ${downloadFilename}`);
}
// Download single verification photo

View File

@ -1993,25 +1993,22 @@
console.log(`📸 Total photos loaded: ${totalPhotos} (${linkedPhotoDirectories.length} directories + ${linkedIndividualImages.length} individual images)`);
// Load previously captured photos from file system or localStorage
// Load previously captured photos from file system (Electron only)
try {
// Try loading from file system first (Electron)
if (window.desktopFileManager && window.desktopFileManager.isElectron) {
console.log('📸 Loading captured photos from file system...');
const filePhotos = await window.desktopFileManager.loadCapturedPhotos();
if (filePhotos.length > 0) {
if (filePhotos && filePhotos.length > 0) {
trainingPhotoLibrary.push(...filePhotos);
console.log(`📸 Loaded ${filePhotos.length} photos from file system`);
console.log(`📸 Loaded ${filePhotos.length} photos from file system (photos/captured/)`);
} else {
console.log('📸 No captured photos found in file system');
}
} else {
// Browser fallback - load from localStorage
const savedWebcamPhotos = JSON.parse(localStorage.getItem('trainingAcademyPhotos') || '[]');
if (savedWebcamPhotos.length > 0) {
trainingPhotoLibrary.push(...savedWebcamPhotos);
console.log(`📸 Loaded ${savedWebcamPhotos.length} previously captured photos from localStorage`);
}
console.log('📸 Desktop file manager not available - browser mode (no persistent photo storage)');
}
} catch (error) {
console.warn('⚠️ Failed to load saved photos:', error);
console.error('⚠️ Failed to load captured photos from file system:', error);
}
document.getElementById('photoLibraryStatus').innerHTML =
@ -3289,9 +3286,10 @@
// Load the first training task directly
if (trainingTasks.length > 0) {
console.log('<EFBFBD> Loading first training task directly...');
console.log('📋 Loading first training task directly...');
window.game.currentTaskIndex = 0;
window.game.currentTask = trainingTasks[0];
window.game.gameState.currentTask = trainingTasks[0]; // CRITICAL: Set gameState.currentTask for scenario progression
window.game.displayCurrentTask();
console.log('✅ Training task loaded successfully');
} else {
@ -3904,6 +3902,19 @@
return;
}
// Initialize scenarioState for progression tracking
if (!task.scenarioState) {
task.scenarioState = {
currentStep: 'start',
stepNumber: 1,
totalSteps: Object.keys(task.interactiveData.steps).length,
choices: [],
completed: false,
outcome: null
};
console.log('🎭 Initialized scenarioState:', task.scenarioState);
}
console.log('🎭 Starting scenario from step:', currentScenarioStep);
displayScenarioStep(container, currentScenarioStep);
}
@ -3939,12 +3950,16 @@
${step.story}
</div>
<div class="scenario-choices">
${step.choices.map((choice, index) => `
<div class="choice-option" onclick="selectScenarioChoice('${choice.nextStep}')">
<h4>${choice.text}</h4>
<p class="choice-preview">${choice.preview}</p>
</div>
`).join('')}
${step.choices.map((choice, index) => {
const safeText = choice.text.replace(/'/g, '&apos;');
const safePreview = choice.preview.replace(/'/g, '&apos;');
return `
<div class="choice-option" onclick="selectScenarioChoice('${choice.nextStep}')">
<h4>${safeText}</h4>
<p class="choice-preview">${safePreview}</p>
</div>
`;
}).join('')}
</div>
<div class="training-controls">
<button onclick="showQuitConfirmation()" class="next-btn">Quit Training</button>
@ -4032,6 +4047,7 @@
<div id="progress-fill" class="progress-fill"></div>
</div>
<p><strong>⚠️ You must complete the full timer to progress.</strong></p>
<button id="skip-action-timer-btn" class="skip-timer-btn" style="margin-top: 10px;">⏩ Skip Timer (Testing)</button>
</div>
<div class="training-controls">
<button id="complete-action-btn" onclick="completeScenarioAction('${step.nextStep}')" class="complete-btn" disabled>
@ -4132,6 +4148,13 @@
console.log('🎯 Selected scenario choice, moving to:', nextStep);
currentScenarioStep = nextStep;
// Update scenarioState if it exists
if (currentScenarioTask && currentScenarioTask.scenarioState) {
currentScenarioTask.scenarioState.currentStep = nextStep;
currentScenarioTask.scenarioState.stepNumber++;
console.log('🎯 Updated scenarioState to step:', nextStep);
}
// Find the appropriate container
const gameContainer = document.getElementById('game-container');
const fallbackContainer = document.getElementById('training-task-display');
@ -4194,6 +4217,13 @@
setTimeout(() => {
currentScenarioStep = nextStep;
// Update scenarioState if it exists
if (currentScenarioTask && currentScenarioTask.scenarioState) {
currentScenarioTask.scenarioState.currentStep = nextStep;
currentScenarioTask.scenarioState.stepNumber++;
console.log('⏭️ Updated scenarioState to step:', nextStep);
}
// Find the appropriate container and continue scenario
const gameContainer = document.getElementById('game-container');
const fallbackContainer = document.getElementById('training-task-display');
@ -4206,6 +4236,9 @@
window.trainingAcademyProcessing = false;
}, 100);
}
// Expose to window for interactiveTaskManager to call
window.proceedToNextStep = proceedToNextStep;
function startPositionVerification(nextStep, duration, instructions, verificationText) {
console.log('🔍 Starting position verification for', duration, 'seconds');
@ -4404,9 +4437,18 @@
const progressFill = document.getElementById('progress-fill');
const completeBtn = document.getElementById('complete-action-btn');
const btnTimer = document.getElementById('btn-timer');
const skipBtn = document.getElementById('skip-action-timer-btn');
console.log('⏱️ Starting action timer:', duration, 'seconds, forced:', forceComplete);
// Skip button handler
if (skipBtn) {
skipBtn.addEventListener('click', function() {
console.log('⏩ Skip button clicked - completing action timer');
timeLeft = 0;
});
}
const timer = setInterval(() => {
timeLeft--;