/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var RegularToy = Container.expand(function (toyType) {
var self = Container.call(this);
var toyGraphics = self.attachAsset(toyType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isDragging = false;
self.startX = 0;
self.startY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.down = function (x, y, obj) {
self.isDragging = true;
self.startX = x;
self.startY = y;
self.velocityX = 0;
self.velocityY = 0;
};
self.up = function (x, y, obj) {
if (self.isDragging) {
var deltaX = x - self.startX;
var deltaY = y - self.startY;
self.velocityX = deltaX * 0.3;
self.velocityY = deltaY * 0.3;
self.isDragging = false;
}
};
self.update = function () {
if (!self.isDragging) {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Check if toy is off screen
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.markForRemoval = true;
}
}
};
return self;
});
var SpecialToy = Container.expand(function (toyType) {
var self = Container.call(this);
var toyGraphics = self.attachAsset(toyType, {
anchorX: 0.5,
anchorY: 0.5
});
self.toyType = toyType;
self.isDragging = false;
self.startX = 0;
self.startY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.isAnimating = false;
self.down = function (x, y, obj) {
if (!self.isAnimating) {
self.triggerSpecialEffect();
}
self.isDragging = true;
self.startX = x;
self.startY = y;
self.velocityX = 0;
self.velocityY = 0;
};
self.up = function (x, y, obj) {
if (self.isDragging) {
var deltaX = x - self.startX;
var deltaY = y - self.startY;
if (Math.abs(deltaX) > 20 || Math.abs(deltaY) > 20) {
self.velocityX = deltaX * 0.3;
self.velocityY = deltaY * 0.3;
}
self.isDragging = false;
}
};
self.triggerSpecialEffect = function () {
if (self.isAnimating) return;
self.isAnimating = true;
LK.setScore(LK.getScore() + 50);
scoreTxt.setText(LK.getScore());
if (self.toyType === 'gameController') {
LK.getSound('beep').play();
LK.effects.flashObject(self, 0x00FF00, 500);
} else if (self.toyType === 'cuckooClock') {
LK.getSound('cuckoo').play();
tween(self, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
easing: tween.easeOut
});
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeIn
});
} else if (self.toyType === 'toyTruck') {
LK.getSound('truck').play();
var originalX = self.x;
tween(self, {
x: self.x + 100
}, {
duration: 500,
easing: tween.easeOut
});
tween(self, {
x: originalX
}, {
duration: 500,
easing: tween.easeIn
});
} else if (self.toyType === 'chatteringTeeth') {
LK.getSound('chatter').play();
for (var i = 0; i < 6; i++) {
var delay = i * 100;
setTimeout(function () {
tween(self, {
rotation: 0.2
}, {
duration: 50
});
tween(self, {
rotation: -0.2
}, {
duration: 50
});
tween(self, {
rotation: 0
}, {
duration: 50
});
}, delay);
}
}
setTimeout(function () {
self.isAnimating = false;
}, 1000);
};
self.update = function () {
if (!self.isDragging && !self.isAnimating) {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Check if toy is off screen
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.markForRemoval = true;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFB6C1
});
/****
* Game Code
****/
var regularToys = [];
var specialToys = [];
var draggedToy = null;
var level = 1;
var toysCleared = 0;
var totalToysInLevel = 15;
// Create toy box background
var toyBoxBg = game.addChild(LK.getAsset('toyBox', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -300;
scoreTxt.y = 50;
// Create level display
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelTxt);
levelTxt.x = 120;
levelTxt.y = 50;
// Create progress display
var progressTxt = new Text2('Toys Left: ' + totalToysInLevel, {
size: 50,
fill: 0xFFFFFF
});
progressTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(progressTxt);
progressTxt.y = 120;
function createRegularToy() {
var toyTypes = ['regularToy1', 'regularToy2', 'regularToy3', 'regularToy4'];
var randomType = toyTypes[Math.floor(Math.random() * toyTypes.length)];
var toy = new RegularToy(randomType);
// Random position within toy box area
toy.x = 400 + Math.random() * 1200;
toy.y = 700 + Math.random() * 1000;
regularToys.push(toy);
game.addChild(toy);
}
function createSpecialToy() {
var specialTypes = ['gameController', 'cuckooClock', 'toyTruck', 'chatteringTeeth'];
var randomType = specialTypes[Math.floor(Math.random() * specialTypes.length)];
var toy = new SpecialToy(randomType);
// Random position within toy box area
toy.x = 400 + Math.random() * 1200;
toy.y = 700 + Math.random() * 1000;
specialToys.push(toy);
game.addChild(toy);
}
function initializeLevel() {
// Clear existing toys
for (var i = regularToys.length - 1; i >= 0; i--) {
regularToys[i].destroy();
}
for (var i = specialToys.length - 1; i >= 0; i--) {
specialToys[i].destroy();
}
regularToys = [];
specialToys = [];
toysCleared = 0;
totalToysInLevel = 12 + level * 3;
// Create regular toys (70% of total)
var regularCount = Math.floor(totalToysInLevel * 0.7);
for (var i = 0; i < regularCount; i++) {
createRegularToy();
}
// Create special toys (30% of total)
var specialCount = totalToysInLevel - regularCount;
for (var i = 0; i < specialCount; i++) {
createSpecialToy();
}
levelTxt.setText('Level: ' + level);
progressTxt.setText('Toys Left: ' + totalToysInLevel);
}
game.move = function (x, y, obj) {
if (draggedToy && draggedToy.isDragging) {
draggedToy.x = x;
draggedToy.y = y;
}
};
game.down = function (x, y, obj) {
// Find the topmost toy at this position
var allToys = regularToys.concat(specialToys);
for (var i = allToys.length - 1; i >= 0; i--) {
var toy = allToys[i];
var bounds = toy.getBounds();
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
draggedToy = toy;
break;
}
}
};
game.up = function (x, y, obj) {
draggedToy = null;
};
game.update = function () {
// Update regular toys
for (var i = regularToys.length - 1; i >= 0; i--) {
var toy = regularToys[i];
if (toy.markForRemoval) {
toy.destroy();
regularToys.splice(i, 1);
toysCleared++;
LK.setScore(LK.getScore() + 10);
LK.getSound('clear').play();
}
}
// Update special toys
for (var i = specialToys.length - 1; i >= 0; i--) {
var toy = specialToys[i];
if (toy.markForRemoval) {
toy.destroy();
specialToys.splice(i, 1);
toysCleared++;
LK.setScore(LK.getScore() + 25);
LK.getSound('clear').play();
}
}
// Update UI
scoreTxt.setText('Score: ' + LK.getScore());
var toysLeft = totalToysInLevel - toysCleared;
progressTxt.setText('Toys Left: ' + toysLeft);
// Check level completion
if (toysCleared >= totalToysInLevel) {
level++;
if (level > 5) {
LK.showYouWin();
} else {
initializeLevel();
}
}
// Spawn new toys occasionally to maintain challenge
if (LK.ticks % 300 === 0 && regularToys.length + specialToys.length < totalToysInLevel) {
if (Math.random() < 0.7) {
createRegularToy();
} else {
createSpecialToy();
}
}
};
// Initialize first level
initializeLevel(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var RegularToy = Container.expand(function (toyType) {
var self = Container.call(this);
var toyGraphics = self.attachAsset(toyType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isDragging = false;
self.startX = 0;
self.startY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.down = function (x, y, obj) {
self.isDragging = true;
self.startX = x;
self.startY = y;
self.velocityX = 0;
self.velocityY = 0;
};
self.up = function (x, y, obj) {
if (self.isDragging) {
var deltaX = x - self.startX;
var deltaY = y - self.startY;
self.velocityX = deltaX * 0.3;
self.velocityY = deltaY * 0.3;
self.isDragging = false;
}
};
self.update = function () {
if (!self.isDragging) {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Check if toy is off screen
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.markForRemoval = true;
}
}
};
return self;
});
var SpecialToy = Container.expand(function (toyType) {
var self = Container.call(this);
var toyGraphics = self.attachAsset(toyType, {
anchorX: 0.5,
anchorY: 0.5
});
self.toyType = toyType;
self.isDragging = false;
self.startX = 0;
self.startY = 0;
self.velocityX = 0;
self.velocityY = 0;
self.friction = 0.95;
self.isAnimating = false;
self.down = function (x, y, obj) {
if (!self.isAnimating) {
self.triggerSpecialEffect();
}
self.isDragging = true;
self.startX = x;
self.startY = y;
self.velocityX = 0;
self.velocityY = 0;
};
self.up = function (x, y, obj) {
if (self.isDragging) {
var deltaX = x - self.startX;
var deltaY = y - self.startY;
if (Math.abs(deltaX) > 20 || Math.abs(deltaY) > 20) {
self.velocityX = deltaX * 0.3;
self.velocityY = deltaY * 0.3;
}
self.isDragging = false;
}
};
self.triggerSpecialEffect = function () {
if (self.isAnimating) return;
self.isAnimating = true;
LK.setScore(LK.getScore() + 50);
scoreTxt.setText(LK.getScore());
if (self.toyType === 'gameController') {
LK.getSound('beep').play();
LK.effects.flashObject(self, 0x00FF00, 500);
} else if (self.toyType === 'cuckooClock') {
LK.getSound('cuckoo').play();
tween(self, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
easing: tween.easeOut
});
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeIn
});
} else if (self.toyType === 'toyTruck') {
LK.getSound('truck').play();
var originalX = self.x;
tween(self, {
x: self.x + 100
}, {
duration: 500,
easing: tween.easeOut
});
tween(self, {
x: originalX
}, {
duration: 500,
easing: tween.easeIn
});
} else if (self.toyType === 'chatteringTeeth') {
LK.getSound('chatter').play();
for (var i = 0; i < 6; i++) {
var delay = i * 100;
setTimeout(function () {
tween(self, {
rotation: 0.2
}, {
duration: 50
});
tween(self, {
rotation: -0.2
}, {
duration: 50
});
tween(self, {
rotation: 0
}, {
duration: 50
});
}, delay);
}
}
setTimeout(function () {
self.isAnimating = false;
}, 1000);
};
self.update = function () {
if (!self.isDragging && !self.isAnimating) {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Check if toy is off screen
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.markForRemoval = true;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFB6C1
});
/****
* Game Code
****/
var regularToys = [];
var specialToys = [];
var draggedToy = null;
var level = 1;
var toysCleared = 0;
var totalToysInLevel = 15;
// Create toy box background
var toyBoxBg = game.addChild(LK.getAsset('toyBox', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -300;
scoreTxt.y = 50;
// Create level display
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelTxt);
levelTxt.x = 120;
levelTxt.y = 50;
// Create progress display
var progressTxt = new Text2('Toys Left: ' + totalToysInLevel, {
size: 50,
fill: 0xFFFFFF
});
progressTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(progressTxt);
progressTxt.y = 120;
function createRegularToy() {
var toyTypes = ['regularToy1', 'regularToy2', 'regularToy3', 'regularToy4'];
var randomType = toyTypes[Math.floor(Math.random() * toyTypes.length)];
var toy = new RegularToy(randomType);
// Random position within toy box area
toy.x = 400 + Math.random() * 1200;
toy.y = 700 + Math.random() * 1000;
regularToys.push(toy);
game.addChild(toy);
}
function createSpecialToy() {
var specialTypes = ['gameController', 'cuckooClock', 'toyTruck', 'chatteringTeeth'];
var randomType = specialTypes[Math.floor(Math.random() * specialTypes.length)];
var toy = new SpecialToy(randomType);
// Random position within toy box area
toy.x = 400 + Math.random() * 1200;
toy.y = 700 + Math.random() * 1000;
specialToys.push(toy);
game.addChild(toy);
}
function initializeLevel() {
// Clear existing toys
for (var i = regularToys.length - 1; i >= 0; i--) {
regularToys[i].destroy();
}
for (var i = specialToys.length - 1; i >= 0; i--) {
specialToys[i].destroy();
}
regularToys = [];
specialToys = [];
toysCleared = 0;
totalToysInLevel = 12 + level * 3;
// Create regular toys (70% of total)
var regularCount = Math.floor(totalToysInLevel * 0.7);
for (var i = 0; i < regularCount; i++) {
createRegularToy();
}
// Create special toys (30% of total)
var specialCount = totalToysInLevel - regularCount;
for (var i = 0; i < specialCount; i++) {
createSpecialToy();
}
levelTxt.setText('Level: ' + level);
progressTxt.setText('Toys Left: ' + totalToysInLevel);
}
game.move = function (x, y, obj) {
if (draggedToy && draggedToy.isDragging) {
draggedToy.x = x;
draggedToy.y = y;
}
};
game.down = function (x, y, obj) {
// Find the topmost toy at this position
var allToys = regularToys.concat(specialToys);
for (var i = allToys.length - 1; i >= 0; i--) {
var toy = allToys[i];
var bounds = toy.getBounds();
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
draggedToy = toy;
break;
}
}
};
game.up = function (x, y, obj) {
draggedToy = null;
};
game.update = function () {
// Update regular toys
for (var i = regularToys.length - 1; i >= 0; i--) {
var toy = regularToys[i];
if (toy.markForRemoval) {
toy.destroy();
regularToys.splice(i, 1);
toysCleared++;
LK.setScore(LK.getScore() + 10);
LK.getSound('clear').play();
}
}
// Update special toys
for (var i = specialToys.length - 1; i >= 0; i--) {
var toy = specialToys[i];
if (toy.markForRemoval) {
toy.destroy();
specialToys.splice(i, 1);
toysCleared++;
LK.setScore(LK.getScore() + 25);
LK.getSound('clear').play();
}
}
// Update UI
scoreTxt.setText('Score: ' + LK.getScore());
var toysLeft = totalToysInLevel - toysCleared;
progressTxt.setText('Toys Left: ' + toysLeft);
// Check level completion
if (toysCleared >= totalToysInLevel) {
level++;
if (level > 5) {
LK.showYouWin();
} else {
initializeLevel();
}
}
// Spawn new toys occasionally to maintain challenge
if (LK.ticks % 300 === 0 && regularToys.length + specialToys.length < totalToysInLevel) {
if (Math.random() < 0.7) {
createRegularToy();
} else {
createSpecialToy();
}
}
};
// Initialize first level
initializeLevel();