Code edit (1 edits merged)
Please save this source code
User prompt
Bubbles' Birthday Cake Celebration
Initial prompt
Toca birthday party 2 (2015). Blossom 🩷 and buttercup 💚 have a carrot and chocolate cake for bubbles 💙. Tap on 5 candles to make them light up, tap on the bush to see what it is, tap on bliss’s music to make her sing happy birthday to you 💜, tap on bubbles 💙 to make her blow out 5 candles 2 times till cake exploding and confetti.
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Bush = Container.expand(function () {
	var self = Container.call(this);
	var bushGraphics = self.attachAsset('bush', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.hasBeenTapped = false;
	self.down = function (x, y, obj) {
		if (!self.hasBeenTapped) {
			self.hasBeenTapped = true;
			tween(bushGraphics, {
				scaleX: 1.2,
				scaleY: 1.2
			}, {
				duration: 200,
				easing: tween.easeOut
			});
			tween(bushGraphics, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 200,
				easing: tween.easeIn
			});
			LK.getSound('surprise').play();
			// Create a small surprise effect
			var surpriseText = new Text2('Surprise!', {
				size: 40,
				fill: '#FF69B4'
			});
			surpriseText.anchor.set(0.5, 0.5);
			surpriseText.x = self.x;
			surpriseText.y = self.y - 100;
			game.addChild(surpriseText);
			tween(surpriseText, {
				alpha: 0,
				y: surpriseText.y - 50
			}, {
				duration: 1000,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					surpriseText.destroy();
				}
			});
		}
	};
	return self;
});
var Candle = Container.expand(function () {
	var self = Container.call(this);
	var candleBody = self.attachAsset('candle', {
		anchorX: 0.5,
		anchorY: 1
	});
	var flame = self.attachAsset('flame', {
		anchorX: 0.5,
		anchorY: 1,
		y: -60
	});
	self.isLit = false;
	flame.visible = false;
	self.light = function () {
		if (!self.isLit) {
			self.isLit = true;
			flame.visible = true;
			tween(flame, {
				scaleX: 1.3,
				scaleY: 1.3
			}, {
				duration: 300,
				easing: tween.easeOut
			});
			tween(flame, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 300,
				easing: tween.easeIn
			});
			LK.getSound('lightCandle').play();
		}
	};
	self.extinguish = function () {
		if (self.isLit) {
			self.isLit = false;
			flame.visible = false;
		}
	};
	self.down = function (x, y, obj) {
		if (!self.isLit) {
			self.light();
		}
	};
	return self;
});
var Character = Container.expand(function (characterId) {
	var self = Container.call(this);
	var characterGraphics = self.attachAsset(characterId, {
		anchorX: 0.5,
		anchorY: 1
	});
	self.characterId = characterId;
	self.down = function (x, y, obj) {
		if (self.characterId === 'bubbles') {
			blowOutCandles();
		} else if (self.characterId === 'bliss') {
			playHappyBirthday();
		}
	};
	return self;
});
var Confetti = Container.expand(function () {
	var self = Container.call(this);
	var colors = [0xFF69B4, 0x00CED1, 0xFFD700, 0xFF6347, 0x98FB98];
	var randomColor = colors[Math.floor(Math.random() * colors.length)];
	var confettiGraphics = self.attachAsset('confetti', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	confettiGraphics.tint = randomColor;
	self.speed = Math.random() * 3 + 2;
	self.rotation = Math.random() * 0.1 - 0.05;
	self.update = function () {
		self.y += self.speed;
		self.rotation += self.rotation;
		if (self.y > 2732 + 50) {
			self.destroy();
			for (var i = confettiPieces.length - 1; i >= 0; i--) {
				if (confettiPieces[i] === self) {
					confettiPieces.splice(i, 1);
					break;
				}
			}
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
// Game state variables
var candles = [];
var confettiPieces = [];
var candlesBlownCount = 0;
var gameComplete = false;
// Create cake
var cake = game.addChild(LK.getAsset('cake', {
	anchorX: 0.5,
	anchorY: 0.5
}));
cake.x = 1024;
cake.y = 1400;
// Create candles around the cake
var candlePositions = [{
	x: 1024 - 120,
	y: 1320
}, {
	x: 1024 - 60,
	y: 1300
}, {
	x: 1024,
	y: 1290
}, {
	x: 1024 + 60,
	y: 1300
}, {
	x: 1024 + 120,
	y: 1320
}];
for (var i = 0; i < candlePositions.length; i++) {
	var candle = game.addChild(new Candle());
	candle.x = candlePositions[i].x;
	candle.y = candlePositions[i].y;
	candles.push(candle);
}
// Create characters
var bubbles = game.addChild(new Character('bubbles'));
bubbles.x = 1024;
bubbles.y = 1800;
var blossom = game.addChild(new Character('blossom'));
blossom.x = 400;
blossom.y = 1700;
var buttercup = game.addChild(new Character('buttercup'));
buttercup.x = 1648;
buttercup.y = 1700;
var bliss = game.addChild(new Character('bliss'));
bliss.x = 1024;
bliss.y = 800;
// Create music note above Bliss
var musicNote = game.addChild(LK.getAsset('musicNote', {
	anchorX: 0.5,
	anchorY: 0.5
}));
musicNote.x = bliss.x + 70;
musicNote.y = bliss.y - 150;
// Create bushes
var bushPositions = [{
	x: 200,
	y: 2000
}, {
	x: 1848,
	y: 2000
}, {
	x: 100,
	y: 1200
}, {
	x: 1948,
	y: 1200
}];
for (var i = 0; i < bushPositions.length; i++) {
	var bush = game.addChild(new Bush());
	bush.x = bushPositions[i].x;
	bush.y = bushPositions[i].y;
}
// Create instruction text
var instructionText = new Text2('Tap candles to light them!', {
	size: 50,
	fill: '#FFFFFF'
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
function areAllCandlesLit() {
	for (var i = 0; i < candles.length; i++) {
		if (!candles[i].isLit) {
			return false;
		}
	}
	return true;
}
function blowOutCandles() {
	if (areAllCandlesLit() && !gameComplete) {
		for (var i = 0; i < candles.length; i++) {
			candles[i].extinguish();
		}
		candlesBlownCount++;
		LK.getSound('blowCandle').play();
		// Animate Bubbles blowing
		tween(bubbles, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 200,
			easing: tween.easeOut
		});
		tween(bubbles, {
			scaleX: 1,
			scaleY: 1
		}, {
			duration: 200,
			easing: tween.easeIn
		});
		if (candlesBlownCount === 1) {
			instructionText.setText('Great! Light them again and blow once more!');
		} else if (candlesBlownCount === 2) {
			triggerCakeExplosion();
		}
	}
}
function playHappyBirthday() {
	LK.getSound('happyBirthday').play();
	// Animate music note
	tween(musicNote, {
		scaleX: 1.5,
		scaleY: 1.5
	}, {
		duration: 300,
		easing: tween.easeOut
	});
	tween(musicNote, {
		scaleX: 1,
		scaleY: 1
	}, {
		duration: 300,
		easing: tween.easeIn
	});
	// Show singing text
	var singingText = new Text2('♪ Happy Birthday! ♪', {
		size: 60,
		fill: '#FF69B4'
	});
	singingText.anchor.set(0.5, 0.5);
	singingText.x = bliss.x;
	singingText.y = bliss.y - 200;
	game.addChild(singingText);
	tween(singingText, {
		alpha: 0,
		y: singingText.y - 100
	}, {
		duration: 3000,
		easing: tween.easeOut,
		onFinish: function onFinish() {
			singingText.destroy();
		}
	});
}
function triggerCakeExplosion() {
	gameComplete = true;
	instructionText.setText('Happy Birthday Bubbles!');
	// Create explosion effect
	var explosion = game.addChild(LK.getAsset('explosion', {
		anchorX: 0.5,
		anchorY: 0.5
	}));
	explosion.x = cake.x;
	explosion.y = cake.y;
	explosion.alpha = 0.7;
	tween(explosion, {
		scaleX: 2,
		scaleY: 2,
		alpha: 0
	}, {
		duration: 1000,
		easing: tween.easeOut,
		onFinish: function onFinish() {
			explosion.destroy();
		}
	});
	LK.getSound('explosion').play();
	// Create confetti
	for (var i = 0; i < 50; i++) {
		var confetti = new Confetti();
		confetti.x = Math.random() * 2048;
		confetti.y = -50;
		game.addChild(confetti);
		confettiPieces.push(confetti);
	}
	// Animate cake
	tween(cake, {
		scaleX: 1.3,
		scaleY: 1.3
	}, {
		duration: 500,
		easing: tween.easeOut
	});
	tween(cake, {
		scaleX: 1,
		scaleY: 1
	}, {
		duration: 500,
		easing: tween.easeIn
	});
}
game.update = function () {
	// Update instruction text based on game state
	if (!gameComplete) {
		if (areAllCandlesLit()) {
			if (candlesBlownCount === 0) {
				instructionText.setText('Tap Bubbles to blow out the candles!');
			} else if (candlesBlownCount === 1) {
				instructionText.setText('Light the candles again!');
			}
		} else if (candlesBlownCount === 1) {
			instructionText.setText('Tap candles to light them again!');
		}
	}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,372 @@
-/****
+/**** 
+* Plugins
+****/ 
+var tween = LK.import("@upit/tween.v1");
+
+/**** 
+* Classes
+****/ 
+var Bush = Container.expand(function () {
+	var self = Container.call(this);
+	var bushGraphics = self.attachAsset('bush', {
+		anchorX: 0.5,
+		anchorY: 1
+	});
+	self.hasBeenTapped = false;
+	self.down = function (x, y, obj) {
+		if (!self.hasBeenTapped) {
+			self.hasBeenTapped = true;
+			tween(bushGraphics, {
+				scaleX: 1.2,
+				scaleY: 1.2
+			}, {
+				duration: 200,
+				easing: tween.easeOut
+			});
+			tween(bushGraphics, {
+				scaleX: 1,
+				scaleY: 1
+			}, {
+				duration: 200,
+				easing: tween.easeIn
+			});
+			LK.getSound('surprise').play();
+			// Create a small surprise effect
+			var surpriseText = new Text2('Surprise!', {
+				size: 40,
+				fill: '#FF69B4'
+			});
+			surpriseText.anchor.set(0.5, 0.5);
+			surpriseText.x = self.x;
+			surpriseText.y = self.y - 100;
+			game.addChild(surpriseText);
+			tween(surpriseText, {
+				alpha: 0,
+				y: surpriseText.y - 50
+			}, {
+				duration: 1000,
+				easing: tween.easeOut,
+				onFinish: function onFinish() {
+					surpriseText.destroy();
+				}
+			});
+		}
+	};
+	return self;
+});
+var Candle = Container.expand(function () {
+	var self = Container.call(this);
+	var candleBody = self.attachAsset('candle', {
+		anchorX: 0.5,
+		anchorY: 1
+	});
+	var flame = self.attachAsset('flame', {
+		anchorX: 0.5,
+		anchorY: 1,
+		y: -60
+	});
+	self.isLit = false;
+	flame.visible = false;
+	self.light = function () {
+		if (!self.isLit) {
+			self.isLit = true;
+			flame.visible = true;
+			tween(flame, {
+				scaleX: 1.3,
+				scaleY: 1.3
+			}, {
+				duration: 300,
+				easing: tween.easeOut
+			});
+			tween(flame, {
+				scaleX: 1,
+				scaleY: 1
+			}, {
+				duration: 300,
+				easing: tween.easeIn
+			});
+			LK.getSound('lightCandle').play();
+		}
+	};
+	self.extinguish = function () {
+		if (self.isLit) {
+			self.isLit = false;
+			flame.visible = false;
+		}
+	};
+	self.down = function (x, y, obj) {
+		if (!self.isLit) {
+			self.light();
+		}
+	};
+	return self;
+});
+var Character = Container.expand(function (characterId) {
+	var self = Container.call(this);
+	var characterGraphics = self.attachAsset(characterId, {
+		anchorX: 0.5,
+		anchorY: 1
+	});
+	self.characterId = characterId;
+	self.down = function (x, y, obj) {
+		if (self.characterId === 'bubbles') {
+			blowOutCandles();
+		} else if (self.characterId === 'bliss') {
+			playHappyBirthday();
+		}
+	};
+	return self;
+});
+var Confetti = Container.expand(function () {
+	var self = Container.call(this);
+	var colors = [0xFF69B4, 0x00CED1, 0xFFD700, 0xFF6347, 0x98FB98];
+	var randomColor = colors[Math.floor(Math.random() * colors.length)];
+	var confettiGraphics = self.attachAsset('confetti', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	confettiGraphics.tint = randomColor;
+	self.speed = Math.random() * 3 + 2;
+	self.rotation = Math.random() * 0.1 - 0.05;
+	self.update = function () {
+		self.y += self.speed;
+		self.rotation += self.rotation;
+		if (self.y > 2732 + 50) {
+			self.destroy();
+			for (var i = confettiPieces.length - 1; i >= 0; i--) {
+				if (confettiPieces[i] === self) {
+					confettiPieces.splice(i, 1);
+					break;
+				}
+			}
+		}
+	};
+	return self;
+});
+
+/**** 
 * Initialize Game
-****/
+****/ 
 var game = new LK.Game({
-	backgroundColor: 0x000000
-});
\ No newline at end of file
+	backgroundColor: 0x87CEEB
+});
+
+/**** 
+* Game Code
+****/ 
+// Game state variables
+var candles = [];
+var confettiPieces = [];
+var candlesBlownCount = 0;
+var gameComplete = false;
+// Create cake
+var cake = game.addChild(LK.getAsset('cake', {
+	anchorX: 0.5,
+	anchorY: 0.5
+}));
+cake.x = 1024;
+cake.y = 1400;
+// Create candles around the cake
+var candlePositions = [{
+	x: 1024 - 120,
+	y: 1320
+}, {
+	x: 1024 - 60,
+	y: 1300
+}, {
+	x: 1024,
+	y: 1290
+}, {
+	x: 1024 + 60,
+	y: 1300
+}, {
+	x: 1024 + 120,
+	y: 1320
+}];
+for (var i = 0; i < candlePositions.length; i++) {
+	var candle = game.addChild(new Candle());
+	candle.x = candlePositions[i].x;
+	candle.y = candlePositions[i].y;
+	candles.push(candle);
+}
+// Create characters
+var bubbles = game.addChild(new Character('bubbles'));
+bubbles.x = 1024;
+bubbles.y = 1800;
+var blossom = game.addChild(new Character('blossom'));
+blossom.x = 400;
+blossom.y = 1700;
+var buttercup = game.addChild(new Character('buttercup'));
+buttercup.x = 1648;
+buttercup.y = 1700;
+var bliss = game.addChild(new Character('bliss'));
+bliss.x = 1024;
+bliss.y = 800;
+// Create music note above Bliss
+var musicNote = game.addChild(LK.getAsset('musicNote', {
+	anchorX: 0.5,
+	anchorY: 0.5
+}));
+musicNote.x = bliss.x + 70;
+musicNote.y = bliss.y - 150;
+// Create bushes
+var bushPositions = [{
+	x: 200,
+	y: 2000
+}, {
+	x: 1848,
+	y: 2000
+}, {
+	x: 100,
+	y: 1200
+}, {
+	x: 1948,
+	y: 1200
+}];
+for (var i = 0; i < bushPositions.length; i++) {
+	var bush = game.addChild(new Bush());
+	bush.x = bushPositions[i].x;
+	bush.y = bushPositions[i].y;
+}
+// Create instruction text
+var instructionText = new Text2('Tap candles to light them!', {
+	size: 50,
+	fill: '#FFFFFF'
+});
+instructionText.anchor.set(0.5, 0);
+LK.gui.top.addChild(instructionText);
+function areAllCandlesLit() {
+	for (var i = 0; i < candles.length; i++) {
+		if (!candles[i].isLit) {
+			return false;
+		}
+	}
+	return true;
+}
+function blowOutCandles() {
+	if (areAllCandlesLit() && !gameComplete) {
+		for (var i = 0; i < candles.length; i++) {
+			candles[i].extinguish();
+		}
+		candlesBlownCount++;
+		LK.getSound('blowCandle').play();
+		// Animate Bubbles blowing
+		tween(bubbles, {
+			scaleX: 1.2,
+			scaleY: 1.2
+		}, {
+			duration: 200,
+			easing: tween.easeOut
+		});
+		tween(bubbles, {
+			scaleX: 1,
+			scaleY: 1
+		}, {
+			duration: 200,
+			easing: tween.easeIn
+		});
+		if (candlesBlownCount === 1) {
+			instructionText.setText('Great! Light them again and blow once more!');
+		} else if (candlesBlownCount === 2) {
+			triggerCakeExplosion();
+		}
+	}
+}
+function playHappyBirthday() {
+	LK.getSound('happyBirthday').play();
+	// Animate music note
+	tween(musicNote, {
+		scaleX: 1.5,
+		scaleY: 1.5
+	}, {
+		duration: 300,
+		easing: tween.easeOut
+	});
+	tween(musicNote, {
+		scaleX: 1,
+		scaleY: 1
+	}, {
+		duration: 300,
+		easing: tween.easeIn
+	});
+	// Show singing text
+	var singingText = new Text2('♪ Happy Birthday! ♪', {
+		size: 60,
+		fill: '#FF69B4'
+	});
+	singingText.anchor.set(0.5, 0.5);
+	singingText.x = bliss.x;
+	singingText.y = bliss.y - 200;
+	game.addChild(singingText);
+	tween(singingText, {
+		alpha: 0,
+		y: singingText.y - 100
+	}, {
+		duration: 3000,
+		easing: tween.easeOut,
+		onFinish: function onFinish() {
+			singingText.destroy();
+		}
+	});
+}
+function triggerCakeExplosion() {
+	gameComplete = true;
+	instructionText.setText('Happy Birthday Bubbles!');
+	// Create explosion effect
+	var explosion = game.addChild(LK.getAsset('explosion', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	}));
+	explosion.x = cake.x;
+	explosion.y = cake.y;
+	explosion.alpha = 0.7;
+	tween(explosion, {
+		scaleX: 2,
+		scaleY: 2,
+		alpha: 0
+	}, {
+		duration: 1000,
+		easing: tween.easeOut,
+		onFinish: function onFinish() {
+			explosion.destroy();
+		}
+	});
+	LK.getSound('explosion').play();
+	// Create confetti
+	for (var i = 0; i < 50; i++) {
+		var confetti = new Confetti();
+		confetti.x = Math.random() * 2048;
+		confetti.y = -50;
+		game.addChild(confetti);
+		confettiPieces.push(confetti);
+	}
+	// Animate cake
+	tween(cake, {
+		scaleX: 1.3,
+		scaleY: 1.3
+	}, {
+		duration: 500,
+		easing: tween.easeOut
+	});
+	tween(cake, {
+		scaleX: 1,
+		scaleY: 1
+	}, {
+		duration: 500,
+		easing: tween.easeIn
+	});
+}
+game.update = function () {
+	// Update instruction text based on game state
+	if (!gameComplete) {
+		if (areAllCandlesLit()) {
+			if (candlesBlownCount === 0) {
+				instructionText.setText('Tap Bubbles to blow out the candles!');
+			} else if (candlesBlownCount === 1) {
+				instructionText.setText('Light the candles again!');
+			}
+		} else if (candlesBlownCount === 1) {
+			instructionText.setText('Tap candles to light them again!');
+		}
+	}
+};
\ No newline at end of file