/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Assassin = Container.expand(function () {
var self = Container.call(this);
var assassinGraphics = self.attachAsset('assassin', {
anchorX: 0.5,
anchorY: 0.5
});
var knife = self.attachAsset('knife', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
knife.x = 25;
knife.y = -10;
self.isHidden = false;
self.isMoving = false;
self.moveSpeed = 3;
self.targetX = 0;
self.targetY = 0;
self.hasWeapon = true;
self.weaponType = 'knife'; // 'knife' or 'gun'
self.ammo = 3;
self.moveTo = function (x, y) {
self.targetX = x;
self.targetY = y;
self.isMoving = true;
};
self.switchWeapon = function () {
if (self.weaponType === 'knife') {
self.weaponType = 'gun';
knife.visible = false;
} else {
self.weaponType = 'knife';
knife.visible = true;
}
};
self.performKill = function (target) {
if (self.weaponType === 'knife') {
// Create blood splatter effect
var blood = game.addChild(LK.getAsset('bloodSplatter', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
}));
blood.x = target.x;
blood.y = target.y;
tween(blood, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 2000
});
LK.getSound('knifeStab').play();
LK.getSound('bodyFall').play();
} else if (self.weaponType === 'gun' && self.ammo > 0) {
// Create muzzle flash
var flash = game.addChild(LK.getAsset('muzzleFlash', {
anchorX: 0.5,
anchorY: 0.5
}));
flash.x = self.x;
flash.y = self.y;
tween(flash, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 200
});
self.ammo--;
LK.getSound('gunshot').play();
// Alert nearby guards when using gun
for (var i = 0; i < guards.length; i++) {
var guard = guards[i];
var dist = Math.sqrt((self.x - guard.x) * (self.x - guard.x) + (self.y - guard.y) * (self.y - guard.y));
if (dist < 300) {
guard.isAlerted = true;
guard.alertedByGunshot = true;
}
}
}
};
self.checkStealth = function () {
self.isHidden = false;
for (var i = 0; i < shadowZones.length; i++) {
var shadow = shadowZones[i];
var distance = Math.sqrt((self.x - shadow.x) * (self.x - shadow.x) + (self.y - shadow.y) * (self.y - shadow.y));
if (distance < 75) {
self.isHidden = true;
break;
}
}
if (self.isHidden) {
assassinGraphics.alpha = 0.4;
assassinGraphics.tint = 0x666666;
} else {
assassinGraphics.alpha = 1.0;
assassinGraphics.tint = 0xffffff;
}
};
self.update = function () {
if (self.isMoving) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.moveSpeed) {
self.x = self.targetX;
self.y = self.targetY;
self.isMoving = false;
} else {
self.x += dx / distance * self.moveSpeed;
self.y += dy / distance * self.moveSpeed;
}
}
self.checkStealth();
};
return self;
});
var Guard = Container.expand(function () {
var self = Container.call(this);
var guardGraphics = self.attachAsset('guard', {
anchorX: 0.5,
anchorY: 0.5
});
var visionCone = self.attachAsset('visionCone', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.2
});
self.patrolPoints = [];
self.currentPatrolIndex = 0;
self.moveSpeed = 1;
self.isPatrolling = true;
self.detectionRange = 100;
self.isAlerted = false;
self.viewDirection = 0;
self.setPatrolRoute = function (points) {
self.patrolPoints = points;
if (points.length > 0) {
self.x = points[0].x;
self.y = points[0].y;
}
};
self.alertLevel = 0; // 0 = normal, 1 = suspicious, 2 = investigating, 3 = hunting
self.investigateX = 0;
self.investigateY = 0;
self.alertedByGunshot = false;
self.lastSeenX = 0;
self.lastSeenY = 0;
self.alertTimer = 0;
self.canSeeAssassin = function () {
if (!assassin) return false;
var distance = Math.sqrt((self.x - assassin.x) * (self.x - assassin.x) + (self.y - assassin.y) * (self.y - assassin.y));
if (distance > self.detectionRange) return false;
// Reduced detection in shadows
if (assassin.isHidden) {
self.detectionRange = 50; // Much closer detection in shadows
if (distance > 50) return false;
} else {
self.detectionRange = 120; // Normal detection range
}
var angle = Math.atan2(assassin.y - self.y, assassin.x - self.x);
var angleDiff = Math.abs(angle - self.viewDirection);
if (angleDiff > Math.PI) angleDiff = 2 * Math.PI - angleDiff;
return angleDiff < Math.PI / 4; // Narrower vision cone
};
self.investigate = function (x, y) {
self.alertLevel = 2;
self.investigateX = x;
self.investigateY = y;
self.isPatrolling = false;
self.alertTimer = 300; // 5 seconds at 60fps
guardGraphics.tint = 0xffaa00; // Orange tint when investigating
};
self.startHunting = function () {
self.alertLevel = 3;
self.isPatrolling = false;
self.moveSpeed = 2; // Faster when hunting
guardGraphics.tint = 0xff0000; // Red tint when hunting
self.lastSeenX = assassin.x;
self.lastSeenY = assassin.y;
};
self.update = function () {
if (self.isPatrolling && self.patrolPoints.length > 1) {
var targetPoint = self.patrolPoints[self.currentPatrolIndex];
var dx = targetPoint.x - self.x;
var dy = targetPoint.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
self.currentPatrolIndex = (self.currentPatrolIndex + 1) % self.patrolPoints.length;
} else {
self.x += dx / distance * self.moveSpeed;
self.y += dy / distance * self.moveSpeed;
self.viewDirection = Math.atan2(dy, dx);
}
}
guardGraphics.rotation = self.viewDirection;
visionCone.rotation = self.viewDirection;
if (self.canSeeAssassin() && !gameOver) {
self.isAlerted = true;
guardGraphics.tint = 0xff0000;
LK.getSound('alert').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
};
return self;
});
var Target = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('target', {
anchorX: 0.5,
anchorY: 0.5
});
self.isEliminated = false;
self.eliminate = function () {
if (self.isEliminated) return;
self.isEliminated = true;
targetGraphics.alpha = 0.3;
targetGraphics.tint = 0x666666;
LK.getSound('takedown').play();
LK.setScore(LK.getScore() + 100);
targetsEliminated++;
tween(targetGraphics, {
scaleX: 0,
scaleY: 0
}, {
duration: 300
});
if (targetsEliminated >= totalTargets) {
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0a0a0a
});
/****
* Game Code
****/
var assassin;
var guards = [];
var targets = [];
var shadowZones = [];
var walls = [];
var dragNode = null;
var gameOver = false;
var targetsEliminated = 0;
var totalTargets = 0;
var visibilityMeter;
var stealthText;
var weaponUI;
var ammoUI;
var doubleTapTimer = 0;
// Create UI elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var weaponUI = new Text2('KNIFE', {
size: 45,
fill: 0x00ffff
});
weaponUI.anchor.set(0, 1);
weaponUI.x = 150;
weaponUI.y = -50;
LK.gui.bottomLeft.addChild(weaponUI);
var ammoUI = new Text2('AMMO: 3', {
size: 40,
fill: 0xffff00
});
ammoUI.anchor.set(0, 1);
ammoUI.x = 150;
ammoUI.y = -100;
LK.gui.bottomLeft.addChild(ammoUI);
visibilityMeter = new Text2('HIDDEN', {
size: 50,
fill: 0x00FF00
});
visibilityMeter.anchor.set(0.5, 0);
LK.gui.top.addChild(visibilityMeter);
stealthText = new Text2('Targets: 0/0', {
size: 50,
fill: 0xFFFFFF
});
stealthText.anchor.set(1, 0);
stealthText.x = -20;
stealthText.y = 50;
LK.gui.topRight.addChild(stealthText);
// Create level layout
function createLevel() {
// Create shadow zones for stealth
var shadowPositions = [{
x: 400,
y: 600
}, {
x: 800,
y: 400
}, {
x: 1200,
y: 800
}, {
x: 1600,
y: 500
}, {
x: 600,
y: 1200
}, {
x: 1400,
y: 1100
}];
for (var i = 0; i < shadowPositions.length; i++) {
var shadow = game.addChild(LK.getAsset('shadow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.4
}));
shadow.x = shadowPositions[i].x;
shadow.y = shadowPositions[i].y;
shadowZones.push(shadow);
}
// Create walls
var wallPositions = [{
x: 500,
y: 300,
width: 200,
height: 40
}, {
x: 1000,
y: 600,
width: 40,
height: 200
}, {
x: 1500,
y: 900,
width: 150,
height: 40
}];
for (var i = 0; i < wallPositions.length; i++) {
var wall = game.addChild(LK.getAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
}));
wall.x = wallPositions[i].x;
wall.y = wallPositions[i].y;
wall.scaleX = wallPositions[i].width / 100;
wall.scaleY = wallPositions[i].height / 20;
walls.push(wall);
}
// Create targets
var targetPositions = [{
x: 1600,
y: 400
}, {
x: 800,
y: 1000
}, {
x: 1200,
y: 1200
}];
totalTargets = targetPositions.length;
for (var i = 0; i < targetPositions.length; i++) {
var target = game.addChild(new Target());
target.x = targetPositions[i].x;
target.y = targetPositions[i].y;
targets.push(target);
}
// Create guards with patrol routes
var guard1 = game.addChild(new Guard());
guard1.setPatrolRoute([{
x: 300,
y: 400
}, {
x: 600,
y: 400
}, {
x: 600,
y: 700
}, {
x: 300,
y: 700
}]);
guards.push(guard1);
var guard2 = game.addChild(new Guard());
guard2.setPatrolRoute([{
x: 1000,
y: 300
}, {
x: 1400,
y: 300
}, {
x: 1400,
y: 600
}]);
guards.push(guard2);
var guard3 = game.addChild(new Guard());
guard3.setPatrolRoute([{
x: 400,
y: 1000
}, {
x: 800,
y: 1000
}, {
x: 800,
y: 1300
}, {
x: 400,
y: 1300
}]);
guards.push(guard3);
// Create assassin
assassin = game.addChild(new Assassin());
assassin.x = 200;
assassin.y = 300;
}
createLevel();
function handleMove(x, y, obj) {
if (dragNode && !gameOver) {
dragNode.moveTo(x, y);
}
}
function checkAssassination(x, y) {
if (gameOver) return;
for (var i = 0; i < targets.length; i++) {
var target = targets[i];
if (target.isEliminated) continue;
var distance = Math.sqrt((assassin.x - target.x) * (assassin.x - target.x) + (assassin.y - target.y) * (assassin.y - target.y));
// Different kill conditions based on weapon
var canKill = false;
if (assassin.weaponType === 'knife' && distance < 60 && assassin.isHidden) {
canKill = true; // Knife requires stealth and close range
} else if (assassin.weaponType === 'gun' && distance < 150 && assassin.ammo > 0) {
canKill = true; // Gun has longer range but uses ammo
}
if (canKill) {
assassin.performKill(target);
target.eliminate();
return;
}
}
// Check for weapon switching (double tap)
if (doubleTapTimer > 0) {
assassin.switchWeapon();
doubleTapTimer = 0;
} else {
doubleTapTimer = 30; // 0.5 seconds
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameOver) return;
dragNode = assassin;
handleMove(x, y, obj);
checkAssassination(x, y);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameOver) return;
// Update double tap timer
if (doubleTapTimer > 0) {
doubleTapTimer--;
}
// Update score display
scoreTxt.setText('Score: ' + LK.getScore());
// Update targets counter
stealthText.setText('Targets: ' + targetsEliminated + '/' + totalTargets);
// Update weapon UI
if (assassin) {
weaponUI.setText(assassin.weaponType.toUpperCase());
if (assassin.weaponType === 'gun') {
ammoUI.setText('AMMO: ' + assassin.ammo);
ammoUI.visible = true;
} else {
ammoUI.visible = false;
}
}
// Update visibility meter
if (assassin) {
if (assassin.isHidden) {
visibilityMeter.setText('HIDDEN');
visibilityMeter.fill = '#00ff00';
} else {
visibilityMeter.setText('EXPOSED');
visibilityMeter.fill = '#ff0000';
}
}
// Enhanced guard AI behavior
for (var i = 0; i < guards.length; i++) {
var guard = guards[i];
if (guard.alertedByGunshot && !gameOver) {
guard.startHunting();
guard.alertedByGunshot = false;
}
// Handle investigation behavior
if (guard.alertLevel === 2) {
var distToInvestigate = Math.sqrt((guard.x - guard.investigateX) * (guard.x - guard.investigateX) + (guard.y - guard.investigateY) * (guard.y - guard.investigateY));
if (distToInvestigate < 20) {
guard.alertTimer--;
if (guard.alertTimer <= 0) {
guard.alertLevel = 0;
guard.isPatrolling = true;
guard.guardGraphics.tint = 0xffffff;
guard.moveSpeed = 1;
}
}
}
// Handle hunting behavior
if (guard.alertLevel === 3) {
var distToLastSeen = Math.sqrt((guard.x - guard.lastSeenX) * (guard.x - guard.lastSeenX) + (guard.y - guard.lastSeenY) * (guard.y - guard.lastSeenY));
if (distToLastSeen < 50) {
// Search around last known position
guard.lastSeenX += (Math.random() - 0.5) * 100;
guard.lastSeenY += (Math.random() - 0.5) * 100;
}
}
if (guard.canSeeAssassin() && !gameOver) {
guard.startHunting();
LK.getSound('alert').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
gameOver = true;
break;
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -11,18 +11,84 @@
var assassinGraphics = self.attachAsset('assassin', {
anchorX: 0.5,
anchorY: 0.5
});
+ var knife = self.attachAsset('knife', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ visible: false
+ });
+ knife.x = 25;
+ knife.y = -10;
self.isHidden = false;
self.isMoving = false;
self.moveSpeed = 3;
self.targetX = 0;
self.targetY = 0;
+ self.hasWeapon = true;
+ self.weaponType = 'knife'; // 'knife' or 'gun'
+ self.ammo = 3;
self.moveTo = function (x, y) {
self.targetX = x;
self.targetY = y;
self.isMoving = true;
};
+ self.switchWeapon = function () {
+ if (self.weaponType === 'knife') {
+ self.weaponType = 'gun';
+ knife.visible = false;
+ } else {
+ self.weaponType = 'knife';
+ knife.visible = true;
+ }
+ };
+ self.performKill = function (target) {
+ if (self.weaponType === 'knife') {
+ // Create blood splatter effect
+ var blood = game.addChild(LK.getAsset('bloodSplatter', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ }));
+ blood.x = target.x;
+ blood.y = target.y;
+ tween(blood, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 2000
+ });
+ LK.getSound('knifeStab').play();
+ LK.getSound('bodyFall').play();
+ } else if (self.weaponType === 'gun' && self.ammo > 0) {
+ // Create muzzle flash
+ var flash = game.addChild(LK.getAsset('muzzleFlash', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }));
+ flash.x = self.x;
+ flash.y = self.y;
+ tween(flash, {
+ alpha: 0,
+ scaleX: 0,
+ scaleY: 0
+ }, {
+ duration: 200
+ });
+ self.ammo--;
+ LK.getSound('gunshot').play();
+ // Alert nearby guards when using gun
+ for (var i = 0; i < guards.length; i++) {
+ var guard = guards[i];
+ var dist = Math.sqrt((self.x - guard.x) * (self.x - guard.x) + (self.y - guard.y) * (self.y - guard.y));
+ if (dist < 300) {
+ guard.isAlerted = true;
+ guard.alertedByGunshot = true;
+ }
+ }
+ }
+ };
self.checkStealth = function () {
self.isHidden = false;
for (var i = 0; i < shadowZones.length; i++) {
var shadow = shadowZones[i];
@@ -32,11 +98,13 @@
break;
}
}
if (self.isHidden) {
- assassinGraphics.alpha = 0.6;
+ assassinGraphics.alpha = 0.4;
+ assassinGraphics.tint = 0x666666;
} else {
assassinGraphics.alpha = 1.0;
+ assassinGraphics.tint = 0xffffff;
}
};
self.update = function () {
if (self.isMoving) {
@@ -80,18 +148,47 @@
self.x = points[0].x;
self.y = points[0].y;
}
};
+ self.alertLevel = 0; // 0 = normal, 1 = suspicious, 2 = investigating, 3 = hunting
+ self.investigateX = 0;
+ self.investigateY = 0;
+ self.alertedByGunshot = false;
+ self.lastSeenX = 0;
+ self.lastSeenY = 0;
+ self.alertTimer = 0;
self.canSeeAssassin = function () {
if (!assassin) return false;
var distance = Math.sqrt((self.x - assassin.x) * (self.x - assassin.x) + (self.y - assassin.y) * (self.y - assassin.y));
if (distance > self.detectionRange) return false;
- if (assassin.isHidden) return false;
+ // Reduced detection in shadows
+ if (assassin.isHidden) {
+ self.detectionRange = 50; // Much closer detection in shadows
+ if (distance > 50) return false;
+ } else {
+ self.detectionRange = 120; // Normal detection range
+ }
var angle = Math.atan2(assassin.y - self.y, assassin.x - self.x);
var angleDiff = Math.abs(angle - self.viewDirection);
if (angleDiff > Math.PI) angleDiff = 2 * Math.PI - angleDiff;
- return angleDiff < Math.PI / 3;
+ return angleDiff < Math.PI / 4; // Narrower vision cone
};
+ self.investigate = function (x, y) {
+ self.alertLevel = 2;
+ self.investigateX = x;
+ self.investigateY = y;
+ self.isPatrolling = false;
+ self.alertTimer = 300; // 5 seconds at 60fps
+ guardGraphics.tint = 0xffaa00; // Orange tint when investigating
+ };
+ self.startHunting = function () {
+ self.alertLevel = 3;
+ self.isPatrolling = false;
+ self.moveSpeed = 2; // Faster when hunting
+ guardGraphics.tint = 0xff0000; // Red tint when hunting
+ self.lastSeenX = assassin.x;
+ self.lastSeenY = assassin.y;
+ };
self.update = function () {
if (self.isPatrolling && self.patrolPoints.length > 1) {
var targetPoint = self.patrolPoints[self.currentPatrolIndex];
var dx = targetPoint.x - self.x;
@@ -167,8 +264,11 @@
var targetsEliminated = 0;
var totalTargets = 0;
var visibilityMeter;
var stealthText;
+var weaponUI;
+var ammoUI;
+var doubleTapTimer = 0;
// Create UI elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
@@ -176,8 +276,24 @@
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
+var weaponUI = new Text2('KNIFE', {
+ size: 45,
+ fill: 0x00ffff
+});
+weaponUI.anchor.set(0, 1);
+weaponUI.x = 150;
+weaponUI.y = -50;
+LK.gui.bottomLeft.addChild(weaponUI);
+var ammoUI = new Text2('AMMO: 3', {
+ size: 40,
+ fill: 0xffff00
+});
+ammoUI.anchor.set(0, 1);
+ammoUI.x = 150;
+ammoUI.y = -100;
+LK.gui.bottomLeft.addChild(ammoUI);
visibilityMeter = new Text2('HIDDEN', {
size: 50,
fill: 0x00FF00
});
@@ -328,13 +444,28 @@
for (var i = 0; i < targets.length; i++) {
var target = targets[i];
if (target.isEliminated) continue;
var distance = Math.sqrt((assassin.x - target.x) * (assassin.x - target.x) + (assassin.y - target.y) * (assassin.y - target.y));
- if (distance < 60 && assassin.isHidden) {
+ // Different kill conditions based on weapon
+ var canKill = false;
+ if (assassin.weaponType === 'knife' && distance < 60 && assassin.isHidden) {
+ canKill = true; // Knife requires stealth and close range
+ } else if (assassin.weaponType === 'gun' && distance < 150 && assassin.ammo > 0) {
+ canKill = true; // Gun has longer range but uses ammo
+ }
+ if (canKill) {
+ assassin.performKill(target);
target.eliminate();
return;
}
}
+ // Check for weapon switching (double tap)
+ if (doubleTapTimer > 0) {
+ assassin.switchWeapon();
+ doubleTapTimer = 0;
+ } else {
+ doubleTapTimer = 30; // 0.5 seconds
+ }
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameOver) return;
@@ -346,25 +477,70 @@
dragNode = null;
};
game.update = function () {
if (gameOver) return;
+ // Update double tap timer
+ if (doubleTapTimer > 0) {
+ doubleTapTimer--;
+ }
// Update score display
scoreTxt.setText('Score: ' + LK.getScore());
// Update targets counter
stealthText.setText('Targets: ' + targetsEliminated + '/' + totalTargets);
+ // Update weapon UI
+ if (assassin) {
+ weaponUI.setText(assassin.weaponType.toUpperCase());
+ if (assassin.weaponType === 'gun') {
+ ammoUI.setText('AMMO: ' + assassin.ammo);
+ ammoUI.visible = true;
+ } else {
+ ammoUI.visible = false;
+ }
+ }
// Update visibility meter
if (assassin) {
if (assassin.isHidden) {
visibilityMeter.setText('HIDDEN');
visibilityMeter.fill = '#00ff00';
} else {
- visibilityMeter.setText('VISIBLE');
+ visibilityMeter.setText('EXPOSED');
visibilityMeter.fill = '#ff0000';
}
}
- // Check for detection by any guard
+ // Enhanced guard AI behavior
for (var i = 0; i < guards.length; i++) {
- if (guards[i].isAlerted && !gameOver) {
+ var guard = guards[i];
+ if (guard.alertedByGunshot && !gameOver) {
+ guard.startHunting();
+ guard.alertedByGunshot = false;
+ }
+ // Handle investigation behavior
+ if (guard.alertLevel === 2) {
+ var distToInvestigate = Math.sqrt((guard.x - guard.investigateX) * (guard.x - guard.investigateX) + (guard.y - guard.investigateY) * (guard.y - guard.investigateY));
+ if (distToInvestigate < 20) {
+ guard.alertTimer--;
+ if (guard.alertTimer <= 0) {
+ guard.alertLevel = 0;
+ guard.isPatrolling = true;
+ guard.guardGraphics.tint = 0xffffff;
+ guard.moveSpeed = 1;
+ }
+ }
+ }
+ // Handle hunting behavior
+ if (guard.alertLevel === 3) {
+ var distToLastSeen = Math.sqrt((guard.x - guard.lastSeenX) * (guard.x - guard.lastSeenX) + (guard.y - guard.lastSeenY) * (guard.y - guard.lastSeenY));
+ if (distToLastSeen < 50) {
+ // Search around last known position
+ guard.lastSeenX += (Math.random() - 0.5) * 100;
+ guard.lastSeenY += (Math.random() - 0.5) * 100;
+ }
+ }
+ if (guard.canSeeAssassin() && !gameOver) {
+ guard.startHunting();
+ LK.getSound('alert').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
gameOver = true;
break;
}
}