From 9c718e62390417070e3ef080363ceee464303b4b Mon Sep 17 00:00:00 2001 From: "Z. Cliffe Schreuders" Date: Tue, 14 Oct 2025 23:56:31 +0100 Subject: [PATCH] Add Key Ring Functionality: Introduce a new key ring system to manage keys in inventory, including visual representation and interaction logic. Update CSS for key ring styling and enhance inventory management to support key grouping and display. Modify key-lock and unlock systems to recognize keys from the key ring, improving gameplay dynamics. --- assets/objects/key-ring.png | Bin 0 -> 386 bytes css/inventory.css | 29 ++++++++ js/systems/inventory.js | 136 +++++++++++++++++++++++++++++++++- js/systems/key-lock-system.js | 26 ++++++- js/systems/unlock-system.js | 27 ++++++- 5 files changed, 213 insertions(+), 5 deletions(-) create mode 100644 assets/objects/key-ring.png diff --git a/assets/objects/key-ring.png b/assets/objects/key-ring.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff347a70621547f30c73ff079ec0093a5a18844 GIT binary patch literal 386 zcmV-|0e$|7P)Px$JV``BR5*>Ll|4_xFc60CNF(|K8HkWNWGL#!7>Pf?n59B2YypP!*C9|M*LoS? zEZe!*NqNW9-E&|5U{X{tL$ebRS%5XWGy1`E&RM@y1t|q_mqOzBtN%cJZBki8shNpb z0xiG-IJ|rWPS5wZlR)v8BnGYx(Xa)Xj@m#CU6U| z8}=|77pPSvfxd>(P}B8PFvAVooPR;(rkri>^XpqpK(c-d@NvI$5KZQ6=(yia5(qq4 zs|;M5i)I(N1z0^tOC)gFS^yGbTUQ_=YP#O7d~N|*70h^iJ3-nlm=W82sduelMqEMe zny4TPaC|T|_@auIz_TDyhMRl0R=r27Tcf{oBKL2JW{15NzPPoE)-QuiZ7G(TMf k.scenarioData) + }; + itemImg.name = 'key'; + itemImg.objectId = 'inventory_key_ring'; + + // Add click handler for key ring + itemImg.addEventListener('click', function() { + if (window.handleKeyRingInteraction) { + window.handleKeyRingInteraction(this); + } + }); + + // Add to slot + slot.appendChild(itemImg); + slot.appendChild(tooltip); + + // Store references + keyRing.slot = slot; + keyRing.itemImg = itemImg; + + // Add to inventory array (replace any existing key ring item) + const existingKeyRingIndex = window.inventory.items.findIndex(item => + item && item.scenarioData && item.scenarioData.type === 'key_ring' + ); + + if (existingKeyRingIndex !== -1) { + window.inventory.items[existingKeyRingIndex] = itemImg; + } else { + window.inventory.items.push(itemImg); + } +} + +function handleKeyRingInteraction(keyRingItem) { + const keyRing = window.inventory.keyRing; + if (!keyRing || keyRing.keys.length === 0) { + return; + } + + if (keyRing.keys.length === 1) { + // Single key - handle normally + if (window.handleObjectInteraction) { + window.handleObjectInteraction(keyRingItem); + } + } else { + // Multiple keys - show list + const keyNames = keyRing.keys.map(key => key.scenarioData.name).join('\n• '); + const message = `Key Ring contains ${keyRing.keys.length} keys:\n• ${keyNames}`; + + if (window.gameAlert) { + window.gameAlert(message, 'info', 'Key Ring', 0); + } + } +} + // Add notepad to inventory function addNotepadToInventory() { // Check if notepad is already in inventory @@ -310,4 +443,5 @@ window.processInitialInventoryItems = processInitialInventoryItems; window.addToInventory = addToInventory; window.removeFromInventory = removeFromInventory; window.addNotepadToInventory = addNotepadToInventory; -window.createItemIdentifier = createItemIdentifier; \ No newline at end of file +window.createItemIdentifier = createItemIdentifier; +window.handleKeyRingInteraction = handleKeyRingInteraction; \ No newline at end of file diff --git a/js/systems/key-lock-system.js b/js/systems/key-lock-system.js index cfb7e3f..8bd8edb 100644 --- a/js/systems/key-lock-system.js +++ b/js/systems/key-lock-system.js @@ -44,11 +44,33 @@ const PREDEFINED_LOCK_CONFIGS = { function assignKeysToLocks() { console.log('Assigning keys to locks based on scenario definitions...'); - // Get all keys from inventory - const playerKeys = window.inventory?.items?.filter(item => + // Get all keys from inventory (including key ring) + let playerKeys = []; + + // Check for individual keys + const individualKeys = window.inventory?.items?.filter(item => item && item.scenarioData && item.scenarioData.type === 'key' ) || []; + playerKeys = playerKeys.concat(individualKeys); + + // Check for key ring + const keyRingItem = window.inventory?.items?.find(item => + item && item.scenarioData && + item.scenarioData.type === 'key_ring' + ); + + if (keyRingItem && keyRingItem.scenarioData.allKeys) { + // Convert key ring keys to the format expected by the system + const keyRingKeys = keyRingItem.scenarioData.allKeys.map(keyData => { + return { + scenarioData: keyData, + name: 'key', + objectId: `key_ring_${keyData.key_id || keyData.name}` + }; + }); + playerKeys = playerKeys.concat(keyRingKeys); + } console.log(`Found ${playerKeys.length} keys in inventory`); diff --git a/js/systems/unlock-system.js b/js/systems/unlock-system.js index 2a8e375..45fb293 100644 --- a/js/systems/unlock-system.js +++ b/js/systems/unlock-system.js @@ -53,11 +53,34 @@ export function handleUnlock(lockable, type) { const requiredKey = lockRequirements.requires; console.log('KEY REQUIRED', requiredKey); - // Get all keys from player's inventory - const playerKeys = window.inventory.items.filter(item => + // Get all keys from player's inventory (including key ring) + let playerKeys = []; + + // Check for individual keys + const individualKeys = window.inventory.items.filter(item => item && item.scenarioData && item.scenarioData.type === 'key' ); + playerKeys = playerKeys.concat(individualKeys); + + // Check for key ring + const keyRingItem = window.inventory.items.find(item => + item && item.scenarioData && + item.scenarioData.type === 'key_ring' + ); + + if (keyRingItem && keyRingItem.scenarioData.allKeys) { + // Convert key ring keys to the format expected by the minigame + const keyRingKeys = keyRingItem.scenarioData.allKeys.map(keyData => { + // Create a mock inventory item for each key in the ring + return { + scenarioData: keyData, + name: 'key', + objectId: `key_ring_${keyData.key_id || keyData.name}` + }; + }); + playerKeys = playerKeys.concat(keyRingKeys); + } if (playerKeys.length > 0) { // Show key selection interface