User prompt
Player can only shoot the villains
User prompt
When blue semibot See's player blue semibot helps player defeat the villains
User prompt
Make the blue semibot kill the villain make the blue semibot Chase the villain
User prompt
Please fix the bug: 'LK.setPersistent is not a function' in or related to this line: 'LK.setPersistent(semibot);' Line Number: 1246
User prompt
Can you make the blue semibot stay
User prompt
Add blue semibot character
User prompt
Rename Taxmanlcon to taxman and stop calling tax man player it's just the villain there's two villains
User prompt
Make the taxman come after the player
User prompt
The taxman is not the player the taxman is the enemy not Taxmanlcon
User prompt
Add the taxman asset
User prompt
Make a weapon for the player
User prompt
Main villain ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'playerHealthText.style.fill = player.health <= 20 ? 0xe74c3c : player.health <= 50 ? 0xf39c12 : 0x00FF00;' Line Number: 946
User prompt
Add a player
User prompt
Add player
User prompt
Add semibot and taxman
User prompt
I need a semibot player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Repo bot player
Code edit (1 edits merged)
Please save this source code
User prompt
R.E.P.O. - Repository Emergency Protocol Override
Initial prompt
Make r.e.p.o.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var DataPacket = Container.expand(function () { var self = Container.call(this); // Color constants var COLORS = [0x3498db, 0xe74c3c, 0xf39c12, 0x2ecc71, 0x9b59b6]; var COLOR_NAMES = ['blue', 'red', 'orange', 'green', 'purple']; // Properties self.colorIndex = 0; self.colorName = ''; self.isBeingDragged = false; self.lastX = 0; self.lastY = 0; self.lastWasIntersecting = false; self.matchedNode = null; // Create packet graphic var packetGraphic = self.attachAsset('dataPacket', { anchorX: 0.5, anchorY: 0.5 }); // Set random color self.setRandomColor = function () { self.colorIndex = Math.floor(Math.random() * COLORS.length); self.colorName = COLOR_NAMES[self.colorIndex]; packetGraphic.tint = COLORS[self.colorIndex]; }; // Down event for dragging self.down = function (x, y, obj) { self.isBeingDragged = true; // Bring to front if (self.parent) { self.parent.removeChild(self); self.parent.addChild(self); } }; // Update method called every tick self.update = function () { // Track position for intersection detection self.lastX = self.x; self.lastY = self.y; }; // Initialize with random color self.setRandomColor(); return self; }); var ErrorBlock = Container.expand(function () { var self = Container.call(this); // Properties self.lifespan = 10 * 60; // 10 seconds at 60fps // Create block graphic var blockGraphic = self.attachAsset('errorBlock', { anchorX: 0.5, anchorY: 0.5 }); // Update method self.update = function () { self.lifespan--; // Fade out near end of lifespan if (self.lifespan < 60) { self.alpha = self.lifespan / 60; } // Rotate slowly self.rotation += 0.01; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); // Properties self.type = 'slowTime'; // Default type self.isBeingDragged = false; self.lastX = 0; self.lastY = 0; self.lastWasIntersecting = false; // Create power-up graphic var powerUpGraphic = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); // Power-up types and their colors var TYPES = ['slowTime', 'clearPath', 'stabilityBoost']; var TYPE_COLORS = [0xf39c12, 0x9b59b6, 0x3498db]; // Set type self.setType = function (typeIndex) { self.type = TYPES[typeIndex]; powerUpGraphic.tint = TYPE_COLORS[typeIndex]; }; // Down event for dragging self.down = function (x, y, obj) { self.isBeingDragged = true; // Bring to front if (self.parent) { self.parent.removeChild(self); self.parent.addChild(self); } }; // Update method self.update = function () { // Pulse effect var pulseAmount = Math.sin(LK.ticks * 0.1) * 0.1 + 1; self.scale.set(pulseAmount, pulseAmount); // Track position self.lastX = self.x; self.lastY = self.y; }; // Set random type self.setType(Math.floor(Math.random() * TYPES.length)); return self; }); var StabilityBar = Container.expand(function () { var self = Container.call(this); // Properties self.stability = 50; // Start at 50% self.maxStability = 100; self.warningLevel = 25; self.criticalLevel = 10; // Create background var barBg = self.attachAsset('stabilityBarBg', { anchorX: 0.5, anchorY: 0.5 }); // Create bar var bar = self.attachAsset('stabilityBar', { anchorX: 0.5, anchorY: 1.0 }); // Position the bar bar.y = barBg.height / 2; // Set stability amount (0-100) self.setStability = function (amount) { self.stability = Math.max(0, Math.min(self.maxStability, amount)); // Update bar height var heightPercentage = self.stability / self.maxStability; bar.scaleY = heightPercentage; // Update bar color based on stability if (self.stability <= self.criticalLevel) { bar.tint = 0xe74c3c; // Critical - red } else if (self.stability <= self.warningLevel) { bar.tint = 0xf39c12; // Warning - orange } else { bar.tint = 0x27ae60; // Normal - green } }; // Change stability self.changeStability = function (delta) { self.setStability(self.stability + delta); return self.stability; }; // Initialize self.setStability(self.stability); return self; }); // Game variables var StorageNode = Container.expand(function () { var self = Container.call(this); // Color constants var COLORS = [0x3498db, 0xe74c3c, 0xf39c12, 0x2ecc71, 0x9b59b6]; var COLOR_NAMES = ['blue', 'red', 'orange', 'green', 'purple']; // Properties self.colorIndex = 0; self.colorName = ''; self.lastPacketsStored = 0; self.packetsStored = 0; // Create node graphic var nodeGraphic = self.attachAsset('storageNode', { anchorX: 0.5, anchorY: 0.5 }); // Set color self.setColor = function (index) { self.colorIndex = index; self.colorName = COLOR_NAMES[index]; nodeGraphic.tint = COLORS[index]; }; // Handle packet storage self.storePacket = function () { self.packetsStored++; // Visual feedback tween.to(self, 0.2, { scaleX: 1.2, scaleY: 1.2, onComplete: function onComplete() { tween.to(self, 0.2, { scaleX: 1, scaleY: 1 }); } }); }; // Update method self.update = function () { self.lastPacketsStored = self.packetsStored; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game variables // Game assets // Tween library for animations var packetSpawnInterval = 3 * 60; // Spawn every 3 seconds at 60fps var nextPacketSpawn = packetSpawnInterval; var stabilityDecayRate = 0.05; // Stability decay per tick var packets = []; var storageNodes = []; var errorBlocks = []; var powerUps = []; var level = 1; var score = 0; var stabilityBar; var scoreText; var levelText; var draggedObject = null; var gameRunning = true; var lastSuccessfulChain = 0; var chainCount = 0; // UI text setup scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 50; scoreText.y = 50; LK.gui.topLeft.addChild(scoreText); levelText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(1, 0); levelText.x = -50; levelText.y = 50; LK.gui.topRight.addChild(levelText); // Initialize stability bar stabilityBar = new StabilityBar(); stabilityBar.x = 80; stabilityBar.y = 2732 / 2; game.addChild(stabilityBar); // Create storage nodes function createStorageNodes() { // Clear existing nodes storageNodes.forEach(function (node) { node.destroy(); }); storageNodes = []; var numNodes = Math.min(5, 2 + Math.floor(level / 2)); // Increase nodes with level var spacing = 2048 / (numNodes + 1); for (var i = 0; i < numNodes; i++) { var node = new StorageNode(); node.setColor(i % 5); node.x = spacing * (i + 1); node.y = 2732 - 300; game.addChild(node); storageNodes.push(node); } } // Create a new data packet function createDataPacket() { var packet = new DataPacket(); packet.x = Math.random() * (2048 - 200) + 100; packet.y = -100; game.addChild(packet); packets.push(packet); // Random vertical speed based on level packet.speedY = 1 + Math.random() * level * 0.5; return packet; } // Create power-up function createPowerUp() { var powerUp = new PowerUp(); powerUp.x = Math.random() * (2048 - 200) + 100; powerUp.y = -100; game.addChild(powerUp); powerUps.push(powerUp); // Set vertical speed powerUp.speedY = 1 + Math.random() * 0.5; return powerUp; } // Create error block obstacle function createErrorBlock(x, y) { var block = new ErrorBlock(); block.x = x; block.y = y; game.addChild(block); errorBlocks.push(block); return block; } // Handle power-up effect function activatePowerUp(powerUp) { LK.getSound('powerup').play(); switch (powerUp.type) { case 'slowTime': // Slow down all packets packets.forEach(function (packet) { packet.speedY *= 0.5; }); break; case 'clearPath': // Remove all error blocks errorBlocks.forEach(function (block) { block.destroy(); }); errorBlocks = []; break; case 'stabilityBoost': // Boost stability stabilityBar.changeStability(25); break; } // Visual feedback LK.effects.flashScreen(0xf39c12, 500); } // Check if a packet matches a storage node function checkNodeMatch(packet, node) { if (packet.colorIndex === node.colorIndex && packet.intersects(node)) { // Match found LK.getSound('match').play(); // Update score based on chain if (lastSuccessfulChain === packet.colorIndex) { chainCount++; score += 10 * chainCount; } else { chainCount = 1; score += 10; } lastSuccessfulChain = packet.colorIndex; // Update score display LK.setScore(score); scoreText.setText('Score: ' + score); // Increase stability stabilityBar.changeStability(5); // Visual feedback node.storePacket(); // Remove packet var index = packets.indexOf(packet); if (index !== -1) { packets.splice(index, 1); } packet.destroy(); // Level up check if (score >= level * 100) { levelUp(); } return true; } return false; } // Handle level up function levelUp() { level++; levelText.setText('Level: ' + level); // Increase difficulty packetSpawnInterval = Math.max(60, packetSpawnInterval - 15); stabilityDecayRate += 0.01; // Create new node layout createStorageNodes(); // Visual feedback LK.effects.flashScreen(0x2ecc71, 500); } // Initialize game createStorageNodes(); // Game touch/mouse events game.down = function (x, y, obj) { // Check if we're clicking on a packet or power-up var foundObject = false; // Check packets first (in reverse to get top-most) for (var i = packets.length - 1; i >= 0; i--) { var packet = packets[i]; if (packet.getBounds().contains(x, y)) { draggedObject = packet; packet.down(x, y, obj); foundObject = true; break; } } // Check power-ups if no packet was found if (!foundObject) { for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; if (powerUp.getBounds().contains(x, y)) { draggedObject = powerUp; powerUp.down(x, y, obj); foundObject = true; break; } } } }; game.move = function (x, y, obj) { if (draggedObject && draggedObject.isBeingDragged) { draggedObject.x = x; draggedObject.y = y; } }; game.up = function (x, y, obj) { if (draggedObject) { // Check for matches with storage nodes if (draggedObject instanceof DataPacket) { var matched = false; for (var i = 0; i < storageNodes.length; i++) { if (checkNodeMatch(draggedObject, storageNodes[i])) { matched = true; break; } } // Create error block if no match if (!matched) { LK.getSound('error').play(); createErrorBlock(draggedObject.x, draggedObject.y); stabilityBar.changeStability(-10); // Remove the mismatched packet var index = packets.indexOf(draggedObject); if (index !== -1) { packets.splice(index, 1); } draggedObject.destroy(); } } // Check if it's a power-up else if (draggedObject instanceof PowerUp) { activatePowerUp(draggedObject); // Remove the used power-up var index = powerUps.indexOf(draggedObject); if (index !== -1) { powerUps.splice(index, 1); } draggedObject.destroy(); } draggedObject = null; } }; // Main game update loop game.update = function () { if (!gameRunning) return; // Update all game objects for (var i = packets.length - 1; i >= 0; i--) { var packet = packets[i]; packet.update(); // Move non-dragged packets down if (!packet.isBeingDragged) { packet.y += packet.speedY; } // Check if packet is out of bounds if (packet.y > 2732 + 100) { // Missed packet - penalty stabilityBar.changeStability(-15); LK.getSound('error').play(); // Remove packet packets.splice(i, 1); packet.destroy(); continue; } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(); // Move non-dragged power-ups down if (!powerUp.isBeingDragged) { powerUp.y += powerUp.speedY; } // Remove if out of bounds if (powerUp.y > 2732 + 100) { powerUps.splice(i, 1); powerUp.destroy(); } } // Update error blocks for (var i = errorBlocks.length - 1; i >= 0; i--) { var block = errorBlocks[i]; block.update(); // Remove expired blocks if (block.lifespan <= 0) { errorBlocks.splice(i, 1); block.destroy(); } } // Update storage nodes for (var i = 0; i < storageNodes.length; i++) { storageNodes[i].update(); } // Spawn new packets nextPacketSpawn--; if (nextPacketSpawn <= 0) { createDataPacket(); nextPacketSpawn = packetSpawnInterval; // Occasionally spawn power-ups (5% chance) if (Math.random() < 0.05) { createPowerUp(); } } // Decrease stability over time stabilityBar.changeStability(-stabilityDecayRate); // Warning when stability is low if (stabilityBar.stability <= stabilityBar.warningLevel && LK.ticks % 60 === 0) { LK.getSound('warning').play(); } // Check for game over if (stabilityBar.stability <= 0) { gameRunning = false; LK.effects.flashScreen(0xe74c3c, 1000); LK.showGameOver(); } }; // Set background color to dark blue/grey for tech theme game.setBackgroundColor(0x2c3e50);
===================================================================
--- original.js
+++ change.js
@@ -1,506 +1,521 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
-var storage = LK.import("@upit/storage.v1", {
- currentLevel: 1,
- highestLevel: 1
-});
/****
* Classes
****/
-var DataPacket = Container.expand(function (color, speed) {
+var DataPacket = Container.expand(function () {
var self = Container.call(this);
- self.packetColor = color || 0xFFFFFF;
- self.targetNodeId = null;
- self.speed = speed || 3;
- self.isDragging = false;
- self.isMatched = false;
- var packetGraphics = self.attachAsset('dataPacket', {
+ // Color constants
+ var COLORS = [0x3498db, 0xe74c3c, 0xf39c12, 0x2ecc71, 0x9b59b6];
+ var COLOR_NAMES = ['blue', 'red', 'orange', 'green', 'purple'];
+ // Properties
+ self.colorIndex = 0;
+ self.colorName = '';
+ self.isBeingDragged = false;
+ self.lastX = 0;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ self.matchedNode = null;
+ // Create packet graphic
+ var packetGraphic = self.attachAsset('dataPacket', {
anchorX: 0.5,
- anchorY: 0.5,
- tint: self.packetColor
+ anchorY: 0.5
});
- self.down = function (x, y, obj) {
- self.isDragging = true;
- game.draggedPacket = self;
+ // Set random color
+ self.setRandomColor = function () {
+ self.colorIndex = Math.floor(Math.random() * COLORS.length);
+ self.colorName = COLOR_NAMES[self.colorIndex];
+ packetGraphic.tint = COLORS[self.colorIndex];
};
- self.up = function (x, y, obj) {
- self.isDragging = false;
- if (game.draggedPacket === self) {
- game.draggedPacket = null;
+ // Down event for dragging
+ self.down = function (x, y, obj) {
+ self.isBeingDragged = true;
+ // Bring to front
+ if (self.parent) {
+ self.parent.removeChild(self);
+ self.parent.addChild(self);
}
};
- self.match = function (storageNode) {
- self.isMatched = true;
- self.targetNodeId = storageNode.id;
- tween(self, {
- x: storageNode.x,
- y: storageNode.y,
- width: 0,
- height: 0,
- alpha: 0
- }, {
- duration: 500,
- easing: tween.easeIn,
- onFinish: function onFinish() {
- self.destroy();
- storageNode.processPacket();
- game.removePacket(self);
- game.score += 10;
- LK.setScore(game.score);
- LK.getSound('packet_match').play();
- }
- });
+ // Update method called every tick
+ self.update = function () {
+ // Track position for intersection detection
+ self.lastX = self.x;
+ self.lastY = self.y;
};
- self.setColor = function (color) {
- self.packetColor = color;
- packetGraphics.tint = color;
- };
+ // Initialize with random color
+ self.setRandomColor();
+ return self;
+});
+var ErrorBlock = Container.expand(function () {
+ var self = Container.call(this);
+ // Properties
+ self.lifespan = 10 * 60; // 10 seconds at 60fps
+ // Create block graphic
+ var blockGraphic = self.attachAsset('errorBlock', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Update method
self.update = function () {
- if (self.isMatched) return;
- if (!self.isDragging && !game.isPaused) {
- // Move packet toward center when not dragging
- var dx = game.dataCore.x - self.x;
- var dy = game.dataCore.y - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance > 5) {
- self.x += dx / distance * self.speed;
- self.y += dy / distance * self.speed;
- } else {
- // Packet reached the core (game over condition)
- if (!game.isGameOver) {
- game.takeDamage();
- }
- game.removePacket(self);
- self.destroy();
- }
+ self.lifespan--;
+ // Fade out near end of lifespan
+ if (self.lifespan < 60) {
+ self.alpha = self.lifespan / 60;
}
+ // Rotate slowly
+ self.rotation += 0.01;
};
return self;
});
-var Firewall = Container.expand(function (x, y, width, rotation) {
+var PowerUp = Container.expand(function () {
var self = Container.call(this);
- self.x = x;
- self.y = y;
- var firewallGraphics = self.attachAsset('firewall', {
+ // Properties
+ self.type = 'slowTime'; // Default type
+ self.isBeingDragged = false;
+ self.lastX = 0;
+ self.lastY = 0;
+ self.lastWasIntersecting = false;
+ // Create power-up graphic
+ var powerUpGraphic = self.attachAsset('powerUp', {
anchorX: 0.5,
- anchorY: 0.5,
- width: width || 200,
- height: 40
+ anchorY: 0.5
});
- if (rotation) {
- self.rotation = rotation * Math.PI / 180;
- }
+ // Power-up types and their colors
+ var TYPES = ['slowTime', 'clearPath', 'stabilityBoost'];
+ var TYPE_COLORS = [0xf39c12, 0x9b59b6, 0x3498db];
+ // Set type
+ self.setType = function (typeIndex) {
+ self.type = TYPES[typeIndex];
+ powerUpGraphic.tint = TYPE_COLORS[typeIndex];
+ };
+ // Down event for dragging
+ self.down = function (x, y, obj) {
+ self.isBeingDragged = true;
+ // Bring to front
+ if (self.parent) {
+ self.parent.removeChild(self);
+ self.parent.addChild(self);
+ }
+ };
+ // Update method
self.update = function () {
- // Optional: Add movement patterns for firewalls in higher levels
+ // Pulse effect
+ var pulseAmount = Math.sin(LK.ticks * 0.1) * 0.1 + 1;
+ self.scale.set(pulseAmount, pulseAmount);
+ // Track position
+ self.lastX = self.x;
+ self.lastY = self.y;
};
+ // Set random type
+ self.setType(Math.floor(Math.random() * TYPES.length));
return self;
});
-var ProgressBar = Container.expand(function () {
+var StabilityBar = Container.expand(function () {
var self = Container.call(this);
- var background = self.attachAsset('progressBar', {
- anchorX: 0,
+ // Properties
+ self.stability = 50; // Start at 50%
+ self.maxStability = 100;
+ self.warningLevel = 25;
+ self.criticalLevel = 10;
+ // Create background
+ var barBg = self.attachAsset('stabilityBarBg', {
+ anchorX: 0.5,
anchorY: 0.5
});
- var fill = self.attachAsset('progressFill', {
- anchorX: 0,
- anchorY: 0.5
+ // Create bar
+ var bar = self.attachAsset('stabilityBar', {
+ anchorX: 0.5,
+ anchorY: 1.0
});
- fill.width = 0;
- self.setProgress = function (percentage) {
- var targetWidth = Math.min(Math.max(percentage, 0), 1) * background.width;
- tween(fill, {
- width: targetWidth
- }, {
- duration: 300,
- easing: tween.easeOut
- });
+ // Position the bar
+ bar.y = barBg.height / 2;
+ // Set stability amount (0-100)
+ self.setStability = function (amount) {
+ self.stability = Math.max(0, Math.min(self.maxStability, amount));
+ // Update bar height
+ var heightPercentage = self.stability / self.maxStability;
+ bar.scaleY = heightPercentage;
+ // Update bar color based on stability
+ if (self.stability <= self.criticalLevel) {
+ bar.tint = 0xe74c3c; // Critical - red
+ } else if (self.stability <= self.warningLevel) {
+ bar.tint = 0xf39c12; // Warning - orange
+ } else {
+ bar.tint = 0x27ae60; // Normal - green
+ }
};
+ // Change stability
+ self.changeStability = function (delta) {
+ self.setStability(self.stability + delta);
+ return self.stability;
+ };
+ // Initialize
+ self.setStability(self.stability);
return self;
});
-var StorageNode = Container.expand(function (id, color) {
+// Game variables
+var StorageNode = Container.expand(function () {
var self = Container.call(this);
- self.id = id;
- self.nodeColor = color;
- self.packetsProcessed = 0;
- self.maxPackets = 5;
- var nodeGraphics = self.attachAsset('storageNode', {
+ // Color constants
+ var COLORS = [0x3498db, 0xe74c3c, 0xf39c12, 0x2ecc71, 0x9b59b6];
+ var COLOR_NAMES = ['blue', 'red', 'orange', 'green', 'purple'];
+ // Properties
+ self.colorIndex = 0;
+ self.colorName = '';
+ self.lastPacketsStored = 0;
+ self.packetsStored = 0;
+ // Create node graphic
+ var nodeGraphic = self.attachAsset('storageNode', {
anchorX: 0.5,
- anchorY: 0.5,
- tint: self.nodeColor
+ anchorY: 0.5
});
- var countText = new Text2('0/' + self.maxPackets, {
- size: 40,
- fill: 0xFFFFFF
- });
- countText.anchor.set(0.5, 0.5);
- self.addChild(countText);
- self.processPacket = function () {
- self.packetsProcessed++;
- countText.setText(self.packetsProcessed + '/' + self.maxPackets);
- // Check if this node is full
- if (self.packetsProcessed >= self.maxPackets) {
- tween(nodeGraphics, {
- tint: 0xFFFFFF
- }, {
- duration: 300,
- easing: tween.easeOut
- });
- // Check if all nodes are full
- game.checkLevelComplete();
- }
+ // Set color
+ self.setColor = function (index) {
+ self.colorIndex = index;
+ self.colorName = COLOR_NAMES[index];
+ nodeGraphic.tint = COLORS[index];
};
- self.reset = function () {
- self.packetsProcessed = 0;
- countText.setText(self.packetsProcessed + '/' + self.maxPackets);
- nodeGraphics.tint = self.nodeColor;
+ // Handle packet storage
+ self.storePacket = function () {
+ self.packetsStored++;
+ // Visual feedback
+ tween.to(self, 0.2, {
+ scaleX: 1.2,
+ scaleY: 1.2,
+ onComplete: function onComplete() {
+ tween.to(self, 0.2, {
+ scaleX: 1,
+ scaleY: 1
+ });
+ }
+ });
};
+ // Update method
self.update = function () {
- // Node pulsing animation if not full
- if (self.packetsProcessed < self.maxPackets && !game.isPaused) {
- var pulse = Math.sin(game.ticks * 0.05) * 0.1 + 0.9;
- self.scale.set(pulse, pulse);
- }
+ self.lastPacketsStored = self.packetsStored;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x000022
+ backgroundColor: 0x000000
});
/****
* Game Code
****/
-// Game configuration
-var COLORS = [0xFF4444, 0x44FF44, 0x4444FF, 0xFFFF44, 0xFF44FF, 0x44FFFF];
-var LEVELS = [{
- packetSpeed: 2,
- spawnRate: 120,
- nodeCount: 3,
- firewalls: 0,
- maxHealth: 3
-}, {
- packetSpeed: 2,
- spawnRate: 100,
- nodeCount: 3,
- firewalls: 2,
- maxHealth: 3
-}, {
- packetSpeed: 3,
- spawnRate: 90,
- nodeCount: 4,
- firewalls: 3,
- maxHealth: 3
-}, {
- packetSpeed: 3,
- spawnRate: 80,
- nodeCount: 4,
- firewalls: 4,
- maxHealth: 2
-}, {
- packetSpeed: 4,
- spawnRate: 70,
- nodeCount: 5,
- firewalls: 5,
- maxHealth: 2
-}];
-// Game state variables
-game.level = storage.currentLevel || 1;
-game.score = 0;
-game.health = 0;
-game.maxHealth = 0;
-game.isPaused = false;
-game.isGameOver = false;
-game.levelComplete = false;
-game.packets = [];
-game.storageNodes = [];
-game.firewalls = [];
-game.draggedPacket = null;
-game.ticks = 0;
-// Initialize UI elements
-var scoreTxt = new Text2('Score: 0', {
+// Game variables
+// Game assets
+// Tween library for animations
+var packetSpawnInterval = 3 * 60; // Spawn every 3 seconds at 60fps
+var nextPacketSpawn = packetSpawnInterval;
+var stabilityDecayRate = 0.05; // Stability decay per tick
+var packets = [];
+var storageNodes = [];
+var errorBlocks = [];
+var powerUps = [];
+var level = 1;
+var score = 0;
+var stabilityBar;
+var scoreText;
+var levelText;
+var draggedObject = null;
+var gameRunning = true;
+var lastSuccessfulChain = 0;
+var chainCount = 0;
+// UI text setup
+scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
-scoreTxt.anchor.set(1, 0);
-LK.gui.topRight.addChild(scoreTxt);
-var levelTxt = new Text2('Level: 1', {
+scoreText.anchor.set(0, 0);
+scoreText.x = 50;
+scoreText.y = 50;
+LK.gui.topLeft.addChild(scoreText);
+levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
-levelTxt.anchor.set(0, 0);
-LK.gui.topLeft.addChild(levelTxt);
-levelTxt.x = 120; // Move away from the top left corner platform menu icon
-var healthTxt = new Text2('System Health: 3/3', {
- size: 60,
- fill: 0xFFFFFF
-});
-healthTxt.anchor.set(0.5, 0);
-LK.gui.top.addChild(healthTxt);
-var levelProgress = new ProgressBar();
-levelProgress.x = 2048 / 2 - 400;
-levelProgress.y = 100;
-LK.gui.addChild(levelProgress);
-// Initialize game elements
-function initializeLevel() {
- // Clear existing elements
- game.packets.forEach(function (packet) {
- packet.destroy();
- });
- game.packets = [];
- game.storageNodes.forEach(function (node) {
+levelText.anchor.set(1, 0);
+levelText.x = -50;
+levelText.y = 50;
+LK.gui.topRight.addChild(levelText);
+// Initialize stability bar
+stabilityBar = new StabilityBar();
+stabilityBar.x = 80;
+stabilityBar.y = 2732 / 2;
+game.addChild(stabilityBar);
+// Create storage nodes
+function createStorageNodes() {
+ // Clear existing nodes
+ storageNodes.forEach(function (node) {
node.destroy();
});
- game.storageNodes = [];
- game.firewalls.forEach(function (firewall) {
- firewall.destroy();
- });
- game.firewalls = [];
- // Get level configuration
- var levelIndex = Math.min(game.level - 1, LEVELS.length - 1);
- var levelConfig = LEVELS[levelIndex];
- // Set health
- game.maxHealth = levelConfig.maxHealth;
- game.health = levelConfig.maxHealth;
- healthTxt.setText('System Health: ' + game.health + '/' + game.maxHealth);
- // Update level text
- levelTxt.setText('Level: ' + game.level);
- // Reset progress bar
- levelProgress.setProgress(0);
- // Create data core
- var coreBackground = LK.getAsset('dataCoreBackground', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- game.addChild(coreBackground);
- coreBackground.x = 2048 / 2;
- coreBackground.y = 2732 / 2;
- game.dataCore = LK.getAsset('dataCore', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- game.addChild(game.dataCore);
- game.dataCore.x = 2048 / 2;
- game.dataCore.y = 2732 / 2;
- // Create storage nodes in a circle around core
- var nodeColors = [];
- for (var i = 0; i < levelConfig.nodeCount; i++) {
- nodeColors.push(COLORS[i % COLORS.length]);
+ storageNodes = [];
+ var numNodes = Math.min(5, 2 + Math.floor(level / 2)); // Increase nodes with level
+ var spacing = 2048 / (numNodes + 1);
+ for (var i = 0; i < numNodes; i++) {
+ var node = new StorageNode();
+ node.setColor(i % 5);
+ node.x = spacing * (i + 1);
+ node.y = 2732 - 300;
+ game.addChild(node);
+ storageNodes.push(node);
}
- for (var i = 0; i < levelConfig.nodeCount; i++) {
- var angle = i * 2 * Math.PI / levelConfig.nodeCount;
- var distance = 550;
- var x = 2048 / 2 + Math.cos(angle) * distance;
- var y = 2732 / 2 + Math.sin(angle) * distance;
- var storageNode = new StorageNode(i, nodeColors[i]);
- storageNode.x = x;
- storageNode.y = y;
- game.addChild(storageNode);
- game.storageNodes.push(storageNode);
- }
- // Create firewalls
- for (var i = 0; i < levelConfig.firewalls; i++) {
- var angle = i * 2 * Math.PI / levelConfig.firewalls + Math.PI / levelConfig.firewalls;
- var distance = 350;
- var x = 2048 / 2 + Math.cos(angle) * distance;
- var y = 2732 / 2 + Math.sin(angle) * distance;
- var firewall = new Firewall(x, y, 300, angle * 180 / Math.PI + 90);
- game.addChild(firewall);
- game.firewalls.push(firewall);
- }
- // Reset game state
- game.isPaused = false;
- game.isGameOver = false;
- game.levelComplete = false;
- // Play music
- LK.playMusic('gameplay_music');
}
-// Spawn a new data packet
-function spawnPacket() {
- var levelIndex = Math.min(game.level - 1, LEVELS.length - 1);
- var levelConfig = LEVELS[levelIndex];
- // Determine spawn position (random position along edge)
- var side = Math.floor(Math.random() * 4);
- var x, y;
- switch (side) {
- case 0:
- // Top
- x = Math.random() * 2048;
- y = 100;
+// Create a new data packet
+function createDataPacket() {
+ var packet = new DataPacket();
+ packet.x = Math.random() * (2048 - 200) + 100;
+ packet.y = -100;
+ game.addChild(packet);
+ packets.push(packet);
+ // Random vertical speed based on level
+ packet.speedY = 1 + Math.random() * level * 0.5;
+ return packet;
+}
+// Create power-up
+function createPowerUp() {
+ var powerUp = new PowerUp();
+ powerUp.x = Math.random() * (2048 - 200) + 100;
+ powerUp.y = -100;
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+ // Set vertical speed
+ powerUp.speedY = 1 + Math.random() * 0.5;
+ return powerUp;
+}
+// Create error block obstacle
+function createErrorBlock(x, y) {
+ var block = new ErrorBlock();
+ block.x = x;
+ block.y = y;
+ game.addChild(block);
+ errorBlocks.push(block);
+ return block;
+}
+// Handle power-up effect
+function activatePowerUp(powerUp) {
+ LK.getSound('powerup').play();
+ switch (powerUp.type) {
+ case 'slowTime':
+ // Slow down all packets
+ packets.forEach(function (packet) {
+ packet.speedY *= 0.5;
+ });
break;
- case 1:
- // Right
- x = 2048 - 100;
- y = Math.random() * 2732;
+ case 'clearPath':
+ // Remove all error blocks
+ errorBlocks.forEach(function (block) {
+ block.destroy();
+ });
+ errorBlocks = [];
break;
- case 2:
- // Bottom
- x = Math.random() * 2048;
- y = 2732 - 100;
+ case 'stabilityBoost':
+ // Boost stability
+ stabilityBar.changeStability(25);
break;
- case 3:
- // Left
- x = 100;
- y = Math.random() * 2732;
- break;
}
- // Only use colors that match existing nodes
- var nodeColors = game.storageNodes.map(function (node) {
- return node.nodeColor;
- });
- var packetColor = nodeColors[Math.floor(Math.random() * nodeColors.length)];
- var packet = new DataPacket(packetColor, levelConfig.packetSpeed);
- packet.x = x;
- packet.y = y;
- game.addChild(packet);
- game.packets.push(packet);
+ // Visual feedback
+ LK.effects.flashScreen(0xf39c12, 500);
}
-// Check if the level is complete
-game.checkLevelComplete = function () {
- var allNodesFull = true;
- for (var i = 0; i < game.storageNodes.length; i++) {
- if (game.storageNodes[i].packetsProcessed < game.storageNodes[i].maxPackets) {
- allNodesFull = false;
- break;
+// Check if a packet matches a storage node
+function checkNodeMatch(packet, node) {
+ if (packet.colorIndex === node.colorIndex && packet.intersects(node)) {
+ // Match found
+ LK.getSound('match').play();
+ // Update score based on chain
+ if (lastSuccessfulChain === packet.colorIndex) {
+ chainCount++;
+ score += 10 * chainCount;
+ } else {
+ chainCount = 1;
+ score += 10;
}
- }
- if (allNodesFull && !game.levelComplete) {
- game.levelComplete = true;
- // Calculate progress for next level
- game.level++;
- if (game.level > storage.highestLevel) {
- storage.highestLevel = game.level;
+ lastSuccessfulChain = packet.colorIndex;
+ // Update score display
+ LK.setScore(score);
+ scoreText.setText('Score: ' + score);
+ // Increase stability
+ stabilityBar.changeStability(5);
+ // Visual feedback
+ node.storePacket();
+ // Remove packet
+ var index = packets.indexOf(packet);
+ if (index !== -1) {
+ packets.splice(index, 1);
}
- storage.currentLevel = game.level;
- // Play level complete sound
- LK.getSound('level_complete').play();
- // Show level complete message and start next level
- var levelCompleteTxt = new Text2('Level Complete!', {
- size: 100,
- fill: 0xFFFFFF
- });
- levelCompleteTxt.anchor.set(0.5, 0.5);
- levelCompleteTxt.x = 2048 / 2;
- levelCompleteTxt.y = 2732 / 2;
- game.addChild(levelCompleteTxt);
- LK.setTimeout(function () {
- levelCompleteTxt.destroy();
- initializeLevel();
- }, 2000);
+ packet.destroy();
+ // Level up check
+ if (score >= level * 100) {
+ levelUp();
+ }
+ return true;
}
-};
-// Remove a packet from the game
-game.removePacket = function (packet) {
- var index = game.packets.indexOf(packet);
- if (index !== -1) {
- game.packets.splice(index, 1);
- }
-};
-// Handle damage to the system
-game.takeDamage = function () {
- game.health--;
- healthTxt.setText('System Health: ' + game.health + '/' + game.maxHealth);
- LK.effects.flashScreen(0xFF0000, 500);
- LK.getSound('packet_error').play();
- if (game.health <= 0) {
- game.isGameOver = true;
- LK.showGameOver();
- }
-};
-// Event Handlers
+ return false;
+}
+// Handle level up
+function levelUp() {
+ level++;
+ levelText.setText('Level: ' + level);
+ // Increase difficulty
+ packetSpawnInterval = Math.max(60, packetSpawnInterval - 15);
+ stabilityDecayRate += 0.01;
+ // Create new node layout
+ createStorageNodes();
+ // Visual feedback
+ LK.effects.flashScreen(0x2ecc71, 500);
+}
+// Initialize game
+createStorageNodes();
+// Game touch/mouse events
game.down = function (x, y, obj) {
- // Check if we clicked directly on a packet
- for (var i = 0; i < game.packets.length; i++) {
- var packet = game.packets[i];
- var localPoint = packet.toLocal({
- x: x,
- y: y
- });
- if (Math.abs(localPoint.x) < packet.width / 2 && Math.abs(localPoint.y) < packet.height / 2) {
+ // Check if we're clicking on a packet or power-up
+ var foundObject = false;
+ // Check packets first (in reverse to get top-most)
+ for (var i = packets.length - 1; i >= 0; i--) {
+ var packet = packets[i];
+ if (packet.getBounds().contains(x, y)) {
+ draggedObject = packet;
packet.down(x, y, obj);
- return;
+ foundObject = true;
+ break;
}
}
-};
-game.up = function (x, y, obj) {
- if (game.draggedPacket) {
- // Check if packet is dropped on matching storage node
- for (var i = 0; i < game.storageNodes.length; i++) {
- var node = game.storageNodes[i];
- var distance = Math.sqrt(Math.pow(node.x - game.draggedPacket.x, 2) + Math.pow(node.y - game.draggedPacket.y, 2));
- if (distance < 100 && node.nodeColor === game.draggedPacket.packetColor && node.packetsProcessed < node.maxPackets) {
- game.draggedPacket.match(node);
+ // Check power-ups if no packet was found
+ if (!foundObject) {
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.getBounds().contains(x, y)) {
+ draggedObject = powerUp;
+ powerUp.down(x, y, obj);
+ foundObject = true;
break;
}
}
- game.draggedPacket.up(x, y, obj);
}
};
game.move = function (x, y, obj) {
- if (game.draggedPacket) {
- game.draggedPacket.x = x;
- game.draggedPacket.y = y;
- // Check for firewall collisions while dragging
- for (var i = 0; i < game.firewalls.length; i++) {
- var firewall = game.firewalls[i];
- var localPoint = firewall.toLocal({
- x: game.draggedPacket.x,
- y: game.draggedPacket.y
- });
- // Rotate the point back to check collision with non-rotated firewall
- var rotatedX = localPoint.x * Math.cos(-firewall.rotation) - localPoint.y * Math.sin(-firewall.rotation);
- var rotatedY = localPoint.x * Math.sin(-firewall.rotation) + localPoint.y * Math.cos(-firewall.rotation);
- if (Math.abs(rotatedX) < firewall.getChildAt(0).width / 2 && Math.abs(rotatedY) < firewall.getChildAt(0).height / 2) {
- // If colliding with firewall, move the packet away
- var angle = Math.atan2(game.draggedPacket.y - firewall.y, game.draggedPacket.x - firewall.x);
- game.draggedPacket.x = firewall.x + Math.cos(angle) * 60;
- game.draggedPacket.y = firewall.y + Math.sin(angle) * 60;
- // Visual feedback
- LK.effects.flashObject(firewall, 0xFFFFFF, 200);
- break;
+ if (draggedObject && draggedObject.isBeingDragged) {
+ draggedObject.x = x;
+ draggedObject.y = y;
+ }
+};
+game.up = function (x, y, obj) {
+ if (draggedObject) {
+ // Check for matches with storage nodes
+ if (draggedObject instanceof DataPacket) {
+ var matched = false;
+ for (var i = 0; i < storageNodes.length; i++) {
+ if (checkNodeMatch(draggedObject, storageNodes[i])) {
+ matched = true;
+ break;
+ }
}
+ // Create error block if no match
+ if (!matched) {
+ LK.getSound('error').play();
+ createErrorBlock(draggedObject.x, draggedObject.y);
+ stabilityBar.changeStability(-10);
+ // Remove the mismatched packet
+ var index = packets.indexOf(draggedObject);
+ if (index !== -1) {
+ packets.splice(index, 1);
+ }
+ draggedObject.destroy();
+ }
}
+ // Check if it's a power-up
+ else if (draggedObject instanceof PowerUp) {
+ activatePowerUp(draggedObject);
+ // Remove the used power-up
+ var index = powerUps.indexOf(draggedObject);
+ if (index !== -1) {
+ powerUps.splice(index, 1);
+ }
+ draggedObject.destroy();
+ }
+ draggedObject = null;
}
};
-// Game update loop
+// Main game update loop
game.update = function () {
- game.ticks++;
- if (game.isGameOver || game.levelComplete || game.isPaused) {
- return;
+ if (!gameRunning) return;
+ // Update all game objects
+ for (var i = packets.length - 1; i >= 0; i--) {
+ var packet = packets[i];
+ packet.update();
+ // Move non-dragged packets down
+ if (!packet.isBeingDragged) {
+ packet.y += packet.speedY;
+ }
+ // Check if packet is out of bounds
+ if (packet.y > 2732 + 100) {
+ // Missed packet - penalty
+ stabilityBar.changeStability(-15);
+ LK.getSound('error').play();
+ // Remove packet
+ packets.splice(i, 1);
+ packet.destroy();
+ continue;
+ }
}
- // Update all game elements
- for (var i = 0; i < game.packets.length; i++) {
- if (game.packets[i]) {
- game.packets[i].update();
+ // Update power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ powerUp.update();
+ // Move non-dragged power-ups down
+ if (!powerUp.isBeingDragged) {
+ powerUp.y += powerUp.speedY;
}
+ // Remove if out of bounds
+ if (powerUp.y > 2732 + 100) {
+ powerUps.splice(i, 1);
+ powerUp.destroy();
+ }
}
- for (var i = 0; i < game.storageNodes.length; i++) {
- game.storageNodes[i].update();
+ // Update error blocks
+ for (var i = errorBlocks.length - 1; i >= 0; i--) {
+ var block = errorBlocks[i];
+ block.update();
+ // Remove expired blocks
+ if (block.lifespan <= 0) {
+ errorBlocks.splice(i, 1);
+ block.destroy();
+ }
}
- for (var i = 0; i < game.firewalls.length; i++) {
- game.firewalls[i].update();
+ // Update storage nodes
+ for (var i = 0; i < storageNodes.length; i++) {
+ storageNodes[i].update();
}
- // Spawn new packets based on level
- var levelIndex = Math.min(game.level - 1, LEVELS.length - 1);
- var levelConfig = LEVELS[levelIndex];
- if (game.ticks % levelConfig.spawnRate === 0) {
- spawnPacket();
+ // Spawn new packets
+ nextPacketSpawn--;
+ if (nextPacketSpawn <= 0) {
+ createDataPacket();
+ nextPacketSpawn = packetSpawnInterval;
+ // Occasionally spawn power-ups (5% chance)
+ if (Math.random() < 0.05) {
+ createPowerUp();
+ }
}
- // Update progress bar based on filled nodes
- var totalNeeded = game.storageNodes.length * game.storageNodes[0].maxPackets;
- var totalFilled = 0;
- for (var i = 0; i < game.storageNodes.length; i++) {
- totalFilled += game.storageNodes[i].packetsProcessed;
+ // Decrease stability over time
+ stabilityBar.changeStability(-stabilityDecayRate);
+ // Warning when stability is low
+ if (stabilityBar.stability <= stabilityBar.warningLevel && LK.ticks % 60 === 0) {
+ LK.getSound('warning').play();
}
- levelProgress.setProgress(totalFilled / totalNeeded);
- // Update score display
- scoreTxt.setText('Score: ' + LK.getScore());
+ // Check for game over
+ if (stabilityBar.stability <= 0) {
+ gameRunning = false;
+ LK.effects.flashScreen(0xe74c3c, 1000);
+ LK.showGameOver();
+ }
};
-// Initialize the first level
-initializeLevel();
\ No newline at end of file
+// Set background color to dark blue/grey for tech theme
+game.setBackgroundColor(0x2c3e50);
\ No newline at end of file
Stroge node. In-Game asset. High contrast. No shadows
Error. In-Game asset. High contrast. No shadows
Power up. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Semibot. In-Game asset. High contrast. No shadows
(StabilityBarBg). In-Game asset. High contrast. No shadows
Creepy sad and happy emoji with black eyes and white people's. In-Game asset. High contrast. No shadows
Blue semibot. In-Game asset. High contrast. No shadows