/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Door = Container.expand(function (targetRoom, doorX, doorY) { var self = Container.call(this); var doorGraphics = self.attachAsset('door', { anchorX: 0.5, anchorY: 1.0 }); self.targetRoom = targetRoom; self.isOpen = false; self.down = function (x, y, obj) { if (!self.isOpen) { self.openDoor(); } }; self.openDoor = function () { self.isOpen = true; LK.getSound('doorOpen').play(); tween(doorGraphics, { scaleX: 1.1, scaleY: 1.1 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(doorGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200, easing: tween.easeIn, onFinish: function onFinish() { game.switchRoom(self.targetRoom); } }); } }); }; return self; }); var HiddenObject = Container.expand(function () { var self = Container.call(this); var objectGraphics = self.attachAsset('hiddenObject', { anchorX: 0.5, anchorY: 0.5 }); self.found = false; objectGraphics.alpha = 0.3; self.down = function (x, y, obj) { if (!self.found) { self.discover(); } }; self.discover = function () { if (self.found) return; self.found = true; objectsFound++; updateScore(); LK.getSound('itemFound').play(); tween(objectGraphics, { alpha: 1, scaleX: 1.3, scaleY: 1.3 }, { duration: 300, easing: tween.easeOut }); }; return self; }); var MysteryKey = Container.expand(function () { var self = Container.call(this); var keyGraphics = self.attachAsset('mysteryKey', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.down = function (x, y, obj) { if (!self.collected) { self.collect(); } }; self.collect = function () { if (self.collected) return; self.collected = true; keysCollected++; updateScore(); LK.getSound('keyCollect').play(); tween(self, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; self.update = function () { if (!self.collected) { keyGraphics.rotation += 0.05; } }; return self; }); var PowerPuffGirl = Container.expand(function (type) { var self = Container.call(this); var girlGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.isMoving = false; self.moveTo = function (targetX, targetY) { if (self.isMoving) return; self.isMoving = true; var duration = Math.sqrt(Math.pow(targetX - self.x, 2) + Math.pow(targetY - self.y, 2)) * 2; tween(self, { x: targetX, y: targetY }, { duration: duration, easing: tween.easeOut, onFinish: function onFinish() { self.isMoving = false; } }); }; return self; }); var Room = Container.expand(function (roomType) { var self = Container.call(this); var background = self.attachAsset(roomType, { anchorX: 0, anchorY: 0 }); self.roomType = roomType; self.doors = []; self.keys = []; self.hiddenObjects = []; self.addDoor = function (targetRoom, x, y) { var door = new Door(targetRoom, x, y); door.x = x; door.y = y; self.doors.push(door); self.addChild(door); return door; }; self.addKey = function (x, y) { var key = new MysteryKey(); key.x = x; key.y = y; self.keys.push(key); self.addChild(key); return key; }; self.addHiddenObject = function (x, y) { var obj = new HiddenObject(); obj.x = x; obj.y = y; self.hiddenObjects.push(obj); self.addChild(obj); return obj; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Sounds // Interactive elements // Room backgrounds // PowerPuff Girls characters // Game variables var currentRoom = null; var powerPuffGirls = []; var keysCollected = 0; var objectsFound = 0; var totalKeys = 0; var totalObjects = 0; var rooms = {}; var draggedGirl = null; // UI Elements var scoreText = new Text2('Keys: 0/0 | Objects: 0/0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var roomNameText = new Text2('Living Room', { size: 80, fill: 0xFFFF00 }); roomNameText.anchor.set(0.5, 0); roomNameText.y = 100; LK.gui.top.addChild(roomNameText); // Create rooms function createRooms() { // Living Room rooms.livingRoom = new Room('livingRoom'); rooms.livingRoom.addDoor('kitchen', 1800, 1000); rooms.livingRoom.addDoor('bedroom', 1800, 1800); rooms.livingRoom.addKey(300, 800); rooms.livingRoom.addKey(1500, 1200); rooms.livingRoom.addHiddenObject(800, 600); rooms.livingRoom.addHiddenObject(1200, 1600); // Kitchen rooms.kitchen = new Room('kitchen'); rooms.kitchen.addDoor('livingRoom', 200, 1000); rooms.kitchen.addDoor('attic', 1800, 600); rooms.kitchen.addKey(1000, 1200); rooms.kitchen.addKey(600, 2000); rooms.kitchen.addHiddenObject(1600, 800); // Bedroom rooms.bedroom = new Room('bedroom'); rooms.bedroom.addDoor('livingRoom', 200, 1800); rooms.bedroom.addKey(1200, 800); rooms.bedroom.addKey(800, 1800); rooms.bedroom.addHiddenObject(1600, 1200); rooms.bedroom.addHiddenObject(400, 1200); // Attic rooms.attic = new Room('attic'); rooms.attic.addDoor('kitchen', 200, 600); rooms.attic.addKey(1000, 1000); rooms.attic.addKey(1600, 1600); rooms.attic.addHiddenObject(600, 800); // Count total collectibles for (var roomName in rooms) { var room = rooms[roomName]; totalKeys += room.keys.length; totalObjects += room.hiddenObjects.length; } } // Create PowerPuff Girls function createPowerPuffGirls() { var types = ['blossom', 'bubbles', 'buttercup']; var startX = 400; for (var i = 0; i < types.length; i++) { var girl = new PowerPuffGirl(types[i]); girl.x = startX + i * 200; girl.y = 2000; powerPuffGirls.push(girl); } } // Switch room function game.switchRoom = function (roomName) { if (currentRoom) { game.removeChild(currentRoom); } currentRoom = rooms[roomName]; game.addChild(currentRoom); // Add girls to new room for (var i = 0; i < powerPuffGirls.length; i++) { currentRoom.addChild(powerPuffGirls[i]); } // Update room name var displayName = roomName.charAt(0).toUpperCase() + roomName.slice(1); if (displayName === 'Livingroom') displayName = 'Living Room'; roomNameText.setText(displayName); }; // Update score display function updateScore() { scoreText.setText('Keys: ' + keysCollected + '/' + totalKeys + ' | Objects: ' + objectsFound + '/' + totalObjects); // Check win condition if (keysCollected >= totalKeys && objectsFound >= totalObjects) { LK.setTimeout(function () { LK.showYouWin(); }, 1000); } } // Touch controls game.down = function (x, y, obj) { // Check if touching a PowerPuff Girl for (var i = 0; i < powerPuffGirls.length; i++) { var girl = powerPuffGirls[i]; if (girl.parent === currentRoom) { var localPos = girl.toLocal({ x: x, y: y }); if (Math.abs(localPos.x) < 60 && Math.abs(localPos.y) < 60) { draggedGirl = girl; return; } } } }; game.move = function (x, y, obj) { if (draggedGirl) { // Constrain movement within room bounds var constrainedX = Math.max(100, Math.min(1948, x)); var constrainedY = Math.max(100, Math.min(2632, y)); draggedGirl.moveTo(constrainedX, constrainedY); } }; game.up = function (x, y, obj) { draggedGirl = null; }; // Initialize game createRooms(); createPowerPuffGirls(); game.switchRoom('livingRoom'); updateScore(); // Main game loop game.update = function () { // Check for collisions between girls and interactive objects for (var i = 0; i < powerPuffGirls.length; i++) { var girl = powerPuffGirls[i]; if (girl.parent !== currentRoom) continue; // Check key collisions for (var j = 0; j < currentRoom.keys.length; j++) { var key = currentRoom.keys[j]; if (!key.collected && girl.intersects(key)) { key.collect(); break; } } // Check hidden object collisions for (var k = 0; k < currentRoom.hiddenObjects.length; k++) { var obj = currentRoom.hiddenObjects[k]; if (!obj.found && girl.intersects(obj)) { obj.discover(); break; } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Door = Container.expand(function (targetRoom, doorX, doorY) {
var self = Container.call(this);
var doorGraphics = self.attachAsset('door', {
anchorX: 0.5,
anchorY: 1.0
});
self.targetRoom = targetRoom;
self.isOpen = false;
self.down = function (x, y, obj) {
if (!self.isOpen) {
self.openDoor();
}
};
self.openDoor = function () {
self.isOpen = true;
LK.getSound('doorOpen').play();
tween(doorGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(doorGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
game.switchRoom(self.targetRoom);
}
});
}
});
};
return self;
});
var HiddenObject = Container.expand(function () {
var self = Container.call(this);
var objectGraphics = self.attachAsset('hiddenObject', {
anchorX: 0.5,
anchorY: 0.5
});
self.found = false;
objectGraphics.alpha = 0.3;
self.down = function (x, y, obj) {
if (!self.found) {
self.discover();
}
};
self.discover = function () {
if (self.found) return;
self.found = true;
objectsFound++;
updateScore();
LK.getSound('itemFound').play();
tween(objectGraphics, {
alpha: 1,
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
easing: tween.easeOut
});
};
return self;
});
var MysteryKey = Container.expand(function () {
var self = Container.call(this);
var keyGraphics = self.attachAsset('mysteryKey', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.down = function (x, y, obj) {
if (!self.collected) {
self.collect();
}
};
self.collect = function () {
if (self.collected) return;
self.collected = true;
keysCollected++;
updateScore();
LK.getSound('keyCollect').play();
tween(self, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
self.update = function () {
if (!self.collected) {
keyGraphics.rotation += 0.05;
}
};
return self;
});
var PowerPuffGirl = Container.expand(function (type) {
var self = Container.call(this);
var girlGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.isMoving = false;
self.moveTo = function (targetX, targetY) {
if (self.isMoving) return;
self.isMoving = true;
var duration = Math.sqrt(Math.pow(targetX - self.x, 2) + Math.pow(targetY - self.y, 2)) * 2;
tween(self, {
x: targetX,
y: targetY
}, {
duration: duration,
easing: tween.easeOut,
onFinish: function onFinish() {
self.isMoving = false;
}
});
};
return self;
});
var Room = Container.expand(function (roomType) {
var self = Container.call(this);
var background = self.attachAsset(roomType, {
anchorX: 0,
anchorY: 0
});
self.roomType = roomType;
self.doors = [];
self.keys = [];
self.hiddenObjects = [];
self.addDoor = function (targetRoom, x, y) {
var door = new Door(targetRoom, x, y);
door.x = x;
door.y = y;
self.doors.push(door);
self.addChild(door);
return door;
};
self.addKey = function (x, y) {
var key = new MysteryKey();
key.x = x;
key.y = y;
self.keys.push(key);
self.addChild(key);
return key;
};
self.addHiddenObject = function (x, y) {
var obj = new HiddenObject();
obj.x = x;
obj.y = y;
self.hiddenObjects.push(obj);
self.addChild(obj);
return obj;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Sounds
// Interactive elements
// Room backgrounds
// PowerPuff Girls characters
// Game variables
var currentRoom = null;
var powerPuffGirls = [];
var keysCollected = 0;
var objectsFound = 0;
var totalKeys = 0;
var totalObjects = 0;
var rooms = {};
var draggedGirl = null;
// UI Elements
var scoreText = new Text2('Keys: 0/0 | Objects: 0/0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var roomNameText = new Text2('Living Room', {
size: 80,
fill: 0xFFFF00
});
roomNameText.anchor.set(0.5, 0);
roomNameText.y = 100;
LK.gui.top.addChild(roomNameText);
// Create rooms
function createRooms() {
// Living Room
rooms.livingRoom = new Room('livingRoom');
rooms.livingRoom.addDoor('kitchen', 1800, 1000);
rooms.livingRoom.addDoor('bedroom', 1800, 1800);
rooms.livingRoom.addKey(300, 800);
rooms.livingRoom.addKey(1500, 1200);
rooms.livingRoom.addHiddenObject(800, 600);
rooms.livingRoom.addHiddenObject(1200, 1600);
// Kitchen
rooms.kitchen = new Room('kitchen');
rooms.kitchen.addDoor('livingRoom', 200, 1000);
rooms.kitchen.addDoor('attic', 1800, 600);
rooms.kitchen.addKey(1000, 1200);
rooms.kitchen.addKey(600, 2000);
rooms.kitchen.addHiddenObject(1600, 800);
// Bedroom
rooms.bedroom = new Room('bedroom');
rooms.bedroom.addDoor('livingRoom', 200, 1800);
rooms.bedroom.addKey(1200, 800);
rooms.bedroom.addKey(800, 1800);
rooms.bedroom.addHiddenObject(1600, 1200);
rooms.bedroom.addHiddenObject(400, 1200);
// Attic
rooms.attic = new Room('attic');
rooms.attic.addDoor('kitchen', 200, 600);
rooms.attic.addKey(1000, 1000);
rooms.attic.addKey(1600, 1600);
rooms.attic.addHiddenObject(600, 800);
// Count total collectibles
for (var roomName in rooms) {
var room = rooms[roomName];
totalKeys += room.keys.length;
totalObjects += room.hiddenObjects.length;
}
}
// Create PowerPuff Girls
function createPowerPuffGirls() {
var types = ['blossom', 'bubbles', 'buttercup'];
var startX = 400;
for (var i = 0; i < types.length; i++) {
var girl = new PowerPuffGirl(types[i]);
girl.x = startX + i * 200;
girl.y = 2000;
powerPuffGirls.push(girl);
}
}
// Switch room function
game.switchRoom = function (roomName) {
if (currentRoom) {
game.removeChild(currentRoom);
}
currentRoom = rooms[roomName];
game.addChild(currentRoom);
// Add girls to new room
for (var i = 0; i < powerPuffGirls.length; i++) {
currentRoom.addChild(powerPuffGirls[i]);
}
// Update room name
var displayName = roomName.charAt(0).toUpperCase() + roomName.slice(1);
if (displayName === 'Livingroom') displayName = 'Living Room';
roomNameText.setText(displayName);
};
// Update score display
function updateScore() {
scoreText.setText('Keys: ' + keysCollected + '/' + totalKeys + ' | Objects: ' + objectsFound + '/' + totalObjects);
// Check win condition
if (keysCollected >= totalKeys && objectsFound >= totalObjects) {
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
}
// Touch controls
game.down = function (x, y, obj) {
// Check if touching a PowerPuff Girl
for (var i = 0; i < powerPuffGirls.length; i++) {
var girl = powerPuffGirls[i];
if (girl.parent === currentRoom) {
var localPos = girl.toLocal({
x: x,
y: y
});
if (Math.abs(localPos.x) < 60 && Math.abs(localPos.y) < 60) {
draggedGirl = girl;
return;
}
}
}
};
game.move = function (x, y, obj) {
if (draggedGirl) {
// Constrain movement within room bounds
var constrainedX = Math.max(100, Math.min(1948, x));
var constrainedY = Math.max(100, Math.min(2632, y));
draggedGirl.moveTo(constrainedX, constrainedY);
}
};
game.up = function (x, y, obj) {
draggedGirl = null;
};
// Initialize game
createRooms();
createPowerPuffGirls();
game.switchRoom('livingRoom');
updateScore();
// Main game loop
game.update = function () {
// Check for collisions between girls and interactive objects
for (var i = 0; i < powerPuffGirls.length; i++) {
var girl = powerPuffGirls[i];
if (girl.parent !== currentRoom) continue;
// Check key collisions
for (var j = 0; j < currentRoom.keys.length; j++) {
var key = currentRoom.keys[j];
if (!key.collected && girl.intersects(key)) {
key.collect();
break;
}
}
// Check hidden object collisions
for (var k = 0; k < currentRoom.hiddenObjects.length; k++) {
var obj = currentRoom.hiddenObjects[k];
if (!obj.found && girl.intersects(obj)) {
obj.discover();
break;
}
}
}
};