Code edit (4 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
play the countdown sound during the last 5 seconds
Code edit (9 edits merged)
Please save this source code
User prompt
use the storage plugin to store the bestScore ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (4 edits merged)
Please save this source code
User prompt
ensure that ``` if (profit > 0) { LK.getSound('victory').play(); // Play victory sound } else if (profit < 0) { LK.getSound('failed').play(); // Play failed sound } ``` is run only once
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Timeout.tick error: Cannot read properties of undefined (reading 'destroy')' in or related to this line: 'confetti.destroy();' Line Number: 358
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var storage = LK.import("@upit/storage.v1", { bestScore: 0 }); /**** * Classes ****/ var al = Container.expand(function (value) { var self = Container.call(this); self.value = value; var label = new Text2('$' + value, { size: 70, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.alpha = 0; self.updatePosition = function (axisY) { var newY = axisY - self.value * epx - alfs / 2; if (newY > j.height * 0.82) { self.value += (nbMarkers - 1) * 25; label.setText('$' + self.value); } else if (newY < j.height * 0.07) { self.value -= (nbMarkers - 1) * 25; label.setText('$' + self.value); } self.y = axisY - self.value * epx - alfs / 2; }; }); var ax = Container.expand(function (ev) { var self = Container.call(this); var vin = 0.02; self.ev = ev; self.yValue = 0; self.updateSlide = function () { var sd = Math.max(0, svh[gi + 1] - 100); var targetY = ll + sd * epx; if (!self.ev) { var deltaY = (targetY - self.y) * vin; self.y += deltaY; if (Math.abs(deltaY) < 1) { self.y = targetY; } if (msv && self.y <= ll) { self.y = ll; msv = 0; } self.alpha = self.y > j.height * 0.85 ? 0 : 1; } }; self.drawAxis = function () { var axisGraphics = self.addChild(LK.getAsset('axis', { height: 4 })); }; }); var bb = Container.expand(function () { var self = Container.call(this); self.currentText = "Buy"; self.updateButtonState = function () { var stockPrice = svh[gi]; var canBuy = p.getBalance() >= stockPrice && stockPrice > 0 && mar; this.alpha = canBuy ? 1 : 0.5; this.interactive = canBuy; }; self.setText = function (text, isPressed) { self.currentText = text; var buttonTextSize = isPressed ? 230 : 250; var buttonText = new Text2(text, { size: buttonTextSize, fill: 0xFFFFFF, font: "'Arial-BoldMT', 'Arial', sans-serif" }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); }; var buttonGraphics = self.attachAsset('bigButton', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFA500 }); self.on('down', function () { if (self.interactive) { buttonGraphics = self.attachAsset('bigButtonPressed', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFA500 }); LK.effects.flashScreen(0xFFA500, 100); self.setText(self.currentText, true); buyStock(1); } }).on('up', function () { buttonGraphics = self.attachAsset('bigButton', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFA500 }); self.setText(self.currentText); self.updateButtonState(); }); self.updateButtonState(); }); var bi = Container.expand(function () { var self = Container.call(this); var iconGraphics = self.attachAsset('balanceIcon', { anchorX: 0.5, anchorY: 0.5 }); }); var cf = Container.expand(function () { var self = Container.call(this); self.particles = []; var confettiColors = [0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x9400D3]; for (var i = 0; i < 50; i++) { var particle = self.addChild(new cp(confettiColors[i % confettiColors.length])); particle.x = Math.random() * j.width; particle.y = Math.random() * j.height; particle.vx = (Math.random() - 0.5) * 10; particle.vy = (Math.random() - 0.5) * 10; self.particles.push(particle); } self._update_migrated = function () { self.particles.forEach(function (particle) { particle.x += particle.vx; particle.y += particle.vy; particle.vy += 0.2; if (particle.y > j.height) { particle.y = 0; particle.vy = (Math.random() - 0.5) * 10; } }); }; }); var cp = Container.expand(function (color) { var self = Container.call(this); var confettiGraphics = self.attachAsset('confetti', { width: 40, height: 40, color: color, anchorX: 0.5, anchorY: 0.5 }); confettiGraphics.rotation = Math.random() * Math.PI * 2; }); var gs = Container.expand(function () { var self = Container.call(this); self.index1 = null; self.pad = 0; self.paf = 0; self.x1 = 0; self.y1 = 0; self.x2 = 0; self.y2 = 0; self.ater = false; var vin = .2; self.updateSlide = function () { if (ms) { if (self.index1 == gi) { var dsa1 = Math.abs(self.x - j.width * 0.25) / (j.width * 0.5); if (self.x < j.width * 0.35) { sa = Math.max(1, sa * (1 - dsa1)); } else if (self.x > j.width * 0.65) { sa = Math.min(15, sa * (1 + dsa1)); } } self.x -= sa * 1; } if (msv) { var currentDelta = horizontalAxis.y - ll; var targetY = ll - self.pad * epx + currentDelta; var deltaY = (targetY - self.y) * vin; self.y += deltaY; if (Math.abs(deltaY) <= 1) { self.y = targetY; } } }; var segmentGraphics = self.attachAsset('segment', { anchorY: 0.5 }); }); var pr = Container.expand(function () { var self = Container.call(this); self.balance = 100; self.stocks = 0; self.orders = 0; self.liquidate = function () { while (self.stocks > 0) { self.sellStock(1); } updateBalanceDisplay(); }; self.buyStock = function (quantity) { var price = svh[gi]; var cost = price * quantity; if (self.balance >= cost) { self.balance -= cost; self.stocks += quantity; self.orders++; sellButton.updateButtonState(); LK.getSound('buy').play(); // Play buy sound } else { LK.effects.flashScreen(0xFF0000, 100); } }; self.sellStock = function (quantity) { if (self.stocks > 0) { var price = svh[gi]; self.balance += price * quantity; self.stocks -= quantity; self.orders++; sellButton.updateButtonState(); LK.getSound('sell').play(); // Play sell sound } }; self.getBalance = function () { return self.balance; }; self.getStockCount = function () { return self.stocks; }; self.getPortfolio = function () { return self.stocks; }; }); var sb = Container.expand(function () { var self = Container.call(this); self.currentText = "ON"; self.setText = function (text, isPressed) { self.currentText = text; var buttonTextSize = isPressed ? 230 : 250; var buttonText = new Text2(text, { size: buttonTextSize, fill: 0xFFFFFF, font: "'Arial-BoldMT', 'Arial', sans-serif" }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); }; var buttonGraphics = self.attachAsset('bigButton', { anchorX: 0.5, anchorY: 0.5, tint: 0x008000 }); self.on('down', function () { buttonGraphics = self.attachAsset('bigButtonPressed', { anchorX: 0.5, anchorY: 0.5, tint: 0x008000 }); LK.effects.flashScreen(0x008000, 100); self.setText(self.currentText, true); sellStock(1); }).on('up', function () { buttonGraphics = self.attachAsset('bigButton', { anchorX: 0.5, anchorY: 0.5, tint: 0x008000 }); self.setText(self.currentText); }); }); var si = Container.expand(function () { var self = Container.call(this); var iconGraphics = self.attachAsset('stockIcon', { anchorX: 0.5, anchorY: 0.5 }); }); var ti = Container.expand(function () { var self = Container.call(this); var iconGraphics = self.attachAsset('timerIcon', { anchorX: 0.5, anchorY: 0.5 }); }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var j = game; function ce() { return j.children.some(function (child) { return child.name === 'confetti'; }); } function gr() { mar = false; p.liquidate(); var profit = p.getBalance() - md; LK.setScore(profit); var popup = j.addChild(LK.getAsset('popup', { anchorX: 0.5, anchorY: 0.5 })); popup.x = j.width / 2; popup.y = j.height / 2 - 300; resultText = 'Initial:\t$' + md + '\r\n' + 'Final:\t\t$' + p.getBalance().toFixed(0) + '\r\n' + 'Profit:' + '\r\n' + 'Best:'; var finalBalanceText = new Text2(resultText, { size: 100, fill: 0xFFFFFF, anchorX: 0.5, anchorY: 0.5 }); finalBalanceText.x = j.width / 2 - 500; finalBalanceText.y = j.height / 2 - 900; j.addChild(finalBalanceText); var profitTextColor = profit > 0 ? '#00ff00' : profit < 0 ? '#ff0000' : '#ffffff'; var profitText = new Text2('$' + profit.toFixed(0), { size: 120, fill: profitTextColor, anchorX: 0.5, anchorY: 0.5 }); profitText.x = j.width / 2 - 200; profitText.y = j.height / 2 - 700; j.addChild(profitText); //// if (profit > bestScore) { bestScore = profit; storage.bestScore = bestScore; } var bestText = new Text2('$' + parseInt("" + bestScore), { size: 100, fill: 0xFFFFFF, anchorX: 0.5, anchorY: 0.5 }); bestText.x = j.width / 2 - 200; bestText.y = j.height / 2 - 550; j.addChild(bestText); //// if (profit > 0 && !ce()) { var confetti = j.addChild(new cf()); confetti.name = 'confetti'; LK.on('tick', function () { confetti._update_migrated(); }); LK.setTimeout(function () { LK.showYouWin(); }, 3000); } else { LK.setTimeout(function () { LK.showGameOver(); }, 3000); } if (!endSoundPlayed) { if (profit > 0) { LK.getSound('victory').play(); // Play victory sound } else if (profit < 0) { LK.getSound('failed').play(); // Play failed sound } endSoundPlayed = true; // Set flag to true after playing sound } } var sa = 6.5; var sav = 0.10; var msv = 0; var vst = 500; var ul = j.height * 0.5; var ll = j.height * 0.75; var alfs = 70; var mar = false; var ms = false; var dip = false; var p = new pr(); var ntv = 180; var ss = []; var svh = [50]; var gi = 0; var gss = []; var cs = null; var gp = []; var jl = j.width; var sl = jl / 5; var epx = j.height * 0.5 / 100; var md = 100; var mde = 10; var dmx = 100; var sdi = null; var sps = 2.0; var sds = []; var endSoundPlayed = false; var bestScore = storage.bestScore || 0; var farBackground = j.addChild(LK.getAsset('farBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.25 })); farBackground.x = j.width / 2; farBackground.y = j.height / 2; var boardBackground = j.addChild(LK.getAsset('board', { anchorX: 0.5, anchorY: 0.5 })); boardBackground.x = j.width / 2; boardBackground.y = j.height * 0.9; var boardBorder = j.addChild(LK.getAsset('boardBorder', { anchorX: 0.5, anchorY: 0.5 })); boardBorder.x = j.width / 2; boardBorder.y = j.height * 0.85; var background = j.addChild(LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5 })); background.x = 1024; background.y = 2732 * 0.71; var horizontalAxis = j.addChild(new ax(false)); horizontalAxis.yValue = j.height * 0.75; horizontalAxis.drawAxis(); horizontalAxis.y = horizontalAxis.yValue; horizontalAxis.width = j.width; horizontalAxis.height = 10; horizontalAxis.x = 0; var verticalAxis = new ax(true); verticalAxis.drawAxis(); verticalAxis.rotation = Math.PI / 2; verticalAxis.x = 20; verticalAxis.width = j.height; verticalAxis.height = 10; verticalAxis.y = 0; var axisLabels = []; var nbMarkers = 7; for (var i = 0; i < nbMarkers; i++) { var axisLabel = new al(i * 25); axisLabel.x = verticalAxis.x + 60; axisLabel.updatePosition(horizontalAxis.y); axisLabel.alpha = 1; axisLabels.push(axisLabel); j.addChild(axisLabel); } var buyButton = j.addChild(new bb()); buyButton.setText('Buy'); buyButton.x = j.width * 0.25; buyButton.y = j.height - buyButton.height / 2 - 20; var sellButton = j.addChild(new sb()); sellButton.setText('Sell'); sellButton.x = j.width * 0.75; sellButton.y = j.height - sellButton.height / 2 - 20; sellButton.updateButtonState = function () { if (p.getStockCount() > 0) { this.alpha = 1; this.interactive = true; } else { this.alpha = 0.5; this.interactive = false; } }; sellButton.updateButtonState(); var timerIcon = j.addChild(new ti()); var timerText = new Text2('000', { size: 100, fill: 0xFFFFFF, anchorX: 0.5 }); timerText.anchor.set(-.95, -0.7); LK.gui.topLeft.addChild(timerText); timerIcon.x = j.width * 0.165; timerIcon.y = j.height * 0.025; var balanceIcon = j.addChild(new bi()); balanceIcon.x = j.width * 0.5; balanceIcon.y = j.height * 0.025; var stockIcon = j.addChild(new si()); stockIcon.x = j.width * 0.94; stockIcon.y = j.height * 0.028; var balanceText = new Text2('$' + p.getBalance() + ' ', { size: 100, fill: 0xFFFFFF, anchorX: 0.5 }); balanceText.anchor.set(.5, -0.7); LK.gui.top.addChild(balanceText); var stocksNumber = new Text2(p.getPortfolio(), { size: 100, fill: 0xFFFFFF, anchorX: 0.5 }); stocksNumber.anchor.set(1.6, -0.7); LK.gui.topRight.addChild(stocksNumber); var verticalSlideAmount = 0; var vsaText = new Text2('', { size: 50, fill: 0xFFFFFF }); vsaText.anchor.set(0, 0); LK.gui.topLeft.addChild(vsaText); var stockValueText = new Text2('', { size: 75, fill: 0xFFFFFF }); stockValueText.anchor.set(1, 4); stockValueText.alpha = 0; LK.gui.right.addChild(stockValueText); function updateStockValueText() { if (gi < svh.length) { stockValueText.setText('$' + svh[gi + 1].toFixed(0)); } } function updateBalanceDisplay() { balanceText.setText('$' + p.getBalance() + ' '); stocksNumber.setText(p.getStockCount()); buyButton.updateButtonState(); } function buyStock(stock) { p.buyStock(stock, 1); updateBalanceDisplay(); } function sellStock(stock) { p.sellStock(stock, 1); updateBalanceDisplay(); } function dss() { var hasFinished = hasFinished || gi >= gp.length - 1; if (hasFinished) { gr(); return; } if (!dip) { var previousValue = svh[gi]; var newValue = svh[gi + 1]; if (newValue > previousValue) { LK.getSound('increase').play(); } else if (newValue < previousValue) { LK.getSound('decrease').play(); } updateStockValueText(); buyButton.updateButtonState(); var prp = gp[gi]; var sep = gp[gi + 1]; var ec1 = sep.y - prp.y; var ec2 = sep.x - prp.x; var aes = Math.atan2(ec1, ec2); var lon = Math.sqrt(Math.pow(sep.x - prp.x, 2) + Math.pow(sep.y - prp.y, 2)); var pres = gss.length > 0 ? gss[gss.length - 1] : null; var pr1 = pres ? pres.x + Math.cos(pres.rotation) * pres.width : gp[gi].x; var pr2 = pres ? pres.y + Math.sin(pres.rotation) * pres.width : gp[gi].y; prp.x = pr1; prp.y = pr2 > ll ? ll : pr2; var fie = prp.y + Math.sin(aes) * lon; if (fie > ll) { lon = (ll - prp.y) / Math.sin(aes); } if (fie < ul || fie >= j.height * 0.5 && svh[gi + 1] >= 100 && ec1 != 0) { msv = -1 * Math.sign(ec1); } else { msv = 0; } dip = true; dar(j, gi, prp.x, prp.y, aes, lon, 0.5); } } function dar(jr, nu, p1, p2, an, lon, du) { var arre = jr.addChild(new gs()); arre.index1 = nu; arre.pad = svh[nu]; arre.paf = svh[nu + 1]; arre.x1 = p1; arre.y1 = p2; arre.rotation = an; arre.width = 1; arre.height = 20; gss.push(arre); arre.x = p1; arre.y = p2; var startTime = Date.now(); var endTime = startTime + du * 1000 * sps; var mlg = function mlg() { if (!mar) { return; } var currentTime = Date.now(); var timeElapsed = currentTime - startTime; var nlo = Math.min(timeElapsed / (du * 1000 * sps) * lon, lon); arre.width = nlo; if (currentTime < endTime) { LK.setTimeout(mlg, 16); } else { if (!ms && arre.x + arre.width / 2 >= j.width * 0.5) { ms = true; } arre.ater = true; gi++; dip = false; } }; mlg(); } function sj() { var previousValue = svh[svh.length - 1]; for (var i = 0; i < 5; i++) { var delta = Math.floor((Math.random() - 0.5) * mde); var newValue = Math.max(1, previousValue + (previousValue == 1 ? Math.abs(delta) : delta)); if (newValue > previousValue) { LK.getSound('increase').play(); } svh.push(newValue); previousValue = newValue; } previousValue = svh[svh.length - 1]; for (var i = 5; i < ntv; i++) { var delta = Math.floor((Math.random() - 0.5) * dmx); var newValue = Math.max(1, previousValue + (previousValue == 1 ? Math.abs(delta) : delta)); if (newValue < previousValue) { LK.getSound('decrease').play(); } svh.push(newValue); previousValue = newValue; } buyButton.updateButtonState(); var x, y; for (var i = 0; i < svh.length; i++) { x = sl * i; y = j.height * 0.75 - svh[i] * epx; gp.push({ x: x, y: y }); } mar = true; LK.setTimeout(function () { stockValueText.alpha = 1; }, 100); sdi = LK.setInterval(dss, 10); var timerUpdateInterval = LK.setInterval(function () { var currentTime = Math.max(0, ntv - gi - 1); timerText.setText(currentTime.toString().padStart(3, '0')); // Play countdown sound during the last 5 seconds if (currentTime < 5 && currentTime > 0) { LK.getSound('finalCountdown').play(); } }, 1000); } LK.on('tick', function () { if (!mar) { return; } gss.forEach(function (segment) { segment.updateSlide(); }); horizontalAxis.updateSlide(); axisLabels.forEach(function (label) { label.updatePosition(horizontalAxis.y); }); }); var startTime = Date.now(); var countdownText = new Text2('3', { size: 300, fill: 0xFFFFFF, anchorX: 0.5, anchorY: 0.5 }); countdownText.x = j.width / 2 - 100; countdownText.y = j.height / 3; j.addChild(countdownText); var countdown = 3; var countdownInterval = LK.setInterval(function () { countdown--; if (countdown > 0) { countdownText.setText(countdown.toString()); LK.getSound('countdown').play(); // Play countdown sound } else { LK.clearInterval(countdownInterval); countdownText.destroy(); LK.getSound('countdownGo').play(); // Play final countdown sound sj(); } }, 1000);
===================================================================
--- original.js
+++ change.js
@@ -346,8 +346,15 @@
confetti.name = 'confetti';
LK.on('tick', function () {
confetti._update_migrated();
});
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 3000);
+ } else {
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 3000);
}
if (!endSoundPlayed) {
if (profit > 0) {
LK.getSound('victory').play(); // Play victory sound
@@ -355,11 +362,8 @@
LK.getSound('failed').play(); // Play failed sound
}
endSoundPlayed = true; // Set flag to true after playing sound
}
- LK.setTimeout(function () {
- LK.showGameOver();
- }, 3000);
}
var sa = 6.5;
var sav = 0.10;
var msv = 0;
@@ -370,9 +374,9 @@
var mar = false;
var ms = false;
var dip = false;
var p = new pr();
-var ntv = 22;
+var ntv = 180;
var ss = [];
var svh = [50];
var gi = 0;
var gss = [];
@@ -633,10 +637,10 @@
var timerUpdateInterval = LK.setInterval(function () {
var currentTime = Math.max(0, ntv - gi - 1);
timerText.setText(currentTime.toString().padStart(3, '0'));
// Play countdown sound during the last 5 seconds
- if (currentTime <= 5 && currentTime > 0) {
- LK.getSound('countdown').play();
+ if (currentTime < 5 && currentTime > 0) {
+ LK.getSound('finalCountdown').play();
}
}, 1000);
}
LK.on('tick', function () {
A Technical dark background. Nothing just a gradiant of colors from black to dark blue. Theme : stock market. background
A modern clean empty rectangular button without borders. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
without shadow
a basic empty ui popup with a black background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.