/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BetButton = Container.expand(function (color, label) { var self = Container.call(this); self.color = color; self.betAmount = 0; var button = self.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); var colorValue = 0xff0000; if (color === 'black') colorValue = 0x0000ff; if (color === 'green') colorValue = 0x00aa00; button.tint = colorValue; var betText = new Text2('$0', { size: 40, fill: 0xFFFF00 }); betText.anchor.set(0.5, 0.5); self.addChild(betText); self.setBet = function (amount) { self.betAmount = amount; betText.setText('$' + amount); }; self.selected = false; self.setSelected = function (selected) { self.selected = selected; if (selected) { button.tint = button.tint | 0x888888; } else { var colorValue = 0xff0000; if (color === 'black') colorValue = 0x0000ff; if (color === 'green') colorValue = 0x00aa00; button.tint = colorValue; } }; self.down = function (x, y, obj) { if (!isSpinning && canPlaceBets) { // Deselect all buttons redButton.setSelected(false); greenButton.setSelected(false); blackButton.setSelected(false); // Select this button self.setSelected(true); selectedBetButton = self; } }; return self; }); var RouletteWheel = Container.expand(function () { var self = Container.call(this); // Roulette numbers with colors (European layout) var rouletteNumbers = [{ num: 0, color: 'green' }, { num: 32, color: 'red' }, { num: 15, color: 'black' }, { num: 19, color: 'red' }, { num: 4, color: 'black' }, { num: 21, color: 'red' }, { num: 2, color: 'black' }, { num: 25, color: 'red' }, { num: 17, color: 'black' }, { num: 34, color: 'red' }, { num: 6, color: 'black' }, { num: 27, color: 'red' }, { num: 13, color: 'black' }, { num: 36, color: 'red' }, { num: 11, color: 'black' }, { num: 30, color: 'red' }, { num: 8, color: 'black' }, { num: 23, color: 'red' }, { num: 10, color: 'black' }, { num: 5, color: 'red' }, { num: 24, color: 'black' }, { num: 16, color: 'red' }, { num: 33, color: 'black' }, { num: 1, color: 'red' }, { num: 20, color: 'black' }, { num: 14, color: 'red' }, { num: 31, color: 'black' }, { num: 9, color: 'red' }, { num: 22, color: 'black' }, { num: 18, color: 'red' }, { num: 29, color: 'black' }, { num: 7, color: 'red' }, { num: 28, color: 'black' }, { num: 12, color: 'red' }, { num: 35, color: 'black' }, { num: 3, color: 'red' }, { num: 26, color: 'black' }]; self.numbers = rouletteNumbers; self.spinning = false; // Create horizontal line of numbered boxes self.segments = []; self.segmentTexts = []; var boxWidth = 120; var totalWidth = 37 * boxWidth; var startX = -totalWidth / 2; for (var i = 0; i < 37; i++) { var segment = self.attachAsset('wheelSegment', { anchorX: 0.5, anchorY: 0.5 }); segment.width = boxWidth; segment.height = 150; segment.x = startX + i * boxWidth + boxWidth / 2; segment.y = 0; // Set color based on number var colorValue = 0xff0000; // red if (rouletteNumbers[i].color === 'black') { colorValue = 0x0000ff; } else if (rouletteNumbers[i].color === 'green') { colorValue = 0x00aa00; // Green background for green (0) } segment.tint = colorValue; // Add number text var textColor = 0xFFFFFF; if (rouletteNumbers[i].color === 'green') { textColor = 0x00aa00; // Green text for number 0 } var numberText = new Text2(rouletteNumbers[i].num.toString(), { size: 48, fill: textColor }); numberText.anchor.set(0.5, 0.5); numberText.x = segment.x; numberText.y = segment.y; self.addChild(numberText); self.segments.push(segment); self.segmentTexts.push(numberText); } self.spin = function (targetNumber) { if (self.spinning) return; self.spinning = true; var targetIndex = -1; for (var i = 0; i < self.numbers.length; i++) { if (self.numbers[i].num === targetNumber) { targetIndex = i; break; } } // Calculate target position for the line to slide // Account for wheel position (1024) and pointer position (1024) - they should align var targetX = -(targetIndex * boxWidth); // Always spin in same direction (left) with multiple full rotations var fullRotations = totalWidth * 5; // 5 full passes var currentX = self.x; var spinDistance = currentX - fullRotations + targetX; // Always move left from current position // Fixed spin duration and speed for consistency var spinDuration = 5000; // 5 seconds for slower spin // Use stronger easing for more gradual deceleration - starts fast and slows down very gradually tween(self, { x: spinDistance }, { duration: spinDuration, easing: tween.cubicOut, onFinish: function onFinish() { self.spinning = false; if (onSpinComplete) { onSpinComplete(targetNumber); } } }); }; self.update = function () { if (self.spinning) { // Create continuous scrolling effect by wrapping segments for (var i = 0; i < self.segments.length; i++) { var segment = self.segments[i]; var text = self.segmentTexts[i]; var globalX = self.x + segment.x; // If segment goes off the right side, wrap it to the left if (globalX > 2048 + boxWidth) { segment.x -= totalWidth; text.x = segment.x; } // If segment goes off the left side, wrap it to the right else if (globalX < -boxWidth) { segment.x += totalWidth; text.x = segment.x; } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0f4d0f }); /**** * Game Code ****/ var bankroll = storage.bankroll || 1000; var highScore = storage.highScore || 0; var currentBet = 0; var isSpinning = false; var onSpinComplete = null; var spinTimer = 45; // 45 seconds countdown var canPlaceBets = true; // Add background image var backgroundImage = game.attachAsset('backgroundImage', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); // Create UI elements var bankrollText = new Text2('Bankroll: $' + bankroll, { size: 50, fill: 0xFFFFFF }); bankrollText.anchor.set(0.5, 0); LK.gui.top.addChild(bankrollText); var betText = new Text2('Total Bet: $0', { size: 40, fill: 0xFFFF00 }); betText.anchor.set(0.5, 0); betText.y = 120; LK.gui.top.addChild(betText); var messageText = new Text2('Place your bets!', { size: 60, fill: 0xFFFFFF }); messageText.anchor.set(0.5, 1); LK.gui.bottom.addChild(messageText); var timerText = new Text2('Next spin in: 45s', { size: 50, fill: 0xFFFF00 }); timerText.anchor.set(0.5, 0); timerText.y = 180; LK.gui.top.addChild(timerText); var highScoreText = new Text2('High Score: $' + highScore, { size: 40, fill: 0x00FF00 }); highScoreText.anchor.set(0.5, 0); highScoreText.y = 240; LK.gui.top.addChild(highScoreText); // Create roulette wheel var wheel = game.addChild(new RouletteWheel()); wheel.x = 1024; wheel.y = 1000; // Create pointer var pointer = game.addChild(LK.getAsset('pointer', { anchorX: 0.5, anchorY: 1.0 })); pointer.x = 1024; pointer.y = 960; pointer.width = 10; pointer.height = 80; // Create bet buttons var redButton = game.addChild(new BetButton('red', 'RED')); redButton.x = 500; redButton.y = 1750; var greenButton = game.addChild(new BetButton('green', 'GREEN')); greenButton.x = 1024; greenButton.y = 1750; var blackButton = game.addChild(new BetButton('black', 'BLUE')); blackButton.x = 1548; blackButton.y = 1750; // Create bet increment buttons var betIncrements = [5, 10, 15]; var incrementButtons = []; var selectedBetButton = null; for (var i = 0; i < betIncrements.length; i++) { var incButton = game.addChild(new Container()); var buttonBg = incButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); buttonBg.width = 150; buttonBg.height = 80; buttonBg.tint = 0x444444; var incText = new Text2('$' + betIncrements[i], { size: 30, fill: 0xFFFFFF }); incText.anchor.set(0.5, 0.5); incButton.addChild(incText); incButton.x = 600 + i * 170; incButton.y = 1600; incButton.betValue = betIncrements[i]; incButton.down = function (x, y, obj) { if (selectedBetButton && !isSpinning && canPlaceBets && bankroll >= currentBet + this.betValue) { var betAmount = Math.min(this.betValue, bankroll - currentBet); selectedBetButton.betAmount += betAmount; currentBet += betAmount; selectedBetButton.setBet(selectedBetButton.betAmount); updateUI(); } }.bind(incButton); incrementButtons.push(incButton); } // Create custom bet input container var customBetContainer = game.addChild(new Container()); var customBetBg = customBetContainer.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); customBetBg.width = 200; customBetBg.height = 80; customBetBg.tint = 0x555555; var customBetText = new Text2('CUSTOM', { size: 25, fill: 0xFFFFFF }); customBetText.anchor.set(0.5, 0.5); customBetText.y = -20; customBetContainer.addChild(customBetText); var customBetAmount = 0; var customBetValueText = new Text2('$0', { size: 30, fill: 0xFFFF00 }); customBetValueText.anchor.set(0.5, 0.5); customBetValueText.y = 15; customBetContainer.addChild(customBetValueText); customBetContainer.x = 1350; customBetContainer.y = 1600; // Create number pad for custom bet input var numberPad = game.addChild(new Container()); numberPad.visible = false; numberPad.x = 1024; numberPad.y = 1366; // Create background for number pad var padBg = numberPad.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); padBg.width = 400; padBg.height = 450; padBg.tint = 0x333333; // Create number buttons var numberButtons = []; for (var i = 0; i <= 9; i++) { var numButton = numberPad.addChild(new Container()); var numBg = numButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); numBg.width = 100; numBg.height = 80; numBg.tint = 0x666666; var numText = new Text2(i.toString(), { size: 40, fill: 0xFFFFFF }); numText.anchor.set(0.5, 0.5); numButton.addChild(numText); // Position numbers in grid var row = Math.floor((9 - i) / 3); var col = (9 - i) % 3; if (i === 0) { row = 3; col = 1; } numButton.x = -100 + col * 100; numButton.y = -150 + row * 90; numButton.number = i; numButton.down = function (x, y, obj) { if (!isSpinning) { customBetAmount = customBetAmount * 10 + this.number; if (customBetAmount > bankroll) { customBetAmount = bankroll; } customBetValueText.setText('$' + customBetAmount); } }.bind(numButton); numberButtons.push(numButton); } // Create clear button var clearButton = numberPad.addChild(new Container()); var clearBg = clearButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); clearBg.width = 100; clearBg.height = 80; clearBg.tint = 0x882222; var clearText = new Text2('CLR', { size: 30, fill: 0xFFFFFF }); clearText.anchor.set(0.5, 0.5); clearButton.addChild(clearText); clearButton.x = -100; clearButton.y = 120; clearButton.down = function (x, y, obj) { if (!isSpinning) { customBetAmount = 0; customBetValueText.setText('$0'); } }; // Create OK button var okButton = numberPad.addChild(new Container()); var okBg = okButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); okBg.width = 100; okBg.height = 80; okBg.tint = 0x228822; var okText = new Text2('OK', { size: 30, fill: 0xFFFFFF }); okText.anchor.set(0.5, 0.5); okButton.addChild(okText); okButton.x = 100; okButton.y = 120; okButton.down = function (x, y, obj) { if (!isSpinning && canPlaceBets && customBetAmount > 0) { // If no bet button is selected, show a message if (!selectedBetButton) { messageText.setText('Select a color first!'); return; } var availableBet = Math.min(customBetAmount, bankroll - currentBet); if (availableBet > 0) { selectedBetButton.betAmount += availableBet; currentBet += availableBet; selectedBetButton.setBet(selectedBetButton.betAmount); updateUI(); } numberPad.visible = false; customBetAmount = 0; customBetValueText.setText('$0'); } }; customBetContainer.down = function (x, y, obj) { if (!isSpinning && canPlaceBets) { numberPad.visible = !numberPad.visible; if (numberPad.visible && !selectedBetButton) { messageText.setText('Select a color first!'); } if (!numberPad.visible) { customBetAmount = 0; customBetValueText.setText('$0'); } } }; // Create all-in button var allInButton = game.addChild(new Container()); var allInBg = allInButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); allInBg.width = 150; allInBg.height = 80; allInBg.tint = 0x666666; var allInText = new Text2('ALL IN', { size: 30, fill: 0xFFFF00 }); allInText.anchor.set(0.5, 0.5); allInButton.addChild(allInText); allInButton.x = 1120; allInButton.y = 1600; allInButton.down = function (x, y, obj) { if (selectedBetButton && !isSpinning && canPlaceBets && bankroll > currentBet) { var betAmount = bankroll - currentBet; selectedBetButton.betAmount += betAmount; currentBet += betAmount; selectedBetButton.setBet(selectedBetButton.betAmount); updateUI(); } }; // Create clear bets button var clearBetsButton = game.addChild(new Container()); var clearBetsBg = clearBetsButton.attachAsset('betButton', { anchorX: 0.5, anchorY: 0.5 }); clearBetsBg.width = 150; clearBetsBg.height = 80; clearBetsBg.tint = 0x882222; var clearBetsText = new Text2('CLEAR', { size: 30, fill: 0xFFFFFF }); clearBetsText.anchor.set(0.5, 0.5); clearBetsButton.addChild(clearBetsText); clearBetsButton.x = 1600; clearBetsButton.y = 1600; clearBetsButton.down = function (x, y, obj) { if (!isSpinning && canPlaceBets && currentBet > 0) { // Clear all bets redButton.betAmount = 0; blackButton.betAmount = 0; greenButton.betAmount = 0; redButton.setBet(0); blackButton.setBet(0); greenButton.setBet(0); currentBet = 0; updateUI(); messageText.setText('Bets cleared!'); } }; // Spin button removed - automatic spinning every 45 seconds function updateUI() { bankrollText.setText('Bankroll: $' + bankroll); betText.setText('Total Bet: $' + currentBet); storage.bankroll = bankroll; // Update highscore if current bankroll is higher if (bankroll > highScore) { highScore = bankroll; storage.highScore = highScore; highScoreText.setText('High Score: $' + highScore); LK.effects.flashObject(highScoreText, 0x00FF00, 1000); } } function startSpin() { if (isSpinning) return; isSpinning = true; bankroll -= currentBet; updateUI(); messageText.setText('Spinning...'); LK.getSound('spin').play(); // Generate random winning number index var winningIndex = Math.floor(Math.random() * 37); var winningNumber = wheel.numbers[winningIndex].num; onSpinComplete = function onSpinComplete(num) { // Calculate which segment is actually under the pointer after spin var pointerX = pointer.x; // 1024 var wheelX = wheel.x; // Current wheel position after spin var actualWinningIndex = -1; var minDistance = Infinity; // Find the segment closest to the pointer position for (var i = 0; i < wheel.segments.length; i++) { var segment = wheel.segments[i]; var segmentGlobalX = wheelX + segment.x; var distance = Math.abs(segmentGlobalX - pointerX); if (distance < minDistance) { minDistance = distance; actualWinningIndex = i; } } // Use the actual winning number under the pointer var actualWinningNumber = wheel.numbers[actualWinningIndex].num; // Keep all segments in their original colors for (var i = 0; i < wheel.segments.length; i++) { var segment = wheel.segments[i]; var originalColor = 0xff0000; // red if (wheel.numbers[i].color === 'black') { originalColor = 0x0000ff; } else if (wheel.numbers[i].color === 'green') { originalColor = 0x00aa00; // Green background for green (0) } segment.tint = originalColor; // restore original color } checkWin(actualWinningNumber); }; wheel.spin(winningNumber); } function checkWin(winningNumber) { var winningColor = ''; for (var i = 0; i < wheel.numbers.length; i++) { if (wheel.numbers[i].num === winningNumber) { winningColor = wheel.numbers[i].color; break; } } var totalWin = 0; var displayColor = winningColor === 'black' ? 'blue' : winningColor; var winMessage = 'Number ' + winningNumber + ' (' + displayColor.toUpperCase() + ')'; // Check red bet if (redButton.betAmount > 0 && winningColor === 'red') { totalWin += redButton.betAmount * 2; } // Check black bet if (blackButton.betAmount > 0 && winningColor === 'black') { totalWin += blackButton.betAmount * 2; } // Check green bet if (greenButton.betAmount > 0 && winningColor === 'green') { totalWin += greenButton.betAmount * 36; } if (totalWin > 0) { bankroll += totalWin; messageText.setText(winMessage + ' - You won $' + totalWin + '!'); LK.getSound('win').play(); LK.effects.flashScreen(0x00ff00, 1000); } else { messageText.setText(winMessage + ' - You lost $' + currentBet); LK.getSound('lose').play(); LK.effects.flashScreen(0xff0000, 500); } // Reset bets currentBet = 0; redButton.setBet(0); blackButton.setBet(0); greenButton.setBet(0); isSpinning = false; // Reset timer for next round spinTimer = 45; canPlaceBets = true; updateUI(); // Check game over if (bankroll <= 0) { LK.setTimeout(function () { LK.showGameOver(); }, 2000); } } // Add game down handler to close number pad when clicking outside game.down = function (x, y, obj) { // Check if click is outside the number pad if (numberPad.visible) { var padBounds = { left: numberPad.x - 200, right: numberPad.x + 200, top: numberPad.y - 225, bottom: numberPad.y + 225 }; if (x < padBounds.left || x > padBounds.right || y < padBounds.top || y > padBounds.bottom) { numberPad.visible = false; customBetAmount = 0; customBetValueText.setText('$0'); } } }; game.update = function () { // Handle timer countdown if (!isSpinning && LK.ticks % 60 === 0) { // Update every second (60 ticks = 1 second) spinTimer--; if (spinTimer <= 0) { canPlaceBets = false; if (currentBet > 0) { // Auto spin when timer reaches 0 and there are bets startSpin(); } else { // Reset timer if no bets placed spinTimer = 45; canPlaceBets = true; } } } // Update timer display if (spinTimer > 0) { if (canPlaceBets) { timerText.setText('Next spin in: ' + spinTimer + 's'); } else { timerText.setText('Spinning...'); } } else { timerText.setText('Spinning...'); } // Check for big win if (bankroll >= 10000) { LK.setTimeout(function () { LK.showYouWin(); }, 1000); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BetButton = Container.expand(function (color, label) {
var self = Container.call(this);
self.color = color;
self.betAmount = 0;
var button = self.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
var colorValue = 0xff0000;
if (color === 'black') colorValue = 0x0000ff;
if (color === 'green') colorValue = 0x00aa00;
button.tint = colorValue;
var betText = new Text2('$0', {
size: 40,
fill: 0xFFFF00
});
betText.anchor.set(0.5, 0.5);
self.addChild(betText);
self.setBet = function (amount) {
self.betAmount = amount;
betText.setText('$' + amount);
};
self.selected = false;
self.setSelected = function (selected) {
self.selected = selected;
if (selected) {
button.tint = button.tint | 0x888888;
} else {
var colorValue = 0xff0000;
if (color === 'black') colorValue = 0x0000ff;
if (color === 'green') colorValue = 0x00aa00;
button.tint = colorValue;
}
};
self.down = function (x, y, obj) {
if (!isSpinning && canPlaceBets) {
// Deselect all buttons
redButton.setSelected(false);
greenButton.setSelected(false);
blackButton.setSelected(false);
// Select this button
self.setSelected(true);
selectedBetButton = self;
}
};
return self;
});
var RouletteWheel = Container.expand(function () {
var self = Container.call(this);
// Roulette numbers with colors (European layout)
var rouletteNumbers = [{
num: 0,
color: 'green'
}, {
num: 32,
color: 'red'
}, {
num: 15,
color: 'black'
}, {
num: 19,
color: 'red'
}, {
num: 4,
color: 'black'
}, {
num: 21,
color: 'red'
}, {
num: 2,
color: 'black'
}, {
num: 25,
color: 'red'
}, {
num: 17,
color: 'black'
}, {
num: 34,
color: 'red'
}, {
num: 6,
color: 'black'
}, {
num: 27,
color: 'red'
}, {
num: 13,
color: 'black'
}, {
num: 36,
color: 'red'
}, {
num: 11,
color: 'black'
}, {
num: 30,
color: 'red'
}, {
num: 8,
color: 'black'
}, {
num: 23,
color: 'red'
}, {
num: 10,
color: 'black'
}, {
num: 5,
color: 'red'
}, {
num: 24,
color: 'black'
}, {
num: 16,
color: 'red'
}, {
num: 33,
color: 'black'
}, {
num: 1,
color: 'red'
}, {
num: 20,
color: 'black'
}, {
num: 14,
color: 'red'
}, {
num: 31,
color: 'black'
}, {
num: 9,
color: 'red'
}, {
num: 22,
color: 'black'
}, {
num: 18,
color: 'red'
}, {
num: 29,
color: 'black'
}, {
num: 7,
color: 'red'
}, {
num: 28,
color: 'black'
}, {
num: 12,
color: 'red'
}, {
num: 35,
color: 'black'
}, {
num: 3,
color: 'red'
}, {
num: 26,
color: 'black'
}];
self.numbers = rouletteNumbers;
self.spinning = false;
// Create horizontal line of numbered boxes
self.segments = [];
self.segmentTexts = [];
var boxWidth = 120;
var totalWidth = 37 * boxWidth;
var startX = -totalWidth / 2;
for (var i = 0; i < 37; i++) {
var segment = self.attachAsset('wheelSegment', {
anchorX: 0.5,
anchorY: 0.5
});
segment.width = boxWidth;
segment.height = 150;
segment.x = startX + i * boxWidth + boxWidth / 2;
segment.y = 0;
// Set color based on number
var colorValue = 0xff0000; // red
if (rouletteNumbers[i].color === 'black') {
colorValue = 0x0000ff;
} else if (rouletteNumbers[i].color === 'green') {
colorValue = 0x00aa00; // Green background for green (0)
}
segment.tint = colorValue;
// Add number text
var textColor = 0xFFFFFF;
if (rouletteNumbers[i].color === 'green') {
textColor = 0x00aa00; // Green text for number 0
}
var numberText = new Text2(rouletteNumbers[i].num.toString(), {
size: 48,
fill: textColor
});
numberText.anchor.set(0.5, 0.5);
numberText.x = segment.x;
numberText.y = segment.y;
self.addChild(numberText);
self.segments.push(segment);
self.segmentTexts.push(numberText);
}
self.spin = function (targetNumber) {
if (self.spinning) return;
self.spinning = true;
var targetIndex = -1;
for (var i = 0; i < self.numbers.length; i++) {
if (self.numbers[i].num === targetNumber) {
targetIndex = i;
break;
}
}
// Calculate target position for the line to slide
// Account for wheel position (1024) and pointer position (1024) - they should align
var targetX = -(targetIndex * boxWidth);
// Always spin in same direction (left) with multiple full rotations
var fullRotations = totalWidth * 5; // 5 full passes
var currentX = self.x;
var spinDistance = currentX - fullRotations + targetX; // Always move left from current position
// Fixed spin duration and speed for consistency
var spinDuration = 5000; // 5 seconds for slower spin
// Use stronger easing for more gradual deceleration - starts fast and slows down very gradually
tween(self, {
x: spinDistance
}, {
duration: spinDuration,
easing: tween.cubicOut,
onFinish: function onFinish() {
self.spinning = false;
if (onSpinComplete) {
onSpinComplete(targetNumber);
}
}
});
};
self.update = function () {
if (self.spinning) {
// Create continuous scrolling effect by wrapping segments
for (var i = 0; i < self.segments.length; i++) {
var segment = self.segments[i];
var text = self.segmentTexts[i];
var globalX = self.x + segment.x;
// If segment goes off the right side, wrap it to the left
if (globalX > 2048 + boxWidth) {
segment.x -= totalWidth;
text.x = segment.x;
}
// If segment goes off the left side, wrap it to the right
else if (globalX < -boxWidth) {
segment.x += totalWidth;
text.x = segment.x;
}
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0f4d0f
});
/****
* Game Code
****/
var bankroll = storage.bankroll || 1000;
var highScore = storage.highScore || 0;
var currentBet = 0;
var isSpinning = false;
var onSpinComplete = null;
var spinTimer = 45; // 45 seconds countdown
var canPlaceBets = true;
// Add background image
var backgroundImage = game.attachAsset('backgroundImage', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
// Create UI elements
var bankrollText = new Text2('Bankroll: $' + bankroll, {
size: 50,
fill: 0xFFFFFF
});
bankrollText.anchor.set(0.5, 0);
LK.gui.top.addChild(bankrollText);
var betText = new Text2('Total Bet: $0', {
size: 40,
fill: 0xFFFF00
});
betText.anchor.set(0.5, 0);
betText.y = 120;
LK.gui.top.addChild(betText);
var messageText = new Text2('Place your bets!', {
size: 60,
fill: 0xFFFFFF
});
messageText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(messageText);
var timerText = new Text2('Next spin in: 45s', {
size: 50,
fill: 0xFFFF00
});
timerText.anchor.set(0.5, 0);
timerText.y = 180;
LK.gui.top.addChild(timerText);
var highScoreText = new Text2('High Score: $' + highScore, {
size: 40,
fill: 0x00FF00
});
highScoreText.anchor.set(0.5, 0);
highScoreText.y = 240;
LK.gui.top.addChild(highScoreText);
// Create roulette wheel
var wheel = game.addChild(new RouletteWheel());
wheel.x = 1024;
wheel.y = 1000;
// Create pointer
var pointer = game.addChild(LK.getAsset('pointer', {
anchorX: 0.5,
anchorY: 1.0
}));
pointer.x = 1024;
pointer.y = 960;
pointer.width = 10;
pointer.height = 80;
// Create bet buttons
var redButton = game.addChild(new BetButton('red', 'RED'));
redButton.x = 500;
redButton.y = 1750;
var greenButton = game.addChild(new BetButton('green', 'GREEN'));
greenButton.x = 1024;
greenButton.y = 1750;
var blackButton = game.addChild(new BetButton('black', 'BLUE'));
blackButton.x = 1548;
blackButton.y = 1750;
// Create bet increment buttons
var betIncrements = [5, 10, 15];
var incrementButtons = [];
var selectedBetButton = null;
for (var i = 0; i < betIncrements.length; i++) {
var incButton = game.addChild(new Container());
var buttonBg = incButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.width = 150;
buttonBg.height = 80;
buttonBg.tint = 0x444444;
var incText = new Text2('$' + betIncrements[i], {
size: 30,
fill: 0xFFFFFF
});
incText.anchor.set(0.5, 0.5);
incButton.addChild(incText);
incButton.x = 600 + i * 170;
incButton.y = 1600;
incButton.betValue = betIncrements[i];
incButton.down = function (x, y, obj) {
if (selectedBetButton && !isSpinning && canPlaceBets && bankroll >= currentBet + this.betValue) {
var betAmount = Math.min(this.betValue, bankroll - currentBet);
selectedBetButton.betAmount += betAmount;
currentBet += betAmount;
selectedBetButton.setBet(selectedBetButton.betAmount);
updateUI();
}
}.bind(incButton);
incrementButtons.push(incButton);
}
// Create custom bet input container
var customBetContainer = game.addChild(new Container());
var customBetBg = customBetContainer.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
customBetBg.width = 200;
customBetBg.height = 80;
customBetBg.tint = 0x555555;
var customBetText = new Text2('CUSTOM', {
size: 25,
fill: 0xFFFFFF
});
customBetText.anchor.set(0.5, 0.5);
customBetText.y = -20;
customBetContainer.addChild(customBetText);
var customBetAmount = 0;
var customBetValueText = new Text2('$0', {
size: 30,
fill: 0xFFFF00
});
customBetValueText.anchor.set(0.5, 0.5);
customBetValueText.y = 15;
customBetContainer.addChild(customBetValueText);
customBetContainer.x = 1350;
customBetContainer.y = 1600;
// Create number pad for custom bet input
var numberPad = game.addChild(new Container());
numberPad.visible = false;
numberPad.x = 1024;
numberPad.y = 1366;
// Create background for number pad
var padBg = numberPad.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
padBg.width = 400;
padBg.height = 450;
padBg.tint = 0x333333;
// Create number buttons
var numberButtons = [];
for (var i = 0; i <= 9; i++) {
var numButton = numberPad.addChild(new Container());
var numBg = numButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
numBg.width = 100;
numBg.height = 80;
numBg.tint = 0x666666;
var numText = new Text2(i.toString(), {
size: 40,
fill: 0xFFFFFF
});
numText.anchor.set(0.5, 0.5);
numButton.addChild(numText);
// Position numbers in grid
var row = Math.floor((9 - i) / 3);
var col = (9 - i) % 3;
if (i === 0) {
row = 3;
col = 1;
}
numButton.x = -100 + col * 100;
numButton.y = -150 + row * 90;
numButton.number = i;
numButton.down = function (x, y, obj) {
if (!isSpinning) {
customBetAmount = customBetAmount * 10 + this.number;
if (customBetAmount > bankroll) {
customBetAmount = bankroll;
}
customBetValueText.setText('$' + customBetAmount);
}
}.bind(numButton);
numberButtons.push(numButton);
}
// Create clear button
var clearButton = numberPad.addChild(new Container());
var clearBg = clearButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
clearBg.width = 100;
clearBg.height = 80;
clearBg.tint = 0x882222;
var clearText = new Text2('CLR', {
size: 30,
fill: 0xFFFFFF
});
clearText.anchor.set(0.5, 0.5);
clearButton.addChild(clearText);
clearButton.x = -100;
clearButton.y = 120;
clearButton.down = function (x, y, obj) {
if (!isSpinning) {
customBetAmount = 0;
customBetValueText.setText('$0');
}
};
// Create OK button
var okButton = numberPad.addChild(new Container());
var okBg = okButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
okBg.width = 100;
okBg.height = 80;
okBg.tint = 0x228822;
var okText = new Text2('OK', {
size: 30,
fill: 0xFFFFFF
});
okText.anchor.set(0.5, 0.5);
okButton.addChild(okText);
okButton.x = 100;
okButton.y = 120;
okButton.down = function (x, y, obj) {
if (!isSpinning && canPlaceBets && customBetAmount > 0) {
// If no bet button is selected, show a message
if (!selectedBetButton) {
messageText.setText('Select a color first!');
return;
}
var availableBet = Math.min(customBetAmount, bankroll - currentBet);
if (availableBet > 0) {
selectedBetButton.betAmount += availableBet;
currentBet += availableBet;
selectedBetButton.setBet(selectedBetButton.betAmount);
updateUI();
}
numberPad.visible = false;
customBetAmount = 0;
customBetValueText.setText('$0');
}
};
customBetContainer.down = function (x, y, obj) {
if (!isSpinning && canPlaceBets) {
numberPad.visible = !numberPad.visible;
if (numberPad.visible && !selectedBetButton) {
messageText.setText('Select a color first!');
}
if (!numberPad.visible) {
customBetAmount = 0;
customBetValueText.setText('$0');
}
}
};
// Create all-in button
var allInButton = game.addChild(new Container());
var allInBg = allInButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
allInBg.width = 150;
allInBg.height = 80;
allInBg.tint = 0x666666;
var allInText = new Text2('ALL IN', {
size: 30,
fill: 0xFFFF00
});
allInText.anchor.set(0.5, 0.5);
allInButton.addChild(allInText);
allInButton.x = 1120;
allInButton.y = 1600;
allInButton.down = function (x, y, obj) {
if (selectedBetButton && !isSpinning && canPlaceBets && bankroll > currentBet) {
var betAmount = bankroll - currentBet;
selectedBetButton.betAmount += betAmount;
currentBet += betAmount;
selectedBetButton.setBet(selectedBetButton.betAmount);
updateUI();
}
};
// Create clear bets button
var clearBetsButton = game.addChild(new Container());
var clearBetsBg = clearBetsButton.attachAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
clearBetsBg.width = 150;
clearBetsBg.height = 80;
clearBetsBg.tint = 0x882222;
var clearBetsText = new Text2('CLEAR', {
size: 30,
fill: 0xFFFFFF
});
clearBetsText.anchor.set(0.5, 0.5);
clearBetsButton.addChild(clearBetsText);
clearBetsButton.x = 1600;
clearBetsButton.y = 1600;
clearBetsButton.down = function (x, y, obj) {
if (!isSpinning && canPlaceBets && currentBet > 0) {
// Clear all bets
redButton.betAmount = 0;
blackButton.betAmount = 0;
greenButton.betAmount = 0;
redButton.setBet(0);
blackButton.setBet(0);
greenButton.setBet(0);
currentBet = 0;
updateUI();
messageText.setText('Bets cleared!');
}
};
// Spin button removed - automatic spinning every 45 seconds
function updateUI() {
bankrollText.setText('Bankroll: $' + bankroll);
betText.setText('Total Bet: $' + currentBet);
storage.bankroll = bankroll;
// Update highscore if current bankroll is higher
if (bankroll > highScore) {
highScore = bankroll;
storage.highScore = highScore;
highScoreText.setText('High Score: $' + highScore);
LK.effects.flashObject(highScoreText, 0x00FF00, 1000);
}
}
function startSpin() {
if (isSpinning) return;
isSpinning = true;
bankroll -= currentBet;
updateUI();
messageText.setText('Spinning...');
LK.getSound('spin').play();
// Generate random winning number index
var winningIndex = Math.floor(Math.random() * 37);
var winningNumber = wheel.numbers[winningIndex].num;
onSpinComplete = function onSpinComplete(num) {
// Calculate which segment is actually under the pointer after spin
var pointerX = pointer.x; // 1024
var wheelX = wheel.x; // Current wheel position after spin
var actualWinningIndex = -1;
var minDistance = Infinity;
// Find the segment closest to the pointer position
for (var i = 0; i < wheel.segments.length; i++) {
var segment = wheel.segments[i];
var segmentGlobalX = wheelX + segment.x;
var distance = Math.abs(segmentGlobalX - pointerX);
if (distance < minDistance) {
minDistance = distance;
actualWinningIndex = i;
}
}
// Use the actual winning number under the pointer
var actualWinningNumber = wheel.numbers[actualWinningIndex].num;
// Keep all segments in their original colors
for (var i = 0; i < wheel.segments.length; i++) {
var segment = wheel.segments[i];
var originalColor = 0xff0000; // red
if (wheel.numbers[i].color === 'black') {
originalColor = 0x0000ff;
} else if (wheel.numbers[i].color === 'green') {
originalColor = 0x00aa00; // Green background for green (0)
}
segment.tint = originalColor; // restore original color
}
checkWin(actualWinningNumber);
};
wheel.spin(winningNumber);
}
function checkWin(winningNumber) {
var winningColor = '';
for (var i = 0; i < wheel.numbers.length; i++) {
if (wheel.numbers[i].num === winningNumber) {
winningColor = wheel.numbers[i].color;
break;
}
}
var totalWin = 0;
var displayColor = winningColor === 'black' ? 'blue' : winningColor;
var winMessage = 'Number ' + winningNumber + ' (' + displayColor.toUpperCase() + ')';
// Check red bet
if (redButton.betAmount > 0 && winningColor === 'red') {
totalWin += redButton.betAmount * 2;
}
// Check black bet
if (blackButton.betAmount > 0 && winningColor === 'black') {
totalWin += blackButton.betAmount * 2;
}
// Check green bet
if (greenButton.betAmount > 0 && winningColor === 'green') {
totalWin += greenButton.betAmount * 36;
}
if (totalWin > 0) {
bankroll += totalWin;
messageText.setText(winMessage + ' - You won $' + totalWin + '!');
LK.getSound('win').play();
LK.effects.flashScreen(0x00ff00, 1000);
} else {
messageText.setText(winMessage + ' - You lost $' + currentBet);
LK.getSound('lose').play();
LK.effects.flashScreen(0xff0000, 500);
}
// Reset bets
currentBet = 0;
redButton.setBet(0);
blackButton.setBet(0);
greenButton.setBet(0);
isSpinning = false;
// Reset timer for next round
spinTimer = 45;
canPlaceBets = true;
updateUI();
// Check game over
if (bankroll <= 0) {
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
}
// Add game down handler to close number pad when clicking outside
game.down = function (x, y, obj) {
// Check if click is outside the number pad
if (numberPad.visible) {
var padBounds = {
left: numberPad.x - 200,
right: numberPad.x + 200,
top: numberPad.y - 225,
bottom: numberPad.y + 225
};
if (x < padBounds.left || x > padBounds.right || y < padBounds.top || y > padBounds.bottom) {
numberPad.visible = false;
customBetAmount = 0;
customBetValueText.setText('$0');
}
}
};
game.update = function () {
// Handle timer countdown
if (!isSpinning && LK.ticks % 60 === 0) {
// Update every second (60 ticks = 1 second)
spinTimer--;
if (spinTimer <= 0) {
canPlaceBets = false;
if (currentBet > 0) {
// Auto spin when timer reaches 0 and there are bets
startSpin();
} else {
// Reset timer if no bets placed
spinTimer = 45;
canPlaceBets = true;
}
}
}
// Update timer display
if (spinTimer > 0) {
if (canPlaceBets) {
timerText.setText('Next spin in: ' + spinTimer + 's');
} else {
timerText.setText('Spinning...');
}
} else {
timerText.setText('Spinning...');
}
// Check for big win
if (bankroll >= 10000) {
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
};