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.