/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 0,
floors: 1,
floorLevels: [1],
lastTimestamp: "undefined"
});
/****
* Classes
****/
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphic = self.attachAsset('clouds', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
// Randomize cloud appearance
self.scaleX = 0.5 + Math.random() * 1.5;
self.scaleY = 0.5 + Math.random();
self.alpha = 0.5 + Math.random() * 0.5;
// Set random position
self.x = Math.random() * 2048;
self.y = Math.random() * 1000; // Clouds appear in upper portion of screen
// Set random speed
self.speed = 0.2 + Math.random() * 0.3;
self.update = function () {
// Move cloud horizontally
self.x += self.speed;
// If cloud moves off screen, reset to other side
if (self.x > 2048 + 300) {
self.x = -300;
self.y = Math.random() * 1000;
}
};
return self;
});
var Floor = Container.expand(function (floorNumber, level) {
var self = Container.call(this);
self.floorNumber = floorNumber;
self.level = level || 1;
// Calculate position based on floor number (ground floor is 0)
self.floorHeight = 350;
self.baseY = 2732 - 400; // Base Y position for ground floor
// Calculate income based on floor number and level
self.calculateIncome = function () {
// Higher floors generate more income, multiplied by level
var baseIncome = (self.floorNumber + 1) * 2;
return baseIncome * self.level;
};
// Calculate upgrade cost
self.getUpgradeCost = function () {
// Costs increase with floor number and current level
return Math.floor(25 * (self.floorNumber + 1) * Math.pow(1.5, self.level));
};
// Floor visuals
var floorBackground = self.attachAsset('buildingFloor', {
anchorX: 0.5,
anchorY: 0.5
});
// Core area
var floorCore = self.attachAsset('buildingCore', {
anchorX: 0.5,
anchorY: 0.5,
y: -25
});
// Floor number text
self.floorText = new Text2('Floor ' + (floorNumber + 1), {
size: 80,
fill: 0xFFFFFF
});
self.floorText.anchor.set(0.5, 0.5);
self.floorText.y = -80;
self.addChild(self.floorText);
// Level text
self.levelText = new Text2('Level ' + self.level, {
size: 60,
fill: 0xFFFF00
});
self.levelText.anchor.set(0.5, 0.5);
self.levelText.y = 0;
self.addChild(self.levelText);
// Income text
self.incomeText = new Text2('$' + self.calculateIncome() + '/sec', {
size: 50,
fill: 0x00FF00
});
self.incomeText.anchor.set(0.5, 0.5);
self.incomeText.y = 60;
self.addChild(self.incomeText);
// Upgrade button
self.upgradeButton = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 600,
y: 0
});
// Upgrade cost text
self.upgradeCostText = new Text2('$' + self.getUpgradeCost(), {
size: 40,
fill: 0xFFFFFF
});
self.upgradeCostText.anchor.set(0.5, 0.5);
self.upgradeButton.addChild(self.upgradeCostText);
// Upgrade button event
self.upgradeButton.interactive = true;
self.upgradeButton.down = function () {
if (money >= self.getUpgradeCost()) {
money -= self.getUpgradeCost();
self.level++;
storage.floorLevels[self.floorNumber] = self.level;
// Update UI
self.levelText.setText('Level ' + self.level);
self.incomeText.setText('$' + self.calculateIncome() + '/sec');
if (self.level < 10) {
self.upgradeCostText.setText('$' + self.getUpgradeCost());
} else {
self.upgradeCostText.setText('MAX');
}
// Play upgrade sound
LK.getSound('upgrade').play();
// Visual effect for upgrade
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
// Update game state
updateGameState();
}
};
// Update method
self.updateUI = function () {
self.incomeText.setText('$' + self.calculateIncome() + '/sec');
if (self.level < 10) {
self.upgradeCostText.setText('$' + self.getUpgradeCost());
} else {
self.upgradeCostText.setText('MAX');
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Function to reset game progress
function resetGameProgress() {
money = 0;
floors = 1;
floorLevels = [1];
cameraOffsetY = 0;
floorObjects.forEach(function (floor) {
return floor.destroy();
});
floorObjects = [];
floorContainer.removeChildren();
initializeFloors();
updateBuildButtonCost();
moneyText.setText('$0');
}
// Initialize game
var restartButton = LK.getAsset('restartButton', {
anchorX: 0.5,
anchorY: 0.5
});
restartButton.x = 2048 - 150;
restartButton.y = 100;
game.addChild(restartButton);
var restartButtonText = new Text2('RESTART', {
size: 60,
fill: 0xFFFFFF
});
restartButtonText.anchor.set(0.5, 0.5);
restartButton.addChild(restartButtonText);
restartButton.interactive = true;
restartButton.down = function () {
resetGameProgress();
};
// Add clouds for background
var money = storage.money;
var floors = storage.floors;
var floorLevels = storage.floorLevels;
var lastTimestamp = storage.lastTimestamp;
var baseY = 2732 - 400; // Base Y position for ground floor
var floorHeight = 350;
var cameraOffsetY = 0;
var floorContainer = new Container();
var floorObjects = [];
var clouds = [];
var canScrollUp = false;
// UI elements
var moneyText = new Text2('$' + money.toFixed(0), {
size: 100,
fill: 0xFFDD00
});
moneyText.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyText);
var buildButton = LK.getAsset('buildButton', {
anchorX: 0.5,
anchorY: 0.5
});
buildButton.x = 2048 / 2;
buildButton.y = 2732 - 100;
game.addChild(buildButton);
var buildButtonText = new Text2('BUILD NEW FLOOR', {
size: 60,
fill: 0xFFFFFF
});
buildButtonText.anchor.set(0.5, 0.5);
buildButton.addChild(buildButtonText);
var buildCostText = new Text2('', {
size: 40,
fill: 0xFFFFFF
});
buildCostText.anchor.set(0.5, 0.5);
buildCostText.y = 50;
buildButton.addChild(buildCostText);
// Add clouds for background
for (var i = 0; i < 10; i++) {
var cloud = new Cloud();
clouds.push(cloud);
game.addChild(cloud);
}
// Add floor container to game
game.addChild(floorContainer);
// Initialize floors from storage
function initializeFloors() {
for (var i = 0; i < floors; i++) {
var floor = new Floor(i, floorLevels[i]);
floor.x = 2048 / 2;
floor.y = baseY - i * floorHeight + cameraOffsetY;
floorObjects.push(floor);
floorContainer.addChild(floor);
}
// Calculate if camera should scroll up
updateCameraPosition();
updateBuildButtonCost();
}
// Calculate the cost of building a new floor
function getNewFloorCost() {
return Math.floor(100 * Math.pow(1.8, floors));
}
// Update build button cost
function updateBuildButtonCost() {
var cost = getNewFloorCost();
buildCostText.setText('$' + cost);
// Check if all existing floors are at max level
var allMaxed = true;
for (var i = 0; i < floorLevels.length; i++) {
if (floorLevels[i] < 10) {
allMaxed = false;
break;
}
}
// Disable button if not all floors are maxed
if (!allMaxed) {
buildButton.alpha = 0.5;
buildButtonText.setText('MAX ALL FLOORS FIRST');
} else {
buildButton.alpha = 1;
buildButtonText.setText('BUILD NEW FLOOR');
}
}
// Update camera position based on highest floor
function updateCameraPosition() {
if (floors > 5) {
// Calculate how much we need to scroll up
var targetOffsetY = (floors - 5) * floorHeight;
// Only set to scroll if not already scrolling
if (cameraOffsetY !== targetOffsetY) {
canScrollUp = true;
// Animate the camera movement
tween(game, {
cameraOffsetY: targetOffsetY
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
canScrollUp = false;
updateFloorPositions();
}
});
}
}
}
// Update floor positions based on camera offset
function updateFloorPositions() {
for (var i = 0; i < floorObjects.length; i++) {
var floor = floorObjects[i];
tween(floor, {
y: baseY - i * floorHeight + cameraOffsetY
}, {
duration: 800,
easing: tween.easeInOut
});
}
}
// Build new floor
function buildNewFloor() {
// Check if all existing floors are at max level
var allMaxed = true;
for (var i = 0; i < floorLevels.length; i++) {
if (floorLevels[i] < 10) {
allMaxed = false;
break;
}
}
if (!allMaxed) {
return; // Cannot build new floor until all are maxed
}
var cost = getNewFloorCost();
if (money >= cost) {
money -= cost;
floors++;
floorLevels.push(1);
// Create and add new floor
var newFloor = new Floor(floors - 1, 1);
newFloor.x = 2048 / 2;
newFloor.y = baseY - (floors - 1) * floorHeight + cameraOffsetY;
// Start with scale effect
newFloor.scaleX = 0;
newFloor.scaleY = 0;
tween(newFloor, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeOut
});
floorObjects.push(newFloor);
floorContainer.addChild(newFloor);
// Play building sound
LK.getSound('build').play();
// Update camera position
updateCameraPosition();
// Update game state
updateGameState();
}
}
// Calculate income per second
function calculateTotalIncome() {
var totalIncome = 0;
for (var i = 0; i < floors; i++) {
// Higher floors with higher levels produce more income
var baseIncome = (i + 1) * 2;
totalIncome += baseIncome * floorLevels[i];
}
return totalIncome;
}
// Update game state in storage
function updateGameState() {
updateBuildButtonCost();
}
// Calculate offline progress
function calculateOfflineProgress() {}
// Handle build button click
buildButton.interactive = true;
buildButton.down = function () {
buildNewFloor();
};
// Scroll game with touch/mouse
var dragStartY = 0;
var initialOffsetY = 0;
var isDragging = false;
game.down = function (x, y) {
if (floors > 5) {
// Only allow scrolling if there are enough floors
isDragging = true;
dragStartY = y;
initialOffsetY = cameraOffsetY;
}
};
game.move = function (x, y) {
if (isDragging && floors > 5) {
var deltaY = dragStartY - y;
var newOffsetY = initialOffsetY + deltaY;
// Limit scrolling range
var maxScroll = (floors - 5) * floorHeight;
newOffsetY = Math.max(0, Math.min(maxScroll, newOffsetY));
cameraOffsetY = newOffsetY;
updateFloorPositions();
}
};
game.up = function () {
isDragging = false;
};
// Initialize game
function initGame() {
resetGameProgress();
calculateOfflineProgress();
LK.playMusic('bgMusic');
}
// Run initialization
initGame();
// Game update loop
var lastTickTime = Date.now();
game.update = function () {
// Update clouds
for (var i = 0; i < clouds.length; i++) {
clouds[i].update();
}
// Calculate time since last tick for proper income calculation
var currentTime = Date.now();
var deltaTime = (currentTime - lastTickTime) / 1000; // Convert to seconds
lastTickTime = currentTime;
// Add income
money += calculateTotalIncome() * deltaTime;
// Update money display with formatted number
moneyText.setText('$' + Math.floor(money).toLocaleString());
// Flash build button if affordable
if (money >= getNewFloorCost()) {
if (LK.ticks % 60 < 30) {
buildButton.alpha = 1;
} else {
buildButton.alpha = 0.8;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 0,
floors: 1,
floorLevels: [1],
lastTimestamp: "undefined"
});
/****
* Classes
****/
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphic = self.attachAsset('clouds', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
// Randomize cloud appearance
self.scaleX = 0.5 + Math.random() * 1.5;
self.scaleY = 0.5 + Math.random();
self.alpha = 0.5 + Math.random() * 0.5;
// Set random position
self.x = Math.random() * 2048;
self.y = Math.random() * 1000; // Clouds appear in upper portion of screen
// Set random speed
self.speed = 0.2 + Math.random() * 0.3;
self.update = function () {
// Move cloud horizontally
self.x += self.speed;
// If cloud moves off screen, reset to other side
if (self.x > 2048 + 300) {
self.x = -300;
self.y = Math.random() * 1000;
}
};
return self;
});
var Floor = Container.expand(function (floorNumber, level) {
var self = Container.call(this);
self.floorNumber = floorNumber;
self.level = level || 1;
// Calculate position based on floor number (ground floor is 0)
self.floorHeight = 350;
self.baseY = 2732 - 400; // Base Y position for ground floor
// Calculate income based on floor number and level
self.calculateIncome = function () {
// Higher floors generate more income, multiplied by level
var baseIncome = (self.floorNumber + 1) * 2;
return baseIncome * self.level;
};
// Calculate upgrade cost
self.getUpgradeCost = function () {
// Costs increase with floor number and current level
return Math.floor(25 * (self.floorNumber + 1) * Math.pow(1.5, self.level));
};
// Floor visuals
var floorBackground = self.attachAsset('buildingFloor', {
anchorX: 0.5,
anchorY: 0.5
});
// Core area
var floorCore = self.attachAsset('buildingCore', {
anchorX: 0.5,
anchorY: 0.5,
y: -25
});
// Floor number text
self.floorText = new Text2('Floor ' + (floorNumber + 1), {
size: 80,
fill: 0xFFFFFF
});
self.floorText.anchor.set(0.5, 0.5);
self.floorText.y = -80;
self.addChild(self.floorText);
// Level text
self.levelText = new Text2('Level ' + self.level, {
size: 60,
fill: 0xFFFF00
});
self.levelText.anchor.set(0.5, 0.5);
self.levelText.y = 0;
self.addChild(self.levelText);
// Income text
self.incomeText = new Text2('$' + self.calculateIncome() + '/sec', {
size: 50,
fill: 0x00FF00
});
self.incomeText.anchor.set(0.5, 0.5);
self.incomeText.y = 60;
self.addChild(self.incomeText);
// Upgrade button
self.upgradeButton = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 600,
y: 0
});
// Upgrade cost text
self.upgradeCostText = new Text2('$' + self.getUpgradeCost(), {
size: 40,
fill: 0xFFFFFF
});
self.upgradeCostText.anchor.set(0.5, 0.5);
self.upgradeButton.addChild(self.upgradeCostText);
// Upgrade button event
self.upgradeButton.interactive = true;
self.upgradeButton.down = function () {
if (money >= self.getUpgradeCost()) {
money -= self.getUpgradeCost();
self.level++;
storage.floorLevels[self.floorNumber] = self.level;
// Update UI
self.levelText.setText('Level ' + self.level);
self.incomeText.setText('$' + self.calculateIncome() + '/sec');
if (self.level < 10) {
self.upgradeCostText.setText('$' + self.getUpgradeCost());
} else {
self.upgradeCostText.setText('MAX');
}
// Play upgrade sound
LK.getSound('upgrade').play();
// Visual effect for upgrade
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
// Update game state
updateGameState();
}
};
// Update method
self.updateUI = function () {
self.incomeText.setText('$' + self.calculateIncome() + '/sec');
if (self.level < 10) {
self.upgradeCostText.setText('$' + self.getUpgradeCost());
} else {
self.upgradeCostText.setText('MAX');
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Function to reset game progress
function resetGameProgress() {
money = 0;
floors = 1;
floorLevels = [1];
cameraOffsetY = 0;
floorObjects.forEach(function (floor) {
return floor.destroy();
});
floorObjects = [];
floorContainer.removeChildren();
initializeFloors();
updateBuildButtonCost();
moneyText.setText('$0');
}
// Initialize game
var restartButton = LK.getAsset('restartButton', {
anchorX: 0.5,
anchorY: 0.5
});
restartButton.x = 2048 - 150;
restartButton.y = 100;
game.addChild(restartButton);
var restartButtonText = new Text2('RESTART', {
size: 60,
fill: 0xFFFFFF
});
restartButtonText.anchor.set(0.5, 0.5);
restartButton.addChild(restartButtonText);
restartButton.interactive = true;
restartButton.down = function () {
resetGameProgress();
};
// Add clouds for background
var money = storage.money;
var floors = storage.floors;
var floorLevels = storage.floorLevels;
var lastTimestamp = storage.lastTimestamp;
var baseY = 2732 - 400; // Base Y position for ground floor
var floorHeight = 350;
var cameraOffsetY = 0;
var floorContainer = new Container();
var floorObjects = [];
var clouds = [];
var canScrollUp = false;
// UI elements
var moneyText = new Text2('$' + money.toFixed(0), {
size: 100,
fill: 0xFFDD00
});
moneyText.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyText);
var buildButton = LK.getAsset('buildButton', {
anchorX: 0.5,
anchorY: 0.5
});
buildButton.x = 2048 / 2;
buildButton.y = 2732 - 100;
game.addChild(buildButton);
var buildButtonText = new Text2('BUILD NEW FLOOR', {
size: 60,
fill: 0xFFFFFF
});
buildButtonText.anchor.set(0.5, 0.5);
buildButton.addChild(buildButtonText);
var buildCostText = new Text2('', {
size: 40,
fill: 0xFFFFFF
});
buildCostText.anchor.set(0.5, 0.5);
buildCostText.y = 50;
buildButton.addChild(buildCostText);
// Add clouds for background
for (var i = 0; i < 10; i++) {
var cloud = new Cloud();
clouds.push(cloud);
game.addChild(cloud);
}
// Add floor container to game
game.addChild(floorContainer);
// Initialize floors from storage
function initializeFloors() {
for (var i = 0; i < floors; i++) {
var floor = new Floor(i, floorLevels[i]);
floor.x = 2048 / 2;
floor.y = baseY - i * floorHeight + cameraOffsetY;
floorObjects.push(floor);
floorContainer.addChild(floor);
}
// Calculate if camera should scroll up
updateCameraPosition();
updateBuildButtonCost();
}
// Calculate the cost of building a new floor
function getNewFloorCost() {
return Math.floor(100 * Math.pow(1.8, floors));
}
// Update build button cost
function updateBuildButtonCost() {
var cost = getNewFloorCost();
buildCostText.setText('$' + cost);
// Check if all existing floors are at max level
var allMaxed = true;
for (var i = 0; i < floorLevels.length; i++) {
if (floorLevels[i] < 10) {
allMaxed = false;
break;
}
}
// Disable button if not all floors are maxed
if (!allMaxed) {
buildButton.alpha = 0.5;
buildButtonText.setText('MAX ALL FLOORS FIRST');
} else {
buildButton.alpha = 1;
buildButtonText.setText('BUILD NEW FLOOR');
}
}
// Update camera position based on highest floor
function updateCameraPosition() {
if (floors > 5) {
// Calculate how much we need to scroll up
var targetOffsetY = (floors - 5) * floorHeight;
// Only set to scroll if not already scrolling
if (cameraOffsetY !== targetOffsetY) {
canScrollUp = true;
// Animate the camera movement
tween(game, {
cameraOffsetY: targetOffsetY
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
canScrollUp = false;
updateFloorPositions();
}
});
}
}
}
// Update floor positions based on camera offset
function updateFloorPositions() {
for (var i = 0; i < floorObjects.length; i++) {
var floor = floorObjects[i];
tween(floor, {
y: baseY - i * floorHeight + cameraOffsetY
}, {
duration: 800,
easing: tween.easeInOut
});
}
}
// Build new floor
function buildNewFloor() {
// Check if all existing floors are at max level
var allMaxed = true;
for (var i = 0; i < floorLevels.length; i++) {
if (floorLevels[i] < 10) {
allMaxed = false;
break;
}
}
if (!allMaxed) {
return; // Cannot build new floor until all are maxed
}
var cost = getNewFloorCost();
if (money >= cost) {
money -= cost;
floors++;
floorLevels.push(1);
// Create and add new floor
var newFloor = new Floor(floors - 1, 1);
newFloor.x = 2048 / 2;
newFloor.y = baseY - (floors - 1) * floorHeight + cameraOffsetY;
// Start with scale effect
newFloor.scaleX = 0;
newFloor.scaleY = 0;
tween(newFloor, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeOut
});
floorObjects.push(newFloor);
floorContainer.addChild(newFloor);
// Play building sound
LK.getSound('build').play();
// Update camera position
updateCameraPosition();
// Update game state
updateGameState();
}
}
// Calculate income per second
function calculateTotalIncome() {
var totalIncome = 0;
for (var i = 0; i < floors; i++) {
// Higher floors with higher levels produce more income
var baseIncome = (i + 1) * 2;
totalIncome += baseIncome * floorLevels[i];
}
return totalIncome;
}
// Update game state in storage
function updateGameState() {
updateBuildButtonCost();
}
// Calculate offline progress
function calculateOfflineProgress() {}
// Handle build button click
buildButton.interactive = true;
buildButton.down = function () {
buildNewFloor();
};
// Scroll game with touch/mouse
var dragStartY = 0;
var initialOffsetY = 0;
var isDragging = false;
game.down = function (x, y) {
if (floors > 5) {
// Only allow scrolling if there are enough floors
isDragging = true;
dragStartY = y;
initialOffsetY = cameraOffsetY;
}
};
game.move = function (x, y) {
if (isDragging && floors > 5) {
var deltaY = dragStartY - y;
var newOffsetY = initialOffsetY + deltaY;
// Limit scrolling range
var maxScroll = (floors - 5) * floorHeight;
newOffsetY = Math.max(0, Math.min(maxScroll, newOffsetY));
cameraOffsetY = newOffsetY;
updateFloorPositions();
}
};
game.up = function () {
isDragging = false;
};
// Initialize game
function initGame() {
resetGameProgress();
calculateOfflineProgress();
LK.playMusic('bgMusic');
}
// Run initialization
initGame();
// Game update loop
var lastTickTime = Date.now();
game.update = function () {
// Update clouds
for (var i = 0; i < clouds.length; i++) {
clouds[i].update();
}
// Calculate time since last tick for proper income calculation
var currentTime = Date.now();
var deltaTime = (currentTime - lastTickTime) / 1000; // Convert to seconds
lastTickTime = currentTime;
// Add income
money += calculateTotalIncome() * deltaTime;
// Update money display with formatted number
moneyText.setText('$' + Math.floor(money).toLocaleString());
// Flash build button if affordable
if (money >= getNewFloorCost()) {
if (LK.ticks % 60 < 30) {
buildButton.alpha = 1;
} else {
buildButton.alpha = 0.8;
}
}
};