/**** 
* Classes
****/ 
var CloseButton = Container.expand(function (shopInstance) {
	var self = Container.call(this);
	self.shopInstance = shopInstance;
	var itemBg = self.attachAsset('closeButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 740,
		y: -780
	});
	self.down = function (x, y, obj) {
		shop.visible = false;
		addCustomers(dailyCustomerAmount);
	};
});
var CustomerBase = Container.expand(function () {
	var self = Container.call(this);
	var sprite = 'customer' + Math.ceil(Math.random() * 8);
	var customerGraphics = self.attachAsset(sprite, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.anchorX = 0.5;
	self.anchorY = 0.5;
	self.done = false;
	self.delay = 0;
	self.happy = false;
	self.update = function () {
		if (self.done) {
			if (self.delay-- <= 0) {
				self.x += queueSpeed * 8;
				self.y += Math.cos(LK.ticks / 2) * 15 * (Math.random() * 0.3 + 0.7);
				self.rotation += 0.05 - Math.random() * 0.1;
				if (self.happy && LK.ticks % 10 == 0) {
					createHeartExplosion(self.x, self.y - 100);
				}
				if (self.x > 2300) {
					self.destroy();
				}
			}
		}
	};
});
// Customer1 class
// EmptyGlass class
var EmptyGlass = Container.expand(function () {
	var self = Container.call(this);
	var emptyGlassGraphics = self.attachAsset('emptyGlass', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.5
	});
	/* 
	var fillGlassGraphics = self.attachAsset('emptyGlass', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 1,
		tint: '0xffff00'
	});*/
	var fullText = new Text2('0%', {
		size: 100,
		fill: "#ffffff",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300,
		anchorX: 0.5,
		anchorY: 0.5
	});
	fullText.x = -50;
	fullText.y = -50;
	self.addChild(fullText);
	self.update = function () {
		// EmptyGlass specific update logic
	};
	self.updateText = function (i) {
		fullText.setText(i + '%');
		fullText.x = -50 - fullText.width / 4;
	};
});
var GameOverBackground = Container.expand(function (shopInstance) {
	var self = Container.call(this);
	var bg = self.attachAsset('gameOverBackground', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 1024,
		y: 2732 / 2
	});
	var goText = new Text2('', {
		size: 50,
		fill: "#ffffff",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300,
		align: 'left'
	});
	var text = 'Congratulations!\nYou worked hard and finally get to enjoy summer.\You served XX drinks\You made XX $\n';
	text += 'Over XX days\n\nYour final score is XX\n\n(Click anywhere to submit your score and end the game)';
	goText.setText(text);
	goText.x = 10;
	goText.y = 500;
	self.addChild(goText);
});
// Girl class
var Girl = Container.expand(function () {
	var self = Container.call(this);
	var girlGraphics = self.attachAsset('girl', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		// Girl specific update logic
	};
});
var GreenCheckmark = Container.expand(function () {
	var self = Container.call(this);
	var checkmarkGraphics = self.attachAsset('greenCheckmark', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var Heart = Container.expand(function () {
	var self = Container.call(this);
	var heartGraphics = self.attachAsset('heart', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.vx = 0;
	self.vy = 0;
	self.lifetime = 0;
	self.delay = 0;
	self.update = function () {
		if (self.delay-- <= 0) {
			self.x += self.vx;
			self.y += self.vy;
			self.lifetime--;
			if (self.lifetime <= 0) {
				self.destroy();
			}
		}
	};
});
// Ice class
var Ice = Container.expand(function () {
	var self = Container.call(this);
	var iceGraphics = self.attachAsset('ice', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		// Ice specific update logic
	};
});
// IngredientButton class
var IngredientButton = Container.expand(function (i, k) {
	var self = Container.call(this);
	self.done = false;
	self.right = false;
	var ingredientButtonGraphics = self.attachAsset('ingredientButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.75,
		scaleY: 0.75
		//x: i * 400 //(i - item.ingredients.length / 2) * 400
	});
	var ingredientSprite = LK.getAsset('' + k, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.75,
		scaleY: 0.75
		//x: ingredientButton.x //i * 400 //(i - item.ingredients.length / 2) * 400
	});
	self.addChild(ingredientSprite);
	self.moveTo = function (targetX, targetY, duration) {
		var startX = self.x;
		var startY = self.y;
		var bezierPoints = generateBezierPoints({
			x: startX,
			y: startY
		}, {
			x: targetX,
			y: targetY
		}, {
			x: 400,
			//(startX + targetX) / 2,
			y: 200 //startY - 200
		}, {
			x: 1600,
			//(startX + targetX) / 2,
			y: 200 //targetY + 200
		}, duration * 60);
		var currentTick = 0;
		self.update = function () {
			if (currentTick < bezierPoints.length) {
				self.x = bezierPoints[currentTick].x;
				self.y = bezierPoints[currentTick].y;
				self.scale.x -= 0.003;
				self.scale.y -= 0.003;
				currentTick++;
			} else {
				self.x = targetX;
				self.y = targetY;
				// Stop updating once the target is reached
				self.update = null;
				self.done = true;
				//LK.setScore(LK.getScore() + 1);
				//scoreTxt.setText('$ ' + LK.getScore());
				emptyGlass.updateText(Math.floor(100 * currentOrderedItemCompletion / currentOrderedItemSize));
				// Check if drink is ready. (Todo: Maybe wait a second while it mixes before removing it all.)
				var countDone = 0;
				for (var i = 0; i < ingredientButtons.length; i++) {
					if (ingredientButtons[i].done) {
						countDone++;
					}
				}
				emptyGlass.updateText(Math.floor(100 * countDone / currentOrderedItemSize));
				//if (currentOrderedItemCompletion == currentOrderedItemSize && allDone) {
				if (countDone == currentOrderedItemSize) {
					// Remove emptyGlass and ingredients and replace with the drink.
					emptyGlass.destroy();
					instructionLabel.visible = false;
					createStarExplosion(emptyGlass.x - 100, emptyGlass.y);
					for (var i = 0; i < ingredientButtons.length; i++) {
						ingredientButtons[i].destroy();
					}
					ingredientButtons = [];
					// Also remove the speechBubble here.
					speechBubble.destroy();
					// But we can maybe reuse the itemSprite instead of destroying.
					itemSprite.x = 1500;
					itemSprite.y = 1400;
					itemSprite.scale.x = 2.2;
					itemSprite.scale.y = 2.2;
					// Move itemSprite to the rightmost customer and scale it down
					var rightmostCustomer = customers[0]; //customers[customers.length - 1];
					moveDrinkToCustomer(itemSprite, rightmostCustomer.x, rightmostCustomer.y, 1);
					//LK.setScore(LK.getScore() + currentOrder.price);
					coins += currentOrder.price;
					scoreTxt.setText('$ ' + coins);
					totalEarned += currentOrder.price;
					// TODO: Here a few coins should flip from customer to girl and money label be upgraded
					//customers[0].addChild(itemSprite);
					//waitCounter = 100;
					//itemSprite.destroy();
				}
			}
		};
	};
	// Event handler called when a press happens on element.
	self.down = function (x, y, obj) {
		ingredientButtonGraphics.alpha = 0;
		if (self.right) {
			currentOrderedItemCompletion++;
			// Try to move the completion status of current order to give a Y position of theingredient in the glass
			var destY = emptyGlass.y + emptyGlass.height / 2 - currentOrderedItemCompletion * 150;
			// Also try to give the X position a bit of variation / alternation.
			var destX = currentOrderedItemCompletion % 2 == 0 ? 25 : -25;
			self.moveTo(emptyGlass.x + destX, destY, 1);
			self.down = null;
		} else {
			// Show a minus $2 sign and move button down.
			var minusSign = new minusPopup();
			minusSign.x = self.x;
			minusSign.y = self.y - 200;
			coins -= 2;
			if (coins < 0) {
				coins = 0;
			}
			scoreTxt.setText('$ ' + coins);
			game.addChild(minusSign);
			self.moveDown(1024, 5000, 1);
			self.down = null;
		}
	};
	self.moveDown = function (targetX, targetY, duration) {
		var startX = self.x;
		var startY = self.y;
		var bezierPoints = generateBezierPoints({
			x: startX,
			y: startY
		}, {
			x: targetX,
			y: targetY
		}, {
			x: 1024,
			//(startX + targetX) / 2,
			y: 2000 //startY - 200
		}, {
			x: 1024,
			//(startX + targetX) / 2,
			y: 2000 //targetY + 200
		}, duration * 60);
		var currentTick = 0;
		self.update = function () {
			if (currentTick < bezierPoints.length) {
				self.x = bezierPoints[currentTick].x;
				self.y = bezierPoints[currentTick].y;
				self.scale.x -= 0.003;
				self.scale.y -= 0.003;
				currentTick++;
			} else {
				self.x = targetX;
				self.y = targetY;
				// Stop updating once the target is reached
				self.update = null;
				//self.done = true;
			}
		};
	};
});
//<Assets used in the game will automatically appear here>
// Lemon class
var Lemon = Container.expand(function () {
	var self = Container.call(this);
	var lemonGraphics = self.attachAsset('lemon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
// LemonadeStand class
var LemonadeStand = Container.expand(function () {
	var self = Container.call(this);
	var standGraphics = self.attachAsset('stand', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var ShopItem = Container.expand(function (id, price) {
	var self = Container.call(this);
	// Initialize shop item properties
	self.id = id;
	self.price = price;
	self.purchased = false;
	self.maxed = false;
	self.recipe = '';
	var itemBg = self.attachAsset('shopItemBackground', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Attach asset based on the item id
	var itemGraphic = self.attachAsset(self.id, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5
	});
	var nameTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	//orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie
	if (self.id == 'orangeJuice') {
		nameTxt.setText('Orange Juice');
		self.recipe = '- Orange\n- Ice Water';
	} else if (self.id == 'strawberryDrink') {
		nameTxt.setText('Strawberry Daiquiry');
		self.recipe = '- Strawberry\n- Sugar\n- Ice Water';
	} else if (self.id == 'watermelonDrink') {
		nameTxt.setText('Melon Slush');
		self.recipe = '- Watermelon\n- Strawberry\n- Ice Water';
	} else if (self.id == 'bananaMilkshake') {
		nameTxt.setText('Banana Milkshake');
		self.recipe = '- Banana\n- Milk\n- Ice';
	} else if (self.id == 'berriesDrink') {
		nameTxt.setText('Berries Lemonade');
		self.recipe = '- Strawberry\n- Blueberry\n- Sugar\n- Ice Water';
	} else if (self.id == 'pinaDrink') {
		nameTxt.setText('Piña Colada');
		self.recipe = '- Coconut\n- Pineapple\n- Milk';
	} else if (self.id == 'mangoLassie') {
		nameTxt.setText('Mango Lassie');
		self.recipe = '- Mango\n- Sugar\n- Milk';
	} else if (self.id == 'yacht') {
		nameTxt.setText('Dream Boat');
		self.recipe = 'Finally!\nMy dream boat\nis mine!';
	}
	//nameTxt.x = -self.width / 2;
	nameTxt.x -= nameTxt.width / 2;
	nameTxt.y = -self.height / 2 - nameTxt.height;
	self.addChild(nameTxt);
	var costTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	costTxt.setText('' + self.price);
	costTxt.x = -30;
	costTxt.y = self.height / 2 - 65;
	self.addChild(costTxt);
	var upgradeButton = self.attachAsset('upgradeButton', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	upgradeButton.scale.x = upgradeButton.scale.y = 0.9;
	upgradeButton.y = 275;
	upgradeButton.alpha = 1;
	var bTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	bTxt.setText('Buy');
	bTxt.x = -36;
	bTxt.y = self.height / 2 - 40;
	self.addChild(bTxt);
	// Method to reset the item's purchase state (optional, depending on game design)
	self.reset = function () {
		self.purchased = false;
		// Optionally, update the item's appearance to indicate it's not purchased
	};
	self.bought = function () {
		//console.log('updateCost called');
		//costTxt.destroy();
		costTxt.y += 26;
		//costTxt.fill = '#cccccc';
		costTxt.setText(self.recipe);
		costTxt.x = -costTxt.width / 2;
		upgradeButton.destroy();
		bTxt.destroy();
		self.maxed = true;
		scoreTxt.setText('$ ' + coins);
		//todo, maybe add green checkmark to indicate already owned.
		var green = new GreenCheckmark();
		green.x = 110; //self.width / 2 - green.width / 2;
		green.y = 110; //self.height / 2 - green.height / 2;
		self.addChild(green);
		dailyCustomerAmount++;
	};
});
var ShopWindow = Container.expand(function () {
	var self = Container.call(this);
	// Initialize shop window properties and background graphic
	self.items = []; // Array to hold shop items
	self.x = 1024; // Center horizontally
	self.y = 1360; //1566; // Center vertically
	self.visible = false; // Initially hidden
	self.scale.x = 1.0;
	self.scale.y = 1.0;
	// Add background graphic to shop window
	var backgroundGraphic = self.attachAsset('shopBackground', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 30,
		y: 0
	});
	// [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie]
	// 7,10,12,15,20,25,30
	self.addChild(backgroundGraphic);
	var item1 = new ShopItem('orangeJuice', 30);
	item1.x = -540;
	item1.y = -350;
	var item2 = new ShopItem('strawberryDrink', 50);
	item2.x = -180;
	item2.y = -350;
	var item3 = new ShopItem('watermelonDrink', 75);
	item3.x = 180;
	item3.y = -350;
	var item4 = new ShopItem('bananaMilkshake', 100);
	item4.x = 540;
	item4.y = -350;
	var item5 = new ShopItem('berriesDrink', 150);
	item5.x = -540;
	item5.y = 300;
	var item6 = new ShopItem('pinaDrink', 200);
	item6.x = -180;
	item6.y = 300;
	var item7 = new ShopItem('mangoLassie', 250);
	item7.x = 180;
	item7.y = 300;
	var item8 = new ShopItem('yacht', 500);
	item8.x = 540;
	item8.y = 300;
	self.addChild(item1);
	self.addChild(item2);
	self.addChild(item3);
	self.addChild(item4);
	self.addChild(item5);
	self.addChild(item6);
	self.addChild(item7);
	self.addChild(item8);
	// [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie]
	item1.down = function (x, y, obj) {
		if (coins >= item1.price && !item1.maxed) {
			coins -= item1.price;
			item1.bought();
			availableItems.push(orangeJuice);
		}
	};
	item2.down = function (x, y, obj) {
		if (coins >= item2.price && !item2.maxed) {
			coins -= item2.price;
			item2.bought();
			availableItems.push(strawberryDrink);
		}
	};
	item3.down = function (x, y, obj) {
		if (coins >= item3.price && !item3.maxed) {
			coins -= item3.price;
			item3.bought();
			availableItems.push(watermelonDrink);
		}
	};
	item4.down = function (x, y, obj) {
		if (coins >= item4.price && !item4.maxed) {
			coins -= item4.price;
			item4.bought();
			availableItems.push(bananaMilkshake);
		}
	};
	item5.down = function (x, y, obj) {
		if (coins >= item5.price && !item5.maxed) {
			coins -= item5.price;
			item5.bought();
			availableItems.push(berriesDrink);
		}
	};
	item6.down = function (x, y, obj) {
		if (coins >= item6.price && !item6.maxed) {
			coins -= item6.price;
			item6.bought();
			availableItems.push(pinaDrink);
		}
	};
	item7.down = function (x, y, obj) {
		if (coins >= item7.price && !item7.maxed) {
			coins -= item7.price;
			item7.bought();
			availableItems.push(mangoLassie);
		}
	};
	item8.down = function (x, y, obj) {
		if (coins >= item8.price && !item8.maxed) {
			coins -= item8.price;
			item8.bought();
			//availableItems.push(watermelonDrink);
			// TODO: Finally bought the yacht.
			var gob = new GameOverBackground();
			game.addChild(gob);
		}
	};
	var shopTxt = new Text2('Time to shop for new recipies', {
		size: 80,
		fill: "#ffffff",
		stroke: "#2B1700",
		strokeThickness: 10,
		align: 'center',
		weight: 800
	});
	shopTxt.anchor.set(0.5, 0.5); // Sets anchor to the center of the bottom edge of the text.
	shopTxt.y = -self.height / 2 + 720;
	self.addChild(shopTxt);
	var closeButton = new CloseButton(self);
	self.addChild(closeButton);
	self.show = function () {
		game.addChild(self);
		self.visible = true;
	};
	self.hide = function () {
		self.visible = false;
	};
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var starGraphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.vx = 0;
	self.vy = 0;
	self.lifetime = 0;
	self.update = function () {
		self.x += self.vx;
		self.y += self.vy;
		self.lifetime--;
		if (self.lifetime <= 0) {
			self.destroy();
		}
	};
});
// Sugar class
var Sugar = Container.expand(function () {
	var self = Container.call(this);
	var sugarGraphics = self.attachAsset('sugar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var earnedPopup = Container.expand(function (money) {
	var self = Container.call(this);
	var mText = new Text2('$' + money, {
		size: 90,
		fill: "#eeee33",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 800
	});
	self.addChild(mText);
	self.update = function () {
		self.y -= 8;
		if (self.y < 1000) {
			self.destroy();
		}
	};
});
var minusPopup = Container.expand(function () {
	var self = Container.call(this);
	var mText = new Text2('-2$', {
		size: 90,
		fill: "#ff3333",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 800
	});
	self.addChild(mText);
	self.update = function () {
		self.y -= 8;
		if (self.y < 1400) {
			self.destroy();
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB // Init game with sky blue background
});
/**** 
* Game Code
****/ 
var instructionTxt;
function updateCoinsText() {
	coinsTxt.setText('Star Coins: ' + coins);
}
function showMoneyEarned(x, y, money) {
	y -= 150;
	var mText = new earnedPopup(money);
	mText.x = x;
	mText.y = y;
	game.addChild(mText);
}
;
var coins = 0;
function createHeartExplosion(x, y) {
	//y -= 50;
	y -= 25 + Math.random() * 75;
	var heartCount = 1;
	var heartSpeed = 6;
	var heartLifetime = 60; // frames
	for (var i = 0; i < heartCount; i++) {
		var heart = new Heart();
		heart.x = x;
		heart.y = y; // - 30 * i;
		heart.delay = i * 6;
		var rand = Math.random() * Math.PI / 8;
		heart.rotation += Math.random() < 0.5 ? rand : -rand;
		heart.vx = (Math.random() - 0.5) * heartSpeed * 0.2;
		heart.vy = -heartSpeed; //-Math.random() * heartSpeed;
		heart.lifetime = heartLifetime;
		game.addChild(heart);
	}
}
/** 
* Creates a star explosion effect at the specified coordinates.
* 
* @param {Number} x - The x-coordinate of the explosion center.
* @param {Number} y - The y-coordinate of the explosion center.
*/ 
function createStarExplosion(x, y) {
	var starCount = 20;
	var starSpeed = 30;
	var starLifetime = 120; // frames
	for (var i = 0; i < starCount; i++) {
		var star = new Star();
		star.x = x;
		star.y = y;
		var angle = i / starCount * 2 * Math.PI;
		star.vx = starSpeed * Math.cos(angle);
		star.vy = starSpeed * Math.sin(angle);
		star.lifetime = starLifetime;
		game.addChild(star);
	}
}
function globalMoveTo() {
	self.x--;
}
;
var lemonadeStand;
var scoreTxt;
var score = 0;
var background = game.addChild(LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 1,
	scaleY: 1,
	x: 1024,
	y: 2732 / 2
}));
function easeOutBounce(x) {
	var n1 = 7.5625;
	var d1 = 2.75;
	if (x < 1 / d1) {
		return n1 * x * x;
	} else if (x < 2 / d1) {
		return n1 * (x -= 1.5 / d1) * x + 0.75;
	} else if (x < 2.5 / d1) {
		return n1 * (x -= 2.25 / d1) * x + 0.9375;
	} else {
		return n1 * (x -= 2.625 / d1) * x + 0.984375;
	}
}
;
function easeOutElastic(x) {
	//var c4 = 2 * Math.PI / 3;
	var c4 = 2 * Math.PI / .3;
	//return x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;
	//return x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;
	return x === 0 ? 0 : x === 1 ? 1 : 0.25 * Math.pow(2, -5 * x) * Math.cos((x * 10 - 0.75) * c4) + 1;
}
// Initialize game elements
function initGameElements() {
	// Create and position girl
	var girl = new Girl();
	girl.x = 2048 / 2;
	girl.y = 2732 - 1150;
	game.addChild(girl);
	// Create and position lemonade stand
	lemonadeStand = new LemonadeStand();
	lemonadeStand.x = 2048 / 2;
	lemonadeStand.y = 2732 - 1100;
	game.addChild(lemonadeStand);
	// Create and position score text
	scoreTxt = new Text2('$ 0', {
		size: 100,
		fill: "#33ee33",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300
	});
	scoreTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(scoreTxt);
}
// Update score
function updateScore() {
	scoreTxt.setText('$  ' + score);
}
// Initialize game elements
initGameElements();
var customerTypes = [CustomerBase]; //[Customer1, Customer2, Customer3, Customer4, Customer5, Customer6, Customer7, Customer8];
var customers = [];
var backgroundOverlay = game.addChild(LK.getAsset('backgroundOverlay', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 1,
	scaleY: 1,
	x: 1024,
	y: 2732 / 2
}));
var dailyCustomerAmount = 7;
addCustomers(dailyCustomerAmount);
function addCustomers(amount) {
	for (var i = 0; i < amount; i++) {
		//var t = new customerTypes[Math.floor(Math.random() * customerTypes.length)]();
		var t = new CustomerBase();
		t.y = 1800;
		t.x = 500 - 250 * i - 50;
		t.anchorY = 2;
		game.addChild(t);
		customers.push(t);
		queueUpdateCounter = 0;
		// re-add the foreground overlay
		game.addChild(backgroundOverlay);
	}
}
;
var lemonade = {
	sprite: 'lemonade',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['lemon', 'sugar', 'water'],
	price: 5
};
var orangeJuice = {
	sprite: 'orangeJuice',
	offsetX: 60,
	offsetY: -300,
	ingredients: ['orange', 'water'],
	price: 7
};
var strawberryDrink = {
	sprite: 'strawberryDrink',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['strawberry', 'sugar', 'water'],
	price: 10
};
var watermelonDrink = {
	sprite: 'watermelonDrink',
	offsetX: 45,
	offsetY: -320,
	ingredients: ['watermelon', 'strawberry', 'water'],
	price: 12
};
var bananaMilkshake = {
	sprite: 'bananaMilkshake',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['banana', 'milk', 'water'],
	price: 15
};
var berriesDrink = {
	sprite: 'berriesDrink',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['strawberry', 'blueberry', 'sugar', 'water'],
	price: 20
};
var pinaDrink = {
	sprite: 'pinaDrink',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['coconut', 'pineapple', 'milk'],
	price: 25
};
var mangoLassie = {
	sprite: 'mangoLassie',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['mango', 'sugar', 'milk'],
	price: 30
};
var allIngredients = ['orange', 'coconut', 'pineapple', 'milk', 'blueberry', 'strawberry', 'watermelon', 'banana', 'sugar', 'water'];
var lockedItems = [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie];
var availableItems = [lemonade]; //[lemonade];
var currentOrder;
var currentOrderedItemSize = 0;
var currentOrderedItemCompletion = 0;
var ingredientButtons = [];
var speechBubble;
var itemSprite;
function orderSomething(obj) {
	var item = availableItems[Math.floor(Math.random() * availableItems.length)];
	currentOrder = item; // just to have a reference in the gobal scope.
	speechBubble = LK.getAsset('speechBubble', {
		anchorX: 0.5,
		anchorY: 1,
		scaleX: 0.5,
		scaleY: 0.5,
		x: obj.x - 250,
		y: obj.y - obj.height / 2 - 50,
		rotation: 0.12,
		alpha: 0.9
	});
	game.addChild(speechBubble);
	// Add the sprite of the ordered item inside the speech bubble
	itemSprite = LK.getAsset(item.sprite, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 1,
		scaleY: 1,
		x: speechBubble.x + item.offsetX,
		y: speechBubble.y + item.offsetY
	});
	game.addChild(itemSprite);
	// Display the ingredients of the ordered item at the bottom center of the screen
	if (false) {
		currentOrderedItemCompletion = 0;
		currentOrderedItemSize = item.ingredients.length;
		for (var i = 0; i < currentOrderedItemSize; i++) {
			var ingredientButton = new IngredientButton(i, item.ingredients[i]);
			ingredientButton.x = i * 400;
			ingredientButton.y = 2732 - 500;
			game.addChild(ingredientButton);
			if (currentOrderedItemSize == 2) {
				ingredientButton.x += 800;
			} else if (currentOrderedItemSize == 3) {
				ingredientButton.x += 600;
			} else if (currentOrderedItemSize == 4) {
				ingredientButton.x += 400; // += 200;
			}
			ingredientButtons.push(ingredientButton);
		}
	} else {
		//TODO: maybe make a random or knowledge check to determine if player can make this recipe.
		// Add the normal options.
		var buttons = item.ingredients;
		// Add 1 (or more?) wrong ingredient among the options.
		var random = buttons[0];
		while (buttons.includes(random)) {
			random = allIngredients[Math.floor(Math.random() * allIngredients.length)];
		}
		var wrongIngredientButton = new IngredientButton(0, random);
		wrongIngredientButton.right = false;
		wrongIngredientButton.y = 2732 - 500;
		game.addChild(wrongIngredientButton);
		ingredientButtons.push(wrongIngredientButton);
		// Add the right buttons.
		// Let the buttons know if they're right or wrong for this recipe, so they can handle presses.
		currentOrderedItemCompletion = 0;
		currentOrderedItemSize = item.ingredients.length;
		for (var i = 0; i < currentOrderedItemSize; i++) {
			var ingredientButton = new IngredientButton(i, item.ingredients[i]);
			ingredientButton.y = 2732 - 500;
			ingredientButton.right = true;
			game.addChild(ingredientButton);
			ingredientButtons.push(ingredientButton);
		}
		//console.log('before ' + ingredientButtons[0].right);
		// Shuffle buttons using fisher-yates.
		fy(ingredientButtons, 0, 0, 0);
		// Align the buttons.
		for (var i = 0; i < ingredientButtons.length; i++) {
			var ingredientButton = ingredientButtons[i];
			ingredientButton.x = i * 400;
			if (currentOrderedItemSize == 2) {
				ingredientButton.x += 600;
			} else if (currentOrderedItemSize == 3) {
				ingredientButton.x += 400;
			} else if (currentOrderedItemSize == 4) {
				ingredientButton.x += 200; // += 200;
			}
		}
		//console.log('after ' + ingredientButtons[0].right);
		//console.table([ingredientButtons[0], ingredientButtons[1], ingredientButtons[2]], ["correct"]);
		// Display a label 'Add the 2 (or 3 or 4) right ingredient.
		instructionLabel = new Text2('Add the ' + currentOrderedItemSize + ' right ingredients.', {
			size: 100,
			fill: "#ffffff",
			stroke: '#000000',
			strokeThickness: 10,
			weight: 300,
			align: 'center'
		});
		instructionLabel.x = 1024 - instructionLabel.width / 2;
		instructionLabel.y = 2500;
		//instructionLabel.anchor.set(0.5, 0);
		game.addChild(instructionLabel);
		// How should wrong ingredient behave when pressed? Maybe move offscreen - with a -2$ sign shown in red?
	}
	// Add an empty glass
	emptyGlass = new EmptyGlass();
	game.addChild(emptyGlass);
	emptyGlass.x = 1600;
	emptyGlass.y = 1400;
}
var instructionLabel;
function fy(a, b, c, d) {
	//array,placeholder,placeholder,placeholder
	c = a.length;
	while (c) {
		b = Math.random() * c-- | 0, d = a[c], a[c] = a[b], a[b] = d;
	}
}
/** 
* Generates an array of points along a two-point Bezier curve.
* 
* @param {Object} start - The starting point of the curve {x: Number, y: Number}.
* @param {Object} end - The ending point of the curve {x: Number, y: Number}.
* @param {Object} anchor1 - The first anchor point of the curve {x: Number, y: Number}.
* @param {Object} anchor2 - The second anchor point of the curve {x: Number, y: Number}.
* @param {Number} n - The number of points to generate along the curve.
* @returns {Array} - An array of points along the Bezier curve.
*/ 
function generateBezierPoints(start, end, anchor1, anchor2, n) {
	var points = [];
	for (var i = 0; i <= n; i++) {
		var t = i / n;
		var x = Math.pow(1 - t, 3) * start.x + 3 * Math.pow(1 - t, 2) * t * anchor1.x + 3 * (1 - t) * Math.pow(t, 2) * anchor2.x + Math.pow(t, 3) * end.x;
		var y = Math.pow(1 - t, 3) * start.y + 3 * Math.pow(1 - t, 2) * t * anchor1.y + 3 * (1 - t) * Math.pow(t, 2) * anchor2.y + Math.pow(t, 3) * end.y;
		points.push({
			x: x,
			y: y
		});
	}
	return points;
}
;
var totalEarned = 0;
var coins = 1000;
var emptyGlass;
//var harvestedCounter = 0;
var queueSpeed = 3;
var queueUpdateCounter = 0;
var queueUpdateMax = 240 / queueSpeed;
var orderPlaced = false;
var waitCounter = 0;
function updateCustomers() {
	if (waitCounter-- > 0) {} else if (!shop.visible) {
		if (queueUpdateCounter < queueUpdateMax) {
			queueUpdateCounter++;
			for (var i = 0; i < customers.length; i++) {
				customers[i].x += queueSpeed;
				customers[i].y += Math.cos(LK.ticks / 2) * 15 * (Math.random() * 0.3 + 0.7);
				customers[i].rotation += 0.05 - Math.random() * 0.1;
				//customers[i].rotation += LK.ticks % 6 < 3 ? 0.05 : -0.05;
			} /*
				if (customers[i].happy && LK.ticks % 10 == 0) {
				createHeartExplosion(customers[i].x, customers[i].y - 100);
				}*/
		} else if (queueUpdateCounter >= queueUpdateMax && !orderPlaced) {
			for (var i = 0; i < customers.length; i++) {
				customers[i].rotation = 0;
				customers[i].y = 1800;
			}
			if (customers.length > 0) {
				orderSomething(customers[0]);
				orderPlaced = true;
			} else if (!shop.visible) {
				shop.show();
			}
		}
	}
}
;
var shop = new ShopWindow();
game.addChild(shop);
//game.addChild(shop);
var go = new GameOverBackground();
game.addChild(go);
game.update = function () {
	updateCustomers();
	//itemSprite.update();
};
function moveDrinkToCustomer(sprite, targetX, targetY, duration) {
	targetX += 50;
	targetY += 50;
	var startX = sprite.x;
	var startY = sprite.y;
	var startScaleX = sprite.scale.x;
	var startScaleY = sprite.scale.y;
	var endScale = 0.3;
	var bezierPoints = generateBezierPoints({
		x: startX,
		y: startY
	}, {
		x: targetX,
		y: targetY
	}, {
		x: (startX + targetX) / 2,
		y: startY - 200
	}, {
		x: (startX + targetX) / 2,
		y: targetY + 200
	}, duration * 60);
	var currentTick = 0;
	sprite.update = function () {
		if (currentTick < bezierPoints.length) {
			sprite.x = bezierPoints[currentTick].x;
			sprite.y = bezierPoints[currentTick].y;
			sprite.scale.x = startScaleX - (startScaleX - endScale) * (currentTick / bezierPoints.length);
			sprite.scale.y = startScaleY - (startScaleY - endScale) * (currentTick / bezierPoints.length);
			currentTick++;
		} else {
			sprite.x = 3000;
			sprite.y = targetY;
			sprite.scale.x = endScale;
			sprite.scale.y = endScale;
			sprite.update = null;
			//createHeartExplosion(targetX, targetY - 100);
			showMoneyEarned(targetX, targetY - 100, currentOrder.price);
			customers[0].happy = true;
			var customerDrink = LK.getAsset(currentOrder.sprite, {
				anchorX: 0.5,
				anchorY: 0.5,
				scaleX: 0.3,
				scaleY: 0.3,
				x: 50,
				y: 50
			});
			customers[0].addChild(customerDrink);
			customers[0].done = true;
			customers.splice(0, 1);
			// This causes the updateCustomers in game.update() to advance the queue.
			queueUpdateCounter = 0;
			orderPlaced = false;
		}
	};
} /**** 
* Classes
****/ 
var CloseButton = Container.expand(function (shopInstance) {
	var self = Container.call(this);
	self.shopInstance = shopInstance;
	var itemBg = self.attachAsset('closeButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 740,
		y: -780
	});
	self.down = function (x, y, obj) {
		shop.visible = false;
		addCustomers(dailyCustomerAmount);
	};
});
var CustomerBase = Container.expand(function () {
	var self = Container.call(this);
	var sprite = 'customer' + Math.ceil(Math.random() * 8);
	var customerGraphics = self.attachAsset(sprite, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.anchorX = 0.5;
	self.anchorY = 0.5;
	self.done = false;
	self.delay = 0;
	self.happy = false;
	self.update = function () {
		if (self.done) {
			if (self.delay-- <= 0) {
				self.x += queueSpeed * 8;
				self.y += Math.cos(LK.ticks / 2) * 15 * (Math.random() * 0.3 + 0.7);
				self.rotation += 0.05 - Math.random() * 0.1;
				if (self.happy && LK.ticks % 10 == 0) {
					createHeartExplosion(self.x, self.y - 100);
				}
				if (self.x > 2300) {
					self.destroy();
				}
			}
		}
	};
});
// Customer1 class
// EmptyGlass class
var EmptyGlass = Container.expand(function () {
	var self = Container.call(this);
	var emptyGlassGraphics = self.attachAsset('emptyGlass', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.5
	});
	/* 
	var fillGlassGraphics = self.attachAsset('emptyGlass', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 1,
		tint: '0xffff00'
	});*/
	var fullText = new Text2('0%', {
		size: 100,
		fill: "#ffffff",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300,
		anchorX: 0.5,
		anchorY: 0.5
	});
	fullText.x = -50;
	fullText.y = -50;
	self.addChild(fullText);
	self.update = function () {
		// EmptyGlass specific update logic
	};
	self.updateText = function (i) {
		fullText.setText(i + '%');
		fullText.x = -50 - fullText.width / 4;
	};
});
var GameOverBackground = Container.expand(function (shopInstance) {
	var self = Container.call(this);
	var bg = self.attachAsset('gameOverBackground', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 1024,
		y: 2732 / 2
	});
	var goText = new Text2('', {
		size: 50,
		fill: "#ffffff",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300,
		align: 'left'
	});
	var text = 'Congratulations!\nYou worked hard and finally get to enjoy summer.\You served XX drinks\You made XX $\n';
	text += 'Over XX days\n\nYour final score is XX\n\n(Click anywhere to submit your score and end the game)';
	goText.setText(text);
	goText.x = 10;
	goText.y = 500;
	self.addChild(goText);
});
// Girl class
var Girl = Container.expand(function () {
	var self = Container.call(this);
	var girlGraphics = self.attachAsset('girl', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		// Girl specific update logic
	};
});
var GreenCheckmark = Container.expand(function () {
	var self = Container.call(this);
	var checkmarkGraphics = self.attachAsset('greenCheckmark', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var Heart = Container.expand(function () {
	var self = Container.call(this);
	var heartGraphics = self.attachAsset('heart', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.vx = 0;
	self.vy = 0;
	self.lifetime = 0;
	self.delay = 0;
	self.update = function () {
		if (self.delay-- <= 0) {
			self.x += self.vx;
			self.y += self.vy;
			self.lifetime--;
			if (self.lifetime <= 0) {
				self.destroy();
			}
		}
	};
});
// Ice class
var Ice = Container.expand(function () {
	var self = Container.call(this);
	var iceGraphics = self.attachAsset('ice', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		// Ice specific update logic
	};
});
// IngredientButton class
var IngredientButton = Container.expand(function (i, k) {
	var self = Container.call(this);
	self.done = false;
	self.right = false;
	var ingredientButtonGraphics = self.attachAsset('ingredientButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.75,
		scaleY: 0.75
		//x: i * 400 //(i - item.ingredients.length / 2) * 400
	});
	var ingredientSprite = LK.getAsset('' + k, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.75,
		scaleY: 0.75
		//x: ingredientButton.x //i * 400 //(i - item.ingredients.length / 2) * 400
	});
	self.addChild(ingredientSprite);
	self.moveTo = function (targetX, targetY, duration) {
		var startX = self.x;
		var startY = self.y;
		var bezierPoints = generateBezierPoints({
			x: startX,
			y: startY
		}, {
			x: targetX,
			y: targetY
		}, {
			x: 400,
			//(startX + targetX) / 2,
			y: 200 //startY - 200
		}, {
			x: 1600,
			//(startX + targetX) / 2,
			y: 200 //targetY + 200
		}, duration * 60);
		var currentTick = 0;
		self.update = function () {
			if (currentTick < bezierPoints.length) {
				self.x = bezierPoints[currentTick].x;
				self.y = bezierPoints[currentTick].y;
				self.scale.x -= 0.003;
				self.scale.y -= 0.003;
				currentTick++;
			} else {
				self.x = targetX;
				self.y = targetY;
				// Stop updating once the target is reached
				self.update = null;
				self.done = true;
				//LK.setScore(LK.getScore() + 1);
				//scoreTxt.setText('$ ' + LK.getScore());
				emptyGlass.updateText(Math.floor(100 * currentOrderedItemCompletion / currentOrderedItemSize));
				// Check if drink is ready. (Todo: Maybe wait a second while it mixes before removing it all.)
				var countDone = 0;
				for (var i = 0; i < ingredientButtons.length; i++) {
					if (ingredientButtons[i].done) {
						countDone++;
					}
				}
				emptyGlass.updateText(Math.floor(100 * countDone / currentOrderedItemSize));
				//if (currentOrderedItemCompletion == currentOrderedItemSize && allDone) {
				if (countDone == currentOrderedItemSize) {
					// Remove emptyGlass and ingredients and replace with the drink.
					emptyGlass.destroy();
					instructionLabel.visible = false;
					createStarExplosion(emptyGlass.x - 100, emptyGlass.y);
					for (var i = 0; i < ingredientButtons.length; i++) {
						ingredientButtons[i].destroy();
					}
					ingredientButtons = [];
					// Also remove the speechBubble here.
					speechBubble.destroy();
					// But we can maybe reuse the itemSprite instead of destroying.
					itemSprite.x = 1500;
					itemSprite.y = 1400;
					itemSprite.scale.x = 2.2;
					itemSprite.scale.y = 2.2;
					// Move itemSprite to the rightmost customer and scale it down
					var rightmostCustomer = customers[0]; //customers[customers.length - 1];
					moveDrinkToCustomer(itemSprite, rightmostCustomer.x, rightmostCustomer.y, 1);
					//LK.setScore(LK.getScore() + currentOrder.price);
					coins += currentOrder.price;
					scoreTxt.setText('$ ' + coins);
					totalEarned += currentOrder.price;
					// TODO: Here a few coins should flip from customer to girl and money label be upgraded
					//customers[0].addChild(itemSprite);
					//waitCounter = 100;
					//itemSprite.destroy();
				}
			}
		};
	};
	// Event handler called when a press happens on element.
	self.down = function (x, y, obj) {
		ingredientButtonGraphics.alpha = 0;
		if (self.right) {
			currentOrderedItemCompletion++;
			// Try to move the completion status of current order to give a Y position of theingredient in the glass
			var destY = emptyGlass.y + emptyGlass.height / 2 - currentOrderedItemCompletion * 150;
			// Also try to give the X position a bit of variation / alternation.
			var destX = currentOrderedItemCompletion % 2 == 0 ? 25 : -25;
			self.moveTo(emptyGlass.x + destX, destY, 1);
			self.down = null;
		} else {
			// Show a minus $2 sign and move button down.
			var minusSign = new minusPopup();
			minusSign.x = self.x;
			minusSign.y = self.y - 200;
			coins -= 2;
			if (coins < 0) {
				coins = 0;
			}
			scoreTxt.setText('$ ' + coins);
			game.addChild(minusSign);
			self.moveDown(1024, 5000, 1);
			self.down = null;
		}
	};
	self.moveDown = function (targetX, targetY, duration) {
		var startX = self.x;
		var startY = self.y;
		var bezierPoints = generateBezierPoints({
			x: startX,
			y: startY
		}, {
			x: targetX,
			y: targetY
		}, {
			x: 1024,
			//(startX + targetX) / 2,
			y: 2000 //startY - 200
		}, {
			x: 1024,
			//(startX + targetX) / 2,
			y: 2000 //targetY + 200
		}, duration * 60);
		var currentTick = 0;
		self.update = function () {
			if (currentTick < bezierPoints.length) {
				self.x = bezierPoints[currentTick].x;
				self.y = bezierPoints[currentTick].y;
				self.scale.x -= 0.003;
				self.scale.y -= 0.003;
				currentTick++;
			} else {
				self.x = targetX;
				self.y = targetY;
				// Stop updating once the target is reached
				self.update = null;
				//self.done = true;
			}
		};
	};
});
//<Assets used in the game will automatically appear here>
// Lemon class
var Lemon = Container.expand(function () {
	var self = Container.call(this);
	var lemonGraphics = self.attachAsset('lemon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
// LemonadeStand class
var LemonadeStand = Container.expand(function () {
	var self = Container.call(this);
	var standGraphics = self.attachAsset('stand', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var ShopItem = Container.expand(function (id, price) {
	var self = Container.call(this);
	// Initialize shop item properties
	self.id = id;
	self.price = price;
	self.purchased = false;
	self.maxed = false;
	self.recipe = '';
	var itemBg = self.attachAsset('shopItemBackground', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Attach asset based on the item id
	var itemGraphic = self.attachAsset(self.id, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5
	});
	var nameTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	//orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie
	if (self.id == 'orangeJuice') {
		nameTxt.setText('Orange Juice');
		self.recipe = '- Orange\n- Ice Water';
	} else if (self.id == 'strawberryDrink') {
		nameTxt.setText('Strawberry Daiquiry');
		self.recipe = '- Strawberry\n- Sugar\n- Ice Water';
	} else if (self.id == 'watermelonDrink') {
		nameTxt.setText('Melon Slush');
		self.recipe = '- Watermelon\n- Strawberry\n- Ice Water';
	} else if (self.id == 'bananaMilkshake') {
		nameTxt.setText('Banana Milkshake');
		self.recipe = '- Banana\n- Milk\n- Ice';
	} else if (self.id == 'berriesDrink') {
		nameTxt.setText('Berries Lemonade');
		self.recipe = '- Strawberry\n- Blueberry\n- Sugar\n- Ice Water';
	} else if (self.id == 'pinaDrink') {
		nameTxt.setText('Piña Colada');
		self.recipe = '- Coconut\n- Pineapple\n- Milk';
	} else if (self.id == 'mangoLassie') {
		nameTxt.setText('Mango Lassie');
		self.recipe = '- Mango\n- Sugar\n- Milk';
	} else if (self.id == 'yacht') {
		nameTxt.setText('Dream Boat');
		self.recipe = 'Finally!\nMy dream boat\nis mine!';
	}
	//nameTxt.x = -self.width / 2;
	nameTxt.x -= nameTxt.width / 2;
	nameTxt.y = -self.height / 2 - nameTxt.height;
	self.addChild(nameTxt);
	var costTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	costTxt.setText('' + self.price);
	costTxt.x = -30;
	costTxt.y = self.height / 2 - 65;
	self.addChild(costTxt);
	var upgradeButton = self.attachAsset('upgradeButton', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	upgradeButton.scale.x = upgradeButton.scale.y = 0.9;
	upgradeButton.y = 275;
	upgradeButton.alpha = 1;
	var bTxt = new Text2('', {
		size: 42,
		fill: "#ffffff",
		stroke: '#2B1700',
		strokeThickness: 10
	});
	bTxt.setText('Buy');
	bTxt.x = -36;
	bTxt.y = self.height / 2 - 40;
	self.addChild(bTxt);
	// Method to reset the item's purchase state (optional, depending on game design)
	self.reset = function () {
		self.purchased = false;
		// Optionally, update the item's appearance to indicate it's not purchased
	};
	self.bought = function () {
		//console.log('updateCost called');
		//costTxt.destroy();
		costTxt.y += 26;
		//costTxt.fill = '#cccccc';
		costTxt.setText(self.recipe);
		costTxt.x = -costTxt.width / 2;
		upgradeButton.destroy();
		bTxt.destroy();
		self.maxed = true;
		scoreTxt.setText('$ ' + coins);
		//todo, maybe add green checkmark to indicate already owned.
		var green = new GreenCheckmark();
		green.x = 110; //self.width / 2 - green.width / 2;
		green.y = 110; //self.height / 2 - green.height / 2;
		self.addChild(green);
		dailyCustomerAmount++;
	};
});
var ShopWindow = Container.expand(function () {
	var self = Container.call(this);
	// Initialize shop window properties and background graphic
	self.items = []; // Array to hold shop items
	self.x = 1024; // Center horizontally
	self.y = 1360; //1566; // Center vertically
	self.visible = false; // Initially hidden
	self.scale.x = 1.0;
	self.scale.y = 1.0;
	// Add background graphic to shop window
	var backgroundGraphic = self.attachAsset('shopBackground', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 30,
		y: 0
	});
	// [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie]
	// 7,10,12,15,20,25,30
	self.addChild(backgroundGraphic);
	var item1 = new ShopItem('orangeJuice', 30);
	item1.x = -540;
	item1.y = -350;
	var item2 = new ShopItem('strawberryDrink', 50);
	item2.x = -180;
	item2.y = -350;
	var item3 = new ShopItem('watermelonDrink', 75);
	item3.x = 180;
	item3.y = -350;
	var item4 = new ShopItem('bananaMilkshake', 100);
	item4.x = 540;
	item4.y = -350;
	var item5 = new ShopItem('berriesDrink', 150);
	item5.x = -540;
	item5.y = 300;
	var item6 = new ShopItem('pinaDrink', 200);
	item6.x = -180;
	item6.y = 300;
	var item7 = new ShopItem('mangoLassie', 250);
	item7.x = 180;
	item7.y = 300;
	var item8 = new ShopItem('yacht', 500);
	item8.x = 540;
	item8.y = 300;
	self.addChild(item1);
	self.addChild(item2);
	self.addChild(item3);
	self.addChild(item4);
	self.addChild(item5);
	self.addChild(item6);
	self.addChild(item7);
	self.addChild(item8);
	// [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie]
	item1.down = function (x, y, obj) {
		if (coins >= item1.price && !item1.maxed) {
			coins -= item1.price;
			item1.bought();
			availableItems.push(orangeJuice);
		}
	};
	item2.down = function (x, y, obj) {
		if (coins >= item2.price && !item2.maxed) {
			coins -= item2.price;
			item2.bought();
			availableItems.push(strawberryDrink);
		}
	};
	item3.down = function (x, y, obj) {
		if (coins >= item3.price && !item3.maxed) {
			coins -= item3.price;
			item3.bought();
			availableItems.push(watermelonDrink);
		}
	};
	item4.down = function (x, y, obj) {
		if (coins >= item4.price && !item4.maxed) {
			coins -= item4.price;
			item4.bought();
			availableItems.push(bananaMilkshake);
		}
	};
	item5.down = function (x, y, obj) {
		if (coins >= item5.price && !item5.maxed) {
			coins -= item5.price;
			item5.bought();
			availableItems.push(berriesDrink);
		}
	};
	item6.down = function (x, y, obj) {
		if (coins >= item6.price && !item6.maxed) {
			coins -= item6.price;
			item6.bought();
			availableItems.push(pinaDrink);
		}
	};
	item7.down = function (x, y, obj) {
		if (coins >= item7.price && !item7.maxed) {
			coins -= item7.price;
			item7.bought();
			availableItems.push(mangoLassie);
		}
	};
	item8.down = function (x, y, obj) {
		if (coins >= item8.price && !item8.maxed) {
			coins -= item8.price;
			item8.bought();
			//availableItems.push(watermelonDrink);
			// TODO: Finally bought the yacht.
			var gob = new GameOverBackground();
			game.addChild(gob);
		}
	};
	var shopTxt = new Text2('Time to shop for new recipies', {
		size: 80,
		fill: "#ffffff",
		stroke: "#2B1700",
		strokeThickness: 10,
		align: 'center',
		weight: 800
	});
	shopTxt.anchor.set(0.5, 0.5); // Sets anchor to the center of the bottom edge of the text.
	shopTxt.y = -self.height / 2 + 720;
	self.addChild(shopTxt);
	var closeButton = new CloseButton(self);
	self.addChild(closeButton);
	self.show = function () {
		game.addChild(self);
		self.visible = true;
	};
	self.hide = function () {
		self.visible = false;
	};
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var starGraphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.vx = 0;
	self.vy = 0;
	self.lifetime = 0;
	self.update = function () {
		self.x += self.vx;
		self.y += self.vy;
		self.lifetime--;
		if (self.lifetime <= 0) {
			self.destroy();
		}
	};
});
// Sugar class
var Sugar = Container.expand(function () {
	var self = Container.call(this);
	var sugarGraphics = self.attachAsset('sugar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
var earnedPopup = Container.expand(function (money) {
	var self = Container.call(this);
	var mText = new Text2('$' + money, {
		size: 90,
		fill: "#eeee33",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 800
	});
	self.addChild(mText);
	self.update = function () {
		self.y -= 8;
		if (self.y < 1000) {
			self.destroy();
		}
	};
});
var minusPopup = Container.expand(function () {
	var self = Container.call(this);
	var mText = new Text2('-2$', {
		size: 90,
		fill: "#ff3333",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 800
	});
	self.addChild(mText);
	self.update = function () {
		self.y -= 8;
		if (self.y < 1400) {
			self.destroy();
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB // Init game with sky blue background
});
/**** 
* Game Code
****/ 
var instructionTxt;
function updateCoinsText() {
	coinsTxt.setText('Star Coins: ' + coins);
}
function showMoneyEarned(x, y, money) {
	y -= 150;
	var mText = new earnedPopup(money);
	mText.x = x;
	mText.y = y;
	game.addChild(mText);
}
;
var coins = 0;
function createHeartExplosion(x, y) {
	//y -= 50;
	y -= 25 + Math.random() * 75;
	var heartCount = 1;
	var heartSpeed = 6;
	var heartLifetime = 60; // frames
	for (var i = 0; i < heartCount; i++) {
		var heart = new Heart();
		heart.x = x;
		heart.y = y; // - 30 * i;
		heart.delay = i * 6;
		var rand = Math.random() * Math.PI / 8;
		heart.rotation += Math.random() < 0.5 ? rand : -rand;
		heart.vx = (Math.random() - 0.5) * heartSpeed * 0.2;
		heart.vy = -heartSpeed; //-Math.random() * heartSpeed;
		heart.lifetime = heartLifetime;
		game.addChild(heart);
	}
}
/** 
* Creates a star explosion effect at the specified coordinates.
* 
* @param {Number} x - The x-coordinate of the explosion center.
* @param {Number} y - The y-coordinate of the explosion center.
*/ 
function createStarExplosion(x, y) {
	var starCount = 20;
	var starSpeed = 30;
	var starLifetime = 120; // frames
	for (var i = 0; i < starCount; i++) {
		var star = new Star();
		star.x = x;
		star.y = y;
		var angle = i / starCount * 2 * Math.PI;
		star.vx = starSpeed * Math.cos(angle);
		star.vy = starSpeed * Math.sin(angle);
		star.lifetime = starLifetime;
		game.addChild(star);
	}
}
function globalMoveTo() {
	self.x--;
}
;
var lemonadeStand;
var scoreTxt;
var score = 0;
var background = game.addChild(LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 1,
	scaleY: 1,
	x: 1024,
	y: 2732 / 2
}));
function easeOutBounce(x) {
	var n1 = 7.5625;
	var d1 = 2.75;
	if (x < 1 / d1) {
		return n1 * x * x;
	} else if (x < 2 / d1) {
		return n1 * (x -= 1.5 / d1) * x + 0.75;
	} else if (x < 2.5 / d1) {
		return n1 * (x -= 2.25 / d1) * x + 0.9375;
	} else {
		return n1 * (x -= 2.625 / d1) * x + 0.984375;
	}
}
;
function easeOutElastic(x) {
	//var c4 = 2 * Math.PI / 3;
	var c4 = 2 * Math.PI / .3;
	//return x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;
	//return x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;
	return x === 0 ? 0 : x === 1 ? 1 : 0.25 * Math.pow(2, -5 * x) * Math.cos((x * 10 - 0.75) * c4) + 1;
}
// Initialize game elements
function initGameElements() {
	// Create and position girl
	var girl = new Girl();
	girl.x = 2048 / 2;
	girl.y = 2732 - 1150;
	game.addChild(girl);
	// Create and position lemonade stand
	lemonadeStand = new LemonadeStand();
	lemonadeStand.x = 2048 / 2;
	lemonadeStand.y = 2732 - 1100;
	game.addChild(lemonadeStand);
	// Create and position score text
	scoreTxt = new Text2('$ 0', {
		size: 100,
		fill: "#33ee33",
		stroke: '#000000',
		strokeThickness: 10,
		weight: 300
	});
	scoreTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(scoreTxt);
}
// Update score
function updateScore() {
	scoreTxt.setText('$  ' + score);
}
// Initialize game elements
initGameElements();
var customerTypes = [CustomerBase]; //[Customer1, Customer2, Customer3, Customer4, Customer5, Customer6, Customer7, Customer8];
var customers = [];
var backgroundOverlay = game.addChild(LK.getAsset('backgroundOverlay', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 1,
	scaleY: 1,
	x: 1024,
	y: 2732 / 2
}));
var dailyCustomerAmount = 7;
addCustomers(dailyCustomerAmount);
function addCustomers(amount) {
	for (var i = 0; i < amount; i++) {
		//var t = new customerTypes[Math.floor(Math.random() * customerTypes.length)]();
		var t = new CustomerBase();
		t.y = 1800;
		t.x = 500 - 250 * i - 50;
		t.anchorY = 2;
		game.addChild(t);
		customers.push(t);
		queueUpdateCounter = 0;
		// re-add the foreground overlay
		game.addChild(backgroundOverlay);
	}
}
;
var lemonade = {
	sprite: 'lemonade',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['lemon', 'sugar', 'water'],
	price: 5
};
var orangeJuice = {
	sprite: 'orangeJuice',
	offsetX: 60,
	offsetY: -300,
	ingredients: ['orange', 'water'],
	price: 7
};
var strawberryDrink = {
	sprite: 'strawberryDrink',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['strawberry', 'sugar', 'water'],
	price: 10
};
var watermelonDrink = {
	sprite: 'watermelonDrink',
	offsetX: 45,
	offsetY: -320,
	ingredients: ['watermelon', 'strawberry', 'water'],
	price: 12
};
var bananaMilkshake = {
	sprite: 'bananaMilkshake',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['banana', 'milk', 'water'],
	price: 15
};
var berriesDrink = {
	sprite: 'berriesDrink',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['strawberry', 'blueberry', 'sugar', 'water'],
	price: 20
};
var pinaDrink = {
	sprite: 'pinaDrink',
	offsetX: 25,
	offsetY: -300,
	ingredients: ['coconut', 'pineapple', 'milk'],
	price: 25
};
var mangoLassie = {
	sprite: 'mangoLassie',
	offsetX: 45,
	offsetY: -300,
	ingredients: ['mango', 'sugar', 'milk'],
	price: 30
};
var allIngredients = ['orange', 'coconut', 'pineapple', 'milk', 'blueberry', 'strawberry', 'watermelon', 'banana', 'sugar', 'water'];
var lockedItems = [orangeJuice, strawberryDrink, watermelonDrink, bananaMilkshake, berriesDrink, pinaDrink, mangoLassie];
var availableItems = [lemonade]; //[lemonade];
var currentOrder;
var currentOrderedItemSize = 0;
var currentOrderedItemCompletion = 0;
var ingredientButtons = [];
var speechBubble;
var itemSprite;
function orderSomething(obj) {
	var item = availableItems[Math.floor(Math.random() * availableItems.length)];
	currentOrder = item; // just to have a reference in the gobal scope.
	speechBubble = LK.getAsset('speechBubble', {
		anchorX: 0.5,
		anchorY: 1,
		scaleX: 0.5,
		scaleY: 0.5,
		x: obj.x - 250,
		y: obj.y - obj.height / 2 - 50,
		rotation: 0.12,
		alpha: 0.9
	});
	game.addChild(speechBubble);
	// Add the sprite of the ordered item inside the speech bubble
	itemSprite = LK.getAsset(item.sprite, {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 1,
		scaleY: 1,
		x: speechBubble.x + item.offsetX,
		y: speechBubble.y + item.offsetY
	});
	game.addChild(itemSprite);
	// Display the ingredients of the ordered item at the bottom center of the screen
	if (false) {
		currentOrderedItemCompletion = 0;
		currentOrderedItemSize = item.ingredients.length;
		for (var i = 0; i < currentOrderedItemSize; i++) {
			var ingredientButton = new IngredientButton(i, item.ingredients[i]);
			ingredientButton.x = i * 400;
			ingredientButton.y = 2732 - 500;
			game.addChild(ingredientButton);
			if (currentOrderedItemSize == 2) {
				ingredientButton.x += 800;
			} else if (currentOrderedItemSize == 3) {
				ingredientButton.x += 600;
			} else if (currentOrderedItemSize == 4) {
				ingredientButton.x += 400; // += 200;
			}
			ingredientButtons.push(ingredientButton);
		}
	} else {
		//TODO: maybe make a random or knowledge check to determine if player can make this recipe.
		// Add the normal options.
		var buttons = item.ingredients;
		// Add 1 (or more?) wrong ingredient among the options.
		var random = buttons[0];
		while (buttons.includes(random)) {
			random = allIngredients[Math.floor(Math.random() * allIngredients.length)];
		}
		var wrongIngredientButton = new IngredientButton(0, random);
		wrongIngredientButton.right = false;
		wrongIngredientButton.y = 2732 - 500;
		game.addChild(wrongIngredientButton);
		ingredientButtons.push(wrongIngredientButton);
		// Add the right buttons.
		// Let the buttons know if they're right or wrong for this recipe, so they can handle presses.
		currentOrderedItemCompletion = 0;
		currentOrderedItemSize = item.ingredients.length;
		for (var i = 0; i < currentOrderedItemSize; i++) {
			var ingredientButton = new IngredientButton(i, item.ingredients[i]);
			ingredientButton.y = 2732 - 500;
			ingredientButton.right = true;
			game.addChild(ingredientButton);
			ingredientButtons.push(ingredientButton);
		}
		//console.log('before ' + ingredientButtons[0].right);
		// Shuffle buttons using fisher-yates.
		fy(ingredientButtons, 0, 0, 0);
		// Align the buttons.
		for (var i = 0; i < ingredientButtons.length; i++) {
			var ingredientButton = ingredientButtons[i];
			ingredientButton.x = i * 400;
			if (currentOrderedItemSize == 2) {
				ingredientButton.x += 600;
			} else if (currentOrderedItemSize == 3) {
				ingredientButton.x += 400;
			} else if (currentOrderedItemSize == 4) {
				ingredientButton.x += 200; // += 200;
			}
		}
		//console.log('after ' + ingredientButtons[0].right);
		//console.table([ingredientButtons[0], ingredientButtons[1], ingredientButtons[2]], ["correct"]);
		// Display a label 'Add the 2 (or 3 or 4) right ingredient.
		instructionLabel = new Text2('Add the ' + currentOrderedItemSize + ' right ingredients.', {
			size: 100,
			fill: "#ffffff",
			stroke: '#000000',
			strokeThickness: 10,
			weight: 300,
			align: 'center'
		});
		instructionLabel.x = 1024 - instructionLabel.width / 2;
		instructionLabel.y = 2500;
		//instructionLabel.anchor.set(0.5, 0);
		game.addChild(instructionLabel);
		// How should wrong ingredient behave when pressed? Maybe move offscreen - with a -2$ sign shown in red?
	}
	// Add an empty glass
	emptyGlass = new EmptyGlass();
	game.addChild(emptyGlass);
	emptyGlass.x = 1600;
	emptyGlass.y = 1400;
}
var instructionLabel;
function fy(a, b, c, d) {
	//array,placeholder,placeholder,placeholder
	c = a.length;
	while (c) {
		b = Math.random() * c-- | 0, d = a[c], a[c] = a[b], a[b] = d;
	}
}
/** 
* Generates an array of points along a two-point Bezier curve.
* 
* @param {Object} start - The starting point of the curve {x: Number, y: Number}.
* @param {Object} end - The ending point of the curve {x: Number, y: Number}.
* @param {Object} anchor1 - The first anchor point of the curve {x: Number, y: Number}.
* @param {Object} anchor2 - The second anchor point of the curve {x: Number, y: Number}.
* @param {Number} n - The number of points to generate along the curve.
* @returns {Array} - An array of points along the Bezier curve.
*/ 
function generateBezierPoints(start, end, anchor1, anchor2, n) {
	var points = [];
	for (var i = 0; i <= n; i++) {
		var t = i / n;
		var x = Math.pow(1 - t, 3) * start.x + 3 * Math.pow(1 - t, 2) * t * anchor1.x + 3 * (1 - t) * Math.pow(t, 2) * anchor2.x + Math.pow(t, 3) * end.x;
		var y = Math.pow(1 - t, 3) * start.y + 3 * Math.pow(1 - t, 2) * t * anchor1.y + 3 * (1 - t) * Math.pow(t, 2) * anchor2.y + Math.pow(t, 3) * end.y;
		points.push({
			x: x,
			y: y
		});
	}
	return points;
}
;
var totalEarned = 0;
var coins = 1000;
var emptyGlass;
//var harvestedCounter = 0;
var queueSpeed = 3;
var queueUpdateCounter = 0;
var queueUpdateMax = 240 / queueSpeed;
var orderPlaced = false;
var waitCounter = 0;
function updateCustomers() {
	if (waitCounter-- > 0) {} else if (!shop.visible) {
		if (queueUpdateCounter < queueUpdateMax) {
			queueUpdateCounter++;
			for (var i = 0; i < customers.length; i++) {
				customers[i].x += queueSpeed;
				customers[i].y += Math.cos(LK.ticks / 2) * 15 * (Math.random() * 0.3 + 0.7);
				customers[i].rotation += 0.05 - Math.random() * 0.1;
				//customers[i].rotation += LK.ticks % 6 < 3 ? 0.05 : -0.05;
			} /*
				if (customers[i].happy && LK.ticks % 10 == 0) {
				createHeartExplosion(customers[i].x, customers[i].y - 100);
				}*/
		} else if (queueUpdateCounter >= queueUpdateMax && !orderPlaced) {
			for (var i = 0; i < customers.length; i++) {
				customers[i].rotation = 0;
				customers[i].y = 1800;
			}
			if (customers.length > 0) {
				orderSomething(customers[0]);
				orderPlaced = true;
			} else if (!shop.visible) {
				shop.show();
			}
		}
	}
}
;
var shop = new ShopWindow();
game.addChild(shop);
//game.addChild(shop);
var go = new GameOverBackground();
game.addChild(go);
game.update = function () {
	updateCustomers();
	//itemSprite.update();
};
function moveDrinkToCustomer(sprite, targetX, targetY, duration) {
	targetX += 50;
	targetY += 50;
	var startX = sprite.x;
	var startY = sprite.y;
	var startScaleX = sprite.scale.x;
	var startScaleY = sprite.scale.y;
	var endScale = 0.3;
	var bezierPoints = generateBezierPoints({
		x: startX,
		y: startY
	}, {
		x: targetX,
		y: targetY
	}, {
		x: (startX + targetX) / 2,
		y: startY - 200
	}, {
		x: (startX + targetX) / 2,
		y: targetY + 200
	}, duration * 60);
	var currentTick = 0;
	sprite.update = function () {
		if (currentTick < bezierPoints.length) {
			sprite.x = bezierPoints[currentTick].x;
			sprite.y = bezierPoints[currentTick].y;
			sprite.scale.x = startScaleX - (startScaleX - endScale) * (currentTick / bezierPoints.length);
			sprite.scale.y = startScaleY - (startScaleY - endScale) * (currentTick / bezierPoints.length);
			currentTick++;
		} else {
			sprite.x = 3000;
			sprite.y = targetY;
			sprite.scale.x = endScale;
			sprite.scale.y = endScale;
			sprite.update = null;
			//createHeartExplosion(targetX, targetY - 100);
			showMoneyEarned(targetX, targetY - 100, currentOrder.price);
			customers[0].happy = true;
			var customerDrink = LK.getAsset(currentOrder.sprite, {
				anchorX: 0.5,
				anchorY: 0.5,
				scaleX: 0.3,
				scaleY: 0.3,
				x: 50,
				y: 50
			});
			customers[0].addChild(customerDrink);
			customers[0].done = true;
			customers.splice(0, 1);
			// This causes the updateCustomers in game.update() to advance the queue.
			queueUpdateCounter = 0;
			orderPlaced = false;
		}
	};
}
:quality(85)/https://cdn.frvr.ai/667efc2fdd6f02985af5bd9a.png%3F3) 
 A beautiful scenery looking out to sea from an empty beach side promenade on a bright summer day. Happy game illustration style for a casual family friendly game.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/667f00c2dd6f02985af5bdc0.png%3F3) 
 remove the glass and the crate of lemons from the table.
:quality(85)/https://cdn.frvr.ai/667f0287dd6f02985af5bdd5.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/667f0627dd6f02985af5bde8.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/667f06e2dd6f02985af5bdf8.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/667f0b6add6f02985af5be1e.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/667f0e42dd6f02985af5be4f.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/667f0f8cdd6f02985af5be60.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/668288326b731bccb12bcc8a.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66828f506b731bccb12bccc5.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6682b4626b731bccb12bcd4e.png%3F3) 
 A simple, elegant white speech bubble.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682b7486b731bccb12bcd95.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6682c3006b731bccb12bcdb4.png%3F3) 
 A lemon with a few slices cut off.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682c3cd6b731bccb12bcdc9.png%3F3) 
 A bag of white sugar, open and with a pile of the sugar in front of it.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682c5166b731bccb12bcdd5.png%3F3) 
 A pitcher full of nice fresh water and ice cubes.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682c86e6b731bccb12bcdf8.png%3F3) 
 A round white button for an interface element.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682d87a6b731bccb12bce64.png%3F3) 
 An empty drinking glass.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6682f804e7b74e71994abe78.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6682f8dde7b74e71994abe89.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66914dc5eff5a64841efdace.png%3F3) 
 A yellow star. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66915238eff5a64841efdb21.png%3F3) 
 A red heart. simple.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692cb3f27f215e5f0eb6827.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6692cc0827f215e5f0eb6839.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6692cca427f215e5f0eb684f.png%3F3) 
 A nice glass of watermelon and strawberry slushice. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692cdd427f215e5f0eb687e.png%3F3) 
 A nice glass of banana milkshake. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692cfbc27f215e5f0eb68a8.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6692d05e27f215e5f0eb68b1.png%3F3) 
 A nice glass of pina colada. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692d19e27f215e5f0eb68ca.png%3F3) 
 A nice glass of mango lassie. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692d20d27f215e5f0eb68d4.png%3F3) 
 An orange. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692d73d27f215e5f0eb68e9.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6692d77127f215e5f0eb68f2.png%3F3) 
 A couple of blueberries. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692d9a427f215e5f0eb6935.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6692d9e827f215e5f0eb693f.png%3F3) 
 A couple of bananas. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692da5e27f215e5f0eb6955.png%3F3) 
 A bottle of milk. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692dba227f215e5f0eb6982.png%3F3) 
 A watermelon and some pieces of watermelon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692dc6b27f215e5f0eb6998.png%3F3) 
 A mango and a few slices of mango. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6692e48427f215e5f0eb6a29.png%3F3) 
 A pineapple with a few slices of pineapple in front. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66936acd27f215e5f0eb6aa6.png%3F3) 
 A fullscreen background gui element for an in-game shop. It should be mostly blanks space, but along the edges there could be some structure or decorative vines and items, mostly related to fruits, berries, cocktails in a summer theme.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66936f4a27f215e5f0eb6ad9.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/669372b227f215e5f0eb6b14.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/669398a627f215e5f0eb6b55.png%3F3) 
 A modern dream of a sailing boat. game illustration.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6693a05727f215e5f0eb6b98.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6693a82a27f215e5f0eb6bd6.png%3F3) 
 A bold green checkmark.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6693ea2827f215e5f0eb6c7b.png%3F3) 
 An idyllic llustration of a beach cove where a blnd girl in a strawhat i en joying an enormous strawberry drink on her sailing boat as the sun sets. Clean game art illustration style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6693efa727f215e5f0eb6cba.png%3F3) 
 An idyllic llustration of a beach cove where a blond girl in a straw hat is enjoying an large strawberry drink on the deck of her sailing boat as the sun sets. Clean game illustration style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.