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;
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.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();
}
};
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
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.type.charAt(0).toUpperCase(), {
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;
}
}
// 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
@@ -180,8 +180,10 @@
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: {
@@ -319,31 +321,17 @@
fill: 0xFFFFFF
});
itemText.anchor.set(0.5, 0.5);
slot.addChild(itemText);
+ slot.isDragging = false;
+ slot.dragData = null;
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;
- }
- }
- }
+ obj.isDragging = true;
+ obj.dragData = obj.itemData;
+ obj.startDragX = x;
+ obj.startDragY = y;
+ draggedSlot = obj;
+ draggedItem = obj.itemData;
};
craftingPanel.addChild(slot);
inventorySlots.push(slot);
}
@@ -761,8 +749,56 @@
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
+ 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.type.charAt(0).toUpperCase(), {
+ 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;
+ }
+ }
+ // 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);