User prompt
select item then select spot even 1 item can be crated
User prompt
switch from drag and drop to click item click craft spot
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'if (obj.children.length > 0) {' Line Number: 475
User prompt
bigger inventory lookout drag and drop system combine crafting area and item inventory add ways to equip weapons when crafting grid is open pause game
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'type')' in or related to this line: 'var gridText = new Text2(draggedSlot.dragData.type.charAt(0).toUpperCase(), {' Line Number: 966
User prompt
inventory and crafting combine drag and drop system to move things from inventory to crafting grid
User prompt
add incentory
User prompt
inventory drag and drop into crafting Friday any number of items that fit in it can be used to craft
User prompt
3 by 3 grid placement for crafting items and hit craft button when done auto collect materials levels level up upgrades more materials
User prompt
infinite craft system
User prompt
make everything in inventory appear bigger
User prompt
tap to move
Code edit (1 edits merged)
Please save this source code
User prompt
Craft & Clash Arena
User prompt
and its a battle game in addition to any items can be used to craft anything and in any configuration
User prompt
no matter what the item is craftable
Initial prompt
lets make a game about fighting where you gather resources and can make tools by crafting any resources or other items in any way
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var CraftedItem = Container.expand(function (recipe) { var self = Container.call(this); self.recipe = recipe; self.name = recipe.name; self.type = recipe.type; self.power = recipe.power || 0; self.defense = recipe.defense || 0; var itemGraphics; if (self.type === 'weapon') { itemGraphics = self.attachAsset('weapon', { anchorX: 0.5, anchorY: 0.5 }); } else { itemGraphics = self.attachAsset('armor', { anchorX: 0.5, anchorY: 0.5 }); } return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 50; self.maxHealth = 50; self.damage = 15; self.speed = 1; self.lastAttackTime = 0; self.attackCooldown = 120; // 2 seconds at 60fps self.update = function () { if (player && self.health > 0) { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 80) { var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } else { // Attack player if (LK.ticks - self.lastAttackTime > self.attackCooldown) { player.takeDamage(self.damage); self.lastAttackTime = LK.ticks; LK.getSound('hit').play(); } } } }; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { self.dropResources(); self.destroy(); } }; self.dropResources = function () { for (var i = 0; i < 2; i++) { var resource = new Resource(); resource.x = self.x + (Math.random() - 0.5) * 60; resource.y = self.y + (Math.random() - 0.5) * 60; resources.push(resource); game.addChild(resource); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.damage = 20; self.armor = 0; self.weapon = null; self.armorItem = null; self.speed = 3; self.targetX = self.x; self.targetY = self.y; self.isMoving = false; self.update = function () { if (self.isMoving) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } else { self.x = self.targetX; self.y = self.targetY; self.isMoving = false; } } }; self.moveTo = function (x, y) { self.targetX = x; self.targetY = y; self.isMoving = true; }; self.takeDamage = function (amount) { var actualDamage = Math.max(1, amount - self.armor); self.health -= actualDamage; if (self.health <= 0) { self.health = 0; LK.showGameOver(); } LK.effects.flashObject(self, 0xFF0000, 300); }; self.equipWeapon = function (weapon) { self.weapon = weapon; self.damage = 20 + weapon.power; }; self.equipArmor = function (armor) { self.armorItem = armor; self.armor = armor.defense; }; return self; }); var Resource = Container.expand(function () { var self = Container.call(this); var resourceGraphics = self.attachAsset('resource', { anchorX: 0.5, anchorY: 0.5 }); self.type = ['metal', 'wood', 'crystal', 'fabric'][Math.floor(Math.random() * 4)]; self.value = Math.floor(Math.random() * 5) + 1; self.down = function (x, y, obj) { LK.getSound('collect').play(); inventory.push({ type: self.type, value: self.value }); updateInventoryDisplay(); self.destroy(); var index = resources.indexOf(self); if (index > -1) { resources.splice(index, 1); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var player; var enemies = []; var resources = []; var inventory = []; var craftedItems = []; var gameState = 'combat'; // 'combat' or 'crafting' var lastEnemySpawn = 0; var enemySpawnRate = 300; // 5 seconds var selectedSlots = []; var craftingGrid = []; var playerLevel = 1; var draggedItem = null; var draggedSlot = null; var playerXP = 0; var xpToNextLevel = 100; var materialProperties = { metal: { strength: 3, durability: 2, magic: 0, flexibility: 1 }, wood: { strength: 1, durability: 1, magic: 0, flexibility: 2 }, crystal: { strength: 2, durability: 1, magic: 4, flexibility: 0 }, fabric: { strength: 0, durability: 0, magic: 1, flexibility: 3 } }; // UI Elements var healthBar = new Text2('Health: 100/100', { size: 40, fill: 0xFF6B6B }); healthBar.anchor.set(0, 0); LK.gui.topLeft.addChild(healthBar); healthBar.x = 120; healthBar.y = 20; var inventoryText = new Text2('Inventory: 0 items', { size: 30, fill: 0xFFFFFF }); inventoryText.anchor.set(0.5, 0); LK.gui.top.addChild(inventoryText); inventoryText.y = 80; var levelText = new Text2('Level: 1 | XP: 0/100', { size: 28, fill: 0x00ff00 }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); levelText.y = 120; // Inventory panel variables var inventoryPanel = new Container(); var isInventoryOpen = false; var inventoryButton = LK.getAsset('equipButton', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(inventoryButton); inventoryButton.x = 100; inventoryButton.y = -100; var inventoryButtonText = new Text2('ITEMS', { size: 24, fill: 0xFFFFFF }); inventoryButtonText.anchor.set(0.5, 0.5); inventoryButton.addChild(inventoryButtonText); var craftButton = LK.getAsset('craftButton', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.bottom.addChild(craftButton); craftButton.y = -100; var craftButtonText = new Text2('CRAFT', { size: 36, fill: 0xFFFFFF }); craftButtonText.anchor.set(0.5, 0.5); craftButton.addChild(craftButtonText); var inventorySlots = []; var craftingPanel = new Container(); var isCraftingOpen = false; // Initialize player player = game.addChild(new Player()); player.x = 1024; player.y = 1366; function updateInventoryDisplay() { inventoryText.setText('Inventory: ' + inventory.length + ' items'); levelText.setText('Level: ' + playerLevel + ' | XP: ' + playerXP + '/' + xpToNextLevel); if (isInventoryOpen) { updateInventoryPanel(); } } function openInventoryPanel() { if (isInventoryOpen) return; isInventoryOpen = true; // Create inventory panel background var panelBg = LK.getAsset('inventorySlot', { anchorX: 0.5, anchorY: 0.5, scaleX: 12, scaleY: 14 }); inventoryPanel.addChild(panelBg); // Create title var titleText = new Text2('INVENTORY', { size: 48, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -300; inventoryPanel.addChild(titleText); // Create inventory slots in a grid updateInventoryPanel(); // Create craft button in inventory panel var inventoryCraftButton = LK.getAsset('craftButton', { anchorX: 0.5, anchorY: 0.5 }); inventoryCraftButton.y = 280; var inventoryCraftText = new Text2('CRAFT', { size: 24, fill: 0xFFFFFF }); inventoryCraftText.anchor.set(0.5, 0.5); inventoryCraftButton.addChild(inventoryCraftText); inventoryCraftButton.down = function () { closeInventoryPanel(); openCraftingPanel(); }; inventoryPanel.addChild(inventoryCraftButton); // Create close button var closeButton = LK.getAsset('equipButton', { anchorX: 0.5, anchorY: 0.5 }); closeButton.y = 350; var closeText = new Text2('CLOSE', { size: 24, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeButton.addChild(closeText); closeButton.down = function () { closeInventoryPanel(); }; inventoryPanel.addChild(closeButton); game.addChild(inventoryPanel); inventoryPanel.x = 1024; inventoryPanel.y = 1366; } function updateInventoryPanel() { if (!isInventoryOpen) return; // Remove existing inventory slots (except background, title, and close button) for (var i = inventoryPanel.children.length - 1; i >= 0; i--) { var child = inventoryPanel.children[i]; if (child.isInventorySlot) { inventoryPanel.removeChild(child); } } // Create inventory slots in a 6x8 grid var slotsPerRow = 6; var maxSlots = 48; var slotSize = 70; var startX = -(slotsPerRow - 1) * slotSize / 2; var startY = -200; for (var i = 0; i < Math.min(inventory.length, maxSlots); i++) { var row = Math.floor(i / slotsPerRow); var col = i % slotsPerRow; var slot = LK.getAsset('inventorySlot', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); slot.x = startX + col * slotSize; slot.y = startY + row * slotSize; slot.isInventorySlot = true; slot.itemData = inventory[i]; slot.slotIndex = i; // Color code by material type var itemColor = 0x34495e; switch (inventory[i].type) { case 'metal': itemColor = 0x95a5a6; break; case 'wood': itemColor = 0x8b4513; break; case 'crystal': itemColor = 0x9b59b6; break; case 'fabric': itemColor = 0x3498db; break; } slot.tint = itemColor; // Add item text var itemText = new Text2(inventory[i].type.charAt(0).toUpperCase() + '\n' + inventory[i].value, { size: 16, fill: 0xFFFFFF }); itemText.anchor.set(0.5, 0.5); slot.addChild(itemText); // Add drag functionality to inventory slots slot.isDragging = false; slot.dragData = null; slot.down = function (x, y, obj) { obj.isDragging = true; obj.dragData = obj.itemData; obj.startDragX = x; obj.startDragY = y; draggedSlot = obj; draggedItem = obj.itemData; }; inventoryPanel.addChild(slot); } } function closeInventoryPanel() { isInventoryOpen = false; inventoryPanel.destroy(); inventoryPanel = new Container(); } function openCraftingPanel() { if (isCraftingOpen) return; isCraftingOpen = true; gameState = 'crafting'; // Create crafting panel background var panelBg = LK.getAsset('inventorySlot', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 16 }); craftingPanel.addChild(panelBg); // Create 3x3 crafting grid craftingGrid = []; for (var row = 0; row < 3; row++) { craftingGrid[row] = []; for (var col = 0; col < 3; col++) { var gridSlot = LK.getAsset('inventorySlot', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2 }); gridSlot.x = col * 120 - 120; gridSlot.y = row * 120 - 200; gridSlot.row = row; gridSlot.col = col; gridSlot.isEmpty = true; gridSlot.itemData = null; gridSlot.tint = 0x2c3e50; gridSlot.down = function (x, y, obj) { // Remove item from grid slot if (!obj.isEmpty) { inventory.push(obj.itemData); obj.itemData = null; obj.isEmpty = true; obj.tint = 0x2c3e50; if (obj.children.length > 0) { obj.removeChild(obj.children[0]); } updateInventoryDisplay(); } }; craftingPanel.addChild(gridSlot); craftingGrid[row][col] = gridSlot; } } // Create inventory display area for (var i = 0; i < inventory.length && i < 15; i++) { var slot = LK.getAsset('inventorySlot', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 1.0 }); slot.x = i % 5 * 90 - 180; slot.y = Math.floor(i / 5) * 90 + 150; slot.itemData = inventory[i]; slot.slotIndex = i; var itemText = new Text2(inventory[i].type.charAt(0).toUpperCase(), { size: 24, fill: 0xFFFFFF }); itemText.anchor.set(0.5, 0.5); slot.addChild(itemText); slot.isDragging = false; slot.dragData = null; slot.down = function (x, y, obj) { obj.isDragging = true; obj.dragData = obj.itemData; obj.startDragX = x; obj.startDragY = y; draggedSlot = obj; draggedItem = obj.itemData; }; craftingPanel.addChild(slot); inventorySlots.push(slot); } // Create craft button var craftActionButton = LK.getAsset('craftButton', { anchorX: 0.5, anchorY: 0.5 }); craftActionButton.y = 350; var craftActionText = new Text2('CRAFT', { size: 36, fill: 0xFFFFFF }); craftActionText.anchor.set(0.5, 0.5); craftActionButton.addChild(craftActionText); craftActionButton.down = function () { craftFromGrid(); }; craftingPanel.addChild(craftActionButton); // Create close button var closeButton = LK.getAsset('equipButton', { anchorX: 0.5, anchorY: 0.5 }); closeButton.y = 420; var closeText = new Text2('CLOSE', { size: 24, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeButton.addChild(closeText); closeButton.down = function () { closeCraftingPanel(); }; craftingPanel.addChild(closeButton); game.addChild(craftingPanel); craftingPanel.x = 1024; craftingPanel.y = 1366; } function closeCraftingPanel() { isCraftingOpen = false; gameState = 'combat'; selectedSlots = []; inventorySlots = []; craftingPanel.destroy(); craftingPanel = new Container(); } function craftFromGrid() { var gridItems = []; var totalValue = 0; var materials = {}; var materialTypes = []; // Collect items from 3x3 grid for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { var gridSlot = craftingGrid[row][col]; if (!gridSlot.isEmpty && gridSlot.itemData) { gridItems.push({ item: gridSlot.itemData, row: row, col: col }); var item = gridSlot.itemData; if (!materials[item.type]) { materials[item.type] = 0; materialTypes.push(item.type); } materials[item.type] += item.value; totalValue += item.value; } } } if (gridItems.length === 0) return; // Calculate combined properties same as before var combinedProps = { strength: 0, durability: 0, magic: 0, flexibility: 0 }; var dominantMaterial = ''; var highestAmount = 0; for (var matType in materials) { var amount = materials[matType]; var props = materialProperties[matType]; combinedProps.strength += props.strength * amount; combinedProps.durability += props.durability * amount; combinedProps.magic += props.magic * amount; combinedProps.flexibility += props.flexibility * amount; if (amount > highestAmount) { highestAmount = amount; dominantMaterial = matType; } } // Grid position bonus - center items get bonus var positionBonus = 0; for (var g = 0; g < gridItems.length; g++) { var gridItem = gridItems[g]; if (gridItem.row === 1 && gridItem.col === 1) { positionBonus += 5; // Center slot bonus } if ((gridItem.row === 0 || gridItem.row === 2) && (gridItem.col === 0 || gridItem.col === 2)) { positionBonus += 2; // Corner bonus } } // Determine item type and stats var itemType = 'tool'; var itemName = 'Grid-Forged Item'; var power = positionBonus; var defense = positionBonus; if (combinedProps.strength > combinedProps.durability && combinedProps.strength > combinedProps.magic) { itemType = 'weapon'; power = Math.floor(combinedProps.strength * 2 + totalValue + positionBonus); } else if (combinedProps.durability > combinedProps.magic) { itemType = 'armor'; defense = Math.floor(combinedProps.durability * 2 + totalValue + positionBonus); } else if (combinedProps.magic > 8) { itemType = 'artifact'; power = Math.floor(combinedProps.magic * 1.5 + positionBonus); defense = Math.floor(combinedProps.magic + positionBonus); } else { itemType = 'tool'; power = Math.floor(totalValue * 1.5 + positionBonus); defense = Math.floor(totalValue + positionBonus); } // Generate name based on grid pattern var patternNames = ['Cross', 'Line', 'Corner', 'Full', 'Sparse', 'Dense']; var patternName = patternNames[Math.floor(Math.random() * patternNames.length)]; itemName = patternName + ' ' + dominantMaterial.charAt(0).toUpperCase() + dominantMaterial.slice(1) + ' ' + itemType.charAt(0).toUpperCase() + itemType.slice(1); var newItem = { name: itemName, type: itemType, power: power, defense: defense, materials: materialTypes.join('+'), rarity: gridItems.length >= 7 ? 'legendary' : gridItems.length >= 5 ? 'masterwork' : gridItems.length >= 3 ? 'rare' : 'common' }; craftedItems.push(newItem); // Clear grid for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { var gridSlot = craftingGrid[row][col]; if (!gridSlot.isEmpty) { gridSlot.itemData = null; gridSlot.isEmpty = true; gridSlot.tint = 0x2c3e50; if (gridSlot.children.length > 0) { gridSlot.removeChild(gridSlot.children[0]); } } } } // Add XP and check for level up playerXP += gridItems.length * 10; checkLevelUp(); LK.getSound('craft').play(); closeCraftingPanel(); showCraftedItems(); } function checkLevelUp() { if (playerXP >= xpToNextLevel) { playerLevel++; playerXP -= xpToNextLevel; xpToNextLevel = Math.floor(xpToNextLevel * 1.5); // Auto collect materials on level up autoCollectMaterials(); // Show level up effect LK.effects.flashScreen(0x00ff00, 1000); } } function autoCollectMaterials() { var materialsToAdd = playerLevel * 2; var materialTypes = ['metal', 'wood', 'crystal', 'fabric']; for (var i = 0; i < materialsToAdd; i++) { var randomType = materialTypes[Math.floor(Math.random() * materialTypes.length)]; var randomValue = Math.floor(Math.random() * playerLevel) + 1; inventory.push({ type: randomType, value: randomValue }); } updateInventoryDisplay(); } function craftSelectedItems() { if (selectedSlots.length < 1) return; var materials = {}; var totalValue = 0; var materialTypes = []; // Calculate materials from selected slots for (var i = 0; i < selectedSlots.length; i++) { var item = inventory[selectedSlots[i]]; if (!materials[item.type]) { materials[item.type] = 0; materialTypes.push(item.type); } materials[item.type] += item.value; totalValue += item.value; } // Calculate combined properties var combinedProps = { strength: 0, durability: 0, magic: 0, flexibility: 0 }; var dominantMaterial = ''; var highestAmount = 0; for (var matType in materials) { var amount = materials[matType]; var props = materialProperties[matType]; // Add weighted properties combinedProps.strength += props.strength * amount; combinedProps.durability += props.durability * amount; combinedProps.magic += props.magic * amount; combinedProps.flexibility += props.flexibility * amount; // Track dominant material if (amount > highestAmount) { highestAmount = amount; dominantMaterial = matType; } } // Determine item type based on properties var itemType = 'tool'; var itemName = 'Crafted Item'; var power = 0; var defense = 0; var special = ''; if (combinedProps.strength > combinedProps.durability && combinedProps.strength > combinedProps.magic) { itemType = 'weapon'; power = Math.floor(combinedProps.strength * 2 + totalValue); if (combinedProps.magic > 5) { special = 'Magical '; power += Math.floor(combinedProps.magic); } } else if (combinedProps.durability > combinedProps.magic) { itemType = 'armor'; defense = Math.floor(combinedProps.durability * 2 + totalValue); if (combinedProps.flexibility > 5) { special = 'Flexible '; defense += Math.floor(combinedProps.flexibility / 2); } } else if (combinedProps.magic > 8) { itemType = 'artifact'; power = Math.floor(combinedProps.magic * 1.5); defense = Math.floor(combinedProps.magic); special = 'Enchanted '; } else { itemType = 'tool'; power = Math.floor(totalValue * 1.5); defense = Math.floor(totalValue); } // Generate creative name based on materials and properties var materialNames = { metal: ['Iron', 'Steel', 'Bronze'], wood: ['Oak', 'Pine', 'Willow'], crystal: ['Diamond', 'Ruby', 'Sapphire'], fabric: ['Silk', 'Cotton', 'Leather'] }; var typeNames = { weapon: ['Blade', 'Sword', 'Axe', 'Spear', 'Hammer'], armor: ['Shield', 'Plate', 'Mail', 'Guard', 'Protector'], artifact: ['Orb', 'Charm', 'Relic', 'Talisman'], tool: ['Tool', 'Device', 'Instrument', 'Implement'] }; var baseName = materialNames[dominantMaterial][Math.floor(Math.random() * materialNames[dominantMaterial].length)]; var typeName = typeNames[itemType][Math.floor(Math.random() * typeNames[itemType].length)]; // Add fusion indicator for multiple materials var fusionPrefix = ''; if (materialTypes.length > 1) { fusionPrefix = 'Fused '; } itemName = fusionPrefix + special + baseName + ' ' + typeName; // Bonus for unique combinations if (materialTypes.length >= 3) { power += 5; defense += 5; itemName = 'Masterwork ' + itemName; } if (materialTypes.length >= 4) { power += 10; defense += 10; itemName = 'Legendary ' + itemName; } var newItem = { name: itemName, type: itemType, power: power, defense: defense, materials: materialTypes.join('+'), rarity: materialTypes.length >= 4 ? 'legendary' : materialTypes.length >= 3 ? 'masterwork' : materialTypes.length > 1 ? 'fused' : 'common' }; craftedItems.push(newItem); // Remove used items from inventory selectedSlots.sort(function (a, b) { return b - a; }); for (var s = 0; s < selectedSlots.length; s++) { inventory.splice(selectedSlots[s], 1); } LK.getSound('craft').play(); updateInventoryDisplay(); closeCraftingPanel(); showCraftedItems(); } function showCraftedItems() { if (craftedItems.length === 0) return; var equipPanel = new Container(); for (var i = 0; i < craftedItems.length && i < 5; i++) { var item = craftedItems[i]; var equipButton = LK.getAsset('equipButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1.5 }); equipButton.y = i * 90 - 180; equipButton.itemData = item; equipButton.itemIndex = i; // Set button color based on rarity var buttonColor = 0x9b59b6; if (item.rarity === 'legendary') buttonColor = 0xf1c40f;else if (item.rarity === 'masterwork') buttonColor = 0xe74c3c;else if (item.rarity === 'fused') buttonColor = 0x3498db; equipButton.tint = buttonColor; var equipText = new Text2(item.name + '\n' + (item.type === 'weapon' ? 'Power: ' + item.power : item.type === 'armor' ? 'Defense: ' + item.defense : 'Power: ' + item.power + ' Defense: ' + item.defense) + '\nMaterials: ' + item.materials, { size: 16, fill: 0xFFFFFF }); equipText.anchor.set(0.5, 0.5); equipButton.addChild(equipText); equipButton.down = function (x, y, obj) { var item = obj.itemData; if (item.type === 'weapon') { player.equipWeapon(item); } else if (item.type === 'armor') { player.equipArmor(item); } else { // Artifact or tool - can be equipped as either if (item.power > item.defense) { player.equipWeapon(item); } else { player.equipArmor(item); } } craftedItems.splice(obj.itemIndex, 1); equipPanel.destroy(); }; equipPanel.addChild(equipButton); } game.addChild(equipPanel); equipPanel.x = 1024; equipPanel.y = 1366; LK.setTimeout(function () { if (equipPanel.parent) equipPanel.destroy(); }, 8000); } function spawnEnemy() { var enemy = new Enemy(); var side = Math.floor(Math.random() * 4); switch (side) { case 0: // top enemy.x = Math.random() * 2048; enemy.y = -50; break; case 1: // right enemy.x = 2098; enemy.y = Math.random() * 2732; break; case 2: // bottom enemy.x = Math.random() * 2048; enemy.y = 2782; break; case 3: // left enemy.x = -50; enemy.y = Math.random() * 2732; break; } enemies.push(enemy); game.addChild(enemy); } craftButton.down = function () { if (gameState === 'combat') { openCraftingPanel(); } }; inventoryButton.down = function () { if (gameState === 'combat' && !isInventoryOpen) { openInventoryPanel(); } }; game.down = function (x, y, obj) { if (gameState === 'combat') { // Check if tapping on an enemy to attack var attackedEnemy = false; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - x; var dy = enemy.y - y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 50 && enemy.health > 0) { // Direct tap on enemy - attack enemy.takeDamage(player.damage); LK.getSound('hit').play(); if (enemy.health <= 0) { LK.setScore(LK.getScore() + 10); playerXP += 15; checkLevelUp(); updateInventoryDisplay(); var index = enemies.indexOf(enemy); if (index > -1) enemies.splice(index, 1); } attackedEnemy = true; break; } } // If not attacking an enemy, move player to tapped location if (!attackedEnemy) { player.moveTo(x, y); } } }; game.move = function (x, y, obj) { if (draggedSlot && draggedSlot.isDragging) { // Visual feedback during drag - could move the dragged item visually // For now, we'll handle drop logic in the up event } }; game.up = function (x, y, obj) { // Handle drag and drop completion from inventory to crafting grid if (draggedSlot && draggedSlot.isDragging && isCraftingOpen) { var droppedOnGrid = false; // Check if dropped on any grid slot for (var r = 0; r < 3; r++) { for (var c = 0; c < 3; c++) { var gridSlot = craftingGrid[r][c]; var gridX = gridSlot.parent.x + gridSlot.x; var gridY = gridSlot.parent.y + gridSlot.y; var distance = Math.sqrt((x - gridX) * (x - gridX) + (y - gridY) * (y - gridY)); // If dropped close to a grid slot and it's empty if (distance < 60 && gridSlot.isEmpty) { gridSlot.itemData = draggedSlot.dragData; gridSlot.isEmpty = false; gridSlot.tint = 0x3498db; var gridText = new Text2(draggedSlot.dragData && draggedSlot.dragData.type ? draggedSlot.dragData.type.charAt(0).toUpperCase() : 'X', { size: 28, fill: 0xFFFFFF }); gridText.anchor.set(0.5, 0.5); gridSlot.addChild(gridText); // Remove item from inventory inventory.splice(draggedSlot.slotIndex, 1); updateInventoryDisplay(); closeCraftingPanel(); openCraftingPanel(); droppedOnGrid = true; break; } } if (droppedOnGrid) break; } } // Handle drag and drop completion from inventory panel to crafting grid if (draggedSlot && draggedSlot.isDragging && isInventoryOpen && isCraftingOpen) { var droppedOnGrid = false; // Check if dropped on any grid slot for (var r = 0; r < 3; r++) { for (var c = 0; c < 3; c++) { var gridSlot = craftingGrid[r][c]; var gridX = gridSlot.parent.x + gridSlot.x; var gridY = gridSlot.parent.y + gridSlot.y; var distance = Math.sqrt((x - gridX) * (x - gridX) + (y - gridY) * (y - gridY)); // If dropped close to a grid slot and it's empty if (distance < 60 && gridSlot.isEmpty) { gridSlot.itemData = draggedSlot.dragData; gridSlot.isEmpty = false; gridSlot.tint = 0x3498db; var gridText = new Text2(draggedSlot.dragData && draggedSlot.dragData.type ? draggedSlot.dragData.type.charAt(0).toUpperCase() : 'X', { size: 28, fill: 0xFFFFFF }); gridText.anchor.set(0.5, 0.5); gridSlot.addChild(gridText); // Remove item from inventory inventory.splice(draggedSlot.slotIndex, 1); updateInventoryDisplay(); updateInventoryPanel(); droppedOnGrid = true; break; } } if (droppedOnGrid) break; } } // Reset drag state if (draggedSlot) { draggedSlot.isDragging = false; draggedSlot.dragData = null; } draggedSlot = null; draggedItem = null; }; game.update = function () { if (gameState !== 'combat') return; // Update health display healthBar.setText('Health: ' + player.health + '/' + player.maxHealth); // Spawn enemies if (LK.ticks - lastEnemySpawn > enemySpawnRate) { spawnEnemy(); lastEnemySpawn = LK.ticks; // Increase difficulty over time if (enemySpawnRate > 120) { enemySpawnRate -= 2; } } // Clean up resources that are too far for (var i = resources.length - 1; i >= 0; i--) { var resource = resources[i]; var dx = resource.x - player.x; var dy = resource.y - player.y; if (Math.sqrt(dx * dx + dy * dy) > 1000) { resource.destroy(); resources.splice(i, 1); } } // Win condition if (LK.getScore() >= 500) { LK.showYouWin(); } };
===================================================================
--- original.js
+++ change.js
@@ -925,9 +925,9 @@
if (distance < 60 && gridSlot.isEmpty) {
gridSlot.itemData = draggedSlot.dragData;
gridSlot.isEmpty = false;
gridSlot.tint = 0x3498db;
- var gridText = new Text2(draggedSlot.dragData.type.charAt(0).toUpperCase(), {
+ var gridText = new Text2(draggedSlot.dragData && draggedSlot.dragData.type ? draggedSlot.dragData.type.charAt(0).toUpperCase() : 'X', {
size: 28,
fill: 0xFFFFFF
});
gridText.anchor.set(0.5, 0.5);
@@ -958,9 +958,9 @@
if (distance < 60 && gridSlot.isEmpty) {
gridSlot.itemData = draggedSlot.dragData;
gridSlot.isEmpty = false;
gridSlot.tint = 0x3498db;
- var gridText = new Text2(draggedSlot.dragData.type.charAt(0).toUpperCase(), {
+ var gridText = new Text2(draggedSlot.dragData && draggedSlot.dragData.type ? draggedSlot.dragData.type.charAt(0).toUpperCase() : 'X', {
size: 28,
fill: 0xFFFFFF
});
gridText.anchor.set(0.5, 0.5);