Code edit (1 edits merged)
Please save this source code
User prompt
Castle Clash: Gold Rush
Initial prompt
background image 1 player's castle is on the bottom left of the screen, 1 enemy's castle is on the bottom right of the screen, they both have 1000 health, health values are written on both of them, add gold logic to the game, 1 gold is earned every 0.2 seconds, both the player and the enemy have gold and use this gold to send out soldiers, the player also uses this gold to send out soldiers, the enemy's is automatic, the player clicks on the screen to send them out, the gold values are reduced by the cost of the soldiers on both sides, the amount of gold belonging to the player is written in the middle of the screen, the soldiers stop when they touch each other and hit each other according to their attack values and disappear when their health values run out, the health and attack values of these soldiers are random between 5-25, and the soldiers sent by the enemy attack as if they encountered my soldier when they touch the block where my pen is defined, of course the castle does not attack him, the enemy soldier will continue to attack until I send out a new soldier and kill him, the same thing happens to the player soldiers The same goes for them, when they reach the enemy castle they will stop and attack.
/**** * Classes ****/ // No plugins needed for MVP // Soldier class var Soldier = Container.expand(function () { var self = Container.call(this); // Properties: team ('player' or 'enemy'), health, attack, speed self.team = 'player'; self.health = 1; self.attack = 1; self.speed = 4; // px per frame // Attach correct asset var assetId = self.team === 'player' ? 'soldier_player' : 'soldier_enemy'; var soldierGfx = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // Set stats and team self.init = function (team, health, attack) { self.team = team; self.health = health; self.attack = attack; assetId = team === 'player' ? 'soldier_player' : 'soldier_enemy'; // Remove old asset if any if (soldierGfx) soldierGfx.destroy(); soldierGfx = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; // For displaying health above soldier self.healthTxt = new Text2('', { size: 40, fill: '#fff' }); self.healthTxt.anchor.set(0.5, 1.2); self.addChild(self.healthTxt); // Update per frame self.update = function () { // Update health display self.healthTxt.setText(self.health); // Move forward if not in combat if (!self.inCombat) { if (self.team === 'player') { self.x += self.speed; } else { self.x -= self.speed; } } }; // Mark if in combat self.inCombat = false; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Enemy soldier (orange) // Player soldier (green) // Enemy castle (red) // Player castle (blue) // --- Game constants --- var GAME_W = 2048, GAME_H = 2732; var CASTLE_OFFSET_X = 120, CASTLE_OFFSET_Y = GAME_H - 320; var CASTLE_HEALTH_INIT = 1000; var GOLD_INIT = 200; var GOLD_PER_TICK = 5; var GOLD_TICK_MS = 200; var SOLDIER_COST = 100; var SOLDIER_HEALTH_MIN = 80, SOLDIER_HEALTH_MAX = 160; var SOLDIER_ATTACK_MIN = 20, SOLDIER_ATTACK_MAX = 50; var SOLDIER_SPEED = 14; // px per frame // --- State variables --- var playerHealth = CASTLE_HEALTH_INIT; var enemyHealth = CASTLE_HEALTH_INIT; var playerGold = GOLD_INIT; var enemyGold = GOLD_INIT; var playerSoldiers = []; var enemySoldiers = []; // --- Castles --- var castlePlayer = game.addChild(LK.getAsset('castle_player', { anchorX: 0.5, anchorY: 0.5 })); castlePlayer.x = CASTLE_OFFSET_X; castlePlayer.y = CASTLE_OFFSET_Y; var castleEnemy = game.addChild(LK.getAsset('castle_enemy', { anchorX: 0.5, anchorY: 0.5 })); castleEnemy.x = GAME_W - CASTLE_OFFSET_X; castleEnemy.y = CASTLE_OFFSET_Y; // --- GUI: Health and Gold displays --- var playerHealthTxt = new Text2('1000', { size: 70, fill: '#fff' }); playerHealthTxt.anchor.set(0, 0); LK.gui.top.addChild(playerHealthTxt); var playerGoldTxt = new Text2('200', { size: 60, fill: '#ffe600' }); playerGoldTxt.anchor.set(0, 0); LK.gui.top.addChild(playerGoldTxt); var enemyHealthTxt = new Text2('1000', { size: 70, fill: '#fff' }); enemyHealthTxt.anchor.set(1, 0); LK.gui.top.addChild(enemyHealthTxt); var enemyGoldTxt = new Text2('200', { size: 60, fill: '#ffe600' }); enemyGoldTxt.anchor.set(1, 0); LK.gui.top.addChild(enemyGoldTxt); // Position GUI elements playerHealthTxt.x = 120; playerHealthTxt.y = 40; playerGoldTxt.x = 120; playerGoldTxt.y = 120; enemyHealthTxt.x = LK.gui.width - 120; enemyHealthTxt.y = 40; enemyGoldTxt.x = LK.gui.width - 120; enemyGoldTxt.y = 120; // --- Gold income timer --- var goldTimer = LK.setInterval(function () { playerGold += GOLD_PER_TICK; enemyGold += GOLD_PER_TICK; updateGui(); }, GOLD_TICK_MS); // --- GUI update function --- function updateGui() { playerHealthTxt.setText(playerHealth); playerGoldTxt.setText(playerGold); enemyHealthTxt.setText(enemyHealth); enemyGoldTxt.setText(enemyGold); } // --- Deploy soldier function --- function deploySoldier(team) { var gold = team === 'player' ? playerGold : enemyGold; if (gold < SOLDIER_COST) return false; // Deduct gold if (team === 'player') playerGold -= SOLDIER_COST;else enemyGold -= SOLDIER_COST; // Random stats var health = SOLDIER_HEALTH_MIN + Math.floor(Math.random() * (SOLDIER_HEALTH_MAX - SOLDIER_HEALTH_MIN + 1)); var attack = SOLDIER_ATTACK_MIN + Math.floor(Math.random() * (SOLDIER_ATTACK_MAX - SOLDIER_ATTACK_MIN + 1)); // Create soldier var s = new Soldier(); s.init(team, health, attack); s.speed = SOLDIER_SPEED; s.inCombat = false; // Position s.y = CASTLE_OFFSET_Y; if (team === 'player') { s.x = castlePlayer.x + 120; playerSoldiers.push(s); } else { s.x = castleEnemy.x - 120; enemySoldiers.push(s); } game.addChild(s); return true; } // --- Player tap to deploy soldier --- game.down = function (x, y, obj) { // Only allow tap in lower half of screen (avoid top left menu) if (y > GAME_H / 2 && playerGold >= SOLDIER_COST) { deploySoldier('player'); updateGui(); } }; // --- Enemy AI: deploy soldier automatically if enough gold --- var enemyDeployTimer = LK.setInterval(function () { if (enemyGold >= SOLDIER_COST) { deploySoldier('enemy'); updateGui(); } }, 600); // --- Main update loop --- game.update = function () { // --- Update all soldiers --- // 1. Move soldiers forward if not in combat // 2. Check for combat with opposing soldiers // 3. If at enemy castle, attack castle // --- Player soldiers --- for (var i = playerSoldiers.length - 1; i >= 0; i--) { var s = playerSoldiers[i]; s.inCombat = false; // Check for enemy soldier in range var engaged = false; for (var j = 0; j < enemySoldiers.length; j++) { var e = enemySoldiers[j]; // If close enough (overlap) if (Math.abs(s.x - e.x) < 80) { // Engage in combat s.inCombat = true; e.inCombat = true; // Both attack each other if (LK.ticks % 12 === 0) { // Attack every 12 frames (~5 times/sec) e.health -= s.attack; s.health -= e.attack; } // Remove dead soldiers if (e.health <= 0) { e.destroy(); enemySoldiers.splice(j, 1); j--; } if (s.health <= 0) { s.destroy(); playerSoldiers.splice(i, 1); i--; engaged = true; break; } engaged = true; break; } } if (engaged) continue; // If not in combat, check if at enemy castle if (Math.abs(s.x - castleEnemy.x) < 120) { s.inCombat = true; if (LK.ticks % 12 === 0) { enemyHealth -= s.attack; if (enemyHealth < 0) enemyHealth = 0; updateGui(); } // Remove soldier if castle destroyed if (enemyHealth <= 0) { s.destroy(); playerSoldiers.splice(i, 1); i--; } } } // --- Enemy soldiers --- for (var i = enemySoldiers.length - 1; i >= 0; i--) { var s = enemySoldiers[i]; s.inCombat = false; // Check for player soldier in range var engaged = false; for (var j = 0; j < playerSoldiers.length; j++) { var e = playerSoldiers[j]; if (Math.abs(s.x - e.x) < 80) { s.inCombat = true; e.inCombat = true; if (LK.ticks % 12 === 0) { e.health -= s.attack; s.health -= e.attack; } if (e.health <= 0) { e.destroy(); playerSoldiers.splice(j, 1); j--; } if (s.health <= 0) { s.destroy(); enemySoldiers.splice(i, 1); i--; engaged = true; break; } engaged = true; break; } } if (engaged) continue; // If not in combat, check if at player castle if (Math.abs(s.x - castlePlayer.x) < 120) { s.inCombat = true; if (LK.ticks % 12 === 0) { playerHealth -= s.attack; if (playerHealth < 0) playerHealth = 0; updateGui(); } if (playerHealth <= 0) { s.destroy(); enemySoldiers.splice(i, 1); i--; } } } // --- Move soldiers --- for (var i = 0; i < playerSoldiers.length; i++) { playerSoldiers[i].update(); } for (var i = 0; i < enemySoldiers.length; i++) { enemySoldiers[i].update(); } // --- Check win/lose --- if (playerHealth <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } if (enemyHealth <= 0) { LK.effects.flashScreen(0x00ff00, 1000); LK.showYouWin(); return; } }; // --- Clean up timers on game over --- game.destroy = function () { LK.clearInterval(goldTimer); LK.clearInterval(enemyDeployTimer); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,323 @@
-/****
+/****
+* Classes
+****/
+// No plugins needed for MVP
+// Soldier class
+var Soldier = Container.expand(function () {
+ var self = Container.call(this);
+ // Properties: team ('player' or 'enemy'), health, attack, speed
+ self.team = 'player';
+ self.health = 1;
+ self.attack = 1;
+ self.speed = 4; // px per frame
+ // Attach correct asset
+ var assetId = self.team === 'player' ? 'soldier_player' : 'soldier_enemy';
+ var soldierGfx = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Set stats and team
+ self.init = function (team, health, attack) {
+ self.team = team;
+ self.health = health;
+ self.attack = attack;
+ assetId = team === 'player' ? 'soldier_player' : 'soldier_enemy';
+ // Remove old asset if any
+ if (soldierGfx) soldierGfx.destroy();
+ soldierGfx = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ };
+ // For displaying health above soldier
+ self.healthTxt = new Text2('', {
+ size: 40,
+ fill: '#fff'
+ });
+ self.healthTxt.anchor.set(0.5, 1.2);
+ self.addChild(self.healthTxt);
+ // Update per frame
+ self.update = function () {
+ // Update health display
+ self.healthTxt.setText(self.health);
+ // Move forward if not in combat
+ if (!self.inCombat) {
+ if (self.team === 'player') {
+ self.x += self.speed;
+ } else {
+ self.x -= self.speed;
+ }
+ }
+ };
+ // Mark if in combat
+ self.inCombat = false;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Enemy soldier (orange)
+// Player soldier (green)
+// Enemy castle (red)
+// Player castle (blue)
+// --- Game constants ---
+var GAME_W = 2048,
+ GAME_H = 2732;
+var CASTLE_OFFSET_X = 120,
+ CASTLE_OFFSET_Y = GAME_H - 320;
+var CASTLE_HEALTH_INIT = 1000;
+var GOLD_INIT = 200;
+var GOLD_PER_TICK = 5;
+var GOLD_TICK_MS = 200;
+var SOLDIER_COST = 100;
+var SOLDIER_HEALTH_MIN = 80,
+ SOLDIER_HEALTH_MAX = 160;
+var SOLDIER_ATTACK_MIN = 20,
+ SOLDIER_ATTACK_MAX = 50;
+var SOLDIER_SPEED = 14; // px per frame
+// --- State variables ---
+var playerHealth = CASTLE_HEALTH_INIT;
+var enemyHealth = CASTLE_HEALTH_INIT;
+var playerGold = GOLD_INIT;
+var enemyGold = GOLD_INIT;
+var playerSoldiers = [];
+var enemySoldiers = [];
+// --- Castles ---
+var castlePlayer = game.addChild(LK.getAsset('castle_player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+}));
+castlePlayer.x = CASTLE_OFFSET_X;
+castlePlayer.y = CASTLE_OFFSET_Y;
+var castleEnemy = game.addChild(LK.getAsset('castle_enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+}));
+castleEnemy.x = GAME_W - CASTLE_OFFSET_X;
+castleEnemy.y = CASTLE_OFFSET_Y;
+// --- GUI: Health and Gold displays ---
+var playerHealthTxt = new Text2('1000', {
+ size: 70,
+ fill: '#fff'
+});
+playerHealthTxt.anchor.set(0, 0);
+LK.gui.top.addChild(playerHealthTxt);
+var playerGoldTxt = new Text2('200', {
+ size: 60,
+ fill: '#ffe600'
+});
+playerGoldTxt.anchor.set(0, 0);
+LK.gui.top.addChild(playerGoldTxt);
+var enemyHealthTxt = new Text2('1000', {
+ size: 70,
+ fill: '#fff'
+});
+enemyHealthTxt.anchor.set(1, 0);
+LK.gui.top.addChild(enemyHealthTxt);
+var enemyGoldTxt = new Text2('200', {
+ size: 60,
+ fill: '#ffe600'
+});
+enemyGoldTxt.anchor.set(1, 0);
+LK.gui.top.addChild(enemyGoldTxt);
+// Position GUI elements
+playerHealthTxt.x = 120;
+playerHealthTxt.y = 40;
+playerGoldTxt.x = 120;
+playerGoldTxt.y = 120;
+enemyHealthTxt.x = LK.gui.width - 120;
+enemyHealthTxt.y = 40;
+enemyGoldTxt.x = LK.gui.width - 120;
+enemyGoldTxt.y = 120;
+// --- Gold income timer ---
+var goldTimer = LK.setInterval(function () {
+ playerGold += GOLD_PER_TICK;
+ enemyGold += GOLD_PER_TICK;
+ updateGui();
+}, GOLD_TICK_MS);
+// --- GUI update function ---
+function updateGui() {
+ playerHealthTxt.setText(playerHealth);
+ playerGoldTxt.setText(playerGold);
+ enemyHealthTxt.setText(enemyHealth);
+ enemyGoldTxt.setText(enemyGold);
+}
+// --- Deploy soldier function ---
+function deploySoldier(team) {
+ var gold = team === 'player' ? playerGold : enemyGold;
+ if (gold < SOLDIER_COST) return false;
+ // Deduct gold
+ if (team === 'player') playerGold -= SOLDIER_COST;else enemyGold -= SOLDIER_COST;
+ // Random stats
+ var health = SOLDIER_HEALTH_MIN + Math.floor(Math.random() * (SOLDIER_HEALTH_MAX - SOLDIER_HEALTH_MIN + 1));
+ var attack = SOLDIER_ATTACK_MIN + Math.floor(Math.random() * (SOLDIER_ATTACK_MAX - SOLDIER_ATTACK_MIN + 1));
+ // Create soldier
+ var s = new Soldier();
+ s.init(team, health, attack);
+ s.speed = SOLDIER_SPEED;
+ s.inCombat = false;
+ // Position
+ s.y = CASTLE_OFFSET_Y;
+ if (team === 'player') {
+ s.x = castlePlayer.x + 120;
+ playerSoldiers.push(s);
+ } else {
+ s.x = castleEnemy.x - 120;
+ enemySoldiers.push(s);
+ }
+ game.addChild(s);
+ return true;
+}
+// --- Player tap to deploy soldier ---
+game.down = function (x, y, obj) {
+ // Only allow tap in lower half of screen (avoid top left menu)
+ if (y > GAME_H / 2 && playerGold >= SOLDIER_COST) {
+ deploySoldier('player');
+ updateGui();
+ }
+};
+// --- Enemy AI: deploy soldier automatically if enough gold ---
+var enemyDeployTimer = LK.setInterval(function () {
+ if (enemyGold >= SOLDIER_COST) {
+ deploySoldier('enemy');
+ updateGui();
+ }
+}, 600);
+// --- Main update loop ---
+game.update = function () {
+ // --- Update all soldiers ---
+ // 1. Move soldiers forward if not in combat
+ // 2. Check for combat with opposing soldiers
+ // 3. If at enemy castle, attack castle
+ // --- Player soldiers ---
+ for (var i = playerSoldiers.length - 1; i >= 0; i--) {
+ var s = playerSoldiers[i];
+ s.inCombat = false;
+ // Check for enemy soldier in range
+ var engaged = false;
+ for (var j = 0; j < enemySoldiers.length; j++) {
+ var e = enemySoldiers[j];
+ // If close enough (overlap)
+ if (Math.abs(s.x - e.x) < 80) {
+ // Engage in combat
+ s.inCombat = true;
+ e.inCombat = true;
+ // Both attack each other
+ if (LK.ticks % 12 === 0) {
+ // Attack every 12 frames (~5 times/sec)
+ e.health -= s.attack;
+ s.health -= e.attack;
+ }
+ // Remove dead soldiers
+ if (e.health <= 0) {
+ e.destroy();
+ enemySoldiers.splice(j, 1);
+ j--;
+ }
+ if (s.health <= 0) {
+ s.destroy();
+ playerSoldiers.splice(i, 1);
+ i--;
+ engaged = true;
+ break;
+ }
+ engaged = true;
+ break;
+ }
+ }
+ if (engaged) continue;
+ // If not in combat, check if at enemy castle
+ if (Math.abs(s.x - castleEnemy.x) < 120) {
+ s.inCombat = true;
+ if (LK.ticks % 12 === 0) {
+ enemyHealth -= s.attack;
+ if (enemyHealth < 0) enemyHealth = 0;
+ updateGui();
+ }
+ // Remove soldier if castle destroyed
+ if (enemyHealth <= 0) {
+ s.destroy();
+ playerSoldiers.splice(i, 1);
+ i--;
+ }
+ }
+ }
+ // --- Enemy soldiers ---
+ for (var i = enemySoldiers.length - 1; i >= 0; i--) {
+ var s = enemySoldiers[i];
+ s.inCombat = false;
+ // Check for player soldier in range
+ var engaged = false;
+ for (var j = 0; j < playerSoldiers.length; j++) {
+ var e = playerSoldiers[j];
+ if (Math.abs(s.x - e.x) < 80) {
+ s.inCombat = true;
+ e.inCombat = true;
+ if (LK.ticks % 12 === 0) {
+ e.health -= s.attack;
+ s.health -= e.attack;
+ }
+ if (e.health <= 0) {
+ e.destroy();
+ playerSoldiers.splice(j, 1);
+ j--;
+ }
+ if (s.health <= 0) {
+ s.destroy();
+ enemySoldiers.splice(i, 1);
+ i--;
+ engaged = true;
+ break;
+ }
+ engaged = true;
+ break;
+ }
+ }
+ if (engaged) continue;
+ // If not in combat, check if at player castle
+ if (Math.abs(s.x - castlePlayer.x) < 120) {
+ s.inCombat = true;
+ if (LK.ticks % 12 === 0) {
+ playerHealth -= s.attack;
+ if (playerHealth < 0) playerHealth = 0;
+ updateGui();
+ }
+ if (playerHealth <= 0) {
+ s.destroy();
+ enemySoldiers.splice(i, 1);
+ i--;
+ }
+ }
+ }
+ // --- Move soldiers ---
+ for (var i = 0; i < playerSoldiers.length; i++) {
+ playerSoldiers[i].update();
+ }
+ for (var i = 0; i < enemySoldiers.length; i++) {
+ enemySoldiers[i].update();
+ }
+ // --- Check win/lose ---
+ if (playerHealth <= 0) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ if (enemyHealth <= 0) {
+ LK.effects.flashScreen(0x00ff00, 1000);
+ LK.showYouWin();
+ return;
+ }
+};
+// --- Clean up timers on game over ---
+game.destroy = function () {
+ LK.clearInterval(goldTimer);
+ LK.clearInterval(enemyDeployTimer);
+};
\ No newline at end of file
ottoman castle. In-Game asset. 2d. High contrast. No shadows. pixel art
roma knight. In-Game asset. 2d. High contrast. No shadows
Ottoman Janissary. In-Game asset. 2d. High contrast. No shadows
sword. In-Game asset. 2d. High contrast. No shadows
Ottoman camel warrior. In-Game asset. 2d. High contrast. No shadows. pixel art
Roman cavalry. In-Game asset. 2d. High contrast. No shadows
camel face. In-Game asset. 2d. High contrast. No shadows. pixel art
wall icon game. In-Game asset. 2d. High contrast. No shadows
RED CRESCENT ICON. In-Game asset. 2d. High contrast. No shadows
HEALING TENT OTTOMAN. In-Game asset. 2d. High contrast. No shadows