/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AmmoPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('ammoPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.ammoAmount = 10;
return self;
});
var BigAmmoPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bigAmmoPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.ammoAmount = 50;
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 12;
self.damage = 1;
self.setDirection = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
}
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.level = 1;
self.health = 1;
self.maxHealth = 1;
self.speed = 2;
self.damage = 1;
self.lastAttackTime = 0;
self.attackCooldown = 2000; // 2 seconds between attacks
self.setLevel = function (level) {
self.level = level;
if (level <= 9) {
self.health = level;
self.maxHealth = level;
} else {
self.health = 15;
self.maxHealth = 15;
}
self.damage = level;
self.speed = 2 + level * 0.3;
// Visual scaling based on level
var scale = 1 + level * 0.1;
graphics.scaleX = scale;
graphics.scaleY = scale;
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
// Flash white when hit
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100
});
}
});
return self.health <= 0;
};
self.update = function () {
if (!player) return;
// Move towards player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough and cooldown is ready
if (distance < 50 && Date.now() - self.lastAttackTime > self.attackCooldown) {
player.takeDamage(self.damage);
self.lastAttackTime = Date.now();
}
};
return self;
});
var HealthPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('healthPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.healAmount = 25;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 8;
self.ammo = 30;
self.weaponLevel = 1;
self.weaponDamage = 1;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
// Flash red when taking damage
tween(graphics, {
tint: 0xFF0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100
});
}
});
};
self.heal = function (amount) {
self.health += amount;
if (self.health > self.maxHealth) self.health = self.maxHealth;
// Flash green when healing
tween(graphics, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.addAmmo = function (amount) {
self.ammo += amount;
// Flash blue when getting ammo
tween(graphics, {
tint: 0x0000FF
}, {
duration: 200,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.upgradeWeapon = function (newLevel) {
if (newLevel > self.weaponLevel) {
self.weaponLevel = newLevel;
self.weaponDamage = newLevel;
// Flash gold when upgrading weapon
tween(graphics, {
tint: 0xFFD700
}, {
duration: 300,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 300
});
}
});
}
};
return self;
});
var WeaponPickup = Container.expand(function () {
var self = Container.call(this);
self.weaponLevel = 1;
self.damage = 1;
var graphics;
self.setWeaponLevel = function (level) {
self.weaponLevel = level;
self.damage = level;
// Remove old graphics if exists
if (graphics) {
self.removeChild(graphics);
}
// Add new graphics based on level
var assetName = 'weapon' + level;
graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Different colors for different levels
var colors = [0xFFFFFF, 0x00FF00, 0x0080FF, 0xFF00FF];
graphics.tint = colors[level] || 0xFFFFFF;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var healthPacks = [];
var ammoPacks = [];
var bigAmmoPacks = [];
var weaponPickups = [];
var currentEnemyLevel = 1;
var lastEnemySpawn = 0;
var enemySpawnRate = 2000; // 2 seconds
var lastHealthPackSpawn = 0;
var healthPackSpawnRate = 8000; // 8 seconds
var lastAmmoPackSpawn = 0;
var ammoPackSpawnRate = 6000; // 6 seconds
var lastBigAmmoPackSpawn = 0;
var bigAmmoPackSpawnRate = 12000; // 12 seconds
var lastWeaponSpawn = 0;
var weaponSpawnRate = 15000; // 15 seconds for rare weapon spawns
var initialWeaponSpawnRate = 5000; // 5 seconds for initial level 1 weapons
var moveDirection = {
x: 0,
y: 0
};
// Create player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// UI Elements
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFF4081
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
healthText.x = 120; // Avoid platform menu
var ammoText = new Text2('Ammo: 30', {
size: 60,
fill: 0x2196F3
});
ammoText.anchor.set(0, 0);
LK.gui.topLeft.addChild(ammoText);
ammoText.x = 120; // Avoid platform menu
ammoText.y = 80;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFEB3B
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
var levelText = new Text2('Enemy Level: 1', {
size: 60,
fill: 0xFF5722
});
levelText.anchor.set(1, 0);
LK.gui.topRight.addChild(levelText);
levelText.y = 80;
var weaponText = new Text2('Weapon: Lv1', {
size: 60,
fill: 0x9C27B0
});
weaponText.anchor.set(1, 0);
LK.gui.topRight.addChild(weaponText);
weaponText.y = 160;
// Movement controls
var moveUpButton = LK.getAsset('upArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveUpButton);
moveUpButton.x = 200;
moveUpButton.y = 2732 - 400;
var moveDownButton = LK.getAsset('downArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveDownButton);
moveDownButton.x = 200;
moveDownButton.y = 2732 - 200;
var moveLeftButton = LK.getAsset('leftArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveLeftButton);
moveLeftButton.x = 100;
moveLeftButton.y = 2732 - 300;
var moveRightButton = LK.getAsset('rightArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveRightButton);
moveRightButton.x = 300;
moveRightButton.y = 2732 - 300;
// Control handlers
moveUpButton.down = function () {
moveDirection.y = -1;
};
moveUpButton.up = function () {
moveDirection.y = 0;
};
moveDownButton.down = function () {
moveDirection.y = 1;
};
moveDownButton.up = function () {
moveDirection.y = 0;
};
moveLeftButton.down = function () {
moveDirection.x = -1;
};
moveLeftButton.up = function () {
moveDirection.x = 0;
};
moveRightButton.down = function () {
moveDirection.x = 1;
};
moveRightButton.up = function () {
moveDirection.x = 0;
};
// Shooting
game.down = function (x, y) {
if (player.ammo <= 0) return;
// Don't shoot if touching movement controls
if (x < 400 && y > 2732 - 500) return;
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.damage = player.weaponDamage;
bullet.setDirection(x, y);
bullets.push(bullet);
game.addChild(bullet);
player.ammo--;
LK.getSound('shoot').play();
};
function spawnEnemy() {
var enemy = new Enemy();
enemy.setLevel(currentEnemyLevel);
// Spawn at random edge of screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = Math.random() * 2048;
enemy.y = -50;
break;
case 1:
// Right
enemy.x = 2048 + 50;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 50;
break;
case 3:
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
function spawnHealthPack() {
var healthPack = new HealthPack();
healthPack.x = Math.random() * (2048 - 100) + 50;
healthPack.y = Math.random() * (2732 - 100) + 50;
healthPacks.push(healthPack);
game.addChild(healthPack);
}
function spawnAmmoPack() {
var ammoPack = new AmmoPack();
ammoPack.x = Math.random() * (2048 - 100) + 50;
ammoPack.y = Math.random() * (2732 - 100) + 50;
ammoPacks.push(ammoPack);
game.addChild(ammoPack);
}
function spawnBigAmmoPack() {
var bigAmmoPack = new BigAmmoPack();
bigAmmoPack.x = Math.random() * (2048 - 100) + 50;
bigAmmoPack.y = Math.random() * (2732 - 100) + 50;
bigAmmoPacks.push(bigAmmoPack);
game.addChild(bigAmmoPack);
}
function spawnWeapon() {
var currentScore = LK.getScore();
var availableWeapons = [];
// Level 1 weapons are always available (easier spawn at start)
if (player.weaponLevel < 1) {
availableWeapons.push(1);
}
// Level 2 weapons available after 500 points
if (currentScore >= 500 && player.weaponLevel < 2) {
availableWeapons.push(2);
}
// Level 3 weapons available after 1000 points
if (currentScore >= 1000 && player.weaponLevel < 3) {
availableWeapons.push(3);
}
// If no weapons available to spawn, return
if (availableWeapons.length === 0) return;
// Select random weapon from available ones
var weaponLevel = availableWeapons[Math.floor(Math.random() * availableWeapons.length)];
var weapon = new WeaponPickup();
weapon.setWeaponLevel(weaponLevel);
weapon.x = Math.random() * (2048 - 100) + 50;
weapon.y = Math.random() * (2732 - 100) + 50;
weaponPickups.push(weapon);
game.addChild(weapon);
}
game.update = function () {
var now = Date.now();
// Update enemy level based on score
var newLevel = Math.floor(LK.getScore() / 100) + 1;
if (newLevel > 10) newLevel = 10;
if (newLevel !== currentEnemyLevel) {
currentEnemyLevel = newLevel;
levelText.setText('Enemy Level: ' + currentEnemyLevel);
}
// Player movement
if (moveDirection.x !== 0 || moveDirection.y !== 0) {
var newX = player.x + moveDirection.x * player.speed;
var newY = player.y + moveDirection.y * player.speed;
// Keep player on screen
if (newX >= 40 && newX <= 2048 - 40) player.x = newX;
if (newY >= 40 && newY <= 2732 - 40) player.y = newY;
}
// Spawn enemies
if (now - lastEnemySpawn > enemySpawnRate) {
spawnEnemy();
lastEnemySpawn = now;
}
// Spawn health packs
if (now - lastHealthPackSpawn > healthPackSpawnRate) {
spawnHealthPack();
lastHealthPackSpawn = now;
}
// Spawn ammo packs
if (now - lastAmmoPackSpawn > ammoPackSpawnRate) {
spawnAmmoPack();
lastAmmoPackSpawn = now;
}
// Spawn big ammo packs (only after 100 points)
if (LK.getScore() >= 100 && now - lastBigAmmoPackSpawn > bigAmmoPackSpawnRate) {
spawnBigAmmoPack();
lastBigAmmoPackSpawn = now;
}
// Spawn weapons (use faster rate for level 1 weapons at start)
var currentWeaponSpawnRate = player.weaponLevel === 1 && LK.getScore() < 500 ? initialWeaponSpawnRate : weaponSpawnRate;
if (now - lastWeaponSpawn > currentWeaponSpawnRate) {
spawnWeapon();
lastWeaponSpawn = now;
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove off-screen bullets
if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage(bullet.damage)) {
// Enemy destroyed
var points = enemy.level * 10; // Points scale with enemy level
LK.setScore(LK.getScore() + points);
scoreText.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
}
LK.getSound('enemyHit').play();
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Check player-health pack collisions
for (var i = healthPacks.length - 1; i >= 0; i--) {
var healthPack = healthPacks[i];
if (player.intersects(healthPack)) {
player.heal(healthPack.healAmount);
LK.getSound('pickup').play();
healthPack.destroy();
healthPacks.splice(i, 1);
}
}
// Check player-ammo pack collisions
for (var i = ammoPacks.length - 1; i >= 0; i--) {
var ammoPack = ammoPacks[i];
if (player.intersects(ammoPack)) {
player.addAmmo(ammoPack.ammoAmount);
LK.getSound('pickup').play();
ammoPack.destroy();
ammoPacks.splice(i, 1);
}
}
// Check player-big ammo pack collisions
for (var i = bigAmmoPacks.length - 1; i >= 0; i--) {
var bigAmmoPack = bigAmmoPacks[i];
if (player.intersects(bigAmmoPack)) {
player.addAmmo(bigAmmoPack.ammoAmount);
LK.getSound('pickup').play();
bigAmmoPack.destroy();
bigAmmoPacks.splice(i, 1);
}
}
// Check player-weapon pickup collisions
for (var i = weaponPickups.length - 1; i >= 0; i--) {
var weaponPickup = weaponPickups[i];
if (player.intersects(weaponPickup)) {
player.upgradeWeapon(weaponPickup.weaponLevel);
LK.getSound('pickup').play();
weaponPickup.destroy();
weaponPickups.splice(i, 1);
}
}
// Update UI
healthText.setText('Health: ' + player.health);
ammoText.setText('Ammo: ' + player.ammo);
weaponText.setText('Weapon: Lv' + player.weaponLevel);
// Check game over
if (player.health <= 0) {
LK.showGameOver();
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AmmoPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('ammoPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.ammoAmount = 10;
return self;
});
var BigAmmoPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bigAmmoPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.ammoAmount = 50;
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 12;
self.damage = 1;
self.setDirection = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
}
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.level = 1;
self.health = 1;
self.maxHealth = 1;
self.speed = 2;
self.damage = 1;
self.lastAttackTime = 0;
self.attackCooldown = 2000; // 2 seconds between attacks
self.setLevel = function (level) {
self.level = level;
if (level <= 9) {
self.health = level;
self.maxHealth = level;
} else {
self.health = 15;
self.maxHealth = 15;
}
self.damage = level;
self.speed = 2 + level * 0.3;
// Visual scaling based on level
var scale = 1 + level * 0.1;
graphics.scaleX = scale;
graphics.scaleY = scale;
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
// Flash white when hit
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100
});
}
});
return self.health <= 0;
};
self.update = function () {
if (!player) return;
// Move towards player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough and cooldown is ready
if (distance < 50 && Date.now() - self.lastAttackTime > self.attackCooldown) {
player.takeDamage(self.damage);
self.lastAttackTime = Date.now();
}
};
return self;
});
var HealthPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('healthPack', {
anchorX: 0.5,
anchorY: 0.5
});
self.healAmount = 25;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 8;
self.ammo = 30;
self.weaponLevel = 1;
self.weaponDamage = 1;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
// Flash red when taking damage
tween(graphics, {
tint: 0xFF0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 100
});
}
});
};
self.heal = function (amount) {
self.health += amount;
if (self.health > self.maxHealth) self.health = self.maxHealth;
// Flash green when healing
tween(graphics, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.addAmmo = function (amount) {
self.ammo += amount;
// Flash blue when getting ammo
tween(graphics, {
tint: 0x0000FF
}, {
duration: 200,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.upgradeWeapon = function (newLevel) {
if (newLevel > self.weaponLevel) {
self.weaponLevel = newLevel;
self.weaponDamage = newLevel;
// Flash gold when upgrading weapon
tween(graphics, {
tint: 0xFFD700
}, {
duration: 300,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xFFFFFF
}, {
duration: 300
});
}
});
}
};
return self;
});
var WeaponPickup = Container.expand(function () {
var self = Container.call(this);
self.weaponLevel = 1;
self.damage = 1;
var graphics;
self.setWeaponLevel = function (level) {
self.weaponLevel = level;
self.damage = level;
// Remove old graphics if exists
if (graphics) {
self.removeChild(graphics);
}
// Add new graphics based on level
var assetName = 'weapon' + level;
graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Different colors for different levels
var colors = [0xFFFFFF, 0x00FF00, 0x0080FF, 0xFF00FF];
graphics.tint = colors[level] || 0xFFFFFF;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var healthPacks = [];
var ammoPacks = [];
var bigAmmoPacks = [];
var weaponPickups = [];
var currentEnemyLevel = 1;
var lastEnemySpawn = 0;
var enemySpawnRate = 2000; // 2 seconds
var lastHealthPackSpawn = 0;
var healthPackSpawnRate = 8000; // 8 seconds
var lastAmmoPackSpawn = 0;
var ammoPackSpawnRate = 6000; // 6 seconds
var lastBigAmmoPackSpawn = 0;
var bigAmmoPackSpawnRate = 12000; // 12 seconds
var lastWeaponSpawn = 0;
var weaponSpawnRate = 15000; // 15 seconds for rare weapon spawns
var initialWeaponSpawnRate = 5000; // 5 seconds for initial level 1 weapons
var moveDirection = {
x: 0,
y: 0
};
// Create player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// UI Elements
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFF4081
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
healthText.x = 120; // Avoid platform menu
var ammoText = new Text2('Ammo: 30', {
size: 60,
fill: 0x2196F3
});
ammoText.anchor.set(0, 0);
LK.gui.topLeft.addChild(ammoText);
ammoText.x = 120; // Avoid platform menu
ammoText.y = 80;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFEB3B
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
var levelText = new Text2('Enemy Level: 1', {
size: 60,
fill: 0xFF5722
});
levelText.anchor.set(1, 0);
LK.gui.topRight.addChild(levelText);
levelText.y = 80;
var weaponText = new Text2('Weapon: Lv1', {
size: 60,
fill: 0x9C27B0
});
weaponText.anchor.set(1, 0);
LK.gui.topRight.addChild(weaponText);
weaponText.y = 160;
// Movement controls
var moveUpButton = LK.getAsset('upArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveUpButton);
moveUpButton.x = 200;
moveUpButton.y = 2732 - 400;
var moveDownButton = LK.getAsset('downArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveDownButton);
moveDownButton.x = 200;
moveDownButton.y = 2732 - 200;
var moveLeftButton = LK.getAsset('leftArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveLeftButton);
moveLeftButton.x = 100;
moveLeftButton.y = 2732 - 300;
var moveRightButton = LK.getAsset('rightArrow', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200,
alpha: 0.7
});
game.addChild(moveRightButton);
moveRightButton.x = 300;
moveRightButton.y = 2732 - 300;
// Control handlers
moveUpButton.down = function () {
moveDirection.y = -1;
};
moveUpButton.up = function () {
moveDirection.y = 0;
};
moveDownButton.down = function () {
moveDirection.y = 1;
};
moveDownButton.up = function () {
moveDirection.y = 0;
};
moveLeftButton.down = function () {
moveDirection.x = -1;
};
moveLeftButton.up = function () {
moveDirection.x = 0;
};
moveRightButton.down = function () {
moveDirection.x = 1;
};
moveRightButton.up = function () {
moveDirection.x = 0;
};
// Shooting
game.down = function (x, y) {
if (player.ammo <= 0) return;
// Don't shoot if touching movement controls
if (x < 400 && y > 2732 - 500) return;
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.damage = player.weaponDamage;
bullet.setDirection(x, y);
bullets.push(bullet);
game.addChild(bullet);
player.ammo--;
LK.getSound('shoot').play();
};
function spawnEnemy() {
var enemy = new Enemy();
enemy.setLevel(currentEnemyLevel);
// Spawn at random edge of screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = Math.random() * 2048;
enemy.y = -50;
break;
case 1:
// Right
enemy.x = 2048 + 50;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 50;
break;
case 3:
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
function spawnHealthPack() {
var healthPack = new HealthPack();
healthPack.x = Math.random() * (2048 - 100) + 50;
healthPack.y = Math.random() * (2732 - 100) + 50;
healthPacks.push(healthPack);
game.addChild(healthPack);
}
function spawnAmmoPack() {
var ammoPack = new AmmoPack();
ammoPack.x = Math.random() * (2048 - 100) + 50;
ammoPack.y = Math.random() * (2732 - 100) + 50;
ammoPacks.push(ammoPack);
game.addChild(ammoPack);
}
function spawnBigAmmoPack() {
var bigAmmoPack = new BigAmmoPack();
bigAmmoPack.x = Math.random() * (2048 - 100) + 50;
bigAmmoPack.y = Math.random() * (2732 - 100) + 50;
bigAmmoPacks.push(bigAmmoPack);
game.addChild(bigAmmoPack);
}
function spawnWeapon() {
var currentScore = LK.getScore();
var availableWeapons = [];
// Level 1 weapons are always available (easier spawn at start)
if (player.weaponLevel < 1) {
availableWeapons.push(1);
}
// Level 2 weapons available after 500 points
if (currentScore >= 500 && player.weaponLevel < 2) {
availableWeapons.push(2);
}
// Level 3 weapons available after 1000 points
if (currentScore >= 1000 && player.weaponLevel < 3) {
availableWeapons.push(3);
}
// If no weapons available to spawn, return
if (availableWeapons.length === 0) return;
// Select random weapon from available ones
var weaponLevel = availableWeapons[Math.floor(Math.random() * availableWeapons.length)];
var weapon = new WeaponPickup();
weapon.setWeaponLevel(weaponLevel);
weapon.x = Math.random() * (2048 - 100) + 50;
weapon.y = Math.random() * (2732 - 100) + 50;
weaponPickups.push(weapon);
game.addChild(weapon);
}
game.update = function () {
var now = Date.now();
// Update enemy level based on score
var newLevel = Math.floor(LK.getScore() / 100) + 1;
if (newLevel > 10) newLevel = 10;
if (newLevel !== currentEnemyLevel) {
currentEnemyLevel = newLevel;
levelText.setText('Enemy Level: ' + currentEnemyLevel);
}
// Player movement
if (moveDirection.x !== 0 || moveDirection.y !== 0) {
var newX = player.x + moveDirection.x * player.speed;
var newY = player.y + moveDirection.y * player.speed;
// Keep player on screen
if (newX >= 40 && newX <= 2048 - 40) player.x = newX;
if (newY >= 40 && newY <= 2732 - 40) player.y = newY;
}
// Spawn enemies
if (now - lastEnemySpawn > enemySpawnRate) {
spawnEnemy();
lastEnemySpawn = now;
}
// Spawn health packs
if (now - lastHealthPackSpawn > healthPackSpawnRate) {
spawnHealthPack();
lastHealthPackSpawn = now;
}
// Spawn ammo packs
if (now - lastAmmoPackSpawn > ammoPackSpawnRate) {
spawnAmmoPack();
lastAmmoPackSpawn = now;
}
// Spawn big ammo packs (only after 100 points)
if (LK.getScore() >= 100 && now - lastBigAmmoPackSpawn > bigAmmoPackSpawnRate) {
spawnBigAmmoPack();
lastBigAmmoPackSpawn = now;
}
// Spawn weapons (use faster rate for level 1 weapons at start)
var currentWeaponSpawnRate = player.weaponLevel === 1 && LK.getScore() < 500 ? initialWeaponSpawnRate : weaponSpawnRate;
if (now - lastWeaponSpawn > currentWeaponSpawnRate) {
spawnWeapon();
lastWeaponSpawn = now;
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove off-screen bullets
if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage(bullet.damage)) {
// Enemy destroyed
var points = enemy.level * 10; // Points scale with enemy level
LK.setScore(LK.getScore() + points);
scoreText.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
}
LK.getSound('enemyHit').play();
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Check player-health pack collisions
for (var i = healthPacks.length - 1; i >= 0; i--) {
var healthPack = healthPacks[i];
if (player.intersects(healthPack)) {
player.heal(healthPack.healAmount);
LK.getSound('pickup').play();
healthPack.destroy();
healthPacks.splice(i, 1);
}
}
// Check player-ammo pack collisions
for (var i = ammoPacks.length - 1; i >= 0; i--) {
var ammoPack = ammoPacks[i];
if (player.intersects(ammoPack)) {
player.addAmmo(ammoPack.ammoAmount);
LK.getSound('pickup').play();
ammoPack.destroy();
ammoPacks.splice(i, 1);
}
}
// Check player-big ammo pack collisions
for (var i = bigAmmoPacks.length - 1; i >= 0; i--) {
var bigAmmoPack = bigAmmoPacks[i];
if (player.intersects(bigAmmoPack)) {
player.addAmmo(bigAmmoPack.ammoAmount);
LK.getSound('pickup').play();
bigAmmoPack.destroy();
bigAmmoPacks.splice(i, 1);
}
}
// Check player-weapon pickup collisions
for (var i = weaponPickups.length - 1; i >= 0; i--) {
var weaponPickup = weaponPickups[i];
if (player.intersects(weaponPickup)) {
player.upgradeWeapon(weaponPickup.weaponLevel);
LK.getSound('pickup').play();
weaponPickup.destroy();
weaponPickups.splice(i, 1);
}
}
// Update UI
healthText.setText('Health: ' + player.health);
ammoText.setText('Ammo: ' + player.ammo);
weaponText.setText('Weapon: Lv' + player.weaponLevel);
// Check game over
if (player.health <= 0) {
LK.showGameOver();
}
};