/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Accessory = Container.expand(function (type) { var self = Container.call(this); self.type = type; self.placed = false; var graphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.down = function (x, y, obj) { if (!self.placed) { draggedObject = self; } }; return self; }); var Snowball = Container.expand(function () { var self = Container.call(this); self.size = 80; self.minSize = 80; self.maxSize = 300; self.isRolling = false; self.lastX = 0; self.lastY = 0; self.rollDistance = 0; var graphics = self.attachAsset('snowball', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); self.down = function (x, y, obj) { self.isRolling = true; self.lastX = x; self.lastY = y; draggedObject = self; }; self.updateSize = function () { var scale = self.size / 80; graphics.scaleX = scale; graphics.scaleY = scale; }; self.grow = function (amount) { if (self.size < self.maxSize) { self.size += amount; self.updateSize(); } }; return self; }); var Snowflake = Container.expand(function () { var self = Container.call(this); self.speed = Math.random() * 3 + 1; self.drift = Math.random() * 2 - 1; var graphics = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.y += self.speed; self.x += self.drift; if (self.y > 2732 + 50) { self.y = -50; self.x = Math.random() * 2048; } if (self.x < -50) { self.x = 2048 + 50; } else if (self.x > 2048 + 50) { self.x = -50; } }; return self; }); var SnowmanBody = Container.expand(function () { var self = Container.call(this); self.hasHead = false; self.accessories = []; var bodyGraphics = self.attachAsset('snowman_body', { anchorX: 0.5, anchorY: 1 }); self.addHead = function (head) { if (!self.hasHead) { head.x = 0; head.y = -200; self.addChild(head); self.hasHead = true; LK.getSound('stack').play(); } }; self.addAccessory = function (accessory) { self.accessories.push(accessory); self.addChild(accessory); LK.getSound('accessory').play(); }; return self; }); var SnowmanHead = Container.expand(function () { var self = Container.call(this); var headGraphics = self.attachAsset('snowman_head', { anchorX: 0.5, anchorY: 0.5 }); self.down = function (x, y, obj) { draggedObject = self; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game state var gamePhase = 'rolling'; // 'rolling', 'building', 'decorating', 'completed' var draggedObject = null; var snowballs = []; var snowman = null; var accessories = []; var snowflakes = []; var shakeCount = 0; var isSnowing = false; // Ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 1, x: 0, y: 2732 })); // Instructions var instructionText = new Text2('Drag snowballs to roll them bigger!', { size: 60, fill: 0x000000 }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); // Create initial snowballs for (var i = 0; i < 3; i++) { var snowball = new Snowball(); snowball.x = 300 + i * 400; snowball.y = 2400; snowballs.push(snowball); game.addChild(snowball); } // Create accessories (initially hidden) var accessoryTypes = ['hat', 'broom', 'button', 'carrot']; for (var j = 0; j < accessoryTypes.length; j++) { var accessory = new Accessory(accessoryTypes[j]); accessory.x = 200 + j * 400; accessory.y = 2600; accessory.alpha = 0; accessories.push(accessory); game.addChild(accessory); } function checkSnowballSizes() { var largeBalls = 0; var mediumBalls = 0; for (var i = 0; i < snowballs.length; i++) { if (snowballs[i].size >= 250) { largeBalls++; } else if (snowballs[i].size >= 150) { mediumBalls++; } } if (largeBalls >= 1 && mediumBalls >= 1 && gamePhase === 'rolling') { gamePhase = 'building'; instructionText.setText('Stack a smaller snowball on top of a larger one!'); } } function createSnowman(bodyBall, headBall) { snowman = new SnowmanBody(); snowman.x = bodyBall.x; snowman.y = bodyBall.y; game.addChild(snowman); // Remove original snowballs bodyBall.destroy(); headBall.destroy(); // Remove from arrays var bodyIndex = snowballs.indexOf(bodyBall); var headIndex = snowballs.indexOf(headBall); if (bodyIndex > -1) snowballs.splice(bodyIndex, 1); if (headIndex > -1) snowballs.splice(headIndex, 1); // Add head to snowman var head = new SnowmanHead(); snowman.addHead(head); gamePhase = 'decorating'; instructionText.setText('Drag accessories to decorate your snowman!'); // Show accessories for (var i = 0; i < accessories.length; i++) { tween(accessories[i], { alpha: 1 }, { duration: 500 }); } } function checkAccessoryPlacement(accessory) { if (!snowman) return; var distance = Math.sqrt(Math.pow(accessory.x - snowman.x, 2) + Math.pow(accessory.y - snowman.y, 2)); if (distance < 200) { // Place accessory on snowman var localPos = snowman.toLocal({ x: accessory.x, y: accessory.y }); accessory.x = localPos.x; accessory.y = localPos.y; accessory.placed = true; snowman.addAccessory(accessory); // Position specific accessories if (accessory.type === 'hat') { accessory.x = 0; accessory.y = -250; } else if (accessory.type === 'carrot') { accessory.x = 0; accessory.y = -200; } else if (accessory.type === 'button') { accessory.x = 0; accessory.y = -100; } else if (accessory.type === 'broom') { accessory.x = 120; accessory.y = -100; } // Check if all accessories are placed var placedCount = 0; for (var i = 0; i < accessories.length; i++) { if (accessories[i].placed) placedCount++; } if (placedCount === accessories.length) { gamePhase = 'completed'; instructionText.setText('Shake your device 10 times to make it snow!'); LK.getSound('complete').play(); } } } function startSnowfall() { if (isSnowing) return; isSnowing = true; instructionText.setText('Beautiful! Your snowman is complete!'); // Create snowflakes for (var i = 0; i < 50; i++) { var snowflake = new Snowflake(); snowflake.x = Math.random() * 2048; snowflake.y = Math.random() * -500; snowflakes.push(snowflake); game.addChild(snowflake); } } // Game event handlers game.move = function (x, y, obj) { if (draggedObject) { draggedObject.x = x; draggedObject.y = y; // Handle snowball rolling if (draggedObject instanceof Snowball && draggedObject.isRolling) { var distance = Math.sqrt(Math.pow(x - draggedObject.lastX, 2) + Math.pow(y - draggedObject.lastY, 2)); if (distance > 10) { draggedObject.rollDistance += distance; if (draggedObject.rollDistance > 50) { draggedObject.grow(2); draggedObject.rollDistance = 0; } } draggedObject.lastX = x; draggedObject.lastY = y; } } }; game.up = function (x, y, obj) { if (draggedObject) { if (draggedObject instanceof Snowball) { draggedObject.isRolling = false; // Check for stacking if (gamePhase === 'building') { for (var i = 0; i < snowballs.length; i++) { var otherBall = snowballs[i]; if (otherBall !== draggedObject) { var distance = Math.sqrt(Math.pow(draggedObject.x - otherBall.x, 2) + Math.pow(draggedObject.y - otherBall.y, 2)); if (distance < 150) { // Determine which is larger if (draggedObject.size < otherBall.size) { createSnowman(otherBall, draggedObject); } else { createSnowman(draggedObject, otherBall); } break; } } } } } else if (draggedObject instanceof Accessory) { checkAccessoryPlacement(draggedObject); } draggedObject = null; } }; // Shake detection (simulated with rapid mouse movements) var lastShakeTime = 0; var shakeThreshold = 100; game.update = function () { // Check snowball sizes if (gamePhase === 'rolling') { checkSnowballSizes(); } // Simple shake detection simulation if (gamePhase === 'completed' && !isSnowing) { // Simulate shake with rapid movements or random trigger if (LK.ticks % 180 === 0) { // Every 3 seconds for demo shakeCount++; if (shakeCount >= 10) { startSnowfall(); } else { instructionText.setText('Shake ' + (10 - shakeCount) + ' more times to make it snow!'); } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Accessory = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.placed = false;
var graphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (!self.placed) {
draggedObject = self;
}
};
return self;
});
var Snowball = Container.expand(function () {
var self = Container.call(this);
self.size = 80;
self.minSize = 80;
self.maxSize = 300;
self.isRolling = false;
self.lastX = 0;
self.lastY = 0;
self.rollDistance = 0;
var graphics = self.attachAsset('snowball', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
});
self.down = function (x, y, obj) {
self.isRolling = true;
self.lastX = x;
self.lastY = y;
draggedObject = self;
};
self.updateSize = function () {
var scale = self.size / 80;
graphics.scaleX = scale;
graphics.scaleY = scale;
};
self.grow = function (amount) {
if (self.size < self.maxSize) {
self.size += amount;
self.updateSize();
}
};
return self;
});
var Snowflake = Container.expand(function () {
var self = Container.call(this);
self.speed = Math.random() * 3 + 1;
self.drift = Math.random() * 2 - 1;
var graphics = self.attachAsset('snowflake', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
self.x += self.drift;
if (self.y > 2732 + 50) {
self.y = -50;
self.x = Math.random() * 2048;
}
if (self.x < -50) {
self.x = 2048 + 50;
} else if (self.x > 2048 + 50) {
self.x = -50;
}
};
return self;
});
var SnowmanBody = Container.expand(function () {
var self = Container.call(this);
self.hasHead = false;
self.accessories = [];
var bodyGraphics = self.attachAsset('snowman_body', {
anchorX: 0.5,
anchorY: 1
});
self.addHead = function (head) {
if (!self.hasHead) {
head.x = 0;
head.y = -200;
self.addChild(head);
self.hasHead = true;
LK.getSound('stack').play();
}
};
self.addAccessory = function (accessory) {
self.accessories.push(accessory);
self.addChild(accessory);
LK.getSound('accessory').play();
};
return self;
});
var SnowmanHead = Container.expand(function () {
var self = Container.call(this);
var headGraphics = self.attachAsset('snowman_head', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
draggedObject = self;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state
var gamePhase = 'rolling'; // 'rolling', 'building', 'decorating', 'completed'
var draggedObject = null;
var snowballs = [];
var snowman = null;
var accessories = [];
var snowflakes = [];
var shakeCount = 0;
var isSnowing = false;
// Ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1,
x: 0,
y: 2732
}));
// Instructions
var instructionText = new Text2('Drag snowballs to roll them bigger!', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
// Create initial snowballs
for (var i = 0; i < 3; i++) {
var snowball = new Snowball();
snowball.x = 300 + i * 400;
snowball.y = 2400;
snowballs.push(snowball);
game.addChild(snowball);
}
// Create accessories (initially hidden)
var accessoryTypes = ['hat', 'broom', 'button', 'carrot'];
for (var j = 0; j < accessoryTypes.length; j++) {
var accessory = new Accessory(accessoryTypes[j]);
accessory.x = 200 + j * 400;
accessory.y = 2600;
accessory.alpha = 0;
accessories.push(accessory);
game.addChild(accessory);
}
function checkSnowballSizes() {
var largeBalls = 0;
var mediumBalls = 0;
for (var i = 0; i < snowballs.length; i++) {
if (snowballs[i].size >= 250) {
largeBalls++;
} else if (snowballs[i].size >= 150) {
mediumBalls++;
}
}
if (largeBalls >= 1 && mediumBalls >= 1 && gamePhase === 'rolling') {
gamePhase = 'building';
instructionText.setText('Stack a smaller snowball on top of a larger one!');
}
}
function createSnowman(bodyBall, headBall) {
snowman = new SnowmanBody();
snowman.x = bodyBall.x;
snowman.y = bodyBall.y;
game.addChild(snowman);
// Remove original snowballs
bodyBall.destroy();
headBall.destroy();
// Remove from arrays
var bodyIndex = snowballs.indexOf(bodyBall);
var headIndex = snowballs.indexOf(headBall);
if (bodyIndex > -1) snowballs.splice(bodyIndex, 1);
if (headIndex > -1) snowballs.splice(headIndex, 1);
// Add head to snowman
var head = new SnowmanHead();
snowman.addHead(head);
gamePhase = 'decorating';
instructionText.setText('Drag accessories to decorate your snowman!');
// Show accessories
for (var i = 0; i < accessories.length; i++) {
tween(accessories[i], {
alpha: 1
}, {
duration: 500
});
}
}
function checkAccessoryPlacement(accessory) {
if (!snowman) return;
var distance = Math.sqrt(Math.pow(accessory.x - snowman.x, 2) + Math.pow(accessory.y - snowman.y, 2));
if (distance < 200) {
// Place accessory on snowman
var localPos = snowman.toLocal({
x: accessory.x,
y: accessory.y
});
accessory.x = localPos.x;
accessory.y = localPos.y;
accessory.placed = true;
snowman.addAccessory(accessory);
// Position specific accessories
if (accessory.type === 'hat') {
accessory.x = 0;
accessory.y = -250;
} else if (accessory.type === 'carrot') {
accessory.x = 0;
accessory.y = -200;
} else if (accessory.type === 'button') {
accessory.x = 0;
accessory.y = -100;
} else if (accessory.type === 'broom') {
accessory.x = 120;
accessory.y = -100;
}
// Check if all accessories are placed
var placedCount = 0;
for (var i = 0; i < accessories.length; i++) {
if (accessories[i].placed) placedCount++;
}
if (placedCount === accessories.length) {
gamePhase = 'completed';
instructionText.setText('Shake your device 10 times to make it snow!');
LK.getSound('complete').play();
}
}
}
function startSnowfall() {
if (isSnowing) return;
isSnowing = true;
instructionText.setText('Beautiful! Your snowman is complete!');
// Create snowflakes
for (var i = 0; i < 50; i++) {
var snowflake = new Snowflake();
snowflake.x = Math.random() * 2048;
snowflake.y = Math.random() * -500;
snowflakes.push(snowflake);
game.addChild(snowflake);
}
}
// Game event handlers
game.move = function (x, y, obj) {
if (draggedObject) {
draggedObject.x = x;
draggedObject.y = y;
// Handle snowball rolling
if (draggedObject instanceof Snowball && draggedObject.isRolling) {
var distance = Math.sqrt(Math.pow(x - draggedObject.lastX, 2) + Math.pow(y - draggedObject.lastY, 2));
if (distance > 10) {
draggedObject.rollDistance += distance;
if (draggedObject.rollDistance > 50) {
draggedObject.grow(2);
draggedObject.rollDistance = 0;
}
}
draggedObject.lastX = x;
draggedObject.lastY = y;
}
}
};
game.up = function (x, y, obj) {
if (draggedObject) {
if (draggedObject instanceof Snowball) {
draggedObject.isRolling = false;
// Check for stacking
if (gamePhase === 'building') {
for (var i = 0; i < snowballs.length; i++) {
var otherBall = snowballs[i];
if (otherBall !== draggedObject) {
var distance = Math.sqrt(Math.pow(draggedObject.x - otherBall.x, 2) + Math.pow(draggedObject.y - otherBall.y, 2));
if (distance < 150) {
// Determine which is larger
if (draggedObject.size < otherBall.size) {
createSnowman(otherBall, draggedObject);
} else {
createSnowman(draggedObject, otherBall);
}
break;
}
}
}
}
} else if (draggedObject instanceof Accessory) {
checkAccessoryPlacement(draggedObject);
}
draggedObject = null;
}
};
// Shake detection (simulated with rapid mouse movements)
var lastShakeTime = 0;
var shakeThreshold = 100;
game.update = function () {
// Check snowball sizes
if (gamePhase === 'rolling') {
checkSnowballSizes();
}
// Simple shake detection simulation
if (gamePhase === 'completed' && !isSnowing) {
// Simulate shake with rapid movements or random trigger
if (LK.ticks % 180 === 0) {
// Every 3 seconds for demo
shakeCount++;
if (shakeCount >= 10) {
startSnowfall();
} else {
instructionText.setText('Shake ' + (10 - shakeCount) + ' more times to make it snow!');
}
}
}
};