/****
* 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
});
self.isHidden = false;
self.isMoving = false;
self.moveSpeed = 3;
self.targetX = 0;
self.targetY = 0;
self.moveTo = function (x, y) {
self.targetX = x;
self.targetY = y;
self.isMoving = 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.6;
} else {
assassinGraphics.alpha = 1.0;
}
};
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.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;
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;
};
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;
// 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);
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));
if (distance < 60 && assassin.isHidden) {
target.eliminate();
return;
}
}
}
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 score display
scoreTxt.setText('Score: ' + LK.getScore());
// Update targets counter
stealthText.setText('Targets: ' + targetsEliminated + '/' + totalTargets);
// Update visibility meter
if (assassin) {
if (assassin.isHidden) {
visibilityMeter.setText('HIDDEN');
visibilityMeter.fill = '#00ff00';
} else {
visibilityMeter.setText('VISIBLE');
visibilityMeter.fill = '#ff0000';
}
}
// Check for detection by any guard
for (var i = 0; i < guards.length; i++) {
if (guards[i].isAlerted && !gameOver) {
gameOver = true;
break;
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,371 @@
-/****
+/****
+* 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
+ });
+ self.isHidden = false;
+ self.isMoving = false;
+ self.moveSpeed = 3;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.moveTo = function (x, y) {
+ self.targetX = x;
+ self.targetY = y;
+ self.isMoving = 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.6;
+ } else {
+ assassinGraphics.alpha = 1.0;
+ }
+ };
+ 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.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;
+ 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;
+ };
+ 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: 0x000000
-});
\ No newline at end of file
+ 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;
+// 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);
+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));
+ if (distance < 60 && assassin.isHidden) {
+ target.eliminate();
+ return;
+ }
+ }
+}
+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 score display
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Update targets counter
+ stealthText.setText('Targets: ' + targetsEliminated + '/' + totalTargets);
+ // Update visibility meter
+ if (assassin) {
+ if (assassin.isHidden) {
+ visibilityMeter.setText('HIDDEN');
+ visibilityMeter.fill = '#00ff00';
+ } else {
+ visibilityMeter.setText('VISIBLE');
+ visibilityMeter.fill = '#ff0000';
+ }
+ }
+ // Check for detection by any guard
+ for (var i = 0; i < guards.length; i++) {
+ if (guards[i].isAlerted && !gameOver) {
+ gameOver = true;
+ break;
+ }
+ }
+};
\ No newline at end of file