User prompt
polisin hızını düşür
User prompt
npc lerin hızını düşür
User prompt
oyunun giriş ekranı olmasın
User prompt
oyunun giriş ekranı mavi olsun
User prompt
oyunun giriş ekranı olsun
Code edit (1 edits merged)
Please save this source code
User prompt
GTA 7: Micro City Mayhem
Initial prompt
GTA 7
/**** * 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