/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { money: 100, health: 100, aiProgress: 0, day: 1 }); /**** * Classes ****/ var CoinFlipGame = Container.expand(function () { var self = Container.call(this); var background = self.attachAsset('shopBackground', { anchorX: 0.5, anchorY: 0.5, width: 800, height: 600, tint: 0x222222 }); var coin = self.attachAsset('coinHeads', { anchorX: 0.5, anchorY: 0.5, y: -100, scaleX: 2, scaleY: 2 }); var titleText = new Text2("50/50 Gambling", { size: 50, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -200; self.addChild(titleText); var betText = new Text2("Bet Amount: $10", { size: 30, fill: 0xFFFFFF }); betText.anchor.set(0.5, 0.5); betText.y = 50; self.addChild(betText); var resultText = new Text2("", { size: 40, fill: 0xFFFFFF }); resultText.anchor.set(0.5, 0.5); resultText.y = 150; self.addChild(resultText); self.visible = false; self.betAmount = 10; self.isFlipping = false; // Create buttons var headsButton = new MenuButton("Bet on Heads", function () { self.flipCoin("heads"); }); headsButton.x = -150; headsButton.y = 100; self.addChild(headsButton); var tailsButton = new MenuButton("Bet on Tails", function () { self.flipCoin("tails"); }); tailsButton.x = 150; tailsButton.y = 100; self.addChild(tailsButton); var closeButton = new MenuButton("Close", function () { self.hide(); }); closeButton.x = 0; closeButton.y = 220; self.addChild(closeButton); // Bet amount buttons var decreaseBetButton = new MenuButton("-", function () { if (self.betAmount > 10) { self.betAmount -= 10; betText.setText("Bet Amount: $" + self.betAmount); } }); decreaseBetButton.x = -100; decreaseBetButton.y = 50; self.addChild(decreaseBetButton); var increaseBetButton = new MenuButton("+", function () { self.betAmount += 10; betText.setText("Bet Amount: $" + self.betAmount); }); increaseBetButton.x = 100; increaseBetButton.y = 50; self.addChild(increaseBetButton); self.show = function () { self.visible = true; resultText.setText(""); coin.texture = LK.getAsset('coinHeads', {}).texture; }; self.hide = function () { self.visible = false; }; self.flipCoin = function (userChoice) { if (self.isFlipping) { return; } // Check if player has enough money if (storage.money < self.betAmount) { resultText.setText("Not enough money!"); LK.getSound('error').play(); return; } self.isFlipping = true; LK.getSound('coinFlip').play(); // Animation for coin flip var flipCount = 0; var maxFlips = 10; var flipTimer = LK.setInterval(function () { flipCount++; // Toggle between heads and tails if (flipCount % 2 === 0) { coin.texture = LK.getAsset('coinHeads', {}).texture; } else { coin.texture = LK.getAsset('coinTails', {}).texture; } // Scaling animation if (flipCount <= maxFlips / 2) { coin.scaleX = 2 - flipCount * 0.2; } else { coin.scaleX = 1 + (flipCount - maxFlips / 2) * 0.2; } // End of animation if (flipCount >= maxFlips) { LK.clearInterval(flipTimer); // Determine result (50/50 chance) var result = Math.random() < 0.5 ? "heads" : "tails"; // Set final coin face coin.texture = LK.getAsset(result === "heads" ? 'coinHeads' : 'coinTails', {}).texture; // Check if player won if (result === userChoice) { // Player won resultText.setText("You Won $" + self.betAmount + "!"); resultText.style.fill = "#00FF00"; storage.money += self.betAmount; } else { // Player lost resultText.setText("You Lost $" + self.betAmount); resultText.style.fill = "#FF0000"; storage.money -= self.betAmount; } self.emit('gamblingComplete', { result: result === userChoice ? "win" : "loss", amount: self.betAmount }); self.isFlipping = false; } }, 100); }; self.on = function (event, callback) { if (!self._events) { self._events = {}; } if (!self._events[event]) { self._events[event] = []; } self._events[event].push(callback); }; self.emit = function (event, data) { if (self._events && self._events[event]) { self._events[event].forEach(function (callback) { callback(data); }); } }; return self; }); var Customer = Container.expand(function () { var self = Container.call(this); var customerGraphic = self.attachAsset('customer', { anchorX: 0.5, anchorY: 0.5 }); var productGraphic = self.attachAsset('productItem', { anchorX: 0.5, anchorY: 0.5, y: -120 }); self.itemValue = 0; self.serveTime = 0; self.active = true; self.reset = function () { self.itemValue = Math.floor(Math.random() * 20) + 10; self.serveTime = Math.floor(Math.random() * 5) + 3; self.active = true; var valueText = new Text2(self.itemValue + '$', { size: 40, fill: 0xFFFFFF }); valueText.anchor.set(0.5, 0.5); productGraphic.addChild(valueText); }; self.down = function (x, y, obj) { if (self.active) { self.startDragX = x; self.startDragY = y; self.isDragging = true; } }; self.up = function (x, y, obj) { if (self.isDragging) { var dragDistanceX = x - self.startDragX; if (Math.abs(dragDistanceX) > 200) { // Successful swipe self.active = false; LK.getSound('swipe').play(); // Move customer off screen var direction = dragDistanceX > 0 ? 2500 : -500; tween(self, { x: direction }, { duration: 500, onFinish: function onFinish() { self.emit('customerServed', self.itemValue); } }); } self.isDragging = false; } }; self.move = function (x, y, obj) { if (self.isDragging) { var dragDistanceX = x - self.startDragX; if (Math.abs(dragDistanceX) < 300) { self.x = self.originalX + dragDistanceX; } } }; self.reset(); return self; }); var DayNightCycle = Container.expand(function () { var self = Container.call(this); var sunMoon = self.attachAsset('dayNightCycle', { anchorX: 0.5, anchorY: 0.5 }); var timeText = new Text2("5:00 AM", { size: 50, fill: 0x000000 }); timeText.anchor.set(0.5, 0.5); timeText.y = 70; self.addChild(timeText); var dayText = new Text2("Day 1", { size: 30, fill: 0x000000 }); dayText.anchor.set(0.5, 0.5); dayText.y = -70; self.addChild(dayText); self.currentHour = 5; // 5 AM start self.currentMinute = 0; self.day = 1; self.isAM = true; self.updateDay = function (newDay) { self.day = newDay; dayText.setText("Day " + self.day); }; self.updateTime = function () { self.currentMinute++; if (self.currentMinute % 30 === 0) { storage.money += 50; // Add $50 every half hour self.emit('halfHourlyPayment', { amount: 50 }); } if (self.currentMinute >= 60) { self.currentMinute = 0; self.currentHour++; if (self.currentHour == 12) { self.isAM = !self.isAM; } else if (self.currentHour > 12) { self.currentHour = 1; } // Update sun/moon position and color based on time var timeOfDay = (self.currentHour + (self.isAM ? 0 : 12)) % 24; var angle = timeOfDay / 24 * 2 * Math.PI - Math.PI / 2; // Calculate position on a circular path var radius = 50; var cycleX = Math.cos(angle) * radius; var cycleY = Math.sin(angle) * radius; sunMoon.x = cycleX; sunMoon.y = cycleY; // Change color based on time (yellow for day, silver for night) if (timeOfDay >= 6 && timeOfDay < 18) { sunMoon.tint = 0xFFD700; // day - yellow } else { sunMoon.tint = 0xC0C0C0; // night - silver } self.emit('hourChanged', { hour: self.currentHour, isAM: self.isAM }); // Pay the player every hour if (shopOpen) { storage.money += 10; // Pay $10 every hour self.emit('hourlyPayment', { amount: 10 }); } } var displayHour = self.currentHour; var displayMinute = self.currentMinute.toString().padStart(2, '0'); var ampm = self.isAM ? "AM" : "PM"; timeText.setText(displayHour + ":" + displayMinute + " " + ampm); }; self.reset = function () { self.currentHour = 5; self.currentMinute = 0; self.isAM = true; self.updateTime(); }; self.on = function (event, callback) { if (!self._events) { self._events = {}; } if (!self._events[event]) { self._events[event] = []; } self._events[event].push(callback); }; self.emit = function (event, data) { if (self._events && self._events[event]) { self._events[event].forEach(function (callback) { callback(data); }); } }; return self; }); var FiredScreen = Container.expand(function () { var self = Container.call(this); var firedGraphic = self.attachAsset('firedScreen', { anchorX: 0.5, anchorY: 0.5 }); var firedText = new Text2("YOU GOT FIRED", { size: 100, fill: 0xFFFFFF }); firedText.anchor.set(0.5, 0.5); firedText.x = 0; firedText.y = 0; self.addChild(firedText); return self; }); var MenuButton = Container.expand(function (text, callback) { var self = Container.call(this); var button = self.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2(text, { size: 30, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.down = function () { button.tint = 0x3468A0; // Darker blue when pressed self.isPressed = true; }; self.up = function () { if (self.isPressed) { button.tint = 0x4682B4; // Reset to original color if (callback) { callback(); } self.isPressed = false; } }; return self; }); var ShopInterface = Container.expand(function () { var self = Container.call(this); // Shop background var background = self.attachAsset('shopBackground', { anchorX: 0.5, anchorY: 0, x: 1024, y: 400 }); // Counter var counter = self.attachAsset('counterTop', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1100 }); // Cash register var register = self.attachAsset('cashRegister', { anchorX: 0.5, anchorY: 0.5, x: 1500, y: 1020 }); // Computer for AI project var computer = self.attachAsset('computerScreen', { anchorX: 0.5, anchorY: 0.5, x: 700, y: 1020 }); // Text display for computer var computerText = new Text2("AI PROJECT", { size: 30, fill: 0x00FF00 }); computerText.anchor.set(0.5, 0.5); computer.addChild(computerText); self.on = function (event, callback) { if (!self._events) { self._events = {}; } if (!self._events[event]) { self._events[event] = []; } self._events[event].push(callback); }; self.emit = function (event, data) { if (self._events && self._events[event]) { self._events[event].forEach(function (callback) { callback(data); }); } }; // Computer click handler computer.interactive = true; computer.down = function () { self.emit('workOnAI'); // Hide other elements and show AI options shopInterface.visible = false; statusBars.visible = false; dayNightCycle.visible = false; // Create AI interaction interface var aiInterface = new Container(); var videoButton = new MenuButton("Video", function () { aiProgress += 1; statusBars.updateAIProgress(aiProgress); aiInterface.visible = false; shopInterface.visible = true; statusBars.visible = true; dayNightCycle.visible = true; }); videoButton.x = 1024; videoButton.y = 800; aiInterface.addChild(videoButton); var uploadButton = new MenuButton("Upload", function () { aiProgress += 1; statusBars.updateAIProgress(aiProgress); aiInterface.visible = false; shopInterface.visible = true; statusBars.visible = true; dayNightCycle.visible = true; }); uploadButton.x = 1024; uploadButton.y = 1000; aiInterface.addChild(uploadButton); game.addChild(aiInterface); }; return self; }); var StatusBars = Container.expand(function () { var self = Container.call(this); // Health bar background var healthBg = self.attachAsset('healthBarBackground', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); // Health bar var healthBar = self.attachAsset('healthBar', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 500 // Full width initially }); // Health label var healthText = new Text2("Health", { size: 30, fill: 0x000000 }); healthText.x = 10; healthText.y = -5; self.addChild(healthText); // AI Progress bar background var aiProgressBg = self.attachAsset('aiProgressBarBackground', { anchorX: 0, anchorY: 0, x: 0, y: 50 }); // AI Progress bar var aiProgressBar = self.attachAsset('aiProgressBar', { anchorX: 0, anchorY: 0, x: 0, y: 50, width: 0 // Start at 0 progress }); // AI Progress label var aiProgressText = new Text2("AI Project: 0%", { size: 30, fill: 0x000000 }); aiProgressText.x = 10; aiProgressText.y = 45; self.addChild(aiProgressText); // Money display var moneyText = new Text2("$100", { size: 40, fill: 0x008000 }); moneyText.x = 250; moneyText.y = -50; self.addChild(moneyText); self.updateHealth = function (health) { var barWidth = health / 100 * 500; healthBar.width = barWidth; // Change color based on health level if (health > 70) { healthBar.tint = 0x00FF00; // Green } else if (health > 30) { healthBar.tint = 0xFFFF00; // Yellow } else { healthBar.tint = 0xFF0000; // Red } }; self.updateAIProgress = function (progress) { var barWidth = progress / 100 * 500; aiProgressBar.width = barWidth; aiProgressText.setText("AI Project: " + Math.floor(progress) + "%"); }; self.updateMoney = function (amount) { moneyText.setText("$" + amount); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ function offerNewJobs() { // Create job options interface var jobInterface = new Container(); var companyNames = ["Meow Meow Motors", "Toyoda Motors", "DevelopingAI"]; companyNames.forEach(function (companyName, index) { var jobButton = new MenuButton(companyName, function () { // Logic for accepting job at the company fired = false; aiProgress = 0; aiWorkers = 0; jobInterface.visible = false; shopInterface.visible = true; statusBars.visible = true; dayNightCycle.visible = true; // Adjust salary for new job paymentData.amount -= paymentData.amount * 0.02; }); jobButton.x = 1024; jobButton.y = 800 + index * 200; jobInterface.addChild(jobButton); }); game.addChild(jobInterface); } // Global game variables var money = storage.money; var health = storage.health; var aiProgress = storage.aiProgress; var currentDay = storage.day; var shopOpen = false; var gameRunning = true; var workOnAITime = 0; var aiWorkers = 0; // Number of workers contributing to AI project var fired = false; // Track if player is fired var customerWaitingTime = 0; var timeToNextCustomer = 3; var activeCustomers = []; var medicinePrice = 30; // Interface elements var shopInterface = new ShopInterface(); shopInterface.x = 0; shopInterface.y = 0; game.addChild(shopInterface); // Status display var statusBars = new StatusBars(); statusBars.x = 50; statusBars.y = 150; game.addChild(statusBars); // Update initial status displays statusBars.updateHealth(health); statusBars.updateAIProgress(aiProgress); statusBars.updateMoney(money); // Time display var dayNightCycle = new DayNightCycle(); dayNightCycle.x = 1800; dayNightCycle.y = 150; dayNightCycle.updateDay(currentDay); game.addChild(dayNightCycle); // Menu buttons var takeMedicineButton = new MenuButton("Take Medicine ($" + medicinePrice + ")", function () { if (money >= medicinePrice && health < 100) { money -= medicinePrice; health = Math.min(100, health + 30); statusBars.updateHealth(health); statusBars.updateMoney(money); LK.getSound('pillTaken').play(); } else if (health >= 100) { // Already at full health LK.getSound('error').play(); } else { // Not enough money LK.getSound('error').play(); } }); takeMedicineButton.x = 1650; takeMedicineButton.y = 250; game.addChild(takeMedicineButton); var gamblingButton = new MenuButton("Try Gambling", function () { coinFlipGame.show(); }); gamblingButton.x = 1650; gamblingButton.y = 350; game.addChild(gamblingButton); // Create gambling mini-game var coinFlipGame = new CoinFlipGame(); coinFlipGame.x = 1024; coinFlipGame.y = 1300; game.addChild(coinFlipGame); // Event handlers shopInterface.on('workOnAI', function () { if (!shopOpen) { return; } // Simulate working on AI project workOnAITime = 60; // Work for 1 hour (60 minutes) LK.getSound('typing').play(); // Flash the computer screen var computer = shopInterface.children[3]; // The computer screen tween(computer, { tint: 0x00FF00 }, { duration: 200, onFinish: function onFinish() { tween(computer, { tint: 0x000080 }, { duration: 200 }); } }); }); coinFlipGame.on('gamblingComplete', function (result) { statusBars.updateMoney(money); }); dayNightCycle.on('hourChanged', function (timeData) { // Check if it's time to open or close the shop if (timeData.hour === 5 && !timeData.isAM) { // 5 PM - Closing time shopOpen = false; endDay(); } else if (timeData.hour === 5 && timeData.isAM) { // 5 AM - Opening time shopOpen = true; startDay(); } // Decrease health over time (more when working) if (shopOpen) { health -= 0.5; health = Math.max(0, health); statusBars.updateHealth(health); // Check if health is critically low if (health <= 0) { LK.showGameOver(); } } }); dayNightCycle.on('hourlyPayment', function (paymentData) { if (fired) { money += 50; // Adjusted payment after being fired } else { money += paymentData.amount; } statusBars.updateMoney(money); }); // Handle customer creation and management function createCustomer() { if (!shopOpen || activeCustomers.length >= 3) { return; } var customer = new Customer(); customer.x = 1024; // Center X customer.y = 750; // Position Y customer.originalX = customer.x; // Offset each customer to prevent overlap if (activeCustomers.length > 0) { var offset = activeCustomers.length * 300 - 300; customer.x += offset; customer.originalX = customer.x; } // Handle customer served event customer.on = function (event, callback) { if (!customer._events) { customer._events = {}; } if (!customer._events[event]) { customer._events[event] = []; } customer._events[event].push(callback); }; customer.emit = function (event, data) { if (customer._events && customer._events[event]) { customer._events[event].forEach(function (callback) { callback(data); }); } }; customer.on('customerServed', function (value) { // Remove from active customers var index = activeCustomers.indexOf(customer); if (index !== -1) { activeCustomers.splice(index, 1); } // Add money money += value; statusBars.updateMoney(money); LK.getSound('cashRegister').play(); // Rearrange remaining customers rearrangeCustomers(); // Remove from game game.removeChild(customer); }); // Add to game and track activeCustomers.push(customer); game.addChild(customer); // Reset timer for next customer timeToNextCustomer = Math.floor(Math.random() * 3) + 2; } function rearrangeCustomers() { for (var i = 0; i < activeCustomers.length; i++) { var targetX = 1024 + i * 300 - 300; tween(activeCustomers[i], { x: targetX }, { duration: 300 }); activeCustomers[i].originalX = targetX; } } function startDay() { // Reset daily variables shopOpen = true; timeToNextCustomer = 3; // Ensure health display is updated statusBars.updateHealth(health); } function endDay() { // Save game state storage.money = money; storage.health = health; storage.aiProgress = aiProgress; storage.day = currentDay + 1; // Clear active customers for (var i = activeCustomers.length - 1; i >= 0; i--) { game.removeChild(activeCustomers[i]); } activeCustomers = []; // Update display currentDay++; dayNightCycle.updateDay(currentDay); // Victory condition check if (aiProgress >= 100) { LK.showYouWin(); } } // Main game update loop game.update = function () { if (!gameRunning) { return; } // Update time (1 real-time second = 1 minute in game) if (LK.ticks % 60 === 0) { dayNightCycle.updateTime(); aiProgress += 1; // Add 1% to the AI Project every in-game minute statusBars.updateAIProgress(aiProgress); // Process AI work time if (workOnAITime > 0) { workOnAITime--; // Progress AI project aiProgress += 0.5 + aiWorkers; // Workers contribute to AI progress // Check if player should be fired if (aiProgress > 10 && workOnAITime === 0 && !fired) { fired = true; // Show 'YOU GOT FIRED' screen var firedScreen = new FiredScreen(); firedScreen.x = 1024; firedScreen.y = 600; game.addChild(firedScreen); // Offer new job options offerNewJobs(); } if (aiProgress >= 100) { aiProgress = 100; // Victory achieved } statusBars.updateAIProgress(aiProgress); } // Process customer waiting time if (shopOpen) { customerWaitingTime++; if (customerWaitingTime >= timeToNextCustomer) { customerWaitingTime = 0; createCustomer(); } } } }; // Start game music LK.playMusic('shopMusic');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 100,
health: 100,
aiProgress: 0,
day: 1
});
/****
* Classes
****/
var CoinFlipGame = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('shopBackground', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 600,
tint: 0x222222
});
var coin = self.attachAsset('coinHeads', {
anchorX: 0.5,
anchorY: 0.5,
y: -100,
scaleX: 2,
scaleY: 2
});
var titleText = new Text2("50/50 Gambling", {
size: 50,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -200;
self.addChild(titleText);
var betText = new Text2("Bet Amount: $10", {
size: 30,
fill: 0xFFFFFF
});
betText.anchor.set(0.5, 0.5);
betText.y = 50;
self.addChild(betText);
var resultText = new Text2("", {
size: 40,
fill: 0xFFFFFF
});
resultText.anchor.set(0.5, 0.5);
resultText.y = 150;
self.addChild(resultText);
self.visible = false;
self.betAmount = 10;
self.isFlipping = false;
// Create buttons
var headsButton = new MenuButton("Bet on Heads", function () {
self.flipCoin("heads");
});
headsButton.x = -150;
headsButton.y = 100;
self.addChild(headsButton);
var tailsButton = new MenuButton("Bet on Tails", function () {
self.flipCoin("tails");
});
tailsButton.x = 150;
tailsButton.y = 100;
self.addChild(tailsButton);
var closeButton = new MenuButton("Close", function () {
self.hide();
});
closeButton.x = 0;
closeButton.y = 220;
self.addChild(closeButton);
// Bet amount buttons
var decreaseBetButton = new MenuButton("-", function () {
if (self.betAmount > 10) {
self.betAmount -= 10;
betText.setText("Bet Amount: $" + self.betAmount);
}
});
decreaseBetButton.x = -100;
decreaseBetButton.y = 50;
self.addChild(decreaseBetButton);
var increaseBetButton = new MenuButton("+", function () {
self.betAmount += 10;
betText.setText("Bet Amount: $" + self.betAmount);
});
increaseBetButton.x = 100;
increaseBetButton.y = 50;
self.addChild(increaseBetButton);
self.show = function () {
self.visible = true;
resultText.setText("");
coin.texture = LK.getAsset('coinHeads', {}).texture;
};
self.hide = function () {
self.visible = false;
};
self.flipCoin = function (userChoice) {
if (self.isFlipping) {
return;
}
// Check if player has enough money
if (storage.money < self.betAmount) {
resultText.setText("Not enough money!");
LK.getSound('error').play();
return;
}
self.isFlipping = true;
LK.getSound('coinFlip').play();
// Animation for coin flip
var flipCount = 0;
var maxFlips = 10;
var flipTimer = LK.setInterval(function () {
flipCount++;
// Toggle between heads and tails
if (flipCount % 2 === 0) {
coin.texture = LK.getAsset('coinHeads', {}).texture;
} else {
coin.texture = LK.getAsset('coinTails', {}).texture;
}
// Scaling animation
if (flipCount <= maxFlips / 2) {
coin.scaleX = 2 - flipCount * 0.2;
} else {
coin.scaleX = 1 + (flipCount - maxFlips / 2) * 0.2;
}
// End of animation
if (flipCount >= maxFlips) {
LK.clearInterval(flipTimer);
// Determine result (50/50 chance)
var result = Math.random() < 0.5 ? "heads" : "tails";
// Set final coin face
coin.texture = LK.getAsset(result === "heads" ? 'coinHeads' : 'coinTails', {}).texture;
// Check if player won
if (result === userChoice) {
// Player won
resultText.setText("You Won $" + self.betAmount + "!");
resultText.style.fill = "#00FF00";
storage.money += self.betAmount;
} else {
// Player lost
resultText.setText("You Lost $" + self.betAmount);
resultText.style.fill = "#FF0000";
storage.money -= self.betAmount;
}
self.emit('gamblingComplete', {
result: result === userChoice ? "win" : "loss",
amount: self.betAmount
});
self.isFlipping = false;
}
}, 100);
};
self.on = function (event, callback) {
if (!self._events) {
self._events = {};
}
if (!self._events[event]) {
self._events[event] = [];
}
self._events[event].push(callback);
};
self.emit = function (event, data) {
if (self._events && self._events[event]) {
self._events[event].forEach(function (callback) {
callback(data);
});
}
};
return self;
});
var Customer = Container.expand(function () {
var self = Container.call(this);
var customerGraphic = self.attachAsset('customer', {
anchorX: 0.5,
anchorY: 0.5
});
var productGraphic = self.attachAsset('productItem', {
anchorX: 0.5,
anchorY: 0.5,
y: -120
});
self.itemValue = 0;
self.serveTime = 0;
self.active = true;
self.reset = function () {
self.itemValue = Math.floor(Math.random() * 20) + 10;
self.serveTime = Math.floor(Math.random() * 5) + 3;
self.active = true;
var valueText = new Text2(self.itemValue + '$', {
size: 40,
fill: 0xFFFFFF
});
valueText.anchor.set(0.5, 0.5);
productGraphic.addChild(valueText);
};
self.down = function (x, y, obj) {
if (self.active) {
self.startDragX = x;
self.startDragY = y;
self.isDragging = true;
}
};
self.up = function (x, y, obj) {
if (self.isDragging) {
var dragDistanceX = x - self.startDragX;
if (Math.abs(dragDistanceX) > 200) {
// Successful swipe
self.active = false;
LK.getSound('swipe').play();
// Move customer off screen
var direction = dragDistanceX > 0 ? 2500 : -500;
tween(self, {
x: direction
}, {
duration: 500,
onFinish: function onFinish() {
self.emit('customerServed', self.itemValue);
}
});
}
self.isDragging = false;
}
};
self.move = function (x, y, obj) {
if (self.isDragging) {
var dragDistanceX = x - self.startDragX;
if (Math.abs(dragDistanceX) < 300) {
self.x = self.originalX + dragDistanceX;
}
}
};
self.reset();
return self;
});
var DayNightCycle = Container.expand(function () {
var self = Container.call(this);
var sunMoon = self.attachAsset('dayNightCycle', {
anchorX: 0.5,
anchorY: 0.5
});
var timeText = new Text2("5:00 AM", {
size: 50,
fill: 0x000000
});
timeText.anchor.set(0.5, 0.5);
timeText.y = 70;
self.addChild(timeText);
var dayText = new Text2("Day 1", {
size: 30,
fill: 0x000000
});
dayText.anchor.set(0.5, 0.5);
dayText.y = -70;
self.addChild(dayText);
self.currentHour = 5; // 5 AM start
self.currentMinute = 0;
self.day = 1;
self.isAM = true;
self.updateDay = function (newDay) {
self.day = newDay;
dayText.setText("Day " + self.day);
};
self.updateTime = function () {
self.currentMinute++;
if (self.currentMinute % 30 === 0) {
storage.money += 50; // Add $50 every half hour
self.emit('halfHourlyPayment', {
amount: 50
});
}
if (self.currentMinute >= 60) {
self.currentMinute = 0;
self.currentHour++;
if (self.currentHour == 12) {
self.isAM = !self.isAM;
} else if (self.currentHour > 12) {
self.currentHour = 1;
}
// Update sun/moon position and color based on time
var timeOfDay = (self.currentHour + (self.isAM ? 0 : 12)) % 24;
var angle = timeOfDay / 24 * 2 * Math.PI - Math.PI / 2;
// Calculate position on a circular path
var radius = 50;
var cycleX = Math.cos(angle) * radius;
var cycleY = Math.sin(angle) * radius;
sunMoon.x = cycleX;
sunMoon.y = cycleY;
// Change color based on time (yellow for day, silver for night)
if (timeOfDay >= 6 && timeOfDay < 18) {
sunMoon.tint = 0xFFD700; // day - yellow
} else {
sunMoon.tint = 0xC0C0C0; // night - silver
}
self.emit('hourChanged', {
hour: self.currentHour,
isAM: self.isAM
});
// Pay the player every hour
if (shopOpen) {
storage.money += 10; // Pay $10 every hour
self.emit('hourlyPayment', {
amount: 10
});
}
}
var displayHour = self.currentHour;
var displayMinute = self.currentMinute.toString().padStart(2, '0');
var ampm = self.isAM ? "AM" : "PM";
timeText.setText(displayHour + ":" + displayMinute + " " + ampm);
};
self.reset = function () {
self.currentHour = 5;
self.currentMinute = 0;
self.isAM = true;
self.updateTime();
};
self.on = function (event, callback) {
if (!self._events) {
self._events = {};
}
if (!self._events[event]) {
self._events[event] = [];
}
self._events[event].push(callback);
};
self.emit = function (event, data) {
if (self._events && self._events[event]) {
self._events[event].forEach(function (callback) {
callback(data);
});
}
};
return self;
});
var FiredScreen = Container.expand(function () {
var self = Container.call(this);
var firedGraphic = self.attachAsset('firedScreen', {
anchorX: 0.5,
anchorY: 0.5
});
var firedText = new Text2("YOU GOT FIRED", {
size: 100,
fill: 0xFFFFFF
});
firedText.anchor.set(0.5, 0.5);
firedText.x = 0;
firedText.y = 0;
self.addChild(firedText);
return self;
});
var MenuButton = Container.expand(function (text, callback) {
var self = Container.call(this);
var button = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 30,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function () {
button.tint = 0x3468A0; // Darker blue when pressed
self.isPressed = true;
};
self.up = function () {
if (self.isPressed) {
button.tint = 0x4682B4; // Reset to original color
if (callback) {
callback();
}
self.isPressed = false;
}
};
return self;
});
var ShopInterface = Container.expand(function () {
var self = Container.call(this);
// Shop background
var background = self.attachAsset('shopBackground', {
anchorX: 0.5,
anchorY: 0,
x: 1024,
y: 400
});
// Counter
var counter = self.attachAsset('counterTop', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1100
});
// Cash register
var register = self.attachAsset('cashRegister', {
anchorX: 0.5,
anchorY: 0.5,
x: 1500,
y: 1020
});
// Computer for AI project
var computer = self.attachAsset('computerScreen', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1020
});
// Text display for computer
var computerText = new Text2("AI PROJECT", {
size: 30,
fill: 0x00FF00
});
computerText.anchor.set(0.5, 0.5);
computer.addChild(computerText);
self.on = function (event, callback) {
if (!self._events) {
self._events = {};
}
if (!self._events[event]) {
self._events[event] = [];
}
self._events[event].push(callback);
};
self.emit = function (event, data) {
if (self._events && self._events[event]) {
self._events[event].forEach(function (callback) {
callback(data);
});
}
};
// Computer click handler
computer.interactive = true;
computer.down = function () {
self.emit('workOnAI');
// Hide other elements and show AI options
shopInterface.visible = false;
statusBars.visible = false;
dayNightCycle.visible = false;
// Create AI interaction interface
var aiInterface = new Container();
var videoButton = new MenuButton("Video", function () {
aiProgress += 1;
statusBars.updateAIProgress(aiProgress);
aiInterface.visible = false;
shopInterface.visible = true;
statusBars.visible = true;
dayNightCycle.visible = true;
});
videoButton.x = 1024;
videoButton.y = 800;
aiInterface.addChild(videoButton);
var uploadButton = new MenuButton("Upload", function () {
aiProgress += 1;
statusBars.updateAIProgress(aiProgress);
aiInterface.visible = false;
shopInterface.visible = true;
statusBars.visible = true;
dayNightCycle.visible = true;
});
uploadButton.x = 1024;
uploadButton.y = 1000;
aiInterface.addChild(uploadButton);
game.addChild(aiInterface);
};
return self;
});
var StatusBars = Container.expand(function () {
var self = Container.call(this);
// Health bar background
var healthBg = self.attachAsset('healthBarBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Health bar
var healthBar = self.attachAsset('healthBar', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 500 // Full width initially
});
// Health label
var healthText = new Text2("Health", {
size: 30,
fill: 0x000000
});
healthText.x = 10;
healthText.y = -5;
self.addChild(healthText);
// AI Progress bar background
var aiProgressBg = self.attachAsset('aiProgressBarBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 50
});
// AI Progress bar
var aiProgressBar = self.attachAsset('aiProgressBar', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 50,
width: 0 // Start at 0 progress
});
// AI Progress label
var aiProgressText = new Text2("AI Project: 0%", {
size: 30,
fill: 0x000000
});
aiProgressText.x = 10;
aiProgressText.y = 45;
self.addChild(aiProgressText);
// Money display
var moneyText = new Text2("$100", {
size: 40,
fill: 0x008000
});
moneyText.x = 250;
moneyText.y = -50;
self.addChild(moneyText);
self.updateHealth = function (health) {
var barWidth = health / 100 * 500;
healthBar.width = barWidth;
// Change color based on health level
if (health > 70) {
healthBar.tint = 0x00FF00; // Green
} else if (health > 30) {
healthBar.tint = 0xFFFF00; // Yellow
} else {
healthBar.tint = 0xFF0000; // Red
}
};
self.updateAIProgress = function (progress) {
var barWidth = progress / 100 * 500;
aiProgressBar.width = barWidth;
aiProgressText.setText("AI Project: " + Math.floor(progress) + "%");
};
self.updateMoney = function (amount) {
moneyText.setText("$" + amount);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
function offerNewJobs() {
// Create job options interface
var jobInterface = new Container();
var companyNames = ["Meow Meow Motors", "Toyoda Motors", "DevelopingAI"];
companyNames.forEach(function (companyName, index) {
var jobButton = new MenuButton(companyName, function () {
// Logic for accepting job at the company
fired = false;
aiProgress = 0;
aiWorkers = 0;
jobInterface.visible = false;
shopInterface.visible = true;
statusBars.visible = true;
dayNightCycle.visible = true;
// Adjust salary for new job
paymentData.amount -= paymentData.amount * 0.02;
});
jobButton.x = 1024;
jobButton.y = 800 + index * 200;
jobInterface.addChild(jobButton);
});
game.addChild(jobInterface);
}
// Global game variables
var money = storage.money;
var health = storage.health;
var aiProgress = storage.aiProgress;
var currentDay = storage.day;
var shopOpen = false;
var gameRunning = true;
var workOnAITime = 0;
var aiWorkers = 0; // Number of workers contributing to AI project
var fired = false; // Track if player is fired
var customerWaitingTime = 0;
var timeToNextCustomer = 3;
var activeCustomers = [];
var medicinePrice = 30;
// Interface elements
var shopInterface = new ShopInterface();
shopInterface.x = 0;
shopInterface.y = 0;
game.addChild(shopInterface);
// Status display
var statusBars = new StatusBars();
statusBars.x = 50;
statusBars.y = 150;
game.addChild(statusBars);
// Update initial status displays
statusBars.updateHealth(health);
statusBars.updateAIProgress(aiProgress);
statusBars.updateMoney(money);
// Time display
var dayNightCycle = new DayNightCycle();
dayNightCycle.x = 1800;
dayNightCycle.y = 150;
dayNightCycle.updateDay(currentDay);
game.addChild(dayNightCycle);
// Menu buttons
var takeMedicineButton = new MenuButton("Take Medicine ($" + medicinePrice + ")", function () {
if (money >= medicinePrice && health < 100) {
money -= medicinePrice;
health = Math.min(100, health + 30);
statusBars.updateHealth(health);
statusBars.updateMoney(money);
LK.getSound('pillTaken').play();
} else if (health >= 100) {
// Already at full health
LK.getSound('error').play();
} else {
// Not enough money
LK.getSound('error').play();
}
});
takeMedicineButton.x = 1650;
takeMedicineButton.y = 250;
game.addChild(takeMedicineButton);
var gamblingButton = new MenuButton("Try Gambling", function () {
coinFlipGame.show();
});
gamblingButton.x = 1650;
gamblingButton.y = 350;
game.addChild(gamblingButton);
// Create gambling mini-game
var coinFlipGame = new CoinFlipGame();
coinFlipGame.x = 1024;
coinFlipGame.y = 1300;
game.addChild(coinFlipGame);
// Event handlers
shopInterface.on('workOnAI', function () {
if (!shopOpen) {
return;
}
// Simulate working on AI project
workOnAITime = 60; // Work for 1 hour (60 minutes)
LK.getSound('typing').play();
// Flash the computer screen
var computer = shopInterface.children[3]; // The computer screen
tween(computer, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(computer, {
tint: 0x000080
}, {
duration: 200
});
}
});
});
coinFlipGame.on('gamblingComplete', function (result) {
statusBars.updateMoney(money);
});
dayNightCycle.on('hourChanged', function (timeData) {
// Check if it's time to open or close the shop
if (timeData.hour === 5 && !timeData.isAM) {
// 5 PM - Closing time
shopOpen = false;
endDay();
} else if (timeData.hour === 5 && timeData.isAM) {
// 5 AM - Opening time
shopOpen = true;
startDay();
}
// Decrease health over time (more when working)
if (shopOpen) {
health -= 0.5;
health = Math.max(0, health);
statusBars.updateHealth(health);
// Check if health is critically low
if (health <= 0) {
LK.showGameOver();
}
}
});
dayNightCycle.on('hourlyPayment', function (paymentData) {
if (fired) {
money += 50; // Adjusted payment after being fired
} else {
money += paymentData.amount;
}
statusBars.updateMoney(money);
});
// Handle customer creation and management
function createCustomer() {
if (!shopOpen || activeCustomers.length >= 3) {
return;
}
var customer = new Customer();
customer.x = 1024; // Center X
customer.y = 750; // Position Y
customer.originalX = customer.x;
// Offset each customer to prevent overlap
if (activeCustomers.length > 0) {
var offset = activeCustomers.length * 300 - 300;
customer.x += offset;
customer.originalX = customer.x;
}
// Handle customer served event
customer.on = function (event, callback) {
if (!customer._events) {
customer._events = {};
}
if (!customer._events[event]) {
customer._events[event] = [];
}
customer._events[event].push(callback);
};
customer.emit = function (event, data) {
if (customer._events && customer._events[event]) {
customer._events[event].forEach(function (callback) {
callback(data);
});
}
};
customer.on('customerServed', function (value) {
// Remove from active customers
var index = activeCustomers.indexOf(customer);
if (index !== -1) {
activeCustomers.splice(index, 1);
}
// Add money
money += value;
statusBars.updateMoney(money);
LK.getSound('cashRegister').play();
// Rearrange remaining customers
rearrangeCustomers();
// Remove from game
game.removeChild(customer);
});
// Add to game and track
activeCustomers.push(customer);
game.addChild(customer);
// Reset timer for next customer
timeToNextCustomer = Math.floor(Math.random() * 3) + 2;
}
function rearrangeCustomers() {
for (var i = 0; i < activeCustomers.length; i++) {
var targetX = 1024 + i * 300 - 300;
tween(activeCustomers[i], {
x: targetX
}, {
duration: 300
});
activeCustomers[i].originalX = targetX;
}
}
function startDay() {
// Reset daily variables
shopOpen = true;
timeToNextCustomer = 3;
// Ensure health display is updated
statusBars.updateHealth(health);
}
function endDay() {
// Save game state
storage.money = money;
storage.health = health;
storage.aiProgress = aiProgress;
storage.day = currentDay + 1;
// Clear active customers
for (var i = activeCustomers.length - 1; i >= 0; i--) {
game.removeChild(activeCustomers[i]);
}
activeCustomers = [];
// Update display
currentDay++;
dayNightCycle.updateDay(currentDay);
// Victory condition check
if (aiProgress >= 100) {
LK.showYouWin();
}
}
// Main game update loop
game.update = function () {
if (!gameRunning) {
return;
}
// Update time (1 real-time second = 1 minute in game)
if (LK.ticks % 60 === 0) {
dayNightCycle.updateTime();
aiProgress += 1; // Add 1% to the AI Project every in-game minute
statusBars.updateAIProgress(aiProgress);
// Process AI work time
if (workOnAITime > 0) {
workOnAITime--;
// Progress AI project
aiProgress += 0.5 + aiWorkers; // Workers contribute to AI progress
// Check if player should be fired
if (aiProgress > 10 && workOnAITime === 0 && !fired) {
fired = true;
// Show 'YOU GOT FIRED' screen
var firedScreen = new FiredScreen();
firedScreen.x = 1024;
firedScreen.y = 600;
game.addChild(firedScreen);
// Offer new job options
offerNewJobs();
}
if (aiProgress >= 100) {
aiProgress = 100;
// Victory achieved
}
statusBars.updateAIProgress(aiProgress);
}
// Process customer waiting time
if (shopOpen) {
customerWaitingTime++;
if (customerWaitingTime >= timeToNextCustomer) {
customerWaitingTime = 0;
createCustomer();
}
}
}
};
// Start game music
LK.playMusic('shopMusic');