From 1cec7fca8fe2aa5db072d57e526c498f8237f289 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Wed, 19 Feb 2025 00:05:22 +0000 Subject: [PATCH 01/46] Added fingerprint kit item --- assets/objects/fingerprint_kit.png | Bin 0 -> 5698 bytes assets/rooms/room_office.json | 18 ++++++++++++++++-- assets/scenarios/ceo_exfil.json | 6 ++++++ index.html | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 assets/objects/fingerprint_kit.png diff --git a/assets/objects/fingerprint_kit.png b/assets/objects/fingerprint_kit.png new file mode 100644 index 0000000000000000000000000000000000000000..db802b0011aa1e5879449ac69057e4144289cbc2 GIT binary patch literal 5698 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 JEpuMC<-Z-#(_{bu literal 0 HcmV?d00001 diff --git a/assets/rooms/room_office.json b/assets/rooms/room_office.json index bad8649..827f1dd 100644 --- a/assets/rooms/room_office.json +++ b/assets/rooms/room_office.json @@ -316,7 +316,21 @@ "width":48, "x":100.927703875072, "y":101.732793522267 - }], + }, + { + "height":48, + "id":15, + "name":"fingerprint_kit", + "rotation":0, + "type":"", + "visible":true, + "width":48, + "x":390, + "y":144 + } + + + ], "opacity":1, "type":"objectgroup", "visible":true, @@ -324,7 +338,7 @@ "y":0 }], "nextlayerid":12, - "nextobjectid":15, + "nextobjectid":16, "orientation":"orthogonal", "renderorder":"right-down", "tiledversion":"1.11.0", diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index 701d051..eab90b8 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -71,6 +71,12 @@ "readable": true, "text": "URGENT: Multiple unauthorized access attempts detected from CEO's office IP address", "observations": "A concerning IT department memo" + }, + { + "type": "fingerprint_kit", + "name": "Fingerprint Kit", + "takeable": true, + "observations": "A kit used for collecting fingerprints from surfaces" } ] }, diff --git a/index.html b/index.html index 290608d..18bef05 100644 --- a/index.html +++ b/index.html @@ -228,6 +228,7 @@ this.load.image('workstation', 'assets/objects/workstation.png'); this.load.image('bluetooth_scanner', 'assets/objects/bluetooth_scanner.png'); this.load.image('tablet', 'assets/objects/tablet.png'); + this.load.image('fingerprint_kit', 'assets/objects/fingerprint_kit.png'); this.load.json('gameScenarioJSON', 'assets/scenarios/ceo_exfil.json'); From 79e518efe32e2b4209e2fdb11d982c99646ed663 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Wed, 19 Feb 2025 00:31:36 +0000 Subject: [PATCH 02/46] Added clickable blackboard in the form of an object. Need to add logic (maybe change method for blackboard) --- assets/rooms/room_office.json | 14 +++++++++++++- assets/scenarios/ceo_exfil.json | 9 +++++++++ index.html | 6 ++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/assets/rooms/room_office.json b/assets/rooms/room_office.json index 827f1dd..d4b15c1 100644 --- a/assets/rooms/room_office.json +++ b/assets/rooms/room_office.json @@ -317,6 +317,18 @@ "x":100.927703875072, "y":101.732793522267 }, + { + "gid":417, + "height":48, + "id":16, + "name":"blackboard", + "rotation":0, + "type":"", + "visible":true, + "width":48, + "x":329, + "y":90 + }, { "height":48, "id":15, @@ -325,7 +337,7 @@ "type":"", "visible":true, "width":48, - "x":390, + "x":432, "y":144 } diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index eab90b8..213f3c1 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -72,6 +72,15 @@ "text": "URGENT: Multiple unauthorized access attempts detected from CEO's office IP address", "observations": "A concerning IT department memo" }, + { + "type": "blackboard", + "name": "Office Blackboard", + "takeable": false, + "hasFingerprint": true, + "fingerprintOwner": "ceo", + "fingerprintQuality": 0.8, + "observations": "A blackboard with some recent writing. The CEO was seen using it earlier." + }, { "type": "fingerprint_kit", "name": "Fingerprint Kit", diff --git a/index.html b/index.html index 18bef05..5ad4dbf 100644 --- a/index.html +++ b/index.html @@ -1483,6 +1483,12 @@ } } + // Add blackboard interaction + if (data.scenarioData?.type === "blackboard") { + alert("A blackboard with some recent writing. There might be fingerprints on the surface."); + return; + } + alert(message); } From 491bc140227d27d989003075da348a8812bf410c Mon Sep 17 00:00:00 2001 From: Damian-I Date: Mon, 24 Feb 2025 23:13:12 +0000 Subject: [PATCH 03/46] Removed blackboard, changed the computer in office1 to be used for fingerprints. Also added a hint in the description of the computer that it has a fingerprint --- assets/rooms/room_office.json | 14 +------------- assets/scenarios/ceo_exfil.json | 14 ++++---------- index.html | 6 ------ 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/assets/rooms/room_office.json b/assets/rooms/room_office.json index d4b15c1..827f1dd 100644 --- a/assets/rooms/room_office.json +++ b/assets/rooms/room_office.json @@ -317,18 +317,6 @@ "x":100.927703875072, "y":101.732793522267 }, - { - "gid":417, - "height":48, - "id":16, - "name":"blackboard", - "rotation":0, - "type":"", - "visible":true, - "width":48, - "x":329, - "y":90 - }, { "height":48, "id":15, @@ -337,7 +325,7 @@ "type":"", "visible":true, "width":48, - "x":432, + "x":390, "y":144 } diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index 213f3c1..bbffaef 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -62,7 +62,10 @@ "name": "Office Computer", "takeable": false, "requires": "password", - "observations": "A computer with a cybersecurity alert on screen" + "hasFingerprint": true, + "fingerprintOwner": "ceo", + "fingerprintQuality": 0.9, + "observations": "A computer with a cybersecurity alert on screen. There might be fingerprints on the keyboard." }, { "type": "notes", @@ -72,15 +75,6 @@ "text": "URGENT: Multiple unauthorized access attempts detected from CEO's office IP address", "observations": "A concerning IT department memo" }, - { - "type": "blackboard", - "name": "Office Blackboard", - "takeable": false, - "hasFingerprint": true, - "fingerprintOwner": "ceo", - "fingerprintQuality": 0.8, - "observations": "A blackboard with some recent writing. The CEO was seen using it earlier." - }, { "type": "fingerprint_kit", "name": "Fingerprint Kit", diff --git a/index.html b/index.html index 5ad4dbf..18bef05 100644 --- a/index.html +++ b/index.html @@ -1483,12 +1483,6 @@ } } - // Add blackboard interaction - if (data.scenarioData?.type === "blackboard") { - alert("A blackboard with some recent writing. There might be fingerprints on the surface."); - return; - } - alert(message); } From 6f560af427525f8a5a794b9bb0e04bdf9613840b Mon Sep 17 00:00:00 2001 From: Damian-I Date: Mon, 24 Feb 2025 23:40:18 +0000 Subject: [PATCH 04/46] Add fingerprint collection mechanics to game interaction system - Implement fingerprint collection logic for interactive objects - Add `collectFingerprint()` function to handle fingerprint sample generation --- index.html | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/index.html b/index.html index 18bef05..cf27574 100644 --- a/index.html +++ b/index.html @@ -1419,6 +1419,22 @@ const data = sprite.scenarioData; + // Check for fingerprint collection possibility + if (data.hasFingerprint) { + // Check if player has fingerprint kit + const hasKit = inventory.items.some(item => + item && item.scenarioData && + item.scenarioData.type === 'fingerprint_kit' + ); + + if (hasKit) { + const sample = collectFingerprint(sprite); + if (sample) { + return; // Exit after collecting fingerprint + } + } + } + // Check if this is an unlocked container that hasn't been collected yet if (data.isUnlockedButNotCollected && data.contents) { let message = `You found the following items:\n`; @@ -2144,6 +2160,36 @@ }); } + function collectFingerprint(item) { + if (!item.scenarioData?.hasFingerprint) { + alert("No fingerprints found on this surface."); + return null; + } + + const sample = { + id: `${item.scenarioData.fingerprintOwner}_${Date.now()}`, + type: "fingerprint", + owner: item.scenarioData.fingerprintOwner, + quality: item.scenarioData.fingerprintQuality, + data: generateFingerprintData(item) + }; + + gameState.biometricSamples.push(sample); + alert(`Successfully collected a fingerprint sample from ${item.scenarioData.name}`); + console.log("Collected fingerprint sample:", sample); + return sample; + } + + function generateFingerprintData(item) { + // Placeholder implementation + // Replace with actual fingerprint data generation logic + return "fingerprint_data"; + } + + function hasItemInInventory(itemType) { + return gameState.inventory.items.some(item => item.scenarioData?.type === itemType); + } + \ No newline at end of file From 5869b4addefae14e028cb6760402ddef47aaa580 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Mon, 24 Feb 2025 23:47:07 +0000 Subject: [PATCH 05/46] Fixed bug by initializing game state object with biometric samples and inventory tracking - Create `gameState` object to centralize game state management - Include biometric samples and inventory as initial state properties --- index.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/index.html b/index.html index cf27574..dce4ddb 100644 --- a/index.html +++ b/index.html @@ -195,6 +195,11 @@ let lastBluetoothScan = 0; // Track last scan time const BLUETOOTH_SCAN_INTERVAL = 500; // Scan every 500ms + const gameState = { + biometricSamples: [], + inventory: inventory + }; + // preloads the assets function preload() { // Show loading text From ffb841e1291feb441aefdc2fea2a3b9a01e97b56 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 00:04:26 +0000 Subject: [PATCH 06/46] Fingerprint scanner mechanics with lockout and validation - Add visual feedback for biometric scan success and failure - Create advanced collection mechanism with quality tracking and animation - Introduce scanner state management with failed attempt tracking --- index.html | 201 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 181 insertions(+), 20 deletions(-) diff --git a/index.html b/index.html index dce4ddb..d75685f 100644 --- a/index.html +++ b/index.html @@ -200,6 +200,20 @@ inventory: inventory }; + // Add these constants near the top with other constants + const SCANNER_LOCKOUT_TIME = 30000; // 30 seconds lockout + const MAX_FAILED_ATTEMPTS = 3; + + // Add this to track failed attempts + const scannerState = { + failedAttempts: {}, // tracks failures by scanner ID + lockoutTimers: {} // tracks lockout end times + }; + + // Add these constants near the top with other constants + const SAMPLE_COLLECTION_TIME = 2000; // 2 seconds for collection animation + const SAMPLE_COLLECTION_COLOR = 0x00ff00; // Green for collection effect + // preloads the assets function preload() { // Show loading text @@ -1424,6 +1438,12 @@ const data = sprite.scenarioData; + // Add inside handleObjectInteraction before the fingerprint check + if (data.biometricType === 'fingerprint') { + handleBiometricScan(sprite, player); + return; + } + // Check for fingerprint collection possibility if (data.hasFingerprint) { // Check if player has fingerprint kit @@ -2165,36 +2185,177 @@ }); } + // Add helper function to generate fingerprint data + function generateFingerprintData(item) { + // In a real implementation, this would generate unique fingerprint patterns + // For now, we'll just create a unique identifier + return `fp_${item.scenarioData.fingerprintOwner}_${Date.now()}`; + } + + // Add helper function to check if player has required collection tools + function hasItemInInventory(itemType) { + return inventory.items.some(item => + item && item.scenarioData && + item.scenarioData.type === itemType + ); + } + + // Add this function after the other utility functions + function handleBiometricScan(scanner, player) { + const scannerId = scanner.scenarioData.id || scanner.name; + + // Check if scanner is locked out + if (scannerState.lockoutTimers[scannerId] && + Date.now() < scannerState.lockoutTimers[scannerId]) { + const remainingTime = Math.ceil((scannerState.lockoutTimers[scannerId] - Date.now()) / 1000); + alert(`Scanner locked out. Try again in ${remainingTime} seconds.`); + return false; + } + + if (!scanner.scenarioData?.biometricType === 'fingerprint') { + console.warn('Invalid scanner type'); + return false; + } + + // Check if player has valid fingerprint sample + const validSample = gameState.biometricSamples.find(sample => + sample.type === 'fingerprint' && + scanner.scenarioData.acceptedSamples.includes(sample.owner) + ); + + if (!validSample) { + handleScannerFailure(scannerId); + alert("No valid fingerprint sample found."); + return false; + } + + // Check sample quality + const qualityThreshold = 0.7; + if (validSample.quality < qualityThreshold) { + handleScannerFailure(scannerId); + alert("Fingerprint sample quality too poor for scanning."); + return false; + } + + // Success case - reset failed attempts + scannerState.failedAttempts[scannerId] = 0; + alert("Biometric scan successful!"); + + // Add visual feedback + const successEffect = scanner.scene.add.circle( + scanner.x, + scanner.y, + 32, + 0x00ff00, + 0.5 + ); + scanner.scene.tweens.add({ + targets: successEffect, + alpha: 0, + scale: 2, + duration: 1000, + onComplete: () => successEffect.destroy() + }); + + // If the scanner is protecting something, unlock it + if (scanner.scenarioData.unlocks) { + const targetObject = rooms[currentRoom].objects[scanner.scenarioData.unlocks]; + if (targetObject) { + targetObject.scenarioData.locked = false; + targetObject.scenarioData.isUnlockedButNotCollected = true; + } + } + + return true; + } + + // Add this new function to handle scanner failures + function handleScannerFailure(scannerId) { + // Initialize failed attempts if not exists + if (!scannerState.failedAttempts[scannerId]) { + scannerState.failedAttempts[scannerId] = 0; + } + + // Increment failed attempts + scannerState.failedAttempts[scannerId]++; + + // Check if we should lockout + if (scannerState.failedAttempts[scannerId] >= MAX_FAILED_ATTEMPTS) { + scannerState.lockoutTimers[scannerId] = Date.now() + SCANNER_LOCKOUT_TIME; + alert(`Too many failed attempts. Scanner locked for ${SCANNER_LOCKOUT_TIME/1000} seconds.`); + } else { + const remainingAttempts = MAX_FAILED_ATTEMPTS - scannerState.failedAttempts[scannerId]; + alert(`Scan failed. ${remainingAttempts} attempts remaining before lockout.`); + } + } + + // Modify collectFingerprint to include visual feedback function collectFingerprint(item) { if (!item.scenarioData?.hasFingerprint) { alert("No fingerprints found on this surface."); return null; } - const sample = { - id: `${item.scenarioData.fingerprintOwner}_${Date.now()}`, - type: "fingerprint", - owner: item.scenarioData.fingerprintOwner, - quality: item.scenarioData.fingerprintQuality, - data: generateFingerprintData(item) - }; + // Create collection effect + const scene = item.scene; + const collectionEffect = scene.add.circle( + item.x, + item.y, + 40, + SAMPLE_COLLECTION_COLOR, + 0.3 + ); - gameState.biometricSamples.push(sample); - alert(`Successfully collected a fingerprint sample from ${item.scenarioData.name}`); - console.log("Collected fingerprint sample:", sample); - return sample; - } + // Add scanning animation + scene.tweens.add({ + targets: collectionEffect, + scale: { from: 1, to: 1.5 }, + alpha: { from: 0.3, to: 0 }, + duration: SAMPLE_COLLECTION_TIME, + repeat: 0, + yoyo: false, + onComplete: () => { + collectionEffect.destroy(); + + // Create the sample after animation + const sample = { + id: `${item.scenarioData.fingerprintOwner}_${Date.now()}`, + type: "fingerprint", + owner: item.scenarioData.fingerprintOwner, + quality: item.scenarioData.fingerprintQuality, + data: generateFingerprintData(item) + }; + + if (!gameState.biometricSamples) { + gameState.biometricSamples = []; + } + + gameState.biometricSamples.push(sample); + + // Show collection success message with sample details + const qualityPercentage = Math.round(sample.quality * 100); + alert(`Successfully collected a fingerprint sample from ${item.scenarioData.name}\nSample Quality: ${qualityPercentage}%`); + console.log("Collected fingerprint sample:", sample); + } + }); - function generateFingerprintData(item) { - // Placeholder implementation - // Replace with actual fingerprint data generation logic - return "fingerprint_data"; - } + // Add scanning particles + const particles = scene.add.particles(item.x, item.y, 'particle', { + speed: 100, + scale: { start: 0.2, end: 0 }, + blendMode: 'ADD', + lifespan: 1000, + quantity: 1, + frequency: 50 + }); + + // Clean up particles after collection + scene.time.delayedCall(SAMPLE_COLLECTION_TIME, () => { + particles.destroy(); + }); - function hasItemInInventory(itemType) { - return gameState.inventory.items.some(item => item.scenarioData?.type === itemType); + return true; } - \ No newline at end of file From 4ab5aa90059b6d88770a1e20bc5b22ccc93a2124 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 00:11:35 +0000 Subject: [PATCH 07/46] Add biometric samples UI with interaction and visualization - Create comprehensive UI for displaying collected biometric samples - Implement keyboard controls (B key) to show/hide samples interface - Add visual quality indicators and detailed sample information - Enhance object interaction with scanner highlighting and pulsing effects - Integrate new UI with existing game state management --- index.html | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 283 insertions(+) diff --git a/index.html b/index.html index d75685f..3d783a9 100644 --- a/index.html +++ b/index.html @@ -214,6 +214,25 @@ const SAMPLE_COLLECTION_TIME = 2000; // 2 seconds for collection animation const SAMPLE_COLLECTION_COLOR = 0x00ff00; // Green for collection effect + // Add these constants for the UI + const SAMPLE_UI_STYLES = { + backgroundColor: 'rgba(0, 0, 0, 0.8)', + padding: '10px', + color: 'white', + fontFamily: 'Arial, sans-serif', + fontSize: '14px', + border: '1px solid #444', + borderRadius: '5px', + position: 'fixed', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + zIndex: 1000, + maxHeight: '80vh', + overflowY: 'auto', + display: 'none' + }; + // preloads the assets function preload() { // Show loading text @@ -473,6 +492,9 @@ // Optimize physics settings this.physics.world.setFPS(60); this.physics.world.step(1/60); + + // Add this to your scene's create function + initializeSamplesUI(); } function update() { @@ -2356,6 +2378,267 @@ return true; } + + // Add this function to check for object interactions + function checkObjectInteractions() { + // Skip if not enough time has passed since last check + const currentTime = performance.now(); + if (this.lastInteractionCheck && + currentTime - this.lastInteractionCheck < INTERACTION_CHECK_INTERVAL) { + return; + } + this.lastInteractionCheck = currentTime; + + const playerRoom = currentPlayerRoom; + if (!playerRoom || !rooms[playerRoom].objects) return; + + // Cache player position + const px = player.x; + const py = player.y; + + // Get only objects within viewport bounds plus some margin + const camera = this.cameras.main; + const margin = INTERACTION_RANGE; + const viewBounds = { + left: camera.scrollX - margin, + right: camera.scrollX + camera.width + margin, + top: camera.scrollY - margin, + bottom: camera.scrollY + camera.height + margin + }; + + Object.values(rooms[playerRoom].objects).forEach(obj => { + // Skip inactive objects and those outside viewport + if (!obj.active || + obj.x < viewBounds.left || + obj.x > viewBounds.right || + obj.y < viewBounds.top || + obj.y > viewBounds.bottom) { + return; + } + + // Use squared distance for performance + const dx = px - obj.x; + const dy = py - obj.y; + const distanceSq = dx * dx + dy * dy; + + if (distanceSq <= INTERACTION_RANGE_SQ) { + if (!obj.isHighlighted) { + obj.isHighlighted = true; + obj.setTint(0xdddddd); // Simple highlight without tween + } + } else if (obj.isHighlighted) { + obj.isHighlighted = false; + obj.clearTint(); + } + }); + } + + // Add this function to setup scanner interactions + function setupScannerInteractions() { + Object.values(rooms).forEach(room => { + if (!room.objects) return; + + Object.values(room.objects).forEach(obj => { + if (obj.scenarioData?.biometricType === 'fingerprint') { + // Add visual indicator for scanner + const indicator = obj.scene.add.circle( + obj.x, + obj.y, + 20, + 0x0000ff, + 0.3 + ); + + // Add pulsing effect + obj.scene.tweens.add({ + targets: indicator, + alpha: { from: 0.3, to: 0.1 }, + scale: { from: 1, to: 1.2 }, + duration: 1000, + yoyo: true, + repeat: -1 + }); + + // Store reference to indicator + obj.scannerIndicator = indicator; + + // Add hover effect + obj.on('pointerover', function() { + if (this.scannerIndicator) { + this.scannerIndicator.setAlpha(0.5); + } + }); + + obj.on('pointerout', function() { + if (this.scannerIndicator) { + this.scannerIndicator.setAlpha(0.3); + } + }); + } + }); + }); + } + + // Add this to your scene initialization + function initializeBiometricSystem() { + // Initialize gameState if not exists + if (!window.gameState) { + window.gameState = { + biometricSamples: [] + }; + } + + // Initialize scanner state + if (!window.scannerState) { + window.scannerState = { + failedAttempts: {}, + lockoutTimers: {} + }; + } + + // Setup scanner visuals and interactions + setupScannerInteractions(); + + // Add periodic interaction checks + this.time.addEvent({ + delay: 100, // Check every 100ms + callback: checkObjectInteractions, + callbackScope: this, + loop: true + }); + } + + // Add function to create and manage the samples UI + function createSamplesUI() { + // Create container for samples UI if it doesn't exist + let samplesUI = document.getElementById('biometric-samples-ui'); + if (!samplesUI) { + samplesUI = document.createElement('div'); + samplesUI.id = 'biometric-samples-ui'; + + // Apply styles + Object.assign(samplesUI.style, SAMPLE_UI_STYLES); + + // Add close button + const closeButton = document.createElement('button'); + closeButton.textContent = '×'; + closeButton.style.cssText = ` + position: absolute; + right: 10px; + top: 10px; + background: none; + border: none; + color: white; + font-size: 20px; + cursor: pointer; + `; + closeButton.onclick = () => hideSamplesUI(); + samplesUI.appendChild(closeButton); + + document.body.appendChild(samplesUI); + } + return samplesUI; + } + + // Function to show samples UI + function showSamplesUI() { + const samplesUI = createSamplesUI(); + samplesUI.style.display = 'block'; + + // Clear existing content + while (samplesUI.children.length > 1) { // Keep close button + samplesUI.removeChild(samplesUI.lastChild); + } + + // Add title + const title = document.createElement('h2'); + title.textContent = 'Collected Biometric Samples'; + title.style.cssText = 'margin-top: 0; color: #fff; text-align: center;'; + samplesUI.appendChild(title); + + // Add samples + if (!gameState.biometricSamples || gameState.biometricSamples.length === 0) { + const noSamples = document.createElement('p'); + noSamples.textContent = 'No samples collected yet.'; + noSamples.style.textAlign = 'center'; + samplesUI.appendChild(noSamples); + return; + } + + gameState.biometricSamples.forEach(sample => { + const sampleElement = document.createElement('div'); + sampleElement.style.cssText = ` + margin: 10px 0; + padding: 10px; + background: rgba(255, 255, 255, 0.1); + border-radius: 5px; + `; + + const qualityPercentage = Math.round(sample.quality * 100); + sampleElement.innerHTML = ` + Type: ${sample.type}
+ Owner: ${sample.owner}
+ Quality: ${qualityPercentage}%
+ ID: ${sample.id}
+ `; + + // Add quality bar + const qualityBar = document.createElement('div'); + qualityBar.style.cssText = ` + width: 100%; + height: 5px; + background: #333; + margin-top: 5px; + border-radius: 2px; + `; + + const qualityFill = document.createElement('div'); + qualityFill.style.cssText = ` + width: ${qualityPercentage}%; + height: 100%; + background: ${getQualityColor(sample.quality)}; + border-radius: 2px; + transition: width 0.3s ease; + `; + + qualityBar.appendChild(qualityFill); + sampleElement.appendChild(qualityBar); + samplesUI.appendChild(sampleElement); + }); + } + + // Helper function to hide samples UI + function hideSamplesUI() { + const samplesUI = document.getElementById('biometric-samples-ui'); + if (samplesUI) { + samplesUI.style.display = 'none'; + } + } + + // Helper function to get color based on quality + function getQualityColor(quality) { + if (quality >= 0.8) return '#00ff00'; + if (quality >= 0.6) return '#ffff00'; + return '#ff0000'; + } + + // Add keyboard shortcut to view samples (press 'B') + function setupSamplesUIControls() { + document.addEventListener('keydown', (event) => { + if (event.key.toLowerCase() === 'b') { + showSamplesUI(); + } + if (event.key === 'Escape') { + hideSamplesUI(); + } + }); + } + + // Add this to your scene's create function + function initializeSamplesUI() { + createSamplesUI(); + setupSamplesUIControls(); + } \ No newline at end of file From 62d71889c41cff740ffb154f4745b888cc20356f Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 00:28:44 +0000 Subject: [PATCH 08/46] Add spoofing and dusting mechanics to biometric sample system - Implement spoofing functionality for biometric samples with quality degradation - Create interactive dusting minigame for revealing fingerprints - Add spoofing kit item to office room and scenario - Introduce visual indicators for spoofed samples - Implement progress-based spoofing process with UI feedback Bug with spoofing logic --- assets/rooms/room_office.json | 11 ++ assets/scenarios/ceo_exfil.json | 6 + index.html | 241 ++++++++++++++++++++++++++++++++ 3 files changed, 258 insertions(+) diff --git a/assets/rooms/room_office.json b/assets/rooms/room_office.json index 827f1dd..f94e3ec 100644 --- a/assets/rooms/room_office.json +++ b/assets/rooms/room_office.json @@ -327,6 +327,17 @@ "width":48, "x":390, "y":144 + }, + { + "height": 48, + "id": 16, + "name": "spoofing_kit", + "rotation": 0, + "type": "", + "visible": true, + "width": 48, + "x": 340, + "y": 144 } diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index bbffaef..d91af48 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -80,6 +80,12 @@ "name": "Fingerprint Kit", "takeable": true, "observations": "A kit used for collecting fingerprints from surfaces" + }, + { + "type": "spoofing_kit", + "name": "Fingerprint Spoofing Kit", + "takeable": true, + "observations": "A specialized kit containing silicone, gelatin, and other materials for creating artificial fingerprints" } ] }, diff --git a/index.html b/index.html index 3d783a9..230c3d9 100644 --- a/index.html +++ b/index.html @@ -233,6 +233,19 @@ display: 'none' }; + // Add these constants for spoofing + const SPOOFING_TIME = 3000; // 3 seconds to create spoof + const SPOOF_QUALITY_MULTIPLIER = 0.8; // Spoofed prints are slightly lower quality + + // Add these constants for the dusting minigame + const DUST_COLORS = { + NONE: 0x000000, + LIGHT: 0x444444, + MEDIUM: 0x888888, + HEAVY: 0xcccccc, + REVEALED: 0x00ff00 + }; + // preloads the assets function preload() { // Show loading text @@ -2580,6 +2593,7 @@ Owner: ${sample.owner}
Quality: ${qualityPercentage}%
ID: ${sample.id}
+ ${sample.isSpoofed ? 'SPOOFED SAMPLE
' : ''} `; // Add quality bar @@ -2603,6 +2617,62 @@ qualityBar.appendChild(qualityFill); sampleElement.appendChild(qualityBar); + + // Add spoof button if not already spoofed + if (!sample.isSpoofed && hasItemInInventory('spoofing_kit')) { + const spoofButton = document.createElement('button'); + spoofButton.textContent = 'Create Spoof'; + spoofButton.style.cssText = ` + margin-top: 10px; + padding: 5px 10px; + background: #444; + border: none; + color: white; + border-radius: 3px; + cursor: pointer; + `; + spoofButton.onclick = async () => { + spoofButton.disabled = true; + spoofButton.textContent = 'Creating spoof...'; + + // Add progress bar + const progressBar = document.createElement('div'); + progressBar.style.cssText = ` + width: 100%; + height: 2px; + background: #333; + margin-top: 5px; + `; + const progress = document.createElement('div'); + progress.style.cssText = ` + width: 0%; + height: 100%; + background: #ff9900; + transition: width 0.1s linear; + `; + progressBar.appendChild(progress); + sampleElement.appendChild(progressBar); + + // Animate progress + let currentProgress = 0; + const interval = setInterval(() => { + currentProgress += 2; + progress.style.width = `${currentProgress}%`; + }, SPOOFING_TIME / 50); + + // Create spoof after delay + setTimeout(() => { + clearInterval(interval); + const spoofedSample = createSpoofedSample(sample); + if (spoofedSample) { + gameState.biometricSamples.push(spoofedSample); + showSamplesUI(); // Refresh UI + } + }, SPOOFING_TIME); + }; + sampleElement.appendChild(spoofButton); + } + samplesUI.appendChild(sampleElement); }); } @@ -2639,6 +2709,177 @@ createSamplesUI(); setupSamplesUIControls(); } + + // Add spoofing functionality + function createSpoofedSample(originalSample) { + if (!originalSample) { + alert("No sample to spoof from!"); + return null; + } + + // Check if player has required items + const hasSpoofingKit = hasItemInInventory('spoofing_kit'); + if (!hasSpoofingKit) { + alert("You need a spoofing kit to create fake fingerprints!"); + return null; + } + + // Create spoofed sample with slightly degraded quality + const spoofedSample = { + id: `spoofed_${originalSample.owner}_${Date.now()}`, + type: originalSample.type, + owner: originalSample.owner, + quality: originalSample.quality * SPOOF_QUALITY_MULTIPLIER, + data: generateFingerprintData(originalSample), + isSpoofed: true + }; + + return spoofedSample; + } + + // Add dusting minigame + function startDustingMinigame(item) { + const scene = item.scene; + const gameWidth = 400; + const gameHeight = 300; + + // Create container for minigame + const container = scene.add.container( + scene.cameras.main.centerX - gameWidth/2, + scene.cameras.main.centerY - gameHeight/2 + ); + + // Add background + const bg = scene.add.rectangle(0, 0, gameWidth, gameHeight, 0x222222); + container.add(bg); + + // Create grid of cells + const cellSize = 20; + const gridWidth = Math.floor(gameWidth / cellSize); + const gridHeight = Math.floor(gameHeight / cellSize); + const cells = []; + + // Generate random fingerprint pattern + const fingerprintCells = new Set(); + const centerX = Math.floor(gridWidth / 2); + const centerY = Math.floor(gridHeight / 2); + for (let i = 0; i < 50; i++) { + const x = centerX + Math.floor(Math.random() * 6 - 3); + const y = centerY + Math.floor(Math.random() * 6 - 3); + fingerprintCells.add(`${x},${y}`); + } + + // Create grid cells + for (let y = 0; y < gridHeight; y++) { + for (let x = 0; x < gridWidth; x++) { + const cell = scene.add.rectangle( + x * cellSize, + y * cellSize, + cellSize - 1, + cellSize - 1, + DUST_COLORS.NONE + ); + cell.setOrigin(0, 0); + cell.setInteractive(); + cell.dustLevel = 0; + cell.hasFingerprint = fingerprintCells.has(`${x},${y}`); + cells.push(cell); + container.add(cell); + + // Add dusting interaction + cell.on('pointermove', function(pointer) { + if (pointer.isDown) { + this.dustLevel = Math.min(3, this.dustLevel + 1); + this.setFillStyle(getDustColor(this.dustLevel, this.hasFingerprint)); + checkDustingProgress(); + } + }); + } + } + + // Add instructions + const instructions = scene.add.text( + gameWidth/2, + -30, + 'Click and drag to dust for fingerprints.\nReveal the pattern without over-dusting!', + { + fontSize: '16px', + fill: '#ffffff', + align: 'center' + } + ); + instructions.setOrigin(0.5); + container.add(instructions); + + // Add progress tracking + let revealedPrints = 0; + let totalPrints = fingerprintCells.size; + let overDusted = 0; + + // Add progress display + const progressText = scene.add.text( + gameWidth/2, + gameHeight + 20, + `Revealed: 0/${totalPrints} | Over-dusted: 0`, + { + fontSize: '16px', + fill: '#ffffff', + align: 'center' + } + ); + progressText.setOrigin(0.5); + container.add(progressText); + + // Add close button + const closeButton = scene.add.text( + gameWidth - 10, + -20, + 'X', + { + fontSize: '20px', + fill: '#ffffff' + } + ); + closeButton.setOrigin(1, 0); + closeButton.setInteractive(); + closeButton.on('pointerdown', () => { + container.destroy(); + }); + container.add(closeButton); + + function getDustColor(level, hasFingerprint) { + if (level === 0) return DUST_COLORS.NONE; + if (level === 1) return DUST_COLORS.LIGHT; + if (level === 2) return hasFingerprint ? DUST_COLORS.REVEALED : DUST_COLORS.MEDIUM; + return DUST_COLORS.HEAVY; + } + + function checkDustingProgress() { + revealedPrints = 0; + overDusted = 0; + + cells.forEach(cell => { + if (cell.hasFingerprint && cell.dustLevel === 2) { + revealedPrints++; + } + if (cell.dustLevel === 3) { + overDusted++; + } + }); + + progressText.setText( + `Revealed: ${revealedPrints}/${totalPrints} | Over-dusted: ${overDusted}` + ); + + // Check win condition + if (revealedPrints === totalPrints && overDusted < 10) { + setTimeout(() => { + container.destroy(); + collectFingerprint(item); + }, 1000); + } + } + } \ No newline at end of file From 3850c36a9727b4d2416e1e07dcd777130e772ea7 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 00:33:46 +0000 Subject: [PATCH 09/46] Fixed bug in spoofing, now works --- index.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/index.html b/index.html index 230c3d9..3691b6e 100644 --- a/index.html +++ b/index.html @@ -2709,6 +2709,21 @@ createSamplesUI(); setupSamplesUIControls(); } + + function generateFingerprintData(sample) { + // For spoofed samples, we generate from the original sample data + if (sample.data) { + return `spoofed_${sample.data}`; + } + + // For original samples from items, we use the item's data + if (sample.scenarioData?.fingerprintOwner) { + return `fp_${sample.scenarioData.fingerprintOwner}_${Date.now()}`; + } + + // Fallback unique identifier + return `fp_unknown_${Date.now()}`; + } // Add spoofing functionality function createSpoofedSample(originalSample) { @@ -2880,6 +2895,7 @@ } } } + \ No newline at end of file From 21f2e514ac63467cc8fbe3ec4b8362d4780eed41 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 01:26:25 +0000 Subject: [PATCH 10/46] Added working* minigame to fingerprint dusting. *Might be too tiedious, need to fix dragging --- index.html | 313 +++++++++++++++++++++++++---------------------------- 1 file changed, 146 insertions(+), 167 deletions(-) diff --git a/index.html b/index.html index 3691b6e..5db867b 100644 --- a/index.html +++ b/index.html @@ -2331,64 +2331,14 @@ return null; } - // Create collection effect - const scene = item.scene; - const collectionEffect = scene.add.circle( - item.x, - item.y, - 40, - SAMPLE_COLLECTION_COLOR, - 0.3 - ); + // Check if player has required items + if (!hasItemInInventory('fingerprint_kit')) { + alert("You need a fingerprint kit to collect samples!"); + return null; + } - // Add scanning animation - scene.tweens.add({ - targets: collectionEffect, - scale: { from: 1, to: 1.5 }, - alpha: { from: 0.3, to: 0 }, - duration: SAMPLE_COLLECTION_TIME, - repeat: 0, - yoyo: false, - onComplete: () => { - collectionEffect.destroy(); - - // Create the sample after animation - const sample = { - id: `${item.scenarioData.fingerprintOwner}_${Date.now()}`, - type: "fingerprint", - owner: item.scenarioData.fingerprintOwner, - quality: item.scenarioData.fingerprintQuality, - data: generateFingerprintData(item) - }; - - if (!gameState.biometricSamples) { - gameState.biometricSamples = []; - } - - gameState.biometricSamples.push(sample); - - // Show collection success message with sample details - const qualityPercentage = Math.round(sample.quality * 100); - alert(`Successfully collected a fingerprint sample from ${item.scenarioData.name}\nSample Quality: ${qualityPercentage}%`); - console.log("Collected fingerprint sample:", sample); - } - }); - - // Add scanning particles - const particles = scene.add.particles(item.x, item.y, 'particle', { - speed: 100, - scale: { start: 0.2, end: 0 }, - blendMode: 'ADD', - lifespan: 1000, - quantity: 1, - frequency: 50 - }); - - // Clean up particles after collection - scene.time.delayedCall(SAMPLE_COLLECTION_TIME, () => { - particles.destroy(); - }); - + // Start the dusting minigame + startDustingMinigame(item); return true; } @@ -2754,146 +2704,175 @@ // Add dusting minigame function startDustingMinigame(item) { - const scene = item.scene; - const gameWidth = 400; - const gameHeight = 300; + // Create iframe container + const iframe = document.createElement('div'); + iframe.style.cssText = ` + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 60%; + height: 60%; + background: rgba(0, 0, 0, 0.9); + border: 1px solid #444; + z-index: 1000; + padding: 20px; + border-radius: 5px; + `; - // Create container for minigame - const container = scene.add.container( - scene.cameras.main.centerX - gameWidth/2, - scene.cameras.main.centerY - gameHeight/2 - ); + // Create game container + const gameContainer = document.createElement('div'); + gameContainer.style.cssText = ` + width: 100%; + height: calc(100% - 60px); + display: grid; + grid-template-columns: repeat(20, minmax(0, 1fr)); + grid-template-rows: repeat(20, minmax(0, 1fr)); + gap: 1px; + background: #222; + padding: 10px; + margin-top: 40px; + `; - // Add background - const bg = scene.add.rectangle(0, 0, gameWidth, gameHeight, 0x222222); - container.add(bg); + // Add instructions + const instructions = document.createElement('div'); + instructions.textContent = 'Click and drag to dust for fingerprints.\nReveal the pattern without over-dusting!'; + instructions.style.cssText = ` + position: absolute; + top: 10px; + left: 50%; + transform: translateX(-50%); + color: white; + text-align: center; + font-size: 16px; + `; - // Create grid of cells - const cellSize = 20; - const gridWidth = Math.floor(gameWidth / cellSize); - const gridHeight = Math.floor(gameHeight / cellSize); - const cells = []; + // Add progress display + const progressText = document.createElement('div'); + progressText.style.cssText = ` + position: absolute; + bottom: 10px; + left: 50%; + transform: translateX(-50%); + color: white; + text-align: center; + font-size: 16px; + `; - // Generate random fingerprint pattern + // Generate fingerprint pattern + const gridSize = 20; const fingerprintCells = new Set(); - const centerX = Math.floor(gridWidth / 2); - const centerY = Math.floor(gridHeight / 2); + const centerX = Math.floor(gridSize / 2); + const centerY = Math.floor(gridSize / 2); for (let i = 0; i < 50; i++) { const x = centerX + Math.floor(Math.random() * 6 - 3); const y = centerY + Math.floor(Math.random() * 6 - 3); fingerprintCells.add(`${x},${y}`); } - // Create grid cells - for (let y = 0; y < gridHeight; y++) { - for (let x = 0; x < gridWidth; x++) { - const cell = scene.add.rectangle( - x * cellSize, - y * cellSize, - cellSize - 1, - cellSize - 1, - DUST_COLORS.NONE - ); - cell.setOrigin(0, 0); - cell.setInteractive(); - cell.dustLevel = 0; - cell.hasFingerprint = fingerprintCells.has(`${x},${y}`); - cells.push(cell); - container.add(cell); - - // Add dusting interaction - cell.on('pointermove', function(pointer) { - if (pointer.isDown) { - this.dustLevel = Math.min(3, this.dustLevel + 1); - this.setFillStyle(getDustColor(this.dustLevel, this.hasFingerprint)); - checkDustingProgress(); - } - }); - } - } - - // Add instructions - const instructions = scene.add.text( - gameWidth/2, - -30, - 'Click and drag to dust for fingerprints.\nReveal the pattern without over-dusting!', - { - fontSize: '16px', - fill: '#ffffff', - align: 'center' - } - ); - instructions.setOrigin(0.5); - container.add(instructions); - - // Add progress tracking + // Track progress let revealedPrints = 0; let totalPrints = fingerprintCells.size; let overDusted = 0; - // Add progress display - const progressText = scene.add.text( - gameWidth/2, - gameHeight + 20, - `Revealed: 0/${totalPrints} | Over-dusted: 0`, - { - fontSize: '16px', - fill: '#ffffff', - align: 'center' + // Create grid cells + for (let y = 0; y < gridSize; y++) { + for (let x = 0; x < gridSize; x++) { + const cell = document.createElement('div'); + cell.style.cssText = ` + width: 100%; + height: 100%; + background: black; + position: relative; + cursor: pointer; + `; + cell.dataset.x = x; + cell.dataset.y = y; + cell.dataset.dustLevel = '0'; + cell.dataset.hasFingerprint = fingerprintCells.has(`${x},${y}`); + + let isDragging = false; + + // Add dusting interaction + cell.addEventListener('mousedown', () => isDragging = true); + cell.addEventListener('mouseup', () => isDragging = false); + cell.addEventListener('mouseleave', () => isDragging = false); + cell.addEventListener('mousemove', (e) => { + if (!isDragging) return; + + const dustLevel = parseInt(cell.dataset.dustLevel); + if (dustLevel < 3) { + cell.dataset.dustLevel = (dustLevel + 1).toString(); + updateCellColor(cell); + checkProgress(); + } + }); + + gameContainer.appendChild(cell); } - ); - progressText.setOrigin(0.5); - container.add(progressText); - - // Add close button - const closeButton = scene.add.text( - gameWidth - 10, - -20, - 'X', - { - fontSize: '20px', - fill: '#ffffff' - } - ); - closeButton.setOrigin(1, 0); - closeButton.setInteractive(); - closeButton.on('pointerdown', () => { - container.destroy(); - }); - container.add(closeButton); - - function getDustColor(level, hasFingerprint) { - if (level === 0) return DUST_COLORS.NONE; - if (level === 1) return DUST_COLORS.LIGHT; - if (level === 2) return hasFingerprint ? DUST_COLORS.REVEALED : DUST_COLORS.MEDIUM; - return DUST_COLORS.HEAVY; } - function checkDustingProgress() { + function updateCellColor(cell) { + const dustLevel = parseInt(cell.dataset.dustLevel); + const hasFingerprint = cell.dataset.hasFingerprint === 'true'; + + if (dustLevel === 0) cell.style.background = 'black'; + else if (dustLevel === 1) cell.style.background = '#444'; + else if (dustLevel === 2) cell.style.background = hasFingerprint ? '#0f0' : '#888'; + else cell.style.background = '#ccc'; + } + + function checkProgress() { revealedPrints = 0; overDusted = 0; - cells.forEach(cell => { - if (cell.hasFingerprint && cell.dustLevel === 2) { - revealedPrints++; - } - if (cell.dustLevel === 3) { - overDusted++; - } + gameContainer.childNodes.forEach(cell => { + const dustLevel = parseInt(cell.dataset.dustLevel); + const hasFingerprint = cell.dataset.hasFingerprint === 'true'; + + if (hasFingerprint && dustLevel === 2) revealedPrints++; + if (dustLevel === 3) overDusted++; }); - progressText.setText( - `Revealed: ${revealedPrints}/${totalPrints} | Over-dusted: ${overDusted}` - ); + progressText.textContent = `Revealed: ${revealedPrints}/${totalPrints} | Over-dusted: ${overDusted}`; - // Check win condition if (revealedPrints === totalPrints && overDusted < 10) { setTimeout(() => { - container.destroy(); + document.body.removeChild(iframe); + scene.input.mouse.enabled = true; collectFingerprint(item); }, 1000); } } + + // Add close button + const closeButton = document.createElement('button'); + closeButton.textContent = 'X'; + closeButton.style.cssText = ` + position: absolute; + right: 10px; + top: 10px; + background: none; + border: none; + color: white; + font-size: 20px; + cursor: pointer; + `; + closeButton.onclick = () => { + document.body.removeChild(iframe); + scene.input.mouse.enabled = true; + }; + + // Assemble the interface + iframe.appendChild(closeButton); + iframe.appendChild(instructions); + iframe.appendChild(gameContainer); + iframe.appendChild(progressText); + document.body.appendChild(iframe); + + // Disable game movement + const scene = item.scene; + scene.input.mouse.enabled = false; } From 503b5ca7a38c9fddaf06a22d059f3897c62acd97 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 01:28:36 +0000 Subject: [PATCH 11/46] Fixed the no dragging issue --- index.html | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/index.html b/index.html index 5db867b..69408c3 100644 --- a/index.html +++ b/index.html @@ -2791,27 +2791,30 @@ cell.dataset.dustLevel = '0'; cell.dataset.hasFingerprint = fingerprintCells.has(`${x},${y}`); - let isDragging = false; - - // Add dusting interaction - cell.addEventListener('mousedown', () => isDragging = true); - cell.addEventListener('mouseup', () => isDragging = false); - cell.addEventListener('mouseleave', () => isDragging = false); - cell.addEventListener('mousemove', (e) => { - if (!isDragging) return; - - const dustLevel = parseInt(cell.dataset.dustLevel); - if (dustLevel < 3) { - cell.dataset.dustLevel = (dustLevel + 1).toString(); - updateCellColor(cell); - checkProgress(); - } - }); - gameContainer.appendChild(cell); } } + // Add dragging interaction at container level + let isDragging = false; + gameContainer.addEventListener('mousedown', () => isDragging = true); + gameContainer.addEventListener('mouseup', () => isDragging = false); + gameContainer.addEventListener('mouseleave', () => isDragging = false); + gameContainer.addEventListener('mousemove', (e) => { + if (!isDragging) return; + + // Get the cell element under the cursor + const cell = document.elementFromPoint(e.clientX, e.clientY); + if (cell && cell.dataset.dustLevel !== undefined) { + const dustLevel = parseInt(cell.dataset.dustLevel); + if (dustLevel < 3) { + cell.dataset.dustLevel = (dustLevel + 1).toString(); + updateCellColor(cell); + checkProgress(); + } + } + }); + function updateCellColor(cell) { const dustLevel = parseInt(cell.dataset.dustLevel); const hasFingerprint = cell.dataset.hasFingerprint === 'true'; From 17a89ea2efe6ccd22f8f0299dfcb6e080441a5b3 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 01:32:46 +0000 Subject: [PATCH 12/46] Fingerprint minigame working --- index.html | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 69408c3..a19f0e0 100644 --- a/index.html +++ b/index.html @@ -2797,6 +2797,8 @@ // Add dragging interaction at container level let isDragging = false; + let lastDustTime = {}; // Track last dust time for each cell + gameContainer.addEventListener('mousedown', () => isDragging = true); gameContainer.addEventListener('mouseup', () => isDragging = false); gameContainer.addEventListener('mouseleave', () => isDragging = false); @@ -2806,11 +2808,21 @@ // Get the cell element under the cursor const cell = document.elementFromPoint(e.clientX, e.clientY); if (cell && cell.dataset.dustLevel !== undefined) { + const cellId = `${cell.dataset.x},${cell.dataset.y}`; + const currentTime = Date.now(); const dustLevel = parseInt(cell.dataset.dustLevel); - if (dustLevel < 3) { - cell.dataset.dustLevel = (dustLevel + 1).toString(); - updateCellColor(cell); - checkProgress(); + + // Only allow dusting every 100ms for each cell + if (!lastDustTime[cellId] || currentTime - lastDustTime[cellId] > 100) { + if (dustLevel < 3) { + // Increment dust level with 33% chance after level 1 + if (dustLevel < 1 || Math.random() < 0.33) { + cell.dataset.dustLevel = (dustLevel + 1).toString(); + updateCellColor(cell); + checkProgress(); + } + lastDustTime[cellId] = currentTime; + } } } }); From 1765662a5ea4a231b83364059728f8c18f42460d Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 02:00:44 +0000 Subject: [PATCH 13/46] Fixed minigame bugs, fingerprint is added when minigame is completed --- index.html | 107 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 92 insertions(+), 15 deletions(-) diff --git a/index.html b/index.html index a19f0e0..c1b45cd 100644 --- a/index.html +++ b/index.html @@ -2736,15 +2736,22 @@ // Add instructions const instructions = document.createElement('div'); - instructions.textContent = 'Click and drag to dust for fingerprints.\nReveal the pattern without over-dusting!'; + instructions.innerHTML = ` +

Fingerprint Dusting

+

+ Drag to dust the surface and reveal fingerprints.
+ 🔍 Gray = Light dusting
+ 🟢 Green = Fingerprint found!
+ ⚠️ White = Over-dusted (avoid this)
+ Find all fingerprints with minimal over-dusting. +

+ `; instructions.style.cssText = ` position: absolute; top: 10px; left: 50%; transform: translateX(-50%); - color: white; - text-align: center; - font-size: 16px; + width: 90%; `; // Add progress display @@ -2764,10 +2771,23 @@ const fingerprintCells = new Set(); const centerX = Math.floor(gridSize / 2); const centerY = Math.floor(gridSize / 2); + + // Create a larger pattern (about 50 cells) spread around the center for (let i = 0; i < 50; i++) { - const x = centerX + Math.floor(Math.random() * 6 - 3); - const y = centerY + Math.floor(Math.random() * 6 - 3); - fingerprintCells.add(`${x},${y}`); + const x = centerX + Math.floor(Math.random() * 10 - 5); // Increased spread + const y = centerY + Math.floor(Math.random() * 10 - 5); // Increased spread + if (x >= 0 && x < gridSize && y >= 0 && y < gridSize) { + fingerprintCells.add(`${x},${y}`); + } + } + + // If we didn't get enough cells, add more until we reach target + while (fingerprintCells.size < 50) { + const x = centerX + Math.floor(Math.random() * 12 - 6); + const y = centerY + Math.floor(Math.random() * 12 - 6); + if (x >= 0 && x < gridSize && y >= 0 && y < gridSize) { + fingerprintCells.add(`${x},${y}`); + } } // Track progress @@ -2831,10 +2851,18 @@ const dustLevel = parseInt(cell.dataset.dustLevel); const hasFingerprint = cell.dataset.hasFingerprint === 'true'; - if (dustLevel === 0) cell.style.background = 'black'; - else if (dustLevel === 1) cell.style.background = '#444'; - else if (dustLevel === 2) cell.style.background = hasFingerprint ? '#0f0' : '#888'; - else cell.style.background = '#ccc'; + if (dustLevel === 0) { + cell.style.background = 'black'; + } + else if (dustLevel === 1) { + cell.style.background = '#444'; + } + else if (dustLevel === 2) { + cell.style.background = hasFingerprint ? '#0f0' : '#888'; + } + else { + cell.style.background = '#ccc'; + } } function checkProgress() { @@ -2849,14 +2877,63 @@ if (dustLevel === 3) overDusted++; }); - progressText.textContent = `Revealed: ${revealedPrints}/${totalPrints} | Over-dusted: ${overDusted}`; + const requiredPrints = Math.ceil(totalPrints * 0.4); // 40% requirement + progressText.innerHTML = ` +
Found: ${revealedPrints}/${requiredPrints} required prints
+
+ Over-dusted: ${overDusted}/10 max +
+ `; - if (revealedPrints === totalPrints && overDusted < 10) { + // Check win condition with 60% requirement + if (revealedPrints >= requiredPrints && overDusted < 10) { + // Show success message + const successMessage = document.createElement('div'); + successMessage.style.cssText = ` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: rgba(0, 0, 0, 0.9); + padding: 20px; + border-radius: 5px; + color: #0f0; + font-size: 20px; + text-align: center; + z-index: 1001; + `; + successMessage.textContent = "Fingerprint successfully collected!"; + iframe.appendChild(successMessage); + + // Disable further interaction + isDragging = false; + gameContainer.style.pointerEvents = 'none'; + setTimeout(() => { + // Add fingerprint to gameState + if (!gameState.biometricSamples) { + gameState.biometricSamples = []; + } + + const sample = { + id: generateFingerprintData(item), + type: 'fingerprint', + owner: item.scenarioData.fingerprintOwner, + quality: Math.random() * 0.3 + 0.7, // Random quality between 0.7 and 1.0 + data: generateFingerprintData(item) + }; + + gameState.biometricSamples.push(sample); + + // Remove the minigame document.body.removeChild(iframe); scene.input.mouse.enabled = true; - collectFingerprint(item); - }, 1000); + + // Mark item as collected + if (item.scenarioData) { + item.scenarioData.hasFingerprint = false; + } + }, 1500); } } From 4339e95767bf996362bcc0fb2d15639a30f636d1 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 02:09:36 +0000 Subject: [PATCH 14/46] Increased over-dusted threshold from 10 to 25, made the minigame fail when threshold was surpassed. POTENTIALLY IMPLEMENT: limit attempts to amount based on fingerprint quality if failed minigame --- index.html | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index c1b45cd..606f074 100644 --- a/index.html +++ b/index.html @@ -2880,13 +2880,44 @@ const requiredPrints = Math.ceil(totalPrints * 0.4); // 40% requirement progressText.innerHTML = `
Found: ${revealedPrints}/${requiredPrints} required prints
-
- Over-dusted: ${overDusted}/10 max +
+ Over-dusted: ${overDusted}/25 max
`; - // Check win condition with 60% requirement - if (revealedPrints >= requiredPrints && overDusted < 10) { + // Check fail condition first + if (overDusted >= 25) { + // Show failure message + const failureMessage = document.createElement('div'); + failureMessage.style.cssText = ` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: rgba(0, 0, 0, 0.9); + padding: 20px; + border-radius: 5px; + color: #f00; + font-size: 20px; + text-align: center; + z-index: 1001; + `; + failureMessage.textContent = "Too many over-dusted areas!"; + iframe.appendChild(failureMessage); + + // Disable further interaction + isDragging = false; + gameContainer.style.pointerEvents = 'none'; + + setTimeout(() => { + document.body.removeChild(iframe); + scene.input.mouse.enabled = true; + }, 1500); + return; + } + + // Check win condition (existing code) + if (revealedPrints >= requiredPrints && overDusted < 25) { // Show success message const successMessage = document.createElement('div'); successMessage.style.cssText = ` From b642cd7080f4cefceaec7717cc112e6c7b7ac253 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 12:30:58 +0000 Subject: [PATCH 15/46] Added lockpicking item to office3 --- assets/rooms/room_office.json | 13 ++++++++++++- assets/scenarios/ceo_exfil.json | 6 ++++++ index.html | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/assets/rooms/room_office.json b/assets/rooms/room_office.json index f94e3ec..b79f272 100644 --- a/assets/rooms/room_office.json +++ b/assets/rooms/room_office.json @@ -338,6 +338,17 @@ "width": 48, "x": 340, "y": 144 + }, + { + "height": 48, + "id": 17, + "name": "lockpick", + "rotation": 0, + "type": "", + "visible": true, + "width": 48, + "x": 330, + "y": 144 } @@ -349,7 +360,7 @@ "y":0 }], "nextlayerid":12, - "nextobjectid":16, + "nextobjectid":18, "orientation":"orthogonal", "renderorder":"right-down", "tiledversion":"1.11.0", diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index d91af48..699754b 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -141,6 +141,12 @@ "readable": true, "text": "Large data transfers detected to unknown external IPs - All originating from CEO's office", "observations": "Suspicious network activity logs" + }, + { + "type": "lockpick", + "name": "Lock Pick Kit", + "takeable": true, + "observations": "A professional lock picking kit with various picks and tension wrenches" } ] }, diff --git a/index.html b/index.html index 606f074..ce8e2e4 100644 --- a/index.html +++ b/index.html @@ -280,6 +280,7 @@ this.load.image('bluetooth_scanner', 'assets/objects/bluetooth_scanner.png'); this.load.image('tablet', 'assets/objects/tablet.png'); this.load.image('fingerprint_kit', 'assets/objects/fingerprint_kit.png'); + this.load.image('lockpick', 'assets/objects/lockpick.png'); this.load.json('gameScenarioJSON', 'assets/scenarios/ceo_exfil.json'); From 88dfd01628889c3df36fd9e8b53ce4eaa2091c26 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 12:45:02 +0000 Subject: [PATCH 16/46] Added ability to use lockpick if no key is present --- index.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index ce8e2e4..6ad11f9 100644 --- a/index.html +++ b/index.html @@ -1900,7 +1900,17 @@ unlockTarget(lockable, type, lockable.layer); // Pass the layer here alert(`You used the ${keyName} that you found in ${keyLocation} to unlock the ${type}.`); } else { - alert(`Requires key: ${requiredKey}`); + // Check for lockpick kit + const hasLockpick = inventory.items.some(item => + item && item.scenarioData && + item.scenarioData.type === 'lockpick' + ); + + if (hasLockpick) { + alert("This lock can be picked with your lockpick kit!"); + } else { + alert(`Requires key: ${requiredKey}`); + } } break; From 984da6d290ec223703df750fa2f37bf2085aa775 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 12:50:54 +0000 Subject: [PATCH 17/46] Added option for user to not use lockpick, also the door now unlocks if they choose to use it. --- index.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index 6ad11f9..ef0898a 100644 --- a/index.html +++ b/index.html @@ -1897,7 +1897,7 @@ const keyName = keyItem?.scenarioData?.name || 'key'; const keyLocation = keyItem?.scenarioData?.foundIn || 'your inventory'; - unlockTarget(lockable, type, lockable.layer); // Pass the layer here + unlockTarget(lockable, type, lockable.layer); alert(`You used the ${keyName} that you found in ${keyLocation} to unlock the ${type}.`); } else { // Check for lockpick kit @@ -1907,7 +1907,10 @@ ); if (hasLockpick) { - alert("This lock can be picked with your lockpick kit!"); + if (confirm("Would you like to attempt picking this lock?")) { + unlockTarget(lockable, type, lockable.layer); + alert("You successfully picked the lock!"); + } } else { alert(`Requires key: ${requiredKey}`); } From 0dbbdf935f6d4a56e2cb9d1d6e32ffffc2744e4a Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 12:56:59 +0000 Subject: [PATCH 18/46] Added minigame template for lockpicking --- index.html | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index ef0898a..30ccb4d 100644 --- a/index.html +++ b/index.html @@ -1908,8 +1908,7 @@ if (hasLockpick) { if (confirm("Would you like to attempt picking this lock?")) { - unlockTarget(lockable, type, lockable.layer); - alert("You successfully picked the lock!"); + startLockpickingMinigame(lockable, this); } } else { alert(`Requires key: ${requiredKey}`); @@ -3012,6 +3011,86 @@ scene.input.mouse.enabled = false; } + function startLockpickingMinigame(item, scene) { + // Create iframe container + const iframe = document.createElement('div'); + iframe.style.cssText = ` + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 60%; + height: 60%; + background: rgba(0, 0, 0, 0.9); + border: 1px solid #444; + z-index: 1000; + padding: 20px; + border-radius: 5px; + `; + + // Add instructions + const instructions = document.createElement('div'); + instructions.innerHTML = ` +

Lock Picking

+

+ Toggle tension wrench and manipulate pins to unlock.
+ 🔵 Blue = Pin ready to set
+ 🟢 Green = Pin set correctly
+ 🔴 Red = Pin dropped
+ Set all pins in the correct order. +

+ `; + instructions.style.cssText = ` + position: absolute; + top: 10px; + left: 50%; + transform: translateX(-50%); + width: 90%; + `; + + // Create game container + const gameContainer = document.createElement('div'); + gameContainer.style.cssText = ` + width: 100%; + height: calc(100% - 60px); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 20px; + margin-top: 40px; + background: #222; + padding: 10px; + `; + + // Add close button + const closeButton = document.createElement('button'); + closeButton.textContent = 'X'; + closeButton.style.cssText = ` + position: absolute; + right: 10px; + top: 10px; + background: none; + border: none; + color: white; + font-size: 20px; + cursor: pointer; + `; + closeButton.onclick = () => { + document.body.removeChild(iframe); + scene.input.mouse.enabled = true; + }; + + // Assemble the interface + iframe.appendChild(closeButton); + iframe.appendChild(instructions); + iframe.appendChild(gameContainer); + document.body.appendChild(iframe); + + // Disable game movement + scene.input.mouse.enabled = false; + } + \ No newline at end of file From d5a083bd0b80dfc67f4388ea9b022f53418ccd65 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 13:02:38 +0000 Subject: [PATCH 19/46] Added functionality to the minigame --- index.html | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/index.html b/index.html index 30ccb4d..9ba9959 100644 --- a/index.html +++ b/index.html @@ -3081,6 +3081,133 @@ scene.input.mouse.enabled = true; }; + // Add pin binding order + const numPins = 5; + const bindingOrder = Array.from({length: numPins}, (_, i) => i) + .sort(() => Math.random() - 0.5); // Randomize binding order + + // Track game state + const gameState = { + tensionApplied: false, + pinStates: Array(numPins).fill(0), // 0 = down, 1 = binding, 2 = set + currentBindingIndex: 0 + }; + + // Create tension wrench toggle + const tensionWrench = document.createElement('div'); + tensionWrench.style.cssText = ` + width: 100px; + height: 30px; + background: ${gameState.tensionApplied ? '#666' : '#444'}; + border: 2px solid #888; + border-radius: 5px; + cursor: pointer; + margin-bottom: 20px; + text-align: center; + line-height: 30px; + color: white; + `; + tensionWrench.textContent = 'Tension: OFF'; + tensionWrench.onclick = () => { + gameState.tensionApplied = !gameState.tensionApplied; + tensionWrench.style.background = gameState.tensionApplied ? '#666' : '#444'; + tensionWrench.textContent = `Tension: ${gameState.tensionApplied ? 'ON' : 'OFF'}`; + + // Drop pins if tension is released + if (!gameState.tensionApplied) { + gameState.pinStates.forEach((_, index) => { + if (gameState.pinStates[index] === 1) { // Only drop binding pins + gameState.pinStates[index] = 0; + updatePinVisual(index); + } + }); + } + }; + + // Create lock pins container + const pinsContainer = document.createElement('div'); + pinsContainer.style.cssText = ` + display: flex; + gap: 10px; + background: #333; + padding: 20px; + border-radius: 10px; + `; + + // Create individual pins + for (let i = 0; i < numPins; i++) { + const pin = document.createElement('div'); + pin.style.cssText = ` + width: 30px; + height: 100px; + background: #555; + border: 2px solid #777; + border-radius: 5px; + cursor: pointer; + position: relative; + `; + + // Add pin number + const pinNumber = document.createElement('div'); + pinNumber.style.cssText = ` + position: absolute; + top: -20px; + width: 100%; + text-align: center; + color: white; + `; + pinNumber.textContent = (i + 1).toString(); + pin.appendChild(pinNumber); + + pin.onmousedown = () => { + if (!gameState.tensionApplied) return; // Pins only move with tension + + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + if (i === bindingPin) { + gameState.pinStates[i] = 2; // Set + gameState.currentBindingIndex++; + pin.style.background = '#0f0'; // Green for set + + // Check win condition + if (gameState.currentBindingIndex >= numPins) { + setTimeout(() => { + unlockTarget(item, 'door', item.layer); + alert("Lock successfully picked!"); + document.body.removeChild(iframe); + scene.input.mouse.enabled = true; + }, 500); + } + } else { + gameState.pinStates[i] = 1; // Binding + pin.style.background = '#00f'; // Blue for binding + } + }; + + pin.onmouseup = () => { + if (gameState.pinStates[i] === 1) { // Only drop binding pins + gameState.pinStates[i] = 0; + pin.style.background = '#555'; + } + }; + + pinsContainer.appendChild(pin); + } + + function updatePinVisual(index) { + const pin = pinsContainer.children[index]; + switch (gameState.pinStates[index]) { + case 0: pin.style.background = '#555'; break; // Down + case 1: pin.style.background = '#00f'; break; // Binding + case 2: pin.style.background = '#0f0'; break; // Set + } + } + + // Add components to game container + gameContainer.appendChild(tensionWrench); + gameContainer.appendChild(pinsContainer); + + // ... rest of the existing code (close button, etc.) + // Assemble the interface iframe.appendChild(closeButton); iframe.appendChild(instructions); From 39b1c6f19b9ddd713d9a1089f1aaf5c9146ee260 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 13:21:26 +0000 Subject: [PATCH 20/46] Fixed errors from incorrect scene handling --- index.html | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/index.html b/index.html index 9ba9959..ed01033 100644 --- a/index.html +++ b/index.html @@ -1908,7 +1908,7 @@ if (hasLockpick) { if (confirm("Would you like to attempt picking this lock?")) { - startLockpickingMinigame(lockable, this); + startLockpickingMinigame(lockable, game.scene.scenes[0]); // Pass the main scene } } else { alert(`Requires key: ${requiredKey}`); @@ -3011,7 +3011,7 @@ scene.input.mouse.enabled = false; } - function startLockpickingMinigame(item, scene) { + function startLockpickingMinigame(lockable, currentScene) { // Create iframe container const iframe = document.createElement('div'); iframe.style.cssText = ` @@ -3078,7 +3078,9 @@ `; closeButton.onclick = () => { document.body.removeChild(iframe); - scene.input.mouse.enabled = true; + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } }; // Add pin binding order @@ -3134,6 +3136,15 @@ border-radius: 10px; `; + function updatePinVisual(index) { + const pin = pinsContainer.children[index]; + switch (gameState.pinStates[index]) { + case 0: pin.style.background = '#555'; break; // Down + case 1: pin.style.background = '#00f'; break; // Binding + case 2: pin.style.background = '#0f0'; break; // Set + } + } + // Create individual pins for (let i = 0; i < numPins; i++) { const pin = document.createElement('div'); @@ -3171,10 +3182,12 @@ // Check win condition if (gameState.currentBindingIndex >= numPins) { setTimeout(() => { - unlockTarget(item, 'door', item.layer); + unlockTarget(lockable, 'door', lockable.layer); alert("Lock successfully picked!"); document.body.removeChild(iframe); - scene.input.mouse.enabled = true; + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } }, 500); } } else { @@ -3193,21 +3206,10 @@ pinsContainer.appendChild(pin); } - function updatePinVisual(index) { - const pin = pinsContainer.children[index]; - switch (gameState.pinStates[index]) { - case 0: pin.style.background = '#555'; break; // Down - case 1: pin.style.background = '#00f'; break; // Binding - case 2: pin.style.background = '#0f0'; break; // Set - } - } - // Add components to game container gameContainer.appendChild(tensionWrench); gameContainer.appendChild(pinsContainer); - // ... rest of the existing code (close button, etc.) - // Assemble the interface iframe.appendChild(closeButton); iframe.appendChild(instructions); @@ -3215,7 +3217,9 @@ document.body.appendChild(iframe); // Disable game movement - scene.input.mouse.enabled = false; + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = false; + } } From 9352cba1272f55798ba2378b710052409cabe29b Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 13:39:58 +0000 Subject: [PATCH 21/46] Added a difficulty chooser, makes the pin mode hidden and adds a sound --- index.html | 65 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/index.html b/index.html index ed01033..30c20cf 100644 --- a/index.html +++ b/index.html @@ -3063,6 +3063,27 @@ padding: 10px; `; + // Add difficulty selection + const difficultySelect = document.createElement('select'); + difficultySelect.style.cssText = ` + margin-bottom: 10px; + padding: 5px; + background: #444; + color: white; + border: 1px solid #666; + border-radius: 3px; + `; + const difficulties = ['Easy - Pins Visible', 'Hard - Audio Only']; + difficulties.forEach(diff => { + const option = document.createElement('option'); + option.value = diff; + option.textContent = diff; + difficultySelect.appendChild(option); + }); + + // Add audio feedback + const clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); + // Add close button const closeButton = document.createElement('button'); closeButton.textContent = 'X'; @@ -3091,8 +3112,9 @@ // Track game state const gameState = { tensionApplied: false, - pinStates: Array(numPins).fill(0), // 0 = down, 1 = binding, 2 = set - currentBindingIndex: 0 + pinStates: Array(numPins).fill(0), + currentBindingIndex: 0, + hardMode: false }; // Create tension wrench toggle @@ -3138,10 +3160,12 @@ function updatePinVisual(index) { const pin = pinsContainer.children[index]; - switch (gameState.pinStates[index]) { - case 0: pin.style.background = '#555'; break; // Down - case 1: pin.style.background = '#00f'; break; // Binding - case 2: pin.style.background = '#0f0'; break; // Set + if (!gameState.hardMode) { + switch (gameState.pinStates[index]) { + case 0: pin.style.background = '#555'; break; // Down + case 1: pin.style.background = '#00f'; break; // Binding + case 2: pin.style.background = '#0f0'; break; // Set + } } } @@ -3171,15 +3195,21 @@ pin.appendChild(pinNumber); pin.onmousedown = () => { - if (!gameState.tensionApplied) return; // Pins only move with tension + if (!gameState.tensionApplied) return; const bindingPin = bindingOrder[gameState.currentBindingIndex]; if (i === bindingPin) { - gameState.pinStates[i] = 2; // Set + gameState.pinStates[i] = 2; gameState.currentBindingIndex++; - pin.style.background = '#0f0'; // Green for set - // Check win condition + // Play success click sound + clickSound.currentTime = 0; // Reset sound to start + clickSound.play().catch(e => console.log('Audio play failed:', e)); + + if (!gameState.hardMode) { + pin.style.background = '#0f0'; + } + if (gameState.currentBindingIndex >= numPins) { setTimeout(() => { unlockTarget(lockable, 'door', lockable.layer); @@ -3191,8 +3221,10 @@ }, 500); } } else { - gameState.pinStates[i] = 1; // Binding - pin.style.background = '#00f'; // Blue for binding + gameState.pinStates[i] = 1; + if (!gameState.hardMode) { + pin.style.background = '#00f'; + } } }; @@ -3206,7 +3238,16 @@ pinsContainer.appendChild(pin); } + difficultySelect.onchange = () => { + gameState.hardMode = difficultySelect.value.includes('Hard'); + // Update pin visibility + Array.from(pinsContainer.children).forEach(pin => { + pin.style.opacity = gameState.hardMode ? '0.1' : '1'; + }); + }; + // Add components to game container + gameContainer.appendChild(difficultySelect); gameContainer.appendChild(tensionWrench); gameContainer.appendChild(pinsContainer); From 9b180a84fd3a38412da68a067083f913f9ca2f34 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 13:54:23 +0000 Subject: [PATCH 22/46] Updated minigame to be more complex and intuitive --- index.html | 356 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 205 insertions(+), 151 deletions(-) diff --git a/index.html b/index.html index 30c20cf..7f016cd 100644 --- a/index.html +++ b/index.html @@ -3034,10 +3034,10 @@

Lock Picking

Toggle tension wrench and manipulate pins to unlock.
- 🔵 Blue = Pin ready to set
+ 🔵 Blue = Pin moving
🟢 Green = Pin set correctly
- 🔴 Red = Pin dropped
- Set all pins in the correct order. + 🔴 Red = Over-pushed (reset)
+ Set all pins in the correct order without resetting.

`; instructions.style.cssText = ` @@ -3082,7 +3082,208 @@ }); // Add audio feedback - const clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); + let clickSound = null; + const initAudio = () => { + if (!clickSound) { + clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); + } + }; + + // Initialize audio on first interaction + gameContainer.addEventListener('mousedown', initAudio, { once: true }); + + // Add pin binding order and game state + const numPins = 5; + const bindingOrder = Array.from({length: numPins}, (_, i) => i) + .sort(() => Math.random() - 0.5); + + const gameState = { + tensionApplied: false, + pinStates: Array(numPins).fill(0), // 0 = down, 1 = moving, 2 = set + pinPressTime: Array(numPins).fill(0), // Track how long each pin is pressed + currentBindingIndex: 0, + hardMode: false, + maxPressTime: 1000, // Max time to hold a pin (ms) + failCount: 0, + maxFails: 3 + }; + + // Create tension wrench toggle + const tensionWrench = document.createElement('div'); + tensionWrench.style.cssText = ` + width: 100px; + height: 30px; + background: ${gameState.tensionApplied ? '#666' : '#444'}; + border: 2px solid #888; + border-radius: 5px; + cursor: pointer; + margin-bottom: 20px; + text-align: center; + line-height: 30px; + color: white; + `; + tensionWrench.textContent = 'Tension: OFF'; + + // Function to reset pins + function resetPins(showVisual = true) { + gameState.pinStates.fill(0); + gameState.pinPressTime.fill(0); + gameState.currentBindingIndex = 0; + gameState.failCount++; + + if (showVisual) { + Array.from(pinsContainer.children).forEach(pin => { + pin.style.background = '#555'; + if (!gameState.hardMode) { + pin.style.transition = 'background-color 0.3s'; + pin.style.background = '#f00'; + setTimeout(() => pin.style.background = '#555', 300); + } + }); + } + + if (gameState.failCount >= gameState.maxFails) { + alert("Lock picking failed! The lock is now jammed."); + document.body.removeChild(iframe); + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } + } + } + + tensionWrench.onclick = () => { + gameState.tensionApplied = !gameState.tensionApplied; + tensionWrench.style.background = gameState.tensionApplied ? '#666' : '#444'; + tensionWrench.textContent = `Tension: ${gameState.tensionApplied ? 'ON' : 'OFF'}`; + if (!gameState.tensionApplied) resetPins(false); + }; + + // Create pins container + const pinsContainer = document.createElement('div'); + pinsContainer.style.cssText = ` + display: flex; + gap: 10px; + background: #333; + padding: 20px; + border-radius: 10px; + `; + + // Create individual pins + for (let i = 0; i < numPins; i++) { + const pin = document.createElement('div'); + pin.style.cssText = ` + width: 30px; + height: 100px; + background: #555; + border: 2px solid #777; + border-radius: 5px; + cursor: pointer; + position: relative; + transition: transform 0.1s; + `; + + const pinNumber = document.createElement('div'); + pinNumber.style.cssText = ` + position: absolute; + top: -20px; + width: 100%; + text-align: center; + color: white; + `; + pinNumber.textContent = (i + 1).toString(); + pin.appendChild(pinNumber); + + let pressStartTime = 0; + let pressTimer = null; + + function checkPinPress() { + if (pressStartTime === 0) return; + + const pressDuration = Date.now() - pressStartTime; + if (pressDuration > gameState.maxPressTime) { + resetPins(); + clearInterval(pressTimer); + pressTimer = null; + } + } + + pin.onmousedown = () => { + pressStartTime = Date.now(); + pressTimer = setInterval(checkPinPress, 100); + + pin.style.transform = 'translateY(-10px)'; + + if (gameState.tensionApplied) { + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + if (i === bindingPin) { + if (!gameState.hardMode) { + pin.style.background = '#00f'; + } + + // Start a timer to set the pin + setTimeout(() => { + if (pressStartTime !== 0) { // Still pressing + gameState.pinStates[i] = 2; + gameState.currentBindingIndex++; + + if (clickSound) { + clickSound.currentTime = 0; + clickSound.play().catch(e => console.log('Audio play failed:', e)); + } + + if (!gameState.hardMode) { + pin.style.background = '#0f0'; + } + + if (gameState.currentBindingIndex >= numPins) { + setTimeout(() => { + unlockTarget(lockable, 'door', lockable.layer); + alert("Lock successfully picked!"); + document.body.removeChild(iframe); + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } + }, 500); + } + } + }, 500); // Need to hold for 500ms to set + } else if (gameState.pinStates[i] !== 2) { + if (!gameState.hardMode) { + pin.style.background = '#00f'; + } + // Start counting towards potential reset + gameState.pinPressTime[i] = Date.now(); + } + } + }; + + pin.onmouseup = pin.onmouseleave = () => { + pressStartTime = 0; + if (pressTimer) { + clearInterval(pressTimer); + pressTimer = null; + } + + pin.style.transform = 'translateY(0)'; + if (!gameState.tensionApplied || gameState.pinStates[i] !== 2) { + pin.style.background = '#555'; + } + }; + + pinsContainer.appendChild(pin); + } + + difficultySelect.onchange = () => { + gameState.hardMode = difficultySelect.value.includes('Hard'); + Array.from(pinsContainer.children).forEach(pin => { + pin.style.opacity = gameState.hardMode ? '0.1' : '1'; + }); + }; + + // Add components to game container + gameContainer.appendChild(difficultySelect); + gameContainer.appendChild(tensionWrench); + gameContainer.appendChild(pinsContainer); // Add close button const closeButton = document.createElement('button'); @@ -3104,153 +3305,6 @@ } }; - // Add pin binding order - const numPins = 5; - const bindingOrder = Array.from({length: numPins}, (_, i) => i) - .sort(() => Math.random() - 0.5); // Randomize binding order - - // Track game state - const gameState = { - tensionApplied: false, - pinStates: Array(numPins).fill(0), - currentBindingIndex: 0, - hardMode: false - }; - - // Create tension wrench toggle - const tensionWrench = document.createElement('div'); - tensionWrench.style.cssText = ` - width: 100px; - height: 30px; - background: ${gameState.tensionApplied ? '#666' : '#444'}; - border: 2px solid #888; - border-radius: 5px; - cursor: pointer; - margin-bottom: 20px; - text-align: center; - line-height: 30px; - color: white; - `; - tensionWrench.textContent = 'Tension: OFF'; - tensionWrench.onclick = () => { - gameState.tensionApplied = !gameState.tensionApplied; - tensionWrench.style.background = gameState.tensionApplied ? '#666' : '#444'; - tensionWrench.textContent = `Tension: ${gameState.tensionApplied ? 'ON' : 'OFF'}`; - - // Drop pins if tension is released - if (!gameState.tensionApplied) { - gameState.pinStates.forEach((_, index) => { - if (gameState.pinStates[index] === 1) { // Only drop binding pins - gameState.pinStates[index] = 0; - updatePinVisual(index); - } - }); - } - }; - - // Create lock pins container - const pinsContainer = document.createElement('div'); - pinsContainer.style.cssText = ` - display: flex; - gap: 10px; - background: #333; - padding: 20px; - border-radius: 10px; - `; - - function updatePinVisual(index) { - const pin = pinsContainer.children[index]; - if (!gameState.hardMode) { - switch (gameState.pinStates[index]) { - case 0: pin.style.background = '#555'; break; // Down - case 1: pin.style.background = '#00f'; break; // Binding - case 2: pin.style.background = '#0f0'; break; // Set - } - } - } - - // Create individual pins - for (let i = 0; i < numPins; i++) { - const pin = document.createElement('div'); - pin.style.cssText = ` - width: 30px; - height: 100px; - background: #555; - border: 2px solid #777; - border-radius: 5px; - cursor: pointer; - position: relative; - `; - - // Add pin number - const pinNumber = document.createElement('div'); - pinNumber.style.cssText = ` - position: absolute; - top: -20px; - width: 100%; - text-align: center; - color: white; - `; - pinNumber.textContent = (i + 1).toString(); - pin.appendChild(pinNumber); - - pin.onmousedown = () => { - if (!gameState.tensionApplied) return; - - const bindingPin = bindingOrder[gameState.currentBindingIndex]; - if (i === bindingPin) { - gameState.pinStates[i] = 2; - gameState.currentBindingIndex++; - - // Play success click sound - clickSound.currentTime = 0; // Reset sound to start - clickSound.play().catch(e => console.log('Audio play failed:', e)); - - if (!gameState.hardMode) { - pin.style.background = '#0f0'; - } - - if (gameState.currentBindingIndex >= numPins) { - setTimeout(() => { - unlockTarget(lockable, 'door', lockable.layer); - alert("Lock successfully picked!"); - document.body.removeChild(iframe); - if (currentScene && currentScene.input && currentScene.input.mouse) { - currentScene.input.mouse.enabled = true; - } - }, 500); - } - } else { - gameState.pinStates[i] = 1; - if (!gameState.hardMode) { - pin.style.background = '#00f'; - } - } - }; - - pin.onmouseup = () => { - if (gameState.pinStates[i] === 1) { // Only drop binding pins - gameState.pinStates[i] = 0; - pin.style.background = '#555'; - } - }; - - pinsContainer.appendChild(pin); - } - - difficultySelect.onchange = () => { - gameState.hardMode = difficultySelect.value.includes('Hard'); - // Update pin visibility - Array.from(pinsContainer.children).forEach(pin => { - pin.style.opacity = gameState.hardMode ? '0.1' : '1'; - }); - }; - - // Add components to game container - gameContainer.appendChild(difficultySelect); - gameContainer.appendChild(tensionWrench); - gameContainer.appendChild(pinsContainer); - // Assemble the interface iframe.appendChild(closeButton); iframe.appendChild(instructions); From 3bb16882e400f2357f6049d78668db5de3b4235d Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 25 Feb 2025 14:21:02 +0000 Subject: [PATCH 23/46] Fixed win condition --- index.html | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index 7f016cd..cca179c 100644 --- a/index.html +++ b/index.html @@ -3235,16 +3235,7 @@ pin.style.background = '#0f0'; } - if (gameState.currentBindingIndex >= numPins) { - setTimeout(() => { - unlockTarget(lockable, 'door', lockable.layer); - alert("Lock successfully picked!"); - document.body.removeChild(iframe); - if (currentScene && currentScene.input && currentScene.input.mouse) { - currentScene.input.mouse.enabled = true; - } - }, 500); - } + checkWinCondition(); } }, 500); // Need to hold for 500ms to set } else if (gameState.pinStates[i] !== 2) { @@ -3315,6 +3306,22 @@ if (currentScene && currentScene.input && currentScene.input.mouse) { currentScene.input.mouse.enabled = false; } + + // Add this function before the pin creation loop + function checkWinCondition() { + if (gameState.currentBindingIndex >= numPins) { + setTimeout(() => { + unlockTarget(lockable, 'door', lockable.layer); + alert("Lock successfully picked!"); + document.body.removeChild(iframe); + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } + }, 500); + return true; + } + return false; + } } From b77577796bc1d8f4d96e42e6b0dfb1e1210d680f Mon Sep 17 00:00:00 2001 From: Damian-I Date: Wed, 26 Feb 2025 19:02:50 +0000 Subject: [PATCH 24/46] Added difficulty to scenario metadata for key locktypes --- assets/scenarios/ceo_exfil.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index 699754b..bf5be26 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -159,6 +159,7 @@ "locked": true, "lockType": "key", "requires": "ceo_office_key", + "difficulty": "easy", "objects": [ { "type": "pc", @@ -173,6 +174,7 @@ "locked": true, "lockType": "key", "requires": "briefcase_key", + "difficulty": "medium", "observations": "An expensive leather briefcase with a sturdy lock", "contents": [ { @@ -218,6 +220,7 @@ "locked": true, "lockType": "key", "requires": "safe_key", + "difficulty": "hard", "observations": "A well-hidden wall safe behind a painting", "contents": [ { From e1e01febfe709a27b3607ca0e9f34795d3fd9353 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Wed, 26 Feb 2025 19:26:42 +0000 Subject: [PATCH 25/46] Made amount of pins vary based on difficulty, removed delay after lockpicking --- index.html | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/index.html b/index.html index cca179c..98e8042 100644 --- a/index.html +++ b/index.html @@ -1908,7 +1908,21 @@ if (hasLockpick) { if (confirm("Would you like to attempt picking this lock?")) { - startLockpickingMinigame(lockable, game.scene.scenes[0]); // Pass the main scene + let difficulty; + + // If this is a room-level lock, get difficulty from gameScenario + if (lockable.properties?.requires) { + // Find which room this lock belongs to + const roomId = Object.keys(gameScenario.rooms).find(roomId => { + const room = gameScenario.rooms[roomId]; + return room.requires === lockable.properties.requires; + }); + difficulty = roomId ? gameScenario.rooms[roomId].difficulty : null; + } + + // If not found, try object-level difficulty + difficulty = difficulty || lockable.scenarioData?.difficulty || lockable.properties?.difficulty; + startLockpickingMinigame(lockable, game.scene.scenes[0], difficulty); } } else { alert(`Requires key: ${requiredKey}`); @@ -3011,7 +3025,7 @@ scene.input.mouse.enabled = false; } - function startLockpickingMinigame(lockable, currentScene) { + function startLockpickingMinigame(lockable, currentScene, difficulty) { // Create iframe container const iframe = document.createElement('div'); iframe.style.cssText = ` @@ -3093,7 +3107,7 @@ gameContainer.addEventListener('mousedown', initAudio, { once: true }); // Add pin binding order and game state - const numPins = 5; + const numPins = getPinCountForDifficulty(difficulty); const bindingOrder = Array.from({length: numPins}, (_, i) => i) .sort(() => Math.random() - 0.5); @@ -3310,20 +3324,32 @@ // Add this function before the pin creation loop function checkWinCondition() { if (gameState.currentBindingIndex >= numPins) { - setTimeout(() => { - unlockTarget(lockable, 'door', lockable.layer); - alert("Lock successfully picked!"); - document.body.removeChild(iframe); - if (currentScene && currentScene.input && currentScene.input.mouse) { - currentScene.input.mouse.enabled = true; - } - }, 500); + unlockTarget(lockable, 'door', lockable.layer); + alert("Lock successfully picked!"); + document.body.removeChild(iframe); + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } return true; } return false; } } + // Add this function to get pin count based on difficulty + function getPinCountForDifficulty(difficulty) { + switch(difficulty?.toLowerCase()) { + case 'easy': + return 3; + case 'medium': + return 5; + case 'hard': + return 7; + default: + return 5; // Default to medium difficulty + } + } + \ No newline at end of file From 97326b0f53c95b4ccf82d3fe08a368511e3ff47f Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 13:54:19 +0000 Subject: [PATCH 26/46] Fixed item unlock interaction with lockpick not retrieving contents of a container --- index.html | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 98e8042..e1b2422 100644 --- a/index.html +++ b/index.html @@ -1521,7 +1521,7 @@ return; } - // Check for locked state in scenarioData + // Check if item is locked if (data.locked === true) { console.log('Item is locked:', data); handleUnlock(sprite, 'item'); @@ -3099,7 +3099,7 @@ let clickSound = null; const initAudio = () => { if (!clickSound) { - clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); + clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vPz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); } }; @@ -3324,8 +3324,14 @@ // Add this function before the pin creation loop function checkWinCondition() { if (gameState.currentBindingIndex >= numPins) { + // Update the lockable object's state to be unlocked but not collected + if (lockable.scenarioData) { + lockable.scenarioData.locked = false; + lockable.scenarioData.isUnlockedButNotCollected = true; + } + unlockTarget(lockable, 'door', lockable.layer); - alert("Lock successfully picked!"); + alert("Lock successfully picked! You can now interact with it to collect the contents."); document.body.removeChild(iframe); if (currentScene && currentScene.input && currentScene.input.mouse) { currentScene.input.mouse.enabled = true; From ee215beeeb510d448ef1bdbb5267599b5dcae594 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 14:09:58 +0000 Subject: [PATCH 27/46] Improved lockpicking success handling for doors and containers --- index.html | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index e1b2422..a66a34b 100644 --- a/index.html +++ b/index.html @@ -3324,14 +3324,27 @@ // Add this function before the pin creation loop function checkWinCondition() { if (gameState.currentBindingIndex >= numPins) { - // Update the lockable object's state to be unlocked but not collected - if (lockable.scenarioData) { + console.log('Lock picked successfully:', lockable); + + // For doors, we need to check properties and handle differently + if (lockable && lockable.properties && lockable.properties.locked) { + console.log('Unlocking door tile:', lockable); + unlockDoor(lockable, lockable.layer); + alert("Lock successfully picked! The door is now unlocked."); + } + // For containers and other lockable items + else if (lockable.scenarioData) { + console.log('Unlocking container:', lockable.scenarioData); lockable.scenarioData.locked = false; - lockable.scenarioData.isUnlockedButNotCollected = true; + + if (lockable.scenarioData.contents) { + lockable.scenarioData.isUnlockedButNotCollected = true; + alert("Lock successfully picked! You can now interact with it to collect the contents."); + } else { + alert("Lock successfully picked!"); + } } - unlockTarget(lockable, 'door', lockable.layer); - alert("Lock successfully picked! You can now interact with it to collect the contents."); document.body.removeChild(iframe); if (currentScene && currentScene.input && currentScene.input.mouse) { currentScene.input.mouse.enabled = true; From 3111d3032404529318611547625227fa8db3decb Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 15:01:23 +0000 Subject: [PATCH 28/46] Enhanced lockpicking mechanics with tension levels and dynamic pin requirements (temporarily changed difficult of office door to hard for testing) --- assets/scenarios/ceo_exfil.json | 2 +- index.html | 317 +++++++++++++++++++++++++++++--- 2 files changed, 294 insertions(+), 25 deletions(-) diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index bf5be26..81ba64a 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -159,7 +159,7 @@ "locked": true, "lockType": "key", "requires": "ceo_office_key", - "difficulty": "easy", + "difficulty": "hard", "objects": [ { "type": "pc", diff --git a/index.html b/index.html index a66a34b..d36e487 100644 --- a/index.html +++ b/index.html @@ -3047,11 +3047,11 @@ instructions.innerHTML = `

Lock Picking

- Toggle tension wrench and manipulate pins to unlock.
+ Use spacebar or click to toggle tension levels. Each pin requires the right amount of tension.
🔵 Blue = Pin moving
🟢 Green = Pin set correctly
🔴 Red = Over-pushed (reset)
- Set all pins in the correct order without resetting. + Set all pins in the correct order with the right tension without resetting.

`; instructions.style.cssText = ` @@ -3158,7 +3158,11 @@ if (gameState.failCount >= gameState.maxFails) { alert("Lock picking failed! The lock is now jammed."); - document.body.removeChild(iframe); + // Safely remove iframe if it exists in the document + const existingIframe = document.querySelector('div[style*="z-index: 1000"]'); + if (existingIframe && existingIframe.parentNode) { + existingIframe.parentNode.removeChild(existingIframe); + } if (currentScene && currentScene.input && currentScene.input.mouse) { currentScene.input.mouse.enabled = true; } @@ -3166,12 +3170,38 @@ } tensionWrench.onclick = () => { - gameState.tensionApplied = !gameState.tensionApplied; - tensionWrench.style.background = gameState.tensionApplied ? '#666' : '#444'; - tensionWrench.textContent = `Tension: ${gameState.tensionApplied ? 'ON' : 'OFF'}`; - if (!gameState.tensionApplied) resetPins(false); + // Toggle tension levels (none -> light -> medium -> heavy -> none) + gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; + updateTensionWrench(); }; + // Add this new function to update tension wrench visuals + function updateTensionWrench() { + // Update tension wrench appearance based on level + switch(gameState.tensionLevel) { + case 0: // None + tensionWrench.style.background = '#444'; + tensionWrench.style.transform = 'rotate(0deg)'; + tensionWrench.textContent = 'Tension: NONE'; + break; + case 1: // Light + tensionWrench.style.background = '#666'; + tensionWrench.style.transform = 'rotate(2deg)'; + tensionWrench.textContent = 'Tension: LIGHT'; + break; + case 2: // Medium + tensionWrench.style.background = '#888'; + tensionWrench.style.transform = 'rotate(5deg)'; + tensionWrench.textContent = 'Tension: MEDIUM'; + break; + case 3: // Heavy + tensionWrench.style.background = '#aaa'; + tensionWrench.style.transform = 'rotate(8deg)'; + tensionWrench.textContent = 'Tension: HEAVY'; + break; + } + } + // Create pins container const pinsContainer = document.createElement('div'); pinsContainer.style.cssText = ` @@ -3215,9 +3245,10 @@ const pressDuration = Date.now() - pressStartTime; if (pressDuration > gameState.maxPressTime) { - resetPins(); + // Clear the timer first before calling resetPins clearInterval(pressTimer); pressTimer = null; + resetPins(); } } @@ -3227,9 +3258,19 @@ pin.style.transform = 'translateY(-10px)'; - if (gameState.tensionApplied) { - const bindingPin = bindingOrder[gameState.currentBindingIndex]; - if (i === bindingPin) { + // Each pin has different tension requirements + const pinIndex = Array.from(pinsContainer.children).indexOf(pin); + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + const needsHighTension = gameState.tensionSensitivity[pinIndex]; + + // Check if this is the current binding pin + if (pinIndex === bindingPin) { + // This pin needs the right tension level + const correctTension = needsHighTension ? + (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : // Needs medium/heavy + (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); // Needs light/medium + + if (correctTension && !gameState.overTensioned) { if (!gameState.hardMode) { pin.style.background = '#00f'; } @@ -3237,28 +3278,43 @@ // Start a timer to set the pin setTimeout(() => { if (pressStartTime !== 0) { // Still pressing - gameState.pinStates[i] = 2; - gameState.currentBindingIndex++; + // Double-check tension is still correct + const stillCorrectTension = needsHighTension ? + (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : + (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); - if (clickSound) { - clickSound.currentTime = 0; - clickSound.play().catch(e => console.log('Audio play failed:', e)); + if (stillCorrectTension && !gameState.overTensioned) { + gameState.pinStates[pinIndex] = 2; + gameState.currentBindingIndex++; + + if (clickSound) { + clickSound.currentTime = 0; + clickSound.play().catch(e => console.log('Audio play failed:', e)); + } + + if (!gameState.hardMode) { + pin.style.background = '#0f0'; + } + + checkWinCondition(); } - - if (!gameState.hardMode) { - pin.style.background = '#0f0'; - } - - checkWinCondition(); } }, 500); // Need to hold for 500ms to set - } else if (gameState.pinStates[i] !== 2) { + } else if (gameState.tensionLevel > 0) { + // Wrong tension but trying - give feedback if (!gameState.hardMode) { pin.style.background = '#00f'; } + // Start counting towards potential reset - gameState.pinPressTime[i] = Date.now(); + gameState.pinPressTime[pinIndex] = Date.now(); } + } else if (gameState.tensionLevel > 0 && gameState.pinStates[pinIndex] !== 2) { + if (!gameState.hardMode) { + pin.style.background = '#00f'; + } + // Start counting towards potential reset + gameState.pinPressTime[pinIndex] = Date.now(); } }; @@ -3353,6 +3409,219 @@ } return false; } + + // Add these to the gameState object (around line 3120) + gameState.tensionSensitivity = Array(numPins).fill(0).map(() => Math.random() < 0.3); + gameState.tensionLevel = 0; // 0 = none, 1 = light, 2 = medium, 3 = heavy + gameState.overTensioned = false; + + // Add keyboard controls for tension + document.addEventListener('keydown', function(event) { + // Only process if the lockpicking minigame is active + if (!document.querySelector('div[style*="z-index: 1000"]')) return; + + if (event.code === 'Space') { + event.preventDefault(); // Prevent page scrolling + + // Toggle tension levels (none -> light -> medium -> heavy -> none) + gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; + + // Update tension wrench visuals + updateTensionWrench(); + + // Check if we're over-tensioning + if (gameState.tensionLevel === 3) { + // 30% chance of over-tensioning with heavy pressure + if (Math.random() < 0.3) { + gameState.overTensioned = true; + tensionWrench.style.background = '#ff3333'; + tensionWrench.style.transform = 'rotate(15deg)'; + + setTimeout(() => { + alert("You applied too much tension and jammed the lock!"); + resetPins(); + }, 500); + } + } + } + }); + + // Add this to log tension debug info to the console + function logTensionDebugInfo() { + const tensionLevels = ['None', 'Light', 'Medium', 'Heavy']; + const tensionColors = ['#444', '#666', '#888', '#aaa']; + const tensionDebugTable = document.createElement('table'); + tensionDebugTable.style.cssText = ` + width: 100%; + border-collapse: collapse; + margin-top: 20px; + font-size: 12px; + `; + + const headerRow = document.createElement('tr'); + ['Pin', 'Binding Order', 'Tension Required', 'Current Tension'].forEach(headerText => { + const th = document.createElement('th'); + th.style.cssText = ` + background: #333; + color: white; + padding: 5px; + border: 1px solid #555; + `; + th.textContent = headerText; + headerRow.appendChild(th); + }); + tensionDebugTable.appendChild(headerRow); + + bindingOrder.forEach((pinIndex, order) => { + const row = document.createElement('tr'); + const pinNumber = document.createElement('td'); + pinNumber.style.cssText = ` + background: #444; + color: white; + padding: 5px; + border: 1px solid #555; + text-align: center; + `; + pinNumber.textContent = (pinIndex + 1).toString(); + row.appendChild(pinNumber); + + const bindingOrderCell = document.createElement('td'); + bindingOrderCell.style.cssText = ` + background: ${getColorForOrder(order)}; + color: white; + padding: 5px; + border: 1px solid #555; + text-align: center; + `; + bindingOrderCell.textContent = (order + 1).toString(); + row.appendChild(bindingOrderCell); + + const tensionRequired = gameState.tensionSensitivity[pinIndex] ? 'Medium/Heavy' : 'Light/Medium'; + const tensionRequiredCell = document.createElement('td'); + tensionRequiredCell.style.cssText = ` + background: #555; + color: white; + padding: 5px; + border: 1px solid #555; + text-align: center; + `; + tensionRequiredCell.textContent = tensionRequired; + row.appendChild(tensionRequiredCell); + + const currentTensionCell = document.createElement('td'); + currentTensionCell.style.cssText = ` + background: ${tensionColors[gameState.tensionLevel]}; + color: white; + padding: 5px; + border: 1px solid #555; + text-align: center; + `; + currentTensionCell.textContent = tensionLevels[gameState.tensionLevel]; + row.appendChild(currentTensionCell); + + tensionDebugTable.appendChild(row); + }); + + console.log('%cLockpicking Tension Debug:', 'font-weight: bold; font-size: 16px;'); + console.log(tensionDebugTable.outerHTML); + } + + // Call logTensionDebugInfo whenever tension changes + document.addEventListener('keydown', function(event) { + if (event.code === 'Space') { + logTensionDebugInfo(); + } + }); + + tensionWrench.onclick = () => { + // Toggle tension levels (none -> light -> medium -> heavy -> none) + gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; + updateTensionWrench(); + logTensionDebugInfo(); + }; + + function getColorForOrder(order) { + const colors = ['#ff0000', '#ff7700', '#ffff00', '#00ff00', '#0000ff', '#7700ff', '#ff00ff']; + return colors[order % colors.length]; + } + + // Replace the addTensionDebugDisplay function with this console logging version + function logTensionDebugInfo() { + // Log initial pin information + console.log("=== LOCKPICKING DEBUG INFO ==="); + console.log("Pin binding order and tension requirements:"); + + // Create a table for the console + const tableData = []; + + // First, create entries for each binding position + for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { + const pinIndex = bindingOrder[orderIndex]; + const needsHighTension = gameState.tensionSensitivity[pinIndex]; + const tensionNeeded = needsHighTension ? 'Medium/Heavy' : 'Light/Medium'; + + tableData.push({ + 'Binding Order': orderIndex + 1, + 'Pin #': pinIndex + 1, + 'Tension Required': tensionNeeded + }); + } + + console.table(tableData); + + // Update the updateTensionWrench function to log tension changes + const originalUpdateTensionWrench = updateTensionWrench; + updateTensionWrench = function() { + originalUpdateTensionWrench(); + + // Log the current tension level + let tensionText; + switch(gameState.tensionLevel) { + case 0: tensionText = "NONE"; break; + case 1: tensionText = "LIGHT"; break; + case 2: tensionText = "MEDIUM"; break; + case 3: tensionText = "HEAVY"; break; + } + console.log(`Current Tension: ${tensionText}`); + + // Log which pins can be set with current tension + const settablePins = []; + for (let i = 0; i < numPins; i++) { + const needsHighTension = gameState.tensionSensitivity[i]; + const correctTension = needsHighTension ? + (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : + (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); + + if (correctTension) { + settablePins.push(i + 1); + } + } + + if (settablePins.length > 0) { + console.log(`Pins that can be set with current tension: ${settablePins.join(', ')}`); + } else { + console.log('No pins can be set with current tension level'); + } + }; + + // Also log when pins are pressed + const originalPinOnMouseDown = pin.onmousedown; + pin.onmousedown = function() { + const pinIndex = Array.from(pinsContainer.children).indexOf(this); + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + const needsHighTension = gameState.tensionSensitivity[pinIndex]; + + console.log(`Pin ${pinIndex + 1} pressed`); + console.log(`Current binding pin: ${bindingPin + 1}`); + console.log(`This pin needs ${needsHighTension ? 'Medium/Heavy' : 'Light/Medium'} tension`); + + // Call the original handler + originalPinOnMouseDown.call(this); + }; + } + + // Call this function instead of addTensionDebugDisplay + logTensionDebugInfo(); } // Add this function to get pin count based on difficulty From bdad48286b9ea7cbb24256286dc93bcd03853b6d Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 15:21:02 +0000 Subject: [PATCH 29/46] Refactored lockpicking debug logging and pin interaction tracking --- index.html | 128 ++++++++++++++--------------------------------------- 1 file changed, 32 insertions(+), 96 deletions(-) diff --git a/index.html b/index.html index d36e487..bc73ec2 100644 --- a/index.html +++ b/index.html @@ -3331,6 +3331,18 @@ } }; + // Add this inside the pin creation loop, after setting up the original event handlers + // This adds logging to each pin's mousedown event + const originalPinOnMouseDown = pin.onmousedown; + pin.onmousedown = function() { + const pinIndex = Array.from(pinsContainer.children).indexOf(this); + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + const needsHighTension = gameState.tensionSensitivity[pinIndex]; + + // Call the original handler + originalPinOnMouseDown.call(this); + }; + pinsContainer.appendChild(pin); } @@ -3446,92 +3458,31 @@ } }); - // Add this to log tension debug info to the console + // Replace the logTensionDebugInfo function with this simplified version + // that only logs once at the beginning function logTensionDebugInfo() { - const tensionLevels = ['None', 'Light', 'Medium', 'Heavy']; - const tensionColors = ['#444', '#666', '#888', '#aaa']; - const tensionDebugTable = document.createElement('table'); - tensionDebugTable.style.cssText = ` - width: 100%; - border-collapse: collapse; - margin-top: 20px; - font-size: 12px; - `; + // Log initial pin information + console.log("=== LOCKPICKING DEBUG INFO ==="); + console.log("Pin binding order and tension requirements:"); - const headerRow = document.createElement('tr'); - ['Pin', 'Binding Order', 'Tension Required', 'Current Tension'].forEach(headerText => { - const th = document.createElement('th'); - th.style.cssText = ` - background: #333; - color: white; - padding: 5px; - border: 1px solid #555; - `; - th.textContent = headerText; - headerRow.appendChild(th); - }); - tensionDebugTable.appendChild(headerRow); + // Create a table for the console + const tableData = []; - bindingOrder.forEach((pinIndex, order) => { - const row = document.createElement('tr'); - const pinNumber = document.createElement('td'); - pinNumber.style.cssText = ` - background: #444; - color: white; - padding: 5px; - border: 1px solid #555; - text-align: center; - `; - pinNumber.textContent = (pinIndex + 1).toString(); - row.appendChild(pinNumber); + // First, create entries for each binding position + for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { + const pinIndex = bindingOrder[orderIndex]; + const needsHighTension = gameState.tensionSensitivity[pinIndex]; + const tensionNeeded = needsHighTension ? 'Medium/Heavy' : 'Light/Medium'; - const bindingOrderCell = document.createElement('td'); - bindingOrderCell.style.cssText = ` - background: ${getColorForOrder(order)}; - color: white; - padding: 5px; - border: 1px solid #555; - text-align: center; - `; - bindingOrderCell.textContent = (order + 1).toString(); - row.appendChild(bindingOrderCell); - - const tensionRequired = gameState.tensionSensitivity[pinIndex] ? 'Medium/Heavy' : 'Light/Medium'; - const tensionRequiredCell = document.createElement('td'); - tensionRequiredCell.style.cssText = ` - background: #555; - color: white; - padding: 5px; - border: 1px solid #555; - text-align: center; - `; - tensionRequiredCell.textContent = tensionRequired; - row.appendChild(tensionRequiredCell); - - const currentTensionCell = document.createElement('td'); - currentTensionCell.style.cssText = ` - background: ${tensionColors[gameState.tensionLevel]}; - color: white; - padding: 5px; - border: 1px solid #555; - text-align: center; - `; - currentTensionCell.textContent = tensionLevels[gameState.tensionLevel]; - row.appendChild(currentTensionCell); - - tensionDebugTable.appendChild(row); - }); - - console.log('%cLockpicking Tension Debug:', 'font-weight: bold; font-size: 16px;'); - console.log(tensionDebugTable.outerHTML); - } - - // Call logTensionDebugInfo whenever tension changes - document.addEventListener('keydown', function(event) { - if (event.code === 'Space') { - logTensionDebugInfo(); + tableData.push({ + 'Binding Order': orderIndex + 1, + 'Pin #': pinIndex + 1, + 'Tension Required': tensionNeeded + }); } - }); + + console.table(tableData); + } tensionWrench.onclick = () => { // Toggle tension levels (none -> light -> medium -> heavy -> none) @@ -3603,21 +3554,6 @@ console.log('No pins can be set with current tension level'); } }; - - // Also log when pins are pressed - const originalPinOnMouseDown = pin.onmousedown; - pin.onmousedown = function() { - const pinIndex = Array.from(pinsContainer.children).indexOf(this); - const bindingPin = bindingOrder[gameState.currentBindingIndex]; - const needsHighTension = gameState.tensionSensitivity[pinIndex]; - - console.log(`Pin ${pinIndex + 1} pressed`); - console.log(`Current binding pin: ${bindingPin + 1}`); - console.log(`This pin needs ${needsHighTension ? 'Medium/Heavy' : 'Light/Medium'} tension`); - - // Call the original handler - originalPinOnMouseDown.call(this); - }; } // Call this function instead of addTensionDebugDisplay From 55461f6bcfdd29a909eef686b7d652dc7b604366 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 15:33:52 +0000 Subject: [PATCH 30/46] Refined tension mechanics with more precise pin tension requirements and over-tensioning risk --- index.html | 102 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 37 deletions(-) diff --git a/index.html b/index.html index bc73ec2..94140f6 100644 --- a/index.html +++ b/index.html @@ -3173,6 +3173,21 @@ // Toggle tension levels (none -> light -> medium -> heavy -> none) gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; updateTensionWrench(); + + // Check if we're over-tensioning - but only if we've started interacting with pins + if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { + // 30% chance of over-tensioning with heavy pressure + if (Math.random() < 0.3) { + gameState.overTensioned = true; + tensionWrench.style.background = '#ff3333'; + tensionWrench.style.transform = 'rotate(15deg)'; + + setTimeout(() => { + alert("You applied too much tension and jammed the lock!"); + resetPins(); + }, 500); + } + } }; // Add this new function to update tension wrench visuals @@ -3261,14 +3276,12 @@ // Each pin has different tension requirements const pinIndex = Array.from(pinsContainer.children).indexOf(pin); const bindingPin = bindingOrder[gameState.currentBindingIndex]; - const needsHighTension = gameState.tensionSensitivity[pinIndex]; + const requiredTension = gameState.tensionRequirements[pinIndex]; // Check if this is the current binding pin if (pinIndex === bindingPin) { - // This pin needs the right tension level - const correctTension = needsHighTension ? - (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : // Needs medium/heavy - (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); // Needs light/medium + // This pin needs exactly the right tension level + const correctTension = (gameState.tensionLevel === requiredTension); if (correctTension && !gameState.overTensioned) { if (!gameState.hardMode) { @@ -3279,9 +3292,7 @@ setTimeout(() => { if (pressStartTime !== 0) { // Still pressing // Double-check tension is still correct - const stillCorrectTension = needsHighTension ? - (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : - (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); + const stillCorrectTension = (gameState.tensionLevel === requiredTension); if (stillCorrectTension && !gameState.overTensioned) { gameState.pinStates[pinIndex] = 2; @@ -3337,7 +3348,7 @@ pin.onmousedown = function() { const pinIndex = Array.from(pinsContainer.children).indexOf(this); const bindingPin = bindingOrder[gameState.currentBindingIndex]; - const needsHighTension = gameState.tensionSensitivity[pinIndex]; + const requiredTension = gameState.tensionRequirements[pinIndex]; // Call the original handler originalPinOnMouseDown.call(this); @@ -3423,7 +3434,14 @@ } // Add these to the gameState object (around line 3120) - gameState.tensionSensitivity = Array(numPins).fill(0).map(() => Math.random() < 0.3); + gameState.tensionRequirements = Array(numPins).fill(0).map(() => { + // Each pin requires a specific tension level (1, 2, or 3) + // 0 = no tension (not used), 1 = light, 2 = medium, 3 = heavy + const randomValue = Math.random(); + if (randomValue < 0.33) return 1; // Light tension + if (randomValue < 0.66) return 2; // Medium tension + return 3; // Heavy tension + }); gameState.tensionLevel = 0; // 0 = none, 1 = light, 2 = medium, 3 = heavy gameState.overTensioned = false; @@ -3441,8 +3459,8 @@ // Update tension wrench visuals updateTensionWrench(); - // Check if we're over-tensioning - if (gameState.tensionLevel === 3) { + // Check if we're over-tensioning - but only if we've started interacting with pins + if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { // 30% chance of over-tensioning with heavy pressure if (Math.random() < 0.3) { gameState.overTensioned = true; @@ -3471,8 +3489,15 @@ // First, create entries for each binding position for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { const pinIndex = bindingOrder[orderIndex]; - const needsHighTension = gameState.tensionSensitivity[pinIndex]; - const tensionNeeded = needsHighTension ? 'Medium/Heavy' : 'Light/Medium'; + const requiredTension = gameState.tensionRequirements[pinIndex]; + let tensionNeeded; + + switch(requiredTension) { + case 1: tensionNeeded = 'Light'; break; + case 2: tensionNeeded = 'Medium'; break; + case 3: tensionNeeded = 'Heavy'; break; + default: tensionNeeded = 'Unknown'; + } tableData.push({ 'Binding Order': orderIndex + 1, @@ -3488,7 +3513,21 @@ // Toggle tension levels (none -> light -> medium -> heavy -> none) gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; updateTensionWrench(); - logTensionDebugInfo(); + + // Check if we're over-tensioning - but only if we've started interacting with pins + if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { + // 30% chance of over-tensioning with heavy pressure + if (Math.random() < 0.3) { + gameState.overTensioned = true; + tensionWrench.style.background = '#ff3333'; + tensionWrench.style.transform = 'rotate(15deg)'; + + setTimeout(() => { + alert("You applied too much tension and jammed the lock!"); + resetPins(); + }, 500); + } + } }; function getColorForOrder(order) { @@ -3508,8 +3547,15 @@ // First, create entries for each binding position for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { const pinIndex = bindingOrder[orderIndex]; - const needsHighTension = gameState.tensionSensitivity[pinIndex]; - const tensionNeeded = needsHighTension ? 'Medium/Heavy' : 'Light/Medium'; + const requiredTension = gameState.tensionRequirements[pinIndex]; + let tensionNeeded; + + switch(requiredTension) { + case 1: tensionNeeded = 'Light'; break; + case 2: tensionNeeded = 'Medium'; break; + case 3: tensionNeeded = 'Heavy'; break; + default: tensionNeeded = 'Unknown'; + } tableData.push({ 'Binding Order': orderIndex + 1, @@ -3525,34 +3571,16 @@ updateTensionWrench = function() { originalUpdateTensionWrench(); - // Log the current tension level - let tensionText; - switch(gameState.tensionLevel) { - case 0: tensionText = "NONE"; break; - case 1: tensionText = "LIGHT"; break; - case 2: tensionText = "MEDIUM"; break; - case 3: tensionText = "HEAVY"; break; - } - console.log(`Current Tension: ${tensionText}`); - // Log which pins can be set with current tension const settablePins = []; for (let i = 0; i < numPins; i++) { - const needsHighTension = gameState.tensionSensitivity[i]; - const correctTension = needsHighTension ? - (gameState.tensionLevel === 2 || gameState.tensionLevel === 3) : - (gameState.tensionLevel === 1 || gameState.tensionLevel === 2); + const requiredTension = gameState.tensionRequirements[i]; + const correctTension = (gameState.tensionLevel === requiredTension); if (correctTension) { settablePins.push(i + 1); } } - - if (settablePins.length > 0) { - console.log(`Pins that can be set with current tension: ${settablePins.join(', ')}`); - } else { - console.log('No pins can be set with current tension level'); - } }; } From fbb41359d9ab9225530138a7cc86b61272fb18ce Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 15:44:19 +0000 Subject: [PATCH 31/46] Simplified tension mechanics, refactoring code --- index.html | 138 ++++++++--------------------------------------------- 1 file changed, 19 insertions(+), 119 deletions(-) diff --git a/index.html b/index.html index 94140f6..6b05e35 100644 --- a/index.html +++ b/index.html @@ -3112,14 +3112,22 @@ .sort(() => Math.random() - 0.5); const gameState = { - tensionApplied: false, + tensionLevel: 0, pinStates: Array(numPins).fill(0), // 0 = down, 1 = moving, 2 = set pinPressTime: Array(numPins).fill(0), // Track how long each pin is pressed currentBindingIndex: 0, hardMode: false, maxPressTime: 1000, // Max time to hold a pin (ms) failCount: 0, - maxFails: 3 + maxFails: 3, + overTensioned: false, + tensionRequirements: Array(numPins).fill(0).map(() => { + // Each pin requires a specific tension level (1, 2, or 3) + const randomValue = Math.random(); + if (randomValue < 0.33) return 1; // Light tension + if (randomValue < 0.66) return 2; // Medium tension + return 3; // Heavy tension + }) }; // Create tension wrench toggle @@ -3127,7 +3135,7 @@ tensionWrench.style.cssText = ` width: 100px; height: 30px; - background: ${gameState.tensionApplied ? '#666' : '#444'}; + background: ${gameState.tensionLevel === 0 ? '#444' : gameState.tensionLevel === 1 ? '#666' : gameState.tensionLevel === 2 ? '#888' : '#aaa'}; border: 2px solid #888; border-radius: 5px; cursor: pointer; @@ -3169,7 +3177,8 @@ } } - tensionWrench.onclick = () => { + // Create a single function for toggling tension + function toggleTension() { // Toggle tension levels (none -> light -> medium -> heavy -> none) gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; updateTensionWrench(); @@ -3188,7 +3197,7 @@ }, 500); } } - }; + } // Add this new function to update tension wrench visuals function updateTensionWrench() { @@ -3337,7 +3346,7 @@ } pin.style.transform = 'translateY(0)'; - if (!gameState.tensionApplied || gameState.pinStates[i] !== 2) { + if (gameState.pinStates[i] !== 2) { pin.style.background = '#555'; } }; @@ -3433,60 +3442,26 @@ return false; } - // Add these to the gameState object (around line 3120) - gameState.tensionRequirements = Array(numPins).fill(0).map(() => { - // Each pin requires a specific tension level (1, 2, or 3) - // 0 = no tension (not used), 1 = light, 2 = medium, 3 = heavy - const randomValue = Math.random(); - if (randomValue < 0.33) return 1; // Light tension - if (randomValue < 0.66) return 2; // Medium tension - return 3; // Heavy tension - }); - gameState.tensionLevel = 0; // 0 = none, 1 = light, 2 = medium, 3 = heavy - gameState.overTensioned = false; + // Use the toggleTension function for both click and keyboard events + tensionWrench.onclick = toggleTension; - // Add keyboard controls for tension document.addEventListener('keydown', function(event) { // Only process if the lockpicking minigame is active if (!document.querySelector('div[style*="z-index: 1000"]')) return; if (event.code === 'Space') { event.preventDefault(); // Prevent page scrolling - - // Toggle tension levels (none -> light -> medium -> heavy -> none) - gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; - - // Update tension wrench visuals - updateTensionWrench(); - - // Check if we're over-tensioning - but only if we've started interacting with pins - if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { - // 30% chance of over-tensioning with heavy pressure - if (Math.random() < 0.3) { - gameState.overTensioned = true; - tensionWrench.style.background = '#ff3333'; - tensionWrench.style.transform = 'rotate(15deg)'; - - setTimeout(() => { - alert("You applied too much tension and jammed the lock!"); - resetPins(); - }, 500); - } - } + toggleTension(); } }); - // Replace the logTensionDebugInfo function with this simplified version - // that only logs once at the beginning + // Keep only the table debug function function logTensionDebugInfo() { - // Log initial pin information console.log("=== LOCKPICKING DEBUG INFO ==="); console.log("Pin binding order and tension requirements:"); - // Create a table for the console const tableData = []; - // First, create entries for each binding position for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { const pinIndex = bindingOrder[orderIndex]; const requiredTension = gameState.tensionRequirements[pinIndex]; @@ -3509,81 +3484,6 @@ console.table(tableData); } - tensionWrench.onclick = () => { - // Toggle tension levels (none -> light -> medium -> heavy -> none) - gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; - updateTensionWrench(); - - // Check if we're over-tensioning - but only if we've started interacting with pins - if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { - // 30% chance of over-tensioning with heavy pressure - if (Math.random() < 0.3) { - gameState.overTensioned = true; - tensionWrench.style.background = '#ff3333'; - tensionWrench.style.transform = 'rotate(15deg)'; - - setTimeout(() => { - alert("You applied too much tension and jammed the lock!"); - resetPins(); - }, 500); - } - } - }; - - function getColorForOrder(order) { - const colors = ['#ff0000', '#ff7700', '#ffff00', '#00ff00', '#0000ff', '#7700ff', '#ff00ff']; - return colors[order % colors.length]; - } - - // Replace the addTensionDebugDisplay function with this console logging version - function logTensionDebugInfo() { - // Log initial pin information - console.log("=== LOCKPICKING DEBUG INFO ==="); - console.log("Pin binding order and tension requirements:"); - - // Create a table for the console - const tableData = []; - - // First, create entries for each binding position - for (let orderIndex = 0; orderIndex < numPins; orderIndex++) { - const pinIndex = bindingOrder[orderIndex]; - const requiredTension = gameState.tensionRequirements[pinIndex]; - let tensionNeeded; - - switch(requiredTension) { - case 1: tensionNeeded = 'Light'; break; - case 2: tensionNeeded = 'Medium'; break; - case 3: tensionNeeded = 'Heavy'; break; - default: tensionNeeded = 'Unknown'; - } - - tableData.push({ - 'Binding Order': orderIndex + 1, - 'Pin #': pinIndex + 1, - 'Tension Required': tensionNeeded - }); - } - - console.table(tableData); - - // Update the updateTensionWrench function to log tension changes - const originalUpdateTensionWrench = updateTensionWrench; - updateTensionWrench = function() { - originalUpdateTensionWrench(); - - // Log which pins can be set with current tension - const settablePins = []; - for (let i = 0; i < numPins; i++) { - const requiredTension = gameState.tensionRequirements[i]; - const correctTension = (gameState.tensionLevel === requiredTension); - - if (correctTension) { - settablePins.push(i + 1); - } - } - }; - } - // Call this function instead of addTensionDebugDisplay logTensionDebugInfo(); } From d3c4f6ed1c39ca117f187a440d9309a33e6ff786 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 15:47:24 +0000 Subject: [PATCH 32/46] Adjusted tension mechanics to start at light tension and remove 'no tension' state --- index.html | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/index.html b/index.html index 6b05e35..c94425f 100644 --- a/index.html +++ b/index.html @@ -3112,7 +3112,7 @@ .sort(() => Math.random() - 0.5); const gameState = { - tensionLevel: 0, + tensionLevel: 1, // Start with light tension instead of none pinStates: Array(numPins).fill(0), // 0 = down, 1 = moving, 2 = set pinPressTime: Array(numPins).fill(0), // Track how long each pin is pressed currentBindingIndex: 0, @@ -3135,7 +3135,7 @@ tensionWrench.style.cssText = ` width: 100px; height: 30px; - background: ${gameState.tensionLevel === 0 ? '#444' : gameState.tensionLevel === 1 ? '#666' : gameState.tensionLevel === 2 ? '#888' : '#aaa'}; + background: ${gameState.tensionLevel === 1 ? '#666' : gameState.tensionLevel === 2 ? '#888' : '#aaa'}; border: 2px solid #888; border-radius: 5px; cursor: pointer; @@ -3179,8 +3179,8 @@ // Create a single function for toggling tension function toggleTension() { - // Toggle tension levels (none -> light -> medium -> heavy -> none) - gameState.tensionLevel = (gameState.tensionLevel + 1) % 4; + // Toggle between 3 tension levels (light -> medium -> heavy -> light) + gameState.tensionLevel = (gameState.tensionLevel % 3) + 1; updateTensionWrench(); // Check if we're over-tensioning - but only if we've started interacting with pins @@ -3203,11 +3203,6 @@ function updateTensionWrench() { // Update tension wrench appearance based on level switch(gameState.tensionLevel) { - case 0: // None - tensionWrench.style.background = '#444'; - tensionWrench.style.transform = 'rotate(0deg)'; - tensionWrench.textContent = 'Tension: NONE'; - break; case 1: // Light tensionWrench.style.background = '#666'; tensionWrench.style.transform = 'rotate(2deg)'; From 6a184ceb64192b6473e9b656226d227d01abbc76 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 16:20:05 +0000 Subject: [PATCH 33/46] fixed overtensioning bug when not interacting with a pin --- index.html | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index c94425f..f25443f 100644 --- a/index.html +++ b/index.html @@ -3121,6 +3121,8 @@ failCount: 0, maxFails: 3, overTensioned: false, + lastPinSetTime: 0, // Track when the last pin was set + isActivelyPickingPin: false, // Track if we're actively working on a pin tensionRequirements: Array(numPins).fill(0).map(() => { // Each pin requires a specific tension level (1, 2, or 3) const randomValue = Math.random(); @@ -3180,11 +3182,21 @@ // Create a single function for toggling tension function toggleTension() { // Toggle between 3 tension levels (light -> medium -> heavy -> light) + const previousTensionLevel = gameState.tensionLevel; gameState.tensionLevel = (gameState.tensionLevel % 3) + 1; + updateTensionWrench(); // Check if we're over-tensioning - but only if we've started interacting with pins - if (gameState.tensionLevel === 3 && gameState.currentBindingIndex > 0) { + // AND only if we're actively working on a pin (not just changing tension) + const timeSinceLastPinSet = Date.now() - gameState.lastPinSetTime; + const isActivelyPickingLock = gameState.isActivelyPickingPin; + + if (gameState.tensionLevel === 3 && + gameState.currentBindingIndex > 0 && + timeSinceLastPinSet > 1000 && + isActivelyPickingLock) { + // 30% chance of over-tensioning with heavy pressure if (Math.random() < 0.3) { gameState.overTensioned = true; @@ -3272,13 +3284,22 @@ } pin.onmousedown = () => { + // First check if this pin is already set + const pinIndex = Array.from(pinsContainer.children).indexOf(pin); + if (gameState.pinStates[pinIndex] === 2) { + // Pin is already set, don't allow interaction + return; + } + + // Set the flag to indicate we're actively picking a pin + gameState.isActivelyPickingPin = true; + pressStartTime = Date.now(); pressTimer = setInterval(checkPinPress, 100); pin.style.transform = 'translateY(-10px)'; // Each pin has different tension requirements - const pinIndex = Array.from(pinsContainer.children).indexOf(pin); const bindingPin = bindingOrder[gameState.currentBindingIndex]; const requiredTension = gameState.tensionRequirements[pinIndex]; @@ -3301,11 +3322,7 @@ if (stillCorrectTension && !gameState.overTensioned) { gameState.pinStates[pinIndex] = 2; gameState.currentBindingIndex++; - - if (clickSound) { - clickSound.currentTime = 0; - clickSound.play().catch(e => console.log('Audio play failed:', e)); - } + gameState.lastPinSetTime = Date.now(); // Record when this pin was set if (!gameState.hardMode) { pin.style.background = '#0f0'; @@ -3334,6 +3351,9 @@ }; pin.onmouseup = pin.onmouseleave = () => { + // Clear the flag to indicate we're no longer actively picking a pin + gameState.isActivelyPickingPin = false; + pressStartTime = 0; if (pressTimer) { clearInterval(pressTimer); From ef7f0c6250f53cd0b05c867de02619bc496fdc2c Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 16:33:43 +0000 Subject: [PATCH 34/46] Added indicators to pins to reduce amount of combinations the player would have to blindly make --- assets/scenarios/ceo_exfil.json | 2 +- index.html | 137 ++++++++++++++++++++++++++++---- 2 files changed, 123 insertions(+), 16 deletions(-) diff --git a/assets/scenarios/ceo_exfil.json b/assets/scenarios/ceo_exfil.json index 81ba64a..bf5be26 100644 --- a/assets/scenarios/ceo_exfil.json +++ b/assets/scenarios/ceo_exfil.json @@ -159,7 +159,7 @@ "locked": true, "lockType": "key", "requires": "ceo_office_key", - "difficulty": "hard", + "difficulty": "easy", "objects": [ { "type": "pc", diff --git a/index.html b/index.html index f25443f..7339822 100644 --- a/index.html +++ b/index.html @@ -3254,9 +3254,22 @@ border-radius: 5px; cursor: pointer; position: relative; - transition: transform 0.1s; + transition: transform 0.1s, background-color 0.3s; `; + // Add a subtle indicator at the bottom of each pin + const pinIndicator = document.createElement('div'); + pinIndicator.style.cssText = ` + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 5px; + background: #555; + transition: background-color 0.3s; + `; + pin.appendChild(pinIndicator); + const pinNumber = document.createElement('div'); pinNumber.style.cssText = ` position: absolute; @@ -3268,6 +3281,106 @@ pinNumber.textContent = (i + 1).toString(); pin.appendChild(pinNumber); + // Function to update pin appearance based on its state and binding status + function updatePinAppearance() { + // Reset to default first + pin.style.background = '#555'; + pinIndicator.style.background = '#555'; + + // If the pin is set, show it as green + if (gameState.pinStates[i] === 2) { + pin.style.background = '#0f0'; + pin.style.cursor = 'default'; + pinIndicator.style.background = '#0f0'; + return; + } + + // Get the current binding pin + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + + // If this is the current binding pin, give a subtle hint based on difficulty + if (i === bindingPin) { + // For easy difficulty, make the binding pin more obvious + if (difficulty === 'easy') { + pinIndicator.style.background = '#ff9900'; // Orange indicator for binding pin + + // Also show the required tension level with a color hint + const requiredTension = gameState.tensionRequirements[i]; + if (requiredTension === 1) { + pin.style.borderColor = '#66ccff'; // Light blue for light tension + } else if (requiredTension === 2) { + pin.style.borderColor = '#9966ff'; // Purple for medium tension + } else { + pin.style.borderColor = '#ff6666'; // Red for heavy tension + } + } + // For medium difficulty, just show which pin is binding + else if (difficulty === 'medium') { + pinIndicator.style.background = '#ff9900'; // Orange indicator for binding pin + } + // For hard difficulty, no visual indicators + } + + // If we've set at least one pin, provide a subtle hint about the next binding pin + // but only for easy and medium difficulties + if (gameState.currentBindingIndex > 0 && !gameState.hardMode) { + // Make pins slightly "wiggle" based on how close they are to being the binding pin + const distanceFromBinding = Math.abs(i - bindingPin); + + if (distanceFromBinding === 0 && difficulty !== 'hard') { + // This is the binding pin, add a subtle animation + pin.style.animation = 'pinWiggle 2s infinite'; + } else if (distanceFromBinding <= 2 && difficulty === 'easy') { + // Close to binding pin, add a very subtle hint for easy difficulty + pin.style.animation = 'pinWiggle 4s infinite'; + } + } + } + + // Add the wiggle animation to the document + if (!document.getElementById('pinWiggleAnimation')) { + const style = document.createElement('style'); + style.id = 'pinWiggleAnimation'; + style.textContent = ` + @keyframes pinWiggle { + 0% { transform: translateY(0); } + 25% { transform: translateY(-2px); } + 50% { transform: translateY(0); } + 75% { transform: translateY(-1px); } + 100% { transform: translateY(0); } + } + `; + document.head.appendChild(style); + } + + // Update all pins whenever a pin state changes + function updateAllPins() { + Array.from(pinsContainer.children).forEach((pin, index) => { + // Find the indicator within this pin + const indicator = pin.querySelector('div:first-child'); + + // Update based on current game state + if (gameState.pinStates[index] === 2) { + pin.style.background = '#0f0'; + pin.style.cursor = 'default'; + if (indicator) indicator.style.background = '#0f0'; + } else { + pin.style.background = '#555'; + pin.style.cursor = 'pointer'; + if (indicator) indicator.style.background = '#555'; + + // Check if this is the binding pin + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + if (index === bindingPin && !gameState.hardMode) { + if (indicator) indicator.style.background = '#ff9900'; + } + } + }); + } + + // Call updatePinAppearance initially and whenever the game state changes + updatePinAppearance(); + let pressStartTime = 0; let pressTimer = null; @@ -3322,16 +3435,20 @@ if (stillCorrectTension && !gameState.overTensioned) { gameState.pinStates[pinIndex] = 2; gameState.currentBindingIndex++; - gameState.lastPinSetTime = Date.now(); // Record when this pin was set + gameState.lastPinSetTime = Date.now(); if (!gameState.hardMode) { pin.style.background = '#0f0'; + pinIndicator.style.background = '#0f0'; } + // Update all pins to show new binding state + updateAllPins(); + checkWinCondition(); } } - }, 500); // Need to hold for 500ms to set + }, 500); } else if (gameState.tensionLevel > 0) { // Wrong tension but trying - give feedback if (!gameState.hardMode) { @@ -3363,21 +3480,11 @@ pin.style.transform = 'translateY(0)'; if (gameState.pinStates[i] !== 2) { pin.style.background = '#555'; + // Update appearance to show binding status + updatePinAppearance(); } }; - // Add this inside the pin creation loop, after setting up the original event handlers - // This adds logging to each pin's mousedown event - const originalPinOnMouseDown = pin.onmousedown; - pin.onmousedown = function() { - const pinIndex = Array.from(pinsContainer.children).indexOf(this); - const bindingPin = bindingOrder[gameState.currentBindingIndex]; - const requiredTension = gameState.tensionRequirements[pinIndex]; - - // Call the original handler - originalPinOnMouseDown.call(this); - }; - pinsContainer.appendChild(pin); } From 7d7920ef60a8045acef480fadee208b095031e40 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 16:43:04 +0000 Subject: [PATCH 35/46] Enhanced pin feedback with dynamic red herring and difficulty-based visual hints (removed red herrings for easy) --- index.html | 138 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 116 insertions(+), 22 deletions(-) diff --git a/index.html b/index.html index 7339822..ee08393 100644 --- a/index.html +++ b/index.html @@ -3286,6 +3286,8 @@ // Reset to default first pin.style.background = '#555'; pinIndicator.style.background = '#555'; + pin.style.animation = ''; + pin.style.borderColor = '#777'; // If the pin is set, show it as green if (gameState.pinStates[i] === 2) { @@ -3298,6 +3300,17 @@ // Get the current binding pin const bindingPin = bindingOrder[gameState.currentBindingIndex]; + // Generate consistent red herrings based on the current binding index + // This ensures the same pins are highlighted as red herrings until the next pin is set + const redHerringSeeds = [ + (bindingPin * 3 + 7) % numPins, + (bindingPin * 5 + 3) % numPins + ]; + + // Filter out the binding pin and already set pins from red herrings + const redHerrings = redHerringSeeds.filter(index => + index !== bindingPin && gameState.pinStates[index] !== 2); + // If this is the current binding pin, give a subtle hint based on difficulty if (i === bindingPin) { // For easy difficulty, make the binding pin more obvious @@ -3313,26 +3326,46 @@ } else { pin.style.borderColor = '#ff6666'; // Red for heavy tension } + + // Add a subtle animation + pin.style.animation = 'pinWiggle 2s infinite'; } - // For medium difficulty, just show which pin is binding + // For medium difficulty, just show which pin is binding with less obvious cues else if (difficulty === 'medium') { pinIndicator.style.background = '#ff9900'; // Orange indicator for binding pin + pin.style.animation = 'pinWiggle 3s infinite'; + } + // For hard difficulty, very subtle indication + else if (difficulty === 'hard') { + pin.style.animation = 'pinWiggle 4s infinite 0.5s'; } - // For hard difficulty, no visual indicators } - - // If we've set at least one pin, provide a subtle hint about the next binding pin - // but only for easy and medium difficulties - if (gameState.currentBindingIndex > 0 && !gameState.hardMode) { - // Make pins slightly "wiggle" based on how close they are to being the binding pin - const distanceFromBinding = Math.abs(i - bindingPin); - - if (distanceFromBinding === 0 && difficulty !== 'hard') { - // This is the binding pin, add a subtle animation - pin.style.animation = 'pinWiggle 2s infinite'; - } else if (distanceFromBinding <= 2 && difficulty === 'easy') { - // Close to binding pin, add a very subtle hint for easy difficulty - pin.style.animation = 'pinWiggle 4s infinite'; + // If this is a red herring, give misleading feedback + else if (redHerrings.includes(i) && gameState.currentBindingIndex > 0 && difficulty !== 'easy') { + // The amount of misleading feedback depends on difficulty + if (difficulty === 'medium') { + // For medium, make red herrings somewhat convincing + pinIndicator.style.background = '#ff9900'; // Same color as real binding pin + pin.style.animation = 'pinWiggle 3.5s infinite 0.7s'; // Similar wiggle to real pin + + // Randomly assign fake tension indicators to confuse + const fakeTension = Math.floor(Math.random() * 3) + 1; + if (fakeTension === 1) { + pin.style.borderColor = '#66ccff'; + } else if (fakeTension === 2) { + pin.style.borderColor = '#9966ff'; + } else { + pin.style.borderColor = '#ff6666'; + } + } + else if (difficulty === 'hard') { + // For hard, make red herrings very convincing + pin.style.animation = 'pinWiggle 4s infinite 0.3s'; + + // On hard, sometimes make a red herring more convincing than the real pin + if (Math.random() < 0.5) { + pinIndicator.style.background = '#ff9900'; + } } } } @@ -3344,9 +3377,11 @@ style.textContent = ` @keyframes pinWiggle { 0% { transform: translateY(0); } - 25% { transform: translateY(-2px); } - 50% { transform: translateY(0); } - 75% { transform: translateY(-1px); } + 15% { transform: translateY(-2px); } + 30% { transform: translateY(0); } + 45% { transform: translateY(-1px); } + 60% { transform: translateY(0); } + 75% { transform: translateY(-0.5px); } 100% { transform: translateY(0); } } `; @@ -3355,24 +3390,83 @@ // Update all pins whenever a pin state changes function updateAllPins() { + // Get the current binding pin + const bindingPin = bindingOrder[gameState.currentBindingIndex]; + + // Generate consistent red herrings based on the current binding index + const redHerringSeeds = [ + (bindingPin * 3 + 7) % numPins, + (bindingPin * 5 + 3) % numPins + ]; + + // Filter out the binding pin and already set pins from red herrings + const redHerrings = redHerringSeeds.filter(index => + index !== bindingPin && gameState.pinStates[index] !== 2); + Array.from(pinsContainer.children).forEach((pin, index) => { // Find the indicator within this pin const indicator = pin.querySelector('div:first-child'); + // Reset styles first + pin.style.background = '#555'; + pin.style.animation = ''; + pin.style.borderColor = '#777'; + if (indicator) indicator.style.background = '#555'; + // Update based on current game state if (gameState.pinStates[index] === 2) { pin.style.background = '#0f0'; pin.style.cursor = 'default'; if (indicator) indicator.style.background = '#0f0'; } else { - pin.style.background = '#555'; pin.style.cursor = 'pointer'; - if (indicator) indicator.style.background = '#555'; // Check if this is the binding pin - const bindingPin = bindingOrder[gameState.currentBindingIndex]; if (index === bindingPin && !gameState.hardMode) { - if (indicator) indicator.style.background = '#ff9900'; + if (difficulty === 'easy') { + if (indicator) indicator.style.background = '#ff9900'; + + // Show tension hint + const requiredTension = gameState.tensionRequirements[index]; + if (requiredTension === 1) { + pin.style.borderColor = '#66ccff'; + } else if (requiredTension === 2) { + pin.style.borderColor = '#9966ff'; + } else { + pin.style.borderColor = '#ff6666'; + } + + pin.style.animation = 'pinWiggle 2s infinite'; + } + else if (difficulty === 'medium') { + if (indicator) indicator.style.background = '#ff9900'; + pin.style.animation = 'pinWiggle 3s infinite'; + } + else if (difficulty === 'hard') { + pin.style.animation = 'pinWiggle 4s infinite 0.5s'; + } + } + // Check if this is a red herring, but only for medium and hard difficulties + else if (redHerrings.includes(index) && gameState.currentBindingIndex > 0 && difficulty !== 'easy') { + if (difficulty === 'medium') { + if (indicator) indicator.style.background = '#ff9900'; + pin.style.animation = 'pinWiggle 3.5s infinite 0.7s'; + + const fakeTension = Math.floor(Math.random() * 3) + 1; + if (fakeTension === 1) { + pin.style.borderColor = '#66ccff'; + } else if (fakeTension === 2) { + pin.style.borderColor = '#9966ff'; + } else { + pin.style.borderColor = '#ff6666'; + } + } + else if (difficulty === 'hard') { + pin.style.animation = 'pinWiggle 4s infinite 0.3s'; + if (Math.random() < 0.5 && indicator) { + indicator.style.background = '#ff9900'; + } + } } } }); From e44739039ec938b2cbbd05ff542f47f4b631c20a Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 17:22:56 +0000 Subject: [PATCH 36/46] Added audio (my voice (temporary)) to the lockpicking --- assets/sounds/lockpick_binding.mp3 | Bin 0 -> 12288 bytes assets/sounds/lockpick_click.mp3 | Bin 0 -> 6912 bytes assets/sounds/lockpick_overtension.mp3 | Bin 0 -> 18432 bytes assets/sounds/lockpick_reset.mp3 | Bin 0 -> 11520 bytes assets/sounds/lockpick_set.mp3 | Bin 0 -> 6912 bytes assets/sounds/lockpick_success.mp3 | Bin 0 -> 32256 bytes assets/sounds/lockpick_tension.mp3 | Bin 0 -> 16128 bytes assets/sounds/lockpick_wrong.mp3 | Bin 0 -> 13824 bytes index.html | 147 ++++++++++++++++++++----- 9 files changed, 122 insertions(+), 25 deletions(-) create mode 100644 assets/sounds/lockpick_binding.mp3 create mode 100644 assets/sounds/lockpick_click.mp3 create mode 100644 assets/sounds/lockpick_overtension.mp3 create mode 100644 assets/sounds/lockpick_reset.mp3 create mode 100644 assets/sounds/lockpick_set.mp3 create mode 100644 assets/sounds/lockpick_success.mp3 create mode 100644 assets/sounds/lockpick_tension.mp3 create mode 100644 assets/sounds/lockpick_wrong.mp3 diff --git a/assets/sounds/lockpick_binding.mp3 b/assets/sounds/lockpick_binding.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..653dcd76015753d56733ca2fc0f16144242452c4 GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/lockpick_click.mp3 b/assets/sounds/lockpick_click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c68c3775b8a1c6d97a3b213e30e375fe166919f GIT binary patch literal 6912 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 F{{|e)%v}Hg literal 0 HcmV?d00001 diff --git a/assets/sounds/lockpick_overtension.mp3 b/assets/sounds/lockpick_overtension.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dc26a854368c0c2664b8ad02f6c1394b6c010845 GIT binary patch literal 18432 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%0D1eyas);$2!ofF8X;~?k5CP5{vdr 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 M0P6ot{r}zn53uQ)GXMYp literal 0 HcmV?d00001 diff --git a/assets/sounds/lockpick_success.mp3 b/assets/sounds/lockpick_success.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6b467c14b3a9b98c0d050336f4fe3eb751b8ee2c GIT binary patch literal 32256 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 aed02AKbK8PS{B?q^=YQqf8;;jh5r}z7(Oxp literal 0 HcmV?d00001 diff --git a/assets/sounds/lockpick_tension.mp3 b/assets/sounds/lockpick_tension.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a5bef966b2cfc60ee0b958c3ed54bcf180c5c70a GIT binary patch literal 16128 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 Lc@p(s6Y>87BM%Kc literal 0 HcmV?d00001 diff --git a/index.html b/index.html index ee08393..1e69794 100644 --- a/index.html +++ b/index.html @@ -3096,10 +3096,42 @@ }); // Add audio feedback - let clickSound = null; + const lockSounds = { + click: null, // Basic pin movement sound + binding: null, // Sound when a pin is binding (correct tension) + set: null, // Sound when a pin is successfully set + reset: null, // Sound when pins are reset + wrong: null, // Sound when wrong tension or wrong pin + tension: null, // Sound when changing tension + success: null, // Sound when successfully picking the lock + overTension: null // Sound when over-tensioning the lock + }; + const initAudio = () => { - if (!clickSound) { - clickSound = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdH2Dam9ycG5wdX2Dg4CBhIWCgX+Af4B/goCDgIJ/gn+BfoF/gn+CgIF/gn+Cf4F/g4CDgIJ/hIGFgoWBhYKGgoaCh4OIg4mEioWLhIyFjYaOhI+FkIaRhZKGk4eUhpWHloeXiJiImYiaiZuKnIqdi56LoIyhjaKOo4+kj6WQppGnkqiTqZSqlauWrJetmK6Zr5qwm7GcsZ2yn7OgtKG1oraitqO3pLiltqe4qLmpuqq7q7ysvq2/rsCwwbHCssOzxbTGtce2yLfJuMq5y7rMu827zrzPvdC+0b/SwdPC1MPVxNbF18bYx9nI2sjbydvK3Mvdy97M383gzuHP4tDj0eTT5dTm1efW6Nfp2Ora69vt3O7d797w3/Lh8+P05fXn9+j46Prs+/D89v77AQYHDA8VGh8lKi8zOD1CRkpPVFhbX2NobHBydHZ4enx+gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vPz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=='); + if (!lockSounds.click) { + // Basic click sound (when pressing a pin) + lockSounds.click = new Audio('assets/sounds/lockpick_click.mp3'); + + // Binding sound (when a pin is binding with correct tension) + lockSounds.binding = new Audio('assets/sounds/lockpick_binding.mp3'); + + // Set sound (when a pin is successfully set) + lockSounds.set = new Audio('assets/sounds/lockpick_set.mp3'); + + // Reset sound (when pins are reset) + lockSounds.reset = new Audio('assets/sounds/lockpick_reset.mp3'); + + // Wrong sound (when using wrong tension or pressing wrong pin) + lockSounds.wrong = new Audio('assets/sounds/lockpick_wrong.mp3'); + + // Tension sound (when changing tension levels) + lockSounds.tension = new Audio('assets/sounds/lockpick_tension.mp3'); + + // Success sound (when successfully picking the lock) + lockSounds.success = new Audio('assets/sounds/lockpick_success.mp3'); + + // Over-tension sound (when applying too much tension) + lockSounds.overTension = new Audio('assets/sounds/lockpick_overtension.mp3'); } }; @@ -3185,6 +3217,12 @@ const previousTensionLevel = gameState.tensionLevel; gameState.tensionLevel = (gameState.tensionLevel % 3) + 1; + // Play tension change sound + if (lockSounds.tension) { + lockSounds.tension.currentTime = 0; + lockSounds.tension.play().catch(e => console.log('Audio play failed:', e)); + } + updateTensionWrench(); // Check if we're over-tensioning - but only if we've started interacting with pins @@ -3203,6 +3241,12 @@ tensionWrench.style.background = '#ff3333'; tensionWrench.style.transform = 'rotate(15deg)'; + // Play over-tension sound + if (lockSounds.overTension) { + lockSounds.overTension.currentTime = 0; + lockSounds.overTension.play().catch(e => console.log('Audio play failed:', e)); + } + setTimeout(() => { alert("You applied too much tension and jammed the lock!"); resetPins(); @@ -3501,6 +3545,12 @@ // Set the flag to indicate we're actively picking a pin gameState.isActivelyPickingPin = true; + // Play basic click sound + if (lockSounds.click) { + lockSounds.click.currentTime = 0; + lockSounds.click.play().catch(e => console.log('Audio play failed:', e)); + } + pressStartTime = Date.now(); pressTimer = setInterval(checkPinPress, 100); @@ -3516,6 +3566,12 @@ const correctTension = (gameState.tensionLevel === requiredTension); if (correctTension && !gameState.overTensioned) { + // Play binding sound - correct pin with correct tension + if (lockSounds.binding) { + lockSounds.binding.currentTime = 0; + lockSounds.binding.play().catch(e => console.log('Audio play failed:', e)); + } + if (!gameState.hardMode) { pin.style.background = '#00f'; } @@ -3531,6 +3587,12 @@ gameState.currentBindingIndex++; gameState.lastPinSetTime = Date.now(); + // Play set sound - pin successfully set + if (lockSounds.set) { + lockSounds.set.currentTime = 0; + lockSounds.set.play().catch(e => console.log('Audio play failed:', e)); + } + if (!gameState.hardMode) { pin.style.background = '#0f0'; pinIndicator.style.background = '#0f0'; @@ -3545,6 +3607,12 @@ }, 500); } else if (gameState.tensionLevel > 0) { // Wrong tension but trying - give feedback + // Play wrong sound - wrong tension on correct pin + if (lockSounds.wrong) { + lockSounds.wrong.currentTime = 0; + lockSounds.wrong.play().catch(e => console.log('Audio play failed:', e)); + } + if (!gameState.hardMode) { pin.style.background = '#00f'; } @@ -3553,6 +3621,12 @@ gameState.pinPressTime[pinIndex] = Date.now(); } } else if (gameState.tensionLevel > 0 && gameState.pinStates[pinIndex] !== 2) { + // Wrong pin - give feedback + if (lockSounds.wrong) { + lockSounds.wrong.currentTime = 0; + lockSounds.wrong.play().catch(e => console.log('Audio play failed:', e)); + } + if (!gameState.hardMode) { pin.style.background = '#00f'; } @@ -3628,31 +3702,54 @@ // Add this function before the pin creation loop function checkWinCondition() { if (gameState.currentBindingIndex >= numPins) { + // Play success sound + if (lockSounds.success) { + lockSounds.success.currentTime = 0; + lockSounds.success.play().catch(e => console.log('Audio play failed:', e)); + } + console.log('Lock picked successfully:', lockable); - // For doors, we need to check properties and handle differently - if (lockable && lockable.properties && lockable.properties.locked) { - console.log('Unlocking door tile:', lockable); - unlockDoor(lockable, lockable.layer); - alert("Lock successfully picked! The door is now unlocked."); - } - // For containers and other lockable items - else if (lockable.scenarioData) { - console.log('Unlocking container:', lockable.scenarioData); - lockable.scenarioData.locked = false; - - if (lockable.scenarioData.contents) { - lockable.scenarioData.isUnlockedButNotCollected = true; - alert("Lock successfully picked! You can now interact with it to collect the contents."); - } else { - alert("Lock successfully picked!"); - } - } + // Create success message + const successMessage = document.createElement('div'); + successMessage.style.cssText = ` + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: rgba(0, 0, 0, 0.8); + color: #0f0; + padding: 20px; + border-radius: 10px; + font-size: 24px; + text-align: center; + z-index: 1002; + `; + successMessage.textContent = "Lock successfully picked!"; + iframe.appendChild(successMessage); + + // Disable further interaction + gameContainer.style.pointerEvents = 'none'; + + setTimeout(() => { + // For doors, we need to check properties and handle differently + if (lockable && lockable.properties && lockable.properties.locked) { + console.log('Unlocking door tile:', lockable); + unlockDoor(lockable, lockable.layer); + } + // For containers and other lockable items + else if (lockable && lockable.scenarioData) { + console.log('Unlocking container:', lockable.scenarioData); + lockable.scenarioData.locked = false; + } + + // Remove the minigame + document.body.removeChild(iframe); + if (currentScene && currentScene.input && currentScene.input.mouse) { + currentScene.input.mouse.enabled = true; + } + }, 1500); - document.body.removeChild(iframe); - if (currentScene && currentScene.input && currentScene.input.mouse) { - currentScene.input.mouse.enabled = true; - } return true; } return false; From 8b93ed1720f398892238ccb8f1f80d5540d5b763 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Fri, 7 Mar 2025 17:57:35 +0000 Subject: [PATCH 37/46] Replaced sounds with same stock sound (https://opengameart.org/content/click-sounds6) --- assets/sounds/lockpick_binding.mp3 | Bin 12288 -> 13824 bytes assets/sounds/lockpick_click.mp3 | Bin 6912 -> 13824 bytes assets/sounds/lockpick_overtension.mp3 | Bin 18432 -> 13824 bytes assets/sounds/lockpick_reset.mp3 | Bin 11520 -> 13824 bytes assets/sounds/lockpick_set.mp3 | Bin 6912 -> 13824 bytes assets/sounds/lockpick_success.mp3 | Bin 32256 -> 13824 bytes assets/sounds/lockpick_tension.mp3 | Bin 16128 -> 13824 bytes assets/sounds/lockpick_wrong.mp3 | Bin 13824 -> 13824 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/sounds/lockpick_binding.mp3 b/assets/sounds/lockpick_binding.mp3 index 653dcd76015753d56733ca2fc0f16144242452c4..bdf479bafff351d821df2c85334892093b24ff45 100644 GIT binary patch literal 13824 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 diff --git a/assets/sounds/lockpick_click.mp3 b/assets/sounds/lockpick_click.mp3 index 0c68c3775b8a1c6d97a3b213e30e375fe166919f..bdf479bafff351d821df2c85334892093b24ff45 100644 GIT binary patch literal 13824 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 F{{|e)%v}Hg diff --git a/assets/sounds/lockpick_overtension.mp3 b/assets/sounds/lockpick_overtension.mp3 index dc26a854368c0c2664b8ad02f6c1394b6c010845..bdf479bafff351d821df2c85334892093b24ff45 100644 GIT binary patch literal 13824 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%0D1eyas);$2!ofF8X;~?k5CP5{vdr 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 M0P6ot{r}zn53uQ)GXMYp diff --git a/assets/sounds/lockpick_success.mp3 b/assets/sounds/lockpick_success.mp3 index 6b467c14b3a9b98c0d050336f4fe3eb751b8ee2c..bdf479bafff351d821df2c85334892093b24ff45 100644 GIT binary patch literal 13824 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 aed02AKbK8PS{B?q^=YQqf8;;jh5r}z7(Oxp diff --git a/assets/sounds/lockpick_tension.mp3 b/assets/sounds/lockpick_tension.mp3 index a5bef966b2cfc60ee0b958c3ed54bcf180c5c70a..bdf479bafff351d821df2c85334892093b24ff45 100644 GIT binary patch literal 13824 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 Lc@p(s6Y>87BM%Kc From fcaf3b6f352aba28fb7b1dfe879a20e87469450c Mon Sep 17 00:00:00 2001 From: Damian-I Date: Sat, 8 Mar 2025 02:49:32 +0000 Subject: [PATCH 38/46] Add comprehensive debug logging system with color-coded console output --- index.html | 144 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 118 insertions(+), 26 deletions(-) diff --git a/index.html b/index.html index 1e69794..8f1698d 100644 --- a/index.html +++ b/index.html @@ -158,6 +158,68 @@ const hideRoomsOnExit = false; const hideNonAdjacentRooms = false; + // Debug system variables - moved to the top + let debugMode = false; + + // Debug logging function that only logs when debug mode is active + function debugLog(...args) { + if (debugMode) { + // Check if the first argument is a string + if (typeof args[0] === 'string') { + // Create the formatted debug message + const message = args[0]; + const formattedMessage = `[DEBUG] === ${message} ===`; + + // Determine color based on message content + let color = '#0077FF'; // Default blue for general info + let fontWeight = 'bold'; + + // Success messages - green + if (message.includes('SUCCESS') || + message.includes('UNLOCKED') || + message.includes('NOT LOCKED')) { + color = '#00AA00'; // Green + } + // Error/failure messages - red + else if (message.includes('FAIL') || + message.includes('ERROR') || + message.includes('NO LOCK REQUIREMENTS FOUND')) { + color = '#DD0000'; // Red + } + // Sensitive information - purple + else if (message.includes('PIN') || + message.includes('PASSWORD') || + message.includes('KEY') || + message.includes('LOCK REQUIREMENTS')) { + color = '#AA00AA'; // Purple + } + + // Replace the first argument with the formatted message and add CSS styling + args.splice(0, 1, '%c' + formattedMessage, `color: ${color}; font-weight: ${fontWeight};`); + } + console.log(...args); + } + } + + // Function to display tension debug info only when debug mode is active + function logTensionDebugInfo() { + if (!debugMode) return; // Skip all calculations if debug mode is off + + // Your existing debug code here + debugLog("Tension debug information:"); + // Add other debug information as needed + } + + // Listen for backtick key to toggle debug mode + document.addEventListener('keydown', function(event) { + if (event.key === '`') { + debugMode = !debugMode; + // Use direct console.log with custom formatting to avoid duplicate messages + console.log(`%c[DEBUG] === DEBUG MODE ${debugMode ? 'ENABLED' : 'DISABLED'} ===`, + `color: ${debugMode ? '#00AA00' : '#DD0000'}; font-weight: bold;`); + } + }); + // Declare gameScenario as let (not const) so we can assign it later let gameScenario = null; // Initialize as null @@ -246,6 +308,24 @@ REVEALED: 0x00ff00 }; + const DEBUG_MODE = { + get enabled() { return debugMode; }, + set enabled(value) { debugMode = value; }, + toggle: function() { + debugMode = !debugMode; + // No need to log here as the global event listener will handle it + }, + log: function(message, data = null) { + if (!debugMode) return; + + if (data) { + console.log(`%c[DEBUG] === ${message} ===`, 'color: #0077FF; font-weight: bold;', data); + } else { + console.log(`%c[DEBUG] === ${message} ===`, 'color: #0077FF; font-weight: bold;'); + } + } + }; + // preloads the assets function preload() { // Show loading text @@ -509,6 +589,9 @@ // Add this to your scene's create function initializeSamplesUI(); + + // Log initial debug status + console.log("%cPress ` (backtick) to toggle debug mode", "color: #888; font-style: italic;"); } function update() { @@ -1850,13 +1933,13 @@ } function handleDoorUnlock(doorTile, room) { - console.log('handleDoorUnlock called:', { doorTile, room }); + debugLog('DOOR UNLOCK ATTEMPT'); doorTile.layer = room.doorsLayer; // Ensure layer reference is set handleUnlock(doorTile, 'door'); } function handleUnlock(lockable, type) { - console.log('handleUnlock called:', { type, lockable }); + debugLog('UNLOCK ATTEMPT'); // Check locked state in scenarioData for items const isLocked = type === 'door' ? @@ -1864,7 +1947,7 @@ lockable.scenarioData?.locked; if (!isLocked) { - console.log('Object is not locked'); + debugLog('OBJECT NOT LOCKED'); return; } @@ -1873,17 +1956,17 @@ ? getLockRequirementsForDoor(lockable) : getLockRequirementsForItem(lockable); - console.log('Lock requirements:', lockRequirements); + debugLog('LOCK REQUIREMENTS', lockRequirements); if (!lockRequirements) { - console.log('No lock requirements found'); + debugLog('NO LOCK REQUIREMENTS FOUND'); return; } switch(lockRequirements.lockType) { case 'key': const requiredKey = lockRequirements.requires; - console.log('Checking for key:', requiredKey); + debugLog('KEY REQUIRED', requiredKey); const hasKey = inventory.items.some(item => item && item.scenarioData && item.scenarioData.key_id === requiredKey @@ -1897,6 +1980,7 @@ const keyName = keyItem?.scenarioData?.name || 'key'; const keyLocation = keyItem?.scenarioData?.foundIn || 'your inventory'; + debugLog('KEY UNLOCK SUCCESS'); unlockTarget(lockable, type, lockable.layer); alert(`You used the ${keyName} that you found in ${keyLocation} to unlock the ${type}.`); } else { @@ -1907,6 +1991,7 @@ ); if (hasLockpick) { + debugLog('LOCKPICK AVAILABLE'); if (confirm("Would you like to attempt picking this lock?")) { let difficulty; @@ -1922,33 +2007,37 @@ // If not found, try object-level difficulty difficulty = difficulty || lockable.scenarioData?.difficulty || lockable.properties?.difficulty; + debugLog('STARTING LOCKPICK MINIGAME', { difficulty }); startLockpickingMinigame(lockable, game.scene.scenes[0], difficulty); } } else { + debugLog('KEY NOT FOUND - FAIL'); alert(`Requires key: ${requiredKey}`); } } break; case 'pin': - console.log('Handling PIN lock'); + debugLog('PIN CODE REQUESTED'); const pinInput = prompt(`Enter PIN code:`); if (pinInput === lockRequirements.requires) { unlockTarget(lockable, type, lockable.layer); // Pass the layer here + debugLog('PIN CODE SUCCESS'); alert(`Correct PIN! The ${type} is now unlocked.`); } else if (pinInput !== null) { - alert("Incorrect PIN code."); + debugLog('PIN CODE FAIL'); } break; case 'password': - console.log('Handling password lock'); + debugLog('PASSWORD REQUESTED'); const passwordInput = prompt(`Enter password:`); if (passwordInput === lockRequirements.requires) { unlockTarget(lockable, type, lockable.layer); // Pass the layer here + debugLog('PASSWORD SUCCESS'); alert(`Correct password! The ${type} is now unlocked.`); } else if (passwordInput !== null) { - alert("Incorrect password."); + debugLog('PASSWORD FAIL'); } break; @@ -1972,17 +2061,18 @@ lockable.x, lockable.y ); - console.log('Distance to tablet:', distance); + debugLog('BLUETOOTH DISTANCE', distance); // Check if player is within range (using BLUETOOTH_SCAN_RANGE) if (distance <= BLUETOOTH_SCAN_RANGE) { - console.log('Bluetooth unlock success: Player in range', { + debugLog('BLUETOOTH UNLOCK SUCCESS', { itemName: lockable.scenarioData?.name, itemMac: lockable.scenarioData?.mac, - distance: distance + distance: Math.round(distance), + range: BLUETOOTH_SCAN_RANGE }); unlockTarget(lockable, type, lockable.layer); - alert(`Bluetooth connection established. Device unlocked.`); + debugLog('BLUETOOTH UNLOCK SUCCESS'); return; } @@ -2119,7 +2209,7 @@ } function getLockRequirementsForDoor(doorTile) { - console.log('Getting lock requirements for door:', doorTile); + debugLog('CHECKING DOOR REQUIREMENTS'); if (!doorTile.layer) { console.error('Door tile missing layer reference'); @@ -2129,7 +2219,7 @@ const doorWorldX = doorTile.layer.x + (doorTile.x * TILE_SIZE); const doorWorldY = doorTile.layer.y + (doorTile.y * TILE_SIZE); - console.log('Door world coordinates:', { doorWorldX, doorWorldY }); + debugLog('DOOR COORDINATES', { doorWorldX, doorWorldY }); const overlappingRooms = []; Object.entries(rooms).forEach(([roomId, otherRoom]) => { @@ -2148,7 +2238,7 @@ }; if (boundsOverlap(doorCheckArea, roomBounds)) { - console.log(`Room ${roomId} overlaps with door`); + debugLog(`ROOM ${roomId} OVERLAPS WITH DOOR`); const roomCenterX = roomBounds.x + (roomBounds.width / 2); const roomCenterY = roomBounds.y + (roomBounds.height / 2); const distanceToPlayer = Phaser.Math.Distance.Between( @@ -2167,13 +2257,13 @@ } }); - console.log('Overlapping rooms:', overlappingRooms); + debugLog('OVERLAPPING ROOMS', overlappingRooms); const lockedRooms = overlappingRooms .filter(r => r.locked) .sort((a, b) => b.distance - a.distance); - console.log('Locked rooms:', lockedRooms); + debugLog('LOCKED ROOMS', lockedRooms); if (lockedRooms.length > 0) { const targetRoom = lockedRooms[0]; @@ -2181,11 +2271,11 @@ lockType: targetRoom.lockType, requires: targetRoom.requires }; - console.log('Returning lock requirements:', requirements); + debugLog('LOCK REQUIREMENTS', requirements); return requirements; } - console.log('No lock requirements found'); + debugLog('NO LOCK REQUIREMENTS FOUND'); return null; } @@ -2233,15 +2323,14 @@ ); if (distance <= BLUETOOTH_SCAN_RANGE) { - console.log('🔍 TABLET IN RANGE:', { + debugLog('BLUETOOTH DEVICE DETECTED', { distance: Math.round(distance), range: BLUETOOTH_SCAN_RANGE }); // Unlock the tablet obj.scenarioData.locked = false; - console.log('🔓 TABLET UNLOCKED!'); - alert('Bluetooth connection established. Device unlocked.'); + debugLog('BLUETOOTH UNLOCK SUCCESS'); } } }); @@ -3770,8 +3859,11 @@ // Keep only the table debug function function logTensionDebugInfo() { - console.log("=== LOCKPICKING DEBUG INFO ==="); - console.log("Pin binding order and tension requirements:"); + // Only show debug info if debug mode is enabled + if (!DEBUG_MODE.enabled) return; + + DEBUG_MODE.log("=== LOCKPICKING DEBUG INFO ==="); + DEBUG_MODE.log("Pin binding order and tension requirements:"); const tableData = []; From cca4a02b8433fed9ef37919fdb00c81bb9f9ada1 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Sat, 8 Mar 2025 03:10:51 +0000 Subject: [PATCH 39/46] Add notification and notes system with all existing alerts moved to it. --- index.html | 500 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 474 insertions(+), 26 deletions(-) diff --git a/index.html b/index.html index 8f1698d..acc1117 100644 --- a/index.html +++ b/index.html @@ -27,6 +27,201 @@ display: none; } + /* Notification System */ + #notification-container { + position: fixed; + top: 20px; + left: 50%; + transform: translateX(-50%); + width: 80%; + max-width: 600px; + z-index: 2000; + font-family: Arial, sans-serif; + pointer-events: none; + } + + .notification { + background-color: rgba(0, 0, 0, 0.8); + color: white; + padding: 15px 20px; + margin-bottom: 10px; + border-radius: 5px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + transition: all 0.3s ease; + opacity: 0; + transform: translateY(-20px); + pointer-events: auto; + position: relative; + overflow: hidden; + } + + .notification.show { + opacity: 1; + transform: translateY(0); + } + + .notification.info { + border-left: 4px solid #3498db; + } + + .notification.success { + border-left: 4px solid #2ecc71; + } + + .notification.warning { + border-left: 4px solid #f39c12; + } + + .notification.error { + border-left: 4px solid #e74c3c; + } + + .notification-title { + font-weight: bold; + margin-bottom: 5px; + font-size: 16px; + } + + .notification-message { + font-size: 14px; + line-height: 1.4; + } + + .notification-close { + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + font-size: 16px; + color: #aaa; + } + + .notification-close:hover { + color: white; + } + + .notification-progress { + position: absolute; + bottom: 0; + left: 0; + height: 3px; + background-color: rgba(255, 255, 255, 0.5); + width: 100%; + } + + /* Notes Panel */ + #notes-panel { + position: fixed; + bottom: 80px; + right: 20px; + width: 300px; + max-height: 400px; + background-color: rgba(0, 0, 0, 0.8); + color: white; + border-radius: 5px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + z-index: 1999; + font-family: Arial, sans-serif; + display: none; + overflow: hidden; + transition: all 0.3s ease; + } + + #notes-header { + background-color: #222; + padding: 10px 15px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #444; + } + + #notes-title { + font-weight: bold; + font-size: 16px; + } + + #notes-close { + cursor: pointer; + font-size: 16px; + color: #aaa; + } + + #notes-close:hover { + color: white; + } + + #notes-content { + padding: 15px; + overflow-y: auto; + max-height: 350px; + } + + .note-item { + margin-bottom: 15px; + padding-bottom: 15px; + border-bottom: 1px solid #444; + } + + .note-item:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: none; + } + + .note-title { + font-weight: bold; + margin-bottom: 5px; + font-size: 14px; + color: #3498db; + } + + .note-text { + font-size: 13px; + line-height: 1.4; + white-space: pre-wrap; + } + + #notes-toggle { + position: fixed; + bottom: 20px; + right: 20px; + width: 50px; + height: 50px; + background-color: #3498db; + color: white; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + z-index: 1998; + font-size: 24px; + transition: all 0.3s ease; + } + + #notes-toggle:hover { + background-color: #2980b9; + transform: scale(1.1); + } + + #notes-count { + position: absolute; + top: -5px; + right: -5px; + background-color: #e74c3c; + color: white; + border-radius: 50%; + width: 20px; + height: 20px; + font-size: 12px; + display: flex; + justify-content: center; + align-items: center; + font-weight: bold; + } + #laptop-popup { display: none; position: fixed; @@ -121,6 +316,22 @@

Loading...
+ +
+ + +
+
+
Notes
+
×
+
+
+
+
+ 📝 +
0
+
+ \ No newline at end of file