User prompt
Star spawning must also be in gameplay but too much less stars should spawn when starting game.
User prompt
Please fix the bug: 'Uncaught ReferenceError: invBtn is not defined' in or related to this line: 'if (invBtn.parent) {' Line Number: 805
User prompt
Remove "SMH , "PWR" and "INV" button from game
User prompt
Remove score and wave indicator from main menu and instructions section
User prompt
Can you move herobullet spawn little bit down from heroship more
User prompt
Herobullet should spawn little bit down from heroship
Code edit (2 edits merged)
Please save this source code
User prompt
At instructions section make all texts yellowish white apart from "Back to menu" text
User prompt
When going to instructions section star spawning musn't stop it must continue
User prompt
When going to instructions section star spawning should continue
User prompt
Play "menuclick" sound when every clickable button at main menu and instructions sections are pressed.
Code edit (1 edits merged)
Please save this source code
User prompt
Starfield background musn't change when doing transition between instructions and main menu.
User prompt
Add a starfield background to the main menu and instruction section using the "star" asset. Stars should spawn randomly across the screen at different positions and slowly move downward to give the illusion of flying forward in space. Stars should continuously spawn as the player moves, and old stars should be removed when they go off-screen.
User prompt
When in main menu and instructions section, play "menumusic"
User prompt
When pressing instructions. Use seperate UI canvases for instructions section.
User prompt
Make a main menu. Use separate UI canvases for the main menu and the game. When the menu is active, disable all game-related UI elements and objects. Make sure the menu background is solid black. Add Start Game and Instructions button to the menu.
User prompt
Use separate UI canvases for the menu and the game. When the menu is active, disable all game-related UI elements and objects. Make sure the menu background is solid black.
User prompt
Remove "Wave 1" and score text from main menu
User prompt
If we press "Start Game" start over wave1
User prompt
If we are in main menu pause game until pressing the "Start Game"
User prompt
Main menu background fully black no any asset
User prompt
If we are in main menu, don't start game
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'visible')' in or related to this line: 'scoreTxt.visible = false;' Line Number: 630
/**** * 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; }); // 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 for HP thresholds --- // Boss event state: 0 = idle, 1 = right fired, waiting for left, 2 = left fired, waiting for right if (typeof self._bossEventState === "undefined") { self._bossEventState = 0; self._bossEventTimer = 0; } // HP > 300: original 5-bullet events if (self.hp > 300) { 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; } } } // Switch to bossmusic2 when HP drops to 300 or below if (typeof self._bossMusic2Played === "undefined") { self._bossMusic2Played = false; } if (typeof self._rage300Played === "undefined") { self._rage300Played = false; } if (typeof self._rage100Played === "undefined") { self._rage100Played = false; } if (!self._bossMusic2Played && self.hp <= 300) { LK.playMusic('bossmusic2'); self._bossMusic2Played = true; } if (!self._rage300Played && self.hp <= 300) { LK.getSound('rage').play(); self._rage300Played = true; } if (!self._rage100Played && self.hp <= 100) { LK.getSound('rage').play(); self._rage100Played = true; } // HP between 300 and 100: 7-bullet events, alternate right/left every 0.5s else if (self.hp <= 300 && self.hp > 100) { if (self._bossEventState === 0 && (!self.shootCooldown || self.shootCooldown <= 0)) { // Fire 7 bullets to the right at different angles var spread = Math.PI * 2 / 3; // 120 degrees total var baseAngle = Math.PI / 2 - spread / 2; // Centered at down for (var i = 0; i < 7; i++) { var angle = baseAngle + spread / 6 * 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 self.shootCooldown = 60; } else if (self._bossEventState === 1) { self._bossEventTimer -= 1; if (self._bossEventTimer <= 0) { // Fire 7 bullets to the left at different angles var spread = Math.PI * 2 / 3; // 120 degrees total var baseAngle = Math.PI / 2 - spread / 2; for (var i = 0; i < 7; i++) { var angle = baseAngle + spread / 6 * 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; } } } // HP between 100 and 0: 9-bullet events, alternate right/left every 0.5s else if (self.hp <= 100 && self.hp > 0) { if (self._bossEventState === 0 && (!self.shootCooldown || self.shootCooldown <= 0)) { // Fire 9 bullets to the right at different angles var spread = Math.PI * 5 / 6; // 150 degrees total var baseAngle = Math.PI / 2 - spread / 2; // Centered at down for (var i = 0; i < 9; i++) { var angle = baseAngle + spread / 8 * 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 self.shootCooldown = 60; } else if (self._bossEventState === 1) { self._bossEventTimer -= 1; if (self._bossEventTimer <= 0) { // Fire 9 bullets to the left at different angles var spread = Math.PI * 5 / 6; // 150 degrees total var baseAngle = Math.PI / 2 - spread / 2; for (var i = 0; i < 9; i++) { var angle = baseAngle + spread / 8 * 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 { // Reset event state if HP drops below threshold or is above 300 or below/equal 0 self._bossEventState = 0; self._bossEventTimer = 0; } // 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 = 12; 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 < 3) { 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 = 15; 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; // --- Main Menu Overlay --- var menuOverlay = new Container(); menuOverlay.width = GAME_WIDTH; menuOverlay.height = GAME_HEIGHT; // Main menu background: fully black, no asset menuOverlay.backgroundColor = 0x000000; // Title var titleTxt = new Text2("ALIEN BLASTERS", { size: 180, fill: 0xFFFF99, align: "center" }); titleTxt.anchor.set(0.5, 0); titleTxt.x = GAME_WIDTH / 2; titleTxt.y = 220; menuOverlay.addChild(titleTxt); // Start Game Button var startBtn = new Text2("Start Game", { size: 120, fill: 0x00FF99, align: "center" }); startBtn.anchor.set(0.5, 0.5); startBtn.x = GAME_WIDTH / 2; startBtn.y = GAME_HEIGHT / 2 - 80; startBtn.interactive = true; startBtn.buttonMode = true; menuOverlay.addChild(startBtn); // Instructions Button var instrBtn = new Text2("Instructions", { size: 100, fill: 0x99CCFF, align: "center" }); instrBtn.anchor.set(0.5, 0.5); instrBtn.x = GAME_WIDTH / 2; instrBtn.y = GAME_HEIGHT / 2 + 100; instrBtn.interactive = true; instrBtn.buttonMode = true; menuOverlay.addChild(instrBtn); // Instructions Popup (hidden by default) var instrPopup = new Container(); instrPopup.visible = false; var instrBg = LK.getAsset('star', { width: GAME_WIDTH * 0.8, height: GAME_HEIGHT * 0.7, color: 0x222244, anchorX: 0.5, anchorY: 0.5 }); instrBg.alpha = 0.98; instrPopup.addChild(instrBg); var instrText = new Text2("How to Play:\n\n" + "- Drag your ship to move\n" + "- Tap anywhere to shoot\n" + "- Blast aliens, dodge bullets\n" + "- Collect power-ups and coins\n" + "- Defeat the boss for big points!\n\n" + "Good luck, pilot!", { size: 70, fill: 0xFFFFFF, align: "center" }); instrText.anchor.set(0.5, 0.5); instrText.x = 0; instrText.y = -60; instrPopup.addChild(instrText); var closeInstrBtn = new Text2("Close", { size: 90, fill: 0xFF8888, align: "center" }); closeInstrBtn.anchor.set(0.5, 0.5); closeInstrBtn.x = 0; closeInstrBtn.y = instrBg.height / 2 - 80; closeInstrBtn.interactive = true; closeInstrBtn.buttonMode = true; instrPopup.addChild(closeInstrBtn); instrPopup.x = GAME_WIDTH / 2; instrPopup.y = GAME_HEIGHT / 2; menuOverlay.addChild(instrPopup); // 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; // Show menu at start game.addChild(menuOverlay); // Hide game UI while menu is open scoreTxt.visible = false; waveTxt.visible = false; // Menu state var menuActive = true; // Start Game handler startBtn.down = function (x, y, obj) { if (!menuActive) return; menuActive = false; if (menuOverlay.parent) menuOverlay.parent.removeChild(menuOverlay); scoreTxt.visible = true; waveTxt.visible = true; // Start music if not already playing LK.playMusic('bgmusic'); }; // Instructions handler instrBtn.down = function (x, y, obj) { if (!menuActive) return; instrPopup.visible = true; startBtn.visible = false; instrBtn.visible = false; titleTxt.visible = false; }; // Close Instructions handler closeInstrBtn.down = function (x, y, obj) { instrPopup.visible = false; startBtn.visible = true; instrBtn.visible = true; titleTxt.visible = true; }; // 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; // Track if hero is dead (prevents shooting after death) var heroDead = false; // 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) { // Play boss music at start of wave 10 LK.playMusic('bossmusic'); // 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; // Track boss spawn time for bonus game._bossSpawnTime = Date.now(); game._bossBonusGiven = false; return; } // Formation: rows, cols, spacing var rows, cols; if (waveNum === 2) { // Reduce total aliens at wave 2, but keep it more than wave 1 (wave 1 default: rows=3, cols=6 = 18) // Let's use rows=4, cols=6 = 24 aliens (wave 1: 18, wave 2: 24, wave 3: 35) rows = 4; cols = 6; } else if (waveNum === 3) { // Reduce total aliens at wave 3, but more than wave 2 (wave 2 default: rows=4, cols=8 = 32) // Let's use rows=5, cols=7 = 35 aliens (wave 2 would be 32, wave 3 default would be 5,10=50) rows = 5; cols = 7; } else 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 = 6; } 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 (heroDead) { return; } 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); } 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) { if (menuActive) return; // 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) { if (!menuActive) { fireHeroBullets(); } }; // Main update game.update = function () { // Prevent game logic if menu is active if (menuActive) { return; } // 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); if (a instanceof Boss) { score += 5000; // Award additional 7500 score if boss is defeated within 45 seconds after wave 10 starts if (typeof game._bossSpawnTime !== "undefined" && typeof game._bossBonusGiven !== "undefined" && !game._bossBonusGiven && Date.now() - game._bossSpawnTime <= 45000) { score += 7500; game._bossBonusGiven = true; // Optionally, you can show a popup or effect here if desired } } else if (a instanceof Alien3) { score += Math.floor(100 * 1.2 * 2); } else if (a instanceof Alien2) { score += Math.floor(100 * 1.2); } else { score += 100; } scoreTxt.setText(score); maybeSpawnPowerup(a.x, a.y); maybeSpawnCoin(a.x, a.y); // If this is the boss, play bossexplosion sounds in sequence if (a instanceof Boss) { LK.getSound('bossexplosion').play(); LK.setTimeout(function () { LK.getSound('bossexplosion2').play(); }, 300); LK.setTimeout(function () { LK.getSound('bossexplosion3').play(); }, 600); LK.setTimeout(function () { LK.getSound('bossexplosion4').play(); }, 900); } else { LK.getSound('alienexplosion').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); // Play explosion sound when hero ship dies var explosionSound = LK.getSound('explosion'); explosionSound.play(); // Remove hero ship from game immediately if (hero.parent) { hero.parent.removeChild(hero); } // Mark hero as dead to prevent further shooting heroDead = true; // Wait for explosion sound to finish before game over LK.setTimeout(function () { LK.showGameOver(); }, Math.max(100, Math.floor((explosionSound.duration || 1) * 1000))); 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); // Play explosion sound when hero ship dies var explosionSound = LK.getSound('explosion'); explosionSound.play(); // Remove hero ship from game immediately if (hero.parent) { hero.parent.removeChild(hero); } // Mark hero as dead to prevent further shooting heroDead = true; // Wait for explosion sound to finish before game over LK.setTimeout(function () { LK.showGameOver(); }, Math.max(100, Math.floor((explosionSound.duration || 1) * 1000))); 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 < 3) { hero.upgrade(); } else { // Already at max power, give bonus score instead score += 1000; scoreTxt.setText(score); } // Play powerup sound when collecting a powerup 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); LK.getSound('coinsound').play(); 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 wavepass sound LK.getSound('wavepass').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); heroDead = false; // 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('alienexplosion').play(); } } };
===================================================================
--- original.js
+++ change.js
@@ -501,18 +501,10 @@
// --- Main Menu Overlay ---
var menuOverlay = new Container();
menuOverlay.width = GAME_WIDTH;
menuOverlay.height = GAME_HEIGHT;
-// Dim background
-var menuBg = LK.getAsset('star', {
- width: GAME_WIDTH,
- height: GAME_HEIGHT,
- color: 0x000000,
- anchorX: 0,
- anchorY: 0
-});
-menuBg.alpha = 0.85;
-menuOverlay.addChild(menuBg);
+// Main menu background: fully black, no asset
+menuOverlay.backgroundColor = 0x000000;
// Title
var titleTxt = new Text2("ALIEN BLASTERS", {
size: 180,
fill: 0xFFFF99,
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