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