User prompt
Letras de total de token sean de color rojo justo reciente.
User prompt
Letras de total de tokens sean de color negro.
User prompt
cuando se llena una línea de cualquier cartón que el juego me pague la cantidad que está abajo en el precio de token
User prompt
Cuando se llenen dos líneas horizontales en cualquiera de los cartones, que el juego me pague cuatro veces el valor que está abajo en la ventana de tokens del cartón que se llenó.
User prompt
Que las ventanas de precio de token no se puedan cambiar los valores hasta que termine el juego.
User prompt
Que la ventana de total de tokens se recorra un poquito más a la izquierda.
User prompt
Que las letras del botón de inicio sean dos tantos más grandes.
User prompt
Las letras del botón de inicio sean dos tantos más grandes.
User prompt
Que las letras del botón de inicio sean de color negro
User prompt
que las letras de la ventana de token sean un poquito más grandes
User prompt
que las letras de la ventana de total de token sean de color negro
User prompt
que al inicio de cada juego me descuente de la ventana de pago de tokens el precio que está abajo de cada cartón que dice token price ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
cuando se llene una línea horizontal que el juego me pague en la misma cantidad que está abajo del cartón y esa cantidad se vaya a la ventana de pago de tokens ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Si se llena una linea horizontal en alguno de los cartones, me pague la misma cantidad que está abajo del cartón en precio de tokens. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Que la ventana de pagos de token diga TOTAL DE TOKENS
User prompt
que las letras de la ventana de pagos de token sean un poquito más grandes
User prompt
Que la ventana de pagos de token se pase un poquito más abajo.
User prompt
Y la ventana de pagos de token se pasió un poquito más abajo.
User prompt
Que el juego me pague la misma cantidad del precio del token que está abajo del cartón cuando se llene una línea. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Crea una ventana donde se acumulen los pagos de Tokio. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Que la ventana de festejo de una línea diga pingo una línea.
User prompt
Que la ventana de festejo de una línea, diga una línea.
User prompt
Crea una ventana de festejo cuando se llenen dos líneas horizontales en cualquiera de los cartones. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Crea una ventana de festejo que diga bingo cuando llene dos líneas horizontales. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Crea una ventana de festejo que diga vengo cuando llene dos líneas horizontales. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BingoCard = Container.expand(function (cardIndex) { var self = Container.call(this); self.cardIndex = cardIndex; self.numbers = []; self.bingoNumbers = []; self.cardBg = self.attachAsset('bingoCard', { anchorX: 0.5, anchorY: 0.5 }); // Generate 15 random unique numbers between 1-75 self.generateNumbers = function () { var availableNumbers = []; for (var i = 1; i <= 75; i++) { availableNumbers.push(i); } for (var j = 0; j < 15; j++) { var randomIndex = Math.floor(Math.random() * availableNumbers.length); self.numbers.push(availableNumbers[randomIndex]); availableNumbers.splice(randomIndex, 1); } }; self.createNumberGrid = function () { var startX = -270; var startY = -90; var spacingX = 135; var spacingY = 90; for (var row = 0; row < 3; row++) { self.bingoNumbers[row] = []; for (var col = 0; col < 5; col++) { var numberIndex = row * 5 + col; var bingoNumber = new BingoNumber(self.numbers[numberIndex], self.cardIndex, row, col); bingoNumber.x = startX + col * spacingX; bingoNumber.y = startY + row * spacingY; self.addChild(bingoNumber); self.bingoNumbers[row][col] = bingoNumber; } } }; self.generateNumbers(); self.createNumberGrid(); return self; }); var BingoNumber = Container.expand(function (number, cardIndex, row, col) { var self = Container.call(this); self.number = number; self.cardIndex = cardIndex; self.row = row; self.col = col; self.isMarked = false; self.bg = self.attachAsset('bingoNumber', { anchorX: 0.5, anchorY: 0.5 }); self.numberText = new Text2(number.toString(), { size: 43, fill: 0x000000 }); self.numberText.anchor.set(0.5, 0.5); self.addChild(self.numberText); self.markNumber = function () { if (!self.isMarked) { self.isMarked = true; self.removeChild(self.bg); self.bg = self.attachAsset('markedNumber', { anchorX: 0.5, anchorY: 0.5 }); // Replace the text with white color self.removeChild(self.numberText); self.numberText = new Text2(self.number.toString(), { size: 43, fill: 0xFFFFFF }); self.numberText.anchor.set(0.5, 0.5); self.addChild(self.numberText); LK.getSound('numberMarked').play(); // Check for completed lines checkForCompletedLines(self.cardIndex); } }; self.down = function (x, y, obj) { // Numbers are now automatically marked, no manual interaction needed }; return self; }); var BingoWindow = Container.expand(function () { var self = Container.call(this); // Create celebration window background self.windowBg = self.attachAsset('bingoWindow', { anchorX: 0.5, anchorY: 0.5 }); // Create BINGO text self.bingoText = new Text2('UNA LÍNEA', { size: 120, fill: 0x000000 }); self.bingoText.anchor.set(0.5, 0.5); self.addChild(self.bingoText); // Position at center of screen self.x = 1024; self.y = 1366; // Start invisible self.alpha = 0; self.scaleX = 0.1; self.scaleY = 0.1; self.show = function () { // Animate window appearance tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.easeOut }); // Add pulsing animation to text tween(self.bingoText, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.bingoText, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut }); } }); // Auto-hide after 3 seconds LK.setTimeout(function () { self.hide(); }, 3000); }; self.hide = function () { tween(self, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } } }); }; return self; }); var NumberBubble = Container.expand(function (number) { var self = Container.call(this); self.number = number; self.speed = -3; self.floatSpeed = 0; // Create bubble background self.bubbleBg = self.attachAsset('numberBubble', { anchorX: 0.5, anchorY: 0.5 }); // Create number text self.numberText = new Text2(number.toString(), { size: 32, fill: 0xFFFFFF }); self.numberText.anchor.set(0.5, 0.5); self.addChild(self.numberText); // Calculate position in three horizontal rows var bubblesPerRow = 25; // 25 bubbles per row (75 total / 3 rows) var bubbleSpacing = 80; // Spacing between bubbles var rowSpacing = 90; // Spacing between rows var startX = 50; // Start position for each row var startY = 120; // Y position for first row var currentBubbleCount = numberBubbles.length; // Calculate which row and position within row var row = Math.floor(currentBubbleCount / bubblesPerRow); var positionInRow = currentBubbleCount % bubblesPerRow; // Set target position in three rows var targetX = startX + positionInRow * bubbleSpacing; var targetY = startY + row * rowSpacing; // Initialize position at bottom of screen for animation self.x = targetX; self.y = 2732 + 50; // Start below screen self.lastY = self.y; // Animate bubble entrance to target position tween(self, { y: targetY, scaleX: 1.0, scaleY: 1.0 }, { duration: 1500, easing: tween.easeOut }); // Add floating animation tween(self.bubbleBg, { rotation: Math.PI * 2 }, { duration: 4000, easing: tween.linear }); self.update = function () { // Bubbles stay fixed in position - no floating animation }; return self; }); var TokenWindow = Container.expand(function (cardIndex) { var self = Container.call(this); self.cardIndex = cardIndex; // Define predefined price options self.priceOptions = [10, 20, 30, 50, 100]; // Load saved price index from storage, default to 0 if not found var storageKey = 'tokenPrice_' + cardIndex; self.currentPriceIndex = storage[storageKey] || 0; // Create window background self.windowBg = self.attachAsset('tokenWindow', { anchorX: 0.5, anchorY: 0.5 }); // Create price text with saved price self.priceText = new Text2('Token Price: ' + self.priceOptions[self.currentPriceIndex], { size: 40, fill: 0xFFFFFF }); self.priceText.anchor.set(0.5, 0.5); self.addChild(self.priceText); // Add tap event to cycle through prices and save to storage self.down = function (x, y, obj) { self.currentPriceIndex = (self.currentPriceIndex + 1) % self.priceOptions.length; self.priceText.setText('Token Price: ' + self.priceOptions[self.currentPriceIndex]); // Save the selected price index to storage storage[storageKey] = self.currentPriceIndex; }; return self; }); var TwoLinesWindow = Container.expand(function () { var self = Container.call(this); // Create celebration window background self.windowBg = self.attachAsset('vengoWindow', { anchorX: 0.5, anchorY: 0.5 }); // Create celebration text self.celebrationText = new Text2('TWO LINES!', { size: 100, fill: 0x000000 }); self.celebrationText.anchor.set(0.5, 0.5); self.addChild(self.celebrationText); // Position at center of screen self.x = 1024; self.y = 1366; // Start invisible self.alpha = 0; self.scaleX = 0.1; self.scaleY = 0.1; self.show = function () { // Animate window appearance tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 600, easing: tween.easeOut }); // Add pulsing animation to text tween(self.celebrationText, { scaleX: 1.3, scaleY: 1.3 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.celebrationText, { scaleX: 1, scaleY: 1 }, { duration: 400, easing: tween.easeInOut }); } }); // Auto-hide after 3 seconds LK.setTimeout(function () { self.hide(); }, 3000); }; self.hide = function () { tween(self, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ var bingoCards = []; var currentCalledNumber = null; var calledNumbers = []; var availableNumbers = []; var callTimer = null; var completedLines = 0; var totalHorizontalLines = 0; var gameStarted = false; var startButton = null; var numberBubbles = []; var bingoWindow = null; var twoLinesWindow = null; // Initialize available numbers for (var i = 1; i <= 75; i++) { availableNumbers.push(i); } // Create score display var scoreText = new Text2('0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.y = 50; // Create current called number display var calledNumberContainer = new Container(); var calledNumberBg = LK.getAsset('calledNumberBg', { anchorX: 0.5, anchorY: 0.5 }); calledNumberContainer.addChild(calledNumberBg); var calledNumberText = new Text2('--', { size: 36, fill: 0xFFFFFF }); calledNumberText.anchor.set(0.5, 0.5); calledNumberContainer.addChild(calledNumberText); game.addChild(calledNumberContainer); calledNumberContainer.x = 1024; calledNumberContainer.y = 150; // Create info text var infoText = new Text2('Tap START to begin the game!', { size: 30, fill: 0xFFFFFF }); infoText.anchor.set(0.5, 0.5); game.addChild(infoText); infoText.x = 1024; infoText.y = 250; // Create start button startButton = new Container(); var startButtonBg = LK.getAsset('startButton', { anchorX: 0.5, anchorY: 0.5 }); startButton.addChild(startButtonBg); var startButtonText = new Text2('START', { size: 32, fill: 0xFFFFFF }); startButtonText.anchor.set(0.5, 0.5); startButton.addChild(startButtonText); startButton.x = 1024; startButton.y = 2500; game.addChild(startButton); startButton.down = function (x, y, obj) { if (!gameStarted) { gameStarted = true; game.removeChild(startButton); startButton = null; infoText.setText('Cards fill automatically as numbers are called!'); // Start the game LK.setTimeout(callNextNumber, 125); } }; // Create bingo cards - centered on screen for (var c = 0; c < 4; c++) { var card = new BingoCard(c); var row = Math.floor(c / 2); var col = c % 2; // Center cards on 2048x2732 screen - 2 cards per row var cardSpacingX = 900; // Space between cards horizontally var cardSpacingY = 780; // Space between cards vertically - increased separation var totalWidth = cardSpacingX; // Width for 2 cards var totalHeight = cardSpacingY; // Height for 2 rows var startX = (2048 - totalWidth) / 2; // Center horizontally var startY = 950; // Position below the UI elements - moved down card.x = startX + col * cardSpacingX; card.y = startY + row * cardSpacingY; game.addChild(card); bingoCards.push(card); // Create token price window below each card var tokenWindow = new TokenWindow(c); tokenWindow.x = card.x; tokenWindow.y = card.y + 350; // Position below the card game.addChild(tokenWindow); } function callNextNumber() { if (availableNumbers.length > 0) { var randomIndex = Math.floor(Math.random() * availableNumbers.length); currentCalledNumber = availableNumbers[randomIndex]; availableNumbers.splice(randomIndex, 1); calledNumbers.push(currentCalledNumber); calledNumberText.setText(currentCalledNumber.toString()); LK.getSound('numberCalled').play(); // Create red bubble for the called number var bubble = new NumberBubble(currentCalledNumber); game.addChild(bubble); numberBubbles.push(bubble); // Automatically mark the called number on all cards with reduced probability for (var cardIndex = 0; cardIndex < bingoCards.length; cardIndex++) { var card = bingoCards[cardIndex]; for (var row = 0; row < 3; row++) { for (var col = 0; col < 5; col++) { var bingoNumber = card.bingoNumbers[row][col]; if (bingoNumber.number === currentCalledNumber && !bingoNumber.isMarked) { // Only mark the number 70% of the time to reduce card fill probability if (Math.random() < 0.7) { bingoNumber.markNumber(); LK.setScore(LK.getScore() + 10); scoreText.setText(LK.getScore()); } } } } } // Flash the called number tween(calledNumberBg, { tint: 0xffff00 }, { duration: 200 }); tween(calledNumberBg, { tint: 0xffffff }, { duration: 200 }); // Schedule next number call var delay = Math.max(250 - completedLines * 12, 125); callTimer = LK.setTimeout(callNextNumber, delay); } } function checkForCompletedLines(cardIndex) { var card = bingoCards[cardIndex]; var newLinesCompleted = 0; var horizontalLinesCompleted = 0; // Check horizontal lines for (var row = 0; row < 3; row++) { var lineComplete = true; for (var col = 0; col < 5; col++) { if (!card.bingoNumbers[row][col].isMarked) { lineComplete = false; break; } } if (lineComplete) { newLinesCompleted++; horizontalLinesCompleted++; } } // Check vertical lines for (var col = 0; col < 5; col++) { var lineComplete = true; for (var row = 0; row < 3; row++) { if (!card.bingoNumbers[row][col].isMarked) { lineComplete = false; break; } } if (lineComplete) { newLinesCompleted++; } } // Check diagonal lines (3x5 grid diagonals) // Left diagonal (top-left to bottom-right) if (card.bingoNumbers[0][0].isMarked && card.bingoNumbers[1][2].isMarked && card.bingoNumbers[2][4].isMarked) { newLinesCompleted++; } // Right diagonal (top-right to bottom-left) if (card.bingoNumbers[0][4].isMarked && card.bingoNumbers[1][2].isMarked && card.bingoNumbers[2][0].isMarked) { newLinesCompleted++; } if (newLinesCompleted > 0) { completedLines += newLinesCompleted; totalHorizontalLines += horizontalLinesCompleted; LK.getSound('lineComplete').play(); LK.setScore(LK.getScore() + newLinesCompleted * 100); scoreText.setText(LK.getScore()); // Show BINGO celebration window for horizontal line completion if (horizontalLinesCompleted > 0) { bingoWindow = new BingoWindow(); game.addChild(bingoWindow); bingoWindow.show(); } // Show TWO LINES celebration window when exactly 2 horizontal lines are completed if (totalHorizontalLines === 2) { twoLinesWindow = new TwoLinesWindow(); game.addChild(twoLinesWindow); twoLinesWindow.show(); } // Flash the card tween(card.cardBg, { tint: 0x00ff00 }, { duration: 300 }); tween(card.cardBg, { tint: 0xffffff }, { duration: 300 }); // Check for full card completion var allMarked = true; for (var r = 0; r < 3; r++) { for (var c = 0; c < 5; c++) { if (!card.bingoNumbers[r][c].isMarked) { allMarked = false; break; } } if (!allMarked) break; } if (allMarked) { LK.setScore(LK.getScore() + 500); scoreText.setText(LK.getScore()); // Check win condition - 3 completed lines or 1 full card if (completedLines >= 3) { LK.clearTimeout(callTimer); LK.setTimeout(function () { LK.showYouWin(); }, 6000); } } } } // Game will start when start button is pressed game.update = function () { // Update score display scoreText.setText(LK.getScore()); // Bubbles now stay at the top, no cleanup needed // Check if all numbers have been called if (availableNumbers.length === 0 && calledNumbers.length === 75) { LK.clearTimeout(callTimer); if (completedLines >= 1) { LK.setTimeout(function () { LK.showYouWin(); }, 6000); } else { LK.setTimeout(function () { LK.showGameOver(); }, 6000); } } };
===================================================================
--- original.js
+++ change.js
@@ -99,9 +99,9 @@
anchorX: 0.5,
anchorY: 0.5
});
// Create BINGO text
- self.bingoText = new Text2('BINGO!', {
+ self.bingoText = new Text2('UNA LÍNEA', {
size: 120,
fill: 0x000000
});
self.bingoText.anchor.set(0.5, 0.5);