/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.currentBulletId = -1;
self.shootInterval = 240;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 20;
self.update = function () {
self.y += self.velocityY;
self.x += self.velocityX;
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.velocityX = 0;
self.update = function () {
self.y += self.speed;
self.x += self.velocityX;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
self.type = 'life';
self.speed = 3;
self.lastY = 0;
var powerUpGraphics = self.attachAsset('powerUpLife', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
};
self.setType = function (type) {
self.type = type;
if (self.children && self.children.length > 0) {
self.removeChildAt(0);
}
var assetId = 'powerUpLife';
if (type === 'shield') {
assetId = 'powerUpShield';
} else if (type === 'tripleshot') {
assetId = 'powerUpTripleShot';
}
var newGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
};
return self;
});
var Spaceship = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('spaceship', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.shieldActive = false;
self.shieldTime = 0;
self.tripleShot = false;
self.tripleShotTime = 0;
self.tripleShotUnlimited = false;
self.invulnerable = false;
self.invulnerabilityTime = 0;
self.update = function () {
if (self.invulnerable) {
self.invulnerabilityTime--;
if (self.invulnerabilityTime <= 0) {
self.invulnerable = false;
shipGraphics.tint = 0xffffff;
}
}
if (self.shieldActive) {
self.shieldTime--;
if (self.shieldTime <= 0) {
self.shieldActive = false;
shipGraphics.tint = 0xffffff;
}
}
if (self.tripleShot && !self.tripleShotUnlimited) {
self.tripleShotTime--;
if (self.tripleShotTime <= 0) {
self.tripleShot = false;
}
}
};
self.activateShield = function (duration) {
self.shieldActive = true;
self.shieldTime = duration;
shipGraphics.tint = 0x0099ff;
};
self.activateTripleShot = function (duration) {
self.tripleShot = true;
self.tripleShotTime = 999999;
self.tripleShotUnlimited = true;
};
self.activateInvulnerability = function (duration) {
self.invulnerable = true;
self.invulnerabilityTime = duration;
shipGraphics.tint = 0x00ff00;
};
return self;
});
var TargetingEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
enemyGraphics.tint = 0xff6600;
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.health = 2;
self.currentBulletId = -1;
self.shootInterval = 320;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TripleShotEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.health = 3;
self.currentBulletIds = [-1, -1, -1];
self.zigzagOffset = 0;
self.zigzagDirection = 1;
self.shootInterval = 360;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
self.zigzagOffset += self.zigzagDirection * 1.5;
if (Math.abs(self.zigzagOffset) > 80) {
self.zigzagDirection *= -1;
}
self.x += self.zigzagDirection * 0.8;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var spaceship = game.addChild(new Spaceship());
spaceship.x = 1024;
spaceship.y = 2500;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var lives = 3;
var currentPhase = 1;
var enemiesDefeated = 0;
var totalEnemiesInPhase = 20 + (currentPhase - 1) * 10;
var shootTimer = 0;
var shootInterval = 20;
var spawnTimer = 0;
var spawnInterval = 40;
var gameOver = false;
var activeTripleShotEnemies = 0;
var activeTargetingEnemies = 0;
var livesText = new Text2('Lives: 3', {
size: 80,
fill: 0xFFFFFF
});
livesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesText);
var phaseText = new Text2('Phase 1', {
size: 80,
fill: 0xFFFFFF
});
phaseText.anchor.set(0.5, 0);
LK.gui.top.addChild(phaseText);
var enemyCountText = new Text2('Enemies: 20', {
size: 80,
fill: 0xFFFFFF
});
enemyCountText.anchor.set(1, 0);
LK.gui.topRight.addChild(enemyCountText);
var positionText = new Text2('X: 0 Y: 0', {
size: 60,
fill: 0xFFFFFF
});
positionText.anchor.set(1, 1);
LK.gui.bottomRight.addChild(positionText);
function updateUI() {
livesText.setText('Lives: ' + lives);
phaseText.setText('Phase ' + currentPhase);
enemyCountText.setText('Enemies: ' + (totalEnemiesInPhase - enemiesDefeated));
positionText.setText('X: ' + Math.round(spaceship.x) + ' Y: ' + Math.round(spaceship.y));
}
function spawnEnemy() {
var enemyType = Math.random();
var enemy;
if (enemyType < 0.7) {
enemy = game.addChild(new Enemy());
} else if (enemyType < 0.85 && activeTripleShotEnemies < 2) {
enemy = game.addChild(new TripleShotEnemy());
activeTripleShotEnemies++;
} else if (activeTargetingEnemies < 2) {
enemy = game.addChild(new TargetingEnemy());
activeTargetingEnemies++;
} else {
enemy = game.addChild(new Enemy());
}
var spawnPositions = [164, 410, 656, 902, 1148, 1394, 1640, 1886];
var randomIndex = Math.floor(Math.random() * spawnPositions.length);
enemy.x = spawnPositions[randomIndex];
var usedYPositions = [];
for (var k = 0; k < enemies.length; k++) {
usedYPositions.push(enemies[k].y);
}
var spawnY = -60;
var validSpawn = false;
var attempts = 0;
var minDistance = 200;
while (!validSpawn && attempts < 20) {
spawnY = -60 - Math.floor(Math.random() * 10) * 80;
var isUsed = false;
for (var m = 0; m < usedYPositions.length; m++) {
if (Math.abs(spawnY - usedYPositions[m]) < minDistance) {
isUsed = true;
break;
}
}
if (!isUsed) {
validSpawn = true;
}
attempts++;
}
enemy.y = spawnY;
enemy.speed = 3 + (currentPhase - 1) * 0.45;
enemy.lastY = enemy.y;
if (enemy instanceof TripleShotEnemy) {
enemy.shootInterval = 1620;
enemy.shootTimer = 0;
} else if (enemy instanceof TargetingEnemy) {
enemy.shootInterval = 1440;
enemy.shootTimer = 0;
} else {
enemy.shootInterval = 1080;
enemy.shootTimer = 0;
}
enemies.push(enemy);
}
function damagePlayer() {
if (spaceship.invulnerable) {
return;
}
if (!spaceship.shieldActive) {
lives--;
spaceship.tripleShot = false;
spaceship.tripleShotUnlimited = false;
spaceship.activateInvulnerability(180);
LK.effects.flashObject(spaceship, 0xff0000, 500);
LK.getSound('explosion').play();
if (lives <= 0) {
LK.showGameOver();
gameOver = true;
return;
}
} else {
spaceship.shieldActive = false;
spaceship.tripleShot = false;
spaceship.tripleShotUnlimited = false;
spaceship.children[0].tint = 0xffffff;
LK.effects.flashObject(spaceship, 0xff00ff, 300);
}
updateUI();
}
function createPowerUp(x, y) {
var powerUp = game.addChild(new PowerUp());
powerUp.x = x;
powerUp.y = y;
powerUp.lastY = y;
var rand = Math.random();
var type = 'life';
if (rand < 0.5) {
type = 'shield';
} else if (rand < 0.75) {
type = 'tripleshot';
}
powerUp.setType(type);
powerUps.push(powerUp);
}
function advancePhase() {
currentPhase++;
if (currentPhase > 10) {
LK.showYouWin();
return;
}
enemiesDefeated = 0;
totalEnemiesInPhase = 20 + (currentPhase - 1) * 10;
activeTripleShotEnemies = 0;
activeTargetingEnemies = 0;
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
updateUI();
}
game.down = function (x, y, obj) {
spaceship.x = x;
spaceship.y = y;
};
game.move = function (x, y, obj) {
spaceship.x = x;
spaceship.y = y;
};
game.update = function () {
if (gameOver) return;
updateUI();
shootTimer++;
if (shootTimer >= shootInterval) {
shootTimer = 0;
var bullet = game.addChild(new PlayerBullet());
bullet.x = spaceship.x;
bullet.y = spaceship.y - 40;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
LK.getSound('shoot').play();
if (spaceship.tripleShot) {
var bulletLeft = game.addChild(new PlayerBullet());
bulletLeft.x = spaceship.x - 80;
bulletLeft.y = spaceship.y - 40;
bulletLeft.lastY = bulletLeft.y;
bulletLeft.velocityX = -8;
playerBullets.push(bulletLeft);
var bulletRight = game.addChild(new PlayerBullet());
bulletRight.x = spaceship.x + 80;
bulletRight.y = spaceship.y - 40;
bulletRight.lastY = bulletRight.y;
bulletRight.velocityX = 8;
playerBullets.push(bulletRight);
}
}
spawnTimer++;
if (spawnTimer >= spawnInterval && enemies.length < totalEnemiesInPhase) {
spawnTimer = 0;
spawnEnemy();
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var currentY = enemy.y;
if (enemy.lastY < 2800 && currentY >= 2800) {
if (enemy instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemy instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemy.destroy();
enemies.splice(i, 1);
continue;
}
enemy.lastY = currentY;
if (enemy.shootTimer !== undefined) {
enemy.shootTimer++;
}
if (enemy.shootInterval !== undefined && enemy.shootTimer >= enemy.shootInterval) {
enemy.shootTimer = 0;
enemy.canShoot = true;
}
if (enemy.canShoot) {
if (enemy instanceof TripleShotEnemy) {
var centerBullet = game.addChild(new EnemyBullet());
centerBullet.x = enemy.x;
centerBullet.y = enemy.y;
centerBullet.lastY = centerBullet.y;
centerBullet.bulletId = enemyBullets.length;
enemyBullets.push(centerBullet);
enemy.currentBulletIds[0] = centerBullet.bulletId;
var leftBullet = game.addChild(new EnemyBullet());
leftBullet.x = enemy.x;
leftBullet.y = enemy.y;
leftBullet.lastY = leftBullet.y;
leftBullet.velocityX = -6;
leftBullet.bulletId = enemyBullets.length;
enemyBullets.push(leftBullet);
enemy.currentBulletIds[1] = leftBullet.bulletId;
var rightBullet = game.addChild(new EnemyBullet());
rightBullet.x = enemy.x;
rightBullet.y = enemy.y;
rightBullet.lastY = rightBullet.y;
rightBullet.velocityX = 6;
rightBullet.bulletId = enemyBullets.length;
enemyBullets.push(rightBullet);
enemy.currentBulletIds[2] = rightBullet.bulletId;
LK.getSound('enemyShoot').play();
enemy.canShoot = false;
} else if (enemy instanceof TargetingEnemy) {
var dx = spaceship.x - enemy.x;
var dy = spaceship.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var targetBullet = game.addChild(new EnemyBullet());
targetBullet.x = enemy.x;
targetBullet.y = enemy.y;
targetBullet.lastY = targetBullet.y;
targetBullet.velocityX = dx / distance * 10;
targetBullet.velocityY = dy / distance * 10;
targetBullet.bulletId = enemyBullets.length;
enemyBullets.push(targetBullet);
enemy.currentBulletId = targetBullet.bulletId;
LK.getSound('enemyShoot').play();
} //{3g_fix}
enemy.canShoot = false;
} else {
var eBullet = game.addChild(new EnemyBullet());
eBullet.x = enemy.x;
eBullet.y = enemy.y;
eBullet.lastY = eBullet.y;
eBullet.bulletId = enemyBullets.length;
enemyBullets.push(eBullet);
enemy.currentBulletId = eBullet.bulletId;
LK.getSound('enemyShoot').play();
enemy.canShoot = false;
}
}
if (enemy.intersects(spaceship)) {
damagePlayer();
if (enemy instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemy instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemy.destroy();
enemies.splice(i, 1);
LK.getSound('explosion').play();
continue;
}
}
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
var currentY = bullet.y;
if (bullet.lastY >= -30 && currentY < -30) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
bullet.lastY = currentY;
for (var j = enemies.length - 1; j >= 0; j--) {
if (bullet.intersects(enemies[j])) {
var enemyX = enemies[j].x;
var enemyY = enemies[j].y;
bullet.destroy();
playerBullets.splice(i, 1);
LK.effects.flashObject(enemies[j], 0xffff00, 200);
var shouldDestroy = true;
if (enemies[j] instanceof TargetingEnemy) {
enemies[j].health--;
if (enemies[j].health > 0) {
shouldDestroy = false;
LK.effects.flashObject(enemies[j], 0xff9900, 100);
} //{2g_te}
} else if (enemies[j] instanceof TripleShotEnemy) {
enemies[j].health--;
if (enemies[j].health > 0) {
shouldDestroy = false;
LK.effects.flashObject(enemies[j], 0xff6600, 100);
} //{2g_tse}
} //{2g_te2}
if (shouldDestroy) {
if (enemies[j] instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemies[j] instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemies[j].destroy();
enemies.splice(j, 1);
enemiesDefeated++;
LK.getSound('explosion').play();
if (Math.random() < 0.1) {
createPowerUp(enemyX, enemyY);
}
if (enemiesDefeated >= totalEnemiesInPhase) {
advancePhase();
}
} //{2g_te3}
break;
}
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eBullet = enemyBullets[i];
var currentY = eBullet.y;
if (eBullet.lastY < 2850 && currentY >= 2850) {
eBullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
eBullet.lastY = currentY;
if (eBullet.intersects(spaceship)) {
damagePlayer();
eBullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
}
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
var currentY = powerUp.y;
if (powerUp.lastY <= 2800 && currentY > 2800) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastY = currentY;
if (powerUp.intersects(spaceship)) {
LK.getSound('powerUp').play();
if (powerUp.type === 'life') {
lives++;
} else if (powerUp.type === 'shield') {
spaceship.activateShield(300);
} else if (powerUp.type === 'tripleshot') {
spaceship.activateTripleShot(300);
}
powerUp.destroy();
powerUps.splice(i, 1);
updateUI();
continue;
}
}
};
LK.playMusic('bgmusic');
updateUI(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.currentBulletId = -1;
self.shootInterval = 240;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 20;
self.update = function () {
self.y += self.velocityY;
self.x += self.velocityX;
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.velocityX = 0;
self.update = function () {
self.y += self.speed;
self.x += self.velocityX;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
self.type = 'life';
self.speed = 3;
self.lastY = 0;
var powerUpGraphics = self.attachAsset('powerUpLife', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
};
self.setType = function (type) {
self.type = type;
if (self.children && self.children.length > 0) {
self.removeChildAt(0);
}
var assetId = 'powerUpLife';
if (type === 'shield') {
assetId = 'powerUpShield';
} else if (type === 'tripleshot') {
assetId = 'powerUpTripleShot';
}
var newGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
};
return self;
});
var Spaceship = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('spaceship', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.shieldActive = false;
self.shieldTime = 0;
self.tripleShot = false;
self.tripleShotTime = 0;
self.tripleShotUnlimited = false;
self.invulnerable = false;
self.invulnerabilityTime = 0;
self.update = function () {
if (self.invulnerable) {
self.invulnerabilityTime--;
if (self.invulnerabilityTime <= 0) {
self.invulnerable = false;
shipGraphics.tint = 0xffffff;
}
}
if (self.shieldActive) {
self.shieldTime--;
if (self.shieldTime <= 0) {
self.shieldActive = false;
shipGraphics.tint = 0xffffff;
}
}
if (self.tripleShot && !self.tripleShotUnlimited) {
self.tripleShotTime--;
if (self.tripleShotTime <= 0) {
self.tripleShot = false;
}
}
};
self.activateShield = function (duration) {
self.shieldActive = true;
self.shieldTime = duration;
shipGraphics.tint = 0x0099ff;
};
self.activateTripleShot = function (duration) {
self.tripleShot = true;
self.tripleShotTime = 999999;
self.tripleShotUnlimited = true;
};
self.activateInvulnerability = function (duration) {
self.invulnerable = true;
self.invulnerabilityTime = duration;
shipGraphics.tint = 0x00ff00;
};
return self;
});
var TargetingEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
enemyGraphics.tint = 0xff6600;
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.health = 2;
self.currentBulletId = -1;
self.shootInterval = 320;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TripleShotEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = true;
self.lastBulletY = 0;
self.lastY = 0;
self.health = 3;
self.currentBulletIds = [-1, -1, -1];
self.zigzagOffset = 0;
self.zigzagDirection = 1;
self.shootInterval = 360;
self.shootTimer = 0;
self.update = function () {
self.y += self.speed;
self.zigzagOffset += self.zigzagDirection * 1.5;
if (Math.abs(self.zigzagOffset) > 80) {
self.zigzagDirection *= -1;
}
self.x += self.zigzagDirection * 0.8;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var spaceship = game.addChild(new Spaceship());
spaceship.x = 1024;
spaceship.y = 2500;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var lives = 3;
var currentPhase = 1;
var enemiesDefeated = 0;
var totalEnemiesInPhase = 20 + (currentPhase - 1) * 10;
var shootTimer = 0;
var shootInterval = 20;
var spawnTimer = 0;
var spawnInterval = 40;
var gameOver = false;
var activeTripleShotEnemies = 0;
var activeTargetingEnemies = 0;
var livesText = new Text2('Lives: 3', {
size: 80,
fill: 0xFFFFFF
});
livesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesText);
var phaseText = new Text2('Phase 1', {
size: 80,
fill: 0xFFFFFF
});
phaseText.anchor.set(0.5, 0);
LK.gui.top.addChild(phaseText);
var enemyCountText = new Text2('Enemies: 20', {
size: 80,
fill: 0xFFFFFF
});
enemyCountText.anchor.set(1, 0);
LK.gui.topRight.addChild(enemyCountText);
var positionText = new Text2('X: 0 Y: 0', {
size: 60,
fill: 0xFFFFFF
});
positionText.anchor.set(1, 1);
LK.gui.bottomRight.addChild(positionText);
function updateUI() {
livesText.setText('Lives: ' + lives);
phaseText.setText('Phase ' + currentPhase);
enemyCountText.setText('Enemies: ' + (totalEnemiesInPhase - enemiesDefeated));
positionText.setText('X: ' + Math.round(spaceship.x) + ' Y: ' + Math.round(spaceship.y));
}
function spawnEnemy() {
var enemyType = Math.random();
var enemy;
if (enemyType < 0.7) {
enemy = game.addChild(new Enemy());
} else if (enemyType < 0.85 && activeTripleShotEnemies < 2) {
enemy = game.addChild(new TripleShotEnemy());
activeTripleShotEnemies++;
} else if (activeTargetingEnemies < 2) {
enemy = game.addChild(new TargetingEnemy());
activeTargetingEnemies++;
} else {
enemy = game.addChild(new Enemy());
}
var spawnPositions = [164, 410, 656, 902, 1148, 1394, 1640, 1886];
var randomIndex = Math.floor(Math.random() * spawnPositions.length);
enemy.x = spawnPositions[randomIndex];
var usedYPositions = [];
for (var k = 0; k < enemies.length; k++) {
usedYPositions.push(enemies[k].y);
}
var spawnY = -60;
var validSpawn = false;
var attempts = 0;
var minDistance = 200;
while (!validSpawn && attempts < 20) {
spawnY = -60 - Math.floor(Math.random() * 10) * 80;
var isUsed = false;
for (var m = 0; m < usedYPositions.length; m++) {
if (Math.abs(spawnY - usedYPositions[m]) < minDistance) {
isUsed = true;
break;
}
}
if (!isUsed) {
validSpawn = true;
}
attempts++;
}
enemy.y = spawnY;
enemy.speed = 3 + (currentPhase - 1) * 0.45;
enemy.lastY = enemy.y;
if (enemy instanceof TripleShotEnemy) {
enemy.shootInterval = 1620;
enemy.shootTimer = 0;
} else if (enemy instanceof TargetingEnemy) {
enemy.shootInterval = 1440;
enemy.shootTimer = 0;
} else {
enemy.shootInterval = 1080;
enemy.shootTimer = 0;
}
enemies.push(enemy);
}
function damagePlayer() {
if (spaceship.invulnerable) {
return;
}
if (!spaceship.shieldActive) {
lives--;
spaceship.tripleShot = false;
spaceship.tripleShotUnlimited = false;
spaceship.activateInvulnerability(180);
LK.effects.flashObject(spaceship, 0xff0000, 500);
LK.getSound('explosion').play();
if (lives <= 0) {
LK.showGameOver();
gameOver = true;
return;
}
} else {
spaceship.shieldActive = false;
spaceship.tripleShot = false;
spaceship.tripleShotUnlimited = false;
spaceship.children[0].tint = 0xffffff;
LK.effects.flashObject(spaceship, 0xff00ff, 300);
}
updateUI();
}
function createPowerUp(x, y) {
var powerUp = game.addChild(new PowerUp());
powerUp.x = x;
powerUp.y = y;
powerUp.lastY = y;
var rand = Math.random();
var type = 'life';
if (rand < 0.5) {
type = 'shield';
} else if (rand < 0.75) {
type = 'tripleshot';
}
powerUp.setType(type);
powerUps.push(powerUp);
}
function advancePhase() {
currentPhase++;
if (currentPhase > 10) {
LK.showYouWin();
return;
}
enemiesDefeated = 0;
totalEnemiesInPhase = 20 + (currentPhase - 1) * 10;
activeTripleShotEnemies = 0;
activeTargetingEnemies = 0;
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
updateUI();
}
game.down = function (x, y, obj) {
spaceship.x = x;
spaceship.y = y;
};
game.move = function (x, y, obj) {
spaceship.x = x;
spaceship.y = y;
};
game.update = function () {
if (gameOver) return;
updateUI();
shootTimer++;
if (shootTimer >= shootInterval) {
shootTimer = 0;
var bullet = game.addChild(new PlayerBullet());
bullet.x = spaceship.x;
bullet.y = spaceship.y - 40;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
LK.getSound('shoot').play();
if (spaceship.tripleShot) {
var bulletLeft = game.addChild(new PlayerBullet());
bulletLeft.x = spaceship.x - 80;
bulletLeft.y = spaceship.y - 40;
bulletLeft.lastY = bulletLeft.y;
bulletLeft.velocityX = -8;
playerBullets.push(bulletLeft);
var bulletRight = game.addChild(new PlayerBullet());
bulletRight.x = spaceship.x + 80;
bulletRight.y = spaceship.y - 40;
bulletRight.lastY = bulletRight.y;
bulletRight.velocityX = 8;
playerBullets.push(bulletRight);
}
}
spawnTimer++;
if (spawnTimer >= spawnInterval && enemies.length < totalEnemiesInPhase) {
spawnTimer = 0;
spawnEnemy();
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var currentY = enemy.y;
if (enemy.lastY < 2800 && currentY >= 2800) {
if (enemy instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemy instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemy.destroy();
enemies.splice(i, 1);
continue;
}
enemy.lastY = currentY;
if (enemy.shootTimer !== undefined) {
enemy.shootTimer++;
}
if (enemy.shootInterval !== undefined && enemy.shootTimer >= enemy.shootInterval) {
enemy.shootTimer = 0;
enemy.canShoot = true;
}
if (enemy.canShoot) {
if (enemy instanceof TripleShotEnemy) {
var centerBullet = game.addChild(new EnemyBullet());
centerBullet.x = enemy.x;
centerBullet.y = enemy.y;
centerBullet.lastY = centerBullet.y;
centerBullet.bulletId = enemyBullets.length;
enemyBullets.push(centerBullet);
enemy.currentBulletIds[0] = centerBullet.bulletId;
var leftBullet = game.addChild(new EnemyBullet());
leftBullet.x = enemy.x;
leftBullet.y = enemy.y;
leftBullet.lastY = leftBullet.y;
leftBullet.velocityX = -6;
leftBullet.bulletId = enemyBullets.length;
enemyBullets.push(leftBullet);
enemy.currentBulletIds[1] = leftBullet.bulletId;
var rightBullet = game.addChild(new EnemyBullet());
rightBullet.x = enemy.x;
rightBullet.y = enemy.y;
rightBullet.lastY = rightBullet.y;
rightBullet.velocityX = 6;
rightBullet.bulletId = enemyBullets.length;
enemyBullets.push(rightBullet);
enemy.currentBulletIds[2] = rightBullet.bulletId;
LK.getSound('enemyShoot').play();
enemy.canShoot = false;
} else if (enemy instanceof TargetingEnemy) {
var dx = spaceship.x - enemy.x;
var dy = spaceship.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var targetBullet = game.addChild(new EnemyBullet());
targetBullet.x = enemy.x;
targetBullet.y = enemy.y;
targetBullet.lastY = targetBullet.y;
targetBullet.velocityX = dx / distance * 10;
targetBullet.velocityY = dy / distance * 10;
targetBullet.bulletId = enemyBullets.length;
enemyBullets.push(targetBullet);
enemy.currentBulletId = targetBullet.bulletId;
LK.getSound('enemyShoot').play();
} //{3g_fix}
enemy.canShoot = false;
} else {
var eBullet = game.addChild(new EnemyBullet());
eBullet.x = enemy.x;
eBullet.y = enemy.y;
eBullet.lastY = eBullet.y;
eBullet.bulletId = enemyBullets.length;
enemyBullets.push(eBullet);
enemy.currentBulletId = eBullet.bulletId;
LK.getSound('enemyShoot').play();
enemy.canShoot = false;
}
}
if (enemy.intersects(spaceship)) {
damagePlayer();
if (enemy instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemy instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemy.destroy();
enemies.splice(i, 1);
LK.getSound('explosion').play();
continue;
}
}
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
var currentY = bullet.y;
if (bullet.lastY >= -30 && currentY < -30) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
bullet.lastY = currentY;
for (var j = enemies.length - 1; j >= 0; j--) {
if (bullet.intersects(enemies[j])) {
var enemyX = enemies[j].x;
var enemyY = enemies[j].y;
bullet.destroy();
playerBullets.splice(i, 1);
LK.effects.flashObject(enemies[j], 0xffff00, 200);
var shouldDestroy = true;
if (enemies[j] instanceof TargetingEnemy) {
enemies[j].health--;
if (enemies[j].health > 0) {
shouldDestroy = false;
LK.effects.flashObject(enemies[j], 0xff9900, 100);
} //{2g_te}
} else if (enemies[j] instanceof TripleShotEnemy) {
enemies[j].health--;
if (enemies[j].health > 0) {
shouldDestroy = false;
LK.effects.flashObject(enemies[j], 0xff6600, 100);
} //{2g_tse}
} //{2g_te2}
if (shouldDestroy) {
if (enemies[j] instanceof TripleShotEnemy) {
activeTripleShotEnemies--;
} else if (enemies[j] instanceof TargetingEnemy) {
activeTargetingEnemies--;
}
enemies[j].destroy();
enemies.splice(j, 1);
enemiesDefeated++;
LK.getSound('explosion').play();
if (Math.random() < 0.1) {
createPowerUp(enemyX, enemyY);
}
if (enemiesDefeated >= totalEnemiesInPhase) {
advancePhase();
}
} //{2g_te3}
break;
}
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eBullet = enemyBullets[i];
var currentY = eBullet.y;
if (eBullet.lastY < 2850 && currentY >= 2850) {
eBullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
eBullet.lastY = currentY;
if (eBullet.intersects(spaceship)) {
damagePlayer();
eBullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
}
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
var currentY = powerUp.y;
if (powerUp.lastY <= 2800 && currentY > 2800) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastY = currentY;
if (powerUp.intersects(spaceship)) {
LK.getSound('powerUp').play();
if (powerUp.type === 'life') {
lives++;
} else if (powerUp.type === 'shield') {
spaceship.activateShield(300);
} else if (powerUp.type === 'tripleshot') {
spaceship.activateTripleShot(300);
}
powerUp.destroy();
powerUps.splice(i, 1);
updateUI();
continue;
}
}
};
LK.playMusic('bgmusic');
updateUI();