User prompt
Make the clones super slow and also make his bullets automatically hit enemies
User prompt
Make the boss spawn every 3 waves after wave 3
User prompt
Make the clone shoot slower and make him only shoot left, right, up, and down
User prompt
Instead of making the clone shoot enemies from the front just make the clone shoot bullets in all directions and also make the bullets have really good auto aim
User prompt
Make the clone faster and make it attack the enemies in the front of them
User prompt
Make a big cyan power up that when collected will make a clone of you and it will walk up to enemies and shoot a big bullet at them until the are dead then they will move on to the next one. Also make the clone have his own mini health bar than will kill him if all his health drops
User prompt
Make a asset for the boss
User prompt
If all the enemies die by getting shot to many times or touching the bottom of the screen then go to the next wave
User prompt
Make so that if enemies touch the bottom of the screen they die
User prompt
Make so that if I you reach level 3 there is a boss with there own health bar and make them shoot mines
User prompt
Make the sign bigger
User prompt
Can you make a small sign in the corner that says β defeat the sharks
Code edit (1 edits merged)
Please save this source code
User prompt
Critical Crisis
Initial prompt
Make a shooter game named critical crisis
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Boss = Container.expand(function () { var self = Container.call(this); self.health = 200; self.maxHealth = 200; self.speed = 4; self.fireRate = 90; self.fireTimer = 0; self.mineFireRate = 180; self.mineFireTimer = 60; self.scoreValue = 500; self.movingRight = true; // Create boss graphics (larger enemy ship) var bossGraphics = self.attachAsset('bossShip', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); // Create boss health bar background self.healthBarBg = LK.getAsset('healthBarBackground', { anchorX: 0.5, anchorY: 0, scaleX: 2, scaleY: 1, y: -100 }); // Create boss health bar self.healthBar = LK.getAsset('healthBar', { anchorX: 0.5, anchorY: 0, scaleX: 2, scaleY: 1, y: -95 }); self.addChild(self.healthBarBg); self.addChild(self.healthBar); self.takeDamage = function (amount) { self.health -= amount; // Update health bar self.healthBar.scale.x = self.health / self.maxHealth * 2; if (self.health <= 0) { // Boss explosion effect - bigger and longer LK.effects.flashObject(self, 0xff0000, 1000); LK.getSound('explosion').play(); // Always spawn a clone power-up when boss is defeated var clonePowerUp = new ClonePowerUp(); clonePowerUp.x = self.x; clonePowerUp.y = self.y; clonePowerUps.push(clonePowerUp); game.addChild(clonePowerUp); return true; // Boss is destroyed } else { // Flash red when taking damage LK.effects.flashObject(self, 0xff0000, 200); return false; } }; self.shootBullet = function () { if (self.fireTimer <= 0) { // Shoot multiple bullets in a spread pattern for (var i = -2; i <= 2; i++) { var bullet = new EnemyBullet(); bullet.x = self.x + i * 30; bullet.y = self.y + 80; enemyBullets.push(bullet); game.addChild(bullet); } LK.getSound('enemyShoot').play(); self.fireTimer = self.fireRate; } }; self.shootMine = function () { if (self.mineFireTimer <= 0) { var mine = new Mine(); mine.x = self.x; mine.y = self.y + 100; enemyBullets.push(mine); game.addChild(mine); LK.getSound('enemyShoot').play(); self.mineFireTimer = self.mineFireRate; } }; self.update = function () { // Basic movement pattern - side to side if (self.movingRight) { self.x += self.speed; if (self.x > 2048 - 200) { self.movingRight = false; } } else { self.x -= self.speed; if (self.x < 200) { self.movingRight = true; } } // Decrease fire timers self.fireTimer--; self.mineFireTimer--; // Shoot regular bullets if (self.fireTimer <= 0) { self.shootBullet(); } // Shoot mines if (self.mineFireTimer <= 0) { self.shootMine(); } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); self.speed = 15; self.damage = 1; self.isPlayerBullet = true; var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { if (self.hasCustomVelocity) { // Use vectorized movement if bullet has custom velocity self.x += self.vx; self.y += self.vy; // Rotate bullet to face direction of travel self.rotation = Math.atan2(self.vy, self.vx); } else { // Default upward movement self.y -= self.speed; } }; return self; }); var ClonePowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); // Set to cyan color powerUpGraphics.tint = 0x00FFFF; self.speed = 2; self.update = function () { self.y += self.speed; // Pulse effect var scale = 2 + Math.sin(LK.ticks * 0.15) * 0.2; self.scale.set(scale, scale); }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); self.health = 2; self.speed = 3 + Math.random() * 2; self.fireRate = 90 + Math.floor(Math.random() * 60); self.fireTimer = Math.floor(Math.random() * 60); self.scoreValue = 10; self.movingRight = Math.random() > 0.5; self.moveCounter = 0; self.moveChangeTime = 60 + Math.floor(Math.random() * 120); var enemyGraphics = self.attachAsset('enemyShip', { anchorX: 0.5, anchorY: 0.5 }); self.takeDamage = function (amount) { self.health -= amount; if (self.health <= 0) { // Chance to drop regular power up if (Math.random() < 0.15) { var powerUp = new PowerUp(); powerUp.x = self.x; powerUp.y = self.y; powerUps.push(powerUp); game.addChild(powerUp); } // Small chance to drop clone power up if (Math.random() < 0.05) { var clonePowerUp = new ClonePowerUp(); clonePowerUp.x = self.x; clonePowerUp.y = self.y; clonePowerUps.push(clonePowerUp); game.addChild(clonePowerUp); } // Explosion effect LK.effects.flashObject(self, 0xff0000, 300); LK.getSound('explosion').play(); return true; // Enemy is destroyed } else { // Flash red when taking damage LK.effects.flashObject(self, 0xff0000, 200); return false; } }; self.shoot = function () { if (self.fireTimer <= 0) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 40; enemyBullets.push(bullet); game.addChild(bullet); LK.getSound('enemyShoot').play(); self.fireTimer = self.fireRate; } }; self.update = function () { // Basic movement pattern self.y += self.speed * 0.5; // Horizontal movement if (self.movingRight) { self.x += self.speed; } else { self.x -= self.speed; } // Reverse direction if reaching screen edges if (self.x < 100) { self.movingRight = true; } else if (self.x > 2048 - 100) { self.movingRight = false; } // Randomly change direction self.moveCounter++; if (self.moveCounter >= self.moveChangeTime) { self.movingRight = !self.movingRight; self.moveCounter = 0; } // Decrease fire timer and shoot self.fireTimer--; if (self.fireTimer <= 0) { self.shoot(); } }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); self.speed = 8; self.damage = 1; self.isPlayerBullet = false; var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.y += self.speed; }; return self; }); var Mine = Container.expand(function () { var self = Container.call(this); self.speed = 4; self.damage = 15; self.isPlayerBullet = false; self.rotationSpeed = 0.05; var mineGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); mineGraphics.tint = 0xFF5500; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; // Slight wobble movement self.x += Math.sin(LK.ticks * 0.1) * 2; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); self.health = 100; self.maxHealth = 100; self.speed = 10; self.fireRate = 15; self.fireTimer = 0; self.powerUpTimer = 0; self.hasPowerUp = false; self.invincible = false; self.invincibleTimer = 0; var playerGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); self.takeDamage = function (amount) { if (self.invincible) return; self.health -= amount; if (self.health <= 0) { self.health = 0; } else { // Flash player when taking damage self.invincible = true; self.invincibleTimer = 60; // 1 second invincibility LK.effects.flashObject(self, 0xff0000, 1000); LK.getSound('playerHit').play(); } }; self.shoot = function () { if (self.fireTimer <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 50; // If player has power up, enhance bullet if (self.hasPowerUp) { bullet.damage = 2; bullet.speed = 20; bullet.scale.set(1.5, 1.5); } bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); self.fireTimer = self.fireRate; } }; self.update = function () { // Decrease fire timer if (self.fireTimer > 0) { self.fireTimer--; } // Handle power up timer if (self.hasPowerUp) { self.powerUpTimer--; if (self.powerUpTimer <= 0) { self.hasPowerUp = false; playerGraphics.tint = 0xFFFFFF; } } // Handle invincibility timer if (self.invincible) { self.invincibleTimer--; if (self.invincibleTimer <= 0) { self.invincible = false; } // Flicker effect during invincibility self.alpha = LK.ticks % 6 < 3 ? 0.7 : 1; } else { self.alpha = 1; } }; self.activatePowerUp = function () { self.hasPowerUp = true; self.powerUpTimer = 300; // 5 seconds playerGraphics.tint = 0x2ecc71; // Green tint when powered up LK.getSound('powerUpCollect').play(); }; return self; }); var PlayerClone = Container.expand(function () { var self = Container.call(this); self.health = 50; self.maxHealth = 50; self.target = null; self.speed = 8; // Increased speed (was 5) self.fireRate = 40; // Slower fire rate self.fireTimer = 0; // Create clone graphics (same as player but with different tint) var cloneGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); cloneGraphics.tint = 0x00FFFF; // Cyan tint // Create health bar background self.healthBarBg = LK.getAsset('healthBarBackground', { anchorX: 0.5, anchorY: 0, scaleX: 0.3, scaleY: 0.3, y: -40 }); // Create health bar self.healthBar = LK.getAsset('healthBar', { anchorX: 0.5, anchorY: 0, scaleX: 0.3, scaleY: 0.3, y: -38 }); self.addChild(self.healthBarBg); self.addChild(self.healthBar); self.takeDamage = function (amount) { self.health -= amount; // Update health bar self.healthBar.scale.x = self.health / self.maxHealth * 0.3; if (self.health <= 0) { // Clone destruction effect LK.effects.flashObject(self, 0x00FFFF, 500); LK.getSound('playerHit').play(); return true; // Clone is destroyed } else { // Flash cyan when taking damage LK.effects.flashObject(self, 0x00FFFF, 200); return false; } }; self.shoot = function () { if (self.fireTimer <= 0) { // Shoot bullets only in 4 cardinal directions (up, down, left, right) for (var i = 0; i < 4; i++) { var angle = i * Math.PI / 2; // 90 degree increments (cardinal directions only) var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.damage = 5; // Slightly more damage to compensate for fewer bullets bullet.speed = 20; bullet.scale.set(1.2, 1.2); // Simple auto-aim for each direction var closestEnemy = null; var closestDist = Infinity; // Define direction vectors based on cardinal direction var dirX = Math.cos(angle); var dirY = Math.sin(angle); // Only do auto-aim if there are enemies for (var j = 0; j < enemies.length; j++) { var enemy = enemies[j]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var dist = Math.hypot(dx, dy); // Check if enemy is roughly in this cardinal direction var dotProduct = dx * dirX + dy * dirY; if (dotProduct > 0 && dist < closestDist) { closestDist = dist; closestEnemy = enemy; } } // Set velocity based on direction and auto-aim if (closestEnemy && closestDist < 800) { // Only auto-aim within reasonable range // Auto-aim: Calculate direct trajectory to closest enemy var dx = closestEnemy.x - self.x; var dy = closestEnemy.y - self.y; var dist = Math.hypot(dx, dy); bullet.vx = dx / dist * bullet.speed; bullet.vy = dy / dist * bullet.speed; } else { // No enemy in this direction, just fire straight cardinal bullet.vx = dirX * bullet.speed; bullet.vy = dirY * bullet.speed; } // Store on bullet bullet.hasCustomVelocity = true; bullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); self.fireTimer = self.fireRate + 15; // Slower fire rate (was just self.fireRate) } }; self.findTarget = function () { if (enemies.length > 0) { // Just find the closest enemy for movement purposes var closest = enemies[0]; var closestDist = Math.hypot(closest.x - self.x, closest.y - self.y); for (var i = 1; i < enemies.length; i++) { var dist = Math.hypot(enemies[i].x - self.x, enemies[i].y - self.y); if (dist < closestDist) { closest = enemies[i]; closestDist = dist; } } self.target = closest; } else { self.target = null; } }; self.update = function () { // Find a target if we don't have one or current target is destroyed if (!self.target || !enemies.includes(self.target)) { self.findTarget(); } // Always shoot if we can, regardless of position if (self.fireTimer <= 0) { self.shoot(); } // Move toward target if (self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.hypot(dx, dy); // Update rotation to face the target self.rotation = Math.atan2(dy, dx); if (dist > 200) { // Move toward target if not too close self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } else { // When close, just shoot (but don't try to get closer) // No need to call shoot here as we do it regardless now } } else { // No target, move back toward player var dx = player.x - self.x; var dy = player.y - 150 - self.y; var dist = Math.hypot(dx, dy); // Update rotation to face direction of movement if (dist > 10) { self.rotation = Math.atan2(dy, dx); } if (dist > 50) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } } // Decrease fire timer if (self.fireTimer > 0) { self.fireTimer--; } // Update health bar position self.healthBarBg.x = 0; self.healthBar.x = 0; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.update = function () { self.y += self.speed; // Slight wobble effect self.x += Math.sin(LK.ticks * 0.1) * 1.5; // Pulse effect var scale = 1 + Math.sin(LK.ticks * 0.15) * 0.1; self.scale.set(scale, scale); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game state variables var gameActive = true; var player; var bullets = []; var enemies = []; var enemyBullets = []; var powerUps = []; var clonePowerUps = []; var playerClones = []; var waveNumber = 1; var enemiesThisWave = 5; var enemiesDefeated = 0; var totalEnemiesDefeated = 0; var waveDelay = 0; var spawnDelay = 0; var dragNode = null; var boss = null; var isBossWave = false; var clonePowerUpSpawnTimer = 0; // GUI elements var healthBar; var healthBarBg; var scoreTxt; var waveTxt; var signTxt; // Initialize game elements function initGame() { // Set background game.setBackgroundColor(0x0a0a2a); // Initialize player player = new Player(); player.x = 2048 / 2; player.y = 2732 - 300; game.addChild(player); // Create GUI elements createGUI(); // Start game gameActive = true; waveNumber = 1; enemiesThisWave = 5; enemiesDefeated = 0; totalEnemiesDefeated = 0; playerClones = []; clonePowerUps = []; LK.setScore(0); // Play background music LK.playMusic('bgMusic', { fade: { start: 0, end: 0.7, duration: 1000 } }); } function createGUI() { // Health bar background healthBarBg = LK.getAsset('healthBarBackground', { anchorX: 0, anchorY: 0, x: 20, y: 20 }); // Health bar healthBar = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, x: 25, y: 25 }); // Score text scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); // Wave text waveTxt = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveTxt.anchor.set(0.5, 0); // Create sign signTxt = new Text2('cyan powerup = 4-direction auto-aim clone!', { size: 80, fill: 0xFFFFFF }); signTxt.anchor.set(1, 1); // Add GUI elements LK.gui.topRight.addChild(scoreTxt); LK.gui.top.addChild(waveTxt); LK.gui.topLeft.addChild(healthBarBg); LK.gui.topLeft.addChild(healthBar); LK.gui.bottomRight.addChild(signTxt); } // Spawn a wave of enemies function spawnEnemyWave() { // Check if this is a boss wave (every 3rd wave) if (waveNumber % 3 === 0) { isBossWave = true; // Show boss warning message var bossWarning = new Text2('BOSS INCOMING!', { size: 120, fill: 0xFF0000 }); bossWarning.anchor.set(0.5, 0.5); LK.gui.center.addChild(bossWarning); // Fade out warning message tween(bossWarning, { alpha: 0 }, { duration: 2000, onFinish: function onFinish() { bossWarning.destroy(); // Spawn the boss if (!gameActive) return; boss = new Boss(); boss.x = 2048 / 2; boss.y = 200; enemies.push(boss); game.addChild(boss); } }); } else { isBossWave = false; // Regular enemy wave for (var i = 0; i < enemiesThisWave; i++) { // Set a delay for each enemy spawn LK.setTimeout(function () { if (!gameActive) return; var enemy = new Enemy(); enemy.x = 200 + Math.random() * (2048 - 400); enemy.y = -100 - Math.random() * 400; // Increase difficulty with each wave if (waveNumber > 1) { enemy.health += Math.floor(waveNumber / 2); enemy.speed += waveNumber * 0.2; enemy.scoreValue += waveNumber * 2; } enemies.push(enemy); game.addChild(enemy); }, i * 1000); } } } // Handle player movement function handleMove(x, y, obj) { if (dragNode && gameActive) { // Limit player movement to screen bounds var newX = Math.max(50, Math.min(2048 - 50, x)); var newY = Math.max(50, Math.min(2732 - 50, y)); dragNode.x = newX; dragNode.y = newY; } } // Game down handler game.down = function (x, y, obj) { if (gameActive) { dragNode = player; handleMove(x, y, obj); // Shoot when pressing down player.shoot(); } }; // Game move handler game.move = handleMove; // Game up handler game.up = function (x, y, obj) { dragNode = null; }; // Update game state game.update = function () { if (!gameActive) return; // Update player player.update(); // Auto-fire for player if (LK.ticks % 10 === 0) { player.shoot(); } // Update health bar healthBar.scale.x = player.health / player.maxHealth; // Update player clones for (var i = playerClones.length - 1; i >= 0; i--) { var clone = playerClones[i]; clone.update(); // Remove destroyed clones if (clone.health <= 0) { clone.destroy(); playerClones.splice(i, 1); } } // Update clone power-ups for (var i = clonePowerUps.length - 1; i >= 0; i--) { var clonePowerUp = clonePowerUps[i]; clonePowerUp.update(); // Remove power-ups that go off screen if (clonePowerUp.y > 2732 + 50) { clonePowerUp.destroy(); clonePowerUps.splice(i, 1); continue; } // Check for player collision if (gameActive && clonePowerUp.intersects(player)) { // Create a new player clone var newClone = new PlayerClone(); newClone.x = player.x + 150; newClone.y = player.y - 150; playerClones.push(newClone); game.addChild(newClone); // Play power-up sound LK.getSound('powerUpCollect').play(); // Remove the power-up clonePowerUp.destroy(); clonePowerUps.splice(i, 1); } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Remove bullets that go off screen if (bullet.y < -50) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check for enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Enemy takes damage var destroyed = enemy.takeDamage(bullet.damage); if (destroyed) { enemiesDefeated++; totalEnemiesDefeated++; LK.setScore(LK.getScore() + enemy.scoreValue); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); } // Remove bullet bullet.destroy(); bullets.splice(i, 1); break; } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; bullet.update(); // Remove bullets that go off screen if (bullet.y > 2732 + 50) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check for player collision if (gameActive && bullet.intersects(player)) { player.takeDamage(bullet.damage); bullet.destroy(); enemyBullets.splice(i, 1); // Check if player is defeated if (player.health <= 0) { gameActive = false; LK.showGameOver(); } continue; } // Check for clone collisions var cloneHit = false; for (var j = playerClones.length - 1; j >= 0; j--) { var clone = playerClones[j]; if (bullet.intersects(clone)) { var destroyed = clone.takeDamage(bullet.damage); if (destroyed) { clone.destroy(); playerClones.splice(j, 1); } bullet.destroy(); enemyBullets.splice(i, 1); cloneHit = true; break; } } if (cloneHit) continue; } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); // Enemies die when they reach the bottom of the screen if (enemy.y > 2732 - 50) { // Grant score for the enemy LK.setScore(LK.getScore() + enemy.scoreValue); scoreTxt.setText('Score: ' + LK.getScore()); // Show explosion effect LK.effects.flashObject(enemy, 0xff0000, 300); LK.getSound('explosion').play(); // Remove the enemy enemy.destroy(); enemies.splice(i, 1); continue; } // Check for collision with player if (gameActive && enemy.intersects(player)) { player.takeDamage(10); // Destroy enemy on collision enemy.destroy(); enemies.splice(i, 1); // Check if player is defeated if (player.health <= 0) { gameActive = false; LK.showGameOver(); } } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(); // Remove power-ups that go off screen if (powerUp.y > 2732 + 50) { powerUp.destroy(); powerUps.splice(i, 1); continue; } // Check for player collision if (gameActive && powerUp.intersects(player)) { player.activatePowerUp(); powerUp.destroy(); powerUps.splice(i, 1); } } // Check if wave is complete - we simply need to check if enemies array is empty if (enemies.length === 0 && waveDelay <= 0) { // Start next wave waveNumber++; enemiesThisWave = 5 + waveNumber * 2; enemiesDefeated = 0; waveTxt.setText('Wave: ' + waveNumber); // Show wave message var waveMessage = new Text2('WAVE ' + waveNumber, { size: 120, fill: 0xFFFFFF }); waveMessage.anchor.set(0.5, 0.5); LK.gui.center.addChild(waveMessage); // Fade out wave message tween(waveMessage, { alpha: 0 }, { duration: 2000, onFinish: function onFinish() { waveMessage.destroy(); } }); // Set delay before spawning next wave waveDelay = 120; // 2 seconds } // Count down wave delay if (waveDelay > 0) { waveDelay--; if (waveDelay === 0) { // Spawn next wave spawnEnemyWave(); } } // Count down spawn delay if (spawnDelay > 0) { spawnDelay--; if (spawnDelay === 0) { // Start first wave spawnEnemyWave(); } } }; // Initialize the game initGame(); // Set a short delay before spawning the first wave spawnDelay = 60; // 1 second
===================================================================
--- original.js
+++ change.js
@@ -359,9 +359,9 @@
self.health = 50;
self.maxHealth = 50;
self.target = null;
self.speed = 8; // Increased speed (was 5)
- self.fireRate = 25; // Slightly faster fire rate (was 30)
+ self.fireRate = 40; // Slower fire rate
self.fireTimer = 0;
// Create clone graphics (same as player but with different tint)
var cloneGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
@@ -404,56 +404,57 @@
}
};
self.shoot = function () {
if (self.fireTimer <= 0) {
- // Shoot bullets in 8 directions (360 degrees)
- for (var i = 0; i < 8; i++) {
- var angle = i * Math.PI / 4; // 45 degree increments
+ // Shoot bullets only in 4 cardinal directions (up, down, left, right)
+ for (var i = 0; i < 4; i++) {
+ var angle = i * Math.PI / 2; // 90 degree increments (cardinal directions only)
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
- bullet.damage = 4;
+ bullet.damage = 5; // Slightly more damage to compensate for fewer bullets
bullet.speed = 20;
bullet.scale.set(1.2, 1.2);
- // Find closest enemy to auto-aim this bullet
+ // Simple auto-aim for each direction
var closestEnemy = null;
var closestDist = Infinity;
- var angleRange = Math.PI / 3; // 60 degree arc for targeting
+ // Define direction vectors based on cardinal direction
+ var dirX = Math.cos(angle);
+ var dirY = Math.sin(angle);
// Only do auto-aim if there are enemies
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var dist = Math.hypot(dx, dy);
- // Calculate angle to this enemy
- var enemyAngle = Math.atan2(dy, dx);
- // Check if enemy is within the arc of this bullet direction
- var angleDiff = Math.abs((enemyAngle - angle + Math.PI * 3) % (Math.PI * 2) - Math.PI);
- if (angleDiff < angleRange && dist < closestDist) {
+ // Check if enemy is roughly in this cardinal direction
+ var dotProduct = dx * dirX + dy * dirY;
+ if (dotProduct > 0 && dist < closestDist) {
closestDist = dist;
closestEnemy = enemy;
}
}
// Set velocity based on direction and auto-aim
- if (closestEnemy) {
+ if (closestEnemy && closestDist < 800) {
+ // Only auto-aim within reasonable range
// Auto-aim: Calculate direct trajectory to closest enemy
var dx = closestEnemy.x - self.x;
var dy = closestEnemy.y - self.y;
var dist = Math.hypot(dx, dy);
bullet.vx = dx / dist * bullet.speed;
bullet.vy = dy / dist * bullet.speed;
} else {
- // No enemy in this direction, just fire straight
- bullet.vx = Math.cos(angle) * bullet.speed;
- bullet.vy = Math.sin(angle) * bullet.speed;
+ // No enemy in this direction, just fire straight cardinal
+ bullet.vx = dirX * bullet.speed;
+ bullet.vy = dirY * bullet.speed;
}
// Store on bullet
bullet.hasCustomVelocity = true;
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
- self.fireTimer = self.fireRate;
+ self.fireTimer = self.fireRate + 15; // Slower fire rate (was just self.fireRate)
}
};
self.findTarget = function () {
if (enemies.length > 0) {
@@ -629,9 +630,9 @@
fill: 0xFFFFFF
});
waveTxt.anchor.set(0.5, 0);
// Create sign
- signTxt = new Text2('cyan powerup = 360Β° auto-aim clone!', {
+ signTxt = new Text2('cyan powerup = 4-direction auto-aim clone!', {
size: 80,
fill: 0xFFFFFF
});
signTxt.anchor.set(1, 1);