User prompt
+$ text little bit bigger
User prompt
change slider background color to transparent black
User prompt
move total money text to little bit down
User prompt
after click it scale down fix that
User prompt
scale up tap button
User prompt
little bit squish bussiness back grounds to left
User prompt
move bottm right
User prompt
move to right center
User prompt
move tap button to right
User prompt
move tap button right center to center
User prompt
remove back
User prompt
close all under
User prompt
close business visual if under tap button
User prompt
go back before masking
User prompt
create a mask area in center of the screen and move business inside if bussiness in the area do not mask if not mask it
User prompt
bussines overflowing screen
User prompt
move tap button to front
User prompt
longer fading time ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add random rotation to particles ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
particle scales fixed
User prompt
remove dollar text on particle
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { money: 0, businesses: {}, lastTick: 0 }); /**** * Classes ****/ // Business class: represents a single business row var Business = Container.expand(function () { var self = Container.call(this); // Properties (set after creation) self.bizId = null; self.bizData = null; self.index = 0; // UI elements var icon = null; var nameTxt = null; var levelTxt = null; var costTxt = null; var profitTxt = null; var timerBar = null; var upgradeBtn = null; var managerBtn = null; // State self.timer = 0; // ms left for current run self.running = false; // Setup method (called after creation) self.setup = function (bizId, bizData, index) { self.bizId = bizId; self.bizData = bizData; self.index = index; // Icon icon = self.attachAsset(bizData.asset, { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); // Name nameTxt = new Text2(bizData.name, { size: 48, fill: "#222", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); nameTxt.anchor.set(0, 0.5); nameTxt.x = 140; nameTxt.y = 0; self.addChild(nameTxt); // Level levelTxt = new Text2("Lvl 0", { size: 40, fill: "#444", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); levelTxt.anchor.set(0, 0.5); levelTxt.x = 140; levelTxt.y = 50; self.addChild(levelTxt); // Cost costTxt = new Text2("Buy: $0", { size: 36, fill: "#666", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); costTxt.anchor.set(0, 0.5); costTxt.x = 140; costTxt.y = -50; self.addChild(costTxt); // Profit profitTxt = new Text2("+$0", { size: 48, fill: 0x008000, font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); profitTxt.anchor.set(1, 0.5); profitTxt.x = 900; profitTxt.y = 0; self.addChild(profitTxt); // Timer bar background (shows total progress area) var timerBarBg = self.attachAsset('slider_sprite', { anchorX: 0, anchorY: 0.5, x: 140, y: 80, width: 320, height: 24, // match new thinner asset height for best appearance tint: 0x000000 // transparent black }); timerBarBg.alpha = 0.5; self.addChild(timerBarBg); // Timer bar (progress fill) timerBar = self.attachAsset('slider_sprite', { anchorX: 0, anchorY: 0.5, x: 140, y: 80, width: 0, height: 24 // match new thinner asset height for best appearance }); timerBar.alpha = 0.5; // Upgrade button upgradeBtn = self.attachAsset('upgrade_btn', { anchorX: 0.5, anchorY: 0.5, x: 1100, y: 0 }); upgradeBtn.interactive = true; upgradeBtn.down = function (x, y, obj) { if (self.down) self.down(x, y, upgradeBtn); }; // Removed upgradeTxt label // (Auto/manager button removed) // Event listeners self.down = function (x, y, obj) { // If tap on icon, start business if unlocked if (self.isUnlocked() && !self.isAuto() && self.timer <= 0) { self.startRun(); } // If tap on upgrade button if (self.isUnlocked() && obj === upgradeBtn && upgradeBtn.alpha >= 1) { self.tryUpgrade(); } // (Auto/manager button tap logic removed) // If tap anywhere on the business row and not unlocked, allow buying if (!self.isUnlocked()) { self.tryUpgrade(); } }; // Update UI self.refresh(); }; // Is business unlocked? self.isUnlocked = function () { return businesses[self.bizId].level > 0; }; // Is manager hired? self.isAuto = function () { return businesses[self.bizId].manager; }; // Start a run (manual or auto) self.startRun = function () { if (!self.isUnlocked()) return; if (self.timer > 0) return; self.timer = self.getDuration(); self.running = true; }; // Try to buy/upgrade self.tryUpgrade = function () { // Calculate how many upgrades we can afford with the current multiplier var maxUpgrades = typeof upgradeMultiplier !== "undefined" ? upgradeMultiplier : 1; var bought = 0; for (var i = 0; i < maxUpgrades; ++i) { var cost = self.getCost(); if (money >= cost && upgradeBtn.alpha >= 1) { money -= cost; businesses[self.bizId].level += 1; bought++; } else { break; } } if (bought > 0) { self.refresh(); updateMoneyUI(); saveGame(); } }; // Try to hire manager self.tryHireManager = function () { var mCost = self.getManagerCost(); if (money >= mCost && !self.isAuto()) { money -= mCost; businesses[self.bizId].manager = true; self.refresh(); updateMoneyUI(); saveGame(); } }; // Get current cost to buy/upgrade self.getCost = function () { var lvl = businesses[self.bizId].level; return Math.floor(self.bizData.baseCost * Math.pow(self.bizData.costMult, lvl)); }; // Get current profit self.getProfit = function () { var lvl = businesses[self.bizId].level; if (lvl === 0) return 0; return Math.floor(self.bizData.baseProfit * lvl * Math.pow(1.07, lvl - 1)); }; // Get duration (ms) self.getDuration = function () { return self.bizData.baseTime; }; // Get manager cost self.getManagerCost = function () { return self.bizData.managerCost; }; // Update UI self.refresh = function () { var lvl = businesses[self.bizId].level; var unlocked = lvl > 0; var profit = self.getProfit(); var cost = self.getCost(); var mCost = self.getManagerCost(); levelTxt.setText("Lvl " + lvl); costTxt.setText(unlocked ? "Upgrade: $" + formatNum(cost) : "Buy: $" + formatNum(cost)); profitTxt.setText("+$" + formatNum(profit)); profitTxt.alpha = unlocked ? 1 : 0.3; levelTxt.alpha = unlocked ? 1 : 0.3; icon.alpha = unlocked ? 1 : 0.3; // Timer bar timerBar.width = 320 * (self.timer > 0 ? 1 - self.timer / self.getDuration() : 0); // Upgrade button upgradeBtn.alpha = money >= cost ? 1 : 0.5; // (Auto/manager button UI refresh removed) }; // Update per tick self.update = function () { if (!self.isUnlocked()) { self.refresh(); return; } // Auto-run if manager or level > 1 if ((self.isAuto() || businesses[self.bizId].level > 1) && self.timer <= 0) { self.startRun(); // Ensure running is set so update continues ticking self.running = true; } // Progress timer if (self.timer > 0) { self.timer -= 1000 / 60; if (self.timer <= 0) { self.timer = 0; // Award profit var profit = self.getProfit(); money += profit; updateMoneyUI(); saveGame(); self.refresh(); // Money particle effect: spawn several particles at the top center if (typeof moneyParticles !== "undefined") { var particleCount = Math.min(10, 2 + Math.floor(profit / 10)); for (var i = 0; i < particleCount; ++i) { var p = new MoneyParticle(); // Spawn at random X across the top of the screen p.x = 100 + Math.random() * (2048 - 200); // avoid extreme edges p.y = 120 + Math.random() * 40; if (typeof game !== "undefined") game.addChild(p); moneyParticles.push(p); } } // If auto, start again next frame } self.refresh(); } }; return self; }); // MoneyParticle class: represents a single falling money particle var MoneyParticle = Container.expand(function () { var self = Container.call(this); // Use the 'money_bg' asset as a simple money particle (could be replaced with a coin image if available) var particle = self.attachAsset('money_bg', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7, x: 0, y: 0, alpha: 0.7 // set transparency for money particle image }); // Removed dollar text from MoneyParticle // Give each particle a random burst direction and distance var burstAngle = Math.random() * Math.PI * 2; var burstDistance = 80 + Math.random() * 40; self.vx = Math.cos(burstAngle) * burstDistance / 40; self.vy = Math.sin(burstAngle) * burstDistance / 40 + 2; // Add random rotation to the particle var startRotation = Math.random() * Math.PI * 2; self.rotation = startRotation; // Add random delay before burst self._burstStarted = false; self._burstDelay = Math.random() * 300; // up to 300ms delay self._burstTimer = 0; self._burstLife = 40 + Math.floor(Math.random() * 20); self._fadeStarted = false; // Overwrite update to handle movement, fade, and cleanup self.update = function () { if (!self._burstStarted) { self._burstTimer += 1000 / 60; if (self._burstTimer >= self._burstDelay) { self._burstStarted = true; // Start fade out tween after burst starts tween(self, { alpha: 0 }, { duration: self._burstLife * 32, easing: tween.linear }); // Animate rotation to a new random value during the burst var endRotation = startRotation + (Math.random() - 0.5) * Math.PI * 2; tween(self, { rotation: endRotation }, { duration: self._burstLife * 16, easing: tween.linear }); } else { return; } } self.x += self.vx; self.y += self.vy; self._burstLife--; if (self._burstLife <= 0) { if (self.parent) self.parent.removeChild(self); if (typeof moneyParticles !== "undefined") { var idx = moneyParticles.indexOf(self); if (idx !== -1) moneyParticles.splice(idx, 1); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb // Changed to a sky blue color }); /**** * Game Code ****/ // --- Game Data --- // Business icons (simple colored boxes for MVP) // Reference for business row background // Reference: To change the slider sprite, update the asset below with your own image id and dimensions. var businessList = [{ id: 'lemon', name: 'Lemonade Stand', asset: 'biz_lemon', baseCost: 4, costMult: 1.07, baseProfit: 1, baseTime: 1000, managerCost: 100 }, { id: 'newspaper', name: 'Newspaper Delivery', asset: 'biz_newspaper', baseCost: 60, costMult: 1.15, baseProfit: 8, baseTime: 3000, managerCost: 500 }, { id: 'carwash', name: 'Car Wash', asset: 'biz_carwash', baseCost: 720, costMult: 1.14, baseProfit: 64, baseTime: 6000, managerCost: 3000 }, { id: 'pizza', name: 'Pizza Delivery', asset: 'biz_pizza', baseCost: 8640, costMult: 1.13, baseProfit: 576, baseTime: 12000, managerCost: 10000 }, { id: 'movie', name: 'Movie Studio', asset: 'biz_movie', baseCost: 103680, costMult: 1.12, baseProfit: 5184, baseTime: 24000, managerCost: 100000 }, { id: 'bank', name: 'Bank', asset: 'biz_bank', baseCost: 1244160, costMult: 1.11, baseProfit: 46656, baseTime: 48000, managerCost: 500000 }, { id: 'oil', name: 'Oil Company', asset: 'biz_oil', baseCost: 14929920, costMult: 1.10, baseProfit: 419904, baseTime: 96000, managerCost: 1200000 }, // New business types { id: 'icecream', name: 'Ice Cream Truck', asset: 'biz_lemon', // Use lemon asset as placeholder, update with new asset if available baseCost: 20000000, costMult: 1.09, baseProfit: 800000, baseTime: 120000, managerCost: 2500000 }, { id: 'themepark', name: 'Theme Park', asset: 'biz_movie', // Use movie asset as placeholder, update with new asset if available baseCost: 50000000, costMult: 1.08, baseProfit: 2000000, baseTime: 180000, managerCost: 10000000 }, // New business: Donut Shop { id: 'donut', name: 'Donut Shop', asset: 'biz_pizza', // Use pizza asset as placeholder, update with new asset if available baseCost: 120000000, costMult: 1.07, baseProfit: 5000000, baseTime: 240000, managerCost: 25000000 }]; // --- State --- var money = 0; var businesses = {}; var businessObjs = []; var lastTick = 0; // --- Money Particle System --- var moneyParticles = []; // --- UI Elements --- var moneyTxt = null; var tapBtn = null; var tapBtnTxt = null; // --- Utility Functions --- function formatNum(n) { if (n < 1000) return "" + n; var units = ['K', 'M', 'B', 'T', 'Qa', 'Qi', 'Sx', 'Sp', 'Oc', 'No', 'Dc']; var u = -1; while (n >= 1000 && u < units.length - 1) { n /= 1000; u++; } return n.toFixed(2) + units[u]; } function updateMoneyUI() { moneyTxt.setText("$" + formatNum(money)); } // --- Save/Load --- function saveGame() { storage.money = money; storage.businesses = {}; for (var i = 0; i < businessList.length; ++i) { var id = businessList[i].id; storage.businesses[id + "_level"] = businesses[id].level; storage.businesses[id + "_manager"] = businesses[id].manager; } storage.lastTick = Date.now(); } function loadGame() { money = storage.money || 0; businesses = {}; for (var i = 0; i < businessList.length; ++i) { var id = businessList[i].id; // Start with 1 lemonade stand businesses[id] = { level: id === 'lemon' ? 1 : 0, manager: false }; if (storage.businesses) { if (typeof storage.businesses[id + "_level"] !== "undefined") { businesses[id].level = storage.businesses[id + "_level"]; } if (typeof storage.businesses[id + "_manager"] !== "undefined") { businesses[id].manager = !!storage.businesses[id + "_manager"]; } } } lastTick = storage.lastTick || Date.now(); } // --- Offline Progress --- function applyOfflineEarnings() { var now = Date.now(); var dt = now - lastTick; if (dt < 1000) return; var total = 0; for (var i = 0; i < businessList.length; ++i) { var biz = businessList[i]; var b = businesses[biz.id]; if (b.level > 0 && b.manager) { var cycles = Math.floor(dt / biz.baseTime); var profit = Math.floor(biz.baseProfit * b.level * Math.pow(1.07, b.level - 1)); total += cycles * profit; } } if (total > 0) { money += total; updateMoneyUI(); } } // --- Game Setup --- // Add background image behind all game elements var bgImage = LK.getAsset('bg_main', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, scaleX: 1, scaleY: 1 }); game.addChild(bgImage); // (Removed bottom overlay image that hid overflowing businesses) // No overlay is added, so businesses can overflow the screen as needed. function setupUI() { // Add total money text to the top center of the GUI moneyTxt = new Text2("$0", { size: 90, fill: "#222", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); moneyTxt.anchor.set(0.5, 0); moneyTxt.y = 40; // Move the money text a little bit down from the top LK.gui.top.addChild(moneyTxt); // Update the money text with the current money value updateMoneyUI = function updateMoneyUI() { if (moneyTxt) { moneyTxt.setText("$" + formatNum(money)); } }; // Tap button (big, bottom right) tapBtn = LK.getAsset('tap_btn', { anchorX: 1, anchorY: 1, // bottom right of the screen x: 2048 - 80, y: 2732 - 80, scaleX: 1.5, scaleY: 1.5 }); tapBtn.interactive = true; // Removed tapBtnTxt label tapBtn.down = function (x, y, obj) { if (game.down) game.down(x, y, tapBtn); }; game.addChild(tapBtn); // Move to front after all other addChild calls tapBtn.zIndex = 9999; // Defensive: ensure it's on top if zIndex is supported // Business rows // Slideable area for businesses // ... later in setupUI: var businessScrollArea = new Container(); businessScrollArea.x = 0; businessScrollArea.y = 0; game.addChild(businessScrollArea); // (Removed mask area and mask logic so businesses can overflow the screen) var startY = 500; var gapY = 260; // Further increased gap for even more space between businesses for (var i = 0; i < businessList.length; ++i) { var biz = businessList[i]; // Add background image for business row var bizRowBg = LK.getAsset('biz_row_bg', { anchorX: 0, anchorY: 0.5, x: 20, // squish more to the left y: startY + i * gapY, scaleX: 0.7, // squish width to 70% scaleY: 1 }); bizRowBg.alpha = 0.5; // Set transparency for business row background businessScrollArea.addChild(bizRowBg); // Create business row on top of background var bizObj = new Business(); bizObj.setup(biz.id, biz, i); bizObj.x = 200; bizObj.y = startY + i * gapY; businessScrollArea.addChild(bizObj); businessObjs.push(bizObj); } // --- Slide/scroll logic for businessScrollArea --- var scrollY = 0; var scrollStartY = 0; var scrollTouchStartY = 0; var isScrolling = false; var minScrollY = Math.min(0, 2732 - (startY + businessList.length * gapY + 200)); var maxScrollY = 0; // Touch/mouse down on scroll area game.down = function (origDown) { return function (x, y, obj) { // If tap is inside the business area (not tapBtn), start scroll if (y > startY - gapY && y < 2732 - 400 && obj !== tapBtn) { isScrolling = true; scrollTouchStartY = y; scrollStartY = scrollY; } // Pass through to original tap logic (for tapBtn, etc) if (typeof origDown === "function") origDown(x, y, obj); }; }(game.down); // Touch/mouse move game.move = function (x, y, obj) { if (isScrolling) { var dy = y - scrollTouchStartY; scrollY = scrollStartY + dy; // Clamp scroll if (scrollY > maxScrollY) scrollY = maxScrollY; if (scrollY < minScrollY) scrollY = minScrollY; businessScrollArea.y = scrollY; } }; // Touch/mouse up game.up = function (x, y, obj) { isScrolling = false; }; } // (Removed code that added bottomOverlay in front of everything) // No overlay is added, so businesses can overflow the screen as needed. // --- Upgrade Multiplier Buttons --- var upgradeMultipliers = [1, 10, 100]; var upgradeMultiplier = 1; // Default to x1 var upgradeBtns = []; var upgradeBtnLabels = ["x1", "x10", "x100"]; var btnStartY = 700; var btnGapY = 180; for (var i = 0; i < upgradeMultipliers.length; ++i) { var btn = LK.getAsset('manager_btn', { anchorX: 1, anchorY: 0.5, x: 2048 - 60, y: btnStartY + i * btnGapY, width: 220, height: 120 }); btn.interactive = true; // Add label var btnTxt = new Text2(upgradeBtnLabels[i], { size: 60, fill: "#fff", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); btnTxt.anchor.set(0.5, 0.5); btnTxt.x = btn.width / 2; btnTxt.y = btn.height / 2; btn.addChild(btnTxt); // Highlight selected btn.alpha = i === 0 ? 1 : 0.6; // Closure for index (function (idx, btnRef) { btn.down = function (x, y, obj) { upgradeMultiplier = upgradeMultipliers[idx]; // Update button alphas for selection for (var j = 0; j < upgradeBtns.length; ++j) { upgradeBtns[j].alpha = j === idx ? 1 : 0.6; } }; })(i, btn); LK.gui.right.addChild(btn); upgradeBtns.push(btn); } // --- Tap Handler --- game.down = function (x, y, obj) { // Tap on tapBtn if (obj === tapBtn || obj === tapBtnTxt) { var tapVal = 1 + Math.floor(businesses['lemon'].level / 10); money += tapVal; updateMoneyUI(); saveGame(); // Money particle effect: spawn several particles at the top center var particleCount = Math.min(10, 2 + Math.floor(tapVal / 5)); for (var i = 0; i < particleCount; ++i) { var p = new MoneyParticle(); // Spawn at random X across the top of the screen p.x = 100 + Math.random() * (2048 - 200); // avoid extreme edges p.y = 120 + Math.random() * 40; game.addChild(p); moneyParticles.push(p); } // Animate tapBtn tween(tapBtn, { scaleX: 1.3, scaleY: 1.3 }, { duration: 80, easing: tween.easeOut, onFinish: function onFinish() { tween(tapBtn, { scaleX: 1.5, scaleY: 1.5 }, { duration: 80, easing: tween.easeIn }); } }); } }; // --- Game Update --- game.update = function () { // Update all businesses for (var i = 0; i < businessObjs.length; ++i) { if (!businessObjs[i]) { continue; } var bizObj = businessObjs[i]; if (typeof bizObj.update === "function") { bizObj.update(); } // (Removed mask/unmask logic so businesses can overflow the screen) } // Update and animate money particles for (var i = moneyParticles.length - 1; i >= 0; --i) { moneyParticles[i].update(); } }; // --- Init --- loadGame(); applyOfflineEarnings(); setupUI(); updateMoneyUI(); // --- Save every 5 seconds --- LK.setInterval(function () { saveGame(); }, 5000);
===================================================================
--- original.js
+++ change.js
@@ -73,9 +73,9 @@
costTxt.y = -50;
self.addChild(costTxt);
// Profit
profitTxt = new Text2("+$0", {
- size: 36,
+ size: 48,
fill: 0x008000,
font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma"
});
profitTxt.anchor.set(1, 0.5);
button when clicked earn gold. In-Game asset. 2d. High contrast. No shadows
button upgrade level of business. In-Game asset. 2d. High contrast. No shadows
lemonade stand. In-Game asset. 2d. High contrast. No shadows
newspaper delivery. In-Game asset. 2d. High contrast. No shadows
carwash bussiness. In-Game asset. 2d. High contrast. No shadows
pizza store. In-Game asset. 2d. High contrast. No shadows
movie theater. In-Game asset. 2d. High contrast. No shadows
bank. In-Game asset. 2d. High contrast. No shadows
oil company. In-Game asset. 2d. High contrast. No shadows
background for game clean minimalist. In-Game asset. 2d. High contrast. No shadows
dollar paper. In-Game asset. 2d. High contrast. No shadows