/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var MemoryFragment = Container.expand(function (fragmentType) { var self = Container.call(this); var colors = [0x00ff00, 0xff6600, 0x0099ff, 0xffff00, 0xff00ff]; var shapes = ['memoryFragment', 'memorySquare', 'memoryTriangle']; fragmentType = fragmentType || Math.floor(Math.random() * shapes.length); var selectedShape = shapes[fragmentType]; var selectedColor = colors[Math.floor(Math.random() * colors.length)]; var graphics = self.attachAsset(selectedShape, { anchorX: 0.5, anchorY: 0.5 }); graphics.tint = selectedColor; self.fragmentType = fragmentType; self.speedX = (Math.random() - 0.5) * 4; self.speedY = Math.random() * 2 + 1; self.collected = false; self.update = function () { if (!self.collected) { self.x += self.speedX; self.y += self.speedY; // Bounce off walls if (self.x <= 40 || self.x >= 2008) { self.speedX *= -1; } if (self.y <= 40 || self.y >= 2692) { self.speedY *= -1; } // Keep in bounds if (self.x < 40) self.x = 40; if (self.x > 2008) self.x = 2008; if (self.y < 40) self.y = 40; if (self.y > 2692) self.y = 2692; } }; self.down = function (x, y, obj) { if (!self.collected) { self.collected = true; memoryCount++; memoryBar += 10; if (memoryBar > 100) memoryBar = 100; LK.effects.flashObject(self, 0xffffff, 300); LK.getSound('collectMemory').play(); // Immediately remove from array to prevent multiple collections var index = memoryFragments.indexOf(self); if (index > -1) { memoryFragments.splice(index, 1); } tween(self, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); graphics.alpha = 0.8; return self; }); var Shadow = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('shadow', { anchorX: 0.5, anchorY: 0.5 }); graphics.alpha = 0.7; self.speedX = (Math.random() - 0.5) * 3; self.speedY = (Math.random() - 0.5) * 3; self.targetX = Math.random() * 2048; self.targetY = Math.random() * 2732; self.update = function () { // Move towards target var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 10) { self.x += dx / distance * (1 + gameLevel * 0.5); self.y += dy / distance * (1 + gameLevel * 0.5); } else { // Pick new target self.targetX = Math.random() * 2048; self.targetY = Math.random() * 2732; } // Check collision with player if (self.intersects(player)) { if (!playerInvulnerable) { memoryBar -= 20; playerInvulnerable = true; LK.effects.flashObject(player, 0xff0000, 500); LK.effects.flashScreen(0xff0000, 200); LK.getSound('shadowHit').play(); LK.setTimeout(function () { playerInvulnerable = false; }, 1000); if (memoryBar <= 0) { LK.showGameOver(); } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x111111 }); /**** * Game Code ****/ var player; var memoryFragments = []; var shadows = []; var memoryBar = 0; var memoryCount = 0; var gameLevel = 1; var playerInvulnerable = false; var fragmentSpawnTimer = 0; var shadowSpawnTimer = 0; // UI Elements var memoryBarBg = LK.getAsset('memorySquare', { width: 400, height: 8, anchorX: 0.5, anchorY: 0.5 }); memoryBarBg.tint = 0x333333; var memoryBarFill = LK.getAsset('memorySquare', { width: 4, height: 8, anchorX: 0, anchorY: 0.5 }); memoryBarFill.tint = 0x00ff88; var levelText = new Text2('Level 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); var memoryText = new Text2('Memories: 0', { size: 40, fill: 0xCCCCCC }); memoryText.anchor.set(1, 0); // Position UI elements LK.gui.top.addChild(memoryBarBg); LK.gui.top.addChild(memoryBarFill); LK.gui.top.addChild(levelText); LK.gui.topRight.addChild(memoryText); memoryBarBg.y = 120; memoryBarFill.x = memoryBarBg.x - memoryBarBg.width / 2; memoryBarFill.y = 120; levelText.y = 50; memoryText.x = -50; memoryText.y = 50; // Initialize player player = game.addChild(new Player()); player.x = 1024; player.y = 1366; // Touch controls var isDragging = false; game.down = function (x, y, obj) { isDragging = true; player.x = x; player.y = y; }; game.move = function (x, y, obj) { if (isDragging) { player.x = x; player.y = y; } }; game.up = function (x, y, obj) { isDragging = false; }; function spawnMemoryFragment() { var fragment = new MemoryFragment(); fragment.x = Math.random() * 1800 + 124; fragment.y = Math.random() * 1800 + 124; memoryFragments.push(fragment); game.addChild(fragment); } function spawnShadow() { if (shadows.length < 2 + gameLevel) { var shadow = new Shadow(); shadow.x = Math.random() * 2048; shadow.y = Math.random() * 2732; shadows.push(shadow); game.addChild(shadow); } } function updateMemoryBar() { var fillWidth = memoryBar / 100 * memoryBarBg.width; memoryBarFill.width = fillWidth; if (memoryBar >= 100) { gameLevel++; memoryBar = 0; levelText.setText('Level ' + gameLevel); // Clear all fragments and shadows for new level for (var i = memoryFragments.length - 1; i >= 0; i--) { memoryFragments[i].destroy(); memoryFragments.splice(i, 1); } LK.effects.flashScreen(0x00ff88, 500); if (gameLevel >= 20) { LK.showYouWin(); } } } game.update = function () { // Update memory bar display updateMemoryBar(); memoryText.setText('Memories: ' + memoryCount); // Spawn memory fragments fragmentSpawnTimer++; var spawnRate = Math.max(60 - gameLevel * 5, 20); if (fragmentSpawnTimer >= spawnRate) { spawnMemoryFragment(); fragmentSpawnTimer = 0; } // Spawn shadows shadowSpawnTimer++; if (shadowSpawnTimer >= 180) { spawnShadow(); shadowSpawnTimer = 0; } // Clean up fragments that are too old for (var i = memoryFragments.length - 1; i >= 0; i--) { var fragment = memoryFragments[i]; if (fragment.collected) continue; // Remove fragments after some time if (LK.ticks % 600 === 0 && Math.random() < 0.1) { fragment.destroy(); memoryFragments.splice(i, 1); } } // Limit number of fragments on screen while (memoryFragments.length > 8 + gameLevel) { var oldestFragment = memoryFragments[0]; oldestFragment.destroy(); memoryFragments.splice(0, 1); } }; // Start background music LK.playMusic('bgMusic'); // Initial spawns spawnMemoryFragment(); spawnMemoryFragment(); spawnShadow();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var MemoryFragment = Container.expand(function (fragmentType) {
var self = Container.call(this);
var colors = [0x00ff00, 0xff6600, 0x0099ff, 0xffff00, 0xff00ff];
var shapes = ['memoryFragment', 'memorySquare', 'memoryTriangle'];
fragmentType = fragmentType || Math.floor(Math.random() * shapes.length);
var selectedShape = shapes[fragmentType];
var selectedColor = colors[Math.floor(Math.random() * colors.length)];
var graphics = self.attachAsset(selectedShape, {
anchorX: 0.5,
anchorY: 0.5
});
graphics.tint = selectedColor;
self.fragmentType = fragmentType;
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = Math.random() * 2 + 1;
self.collected = false;
self.update = function () {
if (!self.collected) {
self.x += self.speedX;
self.y += self.speedY;
// Bounce off walls
if (self.x <= 40 || self.x >= 2008) {
self.speedX *= -1;
}
if (self.y <= 40 || self.y >= 2692) {
self.speedY *= -1;
}
// Keep in bounds
if (self.x < 40) self.x = 40;
if (self.x > 2008) self.x = 2008;
if (self.y < 40) self.y = 40;
if (self.y > 2692) self.y = 2692;
}
};
self.down = function (x, y, obj) {
if (!self.collected) {
self.collected = true;
memoryCount++;
memoryBar += 10;
if (memoryBar > 100) memoryBar = 100;
LK.effects.flashObject(self, 0xffffff, 300);
LK.getSound('collectMemory').play();
// Immediately remove from array to prevent multiple collections
var index = memoryFragments.indexOf(self);
if (index > -1) {
memoryFragments.splice(index, 1);
}
tween(self, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
graphics.alpha = 0.8;
return self;
});
var Shadow = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('shadow', {
anchorX: 0.5,
anchorY: 0.5
});
graphics.alpha = 0.7;
self.speedX = (Math.random() - 0.5) * 3;
self.speedY = (Math.random() - 0.5) * 3;
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
self.update = function () {
// Move towards target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 10) {
self.x += dx / distance * (1 + gameLevel * 0.5);
self.y += dy / distance * (1 + gameLevel * 0.5);
} else {
// Pick new target
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
}
// Check collision with player
if (self.intersects(player)) {
if (!playerInvulnerable) {
memoryBar -= 20;
playerInvulnerable = true;
LK.effects.flashObject(player, 0xff0000, 500);
LK.effects.flashScreen(0xff0000, 200);
LK.getSound('shadowHit').play();
LK.setTimeout(function () {
playerInvulnerable = false;
}, 1000);
if (memoryBar <= 0) {
LK.showGameOver();
}
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x111111
});
/****
* Game Code
****/
var player;
var memoryFragments = [];
var shadows = [];
var memoryBar = 0;
var memoryCount = 0;
var gameLevel = 1;
var playerInvulnerable = false;
var fragmentSpawnTimer = 0;
var shadowSpawnTimer = 0;
// UI Elements
var memoryBarBg = LK.getAsset('memorySquare', {
width: 400,
height: 8,
anchorX: 0.5,
anchorY: 0.5
});
memoryBarBg.tint = 0x333333;
var memoryBarFill = LK.getAsset('memorySquare', {
width: 4,
height: 8,
anchorX: 0,
anchorY: 0.5
});
memoryBarFill.tint = 0x00ff88;
var levelText = new Text2('Level 1', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
var memoryText = new Text2('Memories: 0', {
size: 40,
fill: 0xCCCCCC
});
memoryText.anchor.set(1, 0);
// Position UI elements
LK.gui.top.addChild(memoryBarBg);
LK.gui.top.addChild(memoryBarFill);
LK.gui.top.addChild(levelText);
LK.gui.topRight.addChild(memoryText);
memoryBarBg.y = 120;
memoryBarFill.x = memoryBarBg.x - memoryBarBg.width / 2;
memoryBarFill.y = 120;
levelText.y = 50;
memoryText.x = -50;
memoryText.y = 50;
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
// Touch controls
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
player.x = x;
player.y = y;
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = x;
player.y = y;
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
function spawnMemoryFragment() {
var fragment = new MemoryFragment();
fragment.x = Math.random() * 1800 + 124;
fragment.y = Math.random() * 1800 + 124;
memoryFragments.push(fragment);
game.addChild(fragment);
}
function spawnShadow() {
if (shadows.length < 2 + gameLevel) {
var shadow = new Shadow();
shadow.x = Math.random() * 2048;
shadow.y = Math.random() * 2732;
shadows.push(shadow);
game.addChild(shadow);
}
}
function updateMemoryBar() {
var fillWidth = memoryBar / 100 * memoryBarBg.width;
memoryBarFill.width = fillWidth;
if (memoryBar >= 100) {
gameLevel++;
memoryBar = 0;
levelText.setText('Level ' + gameLevel);
// Clear all fragments and shadows for new level
for (var i = memoryFragments.length - 1; i >= 0; i--) {
memoryFragments[i].destroy();
memoryFragments.splice(i, 1);
}
LK.effects.flashScreen(0x00ff88, 500);
if (gameLevel >= 20) {
LK.showYouWin();
}
}
}
game.update = function () {
// Update memory bar display
updateMemoryBar();
memoryText.setText('Memories: ' + memoryCount);
// Spawn memory fragments
fragmentSpawnTimer++;
var spawnRate = Math.max(60 - gameLevel * 5, 20);
if (fragmentSpawnTimer >= spawnRate) {
spawnMemoryFragment();
fragmentSpawnTimer = 0;
}
// Spawn shadows
shadowSpawnTimer++;
if (shadowSpawnTimer >= 180) {
spawnShadow();
shadowSpawnTimer = 0;
}
// Clean up fragments that are too old
for (var i = memoryFragments.length - 1; i >= 0; i--) {
var fragment = memoryFragments[i];
if (fragment.collected) continue;
// Remove fragments after some time
if (LK.ticks % 600 === 0 && Math.random() < 0.1) {
fragment.destroy();
memoryFragments.splice(i, 1);
}
}
// Limit number of fragments on screen
while (memoryFragments.length > 8 + gameLevel) {
var oldestFragment = memoryFragments[0];
oldestFragment.destroy();
memoryFragments.splice(0, 1);
}
};
// Start background music
LK.playMusic('bgMusic');
// Initial spawns
spawnMemoryFragment();
spawnMemoryFragment();
spawnShadow();