diff --git a/js/minigames/lockpicking/lockpicking-game-phaser.js b/js/minigames/lockpicking/lockpicking-game-phaser.js index d68b16b..1f4b665 100644 --- a/js/minigames/lockpicking/lockpicking-game-phaser.js +++ b/js/minigames/lockpicking/lockpicking-game-phaser.js @@ -261,7 +261,7 @@ export class LockpickingMinigamePhaser extends MinigameScene { this.tensionWrench.setInteractive(new Phaser.Geom.Rectangle(-12.5, -138.75, 60, 176.25), Phaser.Geom.Rectangle.Contains); // Add text - const wrenchText = this.scene.add.text(-10, 50, 'Tension Wrench', { + const wrenchText = this.scene.add.text(-10, 58, 'Tension Wrench', { fontSize: '14px', fill: '#00ff00', fontWeight: 'bold' @@ -471,7 +471,7 @@ export class LockpickingMinigamePhaser extends MinigameScene { this.hookGroup.add(hookPickGraphics); // Add hook pick label - const hookPickLabel = this.scene.add.text(-10, 80, 'Hook Pick', { + const hookPickLabel = this.scene.add.text(-10, 85, 'Hook Pick', { fontSize: '14px', fill: '#00ff00', fontWeight: 'bold' @@ -892,7 +892,7 @@ export class LockpickingMinigamePhaser extends MinigameScene { springLabel.setDepth(100); // Bring to front // Driver pin label - positioned below the shear line - const driverPinLabel = this.scene.add.text(pinX, pinY - 30, 'Driver Pin', { + const driverPinLabel = this.scene.add.text(pinX, pinY - 35, 'Driver Pin', { fontSize: '14px', fill: '#00ff00', fontWeight: 'bold' diff --git a/locksmith-forge.html b/locksmith-forge.html index 3e9e5bc..81f1b69 100644 --- a/locksmith-forge.html +++ b/locksmith-forge.html @@ -38,7 +38,7 @@ min-height: 100vh; } - .minigame-close-button, #minigame-cancel { + .minigame-close-button, #minigame-cancel, .minigame-header { display: none; } @@ -220,6 +220,22 @@ from { box-shadow: 0 0 5px #ffaa00; } to { box-shadow: 0 0 20px #ffaa00, 0 0 30px #ffaa00; } } + + .progress-achievement { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + font-size: 16px; + font-weight: bold; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 90%; + z-index: 10; + } @@ -270,14 +286,13 @@
- +
- -
Ready to start Level 1
- +
+
@@ -288,18 +303,54 @@ class ProgressiveLockpicking { constructor() { - this.currentLevel = 1; this.maxLevel = 50; - this.successCount = 0; - this.failureCount = 0; - this.currentGame = null; this.levelConfig = this.generateLevelConfig(); + // Load saved progress from localStorage + this.loadProgress(); + + this.currentGame = null; + this.initializeUI(); this.bindEvents(); this.updateDisplay(); } + loadProgress() { + try { + const savedProgress = localStorage.getItem('lockpickingProgress'); + if (savedProgress) { + const progress = JSON.parse(savedProgress); + this.currentLevel = Math.max(1, Math.min(this.maxLevel, progress.currentLevel || 1)); + this.successCount = progress.successCount || 0; + this.failureCount = progress.failureCount || 0; + } else { + this.currentLevel = 1; + this.successCount = 0; + this.failureCount = 0; + } + } catch (error) { + console.warn('Failed to load progress from localStorage:', error); + this.currentLevel = 1; + this.successCount = 0; + this.failureCount = 0; + } + } + + saveProgress() { + try { + const progress = { + currentLevel: this.currentLevel, + successCount: this.successCount, + failureCount: this.failureCount, + lastSaved: new Date().toISOString() + }; + localStorage.setItem('lockpickingProgress', JSON.stringify(progress)); + } catch (error) { + console.warn('Failed to save progress to localStorage:', error); + } + } + generateLevelConfig() { const config = {}; @@ -308,7 +359,7 @@ let pinCount = Math.min(3 + Math.floor((level - 1) / 5), 8); // 3-8 pins let difficulty = this.getDifficulty(level); let sensitivity = Math.max(1, Math.min(10, 5 + Math.floor((level - 1) / 3))); // 1-10 - let liftSpeed = Math.max(0.5, Math.min(3.0, 1.0 + (level - 1) * 0.1)); // 0.5-3.0 + let liftSpeed = Math.max(0.5, Math.min(3.0, 0.8 + (level - 1) * 0.04)); // 0.5-3.0 (starts slower, progresses slower) // Add some randomness and complexity if (level > 10) { @@ -321,7 +372,7 @@ if (level > 20) { // Increase difficulty more aggressively - liftSpeed = Math.min(3.0, liftSpeed + 0.2); + liftSpeed = Math.min(3.0, liftSpeed + 0.1); } if (level > 30) { @@ -379,9 +430,7 @@ this.resetLevel(); }); - document.getElementById('skipButton').addEventListener('click', () => { - this.skipLevel(); - }); + } updateRangeValue(id) { @@ -458,15 +507,62 @@ handleChallengeComplete(success) { if (success) { this.successCount++; - this.updateStatus(`Level ${this.currentLevel} completed successfully!`); - this.showAchievement(`Level ${this.currentLevel} Complete!`); + this.saveProgress(); + + // Check if this was the final level + if (this.currentLevel === this.maxLevel) { + this.updateStatus(`🎊 INCREDIBLE! You've completed ALL ${this.maxLevel} levels! You are a TRUE MASTER LOCKPICKER! 🎊`); + this.showAchievement(`👑 LEGENDARY LOCKPICKER - ALL LEVELS COMPLETE! 👑`); + } else { + // Check for milestone levels + const milestoneMessages = { + 1: { + status: `🎯 Great start! Level 1 complete! You're on your way to becoming a lockpicking master! 🎯`, + achievement: `🌟 First Steps - Level 1 Complete! 🌟` + }, + 10: { + status: `🔥 Excellent progress! Level 10 conquered! You're getting the hang of this! 🔥`, + achievement: `⚡ Rising Star - Level 10 Complete! ⚡` + }, + 20: { + status: `💪 Impressive! Level 20 mastered! Your skills are really developing! 💪`, + achievement: `🏅 Skillful Picker - Level 20 Complete! 🏅` + }, + 30: { + status: `🚀 Outstanding! Level 30 achieved! You're becoming a true expert! 🚀`, + achievement: `🎖️ Expert Level - Level 30 Complete! 🎖️` + }, + 40: { + status: `⚔️ Phenomenal! Level 40 conquered! You're almost at the ultimate challenge! ⚔️`, + achievement: `🏆 Elite Picker - Level 40 Complete! 🏆` + } + }; + + const milestone = milestoneMessages[this.currentLevel]; + if (milestone) { + this.updateStatus(milestone.status); + this.showAchievement(milestone.achievement); + } else { + this.updateStatus(`Level ${this.currentLevel} completed successfully!`); + this.showAchievement(`Level ${this.currentLevel} Complete!`); + } + } // Progress to next level after a delay setTimeout(() => { - this.currentLevel = Math.min(this.currentLevel + 1, this.maxLevel); + const nextLevel = Math.min(this.currentLevel + 1, this.maxLevel); + this.currentLevel = nextLevel; + this.saveProgress(); this.updateDisplay(); this.updateControlsFromLevel(); - this.updateStatus(`Starting Level ${this.currentLevel}...`); + + // Check if player has reached the final level + if (this.currentLevel === this.maxLevel) { + this.updateStatus(`🎉 CONGRATULATIONS! You've reached the ultimate challenge - Level ${this.currentLevel}! 🎉`); + this.showAchievement(`🏆 MASTER LOCKPICKER - Level ${this.currentLevel} Unlocked! 🏆`); + } else { + this.updateStatus(`Starting Level ${this.currentLevel}...`); + } // Auto-start the next level setTimeout(() => { @@ -475,6 +571,7 @@ }, 2000); } else { this.failureCount++; + this.saveProgress(); this.updateStatus(`Level ${this.currentLevel} failed. Retrying...`); // Auto-retry after a delay @@ -490,6 +587,7 @@ this.currentLevel = 1; this.successCount = 0; this.failureCount = 0; + this.saveProgress(); this.updateDisplay(); this.updateControlsFromLevel(); this.updateStatus(`Progress reset. Ready for Level ${this.currentLevel}`); @@ -501,13 +599,7 @@ }, 500); } - skipLevel() { - this.currentLevel = Math.min(this.currentLevel + 1, this.maxLevel); - this.updateDisplay(); - this.updateControlsFromLevel(); - this.updateStatus(`Skipped to Level ${this.currentLevel}`); - this.updateProgress(); - } + updateDisplay() { document.getElementById('currentLevel').textContent = this.currentLevel; @@ -519,10 +611,16 @@ document.getElementById('sensitivity').textContent = config.sensitivity; document.getElementById('liftSpeed').textContent = config.liftSpeed; } + + // Update progress bar to reflect current level + this.updateProgress(); } updateStatus(message) { - document.getElementById('status').textContent = message; + const feedbackElement = document.querySelector('.lockpick-feedback'); + if (feedbackElement) { + feedbackElement.textContent = message; + } } updateProgress() { @@ -538,7 +636,18 @@ achievements.appendChild(achievement); - // Remove after 5 seconds + // Display achievement message in progress bar + const progressAchievement = document.getElementById('progressAchievement'); + if (progressAchievement) { + progressAchievement.textContent = message; + + // Clear the progress bar message after 5 seconds + setTimeout(() => { + progressAchievement.textContent = ''; + }, 5000); + } + + // Remove achievement popup after 5 seconds setTimeout(() => { if (achievement.parentNode) { achievement.parentNode.removeChild(achievement); @@ -550,7 +659,7 @@ // Initialize the progressive lockpicking system document.addEventListener('DOMContentLoaded', () => { const progressiveSystem = new ProgressiveLockpicking(); - // Auto-start the first level + // Auto-start the current level (could be loaded from saved progress) setTimeout(() => { progressiveSystem.startChallenge(); }, 500);