/**** * Classes ****/ // AntivirusAgent class: player-controlled agent var AntivirusAgent = Container.expand(function () { var self = Container.call(this); // Attach agent asset (placeholder: 'antivirusAgent') var agentAsset = self.attachAsset('antivirusAgent', { anchorX: 0.5, anchorY: 0.5 }); // Track last position for event triggers self.lastX = 0; self.lastY = 0; // Update method stub self.update = function () { // To be implemented: movement, collision, etc. }; return self; }); // SystemFile class: files to protect from infection var SystemFile = Container.expand(function () { var self = Container.call(this); // Attach file asset (placeholder: 'systemFile') var fileAsset = self.attachAsset('systemFile', { anchorX: 0.5, anchorY: 0.5 }); // Infection state self.infected = false; return self; }); // Virus class: viruses that move toward system files var Virus = Container.expand(function () { var self = Container.call(this); // Attach virus asset (placeholder: 'virus') var virusAsset = self.attachAsset('virus', { anchorX: 0.5, anchorY: 0.5 }); // Track last position for event triggers self.lastX = 0; self.lastY = 0; // Update method: move toward nearest uninfected SystemFile and infect on contact self.update = function () { // Find nearest uninfected system file var nearestFile = null; var minDist = Infinity; for (var i = 0; i < systemFiles.length; i++) { var file = systemFiles[i]; if (file.infected) continue; var dx = file.x - self.x; var dy = file.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; nearestFile = file; } } // Move toward nearest file if found if (nearestFile) { var dx = nearestFile.x - self.x; var dy = nearestFile.y - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { var speed = 16; // Speed up if this virus or all viruses are boosted if (self.speedBoost || Virus.prototype.speedBoosted) { speed = 28; } self.x += dx / len * speed; self.y += dy / len * speed; } // Check for infection (collision) if (!self.lastWasIntersecting && self.intersects(nearestFile)) { nearestFile.infected = true; // Optionally: visually indicate infection (e.g. alpha) if (nearestFile.children && nearestFile.children.length > 0) { nearestFile.children[0].alpha = 0.4; } } self.lastWasIntersecting = self.intersects(nearestFile); } // Track last position for event triggers self.lastX = self.x; self.lastY = self.y; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Global arrays to keep track of all viruses and system files var viruses = []; var systemFiles = []; // Start background music at game start LK.playMusic('music'); // Add Windows 10 background image, stretched to fill the game area var backgroundImg = LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732 }); game.addChild(backgroundImg); // Create the antivirus agent and add to the game var antivirusAgent = new AntivirusAgent(); game.addChild(antivirusAgent); antivirusAgent.x = 2048 / 2; antivirusAgent.y = 2732 - 300; // Start near the bottom center // Add system files along the bottom of the screen var numFiles = 5; var spacing = 2048 / (numFiles + 1); for (var i = 0; i < numFiles; i++) { var file = new SystemFile(); file.x = spacing * (i + 1); file.y = 2732 - 100; game.addChild(file); systemFiles.push(file); } // Function to spawn a virus at a random X at the top function spawnVirus() { var virus = new Virus(); virus.x = 200 + Math.random() * (2048 - 400); virus.y = 100; game.addChild(virus); viruses.push(virus); } // Spawn viruses at intervals instead of all at once var numViruses = 5; var virusesSpawned = 0; var virusSpawnTimer = LK.setInterval(function () { if (virusesSpawned < numViruses) { spawnVirus(); virusesSpawned++; } else { LK.clearInterval(virusSpawnTimer); } }, 1200); // spawn every 1.2 seconds // Dragging logic for antivirus agent var draggingAgent = false; game.down = function (x, y, obj) { // Start dragging if touch/click is near the agent var dx = x - antivirusAgent.x; var dy = y - antivirusAgent.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 120) { // touch radius draggingAgent = true; } }; game.move = function (x, y, obj) { if (draggingAgent) { antivirusAgent.x = x; antivirusAgent.y = y; } }; game.up = function (x, y, obj) { draggingAgent = false; }; // Score variable and display var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Main game update loop game.update = function () { // Update all viruses and check for collision with antivirus agent for (var i = viruses.length - 1; i >= 0; i--) { var virus = viruses[i]; if (virus.update) virus.update(); // Check for collision with antivirus agent (eliminate virus) if (!virus.lastAgentIntersect && virus.intersects(antivirusAgent)) { // Remove virus from game virus.destroy(); viruses.splice(i, 1); // Play virus sound LK.getSound('virus').play(); // Increase score and update display score += 1; scoreTxt.setText(score); // When score reaches 5, spawn 5 more viruses (if not already triggered) if (score === 5 && typeof moreVirusesSpawned === "undefined") { moreVirusesSpawned = true; var extraViruses = 5; var extraSpawned = 0; var extraVirusTimer = LK.setInterval(function () { if (extraSpawned < extraViruses) { spawnVirus(); extraSpawned++; } else { LK.clearInterval(extraVirusTimer); } }, 1000); } // When score reaches 10, spawn 8 more viruses and speed up all viruses (only once) if (score === 10 && typeof evenMoreVirusesSpawned === "undefined") { evenMoreVirusesSpawned = true; var moreViruses = 8; var moreSpawned = 0; var moreVirusTimer = LK.setInterval(function () { if (moreSpawned < moreViruses) { spawnVirus(); moreSpawned++; } else { LK.clearInterval(moreVirusTimer); } }, 600); // faster spawn interval // Speed up all existing viruses and future ones for (var v = 0; v < viruses.length; v++) { viruses[v].speedBoost = true; } Virus.prototype.speedBoosted = true; } continue; } // When score reaches 15, spawn 10 more viruses and speed up all viruses (only once) if (score === 15 && typeof maxVirusWaveSpawned === "undefined") { maxVirusWaveSpawned = true; var maxViruses = 10; var maxSpawned = 0; var maxVirusTimer = LK.setInterval(function () { if (maxSpawned < maxViruses) { spawnVirus(); maxSpawned++; } else { LK.clearInterval(maxVirusTimer); } }, 400); // even faster spawn interval // Speed up all existing viruses and future ones for (var v = 0; v < viruses.length; v++) { viruses[v].speedBoost = true; } Virus.prototype.speedBoosted = true; } // When score reaches 20, spawn 12 more viruses and speed up all viruses (only once) if (score === 20 && typeof ultraVirusWaveSpawned === "undefined") { ultraVirusWaveSpawned = true; var ultraViruses = 12; var ultraSpawned = 0; var ultraVirusTimer = LK.setInterval(function () { if (ultraSpawned < ultraViruses) { spawnVirus(); ultraSpawned++; } else { LK.clearInterval(ultraVirusTimer); } }, 250); // even faster spawn interval // Speed up all existing viruses and future ones for (var v = 0; v < viruses.length; v++) { viruses[v].speedBoost = true; } Virus.prototype.speedBoosted = true; } virus.lastAgentIntersect = virus.intersects(antivirusAgent); } // Update antivirus agent if (antivirusAgent.update) antivirusAgent.update(); // End game if too many files are infected var infectedCount = 0; for (var i = 0; i < systemFiles.length; i++) { if (systemFiles[i].infected) infectedCount++; } if (infectedCount >= 3) { LK.showGameOver(); } };
/****
* Classes
****/
// AntivirusAgent class: player-controlled agent
var AntivirusAgent = Container.expand(function () {
var self = Container.call(this);
// Attach agent asset (placeholder: 'antivirusAgent')
var agentAsset = self.attachAsset('antivirusAgent', {
anchorX: 0.5,
anchorY: 0.5
});
// Track last position for event triggers
self.lastX = 0;
self.lastY = 0;
// Update method stub
self.update = function () {
// To be implemented: movement, collision, etc.
};
return self;
});
// SystemFile class: files to protect from infection
var SystemFile = Container.expand(function () {
var self = Container.call(this);
// Attach file asset (placeholder: 'systemFile')
var fileAsset = self.attachAsset('systemFile', {
anchorX: 0.5,
anchorY: 0.5
});
// Infection state
self.infected = false;
return self;
});
// Virus class: viruses that move toward system files
var Virus = Container.expand(function () {
var self = Container.call(this);
// Attach virus asset (placeholder: 'virus')
var virusAsset = self.attachAsset('virus', {
anchorX: 0.5,
anchorY: 0.5
});
// Track last position for event triggers
self.lastX = 0;
self.lastY = 0;
// Update method: move toward nearest uninfected SystemFile and infect on contact
self.update = function () {
// Find nearest uninfected system file
var nearestFile = null;
var minDist = Infinity;
for (var i = 0; i < systemFiles.length; i++) {
var file = systemFiles[i];
if (file.infected) continue;
var dx = file.x - self.x;
var dy = file.y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < minDist) {
minDist = dist;
nearestFile = file;
}
}
// Move toward nearest file if found
if (nearestFile) {
var dx = nearestFile.x - self.x;
var dy = nearestFile.y - self.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0) {
var speed = 16;
// Speed up if this virus or all viruses are boosted
if (self.speedBoost || Virus.prototype.speedBoosted) {
speed = 28;
}
self.x += dx / len * speed;
self.y += dy / len * speed;
}
// Check for infection (collision)
if (!self.lastWasIntersecting && self.intersects(nearestFile)) {
nearestFile.infected = true;
// Optionally: visually indicate infection (e.g. alpha)
if (nearestFile.children && nearestFile.children.length > 0) {
nearestFile.children[0].alpha = 0.4;
}
}
self.lastWasIntersecting = self.intersects(nearestFile);
}
// Track last position for event triggers
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Global arrays to keep track of all viruses and system files
var viruses = [];
var systemFiles = [];
// Start background music at game start
LK.playMusic('music');
// Add Windows 10 background image, stretched to fill the game area
var backgroundImg = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
game.addChild(backgroundImg);
// Create the antivirus agent and add to the game
var antivirusAgent = new AntivirusAgent();
game.addChild(antivirusAgent);
antivirusAgent.x = 2048 / 2;
antivirusAgent.y = 2732 - 300; // Start near the bottom center
// Add system files along the bottom of the screen
var numFiles = 5;
var spacing = 2048 / (numFiles + 1);
for (var i = 0; i < numFiles; i++) {
var file = new SystemFile();
file.x = spacing * (i + 1);
file.y = 2732 - 100;
game.addChild(file);
systemFiles.push(file);
}
// Function to spawn a virus at a random X at the top
function spawnVirus() {
var virus = new Virus();
virus.x = 200 + Math.random() * (2048 - 400);
virus.y = 100;
game.addChild(virus);
viruses.push(virus);
}
// Spawn viruses at intervals instead of all at once
var numViruses = 5;
var virusesSpawned = 0;
var virusSpawnTimer = LK.setInterval(function () {
if (virusesSpawned < numViruses) {
spawnVirus();
virusesSpawned++;
} else {
LK.clearInterval(virusSpawnTimer);
}
}, 1200); // spawn every 1.2 seconds
// Dragging logic for antivirus agent
var draggingAgent = false;
game.down = function (x, y, obj) {
// Start dragging if touch/click is near the agent
var dx = x - antivirusAgent.x;
var dy = y - antivirusAgent.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
// touch radius
draggingAgent = true;
}
};
game.move = function (x, y, obj) {
if (draggingAgent) {
antivirusAgent.x = x;
antivirusAgent.y = y;
}
};
game.up = function (x, y, obj) {
draggingAgent = false;
};
// Score variable and display
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Main game update loop
game.update = function () {
// Update all viruses and check for collision with antivirus agent
for (var i = viruses.length - 1; i >= 0; i--) {
var virus = viruses[i];
if (virus.update) virus.update();
// Check for collision with antivirus agent (eliminate virus)
if (!virus.lastAgentIntersect && virus.intersects(antivirusAgent)) {
// Remove virus from game
virus.destroy();
viruses.splice(i, 1);
// Play virus sound
LK.getSound('virus').play();
// Increase score and update display
score += 1;
scoreTxt.setText(score);
// When score reaches 5, spawn 5 more viruses (if not already triggered)
if (score === 5 && typeof moreVirusesSpawned === "undefined") {
moreVirusesSpawned = true;
var extraViruses = 5;
var extraSpawned = 0;
var extraVirusTimer = LK.setInterval(function () {
if (extraSpawned < extraViruses) {
spawnVirus();
extraSpawned++;
} else {
LK.clearInterval(extraVirusTimer);
}
}, 1000);
}
// When score reaches 10, spawn 8 more viruses and speed up all viruses (only once)
if (score === 10 && typeof evenMoreVirusesSpawned === "undefined") {
evenMoreVirusesSpawned = true;
var moreViruses = 8;
var moreSpawned = 0;
var moreVirusTimer = LK.setInterval(function () {
if (moreSpawned < moreViruses) {
spawnVirus();
moreSpawned++;
} else {
LK.clearInterval(moreVirusTimer);
}
}, 600); // faster spawn interval
// Speed up all existing viruses and future ones
for (var v = 0; v < viruses.length; v++) {
viruses[v].speedBoost = true;
}
Virus.prototype.speedBoosted = true;
}
continue;
}
// When score reaches 15, spawn 10 more viruses and speed up all viruses (only once)
if (score === 15 && typeof maxVirusWaveSpawned === "undefined") {
maxVirusWaveSpawned = true;
var maxViruses = 10;
var maxSpawned = 0;
var maxVirusTimer = LK.setInterval(function () {
if (maxSpawned < maxViruses) {
spawnVirus();
maxSpawned++;
} else {
LK.clearInterval(maxVirusTimer);
}
}, 400); // even faster spawn interval
// Speed up all existing viruses and future ones
for (var v = 0; v < viruses.length; v++) {
viruses[v].speedBoost = true;
}
Virus.prototype.speedBoosted = true;
}
// When score reaches 20, spawn 12 more viruses and speed up all viruses (only once)
if (score === 20 && typeof ultraVirusWaveSpawned === "undefined") {
ultraVirusWaveSpawned = true;
var ultraViruses = 12;
var ultraSpawned = 0;
var ultraVirusTimer = LK.setInterval(function () {
if (ultraSpawned < ultraViruses) {
spawnVirus();
ultraSpawned++;
} else {
LK.clearInterval(ultraVirusTimer);
}
}, 250); // even faster spawn interval
// Speed up all existing viruses and future ones
for (var v = 0; v < viruses.length; v++) {
viruses[v].speedBoost = true;
}
Virus.prototype.speedBoosted = true;
}
virus.lastAgentIntersect = virus.intersects(antivirusAgent);
}
// Update antivirus agent
if (antivirusAgent.update) antivirusAgent.update();
// End game if too many files are infected
var infectedCount = 0;
for (var i = 0; i < systemFiles.length; i++) {
if (systemFiles[i].infected) infectedCount++;
}
if (infectedCount >= 3) {
LK.showGameOver();
}
};