/****
* 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.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = 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.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * 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.hp = 20;
self.speed = 1;
self.damage = 10;
self.lastDamageTime = 0;
self.update = function () {
if (!player) return;
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;
}
// Damage player on contact
if (distance < 40) {
player.takeDamage(self.damage);
}
};
self.takeDamage = function (damage) {
self.hp -= damage;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.hp <= 0) {
self.die();
}
};
self.die = function () {
// Spawn XP crystal
var crystal = new XPCrystal();
crystal.x = self.x;
crystal.y = self.y;
game.addChild(crystal);
xpCrystals.push(crystal);
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 100;
self.maxHp = 100;
self.speed = 4;
self.level = 1;
self.xp = 0;
self.xpToNext = 100;
self.update = function () {
// Constrain player to screen bounds
if (self.x < 30) self.x = 30;
if (self.x > 2018) self.x = 2018;
if (self.y < 30) self.y = 30;
if (self.y > 2702) self.y = 2702;
};
self.takeDamage = function (damage) {
self.hp -= damage;
self.hp = Math.max(0, self.hp); // Ensure HP doesn't go below 0
LK.effects.flashObject(self, 0xff0000, 300);
if (self.hp <= 0) {
LK.showGameOver();
}
};
self.gainXP = function (amount) {
self.xp += amount;
if (self.xp >= self.xpToNext) {
self.levelUp();
}
};
self.levelUp = function () {
self.level++;
self.xp = 0;
self.xpToNext = Math.floor(self.xpToNext * 1.2);
LK.getSound('levelup').play();
// Auto-apply damage boost on level up
player.damage = (player.damage || 25) + 5;
};
return self;
});
var XPCrystal = Container.expand(function () {
var self = Container.call(this);
var crystalGraphics = self.attachAsset('xpCrystal', {
anchorX: 0.5,
anchorY: 0.5
});
self.value = 20;
self.attractDistance = 120;
self.collectDistance = 30;
self.update = function () {
if (!player) return;
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Attract to player when close
if (distance < self.attractDistance && distance > self.collectDistance) {
var attractSpeed = 3;
self.x += dx / distance * attractSpeed;
self.y += dy / distance * attractSpeed;
}
// Collect when very close
if (distance < self.collectDistance) {
player.gainXP(self.value);
LK.getSound('pickup').play();
self.collect();
}
};
self.collect = function () {
// Remove from array and destroy
for (var i = xpCrystals.length - 1; i >= 0; i--) {
if (xpCrystals[i] === self) {
xpCrystals.splice(i, 1);
break;
}
}
self.destroy();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var xpCrystals = [];
var waveNumber = 1;
var enemiesKilled = 0;
var enemiesInWave = 5;
var lastShootTime = 0;
var shootCooldown = 20;
var perkSelectionActive = false;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var hpText = new Text2('HP: 100/100', {
size: 50,
fill: 0xFF4444
});
hpText.anchor.set(0, 0);
LK.gui.topLeft.addChild(hpText);
hpText.x = 120;
var levelText = new Text2('Level: 1', {
size: 50,
fill: 0x44FF44
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var waveText = new Text2('Wave: 1', {
size: 50,
fill: 0x4444FF
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
waveText.y = 70;
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
// Perk system
var availablePerks = [{
name: "More HP",
description: "Increase max HP by 20",
rarity: "common"
}, {
name: "Faster Shooting",
description: "Reduce shooting cooldown",
rarity: "common"
}, {
name: "Speed Boost",
description: "Increase movement speed",
rarity: "common"
}, {
name: "Damage Up",
description: "Increase bullet damage",
rarity: "rare"
}, {
name: "Multi Shot",
description: "Fire additional bullets",
rarity: "rare"
}, {
name: "Life Steal",
description: "Heal when dealing damage",
rarity: "epic"
}];
function showPerkSelection() {
perkSelectionActive = true;
// Create perk selection UI
var perkContainer = new Container();
perkContainer.x = 1024;
perkContainer.y = 1366;
var bg = LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 15,
scaleY: 8,
alpha: 0.8
});
bg.tint = 0x000000;
perkContainer.addChild(bg);
var titleText = new Text2('Choose a Perk!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -200;
perkContainer.addChild(titleText);
// Select 3 random perks
var selectedPerks = [];
for (var i = 0; i < 3; i++) {
var randomPerk = availablePerks[Math.floor(Math.random() * availablePerks.length)];
selectedPerks.push(randomPerk);
}
// Create perk buttons
for (var i = 0; i < 3; i++) {
var perkButton = createPerkButton(selectedPerks[i], i, perkContainer);
}
LK.gui.center.addChild(perkContainer);
// Store reference for cleanup
game.perkContainer = perkContainer;
}
function createPerkButton(perk, index, parent) {
var button = new Container();
button.x = (index - 1) * 400;
button.y = 0;
var buttonBg = LK.getAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 3
});
buttonBg.tint = 0x444444;
button.addChild(buttonBg);
var nameText = new Text2(perk.name, {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = -40;
button.addChild(nameText);
var descText = new Text2(perk.description, {
size: 40,
fill: 0xCCCCCC
});
descText.anchor.set(0.5, 0.5);
descText.y = 20;
button.addChild(descText);
button.down = function (x, y, obj) {
applyPerk(perk);
LK.gui.center.removeChild(game.perkContainer);
perkSelectionActive = false;
game.perkContainer = null;
};
parent.addChild(button);
return button;
}
function applyPerk(perk) {
switch (perk.name) {
case "More HP":
player.maxHp += 20;
player.hp += 20;
break;
case "Faster Shooting":
shootCooldown = Math.max(5, shootCooldown - 5);
break;
case "Speed Boost":
player.speed += 1;
break;
case "Damage Up":
// This would modify bullet damage globally
break;
case "Multi Shot":
// This would modify shooting behavior
break;
case "Life Steal":
// This would add healing on damage
break;
}
}
function spawnWave() {
enemiesInWave = 15 + waveNumber * 5;
for (var i = 0; i < enemiesInWave; i++) {
var enemy = new Enemy();
// Spawn from edges
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 = 2098;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2782;
break;
case 3:
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
// Create different enemy variants based on wave number
var enemyType = Math.floor(Math.random() * 4);
switch (waveNumber % 4) {
case 1:
// Wave 1: Basic yellow cubes
enemy.hp = 20 + waveNumber * 3;
enemy.speed = 1 + waveNumber * 0.1;
enemy.damage = 8 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow
break;
case 2:
// Wave 2: Fast red sprinters
if (enemyType < 2) {
enemy.hp = 15 + waveNumber * 2;
enemy.speed = 2.5 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red
} else {
enemy.hp = 30 + waveNumber * 4;
enemy.speed = 0.8 + waveNumber * 0.1;
enemy.damage = 15 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
case 3:
// Wave 3: Mix with purple wisps
if (enemyType < 1) {
enemy.hp = 12 + waveNumber * 2;
enemy.speed = 1.8 + waveNumber * 0.2;
enemy.damage = 10 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisps
} else if (enemyType < 3) {
enemy.hp = 25 + waveNumber * 3;
enemy.speed = 1.2 + waveNumber * 0.15;
enemy.damage = 14 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red sprinters
} else {
enemy.hp = 35 + waveNumber * 5;
enemy.speed = 0.7 + waveNumber * 0.1;
enemy.damage = 18 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
default:
// Wave 4+: All enemy types with scaling
if (enemyType === 0) {
enemy.hp = 15 + waveNumber * 4;
enemy.speed = 2.8 + waveNumber * 0.4;
enemy.damage = 15 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Fast red
} else if (enemyType === 1) {
enemy.hp = 45 + waveNumber * 6;
enemy.speed = 0.6 + waveNumber * 0.1;
enemy.damage = 22 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Tanky blue
} else if (enemyType === 2) {
enemy.hp = 18 + waveNumber * 3;
enemy.speed = 2.2 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisp
} else {
enemy.hp = 25 + waveNumber * 4;
enemy.speed = 1.5 + waveNumber * 0.2;
enemy.damage = 16 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow basic
}
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
}
function findNearestEnemy() {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
}
var dragNode = null;
game.move = function (x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
};
game.down = function (x, y, obj) {
dragNode = player;
player.x = x;
player.y = y;
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn initial wave
spawnWave();
game.update = function () {
// Update UI
hpText.setText('HP: ' + player.hp + '/' + player.maxHp);
levelText.setText('Level: ' + player.level);
waveText.setText('Wave: ' + waveNumber);
// Auto-shoot at nearest enemy
if (LK.ticks - lastShootTime > shootCooldown) {
var target = findNearestEnemy();
if (target) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
lastShootTime = LK.ticks;
}
}
// Update bullets and check collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
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)) {
enemy.takeDamage(bullet.damage);
if (enemy.hp <= 0) {
enemy.destroy();
enemies.splice(j, 1);
enemiesKilled++;
}
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Check if wave is complete
if (enemies.length === 0) {
waveNumber++;
enemiesKilled = 0;
spawnWave();
}
}; /****
* 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.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = 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.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * 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.hp = 20;
self.speed = 1;
self.damage = 10;
self.lastDamageTime = 0;
self.update = function () {
if (!player) return;
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;
}
// Damage player on contact
if (distance < 40) {
player.takeDamage(self.damage);
}
};
self.takeDamage = function (damage) {
self.hp -= damage;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.hp <= 0) {
self.die();
}
};
self.die = function () {
// Spawn XP crystal
var crystal = new XPCrystal();
crystal.x = self.x;
crystal.y = self.y;
game.addChild(crystal);
xpCrystals.push(crystal);
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 100;
self.maxHp = 100;
self.speed = 4;
self.level = 1;
self.xp = 0;
self.xpToNext = 100;
self.update = function () {
// Constrain player to screen bounds
if (self.x < 30) self.x = 30;
if (self.x > 2018) self.x = 2018;
if (self.y < 30) self.y = 30;
if (self.y > 2702) self.y = 2702;
};
self.takeDamage = function (damage) {
self.hp -= damage;
self.hp = Math.max(0, self.hp); // Ensure HP doesn't go below 0
LK.effects.flashObject(self, 0xff0000, 300);
if (self.hp <= 0) {
LK.showGameOver();
}
};
self.gainXP = function (amount) {
self.xp += amount;
if (self.xp >= self.xpToNext) {
self.levelUp();
}
};
self.levelUp = function () {
self.level++;
self.xp = 0;
self.xpToNext = Math.floor(self.xpToNext * 1.2);
LK.getSound('levelup').play();
// Auto-apply damage boost on level up
player.damage = (player.damage || 25) + 5;
};
return self;
});
var XPCrystal = Container.expand(function () {
var self = Container.call(this);
var crystalGraphics = self.attachAsset('xpCrystal', {
anchorX: 0.5,
anchorY: 0.5
});
self.value = 20;
self.attractDistance = 120;
self.collectDistance = 30;
self.update = function () {
if (!player) return;
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Attract to player when close
if (distance < self.attractDistance && distance > self.collectDistance) {
var attractSpeed = 3;
self.x += dx / distance * attractSpeed;
self.y += dy / distance * attractSpeed;
}
// Collect when very close
if (distance < self.collectDistance) {
player.gainXP(self.value);
LK.getSound('pickup').play();
self.collect();
}
};
self.collect = function () {
// Remove from array and destroy
for (var i = xpCrystals.length - 1; i >= 0; i--) {
if (xpCrystals[i] === self) {
xpCrystals.splice(i, 1);
break;
}
}
self.destroy();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var xpCrystals = [];
var waveNumber = 1;
var enemiesKilled = 0;
var enemiesInWave = 5;
var lastShootTime = 0;
var shootCooldown = 20;
var perkSelectionActive = false;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var hpText = new Text2('HP: 100/100', {
size: 50,
fill: 0xFF4444
});
hpText.anchor.set(0, 0);
LK.gui.topLeft.addChild(hpText);
hpText.x = 120;
var levelText = new Text2('Level: 1', {
size: 50,
fill: 0x44FF44
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var waveText = new Text2('Wave: 1', {
size: 50,
fill: 0x4444FF
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
waveText.y = 70;
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
// Perk system
var availablePerks = [{
name: "More HP",
description: "Increase max HP by 20",
rarity: "common"
}, {
name: "Faster Shooting",
description: "Reduce shooting cooldown",
rarity: "common"
}, {
name: "Speed Boost",
description: "Increase movement speed",
rarity: "common"
}, {
name: "Damage Up",
description: "Increase bullet damage",
rarity: "rare"
}, {
name: "Multi Shot",
description: "Fire additional bullets",
rarity: "rare"
}, {
name: "Life Steal",
description: "Heal when dealing damage",
rarity: "epic"
}];
function showPerkSelection() {
perkSelectionActive = true;
// Create perk selection UI
var perkContainer = new Container();
perkContainer.x = 1024;
perkContainer.y = 1366;
var bg = LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 15,
scaleY: 8,
alpha: 0.8
});
bg.tint = 0x000000;
perkContainer.addChild(bg);
var titleText = new Text2('Choose a Perk!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -200;
perkContainer.addChild(titleText);
// Select 3 random perks
var selectedPerks = [];
for (var i = 0; i < 3; i++) {
var randomPerk = availablePerks[Math.floor(Math.random() * availablePerks.length)];
selectedPerks.push(randomPerk);
}
// Create perk buttons
for (var i = 0; i < 3; i++) {
var perkButton = createPerkButton(selectedPerks[i], i, perkContainer);
}
LK.gui.center.addChild(perkContainer);
// Store reference for cleanup
game.perkContainer = perkContainer;
}
function createPerkButton(perk, index, parent) {
var button = new Container();
button.x = (index - 1) * 400;
button.y = 0;
var buttonBg = LK.getAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 3
});
buttonBg.tint = 0x444444;
button.addChild(buttonBg);
var nameText = new Text2(perk.name, {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = -40;
button.addChild(nameText);
var descText = new Text2(perk.description, {
size: 40,
fill: 0xCCCCCC
});
descText.anchor.set(0.5, 0.5);
descText.y = 20;
button.addChild(descText);
button.down = function (x, y, obj) {
applyPerk(perk);
LK.gui.center.removeChild(game.perkContainer);
perkSelectionActive = false;
game.perkContainer = null;
};
parent.addChild(button);
return button;
}
function applyPerk(perk) {
switch (perk.name) {
case "More HP":
player.maxHp += 20;
player.hp += 20;
break;
case "Faster Shooting":
shootCooldown = Math.max(5, shootCooldown - 5);
break;
case "Speed Boost":
player.speed += 1;
break;
case "Damage Up":
// This would modify bullet damage globally
break;
case "Multi Shot":
// This would modify shooting behavior
break;
case "Life Steal":
// This would add healing on damage
break;
}
}
function spawnWave() {
enemiesInWave = 15 + waveNumber * 5;
for (var i = 0; i < enemiesInWave; i++) {
var enemy = new Enemy();
// Spawn from edges
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 = 2098;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2782;
break;
case 3:
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
// Create different enemy variants based on wave number
var enemyType = Math.floor(Math.random() * 4);
switch (waveNumber % 4) {
case 1:
// Wave 1: Basic yellow cubes
enemy.hp = 20 + waveNumber * 3;
enemy.speed = 1 + waveNumber * 0.1;
enemy.damage = 8 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow
break;
case 2:
// Wave 2: Fast red sprinters
if (enemyType < 2) {
enemy.hp = 15 + waveNumber * 2;
enemy.speed = 2.5 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red
} else {
enemy.hp = 30 + waveNumber * 4;
enemy.speed = 0.8 + waveNumber * 0.1;
enemy.damage = 15 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
case 3:
// Wave 3: Mix with purple wisps
if (enemyType < 1) {
enemy.hp = 12 + waveNumber * 2;
enemy.speed = 1.8 + waveNumber * 0.2;
enemy.damage = 10 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisps
} else if (enemyType < 3) {
enemy.hp = 25 + waveNumber * 3;
enemy.speed = 1.2 + waveNumber * 0.15;
enemy.damage = 14 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red sprinters
} else {
enemy.hp = 35 + waveNumber * 5;
enemy.speed = 0.7 + waveNumber * 0.1;
enemy.damage = 18 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
default:
// Wave 4+: All enemy types with scaling
if (enemyType === 0) {
enemy.hp = 15 + waveNumber * 4;
enemy.speed = 2.8 + waveNumber * 0.4;
enemy.damage = 15 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Fast red
} else if (enemyType === 1) {
enemy.hp = 45 + waveNumber * 6;
enemy.speed = 0.6 + waveNumber * 0.1;
enemy.damage = 22 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Tanky blue
} else if (enemyType === 2) {
enemy.hp = 18 + waveNumber * 3;
enemy.speed = 2.2 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisp
} else {
enemy.hp = 25 + waveNumber * 4;
enemy.speed = 1.5 + waveNumber * 0.2;
enemy.damage = 16 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow basic
}
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
}
function findNearestEnemy() {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
}
var dragNode = null;
game.move = function (x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
};
game.down = function (x, y, obj) {
dragNode = player;
player.x = x;
player.y = y;
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn initial wave
spawnWave();
game.update = function () {
// Update UI
hpText.setText('HP: ' + player.hp + '/' + player.maxHp);
levelText.setText('Level: ' + player.level);
waveText.setText('Wave: ' + waveNumber);
// Auto-shoot at nearest enemy
if (LK.ticks - lastShootTime > shootCooldown) {
var target = findNearestEnemy();
if (target) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
lastShootTime = LK.ticks;
}
}
// Update bullets and check collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
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)) {
enemy.takeDamage(bullet.damage);
if (enemy.hp <= 0) {
enemy.destroy();
enemies.splice(j, 1);
enemiesKilled++;
}
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Check if wave is complete
if (enemies.length === 0) {
waveNumber++;
enemiesKilled = 0;
spawnWave();
}
};
Ayakları Ve gözü Olan ateş insan. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Bana Korkunç bir kare insan oluştur. In-Game asset. 2d. High contrast. No shadows
bana bir silah mermisi oluştur. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
bana bir xp kristali çiz. In-Game asset. 2d. High contrast. No shadows