diff --git a/public/break_escape/js/core/game.js b/public/break_escape/js/core/game.js index de2d9d3..d34039f 100644 --- a/public/break_escape/js/core/game.js +++ b/public/break_escape/js/core/game.js @@ -97,6 +97,8 @@ export function preload() { this.load.image('fingerprint', 'objects/fingerprint_small.png'); this.load.image('lockpick', 'objects/lockpick.png'); this.load.image('spoofing_kit', 'objects/office-misc-headphones.png'); + this.load.image('id_badge', 'objects/id_badge.png'); + this.load.image('text_file', 'objects/text_file.png'); this.load.image('keyway', 'icons/keyway.png'); this.load.image('password', 'icons/password.png'); this.load.image('pin', 'icons/pin.png'); diff --git a/public/break_escape/js/systems/inventory.js b/public/break_escape/js/systems/inventory.js index 7c57aa4..ac9c00d 100644 --- a/public/break_escape/js/systems/inventory.js +++ b/public/break_escape/js/systems/inventory.js @@ -330,7 +330,30 @@ export async function addToInventory(sprite) { }); if (isAlreadyInInventory) { - console.log(`Item ${itemIdentifier} (id: ${itemData.id || itemData.key_id || 'none'}) is already in inventory - skipping duplicate`); + console.log(`Item ${itemIdentifier} (id: ${itemData.id || itemData.key_id || 'none'}) is already in inventory - removing from environment`); + + // Remove from environment even if already in inventory + if (window.currentPlayerRoom && rooms[window.currentPlayerRoom] && rooms[window.currentPlayerRoom].objects) { + if (rooms[window.currentPlayerRoom].objects[sprite.objectId]) { + const roomObj = rooms[window.currentPlayerRoom].objects[sprite.objectId]; + if (roomObj.setVisible) { + roomObj.setVisible(false); + } + roomObj.active = false; + console.log(`Removed duplicate object ${sprite.objectId} from room`); + } + } + + // Hide the sprite if it has setVisible method + if (sprite.setVisible && typeof sprite.setVisible === 'function') { + sprite.setVisible(false); + } + + // Show notification to player + if (window.gameAlert) { + window.gameAlert('Already in inventory', 'info', itemData.name || 'Item', 2000); + } + return false; } diff --git a/public/break_escape/js/systems/npc-hostile.js b/public/break_escape/js/systems/npc-hostile.js index c33ae9f..8423e6d 100644 --- a/public/break_escape/js/systems/npc-hostile.js +++ b/public/break_escape/js/systems/npc-hostile.js @@ -230,7 +230,19 @@ function dropNPCItems(npcId) { const spawnY = Math.round(sprite.y); // Create actual Phaser sprite for the dropped item - const texture = item.texture || item.type || 'key'; + // Try item.texture, then item.type, with fallback to 'key' if texture doesn't exist + let texture = item.texture || item.type || 'key'; + + console.log(`💧 Attempting to drop item: type="${item.type}", name="${item.name}", texture="${texture}"`); + + // Safety check: verify texture exists, fallback to 'key' if not + if (!gameRef.textures.exists(texture)) { + console.warn(`⚠️ Texture '${texture}' not found for dropped item '${item.name}', using fallback 'key'`); + texture = 'key'; + } else { + console.log(`✅ Texture '${texture}' exists for dropped item '${item.name}'`); + } + const spriteObj = gameRef.add.sprite(spawnX, spawnY, texture); // Set origin to match standard object creation @@ -271,6 +283,18 @@ function dropNPCItems(npcId) { spriteObj[key] = droppedItemData[key]; }); + // IMPORTANT: Preserve texture information for inventory display + // Phaser sprites have a complex texture object, but inventory expects + // a simple object with a 'key' property (matching npc-game-bridge pattern) + // Store both the original texture reference and a simple texture key object + const phaserTexture = spriteObj.texture; // Preserve Phaser's texture object + spriteObj.texture = { + key: texture, // Use the resolved texture name for inventory + _phaserTexture: phaserTexture // Keep reference to original Phaser texture + }; + + console.log(`💧 Dropped item sprite texture set: key="${spriteObj.texture.key}", name="${spriteObj.name}"`); + // Make the sprite interactive spriteObj.setInteractive({ useHandCursor: true });