FIX: Quick Play XP calculation and implement exponential level scaling

FIXED: Quick Play XP calculation bug
- Disabled legacy completeTask() function in quick-play.html that awarded 10-30 XP
- Prevented main game from setting up button handlers when in Quick Play mode
- Quick Play now correctly awards 1-3 XP based on completion time + session bonuses
- Eliminated double/triple XP awards from multiple competing systems

IMPLEMENTED: Exponential XP level scaling
- Updated from linear progression (100 XP per level) to exponential scaling
- Level 2 now requires only 10 XP (was 100 XP) for accessible early progression
- Uses formula: XP = Math.floor(10 * Math.pow(1.5, level - 2)) for levels 2+
- Level scaling: L3=25, L5=82, L10=751, L15=5844, L20=44520 XP
- Each level requires ~50% more XP than previous, making high levels prestigious

CLEANUP: Remove outdated index_temp.html
- Deleted index_temp.html containing obsolete AI task system and old theme code
- File contained outdated character image paths and removed functionality
- Not referenced anywhere in project, was just development cruft

RESULT: Balanced progression system with accessible early levels and challenging endgame
This commit is contained in:
dilgenfritz 2025-11-08 18:56:50 -06:00
parent 4611f03d72
commit 0615672872
4 changed files with 38 additions and 6298 deletions

View File

@ -2588,27 +2588,29 @@
}
// ===== LEVEL CALCULATION SYSTEM =====
// Exponential XP scaling: starts at 10 XP for level 2, then grows exponentially
// Formula: XP = Math.floor(10 * Math.pow(1.5, level - 2)) for levels 2+
const levelData = [
{ level: 1, name: "Virgin", xpRequired: 0 },
{ level: 2, name: "Curious", xpRequired: 100 },
{ level: 3, name: "Eager", xpRequired: 200 },
{ level: 4, name: "Aroused", xpRequired: 300 },
{ level: 5, name: "Lustful", xpRequired: 400 },
{ level: 6, name: "Passionate", xpRequired: 500 },
{ level: 7, name: "Addicted", xpRequired: 600 },
{ level: 8, name: "Obsessed", xpRequired: 700 },
{ level: 9, name: "Deviant", xpRequired: 800 },
{ level: 10, name: "Kinky", xpRequired: 900 },
{ level: 11, name: "Perverted", xpRequired: 1000 },
{ level: 12, name: "Depraved", xpRequired: 1100 },
{ level: 13, name: "Dominant", xpRequired: 1200 },
{ level: 14, name: "Submissive", xpRequired: 1300 },
{ level: 15, name: "Hedonist", xpRequired: 1400 },
{ level: 16, name: "Insatiable", xpRequired: 1500 },
{ level: 17, name: "Transcendent", xpRequired: 1600 },
{ level: 18, name: "Enlightened", xpRequired: 1700 },
{ level: 19, name: "Godlike", xpRequired: 1800 },
{ level: 20, name: "Omnipotent", xpRequired: 1900 }
{ level: 2, name: "Curious", xpRequired: 10 }, // 10 XP
{ level: 3, name: "Eager", xpRequired: 25 }, // 15 more (25 total)
{ level: 4, name: "Aroused", xpRequired: 48 }, // 23 more (48 total)
{ level: 5, name: "Lustful", xpRequired: 82 }, // 34 more (82 total)
{ level: 6, name: "Passionate", xpRequired: 133 }, // 51 more (133 total)
{ level: 7, name: "Addicted", xpRequired: 209 }, // 76 more (209 total)
{ level: 8, name: "Obsessed", xpRequired: 323 }, // 114 more (323 total)
{ level: 9, name: "Deviant", xpRequired: 494 }, // 171 more (494 total)
{ level: 10, name: "Kinky", xpRequired: 751 }, // 257 more (751 total)
{ level: 11, name: "Perverted", xpRequired: 1137 }, // 386 more (1137 total)
{ level: 12, name: "Depraved", xpRequired: 1716 }, // 579 more (1716 total)
{ level: 13, name: "Dominant", xpRequired: 2585 }, // 869 more (2585 total)
{ level: 14, name: "Submissive", xpRequired: 3889 }, // 1304 more (3889 total)
{ level: 15, name: "Hedonist", xpRequired: 5844 }, // 1955 more (5844 total)
{ level: 16, name: "Insatiable", xpRequired: 8777 }, // 2933 more (8777 total)
{ level: 17, name: "Transcendent", xpRequired: 13176 }, // 4399 more (13176 total)
{ level: 18, name: "Enlightened", xpRequired: 19775 }, // 6599 more (19775 total)
{ level: 19, name: "Godlike", xpRequired: 29673 }, // 9898 more (29673 total)
{ level: 20, name: "Omnipotent", xpRequired: 44520 } // 14847 more (44520 total)
];
function calculateLevel(totalXP) {

File diff suppressed because it is too large Load Diff

View File

@ -1286,7 +1286,9 @@
endGame();
}
if (e.target && e.target.id === 'complete-task') {
console.log('Complete task button clicked via global handler');
console.log('Complete task button clicked via global handler - Quick Play handles this with specific listeners');
// Don't call anything here - Quick Play uses its own specific event listeners
return;
}
if (e.target && e.target.id === 'skip-task') {
console.log('Skip task button clicked via global handler');
@ -3488,15 +3490,10 @@
}
function completeTask(task) {
if (gameInstance && gameInstance.gameState) {
gameInstance.gameState.tasksCompleted++;
gameInstance.gameState.xp += (task.difficulty === 'Hard' ? 30 : task.difficulty === 'Medium' ? 20 : 10);
updateGameStatus({
tasksCompleted: gameInstance.gameState.tasksCompleted,
xp: gameInstance.gameState.xp
});
}
loadNextTask();
// Legacy function - disabled in Quick Play to prevent double XP
// Quick Play uses quickPlayCompleteTask() instead
console.warn('Legacy completeTask() called - this should not happen in Quick Play mode');
return;
}
function skipTask(task) {

View File

@ -1759,11 +1759,16 @@ class TaskChallengeGame {
this.initializeGameModeListeners();
// Game actions - support both main game and Quick Play button IDs
safeAddListener('complete-btn', 'click', () => this.completeTask());
safeAddListener('complete-task', 'click', () => this.completeTask());
safeAddListener('skip-btn', 'click', () => this.skipTask());
safeAddListener('skip-task', 'click', () => this.skipTask());
safeAddListener('mercy-skip-btn', 'click', () => this.mercySkip());
// Skip setting up handlers if in Quick Play mode (Quick Play handles its own)
if (!this.gameState.isQuickPlay) {
safeAddListener('complete-btn', 'click', () => this.completeTask());
safeAddListener('complete-task', 'click', () => this.completeTask());
safeAddListener('skip-btn', 'click', () => this.skipTask());
safeAddListener('skip-task', 'click', () => this.skipTask());
safeAddListener('mercy-skip-btn', 'click', () => this.mercySkip());
} else {
console.log('🎮 Quick Play mode detected - skipping main game button handlers');
}
safeAddListener('pause-btn', 'click', () => this.pauseGame());
// Theme selector