User prompt
Basınca secmiyor
User prompt
Bayraklı bir dil menüsü olsun
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'var distance = Math.sqrt(Math.pow(player.x - enemy.x, 2) + Math.pow(player.y - enemy.y, 2));' Line Number: 461
User prompt
Dİl seçme bölümü olsun ingilizce ve Türkçe ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Ve Türkçe ekleme kısmı yap
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = battlefieldContainer.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 339
Code edit (1 edits merged)
Please save this source code
User prompt
Commander's War: 10 Battles
Initial prompt
2. Dünya savaşı oyunu yapalım 10 savaşdan oluşsun komutanla her savaşın başında konuşalım
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { currentBattle: 0, battlesWon: 0, totalUnits: 12 }); /**** * Classes ****/ var DialogSystem = Container.expand(function () { var self = Container.call(this); self.visible = false; self.currentDialogIndex = 0; self.dialogData = []; var dialogBg = self.attachAsset('dialogBox', { anchorX: 0.5, anchorY: 0 }); self.commanderText = new Text2('', { size: 40, fill: '#ffffff' }); self.commanderText.anchor.set(0, 0); self.addChild(self.commanderText); self.continueText = new Text2('TAP TO CONTINUE', { size: 30, fill: '#ffff00' }); self.continueText.anchor.set(0.5, 1); self.addChild(self.continueText); self.x = 2048 / 2; self.y = 2732 - 450; self.commanderText.x = -900; self.commanderText.y = 50; self.continueText.x = 0; self.continueText.y = -50; self.showDialog = function (dialogArray) { self.dialogData = dialogArray; self.currentDialogIndex = 0; self.visible = true; self.displayCurrentDialog(); }; self.displayCurrentDialog = function () { if (self.currentDialogIndex < self.dialogData.length) { var currentText = self.dialogData[self.currentDialogIndex]; self.commanderText.setText(currentText); } }; self.nextDialog = function () { self.currentDialogIndex++; if (self.currentDialogIndex < self.dialogData.length) { self.displayCurrentDialog(); } else { self.hideDialog(); } }; self.hideDialog = function () { self.visible = false; if (currentGameState === 'briefing') { startBattle(); } else if (currentGameState === 'victory') { nextBattle(); } }; self.down = function (x, y, obj) { if (self.visible) { self.nextDialog(); } }; return self; }); var Unit = Container.expand(function (type, unitX, unitY) { var self = Container.call(this); self.unitType = type || 'soldier'; self.health = 3; self.maxHealth = 3; self.selected = false; self.hasMoved = false; var unitGraphics = self.attachAsset(type === 'enemy' ? 'enemyUnit' : 'soldierUnit', { anchorX: 0.5, anchorY: 0.5 }); self.x = unitX || 0; self.y = unitY || 0; self.select = function () { if (self.unitType !== 'enemy' && !self.hasMoved) { self.selected = true; unitGraphics.tint = 0x00ff00; } }; self.deselect = function () { self.selected = false; unitGraphics.tint = 0xffffff; }; self.moveTo = function (targetX, targetY) { if (self.selected && !self.hasMoved) { tween(self, { x: targetX, y: targetY }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { self.hasMoved = true; self.deselect(); checkTurnComplete(); } }); LK.getSound('unitMove').play(); } }; self.takeDamage = function () { self.health--; if (self.health <= 0) { self.destroy(); return true; } return false; }; self.down = function (x, y, obj) { if (self.unitType !== 'enemy' && !self.hasMoved && currentGameState === 'battle') { clearAllSelections(); self.select(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c5234 }); /**** * Game Code ****/ var currentGameState = 'briefing'; // 'briefing', 'battle', 'victory', 'complete' var currentBattle = storage.currentBattle || 0; var battlesWon = storage.battlesWon || 0; var selectedUnit = null; var playerUnits = []; var enemyUnits = []; var objectives = []; var turnComplete = false; // Battle configurations var battleConfigs = [{ name: "Beach Landing", briefing: ["Commander: Welcome to Operation Overlord, soldier!", "Your mission: Secure the beach and eliminate enemy resistance.", "Move your units carefully - the enemy has defensive positions.", "TAP units to select, then TAP destination to move. Good luck!"], playerStartPositions: [[200, 800], [200, 900], [200, 1000]], enemyPositions: [[1600, 400], [1600, 600]], objectivePos: [1600, 500] }, { name: "Forest Patrol", briefing: ["The enemy is hiding in the forest ahead.", "Use the terrain to your advantage.", "Watch for ambushes - move strategically!"], playerStartPositions: [[300, 1000], [400, 1000], [500, 1000]], enemyPositions: [[1400, 300], [1500, 500], [1300, 700]], objectivePos: [1450, 400] }, { name: "Urban Warfare", briefing: ["Street fighting is dangerous business.", "Clear the buildings and secure the objective.", "Every corner could hide an enemy!"], playerStartPositions: [[150, 1100], [250, 1100], [350, 1100], [450, 1100]], enemyPositions: [[1500, 200], [1400, 400], [1600, 600]], objectivePos: [1500, 350] }]; // Extend battle configs to 10 battles for (var i = 3; i < 10; i++) { var baseConfig = battleConfigs[i % 3]; battleConfigs.push({ name: "Battle " + (i + 1), briefing: ["Commander: Battle " + (i + 1) + " awaits!", "The enemy grows stronger with each encounter.", "Use everything you've learned so far!"], playerStartPositions: baseConfig.playerStartPositions, enemyPositions: baseConfig.enemyPositions, objectivePos: baseConfig.objectivePos }); } // UI Elements var battlefieldContainer = game.addChild(new Container()); var battlefield = battlefieldContainer.attachAsset('battlefield', { anchorX: 0.5, anchorY: 0.5 }); battlefieldContainer.x = 2048 / 2; battlefieldContainer.y = (2732 - 400) / 2; var dialogSystem = game.addChild(new DialogSystem()); var battleTitle = new Text2('', { size: 60, fill: '#ffffff' }); battleTitle.anchor.set(0.5, 0); LK.gui.top.addChild(battleTitle); battleTitle.y = 100; var scoreText = new Text2('Battles Won: 0/10', { size: 40, fill: '#ffffff' }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); scoreText.x = -20; scoreText.y = 20; // Game Functions function clearAllSelections() { selectedUnit = null; for (var i = 0; i < playerUnits.length; i++) { playerUnits[i].deselect(); } } function setupBattle() { // Clear previous battle for (var i = playerUnits.length - 1; i >= 0; i--) { playerUnits[i].destroy(); } for (var i = enemyUnits.length - 1; i >= 0; i--) { enemyUnits[i].destroy(); } for (var i = objectives.length - 1; i >= 0; i--) { objectives[i].destroy(); } playerUnits = []; enemyUnits = []; objectives = []; var config = battleConfigs[currentBattle]; battleTitle.setText(config.name); // Create player units for (var i = 0; i < config.playerStartPositions.length; i++) { var pos = config.playerStartPositions[i]; var unit = new Unit('soldier', pos[0], pos[1]); playerUnits.push(unit); battlefieldContainer.addChild(unit); } // Create enemy units for (var i = 0; i < config.enemyPositions.length; i++) { var pos = config.enemyPositions[i]; var enemy = new Unit('enemy', pos[0], pos[1]); enemyUnits.push(enemy); battlefieldContainer.addChild(enemy); } // Create objective var objPos = config.objectivePos; var objective = battlefieldContainer.attachAsset('objective', { anchorX: 0.5, anchorY: 0.5, x: objPos[0], y: objPos[1] }); objectives.push(objective); } function checkTurnComplete() { var allMoved = true; for (var i = 0; i < playerUnits.length; i++) { if (!playerUnits[i].hasMoved) { allMoved = false; break; } } if (allMoved) { // Reset movement for next turn for (var i = 0; i < playerUnits.length; i++) { playerUnits[i].hasMoved = false; } // Check victory condition if (checkVictoryCondition()) { handleVictory(); } } } function checkVictoryCondition() { if (enemyUnits.length === 0) return true; // Check if any player unit is near objective for (var i = 0; i < playerUnits.length; i++) { var unit = playerUnits[i]; var objective = objectives[0]; var distance = Math.sqrt(Math.pow(unit.x - objective.x, 2) + Math.pow(unit.y - objective.y, 2)); if (distance < 120) { return true; } } return false; } function handleVictory() { battlesWon++; storage.battlesWon = battlesWon; storage.currentBattle = currentBattle + 1; LK.getSound('battleWin').play(); updateScoreDisplay(); if (currentBattle >= 9) { // Won all 10 battles currentGameState = 'complete'; dialogSystem.showDialog(["Commander: Outstanding work, soldier!", "You have successfully completed all 10 battles!", "The war is won thanks to your strategic brilliance!", "You are a true military commander!"]); LK.showYouWin(); } else { currentGameState = 'victory'; var victoryMessages = ["Commander: Excellent work! Battle won!", "Your tactical skills are improving with each victory.", "Prepare for the next engagement, soldier."]; dialogSystem.showDialog(victoryMessages); } } function nextBattle() { currentBattle++; if (currentBattle < 10) { currentGameState = 'briefing'; setupBattle(); var config = battleConfigs[currentBattle]; dialogSystem.showDialog(config.briefing); } } function startBattle() { currentGameState = 'battle'; } function updateScoreDisplay() { scoreText.setText('Battles Won: ' + battlesWon + '/10'); } // Mouse/Touch handling battlefieldContainer.down = function (x, y, obj) { if (currentGameState !== 'battle') return; // Convert to battlefield coordinates var localPos = battlefieldContainer.toLocal(obj.parent.toGlobal(obj.position)); // Check if we have a selected unit to move for (var i = 0; i < playerUnits.length; i++) { if (playerUnits[i].selected) { playerUnits[i].moveTo(localPos.x, localPos.y); return; } } }; // Initialize first battle setupBattle(); updateScoreDisplay(); // Show first briefing var firstBriefing = battleConfigs[currentBattle].briefing; dialogSystem.showDialog(firstBriefing); game.update = function () { // Simple AI for enemies (move towards player units occasionally) if (currentGameState === 'battle' && LK.ticks % 180 === 0 && enemyUnits.length > 0) { var randomEnemy = enemyUnits[Math.floor(Math.random() * enemyUnits.length)]; if (playerUnits.length > 0) { var targetPlayer = playerUnits[Math.floor(Math.random() * playerUnits.length)]; var moveX = randomEnemy.x + (targetPlayer.x - randomEnemy.x) * 0.1; var moveY = randomEnemy.y + (targetPlayer.y - randomEnemy.y) * 0.1; tween(randomEnemy, { x: moveX, y: moveY }, { duration: 1000, easing: tween.easeOut }); } } // Check for combat (simple collision detection) if (currentGameState === 'battle' && LK.ticks % 60 === 0) { for (var i = playerUnits.length - 1; i >= 0; i--) { for (var j = enemyUnits.length - 1; j >= 0; j--) { var player = playerUnits[i]; var enemy = enemyUnits[j]; var distance = Math.sqrt(Math.pow(player.x - enemy.x, 2) + Math.pow(player.y - enemy.y, 2)); if (distance < 100) { LK.getSound('unitAttack').play(); if (Math.random() > 0.5) { if (enemy.takeDamage()) { enemyUnits.splice(j, 1); } } else { if (player.takeDamage()) { playerUnits.splice(i, 1); } } // Check game over condition if (playerUnits.length === 0) { LK.showGameOver(); } } } } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,379 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ currentBattle: 0,
+ battlesWon: 0,
+ totalUnits: 12
+});
+
+/****
+* Classes
+****/
+var DialogSystem = Container.expand(function () {
+ var self = Container.call(this);
+ self.visible = false;
+ self.currentDialogIndex = 0;
+ self.dialogData = [];
+ var dialogBg = self.attachAsset('dialogBox', {
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ self.commanderText = new Text2('', {
+ size: 40,
+ fill: '#ffffff'
+ });
+ self.commanderText.anchor.set(0, 0);
+ self.addChild(self.commanderText);
+ self.continueText = new Text2('TAP TO CONTINUE', {
+ size: 30,
+ fill: '#ffff00'
+ });
+ self.continueText.anchor.set(0.5, 1);
+ self.addChild(self.continueText);
+ self.x = 2048 / 2;
+ self.y = 2732 - 450;
+ self.commanderText.x = -900;
+ self.commanderText.y = 50;
+ self.continueText.x = 0;
+ self.continueText.y = -50;
+ self.showDialog = function (dialogArray) {
+ self.dialogData = dialogArray;
+ self.currentDialogIndex = 0;
+ self.visible = true;
+ self.displayCurrentDialog();
+ };
+ self.displayCurrentDialog = function () {
+ if (self.currentDialogIndex < self.dialogData.length) {
+ var currentText = self.dialogData[self.currentDialogIndex];
+ self.commanderText.setText(currentText);
+ }
+ };
+ self.nextDialog = function () {
+ self.currentDialogIndex++;
+ if (self.currentDialogIndex < self.dialogData.length) {
+ self.displayCurrentDialog();
+ } else {
+ self.hideDialog();
+ }
+ };
+ self.hideDialog = function () {
+ self.visible = false;
+ if (currentGameState === 'briefing') {
+ startBattle();
+ } else if (currentGameState === 'victory') {
+ nextBattle();
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (self.visible) {
+ self.nextDialog();
+ }
+ };
+ return self;
+});
+var Unit = Container.expand(function (type, unitX, unitY) {
+ var self = Container.call(this);
+ self.unitType = type || 'soldier';
+ self.health = 3;
+ self.maxHealth = 3;
+ self.selected = false;
+ self.hasMoved = false;
+ var unitGraphics = self.attachAsset(type === 'enemy' ? 'enemyUnit' : 'soldierUnit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.x = unitX || 0;
+ self.y = unitY || 0;
+ self.select = function () {
+ if (self.unitType !== 'enemy' && !self.hasMoved) {
+ self.selected = true;
+ unitGraphics.tint = 0x00ff00;
+ }
+ };
+ self.deselect = function () {
+ self.selected = false;
+ unitGraphics.tint = 0xffffff;
+ };
+ self.moveTo = function (targetX, targetY) {
+ if (self.selected && !self.hasMoved) {
+ tween(self, {
+ x: targetX,
+ y: targetY
+ }, {
+ duration: 800,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.hasMoved = true;
+ self.deselect();
+ checkTurnComplete();
+ }
+ });
+ LK.getSound('unitMove').play();
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ if (self.health <= 0) {
+ self.destroy();
+ return true;
+ }
+ return false;
+ };
+ self.down = function (x, y, obj) {
+ if (self.unitType !== 'enemy' && !self.hasMoved && currentGameState === 'battle') {
+ clearAllSelections();
+ self.select();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2c5234
+});
+
+/****
+* Game Code
+****/
+var currentGameState = 'briefing'; // 'briefing', 'battle', 'victory', 'complete'
+var currentBattle = storage.currentBattle || 0;
+var battlesWon = storage.battlesWon || 0;
+var selectedUnit = null;
+var playerUnits = [];
+var enemyUnits = [];
+var objectives = [];
+var turnComplete = false;
+// Battle configurations
+var battleConfigs = [{
+ name: "Beach Landing",
+ briefing: ["Commander: Welcome to Operation Overlord, soldier!", "Your mission: Secure the beach and eliminate enemy resistance.", "Move your units carefully - the enemy has defensive positions.", "TAP units to select, then TAP destination to move. Good luck!"],
+ playerStartPositions: [[200, 800], [200, 900], [200, 1000]],
+ enemyPositions: [[1600, 400], [1600, 600]],
+ objectivePos: [1600, 500]
+}, {
+ name: "Forest Patrol",
+ briefing: ["The enemy is hiding in the forest ahead.", "Use the terrain to your advantage.", "Watch for ambushes - move strategically!"],
+ playerStartPositions: [[300, 1000], [400, 1000], [500, 1000]],
+ enemyPositions: [[1400, 300], [1500, 500], [1300, 700]],
+ objectivePos: [1450, 400]
+}, {
+ name: "Urban Warfare",
+ briefing: ["Street fighting is dangerous business.", "Clear the buildings and secure the objective.", "Every corner could hide an enemy!"],
+ playerStartPositions: [[150, 1100], [250, 1100], [350, 1100], [450, 1100]],
+ enemyPositions: [[1500, 200], [1400, 400], [1600, 600]],
+ objectivePos: [1500, 350]
+}];
+// Extend battle configs to 10 battles
+for (var i = 3; i < 10; i++) {
+ var baseConfig = battleConfigs[i % 3];
+ battleConfigs.push({
+ name: "Battle " + (i + 1),
+ briefing: ["Commander: Battle " + (i + 1) + " awaits!", "The enemy grows stronger with each encounter.", "Use everything you've learned so far!"],
+ playerStartPositions: baseConfig.playerStartPositions,
+ enemyPositions: baseConfig.enemyPositions,
+ objectivePos: baseConfig.objectivePos
+ });
+}
+// UI Elements
+var battlefieldContainer = game.addChild(new Container());
+var battlefield = battlefieldContainer.attachAsset('battlefield', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+battlefieldContainer.x = 2048 / 2;
+battlefieldContainer.y = (2732 - 400) / 2;
+var dialogSystem = game.addChild(new DialogSystem());
+var battleTitle = new Text2('', {
+ size: 60,
+ fill: '#ffffff'
+});
+battleTitle.anchor.set(0.5, 0);
+LK.gui.top.addChild(battleTitle);
+battleTitle.y = 100;
+var scoreText = new Text2('Battles Won: 0/10', {
+ size: 40,
+ fill: '#ffffff'
+});
+scoreText.anchor.set(1, 0);
+LK.gui.topRight.addChild(scoreText);
+scoreText.x = -20;
+scoreText.y = 20;
+// Game Functions
+function clearAllSelections() {
+ selectedUnit = null;
+ for (var i = 0; i < playerUnits.length; i++) {
+ playerUnits[i].deselect();
+ }
+}
+function setupBattle() {
+ // Clear previous battle
+ for (var i = playerUnits.length - 1; i >= 0; i--) {
+ playerUnits[i].destroy();
+ }
+ for (var i = enemyUnits.length - 1; i >= 0; i--) {
+ enemyUnits[i].destroy();
+ }
+ for (var i = objectives.length - 1; i >= 0; i--) {
+ objectives[i].destroy();
+ }
+ playerUnits = [];
+ enemyUnits = [];
+ objectives = [];
+ var config = battleConfigs[currentBattle];
+ battleTitle.setText(config.name);
+ // Create player units
+ for (var i = 0; i < config.playerStartPositions.length; i++) {
+ var pos = config.playerStartPositions[i];
+ var unit = new Unit('soldier', pos[0], pos[1]);
+ playerUnits.push(unit);
+ battlefieldContainer.addChild(unit);
+ }
+ // Create enemy units
+ for (var i = 0; i < config.enemyPositions.length; i++) {
+ var pos = config.enemyPositions[i];
+ var enemy = new Unit('enemy', pos[0], pos[1]);
+ enemyUnits.push(enemy);
+ battlefieldContainer.addChild(enemy);
+ }
+ // Create objective
+ var objPos = config.objectivePos;
+ var objective = battlefieldContainer.attachAsset('objective', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: objPos[0],
+ y: objPos[1]
+ });
+ objectives.push(objective);
+}
+function checkTurnComplete() {
+ var allMoved = true;
+ for (var i = 0; i < playerUnits.length; i++) {
+ if (!playerUnits[i].hasMoved) {
+ allMoved = false;
+ break;
+ }
+ }
+ if (allMoved) {
+ // Reset movement for next turn
+ for (var i = 0; i < playerUnits.length; i++) {
+ playerUnits[i].hasMoved = false;
+ }
+ // Check victory condition
+ if (checkVictoryCondition()) {
+ handleVictory();
+ }
+ }
+}
+function checkVictoryCondition() {
+ if (enemyUnits.length === 0) return true;
+ // Check if any player unit is near objective
+ for (var i = 0; i < playerUnits.length; i++) {
+ var unit = playerUnits[i];
+ var objective = objectives[0];
+ var distance = Math.sqrt(Math.pow(unit.x - objective.x, 2) + Math.pow(unit.y - objective.y, 2));
+ if (distance < 120) {
+ return true;
+ }
+ }
+ return false;
+}
+function handleVictory() {
+ battlesWon++;
+ storage.battlesWon = battlesWon;
+ storage.currentBattle = currentBattle + 1;
+ LK.getSound('battleWin').play();
+ updateScoreDisplay();
+ if (currentBattle >= 9) {
+ // Won all 10 battles
+ currentGameState = 'complete';
+ dialogSystem.showDialog(["Commander: Outstanding work, soldier!", "You have successfully completed all 10 battles!", "The war is won thanks to your strategic brilliance!", "You are a true military commander!"]);
+ LK.showYouWin();
+ } else {
+ currentGameState = 'victory';
+ var victoryMessages = ["Commander: Excellent work! Battle won!", "Your tactical skills are improving with each victory.", "Prepare for the next engagement, soldier."];
+ dialogSystem.showDialog(victoryMessages);
+ }
+}
+function nextBattle() {
+ currentBattle++;
+ if (currentBattle < 10) {
+ currentGameState = 'briefing';
+ setupBattle();
+ var config = battleConfigs[currentBattle];
+ dialogSystem.showDialog(config.briefing);
+ }
+}
+function startBattle() {
+ currentGameState = 'battle';
+}
+function updateScoreDisplay() {
+ scoreText.setText('Battles Won: ' + battlesWon + '/10');
+}
+// Mouse/Touch handling
+battlefieldContainer.down = function (x, y, obj) {
+ if (currentGameState !== 'battle') return;
+ // Convert to battlefield coordinates
+ var localPos = battlefieldContainer.toLocal(obj.parent.toGlobal(obj.position));
+ // Check if we have a selected unit to move
+ for (var i = 0; i < playerUnits.length; i++) {
+ if (playerUnits[i].selected) {
+ playerUnits[i].moveTo(localPos.x, localPos.y);
+ return;
+ }
+ }
+};
+// Initialize first battle
+setupBattle();
+updateScoreDisplay();
+// Show first briefing
+var firstBriefing = battleConfigs[currentBattle].briefing;
+dialogSystem.showDialog(firstBriefing);
+game.update = function () {
+ // Simple AI for enemies (move towards player units occasionally)
+ if (currentGameState === 'battle' && LK.ticks % 180 === 0 && enemyUnits.length > 0) {
+ var randomEnemy = enemyUnits[Math.floor(Math.random() * enemyUnits.length)];
+ if (playerUnits.length > 0) {
+ var targetPlayer = playerUnits[Math.floor(Math.random() * playerUnits.length)];
+ var moveX = randomEnemy.x + (targetPlayer.x - randomEnemy.x) * 0.1;
+ var moveY = randomEnemy.y + (targetPlayer.y - randomEnemy.y) * 0.1;
+ tween(randomEnemy, {
+ x: moveX,
+ y: moveY
+ }, {
+ duration: 1000,
+ easing: tween.easeOut
+ });
+ }
+ }
+ // Check for combat (simple collision detection)
+ if (currentGameState === 'battle' && LK.ticks % 60 === 0) {
+ for (var i = playerUnits.length - 1; i >= 0; i--) {
+ for (var j = enemyUnits.length - 1; j >= 0; j--) {
+ var player = playerUnits[i];
+ var enemy = enemyUnits[j];
+ var distance = Math.sqrt(Math.pow(player.x - enemy.x, 2) + Math.pow(player.y - enemy.y, 2));
+ if (distance < 100) {
+ LK.getSound('unitAttack').play();
+ if (Math.random() > 0.5) {
+ if (enemy.takeDamage()) {
+ enemyUnits.splice(j, 1);
+ }
+ } else {
+ if (player.takeDamage()) {
+ playerUnits.splice(i, 1);
+ }
+ }
+ // Check game over condition
+ if (playerUnits.length === 0) {
+ LK.showGameOver();
+ }
+ }
+ }
+ }
+ }
+};
\ No newline at end of file