/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 100,
robots: 0,
partsPerClick: 1,
autoPartsPerSecond: 0,
partCost: 10,
clickUpgradeCost: 50,
autoUpgradeCost: 100,
baseProduceTime: 5000,
lastTimestamp: undefined,
completedOrders: 0,
orderLevel: 1
});
/****
* Classes
****/
var OrderCard = Container.expand(function (requiredRobots, reward) {
var self = Container.call(this);
self.requiredRobots = requiredRobots;
self.reward = reward;
var cardBase = self.attachAsset('order_card', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('Robot Order', {
size: 40,
fill: 0x333333
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -70;
self.addChild(titleText);
var requirementText = new Text2('Need: ' + requiredRobots + ' robots', {
size: 30,
fill: 0x333333
});
requirementText.anchor.set(0.5, 0.5);
requirementText.y = -20;
self.addChild(requirementText);
var rewardText = new Text2('Reward: ' + reward + ' coins', {
size: 30,
fill: 0x333333
});
rewardText.anchor.set(0.5, 0.5);
rewardText.y = 20;
self.addChild(rewardText);
var statusText = new Text2('In Progress', {
size: 35,
fill: 0xE74C3C
});
statusText.anchor.set(0.5, 0.5);
statusText.y = 70;
self.addChild(statusText);
self.checkCompletion = function () {
if (storage.robots >= self.requiredRobots) {
return true;
}
return false;
};
self.complete = function () {
storage.robots -= self.requiredRobots;
storage.coins += self.reward;
storage.completedOrders += 1;
// Increase order level every 3 completed orders
if (storage.completedOrders % 3 === 0) {
storage.orderLevel += 1;
}
robotsText.setText('Robots: ' + storage.robots);
coinsText.setText('Coins: ' + storage.coins);
ordersCompletedText.setText('Orders completed: ' + storage.completedOrders);
statusText.setText('Completed!');
tween(statusText, {
fill: 0x27AE60
}, {
duration: 300
});
LK.getSound('order_complete').play();
// Replace this order with a new one after a short delay
LK.setTimeout(function () {
createNewOrder();
}, 2000);
};
self.down = function (x, y, obj) {
if (self.checkCompletion()) {
self.complete();
}
};
return self;
});
var ProductionStation = Container.expand(function () {
var self = Container.call(this);
var stationBase = self.attachAsset('production_station', {
anchorX: 0.5,
anchorY: 0.5
});
var progressBar = self.attachAsset('robot_arm', {
anchorX: 0,
anchorY: 0.5,
x: -120,
y: 80,
scaleX: 4,
scaleY: 0.5
});
var progressText = new Text2('0%', {
size: 40,
fill: 0xFFFFFF
});
progressText.anchor.set(0.5, 0.5);
progressText.x = 0;
progressText.y = 80;
self.addChild(progressText);
self.isProducing = false;
self.progress = 0;
self.produceTime = storage.baseProduceTime;
self.updateProgress = function (delta) {
if (self.isProducing) {
self.progress += delta;
var percent = Math.min(100, Math.floor(self.progress / self.produceTime * 100));
progressText.setText(percent + '%');
progressBar.scaleX = 4 * (percent / 100);
if (self.progress >= self.produceTime) {
self.completeProduction();
}
}
};
self.startProduction = function () {
if (!self.isProducing) {
self.isProducing = true;
self.progress = 0;
progressText.setText('0%');
progressBar.scaleX = 0;
}
};
self.completeProduction = function () {
self.isProducing = false;
self.progress = 0;
progressText.setText('Ready');
progressBar.scaleX = 4;
storage.robots += 1;
LK.getSound('build_robot').play();
robotsText.setText('Robots: ' + storage.robots);
// See if we can complete any pending orders
checkOrders();
};
self.down = function (x, y, obj) {
if (!self.isProducing && storage.coins >= storage.partCost * 5) {
storage.coins -= storage.partCost * 5;
coinsText.setText('Coins: ' + storage.coins);
self.startProduction();
}
};
progressText.setText('Ready');
return self;
});
var Robot = Container.expand(function () {
var self = Container.call(this);
var base = self.attachAsset('robot_base', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
var head = self.attachAsset('robot_head', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -80
});
var leftArm = self.attachAsset('robot_arm', {
anchorX: 0.5,
anchorY: 0.1,
x: -100,
y: -50,
rotation: -0.2
});
var rightArm = self.attachAsset('robot_arm', {
anchorX: 0.5,
anchorY: 0.1,
x: 100,
y: -50,
rotation: 0.2
});
var leftLeg = self.attachAsset('robot_leg', {
anchorX: 0.5,
anchorY: 0.1,
x: -60,
y: 80
});
var rightLeg = self.attachAsset('robot_leg', {
anchorX: 0.5,
anchorY: 0.1,
x: 60,
y: 80
});
self.animateIdle = function () {
// Head bobbing animation
tween(head, {
y: -75
}, {
duration: 1500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(head, {
y: -80
}, {
duration: 1500,
easing: tween.easeInOut,
onFinish: self.animateIdle
});
}
});
// Arm swaying animations
tween(leftArm, {
rotation: -0.3
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(leftArm, {
rotation: -0.2
}, {
duration: 2000,
easing: tween.easeInOut
});
}
});
tween(rightArm, {
rotation: 0.3
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(rightArm, {
rotation: 0.2
}, {
duration: 2000,
easing: tween.easeInOut
});
}
});
};
self.startAnimations = function () {
self.animateIdle();
};
return self;
});
var UpgradeButton = Container.expand(function (upgradeType, upgradeText) {
var self = Container.call(this);
self.upgradeType = upgradeType;
var buttonBase = self.attachAsset('upgrade_button', {
anchorX: 0.5,
anchorY: 0.5
});
var label = new Text2(upgradeText, {
size: 40,
fill: 0xFFFFFF
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
var costText = new Text2('', {
size: 30,
fill: 0xFFFFFF
});
costText.anchor.set(0.5, 0.5);
costText.y = 50;
self.addChild(costText);
self.updateCost = function () {
if (self.upgradeType === 'click') {
costText.setText('Cost: ' + storage.clickUpgradeCost);
} else if (self.upgradeType === 'auto') {
costText.setText('Cost: ' + storage.autoUpgradeCost);
} else if (self.upgradeType === 'speed') {
costText.setText('Cost: ' + Math.floor(storage.baseProduceTime / 2));
}
};
self.down = function (x, y, obj) {
if (self.upgradeType === 'click') {
if (storage.coins >= storage.clickUpgradeCost) {
storage.coins -= storage.clickUpgradeCost;
storage.partsPerClick += 1;
storage.clickUpgradeCost = Math.floor(storage.clickUpgradeCost * 1.5);
LK.getSound('upgrade_purchased').play();
partsPerClickText.setText('Parts per click: ' + storage.partsPerClick);
self.updateCost();
coinsText.setText('Coins: ' + storage.coins);
}
} else if (self.upgradeType === 'auto') {
if (storage.coins >= storage.autoUpgradeCost) {
storage.coins -= storage.autoUpgradeCost;
storage.autoPartsPerSecond += 1;
storage.autoUpgradeCost = Math.floor(storage.autoUpgradeCost * 1.8);
LK.getSound('upgrade_purchased').play();
autoPartsText.setText('Auto parts: ' + storage.autoPartsPerSecond + '/sec');
self.updateCost();
coinsText.setText('Coins: ' + storage.coins);
}
} else if (self.upgradeType === 'speed') {
var speedCost = Math.floor(storage.baseProduceTime / 2);
if (storage.coins >= speedCost && storage.baseProduceTime > 1000) {
storage.coins -= speedCost;
storage.baseProduceTime = Math.max(1000, storage.baseProduceTime - 500);
productionStation.produceTime = storage.baseProduceTime;
LK.getSound('upgrade_purchased').play();
self.updateCost();
coinsText.setText('Coins: ' + storage.coins);
}
}
};
self.updateCost();
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
LK.playMusic('factory_ambience');
// Create factory floor
var factoryFloor = LK.getAsset('factory_floor', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1500 / 2 + 400
});
game.addChild(factoryFloor);
// Create parts production area
var partsArea = new Container();
partsArea.x = 400;
partsArea.y = 600;
game.addChild(partsArea);
var partsIcon = LK.getAsset('resource_icon', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 3,
x: 0,
y: 0
});
partsArea.addChild(partsIcon);
// Create UI elements
var coinsText = new Text2('Coins: ' + storage.coins, {
size: 60,
fill: 0xF1C40F
});
coinsText.anchor.set(0, 0);
LK.gui.topRight.addChild(coinsText);
coinsText.x = -coinsText.width - 20;
coinsText.y = 20;
var robotsText = new Text2('Robots: ' + storage.robots, {
size: 60,
fill: 0x3498DB
});
robotsText.anchor.set(0, 0);
LK.gui.topRight.addChild(robotsText);
robotsText.x = -robotsText.width - 20;
robotsText.y = 100;
var partsPerClickText = new Text2('Parts per click: ' + storage.partsPerClick, {
size: 40,
fill: 0xFFFFFF
});
partsPerClickText.anchor.set(0.5, 0.5);
partsPerClickText.x = partsIcon.x;
partsPerClickText.y = partsIcon.y + 120;
partsArea.addChild(partsPerClickText);
var autoPartsText = new Text2('Auto parts: ' + storage.autoPartsPerSecond + '/sec', {
size: 40,
fill: 0xFFFFFF
});
autoPartsText.anchor.set(0.5, 0.5);
autoPartsText.x = partsIcon.x;
autoPartsText.y = partsIcon.y + 180;
partsArea.addChild(autoPartsText);
var ordersCompletedText = new Text2('Orders completed: ' + storage.completedOrders, {
size: 50,
fill: 0xE74C3C
});
ordersCompletedText.anchor.set(0.5, 0);
ordersCompletedText.y = 20;
LK.gui.top.addChild(ordersCompletedText);
// Create production station
var productionStation = new ProductionStation();
productionStation.x = 2048 / 2;
productionStation.y = 800;
game.addChild(productionStation);
var productionLabel = new Text2('Robot Production Station\n(Click to build robot - costs 5 parts)', {
size: 40,
fill: 0xFFFFFF,
align: "center"
});
productionLabel.anchor.set(0.5, 0.5);
productionLabel.x = productionStation.x;
productionLabel.y = productionStation.y - 200;
game.addChild(productionLabel);
// Create robot display
var robotDisplay = new Robot();
robotDisplay.x = 1600;
robotDisplay.y = 800;
robotDisplay.scale.set(1.5, 1.5);
game.addChild(robotDisplay);
robotDisplay.startAnimations();
// Create upgrade buttons
var clickUpgradeButton = new UpgradeButton('click', 'Upgrade Click');
clickUpgradeButton.x = 400;
clickUpgradeButton.y = 1200;
game.addChild(clickUpgradeButton);
var autoUpgradeButton = new UpgradeButton('auto', 'Upgrade Auto');
autoUpgradeButton.x = 1000;
autoUpgradeButton.y = 1200;
game.addChild(autoUpgradeButton);
var speedUpgradeButton = new UpgradeButton('speed', 'Upgrade Speed');
speedUpgradeButton.x = 1600;
speedUpgradeButton.y = 1200;
game.addChild(speedUpgradeButton);
// Variable to track current order
var currentOrder = null;
// Function to create new orders
function createNewOrder() {
if (currentOrder) {
game.removeChild(currentOrder);
}
// Create progressively harder orders as player completes more
var requiredRobots = Math.max(1, Math.floor(storage.orderLevel * 1.5));
var reward = Math.floor(requiredRobots * 50 * (1 + storage.orderLevel * 0.2));
currentOrder = new OrderCard(requiredRobots, reward);
currentOrder.x = 2048 / 2;
currentOrder.y = 1600;
game.addChild(currentOrder);
}
// Function to check if order can be completed
function checkOrders() {
if (currentOrder && currentOrder.checkCompletion()) {
// Visual hint that order can be completed
tween(currentOrder, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
onFinish: function onFinish() {
tween(currentOrder, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
});
}
}
// Create initial order
createNewOrder();
// Handle part production on clicks
partsIcon.interactive = true;
partsIcon.down = function (x, y, obj) {
// Flash and scale effect for the click
tween(partsIcon, {
scaleX: 3.3,
scaleY: 3.3
}, {
duration: 100,
onFinish: function onFinish() {
tween(partsIcon, {
scaleX: 3,
scaleY: 3
}, {
duration: 100
});
}
});
// Add resources based on upgrades
storage.coins += storage.partsPerClick * storage.partCost;
coinsText.setText('Coins: ' + storage.coins);
};
// Process idle time when game loads
var currentTime = Date.now();
var idleTime = Math.floor((currentTime - storage.lastTimestamp) / 1000);
if (idleTime > 0 && storage.autoPartsPerSecond > 0) {
var idleCoins = Math.floor(idleTime * storage.autoPartsPerSecond * storage.partCost * 0.5); // 50% efficiency when idle
storage.coins += idleCoins;
// Show welcome back message
var welcomeBack = new Text2('Welcome Back!\nYou earned ' + idleCoins + ' coins while away.', {
size: 60,
fill: 0xF1C40F,
align: "center"
});
welcomeBack.anchor.set(0.5, 0.5);
welcomeBack.x = 2048 / 2;
welcomeBack.y = 2732 / 2;
game.addChild(welcomeBack);
// Fade out welcome message
tween(welcomeBack, {
alpha: 0
}, {
duration: 3000,
onFinish: function onFinish() {
game.removeChild(welcomeBack);
}
});
}
// Game update loop
var lastUpdateTime = Date.now();
game.update = function () {
var currentTime = Date.now();
var deltaTime = currentTime - lastUpdateTime;
lastUpdateTime = currentTime;
// Auto parts generation
if (storage.autoPartsPerSecond > 0) {
var partsGenerated = deltaTime / 1000 * storage.autoPartsPerSecond;
storage.coins += partsGenerated * storage.partCost;
coinsText.setText('Coins: ' + Math.floor(storage.coins));
}
// Update production station
productionStation.updateProgress(deltaTime);
// Save timestamp for idle calculations
storage.lastTimestamp = currentTime;
};
// Add game description to the UI
var gameTitle = new Text2('IdleBot Manufacturing', {
size: 70,
fill: 0x3498DB
});
gameTitle.anchor.set(0, 0);
gameTitle.x = 30;
gameTitle.y = 20;
LK.gui.topLeft.addChild(gameTitle); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,534 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ coins: 100,
+ robots: 0,
+ partsPerClick: 1,
+ autoPartsPerSecond: 0,
+ partCost: 10,
+ clickUpgradeCost: 50,
+ autoUpgradeCost: 100,
+ baseProduceTime: 5000,
+ lastTimestamp: undefined,
+ completedOrders: 0,
+ orderLevel: 1
+});
+
+/****
+* Classes
+****/
+var OrderCard = Container.expand(function (requiredRobots, reward) {
+ var self = Container.call(this);
+ self.requiredRobots = requiredRobots;
+ self.reward = reward;
+ var cardBase = self.attachAsset('order_card', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var titleText = new Text2('Robot Order', {
+ size: 40,
+ fill: 0x333333
+ });
+ titleText.anchor.set(0.5, 0.5);
+ titleText.y = -70;
+ self.addChild(titleText);
+ var requirementText = new Text2('Need: ' + requiredRobots + ' robots', {
+ size: 30,
+ fill: 0x333333
+ });
+ requirementText.anchor.set(0.5, 0.5);
+ requirementText.y = -20;
+ self.addChild(requirementText);
+ var rewardText = new Text2('Reward: ' + reward + ' coins', {
+ size: 30,
+ fill: 0x333333
+ });
+ rewardText.anchor.set(0.5, 0.5);
+ rewardText.y = 20;
+ self.addChild(rewardText);
+ var statusText = new Text2('In Progress', {
+ size: 35,
+ fill: 0xE74C3C
+ });
+ statusText.anchor.set(0.5, 0.5);
+ statusText.y = 70;
+ self.addChild(statusText);
+ self.checkCompletion = function () {
+ if (storage.robots >= self.requiredRobots) {
+ return true;
+ }
+ return false;
+ };
+ self.complete = function () {
+ storage.robots -= self.requiredRobots;
+ storage.coins += self.reward;
+ storage.completedOrders += 1;
+ // Increase order level every 3 completed orders
+ if (storage.completedOrders % 3 === 0) {
+ storage.orderLevel += 1;
+ }
+ robotsText.setText('Robots: ' + storage.robots);
+ coinsText.setText('Coins: ' + storage.coins);
+ ordersCompletedText.setText('Orders completed: ' + storage.completedOrders);
+ statusText.setText('Completed!');
+ tween(statusText, {
+ fill: 0x27AE60
+ }, {
+ duration: 300
+ });
+ LK.getSound('order_complete').play();
+ // Replace this order with a new one after a short delay
+ LK.setTimeout(function () {
+ createNewOrder();
+ }, 2000);
+ };
+ self.down = function (x, y, obj) {
+ if (self.checkCompletion()) {
+ self.complete();
+ }
+ };
+ return self;
+});
+var ProductionStation = Container.expand(function () {
+ var self = Container.call(this);
+ var stationBase = self.attachAsset('production_station', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var progressBar = self.attachAsset('robot_arm', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: -120,
+ y: 80,
+ scaleX: 4,
+ scaleY: 0.5
+ });
+ var progressText = new Text2('0%', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ progressText.anchor.set(0.5, 0.5);
+ progressText.x = 0;
+ progressText.y = 80;
+ self.addChild(progressText);
+ self.isProducing = false;
+ self.progress = 0;
+ self.produceTime = storage.baseProduceTime;
+ self.updateProgress = function (delta) {
+ if (self.isProducing) {
+ self.progress += delta;
+ var percent = Math.min(100, Math.floor(self.progress / self.produceTime * 100));
+ progressText.setText(percent + '%');
+ progressBar.scaleX = 4 * (percent / 100);
+ if (self.progress >= self.produceTime) {
+ self.completeProduction();
+ }
+ }
+ };
+ self.startProduction = function () {
+ if (!self.isProducing) {
+ self.isProducing = true;
+ self.progress = 0;
+ progressText.setText('0%');
+ progressBar.scaleX = 0;
+ }
+ };
+ self.completeProduction = function () {
+ self.isProducing = false;
+ self.progress = 0;
+ progressText.setText('Ready');
+ progressBar.scaleX = 4;
+ storage.robots += 1;
+ LK.getSound('build_robot').play();
+ robotsText.setText('Robots: ' + storage.robots);
+ // See if we can complete any pending orders
+ checkOrders();
+ };
+ self.down = function (x, y, obj) {
+ if (!self.isProducing && storage.coins >= storage.partCost * 5) {
+ storage.coins -= storage.partCost * 5;
+ coinsText.setText('Coins: ' + storage.coins);
+ self.startProduction();
+ }
+ };
+ progressText.setText('Ready');
+ return self;
+});
+var Robot = Container.expand(function () {
+ var self = Container.call(this);
+ var base = self.attachAsset('robot_base', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.8,
+ scaleY: 0.8
+ });
+ var head = self.attachAsset('robot_head', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: -80
+ });
+ var leftArm = self.attachAsset('robot_arm', {
+ anchorX: 0.5,
+ anchorY: 0.1,
+ x: -100,
+ y: -50,
+ rotation: -0.2
+ });
+ var rightArm = self.attachAsset('robot_arm', {
+ anchorX: 0.5,
+ anchorY: 0.1,
+ x: 100,
+ y: -50,
+ rotation: 0.2
+ });
+ var leftLeg = self.attachAsset('robot_leg', {
+ anchorX: 0.5,
+ anchorY: 0.1,
+ x: -60,
+ y: 80
+ });
+ var rightLeg = self.attachAsset('robot_leg', {
+ anchorX: 0.5,
+ anchorY: 0.1,
+ x: 60,
+ y: 80
+ });
+ self.animateIdle = function () {
+ // Head bobbing animation
+ tween(head, {
+ y: -75
+ }, {
+ duration: 1500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(head, {
+ y: -80
+ }, {
+ duration: 1500,
+ easing: tween.easeInOut,
+ onFinish: self.animateIdle
+ });
+ }
+ });
+ // Arm swaying animations
+ tween(leftArm, {
+ rotation: -0.3
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(leftArm, {
+ rotation: -0.2
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ tween(rightArm, {
+ rotation: 0.3
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(rightArm, {
+ rotation: 0.2
+ }, {
+ duration: 2000,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ };
+ self.startAnimations = function () {
+ self.animateIdle();
+ };
+ return self;
+});
+var UpgradeButton = Container.expand(function (upgradeType, upgradeText) {
+ var self = Container.call(this);
+ self.upgradeType = upgradeType;
+ var buttonBase = self.attachAsset('upgrade_button', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var label = new Text2(upgradeText, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ label.anchor.set(0.5, 0.5);
+ self.addChild(label);
+ var costText = new Text2('', {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ costText.anchor.set(0.5, 0.5);
+ costText.y = 50;
+ self.addChild(costText);
+ self.updateCost = function () {
+ if (self.upgradeType === 'click') {
+ costText.setText('Cost: ' + storage.clickUpgradeCost);
+ } else if (self.upgradeType === 'auto') {
+ costText.setText('Cost: ' + storage.autoUpgradeCost);
+ } else if (self.upgradeType === 'speed') {
+ costText.setText('Cost: ' + Math.floor(storage.baseProduceTime / 2));
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (self.upgradeType === 'click') {
+ if (storage.coins >= storage.clickUpgradeCost) {
+ storage.coins -= storage.clickUpgradeCost;
+ storage.partsPerClick += 1;
+ storage.clickUpgradeCost = Math.floor(storage.clickUpgradeCost * 1.5);
+ LK.getSound('upgrade_purchased').play();
+ partsPerClickText.setText('Parts per click: ' + storage.partsPerClick);
+ self.updateCost();
+ coinsText.setText('Coins: ' + storage.coins);
+ }
+ } else if (self.upgradeType === 'auto') {
+ if (storage.coins >= storage.autoUpgradeCost) {
+ storage.coins -= storage.autoUpgradeCost;
+ storage.autoPartsPerSecond += 1;
+ storage.autoUpgradeCost = Math.floor(storage.autoUpgradeCost * 1.8);
+ LK.getSound('upgrade_purchased').play();
+ autoPartsText.setText('Auto parts: ' + storage.autoPartsPerSecond + '/sec');
+ self.updateCost();
+ coinsText.setText('Coins: ' + storage.coins);
+ }
+ } else if (self.upgradeType === 'speed') {
+ var speedCost = Math.floor(storage.baseProduceTime / 2);
+ if (storage.coins >= speedCost && storage.baseProduceTime > 1000) {
+ storage.coins -= speedCost;
+ storage.baseProduceTime = Math.max(1000, storage.baseProduceTime - 500);
+ productionStation.produceTime = storage.baseProduceTime;
+ LK.getSound('upgrade_purchased').play();
+ self.updateCost();
+ coinsText.setText('Coins: ' + storage.coins);
+ }
+ }
+ };
+ self.updateCost();
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+LK.playMusic('factory_ambience');
+// Create factory floor
+var factoryFloor = LK.getAsset('factory_floor', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 1500 / 2 + 400
+});
+game.addChild(factoryFloor);
+// Create parts production area
+var partsArea = new Container();
+partsArea.x = 400;
+partsArea.y = 600;
+game.addChild(partsArea);
+var partsIcon = LK.getAsset('resource_icon', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 3,
+ scaleY: 3,
+ x: 0,
+ y: 0
+});
+partsArea.addChild(partsIcon);
+// Create UI elements
+var coinsText = new Text2('Coins: ' + storage.coins, {
+ size: 60,
+ fill: 0xF1C40F
+});
+coinsText.anchor.set(0, 0);
+LK.gui.topRight.addChild(coinsText);
+coinsText.x = -coinsText.width - 20;
+coinsText.y = 20;
+var robotsText = new Text2('Robots: ' + storage.robots, {
+ size: 60,
+ fill: 0x3498DB
+});
+robotsText.anchor.set(0, 0);
+LK.gui.topRight.addChild(robotsText);
+robotsText.x = -robotsText.width - 20;
+robotsText.y = 100;
+var partsPerClickText = new Text2('Parts per click: ' + storage.partsPerClick, {
+ size: 40,
+ fill: 0xFFFFFF
+});
+partsPerClickText.anchor.set(0.5, 0.5);
+partsPerClickText.x = partsIcon.x;
+partsPerClickText.y = partsIcon.y + 120;
+partsArea.addChild(partsPerClickText);
+var autoPartsText = new Text2('Auto parts: ' + storage.autoPartsPerSecond + '/sec', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+autoPartsText.anchor.set(0.5, 0.5);
+autoPartsText.x = partsIcon.x;
+autoPartsText.y = partsIcon.y + 180;
+partsArea.addChild(autoPartsText);
+var ordersCompletedText = new Text2('Orders completed: ' + storage.completedOrders, {
+ size: 50,
+ fill: 0xE74C3C
+});
+ordersCompletedText.anchor.set(0.5, 0);
+ordersCompletedText.y = 20;
+LK.gui.top.addChild(ordersCompletedText);
+// Create production station
+var productionStation = new ProductionStation();
+productionStation.x = 2048 / 2;
+productionStation.y = 800;
+game.addChild(productionStation);
+var productionLabel = new Text2('Robot Production Station\n(Click to build robot - costs 5 parts)', {
+ size: 40,
+ fill: 0xFFFFFF,
+ align: "center"
+});
+productionLabel.anchor.set(0.5, 0.5);
+productionLabel.x = productionStation.x;
+productionLabel.y = productionStation.y - 200;
+game.addChild(productionLabel);
+// Create robot display
+var robotDisplay = new Robot();
+robotDisplay.x = 1600;
+robotDisplay.y = 800;
+robotDisplay.scale.set(1.5, 1.5);
+game.addChild(robotDisplay);
+robotDisplay.startAnimations();
+// Create upgrade buttons
+var clickUpgradeButton = new UpgradeButton('click', 'Upgrade Click');
+clickUpgradeButton.x = 400;
+clickUpgradeButton.y = 1200;
+game.addChild(clickUpgradeButton);
+var autoUpgradeButton = new UpgradeButton('auto', 'Upgrade Auto');
+autoUpgradeButton.x = 1000;
+autoUpgradeButton.y = 1200;
+game.addChild(autoUpgradeButton);
+var speedUpgradeButton = new UpgradeButton('speed', 'Upgrade Speed');
+speedUpgradeButton.x = 1600;
+speedUpgradeButton.y = 1200;
+game.addChild(speedUpgradeButton);
+// Variable to track current order
+var currentOrder = null;
+// Function to create new orders
+function createNewOrder() {
+ if (currentOrder) {
+ game.removeChild(currentOrder);
+ }
+ // Create progressively harder orders as player completes more
+ var requiredRobots = Math.max(1, Math.floor(storage.orderLevel * 1.5));
+ var reward = Math.floor(requiredRobots * 50 * (1 + storage.orderLevel * 0.2));
+ currentOrder = new OrderCard(requiredRobots, reward);
+ currentOrder.x = 2048 / 2;
+ currentOrder.y = 1600;
+ game.addChild(currentOrder);
+}
+// Function to check if order can be completed
+function checkOrders() {
+ if (currentOrder && currentOrder.checkCompletion()) {
+ // Visual hint that order can be completed
+ tween(currentOrder, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ tween(currentOrder, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300
+ });
+ }
+ });
+ }
+}
+// Create initial order
+createNewOrder();
+// Handle part production on clicks
+partsIcon.interactive = true;
+partsIcon.down = function (x, y, obj) {
+ // Flash and scale effect for the click
+ tween(partsIcon, {
+ scaleX: 3.3,
+ scaleY: 3.3
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(partsIcon, {
+ scaleX: 3,
+ scaleY: 3
+ }, {
+ duration: 100
+ });
+ }
+ });
+ // Add resources based on upgrades
+ storage.coins += storage.partsPerClick * storage.partCost;
+ coinsText.setText('Coins: ' + storage.coins);
+};
+// Process idle time when game loads
+var currentTime = Date.now();
+var idleTime = Math.floor((currentTime - storage.lastTimestamp) / 1000);
+if (idleTime > 0 && storage.autoPartsPerSecond > 0) {
+ var idleCoins = Math.floor(idleTime * storage.autoPartsPerSecond * storage.partCost * 0.5); // 50% efficiency when idle
+ storage.coins += idleCoins;
+ // Show welcome back message
+ var welcomeBack = new Text2('Welcome Back!\nYou earned ' + idleCoins + ' coins while away.', {
+ size: 60,
+ fill: 0xF1C40F,
+ align: "center"
+ });
+ welcomeBack.anchor.set(0.5, 0.5);
+ welcomeBack.x = 2048 / 2;
+ welcomeBack.y = 2732 / 2;
+ game.addChild(welcomeBack);
+ // Fade out welcome message
+ tween(welcomeBack, {
+ alpha: 0
+ }, {
+ duration: 3000,
+ onFinish: function onFinish() {
+ game.removeChild(welcomeBack);
+ }
+ });
+}
+// Game update loop
+var lastUpdateTime = Date.now();
+game.update = function () {
+ var currentTime = Date.now();
+ var deltaTime = currentTime - lastUpdateTime;
+ lastUpdateTime = currentTime;
+ // Auto parts generation
+ if (storage.autoPartsPerSecond > 0) {
+ var partsGenerated = deltaTime / 1000 * storage.autoPartsPerSecond;
+ storage.coins += partsGenerated * storage.partCost;
+ coinsText.setText('Coins: ' + Math.floor(storage.coins));
+ }
+ // Update production station
+ productionStation.updateProgress(deltaTime);
+ // Save timestamp for idle calculations
+ storage.lastTimestamp = currentTime;
+};
+// Add game description to the UI
+var gameTitle = new Text2('IdleBot Manufacturing', {
+ size: 70,
+ fill: 0x3498DB
+});
+gameTitle.anchor.set(0, 0);
+gameTitle.x = 30;
+gameTitle.y = 20;
+LK.gui.topLeft.addChild(gameTitle);
\ No newline at end of file