User prompt
The mice orientation is not correct (they go down)
User prompt
Make easier dragging of Defenders (Cats)
User prompt
Fait que les enemis s'oriente en fonction d'ou ils vont
User prompt
Add rats for enemies (appears only after wave 3) when wave 3 ends, add a pause for te game 10 secs long then how start! Another time ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
For attacking, the Cats have to eat the enemies (bé near)
User prompt
Remove bullets
User prompt
Rename enemy by mice
User prompt
Replace enemies bye mice cuz there won't be only mice on the game
User prompt
Bug I can only drag ca when game starts and make Cats attacking each 0.5 seconds not 1 sec
User prompt
Add a. Small health bar on enemies
User prompt
Wait 10 seconds before enemies come then show start! When enemies start coming ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var buttonWorldPos = game.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 369
User prompt
Il y a pas l bouton de normal cat dans le menu
User prompt
Ajouteun menu en bas avec un bouton de normal cat et son prix et que on doit glisser a partir du bouton pour placer un cat
User prompt
Make te way more random
User prompt
Make the game bigger and less place
User prompt
Non c pas comme ça le chemin va vers le bas et pour l'instant il y a que l'enemie mouse et le défenseur cat qui attaque 10 pourcents des sourispar seconde
User prompt
Make a tower défense game with a way ennemies go down and we can drop Defenders that have to protect the giant Packer of croquets for Cats for Defenders , in the respective order of less strong and more strong, there is normal cat ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Remove everything unless game lohic
User prompt
Remove all. The game
Remix started
Copy Tower Defense Template
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Mouse = Container.expand(function () { var self = Container.call(this); var mouseGraphics = self.attachAsset('mouse', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.speed = 1.5 + Math.random() * 1.5; // Random speed between 1.5 and 3 self.pathIndex = 0; self.reward = 10; // Create health bar components var healthBarBg = self.attachAsset('healthBarBg', { anchorX: 0.5, anchorY: 0.5 }); healthBarBg.x = 0; healthBarBg.y = -50; var healthBarFill = self.attachAsset('healthBarFill', { anchorX: 0, anchorY: 0.5 }); healthBarFill.x = -35; healthBarFill.y = -50; self.updateHealthBar = function () { var healthPercent = self.health / self.maxHealth; healthBarFill.scaleX = healthPercent; // Change color based on health if (healthPercent > 0.6) { healthBarFill.tint = 0x00ff00; // Green } else if (healthPercent > 0.3) { healthBarFill.tint = 0xffff00; // Yellow } else { healthBarFill.tint = 0xff0000; // Red } }; self.update = function () { if (self.pathIndex < gamePath.length) { var target = gamePath[self.pathIndex]; var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { self.pathIndex++; if (self.pathIndex >= gamePath.length) { // Mouse reached the end - damage packet packetHealth -= 20; updatePacketDisplay(); if (packetHealth <= 0) { LK.showGameOver(); } self.destroy(); mice.splice(mice.indexOf(self), 1); return; } } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; self.takeDamage = function (damage) { self.health -= damage; self.updateHealthBar(); if (self.health <= 0) { // Mouse defeated - give reward gameGold += self.reward; updateGoldDisplay(); LK.getSound('mouseHit').play(); self.destroy(); mice.splice(mice.indexOf(self), 1); } }; return self; }); var Rat = Container.expand(function () { var self = Container.call(this); var ratGraphics = self.attachAsset('rat', { anchorX: 0.5, anchorY: 0.5 }); self.health = 200; self.maxHealth = 200; self.speed = 2.5 + Math.random() * 1.5; // Faster than mice self.pathIndex = 0; self.reward = 25; // Higher reward // Create health bar components var healthBarBg = self.attachAsset('healthBarBg', { anchorX: 0.5, anchorY: 0.5 }); healthBarBg.x = 0; healthBarBg.y = -60; var healthBarFill = self.attachAsset('healthBarFill', { anchorX: 0, anchorY: 0.5 }); healthBarFill.x = -35; healthBarFill.y = -60; self.updateHealthBar = function () { var healthPercent = self.health / self.maxHealth; healthBarFill.scaleX = healthPercent; // Change color based on health if (healthPercent > 0.6) { healthBarFill.tint = 0x00ff00; // Green } else if (healthPercent > 0.3) { healthBarFill.tint = 0xffff00; // Yellow } else { healthBarFill.tint = 0xff0000; // Red } }; self.update = function () { if (self.pathIndex < gamePath.length) { var target = gamePath[self.pathIndex]; var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { self.pathIndex++; if (self.pathIndex >= gamePath.length) { // Rat reached the end - damage packet more packetHealth -= 40; updatePacketDisplay(); if (packetHealth <= 0) { LK.showGameOver(); } self.destroy(); rats.splice(rats.indexOf(self), 1); return; } } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; self.takeDamage = function (damage) { self.health -= damage; self.updateHealthBar(); if (self.health <= 0) { // Rat defeated - give reward gameGold += self.reward; updateGoldDisplay(); LK.getSound('mouseHit').play(); self.destroy(); rats.splice(rats.indexOf(self), 1); } }; return self; }); var Tower = Container.expand(function (type) { var self = Container.call(this); var towerGraphics; self.type = type || 'normal'; self.range = 250; self.damage = 25; self.fireRate = 30; // frames between shots (0.5 seconds at 60fps) self.lastShot = 0; if (self.type === 'normal') { towerGraphics = self.attachAsset('normalCat', { anchorX: 0.5, anchorY: 0.5 }); self.cost = 50; } else if (self.type === 'strong') { towerGraphics = self.attachAsset('strongCat', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 50; self.range = 300; self.cost = 100; self.fireRate = 30; } else if (self.type === 'strongest') { towerGraphics = self.attachAsset('strongestCat', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 100; self.range = 350; self.fireRate = 30; self.cost = 200; } self.update = function () { self.lastShot++; if (self.lastShot >= self.fireRate) { var target = self.findTarget(); if (target) { self.shoot(target); self.lastShot = 0; } } }; self.findTarget = function () { var closestEnemy = null; var closestDistance = self.range; // Check mice for (var i = 0; i < mice.length; i++) { var mouse = mice[i]; var distance = Math.sqrt(Math.pow(mouse.x - self.x, 2) + Math.pow(mouse.y - self.y, 2)); if (distance < closestDistance) { closestEnemy = mouse; closestDistance = distance; } } // Check rats for (var i = 0; i < rats.length; i++) { var rat = rats[i]; var distance = Math.sqrt(Math.pow(rat.x - self.x, 2) + Math.pow(rat.y - self.y, 2)); if (distance < closestDistance) { closestEnemy = rat; closestDistance = distance; } } return closestEnemy; }; self.shoot = function (target) { // Instant damage instead of bullets target.takeDamage(self.damage); LK.getSound('shoot').play(); // Recoil animation tween(towerGraphics, { scaleX: 0.8, scaleY: 0.8 }, { duration: 100, onFinish: function onFinish() { tween(towerGraphics, { scaleX: 1, scaleY: 1 }, { duration: 100 }); } }); }; return self; }); /**** * Initialize Game ****/ // Game state variables var game = new LK.Game({ backgroundColor: 0x228B22 }); /**** * Game Code ****/ // Game state variables // Import tween plugin for animations // Game assets var mice = []; var rats = []; var towers = []; var gameGold = 200; var packetHealth = 100; var waveNumber = 1; var miceSpawned = 0; var ratsSpawned = 0; var maxMicePerWave = 5; var maxRatsPerWave = 0; var spawnTimer = 0; var ratSpawnTimer = 0; var spawnRate = 120; // frames between spawns var ratSpawnRate = 180; // frames between rat spawns var gameStarted = false; var gameStartTimer = 0; var isPaused = false; var pauseTimer = 0; var pauseText = null; // Create path for mice - random zigzag movement var gamePath = [{ x: 1024, y: 50 }, { x: 600, y: 300 }, { x: 1400, y: 600 }, { x: 400, y: 900 }, { x: 1600, y: 1200 }, { x: 800, y: 1500 }, { x: 1200, y: 1800 }, { x: 500, y: 2100 }, { x: 1500, y: 2400 }, { x: 1024, y: 2700 }]; // Draw path for (var i = 0; i < gamePath.length; i++) { var pathSegment = game.addChild(LK.getAsset('path', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 })); pathSegment.x = gamePath[i].x; pathSegment.y = gamePath[i].y; } // Create packet of treats at the end var packet = game.addChild(LK.getAsset('packetTreats', { anchorX: 0.5, anchorY: 0.5 })); packet.x = gamePath[gamePath.length - 1].x; packet.y = gamePath[gamePath.length - 1].y + 100; // Create placement grid var placementSpots = []; for (var x = 100; x < 1950; x += 200) { for (var y = 150; y < 2600; y += 200) { var isOnPath = false; for (var p = 0; p < gamePath.length; p++) { if (Math.abs(gamePath[p].x - x) < 150 && Math.abs(gamePath[p].y - y) < 150) { isOnPath = true; break; } } if (!isOnPath) { var spot = game.addChild(LK.getAsset('placementGrid', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3 })); spot.x = x; spot.y = y; spot.gridX = x; spot.gridY = y; spot.occupied = false; placementSpots.push(spot); } } } // UI Elements var goldText = new Text2('Gold: ' + gameGold, { size: 60, fill: 0xFFD700 }); goldText.anchor.set(0, 0); goldText.x = 50; goldText.y = 50; LK.gui.topLeft.addChild(goldText); var healthText = new Text2('Packet Health: ' + packetHealth, { size: 60, fill: 0xFF0000 }); healthText.anchor.set(0.5, 0); healthText.x = 0; healthText.y = 50; LK.gui.top.addChild(healthText); var waveText = new Text2('Wave: ' + waveNumber, { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(1, 0); waveText.x = 0; waveText.y = 50; LK.gui.topRight.addChild(waveText); // Create start text var startText = new Text2('START!', { size: 120, fill: 0xFFFF00 }); startText.anchor.set(0.5, 0.5); startText.x = 0; startText.y = 0; startText.alpha = 0; LK.gui.center.addChild(startText); // Tower selection UI var selectedTowerType = 'normal'; // Create bottom menu background var menuBackground = LK.getAsset('placementGrid', { anchorX: 0.5, anchorY: 1, scaleX: 20, scaleY: 2, alpha: 0.8 }); menuBackground.x = 0; menuBackground.y = 0; LK.gui.bottom.addChild(menuBackground); // Create normal cat button with asset var normalCatButton = LK.getAsset('normalCat', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); normalCatButton.x = 0; normalCatButton.y = -80; LK.gui.bottom.addChild(normalCatButton); // Create price text for normal cat var normalCatPrice = new Text2('50g', { size: 40, fill: 0xFFD700 }); normalCatPrice.anchor.set(0.5, 0); normalCatPrice.x = 0; normalCatPrice.y = -40; LK.gui.bottom.addChild(normalCatPrice); // Dragging variables var isDragging = false; var draggedTower = null; var dragOffset = { x: 0, y: 0 }; function updateGoldDisplay() { goldText.setText('Gold: ' + gameGold); } function updatePacketDisplay() { healthText.setText('Packet Health: ' + packetHealth); } function updateWaveDisplay() { waveText.setText('Wave: ' + waveNumber); } // Normal cat button drag functionality normalCatButton.down = function (x, y, obj) { if (gameGold >= 50) { isDragging = true; selectedTowerType = 'normal'; // Create dragged tower preview draggedTower = new Tower('normal'); draggedTower.alpha = 0.7; game.addChild(draggedTower); // Convert button position to game coordinates var buttonWorldPos = game.toLocal(normalCatButton.parent.toGlobal(normalCatButton.position)); draggedTower.x = buttonWorldPos.x; draggedTower.y = buttonWorldPos.y; dragOffset.x = x; dragOffset.y = y; } }; // Game move handler for dragging game.move = function (x, y, obj) { if (isDragging && draggedTower) { draggedTower.x = x; draggedTower.y = y; } }; // Game up handler for tower placement game.up = function (x, y, obj) { if (isDragging && draggedTower) { var closestSpot = null; var closestDistance = Infinity; for (var i = 0; i < placementSpots.length; i++) { var spot = placementSpots[i]; var distance = Math.sqrt(Math.pow(spot.x - x, 2) + Math.pow(spot.y - y, 2)); if (distance < closestDistance && distance < 100 && !spot.occupied) { closestDistance = distance; closestSpot = spot; } } if (closestSpot && gameGold >= 50) { // Place tower gameGold -= 50; updateGoldDisplay(); draggedTower.x = closestSpot.x; draggedTower.y = closestSpot.y; draggedTower.alpha = 1; towers.push(draggedTower); closestSpot.occupied = true; closestSpot.alpha = 0.1; } else { // Remove dragged tower if placement failed draggedTower.destroy(); } // Reset dragging state isDragging = false; draggedTower = null; } }; game.update = function () { // Handle game start timer if (!gameStarted) { gameStartTimer++; if (gameStartTimer >= 600) { // 10 seconds at 60fps gameStarted = true; // Show start animation startText.alpha = 1; tween(startText, { scaleX: 1.5, scaleY: 1.5 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(startText, { scaleX: 1, scaleY: 1 }, { duration: 200, onFinish: function onFinish() { tween(startText, { alpha: 0 }, { duration: 500 }); } }); } }); } return; // Don't spawn mice until game starts } // Handle pause after wave 3 if (isPaused) { pauseTimer++; if (pauseTimer >= 600) { // 10 seconds at 60fps isPaused = false; // Remove pause text if (pauseText) { pauseText.destroy(); pauseText = null; } // Show start animation again startText.alpha = 1; startText.setText('Wave ' + waveNumber + ' - START!'); tween(startText, { scaleX: 1.5, scaleY: 1.5 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(startText, { scaleX: 1, scaleY: 1 }, { duration: 200, onFinish: function onFinish() { tween(startText, { alpha: 0 }, { duration: 500 }); } }); } }); } return; // Don't spawn enemies during pause } // Spawn mice spawnTimer++; if (spawnTimer >= spawnRate && miceSpawned < maxMicePerWave) { var mouse = new Mouse(); mouse.x = gamePath[0].x + (Math.random() - 0.5) * 200; mouse.y = gamePath[0].y + (Math.random() - 0.5) * 100; mouse.health = 100 + waveNumber * 25; mouse.maxHealth = mouse.health; mouse.updateHealthBar(); mice.push(mouse); game.addChild(mouse); miceSpawned++; spawnTimer = 0; } // Spawn rats (only after wave 3) if (waveNumber > 3) { ratSpawnTimer++; if (ratSpawnTimer >= ratSpawnRate && ratsSpawned < maxRatsPerWave) { var rat = new Rat(); rat.x = gamePath[0].x + (Math.random() - 0.5) * 200; rat.y = gamePath[0].y + (Math.random() - 0.5) * 100; rat.health = 200 + waveNumber * 50; rat.maxHealth = rat.health; rat.updateHealthBar(); rats.push(rat); game.addChild(rat); ratsSpawned++; ratSpawnTimer = 0; } } // Check if wave is complete if (miceSpawned >= maxMicePerWave && ratsSpawned >= maxRatsPerWave && mice.length === 0 && rats.length === 0) { // Check if wave 3 just completed if (waveNumber === 3) { isPaused = true; pauseTimer = 0; // Create pause text pauseText = new Text2('Rats incoming in 10 seconds!', { size: 80, fill: 0xFFFF00 }); pauseText.anchor.set(0.5, 0.5); pauseText.x = 0; pauseText.y = 0; LK.gui.center.addChild(pauseText); // Flash effect tween(pauseText, { alpha: 0.3 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(pauseText, { alpha: 1 }, { duration: 500, easing: tween.easeInOut }); } }); } waveNumber++; miceSpawned = 0; ratsSpawned = 0; maxMicePerWave += 2; // Start spawning rats after wave 3 if (waveNumber > 3) { maxRatsPerWave = Math.max(1, waveNumber - 3); } spawnRate = Math.max(60, spawnRate - 5); ratSpawnRate = Math.max(120, ratSpawnRate - 10); updateWaveDisplay(); } // Update all game objects for (var i = mice.length - 1; i >= 0; i--) { if (mice[i].parent) { mice[i].update(); } } for (var i = rats.length - 1; i >= 0; i--) { if (rats[i].parent) { rats[i].update(); } } for (var i = towers.length - 1; i >= 0; i--) { if (towers[i].parent) { towers[i].update(); } } };
===================================================================
--- original.js
+++ change.js
@@ -80,20 +80,91 @@
}
};
return self;
});
+var Rat = Container.expand(function () {
+ var self = Container.call(this);
+ var ratGraphics = self.attachAsset('rat', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 200;
+ self.maxHealth = 200;
+ self.speed = 2.5 + Math.random() * 1.5; // Faster than mice
+ self.pathIndex = 0;
+ self.reward = 25; // Higher reward
+ // Create health bar components
+ var healthBarBg = self.attachAsset('healthBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ healthBarBg.x = 0;
+ healthBarBg.y = -60;
+ var healthBarFill = self.attachAsset('healthBarFill', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ healthBarFill.x = -35;
+ healthBarFill.y = -60;
+ self.updateHealthBar = function () {
+ var healthPercent = self.health / self.maxHealth;
+ healthBarFill.scaleX = healthPercent;
+ // Change color based on health
+ if (healthPercent > 0.6) {
+ healthBarFill.tint = 0x00ff00; // Green
+ } else if (healthPercent > 0.3) {
+ healthBarFill.tint = 0xffff00; // Yellow
+ } else {
+ healthBarFill.tint = 0xff0000; // Red
+ }
+ };
+ self.update = function () {
+ if (self.pathIndex < gamePath.length) {
+ var target = gamePath[self.pathIndex];
+ var dx = target.x - self.x;
+ var dy = target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 10) {
+ self.pathIndex++;
+ if (self.pathIndex >= gamePath.length) {
+ // Rat reached the end - damage packet more
+ packetHealth -= 40;
+ updatePacketDisplay();
+ if (packetHealth <= 0) {
+ LK.showGameOver();
+ }
+ self.destroy();
+ rats.splice(rats.indexOf(self), 1);
+ return;
+ }
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ self.updateHealthBar();
+ if (self.health <= 0) {
+ // Rat defeated - give reward
+ gameGold += self.reward;
+ updateGoldDisplay();
+ LK.getSound('mouseHit').play();
+ self.destroy();
+ rats.splice(rats.indexOf(self), 1);
+ }
+ };
+ return self;
+});
var Tower = Container.expand(function (type) {
var self = Container.call(this);
var towerGraphics;
self.type = type || 'normal';
self.range = 250;
self.damage = 25;
self.fireRate = 30; // frames between shots (0.5 seconds at 60fps)
self.lastShot = 0;
- self.attacking = false;
- self.target = null;
- self.originalX = undefined;
- self.originalY = undefined;
if (self.type === 'normal') {
towerGraphics = self.attachAsset('normalCat', {
anchorX: 0.5,
anchorY: 0.5
@@ -118,91 +189,59 @@
self.fireRate = 30;
self.cost = 200;
}
self.update = function () {
- if (self.attacking && self.target) {
- // Check if target still exists
- if (mice.indexOf(self.target) === -1) {
- // Target is gone, return to original position
- self.attacking = false;
- self.target = null;
- return;
- }
- // Move toward target
- var dx = self.target.x - self.x;
- var dy = self.target.y - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance < 50) {
- // Close enough to eat the mouse
- self.target.takeDamage(self.damage);
- LK.getSound('shoot').play();
- // Recoil animation
- tween(towerGraphics, {
- scaleX: 0.8,
- scaleY: 0.8
- }, {
- duration: 100,
- onFinish: function onFinish() {
- tween(towerGraphics, {
- scaleX: 1,
- scaleY: 1
- }, {
- duration: 100
- });
- }
- });
- // Return to original position
- self.attacking = false;
- self.target = null;
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate) {
+ var target = self.findTarget();
+ if (target) {
+ self.shoot(target);
self.lastShot = 0;
- } else {
- // Move toward target
- var moveSpeed = 3;
- self.x += dx / distance * moveSpeed;
- self.y += dy / distance * moveSpeed;
}
- } else {
- // Return to original position if not at it
- if (self.originalX !== undefined && self.originalY !== undefined) {
- var dx = self.originalX - self.x;
- var dy = self.originalY - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance > 5) {
- var moveSpeed = 2;
- self.x += dx / distance * moveSpeed;
- self.y += dy / distance * moveSpeed;
- }
- }
- // Look for new targets
- self.lastShot++;
- if (self.lastShot >= self.fireRate) {
- var target = self.findTarget();
- if (target) {
- self.shoot(target);
- self.lastShot = 0;
- }
- }
}
};
self.findTarget = function () {
- var closestMouse = null;
+ var closestEnemy = null;
var closestDistance = self.range;
+ // Check mice
for (var i = 0; i < mice.length; i++) {
var mouse = mice[i];
var distance = Math.sqrt(Math.pow(mouse.x - self.x, 2) + Math.pow(mouse.y - self.y, 2));
if (distance < closestDistance) {
- closestMouse = mouse;
+ closestEnemy = mouse;
closestDistance = distance;
}
}
- return closestMouse;
+ // Check rats
+ for (var i = 0; i < rats.length; i++) {
+ var rat = rats[i];
+ var distance = Math.sqrt(Math.pow(rat.x - self.x, 2) + Math.pow(rat.y - self.y, 2));
+ if (distance < closestDistance) {
+ closestEnemy = rat;
+ closestDistance = distance;
+ }
+ }
+ return closestEnemy;
};
self.shoot = function (target) {
- // Set target for cat to move toward
- self.target = target;
- self.attacking = true;
- self.originalX = self.x;
- self.originalY = self.y;
+ // Instant damage instead of bullets
+ target.takeDamage(self.damage);
+ LK.getSound('shoot').play();
+ // Recoil animation
+ tween(towerGraphics, {
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(towerGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 100
+ });
+ }
+ });
};
return self;
});
@@ -220,18 +259,26 @@
// Game state variables
// Import tween plugin for animations
// Game assets
var mice = [];
+var rats = [];
var towers = [];
var gameGold = 200;
var packetHealth = 100;
var waveNumber = 1;
var miceSpawned = 0;
+var ratsSpawned = 0;
var maxMicePerWave = 5;
+var maxRatsPerWave = 0;
var spawnTimer = 0;
+var ratSpawnTimer = 0;
var spawnRate = 120; // frames between spawns
+var ratSpawnRate = 180; // frames between rat spawns
var gameStarted = false;
var gameStartTimer = 0;
+var isPaused = false;
+var pauseTimer = 0;
+var pauseText = null;
// Create path for mice - random zigzag movement
var gamePath = [{
x: 1024,
y: 50
@@ -431,10 +478,8 @@
gameGold -= 50;
updateGoldDisplay();
draggedTower.x = closestSpot.x;
draggedTower.y = closestSpot.y;
- draggedTower.originalX = closestSpot.x;
- draggedTower.originalY = closestSpot.y;
draggedTower.alpha = 1;
towers.push(draggedTower);
closestSpot.occupied = true;
closestSpot.alpha = 0.1;
@@ -480,8 +525,47 @@
});
}
return; // Don't spawn mice until game starts
}
+ // Handle pause after wave 3
+ if (isPaused) {
+ pauseTimer++;
+ if (pauseTimer >= 600) {
+ // 10 seconds at 60fps
+ isPaused = false;
+ // Remove pause text
+ if (pauseText) {
+ pauseText.destroy();
+ pauseText = null;
+ }
+ // Show start animation again
+ startText.alpha = 1;
+ startText.setText('Wave ' + waveNumber + ' - START!');
+ tween(startText, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(startText, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(startText, {
+ alpha: 0
+ }, {
+ duration: 500
+ });
+ }
+ });
+ }
+ });
+ }
+ return; // Don't spawn enemies during pause
+ }
// Spawn mice
spawnTimer++;
if (spawnTimer >= spawnRate && miceSpawned < maxMicePerWave) {
var mouse = new Mouse();
@@ -494,22 +578,78 @@
game.addChild(mouse);
miceSpawned++;
spawnTimer = 0;
}
+ // Spawn rats (only after wave 3)
+ if (waveNumber > 3) {
+ ratSpawnTimer++;
+ if (ratSpawnTimer >= ratSpawnRate && ratsSpawned < maxRatsPerWave) {
+ var rat = new Rat();
+ rat.x = gamePath[0].x + (Math.random() - 0.5) * 200;
+ rat.y = gamePath[0].y + (Math.random() - 0.5) * 100;
+ rat.health = 200 + waveNumber * 50;
+ rat.maxHealth = rat.health;
+ rat.updateHealthBar();
+ rats.push(rat);
+ game.addChild(rat);
+ ratsSpawned++;
+ ratSpawnTimer = 0;
+ }
+ }
// Check if wave is complete
- if (miceSpawned >= maxMicePerWave && mice.length === 0) {
+ if (miceSpawned >= maxMicePerWave && ratsSpawned >= maxRatsPerWave && mice.length === 0 && rats.length === 0) {
+ // Check if wave 3 just completed
+ if (waveNumber === 3) {
+ isPaused = true;
+ pauseTimer = 0;
+ // Create pause text
+ pauseText = new Text2('Rats incoming in 10 seconds!', {
+ size: 80,
+ fill: 0xFFFF00
+ });
+ pauseText.anchor.set(0.5, 0.5);
+ pauseText.x = 0;
+ pauseText.y = 0;
+ LK.gui.center.addChild(pauseText);
+ // Flash effect
+ tween(pauseText, {
+ alpha: 0.3
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(pauseText, {
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ }
waveNumber++;
miceSpawned = 0;
+ ratsSpawned = 0;
maxMicePerWave += 2;
+ // Start spawning rats after wave 3
+ if (waveNumber > 3) {
+ maxRatsPerWave = Math.max(1, waveNumber - 3);
+ }
spawnRate = Math.max(60, spawnRate - 5);
+ ratSpawnRate = Math.max(120, ratSpawnRate - 10);
updateWaveDisplay();
}
// Update all game objects
for (var i = mice.length - 1; i >= 0; i--) {
if (mice[i].parent) {
mice[i].update();
}
}
+ for (var i = rats.length - 1; i >= 0; i--) {
+ if (rats[i].parent) {
+ rats[i].update();
+ }
+ }
for (var i = towers.length - 1; i >= 0; i--) {
if (towers[i].parent) {
towers[i].update();
}
Un emignone souris cartoon style sur ses quatres pattes. In-Game asset. 2d. High contrast. No shadows
Cute tired cat manga cartoon style. In-Game asset. 2d. High contrast. No shadows
A cute manga style cat. In-Game asset. 2d. High contrast. No shadows
An angry but cute wild cat manga cartoon style. In-Game asset. 2d. High contrast. No shadows
A big angry cute tiger. In-Game asset. 2d. High contrast. No shadows
A pretty air view grass plain. In-Game asset. 2d. High contrast. No shadows
A red rectangular button. In-Game asset. 2d. High contrast. No shadows
A cute hare running on 4 paws. In-Game asset. 2d. High contrast. No shadows
cute lil bird flying cartoon style
Make more manga style and cutter with cut colors
a cute angry dog manga style. In-Game asset. 2d. High contrast. No shadows