/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 500,
arcadeLevel: 1,
cabinetsOwned: 1
});
/****
* Classes
****/
var ArcadeCabinet = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 1;
self.broken = false;
self.customerAssigned = false;
self.earningRate = [10, 15, 25][self.type - 1];
self.repairCost = [50, 75, 100][self.type - 1];
self.breakChance = [0.001, 0.0015, 0.002][self.type - 1];
self.coinTimer = 0;
self.coinInterval = 300;
// Create cabinet graphic based on type
var assetId = 'arcadeCabinet';
if (self.type === 2) {
assetId = 'arcadeCabinet2';
}
if (self.type === 3) {
assetId = 'arcadeCabinet3';
}
self.graphic = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Create broken overlay (invisible by default)
self.brokenOverlay = self.attachAsset('brokenOverlay', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self["break"] = function () {
if (!self.broken) {
self.broken = true;
self.brokenOverlay.alpha = 0.7;
if (self.customerAssigned) {
releaseCustomerFromCabinet(self);
}
}
};
self.repair = function () {
if (self.broken) {
self.broken = false;
self.brokenOverlay.alpha = 0;
tween(self.graphic, {
rotation: Math.PI * 2
}, {
duration: 500,
onFinish: function onFinish() {
self.graphic.rotation = 0;
}
});
LK.getSound('repair').play();
}
};
self.update = function () {
// Random chance of breaking
if (!self.broken && Math.random() < self.breakChance) {
self["break"]();
}
// Generate coins from customers
if (!self.broken && self.customerAssigned) {
self.coinTimer++;
if (self.coinTimer >= self.coinInterval) {
self.coinTimer = 0;
spawnCoin(self.x, self.y, self.earningRate);
}
}
};
self.down = function (x, y, obj) {
if (dragMode === "repair" && self.broken) {
if (money >= self.repairCost) {
money -= self.repairCost;
updateMoneyDisplay();
self.repair();
} else {
// Show not enough money message
showMessage("Not enough money to repair!");
}
}
};
return self;
});
var Button = Container.expand(function (label, callback) {
var self = Container.call(this);
self.callback = callback;
self.graphic = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
self.label = new Text2(label, {
size: 40,
fill: 0xFFFFFF
});
self.label.anchor.set(0.5, 0.5);
self.addChild(self.label);
self.setEnabled = function (enabled) {
if (enabled) {
self.graphic.alpha = 1;
} else {
self.graphic.alpha = 0.5;
}
self.enabled = enabled;
};
self.setEnabled(true);
self.down = function (x, y, obj) {
if (self.enabled) {
// Visual feedback
self.graphic.scale.set(0.95, 0.95);
if (self.callback) {
self.callback();
}
}
};
self.up = function (x, y, obj) {
self.graphic.scale.set(1, 1);
};
return self;
});
var Coin = Container.expand(function (value) {
var self = Container.call(this);
self.value = value || 10;
self.collected = false;
self.lifetime = 0;
self.maxLifetime = 300; // 5 seconds
self.graphic = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.collected) {
// Coin floats upward for visual effect
self.y -= 0.5;
self.lifetime++;
// Make coin pulse
if (self.lifetime % 30 < 15) {
self.graphic.scale.set(1.1, 1.1);
} else {
self.graphic.scale.set(1, 1);
}
// Make coin disappear after a while
if (self.lifetime >= self.maxLifetime) {
removeCoin(self);
}
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
money += self.value;
updateMoneyDisplay();
// Visual effect for collection
tween(self, {
alpha: 0,
y: self.y - 50
}, {
duration: 500,
onFinish: function onFinish() {
removeCoin(self);
}
});
LK.getSound('coin_collect').play();
}
};
self.down = function (x, y, obj) {
self.collect();
};
return self;
});
var Customer = Container.expand(function () {
var self = Container.call(this);
self.graphic = self.attachAsset('customer', {
anchorX: 0.5,
anchorY: 0.5
});
self.happiness = 100;
self.targetCabinet = null;
self.state = "entering"; // entering, playing, leaving
self.playTime = 0;
self.maxPlayTime = 600 + Math.random() * 600; // 10-20 seconds
self.speed = 2 + Math.random();
self.targetX = 0;
self.targetY = 0;
self.update = function () {
if (self.state === "entering") {
if (self.targetCabinet) {
self.targetX = self.targetCabinet.x;
self.targetY = self.targetCabinet.y + 50;
// Move towards target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
self.x = self.targetX;
self.y = self.targetY;
self.state = "playing";
}
} else {
self.state = "leaving";
}
} else if (self.state === "playing") {
if (self.targetCabinet && self.targetCabinet.broken) {
// Cabinet broke while playing
self.happiness -= 20;
self.state = "leaving";
releaseCustomerFromCabinet(self.targetCabinet);
self.targetCabinet = null;
LK.getSound('customer_unhappy').play();
} else {
self.playTime++;
if (self.playTime >= self.maxPlayTime) {
self.state = "leaving";
if (self.targetCabinet) {
releaseCustomerFromCabinet(self.targetCabinet);
self.targetCabinet = null;
}
LK.getSound('customer_happy').play();
}
}
} else if (self.state === "leaving") {
// Move towards exit
var exitX = 100;
var exitY = 200;
var dx = exitX - self.x;
var dy = exitY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
// Remove customer
removeCustomer(self);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Constants
var GRID_SIZE = 100;
var ARCADE_WIDTH = 10;
var ARCADE_HEIGHT = 20;
var CABINET_PRICE = [200, 500, 1000];
var MAX_CUSTOMERS = 10;
// Game state
var money = storage.money;
var arcadeLevel = storage.arcadeLevel;
var cabinetsOwned = storage.cabinetsOwned;
var dragMode = "none"; // none, cabinet1, cabinet2, cabinet3, repair
var dragCabinet = null;
var arcadeCabinets = [];
var customers = [];
var coins = [];
var grid = [];
var customerSpawnTimer = 0;
var customerSpawnInterval = 180; // 3 seconds
// Initialize grid
function initializeGrid() {
grid = [];
for (var x = 0; x < ARCADE_WIDTH; x++) {
grid[x] = [];
for (var y = 0; y < ARCADE_HEIGHT; y++) {
// Define walkable area (middle of the arcade)
var isWall = x === 0 || x === ARCADE_WIDTH - 1 || y === 0 || y === ARCADE_HEIGHT - 1;
grid[x][y] = {
type: isWall ? "wall" : "floor",
occupied: isWall
};
// Create visual tile
var tile = LK.getAsset(isWall ? 'wall' : 'tile', {
anchorX: 0.5,
anchorY: 0.5,
x: x * GRID_SIZE + GRID_SIZE / 2,
y: y * GRID_SIZE + GRID_SIZE / 2,
alpha: 0.5
});
game.addChild(tile);
}
}
}
// UI Elements
var moneyText = new Text2("$" + money, {
size: 60,
fill: 0xFFCC00
});
moneyText.anchor.set(0, 0);
LK.gui.topRight.addChild(moneyText);
var messageText = new Text2("", {
size: 40,
fill: 0xFFFFFF
});
messageText.anchor.set(0.5, 0);
LK.gui.top.addChild(messageText);
// Create tools
var toolBox = LK.getAsset('toolbox', {
anchorX: 0.5,
anchorY: 0.5
});
toolBox.x = 1900;
toolBox.y = 400;
game.addChild(toolBox);
// Create buttons
function createButtons() {
// Buy cabinet 1 button
var buyCabinet1Button = new Button("Basic ($" + CABINET_PRICE[0] + ")", function () {
if (money >= CABINET_PRICE[0]) {
dragMode = "cabinet1";
dragCabinet = new ArcadeCabinet(1);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
});
buyCabinet1Button.x = 1900;
buyCabinet1Button.y = 500;
game.addChild(buyCabinet1Button);
// Buy cabinet 2 button (unlocked at level 2)
var buyCabinet2Button = new Button("Deluxe ($" + CABINET_PRICE[1] + ")", function () {
if (arcadeLevel >= 2) {
if (money >= CABINET_PRICE[1]) {
dragMode = "cabinet2";
dragCabinet = new ArcadeCabinet(2);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
} else {
showMessage("Unlock at Arcade Level 2!");
}
});
buyCabinet2Button.x = 1900;
buyCabinet2Button.y = 600;
buyCabinet2Button.setEnabled(arcadeLevel >= 2);
game.addChild(buyCabinet2Button);
// Buy cabinet 3 button (unlocked at level 3)
var buyCabinet3Button = new Button("Premium ($" + CABINET_PRICE[2] + ")", function () {
if (arcadeLevel >= 3) {
if (money >= CABINET_PRICE[2]) {
dragMode = "cabinet3";
dragCabinet = new ArcadeCabinet(3);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
} else {
showMessage("Unlock at Arcade Level 3!");
}
});
buyCabinet3Button.x = 1900;
buyCabinet3Button.y = 700;
buyCabinet3Button.setEnabled(arcadeLevel >= 3);
game.addChild(buyCabinet3Button);
// Repair tool button
var repairButton = new Button("Repair Tool", function () {
dragMode = "repair";
showMessage("Click on broken cabinets to repair");
});
repairButton.x = 1900;
repairButton.y = 800;
game.addChild(repairButton);
// Upgrade arcade button
var upgradeButton = new Button("Upgrade Arcade ($" + arcadeLevel * 1000 + ")", function () {
var upgradeCost = arcadeLevel * 1000;
if (money >= upgradeCost) {
money -= upgradeCost;
arcadeLevel++;
storage.arcadeLevel = arcadeLevel;
updateMoneyDisplay();
showMessage("Arcade upgraded to level " + arcadeLevel + "!");
// Enable new cabinet buttons
if (arcadeLevel === 2) {
buyCabinet2Button.setEnabled(true);
} else if (arcadeLevel === 3) {
buyCabinet3Button.setEnabled(true);
}
// Update upgrade button text
upgradeButton.label.setText("Upgrade Arcade ($" + arcadeLevel * 1000 + ")");
} else {
showMessage("Not enough money to upgrade!");
}
});
upgradeButton.x = 1900;
upgradeButton.y = 900;
game.addChild(upgradeButton);
}
// Setup initial arcade
function setupArcade() {
initializeGrid();
createButtons();
// Place initial cabinet
var initialCabinet = new ArcadeCabinet(1);
initialCabinet.x = 300;
initialCabinet.y = 300;
game.addChild(initialCabinet);
arcadeCabinets.push(initialCabinet);
// Mark grid as occupied
var gridX = Math.floor(initialCabinet.x / GRID_SIZE);
var gridY = Math.floor(initialCabinet.y / GRID_SIZE);
if (gridX >= 0 && gridX < ARCADE_WIDTH && gridY >= 0 && gridY < ARCADE_HEIGHT) {
grid[gridX][gridY].occupied = true;
}
// Start playing background music
LK.playMusic('bgmusic');
}
// Utility functions
function updateMoneyDisplay() {
moneyText.setText("$" + money);
storage.money = money;
}
function showMessage(msg) {
messageText.setText(msg);
messageText.alpha = 1;
// Clear message after 3 seconds
LK.setTimeout(function () {
tween(messageText, {
alpha: 0
}, {
duration: 500
});
}, 3000);
}
function placeArcadeCabinet(cabinet, x, y) {
var gridX = Math.floor(x / GRID_SIZE);
var gridY = Math.floor(y / GRID_SIZE);
// Check if position is valid
if (gridX >= 0 && gridX < ARCADE_WIDTH && gridY >= 0 && gridY < ARCADE_HEIGHT && !grid[gridX][gridY].occupied && grid[gridX][gridY].type === "floor") {
// Snap to grid
cabinet.x = gridX * GRID_SIZE + GRID_SIZE / 2;
cabinet.y = gridY * GRID_SIZE + GRID_SIZE / 2;
// Mark as placed
arcadeCabinets.push(cabinet);
cabinetsOwned++;
storage.cabinetsOwned = cabinetsOwned;
// Mark grid cell as occupied
grid[gridX][gridY].occupied = true;
// Pay for the cabinet
money -= CABINET_PRICE[cabinet.type - 1];
updateMoneyDisplay();
LK.getSound('place_cabinet').play();
return true;
}
return false;
}
function spawnCustomer() {
if (customers.length < MAX_CUSTOMERS) {
var customer = new Customer();
// Start at entrance
customer.x = 100;
customer.y = 200;
// Find available arcade cabinet
var availableCabinets = arcadeCabinets.filter(function (cabinet) {
return !cabinet.broken && !cabinet.customerAssigned;
});
if (availableCabinets.length > 0) {
var randomCabinet = availableCabinets[Math.floor(Math.random() * availableCabinets.length)];
customer.targetCabinet = randomCabinet;
randomCabinet.customerAssigned = true;
}
game.addChild(customer);
customers.push(customer);
}
}
function removeCustomer(customer) {
var index = customers.indexOf(customer);
if (index !== -1) {
customers.splice(index, 1);
customer.destroy();
}
}
function releaseCustomerFromCabinet(cabinet) {
cabinet.customerAssigned = false;
// Find any customer assigned to this cabinet and update them
for (var i = 0; i < customers.length; i++) {
if (customers[i].targetCabinet === cabinet) {
customers[i].targetCabinet = null;
if (customers[i].state === "playing") {
customers[i].state = "leaving";
}
}
}
}
function spawnCoin(x, y, value) {
var coin = new Coin(value);
coin.x = x;
coin.y = y;
game.addChild(coin);
coins.push(coin);
}
function removeCoin(coin) {
var index = coins.indexOf(coin);
if (index !== -1) {
coins.splice(index, 1);
coin.destroy();
}
}
// Event handlers
game.down = function (x, y, obj) {
if (dragMode === "none") {
// Check for toolbox click
if (Math.abs(x - toolBox.x) < 30 && Math.abs(y - toolBox.y) < 30) {
dragMode = "repair";
showMessage("Click on broken cabinets to repair");
}
} else if (dragMode.startsWith("cabinet")) {
if (dragCabinet) {
var success = placeArcadeCabinet(dragCabinet, x, y);
if (success) {
dragCabinet = null;
dragMode = "none";
}
}
} else if (dragMode === "repair") {
// Repair functionality is handled in the ArcadeCabinet class
}
};
game.move = function (x, y, obj) {
if (dragCabinet) {
dragCabinet.x = x;
dragCabinet.y = y;
}
};
game.up = function (x, y, obj) {
// Cancel repair mode on click outside
if (dragMode === "repair") {
dragMode = "none";
}
};
// Game update loop
game.update = function () {
// Spawn customers
customerSpawnTimer++;
if (customerSpawnTimer >= customerSpawnInterval) {
customerSpawnTimer = 0;
spawnCustomer();
}
// Update all game elements
for (var i = 0; i < arcadeCabinets.length; i++) {
// Arcade cabinets are updated automatically by the engine
}
for (var i = 0; i < customers.length; i++) {
// Customers are updated automatically by the engine
}
for (var i = 0; i < coins.length; i++) {
// Coins are updated automatically by the engine
}
// Win condition check - you never "win" a tycoon game, but we can check for major milestones
if (arcadeCabinets.length >= 20 && arcadeLevel >= 3 && !reachedMilestone) {
showMessage("Amazing! Your arcade is thriving!");
reachedMilestone = true;
}
};
// Game initialization
var reachedMilestone = false;
setupArcade();
updateMoneyDisplay();
showMessage("Welcome to MG Arcade Tycoon!"); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 500,
arcadeLevel: 1,
cabinetsOwned: 1
});
/****
* Classes
****/
var ArcadeCabinet = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 1;
self.broken = false;
self.customerAssigned = false;
self.earningRate = [10, 15, 25][self.type - 1];
self.repairCost = [50, 75, 100][self.type - 1];
self.breakChance = [0.001, 0.0015, 0.002][self.type - 1];
self.coinTimer = 0;
self.coinInterval = 300;
// Create cabinet graphic based on type
var assetId = 'arcadeCabinet';
if (self.type === 2) {
assetId = 'arcadeCabinet2';
}
if (self.type === 3) {
assetId = 'arcadeCabinet3';
}
self.graphic = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Create broken overlay (invisible by default)
self.brokenOverlay = self.attachAsset('brokenOverlay', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self["break"] = function () {
if (!self.broken) {
self.broken = true;
self.brokenOverlay.alpha = 0.7;
if (self.customerAssigned) {
releaseCustomerFromCabinet(self);
}
}
};
self.repair = function () {
if (self.broken) {
self.broken = false;
self.brokenOverlay.alpha = 0;
tween(self.graphic, {
rotation: Math.PI * 2
}, {
duration: 500,
onFinish: function onFinish() {
self.graphic.rotation = 0;
}
});
LK.getSound('repair').play();
}
};
self.update = function () {
// Random chance of breaking
if (!self.broken && Math.random() < self.breakChance) {
self["break"]();
}
// Generate coins from customers
if (!self.broken && self.customerAssigned) {
self.coinTimer++;
if (self.coinTimer >= self.coinInterval) {
self.coinTimer = 0;
spawnCoin(self.x, self.y, self.earningRate);
}
}
};
self.down = function (x, y, obj) {
if (dragMode === "repair" && self.broken) {
if (money >= self.repairCost) {
money -= self.repairCost;
updateMoneyDisplay();
self.repair();
} else {
// Show not enough money message
showMessage("Not enough money to repair!");
}
}
};
return self;
});
var Button = Container.expand(function (label, callback) {
var self = Container.call(this);
self.callback = callback;
self.graphic = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
self.label = new Text2(label, {
size: 40,
fill: 0xFFFFFF
});
self.label.anchor.set(0.5, 0.5);
self.addChild(self.label);
self.setEnabled = function (enabled) {
if (enabled) {
self.graphic.alpha = 1;
} else {
self.graphic.alpha = 0.5;
}
self.enabled = enabled;
};
self.setEnabled(true);
self.down = function (x, y, obj) {
if (self.enabled) {
// Visual feedback
self.graphic.scale.set(0.95, 0.95);
if (self.callback) {
self.callback();
}
}
};
self.up = function (x, y, obj) {
self.graphic.scale.set(1, 1);
};
return self;
});
var Coin = Container.expand(function (value) {
var self = Container.call(this);
self.value = value || 10;
self.collected = false;
self.lifetime = 0;
self.maxLifetime = 300; // 5 seconds
self.graphic = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.collected) {
// Coin floats upward for visual effect
self.y -= 0.5;
self.lifetime++;
// Make coin pulse
if (self.lifetime % 30 < 15) {
self.graphic.scale.set(1.1, 1.1);
} else {
self.graphic.scale.set(1, 1);
}
// Make coin disappear after a while
if (self.lifetime >= self.maxLifetime) {
removeCoin(self);
}
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
money += self.value;
updateMoneyDisplay();
// Visual effect for collection
tween(self, {
alpha: 0,
y: self.y - 50
}, {
duration: 500,
onFinish: function onFinish() {
removeCoin(self);
}
});
LK.getSound('coin_collect').play();
}
};
self.down = function (x, y, obj) {
self.collect();
};
return self;
});
var Customer = Container.expand(function () {
var self = Container.call(this);
self.graphic = self.attachAsset('customer', {
anchorX: 0.5,
anchorY: 0.5
});
self.happiness = 100;
self.targetCabinet = null;
self.state = "entering"; // entering, playing, leaving
self.playTime = 0;
self.maxPlayTime = 600 + Math.random() * 600; // 10-20 seconds
self.speed = 2 + Math.random();
self.targetX = 0;
self.targetY = 0;
self.update = function () {
if (self.state === "entering") {
if (self.targetCabinet) {
self.targetX = self.targetCabinet.x;
self.targetY = self.targetCabinet.y + 50;
// Move towards target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
self.x = self.targetX;
self.y = self.targetY;
self.state = "playing";
}
} else {
self.state = "leaving";
}
} else if (self.state === "playing") {
if (self.targetCabinet && self.targetCabinet.broken) {
// Cabinet broke while playing
self.happiness -= 20;
self.state = "leaving";
releaseCustomerFromCabinet(self.targetCabinet);
self.targetCabinet = null;
LK.getSound('customer_unhappy').play();
} else {
self.playTime++;
if (self.playTime >= self.maxPlayTime) {
self.state = "leaving";
if (self.targetCabinet) {
releaseCustomerFromCabinet(self.targetCabinet);
self.targetCabinet = null;
}
LK.getSound('customer_happy').play();
}
}
} else if (self.state === "leaving") {
// Move towards exit
var exitX = 100;
var exitY = 200;
var dx = exitX - self.x;
var dy = exitY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > self.speed) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
} else {
// Remove customer
removeCustomer(self);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Constants
var GRID_SIZE = 100;
var ARCADE_WIDTH = 10;
var ARCADE_HEIGHT = 20;
var CABINET_PRICE = [200, 500, 1000];
var MAX_CUSTOMERS = 10;
// Game state
var money = storage.money;
var arcadeLevel = storage.arcadeLevel;
var cabinetsOwned = storage.cabinetsOwned;
var dragMode = "none"; // none, cabinet1, cabinet2, cabinet3, repair
var dragCabinet = null;
var arcadeCabinets = [];
var customers = [];
var coins = [];
var grid = [];
var customerSpawnTimer = 0;
var customerSpawnInterval = 180; // 3 seconds
// Initialize grid
function initializeGrid() {
grid = [];
for (var x = 0; x < ARCADE_WIDTH; x++) {
grid[x] = [];
for (var y = 0; y < ARCADE_HEIGHT; y++) {
// Define walkable area (middle of the arcade)
var isWall = x === 0 || x === ARCADE_WIDTH - 1 || y === 0 || y === ARCADE_HEIGHT - 1;
grid[x][y] = {
type: isWall ? "wall" : "floor",
occupied: isWall
};
// Create visual tile
var tile = LK.getAsset(isWall ? 'wall' : 'tile', {
anchorX: 0.5,
anchorY: 0.5,
x: x * GRID_SIZE + GRID_SIZE / 2,
y: y * GRID_SIZE + GRID_SIZE / 2,
alpha: 0.5
});
game.addChild(tile);
}
}
}
// UI Elements
var moneyText = new Text2("$" + money, {
size: 60,
fill: 0xFFCC00
});
moneyText.anchor.set(0, 0);
LK.gui.topRight.addChild(moneyText);
var messageText = new Text2("", {
size: 40,
fill: 0xFFFFFF
});
messageText.anchor.set(0.5, 0);
LK.gui.top.addChild(messageText);
// Create tools
var toolBox = LK.getAsset('toolbox', {
anchorX: 0.5,
anchorY: 0.5
});
toolBox.x = 1900;
toolBox.y = 400;
game.addChild(toolBox);
// Create buttons
function createButtons() {
// Buy cabinet 1 button
var buyCabinet1Button = new Button("Basic ($" + CABINET_PRICE[0] + ")", function () {
if (money >= CABINET_PRICE[0]) {
dragMode = "cabinet1";
dragCabinet = new ArcadeCabinet(1);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
});
buyCabinet1Button.x = 1900;
buyCabinet1Button.y = 500;
game.addChild(buyCabinet1Button);
// Buy cabinet 2 button (unlocked at level 2)
var buyCabinet2Button = new Button("Deluxe ($" + CABINET_PRICE[1] + ")", function () {
if (arcadeLevel >= 2) {
if (money >= CABINET_PRICE[1]) {
dragMode = "cabinet2";
dragCabinet = new ArcadeCabinet(2);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
} else {
showMessage("Unlock at Arcade Level 2!");
}
});
buyCabinet2Button.x = 1900;
buyCabinet2Button.y = 600;
buyCabinet2Button.setEnabled(arcadeLevel >= 2);
game.addChild(buyCabinet2Button);
// Buy cabinet 3 button (unlocked at level 3)
var buyCabinet3Button = new Button("Premium ($" + CABINET_PRICE[2] + ")", function () {
if (arcadeLevel >= 3) {
if (money >= CABINET_PRICE[2]) {
dragMode = "cabinet3";
dragCabinet = new ArcadeCabinet(3);
game.addChild(dragCabinet);
} else {
showMessage("Not enough money!");
}
} else {
showMessage("Unlock at Arcade Level 3!");
}
});
buyCabinet3Button.x = 1900;
buyCabinet3Button.y = 700;
buyCabinet3Button.setEnabled(arcadeLevel >= 3);
game.addChild(buyCabinet3Button);
// Repair tool button
var repairButton = new Button("Repair Tool", function () {
dragMode = "repair";
showMessage("Click on broken cabinets to repair");
});
repairButton.x = 1900;
repairButton.y = 800;
game.addChild(repairButton);
// Upgrade arcade button
var upgradeButton = new Button("Upgrade Arcade ($" + arcadeLevel * 1000 + ")", function () {
var upgradeCost = arcadeLevel * 1000;
if (money >= upgradeCost) {
money -= upgradeCost;
arcadeLevel++;
storage.arcadeLevel = arcadeLevel;
updateMoneyDisplay();
showMessage("Arcade upgraded to level " + arcadeLevel + "!");
// Enable new cabinet buttons
if (arcadeLevel === 2) {
buyCabinet2Button.setEnabled(true);
} else if (arcadeLevel === 3) {
buyCabinet3Button.setEnabled(true);
}
// Update upgrade button text
upgradeButton.label.setText("Upgrade Arcade ($" + arcadeLevel * 1000 + ")");
} else {
showMessage("Not enough money to upgrade!");
}
});
upgradeButton.x = 1900;
upgradeButton.y = 900;
game.addChild(upgradeButton);
}
// Setup initial arcade
function setupArcade() {
initializeGrid();
createButtons();
// Place initial cabinet
var initialCabinet = new ArcadeCabinet(1);
initialCabinet.x = 300;
initialCabinet.y = 300;
game.addChild(initialCabinet);
arcadeCabinets.push(initialCabinet);
// Mark grid as occupied
var gridX = Math.floor(initialCabinet.x / GRID_SIZE);
var gridY = Math.floor(initialCabinet.y / GRID_SIZE);
if (gridX >= 0 && gridX < ARCADE_WIDTH && gridY >= 0 && gridY < ARCADE_HEIGHT) {
grid[gridX][gridY].occupied = true;
}
// Start playing background music
LK.playMusic('bgmusic');
}
// Utility functions
function updateMoneyDisplay() {
moneyText.setText("$" + money);
storage.money = money;
}
function showMessage(msg) {
messageText.setText(msg);
messageText.alpha = 1;
// Clear message after 3 seconds
LK.setTimeout(function () {
tween(messageText, {
alpha: 0
}, {
duration: 500
});
}, 3000);
}
function placeArcadeCabinet(cabinet, x, y) {
var gridX = Math.floor(x / GRID_SIZE);
var gridY = Math.floor(y / GRID_SIZE);
// Check if position is valid
if (gridX >= 0 && gridX < ARCADE_WIDTH && gridY >= 0 && gridY < ARCADE_HEIGHT && !grid[gridX][gridY].occupied && grid[gridX][gridY].type === "floor") {
// Snap to grid
cabinet.x = gridX * GRID_SIZE + GRID_SIZE / 2;
cabinet.y = gridY * GRID_SIZE + GRID_SIZE / 2;
// Mark as placed
arcadeCabinets.push(cabinet);
cabinetsOwned++;
storage.cabinetsOwned = cabinetsOwned;
// Mark grid cell as occupied
grid[gridX][gridY].occupied = true;
// Pay for the cabinet
money -= CABINET_PRICE[cabinet.type - 1];
updateMoneyDisplay();
LK.getSound('place_cabinet').play();
return true;
}
return false;
}
function spawnCustomer() {
if (customers.length < MAX_CUSTOMERS) {
var customer = new Customer();
// Start at entrance
customer.x = 100;
customer.y = 200;
// Find available arcade cabinet
var availableCabinets = arcadeCabinets.filter(function (cabinet) {
return !cabinet.broken && !cabinet.customerAssigned;
});
if (availableCabinets.length > 0) {
var randomCabinet = availableCabinets[Math.floor(Math.random() * availableCabinets.length)];
customer.targetCabinet = randomCabinet;
randomCabinet.customerAssigned = true;
}
game.addChild(customer);
customers.push(customer);
}
}
function removeCustomer(customer) {
var index = customers.indexOf(customer);
if (index !== -1) {
customers.splice(index, 1);
customer.destroy();
}
}
function releaseCustomerFromCabinet(cabinet) {
cabinet.customerAssigned = false;
// Find any customer assigned to this cabinet and update them
for (var i = 0; i < customers.length; i++) {
if (customers[i].targetCabinet === cabinet) {
customers[i].targetCabinet = null;
if (customers[i].state === "playing") {
customers[i].state = "leaving";
}
}
}
}
function spawnCoin(x, y, value) {
var coin = new Coin(value);
coin.x = x;
coin.y = y;
game.addChild(coin);
coins.push(coin);
}
function removeCoin(coin) {
var index = coins.indexOf(coin);
if (index !== -1) {
coins.splice(index, 1);
coin.destroy();
}
}
// Event handlers
game.down = function (x, y, obj) {
if (dragMode === "none") {
// Check for toolbox click
if (Math.abs(x - toolBox.x) < 30 && Math.abs(y - toolBox.y) < 30) {
dragMode = "repair";
showMessage("Click on broken cabinets to repair");
}
} else if (dragMode.startsWith("cabinet")) {
if (dragCabinet) {
var success = placeArcadeCabinet(dragCabinet, x, y);
if (success) {
dragCabinet = null;
dragMode = "none";
}
}
} else if (dragMode === "repair") {
// Repair functionality is handled in the ArcadeCabinet class
}
};
game.move = function (x, y, obj) {
if (dragCabinet) {
dragCabinet.x = x;
dragCabinet.y = y;
}
};
game.up = function (x, y, obj) {
// Cancel repair mode on click outside
if (dragMode === "repair") {
dragMode = "none";
}
};
// Game update loop
game.update = function () {
// Spawn customers
customerSpawnTimer++;
if (customerSpawnTimer >= customerSpawnInterval) {
customerSpawnTimer = 0;
spawnCustomer();
}
// Update all game elements
for (var i = 0; i < arcadeCabinets.length; i++) {
// Arcade cabinets are updated automatically by the engine
}
for (var i = 0; i < customers.length; i++) {
// Customers are updated automatically by the engine
}
for (var i = 0; i < coins.length; i++) {
// Coins are updated automatically by the engine
}
// Win condition check - you never "win" a tycoon game, but we can check for major milestones
if (arcadeCabinets.length >= 20 && arcadeLevel >= 3 && !reachedMilestone) {
showMessage("Amazing! Your arcade is thriving!");
reachedMilestone = true;
}
};
// Game initialization
var reachedMilestone = false;
setupArcade();
updateMoneyDisplay();
showMessage("Welcome to MG Arcade Tycoon!");
client MG boy. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
tile red and blu. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
wall red and blu. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
arcadecabinet MG. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows