/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Gift = Container.expand(function (color, giftType, toyType) { var self = Container.call(this); var giftGraphics = self.attachAsset(giftType, { anchorX: 0.5, anchorY: 0.5 }); self.color = color; self.toyType = toyType; self.isOpened = false; self.assignedGirl = null; self.originalX = 0; self.originalY = 0; self.isDragging = false; self.down = function (x, y, obj) { if (!self.assignedGirl) { self.isDragging = true; dragGift = self; } else if (!self.isOpened) { // Open gift self.openGift(); } }; self.openGift = function () { if (self.isOpened || !self.assignedGirl) return; self.isOpened = true; LK.getSound('giftOpen').play(); // Hide gift and show toy tween(giftGraphics, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 300, onFinish: function onFinish() { var toy = self.attachAsset(self.toyType, { anchorX: 0.5, anchorY: 0.5, alpha: 0, scaleX: 0.1, scaleY: 0.1 }); tween(toy, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500 }); } }); self.assignedGirl.giftOpened = true; checkGameComplete(); }; return self; }); var PowerpuffGirl = Container.expand(function (name, color, sleepState) { var self = Container.call(this); var characterGraphics = self.attachAsset(name, { anchorX: 0.5, anchorY: 0.5 }); self.sleepState = sleepState || 'awake'; // 'awake', 'shhh', 'sleeping' self.name = name; self.color = color; self.hasGift = false; self.giftOpened = false; // Text for sleep states var sleepText = new Text2('', { size: 80, fill: 0xFFFFFF }); sleepText.anchor.set(0.5, 0.5); sleepText.y = -250; self.addChild(sleepText); self.sleepText = sleepText; self.updateSleepText = function () { if (self.sleepState === 'shhh') { self.sleepText.setText('shhh...'); } else if (self.sleepState === 'sleeping') { self.sleepText.setText('zzzzz'); } else { self.sleepText.setText(''); } }; self.down = function (x, y, obj) { if (self.sleepState === 'awake') { self.sleepState = 'shhh'; self.updateSleepText(); LK.getSound('shhh').play(); // Dim the character slightly tween(characterGraphics, { alpha: 0.8 }, { duration: 500 }); } else if (self.sleepState === 'shhh') { self.sleepState = 'sleeping'; self.updateSleepText(); LK.getSound('zzz').play(); // Dim the character more tween(characterGraphics, { alpha: 0.6 }, { duration: 500 }); } checkGameComplete(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue for daytime }); /**** * Game Code ****/ // Sounds // Toys revealed from gifts // Gifts // Powerpuff Girls characters // Game state variables var blossom, bubbles, buttercup; var pinkGift, blueGift, greenGift; var dragGift = null; var gameComplete = false; // Create Powerpuff Girls blossom = game.addChild(new PowerpuffGirl('blossom', 0xFF69B4, 'awake')); blossom.x = 2048 / 4; blossom.y = 2732 / 2 - 200; bubbles = game.addChild(new PowerpuffGirl('bubbles', 0x87CEEB, 'awake')); bubbles.x = 2048 / 2; bubbles.y = 2732 / 2 - 200; buttercup = game.addChild(new PowerpuffGirl('buttercup', 0x90EE90, 'awake')); buttercup.x = 3 * 2048 / 4; buttercup.y = 2732 / 2 - 200; // Create gifts at bottom of screen pinkGift = game.addChild(new Gift(0xFF69B4, 'pinkGift', 'kite')); pinkGift.x = 2048 / 4; pinkGift.y = 2732 - 300; pinkGift.originalX = pinkGift.x; pinkGift.originalY = pinkGift.y; blueGift = game.addChild(new Gift(0x87CEEB, 'blueGift', 'doll')); blueGift.x = 2048 / 2; blueGift.y = 2732 - 300; blueGift.originalX = blueGift.x; blueGift.originalY = blueGift.y; greenGift = game.addChild(new Gift(0x90EE90, 'greenGift', 'toycar')); greenGift.x = 3 * 2048 / 4; greenGift.y = 2732 - 300; greenGift.originalX = greenGift.x; greenGift.originalY = greenGift.y; // Instructions text var instructionText = new Text2('Tap the girls to put them to sleep, then drag gifts to match colors!', { size: 60, fill: 0x000000 }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 100; function checkGameComplete() { // Check if all girls are sleeping and all gifts are opened var allSleeping = blossom.sleepState === 'sleeping' && bubbles.sleepState === 'sleeping' && buttercup.sleepState === 'sleeping'; var allGiftsOpened = blossom.giftOpened && bubbles.giftOpened && buttercup.giftOpened; if (allSleeping && allGiftsOpened && !gameComplete) { gameComplete = true; // Transition to night time tween(game, { backgroundColor: 0x191970 }, { duration: 2000 }); instructionText.setText('Sweet dreams! Bedtime complete!'); // Show completion after a delay LK.setTimeout(function () { LK.showYouWin(); }, 3000); } } function checkGiftPlacement(gift) { var targetGirl = null; // Check which girl the gift is closest to if (gift.intersects(blossom)) { targetGirl = blossom; } else if (gift.intersects(bubbles)) { targetGirl = bubbles; } else if (gift.intersects(buttercup)) { targetGirl = buttercup; } if (targetGirl && targetGirl.color === gift.color && !targetGirl.hasGift) { // Correct match! gift.assignedGirl = targetGirl; targetGirl.hasGift = true; // Position gift near the girl tween(gift, { x: targetGirl.x, y: targetGirl.y + 300 }, { duration: 300 }); return true; } return false; } game.move = function (x, y, obj) { if (dragGift) { dragGift.x = x; dragGift.y = y; } }; game.up = function (x, y, obj) { if (dragGift) { var placed = checkGiftPlacement(dragGift); if (!placed) { // Return to original position tween(dragGift, { x: dragGift.originalX, y: dragGift.originalY }, { duration: 500 }); } dragGift.isDragging = false; dragGift = null; } }; game.update = function () { // Game runs smoothly with automatic updates from classes };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Gift = Container.expand(function (color, giftType, toyType) {
var self = Container.call(this);
var giftGraphics = self.attachAsset(giftType, {
anchorX: 0.5,
anchorY: 0.5
});
self.color = color;
self.toyType = toyType;
self.isOpened = false;
self.assignedGirl = null;
self.originalX = 0;
self.originalY = 0;
self.isDragging = false;
self.down = function (x, y, obj) {
if (!self.assignedGirl) {
self.isDragging = true;
dragGift = self;
} else if (!self.isOpened) {
// Open gift
self.openGift();
}
};
self.openGift = function () {
if (self.isOpened || !self.assignedGirl) return;
self.isOpened = true;
LK.getSound('giftOpen').play();
// Hide gift and show toy
tween(giftGraphics, {
alpha: 0,
scaleX: 0.1,
scaleY: 0.1
}, {
duration: 300,
onFinish: function onFinish() {
var toy = self.attachAsset(self.toyType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0,
scaleX: 0.1,
scaleY: 0.1
});
tween(toy, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 500
});
}
});
self.assignedGirl.giftOpened = true;
checkGameComplete();
};
return self;
});
var PowerpuffGirl = Container.expand(function (name, color, sleepState) {
var self = Container.call(this);
var characterGraphics = self.attachAsset(name, {
anchorX: 0.5,
anchorY: 0.5
});
self.sleepState = sleepState || 'awake'; // 'awake', 'shhh', 'sleeping'
self.name = name;
self.color = color;
self.hasGift = false;
self.giftOpened = false;
// Text for sleep states
var sleepText = new Text2('', {
size: 80,
fill: 0xFFFFFF
});
sleepText.anchor.set(0.5, 0.5);
sleepText.y = -250;
self.addChild(sleepText);
self.sleepText = sleepText;
self.updateSleepText = function () {
if (self.sleepState === 'shhh') {
self.sleepText.setText('shhh...');
} else if (self.sleepState === 'sleeping') {
self.sleepText.setText('zzzzz');
} else {
self.sleepText.setText('');
}
};
self.down = function (x, y, obj) {
if (self.sleepState === 'awake') {
self.sleepState = 'shhh';
self.updateSleepText();
LK.getSound('shhh').play();
// Dim the character slightly
tween(characterGraphics, {
alpha: 0.8
}, {
duration: 500
});
} else if (self.sleepState === 'shhh') {
self.sleepState = 'sleeping';
self.updateSleepText();
LK.getSound('zzz').play();
// Dim the character more
tween(characterGraphics, {
alpha: 0.6
}, {
duration: 500
});
}
checkGameComplete();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue for daytime
});
/****
* Game Code
****/
// Sounds
// Toys revealed from gifts
// Gifts
// Powerpuff Girls characters
// Game state variables
var blossom, bubbles, buttercup;
var pinkGift, blueGift, greenGift;
var dragGift = null;
var gameComplete = false;
// Create Powerpuff Girls
blossom = game.addChild(new PowerpuffGirl('blossom', 0xFF69B4, 'awake'));
blossom.x = 2048 / 4;
blossom.y = 2732 / 2 - 200;
bubbles = game.addChild(new PowerpuffGirl('bubbles', 0x87CEEB, 'awake'));
bubbles.x = 2048 / 2;
bubbles.y = 2732 / 2 - 200;
buttercup = game.addChild(new PowerpuffGirl('buttercup', 0x90EE90, 'awake'));
buttercup.x = 3 * 2048 / 4;
buttercup.y = 2732 / 2 - 200;
// Create gifts at bottom of screen
pinkGift = game.addChild(new Gift(0xFF69B4, 'pinkGift', 'kite'));
pinkGift.x = 2048 / 4;
pinkGift.y = 2732 - 300;
pinkGift.originalX = pinkGift.x;
pinkGift.originalY = pinkGift.y;
blueGift = game.addChild(new Gift(0x87CEEB, 'blueGift', 'doll'));
blueGift.x = 2048 / 2;
blueGift.y = 2732 - 300;
blueGift.originalX = blueGift.x;
blueGift.originalY = blueGift.y;
greenGift = game.addChild(new Gift(0x90EE90, 'greenGift', 'toycar'));
greenGift.x = 3 * 2048 / 4;
greenGift.y = 2732 - 300;
greenGift.originalX = greenGift.x;
greenGift.originalY = greenGift.y;
// Instructions text
var instructionText = new Text2('Tap the girls to put them to sleep, then drag gifts to match colors!', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 100;
function checkGameComplete() {
// Check if all girls are sleeping and all gifts are opened
var allSleeping = blossom.sleepState === 'sleeping' && bubbles.sleepState === 'sleeping' && buttercup.sleepState === 'sleeping';
var allGiftsOpened = blossom.giftOpened && bubbles.giftOpened && buttercup.giftOpened;
if (allSleeping && allGiftsOpened && !gameComplete) {
gameComplete = true;
// Transition to night time
tween(game, {
backgroundColor: 0x191970
}, {
duration: 2000
});
instructionText.setText('Sweet dreams! Bedtime complete!');
// Show completion after a delay
LK.setTimeout(function () {
LK.showYouWin();
}, 3000);
}
}
function checkGiftPlacement(gift) {
var targetGirl = null;
// Check which girl the gift is closest to
if (gift.intersects(blossom)) {
targetGirl = blossom;
} else if (gift.intersects(bubbles)) {
targetGirl = bubbles;
} else if (gift.intersects(buttercup)) {
targetGirl = buttercup;
}
if (targetGirl && targetGirl.color === gift.color && !targetGirl.hasGift) {
// Correct match!
gift.assignedGirl = targetGirl;
targetGirl.hasGift = true;
// Position gift near the girl
tween(gift, {
x: targetGirl.x,
y: targetGirl.y + 300
}, {
duration: 300
});
return true;
}
return false;
}
game.move = function (x, y, obj) {
if (dragGift) {
dragGift.x = x;
dragGift.y = y;
}
};
game.up = function (x, y, obj) {
if (dragGift) {
var placed = checkGiftPlacement(dragGift);
if (!placed) {
// Return to original position
tween(dragGift, {
x: dragGift.originalX,
y: dragGift.originalY
}, {
duration: 500
});
}
dragGift.isDragging = false;
dragGift = null;
}
};
game.update = function () {
// Game runs smoothly with automatic updates from classes
};