/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Duck = Container.expand(function () {
var self = Container.call(this);
var duckGraphics = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
self.fed = false;
self.moveDirection = Math.random() * Math.PI * 2;
self.speed = 1 + Math.random() * 2;
self.changeDirectionTimer = 0;
self.update = function () {
if (self.fed) return;
self.changeDirectionTimer++;
if (self.changeDirectionTimer > 60) {
self.moveDirection = Math.random() * Math.PI * 2;
self.changeDirectionTimer = 0;
}
var newX = self.x + Math.cos(self.moveDirection) * self.speed;
var newY = self.y + Math.sin(self.moveDirection) * self.speed;
// Keep duck within pond bounds
if (newX < 400 || newX > 1648 || newY < 300 || newY > 1200) {
self.moveDirection += Math.PI;
} else {
self.x = newX;
self.y = newY;
}
};
self.feedDuck = function () {
if (self.fed) return;
self.fed = true;
LK.getSound('duckQuack').play();
// Happy animation
tween(duckGraphics, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300
});
tween(duckGraphics, {
alpha: 0
}, {
duration: 800,
onFinish: function onFinish() {
self.destroy();
}
});
};
self.fleeDuck = function () {
if (self.fed) return;
// Crying animation
tween(duckGraphics, {
tint: 0x0000FF
}, {
duration: 200
});
tween(self, {
x: -200,
y: -200
}, {
duration: 1000,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var Goose = Container.expand(function () {
var self = Container.call(this);
var gooseGraphics = self.attachAsset('goose', {
anchorX: 0.5,
anchorY: 0.5
});
self.visible = false;
self.arrive = function () {
self.visible = true;
self.x = 1024;
self.y = 200;
LK.getSound('gooseSound').play();
// Scare animation
tween(gooseGraphics, {
scaleX: 2,
scaleY: 2
}, {
duration: 500
});
// Make all remaining ducks flee
for (var i = 0; i < ducks.length; i++) {
if (!ducks[i].fed) {
ducks[i].fleeDuck();
}
}
// Game over after animation
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
};
return self;
});
var Seed = Container.expand(function () {
var self = Container.call(this);
var seedGraphics = self.attachAsset('seed', {
anchorX: 0.5,
anchorY: 0.5
});
self.beingDragged = false;
self.down = function (x, y, obj) {
self.beingDragged = true;
draggedSeed = self;
};
return self;
});
var SeedBag = Container.expand(function () {
var self = Container.call(this);
var bagGraphics = self.attachAsset('seedBag', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
createNewSeed(self.x, self.y);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var ducks = [];
var seeds = [];
var seedBags = [];
var draggedSeed = null;
var ducksFed = 0;
var gameTimer = 0;
var maxGameTime = 3600; // 60 seconds at 60fps
var goose = null;
// Create pond
var pond = game.addChild(LK.getAsset('pond', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 866
}));
// Create seed bags
for (var i = 0; i < 3; i++) {
var bag = game.addChild(new SeedBag());
bag.x = 400 + i * 400;
bag.y = 2400;
seedBags.push(bag);
}
// Create ducks
for (var i = 0; i < 10; i++) {
var duck = game.addChild(new Duck());
duck.x = 500 + Math.random() * 1000;
duck.y = 400 + Math.random() * 800;
ducks.push(duck);
}
// Create goose
goose = game.addChild(new Goose());
// UI Elements
var scoreText = new Text2('Ducks Fed: 0/10', {
size: 80,
fill: 0x000000
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var timerText = new Text2('Time: 60s', {
size: 60,
fill: 0xFF0000
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// Create new seed function
function createNewSeed(x, y) {
var seed = game.addChild(new Seed());
seed.x = x;
seed.y = y;
seeds.push(seed);
draggedSeed = seed;
seed.beingDragged = true;
}
// Game event handlers
game.move = function (x, y, obj) {
if (draggedSeed && draggedSeed.beingDragged) {
draggedSeed.x = x;
draggedSeed.y = y;
}
};
game.up = function (x, y, obj) {
if (draggedSeed && draggedSeed.beingDragged) {
draggedSeed.beingDragged = false;
// Check if seed is dropped on any duck
var seedDropped = false;
for (var i = 0; i < ducks.length; i++) {
if (!ducks[i].fed && draggedSeed.intersects(ducks[i])) {
ducks[i].feedDuck();
ducksFed++;
LK.getSound('feedSound').play();
seedDropped = true;
break;
}
}
// Remove seed whether it was used or not
for (var j = seeds.length - 1; j >= 0; j--) {
if (seeds[j] === draggedSeed) {
seeds[j].destroy();
seeds.splice(j, 1);
break;
}
}
draggedSeed = null;
}
};
// Main game update loop
game.update = function () {
gameTimer++;
// Update timer display
var remainingTime = Math.ceil((maxGameTime - gameTimer) / 60);
timerText.setText('Time: ' + remainingTime + 's');
// Update score display
scoreText.setText('Ducks Fed: ' + ducksFed + '/10');
// Check win condition
if (ducksFed >= 10) {
LK.showYouWin();
return;
}
// Check if goose should arrive
if (gameTimer >= maxGameTime && !goose.visible) {
goose.arrive();
}
// Clean up destroyed ducks from array
for (var i = ducks.length - 1; i >= 0; i--) {
if (ducks[i].fed && ducks[i].alpha <= 0) {
ducks.splice(i, 1);
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Duck = Container.expand(function () {
var self = Container.call(this);
var duckGraphics = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
self.fed = false;
self.moveDirection = Math.random() * Math.PI * 2;
self.speed = 1 + Math.random() * 2;
self.changeDirectionTimer = 0;
self.update = function () {
if (self.fed) return;
self.changeDirectionTimer++;
if (self.changeDirectionTimer > 60) {
self.moveDirection = Math.random() * Math.PI * 2;
self.changeDirectionTimer = 0;
}
var newX = self.x + Math.cos(self.moveDirection) * self.speed;
var newY = self.y + Math.sin(self.moveDirection) * self.speed;
// Keep duck within pond bounds
if (newX < 400 || newX > 1648 || newY < 300 || newY > 1200) {
self.moveDirection += Math.PI;
} else {
self.x = newX;
self.y = newY;
}
};
self.feedDuck = function () {
if (self.fed) return;
self.fed = true;
LK.getSound('duckQuack').play();
// Happy animation
tween(duckGraphics, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300
});
tween(duckGraphics, {
alpha: 0
}, {
duration: 800,
onFinish: function onFinish() {
self.destroy();
}
});
};
self.fleeDuck = function () {
if (self.fed) return;
// Crying animation
tween(duckGraphics, {
tint: 0x0000FF
}, {
duration: 200
});
tween(self, {
x: -200,
y: -200
}, {
duration: 1000,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var Goose = Container.expand(function () {
var self = Container.call(this);
var gooseGraphics = self.attachAsset('goose', {
anchorX: 0.5,
anchorY: 0.5
});
self.visible = false;
self.arrive = function () {
self.visible = true;
self.x = 1024;
self.y = 200;
LK.getSound('gooseSound').play();
// Scare animation
tween(gooseGraphics, {
scaleX: 2,
scaleY: 2
}, {
duration: 500
});
// Make all remaining ducks flee
for (var i = 0; i < ducks.length; i++) {
if (!ducks[i].fed) {
ducks[i].fleeDuck();
}
}
// Game over after animation
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
};
return self;
});
var Seed = Container.expand(function () {
var self = Container.call(this);
var seedGraphics = self.attachAsset('seed', {
anchorX: 0.5,
anchorY: 0.5
});
self.beingDragged = false;
self.down = function (x, y, obj) {
self.beingDragged = true;
draggedSeed = self;
};
return self;
});
var SeedBag = Container.expand(function () {
var self = Container.call(this);
var bagGraphics = self.attachAsset('seedBag', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
createNewSeed(self.x, self.y);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var ducks = [];
var seeds = [];
var seedBags = [];
var draggedSeed = null;
var ducksFed = 0;
var gameTimer = 0;
var maxGameTime = 3600; // 60 seconds at 60fps
var goose = null;
// Create pond
var pond = game.addChild(LK.getAsset('pond', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 866
}));
// Create seed bags
for (var i = 0; i < 3; i++) {
var bag = game.addChild(new SeedBag());
bag.x = 400 + i * 400;
bag.y = 2400;
seedBags.push(bag);
}
// Create ducks
for (var i = 0; i < 10; i++) {
var duck = game.addChild(new Duck());
duck.x = 500 + Math.random() * 1000;
duck.y = 400 + Math.random() * 800;
ducks.push(duck);
}
// Create goose
goose = game.addChild(new Goose());
// UI Elements
var scoreText = new Text2('Ducks Fed: 0/10', {
size: 80,
fill: 0x000000
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var timerText = new Text2('Time: 60s', {
size: 60,
fill: 0xFF0000
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// Create new seed function
function createNewSeed(x, y) {
var seed = game.addChild(new Seed());
seed.x = x;
seed.y = y;
seeds.push(seed);
draggedSeed = seed;
seed.beingDragged = true;
}
// Game event handlers
game.move = function (x, y, obj) {
if (draggedSeed && draggedSeed.beingDragged) {
draggedSeed.x = x;
draggedSeed.y = y;
}
};
game.up = function (x, y, obj) {
if (draggedSeed && draggedSeed.beingDragged) {
draggedSeed.beingDragged = false;
// Check if seed is dropped on any duck
var seedDropped = false;
for (var i = 0; i < ducks.length; i++) {
if (!ducks[i].fed && draggedSeed.intersects(ducks[i])) {
ducks[i].feedDuck();
ducksFed++;
LK.getSound('feedSound').play();
seedDropped = true;
break;
}
}
// Remove seed whether it was used or not
for (var j = seeds.length - 1; j >= 0; j--) {
if (seeds[j] === draggedSeed) {
seeds[j].destroy();
seeds.splice(j, 1);
break;
}
}
draggedSeed = null;
}
};
// Main game update loop
game.update = function () {
gameTimer++;
// Update timer display
var remainingTime = Math.ceil((maxGameTime - gameTimer) / 60);
timerText.setText('Time: ' + remainingTime + 's');
// Update score display
scoreText.setText('Ducks Fed: ' + ducksFed + '/10');
// Check win condition
if (ducksFed >= 10) {
LK.showYouWin();
return;
}
// Check if goose should arrive
if (gameTimer >= maxGameTime && !goose.visible) {
goose.arrive();
}
// Clean up destroyed ducks from array
for (var i = ducks.length - 1; i >= 0; i--) {
if (ducks[i].fed && ducks[i].alpha <= 0) {
ducks.splice(i, 1);
}
}
};