/**** * Classes ****/ // Customer class var Customer = Container.expand(function () { var self = Container.call(this); var customerAssets = ['customer', 'customer2', 'customer3', 'customer4']; var randomCustomerAsset = customerAssets[Math.floor(Math.random() * customerAssets.length)]; var customerGraphics = self.attachAsset(randomCustomerAsset, { anchorX: 0.5, anchorY: 0.5 }); var shadow = self.attachAsset('shadow', { anchorX: 0.5, anchorY: 0 }); shadow.y = customerGraphics.height / 2; shadow.alpha = 0.5; self.orderBubble = null; self.gaugeBar = null; self.moveToPosition = function (x, y) { var distance = Math.sqrt(Math.pow(self.x - x, 2) + Math.pow(self.y - y, 2)); var speed = distance / 120; // 60 frames per second var dx = (x - self.x) / distance * speed; var dy = (y - self.y) / distance * speed; self.update = function () { if (Math.abs(self.x - x) > speed || Math.abs(self.y - y) > speed) { self.x += dx; self.y += dy; self.orderBubble.visible = false; } else { self.x = x; self.y = y; self.orderBubble.alpha = 0; LK.setTimeout(function () { self.orderBubble.visible = true; var fadeInInterval = LK.setInterval(function () { if (self.orderBubble.alpha < 1) { self.orderBubble.alpha += 0.1; } if (self.orderBubble.alpha >= 1) { self.orderBubble.alpha = 1; LK.clearInterval(fadeInInterval); } }, 100); }, 500); self.update = function () { // Add small up and down movement to the customers self.y += Math.sin(LK.ticks / 10) * 0.5; shadow.y = customerGraphics.height / 2; }; } }; }; self.setOrder = function (order) { if (self.orderBubble) { self.removeChild(self.orderBubble); } // Filter the order to only include items available in the current level self.order = Array.isArray(order) ? order.filter(function (item) { return currentLevel.items.includes(item); }) : [order]; // Ensure that all customers have at least one item in their order if (self.order.length === 0) { self.order.push(currentLevel.items[Math.floor(Math.random() * currentLevel.items.length)]); } self.orderBubble = new OrderBubble(self.order); self.orderBubble.x = 0; self.orderBubble.y = -self.height / 2 - self.orderBubble.height / 2; if (!self.orderBubble.visible) { self.orderBubble.visible = false; // Hide order bubble on game start } self.addChild(self.orderBubble); self.update = function () { // Add small up and down movement to the customers self.y += Math.sin(LK.ticks / 10) * 0.5; }; }; self.getOrder = function () { return self.order; }; self.on('down', function (x, y, obj) { LK.getSound('tap').play(); if (self.orderBubble && !self.orderBubble.visible) { self.orderBubble.visible = true; } if (selectedItem && self.order.includes(selectedItem.getType())) { // Dim the item in the order bubble if (self.orderBubble.orderAsset1 && self.orderBubble.orderAsset1.type === selectedItem.getType()) { self.orderBubble.orderAsset1.alpha = 0.5; LK.setScore(LK.getScore() + 5); // Add 5 points for delivering an item scoreTxt.setText(LK.getScore()); } if (self.orderBubble.orderAsset2 && self.orderBubble.orderAsset2.type === selectedItem.getType()) { self.orderBubble.orderAsset2.alpha = 0.5; score += 5; // Add 5 points for delivering an item scoreTxt.setText(score); } // Check if the order is fulfilled checkOrderFulfillment(self); } }); }); // Item class var Item = Container.expand(function (type) { var self = Container.call(this); var itemGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.getType = function () { return self.type; }; self.alpha = 0.3; // Start items as dimmed self.on('down', function (x, y, obj) { LK.getSound('tap').play(); if (selectedItem) { selectedItem.scaleX = 1; selectedItem.scaleY = 1; selectedItem.alpha = 0.3; // Dim the previously selected item } selectedItem = self; console.log("Item selected:", self.type); self.scaleX = 1.2; self.scaleY = 1.2; self.alpha = 1; // Undim the selected item }); }); // OrderBubble class var OrderBubble = Container.expand(function (order) { var self = Container.call(this); var bubbleGraphics = self.attachAsset('bubble', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 // Set transparency to 50% }); self.order = order; if (Array.isArray(order)) { if (order.length > 0) { self.orderAsset1 = self.attachAsset(order[0], { anchorX: 0.5, anchorY: 0.5 }); self.orderAsset1.type = order[0]; self.orderAsset1.x = order.length > 1 ? -60 : 0; self.orderAsset1.y -= 20; } if (order.length > 1) { self.orderAsset2 = self.attachAsset(order[1], { anchorX: 0.5, anchorY: 0.5 }); self.orderAsset2.type = order[1]; self.orderAsset2.x = 60; self.orderAsset2.y -= 20; } } else { self.orderAsset = self.attachAsset(order, { anchorX: 0.5, anchorY: 0.5 }); self.orderAsset.x = 0; self.orderAsset.y -= 20; } }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Init game with a sky blue background }); /**** * Game Code ****/ // Play intro music on game start var intromusic = LK.getSound('intromusic'); intromusic.play(); LK.on('tick', function () { if (!intromusic.isPlaying) { intromusic.play(); } }); var sun = LK.getAsset('sun', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 + (Math.random() * 1200 - 600), y: 500 }); game.addChildAt(sun, 0); var gaugeBar = LK.getAsset('gaugeBar', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 170 }); var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(background); var backgroundTop = LK.getAsset('backgroundTop', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 0, alpha: 0.5 // Set transparency to 50% }); game.addChild(backgroundTop); var backgroundBottom = LK.getAsset('backgroundBottom', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2732, alpha: 0.5 // Set transparency to 50% }); game.addChild(backgroundBottom); game.addChild(gaugeBar); // Level class //<Assets used in the game will automatically appear here> // Initialize arrays and variables var Level = function Level(levelNumber, customerCount, items) { this.levelNumber = levelNumber; this.customerCount = customerCount; this.items = items; }; var selectedItem = null; // Variable to track the currently selected item var currentLevel = null; // Variable to track the current level var customers = []; var items = []; var inventory = []; // Inventory array to hold all items from the bar var score = 0; var scoreTxt = new Text2('0', { size: 90, fill: "#ffffff", stroke: "#000000", strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('LVL 1', { size: 80, fill: "#ffffff", stroke: "#000000", strokeThickness: 5 }); levelTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(levelTxt); var timerTxt = new Text2('Time: 60', { size: 80, fill: "#ffffff", stroke: "#000000", strokeThickness: 5 }); timerTxt.anchor.set(1, 0); LK.gui.topRight.addChild(timerTxt); // Function to check if all items of an order are delivered function checkOrderFulfillment(customer) { // Check if all items are dimmed var allDimmed = true; if (customer.orderBubble.orderAsset1 && customer.orderBubble.orderAsset1.alpha === 1) { allDimmed = false; } if (customer.orderBubble.orderAsset2 && customer.orderBubble.orderAsset2.alpha === 1) { allDimmed = false; } if (allDimmed) { LK.getSound('ordercomplete').play(); // Increase score only if it hasn't been increased for this customer if (!customer.scoreAdded) { LK.setScore(LK.getScore() + 10); scoreTxt.setText(LK.getScore()); customer.scoreAdded = true; // Mark that score has been added for this customer } // Spin the customer on its axis var spinInterval = LK.setInterval(function () { customer.rotation += 0.1; }, 16.67); // Approximately 60 FPS // Wait for one second and then destroy the customer and order bubble LK.setTimeout(function () { LK.clearInterval(spinInterval); customer.destroy(); customer.orderBubble.destroy(); }, 1000); } } // Function to create a new customer function createCustomer() { if (customers.length >= currentLevel.customerCount) { return; } var customer = new Customer(); var safeDistance = 800; // Minimum distance between customers var validPosition = false; while (!validPosition) { customer.x = Math.random() * (2048 * 0.8) + 2048 * 0.1; // Spawn customers within the middle 80% of the screen customer.y = Math.random() * (2200 - 646.4) + 646.4; validPosition = true; for (var i = 0; i < customers.length; i++) { var distance = Math.sqrt(Math.pow(customers[i].x - customer.x, 2) + Math.pow(customers[i].y - customer.y, 2)); if (distance < safeDistance) { validPosition = false; break; } } } var order = ['towel', 'umbrella', 'refreshment', 'snack'].sort(function () { return 0.5 - Math.random(); }).slice(0, Math.floor(Math.random() * 2) + 1); customer.setOrder(order); customers.push(customer); customer.rotation = 0; game.addChild(customer); customer.x = Math.random() < 0.5 ? -200 : 2048 + 200; // Spawn customers from left or right side of the screen customer.y = Math.random() * (2200 - 646.4) + 646.4; customer.moveToPosition(Math.random() * (2048 * 0.8) + 2048 * 0.1, Math.random() * (2200 - 646.4) + 646.4); } // Function to create a new item function createItem(type, x, y) { if (!currentLevel.items.includes(type)) { return; } var item = items.find(function (i) { return i.type === type; }); if (item) { item.x = x; item.y = y; item.visible = true; } else { item = new Item(type); item.x = x; item.y = y; item.width = 260; // Increase width by 30% item.height = 260; // Increase height by 30% items.push(item); inventory.push(item); // Add item to inventory array item.visible = true; // Show item on game start game.addChild(item); } } // Initialize level data var levels = [new Level(1, 3, ['towel', 'umbrella']), new Level(2, 4, ['towel', 'umbrella', 'refreshment']), new Level(3, 5, ['towel', 'umbrella', 'snack']), new Level(4, 6, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(5, 7, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(6, 8, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(7, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(8, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(9, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(10, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(11, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(12, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(13, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(14, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(15, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(16, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(17, 9, ['towel', 'umbrella', 'refreshment', 'snack'])]; currentLevel = levels[0]; // Create initial customers one by one ensuring safe distance function createInitialCustomers() { for (var i = 0; i < currentLevel.customerCount; i++) { createCustomer(); } // Create 3 palm trees at random positions at the top of the screen for (var i = 0; i < 3; i++) { createPalmTree(); } } createInitialCustomers(); // Function to create a palm tree at a random position at the top of the screen function createPalmTree() { var palmTree = LK.getAsset('palmTree', { anchorX: 0.5, anchorY: 1, // Set anchorY to 1 to keep the bottom fixed x: Math.random() * 2048, y: 800 + (Math.random() * 200 - 100) }); game.addChild(palmTree); // Add rotation effect to palm tree palmTree.update = function () { palmTree.rotation = Math.sin(LK.ticks / 100) * 0.1; // Slight rotation effect }; } // Update function game.update = function () { levelTxt.setText('LVL ' + currentLevel.levelNumber); // Timer countdown logic if (!game.startTime) { game.startTime = Date.now(); } var elapsedTime = Math.floor((Date.now() - game.startTime) / 1000); var baseTime = 20; if (currentLevel.levelNumber > 7) { baseTime -= currentLevel.levelNumber - 7; } var remainingTime = baseTime - elapsedTime; gaugeBar.width -= 2048 / 20 / 60; // Smoothly decrease the gauge bar width over time // Calculate the percentage of the gauge bar remaining var gaugePercentage = gaugeBar.width / 2100 * 100; // Change the tint of the gauge bar based on the percentage if (gaugePercentage > 60) { gaugeBar.tint = 0x66FF66; // Soft Green } else if (gaugePercentage > 20) { gaugeBar.tint = 0xFFFF66; // Soft Yellow } else { gaugeBar.tint = 0xFF6666; // Soft Red } timerTxt.setText('Time: ' + Math.max(remainingTime, 0)); if (remainingTime <= 0) { remainingTime = 0; game.down = null; game.up = null; game.move = null; for (var i = 0; i < customers.length; i++) { customers[i].off('down'); } for (var i = 0; i < items.length; i++) { items[i].off('down'); } var timesupAsset = LK.getAsset('timesup', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(timesupAsset); gaugeBar.destroy(); LK.getSound('gameover').play(); LK.setTimeout(function () { game.removeChild(timesupAsset); LK.showGameOver(); }, 2000); return; } // Check if all orders are fulfilled var allOrdersFulfilled = true; for (var i = 0; i < customers.length; i++) { if (customers[i].orderBubble.orderAsset1 && customers[i].orderBubble.orderAsset1.alpha === 1) { allOrdersFulfilled = false; break; } if (customers[i].orderBubble.orderAsset2 && customers[i].orderBubble.orderAsset2.alpha === 1) { allOrdersFulfilled = false; break; } } // If all orders are fulfilled, move to the next level if (allOrdersFulfilled) { var nextLevelIndex = levels.indexOf(currentLevel) + 1; if (nextLevelIndex < levels.length) { // Show levelup asset var levelupAsset = LK.getAsset('levelup', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(levelupAsset); LK.getSound('nextlevel').play(); // Stop the timer and gaugeBar game.startTime = null; gaugeBar.width = 0; LK.setTimeout(function () { game.removeChild(levelupAsset); }, 500); // Show for 2 seconds LK.setTimeout(function () { currentLevel = levels[nextLevelIndex]; // Reset timer for the new level game.startTime = Date.now(); // Clear current customers for (var i = 0; i < customers.length; i++) { customers[i].destroy(); } customers = []; // Hide current items instead of destroying them for (var i = 0; i < items.length; i++) { items[i].visible = false; } // Reset gaugeBar width and tint for the new level gaugeBar.width = 2100; gaugeBar.tint = 0x00FF00; // Reset to green // Create new customers and items for the next level for (var i = 0; i < currentLevel.customerCount; i++) { createCustomer(); } var totalItems = currentLevel.items.length; var totalItems = currentLevel.items.length; var spacing = (2048 - totalItems * 260) / (totalItems + 1); for (var i = 0; i < totalItems; i++) { createItem(currentLevel.items[i], spacing + i * (260 + spacing) + 130, 2732 - 200); } }, 1000); } } else if (LK.ticks % 300 == 0) { createCustomer(); } }; // Create initial items var totalItems = currentLevel.items.length; var spacing = (2048 - totalItems * 260) / (totalItems + 1); for (var i = 0; i < totalItems; i++) { createItem(currentLevel.items[i], spacing + i * (260 + spacing) + 130, 2732 - 200); } var backgroundBottom = LK.getAsset('backgroundBottom', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2732 }); game.addChildAt(backgroundBottom, 0); var backgroundTop = LK.getAsset('backgroundTop', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 0 }); game.addChildAt(backgroundTop, 0); // Update palm trees rotation for (var i = 0; i < game.children.length; i++) { if (game.children[i].update) { game.children[i].update(); } }
/****
* Classes
****/
// Customer class
var Customer = Container.expand(function () {
var self = Container.call(this);
var customerAssets = ['customer', 'customer2', 'customer3', 'customer4'];
var randomCustomerAsset = customerAssets[Math.floor(Math.random() * customerAssets.length)];
var customerGraphics = self.attachAsset(randomCustomerAsset, {
anchorX: 0.5,
anchorY: 0.5
});
var shadow = self.attachAsset('shadow', {
anchorX: 0.5,
anchorY: 0
});
shadow.y = customerGraphics.height / 2;
shadow.alpha = 0.5;
self.orderBubble = null;
self.gaugeBar = null;
self.moveToPosition = function (x, y) {
var distance = Math.sqrt(Math.pow(self.x - x, 2) + Math.pow(self.y - y, 2));
var speed = distance / 120; // 60 frames per second
var dx = (x - self.x) / distance * speed;
var dy = (y - self.y) / distance * speed;
self.update = function () {
if (Math.abs(self.x - x) > speed || Math.abs(self.y - y) > speed) {
self.x += dx;
self.y += dy;
self.orderBubble.visible = false;
} else {
self.x = x;
self.y = y;
self.orderBubble.alpha = 0;
LK.setTimeout(function () {
self.orderBubble.visible = true;
var fadeInInterval = LK.setInterval(function () {
if (self.orderBubble.alpha < 1) {
self.orderBubble.alpha += 0.1;
}
if (self.orderBubble.alpha >= 1) {
self.orderBubble.alpha = 1;
LK.clearInterval(fadeInInterval);
}
}, 100);
}, 500);
self.update = function () {
// Add small up and down movement to the customers
self.y += Math.sin(LK.ticks / 10) * 0.5;
shadow.y = customerGraphics.height / 2;
};
}
};
};
self.setOrder = function (order) {
if (self.orderBubble) {
self.removeChild(self.orderBubble);
}
// Filter the order to only include items available in the current level
self.order = Array.isArray(order) ? order.filter(function (item) {
return currentLevel.items.includes(item);
}) : [order];
// Ensure that all customers have at least one item in their order
if (self.order.length === 0) {
self.order.push(currentLevel.items[Math.floor(Math.random() * currentLevel.items.length)]);
}
self.orderBubble = new OrderBubble(self.order);
self.orderBubble.x = 0;
self.orderBubble.y = -self.height / 2 - self.orderBubble.height / 2;
if (!self.orderBubble.visible) {
self.orderBubble.visible = false; // Hide order bubble on game start
}
self.addChild(self.orderBubble);
self.update = function () {
// Add small up and down movement to the customers
self.y += Math.sin(LK.ticks / 10) * 0.5;
};
};
self.getOrder = function () {
return self.order;
};
self.on('down', function (x, y, obj) {
LK.getSound('tap').play();
if (self.orderBubble && !self.orderBubble.visible) {
self.orderBubble.visible = true;
}
if (selectedItem && self.order.includes(selectedItem.getType())) {
// Dim the item in the order bubble
if (self.orderBubble.orderAsset1 && self.orderBubble.orderAsset1.type === selectedItem.getType()) {
self.orderBubble.orderAsset1.alpha = 0.5;
LK.setScore(LK.getScore() + 5); // Add 5 points for delivering an item
scoreTxt.setText(LK.getScore());
}
if (self.orderBubble.orderAsset2 && self.orderBubble.orderAsset2.type === selectedItem.getType()) {
self.orderBubble.orderAsset2.alpha = 0.5;
score += 5; // Add 5 points for delivering an item
scoreTxt.setText(score);
}
// Check if the order is fulfilled
checkOrderFulfillment(self);
}
});
});
// Item class
var Item = Container.expand(function (type) {
var self = Container.call(this);
var itemGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.getType = function () {
return self.type;
};
self.alpha = 0.3; // Start items as dimmed
self.on('down', function (x, y, obj) {
LK.getSound('tap').play();
if (selectedItem) {
selectedItem.scaleX = 1;
selectedItem.scaleY = 1;
selectedItem.alpha = 0.3; // Dim the previously selected item
}
selectedItem = self;
console.log("Item selected:", self.type);
self.scaleX = 1.2;
self.scaleY = 1.2;
self.alpha = 1; // Undim the selected item
});
});
// OrderBubble class
var OrderBubble = Container.expand(function (order) {
var self = Container.call(this);
var bubbleGraphics = self.attachAsset('bubble', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5 // Set transparency to 50%
});
self.order = order;
if (Array.isArray(order)) {
if (order.length > 0) {
self.orderAsset1 = self.attachAsset(order[0], {
anchorX: 0.5,
anchorY: 0.5
});
self.orderAsset1.type = order[0];
self.orderAsset1.x = order.length > 1 ? -60 : 0;
self.orderAsset1.y -= 20;
}
if (order.length > 1) {
self.orderAsset2 = self.attachAsset(order[1], {
anchorX: 0.5,
anchorY: 0.5
});
self.orderAsset2.type = order[1];
self.orderAsset2.x = 60;
self.orderAsset2.y -= 20;
}
} else {
self.orderAsset = self.attachAsset(order, {
anchorX: 0.5,
anchorY: 0.5
});
self.orderAsset.x = 0;
self.orderAsset.y -= 20;
}
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Init game with a sky blue background
});
/****
* Game Code
****/
// Play intro music on game start
var intromusic = LK.getSound('intromusic');
intromusic.play();
LK.on('tick', function () {
if (!intromusic.isPlaying) {
intromusic.play();
}
});
var sun = LK.getAsset('sun', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2 + (Math.random() * 1200 - 600),
y: 500
});
game.addChildAt(sun, 0);
var gaugeBar = LK.getAsset('gaugeBar', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 170
});
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
var backgroundTop = LK.getAsset('backgroundTop', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 0,
alpha: 0.5 // Set transparency to 50%
});
game.addChild(backgroundTop);
var backgroundBottom = LK.getAsset('backgroundBottom', {
anchorX: 0.5,
anchorY: 1,
x: 2048 / 2,
y: 2732,
alpha: 0.5 // Set transparency to 50%
});
game.addChild(backgroundBottom);
game.addChild(gaugeBar);
// Level class
//<Assets used in the game will automatically appear here>
// Initialize arrays and variables
var Level = function Level(levelNumber, customerCount, items) {
this.levelNumber = levelNumber;
this.customerCount = customerCount;
this.items = items;
};
var selectedItem = null; // Variable to track the currently selected item
var currentLevel = null; // Variable to track the current level
var customers = [];
var items = [];
var inventory = []; // Inventory array to hold all items from the bar
var score = 0;
var scoreTxt = new Text2('0', {
size: 90,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 5
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('LVL 1', {
size: 80,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 5
});
levelTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelTxt);
var timerTxt = new Text2('Time: 60', {
size: 80,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 5
});
timerTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(timerTxt);
// Function to check if all items of an order are delivered
function checkOrderFulfillment(customer) {
// Check if all items are dimmed
var allDimmed = true;
if (customer.orderBubble.orderAsset1 && customer.orderBubble.orderAsset1.alpha === 1) {
allDimmed = false;
}
if (customer.orderBubble.orderAsset2 && customer.orderBubble.orderAsset2.alpha === 1) {
allDimmed = false;
}
if (allDimmed) {
LK.getSound('ordercomplete').play();
// Increase score only if it hasn't been increased for this customer
if (!customer.scoreAdded) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore());
customer.scoreAdded = true; // Mark that score has been added for this customer
}
// Spin the customer on its axis
var spinInterval = LK.setInterval(function () {
customer.rotation += 0.1;
}, 16.67); // Approximately 60 FPS
// Wait for one second and then destroy the customer and order bubble
LK.setTimeout(function () {
LK.clearInterval(spinInterval);
customer.destroy();
customer.orderBubble.destroy();
}, 1000);
}
}
// Function to create a new customer
function createCustomer() {
if (customers.length >= currentLevel.customerCount) {
return;
}
var customer = new Customer();
var safeDistance = 800; // Minimum distance between customers
var validPosition = false;
while (!validPosition) {
customer.x = Math.random() * (2048 * 0.8) + 2048 * 0.1; // Spawn customers within the middle 80% of the screen
customer.y = Math.random() * (2200 - 646.4) + 646.4;
validPosition = true;
for (var i = 0; i < customers.length; i++) {
var distance = Math.sqrt(Math.pow(customers[i].x - customer.x, 2) + Math.pow(customers[i].y - customer.y, 2));
if (distance < safeDistance) {
validPosition = false;
break;
}
}
}
var order = ['towel', 'umbrella', 'refreshment', 'snack'].sort(function () {
return 0.5 - Math.random();
}).slice(0, Math.floor(Math.random() * 2) + 1);
customer.setOrder(order);
customers.push(customer);
customer.rotation = 0;
game.addChild(customer);
customer.x = Math.random() < 0.5 ? -200 : 2048 + 200; // Spawn customers from left or right side of the screen
customer.y = Math.random() * (2200 - 646.4) + 646.4;
customer.moveToPosition(Math.random() * (2048 * 0.8) + 2048 * 0.1, Math.random() * (2200 - 646.4) + 646.4);
}
// Function to create a new item
function createItem(type, x, y) {
if (!currentLevel.items.includes(type)) {
return;
}
var item = items.find(function (i) {
return i.type === type;
});
if (item) {
item.x = x;
item.y = y;
item.visible = true;
} else {
item = new Item(type);
item.x = x;
item.y = y;
item.width = 260; // Increase width by 30%
item.height = 260; // Increase height by 30%
items.push(item);
inventory.push(item); // Add item to inventory array
item.visible = true; // Show item on game start
game.addChild(item);
}
}
// Initialize level data
var levels = [new Level(1, 3, ['towel', 'umbrella']), new Level(2, 4, ['towel', 'umbrella', 'refreshment']), new Level(3, 5, ['towel', 'umbrella', 'snack']), new Level(4, 6, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(5, 7, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(6, 8, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(7, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(8, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(9, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(10, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(11, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(12, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(13, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(14, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(15, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(16, 9, ['towel', 'umbrella', 'refreshment', 'snack']), new Level(17, 9, ['towel', 'umbrella', 'refreshment', 'snack'])];
currentLevel = levels[0];
// Create initial customers one by one ensuring safe distance
function createInitialCustomers() {
for (var i = 0; i < currentLevel.customerCount; i++) {
createCustomer();
}
// Create 3 palm trees at random positions at the top of the screen
for (var i = 0; i < 3; i++) {
createPalmTree();
}
}
createInitialCustomers();
// Function to create a palm tree at a random position at the top of the screen
function createPalmTree() {
var palmTree = LK.getAsset('palmTree', {
anchorX: 0.5,
anchorY: 1,
// Set anchorY to 1 to keep the bottom fixed
x: Math.random() * 2048,
y: 800 + (Math.random() * 200 - 100)
});
game.addChild(palmTree);
// Add rotation effect to palm tree
palmTree.update = function () {
palmTree.rotation = Math.sin(LK.ticks / 100) * 0.1; // Slight rotation effect
};
}
// Update function
game.update = function () {
levelTxt.setText('LVL ' + currentLevel.levelNumber);
// Timer countdown logic
if (!game.startTime) {
game.startTime = Date.now();
}
var elapsedTime = Math.floor((Date.now() - game.startTime) / 1000);
var baseTime = 20;
if (currentLevel.levelNumber > 7) {
baseTime -= currentLevel.levelNumber - 7;
}
var remainingTime = baseTime - elapsedTime;
gaugeBar.width -= 2048 / 20 / 60; // Smoothly decrease the gauge bar width over time
// Calculate the percentage of the gauge bar remaining
var gaugePercentage = gaugeBar.width / 2100 * 100;
// Change the tint of the gauge bar based on the percentage
if (gaugePercentage > 60) {
gaugeBar.tint = 0x66FF66; // Soft Green
} else if (gaugePercentage > 20) {
gaugeBar.tint = 0xFFFF66; // Soft Yellow
} else {
gaugeBar.tint = 0xFF6666; // Soft Red
}
timerTxt.setText('Time: ' + Math.max(remainingTime, 0));
if (remainingTime <= 0) {
remainingTime = 0;
game.down = null;
game.up = null;
game.move = null;
for (var i = 0; i < customers.length; i++) {
customers[i].off('down');
}
for (var i = 0; i < items.length; i++) {
items[i].off('down');
}
var timesupAsset = LK.getAsset('timesup', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(timesupAsset);
gaugeBar.destroy();
LK.getSound('gameover').play();
LK.setTimeout(function () {
game.removeChild(timesupAsset);
LK.showGameOver();
}, 2000);
return;
}
// Check if all orders are fulfilled
var allOrdersFulfilled = true;
for (var i = 0; i < customers.length; i++) {
if (customers[i].orderBubble.orderAsset1 && customers[i].orderBubble.orderAsset1.alpha === 1) {
allOrdersFulfilled = false;
break;
}
if (customers[i].orderBubble.orderAsset2 && customers[i].orderBubble.orderAsset2.alpha === 1) {
allOrdersFulfilled = false;
break;
}
}
// If all orders are fulfilled, move to the next level
if (allOrdersFulfilled) {
var nextLevelIndex = levels.indexOf(currentLevel) + 1;
if (nextLevelIndex < levels.length) {
// Show levelup asset
var levelupAsset = LK.getAsset('levelup', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(levelupAsset);
LK.getSound('nextlevel').play();
// Stop the timer and gaugeBar
game.startTime = null;
gaugeBar.width = 0;
LK.setTimeout(function () {
game.removeChild(levelupAsset);
}, 500); // Show for 2 seconds
LK.setTimeout(function () {
currentLevel = levels[nextLevelIndex];
// Reset timer for the new level
game.startTime = Date.now();
// Clear current customers
for (var i = 0; i < customers.length; i++) {
customers[i].destroy();
}
customers = [];
// Hide current items instead of destroying them
for (var i = 0; i < items.length; i++) {
items[i].visible = false;
}
// Reset gaugeBar width and tint for the new level
gaugeBar.width = 2100;
gaugeBar.tint = 0x00FF00; // Reset to green
// Create new customers and items for the next level
for (var i = 0; i < currentLevel.customerCount; i++) {
createCustomer();
}
var totalItems = currentLevel.items.length;
var totalItems = currentLevel.items.length;
var spacing = (2048 - totalItems * 260) / (totalItems + 1);
for (var i = 0; i < totalItems; i++) {
createItem(currentLevel.items[i], spacing + i * (260 + spacing) + 130, 2732 - 200);
}
}, 1000);
}
} else if (LK.ticks % 300 == 0) {
createCustomer();
}
};
// Create initial items
var totalItems = currentLevel.items.length;
var spacing = (2048 - totalItems * 260) / (totalItems + 1);
for (var i = 0; i < totalItems; i++) {
createItem(currentLevel.items[i], spacing + i * (260 + spacing) + 130, 2732 - 200);
}
var backgroundBottom = LK.getAsset('backgroundBottom', {
anchorX: 0.5,
anchorY: 1,
x: 2048 / 2,
y: 2732
});
game.addChildAt(backgroundBottom, 0);
var backgroundTop = LK.getAsset('backgroundTop', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 0
});
game.addChildAt(backgroundTop, 0);
// Update palm trees rotation
for (var i = 0; i < game.children.length; i++) {
if (game.children[i].update) {
game.children[i].update();
}
}
8bit. cartoon. icecream. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon and 8 bit message. reads: Time's Up!. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8bit. cartoon. palm tree.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.