/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy Type 1: Basic Enemy - moves straight down var BasicEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xff0000 }); self.speed = 2; self.points = 10; self.health = 1; self.type = 'basic'; self.update = function () { self.y += self.speed; }; return self; }); // Enemy Type 6: Boss Enemy - large, slow, high health var BossEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xffff00, scaleX: 2, scaleY: 2 }); self.speed = 0.5; self.points = 200; self.health = 10; self.type = 'boss'; self.update = function () { self.y += self.speed; }; return self; }); // Legacy Enemy for compatibility // Enemy Type 2: Fast Enemy - moves faster var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x00ff00, scaleX: 0.8, scaleY: 0.8 }); self.speed = 5; self.points = 20; self.health = 1; self.type = 'fast'; self.update = function () { self.y += self.speed; }; return self; }); // Gold Coin class for collectible coins var GoldCoin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('flower', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700, scaleX: 0.8, scaleY: 0.8 }); self.speedY = 2 + Math.random() * 3; // Downward speed self.speedX = (Math.random() - 0.5) * 8; // Random horizontal speed self.gravity = 0.15; self.bounce = 0.7; self.life = 0; self.maxLife = 600; // 10 seconds at 60fps self.value = 5; // Points value // Add floating animation tween(coinGraphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeInOut }); self.update = function () { self.life++; // Apply physics self.speedY += self.gravity; self.x += self.speedX; self.y += self.speedY; // Bounce off ground if (self.y >= 2732 - 100) { self.y = 2732 - 100; self.speedY *= -self.bounce; self.speedX *= 0.8; // Friction } // Bounce off walls if (self.x <= 50 || self.x >= 1998) { self.speedX *= -1; } // Add floating effect coinGraphics.rotation += 0.1; // Remove after maxLife if (self.life >= self.maxLife) { self.destroy(); for (var i = goldCoins.length - 1; i >= 0; i--) { if (goldCoins[i] === self) { goldCoins.splice(i, 1); break; } } } }; return self; }); // Set background var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('heroBox', { anchorX: 0.5, anchorY: 0.5 }); self.fireRate = 5; // Fire every 5 ticks (4x faster) self.lastFire = 0; self.barrels = 1; // Start with 1 barrel self.update = function () { // Auto fire bullets if (LK.ticks - self.lastFire > self.fireRate) { self.lastFire = LK.ticks; // Fire bullets from multiple barrels for (var b = 0; b < self.barrels; b++) { var bullet = new HeroBullet(); // Calculate bullet position to spread horizontally toward top of screen var totalWidth = (self.barrels - 1) * 80; // 80 pixels apart horizontally var offsetX = b * 80 - totalWidth / 2; // Center the spread bullet.x = self.x + offsetX; bullet.y = self.y - 50; heroBullets.push(bullet); game.addChild(bullet); // Create small smoke effect when firing createSmokeEffect(bullet.x, bullet.y + 10, 0.3); } } }; return self; }); var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('heroBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -60; self.update = function () { self.y += self.speed; }; return self; }); // Smoke Particle class for realistic flame smoke effects var SmokeParticle = Container.expand(function () { var self = Container.call(this); var smokeGraphics = self.attachAsset('flower', { anchorX: 0.5, anchorY: 0.5, tint: 0x666666, alpha: 0.8 }); self.speed = -1 - Math.random() * 2; // Upward movement with variation self.drift = (Math.random() - 0.5) * 3; // Horizontal drift self.life = 0; self.maxLife = 60 + Math.random() * 40; // 1-1.5 seconds at 60fps self.initialScale = 0.5 + Math.random() * 0.5; self.targetScale = self.initialScale * (2 + Math.random() * 2); // Set initial scale smokeGraphics.scaleX = self.initialScale; smokeGraphics.scaleY = self.initialScale; // Start scaling and fading animation tween(smokeGraphics, { scaleX: self.targetScale, scaleY: self.targetScale, alpha: 0 }, { duration: self.maxLife * 16.67, // Convert ticks to milliseconds easing: tween.easeOut }); self.update = function () { self.life++; self.y += self.speed; self.x += self.drift; // Add some turbulence self.x += Math.sin(self.life * 0.1) * 0.5; // Remove when life expires if (self.life >= self.maxLife) { self.destroy(); // Remove from smoke particles array for (var i = smokeParticles.length - 1; i >= 0; i--) { if (smokeParticles[i] === self) { smokeParticles.splice(i, 1); break; } } } }; return self; }); // Enemy Type 5: Spinner Enemy - rotates while moving var SpinnerEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0xff00ff }); self.speed = 2.5; self.points = 25; self.health = 2; self.type = 'spinner'; self.rotationSpeed = 0.1; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; return self; }); // Enemy Type 3: Tank Enemy - slow but strong var TankEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x888888, scaleX: 1.5, scaleY: 1.5 }); self.speed = 1; self.points = 50; self.health = 3; self.type = 'tank'; self.update = function () { self.y += self.speed; }; return self; }); // Enemy Type 4: Zigzag Enemy - moves in zigzag pattern var ZigzagEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemyBox', { anchorX: 0.5, anchorY: 0.5, tint: 0x0000ff }); self.speed = 2; self.points = 30; self.health = 1; self.type = 'zigzag'; self.direction = 1; self.zigzagSpeed = 3; self.update = function () { self.y += self.speed; self.x += self.direction * self.zigzagSpeed; // Change direction if hitting screen edges if (self.x <= 100 || self.x >= 1948) { self.direction *= -1; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Set background // Legacy Enemy for compatibility var Enemy = BasicEnemy; game.setBackgroundColor(0x87CEEB); // Light sky blue color // Add multiple cloud elements to create a cloudy sky effect var cloud1 = LK.getAsset('manzara', { width: 300, height: 150, scaleX: 3, scaleY: 1.5, alpha: 0.6, tint: 0xFFFFFF, x: 200, y: 300 }); game.addChildAt(cloud1, 0); var cloud2 = LK.getAsset('manzara', { width: 400, height: 200, scaleX: 4, scaleY: 2, alpha: 0.4, tint: 0xF0F8FF, x: 800, y: 150 }); game.addChildAt(cloud2, 0); var cloud3 = LK.getAsset('manzara', { width: 350, height: 180, scaleX: 3.5, scaleY: 1.8, alpha: 0.5, tint: 0xFFFFFF, x: 1400, y: 400 }); game.addChildAt(cloud3, 0); var cloud4 = LK.getAsset('manzara', { width: 250, height: 120, scaleX: 2.5, scaleY: 1.2, alpha: 0.7, tint: 0xF5F5F5, x: 1600, y: 200 }); game.addChildAt(cloud4, 0); var cloud5 = LK.getAsset('manzara', { width: 300, height: 160, scaleX: 3, scaleY: 1.6, alpha: 0.3, tint: 0xFFFFFF, x: 100, y: 600 }); game.addChildAt(cloud5, 0); // Game variables var hero; var enemies = []; var heroBullets = []; var smokeParticles = []; var goldCoins = []; var waveNumber = 1; var enemiesSpawned = 0; var enemiesPerWave = 5; var spawnTimer = 0; var spawnRate = 60; // Spawn every 60 ticks initially var dragNode = null; // Create hero hero = new Hero(); hero.x = 2048 / 2; hero.y = 2732 - 200; game.addChild(hero); // Score display var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Wave display var waveTxt = new Text2('Wave: 1', { size: 60, fill: 0xFFFF00 }); waveTxt.anchor.set(0, 0); waveTxt.x = 50; waveTxt.y = 50; LK.gui.topLeft.addChild(waveTxt); // Function to create smoke effect function createSmokeEffect(x, y, intensity) { intensity = intensity || 1; var particleCount = 3 + Math.floor(Math.random() * 5) * intensity; for (var i = 0; i < particleCount; i++) { var smoke = new SmokeParticle(); smoke.x = x + (Math.random() - 0.5) * 30; smoke.y = y + (Math.random() - 0.5) * 20; smokeParticles.push(smoke); game.addChild(smoke); } } // Function to drop gold coins when enemy dies function dropGoldCoins(x, y, enemyType) { var coinCount = 3 + Math.floor(Math.random() * 2); // 3-4 coins // Boss enemies drop more coins if (enemyType === 'boss') { coinCount += 2; } for (var i = 0; i < coinCount; i++) { var coin = new GoldCoin(); coin.x = x + (Math.random() - 0.5) * 50; coin.y = y + (Math.random() - 0.5) * 30; // Add some initial velocity spread coin.speedX = (Math.random() - 0.5) * 12; coin.speedY = -2 - Math.random() * 4; goldCoins.push(coin); game.addChild(coin); } } // Touch controls game.down = function (x, y, obj) { dragNode = hero; hero.x = x; hero.y = y; }; game.move = function (x, y, obj) { if (dragNode) { dragNode.x = x; dragNode.y = y; } }; game.up = function (x, y, obj) { dragNode = null; }; // Main game loop game.update = function () { // Spawn enemies spawnTimer++; if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) { spawnTimer = 0; var enemy; var enemyType = Math.random(); // Spawn different enemy types based on wave number and random chance if (waveNumber >= 10 && enemyType < 0.1) { // Boss enemy (10% chance after wave 10) enemy = new BossEnemy(); } else if (waveNumber >= 7 && enemyType < 0.25) { // Spinner enemy (15% chance after wave 7) enemy = new SpinnerEnemy(); } else if (waveNumber >= 5 && enemyType < 0.4) { // Zigzag enemy (15% chance after wave 5) enemy = new ZigzagEnemy(); } else if (waveNumber >= 3 && enemyType < 0.6) { // Tank enemy (20% chance after wave 3) enemy = new TankEnemy(); } else if (waveNumber >= 2 && enemyType < 0.8) { // Fast enemy (20% chance after wave 2) enemy = new FastEnemy(); } else { // Basic enemy (always available, 20% chance in later waves) enemy = new BasicEnemy(); } enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = -100; // Apply wave speed modifier to base speed enemy.speed = enemy.speed + waveNumber * 0.3; enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } // Update and check bullet collisions for (var i = heroBullets.length - 1; i >= 0; i--) { var bullet = heroBullets[i]; // Remove bullets that go off screen if (bullet.y < -50) { bullet.destroy(); heroBullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Enemy hit - reduce health enemy.health--; // Remove bullet bullet.destroy(); heroBullets.splice(i, 1); // Check if enemy is destroyed if (enemy.health <= 0) { LK.setScore(LK.getScore() + enemy.points); scoreTxt.setText('Score: ' + LK.getScore()); // Create smoke effect when enemy is destroyed createSmokeEffect(enemy.x, enemy.y, enemy.type === 'boss' ? 3 : 1); // Drop gold coins when enemy dies dropGoldCoins(enemy.x, enemy.y, enemy.type); enemy.destroy(); enemies.splice(j, 1); } else { // Enemy damaged but not destroyed - flash red and create small smoke LK.effects.flashObject(enemy, 0xff0000, 200); createSmokeEffect(enemy.x, enemy.y, 0.5); } break; } } } // Update and check enemy collisions with hero for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; // Check if enemy reached hero if (enemy.intersects(hero)) { LK.showGameOver(); return; } // Remove enemies that go off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(k, 1); } } // Update and check gold coin collection for (var c = goldCoins.length - 1; c >= 0; c--) { var coin = goldCoins[c]; // Check if hero collects coin if (coin.intersects(hero)) { LK.setScore(LK.getScore() + coin.value); scoreTxt.setText('Score: ' + LK.getScore()); // Add collection effect tween(coin, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { coin.destroy(); } }); goldCoins.splice(c, 1); LK.getSound('4581').play(); } } // Check if wave is complete if (enemies.length === 0 && enemiesSpawned >= enemiesPerWave) { waveNumber++; waveTxt.setText('Wave: ' + waveNumber); enemiesSpawned = 0; enemiesPerWave = Math.min(5 + waveNumber, 15); // Increase enemies per wave spawnRate = Math.max(30, 60 - waveNumber * 2); // Decrease spawn rate // Increase barrels every 5 waves hero.barrels = Math.floor(waveNumber / 5) + 1; } }; // Start background music LK.playMusic('1a439');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Type 1: Basic Enemy - moves straight down
var BasicEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff0000
});
self.speed = 2;
self.points = 10;
self.health = 1;
self.type = 'basic';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Type 6: Boss Enemy - large, slow, high health
var BossEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xffff00,
scaleX: 2,
scaleY: 2
});
self.speed = 0.5;
self.points = 200;
self.health = 10;
self.type = 'boss';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Legacy Enemy for compatibility
// Enemy Type 2: Fast Enemy - moves faster
var FastEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00ff00,
scaleX: 0.8,
scaleY: 0.8
});
self.speed = 5;
self.points = 20;
self.health = 1;
self.type = 'fast';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Gold Coin class for collectible coins
var GoldCoin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('flower', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xFFD700,
scaleX: 0.8,
scaleY: 0.8
});
self.speedY = 2 + Math.random() * 3; // Downward speed
self.speedX = (Math.random() - 0.5) * 8; // Random horizontal speed
self.gravity = 0.15;
self.bounce = 0.7;
self.life = 0;
self.maxLife = 600; // 10 seconds at 60fps
self.value = 5; // Points value
// Add floating animation
tween(coinGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.easeInOut
});
self.update = function () {
self.life++;
// Apply physics
self.speedY += self.gravity;
self.x += self.speedX;
self.y += self.speedY;
// Bounce off ground
if (self.y >= 2732 - 100) {
self.y = 2732 - 100;
self.speedY *= -self.bounce;
self.speedX *= 0.8; // Friction
}
// Bounce off walls
if (self.x <= 50 || self.x >= 1998) {
self.speedX *= -1;
}
// Add floating effect
coinGraphics.rotation += 0.1;
// Remove after maxLife
if (self.life >= self.maxLife) {
self.destroy();
for (var i = goldCoins.length - 1; i >= 0; i--) {
if (goldCoins[i] === self) {
goldCoins.splice(i, 1);
break;
}
}
}
};
return self;
});
// Set background
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('heroBox', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 5; // Fire every 5 ticks (4x faster)
self.lastFire = 0;
self.barrels = 1; // Start with 1 barrel
self.update = function () {
// Auto fire bullets
if (LK.ticks - self.lastFire > self.fireRate) {
self.lastFire = LK.ticks;
// Fire bullets from multiple barrels
for (var b = 0; b < self.barrels; b++) {
var bullet = new HeroBullet();
// Calculate bullet position to spread horizontally toward top of screen
var totalWidth = (self.barrels - 1) * 80; // 80 pixels apart horizontally
var offsetX = b * 80 - totalWidth / 2; // Center the spread
bullet.x = self.x + offsetX;
bullet.y = self.y - 50;
heroBullets.push(bullet);
game.addChild(bullet);
// Create small smoke effect when firing
createSmokeEffect(bullet.x, bullet.y + 10, 0.3);
}
}
};
return self;
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('heroBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -60;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Smoke Particle class for realistic flame smoke effects
var SmokeParticle = Container.expand(function () {
var self = Container.call(this);
var smokeGraphics = self.attachAsset('flower', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x666666,
alpha: 0.8
});
self.speed = -1 - Math.random() * 2; // Upward movement with variation
self.drift = (Math.random() - 0.5) * 3; // Horizontal drift
self.life = 0;
self.maxLife = 60 + Math.random() * 40; // 1-1.5 seconds at 60fps
self.initialScale = 0.5 + Math.random() * 0.5;
self.targetScale = self.initialScale * (2 + Math.random() * 2);
// Set initial scale
smokeGraphics.scaleX = self.initialScale;
smokeGraphics.scaleY = self.initialScale;
// Start scaling and fading animation
tween(smokeGraphics, {
scaleX: self.targetScale,
scaleY: self.targetScale,
alpha: 0
}, {
duration: self.maxLife * 16.67,
// Convert ticks to milliseconds
easing: tween.easeOut
});
self.update = function () {
self.life++;
self.y += self.speed;
self.x += self.drift;
// Add some turbulence
self.x += Math.sin(self.life * 0.1) * 0.5;
// Remove when life expires
if (self.life >= self.maxLife) {
self.destroy();
// Remove from smoke particles array
for (var i = smokeParticles.length - 1; i >= 0; i--) {
if (smokeParticles[i] === self) {
smokeParticles.splice(i, 1);
break;
}
}
}
};
return self;
});
// Enemy Type 5: Spinner Enemy - rotates while moving
var SpinnerEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff00ff
});
self.speed = 2.5;
self.points = 25;
self.health = 2;
self.type = 'spinner';
self.rotationSpeed = 0.1;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
};
return self;
});
// Enemy Type 3: Tank Enemy - slow but strong
var TankEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x888888,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 1;
self.points = 50;
self.health = 3;
self.type = 'tank';
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Type 4: Zigzag Enemy - moves in zigzag pattern
var ZigzagEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyBox', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x0000ff
});
self.speed = 2;
self.points = 30;
self.health = 1;
self.type = 'zigzag';
self.direction = 1;
self.zigzagSpeed = 3;
self.update = function () {
self.y += self.speed;
self.x += self.direction * self.zigzagSpeed;
// Change direction if hitting screen edges
if (self.x <= 100 || self.x >= 1948) {
self.direction *= -1;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Set background
// Legacy Enemy for compatibility
var Enemy = BasicEnemy;
game.setBackgroundColor(0x87CEEB); // Light sky blue color
// Add multiple cloud elements to create a cloudy sky effect
var cloud1 = LK.getAsset('manzara', {
width: 300,
height: 150,
scaleX: 3,
scaleY: 1.5,
alpha: 0.6,
tint: 0xFFFFFF,
x: 200,
y: 300
});
game.addChildAt(cloud1, 0);
var cloud2 = LK.getAsset('manzara', {
width: 400,
height: 200,
scaleX: 4,
scaleY: 2,
alpha: 0.4,
tint: 0xF0F8FF,
x: 800,
y: 150
});
game.addChildAt(cloud2, 0);
var cloud3 = LK.getAsset('manzara', {
width: 350,
height: 180,
scaleX: 3.5,
scaleY: 1.8,
alpha: 0.5,
tint: 0xFFFFFF,
x: 1400,
y: 400
});
game.addChildAt(cloud3, 0);
var cloud4 = LK.getAsset('manzara', {
width: 250,
height: 120,
scaleX: 2.5,
scaleY: 1.2,
alpha: 0.7,
tint: 0xF5F5F5,
x: 1600,
y: 200
});
game.addChildAt(cloud4, 0);
var cloud5 = LK.getAsset('manzara', {
width: 300,
height: 160,
scaleX: 3,
scaleY: 1.6,
alpha: 0.3,
tint: 0xFFFFFF,
x: 100,
y: 600
});
game.addChildAt(cloud5, 0);
// Game variables
var hero;
var enemies = [];
var heroBullets = [];
var smokeParticles = [];
var goldCoins = [];
var waveNumber = 1;
var enemiesSpawned = 0;
var enemiesPerWave = 5;
var spawnTimer = 0;
var spawnRate = 60; // Spawn every 60 ticks initially
var dragNode = null;
// Create hero
hero = new Hero();
hero.x = 2048 / 2;
hero.y = 2732 - 200;
game.addChild(hero);
// Score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Wave display
var waveTxt = new Text2('Wave: 1', {
size: 60,
fill: 0xFFFF00
});
waveTxt.anchor.set(0, 0);
waveTxt.x = 50;
waveTxt.y = 50;
LK.gui.topLeft.addChild(waveTxt);
// Function to create smoke effect
function createSmokeEffect(x, y, intensity) {
intensity = intensity || 1;
var particleCount = 3 + Math.floor(Math.random() * 5) * intensity;
for (var i = 0; i < particleCount; i++) {
var smoke = new SmokeParticle();
smoke.x = x + (Math.random() - 0.5) * 30;
smoke.y = y + (Math.random() - 0.5) * 20;
smokeParticles.push(smoke);
game.addChild(smoke);
}
}
// Function to drop gold coins when enemy dies
function dropGoldCoins(x, y, enemyType) {
var coinCount = 3 + Math.floor(Math.random() * 2); // 3-4 coins
// Boss enemies drop more coins
if (enemyType === 'boss') {
coinCount += 2;
}
for (var i = 0; i < coinCount; i++) {
var coin = new GoldCoin();
coin.x = x + (Math.random() - 0.5) * 50;
coin.y = y + (Math.random() - 0.5) * 30;
// Add some initial velocity spread
coin.speedX = (Math.random() - 0.5) * 12;
coin.speedY = -2 - Math.random() * 4;
goldCoins.push(coin);
game.addChild(coin);
}
}
// Touch controls
game.down = function (x, y, obj) {
dragNode = hero;
hero.x = x;
hero.y = y;
};
game.move = function (x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
// Spawn enemies
spawnTimer++;
if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) {
spawnTimer = 0;
var enemy;
var enemyType = Math.random();
// Spawn different enemy types based on wave number and random chance
if (waveNumber >= 10 && enemyType < 0.1) {
// Boss enemy (10% chance after wave 10)
enemy = new BossEnemy();
} else if (waveNumber >= 7 && enemyType < 0.25) {
// Spinner enemy (15% chance after wave 7)
enemy = new SpinnerEnemy();
} else if (waveNumber >= 5 && enemyType < 0.4) {
// Zigzag enemy (15% chance after wave 5)
enemy = new ZigzagEnemy();
} else if (waveNumber >= 3 && enemyType < 0.6) {
// Tank enemy (20% chance after wave 3)
enemy = new TankEnemy();
} else if (waveNumber >= 2 && enemyType < 0.8) {
// Fast enemy (20% chance after wave 2)
enemy = new FastEnemy();
} else {
// Basic enemy (always available, 20% chance in later waves)
enemy = new BasicEnemy();
}
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -100;
// Apply wave speed modifier to base speed
enemy.speed = enemy.speed + waveNumber * 0.3;
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
// Update and check bullet collisions
for (var i = heroBullets.length - 1; i >= 0; i--) {
var bullet = heroBullets[i];
// Remove bullets that go off screen
if (bullet.y < -50) {
bullet.destroy();
heroBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy hit - reduce health
enemy.health--;
// Remove bullet
bullet.destroy();
heroBullets.splice(i, 1);
// Check if enemy is destroyed
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + enemy.points);
scoreTxt.setText('Score: ' + LK.getScore());
// Create smoke effect when enemy is destroyed
createSmokeEffect(enemy.x, enemy.y, enemy.type === 'boss' ? 3 : 1);
// Drop gold coins when enemy dies
dropGoldCoins(enemy.x, enemy.y, enemy.type);
enemy.destroy();
enemies.splice(j, 1);
} else {
// Enemy damaged but not destroyed - flash red and create small smoke
LK.effects.flashObject(enemy, 0xff0000, 200);
createSmokeEffect(enemy.x, enemy.y, 0.5);
}
break;
}
}
}
// Update and check enemy collisions with hero
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
// Check if enemy reached hero
if (enemy.intersects(hero)) {
LK.showGameOver();
return;
}
// Remove enemies that go off screen
if (enemy.y > 2732 + 100) {
enemy.destroy();
enemies.splice(k, 1);
}
}
// Update and check gold coin collection
for (var c = goldCoins.length - 1; c >= 0; c--) {
var coin = goldCoins[c];
// Check if hero collects coin
if (coin.intersects(hero)) {
LK.setScore(LK.getScore() + coin.value);
scoreTxt.setText('Score: ' + LK.getScore());
// Add collection effect
tween(coin, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
coin.destroy();
}
});
goldCoins.splice(c, 1);
LK.getSound('4581').play();
}
}
// Check if wave is complete
if (enemies.length === 0 && enemiesSpawned >= enemiesPerWave) {
waveNumber++;
waveTxt.setText('Wave: ' + waveNumber);
enemiesSpawned = 0;
enemiesPerWave = Math.min(5 + waveNumber, 15); // Increase enemies per wave
spawnRate = Math.max(30, 60 - waveNumber * 2); // Decrease spawn rate
// Increase barrels every 5 waves
hero.barrels = Math.floor(waveNumber / 5) + 1;
}
};
// Start background music
LK.playMusic('1a439');
uzay aracı olsun . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
ahtapot şekilli canavar olsun. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
uzay aracı olsun . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
sky
ağaç. In-Game asset. 2d. High contrast. No shadows
çimen uzun. In-Game asset. 2d. High contrast. No shadows
koyun beyaz. In-Game asset. 2d. High contrast. No shadows
inek kahverengi beyaz.. In-Game asset. 2d. High contrast. No shadows
uçan renkli papağan gerçekçi olsun.. In-Game asset. 2d. High contrast. No shadows
duman alev efekti.. In-Game asset. 2d. High contrast. No shadows