User prompt
Npcler ölünce yeniden doğusun polisler dolaşsın yerden para toplıyalım npc leri öldürünce para düşsün
User prompt
Polisler bizi kovalamasın biz npc leri öldürelim
User prompt
Polisler bize ateş etmesin
User prompt
Polislerbizi öldürmesin yerlerde para olsun
User prompt
Polisler doğudumuzda gelmesin
User prompt
Biz dünyanın ortasında olalım polisler bize ateş etsin polisler bize 5 kez ateş ederse
User prompt
Diğer insanların üstünde npc yazsın
User prompt
Ve diğer insanlar yavaş yürüsün ve bir polis ölünce yeni polis doğusun ve harita büyük olsun yerde para olun cn barımızın altında para barımız olsun yerdeki paraları alınca para barına artı 50 para gelsin polis öldürünce yıldızlar artsın
User prompt
Oyundaki insanların renkleri farklı olsun hepsininki
User prompt
Oyundaki diğer insanlar farklı renkte olsun polislerin bizi kovalaması için onlara ateş etmemiz gereksin
User prompt
Oyunda ki en büyük hata doğudumuz an polis bizi öldürüyor bu olmasın başka insanlar olsun can barımız sol üst köşede olsun
User prompt
Silahımız olsun ekranın neresine tıklarsak oraya ateş etsin polisin bizi kovalaması için ona ateş etmemiz gereksin ve 5 canımız olsun polise her ateş ettiğimizde yeni polis arabayla gelsin ve arabadan inip bize ateş etsin polisten kaçmak için ateş etmememiz gerekiyor
Code edit (1 edits merged)
Please save this source code
User prompt
Mini City Heist
Initial prompt
GTA 6 ya benziyen oyun yap pls
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('mission', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 48; self.dir = 0; self.owner = null; // 'player' or 'police' self.update = function () { self.x += Math.cos(self.dir) * self.speed; self.y += Math.sin(self.dir) * self.speed; }; return self; }); // Car (stealable) var Car = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0; self.maxSpeed = 24; self.direction = 0; // radians self.driver = null; // player if inside self.isPolice = false; self.update = function () { if (self.driver) { // Move in direction self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; } }; return self; }); // CityBlock: road or building var CityBlock = Container.expand(function () { var self = Container.call(this); self.type = 'road'; // or 'building' self.setType = function (type) { self.type = type; if (self.asset) { self.removeChild(self.asset); } if (type === 'road') { self.asset = self.attachAsset('road', { anchorX: 0.5, anchorY: 0.5 }); } else { self.asset = self.attachAsset('building', { anchorX: 0.5, anchorY: 0.5 }); } }; return self; }); // Mission marker var Mission = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('mission', { anchorX: 0.5, anchorY: 0.5 }); self.active = true; return self; }); // Player character var Player = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 16; self.inCar = null; // reference to car if inside self.direction = 0; // radians, 0 = right self.update = function () { // If in car, follow car if (self.inCar) { self.x = self.inCar.x; self.y = self.inCar.y; self.visible = false; } else { self.visible = true; } }; return self; }); // Police car var PoliceCar = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('police', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0; self.maxSpeed = 20; self.direction = 0; self.target = null; // player or car self.isPolice = true; self.update = function () { if (self.target) { // Simple chase logic var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { self.direction = Math.atan2(dy, dx); self.speed = self.maxSpeed; self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; } else { self.speed = 0; } } }; return self; }); // Police shooter class (policeman on foot) var PoliceShooter = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('police', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.target = player; self.lastShotTick = 0; self.update = function () { // Move toward player var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 120) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } // Shoot at player every 40 ticks if close enough if (dist < 600 && LK.ticks - self.lastShotTick > 40) { var b = new Bullet(); b.x = self.x; b.y = self.y; b.dir = Math.atan2(dy, dx); b.owner = 'police'; policeBullets.push(b); game.addChild(b); self.lastShotTick = LK.ticks; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ // No title, no description // Always backgroundColor is black backgroundColor: 0x000000 }); /**** * Game Code ****/ // Mission marker - green ellipse // Police car - white box with blue // Car - yellow box // Player (hero) - red ellipse // Building - blue box // City block (road) - gray box // --- City Map Setup --- var cityCols = 5; var cityRows = 7; var blockSize = 400; var cityBlocks = []; var cityOffsetX = (2048 - cityCols * blockSize) / 2; var cityOffsetY = (2732 - cityRows * blockSize) / 2; // Generate city grid: roads and buildings for (var row = 0; row < cityRows; row++) { for (var col = 0; col < cityCols; col++) { var block = new CityBlock(); // Make a cross pattern of roads, rest buildings if (row === Math.floor(cityRows / 2) || col === Math.floor(cityCols / 2)) { block.setType('road'); } else { block.setType('building'); } block.x = cityOffsetX + col * blockSize + blockSize / 2; block.y = cityOffsetY + row * blockSize + blockSize / 2; cityBlocks.push(block); game.addChild(block); } } // --- Player Setup --- var player = new Player(); player.x = cityOffsetX + Math.floor(cityCols / 2) * blockSize + blockSize / 2; player.y = cityOffsetY + Math.floor(cityRows / 2) * blockSize + blockSize / 2; game.addChild(player); // --- Cars Setup --- var cars = []; function spawnCar(x, y) { var car = new Car(); car.x = x; car.y = y; car.direction = Math.random() * Math.PI * 2; cars.push(car); game.addChild(car); return car; } // Place a few cars on roads for (var i = 0; i < 4; i++) { var col = Math.floor(cityCols / 2); var row = 1 + i; var x = cityOffsetX + col * blockSize + blockSize / 2; var y = cityOffsetY + row * blockSize + blockSize / 2; spawnCar(x, y); } // --- Police Setup --- var policeCars = []; function spawnPolice(x, y) { var police = new PoliceCar(); police.x = x; police.y = y; police.direction = 0; police.target = player; policeCars.push(police); game.addChild(police); return police; } // Start with one police car var policeStartX = cityOffsetX + blockSize / 2; var policeStartY = cityOffsetY + blockSize / 2; spawnPolice(policeStartX, policeStartY); // --- Mission Setup --- var mission = new Mission(); mission.x = cityOffsetX + (cityCols - 1) * blockSize + blockSize / 2; mission.y = cityOffsetY + (cityRows - 1) * blockSize + blockSize / 2; game.addChild(mission); // --- Score and Wanted Level --- var score = 0; var wantedLevel = 1; // 1-5 var scoreTxt = new Text2('Score: 0', { size: 90, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var wantedTxt = new Text2('★', { size: 80, fill: "#ff0" }); wantedTxt.anchor.set(0.5, 0); LK.gui.topRight.addChild(wantedTxt); // --- Timer --- var timeLeft = 60; // seconds var timerTxt = new Text2('60', { size: 80, fill: "#fff" }); timerTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timerTxt); // --- Touch Controls --- var dragDir = null; // {dx,dy} var dragStart = null; var dragNode = null; var lastTouchX = 0, lastTouchY = 0; // --- Shooting & Health --- var bullets = []; var policeBullets = []; var playerHealth = 5; var healthTxt = new Text2('♥♥♥♥♥', { size: 80, fill: 0xFF4444 }); healthTxt.anchor.set(0.5, 0); LK.gui.left.addChild(healthTxt); // Track if police are aggressive (chasing) or passive var policeAggro = false; // Helper to update health display function updateHealthDisplay() { var hearts = ''; for (var i = 0; i < playerHealth; i++) hearts += '♥'; healthTxt.setText(hearts); } var policeShooters = []; // --- Helper Functions --- function isOnRoad(x, y) { // Returns true if (x,y) is on a road block for (var i = 0; i < cityBlocks.length; i++) { var b = cityBlocks[i]; if (b.type === 'road') { var left = b.x - blockSize / 2; var right = b.x + blockSize / 2; var top = b.y - blockSize / 2; var bottom = b.y + blockSize / 2; if (x >= left && x <= right && y >= top && y <= bottom) { return true; } } } return false; } function clampToRoad(x, y) { // Snap to nearest road block center if not on road var minDist = 99999, best = null; for (var i = 0; i < cityBlocks.length; i++) { var b = cityBlocks[i]; if (b.type === 'road') { var dx = b.x - x; var dy = b.y - y; var d = dx * dx + dy * dy; if (d < minDist) { minDist = d; best = b; } } } if (best) return { x: best.x, y: best.y }; return { x: x, y: y }; } function updateWantedDisplay() { var stars = ''; for (var i = 0; i < wantedLevel; i++) stars += '★'; wantedTxt.setText(stars); } function addScore(amt) { score += amt; scoreTxt.setText('Score: ' + score); LK.setScore(score); } function resetMission() { // Place mission at random road block var roadBlocks = []; for (var i = 0; i < cityBlocks.length; i++) { if (cityBlocks[i].type === 'road') roadBlocks.push(cityBlocks[i]); } var idx = Math.floor(Math.random() * roadBlocks.length); mission.x = roadBlocks[idx].x; mission.y = roadBlocks[idx].y; mission.active = true; mission.visible = true; } // --- Game Touch Controls --- // Drag to move (swipe in direction to move) game.down = function (x, y, obj) { // Don't allow drag from top left 100x100 if (x < 100 && y < 100) return; // --- SHOOTING LOGIC --- // If not dragging, treat as tap to shoot if (!dragNode && !dragDir) { // Player shoots toward (x, y) var b = new Bullet(); b.x = player.inCar ? player.inCar.x : player.x; b.y = player.inCar ? player.inCar.y : player.y; b.dir = Math.atan2(y - b.y, x - b.x); b.owner = 'player'; bullets.push(b); game.addChild(b); // If bullet would hit a police car or shooter, aggro police and spawn new police var hitPolice = false; for (var i = 0; i < policeCars.length; i++) { var pc = policeCars[i]; var dx = pc.x - b.x; var dy = pc.y - b.y; if (Math.abs(dx) < 100 && Math.abs(dy) < 60) { hitPolice = true; break; } } for (var i = 0; i < policeShooters.length; i++) { var ps = policeShooters[i]; var dx = ps.x - b.x; var dy = ps.y - b.y; if (Math.abs(dx) < 80 && Math.abs(dy) < 80) { hitPolice = true; break; } } if (hitPolice) { policeAggro = true; // All police target player or player's car for (var i = 0; i < policeCars.length; i++) { policeCars[i].target = player.inCar ? player.inCar : player; } // Spawn new police car and shooter at random road var roadBlocks = []; for (var i = 0; i < cityBlocks.length; i++) { if (cityBlocks[i].type === 'road') roadBlocks.push(cityBlocks[i]); } var idx = Math.floor(Math.random() * roadBlocks.length); var bblock = roadBlocks[idx]; var newPolice = spawnPolice(bblock.x, bblock.y); // Spawn police shooter next to car var shooter = new PoliceShooter(); shooter.x = bblock.x + 80; shooter.y = bblock.y; policeShooters.push(shooter); game.addChild(shooter); } } // --- DRAG LOGIC (movement) --- dragStart = { x: x, y: y }; lastTouchX = x; lastTouchY = y; dragDir = null; dragNode = player; }; game.move = function (x, y, obj) { if (!dragNode) return; var dx = x - dragStart.x; var dy = y - dragStart.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 30) { dragDir = { dx: dx, dy: dy }; } lastTouchX = x; lastTouchY = y; }; game.up = function (x, y, obj) { dragNode = null; dragDir = null; dragStart = null; }; // Tap on car to enter/exit game.on('down', function (x, y, obj) { // If player is not in car, check if tap is on car if (!player.inCar) { for (var i = 0; i < cars.length; i++) { var car = cars[i]; var dx = car.x - x; var dy = car.y - y; if (Math.abs(dx) < 80 && Math.abs(dy) < 50) { // Enter car if (Math.abs(player.x - car.x) < 100 && Math.abs(player.y - car.y) < 100) { player.inCar = car; car.driver = player; car.speed = car.maxSpeed; car.direction = 0; // Increase wanted level wantedLevel = Math.min(5, wantedLevel + 1); updateWantedDisplay(); // Police target car for (var j = 0; j < policeCars.length; j++) { policeCars[j].target = car; } } } } } else { // Exit car var car = player.inCar; player.inCar = null; car.driver = null; car.speed = 0; // Place player next to car player.x = car.x + 80; player.y = car.y; // Police target player for (var j = 0; j < policeCars.length; j++) { policeCars[j].target = player; } } }); // --- Game Update Loop --- game.update = function () { // Timer if (LK.ticks % 60 === 0 && timeLeft > 0) { timeLeft--; timerTxt.setText(timeLeft + ''); if (timeLeft === 0) { LK.showGameOver(); return; } } // Player movement if (!player.inCar && dragDir) { // Move player in drag direction, but only on road var angle = Math.atan2(dragDir.dy, dragDir.dx); var nx = player.x + Math.cos(angle) * player.speed; var ny = player.y + Math.sin(angle) * player.speed; if (isOnRoad(nx, ny)) { player.x = nx; player.y = ny; } } // Car movement (if player in car) for (var i = 0; i < cars.length; i++) { var car = cars[i]; car.update(); // Clamp car to road if (car.driver) { if (!isOnRoad(car.x, car.y)) { // Stop car at edge car.speed = 0; } } } // Police movement for (var i = 0; i < policeCars.length; i++) { var police = policeCars[i]; // Only chase if aggro or wantedLevel > 1 if (policeAggro || wantedLevel > 1) { police.update(); } // Clamp police to road if (!isOnRoad(police.x, police.y)) { police.speed = 0; } // Police catch player var target = police.target; if (target && Math.abs(police.x - target.x) < 80 && Math.abs(police.y - target.y) < 80) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // Police shooters update for (var i = policeShooters.length - 1; i >= 0; i--) { var shooter = policeShooters[i]; shooter.update(); // Remove if off map if (shooter.x < 0 || shooter.x > 2048 || shooter.y < 0 || shooter.y > 2732) { shooter.destroy(); policeShooters.splice(i, 1); } } // Bullets update (player) for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Remove if off screen if (b.x < 0 || b.x > 2048 || b.y < 0 || b.y > 2732) { b.destroy(); bullets.splice(i, 1); continue; } // Check hit police car for (var j = 0; j < policeCars.length; j++) { var pc = policeCars[j]; if (Math.abs(pc.x - b.x) < 100 && Math.abs(pc.y - b.y) < 60) { // Remove police car and bullet pc.destroy(); policeCars.splice(j, 1); b.destroy(); bullets.splice(i, 1); break; } } // Check hit police shooter for (var j = 0; j < policeShooters.length; j++) { var ps = policeShooters[j]; if (Math.abs(ps.x - b.x) < 80 && Math.abs(ps.y - b.y) < 80) { ps.destroy(); policeShooters.splice(j, 1); b.destroy(); bullets.splice(i, 1); break; } } } // Bullets update (police) for (var i = policeBullets.length - 1; i >= 0; i--) { var b = policeBullets[i]; b.update(); // Remove if off screen if (b.x < 0 || b.x > 2048 || b.y < 0 || b.y > 2732) { b.destroy(); policeBullets.splice(i, 1); continue; } // Check hit player var px = player.inCar ? player.inCar.x : player.x; var py = player.inCar ? player.inCar.y : player.y; if (Math.abs(px - b.x) < 60 && Math.abs(py - b.y) < 60) { playerHealth--; updateHealthDisplay(); b.destroy(); policeBullets.splice(i, 1); if (playerHealth <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } } // Player update player.update(); // Mission check if (mission.active) { var px = player.inCar ? player.inCar.x : player.x; var py = player.inCar ? player.inCar.y : player.y; if (Math.abs(mission.x - px) < 80 && Math.abs(mission.y - py) < 80) { // Complete mission addScore(10 * wantedLevel); mission.active = false; mission.visible = false; // Increase wanted level, spawn more police wantedLevel = Math.min(5, wantedLevel + 1); updateWantedDisplay(); if (wantedLevel > policeCars.length) { // Spawn new police at random road var roadBlocks = []; for (var i = 0; i < cityBlocks.length; i++) { if (cityBlocks[i].type === 'road') roadBlocks.push(cityBlocks[i]); } var idx = Math.floor(Math.random() * roadBlocks.length); var b = roadBlocks[idx]; spawnPolice(b.x, b.y); } // Next mission after short delay LK.setTimeout(function () { resetMission(); }, 1200); } } // Win condition: score >= 100 if (score >= 100) { LK.showYouWin(); return; } }; // --- Start State --- addScore(0); updateWantedDisplay(); timerTxt.setText(timeLeft + ''); resetMission(); playerHealth = 5; updateHealthDisplay(); policeAggro = false;
===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,24 @@
/****
* Classes
****/
+// Bullet class
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ self.asset = self.attachAsset('mission', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 48;
+ self.dir = 0;
+ self.owner = null; // 'player' or 'police'
+ self.update = function () {
+ self.x += Math.cos(self.dir) * self.speed;
+ self.y += Math.sin(self.dir) * self.speed;
+ };
+ return self;
+});
// Car (stealable)
var Car = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('car', {
@@ -111,14 +127,49 @@
}
};
return self;
});
+// Police shooter class (policeman on foot)
+var PoliceShooter = Container.expand(function () {
+ var self = Container.call(this);
+ self.asset = self.attachAsset('police', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.target = player;
+ self.lastShotTick = 0;
+ self.update = function () {
+ // Move toward player
+ var dx = self.target.x - self.x;
+ var dy = self.target.y - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 120) {
+ self.x += dx / dist * self.speed;
+ self.y += dy / dist * self.speed;
+ }
+ // Shoot at player every 40 ticks if close enough
+ if (dist < 600 && LK.ticks - self.lastShotTick > 40) {
+ var b = new Bullet();
+ b.x = self.x;
+ b.y = self.y;
+ b.dir = Math.atan2(dy, dx);
+ b.owner = 'police';
+ policeBullets.push(b);
+ game.addChild(b);
+ self.lastShotTick = LK.ticks;
+ }
+ };
+ return self;
+});
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x222222
+ // No title, no description
+ // Always backgroundColor is black
+ backgroundColor: 0x000000
});
/****
* Game Code
@@ -225,8 +276,27 @@
var dragStart = null;
var dragNode = null;
var lastTouchX = 0,
lastTouchY = 0;
+// --- Shooting & Health ---
+var bullets = [];
+var policeBullets = [];
+var playerHealth = 5;
+var healthTxt = new Text2('♥♥♥♥♥', {
+ size: 80,
+ fill: 0xFF4444
+});
+healthTxt.anchor.set(0.5, 0);
+LK.gui.left.addChild(healthTxt);
+// Track if police are aggressive (chasing) or passive
+var policeAggro = false;
+// Helper to update health display
+function updateHealthDisplay() {
+ var hearts = '';
+ for (var i = 0; i < playerHealth; i++) hearts += '♥';
+ healthTxt.setText(hearts);
+}
+var policeShooters = [];
// --- Helper Functions ---
function isOnRoad(x, y) {
// Returns true if (x,y) is on a road block
for (var i = 0; i < cityBlocks.length; i++) {
@@ -294,8 +364,62 @@
// Drag to move (swipe in direction to move)
game.down = function (x, y, obj) {
// Don't allow drag from top left 100x100
if (x < 100 && y < 100) return;
+ // --- SHOOTING LOGIC ---
+ // If not dragging, treat as tap to shoot
+ if (!dragNode && !dragDir) {
+ // Player shoots toward (x, y)
+ var b = new Bullet();
+ b.x = player.inCar ? player.inCar.x : player.x;
+ b.y = player.inCar ? player.inCar.y : player.y;
+ b.dir = Math.atan2(y - b.y, x - b.x);
+ b.owner = 'player';
+ bullets.push(b);
+ game.addChild(b);
+ // If bullet would hit a police car or shooter, aggro police and spawn new police
+ var hitPolice = false;
+ for (var i = 0; i < policeCars.length; i++) {
+ var pc = policeCars[i];
+ var dx = pc.x - b.x;
+ var dy = pc.y - b.y;
+ if (Math.abs(dx) < 100 && Math.abs(dy) < 60) {
+ hitPolice = true;
+ break;
+ }
+ }
+ for (var i = 0; i < policeShooters.length; i++) {
+ var ps = policeShooters[i];
+ var dx = ps.x - b.x;
+ var dy = ps.y - b.y;
+ if (Math.abs(dx) < 80 && Math.abs(dy) < 80) {
+ hitPolice = true;
+ break;
+ }
+ }
+ if (hitPolice) {
+ policeAggro = true;
+ // All police target player or player's car
+ for (var i = 0; i < policeCars.length; i++) {
+ policeCars[i].target = player.inCar ? player.inCar : player;
+ }
+ // Spawn new police car and shooter at random road
+ var roadBlocks = [];
+ for (var i = 0; i < cityBlocks.length; i++) {
+ if (cityBlocks[i].type === 'road') roadBlocks.push(cityBlocks[i]);
+ }
+ var idx = Math.floor(Math.random() * roadBlocks.length);
+ var bblock = roadBlocks[idx];
+ var newPolice = spawnPolice(bblock.x, bblock.y);
+ // Spawn police shooter next to car
+ var shooter = new PoliceShooter();
+ shooter.x = bblock.x + 80;
+ shooter.y = bblock.y;
+ policeShooters.push(shooter);
+ game.addChild(shooter);
+ }
+ }
+ // --- DRAG LOGIC (movement) ---
dragStart = {
x: x,
y: y
};
@@ -399,22 +523,93 @@
}
// Police movement
for (var i = 0; i < policeCars.length; i++) {
var police = policeCars[i];
- police.update();
+ // Only chase if aggro or wantedLevel > 1
+ if (policeAggro || wantedLevel > 1) {
+ police.update();
+ }
// Clamp police to road
if (!isOnRoad(police.x, police.y)) {
police.speed = 0;
}
// Police catch player
var target = police.target;
if (target && Math.abs(police.x - target.x) < 80 && Math.abs(police.y - target.y) < 80) {
- // Game over
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
+ // Police shooters update
+ for (var i = policeShooters.length - 1; i >= 0; i--) {
+ var shooter = policeShooters[i];
+ shooter.update();
+ // Remove if off map
+ if (shooter.x < 0 || shooter.x > 2048 || shooter.y < 0 || shooter.y > 2732) {
+ shooter.destroy();
+ policeShooters.splice(i, 1);
+ }
+ }
+ // Bullets update (player)
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var b = bullets[i];
+ b.update();
+ // Remove if off screen
+ if (b.x < 0 || b.x > 2048 || b.y < 0 || b.y > 2732) {
+ b.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check hit police car
+ for (var j = 0; j < policeCars.length; j++) {
+ var pc = policeCars[j];
+ if (Math.abs(pc.x - b.x) < 100 && Math.abs(pc.y - b.y) < 60) {
+ // Remove police car and bullet
+ pc.destroy();
+ policeCars.splice(j, 1);
+ b.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ // Check hit police shooter
+ for (var j = 0; j < policeShooters.length; j++) {
+ var ps = policeShooters[j];
+ if (Math.abs(ps.x - b.x) < 80 && Math.abs(ps.y - b.y) < 80) {
+ ps.destroy();
+ policeShooters.splice(j, 1);
+ b.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Bullets update (police)
+ for (var i = policeBullets.length - 1; i >= 0; i--) {
+ var b = policeBullets[i];
+ b.update();
+ // Remove if off screen
+ if (b.x < 0 || b.x > 2048 || b.y < 0 || b.y > 2732) {
+ b.destroy();
+ policeBullets.splice(i, 1);
+ continue;
+ }
+ // Check hit player
+ var px = player.inCar ? player.inCar.x : player.x;
+ var py = player.inCar ? player.inCar.y : player.y;
+ if (Math.abs(px - b.x) < 60 && Math.abs(py - b.y) < 60) {
+ playerHealth--;
+ updateHealthDisplay();
+ b.destroy();
+ policeBullets.splice(i, 1);
+ if (playerHealth <= 0) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ }
// Player update
player.update();
// Mission check
if (mission.active) {
@@ -453,5 +648,8 @@
// --- Start State ---
addScore(0);
updateWantedDisplay();
timerTxt.setText(timeLeft + '');
-resetMission();
\ No newline at end of file
+resetMission();
+playerHealth = 5;
+updateHealthDisplay();
+policeAggro = false;
\ No newline at end of file