Code edit (1 edits merged)
Please save this source code
User prompt
Christmas Tree Decorator
Initial prompt
Toca tree maker 🌲 (2017). Tap on ginger 🐱 to collect pink baubles with her hands 10 times, tap on the gold tinsel to make it sparkle ✨ 10 times, tap on the rose gold snowglobe baubles to make them shake 10 times. Till stars falling 10 times
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var FallingStar = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2;
self.rotationSpeed = (Math.random() - 0.5) * 0.2;
self.update = function () {
self.y += self.speed;
graphics.rotation += self.rotationSpeed;
if (self.y > 2732 + 50) {
self.destroy();
var index = fallingStars.indexOf(self);
if (index > -1) {
fallingStars.splice(index, 1);
}
}
};
return self;
});
var GingerCharacter = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gingerCharacter', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (gingerTaps < 10) {
gingerTaps++;
updateProgress();
// Animate hand movement
tween(graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (gingerTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var GoldTinsel = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('goldTinsel', {
anchorX: 0.5,
anchorY: 0.5
});
self.sparkled = false;
self.down = function (x, y, obj) {
if (!self.sparkled && goldTinselTaps < 10) {
self.sparkled = true;
goldTinselTaps++;
updateProgress();
// Create sparkle effect
createSparkleEffect(self.x, self.y);
// Flash tinsel
tween(graphics, {
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xffd700
}, {
duration: 300,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (goldTinselTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var PinkBauble = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('pinkBauble', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.down = function (x, y, obj) {
if (!self.collected && pinkBaubleCollections < 10) {
self.collected = true;
pinkBaubleCollections++;
updateProgress();
// Animate collection
tween(graphics, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
LK.getSound('decorateSound').play();
if (pinkBaubleCollections === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var RoseGoldSnowglobe = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('roseGoldSnowglobe', {
anchorX: 0.5,
anchorY: 0.5
});
self.shaken = false;
self.down = function (x, y, obj) {
if (!self.shaken && roseGoldTaps < 10) {
self.shaken = true;
roseGoldTaps++;
updateProgress();
// Shake animation
var originalX = self.x;
tween(self, {
x: originalX - 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
x: originalX + 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 100,
easing: tween.easeOut
});
}
});
}
});
// Shimmer effect
tween(graphics, {
alpha: 0.5
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
alpha: 1
}, {
duration: 300,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (roseGoldTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var SparkleParticle = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('sparkleParticle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocity = {
x: (Math.random() - 0.5) * 4,
y: (Math.random() - 0.5) * 4
};
self.life = 60;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.life--;
graphics.alpha = self.life / 60;
if (self.life <= 0) {
self.destroy();
var index = sparkleParticles.indexOf(self);
if (index > -1) {
sparkleParticles.splice(index, 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Game state variables
var pinkBaubleCollections = 0;
var gingerTaps = 0;
var goldTinselTaps = 0;
var roseGoldTaps = 0;
var starTaps = 0;
var pinkBaubles = [];
var goldTinsels = [];
var roseGoldSnowglobes = [];
var fallingStars = [];
var sparkleParticles = [];
// Create Christmas tree
var tree = game.addChild(LK.getAsset('christmasTree', {
anchorX: 0.5,
anchorY: 1
}));
tree.x = 2048 / 2;
tree.y = 2732 - 200;
// Create ginger character
var gingerChar = game.addChild(new GingerCharacter());
gingerChar.x = 2048 / 2 - 200;
gingerChar.y = 2732 - 400;
// Create pink baubles
for (var i = 0; i < 6; i++) {
var bauble = game.addChild(new PinkBauble());
bauble.x = 2048 / 2 + (Math.random() - 0.5) * 300;
bauble.y = 2732 - 600 + Math.random() * 200;
pinkBaubles.push(bauble);
}
// Create gold tinsel
for (var i = 0; i < 4; i++) {
var tinsel = game.addChild(new GoldTinsel());
tinsel.x = 2048 / 2 + (Math.random() - 0.5) * 250;
tinsel.y = 2732 - 500 + i * 80;
goldTinsels.push(tinsel);
}
// Create rose gold snowglobes
for (var i = 0; i < 5; i++) {
var snowglobe = game.addChild(new RoseGoldSnowglobe());
snowglobe.x = 2048 / 2 + (Math.random() - 0.5) * 280;
snowglobe.y = 2732 - 550 + Math.random() * 150;
roseGoldSnowglobes.push(snowglobe);
}
// UI Elements
var progressText = new Text2('Progress: 0/40', {
size: 60,
fill: 0xFFFFFF
});
progressText.anchor.set(0.5, 0);
LK.gui.top.addChild(progressText);
progressText.y = 100;
var taskText = new Text2('Pink: 0/10 Ginger: 0/10 Gold: 0/10 Rose: 0/10 Stars: 0/10', {
size: 40,
fill: 0xFFFFFF
});
taskText.anchor.set(0.5, 0);
LK.gui.top.addChild(taskText);
taskText.y = 180;
function updateProgress() {
var totalProgress = pinkBaubleCollections + gingerTaps + goldTinselTaps + roseGoldTaps + starTaps;
progressText.setText('Progress: ' + totalProgress + '/50');
taskText.setText('Pink: ' + pinkBaubleCollections + '/10 Ginger: ' + gingerTaps + '/10 Gold: ' + goldTinselTaps + '/10 Rose: ' + roseGoldTaps + '/10 Stars: ' + starTaps + '/10');
// Check for victory
if (totalProgress >= 50) {
LK.showYouWin();
}
}
function createSparkleEffect(x, y) {
for (var i = 0; i < 8; i++) {
var particle = game.addChild(new SparkleParticle());
particle.x = x;
particle.y = y;
sparkleParticles.push(particle);
}
}
function createFallingStar() {
var star = game.addChild(new FallingStar());
star.x = Math.random() * 2048;
star.y = -50;
fallingStars.push(star);
}
// Star tap area (invisible tap zone)
game.down = function (x, y, obj) {
if (starTaps < 10) {
starTaps++;
updateProgress();
// Create falling stars
createFallingStar();
createFallingStar();
LK.getSound('decorateSound').play();
if (starTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
game.update = function () {
// Reset sparkled and shaken states periodically
if (LK.ticks % 180 === 0) {
for (var i = 0; i < goldTinsels.length; i++) {
goldTinsels[i].sparkled = false;
}
for (var i = 0; i < roseGoldSnowglobes.length; i++) {
roseGoldSnowglobes[i].shaken = false;
}
}
// Reset collected state for pink baubles
if (LK.ticks % 300 === 0) {
for (var i = 0; i < pinkBaubles.length; i++) {
if (pinkBaubles[i].collected) {
pinkBaubles[i].collected = false;
var graphics = pinkBaubles[i].children[0];
graphics.scaleX = 1;
graphics.scaleY = 1;
graphics.alpha = 1;
}
}
}
};
// Initialize progress display
updateProgress(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var FallingStar = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2;
self.rotationSpeed = (Math.random() - 0.5) * 0.2;
self.update = function () {
self.y += self.speed;
graphics.rotation += self.rotationSpeed;
if (self.y > 2732 + 50) {
self.destroy();
var index = fallingStars.indexOf(self);
if (index > -1) {
fallingStars.splice(index, 1);
}
}
};
return self;
});
var GingerCharacter = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('gingerCharacter', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (gingerTaps < 10) {
gingerTaps++;
updateProgress();
// Animate hand movement
tween(graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (gingerTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var GoldTinsel = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('goldTinsel', {
anchorX: 0.5,
anchorY: 0.5
});
self.sparkled = false;
self.down = function (x, y, obj) {
if (!self.sparkled && goldTinselTaps < 10) {
self.sparkled = true;
goldTinselTaps++;
updateProgress();
// Create sparkle effect
createSparkleEffect(self.x, self.y);
// Flash tinsel
tween(graphics, {
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
tint: 0xffd700
}, {
duration: 300,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (goldTinselTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var PinkBauble = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('pinkBauble', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.down = function (x, y, obj) {
if (!self.collected && pinkBaubleCollections < 10) {
self.collected = true;
pinkBaubleCollections++;
updateProgress();
// Animate collection
tween(graphics, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
LK.getSound('decorateSound').play();
if (pinkBaubleCollections === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var RoseGoldSnowglobe = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('roseGoldSnowglobe', {
anchorX: 0.5,
anchorY: 0.5
});
self.shaken = false;
self.down = function (x, y, obj) {
if (!self.shaken && roseGoldTaps < 10) {
self.shaken = true;
roseGoldTaps++;
updateProgress();
// Shake animation
var originalX = self.x;
tween(self, {
x: originalX - 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
x: originalX + 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 100,
easing: tween.easeOut
});
}
});
}
});
// Shimmer effect
tween(graphics, {
alpha: 0.5
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(graphics, {
alpha: 1
}, {
duration: 300,
easing: tween.easeIn
});
}
});
LK.getSound('decorateSound').play();
if (roseGoldTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
return self;
});
var SparkleParticle = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('sparkleParticle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocity = {
x: (Math.random() - 0.5) * 4,
y: (Math.random() - 0.5) * 4
};
self.life = 60;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.life--;
graphics.alpha = self.life / 60;
if (self.life <= 0) {
self.destroy();
var index = sparkleParticles.indexOf(self);
if (index > -1) {
sparkleParticles.splice(index, 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Game state variables
var pinkBaubleCollections = 0;
var gingerTaps = 0;
var goldTinselTaps = 0;
var roseGoldTaps = 0;
var starTaps = 0;
var pinkBaubles = [];
var goldTinsels = [];
var roseGoldSnowglobes = [];
var fallingStars = [];
var sparkleParticles = [];
// Create Christmas tree
var tree = game.addChild(LK.getAsset('christmasTree', {
anchorX: 0.5,
anchorY: 1
}));
tree.x = 2048 / 2;
tree.y = 2732 - 200;
// Create ginger character
var gingerChar = game.addChild(new GingerCharacter());
gingerChar.x = 2048 / 2 - 200;
gingerChar.y = 2732 - 400;
// Create pink baubles
for (var i = 0; i < 6; i++) {
var bauble = game.addChild(new PinkBauble());
bauble.x = 2048 / 2 + (Math.random() - 0.5) * 300;
bauble.y = 2732 - 600 + Math.random() * 200;
pinkBaubles.push(bauble);
}
// Create gold tinsel
for (var i = 0; i < 4; i++) {
var tinsel = game.addChild(new GoldTinsel());
tinsel.x = 2048 / 2 + (Math.random() - 0.5) * 250;
tinsel.y = 2732 - 500 + i * 80;
goldTinsels.push(tinsel);
}
// Create rose gold snowglobes
for (var i = 0; i < 5; i++) {
var snowglobe = game.addChild(new RoseGoldSnowglobe());
snowglobe.x = 2048 / 2 + (Math.random() - 0.5) * 280;
snowglobe.y = 2732 - 550 + Math.random() * 150;
roseGoldSnowglobes.push(snowglobe);
}
// UI Elements
var progressText = new Text2('Progress: 0/40', {
size: 60,
fill: 0xFFFFFF
});
progressText.anchor.set(0.5, 0);
LK.gui.top.addChild(progressText);
progressText.y = 100;
var taskText = new Text2('Pink: 0/10 Ginger: 0/10 Gold: 0/10 Rose: 0/10 Stars: 0/10', {
size: 40,
fill: 0xFFFFFF
});
taskText.anchor.set(0.5, 0);
LK.gui.top.addChild(taskText);
taskText.y = 180;
function updateProgress() {
var totalProgress = pinkBaubleCollections + gingerTaps + goldTinselTaps + roseGoldTaps + starTaps;
progressText.setText('Progress: ' + totalProgress + '/50');
taskText.setText('Pink: ' + pinkBaubleCollections + '/10 Ginger: ' + gingerTaps + '/10 Gold: ' + goldTinselTaps + '/10 Rose: ' + roseGoldTaps + '/10 Stars: ' + starTaps + '/10');
// Check for victory
if (totalProgress >= 50) {
LK.showYouWin();
}
}
function createSparkleEffect(x, y) {
for (var i = 0; i < 8; i++) {
var particle = game.addChild(new SparkleParticle());
particle.x = x;
particle.y = y;
sparkleParticles.push(particle);
}
}
function createFallingStar() {
var star = game.addChild(new FallingStar());
star.x = Math.random() * 2048;
star.y = -50;
fallingStars.push(star);
}
// Star tap area (invisible tap zone)
game.down = function (x, y, obj) {
if (starTaps < 10) {
starTaps++;
updateProgress();
// Create falling stars
createFallingStar();
createFallingStar();
LK.getSound('decorateSound').play();
if (starTaps === 10) {
LK.getSound('completeSound').play();
}
}
};
game.update = function () {
// Reset sparkled and shaken states periodically
if (LK.ticks % 180 === 0) {
for (var i = 0; i < goldTinsels.length; i++) {
goldTinsels[i].sparkled = false;
}
for (var i = 0; i < roseGoldSnowglobes.length; i++) {
roseGoldSnowglobes[i].shaken = false;
}
}
// Reset collected state for pink baubles
if (LK.ticks % 300 === 0) {
for (var i = 0; i < pinkBaubles.length; i++) {
if (pinkBaubles[i].collected) {
pinkBaubles[i].collected = false;
var graphics = pinkBaubles[i].children[0];
graphics.scaleX = 1;
graphics.scaleY = 1;
graphics.alpha = 1;
}
}
}
};
// Initialize progress display
updateProgress();