/****
* 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();