/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.damage = 1;
self.targetX = 0;
self.targetY = 0;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.weapon = self.addChild(new Weapon());
self.weapon.x = 0;
self.weapon.y = -10;
self.health = 3;
self.lastHealth = 3;
self.shootTimer = 0;
self.update = function () {
if (self.shootTimer > 0) {
self.shootTimer--;
}
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xFF0000, 500);
}
self.lastHealth = self.health;
};
self.canShoot = function () {
return self.shootTimer <= 0;
};
self.shoot = function (targetX, targetY) {
if (self.canShoot()) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.targetX = targetX;
bullet.targetY = targetY;
bullet.damage = self.weapon.damage;
bullets.push(bullet);
game.addChild(bullet);
self.shootTimer = self.weapon.fireRate;
LK.getSound('shoot').play();
}
};
return self;
});
var Thief = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('thief', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.health = 1;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
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;
}
};
return self;
});
var Weapon = Container.expand(function () {
var self = Container.call(this);
self.weaponType = 'pistol';
self.fireRate = 30;
self.damage = 1;
self.graphics = null;
self.setWeapon = function (type) {
if (self.graphics) {
self.removeChild(self.graphics);
}
self.weaponType = type;
if (type === 'pistol') {
self.graphics = self.attachAsset('pistol', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 30;
self.damage = 1;
} else if (type === 'rifle') {
self.graphics = self.attachAsset('rifle', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 15;
self.damage = 2;
} else if (type === 'shotgun') {
self.graphics = self.attachAsset('shotgun', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 45;
self.damage = 3;
}
};
self.setWeapon('pistol');
return self;
});
var WeaponPickup = Container.expand(function () {
var self = Container.call(this);
self.weaponType = 'pistol';
self.graphics = null;
self.setType = function (type) {
if (self.graphics) {
self.removeChild(self.graphics);
}
self.weaponType = type;
if (type === 'pistol') {
self.graphics = self.attachAsset('pistol', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'rifle') {
self.graphics = self.attachAsset('rifle', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'shotgun') {
self.graphics = self.attachAsset('shotgun', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.graphics.alpha = 0.8;
tween(self.graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 1000,
easing: tween.easeInOut
});
tween(self.graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 1000,
easing: tween.easeInOut
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B4513
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
var thieves = [];
var bullets = [];
var weaponPickups = [];
var waveNumber = 1;
var thievesSpawned = 0;
var thievesInWave = 5;
var spawnTimer = 0;
var pickupTimer = 0;
var gameRunning = true;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: '#FFFFFF'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 3', {
size: 60,
fill: '#FF0000'
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 20;
LK.gui.topLeft.addChild(healthText);
var waveText = new Text2('Wave: 1', {
size: 60,
fill: '#00FF00'
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
function spawnThief() {
var thief = new Thief();
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
thief.x = Math.random() * 2048;
thief.y = -50;
break;
case 1:
// Right
thief.x = 2098;
thief.y = Math.random() * 2732;
break;
case 2:
// Bottom
thief.x = Math.random() * 2048;
thief.y = 2782;
break;
case 3:
// Left
thief.x = -50;
thief.y = Math.random() * 2732;
break;
}
thief.speed = 1 + waveNumber * 0.2;
thieves.push(thief);
game.addChild(thief);
}
function spawnWeaponPickup() {
var pickup = new WeaponPickup();
pickup.x = Math.random() * 1800 + 124;
pickup.y = Math.random() * 2400 + 166;
var weaponTypes = ['pistol', 'rifle', 'shotgun'];
var randomType = weaponTypes[Math.floor(Math.random() * weaponTypes.length)];
pickup.setType(randomType);
weaponPickups.push(pickup);
game.addChild(pickup);
}
function findClosestThief() {
var closest = null;
var closestDistance = Infinity;
for (var i = 0; i < thieves.length; i++) {
var thief = thieves[i];
var dx = thief.x - player.x;
var dy = thief.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closest = thief;
closestDistance = distance;
}
}
return closest;
}
function nextWave() {
waveNumber++;
thievesInWave = 5 + waveNumber * 2;
thievesSpawned = 0;
waveText.setText('Wave: ' + waveNumber);
}
game.down = function (x, y, obj) {
if (!gameRunning) return;
player.x = x;
player.y = y;
var closestThief = findClosestThief();
if (closestThief) {
player.shoot(closestThief.x, closestThief.y);
}
};
game.update = function () {
if (!gameRunning) return;
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health);
spawnTimer++;
if (spawnTimer >= 60 && thievesSpawned < thievesInWave) {
spawnThief();
thievesSpawned++;
spawnTimer = 0;
}
pickupTimer++;
if (pickupTimer >= 300) {
spawnWeaponPickup();
pickupTimer = 0;
}
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
for (var j = thieves.length - 1; j >= 0; j--) {
var thief = thieves[j];
if (bullet.intersects(thief)) {
LK.setScore(LK.getScore() + 10);
LK.getSound('enemyHit').play();
LK.effects.flashObject(thief, 0xFF0000, 200);
bullet.destroy();
bullets.splice(i, 1);
thief.destroy();
thieves.splice(j, 1);
break;
}
}
}
for (var i = thieves.length - 1; i >= 0; i--) {
var thief = thieves[i];
if (thief.intersects(player)) {
player.health--;
if (player.health <= 0) {
gameRunning = false;
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
thief.destroy();
thieves.splice(i, 1);
}
}
for (var i = weaponPickups.length - 1; i >= 0; i--) {
var pickup = weaponPickups[i];
if (pickup.intersects(player)) {
player.weapon.setWeapon(pickup.weaponType);
LK.getSound('pickup').play();
pickup.destroy();
weaponPickups.splice(i, 1);
}
}
if (thieves.length === 0 && thievesSpawned >= thievesInWave) {
nextWave();
}
var closestThief = findClosestThief();
if (closestThief && player.canShoot()) {
player.shoot(closestThief.x, closestThief.y);
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.damage = 1;
self.targetX = 0;
self.targetY = 0;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.weapon = self.addChild(new Weapon());
self.weapon.x = 0;
self.weapon.y = -10;
self.health = 3;
self.lastHealth = 3;
self.shootTimer = 0;
self.update = function () {
if (self.shootTimer > 0) {
self.shootTimer--;
}
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xFF0000, 500);
}
self.lastHealth = self.health;
};
self.canShoot = function () {
return self.shootTimer <= 0;
};
self.shoot = function (targetX, targetY) {
if (self.canShoot()) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.targetX = targetX;
bullet.targetY = targetY;
bullet.damage = self.weapon.damage;
bullets.push(bullet);
game.addChild(bullet);
self.shootTimer = self.weapon.fireRate;
LK.getSound('shoot').play();
}
};
return self;
});
var Thief = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('thief', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.health = 1;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
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;
}
};
return self;
});
var Weapon = Container.expand(function () {
var self = Container.call(this);
self.weaponType = 'pistol';
self.fireRate = 30;
self.damage = 1;
self.graphics = null;
self.setWeapon = function (type) {
if (self.graphics) {
self.removeChild(self.graphics);
}
self.weaponType = type;
if (type === 'pistol') {
self.graphics = self.attachAsset('pistol', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 30;
self.damage = 1;
} else if (type === 'rifle') {
self.graphics = self.attachAsset('rifle', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 15;
self.damage = 2;
} else if (type === 'shotgun') {
self.graphics = self.attachAsset('shotgun', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 45;
self.damage = 3;
}
};
self.setWeapon('pistol');
return self;
});
var WeaponPickup = Container.expand(function () {
var self = Container.call(this);
self.weaponType = 'pistol';
self.graphics = null;
self.setType = function (type) {
if (self.graphics) {
self.removeChild(self.graphics);
}
self.weaponType = type;
if (type === 'pistol') {
self.graphics = self.attachAsset('pistol', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'rifle') {
self.graphics = self.attachAsset('rifle', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'shotgun') {
self.graphics = self.attachAsset('shotgun', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.graphics.alpha = 0.8;
tween(self.graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 1000,
easing: tween.easeInOut
});
tween(self.graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 1000,
easing: tween.easeInOut
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B4513
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
var thieves = [];
var bullets = [];
var weaponPickups = [];
var waveNumber = 1;
var thievesSpawned = 0;
var thievesInWave = 5;
var spawnTimer = 0;
var pickupTimer = 0;
var gameRunning = true;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: '#FFFFFF'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 3', {
size: 60,
fill: '#FF0000'
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 20;
LK.gui.topLeft.addChild(healthText);
var waveText = new Text2('Wave: 1', {
size: 60,
fill: '#00FF00'
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
function spawnThief() {
var thief = new Thief();
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
thief.x = Math.random() * 2048;
thief.y = -50;
break;
case 1:
// Right
thief.x = 2098;
thief.y = Math.random() * 2732;
break;
case 2:
// Bottom
thief.x = Math.random() * 2048;
thief.y = 2782;
break;
case 3:
// Left
thief.x = -50;
thief.y = Math.random() * 2732;
break;
}
thief.speed = 1 + waveNumber * 0.2;
thieves.push(thief);
game.addChild(thief);
}
function spawnWeaponPickup() {
var pickup = new WeaponPickup();
pickup.x = Math.random() * 1800 + 124;
pickup.y = Math.random() * 2400 + 166;
var weaponTypes = ['pistol', 'rifle', 'shotgun'];
var randomType = weaponTypes[Math.floor(Math.random() * weaponTypes.length)];
pickup.setType(randomType);
weaponPickups.push(pickup);
game.addChild(pickup);
}
function findClosestThief() {
var closest = null;
var closestDistance = Infinity;
for (var i = 0; i < thieves.length; i++) {
var thief = thieves[i];
var dx = thief.x - player.x;
var dy = thief.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closest = thief;
closestDistance = distance;
}
}
return closest;
}
function nextWave() {
waveNumber++;
thievesInWave = 5 + waveNumber * 2;
thievesSpawned = 0;
waveText.setText('Wave: ' + waveNumber);
}
game.down = function (x, y, obj) {
if (!gameRunning) return;
player.x = x;
player.y = y;
var closestThief = findClosestThief();
if (closestThief) {
player.shoot(closestThief.x, closestThief.y);
}
};
game.update = function () {
if (!gameRunning) return;
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health);
spawnTimer++;
if (spawnTimer >= 60 && thievesSpawned < thievesInWave) {
spawnThief();
thievesSpawned++;
spawnTimer = 0;
}
pickupTimer++;
if (pickupTimer >= 300) {
spawnWeaponPickup();
pickupTimer = 0;
}
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
for (var j = thieves.length - 1; j >= 0; j--) {
var thief = thieves[j];
if (bullet.intersects(thief)) {
LK.setScore(LK.getScore() + 10);
LK.getSound('enemyHit').play();
LK.effects.flashObject(thief, 0xFF0000, 200);
bullet.destroy();
bullets.splice(i, 1);
thief.destroy();
thieves.splice(j, 1);
break;
}
}
}
for (var i = thieves.length - 1; i >= 0; i--) {
var thief = thieves[i];
if (thief.intersects(player)) {
player.health--;
if (player.health <= 0) {
gameRunning = false;
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
thief.destroy();
thieves.splice(i, 1);
}
}
for (var i = weaponPickups.length - 1; i >= 0; i--) {
var pickup = weaponPickups[i];
if (pickup.intersects(player)) {
player.weapon.setWeapon(pickup.weaponType);
LK.getSound('pickup').play();
pickup.destroy();
weaponPickups.splice(i, 1);
}
}
if (thieves.length === 0 && thievesSpawned >= thievesInWave) {
nextWave();
}
var closestThief = findClosestThief();
if (closestThief && player.canShoot()) {
player.shoot(closestThief.x, closestThief.y);
}
};