User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween(game, {' Line Number: 217
User prompt
Please fix the bug: 'Uncaught TypeError: tween.to is not a function' in or related to this line: 'tween.to(self, {' Line Number: 252 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
gerçekçi olsun
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'zoneText.style.fill = "#00FF00";' Line Number: 310
Code edit (1 edits merged)
Please save this source code
User prompt
Battle Royale Survivor
Initial prompt
merhaba ba pubg benzer oyun yap
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ammo = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('ammo', {
anchorX: 0.5,
anchorY: 0.5
});
self.amount = 20;
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.direction = {
x: 0,
y: 0
};
self.range = 800;
self.traveled = 0;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
self.traveled += self.speed;
if (self.traveled >= self.range || self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.remove();
}
};
self.remove = function () {
if (self.parent) {
self.parent.removeChild(self);
}
var index = bullets.indexOf(self);
if (index > -1) {
bullets.splice(index, 1);
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 60;
self.speed = 4;
self.shootCooldown = 0;
self.lastShot = 0;
self.lastPlayerX = 0;
self.lastPlayerY = 0;
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xFF0000, 200);
if (self.health <= 0) {
self.destroy();
}
};
self.destroy = function () {
if (self.parent) {
self.parent.removeChild(self);
}
var index = enemies.indexOf(self);
if (index > -1) {
enemies.splice(index, 1);
}
// Increase score
LK.setScore(LK.getScore() + 10);
updateUI();
};
self.update = function () {
// Move towards player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 100) {
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
self.x += moveX;
self.y += moveY;
}
// Shoot at player
if (distance < 400 && self.shootCooldown <= 0) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / distance;
bullet.direction.y = dy / distance;
enemyBullets.push(bullet);
game.addChild(bullet);
self.shootCooldown = 60; // 1 second at 60fps
}
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
// Keep enemy in bounds
self.x = Math.max(50, Math.min(1998, self.x));
self.y = Math.max(50, Math.min(2682, self.y));
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.direction = {
x: 0,
y: 0
};
self.range = 600;
self.traveled = 0;
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
self.traveled += self.speed;
if (self.traveled >= self.range || self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.remove();
}
};
self.remove = function () {
if (self.parent) {
self.parent.removeChild(self);
}
var index = enemyBullets.indexOf(self);
if (index > -1) {
enemyBullets.splice(index, 1);
}
};
return self;
});
var HealthPack = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('health', {
anchorX: 0.5,
anchorY: 0.5
});
self.healAmount = 25;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.ammo = 30;
self.maxAmmo = 30;
self.weapon = 'pistol';
self.speed = 8;
self.shootCooldown = 0;
self.lastX = self.x;
self.lastY = self.y;
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xFF0000, 300);
LK.getSound('hit').play();
if (self.health <= 0) {
self.health = 0;
LK.showGameOver();
}
};
self.shoot = function (targetX, targetY) {
if (self.shootCooldown <= 0 && self.ammo > 0) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var length = Math.sqrt(dx * dx + dy * dy);
if (length > 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction.x = dx / length;
bullet.direction.y = dy / length;
bullets.push(bullet);
game.addChild(bullet);
self.ammo--;
self.shootCooldown = 10;
LK.getSound('shoot').play();
}
}
};
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
// Zone damage
var distanceFromCenter = Math.sqrt(Math.pow(self.x - zoneCenter.x, 2) + Math.pow(self.y - zoneCenter.y, 2));
if (distanceFromCenter > zoneRadius) {
self.takeDamage(0.5);
}
};
return self;
});
var Weapon = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('weapon', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'rifle';
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
var player = new Player();
var enemies = [];
var bullets = [];
var enemyBullets = [];
var weapons = [];
var ammos = [];
var healthPacks = [];
// Zone variables
var zoneCenter = {
x: 1024,
y: 1366
};
var zoneRadius = 1000;
var zoneMaxRadius = 1000;
var zoneShrinkRate = 0.5;
// Game state
var gameTime = 0;
var spawnTimer = 0;
var lootSpawnTimer = 0;
// Zone visual
var zoneVisual = LK.getAsset('zone', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
game.addChild(zoneVisual);
zoneVisual.x = zoneCenter.x;
zoneVisual.y = zoneCenter.y;
// Initialize player position
player.x = zoneCenter.x;
player.y = zoneCenter.y;
game.addChild(player);
// UI Elements
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
var ammoText = new Text2('Ammo: 30', {
size: 60,
fill: 0x9C27B0
});
ammoText.anchor.set(0, 0);
LK.gui.topLeft.addChild(ammoText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var zoneText = new Text2('Zone: Safe', {
size: 50,
fill: 0x00FF00
});
zoneText.anchor.set(1, 0);
LK.gui.topRight.addChild(zoneText);
function updateUI() {
healthText.setText('Health: ' + Math.max(0, Math.floor(player.health)));
ammoText.setText('Ammo: ' + player.ammo);
scoreText.setText('Score: ' + LK.getScore());
var distanceFromCenter = Math.sqrt(Math.pow(player.x - zoneCenter.x, 2) + Math.pow(player.y - zoneCenter.y, 2));
if (distanceFromCenter > zoneRadius) {
zoneText.setText('Zone: DANGER!');
zoneText.style.fill = "#FF0000";
} else {
zoneText.setText('Zone: Safe');
zoneText.style.fill = "#00FF00";
}
}
function spawnEnemy() {
var enemy = new Enemy();
// Spawn enemy at random edge of map
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// top
enemy.x = Math.random() * 2048;
enemy.y = 50;
} else if (side === 1) {
// right
enemy.x = 1998;
enemy.y = Math.random() * 2732;
} else if (side === 2) {
// bottom
enemy.x = Math.random() * 2048;
enemy.y = 2682;
} else {
// left
enemy.x = 50;
enemy.y = Math.random() * 2732;
}
enemies.push(enemy);
game.addChild(enemy);
}
function spawnLoot() {
var lootType = Math.random();
var lootItem;
if (lootType < 0.4) {
lootItem = new Ammo();
ammos.push(lootItem);
} else if (lootType < 0.7) {
lootItem = new HealthPack();
healthPacks.push(lootItem);
} else {
lootItem = new Weapon();
weapons.push(lootItem);
}
// Spawn within zone
var angle = Math.random() * Math.PI * 2;
var radius = Math.random() * (zoneRadius * 0.8);
lootItem.x = zoneCenter.x + Math.cos(angle) * radius;
lootItem.y = zoneCenter.y + Math.sin(angle) * radius;
game.addChild(lootItem);
}
// Position UI elements
healthText.y = 120;
ammoText.y = 200;
// Input handling
var targetX = 0;
var targetY = 0;
var isMoving = false;
game.move = function (x, y, obj) {
targetX = x;
targetY = y;
if (isMoving) {
var dx = x - player.x;
var dy = y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 20) {
var moveX = dx / distance * player.speed;
var moveY = dy / distance * player.speed;
player.x += moveX;
player.y += moveY;
// Keep player in bounds
player.x = Math.max(40, Math.min(2008, player.x));
player.y = Math.max(40, Math.min(2692, player.y));
}
}
};
game.down = function (x, y, obj) {
isMoving = true;
targetX = x;
targetY = y;
};
game.up = function (x, y, obj) {
if (isMoving) {
player.shoot(targetX, targetY);
}
isMoving = false;
};
// Main game loop
game.update = function () {
gameTime++;
// Shrink zone over time
if (gameTime % 180 === 0 && zoneRadius > 200) {
// Every 3 seconds
zoneRadius -= zoneShrinkRate * 10;
zoneVisual.width = zoneRadius * 2;
zoneVisual.height = zoneRadius * 2;
if (zoneRadius < 500) {
zoneShrinkRate = 1;
}
}
// Spawn enemies
spawnTimer++;
var spawnRate = Math.max(120, 300 - gameTime / 10); // Increase spawn rate over time
if (spawnTimer >= spawnRate) {
spawnEnemy();
spawnTimer = 0;
}
// Spawn loot
lootSpawnTimer++;
if (lootSpawnTimer >= 240) {
// Every 4 seconds
spawnLoot();
lootSpawnTimer = 0;
}
// Check bullet collisions with enemies
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
enemy.takeDamage(25);
bullet.remove();
break;
}
}
}
// Check enemy bullet collisions with player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.intersects(player)) {
player.takeDamage(20);
bullet.remove();
}
}
// Check loot collection
for (var i = ammos.length - 1; i >= 0; i--) {
var ammo = ammos[i];
if (player.intersects(ammo)) {
player.ammo = Math.min(player.maxAmmo, player.ammo + ammo.amount);
LK.getSound('pickup').play();
game.removeChild(ammo);
ammos.splice(i, 1);
}
}
for (var i = healthPacks.length - 1; i >= 0; i--) {
var health = healthPacks[i];
if (player.intersects(health)) {
player.health = Math.min(player.maxHealth, player.health + health.healAmount);
LK.getSound('pickup').play();
game.removeChild(health);
healthPacks.splice(i, 1);
}
}
for (var i = weapons.length - 1; i >= 0; i--) {
var weapon = weapons[i];
if (player.intersects(weapon)) {
player.weapon = weapon.type;
player.ammo = player.maxAmmo;
LK.getSound('pickup').play();
game.removeChild(weapon);
weapons.splice(i, 1);
}
}
updateUI();
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,455 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Ammo = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('ammo', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.amount = 20;
+ return self;
+});
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 15;
+ self.direction = {
+ x: 0,
+ y: 0
+ };
+ self.range = 800;
+ self.traveled = 0;
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ self.traveled += self.speed;
+ if (self.traveled >= self.range || self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
+ self.remove();
+ }
+ };
+ self.remove = function () {
+ if (self.parent) {
+ self.parent.removeChild(self);
+ }
+ var index = bullets.indexOf(self);
+ if (index > -1) {
+ bullets.splice(index, 1);
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 60;
+ self.speed = 4;
+ self.shootCooldown = 0;
+ self.lastShot = 0;
+ self.lastPlayerX = 0;
+ self.lastPlayerY = 0;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 200);
+ if (self.health <= 0) {
+ self.destroy();
+ }
+ };
+ self.destroy = function () {
+ if (self.parent) {
+ self.parent.removeChild(self);
+ }
+ var index = enemies.indexOf(self);
+ if (index > -1) {
+ enemies.splice(index, 1);
+ }
+ // Increase score
+ LK.setScore(LK.getScore() + 10);
+ updateUI();
+ };
+ self.update = function () {
+ // Move towards player
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 100) {
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ // Shoot at player
+ if (distance < 400 && self.shootCooldown <= 0) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.direction.x = dx / distance;
+ bullet.direction.y = dy / distance;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ self.shootCooldown = 60; // 1 second at 60fps
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ // Keep enemy in bounds
+ self.x = Math.max(50, Math.min(1998, self.x));
+ self.y = Math.max(50, Math.min(2682, self.y));
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.direction = {
+ x: 0,
+ y: 0
+ };
+ self.range = 600;
+ self.traveled = 0;
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ self.traveled += self.speed;
+ if (self.traveled >= self.range || self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
+ self.remove();
+ }
+ };
+ self.remove = function () {
+ if (self.parent) {
+ self.parent.removeChild(self);
+ }
+ var index = enemyBullets.indexOf(self);
+ if (index > -1) {
+ enemyBullets.splice(index, 1);
+ }
+ };
+ return self;
+});
+var HealthPack = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('health', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.healAmount = 25;
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.ammo = 30;
+ self.maxAmmo = 30;
+ self.weapon = 'pistol';
+ self.speed = 8;
+ self.shootCooldown = 0;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ LK.getSound('hit').play();
+ if (self.health <= 0) {
+ self.health = 0;
+ LK.showGameOver();
+ }
+ };
+ self.shoot = function (targetX, targetY) {
+ if (self.shootCooldown <= 0 && self.ammo > 0) {
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var length = Math.sqrt(dx * dx + dy * dy);
+ if (length > 0) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.direction.x = dx / length;
+ bullet.direction.y = dy / length;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ self.ammo--;
+ self.shootCooldown = 10;
+ LK.getSound('shoot').play();
+ }
+ }
+ };
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ // Zone damage
+ var distanceFromCenter = Math.sqrt(Math.pow(self.x - zoneCenter.x, 2) + Math.pow(self.y - zoneCenter.y, 2));
+ if (distanceFromCenter > zoneRadius) {
+ self.takeDamage(0.5);
+ }
+ };
+ return self;
+});
+var Weapon = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('weapon', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'rifle';
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x228B22
+});
+
+/****
+* Game Code
+****/
+var player = new Player();
+var enemies = [];
+var bullets = [];
+var enemyBullets = [];
+var weapons = [];
+var ammos = [];
+var healthPacks = [];
+// Zone variables
+var zoneCenter = {
+ x: 1024,
+ y: 1366
+};
+var zoneRadius = 1000;
+var zoneMaxRadius = 1000;
+var zoneShrinkRate = 0.5;
+// Game state
+var gameTime = 0;
+var spawnTimer = 0;
+var lootSpawnTimer = 0;
+// Zone visual
+var zoneVisual = LK.getAsset('zone', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+});
+game.addChild(zoneVisual);
+zoneVisual.x = zoneCenter.x;
+zoneVisual.y = zoneCenter.y;
+// Initialize player position
+player.x = zoneCenter.x;
+player.y = zoneCenter.y;
+game.addChild(player);
+// UI Elements
+var healthText = new Text2('Health: 100', {
+ size: 60,
+ fill: 0xFF0000
+});
+healthText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(healthText);
+var ammoText = new Text2('Ammo: 30', {
+ size: 60,
+ fill: 0x9C27B0
+});
+ammoText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(ammoText);
+var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var zoneText = new Text2('Zone: Safe', {
+ size: 50,
+ fill: 0x00FF00
+});
+zoneText.anchor.set(1, 0);
+LK.gui.topRight.addChild(zoneText);
+function updateUI() {
+ healthText.setText('Health: ' + Math.max(0, Math.floor(player.health)));
+ ammoText.setText('Ammo: ' + player.ammo);
+ scoreText.setText('Score: ' + LK.getScore());
+ var distanceFromCenter = Math.sqrt(Math.pow(player.x - zoneCenter.x, 2) + Math.pow(player.y - zoneCenter.y, 2));
+ if (distanceFromCenter > zoneRadius) {
+ zoneText.setText('Zone: DANGER!');
+ zoneText.style.fill = "#FF0000";
+ } else {
+ zoneText.setText('Zone: Safe');
+ zoneText.style.fill = "#00FF00";
+ }
+}
+function spawnEnemy() {
+ var enemy = new Enemy();
+ // Spawn enemy at random edge of map
+ var side = Math.floor(Math.random() * 4);
+ if (side === 0) {
+ // top
+ enemy.x = Math.random() * 2048;
+ enemy.y = 50;
+ } else if (side === 1) {
+ // right
+ enemy.x = 1998;
+ enemy.y = Math.random() * 2732;
+ } else if (side === 2) {
+ // bottom
+ enemy.x = Math.random() * 2048;
+ enemy.y = 2682;
+ } else {
+ // left
+ enemy.x = 50;
+ enemy.y = Math.random() * 2732;
+ }
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+function spawnLoot() {
+ var lootType = Math.random();
+ var lootItem;
+ if (lootType < 0.4) {
+ lootItem = new Ammo();
+ ammos.push(lootItem);
+ } else if (lootType < 0.7) {
+ lootItem = new HealthPack();
+ healthPacks.push(lootItem);
+ } else {
+ lootItem = new Weapon();
+ weapons.push(lootItem);
+ }
+ // Spawn within zone
+ var angle = Math.random() * Math.PI * 2;
+ var radius = Math.random() * (zoneRadius * 0.8);
+ lootItem.x = zoneCenter.x + Math.cos(angle) * radius;
+ lootItem.y = zoneCenter.y + Math.sin(angle) * radius;
+ game.addChild(lootItem);
+}
+// Position UI elements
+healthText.y = 120;
+ammoText.y = 200;
+// Input handling
+var targetX = 0;
+var targetY = 0;
+var isMoving = false;
+game.move = function (x, y, obj) {
+ targetX = x;
+ targetY = y;
+ if (isMoving) {
+ var dx = x - player.x;
+ var dy = y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 20) {
+ var moveX = dx / distance * player.speed;
+ var moveY = dy / distance * player.speed;
+ player.x += moveX;
+ player.y += moveY;
+ // Keep player in bounds
+ player.x = Math.max(40, Math.min(2008, player.x));
+ player.y = Math.max(40, Math.min(2692, player.y));
+ }
+ }
+};
+game.down = function (x, y, obj) {
+ isMoving = true;
+ targetX = x;
+ targetY = y;
+};
+game.up = function (x, y, obj) {
+ if (isMoving) {
+ player.shoot(targetX, targetY);
+ }
+ isMoving = false;
+};
+// Main game loop
+game.update = function () {
+ gameTime++;
+ // Shrink zone over time
+ if (gameTime % 180 === 0 && zoneRadius > 200) {
+ // Every 3 seconds
+ zoneRadius -= zoneShrinkRate * 10;
+ zoneVisual.width = zoneRadius * 2;
+ zoneVisual.height = zoneRadius * 2;
+ if (zoneRadius < 500) {
+ zoneShrinkRate = 1;
+ }
+ }
+ // Spawn enemies
+ spawnTimer++;
+ var spawnRate = Math.max(120, 300 - gameTime / 10); // Increase spawn rate over time
+ if (spawnTimer >= spawnRate) {
+ spawnEnemy();
+ spawnTimer = 0;
+ }
+ // Spawn loot
+ lootSpawnTimer++;
+ if (lootSpawnTimer >= 240) {
+ // Every 4 seconds
+ spawnLoot();
+ lootSpawnTimer = 0;
+ }
+ // Check bullet collisions with enemies
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ enemy.takeDamage(25);
+ bullet.remove();
+ break;
+ }
+ }
+ }
+ // Check enemy bullet collisions with player
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ if (bullet.intersects(player)) {
+ player.takeDamage(20);
+ bullet.remove();
+ }
+ }
+ // Check loot collection
+ for (var i = ammos.length - 1; i >= 0; i--) {
+ var ammo = ammos[i];
+ if (player.intersects(ammo)) {
+ player.ammo = Math.min(player.maxAmmo, player.ammo + ammo.amount);
+ LK.getSound('pickup').play();
+ game.removeChild(ammo);
+ ammos.splice(i, 1);
+ }
+ }
+ for (var i = healthPacks.length - 1; i >= 0; i--) {
+ var health = healthPacks[i];
+ if (player.intersects(health)) {
+ player.health = Math.min(player.maxHealth, player.health + health.healAmount);
+ LK.getSound('pickup').play();
+ game.removeChild(health);
+ healthPacks.splice(i, 1);
+ }
+ }
+ for (var i = weapons.length - 1; i >= 0; i--) {
+ var weapon = weapons[i];
+ if (player.intersects(weapon)) {
+ player.weapon = weapon.type;
+ player.ammo = player.maxAmmo;
+ LK.getSound('pickup').play();
+ game.removeChild(weapon);
+ weapons.splice(i, 1);
+ }
+ }
+ updateUI();
+};
\ No newline at end of file