/**** * 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);
}
}
};