User prompt
change burst effect add random delay and add fade effect to particles ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
go back before particle chagnes
User prompt
remove last change
User prompt
increase particle distance with fading effect
User prompt
add particle objects fading effect to bottom
User prompt
partical look like burst right now change it add random delay to each of them
User prompt
remove last change
User prompt
set transparency 0. if bussiness position under tap button position
User prompt
go back to before hide branch
User prompt
Please fix the bug: 'ReferenceError: businessScrollArea is not defined' in or related to this line: 'var bizRowBg = businessScrollArea.children[i * 2]; // backgrounds are at even indices' Line Number: 743
User prompt
go back before hide
User prompt
Please fix the bug: 'ReferenceError: businessScrollArea is not defined' in or related to this line: 'var bizRowBg = businessScrollArea.children[i * 2]; // backgrounds are at even indices' Line Number: 741
User prompt
remove last change
User prompt
Please fix the bug: 'ReferenceError: businessScrollArea is not defined' in or related to this line: 'var bizRowBg = businessScrollArea.children[i * 2]; // backgrounds are at even indices' Line Number: 742
User prompt
if bussiness position under that position hide it and his background
User prompt
remove that image
User prompt
move that image infront of
User prompt
move that image infront of everything instead of earn button
User prompt
add image to bottom to hide overflowing bussiness
User prompt
go back before hide process
User prompt
go back
User prompt
Please fix the bug: 'ReferenceError: businessScrollArea is not defined' in or related to this line: 'var bizObjIdx = businessScrollArea.children.indexOf(bizObj);' Line Number: 740
User prompt
hide its background to
User prompt
if bussiness position under earn button position hide
User prompt
go back before maskin process
/**** * 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: 36, 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 }); timerBarBg.alpha = 0.3; 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.5 + Math.random() * 0.5, scaleY: 0.5 + Math.random() * 0.5, x: 0, y: 0, alpha: 0.7 // set transparency for money particle image }); // Optionally, add a $ sign text on top var txt = new Text2("$", { size: 48, fill: "#fff", font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma" }); txt.anchor.set(0.5, 0.5); self.addChild(txt); // 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 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 * 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) 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); 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 center) tapBtn = LK.getAsset('tap_btn', { anchorX: 0.5, anchorY: 1, // bottom anchor x: 2048 / 2, y: 2732 - 320 // 320px above bottom (moved up) }); tapBtn.interactive = true; game.addChild(tapBtn); // Removed tapBtnTxt label tapBtn.down = function (x, y, obj) { if (game.down) game.down(x, y, tapBtn); }; // Business rows // Slideable area for businesses // ... later in setupUI: var businessScrollArea = new Container(); businessScrollArea.x = 0; businessScrollArea.y = 0; game.addChild(businessScrollArea); // (No masking applied to businessScrollArea) 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: 80, y: startY + i * gapY, scaleX: 1, 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) // --- 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: 0.9, scaleY: 0.9 }, { duration: 80, easing: tween.easeOut, onFinish: function onFinish() { tween(tapBtn, { scaleX: 1, scaleY: 1 }, { 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(); } } // 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
@@ -274,29 +274,48 @@
x: 0,
y: 0,
alpha: 0.7 // set transparency for money particle image
});
- // 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;
- self.life = 40 + Math.floor(Math.random() * 20);
- self.alpha = 1;
// Optionally, add a $ sign text on top
var txt = new Text2("$", {
size: 48,
fill: "#fff",
font: "'GillSans-Bold', Impact, 'Arial Black', Tahoma"
});
txt.anchor.set(0.5, 0.5);
self.addChild(txt);
- // Overwrite update to handle movement and cleanup
+ // 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 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 * 16,
+ easing: tween.linear
+ });
+ } else {
+ return;
+ }
+ }
self.x += self.vx;
self.y += self.vy;
- self.life--;
- if (self.life <= 0) {
+ 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);
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