/****
* 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