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