/****
* 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;
}
}
}
};