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 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; 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); } 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.down = function (x, y, obj) { // Try to place item in first empty grid slot for (var r = 0; r < 3; r++) { for (var c = 0; c < 3; c++) { var gridSlot = craftingGrid[r][c]; if (gridSlot.isEmpty) { gridSlot.itemData = obj.itemData; gridSlot.isEmpty = false; gridSlot.tint = 0x3498db; var gridText = new Text2(obj.itemData.type.charAt(0).toUpperCase(), { size: 28, fill: 0xFFFFFF }); gridText.anchor.set(0.5, 0.5); gridSlot.addChild(gridText); inventory.splice(obj.slotIndex, 1); updateInventoryDisplay(); closeCraftingPanel(); openCraftingPanel(); return; } } } }; 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(); } }; 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.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
@@ -178,8 +178,12 @@
var gameState = 'combat'; // 'combat' or 'crafting'
var lastEnemySpawn = 0;
var enemySpawnRate = 300; // 5 seconds
var selectedSlots = [];
+var craftingGrid = [];
+var playerLevel = 1;
+var playerXP = 0;
+var xpToNextLevel = 100;
var materialProperties = {
metal: {
strength: 3,
durability: 2,
@@ -220,8 +224,15 @@
});
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;
var craftButton = LK.getAsset('craftButton', {
anchorX: 0.5,
anchorY: 0.5
});
@@ -241,8 +252,9 @@
player.x = 1024;
player.y = 1366;
function updateInventoryDisplay() {
inventoryText.setText('Inventory: ' + inventory.length + ' items');
+ levelText.setText('Level: ' + playerLevel + ' | XP: ' + playerXP + '/' + xpToNextLevel);
}
function openCraftingPanel() {
if (isCraftingOpen) return;
isCraftingOpen = true;
@@ -250,40 +262,87 @@
// Create crafting panel background
var panelBg = LK.getAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5,
- scaleX: 16,
- scaleY: 12
+ scaleX: 14,
+ scaleY: 16
});
craftingPanel.addChild(panelBg);
- // Create inventory slots
- for (var i = 0; i < inventory.length && i < 20; i++) {
+ // 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.5,
- scaleY: 1.5
+ scaleX: 1.0,
+ scaleY: 1.0
});
- slot.x = i % 5 * 135 - 270;
- slot.y = Math.floor(i / 5) * 135 - 150;
+ slot.x = i % 5 * 90 - 180;
+ slot.y = Math.floor(i / 5) * 90 + 150;
slot.itemData = inventory[i];
slot.slotIndex = i;
- slot.selected = false;
- var itemText = new Text2(inventory[i].type + '\n' + inventory[i].value, {
- size: 30,
+ 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.down = function (x, y, obj) {
- obj.selected = !obj.selected;
- if (obj.selected) {
- obj.tint = 0xFFFF00;
- selectedSlots.push(obj.slotIndex);
- } else {
- obj.tint = 0xFFFFFF;
- var index = selectedSlots.indexOf(obj.slotIndex);
- if (index > -1) selectedSlots.splice(index, 1);
+ // Try to place item in first empty grid slot
+ for (var r = 0; r < 3; r++) {
+ for (var c = 0; c < 3; c++) {
+ var gridSlot = craftingGrid[r][c];
+ if (gridSlot.isEmpty) {
+ gridSlot.itemData = obj.itemData;
+ gridSlot.isEmpty = false;
+ gridSlot.tint = 0x3498db;
+ var gridText = new Text2(obj.itemData.type.charAt(0).toUpperCase(), {
+ size: 28,
+ fill: 0xFFFFFF
+ });
+ gridText.anchor.set(0.5, 0.5);
+ gridSlot.addChild(gridText);
+ inventory.splice(obj.slotIndex, 1);
+ updateInventoryDisplay();
+ closeCraftingPanel();
+ openCraftingPanel();
+ return;
+ }
+ }
}
};
craftingPanel.addChild(slot);
inventorySlots.push(slot);
@@ -292,27 +351,25 @@
var craftActionButton = LK.getAsset('craftButton', {
anchorX: 0.5,
anchorY: 0.5
});
- craftActionButton.y = 200;
- var craftActionText = new Text2('CRAFT ITEMS', {
- size: 30,
+ 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 () {
- if (selectedSlots.length >= 1) {
- craftSelectedItems();
- }
+ craftFromGrid();
};
craftingPanel.addChild(craftActionButton);
// Create close button
var closeButton = LK.getAsset('equipButton', {
anchorX: 0.5,
anchorY: 0.5
});
- closeButton.y = 260;
+ closeButton.y = 420;
var closeText = new Text2('CLOSE', {
size: 24,
fill: 0xFFFFFF
});
@@ -333,8 +390,144 @@
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;
@@ -552,8 +745,11 @@
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;