/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var JellyBlob = Container.expand(function () {
var self = Container.call(this);
var jellyGraphics = self.attachAsset('jellyBlob', {
anchorX: 0.5,
anchorY: 0.5
});
// Random color tint
var colors = [0xff0066, 0x00ff66, 0x6600ff, 0xffff00, 0x00ffff, 0xff6600];
jellyGraphics.tint = colors[Math.floor(Math.random() * colors.length)];
self.velocityX = (Math.random() - 0.5) * 12;
self.velocityY = Math.random() * -8 - 5;
self.gravity = 0.4;
self.bounce = 0.8;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
// Bounce off bottom
if (self.y > 2732 - 30) {
self.y = 2732 - 30;
self.velocityY *= -self.bounce;
LK.getSound('jellyPop').play();
}
// Bounce off sides
if (self.x < 30 || self.x > 2048 - 30) {
self.velocityX *= -1;
self.x = Math.max(30, Math.min(2048 - 30, self.x));
}
// Bounce off top
if (self.y < 30) {
self.y = 30;
self.velocityY *= -self.bounce;
}
// Slow down over time
self.velocityX *= 0.995;
};
return self;
});
var NextButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('nextButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (gameState === 'breaking') {
startJellyFlood();
} else if (gameState === 'jelly') {
resetGame();
}
};
return self;
});
var Pinata = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.hits = 0;
self.maxHits = 10;
self.broken = false;
var pinataGraphics;
if (type === 'strawberry') {
pinataGraphics = self.attachAsset('strawberryPinata', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
pinataGraphics = self.attachAsset('horsePinata', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.hit = function () {
if (self.broken) return;
self.hits++;
LK.getSound('hitSound').play();
// Shake animation
tween(pinataGraphics, {
rotation: 0.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(pinataGraphics, {
rotation: -0.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(pinataGraphics, {
rotation: 0
}, {
duration: 100
});
}
});
}
});
// Create treats
self.createTreats();
if (self.hits >= self.maxHits) {
self.broken = true;
self.breakPinata();
}
};
self.createTreats = function () {
var treatCount = Math.floor(Math.random() * 3) + 2;
for (var i = 0; i < treatCount; i++) {
var treat = new Treat();
treat.x = self.x + (Math.random() - 0.5) * 100;
treat.y = self.y + 50;
treats.push(treat);
game.addChild(treat);
}
};
self.breakPinata = function () {
tween(pinataGraphics, {
alpha: 0.3,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500
});
// Create final burst of treats
for (var i = 0; i < 8; i++) {
var treat = new Treat();
treat.x = self.x + (Math.random() - 0.5) * 200;
treat.y = self.y + (Math.random() - 0.5) * 100;
treats.push(treat);
game.addChild(treat);
}
showNextButton = true;
};
self.down = function (x, y, obj) {
self.hit();
};
return self;
});
var Treat = Container.expand(function () {
var self = Container.call(this);
var treatTypes = ['treat1', 'treat2', 'treat3', 'treat4'];
var randomType = treatTypes[Math.floor(Math.random() * treatTypes.length)];
var treatGraphics = self.attachAsset(randomType, {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = (Math.random() - 0.5) * 10;
self.velocityY = Math.random() * -5 - 3;
self.gravity = 0.3;
self.bounce = 0.7;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
// Bounce off bottom
if (self.y > 2732 - 20) {
self.y = 2732 - 20;
self.velocityY *= -self.bounce;
}
// Bounce off sides
if (self.x < 20 || self.x > 2048 - 20) {
self.velocityX *= -1;
self.x = Math.max(20, Math.min(2048 - 20, self.x));
}
// Slow down over time
self.velocityX *= 0.99;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var gameState = 'selection'; // 'selection', 'breaking', 'jelly'
var currentPinata = null;
var treats = [];
var jellyBlobs = [];
var showNextButton = false;
var nextButton = null;
// UI Text
var titleText = new Text2('Choose Your Piñata!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
var instructionText = new Text2('Tap 10 times to break it open!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
instructionText.y = 100;
LK.gui.top.addChild(instructionText);
var hitCounter = new Text2('0/10', {
size: 100,
fill: 0xFFFF00
});
hitCounter.anchor.set(0.5, 0);
hitCounter.y = 200;
LK.gui.top.addChild(hitCounter);
// Create piñata selection
var strawberryPinata = new Pinata('strawberry');
strawberryPinata.x = 2048 / 2 - 200;
strawberryPinata.y = 2732 / 2;
var horsePinata = new Pinata('horse');
horsePinata.x = 2048 / 2 + 200;
horsePinata.y = 2732 / 2;
game.addChild(strawberryPinata);
game.addChild(horsePinata);
// Selection labels
var strawberryLabel = new Text2('Strawberry', {
size: 50,
fill: 0xFFFFFF
});
strawberryLabel.anchor.set(0.5, 0);
strawberryLabel.x = strawberryPinata.x;
strawberryLabel.y = strawberryPinata.y + 250;
game.addChild(strawberryLabel);
var horseLabel = new Text2('Horse', {
size: 50,
fill: 0xFFFFFF
});
horseLabel.anchor.set(0.5, 0);
horseLabel.x = horsePinata.x;
horseLabel.y = horsePinata.y + 200;
game.addChild(horseLabel);
function selectPinata(type) {
gameState = 'breaking';
// Hide selection piñatas
strawberryPinata.visible = false;
horsePinata.visible = false;
strawberryLabel.visible = false;
horseLabel.visible = false;
// Create selected piñata
currentPinata = new Pinata(type);
currentPinata.x = 2048 / 2;
currentPinata.y = 800;
game.addChild(currentPinata);
titleText.setText('Break the Piñata!');
instructionText.visible = true;
hitCounter.visible = true;
}
function startJellyFlood() {
gameState = 'jelly';
titleText.setText('Jelly Flood!');
instructionText.setText('Watch the magical jelly rain!');
hitCounter.visible = false;
if (nextButton) {
nextButton.visible = false;
}
// Create jelly flood
var jellyTimer = LK.setInterval(function () {
if (jellyBlobs.length < 30) {
var jelly = new JellyBlob();
jelly.x = Math.random() * 2048;
jelly.y = -50;
jellyBlobs.push(jelly);
game.addChild(jelly);
}
}, 200);
// Show next button after 3 seconds
LK.setTimeout(function () {
LK.clearInterval(jellyTimer);
if (!nextButton) {
nextButton = new NextButton();
}
nextButton.x = 2048 / 2;
nextButton.y = 2732 - 150;
nextButton.visible = true;
game.addChild(nextButton);
var nextButtonText = new Text2('Play Again', {
size: 40,
fill: 0x000000
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = nextButton.x;
nextButtonText.y = nextButton.y;
game.addChild(nextButtonText);
}, 3000);
}
function resetGame() {
gameState = 'selection';
// Clear treats and jelly
for (var i = treats.length - 1; i >= 0; i--) {
treats[i].destroy();
treats.splice(i, 1);
}
for (var j = jellyBlobs.length - 1; j >= 0; j--) {
jellyBlobs[j].destroy();
jellyBlobs.splice(j, 1);
}
// Reset piñata
if (currentPinata) {
currentPinata.destroy();
currentPinata = null;
}
// Show selection piñatas
strawberryPinata.visible = true;
horsePinata.visible = true;
strawberryLabel.visible = true;
horseLabel.visible = true;
// Reset piñata states
strawberryPinata.hits = 0;
strawberryPinata.broken = false;
horsePinata.hits = 0;
horsePinata.broken = false;
// Reset UI
titleText.setText('Choose Your Piñata!');
instructionText.setText('Tap 10 times to break it open!');
instructionText.visible = false;
hitCounter.visible = false;
showNextButton = false;
if (nextButton) {
nextButton.visible = false;
}
}
// Handle piñata selection
strawberryPinata.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPinata('strawberry');
} else if (gameState === 'breaking') {
currentPinata.hit();
}
};
horsePinata.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPinata('horse');
} else if (gameState === 'breaking') {
currentPinata.hit();
}
};
game.update = function () {
// Update treats
for (var i = treats.length - 1; i >= 0; i--) {
var treat = treats[i];
// Treats naturally slow down and settle
}
// Update jelly blobs
for (var j = jellyBlobs.length - 1; j >= 0; j--) {
var jelly = jellyBlobs[j];
// Jelly blobs bounce around
}
// Update hit counter
if (gameState === 'breaking' && currentPinata) {
hitCounter.setText(currentPinata.hits + '/10');
// Show next button when piñata is broken
if (currentPinata.broken && showNextButton && !nextButton) {
nextButton = new NextButton();
nextButton.x = 2048 / 2;
nextButton.y = 2732 - 150;
game.addChild(nextButton);
var nextButtonText = new Text2('Jelly Flood!', {
size: 40,
fill: 0x000000
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = nextButton.x;
nextButtonText.y = nextButton.y;
game.addChild(nextButtonText);
}
}
};
// Initialize with selection screen
instructionText.visible = false;
hitCounter.visible = false; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var JellyBlob = Container.expand(function () {
var self = Container.call(this);
var jellyGraphics = self.attachAsset('jellyBlob', {
anchorX: 0.5,
anchorY: 0.5
});
// Random color tint
var colors = [0xff0066, 0x00ff66, 0x6600ff, 0xffff00, 0x00ffff, 0xff6600];
jellyGraphics.tint = colors[Math.floor(Math.random() * colors.length)];
self.velocityX = (Math.random() - 0.5) * 12;
self.velocityY = Math.random() * -8 - 5;
self.gravity = 0.4;
self.bounce = 0.8;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
// Bounce off bottom
if (self.y > 2732 - 30) {
self.y = 2732 - 30;
self.velocityY *= -self.bounce;
LK.getSound('jellyPop').play();
}
// Bounce off sides
if (self.x < 30 || self.x > 2048 - 30) {
self.velocityX *= -1;
self.x = Math.max(30, Math.min(2048 - 30, self.x));
}
// Bounce off top
if (self.y < 30) {
self.y = 30;
self.velocityY *= -self.bounce;
}
// Slow down over time
self.velocityX *= 0.995;
};
return self;
});
var NextButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('nextButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (gameState === 'breaking') {
startJellyFlood();
} else if (gameState === 'jelly') {
resetGame();
}
};
return self;
});
var Pinata = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.hits = 0;
self.maxHits = 10;
self.broken = false;
var pinataGraphics;
if (type === 'strawberry') {
pinataGraphics = self.attachAsset('strawberryPinata', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
pinataGraphics = self.attachAsset('horsePinata', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.hit = function () {
if (self.broken) return;
self.hits++;
LK.getSound('hitSound').play();
// Shake animation
tween(pinataGraphics, {
rotation: 0.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(pinataGraphics, {
rotation: -0.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(pinataGraphics, {
rotation: 0
}, {
duration: 100
});
}
});
}
});
// Create treats
self.createTreats();
if (self.hits >= self.maxHits) {
self.broken = true;
self.breakPinata();
}
};
self.createTreats = function () {
var treatCount = Math.floor(Math.random() * 3) + 2;
for (var i = 0; i < treatCount; i++) {
var treat = new Treat();
treat.x = self.x + (Math.random() - 0.5) * 100;
treat.y = self.y + 50;
treats.push(treat);
game.addChild(treat);
}
};
self.breakPinata = function () {
tween(pinataGraphics, {
alpha: 0.3,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500
});
// Create final burst of treats
for (var i = 0; i < 8; i++) {
var treat = new Treat();
treat.x = self.x + (Math.random() - 0.5) * 200;
treat.y = self.y + (Math.random() - 0.5) * 100;
treats.push(treat);
game.addChild(treat);
}
showNextButton = true;
};
self.down = function (x, y, obj) {
self.hit();
};
return self;
});
var Treat = Container.expand(function () {
var self = Container.call(this);
var treatTypes = ['treat1', 'treat2', 'treat3', 'treat4'];
var randomType = treatTypes[Math.floor(Math.random() * treatTypes.length)];
var treatGraphics = self.attachAsset(randomType, {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = (Math.random() - 0.5) * 10;
self.velocityY = Math.random() * -5 - 3;
self.gravity = 0.3;
self.bounce = 0.7;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
// Bounce off bottom
if (self.y > 2732 - 20) {
self.y = 2732 - 20;
self.velocityY *= -self.bounce;
}
// Bounce off sides
if (self.x < 20 || self.x > 2048 - 20) {
self.velocityX *= -1;
self.x = Math.max(20, Math.min(2048 - 20, self.x));
}
// Slow down over time
self.velocityX *= 0.99;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var gameState = 'selection'; // 'selection', 'breaking', 'jelly'
var currentPinata = null;
var treats = [];
var jellyBlobs = [];
var showNextButton = false;
var nextButton = null;
// UI Text
var titleText = new Text2('Choose Your Piñata!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
var instructionText = new Text2('Tap 10 times to break it open!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
instructionText.y = 100;
LK.gui.top.addChild(instructionText);
var hitCounter = new Text2('0/10', {
size: 100,
fill: 0xFFFF00
});
hitCounter.anchor.set(0.5, 0);
hitCounter.y = 200;
LK.gui.top.addChild(hitCounter);
// Create piñata selection
var strawberryPinata = new Pinata('strawberry');
strawberryPinata.x = 2048 / 2 - 200;
strawberryPinata.y = 2732 / 2;
var horsePinata = new Pinata('horse');
horsePinata.x = 2048 / 2 + 200;
horsePinata.y = 2732 / 2;
game.addChild(strawberryPinata);
game.addChild(horsePinata);
// Selection labels
var strawberryLabel = new Text2('Strawberry', {
size: 50,
fill: 0xFFFFFF
});
strawberryLabel.anchor.set(0.5, 0);
strawberryLabel.x = strawberryPinata.x;
strawberryLabel.y = strawberryPinata.y + 250;
game.addChild(strawberryLabel);
var horseLabel = new Text2('Horse', {
size: 50,
fill: 0xFFFFFF
});
horseLabel.anchor.set(0.5, 0);
horseLabel.x = horsePinata.x;
horseLabel.y = horsePinata.y + 200;
game.addChild(horseLabel);
function selectPinata(type) {
gameState = 'breaking';
// Hide selection piñatas
strawberryPinata.visible = false;
horsePinata.visible = false;
strawberryLabel.visible = false;
horseLabel.visible = false;
// Create selected piñata
currentPinata = new Pinata(type);
currentPinata.x = 2048 / 2;
currentPinata.y = 800;
game.addChild(currentPinata);
titleText.setText('Break the Piñata!');
instructionText.visible = true;
hitCounter.visible = true;
}
function startJellyFlood() {
gameState = 'jelly';
titleText.setText('Jelly Flood!');
instructionText.setText('Watch the magical jelly rain!');
hitCounter.visible = false;
if (nextButton) {
nextButton.visible = false;
}
// Create jelly flood
var jellyTimer = LK.setInterval(function () {
if (jellyBlobs.length < 30) {
var jelly = new JellyBlob();
jelly.x = Math.random() * 2048;
jelly.y = -50;
jellyBlobs.push(jelly);
game.addChild(jelly);
}
}, 200);
// Show next button after 3 seconds
LK.setTimeout(function () {
LK.clearInterval(jellyTimer);
if (!nextButton) {
nextButton = new NextButton();
}
nextButton.x = 2048 / 2;
nextButton.y = 2732 - 150;
nextButton.visible = true;
game.addChild(nextButton);
var nextButtonText = new Text2('Play Again', {
size: 40,
fill: 0x000000
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = nextButton.x;
nextButtonText.y = nextButton.y;
game.addChild(nextButtonText);
}, 3000);
}
function resetGame() {
gameState = 'selection';
// Clear treats and jelly
for (var i = treats.length - 1; i >= 0; i--) {
treats[i].destroy();
treats.splice(i, 1);
}
for (var j = jellyBlobs.length - 1; j >= 0; j--) {
jellyBlobs[j].destroy();
jellyBlobs.splice(j, 1);
}
// Reset piñata
if (currentPinata) {
currentPinata.destroy();
currentPinata = null;
}
// Show selection piñatas
strawberryPinata.visible = true;
horsePinata.visible = true;
strawberryLabel.visible = true;
horseLabel.visible = true;
// Reset piñata states
strawberryPinata.hits = 0;
strawberryPinata.broken = false;
horsePinata.hits = 0;
horsePinata.broken = false;
// Reset UI
titleText.setText('Choose Your Piñata!');
instructionText.setText('Tap 10 times to break it open!');
instructionText.visible = false;
hitCounter.visible = false;
showNextButton = false;
if (nextButton) {
nextButton.visible = false;
}
}
// Handle piñata selection
strawberryPinata.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPinata('strawberry');
} else if (gameState === 'breaking') {
currentPinata.hit();
}
};
horsePinata.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPinata('horse');
} else if (gameState === 'breaking') {
currentPinata.hit();
}
};
game.update = function () {
// Update treats
for (var i = treats.length - 1; i >= 0; i--) {
var treat = treats[i];
// Treats naturally slow down and settle
}
// Update jelly blobs
for (var j = jellyBlobs.length - 1; j >= 0; j--) {
var jelly = jellyBlobs[j];
// Jelly blobs bounce around
}
// Update hit counter
if (gameState === 'breaking' && currentPinata) {
hitCounter.setText(currentPinata.hits + '/10');
// Show next button when piñata is broken
if (currentPinata.broken && showNextButton && !nextButton) {
nextButton = new NextButton();
nextButton.x = 2048 / 2;
nextButton.y = 2732 - 150;
game.addChild(nextButton);
var nextButtonText = new Text2('Jelly Flood!', {
size: 40,
fill: 0x000000
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = nextButton.x;
nextButtonText.y = nextButton.y;
game.addChild(nextButtonText);
}
}
};
// Initialize with selection screen
instructionText.visible = false;
hitCounter.visible = false;