/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Car (can be player or NPC) var Car = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; // Further reduced car speed for slower movement self.dir = 0; // 0: right, 1: down, 2: left, 3: up self.hasDriver = false; self.isPolice = false; self.update = function () { if (self.hasDriver) { // Player driving: follow target var dx = player.targetX - self.x; var dy = player.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > self.speed) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } else { // Parked car: do not move at all // (No movement code here) } }; return self; }); // CityTile: A single tile in the city grid var CityTile = Container.expand(function () { var self = Container.call(this); self.type = 'road'; // default self.setType = function (type) { self.type = type; if (self.asset) { self.removeChild(self.asset); } self.asset = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); }; return self; }); // Mermi (bullet) class var Mermi = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('mermi', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 32; self.targetX = 0; self.targetY = 0; self.vx = 0; self.vy = 0; self.lastX = self.x; self.lastY = self.y; self.setTarget = function (tx, ty) { self.targetX = tx; self.targetY = ty; var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.vx = self.speed * dx / dist; self.vy = self.speed * dy / dist; } else { self.vx = 0; self.vy = 0; } // Set rotation to face direction self.rotation = Math.atan2(dy, dx); }; self.update = function () { self.lastX = self.x; self.lastY = self.y; self.x += self.vx; self.y += self.vy; }; 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; }); // NPC (pedestrian) var NPC = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('npc', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2 + Math.floor(Math.random() * 2); // Further reduced speed for NPCs self.dir = Math.floor(Math.random() * 4); self.update = function () { // Simple random walk if (self.dir === 0) { self.x += self.speed; } if (self.dir === 1) { self.y += self.speed; } if (self.dir === 2) { self.x -= self.speed; } if (self.dir === 3) { self.y -= self.speed; } // Change direction randomly if (Math.random() < 0.01) { self.dir = Math.floor(Math.random() * 4); } }; return self; }); // Pickup (collectible) var Pickup = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('pickup', { anchorX: 0.5, anchorY: 0.5 }); self.active = true; return self; }); // Player character var Player = Container.expand(function (characterId) { var self = Container.call(this); var assetId = characterId || 'player'; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // Add name label above the character self.nameLabel = new Text2(assetId.toUpperCase(), { size: 60, fill: "#fff" }); self.nameLabel.anchor.set(0.5, 1); // center horizontally, bottom of text at y=0 self.nameLabel.x = 0; self.nameLabel.y = -70; // position above the character asset self.addChild(self.nameLabel); self.speed = 2; // Further reduced player speed self.isInCar = false; self.car = null; self.targetX = self.x; self.targetY = self.y; self.update = function () { // Move towards targetX, targetY var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > self.speed) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } else { self.x = self.targetX; self.y = self.targetY; } }; self.enterCar = function (car) { self.isInCar = true; self.car = car; self.visible = false; car.hasDriver = true; }; self.exitCar = function () { if (self.car) { self.x = self.car.x; self.y = self.car.y + 90; self.isInCar = false; self.visible = true; self.car.hasDriver = false; self.car = null; } }; 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 = 3; // Further reduced police speed self.dir = 0; self.hasDriver = true; self.isPolice = true; self.update = function () { // Chase player var target = player.isInCar ? player.car : player; var dx = target.x - self.x; var dy = target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // --- Giriş (Start) Screen removed --- // --- City Map Setup --- var cityCols = 7; var cityRows = 9; var tileSize = 256; var cityTiles = []; var cityOffsetX = (2048 - cityCols * tileSize) / 2; var cityOffsetY = (2732 - cityRows * tileSize) / 2; // Generate city grid for (var row = 0; row < cityRows; row++) { for (var col = 0; col < cityCols; col++) { var tile = new CityTile(); var x = cityOffsetX + col * tileSize + tileSize / 2; var y = cityOffsetY + row * tileSize + tileSize / 2; tile.x = x; tile.y = y; // Edges are buildings, center is road, some grass if (row === 0 || row === cityRows - 1 || col === 0 || col === cityCols - 1) { tile.setType('building'); } else if ((row + col) % 4 === 0) { tile.setType('grass'); } else { tile.setType('road'); } game.addChild(tile); cityTiles.push(tile); } } // --- Player Setup --- var player, silah; // Randomly pick 'enishan', 'melih' or 'cihangir' as the player character var characterOptions = ['enishan', 'melih', 'cihangir']; var chosenCharacter = characterOptions[Math.floor(Math.random() * characterOptions.length)]; player = new Player(chosenCharacter); player.x = cityOffsetX + tileSize * 3.5; player.y = cityOffsetY + tileSize * 7.5; player.targetX = player.x; player.targetY = player.y; game.addChild(player); // --- Silah (gun) Setup --- silah = LK.getAsset('silah', { anchorX: 0.5, anchorY: 0.5 }); silah.x = player.x + 40; silah.y = player.y; game.addChild(silah); // --- Cars Setup --- // Only one parked car var cars = []; var car = new Car(); car.x = cityOffsetX + tileSize * 3.5; car.y = cityOffsetY + tileSize * 2.5; car.dir = 0; cars.push(car); game.addChild(car); // --- Police Setup --- var policeCars = []; var policeSpawned = false; // Track police hit count for escape win condition var policeHitCount = 0; // --- NPCs Setup --- var npcs = []; for (var i = 0; i < 5; i++) { var npc = new NPC(); npc.x = cityOffsetX + tileSize * (1 + Math.random() * 5); npc.y = cityOffsetY + tileSize * (1 + Math.random() * 7); npcs.push(npc); game.addChild(npc); } // --- Missions & Pickups --- var missions = []; var pickups = []; function spawnMission() { var m = new Mission(); // Place at random road tile var validTiles = cityTiles.filter(function (t) { return t.type === 'road'; }); var tile = validTiles[Math.floor(Math.random() * validTiles.length)]; m.x = tile.x; m.y = tile.y; missions.push(m); game.addChild(m); } function spawnPickup() { var p = new Pickup(); var validTiles = cityTiles.filter(function (t) { return t.type === 'road'; }); var tile = validTiles[Math.floor(Math.random() * validTiles.length)]; p.x = tile.x + (Math.random() - 0.5) * 80; p.y = tile.y + (Math.random() - 0.5) * 80; pickups.push(p); game.addChild(p); } spawnMission(); spawnPickup(); // --- Score & Wanted Level --- var score = 0; var wanted = 0; // 0: none, 1: police chase var scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var wantedTxt = new Text2('', { size: 80, fill: 0xFF5252 }); wantedTxt.anchor.set(0.5, 0); LK.gui.top.addChild(wantedTxt); wantedTxt.y = 120; // --- Drag/Touch Controls --- var dragNode = null; // Mermi (bullet) array var mermis = []; function handleMove(x, y, obj) { // Clamp to city area var tx = Math.max(cityOffsetX + tileSize / 2, Math.min(x, cityOffsetX + cityCols * tileSize - tileSize / 2)); var ty = Math.max(cityOffsetY + tileSize / 2, Math.min(y, cityOffsetY + cityRows * tileSize - tileSize / 2)); if (player.isInCar && player.car) { player.targetX = tx; player.targetY = ty; } else { player.targetX = tx; player.targetY = ty; } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = player; handleMove(x, y, obj); // Fire mermi (bullet) toward tap/clicked position if player is not in car if (typeof player !== "undefined" && player && typeof player.isInCar !== "undefined" && !player.isInCar) { var mermi = new Mermi(); mermi.x = silah.x; mermi.y = silah.y; mermi.setTarget(x, y); // Move toward tap/clicked position mermis.push(mermi); game.addChild(mermi); // Play mermi3 sound when bullet is fired LK.getSound('mermi3').play(); } }; game.up = function (x, y, obj) { dragNode = null; }; // --- Game Update Loop --- game.update = function () { // Player update // Make player follow the pointer if dragNode is set (i.e. user is touching/dragging) if (dragNode === player && typeof LK.pointer !== "undefined" && LK.pointer.active) { // LK.pointer.x/y are in game coordinates var tx = Math.max(cityOffsetX + tileSize / 2, Math.min(LK.pointer.x, cityOffsetX + cityCols * tileSize - tileSize / 2)); var ty = Math.max(cityOffsetY + tileSize / 2, Math.min(LK.pointer.y, cityOffsetY + cityRows * tileSize - tileSize / 2)); if (player.isInCar && player.car) { player.targetX = tx; player.targetY = ty; } else { player.targetX = tx; player.targetY = ty; } } if (player && typeof player.update === "function") { player.update(); } // Make silah follow player (only when not in car) if (!player.isInCar) { silah.visible = true; silah.x = player.x + 40; silah.y = player.y; // Rotate silah to face pointer if (typeof LK.pointer !== "undefined" && LK.pointer.active) { var dx = LK.pointer.x - silah.x; var dy = LK.pointer.y - silah.y; silah.rotation = Math.atan2(dy, dx); } } else { silah.visible = false; } // Car update for (var i = cars.length - 1; i >= 0; i--) { var car = cars[i]; car.update(); // Loop cars around city if (car.x < cityOffsetX) { car.x = cityOffsetX + cityCols * tileSize - tileSize / 2; } if (car.x > cityOffsetX + cityCols * tileSize) { car.x = cityOffsetX + tileSize / 2; } if (car.y < cityOffsetY) { car.y = cityOffsetY + cityRows * tileSize - tileSize / 2; } if (car.y > cityOffsetY + cityRows * tileSize) { car.y = cityOffsetY + tileSize / 2; } // Player enter car if (!player.isInCar && !car.hasDriver && player.intersects(car) && Math.abs(player.x - car.x) < 80 && Math.abs(player.y - car.y) < 80) { player.enterCar(car); } } // Mermi (bullet) update for (var i = mermis.length - 1; i >= 0; i--) { var mermi = mermis[i]; mermi.update(); // Remove if out of city bounds if (mermi.x < cityOffsetX || mermi.x > cityOffsetX + cityCols * tileSize || mermi.y < cityOffsetY || mermi.y > cityOffsetY + cityRows * tileSize) { mermi.destroy(); mermis.splice(i, 1); continue; } // Check collision with police cars for (var j = policeCars.length - 1; j >= 0; j--) { var police = policeCars[j]; // Only count the hit the moment it happens if (!mermi.lastHitPolice && mermi.intersects(police) && Math.abs(mermi.x - police.x) < 70 && Math.abs(mermi.y - police.y) < 70) { LK.effects.flashObject(police, 0xffeb3b, 400); mermi.destroy(); mermis.splice(i, 1); // If score < 100, make police leave permanently (cannot return) if (score < 100) { police.destroy(); policeCars.splice(j, 1); policeSpawned = true; // Prevent police from respawning again // Police cannot return anymore break; } break; } // Track last hit state for this mermi mermi.lastHitPolice = mermi.intersects(police) && Math.abs(mermi.x - police.x) < 70 && Math.abs(mermi.y - police.y) < 70; } } // Police spawn logic if (wanted > 0 && !policeSpawned) { var police = new PoliceCar(); police.x = cityOffsetX + tileSize * 3.5; police.y = cityOffsetY + tileSize * 0.5; policeCars.push(police); game.addChild(police); policeSpawned = true; LK.getSound('police').play(); } // Police update for (var i = policeCars.length - 1; i >= 0; i--) { var p = policeCars[i]; p.update(); // If police catch player var target = player.isInCar ? player.car : player; if (p.intersects(target) && Math.abs(p.x - target.x) < 70 && Math.abs(p.y - target.y) < 70) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // NPC update for (var i = npcs.length - 1; i >= 0; i--) { var npc = npcs[i]; npc.update(); // Loop NPCs if (npc.x < cityOffsetX) { npc.x = cityOffsetX + cityCols * tileSize - tileSize / 2; } if (npc.x > cityOffsetX + cityCols * tileSize) { npc.x = cityOffsetX + tileSize / 2; } if (npc.y < cityOffsetY) { npc.y = cityOffsetY + cityRows * tileSize - tileSize / 2; } if (npc.y > cityOffsetY + cityRows * tileSize) { npc.y = cityOffsetY + tileSize / 2; } // If player hits NPC (on foot or in car) var hit = false; if (!player.isInCar && player.intersects(npc) && Math.abs(player.x - npc.x) < 60 && Math.abs(player.y - npc.y) < 60) { hit = true; } if (player.isInCar && player.car && player.car.intersects(npc) && Math.abs(player.car.x - npc.x) < 70 && Math.abs(player.car.y - npc.y) < 70) { hit = true; } if (hit) { wanted = 1; wantedTxt.setText('GTA 7 - WANTED!'); LK.effects.flashObject(npc, 0xff0000, 500); // Remove NPC npc.destroy(); npcs.splice(i, 1); continue; } // Check collision with mermis (bullets) for (var j = mermis.length - 1; j >= 0; j--) { var mermi = mermis[j]; if (mermi.intersects(npc) && Math.abs(mermi.x - npc.x) < 50 && Math.abs(mermi.y - npc.y) < 50) { LK.effects.flashObject(npc, 0xffeb3b, 300); npc.destroy(); npcs.splice(i, 1); mermi.destroy(); mermis.splice(j, 1); break; } } } // Missions for (var i = missions.length - 1; i >= 0; i--) { var m = missions[i]; var px = player.isInCar && player.car ? player.car.x : player.x; var py = player.isInCar && player.car ? player.car.y : player.y; if (m.active && Math.abs(m.x - px) < 70 && Math.abs(m.y - py) < 70) { m.active = false; LK.getSound('pickup').play(); LK.getSound('mission').play(); score += 10; scoreTxt.setText(score); m.destroy(); missions.splice(i, 1); spawnMission(); // Escalate wanted level sometimes if (Math.random() < 0.3) { wanted = 1; wantedTxt.setText('GTA 7 - WANTED!'); } // Win condition if (score >= 100) { score = 100; scoreTxt.setText(score); LK.showYouWin(); return; } } } // Pickups for (var i = pickups.length - 1; i >= 0; i--) { var p = pickups[i]; var px = player.isInCar && player.car ? player.car.x : player.x; var py = player.isInCar && player.car ? player.car.y : player.y; if (p.active && Math.abs(p.x - px) < 60 && Math.abs(p.y - py) < 60) { p.active = false; LK.getSound('pickup').play(); score += 3; scoreTxt.setText(score); p.destroy(); pickups.splice(i, 1); spawnPickup(); // Win condition if (score >= 100) { score = 100; scoreTxt.setText(score); LK.showYouWin(); return; } } } // Player exit car if tap again on self // (Disabled: player cannot exit car once inside) // if (player.isInCar && player.car && Math.abs(player.car.x - player.targetX) < 60 && Math.abs(player.car.y - player.targetY) < 60) { // player.exitCar(); // } // Lower wanted level over time if (wanted > 0 && LK.ticks % 300 === 0) { wanted = 0; wantedTxt.setText(''); // Remove police for (var i = policeCars.length - 1; i >= 0; i--) { policeCars[i].destroy(); policeCars.splice(i, 1); } policeSpawned = false; } }; // (Second map logic removed)
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Car (can be player or NPC)
var Car = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6; // Further reduced car speed for slower movement
self.dir = 0; // 0: right, 1: down, 2: left, 3: up
self.hasDriver = false;
self.isPolice = false;
self.update = function () {
if (self.hasDriver) {
// Player driving: follow target
var dx = player.targetX - self.x;
var dy = player.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += self.speed * dx / dist;
self.y += self.speed * dy / dist;
}
} else {
// Parked car: do not move at all
// (No movement code here)
}
};
return self;
});
// CityTile: A single tile in the city grid
var CityTile = Container.expand(function () {
var self = Container.call(this);
self.type = 'road'; // default
self.setType = function (type) {
self.type = type;
if (self.asset) {
self.removeChild(self.asset);
}
self.asset = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
// Mermi (bullet) class
var Mermi = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('mermi', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 32;
self.targetX = 0;
self.targetY = 0;
self.vx = 0;
self.vy = 0;
self.lastX = self.x;
self.lastY = self.y;
self.setTarget = function (tx, ty) {
self.targetX = tx;
self.targetY = ty;
var dx = tx - self.x;
var dy = ty - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
self.vx = self.speed * dx / dist;
self.vy = self.speed * dy / dist;
} else {
self.vx = 0;
self.vy = 0;
}
// Set rotation to face direction
self.rotation = Math.atan2(dy, dx);
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.x += self.vx;
self.y += self.vy;
};
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;
});
// NPC (pedestrian)
var NPC = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('npc', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2 + Math.floor(Math.random() * 2); // Further reduced speed for NPCs
self.dir = Math.floor(Math.random() * 4);
self.update = function () {
// Simple random walk
if (self.dir === 0) {
self.x += self.speed;
}
if (self.dir === 1) {
self.y += self.speed;
}
if (self.dir === 2) {
self.x -= self.speed;
}
if (self.dir === 3) {
self.y -= self.speed;
}
// Change direction randomly
if (Math.random() < 0.01) {
self.dir = Math.floor(Math.random() * 4);
}
};
return self;
});
// Pickup (collectible)
var Pickup = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('pickup', {
anchorX: 0.5,
anchorY: 0.5
});
self.active = true;
return self;
});
// Player character
var Player = Container.expand(function (characterId) {
var self = Container.call(this);
var assetId = characterId || 'player';
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Add name label above the character
self.nameLabel = new Text2(assetId.toUpperCase(), {
size: 60,
fill: "#fff"
});
self.nameLabel.anchor.set(0.5, 1); // center horizontally, bottom of text at y=0
self.nameLabel.x = 0;
self.nameLabel.y = -70; // position above the character asset
self.addChild(self.nameLabel);
self.speed = 2; // Further reduced player speed
self.isInCar = false;
self.car = null;
self.targetX = self.x;
self.targetY = self.y;
self.update = function () {
// Move towards targetX, targetY
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += self.speed * dx / dist;
self.y += self.speed * dy / dist;
} else {
self.x = self.targetX;
self.y = self.targetY;
}
};
self.enterCar = function (car) {
self.isInCar = true;
self.car = car;
self.visible = false;
car.hasDriver = true;
};
self.exitCar = function () {
if (self.car) {
self.x = self.car.x;
self.y = self.car.y + 90;
self.isInCar = false;
self.visible = true;
self.car.hasDriver = false;
self.car = null;
}
};
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 = 3; // Further reduced police speed
self.dir = 0;
self.hasDriver = true;
self.isPolice = true;
self.update = function () {
// Chase player
var target = player.isInCar ? player.car : player;
var dx = target.x - self.x;
var dy = target.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
self.x += self.speed * dx / dist;
self.y += self.speed * dy / dist;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222831
});
/****
* Game Code
****/
// --- Giriş (Start) Screen removed ---
// --- City Map Setup ---
var cityCols = 7;
var cityRows = 9;
var tileSize = 256;
var cityTiles = [];
var cityOffsetX = (2048 - cityCols * tileSize) / 2;
var cityOffsetY = (2732 - cityRows * tileSize) / 2;
// Generate city grid
for (var row = 0; row < cityRows; row++) {
for (var col = 0; col < cityCols; col++) {
var tile = new CityTile();
var x = cityOffsetX + col * tileSize + tileSize / 2;
var y = cityOffsetY + row * tileSize + tileSize / 2;
tile.x = x;
tile.y = y;
// Edges are buildings, center is road, some grass
if (row === 0 || row === cityRows - 1 || col === 0 || col === cityCols - 1) {
tile.setType('building');
} else if ((row + col) % 4 === 0) {
tile.setType('grass');
} else {
tile.setType('road');
}
game.addChild(tile);
cityTiles.push(tile);
}
}
// --- Player Setup ---
var player, silah;
// Randomly pick 'enishan', 'melih' or 'cihangir' as the player character
var characterOptions = ['enishan', 'melih', 'cihangir'];
var chosenCharacter = characterOptions[Math.floor(Math.random() * characterOptions.length)];
player = new Player(chosenCharacter);
player.x = cityOffsetX + tileSize * 3.5;
player.y = cityOffsetY + tileSize * 7.5;
player.targetX = player.x;
player.targetY = player.y;
game.addChild(player);
// --- Silah (gun) Setup ---
silah = LK.getAsset('silah', {
anchorX: 0.5,
anchorY: 0.5
});
silah.x = player.x + 40;
silah.y = player.y;
game.addChild(silah);
// --- Cars Setup ---
// Only one parked car
var cars = [];
var car = new Car();
car.x = cityOffsetX + tileSize * 3.5;
car.y = cityOffsetY + tileSize * 2.5;
car.dir = 0;
cars.push(car);
game.addChild(car);
// --- Police Setup ---
var policeCars = [];
var policeSpawned = false;
// Track police hit count for escape win condition
var policeHitCount = 0;
// --- NPCs Setup ---
var npcs = [];
for (var i = 0; i < 5; i++) {
var npc = new NPC();
npc.x = cityOffsetX + tileSize * (1 + Math.random() * 5);
npc.y = cityOffsetY + tileSize * (1 + Math.random() * 7);
npcs.push(npc);
game.addChild(npc);
}
// --- Missions & Pickups ---
var missions = [];
var pickups = [];
function spawnMission() {
var m = new Mission();
// Place at random road tile
var validTiles = cityTiles.filter(function (t) {
return t.type === 'road';
});
var tile = validTiles[Math.floor(Math.random() * validTiles.length)];
m.x = tile.x;
m.y = tile.y;
missions.push(m);
game.addChild(m);
}
function spawnPickup() {
var p = new Pickup();
var validTiles = cityTiles.filter(function (t) {
return t.type === 'road';
});
var tile = validTiles[Math.floor(Math.random() * validTiles.length)];
p.x = tile.x + (Math.random() - 0.5) * 80;
p.y = tile.y + (Math.random() - 0.5) * 80;
pickups.push(p);
game.addChild(p);
}
spawnMission();
spawnPickup();
// --- Score & Wanted Level ---
var score = 0;
var wanted = 0; // 0: none, 1: police chase
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var wantedTxt = new Text2('', {
size: 80,
fill: 0xFF5252
});
wantedTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(wantedTxt);
wantedTxt.y = 120;
// --- Drag/Touch Controls ---
var dragNode = null;
// Mermi (bullet) array
var mermis = [];
function handleMove(x, y, obj) {
// Clamp to city area
var tx = Math.max(cityOffsetX + tileSize / 2, Math.min(x, cityOffsetX + cityCols * tileSize - tileSize / 2));
var ty = Math.max(cityOffsetY + tileSize / 2, Math.min(y, cityOffsetY + cityRows * tileSize - tileSize / 2));
if (player.isInCar && player.car) {
player.targetX = tx;
player.targetY = ty;
} else {
player.targetX = tx;
player.targetY = ty;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
// Fire mermi (bullet) toward tap/clicked position if player is not in car
if (typeof player !== "undefined" && player && typeof player.isInCar !== "undefined" && !player.isInCar) {
var mermi = new Mermi();
mermi.x = silah.x;
mermi.y = silah.y;
mermi.setTarget(x, y); // Move toward tap/clicked position
mermis.push(mermi);
game.addChild(mermi);
// Play mermi3 sound when bullet is fired
LK.getSound('mermi3').play();
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// --- Game Update Loop ---
game.update = function () {
// Player update
// Make player follow the pointer if dragNode is set (i.e. user is touching/dragging)
if (dragNode === player && typeof LK.pointer !== "undefined" && LK.pointer.active) {
// LK.pointer.x/y are in game coordinates
var tx = Math.max(cityOffsetX + tileSize / 2, Math.min(LK.pointer.x, cityOffsetX + cityCols * tileSize - tileSize / 2));
var ty = Math.max(cityOffsetY + tileSize / 2, Math.min(LK.pointer.y, cityOffsetY + cityRows * tileSize - tileSize / 2));
if (player.isInCar && player.car) {
player.targetX = tx;
player.targetY = ty;
} else {
player.targetX = tx;
player.targetY = ty;
}
}
if (player && typeof player.update === "function") {
player.update();
}
// Make silah follow player (only when not in car)
if (!player.isInCar) {
silah.visible = true;
silah.x = player.x + 40;
silah.y = player.y;
// Rotate silah to face pointer
if (typeof LK.pointer !== "undefined" && LK.pointer.active) {
var dx = LK.pointer.x - silah.x;
var dy = LK.pointer.y - silah.y;
silah.rotation = Math.atan2(dy, dx);
}
} else {
silah.visible = false;
}
// Car update
for (var i = cars.length - 1; i >= 0; i--) {
var car = cars[i];
car.update();
// Loop cars around city
if (car.x < cityOffsetX) {
car.x = cityOffsetX + cityCols * tileSize - tileSize / 2;
}
if (car.x > cityOffsetX + cityCols * tileSize) {
car.x = cityOffsetX + tileSize / 2;
}
if (car.y < cityOffsetY) {
car.y = cityOffsetY + cityRows * tileSize - tileSize / 2;
}
if (car.y > cityOffsetY + cityRows * tileSize) {
car.y = cityOffsetY + tileSize / 2;
}
// Player enter car
if (!player.isInCar && !car.hasDriver && player.intersects(car) && Math.abs(player.x - car.x) < 80 && Math.abs(player.y - car.y) < 80) {
player.enterCar(car);
}
}
// Mermi (bullet) update
for (var i = mermis.length - 1; i >= 0; i--) {
var mermi = mermis[i];
mermi.update();
// Remove if out of city bounds
if (mermi.x < cityOffsetX || mermi.x > cityOffsetX + cityCols * tileSize || mermi.y < cityOffsetY || mermi.y > cityOffsetY + cityRows * tileSize) {
mermi.destroy();
mermis.splice(i, 1);
continue;
}
// Check collision with police cars
for (var j = policeCars.length - 1; j >= 0; j--) {
var police = policeCars[j];
// Only count the hit the moment it happens
if (!mermi.lastHitPolice && mermi.intersects(police) && Math.abs(mermi.x - police.x) < 70 && Math.abs(mermi.y - police.y) < 70) {
LK.effects.flashObject(police, 0xffeb3b, 400);
mermi.destroy();
mermis.splice(i, 1);
// If score < 100, make police leave permanently (cannot return)
if (score < 100) {
police.destroy();
policeCars.splice(j, 1);
policeSpawned = true; // Prevent police from respawning again
// Police cannot return anymore
break;
}
break;
}
// Track last hit state for this mermi
mermi.lastHitPolice = mermi.intersects(police) && Math.abs(mermi.x - police.x) < 70 && Math.abs(mermi.y - police.y) < 70;
}
}
// Police spawn logic
if (wanted > 0 && !policeSpawned) {
var police = new PoliceCar();
police.x = cityOffsetX + tileSize * 3.5;
police.y = cityOffsetY + tileSize * 0.5;
policeCars.push(police);
game.addChild(police);
policeSpawned = true;
LK.getSound('police').play();
}
// Police update
for (var i = policeCars.length - 1; i >= 0; i--) {
var p = policeCars[i];
p.update();
// If police catch player
var target = player.isInCar ? player.car : player;
if (p.intersects(target) && Math.abs(p.x - target.x) < 70 && Math.abs(p.y - target.y) < 70) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// NPC update
for (var i = npcs.length - 1; i >= 0; i--) {
var npc = npcs[i];
npc.update();
// Loop NPCs
if (npc.x < cityOffsetX) {
npc.x = cityOffsetX + cityCols * tileSize - tileSize / 2;
}
if (npc.x > cityOffsetX + cityCols * tileSize) {
npc.x = cityOffsetX + tileSize / 2;
}
if (npc.y < cityOffsetY) {
npc.y = cityOffsetY + cityRows * tileSize - tileSize / 2;
}
if (npc.y > cityOffsetY + cityRows * tileSize) {
npc.y = cityOffsetY + tileSize / 2;
}
// If player hits NPC (on foot or in car)
var hit = false;
if (!player.isInCar && player.intersects(npc) && Math.abs(player.x - npc.x) < 60 && Math.abs(player.y - npc.y) < 60) {
hit = true;
}
if (player.isInCar && player.car && player.car.intersects(npc) && Math.abs(player.car.x - npc.x) < 70 && Math.abs(player.car.y - npc.y) < 70) {
hit = true;
}
if (hit) {
wanted = 1;
wantedTxt.setText('GTA 7 - WANTED!');
LK.effects.flashObject(npc, 0xff0000, 500);
// Remove NPC
npc.destroy();
npcs.splice(i, 1);
continue;
}
// Check collision with mermis (bullets)
for (var j = mermis.length - 1; j >= 0; j--) {
var mermi = mermis[j];
if (mermi.intersects(npc) && Math.abs(mermi.x - npc.x) < 50 && Math.abs(mermi.y - npc.y) < 50) {
LK.effects.flashObject(npc, 0xffeb3b, 300);
npc.destroy();
npcs.splice(i, 1);
mermi.destroy();
mermis.splice(j, 1);
break;
}
}
}
// Missions
for (var i = missions.length - 1; i >= 0; i--) {
var m = missions[i];
var px = player.isInCar && player.car ? player.car.x : player.x;
var py = player.isInCar && player.car ? player.car.y : player.y;
if (m.active && Math.abs(m.x - px) < 70 && Math.abs(m.y - py) < 70) {
m.active = false;
LK.getSound('pickup').play();
LK.getSound('mission').play();
score += 10;
scoreTxt.setText(score);
m.destroy();
missions.splice(i, 1);
spawnMission();
// Escalate wanted level sometimes
if (Math.random() < 0.3) {
wanted = 1;
wantedTxt.setText('GTA 7 - WANTED!');
}
// Win condition
if (score >= 100) {
score = 100;
scoreTxt.setText(score);
LK.showYouWin();
return;
}
}
}
// Pickups
for (var i = pickups.length - 1; i >= 0; i--) {
var p = pickups[i];
var px = player.isInCar && player.car ? player.car.x : player.x;
var py = player.isInCar && player.car ? player.car.y : player.y;
if (p.active && Math.abs(p.x - px) < 60 && Math.abs(p.y - py) < 60) {
p.active = false;
LK.getSound('pickup').play();
score += 3;
scoreTxt.setText(score);
p.destroy();
pickups.splice(i, 1);
spawnPickup();
// Win condition
if (score >= 100) {
score = 100;
scoreTxt.setText(score);
LK.showYouWin();
return;
}
}
}
// Player exit car if tap again on self
// (Disabled: player cannot exit car once inside)
// if (player.isInCar && player.car && Math.abs(player.car.x - player.targetX) < 60 && Math.abs(player.car.y - player.targetY) < 60) {
// player.exitCar();
// }
// Lower wanted level over time
if (wanted > 0 && LK.ticks % 300 === 0) {
wanted = 0;
wantedTxt.setText('');
// Remove police
for (var i = policeCars.length - 1; i >= 0; i--) {
policeCars[i].destroy();
policeCars.splice(i, 1);
}
policeSpawned = false;
}
};
// (Second map logic removed)
Police. In-Game asset. 2d. High contrast. No shadows
Npc. In-Game asset. 2d. High contrast. No shadows
coin. In-Game asset. 2d. High contrast. No shadows
car . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
home. In-Game asset. 2d. High contrast. No shadows
gras. In-Game asset. 2d. High contrast. No shadows
silah. In-Game asset. 2d. High contrast. No shadows
mermi. In-Game asset. 2d. High contrast. No shadows
gold. In-Game asset. 2d. High contrast. No shadows