/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Loot class var Loot = Container.expand(function () { var self = Container.call(this); var lootSprite = self.attachAsset('loot', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Mission marker class var Mission = Container.expand(function () { var self = Container.call(this); var marker = self.attachAsset('mission', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obsSprite = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerSprite = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; // Movement speed (reduced for slower character) self.dirX = 0; self.dirY = 0; self.update = function () { // Move player toward lastTouch (faremiz) var dx = lastTouch.x - self.x; var dy = lastTouch.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 2) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } else { self.x = lastTouch.x; self.y = lastTouch.y; } // Clamp to game area if (self.x < 60) self.x = 60; if (self.x > 2048 - 60) self.x = 2048 - 60; if (self.y < 120) self.y = 120; if (self.y > 2732 - 60) self.y = 2732 - 60; }; return self; }); // Police car class var Police = Container.expand(function () { var self = Container.call(this); var policeSprite = self.attachAsset('police', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4 + Math.random() * 2; // Slower police speed self.target = null; self.update = function () { if (!self.target) return; var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 1) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game state variables // Player character: red box // Police car: blue box // Loot: yellow ellipse // Obstacle: gray box // Mission marker: green ellipse var player; var policeCars = []; var loots = []; var obstacles = []; var missionMarker; var scoreTxt; var timerTxt; var livesTxt; var playerLives = 3; // Start with 3 lives var missionActive = false; var missionTime = 0; var missionTimeout = null; var gameTimer = 60; // seconds var lastMissionScore = 0; var dragDir = null; var dragStart = null; var dragNode = null; var lastTouch = { x: 0, y: 0 }; var policeSpawnTimer = 0; // Score display scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Timer display timerTxt = new Text2('60', { size: 90, fill: "#fff" }); timerTxt.anchor.set(1, 0); LK.gui.topRight.addChild(timerTxt); // Lives display livesTxt = new Text2('♥♥♥', { size: 90, fill: 0xFF4444 }); livesTxt.anchor.set(0, 0); livesTxt.x = 120; livesTxt.y = 0; LK.gui.top.addChild(livesTxt); // Helper: random position in city bounds (avoiding top left 100x100) function randomPos(margin) { var x = 100 + margin + Math.random() * (2048 - 2 * (100 + margin)); var y = 120 + margin + Math.random() * (2732 - 2 * (120 + margin)); return { x: x, y: y }; } // Helper: spawn loot function spawnLoot() { var loot = new Loot(); var pos = randomPos(80); loot.x = pos.x; loot.y = pos.y; loots.push(loot); game.addChild(loot); } // Helper: spawn obstacle function spawnObstacle() { var obs = new Obstacle(); var pos = randomPos(120); obs.x = pos.x; obs.y = pos.y; obstacles.push(obs); game.addChild(obs); } // Helper: spawn police function spawnPolice() { var police = new Police(); // Spawn at random edge var edge = Math.floor(Math.random() * 4); if (edge === 0) { // top police.x = 200 + Math.random() * (2048 - 400); police.y = 120; } else if (edge === 1) { // bottom police.x = 200 + Math.random() * (2048 - 400); police.y = 2732 - 120; } else if (edge === 2) { // left police.x = 100; police.y = 200 + Math.random() * (2732 - 400); } else { // right police.x = 2048 - 100; police.y = 200 + Math.random() * (2732 - 400); } police.target = player; policeCars.push(police); game.addChild(police); } // Helper: spawn mission marker function spawnMission() { if (missionMarker) { missionMarker.destroy(); missionMarker = null; } var marker = new Mission(); var pos = randomPos(200); marker.x = pos.x; marker.y = pos.y; missionMarker = marker; game.addChild(marker); missionActive = true; missionTime = 10 + Math.floor(Math.random() * 6); // 10-15 seconds if (missionTimeout) LK.clearTimeout(missionTimeout); missionTimeout = LK.setTimeout(function () { // Mission failed if (missionActive) { missionActive = false; if (missionMarker) { missionMarker.destroy(); missionMarker = null; } } }, missionTime * 1000); } // Helper: reset game state function resetGame() { // Remove all objects if (player) player.destroy(); for (var i = 0; i < policeCars.length; ++i) policeCars[i].destroy(); for (var i = 0; i < loots.length; ++i) loots[i].destroy(); for (var i = 0; i < obstacles.length; ++i) obstacles[i].destroy(); if (missionMarker) missionMarker.destroy(); policeCars = []; loots = []; obstacles = []; missionMarker = null; missionActive = false; missionTime = 0; if (missionTimeout) LK.clearTimeout(missionTimeout); missionTimeout = null; gameTimer = 60; lastMissionScore = 0; // Spawn player player = new Player(); player.x = 2048 / 2; player.y = 2732 - 300; game.addChild(player); // Spawn loot for (var i = 0; i < 4; ++i) spawnLoot(); // Spawn obstacles for (var i = 0; i < 5; ++i) spawnObstacle(); // Spawn police for (var i = 0; i < 2; ++i) spawnPolice(); // Spawn first mission spawnMission(); // Reset score LK.setScore(0); scoreTxt.setText('0'); timerTxt.setText('60'); playerLives = 3; if (livesTxt) livesTxt.setText('♥'.repeat(playerLives)); policeSpawnTimer = 0; } resetGame(); // Touch controls: drag to move game.down = function (x, y, obj) { // Start drag dragNode = player; dragStart = { x: x, y: y, px: player.x, py: player.y }; lastTouch.x = x; lastTouch.y = y; }; game.move = function (x, y, obj) { if (dragNode) { // Calculate direction var dx = x - dragStart.x; var dy = y - dragStart.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 30) { dragNode.dirX = dx / dist; dragNode.dirY = dy / dist; } else { dragNode.dirX = 0; dragNode.dirY = 0; } lastTouch.x = x; lastTouch.y = y; } }; game.up = function (x, y, obj) { if (dragNode) { dragNode.dirX = 0; dragNode.dirY = 0; dragNode = null; } }; // Main game update game.update = function () { // Update timer if (LK.ticks % 60 === 0 && gameTimer > 0) { gameTimer -= 1; timerTxt.setText(gameTimer + ''); if (gameTimer <= 0) { LK.showGameOver(); return; } } // Update player if (player && player.update) player.update(); // Update police for (var i = policeCars.length - 1; i >= 0; --i) { var p = policeCars[i]; if (p.update) p.update(); // Collision with player if (p.intersects(player)) { LK.effects.flashScreen(0xff0000, 800); playerLives -= 1; if (livesTxt) livesTxt.setText('♥'.repeat(playerLives)); if (playerLives <= 0) { LK.showGameOver(); return; } else { // Remove this police car and respawn player at start p.destroy(); policeCars.splice(i, 1); player.x = 2048 / 2; player.y = 2732 - 300; // Brief invulnerability (optional, not implemented here) continue; } } // Collide with obstacles for (var j = 0; j < obstacles.length; ++j) { var obs = obstacles[j]; if (p.intersects(obs)) { // Bounce back var dx = p.x - obs.x; var dy = p.y - obs.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { p.x += dx / dist * 30; p.y += dy / dist * 30; } } } } // Player collides with obstacles for (var i = 0; i < obstacles.length; ++i) { var obs = obstacles[i]; if (player.intersects(obs)) { // Push player out var dx = player.x - obs.x; var dy = player.y - obs.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { player.x += dx / dist * 20; player.y += dy / dist * 20; } } } // Player collects loot for (var i = loots.length - 1; i >= 0; --i) { var loot = loots[i]; if (player.intersects(loot)) { LK.setScore(LK.getScore() + 10); scoreTxt.setText(LK.getScore() + ''); tween(loot, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { loot.destroy(); } }); loots.splice(i, 1); // Spawn new loot spawnLoot(); } } // Player completes mission if (missionActive && missionMarker && player.intersects(missionMarker)) { LK.setScore(LK.getScore() + 30); scoreTxt.setText(LK.getScore() + ''); tween(missionMarker, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 400, onFinish: function onFinish() { if (missionMarker) missionMarker.destroy(); } }); missionActive = false; missionMarker = null; // Next mission after short delay LK.setTimeout(function () { spawnMission(); }, 1200); } // Win condition removed: score can be infinite // Police spawn logic: every 8 seconds, up to 6 police if (LK.ticks % 480 === 0 && policeCars.length < 6) { spawnPolice(); } }; /* End of gamecode.js */
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Loot class
var Loot = Container.expand(function () {
var self = Container.call(this);
var lootSprite = self.attachAsset('loot', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Mission marker class
var Mission = Container.expand(function () {
var self = Container.call(this);
var marker = self.attachAsset('mission', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10; // Movement speed (reduced for slower character)
self.dirX = 0;
self.dirY = 0;
self.update = function () {
// Move player toward lastTouch (faremiz)
var dx = lastTouch.x - self.x;
var dy = lastTouch.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 2) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
self.x = lastTouch.x;
self.y = lastTouch.y;
}
// Clamp to game area
if (self.x < 60) self.x = 60;
if (self.x > 2048 - 60) self.x = 2048 - 60;
if (self.y < 120) self.y = 120;
if (self.y > 2732 - 60) self.y = 2732 - 60;
};
return self;
});
// Police car class
var Police = Container.expand(function () {
var self = Container.call(this);
var policeSprite = self.attachAsset('police', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4 + Math.random() * 2; // Slower police speed
self.target = null;
self.update = function () {
if (!self.target) return;
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 1) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Game state variables
// Player character: red box
// Police car: blue box
// Loot: yellow ellipse
// Obstacle: gray box
// Mission marker: green ellipse
var player;
var policeCars = [];
var loots = [];
var obstacles = [];
var missionMarker;
var scoreTxt;
var timerTxt;
var livesTxt;
var playerLives = 3; // Start with 3 lives
var missionActive = false;
var missionTime = 0;
var missionTimeout = null;
var gameTimer = 60; // seconds
var lastMissionScore = 0;
var dragDir = null;
var dragStart = null;
var dragNode = null;
var lastTouch = {
x: 0,
y: 0
};
var policeSpawnTimer = 0;
// Score display
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Timer display
timerTxt = new Text2('60', {
size: 90,
fill: "#fff"
});
timerTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(timerTxt);
// Lives display
livesTxt = new Text2('♥♥♥', {
size: 90,
fill: 0xFF4444
});
livesTxt.anchor.set(0, 0);
livesTxt.x = 120;
livesTxt.y = 0;
LK.gui.top.addChild(livesTxt);
// Helper: random position in city bounds (avoiding top left 100x100)
function randomPos(margin) {
var x = 100 + margin + Math.random() * (2048 - 2 * (100 + margin));
var y = 120 + margin + Math.random() * (2732 - 2 * (120 + margin));
return {
x: x,
y: y
};
}
// Helper: spawn loot
function spawnLoot() {
var loot = new Loot();
var pos = randomPos(80);
loot.x = pos.x;
loot.y = pos.y;
loots.push(loot);
game.addChild(loot);
}
// Helper: spawn obstacle
function spawnObstacle() {
var obs = new Obstacle();
var pos = randomPos(120);
obs.x = pos.x;
obs.y = pos.y;
obstacles.push(obs);
game.addChild(obs);
}
// Helper: spawn police
function spawnPolice() {
var police = new Police();
// Spawn at random edge
var edge = Math.floor(Math.random() * 4);
if (edge === 0) {
// top
police.x = 200 + Math.random() * (2048 - 400);
police.y = 120;
} else if (edge === 1) {
// bottom
police.x = 200 + Math.random() * (2048 - 400);
police.y = 2732 - 120;
} else if (edge === 2) {
// left
police.x = 100;
police.y = 200 + Math.random() * (2732 - 400);
} else {
// right
police.x = 2048 - 100;
police.y = 200 + Math.random() * (2732 - 400);
}
police.target = player;
policeCars.push(police);
game.addChild(police);
}
// Helper: spawn mission marker
function spawnMission() {
if (missionMarker) {
missionMarker.destroy();
missionMarker = null;
}
var marker = new Mission();
var pos = randomPos(200);
marker.x = pos.x;
marker.y = pos.y;
missionMarker = marker;
game.addChild(marker);
missionActive = true;
missionTime = 10 + Math.floor(Math.random() * 6); // 10-15 seconds
if (missionTimeout) LK.clearTimeout(missionTimeout);
missionTimeout = LK.setTimeout(function () {
// Mission failed
if (missionActive) {
missionActive = false;
if (missionMarker) {
missionMarker.destroy();
missionMarker = null;
}
}
}, missionTime * 1000);
}
// Helper: reset game state
function resetGame() {
// Remove all objects
if (player) player.destroy();
for (var i = 0; i < policeCars.length; ++i) policeCars[i].destroy();
for (var i = 0; i < loots.length; ++i) loots[i].destroy();
for (var i = 0; i < obstacles.length; ++i) obstacles[i].destroy();
if (missionMarker) missionMarker.destroy();
policeCars = [];
loots = [];
obstacles = [];
missionMarker = null;
missionActive = false;
missionTime = 0;
if (missionTimeout) LK.clearTimeout(missionTimeout);
missionTimeout = null;
gameTimer = 60;
lastMissionScore = 0;
// Spawn player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
// Spawn loot
for (var i = 0; i < 4; ++i) spawnLoot();
// Spawn obstacles
for (var i = 0; i < 5; ++i) spawnObstacle();
// Spawn police
for (var i = 0; i < 2; ++i) spawnPolice();
// Spawn first mission
spawnMission();
// Reset score
LK.setScore(0);
scoreTxt.setText('0');
timerTxt.setText('60');
playerLives = 3;
if (livesTxt) livesTxt.setText('♥'.repeat(playerLives));
policeSpawnTimer = 0;
}
resetGame();
// Touch controls: drag to move
game.down = function (x, y, obj) {
// Start drag
dragNode = player;
dragStart = {
x: x,
y: y,
px: player.x,
py: player.y
};
lastTouch.x = x;
lastTouch.y = y;
};
game.move = function (x, y, obj) {
if (dragNode) {
// Calculate direction
var dx = x - dragStart.x;
var dy = y - dragStart.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 30) {
dragNode.dirX = dx / dist;
dragNode.dirY = dy / dist;
} else {
dragNode.dirX = 0;
dragNode.dirY = 0;
}
lastTouch.x = x;
lastTouch.y = y;
}
};
game.up = function (x, y, obj) {
if (dragNode) {
dragNode.dirX = 0;
dragNode.dirY = 0;
dragNode = null;
}
};
// Main game update
game.update = function () {
// Update timer
if (LK.ticks % 60 === 0 && gameTimer > 0) {
gameTimer -= 1;
timerTxt.setText(gameTimer + '');
if (gameTimer <= 0) {
LK.showGameOver();
return;
}
}
// Update player
if (player && player.update) player.update();
// Update police
for (var i = policeCars.length - 1; i >= 0; --i) {
var p = policeCars[i];
if (p.update) p.update();
// Collision with player
if (p.intersects(player)) {
LK.effects.flashScreen(0xff0000, 800);
playerLives -= 1;
if (livesTxt) livesTxt.setText('♥'.repeat(playerLives));
if (playerLives <= 0) {
LK.showGameOver();
return;
} else {
// Remove this police car and respawn player at start
p.destroy();
policeCars.splice(i, 1);
player.x = 2048 / 2;
player.y = 2732 - 300;
// Brief invulnerability (optional, not implemented here)
continue;
}
}
// Collide with obstacles
for (var j = 0; j < obstacles.length; ++j) {
var obs = obstacles[j];
if (p.intersects(obs)) {
// Bounce back
var dx = p.x - obs.x;
var dy = p.y - obs.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
p.x += dx / dist * 30;
p.y += dy / dist * 30;
}
}
}
}
// Player collides with obstacles
for (var i = 0; i < obstacles.length; ++i) {
var obs = obstacles[i];
if (player.intersects(obs)) {
// Push player out
var dx = player.x - obs.x;
var dy = player.y - obs.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
player.x += dx / dist * 20;
player.y += dy / dist * 20;
}
}
}
// Player collects loot
for (var i = loots.length - 1; i >= 0; --i) {
var loot = loots[i];
if (player.intersects(loot)) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore() + '');
tween(loot, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
loot.destroy();
}
});
loots.splice(i, 1);
// Spawn new loot
spawnLoot();
}
}
// Player completes mission
if (missionActive && missionMarker && player.intersects(missionMarker)) {
LK.setScore(LK.getScore() + 30);
scoreTxt.setText(LK.getScore() + '');
tween(missionMarker, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 400,
onFinish: function onFinish() {
if (missionMarker) missionMarker.destroy();
}
});
missionActive = false;
missionMarker = null;
// Next mission after short delay
LK.setTimeout(function () {
spawnMission();
}, 1200);
}
// Win condition removed: score can be infinite
// Police spawn logic: every 8 seconds, up to 6 police
if (LK.ticks % 480 === 0 && policeCars.length < 6) {
spawnPolice();
}
};
/* End of gamecode.js */