User prompt
yazılar ve kutular daha büyük olmalı ayrıca hep aynı tarafa dönmeli ve dönme işlemi biraz sürmeli ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
yazılar kayınca boşlukta duruyormuş gibi oluyor bir yerden giderken öbür taraftan gelmeli ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
spin olan wheel şeklinde değil line olarak olmalı her kutucuğun içinde numara yazmalı
Code edit (1 edits merged)
Please save this source code
User prompt
Lucky Spin Roulette
Initial prompt
Create an arcade-style roulette game with numbers from 0 to 36, where each number is either red or black except for 0 which is green; players can bet any amount of their points on red, black, or green before each round, a pointer slides and stops on a number, red and black bets pay x2 while green (0) pays x36; include simple animations, modern UI, and smooth transitions.
/**** * 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);
}
};