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