Code edit (1 edits merged)
Please save this source code
User prompt
Powerpuff Potty Time
Initial prompt
Toca toilet time (2004). The powerpuff girls have done a wee wee or poo poo. Tap on the powerpuff girls to make a big wee or poop on the toilet before confetti falling 6 times. Tap on the soap to scrub the powerpuff girls’s hands, tap on the hands to rub, tap on the sink to wash their hands, tap on the towel to dry their hands.
/**** * 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
}
};