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