From 4bfa492d40c5509aba596de4553662122bd20282 Mon Sep 17 00:00:00 2001 From: Damian-I Date: Tue, 11 Mar 2025 17:04:53 +0000 Subject: [PATCH] Fixed biometric locktype bug --- index.html | 126 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 24 deletions(-) diff --git a/index.html b/index.html index a2b6050..9d2ae97 100644 --- a/index.html +++ b/index.html @@ -3325,33 +3325,51 @@ const requiredFingerprint = lockRequirements.requires; debugLog('BIOMETRIC LOCK REQUIRES', requiredFingerprint, 2); - // Check if the player has collected the required fingerprint - if (gameState.collectedFingerprints && gameState.collectedFingerprints[requiredFingerprint]) { - const fingerprintQuality = gameState.collectedFingerprints[requiredFingerprint]; + // Check if we have fingerprints in the biometricSamples collection + const biometricSamples = gameState.biometricSamples || []; + + // Enhanced debugging - Show collected fingerprints + debugLog('BIOMETRIC SAMPLES', JSON.stringify(biometricSamples), 2); + + // Get the required match threshold from the object or use default + const requiredThreshold = typeof lockable.biometricMatchThreshold === 'number' ? + lockable.biometricMatchThreshold : 0.4; + + debugLog('BIOMETRIC THRESHOLD', requiredThreshold, 2); + + // Find the fingerprint sample for the required person + const fingerprintSample = biometricSamples.find(sample => + sample.owner === requiredFingerprint + ); + + const hasFingerprint = fingerprintSample !== undefined; + debugLog('FINGERPRINT CHECK', `Looking for '${requiredFingerprint}'. Found: ${hasFingerprint}`, 2); + + if (hasFingerprint) { + // Get the quality from the sample + let fingerprintQuality = fingerprintSample.quality; - // Get the required match threshold from the object or use default - const requiredThreshold = lockable.biometricMatchThreshold || 0.75; - - // Get scenario difficulty and adjust threshold accordingly - const scenarioDifficulty = gameState.activeScenario?.difficulty || "medium"; - let adjustedThreshold = requiredThreshold; - - // Apply difficulty-based adjustments - if (scenarioDifficulty === "easy") { - // Make it easier to unlock on easy difficulty - adjustedThreshold = Math.max(0.5, adjustedThreshold - 0.1); - } else if (scenarioDifficulty === "hard") { - // Make it harder to unlock on hard difficulty - adjustedThreshold = Math.min(0.95, adjustedThreshold + 0.1); + // Normalize quality to 0-1 range if it's in percentage format + if (fingerprintQuality > 1) { + fingerprintQuality = fingerprintQuality / 100; } debugLog('BIOMETRIC CHECK', - `Required: ${requiredFingerprint}, Quality: ${fingerprintQuality}, Base Threshold: ${requiredThreshold}, Adjusted for ${scenarioDifficulty}: ${adjustedThreshold}`, 2); + `Required: ${requiredFingerprint}, Quality: ${fingerprintQuality} (${Math.round(fingerprintQuality * 100)}%), Threshold: ${requiredThreshold} (${Math.round(requiredThreshold * 100)}%)`, 2); - // Check if the fingerprint quality meets the adjusted threshold - if (fingerprintQuality >= adjustedThreshold) { + debugLog('QUALITY CHECK', + `Is ${fingerprintQuality} >= ${requiredThreshold}? ${fingerprintQuality >= requiredThreshold}`, 2); + + // Check if the fingerprint quality meets the threshold + if (fingerprintQuality >= requiredThreshold) { debugLog('BIOMETRIC UNLOCK SUCCESS', null, 1); unlockTarget(lockable, type, lockable.layer); + + // Play unlock sound if available + if (typeof playSound === 'function') { + playSound("unlock"); + } + gameAlert(`You successfully unlocked the ${type} with ${requiredFingerprint}'s fingerprint.`, 'success', 'Biometric Unlock Successful', 5000); @@ -3363,17 +3381,19 @@ location: type, fingerprint: requiredFingerprint, quality: fingerprintQuality, - threshold: adjustedThreshold, + threshold: requiredThreshold, timestamp: new Date().toISOString() }); } else { - debugLog('BIOMETRIC QUALITY TOO LOW', `${fingerprintQuality} < ${adjustedThreshold}`, 2); + debugLog('BIOMETRIC QUALITY TOO LOW', + `Quality: ${fingerprintQuality} (${Math.round(fingerprintQuality * 100)}%) < Threshold: ${requiredThreshold} (${Math.round(requiredThreshold * 100)}%)`, 2); gameAlert(`The fingerprint quality (${Math.round(fingerprintQuality * 100)}%) is too low for this lock. - It requires at least ${Math.round(adjustedThreshold * 100)}% quality.`, + It requires at least ${Math.round(requiredThreshold * 100)}% quality.`, 'error', 'Biometric Authentication Failed', 5000); } } else { - debugLog('MISSING REQUIRED FINGERPRINT', requiredFingerprint, 2); + debugLog('MISSING REQUIRED FINGERPRINT', + `Required: '${requiredFingerprint}', Available: ${biometricSamples.map(s => s.owner).join(", ") || "none"}`, 2); gameAlert(`This ${type} requires ${requiredFingerprint}'s fingerprint, which you haven't collected yet.`, 'error', 'Biometric Authentication Failed', 5000); } @@ -6813,6 +6833,64 @@ popup.style.display = 'flex'; } + // Add this function to handle biometric matching near the other utility functions + function performBiometricMatch(lockable, ownerFingerprint, qualityThreshold, type) { + // Get available biometric samples - assuming they're stored in a global variable + // This may need to be adjusted based on how your biometric samples are actually stored + const availableSamples = biometricSamples || []; + + if (!availableSamples || availableSamples.length === 0) { + $("#biometric-status").text("No fingerprint samples available."); + gameAlert("No fingerprint samples found in database.", 'error', 'Scan Failed', 3000); + return; + } + + // Find if we have the owner's fingerprint + const matchingSample = availableSamples.find(sample => sample.id === ownerFingerprint); + + if (!matchingSample) { + // No matching sample found + $("#biometric-status").text("No match found. Access denied."); + gameAlert("Biometric authentication failed.", 'error', 'Access Denied', 3000); + + setTimeout(function() { + $("#biometrics-panel").hide(); + }, 2000); + return; + } + + // Check quality against threshold + const sampleQuality = matchingSample.quality || 0; + + if (sampleQuality >= qualityThreshold) { + // Successful match with sufficient quality + $("#biometric-status").text("Match found! Unlocking..."); + + setTimeout(function() { + // Unlock the target + unlockTarget(lockable, type, lockable.layer); + $("#biometrics-panel").hide(); + + // Play unlock sound if available + if (typeof playSound === 'function') { + playSound("unlock"); + } + + gameAlert(`Biometric match confirmed. ${type.charAt(0).toUpperCase() + type.slice(1)} unlocked.`, 'success', 'Access Granted', 4000); + debugLog('BIOMETRIC AUTHENTICATION SUCCESS', null, 1); + }, 1500); + } else { + // Match found but quality insufficient + $("#biometric-status").text("Sample quality insufficient. Access denied."); + gameAlert(`Biometric sample quality too low (${sampleQuality}/${qualityThreshold} required).`, 'error', 'Low Quality Sample', 3000); + debugLog('BIOMETRIC AUTHENTICATION FAILED - LOW QUALITY', null, 2); + + setTimeout(function() { + $("#biometrics-panel").hide(); + }, 2000); + } + } + \ No newline at end of file