User prompt
why can't I move after level 2? fix it
User prompt
enemies other than bosses and big enemies drop 1 xp
User prompt
make sound when ı take healt or speed or shoot
User prompt
have a boss fight every 10 levels, no other enemies around the boss when it comes ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
have big and small enemies, big enemies die in 2 hits or 3 hits depending on their size, have a health bar on them.
User prompt
Please fix the bug: 'TypeError: enemies[i].update is not a function' in or related to this line: 'enemies[i].update();' Line Number: 682
User prompt
make different enemies and as I get stronger, they come in droves
User prompt
when ı level up, enemies faster
User prompt
max level 50
User prompt
not teleport to where I click, just move when I drag
Code edit (1 edits merged)
Please save this source code
User prompt
Auto Shooter Evolution
Initial prompt
When a man who shoots automatically collects the new stats that appear on the screen, he gains stats such as rate of fire, new shooting mode, flamethrower, double shot, new weapon. Every time you kill an enemy, points drop from enemies, allowing you to level up. Each time he levels up he chooses one of 3 options, extra health, speed, new weapon or different features.
/**** * Classes ****/ var BasicEnemy = Container.expand(function () { var self = Container.call(this, 'enemy', 20, 1, 10, 3); return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.damage = 25; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { self.removeSelf(); } for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (self.intersects(enemy)) { enemy.takeDamage(self.damage); self.removeSelf(); break; } } }; self.removeSelf = function () { var index = bullets.indexOf(self); if (index !== -1) { bullets.splice(index, 1); } self.destroy(); }; return self; }); var EnemyBase = Container.expand(function (assetType, health, speed, damage, xpValue) { var self = Container.call(this); var enemyGraphics = self.attachAsset(assetType, { anchorX: 0.5, anchorY: 0.5 }); self.health = health || 20; self.maxHealth = self.health; self.speed = speed || 1; self.damage = damage || 10; self.xpValue = xpValue || 3; self.lastDamageTime = 0; self.baseSpeed = self.speed; self.update = function () { self.updateMovement(); self.checkPlayerCollision(); }; self.updateMovement = function () { 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; } }; self.checkPlayerCollision = function () { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 40 && LK.ticks - self.lastDamageTime > 60) { player.takeDamage(self.damage); self.lastDamageTime = LK.ticks; } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.die(); } }; self.die = function () { for (var i = 0; i < self.xpValue; i++) { var xpOrb = new XPOrb(); xpOrb.x = self.x + (Math.random() - 0.5) * 50; xpOrb.y = self.y + (Math.random() - 0.5) * 50; xpOrbs.push(xpOrb); game.addChild(xpOrb); } var index = enemies.indexOf(self); if (index !== -1) { enemies.splice(index, 1); } self.destroy(); }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5, tint: 0xff0000 }); self.velocityX = 0; self.velocityY = 0; self.damage = 15; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { self.removeSelf(); } var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 30) { player.takeDamage(self.damage); self.removeSelf(); } }; self.removeSelf = function () { var index = enemyBullets.indexOf(self); if (index !== -1) { enemyBullets.splice(index, 1); } self.destroy(); }; return self; }); var ExperienceBar = Container.expand(function () { var self = Container.call(this); self.background = LK.getAsset('enemy', { width: 300, height: 15, anchorX: 0, anchorY: 0, tint: 0x333333 }); self.foreground = LK.getAsset('xp', { width: 300, height: 15, anchorX: 0, anchorY: 0, tint: 0x9C27B0 }); self.addChild(self.background); self.addChild(self.foreground); self.updateDisplay = function () { var xpPercent = player.experience / player.experienceToNext; self.foreground.width = 300 * xpPercent; }; return self; }); var FastEnemy = Container.expand(function () { var self = Container.call(this, 'fastEnemy', 10, 2.5, 8, 2); return self; }); var HealthBar = Container.expand(function () { var self = Container.call(this); self.background = LK.getAsset('enemy', { width: 200, height: 20, anchorX: 0, anchorY: 0, tint: 0x333333 }); self.foreground = LK.getAsset('player', { width: 200, height: 20, anchorX: 0, anchorY: 0, tint: 0x4CAF50 }); self.addChild(self.background); self.addChild(self.foreground); self.updateDisplay = function () { var healthPercent = player.health / player.maxHealth; self.foreground.width = 200 * healthPercent; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.speed = 3; self.fireRate = 30; self.fireTimer = 0; self.experience = 0; self.level = 1; self.experienceToNext = 10; self.update = function () { self.fireTimer++; if (self.fireTimer >= self.fireRate) { self.fireAtNearestEnemy(); self.fireTimer = 0; } }; self.fireAtNearestEnemy = function () { var nearestEnemy = null; var nearestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance && distance < 400) { nearestDistance = distance; nearestEnemy = enemy; } } if (nearestEnemy) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; var dx = nearestEnemy.x - self.x; var dy = nearestEnemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); bullet.velocityX = dx / distance * 8; bullet.velocityY = dy / distance * 8; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; LK.showGameOver(); } healthBar.updateDisplay(); }; self.gainExperience = function (amount) { self.experience += amount; experienceBar.updateDisplay(); if (self.experience >= self.experienceToNext) { self.levelUp(); } }; self.levelUp = function () { if (self.level >= 50) { // At max level, just reset experience but don't level up self.experience = 0; experienceBar.updateDisplay(); return; } self.level++; self.experience = 0; self.experienceToNext = Math.floor(self.experienceToNext * 1.5); experienceBar.updateDisplay(); levelText.setText('Level: ' + self.level); // Increase enemy speed based on player level for (var i = 0; i < enemies.length; i++) { var levelFactor = 1 + (self.level - 1) * 0.1; enemies[i].speed = enemies[i].baseSpeed * levelFactor; } LK.getSound('levelUp').play(); showUpgradeOptions(); }; return self; }); var ShooterEnemy = Container.expand(function () { var self = Container.call(this, 'shooterEnemy', 25, 0.8, 12, 5); self.shootTimer = 0; self.shootRate = 120; self.updateMovement = function () { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); // Stop moving when close to player and start shooting if (distance > 200) { if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } else { // Shoot at player self.shootTimer++; if (self.shootTimer >= self.shootRate) { self.shootAtPlayer(); self.shootTimer = 0; } } }; self.shootAtPlayer = function () { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = 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) { bullet.velocityX = dx / distance * 6; bullet.velocityY = dy / distance * 6; enemyBullets.push(bullet); game.addChild(bullet); } }; return self; }); var StatItem = Container.expand(function (type) { var self = Container.call(this); var itemGraphics = self.attachAsset(type + 'Item', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.lifeTime = 0; self.update = function () { self.lifeTime++; if (self.lifeTime > 1800) { self.removeSelf(); } var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 30) { self.applyEffect(); self.removeSelf(); } }; self.applyEffect = function () { if (self.type === 'health') { player.health = Math.min(player.maxHealth, player.health + 25); healthBar.updateDisplay(); } else if (self.type === 'speed') { player.speed += 0.5; } LK.getSound('pickup').play(); }; self.removeSelf = function () { var index = statItems.indexOf(self); if (index !== -1) { statItems.splice(index, 1); } self.destroy(); }; return self; }); var TankEnemy = Container.expand(function () { var self = Container.call(this, 'tankEnemy', 80, 0.6, 20, 8); return self; }); var XPOrb = Container.expand(function () { var self = Container.call(this); var xpGraphics = self.attachAsset('xp', { anchorX: 0.5, anchorY: 0.5 }); self.value = 1; self.update = function () { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 100) { self.x += dx / distance * 4; self.y += dy / distance * 4; } if (distance < 25) { player.gainExperience(self.value); LK.getSound('pickup').play(); self.removeSelf(); } }; self.removeSelf = function () { var index = xpOrbs.indexOf(self); if (index !== -1) { xpOrbs.splice(index, 1); } self.destroy(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ var player; var enemies = []; var bullets = []; var enemyBullets = []; var xpOrbs = []; var statItems = []; var enemySpawnTimer = 0; var itemSpawnTimer = 0; var waveLevel = 1; var upgradePanel = null; var healthBar; var experienceBar; var levelText; var hordeSpawnTimer = 0; // Initialize player player = game.addChild(new Player()); player.x = 1024; player.y = 1366; // Initialize UI healthBar = new HealthBar(); healthBar.x = 50; healthBar.y = 50; LK.gui.topLeft.addChild(healthBar); experienceBar = new ExperienceBar(); experienceBar.x = 50; experienceBar.y = 80; LK.gui.topLeft.addChild(experienceBar); levelText = new Text2('Level: 1', { size: 40, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.x = 50; levelText.y = 110; LK.gui.topLeft.addChild(levelText); // Movement variables var dragNode = null; function showUpgradeOptions() { if (upgradePanel) return; upgradePanel = LK.getAsset('enemy', { width: 800, height: 600, anchorX: 0.5, anchorY: 0.5, tint: 0x333333 }); upgradePanel.x = 1024; upgradePanel.y = 1366; LK.gui.center.addChild(upgradePanel); var upgrades = [{ name: 'Extra Health', effect: function effect() { player.maxHealth += 25; player.health += 25; healthBar.updateDisplay(); } }, { name: 'Faster Fire', effect: function effect() { player.fireRate = Math.max(10, player.fireRate - 5); } }, { name: 'More Speed', effect: function effect() { player.speed += 1; } }, { name: 'Bigger Bullets', effect: function effect() {/* Visual upgrade */} }, { name: 'More Damage', effect: function effect() {/* Would need bullet damage tracking */} }]; var selectedUpgrades = []; for (var i = 0; i < 3; i++) { var randomIndex = Math.floor(Math.random() * upgrades.length); selectedUpgrades.push(upgrades[randomIndex]); } for (var i = 0; i < 3; i++) { var button = LK.getAsset('player', { width: 200, height: 80, anchorX: 0.5, anchorY: 0.5, tint: 0x4CAF50 }); button.x = -250 + i * 250; button.y = 0; button.upgradeIndex = i; button.upgrade = selectedUpgrades[i]; button.down = function (x, y, obj) { obj.upgrade.effect(); hideUpgradeOptions(); }; upgradePanel.addChild(button); var buttonText = new Text2(selectedUpgrades[i].name, { size: 24, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); buttonText.x = button.x; buttonText.y = button.y; upgradePanel.addChild(buttonText); } } function hideUpgradeOptions() { if (upgradePanel) { upgradePanel.destroy(); upgradePanel = null; } } function spawnEnemy() { var enemy; var levelFactor = 1 + (player.level - 1) * 0.1; // Choose enemy type based on player level var rand = Math.random(); if (player.level < 5) { enemy = new BasicEnemy(); } else if (player.level < 10) { if (rand < 0.7) enemy = new BasicEnemy();else enemy = new FastEnemy(); } else if (player.level < 20) { if (rand < 0.5) enemy = new BasicEnemy();else if (rand < 0.8) enemy = new FastEnemy();else enemy = new TankEnemy(); } else { if (rand < 0.3) enemy = new BasicEnemy();else if (rand < 0.55) enemy = new FastEnemy();else if (rand < 0.8) enemy = new TankEnemy();else enemy = new ShooterEnemy(); } // Scale enemy stats with player level enemy.speed = enemy.baseSpeed * levelFactor; enemy.health = Math.floor(enemy.maxHealth * levelFactor); enemy.maxHealth = enemy.health; 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; } enemies.push(enemy); game.addChild(enemy); } function spawnHorde() { var hordeSize = Math.min(10, 3 + Math.floor(player.level / 5)); var enemyType = Math.random() < 0.6 ? BasicEnemy : FastEnemy; for (var i = 0; i < hordeSize; i++) { var enemy = new enemyType(); var levelFactor = 1 + (player.level - 1) * 0.1; enemy.speed = enemy.baseSpeed * levelFactor; enemy.health = Math.floor(enemy.maxHealth * levelFactor); enemy.maxHealth = enemy.health; // Spawn all enemies from the same side var side = Math.floor(Math.random() * 4); var offset = i * 80; switch (side) { case 0: enemy.x = (Math.random() * 1000 + 500 + offset) % 2048; enemy.y = -50; break; case 1: enemy.x = 2098; enemy.y = (Math.random() * 1000 + 500 + offset) % 2732; break; case 2: enemy.x = (Math.random() * 1000 + 500 + offset) % 2048; enemy.y = 2782; break; case 3: enemy.x = -50; enemy.y = (Math.random() * 1000 + 500 + offset) % 2732; break; } enemies.push(enemy); game.addChild(enemy); } } function spawnStatItem() { var item = new StatItem(Math.random() < 0.5 ? 'health' : 'speed'); item.x = Math.random() * 1800 + 100; item.y = Math.random() * 2400 + 100; statItems.push(item); game.addChild(item); } game.move = function (x, y, obj) { if (dragNode && !upgradePanel) { dragNode.x = x; dragNode.y = y; // Keep player within bounds dragNode.x = Math.max(30, Math.min(2018, dragNode.x)); dragNode.y = Math.max(30, Math.min(2702, dragNode.y)); } }; game.down = function (x, y, obj) { if (!upgradePanel) { dragNode = player; } }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { if (upgradePanel) return; // Spawn enemies with increased frequency based on player level enemySpawnTimer++; var baseSpawnRate = Math.max(30, 180 - waveLevel * 10); var levelSpawnBonus = Math.floor(player.level / 5); var spawnRate = Math.max(15, baseSpawnRate - levelSpawnBonus * 5); if (enemySpawnTimer >= spawnRate) { // Higher chance of multiple spawns at higher levels var spawnCount = 1; if (player.level > 10 && Math.random() < 0.3) spawnCount = 2; if (player.level > 20 && Math.random() < 0.2) spawnCount = 3; for (var s = 0; s < spawnCount; s++) { spawnEnemy(); } enemySpawnTimer = 0; } // Spawn hordes periodically when player gets stronger hordeSpawnTimer++; var hordeRate = Math.max(600, 1800 - player.level * 20); if (hordeSpawnTimer >= hordeRate && player.level >= 5) { spawnHorde(); hordeSpawnTimer = 0; } // Spawn stat items itemSpawnTimer++; if (itemSpawnTimer >= 600) { spawnStatItem(); itemSpawnTimer = 0; } // Increase difficulty over time if (LK.ticks % 1800 === 0) { waveLevel++; } // Update all game objects for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].update(); } for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].update(); } for (var i = enemyBullets.length - 1; i >= 0; i--) { enemyBullets[i].update(); } for (var i = xpOrbs.length - 1; i >= 0; i--) { xpOrbs[i].update(); } for (var i = statItems.length - 1; i >= 0; i--) { statItems[i].update(); } player.update(); };
===================================================================
--- original.js
+++ change.js
@@ -1,7 +1,11 @@
/****
* Classes
****/
+var BasicEnemy = Container.expand(function () {
+ var self = Container.call(this, 'enemy', 20, 1, 10, 3);
+ return self;
+});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
@@ -33,26 +37,38 @@
self.destroy();
};
return self;
});
-var Enemy = Container.expand(function () {
+var EnemyBase = Container.expand(function (assetType, health, speed, damage, xpValue) {
var self = Container.call(this);
- var enemyGraphics = self.attachAsset('enemy', {
+ var enemyGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
- self.health = 20;
- self.speed = 1;
- self.damage = 10;
+ self.health = health || 20;
+ self.maxHealth = self.health;
+ self.speed = speed || 1;
+ self.damage = damage || 10;
+ self.xpValue = xpValue || 3;
self.lastDamageTime = 0;
+ self.baseSpeed = self.speed;
self.update = function () {
+ self.updateMovement();
+ self.checkPlayerCollision();
+ };
+ self.updateMovement = function () {
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;
}
+ };
+ self.checkPlayerCollision = function () {
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 40 && LK.ticks - self.lastDamageTime > 60) {
player.takeDamage(self.damage);
self.lastDamageTime = LK.ticks;
}
@@ -63,9 +79,9 @@
self.die();
}
};
self.die = function () {
- for (var i = 0; i < 3; i++) {
+ for (var i = 0; i < self.xpValue; i++) {
var xpOrb = new XPOrb();
xpOrb.x = self.x + (Math.random() - 0.5) * 50;
xpOrb.y = self.y + (Math.random() - 0.5) * 50;
xpOrbs.push(xpOrb);
@@ -78,8 +94,41 @@
self.destroy();
};
return self;
});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xff0000
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.damage = 15;
+ self.update = function () {
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
+ self.removeSelf();
+ }
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 30) {
+ player.takeDamage(self.damage);
+ self.removeSelf();
+ }
+ };
+ self.removeSelf = function () {
+ var index = enemyBullets.indexOf(self);
+ if (index !== -1) {
+ enemyBullets.splice(index, 1);
+ }
+ self.destroy();
+ };
+ return self;
+});
var ExperienceBar = Container.expand(function () {
var self = Container.call(this);
self.background = LK.getAsset('enemy', {
width: 300,
@@ -102,8 +151,12 @@
self.foreground.width = 300 * xpPercent;
};
return self;
});
+var FastEnemy = Container.expand(function () {
+ var self = Container.call(this, 'fastEnemy', 10, 2.5, 8, 2);
+ return self;
+});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
self.background = LK.getAsset('enemy', {
width: 200,
@@ -203,15 +256,55 @@
experienceBar.updateDisplay();
levelText.setText('Level: ' + self.level);
// Increase enemy speed based on player level
for (var i = 0; i < enemies.length; i++) {
- enemies[i].speed = 1 + (self.level - 1) * 0.1;
+ var levelFactor = 1 + (self.level - 1) * 0.1;
+ enemies[i].speed = enemies[i].baseSpeed * levelFactor;
}
LK.getSound('levelUp').play();
showUpgradeOptions();
};
return self;
});
+var ShooterEnemy = Container.expand(function () {
+ var self = Container.call(this, 'shooterEnemy', 25, 0.8, 12, 5);
+ self.shootTimer = 0;
+ self.shootRate = 120;
+ self.updateMovement = function () {
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Stop moving when close to player and start shooting
+ if (distance > 200) {
+ if (distance > 0) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ } else {
+ // Shoot at player
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootRate) {
+ self.shootAtPlayer();
+ self.shootTimer = 0;
+ }
+ }
+ };
+ self.shootAtPlayer = function () {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = 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) {
+ bullet.velocityX = dx / distance * 6;
+ bullet.velocityY = dy / distance * 6;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ return self;
+});
var StatItem = Container.expand(function (type) {
var self = Container.call(this);
var itemGraphics = self.attachAsset(type + 'Item', {
anchorX: 0.5,
@@ -249,8 +342,12 @@
self.destroy();
};
return self;
});
+var TankEnemy = Container.expand(function () {
+ var self = Container.call(this, 'tankEnemy', 80, 0.6, 20, 8);
+ return self;
+});
var XPOrb = Container.expand(function () {
var self = Container.call(this);
var xpGraphics = self.attachAsset('xp', {
anchorX: 0.5,
@@ -293,8 +390,9 @@
****/
var player;
var enemies = [];
var bullets = [];
+var enemyBullets = [];
var xpOrbs = [];
var statItems = [];
var enemySpawnTimer = 0;
var itemSpawnTimer = 0;
@@ -302,8 +400,9 @@
var upgradePanel = null;
var healthBar;
var experienceBar;
var levelText;
+var hordeSpawnTimer = 0;
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
@@ -400,11 +499,25 @@
upgradePanel = null;
}
}
function spawnEnemy() {
- var enemy = new Enemy();
- // Set enemy speed based on current player level
- enemy.speed = 1 + (player.level - 1) * 0.1;
+ var enemy;
+ var levelFactor = 1 + (player.level - 1) * 0.1;
+ // Choose enemy type based on player level
+ var rand = Math.random();
+ if (player.level < 5) {
+ enemy = new BasicEnemy();
+ } else if (player.level < 10) {
+ if (rand < 0.7) enemy = new BasicEnemy();else enemy = new FastEnemy();
+ } else if (player.level < 20) {
+ if (rand < 0.5) enemy = new BasicEnemy();else if (rand < 0.8) enemy = new FastEnemy();else enemy = new TankEnemy();
+ } else {
+ if (rand < 0.3) enemy = new BasicEnemy();else if (rand < 0.55) enemy = new FastEnemy();else if (rand < 0.8) enemy = new TankEnemy();else enemy = new ShooterEnemy();
+ }
+ // Scale enemy stats with player level
+ enemy.speed = enemy.baseSpeed * levelFactor;
+ enemy.health = Math.floor(enemy.maxHealth * levelFactor);
+ enemy.maxHealth = enemy.health;
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
@@ -429,8 +542,42 @@
}
enemies.push(enemy);
game.addChild(enemy);
}
+function spawnHorde() {
+ var hordeSize = Math.min(10, 3 + Math.floor(player.level / 5));
+ var enemyType = Math.random() < 0.6 ? BasicEnemy : FastEnemy;
+ for (var i = 0; i < hordeSize; i++) {
+ var enemy = new enemyType();
+ var levelFactor = 1 + (player.level - 1) * 0.1;
+ enemy.speed = enemy.baseSpeed * levelFactor;
+ enemy.health = Math.floor(enemy.maxHealth * levelFactor);
+ enemy.maxHealth = enemy.health;
+ // Spawn all enemies from the same side
+ var side = Math.floor(Math.random() * 4);
+ var offset = i * 80;
+ switch (side) {
+ case 0:
+ enemy.x = (Math.random() * 1000 + 500 + offset) % 2048;
+ enemy.y = -50;
+ break;
+ case 1:
+ enemy.x = 2098;
+ enemy.y = (Math.random() * 1000 + 500 + offset) % 2732;
+ break;
+ case 2:
+ enemy.x = (Math.random() * 1000 + 500 + offset) % 2048;
+ enemy.y = 2782;
+ break;
+ case 3:
+ enemy.x = -50;
+ enemy.y = (Math.random() * 1000 + 500 + offset) % 2732;
+ break;
+ }
+ enemies.push(enemy);
+ game.addChild(enemy);
+ }
+}
function spawnStatItem() {
var item = new StatItem(Math.random() < 0.5 ? 'health' : 'speed');
item.x = Math.random() * 1800 + 100;
item.y = Math.random() * 2400 + 100;
@@ -455,15 +602,30 @@
dragNode = null;
};
game.update = function () {
if (upgradePanel) return;
- // Spawn enemies
+ // Spawn enemies with increased frequency based on player level
enemySpawnTimer++;
- var spawnRate = Math.max(60, 180 - waveLevel * 10);
+ var baseSpawnRate = Math.max(30, 180 - waveLevel * 10);
+ var levelSpawnBonus = Math.floor(player.level / 5);
+ var spawnRate = Math.max(15, baseSpawnRate - levelSpawnBonus * 5);
if (enemySpawnTimer >= spawnRate) {
- spawnEnemy();
+ // Higher chance of multiple spawns at higher levels
+ var spawnCount = 1;
+ if (player.level > 10 && Math.random() < 0.3) spawnCount = 2;
+ if (player.level > 20 && Math.random() < 0.2) spawnCount = 3;
+ for (var s = 0; s < spawnCount; s++) {
+ spawnEnemy();
+ }
enemySpawnTimer = 0;
}
+ // Spawn hordes periodically when player gets stronger
+ hordeSpawnTimer++;
+ var hordeRate = Math.max(600, 1800 - player.level * 20);
+ if (hordeSpawnTimer >= hordeRate && player.level >= 5) {
+ spawnHorde();
+ hordeSpawnTimer = 0;
+ }
// Spawn stat items
itemSpawnTimer++;
if (itemSpawnTimer >= 600) {
spawnStatItem();
@@ -479,8 +641,11 @@
}
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].update();
}
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ enemyBullets[i].update();
+ }
for (var i = xpOrbs.length - 1; i >= 0; i--) {
xpOrbs[i].update();
}
for (var i = statItems.length - 1; i >= 0; i--) {
yuvarlak mermi. In-Game asset. 2d. High contrast. No shadows
boss creature. In-Game asset. 2d. High contrast. No shadows
Tank enemy big creature. In-Game asset. 2d. High contrast. No shadows
XP point only round, no writing on and around it
creature enemy. In-Game asset. 2d. High contrast. No shadows
shooter enemy. In-Game asset. 2d. High contrast. No shadows
healty. In-Game asset. 2d. High contrast. No shadows
fire rate. In-Game asset. 2d. High contrast. No shadows
magnet. In-Game asset. 2d. High contrast. No shadows
hedef tahtası. In-Game asset. 2d. High contrast. No shadows
Give pistol
submachine gun. In-Game asset. 2d. High contrast. No shadows
Stronge. In-Game asset. 2d. High contrast. No shadows