User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'trim')' in or related to this line: 'if (roomName !== 'Enter room name...' && roomName.trim() !== '') {' Line Number: 291
User prompt
yes it's good but add main menu create room join add settings and languages and develop more more mini games
User prompt
yes it's good but add main menu create room join add settings and languages and develop more more mini games
Code edit (1 edits merged)
Please save this source code
User prompt
Chat Party Games
Initial prompt
place to chat but basic games can be played
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { username: "Player", color: "#3498db", rooms: [] }); /**** * Classes ****/ var Avatar = Container.expand(function () { var self = Container.call(this); var avatarGraphic = self.attachAsset('avatar', { anchorX: 0.5, anchorY: 0.5 }); self.nameText = new Text2('Player', { size: 24, fill: 0xFFFFFF }); self.nameText.anchor.set(0.5, 0); self.nameText.y = 80; self.addChild(self.nameText); self.setName = function (name) { self.nameText.setText(name); }; self.setColor = function (color) { avatarGraphic.tint = parseInt(color.replace('#', '0x')); }; self.down = function (x, y, obj) { LK.getSound('select').play(); }; return self; }); var Button = Container.expand(function (text, width, height, color) { var self = Container.call(this); var buttonWidth = width || 180; var buttonHeight = height || 60; var buttonColor = color || 'gameButton'; var buttonGraphic = self.attachAsset(buttonColor, { anchorX: 0.5, anchorY: 0.5, width: buttonWidth, height: buttonHeight }); self.label = new Text2(text, { size: 28, fill: 0xFFFFFF }); self.label.anchor.set(0.5, 0.5); self.addChild(self.label); self.setLabel = function (newText) { self.label.setText(newText); }; self.down = function (x, y, obj) { tween(buttonGraphic, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); LK.getSound('select').play(); }; self.up = function (x, y, obj) { tween(buttonGraphic, { scaleX: 1, scaleY: 1 }, { duration: 100 }); }; return self; }); var ChatBubble = Container.expand(function (message, isUser) { var self = Container.call(this); var bubbleGraphic = self.attachAsset('chatBubble', { anchorX: 0, anchorY: 0 }); if (isUser) { bubbleGraphic.tint = 0xDCF8C6; // Light green for user messages } self.messageText = new Text2(message, { size: 24, fill: 0x333333 }); self.messageText.x = 20; self.messageText.y = 15; self.addChild(self.messageText); // Adjust height based on content var textHeight = self.messageText.height + 30; var bubbleHeight = Math.max(textHeight, 60); bubbleGraphic.height = bubbleHeight; return self; }); var ChatPanel = Container.expand(function () { var self = Container.call(this); var panelGraphic = self.attachAsset('chatPanel', { anchorX: 0, anchorY: 0 }); self.messages = []; self.messageContainer = new Container(); self.addChild(self.messageContainer); self.messageContainer.x = 50; self.messageContainer.y = 20; self.inputField = self.addChild(LK.getAsset('inputField', { anchorX: 0, anchorY: 0 })); self.inputField.x = 50; self.inputField.y = panelGraphic.height - 80; self.inputText = new Text2('Type a message...', { size: 24, fill: 0x888888 }); self.inputText.x = self.inputField.x + 20; self.inputText.y = self.inputField.y + 18; self.addChild(self.inputText); var sendButton = new Button('Send', 80, 60, 'sendButton'); sendButton.x = self.inputField.x + self.inputField.width + 40; sendButton.y = self.inputField.y + 30; self.addChild(sendButton); self.addMessage = function (message, isUser) { var bubble = new ChatBubble(message, isUser); if (self.messages.length > 0) { var lastMessage = self.messages[self.messages.length - 1]; bubble.y = lastMessage.y + lastMessage.height + 10; } self.messages.push(bubble); self.messageContainer.addChild(bubble); // Limit messages and scroll if needed if (self.messages.length > 8) { var oldMessage = self.messages.shift(); self.messageContainer.removeChild(oldMessage); // Adjust positions for (var i = 0; i < self.messages.length; i++) { if (i === 0) { self.messages[i].y = 0; } else { self.messages[i].y = self.messages[i - 1].y + self.messages[i - 1].height + 10; } } } LK.getSound('message').play(); }; self.clearMessages = function () { for (var i = 0; i < self.messages.length; i++) { self.messageContainer.removeChild(self.messages[i]); } self.messages = []; }; self.sendMessage = function () { if (self.inputText.text !== 'Type a message...' && self.inputText.text.trim() !== '') { var message = self.inputText.text; self.addMessage(message, true); self.inputText.setText('Type a message...'); // Simulate response after delay LK.setTimeout(function () { var responses = ["That's interesting!", "I see what you mean.", "Let's play a game instead?", "Cool! Want to try tic-tac-toe?", "I agree completely."]; var randomResponse = responses[Math.floor(Math.random() * responses.length)]; self.addMessage(randomResponse, false); }, 1000 + Math.random() * 1000); return message; } return null; }; // Input field interaction self.inputField.down = function () { if (self.inputText.text === 'Type a message...') { self.inputText.setText(''); self.inputText.style.fill = "#333333"; } }; sendButton.down = function () { sendButton.up(); self.sendMessage(); }; return self; }); var CreateRoomPanel = Container.expand(function () { var self = Container.call(this); var panelGraphic = self.attachAsset('chatPanel', { anchorX: 0.5, anchorY: 0.5, width: 800, height: 500 }); var titleText = new Text2('Create a New Room', { size: 40, fill: 0x2C3E50 }); titleText.anchor.set(0.5, 0); titleText.y = -panelGraphic.height / 2 + 50; self.addChild(titleText); var nameLabel = new Text2('Room Name:', { size: 28, fill: 0x2C3E50 }); nameLabel.anchor.set(0, 0.5); nameLabel.x = -panelGraphic.width / 2 + 50; nameLabel.y = -50; self.addChild(nameLabel); var nameField = self.addChild(LK.getAsset('inputField', { anchorX: 0, anchorY: 0.5, width: 500, height: 60 })); nameField.x = -panelGraphic.width / 2 + 200; nameField.y = -50; self.nameText = new Text2('Enter room name...', { size: 24, fill: 0x888888 }); self.nameText.x = nameField.x + 20; self.nameText.y = nameField.y - 10; self.addChild(self.nameText); var typeLabel = new Text2('Room Type:', { size: 28, fill: 0x2C3E50 }); typeLabel.anchor.set(0, 0.5); typeLabel.x = -panelGraphic.width / 2 + 50; typeLabel.y = 50; self.addChild(typeLabel); var typeOptions = ['Public', 'Private']; var typeButton = new Button(typeOptions[0], 200, 60); typeButton.x = -panelGraphic.width / 2 + 250; typeButton.y = 50; self.addChild(typeButton); var createButton = new Button('Create Room', 250, 80); createButton.x = 0; createButton.y = 150; self.addChild(createButton); var cancelButton = new Button('Cancel', 250, 80); cancelButton.x = 0; cancelButton.y = 250; self.addChild(cancelButton); // Initialize input field interaction nameField.down = function () { if (self.nameText.text === 'Enter room name...') { self.nameText.setText(''); self.nameText.style.fill = "#333333"; } }; typeButton.down = function () { typeButton.up(); // Toggle between public and private if (typeButton.label.text === 'Public') { typeButton.setLabel('Private'); } else { typeButton.setLabel('Public'); } LK.getSound('select').play(); }; createButton.down = function () { createButton.up(); var roomName = self.nameText.text; if (roomName && roomName !== 'Enter room name...' && roomName.trim() !== '') { if (typeof self.onCreateRoom === 'function') { self.onCreateRoom({ name: roomName, type: typeButton.label.text }); } } }; cancelButton.down = function () { cancelButton.up(); if (typeof self.onCancel === 'function') { self.onCancel(); } }; self.onCreateRoom = null; self.onCancel = null; return self; }); var JoinRoomPanel = Container.expand(function () { var self = Container.call(this); var panelGraphic = self.attachAsset('chatPanel', { anchorX: 0.5, anchorY: 0.5, width: 900, height: 800 }); var titleText = new Text2('Join a Room', { size: 40, fill: 0x2C3E50 }); titleText.anchor.set(0.5, 0); titleText.y = -panelGraphic.height / 2 + 50; self.addChild(titleText); self.roomsContainer = new Container(); self.roomsContainer.x = -panelGraphic.width / 2 + 100; self.roomsContainer.y = -panelGraphic.height / 2 + 150; self.addChild(self.roomsContainer); var refreshButton = new Button('Refresh', 150, 60); refreshButton.x = panelGraphic.width / 2 - 100; refreshButton.y = -panelGraphic.height / 2 + 100; self.addChild(refreshButton); var backButton = new Button('Back', 250, 80); backButton.x = 0; backButton.y = panelGraphic.height / 2 - 100; self.addChild(backButton); self.rooms = []; self.populateRooms = function (roomsData) { // Clear existing rooms while (self.roomsContainer.children.length > 0) { self.roomsContainer.removeChild(self.roomsContainer.children[0]); } self.rooms = roomsData; // Add room list items for (var i = 0; i < roomsData.length; i++) { var roomItem = new RoomListItem(roomsData[i].name, roomsData[i].players); roomItem.y = i * 100; roomItem.onJoin = function (roomName) { if (typeof self.onJoinRoom === 'function') { self.onJoinRoom(roomName); } }; self.roomsContainer.addChild(roomItem); } }; refreshButton.down = function () { refreshButton.up(); if (typeof self.onRefresh === 'function') { self.onRefresh(); } }; backButton.down = function () { backButton.up(); if (typeof self.onBack === 'function') { self.onBack(); } }; self.onJoinRoom = null; self.onRefresh = null; self.onBack = null; return self; }); var MainMenu = Container.expand(function () { var self = Container.call(this); var titleText = new Text2('Chat Party Games', { size: 80, fill: 0x2C3E50 }); titleText.anchor.set(0.5, 0); titleText.x = 2048 / 2; titleText.y = 150; self.addChild(titleText); var avatar = new Avatar(); avatar.x = 2048 / 2; avatar.y = 400; self.addChild(avatar); var playButton = new Button('Play Now', 300, 100); playButton.x = 2048 / 2; playButton.y = 650; self.addChild(playButton); var createRoomButton = new Button('Create Room', 300, 100); createRoomButton.x = 2048 / 2; createRoomButton.y = 800; self.addChild(createRoomButton); var joinRoomButton = new Button('Join Room', 300, 100); joinRoomButton.x = 2048 / 2; joinRoomButton.y = 950; self.addChild(joinRoomButton); var settingsButton = new Button('Settings', 300, 100); settingsButton.x = 2048 / 2; settingsButton.y = 1100; self.addChild(settingsButton); self.setUsername = function (name) { avatar.setName(name); }; self.setAvatarColor = function (color) { avatar.setColor(color); }; self.onPlay = null; self.onCreateRoom = null; self.onJoinRoom = null; self.onSettings = null; playButton.down = function () { playButton.up(); if (typeof self.onPlay === 'function') { self.onPlay(); } }; createRoomButton.down = function () { createRoomButton.up(); if (typeof self.onCreateRoom === 'function') { self.onCreateRoom(); } }; joinRoomButton.down = function () { joinRoomButton.up(); if (typeof self.onJoinRoom === 'function') { self.onJoinRoom(); } }; settingsButton.down = function () { settingsButton.up(); if (typeof self.onSettings === 'function') { self.onSettings(); } }; return self; }); var RockPaperScissorsGame = Container.expand(function () { var self = Container.call(this); var boardGraphic = self.attachAsset('tictactoeBoard', { anchorX: 0.5, anchorY: 0.5 }); self.playerChoice = null; self.computerChoice = null; self.gameActive = true; self.statusText = new Text2("Choose your move", { size: 32, fill: 0x333333 }); self.statusText.anchor.set(0.5, 0); self.statusText.y = boardGraphic.height / 2 + 40; self.addChild(self.statusText); // Create choice buttons var choices = ['Rock', 'Paper', 'Scissors']; var choiceButtons = []; for (var i = 0; i < choices.length; i++) { var button = new Button(choices[i], 180, 60); button.x = (i - 1) * 200; button.y = -50; button.choice = choices[i].toLowerCase(); button.down = function () { this.up(); if (self.gameActive) { self.makeChoice(this.choice); } }; self.addChild(button); choiceButtons.push(button); } // Result display self.playerDisplay = new Text2("", { size: 28, fill: 0x333333 }); self.playerDisplay.anchor.set(0.5, 0.5); self.playerDisplay.x = -100; self.playerDisplay.y = 50; self.addChild(self.playerDisplay); self.computerDisplay = new Text2("", { size: 28, fill: 0x333333 }); self.computerDisplay.anchor.set(0.5, 0.5); self.computerDisplay.x = 100; self.computerDisplay.y = 50; self.addChild(self.computerDisplay); self.makeChoice = function (choice) { self.playerChoice = choice; self.playerDisplay.setText("You: " + choice); // Computer makes a choice var options = ['rock', 'paper', 'scissors']; self.computerChoice = options[Math.floor(Math.random() * options.length)]; self.computerDisplay.setText("Computer: " + self.computerChoice); LK.getSound('select').play(); // Determine winner var result = self.determineWinner(); self.gameActive = false; if (result === 'win') { self.statusText.setText("You win!"); } else if (result === 'lose') { self.statusText.setText("You lose!"); } else { self.statusText.setText("It's a tie!"); } LK.getSound('gameover').play(); LK.setTimeout(function () { if (typeof self.onGameOver === 'function') { self.onGameOver(result); } }, 2000); }; self.determineWinner = function () { if (self.playerChoice === self.computerChoice) { return 'tie'; } if (self.playerChoice === 'rock' && self.computerChoice === 'scissors' || self.playerChoice === 'paper' && self.computerChoice === 'rock' || self.playerChoice === 'scissors' && self.computerChoice === 'paper') { return 'win'; } return 'lose'; }; self.reset = function () { self.playerChoice = null; self.computerChoice = null; self.gameActive = true; self.statusText.setText("Choose your move"); self.playerDisplay.setText(""); self.computerDisplay.setText(""); }; return self; }); var RoomListItem = Container.expand(function (roomName, playerCount) { var self = Container.call(this); var itemGraphic = self.attachAsset('roomListItem', { anchorX: 0, anchorY: 0 }); self.roomNameText = new Text2(roomName, { size: 28, fill: 0x333333 }); self.roomNameText.x = 20; self.roomNameText.y = 15; self.addChild(self.roomNameText); self.playerCountText = new Text2(playerCount + " players", { size: 20, fill: 0x888888 }); self.playerCountText.x = 20; self.playerCountText.y = 50; self.addChild(self.playerCountText); var joinButton = new Button('Join', 120, 50, 'joinButton'); joinButton.x = itemGraphic.width - 80; joinButton.y = itemGraphic.height / 2; self.addChild(joinButton); self.down = function () { tween(itemGraphic, { tint: 0xf0f0f0 }, { duration: 100 }); }; self.up = function () { tween(itemGraphic, { tint: 0xffffff }, { duration: 100 }); }; joinButton.down = function () { joinButton.up(); if (typeof self.onJoin === 'function') { self.onJoin(roomName); } }; return self; }); var Settings = Container.expand(function () { var self = Container.call(this); var titleText = new Text2('Settings', { size: 60, fill: 0x2C3E50 }); titleText.anchor.set(0.5, 0); titleText.x = 2048 / 2; titleText.y = 150; self.addChild(titleText); var usernameLabel = new Text2('Username:', { size: 32, fill: 0x2C3E50 }); usernameLabel.anchor.set(0, 0.5); usernameLabel.x = 600; usernameLabel.y = 350; self.addChild(usernameLabel); var usernameField = self.addChild(LK.getAsset('inputField', { anchorX: 0, anchorY: 0.5, width: 500, height: 60 })); usernameField.x = 800; usernameField.y = 350; self.usernameText = new Text2('Player', { size: 24, fill: 0x333333 }); self.usernameText.x = usernameField.x + 20; self.usernameText.y = usernameField.y - 10; self.addChild(self.usernameText); var colorLabel = new Text2('Avatar Color:', { size: 32, fill: 0x2C3E50 }); colorLabel.anchor.set(0, 0.5); colorLabel.x = 600; colorLabel.y = 450; self.addChild(colorLabel); var colorButtons = []; var colors = ['#3498db', '#e74c3c', '#2ecc71', '#f39c12', '#9b59b6']; for (var i = 0; i < colors.length; i++) { var colorButton = self.addChild(LK.getAsset('avatar', { anchorX: 0.5, anchorY: 0.5, width: 60, height: 60 })); colorButton.x = 850 + i * 100; colorButton.y = 450; colorButton.tint = parseInt(colors[i].replace('#', '0x')); colorButton.color = colors[i]; colorButton.interactive = true; colorButton.down = function () { self.selectedColor = this.color; self.updateColorSelection(); LK.getSound('select').play(); }; colorButtons.push(colorButton); } var languageLabel = new Text2('Language:', { size: 32, fill: 0x2C3E50 }); languageLabel.anchor.set(0, 0.5); languageLabel.x = 600; languageLabel.y = 550; self.addChild(languageLabel); var languages = ['English', 'Spanish', 'French', 'German', 'Japanese']; var languageDropdown = new Button(languages[0], 300, 60); languageDropdown.x = 850; languageDropdown.y = 550; self.addChild(languageDropdown); var saveButton = new Button('Save Changes', 300, 80); saveButton.x = 2048 / 2; saveButton.y = 700; self.addChild(saveButton); var backButton = new Button('Back', 300, 80); backButton.x = 2048 / 2; backButton.y = 800; self.addChild(backButton); self.selectedColor = colors[0]; self.updateColorSelection = function () { for (var i = 0; i < colorButtons.length; i++) { if (colorButtons[i].color === self.selectedColor) { colorButtons[i].alpha = 1; } else { colorButtons[i].alpha = 0.6; } } }; self.setValues = function (username, color) { self.usernameText.setText(username); self.selectedColor = color; self.updateColorSelection(); }; // Initialize username input field interaction usernameField.down = function () { if (self.usernameText.text === 'Player') { self.usernameText.setText(''); } }; languageDropdown.down = function () { languageDropdown.up(); // Cycle through languages var currentIndex = languages.indexOf(languageDropdown.label.text); var nextIndex = (currentIndex + 1) % languages.length; languageDropdown.setLabel(languages[nextIndex]); LK.getSound('select').play(); }; saveButton.down = function () { saveButton.up(); if (typeof self.onSave === 'function') { self.onSave({ username: self.usernameText.text, color: self.selectedColor, language: languageDropdown.label.text }); } }; backButton.down = function () { backButton.up(); if (typeof self.onBack === 'function') { self.onBack(); } }; self.onSave = null; self.onBack = null; self.updateColorSelection(); return self; }); var TicTacToeGame = Container.expand(function () { var self = Container.call(this); var boardGraphic = self.attachAsset('tictactoeBoard', { anchorX: 0.5, anchorY: 0.5 }); self.cells = []; self.gameBoard = [['', '', ''], ['', '', ''], ['', '', '']]; self.currentPlayer = 'X'; self.gameActive = true; // Create cells for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { var cell = self.addChild(LK.getAsset('tictactoeCell', { anchorX: 0.5, anchorY: 0.5 })); cell.row = row; cell.col = col; cell.x = (col - 1) * 150; cell.y = (row - 1) * 150; cell.content = ''; cell.down = function () { if (self.gameActive && this.content === '') { self.makeMove(this.row, this.col); } }; self.cells.push(cell); } } self.statusText = new Text2("Player X's turn", { size: 32, fill: 0x333333 }); self.statusText.anchor.set(0.5, 0); self.statusText.y = boardGraphic.height / 2 + 40; self.addChild(self.statusText); self.makeMove = function (row, col) { if (!self.gameActive || self.gameBoard[row][col] !== '') { return; } // Update game board self.gameBoard[row][col] = self.currentPlayer; // Find the cell and update visually for (var i = 0; i < self.cells.length; i++) { var cell = self.cells[i]; if (cell.row === row && cell.col === col) { cell.content = self.currentPlayer; if (self.currentPlayer === 'X') { var x = cell.addChild(LK.getAsset('tictactoeX', { anchorX: 0.5, anchorY: 0.5 })); tween(x, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.bounceOut, onStart: function onStart() { x.scaleX = 0; x.scaleY = 0; } }); } else { var o = cell.addChild(LK.getAsset('tictactoeO', { anchorX: 0.5, anchorY: 0.5 })); tween(o, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.bounceOut, onStart: function onStart() { o.scaleX = 0; o.scaleY = 0; } }); } break; } } LK.getSound('select').play(); // Check for winner var winner = self.checkWinner(); if (winner) { self.gameActive = false; self.statusText.setText('Player ' + winner + ' wins!'); LK.getSound('gameover').play(); LK.setTimeout(function () { if (typeof self.onGameOver === 'function') { self.onGameOver(winner); } }, 2000); } else if (self.checkDraw()) { self.gameActive = false; self.statusText.setText("It's a draw!"); LK.getSound('gameover').play(); LK.setTimeout(function () { if (typeof self.onGameOver === 'function') { self.onGameOver(null); } }, 2000); } else { // Switch player self.currentPlayer = self.currentPlayer === 'X' ? 'O' : 'X'; self.statusText.setText("Player " + self.currentPlayer + "'s turn"); // If current player is O (AI), make an automated move if (self.currentPlayer === 'O') { LK.setTimeout(function () { self.makeAIMove(); }, 1000); } } }; self.checkWinner = function () { var lines = [ // Rows [[0, 0], [0, 1], [0, 2]], [[1, 0], [1, 1], [1, 2]], [[2, 0], [2, 1], [2, 2]], // Columns [[0, 0], [1, 0], [2, 0]], [[0, 1], [1, 1], [2, 1]], [[0, 2], [1, 2], [2, 2]], // Diagonals [[0, 0], [1, 1], [2, 2]], [[0, 2], [1, 1], [2, 0]]]; for (var i = 0; i < lines.length; i++) { var _lines$i = _slicedToArray(lines[i], 3), _lines$i$ = _slicedToArray(_lines$i[0], 2), a = _lines$i$[0], b = _lines$i$[1], _lines$i$2 = _slicedToArray(_lines$i[1], 2), c = _lines$i$2[0], d = _lines$i$2[1], _lines$i$3 = _slicedToArray(_lines$i[2], 2), e = _lines$i$3[0], f = _lines$i$3[1]; if (self.gameBoard[a][b] && self.gameBoard[a][b] === self.gameBoard[c][d] && self.gameBoard[a][b] === self.gameBoard[e][f]) { return self.gameBoard[a][b]; } } return null; }; self.checkDraw = function () { for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { if (self.gameBoard[row][col] === '') { return false; } } } return true; }; self.makeAIMove = function () { if (!self.gameActive) return; // Find empty cells var emptyCells = []; for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { if (self.gameBoard[row][col] === '') { emptyCells.push({ row: row, col: col }); } } } if (emptyCells.length > 0) { var randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)]; self.makeMove(randomCell.row, randomCell.col); } }; self.reset = function () { // Clear the board for (var row = 0; row < 3; row++) { for (var col = 0; col < 3; col++) { self.gameBoard[row][col] = ''; } } // Reset cell visuals for (var i = 0; i < self.cells.length; i++) { var cell = self.cells[i]; cell.content = ''; // Remove all children (X or O graphics) while (cell.children.length > 0) { cell.removeChild(cell.children[0]); } } self.currentPlayer = 'X'; self.gameActive = true; self.statusText.setText("Player X's turn"); }; return self; }); var WordGuessingGame = Container.expand(function () { var self = Container.call(this); var boardGraphic = self.attachAsset('tictactoeBoard', { anchorX: 0.5, anchorY: 0.5, width: 700, height: 500 }); var words = ["APPLE", "BANANA", "ORANGE", "GRAPE", "CHERRY", "LEMON", "KIWI", "MELON", "PEACH", "PLUM"]; var currentWord = ""; var guessedLetters = []; var remainingGuesses = 6; var gameActive = true; self.statusText = new Text2("Guess the fruit!", { size: 32, fill: 0x333333 }); self.statusText.anchor.set(0.5, 0); self.statusText.y = -boardGraphic.height / 2 + 40; self.addChild(self.statusText); self.wordDisplay = new Text2("", { size: 48, fill: 0x333333 }); self.wordDisplay.anchor.set(0.5, 0.5); self.wordDisplay.y = -50; self.addChild(self.wordDisplay); self.guessesText = new Text2("Remaining guesses: 6", { size: 28, fill: 0x333333 }); self.guessesText.anchor.set(0.5, 0.5); self.guessesText.y = 50; self.addChild(self.guessesText); // Create letter buttons var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var letterButtons = []; var buttonSize = 60; var buttonsPerRow = 7; for (var i = 0; i < letters.length; i++) { var button = new Button(letters[i], buttonSize, buttonSize); var row = Math.floor(i / buttonsPerRow); var col = i % buttonsPerRow; button.x = (col - 3) * (buttonSize + 10); button.y = 120 + row * (buttonSize + 10); button.letter = letters[i]; button.down = function () { this.up(); if (gameActive && guessedLetters.indexOf(this.letter) === -1) { self.makeGuess(this.letter); this.alpha = 0.5; } }; self.addChild(button); letterButtons.push(button); } self.init = function () { currentWord = words[Math.floor(Math.random() * words.length)]; guessedLetters = []; remainingGuesses = 6; gameActive = true; // Reset letter buttons for (var i = 0; i < letterButtons.length; i++) { letterButtons[i].alpha = 1; } self.updateWordDisplay(); self.guessesText.setText("Remaining guesses: " + remainingGuesses); self.statusText.setText("Guess the fruit!"); }; self.updateWordDisplay = function () { var display = ""; for (var i = 0; i < currentWord.length; i++) { if (guessedLetters.indexOf(currentWord[i]) !== -1) { display += currentWord[i] + " "; } else { display += "_ "; } } self.wordDisplay.setText(display); }; self.makeGuess = function (letter) { guessedLetters.push(letter); LK.getSound('select').play(); if (currentWord.indexOf(letter) === -1) { remainingGuesses--; self.guessesText.setText("Remaining guesses: " + remainingGuesses); if (remainingGuesses <= 0) { gameActive = false; self.statusText.setText("Game Over! The word was: " + currentWord); LK.getSound('gameover').play(); LK.setTimeout(function () { if (typeof self.onGameOver === 'function') { self.onGameOver(false); } }, 2000); } } else { self.updateWordDisplay(); // Check if all letters have been guessed var won = true; for (var i = 0; i < currentWord.length; i++) { if (guessedLetters.indexOf(currentWord[i]) === -1) { won = false; break; } } if (won) { gameActive = false; self.statusText.setText("You won!"); LK.getSound('gameover').play(); LK.setTimeout(function () { if (typeof self.onGameOver === 'function') { self.onGameOver(true); } }, 2000); } } }; self.reset = function () { self.init(); }; self.init(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf5f7fa }); /**** * Game Code ****/ // Main app state function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var currentScreen = 'main'; // 'main', 'lobby', 'room', 'game', 'settings', 'createRoom', 'joinRoom' var currentGame = null; // 'tictactoe', 'rockpaper', 'wordguess' var username = storage.username || 'Player'; var avatarColor = storage.color || '#3498db'; var language = 'English'; var currentRoomName = ''; // Create UI containers for different screens var mainMenuScreen = new Container(); var lobbyScreen = new Container(); var roomScreen = new Container(); var gameScreen = new Container(); var settingsScreen = new Container(); var createRoomScreen = new Container(); var joinRoomScreen = new Container(); // Setup main menu var mainMenu = new MainMenu(); mainMenu.x = 0; mainMenu.y = 0; mainMenu.setUsername(username); mainMenu.setAvatarColor(avatarColor); mainMenuScreen.addChild(mainMenu); // Setup settings var settings = new Settings(); settings.x = 0; settings.y = 0; settings.setValues(username, avatarColor); settingsScreen.addChild(settings); // Setup create room panel var createRoomPanel = new CreateRoomPanel(); createRoomPanel.x = 2048 / 2; createRoomPanel.y = 2732 / 2; createRoomScreen.addChild(createRoomPanel); // Setup join room panel var joinRoomPanel = new JoinRoomPanel(); joinRoomPanel.x = 2048 / 2; joinRoomPanel.y = 2732 / 2; joinRoomScreen.addChild(joinRoomPanel); // Set up lobby screen var lobbyTitle = new Text2('Chat Party Games', { size: 80, fill: 0x2C3E50 }); lobbyTitle.anchor.set(0.5, 0); lobbyTitle.x = 2048 / 2; lobbyTitle.y = 100; lobbyScreen.addChild(lobbyTitle); var usernameText = new Text2('Your Name: ' + username, { size: 32, fill: 0x666666 }); usernameText.anchor.set(0.5, 0); usernameText.x = 2048 / 2; usernameText.y = 250; lobbyScreen.addChild(usernameText); var avatar = new Avatar(); avatar.x = 2048 / 2; avatar.y = 400; avatar.setName(username); avatar.setColor(avatarColor); lobbyScreen.addChild(avatar); var roomListTitle = new Text2('Available Rooms', { size: 40, fill: 0x2C3E50 }); roomListTitle.anchor.set(0.5, 0); roomListTitle.x = 2048 / 2; roomListTitle.y = 600; lobbyScreen.addChild(roomListTitle); // Create room list var roomList = new Container(); roomList.x = (2048 - 700) / 2; roomList.y = 680; lobbyScreen.addChild(roomList); var lobbyButtonsContainer = new Container(); lobbyButtonsContainer.x = 2048 / 2; lobbyButtonsContainer.y = 2500; lobbyScreen.addChild(lobbyButtonsContainer); var createRoomButton = new Button('Create Room', 250, 80); createRoomButton.x = 0; createRoomButton.y = 0; lobbyButtonsContainer.addChild(createRoomButton); var joinRoomButton = new Button('Join Room', 250, 80); joinRoomButton.x = 0; joinRoomButton.y = 100; lobbyButtonsContainer.addChild(joinRoomButton); var backToMainButton = new Button('Main Menu', 250, 80); backToMainButton.x = 0; backToMainButton.y = 200; lobbyButtonsContainer.addChild(backToMainButton); // Setup room screen var roomTitle = new Text2('Room: Lobby', { size: 40, fill: 0x2C3E50 }); roomTitle.anchor.set(0.5, 0); roomTitle.x = 2048 / 2; roomTitle.y = 50; roomScreen.addChild(roomTitle); var chatPanel = new ChatPanel(); chatPanel.x = (2048 - 800) / 2; chatPanel.y = 120; roomScreen.addChild(chatPanel); var gameButtonsContainer = new Container(); gameButtonsContainer.x = 2048 / 2; gameButtonsContainer.y = 1800; roomScreen.addChild(gameButtonsContainer); var tictactoeButton = new Button('Tic-Tac-Toe', 250, 80); tictactoeButton.x = 0; tictactoeButton.y = 0; gameButtonsContainer.addChild(tictactoeButton); var rockpaperButton = new Button('Rock Paper Scissors', 250, 80); rockpaperButton.x = 0; rockpaperButton.y = 100; gameButtonsContainer.addChild(rockpaperButton); var wordguessButton = new Button('Word Guessing', 250, 80); wordguessButton.x = 0; wordguessButton.y = 200; gameButtonsContainer.addChild(wordguessButton); var backToLobbyButton = new Button('Back to Lobby', 250, 80); backToLobbyButton.x = 0; backToLobbyButton.y = 350; gameButtonsContainer.addChild(backToLobbyButton); // Setup game screen var gameTitle = new Text2('Game', { size: 40, fill: 0x2C3E50 }); gameTitle.anchor.set(0.5, 0); gameTitle.x = 2048 / 2; gameTitle.y = 50; gameScreen.addChild(gameTitle); // Create game instances var ticTacToeGame = new TicTacToeGame(); ticTacToeGame.x = 2048 / 2; ticTacToeGame.y = 2732 / 2 - 200; ticTacToeGame.visible = false; gameScreen.addChild(ticTacToeGame); var rockPaperScissorsGame = new RockPaperScissorsGame(); rockPaperScissorsGame.x = 2048 / 2; rockPaperScissorsGame.y = 2732 / 2 - 200; rockPaperScissorsGame.visible = false; gameScreen.addChild(rockPaperScissorsGame); var wordGuessingGame = new WordGuessingGame(); wordGuessingGame.x = 2048 / 2; wordGuessingGame.y = 2732 / 2 - 200; wordGuessingGame.visible = false; gameScreen.addChild(wordGuessingGame); var backToRoomButton = new Button('Back to Room', 250, 80); backToRoomButton.x = 2048 / 2; backToRoomButton.y = 2500; gameScreen.addChild(backToRoomButton); // Add all screens to game game.addChild(mainMenuScreen); game.addChild(lobbyScreen); game.addChild(roomScreen); game.addChild(gameScreen); game.addChild(settingsScreen); game.addChild(createRoomScreen); game.addChild(joinRoomScreen); // Initially hide all screens except main menu lobbyScreen.visible = false; roomScreen.visible = false; gameScreen.visible = false; settingsScreen.visible = false; createRoomScreen.visible = false; joinRoomScreen.visible = false; // Function to switch between screens function showScreen(screenName, gameType) { mainMenuScreen.visible = false; lobbyScreen.visible = false; roomScreen.visible = false; gameScreen.visible = false; settingsScreen.visible = false; createRoomScreen.visible = false; joinRoomScreen.visible = false; currentScreen = screenName; if (screenName === 'main') { mainMenuScreen.visible = true; mainMenu.setUsername(username); mainMenu.setAvatarColor(avatarColor); } else if (screenName === 'lobby') { lobbyScreen.visible = true; usernameText.setText('Your Name: ' + username); avatar.setName(username); avatar.setColor(avatarColor); populateRoomList(); } else if (screenName === 'room') { roomScreen.visible = true; roomTitle.setText('Room: ' + currentRoomName); chatPanel.clearMessages(); chatPanel.addMessage('Welcome to ' + currentRoomName + '!', false); } else if (screenName === 'game') { gameScreen.visible = true; // Hide all games ticTacToeGame.visible = false; rockPaperScissorsGame.visible = false; wordGuessingGame.visible = false; // Show the selected game if (gameType === 'tictactoe') { currentGame = 'tictactoe'; gameTitle.setText('Tic-Tac-Toe'); ticTacToeGame.visible = true; ticTacToeGame.reset(); } else if (gameType === 'rockpaper') { currentGame = 'rockpaper'; gameTitle.setText('Rock Paper Scissors'); rockPaperScissorsGame.visible = true; rockPaperScissorsGame.reset(); } else if (gameType === 'wordguess') { currentGame = 'wordguess'; gameTitle.setText('Word Guessing'); wordGuessingGame.visible = true; wordGuessingGame.reset(); } } else if (screenName === 'settings') { settingsScreen.visible = true; settings.setValues(username, avatarColor); } else if (screenName === 'createRoom') { createRoomScreen.visible = true; } else if (screenName === 'joinRoom') { joinRoomScreen.visible = true; // Populate rooms in join panel var rooms = getAvailableRooms(); joinRoomPanel.populateRooms(rooms); } } // Get available rooms function getAvailableRooms() { // Sample rooms var rooms = [{ name: 'Game Night', players: 4 }, { name: 'Casual Fun', players: 2 }, { name: 'Board Game Lovers', players: 7 }, { name: 'Quick Games', players: 3 }]; // Add stored rooms if any if (storage.rooms && storage.rooms.length > 0) { for (var i = 0; i < storage.rooms.length; i++) { rooms.push({ name: storage.rooms[i], players: Math.floor(Math.random() * 5) + 1 }); } } return rooms; } // Populate the room list function populateRoomList() { // Clear existing rooms while (roomList.children.length > 0) { roomList.removeChild(roomList.children[0]); } var rooms = getAvailableRooms(); for (var i = 0; i < rooms.length; i++) { var roomItem = new RoomListItem(rooms[i].name, rooms[i].players); roomItem.y = i * 100; roomList.addChild(roomItem); roomItem.onJoin = function (roomName) { currentRoomName = roomName; showScreen('room'); }; } } // Event Handlers for Main Menu mainMenu.onPlay = function () { showScreen('lobby'); }; mainMenu.onCreateRoom = function () { showScreen('createRoom'); }; mainMenu.onJoinRoom = function () { showScreen('joinRoom'); }; mainMenu.onSettings = function () { showScreen('settings'); }; // Event Handlers for Settings settings.onSave = function (data) { username = data.username; avatarColor = data.color; language = data.language; // Save to storage storage.username = username; storage.color = avatarColor; // Update UI mainMenu.setUsername(username); mainMenu.setAvatarColor(avatarColor); showScreen('main'); }; settings.onBack = function () { showScreen('main'); }; // Event Handlers for Create Room createRoomPanel.onCreateRoom = function (roomData) { var roomName = roomData.name; // Store new room if (!storage.rooms) storage.rooms = []; storage.rooms.push(roomName); // Join the new room currentRoomName = roomName; showScreen('room'); }; createRoomPanel.onCancel = function () { showScreen('main'); }; // Event Handlers for Join Room joinRoomPanel.onJoinRoom = function (roomName) { currentRoomName = roomName; showScreen('room'); }; joinRoomPanel.onRefresh = function () { var rooms = getAvailableRooms(); joinRoomPanel.populateRooms(rooms); }; joinRoomPanel.onBack = function () { showScreen('main'); }; // Event handlers for lobby createRoomButton.down = function () { createRoomButton.up(); showScreen('createRoom'); }; joinRoomButton.down = function () { joinRoomButton.up(); showScreen('joinRoom'); }; backToMainButton.down = function () { backToMainButton.up(); showScreen('main'); }; // Event handlers for room tictactoeButton.down = function () { tictactoeButton.up(); showScreen('game', 'tictactoe'); }; rockpaperButton.down = function () { rockpaperButton.up(); showScreen('game', 'rockpaper'); }; wordguessButton.down = function () { wordguessButton.up(); showScreen('game', 'wordguess'); }; backToLobbyButton.down = function () { backToLobbyButton.up(); showScreen('lobby'); }; // Event handlers for game screen backToRoomButton.down = function () { backToRoomButton.up(); showScreen('room'); }; // Game over handlers ticTacToeGame.onGameOver = function (winner) { if (winner) { chatPanel.addMessage('You ' + (winner === 'X' ? 'won' : 'lost') + ' the Tic-Tac-Toe game!', false); } else { chatPanel.addMessage('The Tic-Tac-Toe game ended in a draw!', false); } LK.setTimeout(function () { showScreen('room'); }, 1000); }; rockPaperScissorsGame.onGameOver = function (result) { if (result === 'win') { chatPanel.addMessage('You won the Rock Paper Scissors game!', false); } else if (result === 'lose') { chatPanel.addMessage('You lost the Rock Paper Scissors game!', false); } else { chatPanel.addMessage('The Rock Paper Scissors game ended in a tie!', false); } LK.setTimeout(function () { showScreen('room'); }, 1000); }; wordGuessingGame.onGameOver = function (won) { if (won) { chatPanel.addMessage('You guessed the word correctly!', false); } else { chatPanel.addMessage('You ran out of guesses in the Word Guessing game!', false); } LK.setTimeout(function () { showScreen('room'); }, 1000); }; // Initialize the game LK.playMusic('bgmusic'); // Update loop game.update = function () { // Nothing needed in update loop for this game }; // Initial setup showScreen('main');
===================================================================
--- original.js
+++ change.js
@@ -259,9 +259,9 @@
};
createButton.down = function () {
createButton.up();
var roomName = self.nameText.text;
- if (roomName !== 'Enter room name...' && roomName.trim() !== '') {
+ if (roomName && roomName !== 'Enter room name...' && roomName.trim() !== '') {
if (typeof self.onCreateRoom === 'function') {
self.onCreateRoom({
name: roomName,
type: typeButton.label.text