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.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 craftingRecipes = [{
name: 'Iron Sword',
type: 'weapon',
power: 15,
materials: {
metal: 2
}
}, {
name: 'Wood Shield',
type: 'armor',
defense: 10,
materials: {
wood: 3
}
}, {
name: 'Crystal Blade',
type: 'weapon',
power: 25,
materials: {
crystal: 2,
metal: 1
}
}, {
name: 'Magic Armor',
type: 'armor',
defense: 20,
materials: {
crystal: 2,
fabric: 2
}
}];
// 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 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');
}
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: 12,
scaleY: 8
});
craftingPanel.addChild(panelBg);
// Create inventory slots
for (var i = 0; i < inventory.length && i < 20; i++) {
var slot = LK.getAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5
});
slot.x = i % 5 * 90 - 180;
slot.y = Math.floor(i / 5) * 90 - 100;
slot.itemData = inventory[i];
slot.slotIndex = i;
slot.selected = false;
var itemText = new Text2(inventory[i].type + '\n' + inventory[i].value, {
size: 20,
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);
}
};
craftingPanel.addChild(slot);
inventorySlots.push(slot);
}
// Create craft button
var craftActionButton = LK.getAsset('craftButton', {
anchorX: 0.5,
anchorY: 0.5
});
craftActionButton.y = 200;
var craftActionText = new Text2('CRAFT ITEMS', {
size: 30,
fill: 0xFFFFFF
});
craftActionText.anchor.set(0.5, 0.5);
craftActionButton.addChild(craftActionText);
craftActionButton.down = function () {
craftSelectedItems();
};
craftingPanel.addChild(craftActionButton);
// Create close button
var closeButton = LK.getAsset('equipButton', {
anchorX: 0.5,
anchorY: 0.5
});
closeButton.y = 260;
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 craftSelectedItems() {
if (selectedSlots.length < 2) return;
var materials = {};
var totalValue = 0;
// 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;
materials[item.type] += item.value;
totalValue += item.value;
}
// Find matching recipe
var recipe = null;
for (var r = 0; r < craftingRecipes.length; r++) {
var canCraft = true;
for (var mat in craftingRecipes[r].materials) {
if (!materials[mat] || materials[mat] < craftingRecipes[r].materials[mat]) {
canCraft = false;
break;
}
}
if (canCraft) {
recipe = craftingRecipes[r];
break;
}
}
// Create item
var newItem;
if (recipe) {
newItem = {
name: recipe.name,
type: recipe.type,
power: recipe.power || 0,
defense: recipe.defense || 0
};
} else {
// Create random item
newItem = {
name: 'Custom Item',
type: Math.random() < 0.5 ? 'weapon' : 'armor',
power: totalValue * 2,
defense: totalValue * 2
};
}
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
});
equipButton.y = i * 60 - 120;
equipButton.itemData = item;
equipButton.itemIndex = i;
var equipText = new Text2(item.name, {
size: 20,
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 {
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();
}, 5000);
}
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') {
// Attack nearby enemies
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 < 100 && enemy.health > 0) {
enemy.takeDamage(player.damage);
LK.getSound('hit').play();
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + 10);
var index = enemies.indexOf(enemy);
if (index > -1) enemies.splice(index, 1);
}
break;
}
}
}
};
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
@@ -1,6 +1,488 @@
-/****
+/****
+* 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.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: 0x000000
-});
\ No newline at end of file
+ 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 craftingRecipes = [{
+ name: 'Iron Sword',
+ type: 'weapon',
+ power: 15,
+ materials: {
+ metal: 2
+ }
+}, {
+ name: 'Wood Shield',
+ type: 'armor',
+ defense: 10,
+ materials: {
+ wood: 3
+ }
+}, {
+ name: 'Crystal Blade',
+ type: 'weapon',
+ power: 25,
+ materials: {
+ crystal: 2,
+ metal: 1
+ }
+}, {
+ name: 'Magic Armor',
+ type: 'armor',
+ defense: 20,
+ materials: {
+ crystal: 2,
+ fabric: 2
+ }
+}];
+// 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 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');
+}
+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: 12,
+ scaleY: 8
+ });
+ craftingPanel.addChild(panelBg);
+ // Create inventory slots
+ for (var i = 0; i < inventory.length && i < 20; i++) {
+ var slot = LK.getAsset('inventorySlot', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ slot.x = i % 5 * 90 - 180;
+ slot.y = Math.floor(i / 5) * 90 - 100;
+ slot.itemData = inventory[i];
+ slot.slotIndex = i;
+ slot.selected = false;
+ var itemText = new Text2(inventory[i].type + '\n' + inventory[i].value, {
+ size: 20,
+ 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);
+ }
+ };
+ craftingPanel.addChild(slot);
+ inventorySlots.push(slot);
+ }
+ // Create craft button
+ var craftActionButton = LK.getAsset('craftButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ craftActionButton.y = 200;
+ var craftActionText = new Text2('CRAFT ITEMS', {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ craftActionText.anchor.set(0.5, 0.5);
+ craftActionButton.addChild(craftActionText);
+ craftActionButton.down = function () {
+ craftSelectedItems();
+ };
+ craftingPanel.addChild(craftActionButton);
+ // Create close button
+ var closeButton = LK.getAsset('equipButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ closeButton.y = 260;
+ 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 craftSelectedItems() {
+ if (selectedSlots.length < 2) return;
+ var materials = {};
+ var totalValue = 0;
+ // 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;
+ materials[item.type] += item.value;
+ totalValue += item.value;
+ }
+ // Find matching recipe
+ var recipe = null;
+ for (var r = 0; r < craftingRecipes.length; r++) {
+ var canCraft = true;
+ for (var mat in craftingRecipes[r].materials) {
+ if (!materials[mat] || materials[mat] < craftingRecipes[r].materials[mat]) {
+ canCraft = false;
+ break;
+ }
+ }
+ if (canCraft) {
+ recipe = craftingRecipes[r];
+ break;
+ }
+ }
+ // Create item
+ var newItem;
+ if (recipe) {
+ newItem = {
+ name: recipe.name,
+ type: recipe.type,
+ power: recipe.power || 0,
+ defense: recipe.defense || 0
+ };
+ } else {
+ // Create random item
+ newItem = {
+ name: 'Custom Item',
+ type: Math.random() < 0.5 ? 'weapon' : 'armor',
+ power: totalValue * 2,
+ defense: totalValue * 2
+ };
+ }
+ 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
+ });
+ equipButton.y = i * 60 - 120;
+ equipButton.itemData = item;
+ equipButton.itemIndex = i;
+ var equipText = new Text2(item.name, {
+ size: 20,
+ 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 {
+ 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();
+ }, 5000);
+}
+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') {
+ // Attack nearby enemies
+ 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 < 100 && enemy.health > 0) {
+ enemy.takeDamage(player.damage);
+ LK.getSound('hit').play();
+ if (enemy.health <= 0) {
+ LK.setScore(LK.getScore() + 10);
+ var index = enemies.indexOf(enemy);
+ if (index > -1) enemies.splice(index, 1);
+ }
+ break;
+ }
+ }
+ }
+};
+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();
+ }
+};
\ No newline at end of file