/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Confetti = Container.expand(function () { var self = Container.call(this); var confettiGraphics = self.attachAsset('confetti', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.rotationSpeed = 0.2; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; if (self.y > 2732 + 50) { self.destroy(); var index = confettiPieces.indexOf(self); if (index > -1) { confettiPieces.splice(index, 1); } } }; return self; }); var PowerpuffGirl = Container.expand(function (girlType) { var self = Container.call(this); var girlGraphics = self.attachAsset(girlType, { anchorX: 0.5, anchorY: 0.5 }); self.girlType = girlType; self.isOnPotty = false; self.hasUsedPotty = false; self.hygienStep = 0; // 0=none, 1=soap, 2=scrub, 3=rinse, 4=dry self.down = function (x, y, obj) { if (gameState === 'potty' && !self.hasUsedPotty) { self.usePotty(); } else if (gameState === 'hygiene' && self.hasUsedPotty) { // Hygiene interactions handled by specific objects } }; self.usePotty = function () { if (!self.hasUsedPotty) { self.hasUsedPotty = true; self.isOnPotty = true; // Move to toilet position tween(self, { x: toilet.x, y: toilet.y - 50 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { LK.getSound('success').play(); LK.effects.flashObject(self, 0x00ff00, 500); // Check if all girls have used potty checkPottyCompletion(); } }); } }; self.moveToSink = function () { tween(self, { x: sink.x - 100, y: sink.y + 100 }, { duration: 800, easing: tween.easeOut }); }; return self; }); var SoapBubble = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('soap', { anchorX: 0.5, anchorY: 0.5 }); self.lifetime = 0; self.maxLifetime = 120; // 2 seconds at 60fps self.update = function () { self.lifetime++; self.alpha = Math.max(0, 1 - self.lifetime / self.maxLifetime); if (self.lifetime >= self.maxLifetime) { self.destroy(); var index = soapBubbles.indexOf(self); if (index > -1) { soapBubbles.splice(index, 1); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xe6f3ff }); /**** * Game Code ****/ // Sound effects // Effect assets // Powerpuff Girls assets // Bathroom scene assets // Game state variables var gameState = 'potty'; // 'potty', 'hygiene', 'complete' var confettiCount = 0; var maxConfetti = 6; var confettiPieces = []; var soapBubbles = []; var hygieneStep = 0; // 0=start, 1=soap, 2=scrub, 3=rinse, 4=dry var handsSoapy = false; var handsWet = false; // Create bathroom scene var bathroom = game.addChild(LK.getAsset('bathroom', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); var toilet = game.addChild(LK.getAsset('toilet', { anchorX: 0.5, anchorY: 1, x: 1024, y: 1800 })); var sink = game.addChild(LK.getAsset('sink', { anchorX: 0.5, anchorY: 1, x: 1024, y: 1000 })); var mirror = game.addChild(LK.getAsset('mirror', { anchorX: 0.5, anchorY: 1, x: 1024, y: 700 })); var towel = game.addChild(LK.getAsset('towel', { anchorX: 0, anchorY: 0, x: 1400, y: 800 })); var soapDispenser = game.addChild(LK.getAsset('soapDispenser', { anchorX: 0.5, anchorY: 1, x: 800, y: 1000 })); // Create Powerpuff Girls var blossom = game.addChild(new PowerpuffGirl('blossom')); blossom.x = 500; blossom.y = 2200; var bubbles = game.addChild(new PowerpuffGirl('bubbles')); bubbles.x = 1024; bubbles.y = 2200; var buttercup = game.addChild(new PowerpuffGirl('buttercup')); buttercup.x = 1548; buttercup.y = 2200; var girls = [blossom, bubbles, buttercup]; // UI Elements var instructionText = new Text2('Tap the girls to help them use the potty!', { size: 80, fill: 0x333333 }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); var timerText = new Text2('Confetti: 0/6', { size: 60, fill: 0xFF0000 }); timerText.anchor.set(1, 0); LK.gui.topRight.addChild(timerText); // Timer for confetti drops var confettiTimer = LK.setInterval(function () { if (gameState === 'potty' && confettiCount < maxConfetti) { dropConfetti(); confettiCount++; timerText.setText('Confetti: ' + confettiCount + '/6'); if (confettiCount >= maxConfetti) { // Time's up! Game over checkGameOver(); } } }, 3000); // Every 3 seconds // Game interaction handlers game.down = function (x, y, obj) { if (gameState === 'hygiene') { // Check soap dispenser interaction if (soapDispenser.intersects({ x: x, y: y, width: 1, height: 1 })) { if (hygieneStep === 0) { useSoap(); } } // Check sink interaction if (sink.intersects({ x: x, y: y, width: 1, height: 1 })) { if (hygieneStep === 2 && handsSoapy) { rinseHands(); } } // Check towel interaction if (towel.intersects({ x: x, y: y, width: 1, height: 1 })) { if (hygieneStep === 3 && handsWet) { dryHands(); } } // Check hand scrubbing area if (x > 800 && x < 1300 && y > 1200 && y < 1600) { if (hygieneStep === 1 && handsSoapy) { scrubHands(); } } } }; function dropConfetti() { LK.getSound('timer').play(); for (var i = 0; i < 8; i++) { var confetti = new Confetti(); confetti.x = Math.random() * 2048; confetti.y = -50; confetti.tint = Math.random() * 0xffffff; confettiPieces.push(confetti); game.addChild(confetti); } } function checkPottyCompletion() { var allUsed = true; for (var i = 0; i < girls.length; i++) { if (!girls[i].hasUsedPotty) { allUsed = false; break; } } if (allUsed) { // All girls used potty successfully! LK.clearInterval(confettiTimer); gameState = 'hygiene'; startHygienePhase(); } } function startHygienePhase() { instructionText.setText('Now wash your hands! Tap the soap dispenser first.'); timerText.setText('Hygiene Steps: 1/4'); // Move girls to sink area for (var i = 0; i < girls.length; i++) { girls[i].moveToSink(); } } function useSoap() { if (hygieneStep === 0) { hygieneStep = 1; handsSoapy = true; instructionText.setText('Great! Now rub your hands together to scrub.'); timerText.setText('Hygiene Steps: 2/4'); LK.getSound('wash').play(); // Create soap bubbles effect for (var i = 0; i < 5; i++) { var bubble = new SoapBubble(); bubble.x = 800 + Math.random() * 400; bubble.y = 1300 + Math.random() * 200; soapBubbles.push(bubble); game.addChild(bubble); } } } function scrubHands() { if (hygieneStep === 1 && handsSoapy) { hygieneStep = 2; instructionText.setText('Good scrubbing! Now tap the sink to rinse.'); timerText.setText('Hygiene Steps: 3/4'); LK.getSound('wash').play(); } } function rinseHands() { if (hygieneStep === 2 && handsSoapy) { hygieneStep = 3; handsSoapy = false; handsWet = true; instructionText.setText('Almost done! Tap the towel to dry your hands.'); timerText.setText('Hygiene Steps: 4/4'); LK.getSound('wash').play(); // Water effect for (var i = 0; i < 8; i++) { var water = LK.getAsset('water', { anchorX: 0.5, anchorY: 0.5, x: sink.x + (Math.random() - 0.5) * 200, y: sink.y - 50 + Math.random() * 100 }); game.addChild(water); tween(water, { alpha: 0, y: water.y + 100 }, { duration: 1000, onFinish: function onFinish() { water.destroy(); } }); } } } function dryHands() { if (hygieneStep === 3 && handsWet) { hygieneStep = 4; handsWet = false; gameState = 'complete'; instructionText.setText('Excellent! You completed perfect potty time and hygiene!'); timerText.setText('COMPLETE!'); LK.getSound('success').play(); // Flash all girls green for (var i = 0; i < girls.length; i++) { LK.effects.flashObject(girls[i], 0x00ff00, 1000); } // Show victory after delay LK.setTimeout(function () { LK.showYouWin(); }, 2000); } } function checkGameOver() { var allUsed = true; for (var i = 0; i < girls.length; i++) { if (!girls[i].hasUsedPotty) { allUsed = false; break; } } if (!allUsed) { // Time ran out before all girls used potty instructionText.setText('Time\'s up! Try again to help all the girls!'); LK.setTimeout(function () { LK.showGameOver(); }, 1500); } } // Main game update loop game.update = function () { // Update confetti pieces for (var i = confettiPieces.length - 1; i >= 0; i--) { // Confetti pieces update themselves } // Update soap bubbles for (var i = soapBubbles.length - 1; i >= 0; i--) { // Soap bubbles update themselves } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Confetti = Container.expand(function () {
var self = Container.call(this);
var confettiGraphics = self.attachAsset('confetti', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.2;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
if (self.y > 2732 + 50) {
self.destroy();
var index = confettiPieces.indexOf(self);
if (index > -1) {
confettiPieces.splice(index, 1);
}
}
};
return self;
});
var PowerpuffGirl = Container.expand(function (girlType) {
var self = Container.call(this);
var girlGraphics = self.attachAsset(girlType, {
anchorX: 0.5,
anchorY: 0.5
});
self.girlType = girlType;
self.isOnPotty = false;
self.hasUsedPotty = false;
self.hygienStep = 0; // 0=none, 1=soap, 2=scrub, 3=rinse, 4=dry
self.down = function (x, y, obj) {
if (gameState === 'potty' && !self.hasUsedPotty) {
self.usePotty();
} else if (gameState === 'hygiene' && self.hasUsedPotty) {
// Hygiene interactions handled by specific objects
}
};
self.usePotty = function () {
if (!self.hasUsedPotty) {
self.hasUsedPotty = true;
self.isOnPotty = true;
// Move to toilet position
tween(self, {
x: toilet.x,
y: toilet.y - 50
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
LK.getSound('success').play();
LK.effects.flashObject(self, 0x00ff00, 500);
// Check if all girls have used potty
checkPottyCompletion();
}
});
}
};
self.moveToSink = function () {
tween(self, {
x: sink.x - 100,
y: sink.y + 100
}, {
duration: 800,
easing: tween.easeOut
});
};
return self;
});
var SoapBubble = Container.expand(function () {
var self = Container.call(this);
var bubbleGraphics = self.attachAsset('soap', {
anchorX: 0.5,
anchorY: 0.5
});
self.lifetime = 0;
self.maxLifetime = 120; // 2 seconds at 60fps
self.update = function () {
self.lifetime++;
self.alpha = Math.max(0, 1 - self.lifetime / self.maxLifetime);
if (self.lifetime >= self.maxLifetime) {
self.destroy();
var index = soapBubbles.indexOf(self);
if (index > -1) {
soapBubbles.splice(index, 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xe6f3ff
});
/****
* Game Code
****/
// Sound effects
// Effect assets
// Powerpuff Girls assets
// Bathroom scene assets
// Game state variables
var gameState = 'potty'; // 'potty', 'hygiene', 'complete'
var confettiCount = 0;
var maxConfetti = 6;
var confettiPieces = [];
var soapBubbles = [];
var hygieneStep = 0; // 0=start, 1=soap, 2=scrub, 3=rinse, 4=dry
var handsSoapy = false;
var handsWet = false;
// Create bathroom scene
var bathroom = game.addChild(LK.getAsset('bathroom', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var toilet = game.addChild(LK.getAsset('toilet', {
anchorX: 0.5,
anchorY: 1,
x: 1024,
y: 1800
}));
var sink = game.addChild(LK.getAsset('sink', {
anchorX: 0.5,
anchorY: 1,
x: 1024,
y: 1000
}));
var mirror = game.addChild(LK.getAsset('mirror', {
anchorX: 0.5,
anchorY: 1,
x: 1024,
y: 700
}));
var towel = game.addChild(LK.getAsset('towel', {
anchorX: 0,
anchorY: 0,
x: 1400,
y: 800
}));
var soapDispenser = game.addChild(LK.getAsset('soapDispenser', {
anchorX: 0.5,
anchorY: 1,
x: 800,
y: 1000
}));
// Create Powerpuff Girls
var blossom = game.addChild(new PowerpuffGirl('blossom'));
blossom.x = 500;
blossom.y = 2200;
var bubbles = game.addChild(new PowerpuffGirl('bubbles'));
bubbles.x = 1024;
bubbles.y = 2200;
var buttercup = game.addChild(new PowerpuffGirl('buttercup'));
buttercup.x = 1548;
buttercup.y = 2200;
var girls = [blossom, bubbles, buttercup];
// UI Elements
var instructionText = new Text2('Tap the girls to help them use the potty!', {
size: 80,
fill: 0x333333
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
var timerText = new Text2('Confetti: 0/6', {
size: 60,
fill: 0xFF0000
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// Timer for confetti drops
var confettiTimer = LK.setInterval(function () {
if (gameState === 'potty' && confettiCount < maxConfetti) {
dropConfetti();
confettiCount++;
timerText.setText('Confetti: ' + confettiCount + '/6');
if (confettiCount >= maxConfetti) {
// Time's up! Game over
checkGameOver();
}
}
}, 3000); // Every 3 seconds
// Game interaction handlers
game.down = function (x, y, obj) {
if (gameState === 'hygiene') {
// Check soap dispenser interaction
if (soapDispenser.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
if (hygieneStep === 0) {
useSoap();
}
}
// Check sink interaction
if (sink.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
if (hygieneStep === 2 && handsSoapy) {
rinseHands();
}
}
// Check towel interaction
if (towel.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
if (hygieneStep === 3 && handsWet) {
dryHands();
}
}
// Check hand scrubbing area
if (x > 800 && x < 1300 && y > 1200 && y < 1600) {
if (hygieneStep === 1 && handsSoapy) {
scrubHands();
}
}
}
};
function dropConfetti() {
LK.getSound('timer').play();
for (var i = 0; i < 8; i++) {
var confetti = new Confetti();
confetti.x = Math.random() * 2048;
confetti.y = -50;
confetti.tint = Math.random() * 0xffffff;
confettiPieces.push(confetti);
game.addChild(confetti);
}
}
function checkPottyCompletion() {
var allUsed = true;
for (var i = 0; i < girls.length; i++) {
if (!girls[i].hasUsedPotty) {
allUsed = false;
break;
}
}
if (allUsed) {
// All girls used potty successfully!
LK.clearInterval(confettiTimer);
gameState = 'hygiene';
startHygienePhase();
}
}
function startHygienePhase() {
instructionText.setText('Now wash your hands! Tap the soap dispenser first.');
timerText.setText('Hygiene Steps: 1/4');
// Move girls to sink area
for (var i = 0; i < girls.length; i++) {
girls[i].moveToSink();
}
}
function useSoap() {
if (hygieneStep === 0) {
hygieneStep = 1;
handsSoapy = true;
instructionText.setText('Great! Now rub your hands together to scrub.');
timerText.setText('Hygiene Steps: 2/4');
LK.getSound('wash').play();
// Create soap bubbles effect
for (var i = 0; i < 5; i++) {
var bubble = new SoapBubble();
bubble.x = 800 + Math.random() * 400;
bubble.y = 1300 + Math.random() * 200;
soapBubbles.push(bubble);
game.addChild(bubble);
}
}
}
function scrubHands() {
if (hygieneStep === 1 && handsSoapy) {
hygieneStep = 2;
instructionText.setText('Good scrubbing! Now tap the sink to rinse.');
timerText.setText('Hygiene Steps: 3/4');
LK.getSound('wash').play();
}
}
function rinseHands() {
if (hygieneStep === 2 && handsSoapy) {
hygieneStep = 3;
handsSoapy = false;
handsWet = true;
instructionText.setText('Almost done! Tap the towel to dry your hands.');
timerText.setText('Hygiene Steps: 4/4');
LK.getSound('wash').play();
// Water effect
for (var i = 0; i < 8; i++) {
var water = LK.getAsset('water', {
anchorX: 0.5,
anchorY: 0.5,
x: sink.x + (Math.random() - 0.5) * 200,
y: sink.y - 50 + Math.random() * 100
});
game.addChild(water);
tween(water, {
alpha: 0,
y: water.y + 100
}, {
duration: 1000,
onFinish: function onFinish() {
water.destroy();
}
});
}
}
}
function dryHands() {
if (hygieneStep === 3 && handsWet) {
hygieneStep = 4;
handsWet = false;
gameState = 'complete';
instructionText.setText('Excellent! You completed perfect potty time and hygiene!');
timerText.setText('COMPLETE!');
LK.getSound('success').play();
// Flash all girls green
for (var i = 0; i < girls.length; i++) {
LK.effects.flashObject(girls[i], 0x00ff00, 1000);
}
// Show victory after delay
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
}
}
function checkGameOver() {
var allUsed = true;
for (var i = 0; i < girls.length; i++) {
if (!girls[i].hasUsedPotty) {
allUsed = false;
break;
}
}
if (!allUsed) {
// Time ran out before all girls used potty
instructionText.setText('Time\'s up! Try again to help all the girls!');
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
}
}
// Main game update loop
game.update = function () {
// Update confetti pieces
for (var i = confettiPieces.length - 1; i >= 0; i--) {
// Confetti pieces update themselves
}
// Update soap bubbles
for (var i = soapBubbles.length - 1; i >= 0; i--) {
// Soap bubbles update themselves
}
};