/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function (characterType) {
var self = Container.call(this);
var characterGraphics = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 1.0
});
self.characterType = characterType;
self.snowballCount = 10;
self.down = function (x, y, obj) {
if (gamePhase == 'attack' && self.snowballCount > 0 && (self.characterType == 'bubbles' || self.characterType == 'buttercup')) {
self.throwSnowball();
}
};
self.throwSnowball = function () {
if (self.snowballCount > 0) {
var newSnowball = new Snowball();
newSnowball.x = self.x;
newSnowball.y = self.y - 80;
newSnowball.launch(blossom.x, blossom.y - 75);
snowballs.push(newSnowball);
game.addChild(newSnowball);
self.snowballCount--;
LK.getSound('throw').play();
updateSnowballCounters();
if (bubbles.snowballCount == 0 && buttercup.snowballCount == 0) {
LK.setTimeout(function () {
startFinalePhase();
}, 1000);
}
}
};
return self;
});
var Footprint = Container.expand(function () {
var self = Container.call(this);
var footprintGraphics = self.attachAsset('footprint', {
anchorX: 0.5,
anchorY: 0.5
});
footprintGraphics.alpha = 0.6;
return self;
});
var GiantSnowball = Container.expand(function () {
var self = Container.call(this);
var snowballGraphics = self.attachAsset('giantSnowball', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 0;
self.speedY = 0;
self.active = false;
self.jumpHeight = 0;
self.isJumping = false;
self.activate = function () {
self.active = true;
self.speedX = -8;
self.speedY = -2;
LK.getSound('roll').play();
};
self.down = function (x, y, obj) {
if (!self.active && gamePhase == 'finale') {
self.activate();
}
};
self.update = function () {
if (self.active) {
self.x += self.speedX;
self.y += self.speedY;
snowballGraphics.rotation += 0.2;
if (self.y > 2000 && !self.isJumping) {
self.isJumping = true;
self.speedY = -15;
}
if (self.isJumping) {
self.speedY += 0.8;
if (self.y > 2000) {
self.speedY = -10;
}
}
}
};
return self;
});
var SnowParticle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('snowParticle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = (Math.random() - 0.5) * 4;
self.life = 60;
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
self.life--;
particleGraphics.alpha = self.life / 60;
if (self.life <= 0) {
self.destroy();
}
};
return self;
});
var Snowball = Container.expand(function () {
var self = Container.call(this);
var snowballGraphics = self.attachAsset('snowball', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 0;
self.speedY = 0;
self.active = false;
self.launch = function (targetX, targetY) {
self.active = true;
var deltaX = targetX - self.x;
var deltaY = targetY - self.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
self.speedX = deltaX / distance * 12;
self.speedY = deltaY / distance * 12;
};
self.update = function () {
if (self.active) {
self.x += self.speedX;
self.y += self.speedY;
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.active = false;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game state variables
var gamePhase = 'setup'; // 'setup', 'attack', 'finale', 'victory'
var blossom, bubbles, buttercup;
var giantSnowball;
var snowballs = [];
var footprints = [];
var particles = [];
var footprintTimer = 0;
// UI elements
var bubblesCountText, buttercupCountText;
var instructionText;
// Initialize characters
blossom = game.addChild(new Character('blossom'));
blossom.x = -100;
blossom.y = 1800;
bubbles = game.addChild(new Character('bubbles'));
bubbles.x = 400;
bubbles.y = 2200;
buttercup = game.addChild(new Character('buttercup'));
buttercup.x = 1600;
buttercup.y = 2200;
// Initialize giant snowball (hidden initially)
giantSnowball = game.addChild(new GiantSnowball());
giantSnowball.x = 2200;
giantSnowball.y = 1800;
giantSnowball.alpha = 0;
// UI Setup
bubblesCountText = new Text2('Bubbles: 10', {
size: 60,
fill: 0xFFFFFF
});
bubblesCountText.anchor.set(0, 0);
LK.gui.topLeft.addChild(bubblesCountText);
bubblesCountText.x = 120;
bubblesCountText.y = 20;
buttercupCountText = new Text2('Buttercup: 10', {
size: 60,
fill: 0xFFFFFF
});
buttercupCountText.anchor.set(1, 0);
LK.gui.topRight.addChild(buttercupCountText);
instructionText = new Text2('Watch Blossom walk...', {
size: 80,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 150;
function updateSnowballCounters() {
bubblesCountText.setText('Bubbles: ' + bubbles.snowballCount);
buttercupCountText.setText('Buttercup: ' + buttercup.snowballCount);
}
function createFootprint(x, y) {
var footprint = new Footprint();
footprint.x = x;
footprint.y = y;
footprints.push(footprint);
game.addChild(footprint);
}
function createSnowParticles(x, y, count) {
for (var i = 0; i < count; i++) {
var particle = new SnowParticle();
particle.x = x + (Math.random() - 0.5) * 60;
particle.y = y + (Math.random() - 0.5) * 60;
particles.push(particle);
game.addChild(particle);
}
}
function startAttackPhase() {
gamePhase = 'attack';
instructionText.setText('Tap Bubbles & Buttercup to throw snowballs!');
}
function startFinalePhase() {
gamePhase = 'finale';
instructionText.setText('Tap the giant snowball to help Blossom!');
giantSnowball.alpha = 1;
tween(giantSnowball, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(giantSnowball, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeInOut
});
}
});
}
function checkVictory() {
if (giantSnowball.active && giantSnowball.x < 600) {
gamePhase = 'victory';
instructionText.setText('Blossom wins the snowball fight!');
LK.showYouWin();
}
}
// Game update loop
game.update = function () {
// Setup phase: Blossom walks across screen
if (gamePhase == 'setup') {
blossom.x += 3;
// Create footprints
footprintTimer++;
if (footprintTimer % 20 == 0) {
createFootprint(blossom.x - 30, blossom.y);
}
// Start attack phase when Blossom reaches center
if (blossom.x > 1024) {
startAttackPhase();
}
}
// Attack phase: Blossom continues walking slowly
if (gamePhase == 'attack') {
blossom.x += 1;
footprintTimer++;
if (footprintTimer % 30 == 0) {
createFootprint(blossom.x - 30, blossom.y);
}
}
// Check snowball collisions with Blossom
for (var i = snowballs.length - 1; i >= 0; i--) {
var snowball = snowballs[i];
if (snowball.active && snowball.intersects(blossom)) {
// Hit effect
LK.getSound('hit').play();
createSnowParticles(snowball.x, snowball.y, 8);
LK.effects.flashObject(blossom, 0xffffff, 300);
// Remove snowball
snowball.destroy();
snowballs.splice(i, 1);
// Add score
LK.setScore(LK.getScore() + 10);
} else if (!snowball.active) {
snowball.destroy();
snowballs.splice(i, 1);
}
}
// Clean up old particles
for (var j = particles.length - 1; j >= 0; j--) {
if (particles[j].life <= 0) {
particles.splice(j, 1);
}
}
// Check victory condition
if (gamePhase == 'finale') {
checkVictory();
}
// Fade old footprints
for (var k = 0; k < footprints.length; k++) {
if (footprints[k].alpha > 0) {
footprints[k].alpha -= 0.005;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function (characterType) {
var self = Container.call(this);
var characterGraphics = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 1.0
});
self.characterType = characterType;
self.snowballCount = 10;
self.down = function (x, y, obj) {
if (gamePhase == 'attack' && self.snowballCount > 0 && (self.characterType == 'bubbles' || self.characterType == 'buttercup')) {
self.throwSnowball();
}
};
self.throwSnowball = function () {
if (self.snowballCount > 0) {
var newSnowball = new Snowball();
newSnowball.x = self.x;
newSnowball.y = self.y - 80;
newSnowball.launch(blossom.x, blossom.y - 75);
snowballs.push(newSnowball);
game.addChild(newSnowball);
self.snowballCount--;
LK.getSound('throw').play();
updateSnowballCounters();
if (bubbles.snowballCount == 0 && buttercup.snowballCount == 0) {
LK.setTimeout(function () {
startFinalePhase();
}, 1000);
}
}
};
return self;
});
var Footprint = Container.expand(function () {
var self = Container.call(this);
var footprintGraphics = self.attachAsset('footprint', {
anchorX: 0.5,
anchorY: 0.5
});
footprintGraphics.alpha = 0.6;
return self;
});
var GiantSnowball = Container.expand(function () {
var self = Container.call(this);
var snowballGraphics = self.attachAsset('giantSnowball', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 0;
self.speedY = 0;
self.active = false;
self.jumpHeight = 0;
self.isJumping = false;
self.activate = function () {
self.active = true;
self.speedX = -8;
self.speedY = -2;
LK.getSound('roll').play();
};
self.down = function (x, y, obj) {
if (!self.active && gamePhase == 'finale') {
self.activate();
}
};
self.update = function () {
if (self.active) {
self.x += self.speedX;
self.y += self.speedY;
snowballGraphics.rotation += 0.2;
if (self.y > 2000 && !self.isJumping) {
self.isJumping = true;
self.speedY = -15;
}
if (self.isJumping) {
self.speedY += 0.8;
if (self.y > 2000) {
self.speedY = -10;
}
}
}
};
return self;
});
var SnowParticle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('snowParticle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = (Math.random() - 0.5) * 4;
self.life = 60;
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
self.life--;
particleGraphics.alpha = self.life / 60;
if (self.life <= 0) {
self.destroy();
}
};
return self;
});
var Snowball = Container.expand(function () {
var self = Container.call(this);
var snowballGraphics = self.attachAsset('snowball', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = 0;
self.speedY = 0;
self.active = false;
self.launch = function (targetX, targetY) {
self.active = true;
var deltaX = targetX - self.x;
var deltaY = targetY - self.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
self.speedX = deltaX / distance * 12;
self.speedY = deltaY / distance * 12;
};
self.update = function () {
if (self.active) {
self.x += self.speedX;
self.y += self.speedY;
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.active = false;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game state variables
var gamePhase = 'setup'; // 'setup', 'attack', 'finale', 'victory'
var blossom, bubbles, buttercup;
var giantSnowball;
var snowballs = [];
var footprints = [];
var particles = [];
var footprintTimer = 0;
// UI elements
var bubblesCountText, buttercupCountText;
var instructionText;
// Initialize characters
blossom = game.addChild(new Character('blossom'));
blossom.x = -100;
blossom.y = 1800;
bubbles = game.addChild(new Character('bubbles'));
bubbles.x = 400;
bubbles.y = 2200;
buttercup = game.addChild(new Character('buttercup'));
buttercup.x = 1600;
buttercup.y = 2200;
// Initialize giant snowball (hidden initially)
giantSnowball = game.addChild(new GiantSnowball());
giantSnowball.x = 2200;
giantSnowball.y = 1800;
giantSnowball.alpha = 0;
// UI Setup
bubblesCountText = new Text2('Bubbles: 10', {
size: 60,
fill: 0xFFFFFF
});
bubblesCountText.anchor.set(0, 0);
LK.gui.topLeft.addChild(bubblesCountText);
bubblesCountText.x = 120;
bubblesCountText.y = 20;
buttercupCountText = new Text2('Buttercup: 10', {
size: 60,
fill: 0xFFFFFF
});
buttercupCountText.anchor.set(1, 0);
LK.gui.topRight.addChild(buttercupCountText);
instructionText = new Text2('Watch Blossom walk...', {
size: 80,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 150;
function updateSnowballCounters() {
bubblesCountText.setText('Bubbles: ' + bubbles.snowballCount);
buttercupCountText.setText('Buttercup: ' + buttercup.snowballCount);
}
function createFootprint(x, y) {
var footprint = new Footprint();
footprint.x = x;
footprint.y = y;
footprints.push(footprint);
game.addChild(footprint);
}
function createSnowParticles(x, y, count) {
for (var i = 0; i < count; i++) {
var particle = new SnowParticle();
particle.x = x + (Math.random() - 0.5) * 60;
particle.y = y + (Math.random() - 0.5) * 60;
particles.push(particle);
game.addChild(particle);
}
}
function startAttackPhase() {
gamePhase = 'attack';
instructionText.setText('Tap Bubbles & Buttercup to throw snowballs!');
}
function startFinalePhase() {
gamePhase = 'finale';
instructionText.setText('Tap the giant snowball to help Blossom!');
giantSnowball.alpha = 1;
tween(giantSnowball, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(giantSnowball, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeInOut
});
}
});
}
function checkVictory() {
if (giantSnowball.active && giantSnowball.x < 600) {
gamePhase = 'victory';
instructionText.setText('Blossom wins the snowball fight!');
LK.showYouWin();
}
}
// Game update loop
game.update = function () {
// Setup phase: Blossom walks across screen
if (gamePhase == 'setup') {
blossom.x += 3;
// Create footprints
footprintTimer++;
if (footprintTimer % 20 == 0) {
createFootprint(blossom.x - 30, blossom.y);
}
// Start attack phase when Blossom reaches center
if (blossom.x > 1024) {
startAttackPhase();
}
}
// Attack phase: Blossom continues walking slowly
if (gamePhase == 'attack') {
blossom.x += 1;
footprintTimer++;
if (footprintTimer % 30 == 0) {
createFootprint(blossom.x - 30, blossom.y);
}
}
// Check snowball collisions with Blossom
for (var i = snowballs.length - 1; i >= 0; i--) {
var snowball = snowballs[i];
if (snowball.active && snowball.intersects(blossom)) {
// Hit effect
LK.getSound('hit').play();
createSnowParticles(snowball.x, snowball.y, 8);
LK.effects.flashObject(blossom, 0xffffff, 300);
// Remove snowball
snowball.destroy();
snowballs.splice(i, 1);
// Add score
LK.setScore(LK.getScore() + 10);
} else if (!snowball.active) {
snowball.destroy();
snowballs.splice(i, 1);
}
}
// Clean up old particles
for (var j = particles.length - 1; j >= 0; j--) {
if (particles[j].life <= 0) {
particles.splice(j, 1);
}
}
// Check victory condition
if (gamePhase == 'finale') {
checkVictory();
}
// Fade old footprints
for (var k = 0; k < footprints.length; k++) {
if (footprints[k].alpha > 0) {
footprints[k].alpha -= 0.005;
}
}
};