/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 1;
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
self.update = function () {
self.y += self.speed;
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
bullet.lastY = bullet.y;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 15;
self.fireTimer = 0;
self.rapidFire = false;
self.rapidFireTimer = 0;
self.multiBullet = false;
self.multiBulletTimer = 0;
self.update = function () {
self.fireTimer++;
var currentFireRate = self.rapidFire ? 5 : self.fireRate;
if (self.fireTimer >= currentFireRate) {
self.fireTimer = 0;
if (self.multiBullet) {
// Fire 3 bullets in spread pattern
var bullet1 = new PlayerBullet();
bullet1.x = self.x - 30;
bullet1.y = self.y - 50;
bullet1.lastY = bullet1.y;
playerBullets.push(bullet1);
game.addChild(bullet1);
var bullet2 = new PlayerBullet();
bullet2.x = self.x;
bullet2.y = self.y - 50;
bullet2.lastY = bullet2.y;
playerBullets.push(bullet2);
game.addChild(bullet2);
var bullet3 = new PlayerBullet();
bullet3.x = self.x + 30;
bullet3.y = self.y - 50;
bullet3.lastY = bullet3.y;
playerBullets.push(bullet3);
game.addChild(bullet3);
} else {
// Fire single bullet
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
}
if (self.rapidFire) {
self.rapidFireTimer--;
if (self.rapidFireTimer <= 0) {
self.rapidFire = false;
}
}
if (self.multiBullet) {
self.multiBulletTimer--;
if (self.multiBulletTimer <= 0) {
self.multiBullet = false;
}
}
};
self.activateRapidFire = function () {
self.rapidFire = true;
self.rapidFireTimer = 300;
};
self.activateMultiBullet = function () {
self.multiBullet = true;
self.multiBulletTimer = 300;
};
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 = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
// Randomly choose between rapidFire and multiBullet
self.type = Math.random() < 0.5 ? 'rapidFire' : 'multiBullet';
// Set different colors based on type
if (self.type === 'rapidFire') {
powerupGraphics.tint = 0x00ffff; // Cyan for rapid fire
} else {
powerupGraphics.tint = 0xff00ff; // Magenta for multi-bullet
}
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var waveTimer = 0;
var difficultyLevel = 1;
var enemySpawnRate = 180;
var lives = 3;
var scoreTxt = new Text2('0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Wave 1', {
size: 40,
fill: 0x00FF00
});
levelTxt.anchor.set(0, 0);
levelTxt.x = 20;
levelTxt.y = 20;
LK.gui.topLeft.addChild(levelTxt);
var livesTxt = new Text2('Lives: 3', {
size: 40,
fill: 0xFFFFFF
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
player = game.addChild(new Player());
player.x = 1024;
player.y = 2500;
var dragNode = null;
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -30;
enemy.lastY = enemy.y;
enemy.lastIntersecting = false;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp(x, y) {
if (Math.random() < 0.3) {
var powerup = new PowerUp();
powerup.x = x;
powerup.y = y;
powerup.lastY = powerup.y;
powerup.lastIntersecting = false;
powerups.push(powerup);
game.addChild(powerup);
}
}
game.update = function () {
waveTimer++;
if (waveTimer % 1800 === 0) {
difficultyLevel++;
enemySpawnRate = Math.max(60, enemySpawnRate - 20);
levelTxt.setText('Wave ' + difficultyLevel);
LK.effects.flashScreen(0x0000ff, 500);
// Check win condition after 3 waves
if (difficultyLevel > 3) {
LK.showYouWin();
return;
}
}
if (waveTimer % enemySpawnRate === 0) {
spawnEnemy();
}
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
enemy.health--;
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + 100);
scoreTxt.setText(LK.getScore());
LK.getSound('enemyHit').play();
spawnPowerUp(enemy.x, enemy.y);
enemy.destroy();
enemies.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
bullet.lastY = bullet.y;
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY <= 2742 && bullet.y > 2742) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
lives--;
livesTxt.setText('Lives: ' + lives);
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
bullet.destroy();
enemyBullets.splice(i, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
bullet.lastY = bullet.y;
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastY <= 2742 && enemy.y > 2742) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
lives--;
livesTxt.setText('Lives: ' + lives);
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
enemy.destroy();
enemies.splice(i, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
enemy.lastY = enemy.y;
}
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (powerup.lastY === undefined) powerup.lastY = powerup.y;
if (powerup.lastIntersecting === undefined) powerup.lastIntersecting = false;
if (powerup.lastY <= 2742 && powerup.y > 2742) {
powerup.destroy();
powerups.splice(i, 1);
continue;
}
var currentIntersecting = powerup.intersects(player);
if (!powerup.lastIntersecting && currentIntersecting) {
if (powerup.type === 'rapidFire') {
player.activateRapidFire();
LK.effects.flashObject(player, 0x00ffff, 500);
} else if (powerup.type === 'multiBullet') {
player.activateMultiBullet();
LK.effects.flashObject(player, 0xff00ff, 500);
}
LK.getSound('powerupCollect').play();
powerup.destroy();
powerups.splice(i, 1);
continue;
}
powerup.lastY = powerup.y;
powerup.lastIntersecting = currentIntersecting;
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 1;
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
self.update = function () {
self.y += self.speed;
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
bullet.lastY = bullet.y;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 15;
self.fireTimer = 0;
self.rapidFire = false;
self.rapidFireTimer = 0;
self.multiBullet = false;
self.multiBulletTimer = 0;
self.update = function () {
self.fireTimer++;
var currentFireRate = self.rapidFire ? 5 : self.fireRate;
if (self.fireTimer >= currentFireRate) {
self.fireTimer = 0;
if (self.multiBullet) {
// Fire 3 bullets in spread pattern
var bullet1 = new PlayerBullet();
bullet1.x = self.x - 30;
bullet1.y = self.y - 50;
bullet1.lastY = bullet1.y;
playerBullets.push(bullet1);
game.addChild(bullet1);
var bullet2 = new PlayerBullet();
bullet2.x = self.x;
bullet2.y = self.y - 50;
bullet2.lastY = bullet2.y;
playerBullets.push(bullet2);
game.addChild(bullet2);
var bullet3 = new PlayerBullet();
bullet3.x = self.x + 30;
bullet3.y = self.y - 50;
bullet3.lastY = bullet3.y;
playerBullets.push(bullet3);
game.addChild(bullet3);
} else {
// Fire single bullet
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
}
if (self.rapidFire) {
self.rapidFireTimer--;
if (self.rapidFireTimer <= 0) {
self.rapidFire = false;
}
}
if (self.multiBullet) {
self.multiBulletTimer--;
if (self.multiBulletTimer <= 0) {
self.multiBullet = false;
}
}
};
self.activateRapidFire = function () {
self.rapidFire = true;
self.rapidFireTimer = 300;
};
self.activateMultiBullet = function () {
self.multiBullet = true;
self.multiBulletTimer = 300;
};
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 = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
// Randomly choose between rapidFire and multiBullet
self.type = Math.random() < 0.5 ? 'rapidFire' : 'multiBullet';
// Set different colors based on type
if (self.type === 'rapidFire') {
powerupGraphics.tint = 0x00ffff; // Cyan for rapid fire
} else {
powerupGraphics.tint = 0xff00ff; // Magenta for multi-bullet
}
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var waveTimer = 0;
var difficultyLevel = 1;
var enemySpawnRate = 180;
var lives = 3;
var scoreTxt = new Text2('0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Wave 1', {
size: 40,
fill: 0x00FF00
});
levelTxt.anchor.set(0, 0);
levelTxt.x = 20;
levelTxt.y = 20;
LK.gui.topLeft.addChild(levelTxt);
var livesTxt = new Text2('Lives: 3', {
size: 40,
fill: 0xFFFFFF
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
player = game.addChild(new Player());
player.x = 1024;
player.y = 2500;
var dragNode = null;
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -30;
enemy.lastY = enemy.y;
enemy.lastIntersecting = false;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp(x, y) {
if (Math.random() < 0.3) {
var powerup = new PowerUp();
powerup.x = x;
powerup.y = y;
powerup.lastY = powerup.y;
powerup.lastIntersecting = false;
powerups.push(powerup);
game.addChild(powerup);
}
}
game.update = function () {
waveTimer++;
if (waveTimer % 1800 === 0) {
difficultyLevel++;
enemySpawnRate = Math.max(60, enemySpawnRate - 20);
levelTxt.setText('Wave ' + difficultyLevel);
LK.effects.flashScreen(0x0000ff, 500);
// Check win condition after 3 waves
if (difficultyLevel > 3) {
LK.showYouWin();
return;
}
}
if (waveTimer % enemySpawnRate === 0) {
spawnEnemy();
}
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
enemy.health--;
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + 100);
scoreTxt.setText(LK.getScore());
LK.getSound('enemyHit').play();
spawnPowerUp(enemy.x, enemy.y);
enemy.destroy();
enemies.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
bullet.lastY = bullet.y;
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY <= 2742 && bullet.y > 2742) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
lives--;
livesTxt.setText('Lives: ' + lives);
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
bullet.destroy();
enemyBullets.splice(i, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
bullet.lastY = bullet.y;
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastY <= 2742 && enemy.y > 2742) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
lives--;
livesTxt.setText('Lives: ' + lives);
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
enemy.destroy();
enemies.splice(i, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
enemy.lastY = enemy.y;
}
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (powerup.lastY === undefined) powerup.lastY = powerup.y;
if (powerup.lastIntersecting === undefined) powerup.lastIntersecting = false;
if (powerup.lastY <= 2742 && powerup.y > 2742) {
powerup.destroy();
powerups.splice(i, 1);
continue;
}
var currentIntersecting = powerup.intersects(player);
if (!powerup.lastIntersecting && currentIntersecting) {
if (powerup.type === 'rapidFire') {
player.activateRapidFire();
LK.effects.flashObject(player, 0x00ffff, 500);
} else if (powerup.type === 'multiBullet') {
player.activateMultiBullet();
LK.effects.flashObject(player, 0xff00ff, 500);
}
LK.getSound('powerupCollect').play();
powerup.destroy();
powerups.splice(i, 1);
continue;
}
powerup.lastY = powerup.y;
powerup.lastIntersecting = currentIntersecting;
}
};