Code edit (1 edits merged)
Please save this source code
User prompt
Christmas Crown Builder
Initial prompt
Toca Christmas crown builder (2013). Jacky 🐰 is looking at the hole covered in snow. Tap on 3 snow covers to make them go away some 3 pinecones are hiding, twitter 🐦 seems very agitated. Use your finger to drag on 4 red and green envelopes onto 1 yellow box, what is ginger 🐱 doing on top of the tree 🌲. Use your finger to drag 2 pairs of mistletoe, Harvey 🐶 is cutting out Holly from the prickly bush ✂️. Use your finger to drag the scissors ✂️ to cut out 3 pairs of Holly, use your finger to drag on the wreath onto the wrong place, or right place for the door.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Envelope = Container.expand(function (color) { var self = Container.call(this); var assetName = color === 'red' ? 'envelope' : 'greenEnvelope'; var graphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.isDragging = false; self.isCollected = false; self.color = color; self.down = function (x, y, obj) { if (!self.isCollected) { self.isDragging = true; self.originalX = self.x; self.originalY = self.y; } }; self.checkCollection = function () { if (self.intersects(collectionBox) && !self.isCollected) { self.isCollected = true; LK.getSound('collect').play(); // Move to collection box tween(self, { x: collectionBox.x, y: collectionBox.y, scaleX: 0.5, scaleY: 0.5 }, { duration: 300, easing: tween.easeOut }); envelopesCollected++; checkEnvelopePhaseComplete(); } }; return self; }); var HollyBush = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('hollyBush', { anchorX: 0.5, anchorY: 0.5 }); self.hollyCut = false; self.down = function (x, y, obj) { if (currentPhase === 'holly' && !self.hollyCut) { self.hollyCut = true; LK.getSound('cut').play(); // Create holly pieces var holly1 = LK.getAsset('holly', { anchorX: 0.5, anchorY: 0.5 }); var holly2 = LK.getAsset('holly', { anchorX: 0.5, anchorY: 0.5 }); holly1.x = self.x - 50; holly1.y = self.y; holly2.x = self.x + 50; holly2.y = self.y; game.addChild(holly1); game.addChild(holly2); // Animate holly pieces tween(holly1, { y: holly1.y + 100 }, { duration: 500, easing: tween.easeOut }); tween(holly2, { y: holly2.y + 100 }, { duration: 500, easing: tween.easeOut }); hollyCutCount++; checkHollyPhaseComplete(); } }; return self; }); var Mistletoe = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('mistletoe', { anchorX: 0.5, anchorY: 0.5 }); self.isDragging = false; self.isCollected = false; self.down = function (x, y, obj) { if (!self.isCollected) { self.isDragging = true; self.originalX = self.x; self.originalY = self.y; } }; self.checkCollection = function () { if (self.x > 800 && self.x < 1200 && self.y > 1000 && self.y < 1400 && !self.isCollected) { self.isCollected = true; LK.getSound('collect').play(); mistletoeCollected++; checkMistletoePhaseComplete(); } }; return self; }); var SnowCover = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('snowCover', { anchorX: 0.5, anchorY: 0.5 }); self.isCleared = false; self.pineconeRevealed = false; self.down = function (x, y, obj) { if (!self.isCleared) { self.isCleared = true; LK.getSound('pop').play(); // Fade out snow cover tween(graphics, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { self.visible = false; self.revealPinecone(); } }); } }; self.revealPinecone = function () { if (!self.pineconeRevealed) { self.pineconeRevealed = true; var pinecone = LK.getAsset('pinecone', { anchorX: 0.5, anchorY: 0.5 }); pinecone.x = self.x; pinecone.y = self.y; game.addChild(pinecone); // Scale animation pinecone.scaleX = 0; pinecone.scaleY = 0; tween(pinecone, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeOut }); snowClearedCount++; checkSnowPhaseComplete(); } }; return self; }); var Wreath = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('wreath', { anchorX: 0.5, anchorY: 0.5 }); self.isDragging = false; self.isPlaced = false; self.down = function (x, y, obj) { if (currentPhase === 'wreath' && !self.isPlaced) { self.isDragging = true; self.originalX = self.x; self.originalY = self.y; } }; self.checkPlacement = function () { if (self.intersects(door) && !self.isPlaced) { self.isPlaced = true; LK.getSound('success').play(); // Snap to door center tween(self, { x: door.x, y: door.y - 50 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { showCrown(); } }); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Sound effects // Game backgrounds and UI elements // Game state variables var currentPhase = 'snow'; var snowClearedCount = 0; var envelopesCollected = 0; var mistletoeCollected = 0; var hollyCutCount = 0; // UI elements var instructionText = new Text2('Tap the snow to find pinecones!', { size: 80, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); // Game objects var snowCovers = []; var envelopes = []; var mistletoes = []; var hollyBushes = []; var collectionBox; var door; var wreath; var draggedObject = null; // Characters var jacky, twitter, ginger, harvey; // Create snow covers and setup snow phase function setupSnowPhase() { for (var i = 0; i < 3; i++) { var snow = new SnowCover(); snow.x = 400 + i * 300; snow.y = 800; snowCovers.push(snow); game.addChild(snow); } // Add character Jacky jacky = LK.getAsset('character', { anchorX: 0.5, anchorY: 0.5 }); jacky.x = 200; jacky.y = 600; game.addChild(jacky); } // Create envelopes and collection box function setupEnvelopePhase() { instructionText.setText('Drag envelopes to the yellow box!'); // Clear previous phase objects for (var i = 0; i < snowCovers.length; i++) { snowCovers[i].visible = false; } // Create collection box collectionBox = LK.getAsset('collectionBox', { anchorX: 0.5, anchorY: 0.5 }); collectionBox.x = 1024; collectionBox.y = 1200; game.addChild(collectionBox); // Create envelopes for (var i = 0; i < 4; i++) { var envelope = new Envelope(i < 2 ? 'red' : 'green'); envelope.x = 300 + i * 200; envelope.y = 800; envelopes.push(envelope); game.addChild(envelope); } // Add Twitter bird twitter = LK.getAsset('bird', { anchorX: 0.5, anchorY: 0.5 }); twitter.x = 1500; twitter.y = 400; game.addChild(twitter); } // Create mistletoe collection phase function setupMistletoePhase() { instructionText.setText('Collect mistletoe pairs!'); // Clear envelopes for (var i = 0; i < envelopes.length; i++) { envelopes[i].visible = false; } collectionBox.visible = false; // Create mistletoe for (var i = 0; i < 4; i++) { var mistletoe = new Mistletoe(); mistletoe.x = 400 + i * 300; mistletoe.y = 600; mistletoes.push(mistletoe); game.addChild(mistletoe); } // Add tree and Ginger var tree = LK.getAsset('tree', { anchorX: 0.5, anchorY: 0.5 }); tree.x = 1600; tree.y = 800; game.addChild(tree); ginger = LK.getAsset('character', { anchorX: 0.5, anchorY: 0.5 }); ginger.x = 1600; ginger.y = 600; game.addChild(ginger); } // Create holly cutting phase function setupHollyPhase() { instructionText.setText('Cut holly from the bushes!'); // Clear mistletoe for (var i = 0; i < mistletoes.length; i++) { mistletoes[i].visible = false; } // Create holly bushes for (var i = 0; i < 3; i++) { var bush = new HollyBush(); bush.x = 500 + i * 300; bush.y = 900; hollyBushes.push(bush); game.addChild(bush); } // Add scissors var scissors = LK.getAsset('scissors', { anchorX: 0.5, anchorY: 0.5 }); scissors.x = 1024; scissors.y = 1400; game.addChild(scissors); // Add Harvey harvey = LK.getAsset('character', { anchorX: 0.5, anchorY: 0.5 }); harvey.x = 1400; harvey.y = 1200; game.addChild(harvey); } // Create wreath placement phase function setupWreathPhase() { instructionText.setText('Place the wreath on the door!'); // Clear holly bushes for (var i = 0; i < hollyBushes.length; i++) { hollyBushes[i].visible = false; } // Create door door = LK.getAsset('door', { anchorX: 0.5, anchorY: 0.5 }); door.x = 1400; door.y = 1000; game.addChild(door); // Create wreath wreath = new Wreath(); wreath.x = 600; wreath.y = 1000; game.addChild(wreath); } // Show final crown function showCrown() { instructionText.setText('Christmas Crown Complete!'); var crown = LK.getAsset('crown', { anchorX: 0.5, anchorY: 0.5 }); crown.x = 1024; crown.y = 600; crown.scaleX = 0; crown.scaleY = 0; game.addChild(crown); // Animate crown appearance tween(crown, { scaleX: 1.5, scaleY: 1.5 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { LK.effects.flashScreen(0xFFD700, 2000); LK.getSound('success').play(); // Show win after crown animation LK.setTimeout(function () { LK.showYouWin(); }, 2000); } }); } // Phase completion checks function checkSnowPhaseComplete() { if (snowClearedCount >= 3) { currentPhase = 'envelope'; LK.setTimeout(function () { setupEnvelopePhase(); }, 1000); } } function checkEnvelopePhaseComplete() { if (envelopesCollected >= 4) { currentPhase = 'mistletoe'; LK.setTimeout(function () { setupMistletoePhase(); }, 1000); } } function checkMistletoePhaseComplete() { if (mistletoeCollected >= 4) { currentPhase = 'holly'; LK.setTimeout(function () { setupHollyPhase(); }, 1000); } } function checkHollyPhaseComplete() { if (hollyCutCount >= 3) { currentPhase = 'wreath'; LK.setTimeout(function () { setupWreathPhase(); }, 1000); } } // Mouse/touch handlers game.move = function (x, y, obj) { if (draggedObject) { draggedObject.x = x; draggedObject.y = y; if (draggedObject.checkCollection) { draggedObject.checkCollection(); } if (draggedObject.checkPlacement) { draggedObject.checkPlacement(); } } }; game.down = function (x, y, obj) { // Check for draggable objects for (var i = 0; i < envelopes.length; i++) { if (envelopes[i].visible && !envelopes[i].isCollected) { var envelope = envelopes[i]; var dx = x - envelope.x; var dy = y - envelope.y; if (dx * dx + dy * dy < 10000) { draggedObject = envelope; envelope.isDragging = true; break; } } } for (var i = 0; i < mistletoes.length; i++) { if (mistletoes[i].visible && !mistletoes[i].isCollected) { var mistletoe = mistletoes[i]; var dx = x - mistletoe.x; var dy = y - mistletoe.y; if (dx * dx + dy * dy < 10000) { draggedObject = mistletoe; mistletoe.isDragging = true; break; } } } if (wreath && wreath.visible && !wreath.isPlaced) { var dx = x - wreath.x; var dy = y - wreath.y; if (dx * dx + dy * dy < 10000) { draggedObject = wreath; wreath.isDragging = true; } } }; game.up = function (x, y, obj) { if (draggedObject) { draggedObject.isDragging = false; draggedObject = null; } }; // Initialize first phase setupSnowPhase(); // Game update loop game.update = function () { // Animate characters if (jacky) { jacky.x += Math.sin(LK.ticks * 0.02) * 0.5; } if (twitter) { twitter.y += Math.sin(LK.ticks * 0.03) * 0.3; } if (harvey) { harvey.scaleX = 1 + Math.sin(LK.ticks * 0.05) * 0.1; } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,502 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Envelope = Container.expand(function (color) {
+ var self = Container.call(this);
+ var assetName = color === 'red' ? 'envelope' : 'greenEnvelope';
+ var graphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.isDragging = false;
+ self.isCollected = false;
+ self.color = color;
+ self.down = function (x, y, obj) {
+ if (!self.isCollected) {
+ self.isDragging = true;
+ self.originalX = self.x;
+ self.originalY = self.y;
+ }
+ };
+ self.checkCollection = function () {
+ if (self.intersects(collectionBox) && !self.isCollected) {
+ self.isCollected = true;
+ LK.getSound('collect').play();
+ // Move to collection box
+ tween(self, {
+ x: collectionBox.x,
+ y: collectionBox.y,
+ scaleX: 0.5,
+ scaleY: 0.5
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ envelopesCollected++;
+ checkEnvelopePhaseComplete();
+ }
+ };
+ return self;
+});
+var HollyBush = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('hollyBush', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.hollyCut = false;
+ self.down = function (x, y, obj) {
+ if (currentPhase === 'holly' && !self.hollyCut) {
+ self.hollyCut = true;
+ LK.getSound('cut').play();
+ // Create holly pieces
+ var holly1 = LK.getAsset('holly', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var holly2 = LK.getAsset('holly', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ holly1.x = self.x - 50;
+ holly1.y = self.y;
+ holly2.x = self.x + 50;
+ holly2.y = self.y;
+ game.addChild(holly1);
+ game.addChild(holly2);
+ // Animate holly pieces
+ tween(holly1, {
+ y: holly1.y + 100
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ tween(holly2, {
+ y: holly2.y + 100
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ hollyCutCount++;
+ checkHollyPhaseComplete();
+ }
+ };
+ return self;
+});
+var Mistletoe = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('mistletoe', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.isDragging = false;
+ self.isCollected = false;
+ self.down = function (x, y, obj) {
+ if (!self.isCollected) {
+ self.isDragging = true;
+ self.originalX = self.x;
+ self.originalY = self.y;
+ }
+ };
+ self.checkCollection = function () {
+ if (self.x > 800 && self.x < 1200 && self.y > 1000 && self.y < 1400 && !self.isCollected) {
+ self.isCollected = true;
+ LK.getSound('collect').play();
+ mistletoeCollected++;
+ checkMistletoePhaseComplete();
+ }
+ };
+ return self;
+});
+var SnowCover = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('snowCover', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.isCleared = false;
+ self.pineconeRevealed = false;
+ self.down = function (x, y, obj) {
+ if (!self.isCleared) {
+ self.isCleared = true;
+ LK.getSound('pop').play();
+ // Fade out snow cover
+ tween(graphics, {
+ alpha: 0
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ self.visible = false;
+ self.revealPinecone();
+ }
+ });
+ }
+ };
+ self.revealPinecone = function () {
+ if (!self.pineconeRevealed) {
+ self.pineconeRevealed = true;
+ var pinecone = LK.getAsset('pinecone', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ pinecone.x = self.x;
+ pinecone.y = self.y;
+ game.addChild(pinecone);
+ // Scale animation
+ pinecone.scaleX = 0;
+ pinecone.scaleY = 0;
+ tween(pinecone, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ snowClearedCount++;
+ checkSnowPhaseComplete();
+ }
+ };
+ return self;
+});
+var Wreath = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('wreath', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.isDragging = false;
+ self.isPlaced = false;
+ self.down = function (x, y, obj) {
+ if (currentPhase === 'wreath' && !self.isPlaced) {
+ self.isDragging = true;
+ self.originalX = self.x;
+ self.originalY = self.y;
+ }
+ };
+ self.checkPlacement = function () {
+ if (self.intersects(door) && !self.isPlaced) {
+ self.isPlaced = true;
+ LK.getSound('success').play();
+ // Snap to door center
+ tween(self, {
+ x: door.x,
+ y: door.y - 50
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ showCrown();
+ }
+ });
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Sound effects
+// Game backgrounds and UI elements
+// Game state variables
+var currentPhase = 'snow';
+var snowClearedCount = 0;
+var envelopesCollected = 0;
+var mistletoeCollected = 0;
+var hollyCutCount = 0;
+// UI elements
+var instructionText = new Text2('Tap the snow to find pinecones!', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 0);
+LK.gui.top.addChild(instructionText);
+// Game objects
+var snowCovers = [];
+var envelopes = [];
+var mistletoes = [];
+var hollyBushes = [];
+var collectionBox;
+var door;
+var wreath;
+var draggedObject = null;
+// Characters
+var jacky, twitter, ginger, harvey;
+// Create snow covers and setup snow phase
+function setupSnowPhase() {
+ for (var i = 0; i < 3; i++) {
+ var snow = new SnowCover();
+ snow.x = 400 + i * 300;
+ snow.y = 800;
+ snowCovers.push(snow);
+ game.addChild(snow);
+ }
+ // Add character Jacky
+ jacky = LK.getAsset('character', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ jacky.x = 200;
+ jacky.y = 600;
+ game.addChild(jacky);
+}
+// Create envelopes and collection box
+function setupEnvelopePhase() {
+ instructionText.setText('Drag envelopes to the yellow box!');
+ // Clear previous phase objects
+ for (var i = 0; i < snowCovers.length; i++) {
+ snowCovers[i].visible = false;
+ }
+ // Create collection box
+ collectionBox = LK.getAsset('collectionBox', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ collectionBox.x = 1024;
+ collectionBox.y = 1200;
+ game.addChild(collectionBox);
+ // Create envelopes
+ for (var i = 0; i < 4; i++) {
+ var envelope = new Envelope(i < 2 ? 'red' : 'green');
+ envelope.x = 300 + i * 200;
+ envelope.y = 800;
+ envelopes.push(envelope);
+ game.addChild(envelope);
+ }
+ // Add Twitter bird
+ twitter = LK.getAsset('bird', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ twitter.x = 1500;
+ twitter.y = 400;
+ game.addChild(twitter);
+}
+// Create mistletoe collection phase
+function setupMistletoePhase() {
+ instructionText.setText('Collect mistletoe pairs!');
+ // Clear envelopes
+ for (var i = 0; i < envelopes.length; i++) {
+ envelopes[i].visible = false;
+ }
+ collectionBox.visible = false;
+ // Create mistletoe
+ for (var i = 0; i < 4; i++) {
+ var mistletoe = new Mistletoe();
+ mistletoe.x = 400 + i * 300;
+ mistletoe.y = 600;
+ mistletoes.push(mistletoe);
+ game.addChild(mistletoe);
+ }
+ // Add tree and Ginger
+ var tree = LK.getAsset('tree', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ tree.x = 1600;
+ tree.y = 800;
+ game.addChild(tree);
+ ginger = LK.getAsset('character', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ ginger.x = 1600;
+ ginger.y = 600;
+ game.addChild(ginger);
+}
+// Create holly cutting phase
+function setupHollyPhase() {
+ instructionText.setText('Cut holly from the bushes!');
+ // Clear mistletoe
+ for (var i = 0; i < mistletoes.length; i++) {
+ mistletoes[i].visible = false;
+ }
+ // Create holly bushes
+ for (var i = 0; i < 3; i++) {
+ var bush = new HollyBush();
+ bush.x = 500 + i * 300;
+ bush.y = 900;
+ hollyBushes.push(bush);
+ game.addChild(bush);
+ }
+ // Add scissors
+ var scissors = LK.getAsset('scissors', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ scissors.x = 1024;
+ scissors.y = 1400;
+ game.addChild(scissors);
+ // Add Harvey
+ harvey = LK.getAsset('character', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ harvey.x = 1400;
+ harvey.y = 1200;
+ game.addChild(harvey);
+}
+// Create wreath placement phase
+function setupWreathPhase() {
+ instructionText.setText('Place the wreath on the door!');
+ // Clear holly bushes
+ for (var i = 0; i < hollyBushes.length; i++) {
+ hollyBushes[i].visible = false;
+ }
+ // Create door
+ door = LK.getAsset('door', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ door.x = 1400;
+ door.y = 1000;
+ game.addChild(door);
+ // Create wreath
+ wreath = new Wreath();
+ wreath.x = 600;
+ wreath.y = 1000;
+ game.addChild(wreath);
+}
+// Show final crown
+function showCrown() {
+ instructionText.setText('Christmas Crown Complete!');
+ var crown = LK.getAsset('crown', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ crown.x = 1024;
+ crown.y = 600;
+ crown.scaleX = 0;
+ crown.scaleY = 0;
+ game.addChild(crown);
+ // Animate crown appearance
+ tween(crown, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 1000,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ LK.effects.flashScreen(0xFFD700, 2000);
+ LK.getSound('success').play();
+ // Show win after crown animation
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 2000);
+ }
+ });
+}
+// Phase completion checks
+function checkSnowPhaseComplete() {
+ if (snowClearedCount >= 3) {
+ currentPhase = 'envelope';
+ LK.setTimeout(function () {
+ setupEnvelopePhase();
+ }, 1000);
+ }
+}
+function checkEnvelopePhaseComplete() {
+ if (envelopesCollected >= 4) {
+ currentPhase = 'mistletoe';
+ LK.setTimeout(function () {
+ setupMistletoePhase();
+ }, 1000);
+ }
+}
+function checkMistletoePhaseComplete() {
+ if (mistletoeCollected >= 4) {
+ currentPhase = 'holly';
+ LK.setTimeout(function () {
+ setupHollyPhase();
+ }, 1000);
+ }
+}
+function checkHollyPhaseComplete() {
+ if (hollyCutCount >= 3) {
+ currentPhase = 'wreath';
+ LK.setTimeout(function () {
+ setupWreathPhase();
+ }, 1000);
+ }
+}
+// Mouse/touch handlers
+game.move = function (x, y, obj) {
+ if (draggedObject) {
+ draggedObject.x = x;
+ draggedObject.y = y;
+ if (draggedObject.checkCollection) {
+ draggedObject.checkCollection();
+ }
+ if (draggedObject.checkPlacement) {
+ draggedObject.checkPlacement();
+ }
+ }
+};
+game.down = function (x, y, obj) {
+ // Check for draggable objects
+ for (var i = 0; i < envelopes.length; i++) {
+ if (envelopes[i].visible && !envelopes[i].isCollected) {
+ var envelope = envelopes[i];
+ var dx = x - envelope.x;
+ var dy = y - envelope.y;
+ if (dx * dx + dy * dy < 10000) {
+ draggedObject = envelope;
+ envelope.isDragging = true;
+ break;
+ }
+ }
+ }
+ for (var i = 0; i < mistletoes.length; i++) {
+ if (mistletoes[i].visible && !mistletoes[i].isCollected) {
+ var mistletoe = mistletoes[i];
+ var dx = x - mistletoe.x;
+ var dy = y - mistletoe.y;
+ if (dx * dx + dy * dy < 10000) {
+ draggedObject = mistletoe;
+ mistletoe.isDragging = true;
+ break;
+ }
+ }
+ }
+ if (wreath && wreath.visible && !wreath.isPlaced) {
+ var dx = x - wreath.x;
+ var dy = y - wreath.y;
+ if (dx * dx + dy * dy < 10000) {
+ draggedObject = wreath;
+ wreath.isDragging = true;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ if (draggedObject) {
+ draggedObject.isDragging = false;
+ draggedObject = null;
+ }
+};
+// Initialize first phase
+setupSnowPhase();
+// Game update loop
+game.update = function () {
+ // Animate characters
+ if (jacky) {
+ jacky.x += Math.sin(LK.ticks * 0.02) * 0.5;
+ }
+ if (twitter) {
+ twitter.y += Math.sin(LK.ticks * 0.03) * 0.3;
+ }
+ if (harvey) {
+ harvey.scaleX = 1 + Math.sin(LK.ticks * 0.05) * 0.1;
+ }
+};
\ No newline at end of file