User prompt
play victory sound at the end if profit > 0 and play failed sound if < 0
User prompt
play corresponding sounds when buying or selling
User prompt
increase and decrease should be played during the game not only on game preparation
User prompt
play increase and decrease sounds when value change
User prompt
play countdown sound during the initial countdown
User prompt
Migrate to the latest version of LK
Code edit (9 edits merged)
Please save this source code
User prompt
buyButton should be enabled only when mar = true (game running)
Code edit (2 edits merged)
Please save this source code
User prompt
Add a big 3 second countdown before starting game
User prompt
set the score to be the profit using LK.setScore()
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught LK.Game can only be initialized once' in or related to this line: 'var j = new LK.Game({});' Line Number: 301
Code edit (9 edits merged)
Please save this source code
User prompt
Fix Bug: 'Timeout.tick error: Cannot read properties of undefined (reading 'destroy')' in or related to this line: 'confetti.destroy();' Line Number: 353
Code edit (1 edits merged)
Please save this source code
User prompt
make confetti rotation random
Code edit (1 edits merged)
Please save this source code
User prompt
fix the conffetti colors not applying
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'Timeout.tick error: game.getChildByName is not a function' in or related to this line: 'if (profit > 0 && !game.getChildByName('confetti')) {' Line Number: 333
User prompt
Confettiis called to much times
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'Timeout.tick error: confettiColors is not defined' in or related to this line: 'var particle = self.addChild(LK.getAsset('segment', {' Line Number: 265
User prompt
in Confetti Change the ' Math.random() * 0xFFFFFF,' , use an array of colors instead
===================================================================
--- original.js
+++ change.js
@@ -1,673 +1,376 @@
/****
* Classes
****/
-var ConfettiParticle = Container.expand(function (color) {
- var self = Container.call(this);
- var confettiGraphics = self.attachAsset('confetti', {
- width: 40,
- height: 20,
- color: color,
- anchorX: 0.5,
- anchorY: 0.5
- });
- confettiGraphics.rotation = Math.random() * Math.PI * 2;
-});
-var BalanceIcon = Container.expand(function () {
- var self = Container.call(this);
- var iconGraphics = self.attachAsset('balanceIcon', {
- anchorX: 0.5,
- anchorY: 0.5
- });
-});
-var TimerIcon = Container.expand(function () {
- var self = Container.call(this);
- var iconGraphics = self.attachAsset('timerIcon', {
- anchorX: 0.5,
- anchorY: 0.5
- });
-});
-var StockIcon = Container.expand(function () {
- var self = Container.call(this);
- var iconGraphics = self.attachAsset('stockIcon', {
- anchorX: 0.5,
- anchorY: 0.5
- });
-});
-var AxisLabel = Container.expand(function (value) {
- var self = Container.call(this);
- self.value = value;
- var label = new Text2('$' + value, {
- size: 70,
- fill: "#ffffff"
- });
- label.anchor.set(0.5, 0.5);
- self.addChild(label);
- self.alpha = 0;
- self.updatePosition = function (axisY) {
- var newY = axisY - self.value * dollarToYPixelRatio - axisLabelFontSize / 2;
- if (newY > game.height * 0.82) {
- self.value += (nbMarkers - 1) * 25;
- label.setText('$' + self.value);
- } else if (newY < game.height * 0.07) {
- self.value -= (nbMarkers - 1) * 25;
- label.setText('$' + self.value);
- }
- self.y = axisY - self.value * dollarToYPixelRatio - axisLabelFontSize / 2;
- };
-});
-var GraphSegment = Container.expand(function () {
- var self = Container.call(this);
- self.index1 = null;
- self.stockValue1 = 0;
- self.stockValue2 = 0;
- self.x1 = 0;
- self.y1 = 0;
- self.x2 = 0;
- self.y2 = 0;
- self.isFinished = false;
- var interpolationSpeed = .2; // Adjust this value for speed
- self.updateSlide = function () {
- if (moveSegments) {
- if (self.index1 == graphIndex) {
- var dynamicSlideAdjustment = Math.abs(self.x - game.width * 0.25) / (game.width * 0.5);
- if (self.x < game.width * 0.35) {
- slideAmount = Math.max(1, slideAmount * (1 - dynamicSlideAdjustment));
- } else if (self.x > game.width * 0.65) {
- slideAmount = Math.min(15, slideAmount * (1 + dynamicSlideAdjustment));
- }
- }
- self.x -= slideAmount * 1;
- }
- if (moveSegmentsVertically) {
- var currentDelta = horizontalAxis.y - lowerLimit;
- var targetY = lowerLimit - self.stockValue1 * dollarToYPixelRatio + currentDelta;
- var deltaY = (targetY - self.y) * interpolationSpeed;
- self.y += deltaY;
- if (Math.abs(deltaY) <= 1) {
- self.y = targetY;
- }
- }
- };
- var segmentGraphics = self.attachAsset('segment', {
- anchorY: 0.5
- });
-});
-// Axis class to represent the graph axes
-var Axis = Container.expand(function (isVertical) {
- var self = Container.call(this);
- var interpolationSpeed = 0.02; // Adjust this value for speed
- var lowerLimit = game.height * 0.75;
- self.isVertical = isVertical; // Property to determine if the axis is vertical
- self.yValue = 0; // Track the Y value of the axis for vertical movement
- self.updateSlide = function () {
- // Current stock value excedent over 100$ (ignore below 100$)
- var stockDelta = Math.max(0, stockValuesHistory[graphIndex + 1] - 100);
- // Target = base axis + delta in pixels
- var targetY = lowerLimit + stockDelta * dollarToYPixelRatio;
- if (!self.isVertical) {
- // Smooth interpolation
- var deltaY = (targetY - self.y) * interpolationSpeed;
- self.y += deltaY;
- if (Math.abs(deltaY) < 1) {
- self.y = targetY;
- }
- if (moveSegmentsVertically && self.y <= lowerLimit) {
- self.y = lowerLimit;
- moveSegmentsVertically = 0;
- }
- // Set alpha based on y position
- self.alpha = self.y > game.height * 0.85 ? 0 : 1;
- }
- };
- self.drawAxis = function () {
- var axisGraphics = self.addChild(LK.getAsset('axis', {
- height: 4 // Thin line for the axis
- }));
- };
-});
-// ValueIndicator class to represent the current value of the stock on the graph
-// Player class to represent the player's portfolio
-var Player = Container.expand(function () {
- var self = Container.call(this);
- self.balance = 100; // Start with $100
- self.stocks = 0; // Counter to hold stock quantity
- self.orders = 0; // Counter to hold stock quantity
- self.liquidate = function () {
- while (self.stocks > 0) {
- self.sellStock(1);
- }
- updateBalanceDisplay();
- };
- self.buyStock = function (quantity) {
- var price = stockValuesHistory[graphIndex];
- var cost = price * quantity;
- if (self.balance >= cost) {
- self.balance -= cost;
- self.stocks += quantity;
- self.orders++;
- sellButton.updateButtonState();
- } else {
- LK.effects.flashScreen(0xFF0000, 100);
- }
- };
- self.sellStock = function (quantity) {
- if (self.stocks > 0) {
- var price = stockValuesHistory[graphIndex];
- self.balance += price * quantity;
- self.stocks -= quantity;
- self.orders++;
- sellButton.updateButtonState();
- }
- };
- self.getBalance = function () {
- return self.balance;
- };
- self.getStockCount = function () {
- return self.stocks;
- };
- self.getPortfolio = function () {
- return self.stocks;
- };
-});
-var BuyButton = Container.expand(function () {
- var self = Container.call(this);
- self.currentText = "Buy";
- self.updateButtonState = function () {
- var stockPrice = stockValuesHistory[graphIndex];
- var canBuy = player.getBalance() >= stockPrice && stockPrice > 0;
- 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: "#ffffff",
- font: "'Arial-BoldMT', 'Arial', sans-serif"
+var ConfettiParticle = Container.expand(function (t) {
+ var self = Container.call(this);
+ Container.call(this).attachAsset("confetti", {
+ width: 40,
+ height: 20,
+ color: t,
+ anchorX: .5,
+ anchorY: .5
+ }).rotation = Math.random() * Math.PI * 2;
+ }),
+ BalanceIcon = Container.expand(function () {
+ Container.call(this).attachAsset("balanceIcon", {
+ anchorX: .5,
+ anchorY: .5
});
- 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
+ }),
+ TimerIcon = Container.expand(function () {
+ Container.call(this).attachAsset("timerIcon", {
+ anchorX: .5,
+ anchorY: .5
});
- self.setText(self.currentText);
- self.updateButtonState();
- });
- self.updateButtonState();
-});
-var SellButton = 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: "#ffffff",
- font: "'Arial-BoldMT', 'Arial', sans-serif"
+ }),
+ StockIcon = Container.expand(function () {
+ Container.call(this).attachAsset("stockIcon", {
+ anchorX: .5,
+ anchorY: .5
});
- 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
+ }),
+ AxisLabel = Container.expand(function (t) {
+ var a = Container.call(this);
+ a.value = t;
+ var n = new Text2("$" + t, {
+ size: 70,
+ fill: "#ffffff"
});
- 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
+ n.anchor.set(.5, .5), a.addChild(n), a.alpha = 0, a.updatePosition = function (t) {
+ var e = t - a.value * dollarToYPixelRatio - axisLabelFontSize / 2;
+ e > .82 * game.height ? (a.value += 25 * (nbMarkers - 1), n.setText("$" + a.value)) : e < .07 * game.height && (a.value -= 25 * (nbMarkers - 1), n.setText("$" + a.value)), a.y = t - a.value * dollarToYPixelRatio - axisLabelFontSize / 2;
+ };
+ }),
+ GraphSegment = Container.expand(function () {
+ var a = Container.call(this);
+ a.index1 = null, a.stockValue1 = 0, a.stockValue2 = 0, a.x1 = 0, a.y1 = 0, a.x2 = 0, a.y2 = 0, a.isFinished = !1;
+ a.updateSlide = function () {
+ var t, e;
+ moveSegments && (a.index1 == graphIndex && (t = Math.abs(a.x - .25 * game.width) / (.5 * game.width), a.x < .35 * game.width ? slideAmount = Math.max(1, slideAmount * (1 - t)) : a.x > .65 * game.width && (slideAmount = Math.min(15, slideAmount * (1 + t)))), a.x -= +slideAmount), moveSegmentsVertically && (e = horizontalAxis.y - lowerLimit, e = .2 * ((t = lowerLimit - a.stockValue1 * dollarToYPixelRatio + e) - a.y), a.y += e, Math.abs(e) <= 1 && (a.y = t));
+ };
+ a.attachAsset('segment', {
+ anchorY: .5
});
- self.setText(self.currentText);
- });
-});
-var Confetti = 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 ConfettiParticle(confettiColors[i % confettiColors.length]));
- particle.x = Math.random() * game.width;
- particle.y = Math.random() * game.height;
- particle.vx = (Math.random() - 0.5) * 10;
- particle.vy = (Math.random() - 0.5) * 10;
- self.particles.push(particle);
- }
- self.update = function () {
- self.particles.forEach(function (particle) {
- particle.x += particle.vx;
- particle.y += particle.vy;
- particle.vy += 0.2; // gravity
- if (particle.y > game.height) {
- particle.y = 0;
- particle.vy = (Math.random() - 0.5) * 10;
+ }),
+ Axis = Container.expand(function (t) {
+ var a = Container.call(this),
+ n = .75 * game.height;
+ a.isVertical = t, a.yValue = 0, a.updateSlide = function () {
+ var t = Math.max(0, stockValuesHistory[graphIndex + 1] - 100),
+ e = n + t * dollarToYPixelRatio;
+ a.isVertical || (t = .02 * (e - a.y), a.y += t, Math.abs(t) < 1 && (a.y = e), moveSegmentsVertically && a.y <= n && (a.y = n, moveSegmentsVertically = 0), a.alpha = a.y > .85 * game.height ? 0 : 1);
+ }, a.drawAxis = function () {
+ a.addChild(LK.getAsset('axis', {
+ height: 4
+ }));
+ };
+ }),
+ Player = Container.expand(function () {
+ var a = Container.call(this);
+ a.balance = 100, a.stocks = 0, a.orders = 0, a.liquidate = function () {
+ for (; 0 < a.stocks;) {
+ a.sellStock(1);
}
+ updateBalanceDisplay();
+ }, a.buyStock = function (t) {
+ var e = stockValuesHistory[graphIndex] * t;
+ a.balance >= e ? (a.balance -= e, a.stocks += t, a.orders++, sellButton.updateButtonState()) : LK.effects.flashScreen(16711680, 100);
+ }, a.sellStock = function (t) {
+ var e;
+ 0 < a.stocks && (e = stockValuesHistory[graphIndex], a.balance += e * t, a.stocks -= t, a.orders++, sellButton.updateButtonState());
+ }, a.getBalance = function () {
+ return a.balance;
+ }, a.getStockCount = function () {
+ return a.stocks;
+ }, a.getPortfolio = function () {
+ return a.stocks;
+ };
+ }),
+ BuyButton = Container.expand(function () {
+ var a = Container.call(this);
+ a.currentText = "Buy", a.updateButtonState = function () {
+ var t = stockValuesHistory[graphIndex],
+ t = player.getBalance() >= t && 0 < t;
+ this.alpha = t ? 1 : .5, this.interactive = t;
+ }, a.setText = function (t, e) {
+ a.currentText = t;
+ e = new Text2(t, {
+ size: e ? 230 : 250,
+ fill: "#ffffff",
+ font: "'Arial-BoldMT', 'Arial', sans-serif"
+ });
+ e.anchor.set(.5, .5), a.addChild(e);
+ };
+ a.attachAsset('bigButton', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 16753920
});
- };
-});
+ a.on("down", function () {
+ a.interactive && (a.attachAsset('bigButtonPressed', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 16753920
+ }), LK.effects.flashScreen(16753920, 100), a.setText(a.currentText, !0), buyStock(1));
+ }).on("up", function () {
+ a.attachAsset('bigButton', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 16753920
+ }), a.setText(a.currentText), a.updateButtonState();
+ }), a.updateButtonState();
+ }),
+ SellButton = Container.expand(function () {
+ var a = Container.call(this);
+ a.currentText = "ON", a.setText = function (t, e) {
+ a.currentText = t;
+ e = new Text2(t, {
+ size: e ? 230 : 250,
+ fill: "#ffffff",
+ font: "'Arial-BoldMT', 'Arial', sans-serif"
+ });
+ e.anchor.set(.5, .5), a.addChild(e);
+ };
+ a.attachAsset('bigButton', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 32768
+ });
+ a.on("down", function () {
+ a.attachAsset('bigButtonPressed', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 32768
+ }), LK.effects.flashScreen(32768, 100), a.setText(a.currentText, !0), sellStock(1);
+ }).on("up", function () {
+ a.attachAsset('bigButton', {
+ anchorX: .5,
+ anchorY: .5,
+ tint: 32768
+ }), a.setText(a.currentText);
+ });
+ }),
+ Confetti = Container.expand(function () {
+ var t = Container.call(this);
+ t.particles = [];
+ for (var e = [16711680, 16744192, 16776960, 65280, 255, 4915330, 9699539], a = 0; a < 50; a++) {
+ var n = t.addChild(new ConfettiParticle(e[a % e.length]));
+ n.x = Math.random() * game.width, n.y = Math.random() * game.height, n.vx = 10 * (Math.random() - .5), n.vy = 10 * (Math.random() - .5), t.particles.push(n);
+ }
+ t.update = function () {
+ t.particles.forEach(function (t) {
+ t.x += t.vx, t.y += t.vy, t.vy += .2, t.y > game.height && (t.y = 0, t.vy = 10 * (Math.random() - .5));
+ });
+ };
+ }),
+ game = new LK.Game({});
/****
* Initialize Game
****/
-var game = new LK.Game({});
+var game = new LK.Game({
+ backgroundColor: 0x000000
+});
/****
* Game Code
****/
function confettiExists() {
- return game.children.some(function (child) {
- return child.name === 'confetti';
+ return game.children.some(function (t) {
+ return "confetti" === t.name;
});
}
function gameResult() {
player.liquidate();
- var profit = player.getBalance() - initialAmount;
- var popup = game.addChild(LK.getAsset('popup', {
- anchorX: 0.5,
- anchorY: 0.5
- }));
- popup.x = game.width / 2;
- popup.y = game.height / 2 - 300;
- resultText = 'Initial:\t$' + initialAmount + '\r\n' + 'Final:\t\t$' + player.getBalance().toFixed(0) + '\r\n' + 'Profit:';
- // Create a text object to display the final balance
- var finalBalanceText = new Text2(resultText, {
+ var t = player.getBalance() - initialAmount,
+ e = game.addChild(LK.getAsset('popup', {
+ anchorX: .5,
+ anchorY: .5
+ }));
+ e.x = game.width / 2, e.y = game.height / 2 - 300, resultText = "Initial:\t$" + initialAmount + "\r\nFinal:\t\t$" + player.getBalance().toFixed(0) + "\r\nProfit:";
+ e = new Text2(resultText, {
size: 100,
fill: "#ffffff",
- anchorX: 0.5,
- anchorY: 0.5
+ anchorX: .5,
+ anchorY: .5
});
- finalBalanceText.x = game.width / 2 - 500;
- finalBalanceText.y = game.height / 2 - 900; // Position below the popup
- // Add the final balance text to the game
- game.addChild(finalBalanceText);
- var profitTextColor = profit > 0 ? '#00ff00' : profit < 0 ? '#ff0000' : '#ffffff';
- var profitText = new Text2('$' + profit.toFixed(0), {
- size: 200,
- fill: profitTextColor,
- anchorX: 0.5,
- anchorY: 0.5
- });
- profitText.x = game.width / 2 - 220;
- profitText.y = game.height / 2 - 700; // Position below the popup
- // Add the final balance text to the game
- game.addChild(profitText);
- if (profit > 0 && !confettiExists()) {
- var confetti = game.addChild(new Confetti());
- confetti.name = 'confetti';
- LK.on('tick', function () {
- confetti.update();
+ e.x = game.width / 2 - 500, e.y = game.height / 2 - 900, game.addChild(e);
+ var a,
+ e = 0 < t ? "#00ff00" : t < 0 ? "#ff0000" : "#ffffff",
+ e = new Text2("$" + t.toFixed(0), {
+ size: 200,
+ fill: e,
+ anchorX: .5,
+ anchorY: .5
});
- }
- LK.setTimeout(function () {
- LK.showGameOver();
- if (profit > 0 && confettiExists()) {
- confetti.destroy();
- }
- }, 3000); // Delay GameOver to allow the popup to be seen
+ e.x = game.width / 2 - 220, e.y = game.height / 2 - 700, game.addChild(e), 0 < t && !confettiExists() && ((a = game.addChild(new Confetti())).name = "confetti", LK.on("tick", function () {
+ a.update();
+ })), LK.setTimeout(function () {
+ LK.showGameOver(), 0 < t && confettiExists() && a.destroy();
+ }, 3e3);
}
-var debug = false;
-var slideAmount = 6.5;
-var slideAmountVertical = 0.10; // Reduced speed for smoother vertical movement
-var moveSegmentsVertically = 0;
-var verticalSlideThreshold = 500; // Define a global threshold for vertical sliding
-var upperLimit = game.height * 0.5; //0.25
-var lowerLimit = game.height * 0.75; // Define lowerLimit for use in segment positioning
-var axisLabelFontSize = 70;
-var running = false;
-var moveSegments = false;
-var drawingInProgress = false;
-// Initialize game elements
-var player = new Player();
-var nbTotalValues = 180; // Graph lenght <=> Round duration
-var stocks = [];
-// Initialize stock values history with the first value of $10
-var stockValuesHistory = [50];
-// Define graphIndex and initialize to 0
-var graphIndex = 0;
-// Declare a global array to store graph segments
-var graphSegments = [];
-// Define a global variable for the current stock
-var currentStock = null;
-var graphPoints = [];
-var graphWidth = game.width;
-var segmentWidth = graphWidth / 5;
-var dollarToYPixelRatio = game.height * 0.5 / 100;
-var initialAmount = 100;
-var beginingValueDelta = 10;
-var maxValueDelta = 100;
-var segmentDrawInterval = null;
-var secondsPerSegment = 2.0;
-var stockDisplay = []; // Array to hold stock display elements
-/****
-* UI Elements
-****/
-var farBackground = game.addChild(LK.getAsset('farBackground', {
- anchorX: 0.5,
- anchorY: 0.5,
- alpha: 0.25
-}));
-farBackground.x = game.width / 2;
-farBackground.y = game.height / 2;
+var debug = !1,
+ slideAmount = 6.5,
+ slideAmountVertical = .1,
+ moveSegmentsVertically = 0,
+ verticalSlideThreshold = 500,
+ upperLimit = .5 * game.height,
+ lowerLimit = .75 * game.height,
+ axisLabelFontSize = 70,
+ running = !1,
+ moveSegments = !1,
+ drawingInProgress = !1,
+ player = new Player(),
+ nbTotalValues = 180,
+ stocks = [],
+ stockValuesHistory = [50],
+ graphIndex = 0,
+ graphSegments = [],
+ currentStock = null,
+ graphPoints = [],
+ graphWidth = game.width,
+ segmentWidth = graphWidth / 5,
+ dollarToYPixelRatio = .5 * game.height / 100,
+ initialAmount = 100,
+ beginingValueDelta = 10,
+ maxValueDelta = 100,
+ segmentDrawInterval = null,
+ secondsPerSegment = 2,
+ stockDisplay = [],
+ farBackground = game.addChild(LK.getAsset('farBackground', {
+ anchorX: .5,
+ anchorY: .5,
+ alpha: .25
+ }));
+farBackground.x = game.width / 2, farBackground.y = game.height / 2;
var boardBackground = game.addChild(LK.getAsset('board', {
- anchorX: 0.5,
- anchorY: 0.5
+ anchorX: .5,
+ anchorY: .5
}));
-boardBackground.x = game.width / 2;
-boardBackground.y = game.height * 0.9;
+boardBackground.x = game.width / 2, boardBackground.y = .9 * game.height;
var boardBorder = game.addChild(LK.getAsset('boardBorder', {
- anchorX: 0.5,
- anchorY: 0.5
+ anchorX: .5,
+ anchorY: .5
}));
-boardBorder.x = game.width / 2;
-boardBorder.y = game.height * 0.85;
+boardBorder.x = game.width / 2, boardBorder.y = .85 * game.height;
var background = game.addChild(LK.getAsset('background', {
- anchorX: 0.5,
- anchorY: 0.5
+ anchorX: .5,
+ anchorY: .5
}));
-background.x = 1024; // Center x position
-background.y = 2732 * 0.71; // Center y position
-// Create and draw horizontal axis
-var horizontalAxis = game.addChild(new Axis(false)); // false indicates this is a horizontal axis
-horizontalAxis.yValue = game.height * 0.75; // Initialize yValue for vertical movement
-horizontalAxis.drawAxis();
-horizontalAxis.y = horizontalAxis.yValue;
-horizontalAxis.width = game.width;
-horizontalAxis.height = 10;
-horizontalAxis.x = 0; // Move axis to the left side of the screen
-// Create and draw vertical axis
-var verticalAxis = new Axis(true); // true indicates this is a vertical axis
-verticalAxis.drawAxis();
-verticalAxis.rotation = Math.PI / 2; // Rotate to make it vertical
-verticalAxis.x = 20; // Move axis to the left side of the screen
-verticalAxis.width = game.height;
-verticalAxis.height = 10;
-verticalAxis.y = 0;
-// Instantiate axis labels separately
-var axisLabels = [];
-var nbMarkers = 7;
-for (var i = 0; i < nbMarkers; i++) {
- var axisLabel = new AxisLabel(i * 25);
- axisLabel.x = verticalAxis.x + 60; // Position labels to the left of the vertical axis
- axisLabel.updatePosition(horizontalAxis.y);
- axisLabel.alpha = 1;
- axisLabels.push(axisLabel);
- game.addChild(axisLabel);
+background.x = 1024, background.y = 2732 * .71;
+var horizontalAxis = game.addChild(new Axis(!1));
+horizontalAxis.yValue = .75 * game.height, horizontalAxis.drawAxis(), horizontalAxis.y = horizontalAxis.yValue, horizontalAxis.width = game.width, horizontalAxis.height = 10, horizontalAxis.x = 0;
+var verticalAxis = new Axis(!0);
+verticalAxis.drawAxis(), verticalAxis.rotation = Math.PI / 2, verticalAxis.x = 20, verticalAxis.width = game.height, verticalAxis.height = 10, verticalAxis.y = 0;
+for (var axisLabels = [], nbMarkers = 7, i = 0; i < nbMarkers; i++) {
+ var axisLabel = new AxisLabel(25 * i);
+ axisLabel.x = verticalAxis.x + 60, axisLabel.updatePosition(horizontalAxis.y), axisLabel.alpha = 1, axisLabels.push(axisLabel), game.addChild(axisLabel);
}
-// Create buttons
var buyButton = game.addChild(new BuyButton());
-buyButton.setText('Buy');
-buyButton.x = game.width * 0.25;
-buyButton.y = game.height - buyButton.height / 2 - 20;
+buyButton.setText("Buy"), buyButton.x = .25 * game.width, buyButton.y = game.height - buyButton.height / 2 - 20;
var sellButton = game.addChild(new SellButton());
-sellButton.setText('Sell');
-sellButton.x = game.width * 0.75;
-sellButton.y = game.height - sellButton.height / 2 - 20;
-sellButton.updateButtonState = function () {
- if (player.getStockCount() > 0) {
- this.alpha = 1;
- this.interactive = true;
- } else {
- this.alpha = 0.5;
- this.interactive = false;
- }
-};
-sellButton.updateButtonState();
-var timerIcon = game.addChild(new TimerIcon());
-var timerText = new Text2('000', {
- size: 100,
- fill: "#ffffff",
- anchorX: 0.5
-});
-timerText.anchor.set(-.95, -0.7);
-LK.gui.topLeft.addChild(timerText);
-timerIcon.x = game.width * 0.165; // Position to the left of the balance icon
-timerIcon.y = game.height * 0.025;
+sellButton.setText("Sell"), sellButton.x = .75 * game.width, sellButton.y = game.height - sellButton.height / 2 - 20, sellButton.updateButtonState = function () {
+ 0 < player.getStockCount() ? (this.alpha = 1, this.interactive = !0) : (this.alpha = .5, this.interactive = !1);
+}, sellButton.updateButtonState();
+var timerIcon = game.addChild(new TimerIcon()),
+ timerText = new Text2("000", {
+ size: 100,
+ fill: "#ffffff",
+ anchorX: .5
+ });
+timerText.anchor.set(-.95, -.7), LK.gui.topLeft.addChild(timerText), timerIcon.x = .165 * game.width, timerIcon.y = .025 * game.height;
var balanceIcon = game.addChild(new BalanceIcon());
-balanceIcon.x = game.width * 0.5;
-balanceIcon.y = game.height * 0.025;
+balanceIcon.x = .5 * game.width, balanceIcon.y = .025 * game.height;
var stockIcon = game.addChild(new StockIcon());
-stockIcon.x = game.width * 0.94;
-stockIcon.y = game.height * 0.028;
-var balanceText = new Text2('$' + player.getBalance() + ' ', {
+stockIcon.x = .94 * game.width, stockIcon.y = .028 * game.height;
+var balanceText = new Text2("$" + player.getBalance() + " ", {
size: 100,
fill: "#ffffff",
- anchorX: 0.5
+ anchorX: .5
});
-balanceText.anchor.set(.5, -0.7);
-LK.gui.top.addChild(balanceText);
-// Create a text display for the number of stocks the player holds
+balanceText.anchor.set(.5, -.7), LK.gui.top.addChild(balanceText);
var stocksNumber = new Text2(player.getPortfolio(), {
size: 100,
fill: "#ffffff",
- anchorX: 0.5
+ anchorX: .5
});
-stocksNumber.anchor.set(1.6, -0.7);
-LK.gui.topRight.addChild(stocksNumber);
-// Create a text display for the verticalSlideAmount labeled VSA
-var verticalSlideAmount = 0;
-var vsaText = new Text2('', {
- size: 50,
- fill: "#ffffff"
-});
-vsaText.anchor.set(0, 0);
-LK.gui.topLeft.addChild(vsaText);
-var stockValueText = new Text2('', {
+stocksNumber.anchor.set(1.6, -.7), LK.gui.topRight.addChild(stocksNumber);
+var verticalSlideAmount = 0,
+ vsaText = new Text2("", {
+ size: 50,
+ fill: "#ffffff"
+ });
+vsaText.anchor.set(0, 0), LK.gui.topLeft.addChild(vsaText);
+var stockValueText = new Text2("", {
size: 75,
fill: "#FFFFFF"
});
-stockValueText.anchor.set(1, 2);
-stockValueText.alpha = 0;
-LK.gui.right.addChild(stockValueText);
function updateStockValueText() {
- if (graphIndex < stockValuesHistory.length) {
- stockValueText.setText('$' + stockValuesHistory[graphIndex + 1].toFixed(0));
- }
+ graphIndex < stockValuesHistory.length && stockValueText.setText("$" + stockValuesHistory[graphIndex + 1].toFixed(0));
}
-/****
-* Game Functions
-****/
-// Update the player's balance display
function updateBalanceDisplay() {
- balanceText.setText('$' + player.getBalance() + ' ');
- stocksNumber.setText(player.getStockCount());
- buyButton.updateButtonState();
+ balanceText.setText("$" + player.getBalance() + " "), stocksNumber.setText(player.getStockCount()), buyButton.updateButtonState();
}
-// Function to handle buying stocks
-function buyStock(stock) {
- player.buyStock(stock, 1); // Buy 1 stock for simplicity
- updateBalanceDisplay();
+function buyStock(t) {
+ player.buyStock(t, 1), updateBalanceDisplay();
}
-// Function to handle selling stocks
-function sellStock(stock) {
- player.sellStock(stock, 1); // Sell 1 stock for simplicity
- updateBalanceDisplay();
+function sellStock(t) {
+ player.sellStock(t, 1), updateBalanceDisplay();
}
function drawNextSegment() {
- var hasFinished = graphIndex >= graphPoints.length - 1;
- if (hasFinished) {
- gameResult();
- return;
- }
- if (!drawingInProgress) {
- updateStockValueText();
- // Update the BuyButton status when the stock value changes
- buyButton.updateButtonState();
- var pointA = graphPoints[graphIndex];
- var pointB = graphPoints[graphIndex + 1];
- var deltaY = pointB.y - pointA.y; // Calculate next segment rotation based on pointA and pointB coordinates
- var deltaX = pointB.x - pointA.x;
- var nextSegmentRotation = Math.atan2(deltaY, deltaX);
- if (deltaX < 0 || deltaY > 0) {
- //nextSegmentRotation += Math.PI;
- }
- var distance = Math.sqrt(Math.pow(pointB.x - pointA.x, 2) + Math.pow(pointB.y - pointA.y, 2)); // Calculate the distance between points A and B
- var lastSegment = graphSegments.length > 0 ? graphSegments[graphSegments.length - 1] : null;
- var lastSegmentEndX = lastSegment ? lastSegment.x + Math.cos(lastSegment.rotation) * lastSegment.width : graphPoints[graphIndex].x;
- var lastSegmentEndY = lastSegment ? lastSegment.y + Math.sin(lastSegment.rotation) * lastSegment.width : graphPoints[graphIndex].y;
- pointA.x = lastSegmentEndX;
- pointA.y = lastSegmentEndY > lowerLimit ? lowerLimit : lastSegmentEndY;
- var nextSegmentEndY = pointA.y + Math.sin(nextSegmentRotation) * distance;
- // Adjust distance to ensure segment's end doesn't exceed lowerLimit
- if (nextSegmentEndY > lowerLimit) {
- distance = (lowerLimit - pointA.y) / Math.sin(nextSegmentRotation);
- }
- if (nextSegmentEndY < upperLimit || nextSegmentEndY >= game.height * 0.5 && stockValuesHistory[graphIndex + 1] >= 100 && deltaY != 0) {
- moveSegmentsVertically = -1 * Math.sign(deltaY);
- } else {
- moveSegmentsVertically = 0;
- }
- var delay = 0.5; // Reduce delay to speed up the drawing of segments
- drawingInProgress = true;
- drawSegment(game, graphIndex, pointA.x, pointA.y, nextSegmentRotation, distance, delay);
- }
+ var t, e, a, n, i, o;
+ graphIndex >= graphPoints.length - 1 ? gameResult() : drawingInProgress || (updateStockValueText(), buyButton.updateButtonState(), t = graphPoints[graphIndex], e = (i = graphPoints[graphIndex + 1]).y - t.y, o = i.x - t.x, a = Math.atan2(e, o), n = Math.sqrt(Math.pow(i.x - t.x, 2) + Math.pow(i.y - t.y, 2)), i = (o = 0 < graphSegments.length ? graphSegments[graphSegments.length - 1] : null) ? o.x + Math.cos(o.rotation) * o.width : graphPoints[graphIndex].x, o = o ? o.y + Math.sin(o.rotation) * o.width : graphPoints[graphIndex].y, t.x = i, t.y = lowerLimit < o ? lowerLimit : o, o = t.y + Math.sin(a) * n, lowerLimit < o && (n = (lowerLimit - t.y) / Math.sin(a)), moveSegmentsVertically = o < upperLimit || o >= .5 * game.height && 100 <= stockValuesHistory[graphIndex + 1] && 0 != e ? -1 * Math.sign(e) : 0, drawingInProgress = !0, drawSegment(game, graphIndex, t.x, t.y, a, n, .5));
}
-function drawSegment(gameRef, index, x1, y1, rotation, width, delay) {
- var segment = gameRef.addChild(new GraphSegment());
- segment.index1 = index;
- segment.stockValue1 = stockValuesHistory[index];
- segment.stockValue2 = stockValuesHistory[index + 1];
- segment.x1 = x1;
- segment.y1 = y1;
- segment.rotation = rotation;
- segment.width = 1; // Start with a width of 1 and animate to the target width
- segment.height = 20;
- // Add the new segment to the global graphSegments array
- graphSegments.push(segment);
- segment.x = x1;
- segment.y = y1;
- var startTime = Date.now();
- var endTime = startTime + delay * 1000 * secondsPerSegment;
- var updateWidth = function updateWidth() {
- if (!running) {
- return;
- }
- var currentTime = Date.now();
- var timeElapsed = currentTime - startTime;
- var newWidth = Math.min(timeElapsed / (delay * 1000 * secondsPerSegment) * width, width);
- segment.width = newWidth;
- if (currentTime < endTime) {
- LK.setTimeout(updateWidth, 16);
- } else {
- if (!moveSegments && segment.x + segment.width / 2 >= game.width * 0.5) {
- moveSegments = true;
- }
- segment.isFinished = true;
- graphIndex++;
- drawingInProgress = false;
- }
- };
- updateWidth();
+function drawSegment(t, e, a, n, i, o, r) {
+ var s = t.addChild(new GraphSegment());
+ s.index1 = e, s.stockValue1 = stockValuesHistory[e], s.stockValue2 = stockValuesHistory[e + 1], s.x1 = a, s.y1 = n, s.rotation = i, s.width = 1, s.height = 20, graphSegments.push(s), s.x = a, s.y = n;
+ var l = Date.now(),
+ h = l + 1e3 * r * secondsPerSegment;
+ (function t() {
+ var e, a;
+ running && (a = (e = Date.now()) - l, a = Math.min(a / (1e3 * r * secondsPerSegment) * o, o), s.width = a, e < h ? LK.setTimeout(t, 16) : (!moveSegments && s.x + s.width / 2 >= .5 * game.width && (moveSegments = !0), s.isFinished = !0, graphIndex++, drawingInProgress = !1));
+ })();
}
function setDebugValues() {
stockValuesHistory = [];
- var series = [0, 25, 50, 75, 100, 125, 150, 175, 200, 175, 150, 125, 100, 75, 50, 25, 0, 0, 0];
- //series = [0, 25, 50, 75, 100, 125, 125, 125, 125, 100, 75, 50, 25, 0, 0, 0];
- // Links bug
- //series = [1, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 500, 450, 400, 350, 300, 250, 200, 150, 100, 50, 1, 1, 1];
- // Links bug Fast
- //series = [1, 50, 100, 150, 200, 250, 200, 150, 100, 50, 1, 1, 1];
- series = [1, 50, 1];
- // Accuracy test
- //series = [1, 100, 1, 100, 1, 100, 1, 100, 1, 1, 100, 1, 100, 1, 100, 1, 100, 1, 1, 100, 1, 100, 1, 100, 1, 100, 1, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100];
- for (var i = 0; i < 1; i++) {
- stockValuesHistory = stockValuesHistory.concat(series);
+ for (var t = [1, 50, 1], e = 0; e < 1; e++) {
+ stockValuesHistory = stockValuesHistory.concat(t);
}
}
function startGame() {
- // Initialize
- // Generate random deltas and add to previous value for stockValuesHistory
- var previousValue = stockValuesHistory[stockValuesHistory.length - 1];
- for (var i = 0; i < 5; i++) {
- var delta = Math.floor((Math.random() - 0.5) * beginingValueDelta); // Generate a delta between -beginingValueDelta/2 and beginingValueDelta/2
- var newValue = Math.max(1, previousValue + (previousValue == 1 ? Math.abs(delta) : delta));
- stockValuesHistory.push(newValue);
- previousValue = newValue;
+ for (var t = stockValuesHistory[stockValuesHistory.length - 1], e = 0; e < 5; e++) {
+ var a = Math.floor((Math.random() - .5) * beginingValueDelta),
+ n = Math.max(1, t + (1 == t ? Math.abs(a) : a));
+ stockValuesHistory.push(n), t = n;
}
- previousValue = stockValuesHistory[stockValuesHistory.length - 1];
- for (var i = 5; i < nbTotalValues; i++) {
- var delta = Math.floor((Math.random() - 0.5) * maxValueDelta); // Generate a delta between -maxValueDelta/2 and maxValueDelta/2
- var newValue = Math.max(1, previousValue + (previousValue == 1 ? Math.abs(delta) : delta));
- stockValuesHistory.push(newValue);
- previousValue = newValue;
+ t = stockValuesHistory[stockValuesHistory.length - 1];
+ for (var i, o, e = 5; e < nbTotalValues; e++) {
+ a = Math.floor((Math.random() - .5) * maxValueDelta), n = Math.max(1, t + (1 == t ? Math.abs(a) : a));
+ stockValuesHistory.push(n), t = n;
}
- buyButton.updateButtonState();
- if (debug) {
- setDebugValues(); // DEBUG MODE
- }
- var x, y;
- // Compute the coordinates for the graph based on stockValuesHistory
- for (var i = 0; i < stockValuesHistory.length; i++) {
- x = segmentWidth * i;
- y = game.height * 0.75 - stockValuesHistory[i] * dollarToYPixelRatio; // Calculate Y based on new mapping
- graphPoints.push({
- x: x,
- y: y
+ buyButton.updateButtonState(), debug && setDebugValues();
+ for (e = 0; e < stockValuesHistory.length; e++) {
+ i = segmentWidth * e, o = .75 * game.height - stockValuesHistory[e] * dollarToYPixelRatio, graphPoints.push({
+ x: i,
+ y: o
});
}
- running = true;
- LK.setTimeout(function () {
+ running = !0, LK.setTimeout(function () {
stockValueText.alpha = 1;
- }, 100);
- // Set up a tick event to call drawNextSegment every second
- segmentDrawInterval = LK.setInterval(drawNextSegment, 10);
- // Set up a timer to update the timer text every second
- var timerUpdateInterval = LK.setInterval(function () {
- var currentTime = Math.max(0, nbTotalValues - graphIndex - 1);
- timerText.setText(currentTime.toString().padStart(3, '0'));
- }, 1000);
+ }, 100), segmentDrawInterval = LK.setInterval(drawNextSegment, 10);
+ LK.setInterval(function () {
+ var t = Math.max(0, nbTotalValues - graphIndex - 1);
+ timerText.setText(t.toString().padStart(3, "0"));
+ }, 1e3);
}
-// Main game loop
-LK.on('tick', function () {
- if (!running) {
- return;
- }
- // Update slide for each graph segment and the horizontal axis
- graphSegments.forEach(function (segment) {
- segment.updateSlide();
- });
- horizontalAxis.updateSlide(); // Slide the horizontal axis vertically
- // Update the position of axis labels based on the y position of the horizontal axis
- axisLabels.forEach(function (label) {
- label.updatePosition(horizontalAxis.y);
- });
- if (debug) {
- // Update the vertical slide amount text periodically
- vsaText.setText(graphIndex + ' Mvt ' + moveSegmentsVertically);
- }
+stockValueText.anchor.set(1, 2), stockValueText.alpha = 0, LK.gui.right.addChild(stockValueText), LK.on("tick", function () {
+ running && (graphSegments.forEach(function (t) {
+ t.updateSlide();
+ }), horizontalAxis.updateSlide(), axisLabels.forEach(function (t) {
+ t.updatePosition(horizontalAxis.y);
+ }), debug && vsaText.setText(graphIndex + " Mvt " + moveSegmentsVertically));
});
var startTime = Date.now();
LK.setTimeout(function () {
startGame();
-}, 1000);
\ No newline at end of file
+}, 1e3);
\ No newline at end of file
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.