User prompt
When our ship fires play "shoot" sound.
User prompt
When taking coin, play "coinsound" sound
User prompt
When finishing wave, play "wavepass" sound
User prompt
Reduce the move speed of power-up and coins
User prompt
When taking power-up, play "powerup" sound
User prompt
When taking power-up, play power-up sound
User prompt
when aliens die play "alienexplosion" sound
User prompt
When heroship dies, it must diasappear immediately
User prompt
When heroship dies it must wait until explosion sound fully play and then game over
User prompt
When heroship die, "explosion" sound must play
User prompt
When playing game "bgmusic" must play
User prompt
When hp of boss lowered to 100 hp, his events are that boss have 2 events. First event is boss fires 9 bullet at right at the same time and this bullets have different angle. Second event is boss do same thing at the left. The time between these 2 events is 0.5 seconds.
User prompt
When hp of boss lowered to 300 hp, his events are that boss have 2 events. First event is boss fires 7 bullet at right at the same time and this bullets have different angle. Second event is boss do same thing at the left. The time between these 2 events is 0.5 seconds. Boss do them until 100 HP
User prompt
When hp of boss lowered to 100 hp, his events are that boss have 2 events. First event is boss fires 7 bullet at right at the same time and this bullets have different angle. Second event is boss do same thing at the left. The time between these 2 events is 0.5 seconds. Also, boss fires biglaser at regular intervals.
User prompt
When hp of boss lowered to 300 hp, his events are that boss have 2 events. First event is boss fires 5 bullet at right at the same time and this bullets have different angle. Second event is boss do same thing at the left. The time between these 2 events is 0.5 seconds. Also, boss fires biglaser at regular intervals. This events lasts until 100 HP.
User prompt
At 300 hp, boss keeps 2 events at the start and also fires biglaser at regular intervals
User prompt
Boss keeps 2 events at the start and also fires biglaser at regular intervals
User prompt
When boss reach the hp point of 300, it fires straight "biglaser" at regular intervals and keep up other 2 events at the same time
User prompt
biglaser moveslike alienbullet but it fires alienbullets to different location at different angles. It has "biglaser" asset. Add it too classes section
User prompt
Boss should fire 5 bullet at the same time at both of these events instead of 9
User prompt
Boss have 2 events ehen his hp is higher than 300. First event is boss fires 9 bullet at right at the same time and this bullets have different angle. Second event is boss do same thing at the left. The time between these 2 events is 0.5 seconds
User prompt
Boss fires 5 bullets at left and right at different angles in order
User prompt
If power-up level is 5, next power-ups that is taken gives additional score points.
User prompt
Change the angle of "heroBullet" according to bullet's angle
User prompt
Power-up have 5 levels. At fourt level it fires 3 bullet straight and 1 bullet diagonal bullets from left and right. At fifth level, 3 bullets straight and 2 diagonal bullets at left and right.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Alien var Alien = Container.expand(function () { var self = Container.call(this); var alien = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5 }); self.width = alien.width; self.height = alien.height; self.speedX = 0; self.speedY = 0.8; self.shootCooldown = 0; self.row = 0; self.col = 0; self.alive = true; self.hp = 2; // Aliens require 2 hits to be defeated self.update = function () { self.x += self.speedX; self.y += self.speedY; if (self.shootCooldown > 0) { self.shootCooldown -= 1; } }; // Flash when hit self.flash = function () { tween(self, { alpha: 0.3 }, { duration: 60, onFinish: function onFinish() { tween(self, { alpha: 1 }, { duration: 100 }); } }); }; return self; }); // Alien2 var Alien2 = Container.expand(function () { var self = Container.call(this); var alien = self.attachAsset('alien2', { anchorX: 0.5, anchorY: 0.5 }); self.width = alien.width; self.height = alien.height; self.speedX = 0; self.speedY = 0.8; self.shootCooldown = 0; self.row = 0; self.col = 0; self.alive = true; self.hp = 4; self.update = function () { self.x += self.speedX; self.y += self.speedY; if (self.shootCooldown > 0) { self.shootCooldown -= 1; } }; self.flash = function () { tween(self, { alpha: 0.3 }, { duration: 60, onFinish: function onFinish() { tween(self, { alpha: 1 }, { duration: 100 }); } }); }; return self; }); // Alien3 var Alien3 = Container.expand(function () { var self = Container.call(this); var alien = self.attachAsset('alien3', { anchorX: 0.5, anchorY: 0.5 }); self.width = alien.width; self.height = alien.height; self.speedX = 0; self.speedY = 0.8; self.shootCooldown = 0; self.row = 0; self.col = 0; self.alive = true; self.hp = 3; self.update = function () { self.x += self.speedX; self.y += self.speedY; if (self.shootCooldown > 0) { self.shootCooldown -= 1; } }; self.flash = function () { tween(self, { alpha: 0.3 }, { duration: 60, onFinish: function onFinish() { tween(self, { alpha: 1 }, { duration: 100 }); } }); }; return self; }); // Alien Bullet var AlienBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('alienBullet', { anchorX: 0.5, anchorY: 0.5 }); self.width = bullet.width; self.height = bullet.height; self.speedY = 14; self.update = function () { if (typeof self.speedX === "undefined") { self.speedX = 0; } self.x += self.speedX; self.y += self.speedY; }; return self; }); // BigLaser var BigLaser = Container.expand(function () { var self = Container.call(this); var laser = self.attachAsset('biglaser', { anchorX: 0.5, anchorY: 0.5 }); self.width = laser.width; self.height = laser.height; self.speedY = 14; self.shootInterval = 30; // fire every 30 frames self._shootTimer = self.shootInterval; self._fired = false; // Optionally allow for diagonal movement self.speedX = 0; self.update = function () { // Move like AlienBullet if (typeof self.speedX === "undefined") { self.speedX = 0; } self.x += self.speedX; self.y += self.speedY; // Fire AlienBullets at different angles every shootInterval frames if (self._shootTimer > 0) { self._shootTimer -= 1; } if (self._shootTimer <= 0) { // Fire 3 AlienBullets: straight, left, right var angles = [0, -Math.PI / 10, Math.PI / 10]; // 0, -18deg, +18deg for (var i = 0; i < angles.length; i++) { var ab = new AlienBullet(); ab.x = self.x; ab.y = self.y + self.height / 2 + 10; ab.speedY = Math.cos(angles[i]) * 14; ab.speedX = Math.sin(angles[i]) * 14; if (typeof alienBullets !== "undefined") { alienBullets.push(ab); } if (typeof game !== "undefined") { game.addChild(ab); } } LK.getSound('alienShoot').play(); self._shootTimer = self.shootInterval; } }; return self; }); // Boss var Boss = Container.expand(function () { var self = Container.call(this); var bossAsset = self.attachAsset('Boss', { anchorX: 0.5, anchorY: 0.5 }); self.width = bossAsset.width; self.height = bossAsset.height; self.hp = 500; self.speedX = 4; self.speedY = 0.7; self.alive = true; self.shootCooldown = 60; self.update = function () { // Move horizontally, bounce off edges self.x += self.speedX; if (self.x - self.width / 2 <= 0 && self.speedX < 0) { self.x = self.width / 2; self.speedX = -self.speedX; } if (self.x + self.width / 2 >= GAME_WIDTH && self.speedX > 0) { self.x = GAME_WIDTH - self.width / 2; self.speedX = -self.speedX; } // Boss does NOT move down in y direction anymore // --- Boss special events when HP > 300 --- if (typeof self._bossEventState === "undefined") { self._bossEventState = 0; // 0: idle, 1: right fired, waiting for left, 2: left fired, waiting for right self._bossEventTimer = 0; } if (self.hp > 300) { // --- Boss special events: right/left bullet spread --- if (self._bossEventState === 0 && (!self.shootCooldown || self.shootCooldown <= 0)) { // Fire 5 bullets to the right at different angles var spread = Math.PI / 3; // 60 degrees total var baseAngle = Math.PI / 2 - spread / 2; // Start at 60deg for (var i = 0; i < 5; i++) { var angle = baseAngle + spread / 4 * i; var b = new AlienBullet(); b.x = self.x + self.width * 0.35; b.y = self.y + self.height / 2 - 10; b.speedY = Math.sin(angle) * 16; b.speedX = Math.cos(angle) * 16; alienBullets.push(b); if (typeof game !== "undefined") game.addChild(b); } LK.getSound('alienShoot').play(); self._bossEventState = 1; self._bossEventTimer = 30; // 0.5s at 60fps self.shootCooldown = 60; // Prevent normal shooting for a bit } else if (self._bossEventState === 1) { self._bossEventTimer -= 1; if (self._bossEventTimer <= 0) { // Fire 5 bullets to the left at different angles var spread = Math.PI / 3; // 60 degrees total var baseAngle = Math.PI / 2 - spread / 2; // Start at 60deg for (var i = 0; i < 5; i++) { var angle = baseAngle + spread / 4 * i; var b = new AlienBullet(); b.x = self.x - self.width * 0.35; b.y = self.y + self.height / 2 - 10; b.speedY = Math.sin(angle) * 16; b.speedX = -Math.cos(angle) * 16; alienBullets.push(b); if (typeof game !== "undefined") game.addChild(b); } LK.getSound('alienShoot').play(); self._bossEventState = 2; self._bossEventTimer = 30; // 0.5s self.shootCooldown = 60; } } else if (self._bossEventState === 2) { self._bossEventTimer -= 1; if (self._bossEventTimer <= 0) { self._bossEventState = 0; } } // --- Boss fires straight biglaser at regular intervals (also at HP > 300) --- if (typeof self._bigLaserTimer === "undefined") { self._bigLaserTimer = 0; } self._bigLaserTimer -= 1; if (self._bigLaserTimer <= 0) { // Fire a straight biglaser from the center bottom of the boss var bl = new BigLaser(); bl.x = self.x; bl.y = self.y + self.height / 2 + bl.height / 2; bl.speedX = 0; bl.speedY = 18; if (typeof alienBullets !== "undefined") { alienBullets.push(bl); } if (typeof game !== "undefined") { game.addChild(bl); } LK.getSound('alienShoot').play(); self._bigLaserTimer = 90; // Fire every 90 frames (~1.5s at 60fps) } } else { // Reset event state if HP drops below threshold self._bossEventState = 0; self._bossEventTimer = 0; // --- Boss fires straight biglaser at regular intervals --- if (typeof self._bigLaserTimer === "undefined") { self._bigLaserTimer = 0; } self._bigLaserTimer -= 1; if (self._bigLaserTimer <= 0) { // Fire a straight biglaser from the center bottom of the boss var bl = new BigLaser(); bl.x = self.x; bl.y = self.y + self.height / 2 + bl.height / 2; bl.speedX = 0; bl.speedY = 18; if (typeof alienBullets !== "undefined") { alienBullets.push(bl); } if (typeof game !== "undefined") { game.addChild(bl); } LK.getSound('alienShoot').play(); self._bigLaserTimer = 90; // Fire every 90 frames (~1.5s at 60fps) } } // Shoot cooldown if (self.shootCooldown > 0) { self.shootCooldown -= 1; } }; // Flash when hit self.flash = function () { tween(self, { alpha: 0.3 }, { duration: 60, onFinish: function onFinish() { tween(self, { alpha: 1 }, { duration: 100 }); } }); }; return self; }); // Coin var Coin = Container.expand(function () { var self = Container.call(this); var c = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.width = c.width; self.height = c.height; self.speedY = 32; self.update = function () { self.y += self.speedY; }; return self; }); // Hero Bullet var HeroBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('heroBullet', { anchorX: 0.5, anchorY: 0.5 }); self.width = bullet.width; self.height = bullet.height; self.speedY = -22; self.update = function () { if (typeof self.speedX === "undefined") { self.speedX = 0; } self.x += self.speedX; self.y += self.speedY; }; return self; }); // Hero Ship var HeroShip = Container.expand(function () { var self = Container.call(this); var ship = self.attachAsset('heroShip', { anchorX: 0.5, anchorY: 0.5 }); self.width = ship.width; self.height = ship.height; self.lives = 1; self.fireCooldown = 0; self.powerLevel = 1; self.invincible = false; self.invincibleTimer = 0; // Flash when hit self.flash = function () { tween(self, { alpha: 0.3 }, { duration: 80, onFinish: function onFinish() { tween(self, { alpha: 1 }, { duration: 120 }); } }); }; // Power up self.upgrade = function () { if (self.powerLevel < 5) { self.powerLevel += 1; LK.effects.flashObject(self, 0xaa66ff, 400); } }; // Invincibility after hit self.setInvincible = function (duration) { self.invincible = true; self.invincibleTimer = duration; tween(self, { alpha: 0.5 }, { duration: 100 }); }; // Called every tick self.update = function () { if (self.invincible) { self.invincibleTimer -= 1; if (self.invincibleTimer <= 0) { self.invincible = false; self.alpha = 1; } } if (self.fireCooldown > 0) { self.fireCooldown -= 1; } }; return self; }); // Powerup var Powerup = Container.expand(function () { var self = Container.call(this); var p = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.width = p.width; self.height = p.height; self.speedY = 40; self.update = function () { self.y += self.speedY; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game area // Hero ship: blue box // Alien: green ellipse // Hero bullet: yellow box // Alien bullet: red box // Power-up: purple ellipse // Sound effects // Music var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; // Play music LK.playMusic('bgmusic'); // Score var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Wave var wave = 1; var waveTxt = new Text2('Wave 1', { size: 70, fill: 0xAAFFFF }); waveTxt.anchor.set(0.5, 0); LK.gui.top.addChild(waveTxt); waveTxt.y = 120; // Hero var hero = new HeroShip(); game.addChild(hero); hero.x = GAME_WIDTH / 2; hero.y = GAME_HEIGHT - 220; // Bullets, aliens, powerups, coins var heroBullets = []; var alienBullets = []; var aliens = []; var powerups = []; var coins = []; // Dragging var dragNode = null; // Alien formation function spawnWave(waveNum) { // Remove old aliens for (var i = aliens.length - 1; i >= 0; i--) { aliens[i].destroy(); aliens.splice(i, 1); } if (waveNum === 10) { // Only spawn the boss for wave 10 var boss = new Boss(); boss.x = GAME_WIDTH / 2; boss.y = 320; aliens.push(boss); game.addChild(boss); waveTxt.setText('Wave ' + waveNum); // Reset wave timer and alien zone flag for new wave game._waveStartTime = Date.now(); game._alienReachedHeroZone = false; return; } // Formation: rows, cols, spacing var rows, cols; if (waveNum === 4) { rows = 3; cols = 5; } else if (waveNum === 5) { // More than wave 4, but less than default for wave 5 (default would be rows=6, cols=10) rows = 4; cols = 7; } else if (waveNum === 6) { // Slightly more than wave 5 rows = 5; cols = 8; } else if (waveNum === 7) { // Reduce a little bit more from wave 6 rows = 3; cols = 7; } else if (waveNum === 8) { // Decrease total alien number in wave 8 a little bit (but still more than wave 7) rows = 4; cols = 8; } else if (waveNum === 9) { // Reduce total alien number a little bit compared to wave 8 rows = 3; cols = 8; } else { rows = Math.min(2 + waveNum, 6); cols = Math.min(4 + waveNum * 2, 10); } var spacingX = 160; var spacingY = 140; var startX = (GAME_WIDTH - (cols - 1) * spacingX) / 2; var startY = 220 + (waveNum - 1) * 30; for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { var alien; if (waveNum === 4 || waveNum === 5) { alien = new Alien2(); } else if (waveNum === 6) { // 70% Alien2, 30% Alien if (Math.random() < 0.7) { alien = new Alien2(); } else { alien = new Alien(); } } else if (waveNum === 7) { // 30% Alien3, 70% Alien if (Math.random() < 0.3) { alien = new Alien3(); } else { alien = new Alien(); } } else if (waveNum === 8) { // 50% Alien2, 50% Alien3 if (Math.random() < 0.5) { alien = new Alien2(); } else { alien = new Alien3(); } } else if (waveNum === 9) { // All Alien3 for wave 9 alien = new Alien3(); } else { alien = new Alien(); } alien.x = startX + c * spacingX; alien.y = startY + r * spacingY; alien.row = r; alien.col = c; alien.speedX = Math.sin((r * cols + c + waveNum) * 0.7) * 1.5 + (Math.random() - 0.5) * 0.5; alien.speedY = 0.7 + 0.1 * waveNum + (Math.random() - 0.5) * 0.2; alien.shootCooldown = 60 + Math.floor(Math.random() * 60); aliens.push(alien); game.addChild(alien); } } waveTxt.setText('Wave ' + waveNum); // Reset wave timer and alien zone flag for new wave game._waveStartTime = Date.now(); game._alienReachedHeroZone = false; } // Powerup spawn function maybeSpawnPowerup(x, y) { if (Math.random() < 0.03) { var p = new Powerup(); p.x = x; p.y = y; powerups.push(p); game.addChild(p); } } // Coin spawn (lower probability than powerup) function maybeSpawnCoin(x, y) { // Powerup is 0.03, so coin should be less, but increase coin drop rate (e.g. 0.02) if (Math.random() < 0.02) { var c = new Coin(); c.x = x; c.y = y; coins.push(c); game.addChild(c); } } // Fire hero bullets function fireHeroBullets() { if (hero.fireCooldown > 0) { return; } var b; if (hero.powerLevel === 1) { b = new HeroBullet(); b.x = hero.x; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); } else if (hero.powerLevel === 2) { b = new HeroBullet(); b.x = hero.x - 38; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); b = new HeroBullet(); b.x = hero.x + 38; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); } else if (hero.powerLevel === 3) { // 3 straight bullets b = new HeroBullet(); b.x = hero.x - 60; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); b = new HeroBullet(); b.x = hero.x; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); b = new HeroBullet(); b.x = hero.x + 60; b.y = hero.y - hero.height / 2 - 10; heroBullets.push(b); game.addChild(b); } else if (hero.powerLevel === 4) { // 3 straight bullets var b1 = new HeroBullet(); b1.x = hero.x - 60; b1.y = hero.y - hero.height / 2 - 10; heroBullets.push(b1); game.addChild(b1); var b2 = new HeroBullet(); b2.x = hero.x; b2.y = hero.y - hero.height / 2 - 10; heroBullets.push(b2); game.addChild(b2); var b3 = new HeroBullet(); b3.x = hero.x + 60; b3.y = hero.y - hero.height / 2 - 10; heroBullets.push(b3); game.addChild(b3); // 1 diagonal left, 1 diagonal right var diagLeft = new HeroBullet(); diagLeft.x = hero.x - 60; diagLeft.y = hero.y - hero.height / 2 - 10; diagLeft.speedY = -22; diagLeft.speedX = -8; heroBullets.push(diagLeft); game.addChild(diagLeft); var diagRight = new HeroBullet(); diagRight.x = hero.x + 60; diagRight.y = hero.y - hero.height / 2 - 10; diagRight.speedY = -22; diagRight.speedX = 8; heroBullets.push(diagRight); game.addChild(diagRight); } else if (hero.powerLevel >= 5) { // 3 straight bullets var b1 = new HeroBullet(); b1.x = hero.x - 60; b1.y = hero.y - hero.height / 2 - 10; heroBullets.push(b1); game.addChild(b1); var b2 = new HeroBullet(); b2.x = hero.x; b2.y = hero.y - hero.height / 2 - 10; heroBullets.push(b2); game.addChild(b2); var b3 = new HeroBullet(); b3.x = hero.x + 60; b3.y = hero.y - hero.height / 2 - 10; heroBullets.push(b3); game.addChild(b3); // 2 diagonal left var diagLeft1 = new HeroBullet(); diagLeft1.x = hero.x - 60; diagLeft1.y = hero.y - hero.height / 2 - 10; diagLeft1.speedY = -22; diagLeft1.speedX = -8; heroBullets.push(diagLeft1); game.addChild(diagLeft1); var diagLeft2 = new HeroBullet(); diagLeft2.x = hero.x - 60; diagLeft2.y = hero.y - hero.height / 2 - 10; diagLeft2.speedY = -22; diagLeft2.speedX = -16; heroBullets.push(diagLeft2); game.addChild(diagLeft2); // 2 diagonal right var diagRight1 = new HeroBullet(); diagRight1.x = hero.x + 60; diagRight1.y = hero.y - hero.height / 2 - 10; diagRight1.speedY = -22; diagRight1.speedX = 8; heroBullets.push(diagRight1); game.addChild(diagRight1); var diagRight2 = new HeroBullet(); diagRight2.x = hero.x + 60; diagRight2.y = hero.y - hero.height / 2 - 10; diagRight2.speedY = -22; diagRight2.speedX = 16; heroBullets.push(diagRight2); game.addChild(diagRight2); } hero.fireCooldown = 12; LK.getSound('shoot').play(); } // Fire alien bullet function fireAlienBullet(alien) { // If Alien3, fire triple bullets at different angles if (alien instanceof Alien3) { // Center bullet (straight down) var b0 = new AlienBullet(); b0.x = alien.x; b0.y = alien.y + alien.height / 2 + 10; b0.speedY = 14; b0.speedX = 0; alienBullets.push(b0); game.addChild(b0); // Left bullet (angle -20deg) var b1 = new AlienBullet(); b1.x = alien.x; b1.y = alien.y + alien.height / 2 + 10; var angle1 = Math.PI / 2 - Math.PI / 9; // 70deg b1.speedY = Math.sin(angle1) * 14; b1.speedX = Math.cos(angle1) * 14; alienBullets.push(b1); game.addChild(b1); // Right bullet (angle +20deg) var b2 = new AlienBullet(); b2.x = alien.x; b2.y = alien.y + alien.height / 2 + 10; var angle2 = Math.PI / 2 + Math.PI / 9; // 110deg b2.speedY = Math.sin(angle2) * 14; b2.speedX = Math.cos(angle2) * 14; alienBullets.push(b2); game.addChild(b2); LK.getSound('alienShoot').play(); } else { // Default: single bullet straight down var b = new AlienBullet(); b.x = alien.x; b.y = alien.y + alien.height / 2 + 10; alienBullets.push(b); game.addChild(b); LK.getSound('alienShoot').play(); } } // Move handler (drag hero) function handleMove(x, y, obj) { if (dragNode) { // Clamp to game area, avoid top 100px (menu) var nx = Math.max(hero.width / 2, Math.min(GAME_WIDTH - hero.width / 2, x)); var ny = Math.max(GAME_HEIGHT - 600, Math.min(GAME_HEIGHT - hero.height / 2, y)); dragNode.x = nx; dragNode.y = ny; } } game.move = handleMove; game.down = function (x, y, obj) { // Only drag if touch is on hero var local = hero.toLocal(game.toGlobal({ x: x, y: y })); if (local.x > -hero.width / 2 && local.x < hero.width / 2 && local.y > -hero.height / 2 && local.y < hero.height / 2) { dragNode = hero; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Tap to shoot game.tap = function (x, y, obj) { fireHeroBullets(); }; // Main update game.update = function () { // Hero update hero.update(); // Fire hero bullets automatically if holding if (dragNode === hero && LK.ticks % 6 === 0) { fireHeroBullets(); } // Update hero bullets for (var i = heroBullets.length - 1; i >= 0; i--) { var b = heroBullets[i]; b.update(); // Off screen if (b.y < -b.height) { b.destroy(); heroBullets.splice(i, 1); continue; } // Hit alien for (var j = aliens.length - 1; j >= 0; j--) { var a = aliens[j]; if (a.alive && b.intersects(a)) { a.flash(); a.hp -= 1; b.destroy(); heroBullets.splice(i, 1); if (a.hp <= 0) { a.alive = false; a.destroy(); aliens.splice(j, 1); score += 100; scoreTxt.setText(score); maybeSpawnPowerup(a.x, a.y); maybeSpawnCoin(a.x, a.y); LK.getSound('explosion').play(); } break; } } } // Update alien bullets for (var i = alienBullets.length - 1; i >= 0; i--) { var b = alienBullets[i]; b.update(); if (b.y > GAME_HEIGHT + b.height) { b.destroy(); alienBullets.splice(i, 1); continue; } // Hit hero if (!hero.invincible && b.intersects(hero)) { hero.flash(); hero.setInvincible(60); b.destroy(); alienBullets.splice(i, 1); // Explosion effect at hero ship position LK.effects.flashObject(hero, 0xffe066, 700); LK.effects.flashScreen(0xff0000, 400); LK.getSound('explosion').play(); // Game over LK.showGameOver(); return; } } // Update aliens for (var i = aliens.length - 1; i >= 0; i--) { var a = aliens[i]; a.update(); // Game over if alien touches hero ship if (a.alive && !hero.invincible && a.intersects(hero)) { hero.flash(); // Explosion effect at hero ship position LK.effects.flashObject(hero, 0xffe066, 700); LK.effects.flashScreen(0xff0000, 800); LK.getSound('explosion').play(); LK.showGameOver(); return; } // Fire bullet // Reduce firing frequency: lower probability and increase cooldown if (a.shootCooldown <= 0) { if (a instanceof Alien3) { // Alien3: much lower probability and higher cooldown if (Math.random() < 0.002 + 0.0005 * wave) { fireAlienBullet(a); a.shootCooldown = 220 + Math.floor(Math.random() * 100); } } else { if (Math.random() < 0.006 + 0.001 * wave) { fireAlienBullet(a); a.shootCooldown = 120 + Math.floor(Math.random() * 80); } } } // Off screen (bottom) or reached hero moving zone if (a.y > GAME_HEIGHT - 600) { // If any alien reaches hero moving zone, set flag to disable bonus for this wave game._alienReachedHeroZone = true; } if (a.y > GAME_HEIGHT - 200) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } // Bounce alien off left/right borders if (a.x - a.width / 2 <= 0 && a.speedX < 0) { a.x = a.width / 2; a.speedX = -a.speedX; } if (a.x + a.width / 2 >= GAME_WIDTH && a.speedX > 0) { a.x = GAME_WIDTH - a.width / 2; a.speedX = -a.speedX; } // Remove alien if it goes off screen at the top if (a.y < -a.height) { a.destroy(); aliens.splice(i, 1); continue; } } // Update powerups for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; p.update(); if (p.y > GAME_HEIGHT + p.height) { p.destroy(); powerups.splice(i, 1); continue; } // Collect if (p.intersects(hero)) { if (hero.powerLevel < 5) { hero.upgrade(); } else { // Already at max power, give bonus score instead score += 1000; scoreTxt.setText(score); } LK.getSound('powerup').play(); p.destroy(); powerups.splice(i, 1); } } // Update coins for (var i = coins.length - 1; i >= 0; i--) { var c = coins[i]; c.update(); if (c.y > GAME_HEIGHT + c.height) { c.destroy(); coins.splice(i, 1); continue; } // Collect coin if (c.intersects(hero)) { score += 500; // Give additional score for collecting coin scoreTxt.setText(score); c.destroy(); coins.splice(i, 1); // Optionally play a sound here if desired } } // --- Wave bonus logic variables --- if (typeof game._waveStartTime === "undefined") { game._waveStartTime = Date.now(); } if (typeof game._alienReachedHeroZone === "undefined") { game._alienReachedHeroZone = false; } // Next wave if (aliens.length === 0 && !game._wavePopupActive) { // Calculate and award wave finish bonus if no alien reached hero zone var bonusScore = 0; var waveFinishTime = Date.now(); if (!game._alienReachedHeroZone) { // Bonus: 5000 - 1000 * (seconds taken, min 0), min 1000, max 5000 var elapsedSec = Math.floor((waveFinishTime - game._waveStartTime) / 1000); bonusScore = Math.max(1000, 5000 - 1000 * elapsedSec); score += bonusScore; scoreTxt.setText(score); } game._wavePopupActive = true; // Create popup if (!game._wavePopup) { game._wavePopup = new Text2("Congratulations\nGet ready for the next wave", { size: 120, fill: 0xFFFF99, align: "center" }); game._wavePopup.anchor.set(0.5, 0.5); } if (wave >= 10) { game._wavePopup.setText("Congratulations!\nYou completed all 10 waves!" + (bonusScore > 0 ? "\nWave Bonus: +" + bonusScore : "")); } else { if (bonusScore > 0) { game._wavePopup.setText("Congratulations\nGet ready for the next wave\nWave Bonus: +" + bonusScore); } else if (game._alienReachedHeroZone) { game._wavePopup.setText("Congratulations\nGet ready for the next wave\n(No bonus: Aliens reached your zone!)"); } else { game._wavePopup.setText("Congratulations\nGet ready for the next wave"); } } game._wavePopup.x = GAME_WIDTH / 2; game._wavePopup.y = GAME_HEIGHT / 2; if (!game._wavePopup.parent) { game.addChild(game._wavePopup); } // Play popup sound LK.getSound('powerup').play(); // Hold for 2 seconds, then start next wave or finish LK.setTimeout(function () { if (game._wavePopup && game._wavePopup.parent) { game._wavePopup.parent.removeChild(game._wavePopup); } if (wave >= 10) { LK.showYouWin(); } else { wave += 1; spawnWave(wave); // Reset wave timer and alien zone flag game._waveStartTime = Date.now(); game._alienReachedHeroZone = false; game._wavePopupActive = false; } }, 2000); } }; // Start first wave spawnWave(wave); // Initial score scoreTxt.setText(score); // --- Add Invincibility Button --- var invBtn = new Text2("INV", { size: 90, fill: 0xFFEE44, align: "center" }); invBtn.anchor.set(1, 1); // bottom right invBtn.x = GAME_WIDTH - 40; invBtn.y = GAME_HEIGHT - 40; invBtn.interactive = true; invBtn.buttonMode = true; game.addChild(invBtn); // Button press handler: toggle hero immortality invBtn.down = function (x, y, obj) { if (hero.invincible && hero.invincibleTimer > 1000) { // Turn off immortality hero.invincible = false; hero.invincibleTimer = 0; hero.alpha = 1; } else { // Turn on immortality hero.setInvincible(99999); // Effectively infinite duration hero.alpha = 0.5; } }; // --- Add PWR Button (Increase Power Level) --- var pwrBtn = new Text2("PWR", { size: 90, fill: 0x7B1FA2, // dark purple align: "center" }); pwrBtn.anchor.set(0.5, 1); // middle bottom pwrBtn.x = GAME_WIDTH / 2; pwrBtn.y = GAME_HEIGHT - 40; pwrBtn.interactive = true; pwrBtn.buttonMode = true; game.addChild(pwrBtn); pwrBtn.down = function (x, y, obj) { if (hero && typeof hero.upgrade === "function") { hero.upgrade(); } }; // --- Add SMH Button (Kill All Aliens) --- var smhBtn = new Text2("SMH", { size: 90, fill: 0xFF4444, align: "center" }); smhBtn.anchor.set(0, 1); // bottom left smhBtn.x = 40; smhBtn.y = GAME_HEIGHT - 40; smhBtn.interactive = true; smhBtn.buttonMode = true; game.addChild(smhBtn); smhBtn.down = function (x, y, obj) { // Kill all aliens in the wave immediately for (var i = aliens.length - 1; i >= 0; i--) { var a = aliens[i]; if (a && a.alive) { a.alive = false; a.destroy(); aliens.splice(i, 1); score += 100; scoreTxt.setText(score); maybeSpawnPowerup(a.x, a.y); maybeSpawnCoin(a.x, a.y); LK.getSound('explosion').play(); } } };
===================================================================
--- original.js
+++ change.js
@@ -216,79 +216,106 @@
self.x = GAME_WIDTH - self.width / 2;
self.speedX = -self.speedX;
}
// Boss does NOT move down in y direction anymore
- // --- Boss special events: always active, regardless of HP ---
+ // --- Boss special events when HP > 300 ---
if (typeof self._bossEventState === "undefined") {
self._bossEventState = 0; // 0: idle, 1: right fired, waiting for left, 2: left fired, waiting for right
self._bossEventTimer = 0;
}
- // Always run right/left bullet spread events
- if (self._bossEventState === 0 && (!self.shootCooldown || self.shootCooldown <= 0)) {
- // Fire 5 bullets to the right at different angles
- var spread = Math.PI / 3; // 60 degrees total
- var baseAngle = Math.PI / 2 - spread / 2; // Start at 60deg
- for (var i = 0; i < 5; i++) {
- var angle = baseAngle + spread / 4 * i;
- var b = new AlienBullet();
- b.x = self.x + self.width * 0.35;
- b.y = self.y + self.height / 2 - 10;
- b.speedY = Math.sin(angle) * 16;
- b.speedX = Math.cos(angle) * 16;
- alienBullets.push(b);
- if (typeof game !== "undefined") game.addChild(b);
- }
- LK.getSound('alienShoot').play();
- self._bossEventState = 1;
- self._bossEventTimer = 30; // 0.5s at 60fps
- self.shootCooldown = 60; // Prevent normal shooting for a bit
- } else if (self._bossEventState === 1) {
- self._bossEventTimer -= 1;
- if (self._bossEventTimer <= 0) {
- // Fire 5 bullets to the left at different angles
+ if (self.hp > 300) {
+ // --- Boss special events: right/left bullet spread ---
+ if (self._bossEventState === 0 && (!self.shootCooldown || self.shootCooldown <= 0)) {
+ // Fire 5 bullets to the right at different angles
var spread = Math.PI / 3; // 60 degrees total
var baseAngle = Math.PI / 2 - spread / 2; // Start at 60deg
for (var i = 0; i < 5; i++) {
var angle = baseAngle + spread / 4 * i;
var b = new AlienBullet();
- b.x = self.x - self.width * 0.35;
+ b.x = self.x + self.width * 0.35;
b.y = self.y + self.height / 2 - 10;
b.speedY = Math.sin(angle) * 16;
- b.speedX = -Math.cos(angle) * 16;
+ b.speedX = Math.cos(angle) * 16;
alienBullets.push(b);
if (typeof game !== "undefined") game.addChild(b);
}
LK.getSound('alienShoot').play();
- self._bossEventState = 2;
- self._bossEventTimer = 30; // 0.5s
- self.shootCooldown = 60;
+ self._bossEventState = 1;
+ self._bossEventTimer = 30; // 0.5s at 60fps
+ self.shootCooldown = 60; // Prevent normal shooting for a bit
+ } else if (self._bossEventState === 1) {
+ self._bossEventTimer -= 1;
+ if (self._bossEventTimer <= 0) {
+ // Fire 5 bullets to the left at different angles
+ var spread = Math.PI / 3; // 60 degrees total
+ var baseAngle = Math.PI / 2 - spread / 2; // Start at 60deg
+ for (var i = 0; i < 5; i++) {
+ var angle = baseAngle + spread / 4 * i;
+ var b = new AlienBullet();
+ b.x = self.x - self.width * 0.35;
+ b.y = self.y + self.height / 2 - 10;
+ b.speedY = Math.sin(angle) * 16;
+ b.speedX = -Math.cos(angle) * 16;
+ alienBullets.push(b);
+ if (typeof game !== "undefined") game.addChild(b);
+ }
+ LK.getSound('alienShoot').play();
+ self._bossEventState = 2;
+ self._bossEventTimer = 30; // 0.5s
+ self.shootCooldown = 60;
+ }
+ } else if (self._bossEventState === 2) {
+ self._bossEventTimer -= 1;
+ if (self._bossEventTimer <= 0) {
+ self._bossEventState = 0;
+ }
}
- } else if (self._bossEventState === 2) {
- self._bossEventTimer -= 1;
- if (self._bossEventTimer <= 0) {
- self._bossEventState = 0;
+ // --- Boss fires straight biglaser at regular intervals (also at HP > 300) ---
+ if (typeof self._bigLaserTimer === "undefined") {
+ self._bigLaserTimer = 0;
}
- }
- // --- Boss fires straight biglaser at regular intervals, always ---
- if (typeof self._bigLaserTimer === "undefined") {
- self._bigLaserTimer = 0;
- }
- self._bigLaserTimer -= 1;
- if (self._bigLaserTimer <= 0) {
- // Fire a straight biglaser from the center bottom of the boss
- var bl = new BigLaser();
- bl.x = self.x;
- bl.y = self.y + self.height / 2 + bl.height / 2;
- bl.speedX = 0;
- bl.speedY = 18;
- if (typeof alienBullets !== "undefined") {
- alienBullets.push(bl);
+ self._bigLaserTimer -= 1;
+ if (self._bigLaserTimer <= 0) {
+ // Fire a straight biglaser from the center bottom of the boss
+ var bl = new BigLaser();
+ bl.x = self.x;
+ bl.y = self.y + self.height / 2 + bl.height / 2;
+ bl.speedX = 0;
+ bl.speedY = 18;
+ if (typeof alienBullets !== "undefined") {
+ alienBullets.push(bl);
+ }
+ if (typeof game !== "undefined") {
+ game.addChild(bl);
+ }
+ LK.getSound('alienShoot').play();
+ self._bigLaserTimer = 90; // Fire every 90 frames (~1.5s at 60fps)
}
- if (typeof game !== "undefined") {
- game.addChild(bl);
+ } else {
+ // Reset event state if HP drops below threshold
+ self._bossEventState = 0;
+ self._bossEventTimer = 0;
+ // --- Boss fires straight biglaser at regular intervals ---
+ if (typeof self._bigLaserTimer === "undefined") {
+ self._bigLaserTimer = 0;
}
- LK.getSound('alienShoot').play();
- self._bigLaserTimer = 90; // Fire every 90 frames (~1.5s at 60fps)
+ self._bigLaserTimer -= 1;
+ if (self._bigLaserTimer <= 0) {
+ // Fire a straight biglaser from the center bottom of the boss
+ var bl = new BigLaser();
+ bl.x = self.x;
+ bl.y = self.y + self.height / 2 + bl.height / 2;
+ bl.speedX = 0;
+ bl.speedY = 18;
+ if (typeof alienBullets !== "undefined") {
+ alienBullets.push(bl);
+ }
+ if (typeof game !== "undefined") {
+ game.addChild(bl);
+ }
+ LK.getSound('alienShoot').play();
+ self._bigLaserTimer = 90; // Fire every 90 frames (~1.5s at 60fps)
+ }
}
// Shoot cooldown
if (self.shootCooldown > 0) {
self.shootCooldown -= 1;
@@ -431,16 +458,16 @@
/****
* Game Code
****/
-// Music
-// Sound effects
-// Power-up: purple ellipse
-// Alien bullet: red box
-// Hero bullet: yellow box
-// Alien: green ellipse
-// Hero ship: blue box
// Game area
+// Hero ship: blue box
+// Alien: green ellipse
+// Hero bullet: yellow box
+// Alien bullet: red box
+// Power-up: purple ellipse
+// Sound effects
+// Music
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Play music
LK.playMusic('bgmusic');
Space ship with guns. In-Game asset. 2d. High contrast. No shadows
A green alien ship. In-Game asset. 2d. High contrast. No shadows
A navy blue alien ship. In-Game asset. 2d. High contrast. No shadows
A dark purple alien ship. In-Game asset. 2d. High contrast. No shadows
A coin having saturn logo. In-Game asset. 2d. High contrast. No shadows
A power-up logo for spaceships. In-Game asset. 2d. High contrast. No shadows
Giant bordeux ostentatious alien ship with ostentatious giant guns. Looking straightly down In-Game asset. 2d. High contrast. No shadows
red dot. In-Game asset. 2d. High contrast. No shadows
light yellow dot. In-Game asset. 2d. High contrast. No shadows
bgmusic
Music
explosion
Sound effect
alienexplosion
Sound effect
powerup
Sound effect
wavepass
Sound effect
coinsound
Sound effect
shoot
Sound effect
alienShoot
Sound effect
bossmusic
Music
bossmusic2
Music
bossexplosion
Sound effect
bossexplosion2
Sound effect
bossexplosion3
Sound effect
bossexplosion4
Sound effect
bosswin
Sound effect
rage
Sound effect
menumusic
Music
menuclick
Sound effect