/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
level: 1
});
/****
* Classes
****/
var Breadcrumb = Container.expand(function () {
var self = Container.call(this);
var breadcrumbGraphic = self.attachAsset('breadcrumb', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.damage = 1;
self.update = function () {
self.y += self.speed;
// Handle off-screen removal in game.update
};
return self;
});
var Building = Container.expand(function () {
var self = Container.call(this);
var buildingGraphic = self.attachAsset('building', {
anchorX: 0.5,
anchorY: 0
});
// Random height variation
var heightScale = 0.5 + Math.random() * 0.5;
buildingGraphic.scaleY = heightScale;
// Random gray shade
var grayShade = 100 + Math.floor(Math.random() * 100);
buildingGraphic.tint = grayShade << 16 | grayShade << 8 | grayShade;
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'cat';
self.health = 1;
self.speed = 3;
self.points = 10;
// Customize based on enemy type
if (self.type === 'cat') {
self.health = 2;
self.speed = 3;
self.points = 10;
} else if (self.type === 'hawk') {
self.health = 1;
self.speed = 5;
self.points = 15;
} else if (self.type === 'truck') {
self.health = 4;
self.speed = 2;
self.points = 25;
}
var enemyGraphic = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
// Zigzag movement for hawks
if (self.type === 'hawk') {
self.x += Math.sin(LK.ticks / 10) * 5;
}
// Handle off-screen and collisions in game.update
};
self.takeDamage = function (amount) {
self.health -= amount;
// Visual feedback
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
return true; // Enemy is defeated
}
return false;
};
return self;
});
var Pigeon = Container.expand(function () {
var self = Container.call(this);
var pigeonGraphic = self.attachAsset('pigeon', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 30; // Frames between shots
self.lastFired = 0;
self.powerups = {
multishot: 0,
speed: 0,
shield: 0
};
self.update = function () {
// Automatic firing
if (LK.ticks - self.lastFired >= self.fireRate) {
self.fire();
self.lastFired = LK.ticks;
}
// Countdown powerup durations
for (var powerup in self.powerups) {
if (self.powerups[powerup] > 0) {
self.powerups[powerup]--;
}
}
};
self.fire = function () {
// Basic breadcrumb
var breadcrumb = new Breadcrumb();
breadcrumb.x = self.x;
breadcrumb.y = self.y - 50;
game.addChild(breadcrumb);
game.breadcrumbs.push(breadcrumb);
// Multishot powerup
if (self.powerups.multishot > 0) {
var breadcrumbLeft = new Breadcrumb();
breadcrumbLeft.x = self.x - 40;
breadcrumbLeft.y = self.y - 30;
game.addChild(breadcrumbLeft);
game.breadcrumbs.push(breadcrumbLeft);
var breadcrumbRight = new Breadcrumb();
breadcrumbRight.x = self.x + 40;
breadcrumbRight.y = self.y - 30;
game.addChild(breadcrumbRight);
game.breadcrumbs.push(breadcrumbRight);
}
// Speed powerup affects fire rate
if (self.powerups.speed > 0) {
self.lastFired -= 10; // Allow next shot sooner
}
// Play sound
LK.getSound('shoot').play();
};
self.activatePowerup = function (type) {
// Duration in frames (60 = 1 second)
var duration = 300; // 5 seconds
self.powerups[type] = duration;
// Visual feedback
if (type === 'multishot') {
LK.effects.flashObject(self, 0xFF0000, 500);
} else if (type === 'speed') {
LK.effects.flashObject(self, 0x00FF00, 500);
} else if (type === 'shield') {
LK.effects.flashObject(self, 0x0000FF, 500);
// Create shield visual if needed
}
};
self.down = function (x, y, obj) {
// Not needed, movement handled in game.down
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'multishot';
self.speed = 4;
var powerupGraphic = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Different colors based on power-up type
if (self.type === 'multishot') {
powerupGraphic.tint = 0xFF0000; // Red for multishot
} else if (self.type === 'speed') {
powerupGraphic.tint = 0x00FF00; // Green for speed
} else if (self.type === 'shield') {
powerupGraphic.tint = 0x0000FF; // Blue for shield
}
self.update = function () {
self.y += self.speed;
// Handle off-screen and collection in game.update
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game state variables
var level = storage.level || 1;
var score = 0;
var lives = 3;
var isPaused = false;
var isGameOver = false;
var spawnRate = 120; // Frames between enemy spawns
var lastSpawn = 0;
var powerupChance = 0.1; // 10% chance of powerup from defeated enemies
// Game objects collections
game.breadcrumbs = [];
game.enemies = [];
game.powerups = [];
game.buildings = [];
// Create the pigeon player
var pigeon = new Pigeon();
pigeon.x = 2048 / 2;
pigeon.y = 2732 - 200;
game.addChild(pigeon);
// Create background buildings
function createBackgroundBuildings() {
// Clear existing buildings
for (var i = 0; i < game.buildings.length; i++) {
game.buildings[i].destroy();
}
game.buildings = [];
// Create new buildings
var buildingCount = 5;
var spacing = 2048 / buildingCount;
for (var i = 0; i < buildingCount; i++) {
var building = new Building();
building.x = i * spacing + spacing / 2;
building.y = 2732 - 100; // Position from bottom
// Ensure buildings are behind gameplay elements
game.addChildAt(building, 0);
game.buildings.push(building);
}
}
// Create UI elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var livesTxt = new Text2('Lives: 3', {
size: 60,
fill: 0xFFFFFF
});
livesTxt.anchor.set(1, 0);
LK.gui.top.addChild(livesTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
// Initialize game
function initGame() {
// Clear all game objects
for (var i = 0; i < game.breadcrumbs.length; i++) {
if (game.breadcrumbs[i]) {
game.breadcrumbs[i].destroy();
}
}
game.breadcrumbs = [];
for (var i = 0; i < game.enemies.length; i++) {
if (game.enemies[i]) {
game.enemies[i].destroy();
}
}
game.enemies = [];
for (var i = 0; i < game.powerups.length; i++) {
if (game.powerups[i]) {
game.powerups[i].destroy();
}
}
game.powerups = [];
// Reset game state
level = storage.level || 1;
score = 0;
lives = 3;
isGameOver = false;
spawnRate = Math.max(120 - level * 10, 30); // Faster spawns at higher levels
// Reset pigeon position
pigeon.x = 2048 / 2;
pigeon.y = 2732 - 200;
// Update UI
updateUI();
// Create background
createBackgroundBuildings();
// Start game music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
}
// Update UI elements
function updateUI() {
scoreTxt.setText('Score: ' + score);
livesTxt.setText('Lives: ' + lives);
levelTxt.setText('Level: ' + level);
}
// Spawn enemies
function spawnEnemy() {
var enemyTypes = ['cat', 'hawk', 'truck'];
var weights = [60, 30, 10]; // Probability distribution
// Adjust weights based on level
if (level >= 3) {
weights = [50, 35, 15];
}
if (level >= 5) {
weights = [40, 40, 20];
}
if (level >= 8) {
weights = [30, 40, 30];
}
// Select enemy type based on weighted random
var totalWeight = weights.reduce(function (a, b) {
return a + b;
}, 0);
var random = Math.random() * totalWeight;
var enemyTypeIndex = 0;
var weightSum = 0;
for (var i = 0; i < weights.length; i++) {
weightSum += weights[i];
if (random <= weightSum) {
enemyTypeIndex = i;
break;
}
}
var enemy = new Enemy(enemyTypes[enemyTypeIndex]);
// Position randomly across top of screen
enemy.x = Math.random() * 1948 + 50; // Keep away from edges
enemy.y = -100; // Start above screen
// Adjust speed based on level
enemy.speed += Math.min(level * 0.5, 3);
game.addChild(enemy);
game.enemies.push(enemy);
}
// Handle collecting powerups
function collectPowerup(powerup) {
LK.getSound('powerupCollect').play();
pigeon.activatePowerup(powerup.type);
// Visual feedback
LK.effects.flashObject(pigeon, 0xFFFFFF, 500);
}
// Handle pigeon hit by enemy
function pigeonHit() {
if (pigeon.powerups.shield > 0) {
// Shield absorbs hit
pigeon.powerups.shield = 0;
LK.effects.flashObject(pigeon, 0x0000FF, 500);
return;
}
lives--;
updateUI();
LK.getSound('pigeonHit').play();
LK.effects.flashObject(pigeon, 0xFF0000, 500);
if (lives <= 0) {
gameOver();
}
}
// Handle level completion
function checkLevelComplete() {
// Level up after certain score thresholds
var nextLevelThreshold = level * 100;
if (score >= nextLevelThreshold) {
level++;
storage.level = level;
// Update spawn rate for new level
spawnRate = Math.max(120 - level * 10, 30);
// Update UI
updateUI();
// Visual effect for level up
LK.effects.flashScreen(0xFFFFFF, 500);
}
}
// Game over function
function gameOver() {
isGameOver = true;
// Update high score if needed
if (score > storage.highScore) {
storage.highScore = score;
}
// Show game over screen
LK.showGameOver();
}
// Spawn a power-up
function spawnPowerup(x, y) {
var powerupTypes = ['multishot', 'speed', 'shield'];
var type = powerupTypes[Math.floor(Math.random() * powerupTypes.length)];
var powerup = new PowerUp(type);
powerup.x = x;
powerup.y = y;
game.addChild(powerup);
game.powerups.push(powerup);
}
// Touch/mouse handlers
game.down = function (x, y, obj) {
// Move pigeon to touch position (x only)
pigeon.x = x;
};
game.move = function (x, y, obj) {
// Only update position if pressed
if (obj.pressed) {
pigeon.x = x;
}
};
// Game update loop
game.update = function () {
if (isGameOver) {
return;
}
// Update player
pigeon.update();
// Spawn enemies
if (LK.ticks - lastSpawn >= spawnRate) {
spawnEnemy();
lastSpawn = LK.ticks;
}
// Update breadcrumbs
for (var i = game.breadcrumbs.length - 1; i >= 0; i--) {
var breadcrumb = game.breadcrumbs[i];
// Remove if off screen
if (breadcrumb.y < -50) {
breadcrumb.destroy();
game.breadcrumbs.splice(i, 1);
continue;
}
// Check for collisions with enemies
for (var j = game.enemies.length - 1; j >= 0; j--) {
var enemy = game.enemies[j];
if (breadcrumb.intersects(enemy)) {
// Handle hit
var defeated = enemy.takeDamage(breadcrumb.damage);
if (defeated) {
// Add score
score += enemy.points;
updateUI();
// Chance to spawn powerup
if (Math.random() < powerupChance) {
spawnPowerup(enemy.x, enemy.y);
}
// Remove enemy
enemy.destroy();
game.enemies.splice(j, 1);
// Play sound
LK.getSound('enemyHit').play();
}
// Remove breadcrumb
breadcrumb.destroy();
game.breadcrumbs.splice(i, 1);
break;
}
}
}
// Update enemies
for (var i = game.enemies.length - 1; i >= 0; i--) {
var enemy = game.enemies[i];
// Check if enemy passed bottom of screen
if (enemy.y > 2732 + 100) {
// Player loses a life
pigeonHit();
// Remove enemy
enemy.destroy();
game.enemies.splice(i, 1);
continue;
}
// Check collision with pigeon
if (enemy.intersects(pigeon)) {
// Player loses a life
pigeonHit();
// Remove enemy
enemy.destroy();
game.enemies.splice(i, 1);
continue;
}
}
// Update powerups
for (var i = game.powerups.length - 1; i >= 0; i--) {
var powerup = game.powerups[i];
// Remove if off screen
if (powerup.y > 2732 + 50) {
powerup.destroy();
game.powerups.splice(i, 1);
continue;
}
// Check collision with pigeon
if (powerup.intersects(pigeon)) {
collectPowerup(powerup);
// Remove powerup
powerup.destroy();
game.powerups.splice(i, 1);
continue;
}
}
// Check for level completion
checkLevelComplete();
};
// Initialize game
initGame(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
level: 1
});
/****
* Classes
****/
var Breadcrumb = Container.expand(function () {
var self = Container.call(this);
var breadcrumbGraphic = self.attachAsset('breadcrumb', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.damage = 1;
self.update = function () {
self.y += self.speed;
// Handle off-screen removal in game.update
};
return self;
});
var Building = Container.expand(function () {
var self = Container.call(this);
var buildingGraphic = self.attachAsset('building', {
anchorX: 0.5,
anchorY: 0
});
// Random height variation
var heightScale = 0.5 + Math.random() * 0.5;
buildingGraphic.scaleY = heightScale;
// Random gray shade
var grayShade = 100 + Math.floor(Math.random() * 100);
buildingGraphic.tint = grayShade << 16 | grayShade << 8 | grayShade;
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'cat';
self.health = 1;
self.speed = 3;
self.points = 10;
// Customize based on enemy type
if (self.type === 'cat') {
self.health = 2;
self.speed = 3;
self.points = 10;
} else if (self.type === 'hawk') {
self.health = 1;
self.speed = 5;
self.points = 15;
} else if (self.type === 'truck') {
self.health = 4;
self.speed = 2;
self.points = 25;
}
var enemyGraphic = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
// Zigzag movement for hawks
if (self.type === 'hawk') {
self.x += Math.sin(LK.ticks / 10) * 5;
}
// Handle off-screen and collisions in game.update
};
self.takeDamage = function (amount) {
self.health -= amount;
// Visual feedback
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
return true; // Enemy is defeated
}
return false;
};
return self;
});
var Pigeon = Container.expand(function () {
var self = Container.call(this);
var pigeonGraphic = self.attachAsset('pigeon', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 30; // Frames between shots
self.lastFired = 0;
self.powerups = {
multishot: 0,
speed: 0,
shield: 0
};
self.update = function () {
// Automatic firing
if (LK.ticks - self.lastFired >= self.fireRate) {
self.fire();
self.lastFired = LK.ticks;
}
// Countdown powerup durations
for (var powerup in self.powerups) {
if (self.powerups[powerup] > 0) {
self.powerups[powerup]--;
}
}
};
self.fire = function () {
// Basic breadcrumb
var breadcrumb = new Breadcrumb();
breadcrumb.x = self.x;
breadcrumb.y = self.y - 50;
game.addChild(breadcrumb);
game.breadcrumbs.push(breadcrumb);
// Multishot powerup
if (self.powerups.multishot > 0) {
var breadcrumbLeft = new Breadcrumb();
breadcrumbLeft.x = self.x - 40;
breadcrumbLeft.y = self.y - 30;
game.addChild(breadcrumbLeft);
game.breadcrumbs.push(breadcrumbLeft);
var breadcrumbRight = new Breadcrumb();
breadcrumbRight.x = self.x + 40;
breadcrumbRight.y = self.y - 30;
game.addChild(breadcrumbRight);
game.breadcrumbs.push(breadcrumbRight);
}
// Speed powerup affects fire rate
if (self.powerups.speed > 0) {
self.lastFired -= 10; // Allow next shot sooner
}
// Play sound
LK.getSound('shoot').play();
};
self.activatePowerup = function (type) {
// Duration in frames (60 = 1 second)
var duration = 300; // 5 seconds
self.powerups[type] = duration;
// Visual feedback
if (type === 'multishot') {
LK.effects.flashObject(self, 0xFF0000, 500);
} else if (type === 'speed') {
LK.effects.flashObject(self, 0x00FF00, 500);
} else if (type === 'shield') {
LK.effects.flashObject(self, 0x0000FF, 500);
// Create shield visual if needed
}
};
self.down = function (x, y, obj) {
// Not needed, movement handled in game.down
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'multishot';
self.speed = 4;
var powerupGraphic = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Different colors based on power-up type
if (self.type === 'multishot') {
powerupGraphic.tint = 0xFF0000; // Red for multishot
} else if (self.type === 'speed') {
powerupGraphic.tint = 0x00FF00; // Green for speed
} else if (self.type === 'shield') {
powerupGraphic.tint = 0x0000FF; // Blue for shield
}
self.update = function () {
self.y += self.speed;
// Handle off-screen and collection in game.update
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game state variables
var level = storage.level || 1;
var score = 0;
var lives = 3;
var isPaused = false;
var isGameOver = false;
var spawnRate = 120; // Frames between enemy spawns
var lastSpawn = 0;
var powerupChance = 0.1; // 10% chance of powerup from defeated enemies
// Game objects collections
game.breadcrumbs = [];
game.enemies = [];
game.powerups = [];
game.buildings = [];
// Create the pigeon player
var pigeon = new Pigeon();
pigeon.x = 2048 / 2;
pigeon.y = 2732 - 200;
game.addChild(pigeon);
// Create background buildings
function createBackgroundBuildings() {
// Clear existing buildings
for (var i = 0; i < game.buildings.length; i++) {
game.buildings[i].destroy();
}
game.buildings = [];
// Create new buildings
var buildingCount = 5;
var spacing = 2048 / buildingCount;
for (var i = 0; i < buildingCount; i++) {
var building = new Building();
building.x = i * spacing + spacing / 2;
building.y = 2732 - 100; // Position from bottom
// Ensure buildings are behind gameplay elements
game.addChildAt(building, 0);
game.buildings.push(building);
}
}
// Create UI elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var livesTxt = new Text2('Lives: 3', {
size: 60,
fill: 0xFFFFFF
});
livesTxt.anchor.set(1, 0);
LK.gui.top.addChild(livesTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
// Initialize game
function initGame() {
// Clear all game objects
for (var i = 0; i < game.breadcrumbs.length; i++) {
if (game.breadcrumbs[i]) {
game.breadcrumbs[i].destroy();
}
}
game.breadcrumbs = [];
for (var i = 0; i < game.enemies.length; i++) {
if (game.enemies[i]) {
game.enemies[i].destroy();
}
}
game.enemies = [];
for (var i = 0; i < game.powerups.length; i++) {
if (game.powerups[i]) {
game.powerups[i].destroy();
}
}
game.powerups = [];
// Reset game state
level = storage.level || 1;
score = 0;
lives = 3;
isGameOver = false;
spawnRate = Math.max(120 - level * 10, 30); // Faster spawns at higher levels
// Reset pigeon position
pigeon.x = 2048 / 2;
pigeon.y = 2732 - 200;
// Update UI
updateUI();
// Create background
createBackgroundBuildings();
// Start game music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
}
// Update UI elements
function updateUI() {
scoreTxt.setText('Score: ' + score);
livesTxt.setText('Lives: ' + lives);
levelTxt.setText('Level: ' + level);
}
// Spawn enemies
function spawnEnemy() {
var enemyTypes = ['cat', 'hawk', 'truck'];
var weights = [60, 30, 10]; // Probability distribution
// Adjust weights based on level
if (level >= 3) {
weights = [50, 35, 15];
}
if (level >= 5) {
weights = [40, 40, 20];
}
if (level >= 8) {
weights = [30, 40, 30];
}
// Select enemy type based on weighted random
var totalWeight = weights.reduce(function (a, b) {
return a + b;
}, 0);
var random = Math.random() * totalWeight;
var enemyTypeIndex = 0;
var weightSum = 0;
for (var i = 0; i < weights.length; i++) {
weightSum += weights[i];
if (random <= weightSum) {
enemyTypeIndex = i;
break;
}
}
var enemy = new Enemy(enemyTypes[enemyTypeIndex]);
// Position randomly across top of screen
enemy.x = Math.random() * 1948 + 50; // Keep away from edges
enemy.y = -100; // Start above screen
// Adjust speed based on level
enemy.speed += Math.min(level * 0.5, 3);
game.addChild(enemy);
game.enemies.push(enemy);
}
// Handle collecting powerups
function collectPowerup(powerup) {
LK.getSound('powerupCollect').play();
pigeon.activatePowerup(powerup.type);
// Visual feedback
LK.effects.flashObject(pigeon, 0xFFFFFF, 500);
}
// Handle pigeon hit by enemy
function pigeonHit() {
if (pigeon.powerups.shield > 0) {
// Shield absorbs hit
pigeon.powerups.shield = 0;
LK.effects.flashObject(pigeon, 0x0000FF, 500);
return;
}
lives--;
updateUI();
LK.getSound('pigeonHit').play();
LK.effects.flashObject(pigeon, 0xFF0000, 500);
if (lives <= 0) {
gameOver();
}
}
// Handle level completion
function checkLevelComplete() {
// Level up after certain score thresholds
var nextLevelThreshold = level * 100;
if (score >= nextLevelThreshold) {
level++;
storage.level = level;
// Update spawn rate for new level
spawnRate = Math.max(120 - level * 10, 30);
// Update UI
updateUI();
// Visual effect for level up
LK.effects.flashScreen(0xFFFFFF, 500);
}
}
// Game over function
function gameOver() {
isGameOver = true;
// Update high score if needed
if (score > storage.highScore) {
storage.highScore = score;
}
// Show game over screen
LK.showGameOver();
}
// Spawn a power-up
function spawnPowerup(x, y) {
var powerupTypes = ['multishot', 'speed', 'shield'];
var type = powerupTypes[Math.floor(Math.random() * powerupTypes.length)];
var powerup = new PowerUp(type);
powerup.x = x;
powerup.y = y;
game.addChild(powerup);
game.powerups.push(powerup);
}
// Touch/mouse handlers
game.down = function (x, y, obj) {
// Move pigeon to touch position (x only)
pigeon.x = x;
};
game.move = function (x, y, obj) {
// Only update position if pressed
if (obj.pressed) {
pigeon.x = x;
}
};
// Game update loop
game.update = function () {
if (isGameOver) {
return;
}
// Update player
pigeon.update();
// Spawn enemies
if (LK.ticks - lastSpawn >= spawnRate) {
spawnEnemy();
lastSpawn = LK.ticks;
}
// Update breadcrumbs
for (var i = game.breadcrumbs.length - 1; i >= 0; i--) {
var breadcrumb = game.breadcrumbs[i];
// Remove if off screen
if (breadcrumb.y < -50) {
breadcrumb.destroy();
game.breadcrumbs.splice(i, 1);
continue;
}
// Check for collisions with enemies
for (var j = game.enemies.length - 1; j >= 0; j--) {
var enemy = game.enemies[j];
if (breadcrumb.intersects(enemy)) {
// Handle hit
var defeated = enemy.takeDamage(breadcrumb.damage);
if (defeated) {
// Add score
score += enemy.points;
updateUI();
// Chance to spawn powerup
if (Math.random() < powerupChance) {
spawnPowerup(enemy.x, enemy.y);
}
// Remove enemy
enemy.destroy();
game.enemies.splice(j, 1);
// Play sound
LK.getSound('enemyHit').play();
}
// Remove breadcrumb
breadcrumb.destroy();
game.breadcrumbs.splice(i, 1);
break;
}
}
}
// Update enemies
for (var i = game.enemies.length - 1; i >= 0; i--) {
var enemy = game.enemies[i];
// Check if enemy passed bottom of screen
if (enemy.y > 2732 + 100) {
// Player loses a life
pigeonHit();
// Remove enemy
enemy.destroy();
game.enemies.splice(i, 1);
continue;
}
// Check collision with pigeon
if (enemy.intersects(pigeon)) {
// Player loses a life
pigeonHit();
// Remove enemy
enemy.destroy();
game.enemies.splice(i, 1);
continue;
}
}
// Update powerups
for (var i = game.powerups.length - 1; i >= 0; i--) {
var powerup = game.powerups[i];
// Remove if off screen
if (powerup.y > 2732 + 50) {
powerup.destroy();
game.powerups.splice(i, 1);
continue;
}
// Check collision with pigeon
if (powerup.intersects(pigeon)) {
collectPowerup(powerup);
// Remove powerup
powerup.destroy();
game.powerups.splice(i, 1);
continue;
}
}
// Check for level completion
checkLevelComplete();
};
// Initialize game
initGame();