/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.direction = {
x: 0,
y: 0
};
self.isPlayerBullet = true;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.speed = 1.5;
self.shootTimer = 0;
self.shootDelay = 90;
self.lastPlayerX = 0;
self.lastPlayerY = 0;
self.update = function () {
if (!mike) return;
var dx = mike.x - self.x;
var dy = mike.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
self.x += moveX;
self.y += moveY;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay && distance < 300) {
self.shootAtPlayer();
self.shootTimer = 0;
}
var healthPercent = self.health / self.maxHealth;
enemyGraphics.tint = healthPercent < 0.5 ? 0xFF6666 : 0xFFFFFF;
};
self.shootAtPlayer = function () {
if (!mike) return;
var dx = mike.x - self.x;
var dy = mike.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 200);
if (self.health <= 0) {
return true;
}
return false;
};
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 = 5;
self.direction = {
x: 0,
y: 0
};
self.isPlayerBullet = false;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var Mike = Container.expand(function () {
var self = Container.call(this);
var mikeGraphics = self.attachAsset('mike', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 10;
self.maxHealth = 10;
self.speed = 4;
self.weapon = 'pistol';
self.shootTimer = 0;
self.shootDelay = 20;
self.lastTargetX = 0;
self.lastTargetY = 0;
self.update = function () {
if (self.shootTimer > 0) {
self.shootTimer--;
}
var healthPercent = self.health / self.maxHealth;
if (healthPercent < 0.3) {
mikeGraphics.tint = 0xFF6666;
} else if (healthPercent < 0.6) {
mikeGraphics.tint = 0xFFFF66;
} else {
mikeGraphics.tint = 0xFFFFFF;
}
};
self.shoot = function (targetX, targetY) {
if (self.shootTimer > 0) return;
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
self.shootTimer = self.shootDelay;
self.lastTargetX = targetX;
self.lastTargetY = targetY;
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 300);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var MissionMarker = Container.expand(function () {
var self = Container.call(this);
var markerGraphics = self.attachAsset('missionMarker', {
anchorX: 0.5,
anchorY: 0.5
});
self.missionType = '';
self.completed = false;
self.pulseTimer = 0;
self.update = function () {
self.pulseTimer += 0.1;
var scale = 1 + Math.sin(self.pulseTimer) * 0.2;
markerGraphics.scaleX = scale;
markerGraphics.scaleY = scale;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var mike = null;
var enemies = [];
var bullets = [];
var enemyBullets = [];
var missionMarkers = [];
var buildings = [];
var playerMoney = 100;
var currentMission = 1;
var totalMissions = 5;
var gameState = 'playing';
var dragNode = null;
var moneyText = new Text2('Money: $' + playerMoney, {
size: 40,
fill: 0x00FF00
});
moneyText.anchor.set(0, 0);
LK.gui.topRight.addChild(moneyText);
var healthText = new Text2('Health: 10', {
size: 40,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
var missionText = new Text2('Mission: 1/' + totalMissions, {
size: 40,
fill: 0xFFFFFF
});
missionText.anchor.set(0.5, 0);
LK.gui.top.addChild(missionText);
function createBuildings() {
for (var i = 0; i < 8; i++) {
var building = game.addChild(LK.getAsset('building', {
anchorX: 0.5,
anchorY: 0.5
}));
building.x = Math.random() * 1800 + 200;
building.y = Math.random() * 2400 + 200;
buildings.push(building);
}
}
function spawnEnemies() {
var enemyCount = Math.min(2 + currentMission, 6);
for (var i = 0; i < enemyCount; i++) {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 200;
enemy.y = Math.random() * 2400 + 200;
enemies.push(enemy);
game.addChild(enemy);
}
}
function createMissionMarker() {
var marker = new MissionMarker();
marker.x = Math.random() * 1600 + 400;
marker.y = Math.random() * 2200 + 400;
marker.missionType = 'eliminate';
missionMarkers.push(marker);
game.addChild(marker);
}
function initializeLevel() {
mike = new Mike();
mike.x = 1024;
mike.y = 1366;
game.addChild(mike);
createBuildings();
spawnEnemies();
createMissionMarker();
}
function handleMove(x, y, obj) {
if (dragNode && gameState === 'playing') {
dragNode.x = x;
dragNode.y = y;
}
if (mike && gameState === 'playing' && !dragNode) {
mike.shoot(x, y);
}
}
function checkBulletCollisions() {
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
var bulletDestroyed = false;
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
LK.getSound('enemyHit').play();
if (enemy.takeDamage()) {
enemy.destroy();
enemies.splice(j, 1);
playerMoney += 25;
moneyText.setText('Money: $' + playerMoney);
}
bullet.destroy();
bullets.splice(i, 1);
bulletDestroyed = true;
break;
}
}
if (bulletDestroyed) continue;
for (var k = 0; k < buildings.length; k++) {
if (bullet.intersects(buildings[k])) {
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
}
function checkEnemyBulletCollisions() {
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (mike && bullet.intersects(mike)) {
mike.takeDamage();
healthText.setText('Health: ' + mike.health);
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
for (var k = 0; k < buildings.length; k++) {
if (bullet.intersects(buildings[k])) {
bullet.destroy();
enemyBullets.splice(i, 1);
break;
}
}
}
}
function checkMissionProgress() {
if (enemies.length === 0 && missionMarkers.length > 0) {
for (var i = missionMarkers.length - 1; i >= 0; i--) {
var marker = missionMarkers[i];
if (mike && mike.intersects(marker)) {
marker.destroy();
missionMarkers.splice(i, 1);
completeMission();
break;
}
}
}
}
function completeMission() {
LK.getSound('missionComplete').play();
playerMoney += 100;
moneyText.setText('Money: $' + playerMoney);
currentMission++;
if (currentMission > totalMissions) {
LK.showYouWin();
return;
}
missionText.setText('Mission: ' + currentMission + '/' + totalMissions);
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
for (var j = bullets.length - 1; j >= 0; j--) {
bullets[j].destroy();
bullets.splice(j, 1);
}
for (var k = enemyBullets.length - 1; k >= 0; k--) {
enemyBullets[k].destroy();
enemyBullets.splice(k, 1);
}
LK.setTimeout(function () {
spawnEnemies();
createMissionMarker();
if (mike) {
mike.health = Math.min(mike.health + 2, mike.maxHealth);
healthText.setText('Health: ' + mike.health);
}
}, 1000);
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'playing') {
dragNode = mike;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameState !== 'playing') return;
checkBulletCollisions();
checkEnemyBulletCollisions();
checkMissionProgress();
};
initializeLevel(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.direction = {
x: 0,
y: 0
};
self.isPlayerBullet = true;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.speed = 1.5;
self.shootTimer = 0;
self.shootDelay = 90;
self.lastPlayerX = 0;
self.lastPlayerY = 0;
self.update = function () {
if (!mike) return;
var dx = mike.x - self.x;
var dy = mike.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
self.x += moveX;
self.y += moveY;
}
self.shootTimer++;
if (self.shootTimer >= self.shootDelay && distance < 300) {
self.shootAtPlayer();
self.shootTimer = 0;
}
var healthPercent = self.health / self.maxHealth;
enemyGraphics.tint = healthPercent < 0.5 ? 0xFF6666 : 0xFFFFFF;
};
self.shootAtPlayer = function () {
if (!mike) return;
var dx = mike.x - self.x;
var dy = mike.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 200);
if (self.health <= 0) {
return true;
}
return false;
};
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 = 5;
self.direction = {
x: 0,
y: 0
};
self.isPlayerBullet = false;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var Mike = Container.expand(function () {
var self = Container.call(this);
var mikeGraphics = self.attachAsset('mike', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 10;
self.maxHealth = 10;
self.speed = 4;
self.weapon = 'pistol';
self.shootTimer = 0;
self.shootDelay = 20;
self.lastTargetX = 0;
self.lastTargetY = 0;
self.update = function () {
if (self.shootTimer > 0) {
self.shootTimer--;
}
var healthPercent = self.health / self.maxHealth;
if (healthPercent < 0.3) {
mikeGraphics.tint = 0xFF6666;
} else if (healthPercent < 0.6) {
mikeGraphics.tint = 0xFFFF66;
} else {
mikeGraphics.tint = 0xFFFFFF;
}
};
self.shoot = function (targetX, targetY) {
if (self.shootTimer > 0) return;
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
self.shootTimer = self.shootDelay;
self.lastTargetX = targetX;
self.lastTargetY = targetY;
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 300);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var MissionMarker = Container.expand(function () {
var self = Container.call(this);
var markerGraphics = self.attachAsset('missionMarker', {
anchorX: 0.5,
anchorY: 0.5
});
self.missionType = '';
self.completed = false;
self.pulseTimer = 0;
self.update = function () {
self.pulseTimer += 0.1;
var scale = 1 + Math.sin(self.pulseTimer) * 0.2;
markerGraphics.scaleX = scale;
markerGraphics.scaleY = scale;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var mike = null;
var enemies = [];
var bullets = [];
var enemyBullets = [];
var missionMarkers = [];
var buildings = [];
var playerMoney = 100;
var currentMission = 1;
var totalMissions = 5;
var gameState = 'playing';
var dragNode = null;
var moneyText = new Text2('Money: $' + playerMoney, {
size: 40,
fill: 0x00FF00
});
moneyText.anchor.set(0, 0);
LK.gui.topRight.addChild(moneyText);
var healthText = new Text2('Health: 10', {
size: 40,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
var missionText = new Text2('Mission: 1/' + totalMissions, {
size: 40,
fill: 0xFFFFFF
});
missionText.anchor.set(0.5, 0);
LK.gui.top.addChild(missionText);
function createBuildings() {
for (var i = 0; i < 8; i++) {
var building = game.addChild(LK.getAsset('building', {
anchorX: 0.5,
anchorY: 0.5
}));
building.x = Math.random() * 1800 + 200;
building.y = Math.random() * 2400 + 200;
buildings.push(building);
}
}
function spawnEnemies() {
var enemyCount = Math.min(2 + currentMission, 6);
for (var i = 0; i < enemyCount; i++) {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 200;
enemy.y = Math.random() * 2400 + 200;
enemies.push(enemy);
game.addChild(enemy);
}
}
function createMissionMarker() {
var marker = new MissionMarker();
marker.x = Math.random() * 1600 + 400;
marker.y = Math.random() * 2200 + 400;
marker.missionType = 'eliminate';
missionMarkers.push(marker);
game.addChild(marker);
}
function initializeLevel() {
mike = new Mike();
mike.x = 1024;
mike.y = 1366;
game.addChild(mike);
createBuildings();
spawnEnemies();
createMissionMarker();
}
function handleMove(x, y, obj) {
if (dragNode && gameState === 'playing') {
dragNode.x = x;
dragNode.y = y;
}
if (mike && gameState === 'playing' && !dragNode) {
mike.shoot(x, y);
}
}
function checkBulletCollisions() {
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
var bulletDestroyed = false;
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
LK.getSound('enemyHit').play();
if (enemy.takeDamage()) {
enemy.destroy();
enemies.splice(j, 1);
playerMoney += 25;
moneyText.setText('Money: $' + playerMoney);
}
bullet.destroy();
bullets.splice(i, 1);
bulletDestroyed = true;
break;
}
}
if (bulletDestroyed) continue;
for (var k = 0; k < buildings.length; k++) {
if (bullet.intersects(buildings[k])) {
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
}
function checkEnemyBulletCollisions() {
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (mike && bullet.intersects(mike)) {
mike.takeDamage();
healthText.setText('Health: ' + mike.health);
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
for (var k = 0; k < buildings.length; k++) {
if (bullet.intersects(buildings[k])) {
bullet.destroy();
enemyBullets.splice(i, 1);
break;
}
}
}
}
function checkMissionProgress() {
if (enemies.length === 0 && missionMarkers.length > 0) {
for (var i = missionMarkers.length - 1; i >= 0; i--) {
var marker = missionMarkers[i];
if (mike && mike.intersects(marker)) {
marker.destroy();
missionMarkers.splice(i, 1);
completeMission();
break;
}
}
}
}
function completeMission() {
LK.getSound('missionComplete').play();
playerMoney += 100;
moneyText.setText('Money: $' + playerMoney);
currentMission++;
if (currentMission > totalMissions) {
LK.showYouWin();
return;
}
missionText.setText('Mission: ' + currentMission + '/' + totalMissions);
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
for (var j = bullets.length - 1; j >= 0; j--) {
bullets[j].destroy();
bullets.splice(j, 1);
}
for (var k = enemyBullets.length - 1; k >= 0; k--) {
enemyBullets[k].destroy();
enemyBullets.splice(k, 1);
}
LK.setTimeout(function () {
spawnEnemies();
createMissionMarker();
if (mike) {
mike.health = Math.min(mike.health + 2, mike.maxHealth);
healthText.setText('Health: ' + mike.health);
}
}, 1000);
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'playing') {
dragNode = mike;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameState !== 'playing') return;
checkBulletCollisions();
checkEnemyBulletCollisions();
checkMissionProgress();
};
initializeLevel();