User prompt
Npc öldürünce polisler bizi öldürsün
User prompt
Police ölünce 2adet police spaenlansın sürekli tekrarlanıyor
User prompt
Polisler fazla olsun ve policenin üstünde polis yazsın playerın üstünde you yazsın
User prompt
Polisler bize 5 kere ateş edince ölelim
User prompt
Polisler bize ateş etsin
User prompt
Bir polis ölünce yeni polis doğusun ve o polisler bize ateş etsin
User prompt
Polisler ateş edince onlar bize ateş etsin
User prompt
Npcler bize ateş etsin ellerinde silah olsun ve biz ölmiyelim
User prompt
Bazı npcler bize silahla ateş etsin ama biz ölmiyelim
User prompt
Arbalar daha yavaş olsun her yerde ve arabaları playerı kontrol ettiğimiz gibi olsun
User prompt
Araba daha yavaş gidsin
User prompt
Arabaya bininca yavaşca arabayla gidelim
User prompt
Harita yem yeşil olsun
User prompt
Düşen silahların üzerinde gun yazsın
User prompt
Polisler ölünce polislerden gun düşsün
User prompt
Polisler ölsün
User prompt
Silahla mermi ayrı olsun
User prompt
Silah para atmasın mermi atsın
User prompt
Playerın elinde silah olsun ve mermi atsın
User prompt
Mermi olsun
User prompt
Mermi
User prompt
Harita istanbula benzesin
User prompt
Arabalar olsun arabalara yaklaşınca binelim ve araba sürelim arabadan inmek için ekrana üçkere ard arda tıklamamız gereksin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Araba olsun binalar kalksın
User prompt
Oyun bitmesin
/**** * 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; }); var Civilian = Container.expand(function () { var self = Container.call(this); // Pick a random color asset for this civilian var civAssetIdx = 1 + Math.floor(Math.random() * 6); var civAssetName = 'civilian' + civAssetIdx; self.asset = self.attachAsset(civAssetName, { anchorX: 0.5, anchorY: 0.5 }); self.asset.alpha = 0.7; // Add 'npc' label above the civilian self.npcLabel = new Text2('npc', { size: 38, fill: 0xFFFFFF }); self.npcLabel.anchor.set(0.5, 1); self.npcLabel.y = -40; self.addChild(self.npcLabel); self.speed = 2 + Math.random() * 2; self.direction = Math.random() * Math.PI * 2; self.update = function () { // Move in direction, bounce off buildings var nx = self.x + Math.cos(self.direction) * self.speed; var ny = self.y + Math.sin(self.direction) * self.speed; var onRoad = false; 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 (nx >= left && nx <= right && ny >= top && ny <= bottom) { onRoad = true; break; } } } if (onRoad) { self.x = nx; self.y = ny; } else { self.direction = Math.random() * Math.PI * 2; } }; return self; }); // Spawn 6 civilians at random road blocks (not near player or police) // 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; // Police shooters do not target the player anymore self.target = null; 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; } // Police shooters do not fire at the player anymore }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ // No title, no description // Always backgroundColor is black backgroundColor: 0x000000 }); /**** * Game Code ****/ // --- City Map Setup --- // City block (road) - gray box // Building - blue box // Player (hero) - red ellipse // Car - yellow box // Police car - white box with blue // Mission marker - green ellipse var cityCols = 9; var cityRows = 13; 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 --- // Spawn player at center of the world 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); // --- Civilians Setup --- var civilians = []; // Spawn 6 civilians at random road blocks (not near player or police) for (var i = 0; i < 6; i++) { var roadBlocks = []; for (var j = 0; j < cityBlocks.length; j++) { var b = cityBlocks[j]; if (b.type === 'road') { // Avoid spawn near player or police var distToPlayer = Math.sqrt(Math.pow(b.x - player.x, 2) + Math.pow(b.y - player.y, 2)); var distToPolice = Math.sqrt(Math.pow(b.x - (cityOffsetX + blockSize / 2), 2) + Math.pow(b.y - (cityOffsetY + blockSize / 2), 2)); if (distToPlayer > 400 && distToPolice > 400) { roadBlocks.push(b); } } } if (roadBlocks.length > 0) { var idx = Math.floor(Math.random() * roadBlocks.length); var civ = new Civilian(); civ.x = roadBlocks[idx].x + (Math.random() - 0.5) * 100; civ.y = roadBlocks[idx].y + (Math.random() - 0.5) * 100; civilians.push(civ); game.addChild(civ); } } // --- 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 do not chase the player anymore police.target = null; 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); // --- Money on ground --- var moneyPickups = []; function spawnMoney(x, y) { var m = new Container(); m.asset = m.attachAsset('mission', { anchorX: 0.5, anchorY: 0.5 }); m.x = x; m.y = y; m.value = 50; moneyPickups.push(m); game.addChild(m); return m; } // Place 15 money pickups at random road blocks for (var i = 0; i < 15; i++) { var roadBlocks = []; for (var j = 0; j < cityBlocks.length; j++) { if (cityBlocks[j].type === 'road') roadBlocks.push(cityBlocks[j]); } if (roadBlocks.length > 0) { var idx = Math.floor(Math.random() * roadBlocks.length); var b = roadBlocks[idx]; var mx = b.x + (Math.random() - 0.5) * (blockSize - 100); var my = b.y + (Math.random() - 0.5) * (blockSize - 100); spawnMoney(mx, my); } } // --- 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; // Money system var playerMoney = 0; var moneyTxt = new Text2('₺ 0', { size: 70, fill: 0x44FF44 }); moneyTxt.anchor.set(0, 0); moneyTxt.x = 100; moneyTxt.y = 90; LK.gui.addChild(moneyTxt); var healthTxt = new Text2('♥♥♥♥♥', { size: 80, fill: 0xFF4444 }); healthTxt.anchor.set(0, 0); // anchor top left // Place health bar at (100,0) to avoid platform menu healthTxt.x = 100; healthTxt.y = 0; LK.gui.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); } function updateMoneyDisplay() { moneyTxt.setText('₺ ' + playerMoney); } 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); // No police aggro or wanted level increase when shooting police } // --- 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 + ''); // Do not end the game when timer reaches zero } // 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]; // Police patrol logic: move randomly on roads if not chasing if (!policeAggro) { if (typeof police.patrolTarget === "undefined" || !police.patrolTarget) { // Pick a random road block as patrol target var roadBlocks = []; for (var k = 0; k < cityBlocks.length; k++) { if (cityBlocks[k].type === 'road') roadBlocks.push(cityBlocks[k]); } if (roadBlocks.length > 0) { var idx = Math.floor(Math.random() * roadBlocks.length); police.patrolTarget = { x: roadBlocks[idx].x + (Math.random() - 0.5) * 100, y: roadBlocks[idx].y + (Math.random() - 0.5) * 100 }; } } if (police.patrolTarget) { var dx = police.patrolTarget.x - police.x; var dy = police.patrolTarget.y - police.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { police.direction = Math.atan2(dy, dx); police.speed = police.maxSpeed * 0.5; police.x += Math.cos(police.direction) * police.speed; police.y += Math.sin(police.direction) * police.speed; } else { // Arrived at patrol target, pick a new one next frame police.patrolTarget = null; police.speed = 0; } } } else { police.update(); } // Clamp police to road if (!isOnRoad(police.x, police.y)) { police.speed = 0; } // Police catch player // (Disabled: police do not kill the player anymore) // var target = police.target; // if (policeAggro && 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; } // Remove all logic for shooting and killing police cars and shooters } // 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--; if (typeof policeHitCount === "undefined") policeHitCount = 0; policeHitCount++; updateHealthDisplay(); b.destroy(); policeBullets.splice(i, 1); if (policeHitCount >= 5) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } if (playerHealth <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } } // Player update player.update(); // Civilians update and check for being shot by player for (var i = civilians.length - 1; i >= 0; i--) { var civ = civilians[i]; civ.update(); // Check if hit by any player bullet for (var j = bullets.length - 1; j >= 0; j--) { var b = bullets[j]; if (Math.abs(civ.x - b.x) < 60 && Math.abs(civ.y - b.y) < 60) { // Civilian killed // Drop money at civilian's position spawnMoney(civ.x, civ.y); // Respawn civilian at random road block var roadBlocks = []; for (var k = 0; k < cityBlocks.length; k++) { if (cityBlocks[k].type === 'road') roadBlocks.push(cityBlocks[k]); } if (roadBlocks.length > 0) { var idx = Math.floor(Math.random() * roadBlocks.length); var newCiv = new Civilian(); newCiv.x = roadBlocks[idx].x + (Math.random() - 0.5) * 100; newCiv.y = roadBlocks[idx].y + (Math.random() - 0.5) * 100; civilians.push(newCiv); game.addChild(newCiv); } civ.destroy(); civilians.splice(i, 1); b.destroy(); bullets.splice(j, 1); addScore(10); break; } } } // Money pickup check var px = player.inCar ? player.inCar.x : player.x; var py = player.inCar ? player.inCar.y : player.y; for (var i = moneyPickups.length - 1; i >= 0; i--) { var m = moneyPickups[i]; if (Math.abs(m.x - px) < 60 && Math.abs(m.y - py) < 60) { playerMoney += m.value; updateMoneyDisplay(); m.destroy(); moneyPickups.splice(i, 1); } } // 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 removed: game never ends when score >= 100 }; // --- Start State --- addScore(0); updateWantedDisplay(); timerTxt.setText(timeLeft + ''); resetMission(); playerHealth = 5; updateHealthDisplay(); playerMoney = 0; updateMoneyDisplay(); policeAggro = false; var policeHitCount = 0; ; ;
/****
* 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;
});
var Civilian = Container.expand(function () {
var self = Container.call(this);
// Pick a random color asset for this civilian
var civAssetIdx = 1 + Math.floor(Math.random() * 6);
var civAssetName = 'civilian' + civAssetIdx;
self.asset = self.attachAsset(civAssetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.asset.alpha = 0.7;
// Add 'npc' label above the civilian
self.npcLabel = new Text2('npc', {
size: 38,
fill: 0xFFFFFF
});
self.npcLabel.anchor.set(0.5, 1);
self.npcLabel.y = -40;
self.addChild(self.npcLabel);
self.speed = 2 + Math.random() * 2;
self.direction = Math.random() * Math.PI * 2;
self.update = function () {
// Move in direction, bounce off buildings
var nx = self.x + Math.cos(self.direction) * self.speed;
var ny = self.y + Math.sin(self.direction) * self.speed;
var onRoad = false;
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 (nx >= left && nx <= right && ny >= top && ny <= bottom) {
onRoad = true;
break;
}
}
}
if (onRoad) {
self.x = nx;
self.y = ny;
} else {
self.direction = Math.random() * Math.PI * 2;
}
};
return self;
});
// Spawn 6 civilians at random road blocks (not near player or police)
// 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;
// Police shooters do not target the player anymore
self.target = null;
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;
}
// Police shooters do not fire at the player anymore
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
// No title, no description
// Always backgroundColor is black
backgroundColor: 0x000000
});
/****
* Game Code
****/
// --- City Map Setup ---
// City block (road) - gray box
// Building - blue box
// Player (hero) - red ellipse
// Car - yellow box
// Police car - white box with blue
// Mission marker - green ellipse
var cityCols = 9;
var cityRows = 13;
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 ---
// Spawn player at center of the world
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);
// --- Civilians Setup ---
var civilians = [];
// Spawn 6 civilians at random road blocks (not near player or police)
for (var i = 0; i < 6; i++) {
var roadBlocks = [];
for (var j = 0; j < cityBlocks.length; j++) {
var b = cityBlocks[j];
if (b.type === 'road') {
// Avoid spawn near player or police
var distToPlayer = Math.sqrt(Math.pow(b.x - player.x, 2) + Math.pow(b.y - player.y, 2));
var distToPolice = Math.sqrt(Math.pow(b.x - (cityOffsetX + blockSize / 2), 2) + Math.pow(b.y - (cityOffsetY + blockSize / 2), 2));
if (distToPlayer > 400 && distToPolice > 400) {
roadBlocks.push(b);
}
}
}
if (roadBlocks.length > 0) {
var idx = Math.floor(Math.random() * roadBlocks.length);
var civ = new Civilian();
civ.x = roadBlocks[idx].x + (Math.random() - 0.5) * 100;
civ.y = roadBlocks[idx].y + (Math.random() - 0.5) * 100;
civilians.push(civ);
game.addChild(civ);
}
}
// --- 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 do not chase the player anymore
police.target = null;
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);
// --- Money on ground ---
var moneyPickups = [];
function spawnMoney(x, y) {
var m = new Container();
m.asset = m.attachAsset('mission', {
anchorX: 0.5,
anchorY: 0.5
});
m.x = x;
m.y = y;
m.value = 50;
moneyPickups.push(m);
game.addChild(m);
return m;
}
// Place 15 money pickups at random road blocks
for (var i = 0; i < 15; i++) {
var roadBlocks = [];
for (var j = 0; j < cityBlocks.length; j++) {
if (cityBlocks[j].type === 'road') roadBlocks.push(cityBlocks[j]);
}
if (roadBlocks.length > 0) {
var idx = Math.floor(Math.random() * roadBlocks.length);
var b = roadBlocks[idx];
var mx = b.x + (Math.random() - 0.5) * (blockSize - 100);
var my = b.y + (Math.random() - 0.5) * (blockSize - 100);
spawnMoney(mx, my);
}
}
// --- 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;
// Money system
var playerMoney = 0;
var moneyTxt = new Text2('₺ 0', {
size: 70,
fill: 0x44FF44
});
moneyTxt.anchor.set(0, 0);
moneyTxt.x = 100;
moneyTxt.y = 90;
LK.gui.addChild(moneyTxt);
var healthTxt = new Text2('♥♥♥♥♥', {
size: 80,
fill: 0xFF4444
});
healthTxt.anchor.set(0, 0); // anchor top left
// Place health bar at (100,0) to avoid platform menu
healthTxt.x = 100;
healthTxt.y = 0;
LK.gui.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);
}
function updateMoneyDisplay() {
moneyTxt.setText('₺ ' + playerMoney);
}
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);
// No police aggro or wanted level increase when shooting police
}
// --- 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 + '');
// Do not end the game when timer reaches zero
}
// 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];
// Police patrol logic: move randomly on roads if not chasing
if (!policeAggro) {
if (typeof police.patrolTarget === "undefined" || !police.patrolTarget) {
// Pick a random road block as patrol target
var roadBlocks = [];
for (var k = 0; k < cityBlocks.length; k++) {
if (cityBlocks[k].type === 'road') roadBlocks.push(cityBlocks[k]);
}
if (roadBlocks.length > 0) {
var idx = Math.floor(Math.random() * roadBlocks.length);
police.patrolTarget = {
x: roadBlocks[idx].x + (Math.random() - 0.5) * 100,
y: roadBlocks[idx].y + (Math.random() - 0.5) * 100
};
}
}
if (police.patrolTarget) {
var dx = police.patrolTarget.x - police.x;
var dy = police.patrolTarget.y - police.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 10) {
police.direction = Math.atan2(dy, dx);
police.speed = police.maxSpeed * 0.5;
police.x += Math.cos(police.direction) * police.speed;
police.y += Math.sin(police.direction) * police.speed;
} else {
// Arrived at patrol target, pick a new one next frame
police.patrolTarget = null;
police.speed = 0;
}
}
} else {
police.update();
}
// Clamp police to road
if (!isOnRoad(police.x, police.y)) {
police.speed = 0;
}
// Police catch player
// (Disabled: police do not kill the player anymore)
// var target = police.target;
// if (policeAggro && 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;
}
// Remove all logic for shooting and killing police cars and shooters
}
// 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--;
if (typeof policeHitCount === "undefined") policeHitCount = 0;
policeHitCount++;
updateHealthDisplay();
b.destroy();
policeBullets.splice(i, 1);
if (policeHitCount >= 5) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
if (playerHealth <= 0) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Player update
player.update();
// Civilians update and check for being shot by player
for (var i = civilians.length - 1; i >= 0; i--) {
var civ = civilians[i];
civ.update();
// Check if hit by any player bullet
for (var j = bullets.length - 1; j >= 0; j--) {
var b = bullets[j];
if (Math.abs(civ.x - b.x) < 60 && Math.abs(civ.y - b.y) < 60) {
// Civilian killed
// Drop money at civilian's position
spawnMoney(civ.x, civ.y);
// Respawn civilian at random road block
var roadBlocks = [];
for (var k = 0; k < cityBlocks.length; k++) {
if (cityBlocks[k].type === 'road') roadBlocks.push(cityBlocks[k]);
}
if (roadBlocks.length > 0) {
var idx = Math.floor(Math.random() * roadBlocks.length);
var newCiv = new Civilian();
newCiv.x = roadBlocks[idx].x + (Math.random() - 0.5) * 100;
newCiv.y = roadBlocks[idx].y + (Math.random() - 0.5) * 100;
civilians.push(newCiv);
game.addChild(newCiv);
}
civ.destroy();
civilians.splice(i, 1);
b.destroy();
bullets.splice(j, 1);
addScore(10);
break;
}
}
}
// Money pickup check
var px = player.inCar ? player.inCar.x : player.x;
var py = player.inCar ? player.inCar.y : player.y;
for (var i = moneyPickups.length - 1; i >= 0; i--) {
var m = moneyPickups[i];
if (Math.abs(m.x - px) < 60 && Math.abs(m.y - py) < 60) {
playerMoney += m.value;
updateMoneyDisplay();
m.destroy();
moneyPickups.splice(i, 1);
}
}
// 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 removed: game never ends when score >= 100
};
// --- Start State ---
addScore(0);
updateWantedDisplay();
timerTxt.setText(timeLeft + '');
resetMission();
playerHealth = 5;
updateHealthDisplay();
playerMoney = 0;
updateMoneyDisplay();
policeAggro = false;
var policeHitCount = 0;
;
;