Code edit (1 edits merged)
Please save this source code
User prompt
Bubbles' Magical Unicorn
Initial prompt
Powerpuff girls: bubbles’s fluffy unicorn (2013). Press the unicorn’s hoof you’ll hear phrases and sound effects and chimes and trotting sounds. Press the hoof 2 times bubbles’s voice will sing the unicorn song.
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bubbles = Container.expand(function () {
	var self = Container.call(this);
	var bubblesBody = self.attachAsset('bubbles', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.singAnimation = function () {
		var originalScale = bubblesBody.scaleX;
		tween(bubblesBody, {
			scaleX: 1.1,
			scaleY: 1.1
		}, {
			duration: 300,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				tween(bubblesBody, {
					scaleX: originalScale,
					scaleY: originalScale
				}, {
					duration: 300,
					easing: tween.easeInOut
				});
			}
		});
	};
	return self;
});
var Sparkle = Container.expand(function () {
	var self = Container.call(this);
	var sparkleGraphics = self.attachAsset('sparkle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animate = function () {
		sparkleGraphics.alpha = 1;
		sparkleGraphics.scaleX = 0.5;
		sparkleGraphics.scaleY = 0.5;
		tween(sparkleGraphics, {
			alpha: 0,
			scaleX: 2,
			scaleY: 2
		}, {
			duration: 800,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				self.destroy();
			}
		});
	};
	return self;
});
var Unicorn = Container.expand(function () {
	var self = Container.call(this);
	var unicornBody = self.attachAsset('unicorn', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	var hoof = self.attachAsset('unicornHoof', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 150,
		y: 150
	});
	self.animateHoofTap = function () {
		var originalScale = hoof.scaleX;
		tween(hoof, {
			scaleX: 1.3,
			scaleY: 1.3
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(hoof, {
					scaleX: originalScale,
					scaleY: originalScale
				}, {
					duration: 100
				});
			}
		});
	};
	self.animateBody = function () {
		var originalY = unicornBody.y;
		tween(unicornBody, {
			y: originalY - 20
		}, {
			duration: 200,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				tween(unicornBody, {
					y: originalY
				}, {
					duration: 200,
					easing: tween.easeIn
				});
			}
		});
	};
	self.down = function (x, y, obj) {
		var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
		var hoofBounds = {
			left: hoof.x - hoof.width / 2,
			right: hoof.x + hoof.width / 2,
			top: hoof.y - hoof.height / 2,
			bottom: hoof.y + hoof.height / 2
		};
		if (localPos.x >= hoofBounds.left && localPos.x <= hoofBounds.right && localPos.y >= hoofBounds.top && localPos.y <= hoofBounds.bottom) {
			handleHoofTap();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var background = game.attachAsset('background', {
	anchorX: 0,
	anchorY: 0,
	x: 0,
	y: 0
});
var unicorn = game.addChild(new Unicorn());
unicorn.x = 1024;
unicorn.y = 1200;
var bubbles = game.addChild(new Bubbles());
bubbles.x = 400;
bubbles.y = 1400;
var scoreTxt = new Text2('Taps: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var totalTaps = storage.totalTaps || 0;
var lastTapTime = 0;
var doubleTapWindow = 500;
var soundVariations = ['chime1', 'chime2', 'trot1', 'trot2', 'magical1', 'magical2'];
scoreTxt.setText('Taps: ' + totalTaps);
function createSparkles(x, y) {
	for (var i = 0; i < 5; i++) {
		var sparkle = game.addChild(new Sparkle());
		sparkle.x = x + (Math.random() - 0.5) * 200;
		sparkle.y = y + (Math.random() - 0.5) * 200;
		LK.setTimeout(function (s) {
			return function () {
				s.animate();
			};
		}(sparkle), i * 100);
	}
}
function handleHoofTap() {
	var currentTime = Date.now();
	var isDoubleTap = currentTime - lastTapTime < doubleTapWindow;
	totalTaps++;
	storage.totalTaps = totalTaps;
	scoreTxt.setText('Taps: ' + totalTaps);
	unicorn.animateHoofTap();
	createSparkles(unicorn.x + 150, unicorn.y + 150);
	if (isDoubleTap) {
		bubbles.singAnimation();
		LK.getSound('unicornSong').play();
		unicorn.animateBody();
		LK.effects.flashScreen(0xFFD700, 500);
	} else {
		var randomSound = soundVariations[Math.floor(Math.random() * soundVariations.length)];
		LK.getSound(randomSound).play();
		if (totalTaps > 10 && Math.random() < 0.3) {
			unicorn.animateBody();
		}
	}
	lastTapTime = currentTime;
}
game.update = function () {
	// Continuous sparkle generation for ambient magic
	if (LK.ticks % 180 == 0) {
		var ambientSparkle = game.addChild(new Sparkle());
		ambientSparkle.x = Math.random() * 2048;
		ambientSparkle.y = Math.random() * 1000 + 500;
		ambientSparkle.animate();
	}
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bubbles = Container.expand(function () {
	var self = Container.call(this);
	var bubblesBody = self.attachAsset('bubbles', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.singAnimation = function () {
		var originalScale = bubblesBody.scaleX;
		tween(bubblesBody, {
			scaleX: 1.1,
			scaleY: 1.1
		}, {
			duration: 300,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				tween(bubblesBody, {
					scaleX: originalScale,
					scaleY: originalScale
				}, {
					duration: 300,
					easing: tween.easeInOut
				});
			}
		});
	};
	return self;
});
var Sparkle = Container.expand(function () {
	var self = Container.call(this);
	var sparkleGraphics = self.attachAsset('sparkle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animate = function () {
		sparkleGraphics.alpha = 1;
		sparkleGraphics.scaleX = 0.5;
		sparkleGraphics.scaleY = 0.5;
		tween(sparkleGraphics, {
			alpha: 0,
			scaleX: 2,
			scaleY: 2
		}, {
			duration: 800,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				self.destroy();
			}
		});
	};
	return self;
});
var Unicorn = Container.expand(function () {
	var self = Container.call(this);
	var unicornBody = self.attachAsset('unicorn', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	var hoof = self.attachAsset('unicornHoof', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 150,
		y: 150
	});
	self.animateHoofTap = function () {
		var originalScale = hoof.scaleX;
		tween(hoof, {
			scaleX: 1.3,
			scaleY: 1.3
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(hoof, {
					scaleX: originalScale,
					scaleY: originalScale
				}, {
					duration: 100
				});
			}
		});
	};
	self.animateBody = function () {
		var originalY = unicornBody.y;
		tween(unicornBody, {
			y: originalY - 20
		}, {
			duration: 200,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				tween(unicornBody, {
					y: originalY
				}, {
					duration: 200,
					easing: tween.easeIn
				});
			}
		});
	};
	self.down = function (x, y, obj) {
		var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
		var hoofBounds = {
			left: hoof.x - hoof.width / 2,
			right: hoof.x + hoof.width / 2,
			top: hoof.y - hoof.height / 2,
			bottom: hoof.y + hoof.height / 2
		};
		if (localPos.x >= hoofBounds.left && localPos.x <= hoofBounds.right && localPos.y >= hoofBounds.top && localPos.y <= hoofBounds.bottom) {
			handleHoofTap();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var background = game.attachAsset('background', {
	anchorX: 0,
	anchorY: 0,
	x: 0,
	y: 0
});
var unicorn = game.addChild(new Unicorn());
unicorn.x = 1024;
unicorn.y = 1200;
var bubbles = game.addChild(new Bubbles());
bubbles.x = 400;
bubbles.y = 1400;
var scoreTxt = new Text2('Taps: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var totalTaps = storage.totalTaps || 0;
var lastTapTime = 0;
var doubleTapWindow = 500;
var soundVariations = ['chime1', 'chime2', 'trot1', 'trot2', 'magical1', 'magical2'];
scoreTxt.setText('Taps: ' + totalTaps);
function createSparkles(x, y) {
	for (var i = 0; i < 5; i++) {
		var sparkle = game.addChild(new Sparkle());
		sparkle.x = x + (Math.random() - 0.5) * 200;
		sparkle.y = y + (Math.random() - 0.5) * 200;
		LK.setTimeout(function (s) {
			return function () {
				s.animate();
			};
		}(sparkle), i * 100);
	}
}
function handleHoofTap() {
	var currentTime = Date.now();
	var isDoubleTap = currentTime - lastTapTime < doubleTapWindow;
	totalTaps++;
	storage.totalTaps = totalTaps;
	scoreTxt.setText('Taps: ' + totalTaps);
	unicorn.animateHoofTap();
	createSparkles(unicorn.x + 150, unicorn.y + 150);
	if (isDoubleTap) {
		bubbles.singAnimation();
		LK.getSound('unicornSong').play();
		unicorn.animateBody();
		LK.effects.flashScreen(0xFFD700, 500);
	} else {
		var randomSound = soundVariations[Math.floor(Math.random() * soundVariations.length)];
		LK.getSound(randomSound).play();
		if (totalTaps > 10 && Math.random() < 0.3) {
			unicorn.animateBody();
		}
	}
	lastTapTime = currentTime;
}
game.update = function () {
	// Continuous sparkle generation for ambient magic
	if (LK.ticks % 180 == 0) {
		var ambientSparkle = game.addChild(new Sparkle());
		ambientSparkle.x = Math.random() * 2048;
		ambientSparkle.y = Math.random() * 1000 + 500;
		ambientSparkle.animate();
	}
};