User prompt
haz el texto horizontal de +1000 credits 1,15 veces mas pequeño, tambien el texto de +10 free spins (solo los textos horizontales)
User prompt
quiero que hagas visible otra vez el texto horizontal
User prompt
quiero que hagas la opcion 1
User prompt
Tambien el texto que dice "+10,00 credits JACKPOT" quiero que lo cambies solo por "JACKPOT" y hagas ese texto 1,15 veces mas grande
User prompt
quiero que el texto "+250 blackjack chips" lo conviertas en solo +250 chips y hagas ese texto 1,2 veces mas grande
User prompt
podrias hacer el texto de la rueda de +3 free spins 1,03 veces mas grande , tambien quiero que hagas el texto de +10 free Spins 1,05 veces mas pequeño
User prompt
podrias hacer el texto de la rueda de +3 free spins 1,03 veces mas grande , tambien quiero que hagas el texto de +10 free Spins 1,05 veces mas pequeño
User prompt
Quiero que establezcas su alpha directamente en 0
User prompt
quiero que la ruede gire solo en sentido horario ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Quiero que la rueda solo gire en sentido horario ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
quiero que bajes el asset "RuedaVerificador" 200 pixeles
User prompt
Okay si ves que en cada segmento de rueda esta escrito un texto no? No quiero que hagas calculos, solo quiero que hagas girar la rueda y que hagas que el texto de premio que se gano que se encuentre en la rueda haga colision con el asset "RuedaVerificador" ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Si ves el asset "RuedaVerificador"? quiero que el premio que este tocando este asset sea el que se le de al jugador ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
ahora quiero que bajes el asset "RuedaVerificador" 10 pixeles abajo
User prompt
Acabo de crear un asset llamado "RuedaVerificador" quiero que lo pongas en el mismo lugar que el asset de "Flecha"
User prompt
Okay podemos ver que en cada uno de los apartados hay un texto no? quiero que apenas se empiece a girar la rueda se calcule cual es su premio posteriormente hagamos girar la rueda hasta que la flecha señale el texto que indica justamente ese premio ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Para solucionar el problema de alineación entre la flecha y el premio mostrado visualmente, sugiero lo siguiente: ## 1. **Mapear la posición exacta de cada segmento** Necesitamos crear un mapeo claro de dónde está posicionado cada uno de los 8 textos de premios en la rueda. Como cada segmento ocupa 45 grados (360°/8), debemos identificar exactamente en qué ángulo está cada premio. ## 2. **Determinar la posición de referencia de la flecha** La flecha está en la parte superior apuntando hacia abajo. Necesitamos establecer claramente que cuando un segmento esté en la posición "12 en punto" (0 grados desde la perspectiva de la flecha), ese es el premio que se debe otorgar. ## 3. **Crear una función de cálculo inverso** En lugar de calcular hacia dónde girar basándose en el ángulo del premio, debemos: - Primero seleccionar el premio basado en probabilidades - Luego determinar cuántos segmentos necesitamos rotar para que ESE premio específico termine en la posición de la flecha - Calcular la rotación exacta: (número de segmentos × 45°) + las 10+ vueltas mínimas ## 4. **Verificar la dirección de rotación** Asegurarnos de que la dirección de rotación (horaria o antihoraria) sea consistente entre cómo se crean los segmentos y cómo se calcula la rotación final. ## 5. **Implementar una función de debugging visual** Temporalmente, podríamos mostrar qué segmento debería estar bajo la flecha al final de la rotación para verificar que el cálculo sea correcto antes de implementar la versión final. La clave está en hacer que el cálculo de rotación sea **determinístico y preciso**, donde conocemos exactamente qué segmento terminará bajo la flecha, en lugar de intentar alinear un ángulo calculado matemáticamente que puede tener errores de redondeo o referencia. como dijiste, haz todo esto ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Me parece perfecto, hazlo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Si haz eso ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
"Crea un asset visual para una versión de diagnóstico de la rueda de premios de 'La Tentación Dorada', diseñada para ayudar a alinear visualmente los premios con la lógica del juego. Objetivo: Una rueda claramente segmentada y numerada visualmente para facilitar la depuración de la lógica de los premios. Diseño: Forma: Un círculo perfecto, claramente dividido en 8 secciones iguales (asumiendo que tienes 8 premios). Numeración Visual: Cada sección debe contener un número grande y claramente legible, del 1 al 8, centrado en cada sección. Utiliza una fuente audaz y contrastante (por ejemplo, negro sobre fondo claro, o blanco sobre fondo oscuro). Colores de las Secciones: Alterna colores de alto contraste para cada sección para que sean visualmente distintas. Utiliza colores sólidos y brillantes pero que sigan la paleta general de 'La Tentación Dorada' (ej., rojo brillante, azul eléctrico, verde lima, amarillo intenso, naranja, morado, rosa fuerte, cian). La idea es que cada sección sea fácilmente diferenciable. Marcas de Límite: Asegúrate de que las líneas que separan las secciones sean gruesas y de un color que contraste fuertemente (por ejemplo, negro o blanco) para definir claramente los límites de cada premio. Punto de Inicio Visual: Incluye una marca visual clara y prominente en el borde exterior de la rueda que indique el punto de "inicio" o la posición de referencia para tus cálculos de premios en el código (podría ser una pequeña flecha estática, un triángulo o una marca de color diferente). Centro de la Rueda: El centro puede ser un círculo simple en un color de contraste, sin elementos decorativos que distraigan. Estilo: Funcional y claro para el diagnóstico. No necesita ser lujoso en esta versión. La prioridad es la claridad visual. Fondo: El asset debe ser independiente con un fondo transparente. Uso: Al implementar esta rueda en tu juego, asegúrate de que la posición de la flecha al detenerse coincida visualmente con una de las secciones numeradas. Luego, verifica en tu código si el premio asignado corresponde al número de la sección que la flecha está señalando. Esto te ayudará a identificar si hay un desplazamiento o un error en la forma en que se están mapeando las secciones visuales a los premios en tu lógica." Instrucciones para usar este asset de diagnóstico: Reemplaza temporalmente tu rueda actual con este asset visual en tu juego. Ejecuta la función de giro de la rueda. Observa cuidadosamente en qué sección numerada se detiene el marcador. Verifica en tu código cuál premio se le está otorgando al jugador en ese giro. Compara el número de la sección visual con el índice del premio que tu código está entregando (asegúrate de que la numeración y el índice en tu código coincidan).
User prompt
Quiero que cuando el usuario haga girar la rueda minimamente la haga girar 10 veces, ademas lo mostrado con lo ganado sigue sin concordar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
quiero que los giros de la rueda coincidan para dar visualmente el resultado que calculo dar anteriormente (no importa si eso hace que gire mas veces de lo normal) ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
La flecha no marca lo mismo que dice el premio
User prompt
La flecha no marca lo mismo que dice el premio
User prompt
No solucionaste aun el problema, marca una cosa pero dice otra
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var AchievementSystem = Container.expand(function () { var self = Container.call(this); // Achievement definitions self.achievements = { firstBlackjackWin: { unlocked: false, title: "First Victory", description: "Win your first hand of Blackjack", reward: 100 }, cascade5x: { unlocked: false, title: "Cascade Master", description: "Get a 5x cascade in slots", reward: 250 }, reach10k: { unlocked: false, title: "High Roller", description: "Reach $10,000", reward: 500 }, bigSpender: { unlocked: false, title: "Big Spender", description: "Bet $500 in one hand", reward: 200 }, luckyStreak: { unlocked: false, title: "Lucky Streak", description: "Win 3 hands in a row", reward: 300 } }; // Load achievements from storage var savedAchievements = storage.achievements || {}; for (var key in savedAchievements) { if (self.achievements[key]) { self.achievements[key].unlocked = savedAchievements[key]; } } self.checkAchievement = function (type, value) { var achievement = self.achievements[type]; if (!achievement || achievement.unlocked) return; var shouldUnlock = false; switch (type) { case 'firstBlackjackWin': shouldUnlock = value === true; break; case 'cascade5x': shouldUnlock = value >= 5; break; case 'reach10k': shouldUnlock = value >= 10000; break; case 'bigSpender': shouldUnlock = value >= 500; break; case 'luckyStreak': shouldUnlock = value >= 3; break; } if (shouldUnlock) { self.unlockAchievement(type); } }; self.unlockAchievement = function (type) { var achievement = self.achievements[type]; if (achievement.unlocked) return; achievement.unlocked = true; // Save to storage - only save the unlocked status as literals var achievementsToSave = {}; for (var key in self.achievements) { achievementsToSave[key] = self.achievements[key].unlocked; } storage.achievements = achievementsToSave; // Show achievement notification self.showAchievementNotification(achievement); // Award money playerMoney += achievement.reward; updateMoneyDisplay(); }; self.showAchievementNotification = function (achievement) { var notification = new Text2('🏆 ACHIEVEMENT UNLOCKED! 🏆', { size: 48, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); notification.anchor.set(0.5, 0.5); notification.x = 1024; notification.y = 400; notification.alpha = 0; notification.scaleX = 0.5; notification.scaleY = 0.5; game.addChild(notification); var titleText = new Text2(achievement.title, { size: 36, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 480; titleText.alpha = 0; titleText.scaleX = 0.5; titleText.scaleY = 0.5; game.addChild(titleText); var rewardText = new Text2('+$' + achievement.reward, { size: 32, fill: '#00FF00', font: "'Arial Black', Arial, sans-serif" }); rewardText.anchor.set(0.5, 0.5); rewardText.x = 1024; rewardText.y = 540; rewardText.alpha = 0; rewardText.scaleX = 0.5; rewardText.scaleY = 0.5; game.addChild(rewardText); // Animate in tween(notification, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.bounceOut }); tween(titleText, { alpha: 1, scaleX: 1.0, scaleY: 1.0 }, { duration: 500, delay: 200, easing: tween.bounceOut }); tween(rewardText, { alpha: 1, scaleX: 1.0, scaleY: 1.0 }, { duration: 500, delay: 400, easing: tween.bounceOut }); // Animate out after 3 seconds LK.setTimeout(function () { tween(notification, { alpha: 0, scaleX: 0.8, scaleY: 0.8, y: notification.y - 100 }, { duration: 800, easing: tween.easeIn, onFinish: function onFinish() { notification.destroy(); } }); tween(titleText, { alpha: 0, scaleX: 0.8, scaleY: 0.8, y: titleText.y - 100 }, { duration: 800, delay: 100, easing: tween.easeIn, onFinish: function onFinish() { titleText.destroy(); } }); tween(rewardText, { alpha: 0, scaleX: 0.8, scaleY: 0.8, y: rewardText.y - 100 }, { duration: 800, delay: 200, easing: tween.easeIn, onFinish: function onFinish() { rewardText.destroy(); } }); }, 3000); }; return self; }); var AnimatedHand = Container.expand(function (isDealer) { var self = Container.call(this); self.isDealer = isDealer || false; var handGraphic = self.attachAsset(isDealer ? 'dealerHand' : 'playerHand', { anchorX: 0.5, anchorY: 0.5, width: isDealer ? 216 : 285.66, height: isDealer ? 324 : 428.49, alpha: 0.8 }); // Deal card animation (player - face up) self.dealCardToPlayer = function (targetX, targetY, onComplete) { var movingCard = LK.getAsset('movingCard', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); movingCard.x = self.x; movingCard.y = self.y; game.addChild(movingCard); // Animate hand dealing tween(handGraphic, { scaleX: 1.1, scaleY: 1.1, rotation: 0.1 }, { duration: 200 }); // Move card to target tween(movingCard, { x: targetX, y: targetY, rotation: (Math.random() - 0.5) * 0.2 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { movingCard.destroy(); // Reset hand tween(handGraphic, { scaleX: 1.0, scaleY: 1.0, rotation: 0 }, { duration: 200 }); if (onComplete) onComplete(); } }); }; // Deal card face down (dealer) self.dealCardFaceDown = function (targetX, targetY, onComplete) { var movingCard = LK.getAsset('movingCard', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); movingCard.x = self.x; movingCard.y = self.y; game.addChild(movingCard); // Animate hand dealing tween(handGraphic, { scaleX: 1.1, scaleY: 1.1, rotation: -0.1 }, { duration: 200 }); // Move card to target tween(movingCard, { x: targetX, y: targetY, rotation: (Math.random() - 0.5) * 0.2 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { movingCard.destroy(); // Reset hand tween(handGraphic, { scaleX: 1.0, scaleY: 1.0, rotation: 0 }, { duration: 200 }); if (onComplete) onComplete(); } }); }; // Hit gesture animation self.hitGesture = function (targetX, targetY, onComplete) { var movingCard = LK.getAsset('movingCard', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); movingCard.x = self.x; movingCard.y = self.y; game.addChild(movingCard); // Quick dealing animation tween(handGraphic, { scaleX: 1.05, scaleY: 1.05 }, { duration: 150 }); // Quick card movement tween(movingCard, { x: targetX, y: targetY }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { movingCard.destroy(); tween(handGraphic, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); if (onComplete) onComplete(); } }); }; // Stand gesture animation self.standGesture = function () { tween(handGraphic, { rotation: 0.3, scaleX: 1.1, scaleY: 1.1 }, { duration: 300, onFinish: function onFinish() { tween(handGraphic, { rotation: 0, scaleX: 1.0, scaleY: 1.0 }, { duration: 300 }); } }); }; // Double down gesture with chips and card self.doubleDownGesture = function (targetX, targetY, onComplete) { // Animate placing chips first var chip = LK.getAsset('chipBet', { anchorX: 0.5, anchorY: 0.5 }); chip.x = self.x; chip.y = self.y; chip.alpha = 0; game.addChild(chip); tween(chip, { x: targetX - 100, y: targetY + 100, alpha: 1 }, { duration: 500, onFinish: function onFinish() { // Then deal final card face down var movingCard = LK.getAsset('movingCard', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); movingCard.x = self.x; movingCard.y = self.y; game.addChild(movingCard); tween(movingCard, { x: targetX, y: targetY }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { movingCard.destroy(); chip.destroy(); if (onComplete) onComplete(); } }); } }); }; // Card flip animation self.flipCard = function (cardX, cardY, onComplete) { // Create card back for flip animation var flippingCardBack = LK.getAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 300 }); flippingCardBack.x = cardX; flippingCardBack.y = cardY; game.addChild(flippingCardBack); // Create card front for flip animation (hidden initially) var flippingCardFront = LK.getAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 300, scaleX: 0, alpha: 0 }); flippingCardFront.x = cardX; flippingCardFront.y = cardY; game.addChild(flippingCardFront); // Animate hand moving to card with dramatic gesture tween(handGraphic, { x: cardX - self.x, y: cardY - self.y, scaleX: 1.2, scaleY: 1.2, rotation: 0.3 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { // First half of flip - shrink card back horizontally tween(flippingCardBack, { scaleX: 0, rotation: 0.1 }, { duration: 250, easing: tween.easeIn, onFinish: function onFinish() { // Hide card back, show card front flippingCardBack.alpha = 0; flippingCardFront.alpha = 1; // Second half of flip - expand card front horizontally tween(flippingCardFront, { scaleX: 1, rotation: 0 }, { duration: 250, easing: tween.easeOut, onFinish: function onFinish() { // Add subtle bounce effect tween(flippingCardFront, { scaleX: 1.05, scaleY: 1.05 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(flippingCardFront, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150, easing: tween.easeIn, onFinish: function onFinish() { // Clean up animation cards flippingCardBack.destroy(); flippingCardFront.destroy(); // Return hand to original position with flourish tween(handGraphic, { x: 0, y: 0, scaleX: 1.0, scaleY: 1.0, rotation: 0 }, { duration: 400, easing: tween.easeOut }); if (onComplete) onComplete(); } }); } }); } }); } }); } }); }; // Collect cards animation self.collectCards = function (cardPositions, actualCards, onComplete) { var collectCount = 0; var totalCards = cardPositions.length; for (var i = 0; i < cardPositions.length; i++) { var pos = cardPositions[i]; var actualCard = actualCards ? actualCards[i] : null; var collectingCard = LK.getAsset('movingCard', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); collectingCard.x = pos.x; collectingCard.y = pos.y; game.addChild(collectingCard); // Create closure to capture current card index (function (cardIndex, actualCardRef) { tween(collectingCard, { x: self.x, y: self.y, scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 400, delay: cardIndex * 0, easing: tween.easeIn, onFinish: function onFinish() { collectingCard.destroy(); // Make actual card disappear when collected if (actualCardRef) { actualCardRef.alpha = 0; } collectCount++; if (collectCount >= totalCards && onComplete) { onComplete(); } } }); })(i, actualCard); } // Animate hand collecting tween(handGraphic, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(handGraphic, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); }; // Shuffle animation self.shuffleAnimation = function () { var shuffleDuration = 2000; var shuffleSteps = 8; var stepDuration = shuffleDuration / shuffleSteps; for (var i = 0; i < shuffleSteps; i++) { LK.setTimeout(function () { tween(handGraphic, { rotation: (Math.random() - 0.5) * 0.4, scaleX: 0.9 + Math.random() * 0.2, scaleY: 0.9 + Math.random() * 0.2 }, { duration: stepDuration / 2, onFinish: function onFinish() { tween(handGraphic, { rotation: 0, scaleX: 1.0, scaleY: 1.0 }, { duration: stepDuration / 2 }); } }); }, i * stepDuration); } }; return self; }); var Card = Container.expand(function (suit, value) { var self = Container.call(this); self.suit = suit || 'hearts'; self.value = value || 1; self.faceUp = false; self.getDisplayValue = function () { if (self.value === 1) return 'A'; if (self.value === 11) return 'J'; if (self.value === 12) return 'Q'; if (self.value === 13) return 'K'; return self.value.toString(); }; self.getSuitSymbol = function () { switch (self.suit) { case 'hearts': return '♥'; case 'diamonds': return '♦'; case 'clubs': return '♣'; case 'spades': return '♠'; default: return '♥'; } }; self.getColor = function () { return self.suit === 'hearts' || self.suit === 'diamonds' ? '#FF0000' : '#000000'; }; var cardShadow = self.attachAsset('cardShadow', { anchorX: 0.5, anchorY: 0.5, width: 260, height: 380, alpha: 0.3 }); cardShadow.x = 5; cardShadow.y = 5; var cardBack = self.attachAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); // Get the specific card face asset based on suit and value var cardFaceAsset = 'card_' + self.suit + '_' + (self.value === 1 ? 'A' : self.value === 11 ? 'J' : self.value === 12 ? 'Q' : self.value === 13 ? 'K' : self.value.toString()); var cardFront = self.attachAsset(cardFaceAsset, { anchorX: 0.5, anchorY: 0.5, alpha: 0, width: 240, height: 360 }); // Top left corner value var topLeftValue = new Text2(self.getDisplayValue(), { size: 40, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); topLeftValue.anchor.set(0, 0); topLeftValue.x = -115; topLeftValue.y = -170; topLeftValue.alpha = 0; cardFront.addChild(topLeftValue); // Bottom right corner value (rotated 180 degrees) var bottomRightValue = new Text2(self.getDisplayValue(), { size: 40, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); bottomRightValue.anchor.set(1, 1); bottomRightValue.x = 75; bottomRightValue.y = 120; bottomRightValue.rotation = Math.PI; bottomRightValue.alpha = 0; cardFront.addChild(bottomRightValue); // Center symbols for numbered cards (2-10) var centerSymbols = []; if (self.value >= 2 && self.value <= 10) { for (var i = 0; i < self.value; i++) { var centerSymbol = new Text2(self.getSuitSymbol(), { size: 60, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); centerSymbol.anchor.set(0.5, 0.5); // Aesthetic positioning based on card number var positions = []; if (self.value === 2) { positions = [{ x: 0, y: -60 }, { x: 0, y: 60 }]; } else if (self.value === 3) { positions = [{ x: 0, y: -80 }, { x: 0, y: 0 }, { x: 0, y: 80 }]; } else if (self.value === 4) { positions = [{ x: -40, y: -60 }, { x: 40, y: -60 }, { x: -40, y: 60 }, { x: 40, y: 60 }]; } else if (self.value === 5) { positions = [{ x: -40, y: -60 }, { x: 40, y: -60 }, { x: 0, y: 0 }, { x: -40, y: 60 }, { x: 40, y: 60 }]; } else if (self.value === 6) { positions = [{ x: -40, y: -80 }, { x: 40, y: -80 }, { x: -40, y: 0 }, { x: 40, y: 0 }, { x: -40, y: 80 }, { x: 40, y: 80 }]; } else if (self.value === 7) { positions = [{ x: -40, y: -80 }, { x: 40, y: -80 }, { x: 0, y: -40 }, { x: -40, y: 0 }, { x: 40, y: 0 }, { x: -40, y: 80 }, { x: 40, y: 80 }]; } else if (self.value === 8) { positions = [{ x: -40, y: -80 }, { x: 40, y: -80 }, { x: -40, y: -30 }, { x: 40, y: -30 }, { x: -40, y: 30 }, { x: 40, y: 30 }, { x: -40, y: 80 }, { x: 40, y: 80 }]; } else if (self.value === 9) { positions = [{ x: -40, y: -80 }, { x: 40, y: -80 }, { x: -40, y: -40 }, { x: 40, y: -40 }, { x: 0, y: 0 }, { x: -40, y: 40 }, { x: 40, y: 40 }, { x: -40, y: 80 }, { x: 40, y: 80 }]; } else if (self.value === 10) { positions = [{ x: -40, y: -80 }, { x: 40, y: -80 }, { x: -40, y: -50 }, { x: 40, y: -50 }, { x: -40, y: -20 }, { x: 40, y: -20 }, { x: -40, y: 20 }, { x: 40, y: 20 }, { x: -40, y: 80 }, { x: 40, y: 80 }]; } centerSymbol.x = positions[i].x; centerSymbol.y = positions[i].y; centerSymbol.alpha = 0; cardFront.addChild(centerSymbol); centerSymbols.push(centerSymbol); } } // Main suit symbol for face cards var suitText = new Text2(self.getSuitSymbol(), { size: 60, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); suitText.anchor.set(0.5, 0.5); suitText.y = 0; suitText.alpha = 0; // Special center symbol for Jack - create a servant/knave figure if (self.value === 11) { // Create a simple servant figure using text symbols var servantFigure = new Text2('⚜', { size: 180, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); servantFigure.anchor.set(0.5, 0.5); servantFigure.y = 0; servantFigure.alpha = 0; cardFront.addChild(servantFigure); // Store references for flip animation centerSymbols.push(servantFigure); } else if (self.value === 12) { // Special center symbol for Queen - create a queen figure var queenFigure = new Text2('♛', { size: 180, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); queenFigure.anchor.set(0.5, 0.5); queenFigure.y = 0; queenFigure.alpha = 0; cardFront.addChild(queenFigure); // Store references for flip animation centerSymbols.push(queenFigure); } else if (self.value === 13) { // Special center symbol for King - create a king figure var kingFigure = new Text2('♔', { size: 180, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); kingFigure.anchor.set(0.5, 0.5); kingFigure.y = 0; kingFigure.alpha = 0; cardFront.addChild(kingFigure); // Store references for flip animation centerSymbols.push(kingFigure); } else if (self.value < 2 || self.value > 9 && self.value !== 11 && self.value !== 12 && self.value !== 13) { cardFront.addChild(suitText); } self.getBlackjackValue = function () { if (self.value === 1) return 11; // Ace high initially if (self.value > 10) return 10; // Face cards return self.value; }; self.flip = function () { self.faceUp = !self.faceUp; LK.getSound('cardFlip').play(); if (self.faceUp) { tween(cardBack, { alpha: 0 }, { duration: 200 }); tween(cardFront, { alpha: 1 }, { duration: 200 }); tween(topLeftValue, { alpha: 1 }, { duration: 200 }); tween(bottomRightValue, { alpha: 1 }, { duration: 200 }); for (var i = 0; i < centerSymbols.length; i++) { tween(centerSymbols[i], { alpha: 1 }, { duration: 200 }); } if (self.value < 2 || self.value > 9) { tween(suitText, { alpha: 1 }, { duration: 200 }); } } else { tween(cardBack, { alpha: 1 }, { duration: 200 }); tween(cardFront, { alpha: 0 }, { duration: 200 }); tween(topLeftValue, { alpha: 0 }, { duration: 200 }); tween(bottomRightValue, { alpha: 0 }, { duration: 200 }); for (var i = 0; i < centerSymbols.length; i++) { tween(centerSymbols[i], { alpha: 0 }, { duration: 200 }); } if (self.value < 2 || self.value > 9) { tween(suitText, { alpha: 0 }, { duration: 200 }); } } }; return self; }); var Chip = Container.expand(function (value) { var self = Container.call(this); self.value = value || 1; // Get appropriate chip asset based on value var chipAsset; switch (self.value) { case 1: chipAsset = 'chip1'; break; case 5: chipAsset = 'chip5'; break; case 10: chipAsset = 'chip10'; break; case 25: chipAsset = 'chip25'; break; case 100: chipAsset = 'chip100'; break; case 500: chipAsset = 'chip500'; break; default: chipAsset = 'chip1'; } var chipGraphic = self.attachAsset(chipAsset, { anchorX: 0.5, anchorY: 0.5 }); // Add value text on chip var valueText = new Text2('$' + self.value, { size: 18, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); valueText.anchor.set(0.5, 0.5); chipGraphic.addChild(valueText); self.enabled = true; self.setEnabled = function (enabled) { self.enabled = enabled; chipGraphic.alpha = enabled ? 1.0 : 0.5; }; self.down = function (x, y, obj) { if (!self.enabled) return; if (gameMode !== 'blackjack') return; if (gamePhase !== 'betting') return; // Check if player has enough money for this chip value when added to current bet if (playerMoney >= currentBet + self.value) { currentBet += self.value; updateChipSelection(); LK.getSound('buttonClick').play(); // Create animated chip that moves to Apuesta center var animatedChip = LK.getAsset(chipAsset, { anchorX: 0.5, anchorY: 0.5 }); // Get chip's global position var chipGlobalPos = self.parent.toGlobal(self.position); var gameLocalPos = game.toLocal(chipGlobalPos); animatedChip.x = gameLocalPos.x; animatedChip.y = gameLocalPos.y; animatedChip.alpha = 0.8; game.addChild(animatedChip); // Animate chip moving to center of Apuesta asset tween(animatedChip, { x: apuestaAsset.x, y: apuestaAsset.y, scaleX: 0.7, scaleY: 0.7, alpha: 1.0 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { // Fade out and destroy the animated chip tween(animatedChip, { alpha: 0, scaleX: 0.5, scaleY: 0.5 }, { duration: 300, onFinish: function onFinish() { animatedChip.destroy(); } }); } }); // Visual feedback on original chip tween(chipGraphic, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100, onFinish: function onFinish() { tween(chipGraphic, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } }; return self; }); var DealerCard = Container.expand(function (suit, value) { var self = Container.call(this); self.suit = suit || 'hearts'; self.value = value || 1; self.faceUp = false; self.getDisplayValue = function () { if (self.value === 1) return 'A'; if (self.value === 11) return 'J'; if (self.value === 12) return 'Q'; if (self.value === 13) return 'K'; return self.value.toString(); }; self.getSuitSymbol = function () { switch (self.suit) { case 'hearts': return '♥'; case 'diamonds': return '♦'; case 'clubs': return '♣'; case 'spades': return '♠'; default: return '♥'; } }; self.getColor = function () { return self.suit === 'hearts' || self.suit === 'diamonds' ? '#FF0000' : '#000000'; }; var cardShadow = self.attachAsset('dealerCardShadow', { anchorX: 0.5, anchorY: 0.5, width: 220, height: 320, alpha: 0.3 }); cardShadow.x = 4; cardShadow.y = 4; var cardBack = self.attachAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 300 }); // Get the specific card face asset based on suit and value for dealer cards var dealerCardFaceAsset = 'card_' + self.suit + '_' + (self.value === 1 ? 'A' : self.value === 11 ? 'J' : self.value === 12 ? 'Q' : self.value === 13 ? 'K' : self.value.toString()); var cardFront = self.attachAsset(dealerCardFaceAsset, { anchorX: 0.5, anchorY: 0.5, alpha: 0, width: 200, height: 300 }); // Top left corner value var topLeftValue = new Text2(self.getDisplayValue(), { size: 32, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); topLeftValue.anchor.set(0, 0); topLeftValue.x = -95; topLeftValue.y = -140; topLeftValue.alpha = 0; cardFront.addChild(topLeftValue); // Bottom right corner value (rotated 180 degrees) var bottomRightValue = new Text2(self.getDisplayValue(), { size: 32, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); bottomRightValue.anchor.set(1, 1); bottomRightValue.x = 55; bottomRightValue.y = 90; bottomRightValue.rotation = Math.PI; bottomRightValue.alpha = 0; cardFront.addChild(bottomRightValue); // Center symbols for numbered cards (2-10) var centerSymbols = []; if (self.value >= 2 && self.value <= 10) { for (var i = 0; i < self.value; i++) { var centerSymbol = new Text2(self.getSuitSymbol(), { size: 48, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); centerSymbol.anchor.set(0.5, 0.5); // Aesthetic positioning based on card number var positions = []; if (self.value === 2) { positions = [{ x: 0, y: -45 }, { x: 0, y: 45 }]; } else if (self.value === 3) { positions = [{ x: 0, y: -60 }, { x: 0, y: 0 }, { x: 0, y: 60 }]; } else if (self.value === 4) { positions = [{ x: -30, y: -45 }, { x: 30, y: -45 }, { x: -30, y: 45 }, { x: 30, y: 45 }]; } else if (self.value === 5) { positions = [{ x: -30, y: -45 }, { x: 30, y: -45 }, { x: 0, y: 0 }, { x: -30, y: 45 }, { x: 30, y: 45 }]; } else if (self.value === 6) { positions = [{ x: -30, y: -60 }, { x: 30, y: -60 }, { x: -30, y: 0 }, { x: 30, y: 0 }, { x: -30, y: 60 }, { x: 30, y: 60 }]; } else if (self.value === 7) { positions = [{ x: -30, y: -60 }, { x: 30, y: -60 }, { x: 0, y: -30 }, { x: -30, y: 0 }, { x: 30, y: 0 }, { x: -30, y: 60 }, { x: 30, y: 60 }]; } else if (self.value === 8) { positions = [{ x: -30, y: -60 }, { x: 30, y: -60 }, { x: -30, y: -20 }, { x: 30, y: -20 }, { x: -30, y: 20 }, { x: 30, y: 20 }, { x: -30, y: 60 }, { x: 30, y: 60 }]; } else if (self.value === 9) { positions = [{ x: -30, y: -60 }, { x: 30, y: -60 }, { x: -30, y: -30 }, { x: 30, y: -30 }, { x: 0, y: 0 }, { x: -30, y: 30 }, { x: 30, y: 30 }, { x: -30, y: 60 }, { x: 30, y: 60 }]; } else if (self.value === 10) { positions = [{ x: -30, y: -60 }, { x: 30, y: -60 }, { x: -30, y: -40 }, { x: 30, y: -40 }, { x: -30, y: -15 }, { x: 30, y: -15 }, { x: -30, y: 15 }, { x: 30, y: 15 }, { x: -30, y: 60 }, { x: 30, y: 60 }]; } centerSymbol.x = positions[i].x; centerSymbol.y = positions[i].y; centerSymbol.alpha = 0; cardFront.addChild(centerSymbol); centerSymbols.push(centerSymbol); } } // Main suit symbol for face cards var suitText = new Text2(self.getSuitSymbol(), { size: 48, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); suitText.anchor.set(0.5, 0.5); suitText.y = 0; suitText.alpha = 0; // Special center symbol for Jack - create a servant/knave figure if (self.value === 11) { // Create a simple servant figure using text symbols var servantFigure = new Text2('⚜', { size: 144, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); servantFigure.anchor.set(0.5, 0.5); servantFigure.y = 0; servantFigure.alpha = 0; cardFront.addChild(servantFigure); // Store references for flip animation centerSymbols.push(servantFigure); } else if (self.value === 12) { // Special center symbol for Queen - create a queen figure var queenFigure = new Text2('♛', { size: 144, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); queenFigure.anchor.set(0.5, 0.5); queenFigure.y = 0; queenFigure.alpha = 0; cardFront.addChild(queenFigure); // Store references for flip animation centerSymbols.push(queenFigure); } else if (self.value === 13) { // Special center symbol for King - create a king figure var kingFigure = new Text2('♔', { size: 144, fill: self.getColor(), font: "'Arial Black', Arial, sans-serif" }); kingFigure.anchor.set(0.5, 0.5); kingFigure.y = 0; kingFigure.alpha = 0; cardFront.addChild(kingFigure); // Store references for flip animation centerSymbols.push(kingFigure); } else if (self.value < 2 || self.value > 9 && self.value !== 11 && self.value !== 12 && self.value !== 13) { cardFront.addChild(suitText); } self.getBlackjackValue = function () { if (self.value === 1) return 11; // Ace high initially if (self.value > 10) return 10; // Face cards return self.value; }; self.flip = function () { self.faceUp = !self.faceUp; LK.getSound('cardFlip').play(); if (self.faceUp) { tween(cardBack, { alpha: 0 }, { duration: 200 }); tween(cardFront, { alpha: 1 }, { duration: 200 }); tween(topLeftValue, { alpha: 1 }, { duration: 200 }); tween(bottomRightValue, { alpha: 1 }, { duration: 200 }); for (var i = 0; i < centerSymbols.length; i++) { tween(centerSymbols[i], { alpha: 1 }, { duration: 200 }); } if (self.value < 2 || self.value > 9) { tween(suitText, { alpha: 1 }, { duration: 200 }); } } else { tween(cardBack, { alpha: 1 }, { duration: 200 }); tween(cardFront, { alpha: 0 }, { duration: 200 }); tween(topLeftValue, { alpha: 0 }, { duration: 200 }); tween(bottomRightValue, { alpha: 0 }, { duration: 200 }); for (var i = 0; i < centerSymbols.length; i++) { tween(centerSymbols[i], { alpha: 0 }, { duration: 200 }); } if (self.value < 2 || self.value > 9) { tween(suitText, { alpha: 0 }, { duration: 200 }); } } }; return self; }); var Deck = Container.expand(function () { var self = Container.call(this); // Create multiple stacked cards for deck appearance var stackedCards = []; for (var i = 0; i < 5; i++) { var cardLayer = self.attachAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); cardLayer.x = i * 3; // Slight offset for stacking effect cardLayer.y = i * -2; // Vertical stacking cardLayer.alpha = 0.9 - i * 0.1; // Fade slightly for depth stackedCards.push(cardLayer); } self.cardCount = 52; var countText = new Text2('52', { size: 24, fill: '#FFFFFF' }); countText.anchor.set(0.5, 0.5); countText.y = -200; self.addChild(countText); self.updateCount = function (count) { self.cardCount = count; countText.setText(count.toString()); if (count <= 0) { for (var i = 0; i < stackedCards.length; i++) { stackedCards[i].alpha = 0.1; } } else { for (var i = 0; i < stackedCards.length; i++) { stackedCards[i].alpha = 0.9 - i * 0.1; } } }; self.dealAnimation = function (targetX, targetY, onComplete) { if (self.cardCount <= 0) { if (onComplete) onComplete(); return; } self.cardCount--; self.updateCount(self.cardCount); var dealingCard = LK.getAsset('casinoCardBack', { anchorX: 0.5, anchorY: 0.5, width: 240, height: 360 }); dealingCard.x = self.x; dealingCard.y = self.y; game.addChild(dealingCard); tween(dealingCard, { x: targetX, y: targetY, rotation: (Math.random() - 0.5) * 0.2 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { dealingCard.destroy(); if (onComplete) onComplete(); } }); // Animate the entire stack slightly when dealing for (var i = 0; i < stackedCards.length; i++) { tween(stackedCards[i], { scaleX: 0.95, scaleY: 0.95 }, { duration: 100, onFinish: function onFinish() { tween(stackedCards[i], { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } }; return self; }); var GameButton = Container.expand(function (text, width, height) { var self = Container.call(this); var buttonShadow = self.attachAsset('buttonShadow', { anchorX: 0.5, anchorY: 0.5, width: (width || 200) * 2 + 20, height: (height || 80) * 2 + 20, alpha: 0.4 }); buttonShadow.x = 6; buttonShadow.y = 6; var buttonBg = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, width: (width || 200) * 2, height: (height || 80) * 2 }); var buttonText = new Text2(text || 'Button', { size: 48, fill: '#000000', font: "'Arial Black', Arial, sans-serif" }); buttonText.anchor.set(0.5, 0.5); buttonBg.addChild(buttonText); self.enabled = true; self.setText = function (newText) { buttonText.setText(newText); }; self.setEnabled = function (enabled) { self.enabled = enabled; buttonBg.alpha = enabled ? 1.0 : 0.5; }; self.down = function (x, y, obj) { if (!self.enabled) return; LK.getSound('buttonClick').play(); tween(buttonBg, { scaleX: 0.85, scaleY: 0.85 }, { duration: 100, easing: tween.easeOut }); }; self.up = function (x, y, obj) { if (!self.enabled) return; tween(buttonBg, { scaleX: 1.1, scaleY: 1.1 }, { duration: 150, easing: tween.bounceOut, onFinish: function onFinish() { tween(buttonBg, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeOut }); } }); }; return self; }); var MegawaysReel = Container.expand(function (reelIndex) { var self = Container.call(this); self.reelIndex = reelIndex || 0; self.symbols = []; self.symbolTypes = ['megawaysSymbolA', 'megawaysSymbolB', 'megawaysSymbolC', 'megawaysSymbolD', 'megawaysSymbolE', 'megawaysSymbolF', 'megawaysWild', 'megawaysScatter']; self.spinning = false; self.currentSymbolCount = 4; // Start with 4 symbols self.maxSymbols = 4; // Maximum symbols per reel self.minSymbols = 4; // Minimum symbols per reel self.isSpinning = false; self.spinEndCallback = null; // Reel container background var reelBorder = self.attachAsset('megawaysReelBorder', { anchorX: 0.5, anchorY: 0.5 }); var reelContainer = self.attachAsset('megawaysReelContainer', { anchorX: 0.5, anchorY: 0.5 }); // Initialize reel with random symbol count self.generateRandomSymbolCount = function () { self.currentSymbolCount = self.minSymbols + Math.floor(Math.random() * (self.maxSymbols - self.minSymbols + 1)); return self.currentSymbolCount; }; // Create symbols for this reel self.createSymbols = function () { // Clear existing symbols for (var i = 0; i < self.symbols.length; i++) { if (self.symbols[i] && self.symbols[i].destroy) { self.symbols[i].destroy(); } } self.symbols = []; // Create new symbols based on current count for (var i = 0; i < self.currentSymbolCount; i++) { var symbolType = self.symbolTypes[Math.floor(Math.random() * (self.symbolTypes.length - 2))]; // Exclude wild and scatter for now var symbol = new MegawaysSymbol(symbolType, self.symbolTypes.indexOf(symbolType)); // Position symbols vertically within reel with no spacing between them var symbolHeight = 105; // Height of each symbol (60 * 1.4 scale + padding to fill 420px height completely) symbol.y = (i - (self.currentSymbolCount - 1) / 2) * symbolHeight; // Scale symbols to fill available space better symbol.scaleX = 1.4; symbol.scaleY = 1.4; self.addChild(symbol); self.symbols.push(symbol); } }; // Calculate total ways to win based on symbol counts self.calculateWays = function (reelSymbolCounts) { var totalWays = 1; for (var i = 0; i < reelSymbolCounts.length; i++) { totalWays *= reelSymbolCounts[i]; } return totalWays; }; // Spin reel with enhanced Megaways animations self.spin = function (duration, onComplete) { if (self.isSpinning) return; self.isSpinning = true; self.spinEndCallback = onComplete; // Generate new symbol count for this spin self.generateRandomSymbolCount(); // Store old symbols for cascading animation var oldSymbols = self.symbols.slice(); // Start spin animation with reel shake and blur tween(reelContainer, { scaleY: 0.6, scaleX: 1.1, alpha: 0.7 }, { duration: 300, easing: tween.easeOut }); // Animate old symbols falling out for (var i = 0; i < oldSymbols.length; i++) { (function (symbol, index) { tween(symbol, { y: symbol.y + 500, alpha: 0, rotation: (Math.random() - 0.5) * Math.PI }, { duration: 400 + index * 50, easing: tween.easeIn, onFinish: function onFinish() { if (symbol && symbol.destroy) { symbol.destroy(); } } }); })(oldSymbols[i], i); } // Clear symbols array after starting fall animation self.symbols = []; var spinInterval; var spinCount = 0; var maxSpins = Math.floor(duration / 120); var tempSymbols = []; spinInterval = LK.setInterval(function () { spinCount++; // Create temporary spinning symbols for visual effect if (spinCount % 2 === 0) { // Clear temp symbols for (var i = 0; i < tempSymbols.length; i++) { if (tempSymbols[i] && tempSymbols[i].destroy) { tempSymbols[i].destroy(); } } tempSymbols = []; // Create new temp symbols for (var i = 0; i < self.currentSymbolCount; i++) { var symbolType = self.symbolTypes[Math.floor(Math.random() * self.symbolTypes.length)]; var tempSymbol = new MegawaysSymbol(symbolType, self.symbolTypes.indexOf(symbolType)); // Position temp symbols with no spacing between them var symbolHeight = 105; // Height of each symbol with no gaps tempSymbol.y = (i - (self.currentSymbolCount - 1) / 2) * symbolHeight; tempSymbol.alpha = 0.6; // Scale temp symbols to match final ones tempSymbol.scaleX = 1.4; tempSymbol.scaleY = 1.4; self.addChild(tempSymbol); tempSymbols.push(tempSymbol); } } // Add intense shake effect during spin reelContainer.x = (Math.random() - 0.5) * 12; reelContainer.y = (Math.random() - 0.5) * 8; if (spinCount >= maxSpins) { LK.clearInterval(spinInterval); // Clear temp symbols for (var i = 0; i < tempSymbols.length; i++) { if (tempSymbols[i] && tempSymbols[i].destroy) { tempSymbols[i].destroy(); } } tempSymbols = []; // Create final symbols with drop-in animation self.createFinalSymbols(); } }, 120); }; // Create final symbols with drop-in animation self.createFinalSymbols = function () { // Create new symbols above the reel for (var i = 0; i < self.currentSymbolCount; i++) { var symbolType = self.symbolTypes[Math.floor(Math.random() * (self.symbolTypes.length - 2))]; var symbol = new MegawaysSymbol(symbolType, self.symbolTypes.indexOf(symbolType)); // Position symbols with no spacing between them var symbolHeight = 105; // Height of each symbol with no gaps var finalY = (i - (self.currentSymbolCount - 1) / 2) * symbolHeight; // Start symbols above the reel area symbol.y = finalY - 500; symbol.alpha = 0; // Scale symbols to fill available space better symbol.scaleX = 1.4; symbol.scaleY = 1.4; self.addChild(symbol); self.symbols.push(symbol); // Animate drop-in with staggered timing (function (sym, targetY, index) { tween(sym, { y: targetY, alpha: 1 }, { duration: 600, delay: index * 100, easing: tween.bounceOut, onFinish: function onFinish() { // Check if this is the last symbol to finish if (index === self.currentSymbolCount - 1) { self.finalizeSpin(); } } }); })(symbol, finalY, i); } }; // Finalize spin animation self.finalizeSpin = function () { // Reset reel container position and scale tween(reelContainer, { x: 0, y: 0, scaleY: 1.0, scaleX: 1.0, alpha: 1.0 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { self.isSpinning = false; if (self.spinEndCallback) { self.spinEndCallback(); self.spinEndCallback = null; } } }); }; // Get all symbols in this reel self.getSymbols = function () { return self.symbols; }; // Get symbol count for ways calculation self.getSymbolCount = function () { return self.currentSymbolCount; }; // Check for winning combinations in this reel self.checkForWins = function (targetSymbol, position) { var winningSymbols = []; for (var i = 0; i < self.symbols.length; i++) { var symbol = self.symbols[i]; if (symbol.getSymbolValue() === targetSymbol || symbol.isWild) { winningSymbols.push(symbol); } } return winningSymbols; }; // Mark symbols for cascade removal self.markSymbolsForRemoval = function (symbolsToRemove) { for (var i = 0; i < symbolsToRemove.length; i++) { var symbol = symbolsToRemove[i]; symbol.markForWin(); } }; // Initialize with symbols self.generateRandomSymbolCount(); self.createSymbols(); return self; }); var MegawaysSlotMachine = Container.expand(function () { var self = Container.call(this); self.reels = []; self.isSpinning = false; self.currentWays = 0; self.cascadeCount = 0; self.totalWinAmount = 0; // Create 6 reels for Megaways self.createReels = function () { for (var i = 0; i < 6; i++) { var reel = new MegawaysReel(i); // Position reels horizontally with proper spacing reel.x = (i - 2.5) * 200; // Center 6 reels reel.y = 0; self.addChild(reel); self.reels.push(reel); } }; // Calculate total ways to win self.calculateTotalWays = function () { var symbolCounts = []; for (var i = 0; i < self.reels.length; i++) { symbolCounts.push(self.reels[i].getSymbolCount()); } var ways = 1; for (var i = 0; i < symbolCounts.length; i++) { ways *= symbolCounts[i]; } self.currentWays = ways; return ways; }; // Spin all reels with staggered timing self.spinAllReels = function (onComplete) { if (self.isSpinning) return; self.isSpinning = true; self.cascadeCount = 0; self.totalWinAmount = 0; var completedReels = 0; var totalReels = self.reels.length; // Spin each reel with increasing delay for realistic effect for (var i = 0; i < self.reels.length; i++) { (function (reelIndex) { LK.setTimeout(function () { self.reels[reelIndex].spin(1200 + reelIndex * 200, function () { completedReels++; if (completedReels === totalReels) { self.isSpinning = false; self.calculateTotalWays(); if (onComplete) onComplete(); } }); }, reelIndex * 150); })(i); } }; // Check for winning combinations across all reels self.checkForWins = function () { var winningCombinations = []; var symbolTypes = ['megawaysSymbolA', 'megawaysSymbolB', 'megawaysSymbolC', 'megawaysSymbolD', 'megawaysSymbolE', 'megawaysSymbolF']; // Check each symbol type for consecutive matches from left for (var s = 0; s < symbolTypes.length; s++) { var symbolType = symbolTypes[s]; var consecutiveReels = 0; var winningSymbols = []; // Check from leftmost reel for (var r = 0; r < self.reels.length; r++) { var reelMatches = self.reels[r].checkForWins(symbolType, r); if (reelMatches.length > 0) { consecutiveReels++; winningSymbols = winningSymbols.concat(reelMatches); } else { break; // Must be consecutive from left } } // Need at least 3 consecutive reels for a win if (consecutiveReels >= 3) { winningCombinations.push({ symbolType: symbolType, reelCount: consecutiveReels, symbols: winningSymbols, multiplier: self.getSymbolMultiplier(symbolType, consecutiveReels) }); } } return winningCombinations; }; // Get multiplier for symbol and reel count self.getSymbolMultiplier = function (symbolType, reelCount) { var baseMultipliers = { 'megawaysSymbolA': 50, 'megawaysSymbolB': 40, 'megawaysSymbolC': 30, 'megawaysSymbolD': 25, 'megawaysSymbolE': 20, 'megawaysSymbolF': 15 }; var reelMultiplier = reelCount - 2; // 3 reels = 1x, 4 reels = 2x, etc. var betFactor = currentBet / 25; // Scale rewards based on bet amount (25 is base bet) return (baseMultipliers[symbolType] || 10) * reelMultiplier * betFactor; }; // Process winning combinations self.processWins = function (winningCombinations, onComplete) { if (winningCombinations.length === 0) { if (onComplete) onComplete(0); return; } var totalWin = 0; // Calculate total win amount for (var i = 0; i < winningCombinations.length; i++) { var combo = winningCombinations[i]; totalWin += combo.multiplier; // Mark symbols for removal for (var j = 0; j < combo.symbols.length; j++) { combo.symbols[j].markForWin(); } } self.totalWinAmount += totalWin; // Animate win highlighting LK.setTimeout(function () { self.cascadeWinningSymbols(winningCombinations, function () { if (onComplete) onComplete(totalWin); }); }, 1000); return totalWin; }; // Cascade (remove) winning symbols and drop remaining ones self.cascadeWinningSymbols = function (winningCombinations, onComplete) { self.cascadeCount++; var symbolsToRemove = []; // Collect all winning symbols for (var i = 0; i < winningCombinations.length; i++) { symbolsToRemove = symbolsToRemove.concat(winningCombinations[i].symbols); } // Animate symbol removal var removedCount = 0; for (var i = 0; i < symbolsToRemove.length; i++) { (function (symbol) { symbol.explode(function () { removedCount++; if (removedCount === symbolsToRemove.length) { // All symbols removed, now cascade remaining symbols down self.cascadeRemainingSymbols(function () { // Check for new wins after cascade LK.setTimeout(function () { var newWins = self.checkForWins(); if (newWins.length > 0) { // More wins found, process them self.processWins(newWins, onComplete); } else { // No more wins, cascade complete if (onComplete) onComplete(); } }, 300); }); } }); })(symbolsToRemove[i]); } }; // Drop remaining symbols and fill gaps self.cascadeRemainingSymbols = function (onComplete) { var cascadeComplete = 0; var totalReels = self.reels.length; for (var r = 0; r < self.reels.length; r++) { (function (reelIndex) { var reel = self.reels[reelIndex]; var remainingSymbols = []; // Collect non-destroyed symbols for (var i = 0; i < reel.symbols.length; i++) { if (reel.symbols[i] && !reel.symbols[i].marked) { remainingSymbols.push(reel.symbols[i]); } } // Fill reel back to current symbol count var newSymbolsNeeded = reel.currentSymbolCount - remainingSymbols.length; for (var n = 0; n < newSymbolsNeeded; n++) { var symbolType = reel.symbolTypes[Math.floor(Math.random() * (reel.symbolTypes.length - 2))]; var newSymbol = new MegawaysSymbol(symbolType, reel.symbolTypes.indexOf(symbolType)); newSymbol.y = -400 - n * 70; // Start above screen reel.addChild(newSymbol); remainingSymbols.unshift(newSymbol); // Add to beginning } // Update reel's symbols array reel.symbols = remainingSymbols; // Animate all symbols to their final positions var symbolHeight = 105; // Height of each symbol with no gaps for (var i = 0; i < remainingSymbols.length; i++) { (function (symbol, index, finalReel) { var targetY = (index - (reel.currentSymbolCount - 1) / 2) * symbolHeight; // Scale new symbols to match existing ones symbol.scaleX = 1.4; symbol.scaleY = 1.4; symbol.startFalling(targetY, function () { if (index === remainingSymbols.length - 1) { cascadeComplete++; if (cascadeComplete === totalReels) { if (onComplete) onComplete(); } } }); })(remainingSymbols[i], i, reelIndex); } })(r); } }; // Get current ways display text self.getWaysText = function () { return self.currentWays + ' WAYS'; }; // Initialize reels self.createReels(); return self; }); var MegawaysSymbol = Container.expand(function (symbolType, symbolIndex) { var self = Container.call(this); self.symbolType = symbolType || 'megawaysSymbolA'; self.symbolIndex = symbolIndex || 0; self.isWild = symbolType === 'megawaysWild'; self.isScatter = symbolType === 'megawaysScatter'; self.marked = false; self.falling = false; // Symbol graphics var symbolGraphic = self.attachAsset(self.symbolType, { anchorX: 0.5, anchorY: 0.5 }); // Ensure clean state - no tinting symbolGraphic.tint = 0xFFFFFF; // Symbol assets for identification instead of text var symbolAssetNames = ['A', 'B', 'C', 'D', 'E', 'F', 'Wild', 'Scatter']; var symbolAsset = LK.getAsset(self.isWild ? 'Wild' : self.isScatter ? 'Scatter' : symbolAssetNames[self.symbolIndex], { anchorX: 0.5, anchorY: 0.5 }); symbolGraphic.addChild(symbolAsset); // Mark symbol for win combination self.markForWin = function () { if (self.marked) return; if (self.falling) return; // Don't mark while falling during cascade self.marked = true; tween(symbolGraphic, { tint: 0xffff00, scaleX: 1.1, scaleY: 1.1 }, { duration: 300, easing: tween.bounceOut }); }; // Start falling animation for cascade self.startFalling = function (targetY, onComplete) { if (self.falling) return; self.falling = true; // Reset any win markings and tint when falling self.marked = false; tween.stop(symbolGraphic, { tint: true, scaleX: true, scaleY: true }); symbolGraphic.tint = 0xFFFFFF; // Reset to white // Keep original scale instead of forcing 1.4 to prevent growth during cascade symbolGraphic.scaleX = 1.0; symbolGraphic.scaleY = 1.0; tween(self, { y: targetY }, { duration: 400, easing: tween.bounceOut, onFinish: function onFinish() { self.falling = false; if (onComplete) onComplete(); } }); }; // Explode and remove symbol self.explode = function (onComplete) { tween(symbolGraphic, { scaleX: 0, scaleY: 0, alpha: 0, rotation: Math.PI * 2 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { self.destroy(); if (onComplete) onComplete(); } }); }; // Get symbol value for matching self.getSymbolValue = function () { if (self.isWild) return 'WILD'; if (self.isScatter) return 'SCATTER'; return self.symbolType; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0F4C3A }); /**** * Game Code ****/ // Card Back (Single design for all cards) // Spades (Black Suit) - 13 cards // Clubs (Black Suit) - 13 cards // Diamonds (Red Suit) - 13 cards // Hearts (Red Suit) - 13 cards // Add background // Luxury slot machine frame assets - "La Tentación Dorada" styling // Dark wood main frame // Gold inner border // Dark inlay // Dark blue/black reels background // Gold border around reels // Luxury SPIN button // Button border // Luxury MENU button // Corner decorations var fondoM = LK.getAsset('FondoM', { anchorX: 0.5, anchorY: 0.5 }); fondoM.x = 1024; fondoM.y = 1366; game.addChild(fondoM); // Add casino table background var tableBackground = LK.getAsset('fondo', { anchorX: 0.5, anchorY: 0.5 }); tableBackground.x = 1024; tableBackground.y = 1366; tableBackground.alpha = 0; game.addChild(tableBackground); // Add slots background var slotsBackground = LK.getAsset('FondoS', { anchorX: 0.5, anchorY: 0.5 }); slotsBackground.x = 1024; slotsBackground.y = 1366; slotsBackground.alpha = 0; game.addChild(slotsBackground); // Add tragamonedas asset first (lower z-index) var tragamonedasAsset = LK.getAsset('tragamonedas', { anchorX: 0.5, anchorY: 0.5 }); tragamonedasAsset.x = 1024; tragamonedasAsset.y = 1200; // Moved higher up to overlap with slot machine tragamonedasAsset.alpha = 0; // Start hidden game.addChild(tragamonedasAsset); // Add Monedero asset in bottom left corner below tragamonedas var monederoAsset = LK.getAsset('Monedero', { anchorX: 0.5, anchorY: 0.5 }); monederoAsset.x = 280; // Left side position (270 + 10 pixels to the right) monederoAsset.y = 2590; // Below tragamonedas asset (2600 - 10 pixels up) monederoAsset.alpha = 0; // Start hidden game.addChild(monederoAsset); // Add Monedero2 asset in bottom right corner at same height as Monedero var monedero2Asset = LK.getAsset('Monedero2', { anchorX: 0.5, anchorY: 0.5 }); monedero2Asset.x = 1648; // Right side position moved 60 pixels left (1708 - 60) monedero2Asset.y = 2590; // Same height as Monedero monedero2Asset.alpha = 0; // Start hidden game.addChild(monedero2Asset); // Add mas asset to top right of Monedero var masAsset = LK.getAsset('mas', { anchorX: 0.5, anchorY: 0.5 }); masAsset.x = 570; // Right side of Monedero moved 20 pixels right (550 + 20) masAsset.y = 2510; // Above Monedero moved 60 pixels down (2450 + 60) masAsset.alpha = 0; // Start hidden game.addChild(masAsset); // Add click handler for mas asset masAsset.down = function (x, y, obj) { if (gameMode !== 'slots') return; if (currentBet * 2 <= playerMoney) { currentBet *= 2; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); } }; // Add menos asset to bottom right of Monedero var menosAsset = LK.getAsset('menos', { anchorX: 0.5, anchorY: 0.5 }); menosAsset.x = 570; // Right side of Monedero moved 20 pixels right (550 + 20) menosAsset.y = 2680; // Below Monedero moved 10 pixels up (2690 - 10) menosAsset.alpha = 0; // Start hidden game.addChild(menosAsset); // Add click handler for menos asset menosAsset.down = function (x, y, obj) { if (gameMode !== 'slots') return; if (currentBet / 2 >= 25) { currentBet = currentBet / 2; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); } }; // Add Megaways slot machine above tragamonedas (higher z-index) var megawaysSlotMachine = game.addChild(new MegawaysSlotMachine()); megawaysSlotMachine.x = 954; // Moved right by 60 pixels (894 + 60) megawaysSlotMachine.y = 1250; // Moved down by 200 pixels total (1050 + 200) megawaysSlotMachine.scaleX = 1.6; // Scale by 1.6 times larger megawaysSlotMachine.scaleY = 2.73; // Scale by 2.73 times larger (2.53 + 0.20 for additional 50px stretch) megawaysSlotMachine.alpha = 0; // Megaways display (hidden by default) var waysDisplay = new Text2('117,649 WAYS', { size: 48, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); waysDisplay.anchor.set(0.5, 0.5); waysDisplay.x = 1024; waysDisplay.y = 900; waysDisplay.alpha = 0; game.addChild(waysDisplay); // Win amount display var winAmountDisplay = new Text2('WIN: $0', { size: 56, fill: '#00FF00', font: "'Arial Black', Arial, sans-serif" }); winAmountDisplay.anchor.set(0.5, 0.5); winAmountDisplay.x = 1648; winAmountDisplay.y = 2590; winAmountDisplay.alpha = 0; game.addChild(winAmountDisplay); // Disclaimer UI elements // Use black background instead of warning asset game.setBackgroundColor(0x000000); var disclaimerTitle = new Text2('⚠️ IMPORTANT WARNING ⚠️', { size: 126, fill: '#FF0000', font: "'Arial Black', Arial, sans-serif" }); disclaimerTitle.anchor.set(0.5, 0.5); disclaimerTitle.x = 1024; disclaimerTitle.y = 650; disclaimerTitle.alpha = 1; game.addChild(disclaimerTitle); var disclaimerText1 = new Text2('• This game features a save system', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText1.anchor.set(0.5, 0.5); disclaimerText1.x = 1024; disclaimerText1.y = 950; disclaimerText1.alpha = 1; game.addChild(disclaimerText1); var disclaimerText2 = new Text2('• If you run out of virtual money,', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText2.anchor.set(0.5, 0.5); disclaimerText2.x = 1024; disclaimerText2.y = 1060; disclaimerText2.alpha = 1; game.addChild(disclaimerText2); var disclaimerText3 = new Text2('the only way to earn more is with the wheel', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText3.anchor.set(0.5, 0.5); disclaimerText3.x = 1024; disclaimerText3.y = 1170; disclaimerText3.alpha = 1; game.addChild(disclaimerText3); var disclaimerText4 = new Text2('• This game is for entertainment only', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText4.anchor.set(0.5, 0.5); disclaimerText4.x = 1024; disclaimerText4.y = 1280; disclaimerText4.alpha = 1; game.addChild(disclaimerText4); var disclaimerText5 = new Text2('• NO real money is involved', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText5.anchor.set(0.5, 0.5); disclaimerText5.x = 1024; disclaimerText5.y = 1390; disclaimerText5.alpha = 1; game.addChild(disclaimerText5); var disclaimerText6 = new Text2('• Gambling can be addictive', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText6.anchor.set(0.5, 0.5); disclaimerText6.x = 1024; disclaimerText6.y = 1500; disclaimerText6.alpha = 1; game.addChild(disclaimerText6); var disclaimerText7 = new Text2('• Real gambling can be harmful', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText7.anchor.set(0.5, 0.5); disclaimerText7.x = 1024; disclaimerText7.y = 1610; disclaimerText7.alpha = 1; game.addChild(disclaimerText7); var disclaimerText8 = new Text2('• Please seek help if needed', { size: 62, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); disclaimerText8.anchor.set(0.5, 0.5); disclaimerText8.x = 1024; disclaimerText8.y = 1720; disclaimerText8.alpha = 1; game.addChild(disclaimerText8); var continueButton = game.addChild(new GameButton('I UNDERSTAND - CONTINUE', 400, 100)); continueButton.x = 1024; continueButton.y = 2140; continueButton.alpha = 1; // Create larger invisible hit area for better touch responsiveness var continueButtonHitArea = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 600, // 50% wider than original height: 150, // 50% taller than original alpha: 0 // Invisible }); continueButtonHitArea.x = 0; continueButtonHitArea.y = 0; continueButton.addChild(continueButtonHitArea); // Make the hit area interactive and forward events to the button continueButtonHitArea.interactive = true; continueButtonHitArea.buttonMode = true; continueButtonHitArea.down = function (x, y, obj) { if (continueButton.down) continueButton.down(x, y, obj); }; continueButtonHitArea.up = function (x, y, obj) { if (continueButton.up) continueButton.up(x, y, obj); }; // Cascade counter (hidden by default) var cascadeDisplay = new Text2('', { size: 42, fill: '#FF6347', font: "'Arial Black', Arial, sans-serif" }); cascadeDisplay.anchor.set(0.5, 0.5); cascadeDisplay.x = 1024; cascadeDisplay.y = 850; cascadeDisplay.alpha = 0; game.addChild(cascadeDisplay); // Cascade animation variables var lastCascadeCount = 0; var cascadeAnimationDisplay = null; // Game state var playerMoney = storage.playerMoney || 1000; var currentBet = 0; var gameMode = 'disclaimer'; // 'disclaimer', 'menu', 'blackjack', 'slots' var wheelScreenOpen = false; // Track if wheel screen is currently open // Initialize achievement system var achievementSystem = new AchievementSystem(); // Achievement tracking variables var consecutiveWins = storage.consecutiveWins || 0; var confirmedHighBet = false; // Chip system var chips = []; var chipContainer = game.addChild(new Container()); chipContainer.x = 1004; // Move 20 pixels left (1024 - 20) chipContainer.y = 2300; // Position below player cards chipContainer.alpha = 0; var moneyAfterBet = 0; var moneyAfterSpin = 0; var deck = []; var playerCards = []; var dealerCards = []; var gamePhase = 'betting'; // 'betting', 'dealing', 'playing', 'dealer', 'finished' var handInProgress = false; // Track if a hand is currently in progress var lastWaysCount = 0; var waysAnimationDisplay = null; // Total bet display for slots (positioned in center of Monedero) var totalBetDisplay = new Text2('$' + currentBet, { size: 108, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); totalBetDisplay.anchor.set(0.5, 0.5); totalBetDisplay.x = 280; // Same x position as Monedero totalBetDisplay.y = 2590; // Same y position as Monedero totalBetDisplay.alpha = 0; // Start hidden game.addChild(totalBetDisplay); // UI Elements var moneyDisplay = new Text2('$1000', { size: 112, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); moneyDisplay.anchor.set(0.5, 0.5); moneyDisplay.x = 974; moneyDisplay.y = 2596; // Position to overlap BalanceB asset (moved 30 pixels down) moneyDisplay.alpha = 0; game.addChild(moneyDisplay); // Add Remove asset positioned above TotalA asset var removeAsset = LK.getAsset('Remove', { anchorX: 0.5, anchorY: 0.5 }); removeAsset.x = 1724; // Same x position as totalA asset removeAsset.y = 2375; // Positioned above totalA asset (2475 - 100) removeAsset.alpha = 0; game.addChild(removeAsset); // Add click handler for Remove button removeAsset.down = function (x, y, obj) { if (gameMode !== 'blackjack') return; if (gamePhase !== 'betting') return; // Reset bet to 0 currentBet = 0; updateChipSelection(); LK.getSound('buttonClick').play(); }; // Add TotalA asset at same horizontal height as chips and same vertical height as Home var totalAAsset = LK.getAsset('TotalA', { anchorX: 0.5, anchorY: 0.5 }); totalAAsset.x = 1724; // Move 200 pixels right from previous position (1524 + 200) totalAAsset.y = 2550; // Move 150 pixels down from previous position (2400 + 150) totalAAsset.alpha = 0; game.addChild(totalAAsset); // Add bet value display positioned at center of TotalA asset var betValueDisplay = new Text2('$' + currentBet, { size: 83, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); betValueDisplay.anchor.set(0.5, 0.5); betValueDisplay.x = 1814; // Move 10 pixels left (1824 - 10) betValueDisplay.y = 2545; // Move 5 pixels down (2540 + 5) betValueDisplay.alpha = 0; game.addChild(betValueDisplay); // Add BalanceB asset positioned in the middle of money display var balanceBAsset = LK.getAsset('BalanceB', { anchorX: 0.5, anchorY: 0.5 }); balanceBAsset.x = 974; // Same x position as money display balanceBAsset.y = 2566; // Moved 20 pixels down (2546 + 20) balanceBAsset.alpha = 0; game.addChild(balanceBAsset); // Add BalanceBJ asset positioned at same height as TotalA but on left side var balanceBJAsset = LK.getAsset('BalanceBJ', { anchorX: 0.5, anchorY: 0.5 }); balanceBJAsset.x = 324; // Left side position (mirroring TotalA position) balanceBJAsset.y = 2500; // Moved 30 pixels up (2530 - 30) balanceBJAsset.alpha = 0; game.addChild(balanceBJAsset); // Add Apuesta asset below deal button in blackjack mode var apuestaAsset = LK.getAsset('Apuesta', { anchorX: 0.5, anchorY: 0.5 }); apuestaAsset.x = 1024; // Same x position as deal button apuestaAsset.y = 1650; // Position below deal button (1450 + 200) apuestaAsset.alpha = 0; game.addChild(apuestaAsset); // Add player money display in center of BalanceBJ asset var playerMoneyDisplay = new Text2('$' + playerMoney, { size: 75, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); playerMoneyDisplay.anchor.set(0.5, 0.5); playerMoneyDisplay.x = 324; // Same x position as BalanceBJ asset playerMoneyDisplay.y = 2530; // Moved 10 pixels up (2540 - 10) playerMoneyDisplay.alpha = 0; game.addChild(playerMoneyDisplay); // Move money display after BalanceB so it renders on top game.removeChild(moneyDisplay); game.addChild(moneyDisplay); // Create message display for game feedback var messageDisplay = new Text2('', { size: 56, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); messageDisplay.anchor.set(0.5, 0.5); messageDisplay.x = 1024; messageDisplay.y = 800; messageDisplay.alpha = 0; game.addChild(messageDisplay); // Add welcome asset to main menu var welcomeAsset = LK.getAsset('Welcome', { anchorX: 0.5, anchorY: 0.5 }); welcomeAsset.x = 1024; welcomeAsset.y = 400; // 700 pixels above blackjack button (1100 - 700) game.addChild(welcomeAsset); // Menu buttons var blackjackButton = game.addChild(new GameButton('BLACKJACK', 300, 100)); blackjackButton.x = 1024; blackjackButton.y = 1100; // Replace the default button background with BlackJ asset var blackjackAsset = LK.getAsset('BlackJ', { anchorX: 0.5, anchorY: 0.5 }); blackjackButton.removeChild(blackjackButton.children[1]); // Remove default background blackjackButton.addChildAt(blackjackAsset, 1); // Add new asset as background var slotsButton = game.addChild(new GameButton('SLOT MACHINE', 300, 100)); slotsButton.x = 1004; slotsButton.y = 1750; // Replace the default button background with MaquinaB asset var slotAsset = LK.getAsset('MaquinaB', { anchorX: 0.5, anchorY: 0.5, width: 550, height: 550 }); slotsButton.removeChild(slotsButton.children[1]); // Remove default background slotsButton.addChildAt(slotAsset, 1); // Add new asset as background // Blackjack UI var hitButton = LK.getAsset('hit', { anchorX: 0.5, anchorY: 0.5 }); hitButton.x = 770; // Move 100 pixels right (670 + 100) hitButton.y = 2400; hitButton.alpha = 0; game.addChild(hitButton); var standButton = LK.getAsset('stand', { anchorX: 0.5, anchorY: 0.5 }); standButton.x = 1000; // Move 100 pixels right (900 + 100) standButton.y = 2400; standButton.alpha = 0; standButton.interactive = true; standButton.buttonMode = true; game.addChild(standButton); var doubleButton = LK.getAsset('double', { anchorX: 0.5, anchorY: 0.5 }); doubleButton.x = 1230; // Move 100 pixels right (1130 + 100) doubleButton.y = 2400; doubleButton.alpha = 0; game.addChild(doubleButton); // Deal button for blackjack var dealButton = LK.getAsset('DealB', { anchorX: 0.5, anchorY: 0.5 }); dealButton.x = 1024; // Center of table dealButton.y = 1300; // Move 500 pixels up from previous position (1800 - 500) dealButton.alpha = 0; game.addChild(dealButton); // Slots UI (classic slots removed - using Megaways only) var spinButton = game.addChild(new GameButton('SPIN $25', 200, 80)); spinButton.x = 974; spinButton.y = 2230; spinButton.alpha = 0; // Replace the default button background with circular assets spinButton.removeChild(spinButton.children[0]); // Remove shadow spinButton.removeChild(spinButton.children[0]); // Remove background (index shifts after first removal) var circularButton = LK.getAsset('circularSpinButton', { anchorX: 0.5, anchorY: 0.5 }); spinButton.addChildAt(circularButton, 0); // Create money difference display in center of Monedero2 asset var moneyDifferenceDisplay = new Text2('$0', { size: 79, fill: '#00FF00', font: "'Arial Black', Arial, sans-serif" }); moneyDifferenceDisplay.anchor.set(0.5, 0.5); moneyDifferenceDisplay.x = 1648; // Same x position as Monedero2 asset moneyDifferenceDisplay.y = 2590; // Same y position as Monedero2 asset moneyDifferenceDisplay.alpha = 0; // Add to game to position in center of Monedero2 game.addChild(moneyDifferenceDisplay); // Create new Home button with Home asset in upper right corner var homeButton = game.addChild(new GameButton('', 100, 100)); homeButton.x = 1850; // Upper right corner position (2048 - 198 to avoid top left menu area) homeButton.y = 200; // Near top of screen but below status bar homeButton.alpha = 0; // Replace the default button background with Home asset homeButton.removeChild(homeButton.children[0]); // Remove shadow homeButton.removeChild(homeButton.children[0]); // Remove background (index shifts after first removal) var homeAsset = LK.getAsset('Home', { anchorX: 0.5, anchorY: 0.5 }); homeButton.addChildAt(homeAsset, 0); // Create Logros button in bottom left of main menu var logrosButton = game.addChild(new GameButton('', 100, 100)); logrosButton.x = 200; // Bottom left corner position logrosButton.y = 2500; // Bottom of screen logrosButton.alpha = 0; // Replace the default button background with Logros asset logrosButton.removeChild(logrosButton.children[0]); // Remove shadow logrosButton.removeChild(logrosButton.children[0]); // Remove background (index shifts after first removal) var logrosAsset = LK.getAsset('Logros', { anchorX: 0.5, anchorY: 0.5 }); logrosButton.addChildAt(logrosAsset, 0); // Create RuedaP button in center of main menu var ruedaPButton = game.addChild(new GameButton('', 100, 100)); ruedaPButton.x = 1024; // Center position ruedaPButton.y = 2500; // Moved 200 pixels up from current position (2700 - 200) ruedaPButton.alpha = 0; // Replace the default button background with RuedaP asset ruedaPButton.removeChild(ruedaPButton.children[0]); // Remove shadow ruedaPButton.removeChild(ruedaPButton.children[0]); // Remove background (index shifts after first removal) var ruedaPAsset = LK.getAsset('RuedaP', { anchorX: 0.5, anchorY: 0.5 }); ruedaPButton.addChildAt(ruedaPAsset, 0); // Create Sugerencia button in bottom right of main menu var sugerenciaButton = game.addChild(new GameButton('', 100, 100)); sugerenciaButton.x = 1848; // Bottom right corner position sugerenciaButton.y = 2500; // Bottom of screen sugerenciaButton.alpha = 0; // Replace the default button background with Sugerencia asset sugerenciaButton.removeChild(sugerenciaButton.children[0]); // Remove shadow sugerenciaButton.removeChild(sugerenciaButton.children[0]); // Remove background (index shifts after first removal) var sugerenciaAsset = LK.getAsset('Sugerencia', { anchorX: 0.5, anchorY: 0.5 }); sugerenciaButton.addChildAt(sugerenciaAsset, 0); // Add deck and hands var gameDeck = game.addChild(new Deck()); gameDeck.x = 200; gameDeck.y = 1366; gameDeck.alpha = 0; // Add animated hands for dealing animations var dealerAnimatedHand = game.addChild(new AnimatedHand(true)); dealerAnimatedHand.x = 300; dealerAnimatedHand.y = 600; dealerAnimatedHand.alpha = 0; var playerAnimatedHand = game.addChild(new AnimatedHand(false)); playerAnimatedHand.x = 300; playerAnimatedHand.y = 2000; playerAnimatedHand.alpha = 0; // Score displays var playerScoreText = new Text2('Player: 0', { size: 36, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); playerScoreText.anchor.set(0.5, 0.5); playerScoreText.x = 1024; playerScoreText.y = 1850; playerScoreText.alpha = 0; game.addChild(playerScoreText); var dealerScoreText = new Text2('Dealer: 0', { size: 36, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); dealerScoreText.anchor.set(0.5, 0.5); dealerScoreText.x = 1024; dealerScoreText.y = 750; dealerScoreText.alpha = 0; game.addChild(dealerScoreText); // Create betting chips function createChips() { // Clear existing chips for (var i = 0; i < chips.length; i++) { chips[i].destroy(); } chips = []; var chipValues = [1, 5, 10, 25, 100, 500]; for (var i = 0; i < chipValues.length; i++) { var chip = new Chip(chipValues[i]); chip.x = (i - 2.5) * 120; // Spread chips horizontally with 20 more pixels separation chip.y = 300; // Move chips 300 pixels down chipContainer.addChild(chip); chips.push(chip); } updateChipSelection(); } function updateChipSelection() { // Update chip availability based on player money for (var i = 0; i < chips.length; i++) { chips[i].setEnabled(playerMoney >= chips[i].value); } // Update bet value display at center of TotalA asset betValueDisplay.setText('$' + currentBet); // Update deal button state based on bet amount - only show once per hand if (gameMode === 'blackjack' && !handInProgress) { if (currentBet === 0) { // Hide deal button when bet is zero tween(dealButton, { alpha: 0 }, { duration: 200 }); // Hide remove button when bet is zero tween(removeAsset, { alpha: 0 }, { duration: 200 }); } else { // Show deal button when bet is greater than zero and no hand in progress tween(dealButton, { alpha: 1 }, { duration: 200 }); // Show remove button when bet is greater than zero and no hand in progress tween(removeAsset, { alpha: 1 }, { duration: 200 }); } } } // Button event handlers blackjackButton.up = function () { if (gameMode !== 'menu') return; if (!blackjackButton.enabled) return; switchToBlackjack(); }; slotsButton.up = function () { if (gameMode !== 'menu') return; if (!slotsButton.enabled) return; switchToSlots(); }; hitButton.down = function (x, y, obj) { if (gameMode !== 'blackjack') return; if (gamePhase !== 'playing') return; playerHit(); }; standButton.down = function (x, y, obj) { if (gameMode !== 'blackjack') return; if (gamePhase !== 'playing') return; playerStand(); }; standButton.up = function (x, y, obj) { // Stand button up handler for additional reliability if (gameMode !== 'blackjack') return; if (gamePhase !== 'playing') return; // Only trigger if we haven't already processed this action if (gamePhase === 'playing') { playerStand(); } }; doubleButton.down = function (x, y, obj) { if (gameMode !== 'blackjack') return; if (gamePhase !== 'playing') return; if (playerMoney < currentBet) return; playerDouble(); }; homeButton.up = function () { if (!homeButton.enabled) return; switchToMenu(); }; logrosButton.up = function () { if (gameMode !== 'menu') return; if (!logrosButton.enabled) return; showAchievementsScreen(); }; ruedaPButton.up = function () { if (gameMode !== 'menu') return; if (!ruedaPButton.enabled) return; if (wheelScreenOpen) return; // Prevent re-entry if wheel is already open showWheelScreen(); }; sugerenciaButton.up = function () { if (gameMode !== 'menu') return; if (!sugerenciaButton.enabled) return; // TODO: Implement suggestion/help screen console.log('Sugerencia button clicked'); }; continueButton.up = function () { if (gameMode !== 'disclaimer') return; if (!continueButton.enabled) return; switchToMenu(); }; dealButton.down = function (x, y, obj) { if (gameMode !== 'blackjack') return; if (gamePhase !== 'betting') return; if (currentBet === 0) return; // Can't deal with zero bet // Hide deal button immediately when pressed dealButton.alpha = 0; startNewBlackjackHand(); }; spinButton.up = function () { if (gameMode !== 'slots') return; if (!spinButton.enabled) return; spinSlots(); }; // Game functions function updateMoneyDisplay() { moneyDisplay.setText('$' + playerMoney); playerMoneyDisplay.setText('$' + playerMoney); storage.playerMoney = playerMoney; updateMoneyDifferenceDisplay(); achievementSystem.checkAchievement('reach10k', playerMoney); // Update chip availability if in blackjack mode if (gameMode === 'blackjack' && chips.length > 0) { updateChipSelection(); } // Reset bet to 25 if current bet exceeds player money and we're in slots mode if (gameMode === 'slots' && currentBet > playerMoney) { currentBet = 25; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); spinButton.setEnabled(playerMoney >= currentBet); } // Reset bet in blackjack if current bet exceeds player money if (gameMode === 'blackjack' && currentBet > playerMoney) { // Find highest affordable chip value var affordableChips = [1, 5, 10, 25, 100, 500].filter(function (value) { return value <= playerMoney; }); if (affordableChips.length > 0) { currentBet = affordableChips[affordableChips.length - 1]; } else { currentBet = 1; } updateChipSelection(); } if (playerMoney >= 1000000) { LK.showYouWin(); } else if (playerMoney <= 0) { LK.showGameOver(); } } function updateMoneyDifferenceDisplay() { var difference = moneyAfterSpin - moneyAfterBet; moneyDifferenceDisplay.setText('$' + difference); // Text2 objects in LK don't have a style property - color is set during creation } function createDeck() { deck = []; var suits = ['hearts', 'diamonds', 'clubs', 'spades']; for (var s = 0; s < suits.length; s++) { for (var v = 1; v <= 13; v++) { deck.push({ suit: suits[s], value: v }); } } // Shuffle deck for (var i = deck.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = deck[i]; deck[i] = deck[j]; deck[j] = temp; } } function dealCard(isDealer, callback) { if (deck.length === 0) createDeck(); var cardData = deck.pop(); var card = isDealer ? new DealerCard(cardData.suit, cardData.value) : new Card(cardData.suit, cardData.value); var targetX, targetY; if (isDealer) { dealerCards.push(card); targetX = 930 + (dealerCards.length - 1) * 240; // Move dealer cards 20 pixels left (950 - 20) targetY = 500; } else { playerCards.push(card); targetX = 850 + (playerCards.length - 1) * 280; // Move player cards 50 pixels right (800 + 50) targetY = 2100; } card.x = targetX; card.y = targetY; card.alpha = 0; game.addChild(card); // Use animated hand for dealing var animatedHand = isDealer ? dealerAnimatedHand : playerAnimatedHand; if (isDealer) { animatedHand.dealCardFaceDown(targetX, targetY, function () { tween(card, { alpha: 1 }, { duration: 200, onFinish: function onFinish() { card.flip(); if (callback) callback(); } }); }); } else { animatedHand.dealCardToPlayer(targetX, targetY, function () { tween(card, { alpha: 1 }, { duration: 200, onFinish: function onFinish() { card.flip(); if (callback) callback(); } }); }); } return card; } function calculateHandValue(cards) { var value = 0; var aces = 0; for (var i = 0; i < cards.length; i++) { var cardValue = cards[i].getBlackjackValue(); if (cardValue === 11) aces++; value += cardValue; } // Adjust for aces while (value > 21 && aces > 0) { value -= 10; aces--; } return value; } function updateScoreDisplays() { var playerScore = calculateHandValue(playerCards); var dealerScore = calculateHandValue(dealerCards); playerScoreText.setText('Player: ' + playerScore); if (dealerCards.length > 0 && dealerCards[0].faceUp) { dealerScoreText.setText('Dealer: ' + dealerScore); } else if (dealerCards.length > 1) { var visibleScore = dealerCards[1].getBlackjackValue(); dealerScoreText.setText('Dealer: ' + visibleScore + ' + ?'); } } function crossFadeTransition(hideElements, showElements, callback) { var fadeOutComplete = 0; var totalFadeOut = hideElements.length; // Fade out old elements for (var i = 0; i < hideElements.length; i++) { tween(hideElements[i], { alpha: 0 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { fadeOutComplete++; if (fadeOutComplete === totalFadeOut) { // Start fading in new elements for (var j = 0; j < showElements.length; j++) { tween(showElements[j], { alpha: showElements[j].targetAlpha || 1 }, { duration: 400, delay: j * 50, easing: tween.easeInOut }); } if (callback) callback(); } } }); } } function switchToMenu() { gameMode = 'menu'; // Set background to match fondoM to prevent green strip game.setBackgroundColor(0x000000); // Re-enable buttons when entering menu (they were disabled during disclaimer) blackjackButton.setEnabled(true); slotsButton.setEnabled(true); logrosButton.setEnabled(true); ruedaPButton.setEnabled(true); sugerenciaButton.setEnabled(true); // Play Menu music only when entering main menu LK.playMusic('Menu'); tween(disclaimerTitle, { alpha: 0 }, { duration: 300 }); tween(disclaimerText1, { alpha: 0 }, { duration: 300 }); tween(disclaimerText2, { alpha: 0 }, { duration: 300 }); tween(disclaimerText3, { alpha: 0 }, { duration: 300 }); tween(disclaimerText4, { alpha: 0 }, { duration: 300 }); tween(disclaimerText5, { alpha: 0 }, { duration: 300 }); tween(disclaimerText6, { alpha: 0 }, { duration: 300 }); tween(disclaimerText7, { alpha: 0 }, { duration: 300 }); tween(disclaimerText8, { alpha: 0 }, { duration: 300 }); tween(continueButton, { alpha: 0 }, { duration: 300 }); // Hide all game elements tween(hitButton, { alpha: 0 }, { duration: 300 }); tween(standButton, { alpha: 0 }, { duration: 300 }); tween(doubleButton, { alpha: 0 }, { duration: 300 }); tween(playerScoreText, { alpha: 0 }, { duration: 300 }); tween(dealerScoreText, { alpha: 0 }, { duration: 300 }); // Classic slot reels removed (using Megaways only) tween(spinButton, { alpha: 0 }, { duration: 300 }); tween(gameDeck, { alpha: 0 }, { duration: 300 }); tween(dealerAnimatedHand, { alpha: 0 }, { duration: 300 }); tween(playerAnimatedHand, { alpha: 0 }, { duration: 300 }); // Show main menu background tween(fondoM, { alpha: 1 }, { duration: 300 }); // Show menu buttons tween(blackjackButton, { alpha: 1 }, { duration: 300 }); tween(slotsButton, { alpha: 1 }, { duration: 300 }); tween(welcomeAsset, { alpha: 1 }, { duration: 300 }); // Show new menu buttons tween(logrosButton, { alpha: 1 }, { duration: 300 }); tween(ruedaPButton, { alpha: 1 }, { duration: 300 }); tween(sugerenciaButton, { alpha: 1 }, { duration: 300 }); // Card display removed from menu // Hide table background tween(tableBackground, { alpha: 0 }, { duration: 300 }); // Hide slots background tween(slotsBackground, { alpha: 0 }, { duration: 300 }); // Hide tragamonedas asset in menu mode tween(tragamonedasAsset, { alpha: 0 }, { duration: 300 }); // Hide Monedero asset in menu mode tween(monederoAsset, { alpha: 0 }, { duration: 300 }); // Hide Monedero2 asset in menu mode tween(monedero2Asset, { alpha: 0 }, { duration: 300 }); // Hide total bet display in menu mode tween(totalBetDisplay, { alpha: 0 }, { duration: 300 }); // Hide mas asset in menu mode tween(masAsset, { alpha: 0 }, { duration: 300 }); // Hide menos asset in menu mode tween(menosAsset, { alpha: 0 }, { duration: 300 }); // Hide Megaways slot machine // Show Home button in blackjack mode tween(homeButton, { alpha: 1 }, { duration: 300 }); tween(megawaysSlotMachine, { alpha: 0 }, { duration: 300 }); // Hide Megaways displays tween(waysDisplay, { alpha: 0 }, { duration: 300 }); tween(winAmountDisplay, { alpha: 0 }, { duration: 300 }); tween(cascadeDisplay, { alpha: 0 }, { duration: 300 }); // Hide win amount display in menu mode tween(winAmountDisplay, { alpha: 0 }, { duration: 300 }); // Hide ways animation if showing if (waysAnimationDisplay) { tween(waysAnimationDisplay, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { if (waysAnimationDisplay) { waysAnimationDisplay.destroy(); waysAnimationDisplay = null; } } }); } // Hide cascade animation if showing if (cascadeAnimationDisplay) { tween(cascadeAnimationDisplay, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { if (cascadeAnimationDisplay) { cascadeAnimationDisplay.destroy(); cascadeAnimationDisplay = null; } } }); } // Hide money display in menu mode tween(moneyDisplay, { alpha: 0 }, { duration: 300 }); // Hide BalanceB asset in menu mode tween(balanceBAsset, { alpha: 0 }, { duration: 300 }); // Clear cards // Hide money difference display in menu mode tween(moneyDifferenceDisplay, { alpha: 0 }, { duration: 300 }); // Hide chips in menu mode tween(chipContainer, { alpha: 0 }, { duration: 300 }); // Hide Home button in menu mode tween(homeButton, { alpha: 0 }, { duration: 300 }); // Hide deal button in menu mode tween(dealButton, { alpha: 0 }, { duration: 300 }); // Hide Remove asset in menu mode tween(removeAsset, { alpha: 0 }, { duration: 300 }); // Hide TotalA asset in menu mode tween(totalAAsset, { alpha: 0 }, { duration: 300 }); // Hide bet value display in menu mode tween(betValueDisplay, { alpha: 0 }, { duration: 300 }); // Hide BalanceBJ asset in menu mode tween(balanceBJAsset, { alpha: 0 }, { duration: 300 }); // Hide player money display in menu mode tween(playerMoneyDisplay, { alpha: 0 }, { duration: 300 }); // Hide Apuesta asset in menu mode tween(apuestaAsset, { alpha: 0 }, { duration: 300 }); clearTable(); } function switchToBlackjack() { gameMode = 'blackjack'; gamePhase = 'betting'; // Reset bet to 0 when switching to blackjack currentBet = 0; // Play BJ music LK.playMusic('BJ'); // Hide menu buttons tween(blackjackButton, { alpha: 0 }, { duration: 300 }); tween(slotsButton, { alpha: 0 }, { duration: 300 }); tween(welcomeAsset, { alpha: 0 }, { duration: 300 }); // Hide new menu buttons tween(logrosButton, { alpha: 0 }, { duration: 300 }); tween(ruedaPButton, { alpha: 0 }, { duration: 300 }); tween(sugerenciaButton, { alpha: 0 }, { duration: 300 }); // Card display removed from menu // Hide main menu background tween(fondoM, { alpha: 0 }, { duration: 300 }); // Show table background tween(tableBackground, { alpha: 0.8 }, { duration: 300 }); // Ensure no unwanted coloring tableBackground.tint = 0xffffff; // Show blackjack UI tween(playerScoreText, { alpha: 1 }, { duration: 300 }); tween(dealerScoreText, { alpha: 1 }, { duration: 300 }); // Ensure stand button is properly interactive standButton.interactive = true; standButton.buttonMode = true; tween(gameDeck, { alpha: 1 }, { duration: 300 }); tween(dealerAnimatedHand, { alpha: 1 }, { duration: 300 }); tween(playerAnimatedHand, { alpha: 1 }, { duration: 300 }); // Hide total bet display in blackjack mode tween(totalBetDisplay, { alpha: 0 }, { duration: 300 }); // Hide Monedero2 asset in blackjack mode tween(monedero2Asset, { alpha: 0 }, { duration: 300 }); // Hide mas asset in blackjack mode tween(masAsset, { alpha: 0 }, { duration: 300 }); // Hide menos asset in blackjack mode tween(menosAsset, { alpha: 0 }, { duration: 300 }); // Hide money display in blackjack mode tween(moneyDisplay, { alpha: 0 }, { duration: 300 }); // Hide money difference display in blackjack mode tween(moneyDifferenceDisplay, { alpha: 0 }, { duration: 300 }); // Hide BalanceB asset in blackjack mode tween(balanceBAsset, { alpha: 0 }, { duration: 300 }); // Show Home button in blackjack mode tween(homeButton, { alpha: 1 }, { duration: 300 }); // Show Remove asset in blackjack mode tween(removeAsset, { alpha: 1 }, { duration: 300 }); // Show TotalA asset in blackjack mode tween(totalAAsset, { alpha: 1 }, { duration: 300 }); // Show bet value display in blackjack mode tween(betValueDisplay, { alpha: 1 }, { duration: 300 }); // Show BalanceBJ asset in blackjack mode tween(balanceBJAsset, { alpha: 1 }, { duration: 300 }); // Show player money display in blackjack mode tween(playerMoneyDisplay, { alpha: 1 }, { duration: 300 }); // Show Apuesta asset in blackjack mode tween(apuestaAsset, { alpha: 1 }, { duration: 300 }); // Show deal button in blackjack mode only if bet is greater than zero if (currentBet > 0) { tween(dealButton, { alpha: 1 }, { duration: 300 }); } else { dealButton.alpha = 0; // Keep hidden if no bet } // Show chips and bet display tween(chipContainer, { alpha: 1 }, { duration: 300 }); // Create chips if not already created if (chips.length === 0) { createChips(); } else { updateChipSelection(); } } function switchToSlots() { gameMode = 'slots'; // Play SpinM music LK.playMusic('SpinM'); // Hide menu buttons tween(blackjackButton, { alpha: 0 }, { duration: 300 }); tween(slotsButton, { alpha: 0 }, { duration: 300 }); tween(welcomeAsset, { alpha: 0 }, { duration: 300 }); // Hide new menu buttons tween(logrosButton, { alpha: 0 }, { duration: 300 }); tween(ruedaPButton, { alpha: 0 }, { duration: 300 }); tween(sugerenciaButton, { alpha: 0 }, { duration: 300 }); // Card display removed from menu // Hide main menu background tween(fondoM, { alpha: 0 }, { duration: 300 }); // Show slots background (same as main menu) tween(fondoM, { alpha: 1 }, { duration: 300 }); // Show tragamonedas asset in slots mode tween(tragamonedasAsset, { alpha: 1 }, { duration: 300 }); // Show Monedero asset in slots mode tween(monederoAsset, { alpha: 1 }, { duration: 300 }); // Show Monedero2 asset in slots mode tween(monedero2Asset, { alpha: 1 }, { duration: 300 }); // Show total bet display in slots mode tween(totalBetDisplay, { alpha: 1 }, { duration: 300 }); // Show mas asset in slots mode tween(masAsset, { alpha: 1 }, { duration: 300 }); // Show menos asset in slots mode tween(menosAsset, { alpha: 1 }, { duration: 300 }); // Show Megaways slot machine tween(megawaysSlotMachine, { alpha: 1 }, { duration: 300 }); // Hide win amount display in slots mode tween(winAmountDisplay, { alpha: 0 }, { duration: 300 }); // Keep cascade display hidden (will show via animation when needed) // Show slots UI (classic reels removed - using Megaways only) tween(spinButton, { alpha: 1 }, { duration: 300 }); // Set minimum bet to 25 when switching to slots if (currentBet < 25) { currentBet = 25; } // Reset bet to 25 if current bet exceeds player money when switching to slots if (currentBet > playerMoney) { currentBet = 25; } // Always set bet to 25 and update displays when entering slots currentBet = 25; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); console.log('Setting spin button enabled - playerMoney:', playerMoney, 'currentBet:', currentBet, 'enabled:', playerMoney >= currentBet); spinButton.setEnabled(playerMoney >= currentBet); // Show money difference display in slots mode tween(moneyDifferenceDisplay, { alpha: 1 }, { duration: 300 }); // Show Home button in slots mode tween(homeButton, { alpha: 1 }, { duration: 300 }); // Show money display in slots mode tween(moneyDisplay, { alpha: 1 }, { duration: 300 }); // Show BalanceB asset in slots mode tween(balanceBAsset, { alpha: 1 }, { duration: 300 }); // Hide deal button in slots mode tween(dealButton, { alpha: 0 }, { duration: 300 }); // Hide Remove asset in slots mode tween(removeAsset, { alpha: 0 }, { duration: 300 }); // Hide TotalA asset in slots mode tween(totalAAsset, { alpha: 0 }, { duration: 300 }); // Hide bet value display in slots mode tween(betValueDisplay, { alpha: 0 }, { duration: 300 }); // Hide BalanceBJ asset in slots mode tween(balanceBJAsset, { alpha: 0 }, { duration: 300 }); // Hide player money display in slots mode tween(playerMoneyDisplay, { alpha: 0 }, { duration: 300 }); // Hide Apuesta asset in slots mode tween(apuestaAsset, { alpha: 0 }, { duration: 300 }); // Update ways display // Hide chips and bet display tween(chipContainer, { alpha: 0 }, { duration: 300 }); // Hide chips and bet display tween(chipContainer, { alpha: 0 }, { duration: 300 }); waysDisplay.setText(megawaysSlotMachine.getWaysText()); cascadeDisplay.setText(''); } function clearTable() { // Remove all cards for (var i = 0; i < playerCards.length; i++) { playerCards[i].destroy(); } for (var i = 0; i < dealerCards.length; i++) { dealerCards[i].destroy(); } playerCards = []; dealerCards = []; } function showBetConfirmation(callback) { var betPercentage = currentBet / playerMoney * 100; // Create confirmation overlay var confirmationOverlay = LK.getAsset('warning', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); confirmationOverlay.x = 1024; confirmationOverlay.y = 1366; confirmationOverlay.alpha = 0; game.addChild(confirmationOverlay); var warningText = new Text2('⚠️ HIGH BET WARNING ⚠️', { size: 48, fill: '#FF0000', font: "'Arial Black', Arial, sans-serif" }); warningText.anchor.set(0.5, 0.5); warningText.x = 1024; warningText.y = 1200; warningText.alpha = 0; game.addChild(warningText); var percentageText = new Text2('You are betting ' + Math.round(betPercentage) + '% of your money!', { size: 36, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); percentageText.anchor.set(0.5, 0.5); percentageText.x = 1024; percentageText.y = 1300; percentageText.alpha = 0; game.addChild(percentageText); var confirmButton = new GameButton('CONFIRM BET', 200, 80); confirmButton.x = 824; confirmButton.y = 1450; confirmButton.alpha = 0; game.addChild(confirmButton); var cancelButton = new GameButton('CANCEL', 200, 80); cancelButton.x = 1224; cancelButton.y = 1450; cancelButton.alpha = 0; game.addChild(cancelButton); // Animate in tween(confirmationOverlay, { alpha: 0.9 }, { duration: 300 }); tween(warningText, { alpha: 1 }, { duration: 300, delay: 100 }); tween(percentageText, { alpha: 1 }, { duration: 300, delay: 200 }); tween(confirmButton, { alpha: 1 }, { duration: 300, delay: 300 }); tween(cancelButton, { alpha: 1 }, { duration: 300, delay: 300 }); function cleanup() { confirmationOverlay.destroy(); warningText.destroy(); percentageText.destroy(); confirmButton.destroy(); cancelButton.destroy(); } confirmButton.up = function () { confirmedHighBet = true; cleanup(); if (callback) callback(true); }; cancelButton.up = function () { cleanup(); if (callback) callback(false); }; } function startNewBlackjackHand() { if (playerMoney < currentBet) return; // Check for high bet confirmation (50% or more of money) if (!confirmedHighBet && currentBet >= playerMoney * 0.5) { showBetConfirmation(function (confirmed) { if (confirmed) { confirmedHighBet = true; achievementSystem.checkAchievement('bigSpender', currentBet); proceedWithDeal(); } else { // Reset bet to a safer amount currentBet = Math.min(currentBet, Math.floor(playerMoney * 0.25)); updateChipSelection(); } confirmedHighBet = false; }); return; } achievementSystem.checkAchievement('bigSpender', currentBet); proceedWithDeal(); } function proceedWithDeal() { // Set hand in progress flag to prevent deal button from reappearing handInProgress = true; // Hide deal button immediately when pressed tween(dealButton, { alpha: 0 }, { duration: 200 }); // Hide Remove button when cards are dealt tween(removeAsset, { alpha: 0 }, { duration: 200 }); playerMoney -= currentBet; updateMoneyDisplay(); clearTable(); createDeck(); gameDeck.updateCount(52); gamePhase = 'dealing'; // Deal initial cards with animation sequence dealCard(false, function () { dealCard(true, function () { dealCard(false, function () { dealCard(true, function () { // Dealer's first card stays face down if (dealerCards.length > 0) { dealerCards[0].faceUp = true; dealerCards[0].flip(); } updateScoreDisplays(); finishDealingPhase(); }); }); }); }); function finishDealingPhase() { var playerScore = calculateHandValue(playerCards); if (playerScore === 21) { endHand(); } else { gamePhase = 'playing'; // Show action buttons tween(hitButton, { alpha: 1 }, { duration: 300 }); tween(standButton, { alpha: 1 }, { duration: 300, onFinish: function onFinish() { // Ensure stand button is interactive when shown standButton.interactive = true; standButton.buttonMode = true; } }); if (playerMoney >= currentBet) { tween(doubleButton, { alpha: 1 }, { duration: 300 }); } else { // Keep double button hidden if insufficient funds doubleButton.alpha = 0; } // Hide deal button during hand tween(dealButton, { alpha: 0 }, { duration: 300 }); } } } function playerHit() { var targetX = 850 + playerCards.length * 280; // Update to match new player card position (800 + 50) var targetY = 2100; // Animate table tapping gesture first tween(playerAnimatedHand, { y: playerAnimatedHand.y + 50, scaleX: 1.1, scaleY: 1.1 }, { duration: 150, onFinish: function onFinish() { tween(playerAnimatedHand, { y: playerAnimatedHand.y - 50, scaleX: 1.0, scaleY: 1.0 }, { duration: 150, onFinish: function onFinish() { // Now just deal the card without additional animation dealCard(false, function () { updateScoreDisplays(); var playerScore = calculateHandValue(playerCards); if (playerScore > 21) { endHand(); } else if (playerScore === 21) { playerStand(); } }); } }); } }); // Hide double button after hit since it's no longer available doubleButton.alpha = 0; } function playerStand() { gamePhase = 'dealer'; // Animate negation gesture (wave hand side to side) tween(playerAnimatedHand, { x: playerAnimatedHand.x - 30, rotation: -0.2 }, { duration: 200, onFinish: function onFinish() { tween(playerAnimatedHand, { x: playerAnimatedHand.x + 60, rotation: 0.2 }, { duration: 200, onFinish: function onFinish() { tween(playerAnimatedHand, { x: playerAnimatedHand.x - 30, rotation: 0 }, { duration: 200, onFinish: function onFinish() { // Continue with original stand gesture playerAnimatedHand.standGesture(); } }); } }); } }); // Hide action buttons tween(hitButton, { alpha: 0 }, { duration: 300 }); tween(standButton, { alpha: 0 }, { duration: 300 }); tween(doubleButton, { alpha: 0 }, { duration: 300 }); // Reveal dealer's face-down card with flip animation if (dealerCards.length > 0) { dealerAnimatedHand.flipCard(dealerCards[0].x, dealerCards[0].y, function () { dealerCards[0].flip(); updateScoreDisplays(); // Dealer plays LK.setTimeout(function () { playDealerTurn(); }, 1000); }); } else { updateScoreDisplays(); // Dealer plays LK.setTimeout(function () { playDealerTurn(); }, 1000); } } function playerDouble() { if (playerMoney < currentBet) return; playerMoney -= currentBet; currentBet *= 2; updateMoneyDisplay(); var targetX = 850 + playerCards.length * 280; // Update to match new player card position (800 + 50) var targetY = 2100; // Animate two fingers gesture first tween(playerAnimatedHand, { scaleX: 1.2, scaleY: 1.2, rotation: 0.1 }, { duration: 300, onFinish: function onFinish() { tween(playerAnimatedHand, { scaleX: 1.0, scaleY: 1.0, rotation: 0 }, { duration: 300, onFinish: function onFinish() { // Now animate double down gesture with chips and card playerAnimatedHand.doubleDownGesture(targetX, targetY, function () { dealCard(false, function () { updateScoreDisplays(); var playerScore = calculateHandValue(playerCards); if (playerScore > 21) { endHand(); } else { playerStand(); } }); }); } }); } }); } function playDealerTurn() { var dealerScore = calculateHandValue(dealerCards); if (dealerScore < 17) { dealCard(true, function () { updateScoreDisplays(); LK.setTimeout(function () { playDealerTurn(); }, 1000); }); } else { endHand(); } } function endHand() { gamePhase = 'finished'; var playerScore = calculateHandValue(playerCards); var dealerScore = calculateHandValue(dealerCards); var winnings = 0; var playerWon = false; if (playerScore > 21) { // Player busts consecutiveWins = 0; } else if (dealerScore > 21) { winnings = currentBet * 2; playerWon = true; } else if (playerScore > dealerScore) { winnings = currentBet * 2; playerWon = true; } else if (playerScore < dealerScore) { // Dealer wins consecutiveWins = 0; } else { winnings = currentBet; playerWon = true; } if (playerWon) { consecutiveWins++; achievementSystem.checkAchievement('firstBlackjackWin', true); achievementSystem.checkAchievement('luckyStreak', consecutiveWins); storage.consecutiveWins = consecutiveWins; } if (winnings > 0) { playerMoney += winnings; LK.getSound('coinWin').play(); createCoinAnimation(1024, 1366); } currentBet = 0; updateMoneyDisplay(); // Collect cards animation after 2 seconds LK.setTimeout(function () { var cardPositions = []; var allCards = []; // Collect player cards positions for (var i = 0; i < playerCards.length; i++) { cardPositions.push({ x: playerCards[i].x, y: playerCards[i].y }); allCards.push(playerCards[i]); } // Collect dealer cards positions for (var i = 0; i < dealerCards.length; i++) { cardPositions.push({ x: dealerCards[i].x, y: dealerCards[i].y }); allCards.push(dealerCards[i]); } // Animate collecting cards dealerAnimatedHand.collectCards(cardPositions, allCards, function () { // Clear actual cards from game after collection animation clearTable(); // Shuffle animation dealerAnimatedHand.shuffleAnimation(); }); }, 1500); // Reset game phase after dealing sequence LK.setTimeout(function () { gamePhase = 'betting'; handInProgress = false; // Reset hand in progress flag // Re-enable deal button only if still in blackjack mode and bet is greater than zero if (gameMode === 'blackjack' && currentBet > 0) { tween(dealButton, { alpha: 1 }, { duration: 300 }); } }, 2000); } function spinSlots() { // Debug logging to identify the exact issue console.log('spinSlots called - playerMoney:', playerMoney, 'currentBet:', currentBet, 'isSpinning:', megawaysSlotMachine.isSpinning); // Reset bet to 25 immediately if current bet exceeds player money if (currentBet > playerMoney) { currentBet = 25; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); console.log('Bet reset to 25 - new currentBet:', currentBet); } if (playerMoney < currentBet) { console.log('Insufficient funds - playerMoney:', playerMoney, 'currentBet:', currentBet); return; } if (megawaysSlotMachine.isSpinning) { console.log('Already spinning - isSpinning:', megawaysSlotMachine.isSpinning); return; } // Reset money difference values to 0 at start of new spin moneyAfterBet = 0; moneyAfterSpin = 0; updateMoneyDifferenceDisplay(); playerMoney -= currentBet; moneyAfterBet = playerMoney; // Track money after betting moneyAfterSpin = playerMoney; // Keep at same value until spin results are processed updateMoneyDisplay(); totalBetDisplay.setText('$' + currentBet); // Update total bet display for slots spinButton.setEnabled(false); messageDisplay.setText('Spinning...'); // Hide cascade display cascadeDisplay.alpha = 0; megawaysSlotMachine.totalWinAmount = 0; megawaysSlotMachine.cascadeCount = 0; lastCascadeCount = 0; // Animate spin button tween(spinButton, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100, onFinish: function onFinish() { tween(spinButton, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); } }); LK.getSound('slotSpin').play(); // Start Megaways spin megawaysSlotMachine.spinAllReels(function () { // Show ways animation if significantly increased showWaysAnimation(megawaysSlotMachine.currentWays); // Check for wins and start cascade sequence var winningCombos = megawaysSlotMachine.checkForWins(); if (winningCombos.length > 0) { messageDisplay.setText('WINNING SPIN!'); processInitialWins(winningCombos); } else { messageDisplay.setText('No win. Try again!'); console.log('No wins - playerMoney:', playerMoney, 'currentBet:', currentBet, 'enabling button:', playerMoney >= currentBet); spinButton.setEnabled(playerMoney >= currentBet); // Reset bet to 25 if current bet exceeds player money after spin if (currentBet > playerMoney) { currentBet = 25; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); } } }); } function processInitialWins(winningCombinations) { megawaysSlotMachine.processWins(winningCombinations, function (winAmount) { if (winAmount > 0) { // Show cascade animation when significantly increased showCascadeAnimation(megawaysSlotMachine.cascadeCount); // Check cascade achievement achievementSystem.checkAchievement('cascade5x', megawaysSlotMachine.cascadeCount); // Add winnings to player money playerMoney += winAmount; moneyAfterSpin = playerMoney; // Track money after spin results updateMoneyDisplay(); // Play win sound and create coin animation LK.getSound('coinWin').play(); createCoinAnimation(1024, 1366); } // Re-enable spin button after all cascades complete LK.setTimeout(function () { // Reset bet to 25 if current bet exceeds player money after all cascades if (currentBet > playerMoney) { currentBet = 25; totalBetDisplay.setText('$' + currentBet); spinButton.setText('SPIN $' + currentBet); } console.log('After cascades - playerMoney:', playerMoney, 'currentBet:', currentBet, 'enabling button:', playerMoney >= currentBet); spinButton.setEnabled(playerMoney >= currentBet); if (megawaysSlotMachine.totalWinAmount > 0) { if (megawaysSlotMachine.totalWinAmount >= 1000) { messageDisplay.setText('🎊 MEGA WIN! $' + megawaysSlotMachine.totalWinAmount + ' 🎊'); } else if (megawaysSlotMachine.totalWinAmount >= 500) { messageDisplay.setText('💰 BIG WIN! $' + megawaysSlotMachine.totalWinAmount + ' 💰'); } else { messageDisplay.setText('✨ WIN! $' + megawaysSlotMachine.totalWinAmount + ' ✨'); } } else { messageDisplay.setText(''); } }, 1000); }); } function checkSlotWin(s1, s2, s3) { var symbols = ['cherry', 'lemon', 'grape', 'seven', 'bell', 'diamond', 'bar', 'dollar']; var symbolNames = ['🍒', '🍋', '🍇', '7', '🔔', '💎', 'BAR', '$']; var winnings = 0; var isWin = false; // Check for wins if (s1 === s2 && s2 === s3) { // Three of a kind isWin = true; if (symbols[s1] === 'seven') { winnings = 500; messageDisplay.setText('🎰 JACKPOT! Triple 7s! 🎰'); } else if (symbols[s1] === 'dollar') { winnings = 300; messageDisplay.setText('💰 Big Win! Triple $$$ 💰'); } else if (symbols[s1] === 'diamond') { winnings = 250; messageDisplay.setText('💎 Diamond Jackpot! 💎'); } else if (symbols[s1] === 'bell') { winnings = 200; messageDisplay.setText('🔔 Triple Bells! 🔔'); } else { winnings = 100; messageDisplay.setText('🎉 Three of a kind! 🎉'); } } else if (s1 === s2 || s2 === s3 || s1 === s3) { // Pair isWin = true; winnings = 50; messageDisplay.setText('✨ Pair! Small win! ✨'); } else { messageDisplay.setText('No win. Try again!'); } if (isWin) { // Flash message display tween(messageDisplay, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(messageDisplay, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); } if (winnings > 0) { playerMoney += winnings; LK.getSound('coinWin').play(); createCoinAnimation(1024, 1366); updateMoneyDisplay(); } } function showWaysAnimation(currentWays) { // Only show animation if ways increased significantly (by at least 10,000) if (currentWays > lastWaysCount + 10000) { // Destroy existing animation if any if (waysAnimationDisplay) { waysAnimationDisplay.destroy(); waysAnimationDisplay = null; } // Create animated ways display waysAnimationDisplay = new Text2(currentWays + ' WAYS!', { size: 72, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); waysAnimationDisplay.anchor.set(0.5, 0.5); waysAnimationDisplay.x = 1024; waysAnimationDisplay.y = 900; waysAnimationDisplay.alpha = 0; waysAnimationDisplay.scaleX = 0.5; waysAnimationDisplay.scaleY = 0.5; game.addChild(waysAnimationDisplay); // Animate popup entrance tween(waysAnimationDisplay, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { // Hold for 1 second LK.setTimeout(function () { // Animate fadeout tween(waysAnimationDisplay, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 500, onFinish: function onFinish() { if (waysAnimationDisplay) { waysAnimationDisplay.destroy(); waysAnimationDisplay = null; } } }); }, 1000); } }); } lastWaysCount = currentWays; } function showCascadeAnimation(currentCascadeCount) { // Only show animation if cascade count increased (any increase) if (currentCascadeCount > lastCascadeCount) { // Destroy existing cascade animation if any if (cascadeAnimationDisplay) { cascadeAnimationDisplay.destroy(); cascadeAnimationDisplay = null; } // Create animated cascade display cascadeAnimationDisplay = new Text2('CASCADE x' + currentCascadeCount + '!', { size: 72, fill: '#FF6347', font: "'Arial Black', Arial, sans-serif" }); cascadeAnimationDisplay.anchor.set(0.5, 0.5); cascadeAnimationDisplay.x = 1024; cascadeAnimationDisplay.y = 800; cascadeAnimationDisplay.alpha = 0; cascadeAnimationDisplay.scaleX = 0.5; cascadeAnimationDisplay.scaleY = 0.5; game.addChild(cascadeAnimationDisplay); // Animate popup entrance tween(cascadeAnimationDisplay, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { // Hold for 1 second LK.setTimeout(function () { // Animate fadeout tween(cascadeAnimationDisplay, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 500, onFinish: function onFinish() { if (cascadeAnimationDisplay) { cascadeAnimationDisplay.destroy(); cascadeAnimationDisplay = null; } } }); }, 1000); } }); } lastCascadeCount = currentCascadeCount; } function createCoinAnimation(x, y) { for (var i = 0; i < 5; i++) { var coin = LK.getAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); coin.x = x + (Math.random() - 0.5) * 200; coin.y = y + (Math.random() - 0.5) * 200; game.addChild(coin); tween(coin, { y: coin.y - 100, alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 1000, onFinish: function onFinish() { coin.destroy(); } }); } } // Card display removed from menu // Initialize game state updateMoneyDisplay(); // Add global click handler for disclaimer screen game.down = function (x, y, obj) { if (gameMode === 'disclaimer') { switchToMenu(); } }; // Start with disclaimer screen if (gameMode === 'disclaimer') { // Hide all menu elements initially blackjackButton.alpha = 0; slotsButton.alpha = 0; welcomeAsset.alpha = 0; fondoM.alpha = 0; logrosButton.alpha = 0; ruedaPButton.alpha = 0; sugerenciaButton.alpha = 0; // Disable buttons during disclaimer screen blackjackButton.setEnabled(false); slotsButton.setEnabled(false); logrosButton.setEnabled(false); ruedaPButton.setEnabled(false); sugerenciaButton.setEnabled(false); } else { switchToMenu(); } // Menu music will be played when entering main menu via switchToMenu function game.update = function () { updateMoneyDisplay(); }; // Wheel prize definitions var wheelPrizes = [{ type: 'credits', amount: 200, name: '+200 Credits', probability: 40, color: 0x4CAF50 }, { type: 'credits', amount: 500, name: '+500 Credits', probability: 25, color: 0x2196F3 }, { type: 'credits', amount: 1000, name: '+1,000 Credits', probability: 10, color: 0x9C27B0 }, { type: 'credits', amount: 2500, name: '+2,500 Credits', probability: 5, color: 0xFF5722 }, { type: 'freespins', amount: 3, name: '+3 Free Spins', probability: 10, color: 0xFFC107 }, { type: 'freespins', amount: 10, name: '+10 Free Spins', probability: 5, color: 0xE91E63 }, { type: 'blackjackchips', amount: 250, name: '+250 Blackjack Chips', probability: 4, color: 0x795548 }, { type: 'credits', amount: 10000, name: '+10,000 Credits (JACKPOT)', probability: 1, color: 0xFFD700 }]; function showWheelScreen() { // Set wheel screen as open to prevent re-entry wheelScreenOpen = true; // Disable blackjack and slots buttons when wheel opens blackjackButton.setEnabled(false); slotsButton.setEnabled(false); // Create dark overlay background var wheelOverlay = LK.getAsset('warning', { anchorX: 0.5, anchorY: 0.5, alpha: 0.95 }); wheelOverlay.x = 1024; wheelOverlay.y = 1366; wheelOverlay.alpha = 0; game.addChild(wheelOverlay); // Create title var wheelTitle = new Text2('🎡 FORTUNE WHEEL 🎡', { size: 72, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); wheelTitle.anchor.set(0.5, 0.5); wheelTitle.x = 1024; wheelTitle.y = 400; wheelTitle.alpha = 0; game.addChild(wheelTitle); // Create wheel container var wheelContainer = new Container(); wheelContainer.x = 1024; wheelContainer.y = 1000; wheelContainer.alpha = 0; game.addChild(wheelContainer); // Create wheel base var wheelBase = LK.getAsset('circularSpinButtonShadow', { anchorX: 0.5, anchorY: 0.5, width: 1800, height: 1836 }); wheelContainer.addChild(wheelBase); // Create wheel pointer using Flecha asset outside the wheel container so it doesn't rotate var wheelPointer = LK.getAsset('Flecha', { anchorX: 0.5, anchorY: 1.0 }); wheelPointer.x = 1024; // Position at center of screen wheelPointer.y = 250; // 750 pixels above wheel center (1000 - 750) wheelPointer.alpha = 0; game.addChild(wheelPointer); // Add to game instead of wheelContainer // Create RuedaVerificador asset at same position as Flecha var ruedaVerificador = LK.getAsset('RuedaVerificador', { anchorX: 0.5, anchorY: 1.0 }); ruedaVerificador.x = 1024; // Same position as wheelPointer ruedaVerificador.y = 450; // Moved down 200 pixels from wheelPointer position ruedaVerificador.alpha = 0; game.addChild(ruedaVerificador); // Create wheel segments var segmentAngle = Math.PI * 2 / wheelPrizes.length; var wheelSegments = []; for (var i = 0; i < wheelPrizes.length; i++) { var angle = i * segmentAngle; var radius = 600; // Add prize text var prizeText = new Text2(wheelPrizes[i].name, { size: 60, fill: '#FFFFFF', font: "'Arial Black', Arial, sans-serif" }); prizeText.anchor.set(0.5, 0.5); prizeText.x = Math.cos(angle) * radius; prizeText.y = Math.sin(angle) * radius; prizeText.rotation = angle + Math.PI / 2; wheelContainer.addChild(prizeText); wheelSegments.push(prizeText); } // Create spin button var wheelSpinButton = new GameButton('SPIN WHEEL', 300, 100); wheelSpinButton.x = 1024; wheelSpinButton.y = 1600; wheelSpinButton.alpha = 0; game.addChild(wheelSpinButton); // Create close button var wheelCloseButton = new GameButton('CLOSE', 200, 80); wheelCloseButton.x = 1024; wheelCloseButton.y = 1800; wheelCloseButton.alpha = 0; game.addChild(wheelCloseButton); // Animate in tween(wheelOverlay, { alpha: 0.95 }, { duration: 300 }); tween(wheelTitle, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 400, delay: 100, easing: tween.bounceOut, onFinish: function onFinish() { tween(wheelTitle, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); tween(wheelContainer, { alpha: 1 }, { duration: 400, delay: 200 }); tween(wheelPointer, { alpha: 1 }, { duration: 400, delay: 250 }); tween(ruedaVerificador, { alpha: 1 }, { duration: 400, delay: 250 }); tween(wheelSpinButton, { alpha: 1 }, { duration: 300, delay: 400 }); tween(wheelCloseButton, { alpha: 1 }, { duration: 300, delay: 500 }); // Spin wheel handler wheelSpinButton.up = function () { if (!wheelSpinButton.enabled) return; wheelSpinButton.setEnabled(false); // Just spin the wheel randomly - let the text collision determine the winner var minFullSpins = 8; var extraSpins = Math.random() * 5; // Add 0-5 extra spins for variety var randomAngle = Math.random() * Math.PI * 2; // Random final angle var totalSpins = minFullSpins + extraSpins; var finalRotation = Math.PI * 2 * totalSpins + randomAngle; console.log('Spinning wheel with random rotation:', finalRotation * 180 / Math.PI, 'degrees'); // Animate wheel spin to random final position tween(wheelContainer, { rotation: finalRotation }, { duration: 4000, easing: tween.easeOut, onFinish: function onFinish() { // Wait a moment for wheel to settle LK.setTimeout(function () { // Now detect which text is actually touching RuedaVerificador var actualPrize = detectPrizeUnderVerificador(wheelContainer, ruedaVerificador, wheelSegments); console.log('Wheel stopped. Text under RuedaVerificador:', actualPrize.prize.name, 'at segment index:', actualPrize.index); // Award the prize that's actually colliding with the verificador awardWheelPrize(actualPrize.prize); // Show result var resultText = new Text2('YOU WON: ' + actualPrize.prize.name + '!', { size: 48, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); resultText.anchor.set(0.5, 0.5); resultText.x = 1024; resultText.y = 1400; resultText.alpha = 0; game.addChild(resultText); tween(resultText, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.bounceOut, onFinish: function onFinish() { LK.setTimeout(function () { tween(resultText, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { resultText.destroy(); } }); }, 2000); } }); wheelSpinButton.setEnabled(true); }, 500); // Small delay to ensure wheel has settled } }); }; // Close handler function closeWheelScreen() { // Reset wheel screen state to allow re-entry wheelScreenOpen = false; // Re-enable blackjack and slots buttons when wheel closes blackjackButton.setEnabled(true); slotsButton.setEnabled(true); var allElements = [wheelOverlay, wheelTitle, wheelContainer, wheelPointer, ruedaVerificador, wheelSpinButton, wheelCloseButton]; var elementsToDestroy = 0; var totalElements = allElements.length; for (var i = 0; i < allElements.length; i++) { tween(allElements[i], { alpha: 0 }, { duration: 300, delay: i * 20, onFinish: function onFinish() { elementsToDestroy++; if (elementsToDestroy === totalElements) { for (var j = 0; j < allElements.length; j++) { if (allElements[j] && allElements[j].destroy) { allElements[j].destroy(); } } } } }); } } wheelCloseButton.up = closeWheelScreen; } function selectRandomPrize() { // Select a random prize for initial spin calculation (still used for rotation) var random = Math.random() * 100; var cumulativeProbability = 0; var selectedPrizeIndex = 0; for (var i = 0; i < wheelPrizes.length; i++) { cumulativeProbability += wheelPrizes[i].probability; if (random <= cumulativeProbability) { selectedPrizeIndex = i; break; } } return { prize: wheelPrizes[selectedPrizeIndex], index: selectedPrizeIndex }; } function detectPrizeUnderVerificador(wheelContainer, ruedaVerificador, wheelSegments) { // Find which text segment intersects with RuedaVerificador using actual collision detection var closestSegment = null; var minDistance = Infinity; var winningIndex = 0; for (var i = 0; i < wheelSegments.length; i++) { var segment = wheelSegments[i]; // Check if the text segment intersects with RuedaVerificador if (segment.intersects && segment.intersects(ruedaVerificador)) { // Direct collision detected - this is our winner return { prize: wheelPrizes[i], index: i }; } // Fallback: calculate distance to RuedaVerificador as backup var segmentGlobalPos = wheelContainer.toGlobal(segment.position); var verificadorGlobalPos = ruedaVerificador.position; var distance = Math.sqrt(Math.pow(segmentGlobalPos.x - verificadorGlobalPos.x, 2) + Math.pow(segmentGlobalPos.y - verificadorGlobalPos.y, 2)); if (distance < minDistance) { minDistance = distance; closestSegment = i; winningIndex = i; } } // If no direct collision found, use closest segment return { prize: wheelPrizes[winningIndex], index: winningIndex }; } function awardWheelPrize(prize) { switch (prize.type) { case 'credits': playerMoney += prize.amount; updateMoneyDisplay(); LK.getSound('coinWin').play(); createCoinAnimation(1024, 1366); break; case 'freespins': // TODO: Implement free spins system console.log('Awarded ' + prize.amount + ' free spins'); break; case 'blackjackchips': playerMoney += prize.amount; updateMoneyDisplay(); LK.getSound('coinWin').play(); createCoinAnimation(1024, 1366); break; } } function showAchievementsScreen() { // Create dark overlay background var achievementOverlay = LK.getAsset('warning', { anchorX: 0.5, anchorY: 0.5, alpha: 0.95 }); achievementOverlay.x = 1024; achievementOverlay.y = 1366; achievementOverlay.alpha = 0; game.addChild(achievementOverlay); // Create title var achievementTitle = new Text2('🏆 ACHIEVEMENTS 🏆', { size: 72, fill: '#FFD700', font: "'Arial Black', Arial, sans-serif" }); achievementTitle.anchor.set(0.5, 0.5); achievementTitle.x = 1024; achievementTitle.y = 500; achievementTitle.alpha = 0; game.addChild(achievementTitle); // Create achievement displays var yPosition = 750; var achievementDisplays = []; for (var key in achievementSystem.achievements) { var achievement = achievementSystem.achievements[key]; // Achievement container var achievementBg = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, width: 1400, height: 200, alpha: achievement.unlocked ? 1.0 : 0.4 }); achievementBg.x = 1024; achievementBg.y = yPosition; achievementBg.alpha = 0; game.addChild(achievementBg); achievementDisplays.push(achievementBg); // Achievement icon/status var statusIcon = new Text2(achievement.unlocked ? '✅' : '🔒', { size: 48, fill: achievement.unlocked ? '#00FF00' : '#888888', font: "'Arial Black', Arial, sans-serif" }); statusIcon.anchor.set(0.5, 0.5); statusIcon.x = 400; statusIcon.y = yPosition - 30; statusIcon.alpha = 0; game.addChild(statusIcon); achievementDisplays.push(statusIcon); // Achievement title var titleText = new Text2(achievement.title, { size: 42, fill: achievement.unlocked ? '#FFD700' : '#CCCCCC', font: "'Arial Black', Arial, sans-serif" }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = yPosition - 30; titleText.alpha = 0; game.addChild(titleText); achievementDisplays.push(titleText); // Achievement description var descText = new Text2(achievement.description, { size: 32, fill: achievement.unlocked ? '#FFFFFF' : '#999999', font: "'Arial Black', Arial, sans-serif" }); descText.anchor.set(0.5, 0.5); descText.x = 1024; descText.y = yPosition + 20; descText.alpha = 0; game.addChild(descText); achievementDisplays.push(descText); // Achievement reward var rewardText = new Text2('Reward: +$' + achievement.reward, { size: 28, fill: achievement.unlocked ? '#00FF00' : '#666666', font: "'Arial Black', Arial, sans-serif" }); rewardText.anchor.set(0.5, 0.5); rewardText.x = 1648; rewardText.y = yPosition; rewardText.alpha = 0; game.addChild(rewardText); achievementDisplays.push(rewardText); yPosition += 250; } // Close button var closeButton = new GameButton('CLOSE', 200, 80); closeButton.x = 1024; closeButton.y = 2200; closeButton.alpha = 0; game.addChild(closeButton); // Animate all elements in with staggered timing tween(achievementOverlay, { alpha: 0.95 }, { duration: 300 }); tween(achievementTitle, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 400, delay: 100, easing: tween.bounceOut, onFinish: function onFinish() { tween(achievementTitle, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); // Animate achievement displays for (var i = 0; i < achievementDisplays.length; i++) { (function (display, index) { tween(display, { alpha: 1 }, { duration: 300, delay: 200 + index * 50, easing: tween.easeOut }); })(achievementDisplays[i], i); } tween(closeButton, { alpha: 1 }, { duration: 300, delay: 600 }); // Close button handler closeButton.up = function () { // Animate out var allElements = [achievementOverlay, achievementTitle, closeButton].concat(achievementDisplays); var elementsToDestroy = 0; var totalElements = allElements.length; for (var i = 0; i < allElements.length; i++) { tween(allElements[i], { alpha: 0 }, { duration: 300, delay: i * 20, onFinish: function onFinish() { elementsToDestroy++; if (elementsToDestroy === totalElements) { // Destroy all elements for (var j = 0; j < allElements.length; j++) { if (allElements[j] && allElements[j].destroy) { allElements[j].destroy(); } } } } }); } }; }
===================================================================
--- original.js
+++ change.js
@@ -4641,9 +4641,9 @@
anchorX: 0.5,
anchorY: 1.0
});
ruedaVerificador.x = 1024; // Same position as wheelPointer
- ruedaVerificador.y = 250; // Same position as wheelPointer
+ ruedaVerificador.y = 450; // Moved down 200 pixels from wheelPointer position
ruedaVerificador.alpha = 0;
game.addChild(ruedaVerificador);
// Create wheel segments
var segmentAngle = Math.PI * 2 / wheelPrizes.length;
billetes de dolar. In-Game asset. 2d. High contrast. No shadows
Pila de cartas visto desde atras. In-Game asset. 2d. High contrast. No shadows
"Crea un asset de fondo para la mesa de Blackjack de un casino virtual, diseñada específicamente para un solo jugador. Características visuales: Material: Debe ser un fieltro de casino de alta calidad. El color principal debe ser un verde esmeralda profundo y rico, con una textura sutil que simule el fieltro real (sin ser demasiado ruidosa o distractora). Diseño de la Mesa: Incluye las líneas y marcadores clásicos de una mesa de Blackjack, adaptada para un único jugador: Un arco o semicírculo claro para la posición del crupier, ubicado en la parte superior de la mesa. Una única área claramente definida para la posición del jugador, ubicada frente a la posición del crupier. Esta posición debe tener un círculo para la apuesta. Un área designada para las cartas del crupier. Si es posible, incluye un texto sutil y elegante en dorado o blanco que indique las reglas básicas del Blackjack, como "BLACKJACK PAYS 3 TO 2" y "DEALER MUST HIT ON SOFT 17" (o las reglas que prefiera. In-Game asset. 2d. High contrast. No shadows
Ambiente: Un interior de casino elegante y nocturno. Elementos: Podría mostrar una vista parcial de mesas de juego (Blackjack, ruleta, tragamonedas) en el fondo, desenfocadas para no distraer. Luces ambientales cálidas y doradas, reflejos sutiles. Detalles arquitectónicos de lujo: columnas, arcos, lámparas de araña (parcialmente visibles). Una alfombra lujosa o suelo brillante. Paleta de Colores: Predominan los dorados, rojos profundos, negros elegantes y toques de verde esmeralda. Perspectiva: Una vista amplia y acogedora, como si el jugador estuviera entrando al casino. Sensación: Sofisticación, exclusividad, y la emoción de lo que está por venir. Debe invitar a explorar el juego. El fondo debe ser inmersivo y coherente con la temática general del casino. In-Game asset. 2d. High contrast. No shadows
Objetivo: Crear un ambiente de casino vibrante y emocionante, enfocado en las tragamonedas, que invite a jugar. Diseño: Ambiente: Interior de un casino, con un enfoque en la zona de máquinas tragamonedas. Elementos: Filas o grupos de máquinas tragamonedas (parcialmente visibles, desenfocadas en el fondo para no competir con la máquina principal). Luces brillantes y parpadeantes típicas de las tragamonedas (efecto de neón, destellos). Detalles de lujo: alfombras estampadas, iluminación ambiental dorada/roja. Podría haber una pared decorativa elegante o cortinas de terciopelo. Paleta de Colores: Predominan los dorados, rojos, púrpuras y negros, con destellos de colores vibrantes de las luces de las máquinas. Perspectiva: Una vista ligeramente elevada o de frente, como si el jugador estuviera inmerso en la sala de tragamonedas. Sensación: Energía, emoción, oportunidad de ganar y un ambbiente de juego constante. El fondo debe ser inmersivo y complementar la máquina tragamonedas. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para una máquina tragamonedas estilo Megaways, coherente con 'La Tentación Dorada'. Diseño Central Megaways: Rodillos Dinámicos: Muestra una configuración de 6 rodillos verticales, donde la altura de cada rodillo puede variar de forma dinámica (mostrando entre 2 y 7 símbolos por rodillo). Esto debe ser visualmente aparente, quizás con indicadores de símbolos en la parte superior/inferior de cada rodillo (necesito que dejes un hueco en la maquina para que yo ponga los 6 rodillos/slots). Estilo y Temática: Opulencia: Marco de la máquina lujoso, dorado, con detalles intrincados, similar a la tragamonedas principal. Fondo de Rodillos: Oscuro y elegante (negro, azul noche), para resaltar los símbolos.
Quiero un rectangulo elegante con colores dorados en las esquinas. In-Game asset. 2d. High contrast. No shadows
Boton de signo de menos elegante de color dorado con fondo negro. In-Game asset. 2d. High contrast. No shadows
Boton de signo de mas elegante de color dorado con fondo negro. In-Game asset. 2d. High contrast. No shadows
Un diamante grande, multifacetado, con destellos luminosos y un brillo intenso. Debe parecer una joya preciosa. Colores claros y translúcidos (blanco, azul pálido) con reflejos iridiscentes. Estilo de casino de lujo. Fondo transparente. Es el símbolo de mayor valor (50x), debe ser visualmente impactante y deslumbrante.. In-Game asset. 2d. High contrast. No shadows
Crea un asset de fondo para el símbolo 'A' de Megaways (Diamante Brillante). Un panel cuadrado o ligeramente redondeado. Fondo de terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde elegante dorado o plateado. Puede tener un patrón sutil de filigrana de casino en las esquinas. Debe ser un fondo neutro pero lujoso para que el diamante resalte. Fondo transparente. In-Game asset. 2d. High contrast. No shadows
Crea un asset de fondo para el símbolo 'B' de Megaways (Barra de Oro). Un panel cuadrado o ligeramente redondeado. Fondo de terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde elegante dorado o plateado. Puede tener un patrón sutil de filigrana de casino en las esquinas. Debe ser un fondo neutro pero lujoso para que la barra de oro resalte. Fondo transparente. In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'C' de Megaways: el Número 7 de la Suerte. El dígito '7' estilizado, en color dorado o rojo vibrante, con un aura brillante o un ligero efecto de fuego/energía. Tipografía audaz y elegante. Debe transmitir suerte y la promesa de un gran premio (30x). Estilo de casino festivo. Fondo transparente. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'C' de Megaways: el Número 7 de la Suerte, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (el '7'): El dígito '7' estilizado, grande y centrado sobre el fondo del panel. Color del '7': Dorado brillante o rojo vibrante, con un aura sutil o un ligero efecto de fuego/energía. Tipografía: Audaz y elegante.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'D' de Megaways: una Campana Dorada, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (la Campana): Una campana clásica de tragamonedas, con un acabado dorado metálico y pulido, posicionada centralmente. Debe tener un brillo sutil y un diseño elegante. Puede tener un pequeño lazo o detalles decorativos.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'F' de Megaways: una Herradura Dorada, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (la Herradura): Una herradura clásica, de color dorado brillante y con un acabado metálico, posicionada centralmente. Puede tener pequeños detalles grabados o incrustaciones sutiles.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'E' de Megaways: Cerezas Lujosas, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (las Cerezas): Dos cerezas rojas, estilizadas para parecer joyas o gemas, con una superficie brillante y reflejos, posicionadas centralmente. El tallo debe ser fino y elegante. Colores: Rojos intensos y brillantes. In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'B' de Megaways: una Barra de Oro. Una barra de oro sólida y brillante, con reflejos realistas que sugieran lujo y peso. Puede tener la palabra 'BAR' grabada sutilmente. Estilo de casino opulento. Color dorado intenso. Fondo transparente. Es un símbolo de alto valor (40x), debe transmitir riqueza. In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'D' de Megaways: una Campana Dorada. Una campana clásica de tragamonedas, pero con un acabado dorado metálico y pulido. Debe tener un brillo sutil y un diseño elegante. Puede tener un pequeño lazo o detalles decorativos. Estilo de casino tradicional y lujoso. Fondo transparente. Símbolo de ganancias (25x). In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'E' de Megaways: Cerezas Lujosas. Dos cerezas rojas, estilizadas para parecer joyas o gemas, con una superficie brillante y reflejos. El tallo debe ser fino y elegante. Colores rojos intensos y brillantes. Estilo de casino sofisticado. Fondo transparente. Un giro elegante a un clásico (20x). In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'F' de Megaways: una Herradura Dorada. Una herradura clásica, pero de color dorado brillante y con un acabado metálico. Puede tener pequeños detalles grabados o incrustaciones sutiles. Debe transmitir buena suerte y fortuna (15x). Estilo de casino elegante. Fondo transparente. Un amuleto de la suerte.. In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'S' (Scatter) de Megaways: un Cofre del Tesoro o Bolsa de Dinero. Un cofre del tesoro abierto, desbordando monedas de oro y joyas, o una bolsa de dinero con el signo '$'. Debe ser visualmente atractivo y sugerir una recompensa. Colores dorados, marrones y brillantes. Estilo de casino de aventura. Fondo transparente. Símbolo de bonificación. In-Game asset. 2d. High contrast. No shadows
Crea un asset para el símbolo 'W' (Wild/Comodín) de Megaways: un Comodín Lujoso. La palabra 'WILD' en una fuente llamativa y dinámica. Colores vibrantes (ej. verde esmeralda brillante, azul eléctrico) con un contorno dorado o un efecto de arcoíris. Puede tener un pequeño destello o un aura de energía. Debe comunicar su función de sustitución. Fondo transparente. Símbolo de sorpresa. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'W' (Wild/Comodín) de Megaways, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (la palabra 'WILD'): La palabra 'WILD' en una fuente llamativa y dinámica, posicionada centralmente. Colores: Vibrantes (ej. verde esmeralda brillante, azul eléctrico) con un contorno dorado o un efecto de arcoíris. Puede tener un pequeño destello o un aura de energía.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual completo para el símbolo 'S' (Scatter) de Megaways: un Cofre del Tesoro o Bolsa de Dinero, directamente sobre su panel de fondo. Diseño General: Forma: Un panel cuadrado o ligeramente redondeado. Fondo del Panel: Terciopelo oscuro (negro o azul noche) o un metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del panel. Detalles del Fondo: Puede tener un patrón sutil de filigrana de casino en las esquinas del panel. Símbolo Central (Cofre/Bolsa): Un cofre del tesoro abierto desbordando monedas de oro y joyas, o una bolsa de dinero con el signo '$', posicionada centralmente. Colores: Dorados, marrones y brillantes.. In-Game asset. 2d. High contrast. No shadows
¡Entendido! Un botón de "SPIN" ovalado con un estilo similar al de los símbolos de los slots de Megaways. Aquí tienes el prompt ajustado: Prompt para Upit: Asset Botón "SPIN" Ovalado (Estilo Símbolos) "Crea un asset visual ovalado para el botón 'SPIN' de la máquina tragamonedas de lujo, con un estilo que recuerde a los paneles de los símbolos de los slots. Objetivo: Un botón prominente que invite a la acción, refleje la opulencia del casino y tenga una estética coherente con los símbolos de los rodillos Megaways. Diseño: Forma: Ovalada, con proporciones que lo hagan parecer ancho y fácil de pulsar. Los bordes pueden ser ligeramente biselados. Material/Textura: Simula un panel similar al fondo de los símbolos de los slots: terciopelo oscuro (negro o azul noche) o metal pulido muy oscuro. Borde: Un borde elegante dorado o plateado alrededor del óvalo, como los bordes de los símbolos. Texto: La palabra 'SPIN' en el centro, en mayúsculas, con una tipografía audaz y elegante de casin. In-Game asset. 2d. High contrast. No shadows
¡Entendido! Si el botón "Home" se pierde en el fondo de la tragamonedas, necesitamos darle un estilo que lo haga destacar más, manteniendo la coherencia con "La Tentación Dorada". Aquí tienes un prompt con un enfoque diferente: Prompt para Upit: Asset Botón "HOME" (Estilo Destacado) "Crea un asset visual para un botón 'HOME' (Inicio) de casino de lujo, diseñado para destacar claramente en la interfaz de la tragamonedas. Objetivo: Un botón fácilmente visible y reconocible para regresar al menú principal, con un estilo que contraste con el fondo de la tragamonedas pero que siga siendo elegante. Diseño: Forma: Un círculo o un óvalo con un color de base sólido y llamativo que contraste con los tonos oscuros y brillantes de la tragamonedas. Considera un rojo rubí intenso, un verde esmeralda brillante o un dorado más saturado. Símbolo Central: Un icono de casa estilizado y elegante en blanco puro o dorado brillante, para que resalte sobre el color de base. También podría ser la palabra. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para un panel de visualización del 'BALANCE' del jugador, con la palabra 'BALANCE' ubicada en la parte superior. Objetivo: Un espacio claro, elegante y prominente para mostrar el saldo monetario, coherente con la estética de lujo del casino 'La Tentación Dorada', con la etiqueta 'BALANCE' en la parte superior para facilitar su identificación. Diseño: Forma: Un panel rectangular horizontal, con bordes suavemente redondeados o un diseño elegante. Material/Textura: Acabado metálico pulido (dorado, plateado) o un fondo de terciopelo oscuro (negro, rojo vino, azul noche). Texto Fijo (Arriba): La palabra 'BALANCE' (o 'SALDO') debe ubicarse en la parte superior del panel, centrada o alineada a la izquierda/derecha según el diseño. Utiliza una tipografía limpia, legible y de estilo casino, en un tamaño adecuado para ser una etiqueta. Espacio para el Valor (Abajo): Debe haber un espacio claro y destacado debajo de la palabra 'BALANCE' para que el valor numérico del sa. In-Game asset. 2d. High contrast. No shadows
Fondo oscuro con dorado elegante. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para el botón 'DEAL' (Repartir) para la mesa de Blackjack de lujo. Objetivo: Un botón claro y elegante que inicie la ronda de Blackjack, coherente con la opulencia del casino. Diseño: Forma: Puede ser un óvalo o un rectángulo con bordes suaves, que sea prominente y fácil de pulsar. Texto Central: La palabra 'DEAL' (o 'REPARTIR') en mayúsculas, con una tipografía audaz, limpia y elegante de casino. Color: Base en un color dorado brillante o metálico, que simule oro pulido. Puede tener un borde o un acento en rojo rubí o verde esmeralda para complementar la paleta del casino. Efectos (si Upit lo permite): Sutil efecto de relieve o biselado para darle profundidad. Un ligero brillo o resplandor que sugiera energía y anticipación. Textura que simule metal pulido o un material lujoso. Fondo: El asset debe ser independiente con fondo transparente, listo para ser superpuesto en la interfaz de la mesa de Blackjack.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para el botón 'HIT' (Pedir Carta) para la mesa de Blackjack de lujo. Objetivo: Un botón claro y elegante que permita al jugador pedir otra carta, coherente con la opulencia del casino. Diseño: Forma: Óvalo o rectángulo con bordes suaves, prominente y fácil de pulsar. Texto Central: La palabra 'HIT' (o 'PEDIR') en mayúsculas, con tipografía audaz, limpia y elegante de casino. Color: Base en un color que transmita acción, como un rojo rubí vibrante o un naranja ámbar, con acabado metálico o pulido. Borde: Un borde brillante en dorado o plateado. Efectos (si Upit lo permite): Sutil efecto de relieve o biselado para darle profundidad. Un ligero brillo o resplandor que lo haga destacar. Textura que simule metal pulido o un material lujoso. Fondo: Asset independiente con fondo transparente.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para el botón 'STAND' (Plantarse) para la mesa de Blackjack de lujo. Objetivo: Un botón claro y elegante que permita al jugador finalizar su turno, coherente con la opulencia del casino. Diseño: Forma: Óvalo o rectángulo con bordes suaves, prominente y fácil de pulsar. Texto Central: La palabra 'STAND' (o 'PLANTARSE') en mayúsculas, con tipografía audaz, limpia y elegante de casino. Color: Base en un color que contraste con 'HIT' y 'DEAL' pero mantenga la elegancia. Considera un verde esmeralda profundo o un azul zafiro, con acabado metálico o pulido. Borde: Un borde brillante en dorado o plateado. Efectos (si Upit lo permite): Sutil efecto de relieve o biselado para darle profundidad. Un ligero brillo o resplandor que lo haga destacar. Textura que simule metal pulido o un material lujoso. Fondo: Asset independiente con fondo transparente. Sensación: Debe transmitir decisión, control y la profesionalidad del juego.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para el botón 'DOUBLE' (Doblar Apuesta) para la mesa de Blackjack de lujo. Objetivo: Un botón claro y elegante que permita al jugador doblar su apuesta, coherente con la opulencia del casino. Diseño: Forma: Óvalo o rectángulo con bordes suaves, prominente y fácil de pulsar. Texto Central: La palabra 'DOUBLE' (o 'DOBLAR') en mayúsculas, con tipografía audaz, limpia y elegante de casino. Color: Base en un color que sugiera riesgo/recompensa, como un púrpura real o un dorado más oscuro, con acabado metálico o pulido. Borde: Un borde brillante en dorado o plateado. Efectos (si Upit lo permite): Sutil efecto de relieve o biselado para darle profundidad. Un ligero brillo o resplandor que lo haga destacar. Textura que simule metal pulido o un material lujoso. Fondo: Asset independiente con fondo transparente.. In-Game asset. 2d. High contrast. No shadows
"Crea un asset visual para un panel de visualización del 'BET' actual del jugador en la mesa de Blackjack. Objetivo: Un espacio claro y elegante para mostrar la cantidad apostada, integrado en la interfaz de la mesa de Blackjack, coherente con el lujo del casino. Diseño: Forma: Un panel rectangular horizontal o un óvalo alargado, con bordes suaves o un diseño elegante. Material/Textura: Acabado metálico pulido (dorado, plateado) o un fondo de terciopelo oscuro (negro, rojo vino, azul noche). Texto Fijo: La palabra 'BET:' debe estar claramente visible en el panel, en una tipografía limpia, legible y de estilo casino. Espacio para el Valor: Debe haber un espacio claro y destacado junto a la palabra 'BET:' para que el valor numérico de la apuesta pueda ser insertado dinámicamente. Color del Texto Fijo: Dorado brillante, blanco puro o un color que contraste bien con el fondo del panel. Color del Valor: Un color que destaque y sea fácil de leer (podría ser el mismo que el texto fijo. In-Game asset. 2d. High contrast. No shadows
Crea un asset para una ficha de casino de $1 para Blackjack. Color Principal: Blanco o gris muy claro. Borde/Detalles: Dos o tres franjas finas en un color que contraste pero sea elegante, como azul zafiro o verde esmeralda. Valor: El número '1' grande y claro en el centro, en dorado o negro, con una tipografía de casino. Estilo: Lujoso, limpio, coherente con 'La Tentación Dorada'.". In-Game asset. 2d. High contrast. No shadows
"Crea un asset para una ficha de casino de $10 para Blackjack. Color Principal: Azul zafiro profundo o un azul medianoche. Borde/Detalles: Dos o tres franjas finas en un color que contraste, como blanco o dorado. Valor: El número '10' grande y claro en el centro, en dorado o blanco, con una tipografía de casino. Estilo: Lujoso, elegante, coherente con 'La Tentación Dorada'.". In-Game asset. 2d. High contrast. No shadows que el texto blackjack ete arriba
"Crea un asset para una ficha de casino de $25 para Blackjack. Color Principal: Verde esmeralda brillante o un verde bosque profundo. Borde/Detalles: Dos o tres franjas finas en un color que contraste, como blanco o dorado. Valor: El número '25' grande y claro en el centro, en dorado o blanco, con una tipografía de casino. Estilo: Lujoso, distintivo, coherente con 'La Tentación Dorada'.". In-Game asset. 2d. High contrast. No shadows
"Crea un asset para una ficha de casino de $100 para Blackjack. Color Principal: Negro obsidiana o un púrpura real profundo. Borde/Detalles: Dos o tres franjas finas en un color que contraste fuertemente, como dorado brillante o blanco. Valor: El número '100' grande y claro en el centro, en dorado o blanco, con una tipografía de casino. Estilo: Lujoso, premium, coherente con 'La Tentación Dorada'. Esta debe ser la más impresionante visualmente.". In-Game asset. 2d. High contrast. No shadows que el texto blackjack se encuentre arriba
Crea un asset para una ficha de casino de $500 para Blackjack. Color Principal: Un color muy distintivo y premium, como un dorado sólido y brillante, un plateado metálico o un negro azabache con un brillo iridiscente. Borde/Detalles: Un borde más grueso y prominente en un color que contraste fuertemente (ej., negro sobre dorado, dorado sobre negro), y quizás un patrón de filigrana más elaborado o un diseño de corona/estrella discreto. Valor: El número '500' grande y claro en el centro, en un color que destaque (ej., blanco, negro, o un color metálico si el fondo es oscuro), con una tipografía de casino audaz y elegante. Estilo: Extremadamente lujoso y premium, debe ser la ficha más impresionante visualmente, coherente con 'La Tentación Dorada'. Efectos: Un brillo intenso o reflejos que sugieran un material de altísima calidad. Fondo: Transparente (solo la ficha)." que el texto de blackjack este aarriba. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para un botón 'REMOVE' (Quitar Apuesta) para la mesa de Blackjack de lujo. Objetivo: Un botón claro y elegante que permita al jugador quitar su apuesta actual y regresarla a cero, coherente con la opulencia del casino. Diseño: Forma: Puede ser un óvalo o un rectángulo con bordes suaves, que sea prominente y fácil de pulsar. Texto Central: La palabra 'REMOVE' (o 'CLEAR BET') en mayúsculas, con una tipografía audaz, limpia y elegante de casino. Color: Base en un color que sugiera "borrar" o "resetear" sin ser estridente. Considera un gris oscuro metálico, un plateado pulido o un bronce oscuro, con un acabado elegante. Borde: Un borde brillante en dorado o plateado. Efectos (si Upit lo permite): Sutil efecto de relieve o biselado para darle profundidad. Un ligero brillo o resplandor que lo haga destacar. Textura que simule metal pulido o un material lujoso. Fondo: El asset debe ser independiente con fondo transparente, listo para ser superpuesto en la inter. In-Game asset. 2d. High contrast. No shadows
¡Claro! Aquí tienes el prompt para el asset del reverso de las cartas de tu casino, diseñado para "La Tentación Dorada" y ajustado al límite de 1000 caracteres: Prompt para Upit: Asset Reverso de Cartas de Casino "Crea un asset visual para el reverso de una carta de casino de lujo. Objetivo: Un diseño elegante y distintivo que represente la marca 'La Tentación Dorada' y sea visualmente atractivo en la mesa de Blackjack. Diseño: Forma: Rectangular, como el reverso de una carta de póker estándar. Color Principal: Un color profundo y rico que evoque lujo, como un rojo burdeos oscuro, un verde esmeralda profundo o un azul medianoche. Patrón Central: Un diseño simétrico y ornamentado en el centro. Podría ser: Un patrón de filigrana dorada intrincada. El logo estilizado de 'La Tentación Dorada' (si lo tienes definido, de lo contrario, un diseño abstracto de lujo). Un patrón geométrico elegante con toques dorados. Borde: Un borde fino y elegante en dorado o plateado alrededor de tod. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual de botón ovalado/rectangular para 'BLACKJACK' en el menú principal. Diseño: Texto 'BLACKJACK' en tipografía de casino, centrado. Color base rojo rubí, verde esmeralda o azul zafiro profundo (metálico/pulido). Borde grueso y brillante dorado o plateado. Efecto de relieve/biselado y brillo sutil. Fondo transparente. Objetivo: Botón lujoso, prominente y que invite al juego.. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para un banner de bienvenida arqueado de casino de lujo. Diseño: Forma de arco elegante. Texto central: 'WELCOME TO LA TENTACIÓN DORADA' (o 'WELCOME, HIGH ROLLER'). Tipografía de casino elegante, mayúsculas. Fondo del arco: Negro, rojo burdeos o azul medianoche profundo (pulido/terciopelo). Texto y borde: Dorado o plateado brillante (metálico). Detalles: Filigranas doradas sutiles, brillos. Efecto: Ligero relieve y resplandor. Fondo transparente. Objetivo: Bienvenida opulenta y exclusiva.. In-Game asset. 2d. High contrast. No shadows
quiero el reloj mas detallado y en un etilo mas realista
Mano de una persona femenina con camisa blanca vista desde arriba con un estilo realista. In-Game asset. 2d. High contrast. No shadows
Copa de logros elegante en colores dorados oscuros y brillantes. In-Game asset. 2d. High contrast. No shadows
¡Mil disculpas por la confusión! Tienes toda la razón. No es una ruleta de casino, sino una "ruleta de premios" o "rueda de la fortuna" para recompensas. Aquí tienes el prompt corregido para el asset del icono de la Rueda de Premios que aparecerá en el menú principal, diseñado para tu casino "La Tentación Dorada" y con el texto en inglés para Upit: Prompt for Upit: Asset 'Prize Wheel' Icon (Main Menu) "Create a visual asset for an icon representing a 'Prize Wheel' or 'Reward Wheel' for the main menu of the luxury casino 'La Tentación Dorada'. Objective: A clear, attractive, and clickable icon that invites players to access the reward system, distinct from a gambling roulette. Design: Shape: Circular, mimicking a classic prize wheel. Central Element: A stylized prize wheel showing various sections, each implying a different reward (e.g., a star, a gift box silhouette, a coin symbol, a trophy, or just abstract 'prize' sections). It should have a prominent pointer at the top.. In-Game asset. 2d. High contrast. No shadows
Carta de email elegante. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para un lujoso marcador o indicador de premio para la rueda de recompensas de 'La Tentación Dorada'. Objetivo: Un elemento claro y elegante que indique visualmente el premio ganador en la rueda. Diseño: Forma: Puede ser una flecha estilizada, un pequeño colgante o un puntero refinado con un elemento decorativo. Material/Color: Debe tener un aspecto premium, utilizando oro pulido o plata como color principal. Detalles: Si es una flecha, debe ser elegante y bien definida, quizás con una pequeña joya o un detalle grabado cerca de la punta. Si es un colgante, podría ser una versión estilizada del logo del casino o una forma geométrica con un acabado lujoso. Asegúrate de que tenga una dirección clara de 'apuntado'. Elemento de Posicionamiento: Debe tener un punto o borde claro que se alinee con precisión con las divisiones entre las secciones de premios en la rueda. Iluminación/Efectos (si Upit lo permite): Un brillo sutil o destellos para llamar la atención s. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para una indicación de acción que diga 'Spin Here' con una flecha decorativa señalando a la derecha. Objetivo: Guiar al usuario a un botón de giro o a una zona interactiva, con un toque de lujo y dinamismo. Diseño: Texto: La frase 'Spin Here' en una tipografía de casino elegante, clara y legible. El texto debe ser prominente. Color del Texto: Dorado brillante o plateado pulido, con reflejos sutiles. Flecha: Una flecha que apunte claramente hacia la derecha. Estilo de la Flecha: Debe tener un diseño ligeramente 'enredado' o 'enrollado', como si fuera una cinta de oro o un elemento de filigrana que se desenrolla para formar la flecha. No debe ser una flecha simple y recta. Color de la Flecha: Dorado brillante o plateado pulido, a juego con el texto. Efectos: Sutiles brillos y sombras para darle volumen y un aspecto metálico. Composición: El texto 'Spin Here' y la flecha deben estar visualmente conectados, formando un solo asset cohesivo. La flecha puede sali. In-Game asset. 2d. High contrast. No shadows
Crea un asset visual para un botón de interfaz de usuario que diga 'Stats' en ingles. Objetivo: Proporcionar un botón claro y atractivo para acceder a las estadísticas del jugador. Diseño: Forma: Un botón con bordes suaves o ligeramente redondeados, o una forma que sugiera una plaqueta o emblema de lujo. Texto: La palabra 'Estadísticas' en una tipografía elegante, clara y legible. El texto debe ser prominente y centrado en el botón. Color Base: Un fondo que sea consistente con la interfaz de tu casino, como un azul profundo, púrpura oscuro, negro carbón o un color metálico bruñido. Color del Texto/Borde: Dorado brillante, plateado pulido o bronce con un acabado metálico y reflejos sutiles.. In-Game asset. 2d. High contrast. No shadows
Menu
Music
BJ
Music
SpinM
Music
SpinHere
Sound effect
Giro
Sound effect
Premio
Sound effect
premio
Sound effect
RuedaMusic
Music
Rodillos
Sound effect
Detencion
Sound effect
Simbolo
Sound effect
Explosion
Sound effect
Cuprier_Menu_1
Sound effect
Cuprier_Menu_2
Sound effect
Cuprier_Menu_3
Sound effect
Ficha_1
Sound effect
Ficha_2
Sound effect
Baraja
Sound effect
Carta_1
Sound effect
Carta_2
Sound effect
Carta_3
Sound effect
Cuprier_BJ_1
Sound effect
Cuprier_BJ_2
Sound effect
Cuprier_BJ_3
Sound effect
Jugador_Hit_1
Sound effect
Jugador_Hit_2
Sound effect
Jugador_Hit_3
Sound effect
Jugador_Pedir_1
Sound effect
Jugador_Pedir_2
Sound effect
Jugador_Pedir_3
Sound effect
Jugador_Plantarse_1
Sound effect
Jugador_Plantarse_2
Sound effect
Jugador_Pasa_1
Sound effect
Jugador_Pasa_2
Sound effect
Jugador_Pasa_3
Sound effect
Cuprier_Gana_1
Sound effect
Cuprier_Gana_2
Sound effect
Cuprier_Gana_3
Sound effect
Cuprier_Empate_1
Sound effect
Cuprier_Empate_2
Sound effect
Cuprier_Empate_3
Sound effect
Jugador_BlackJack_1
Sound effect
Jugador_BlackJack_2
Sound effect
Jugador_BlackJack_3
Sound effect
Jugador_Plantarse_3
Sound effect
Cuprier_Win_1
Sound effect
Cuprier_Win_2
Sound effect
Cascada
Sound effect
Congratulations
Sound effect
Big_Win
Sound effect
Festejo
Sound effect
Mega_Win
Sound effect
Super_Mega_Win
Sound effect
Jackpot_Win
Sound effect