/****
* 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);
}
};