// /public/js/gameSetup.js export function initGameSetup(dependencies) { const { socket, clientState, ui } = dependencies; const { createAIGameButton, createPvPGameButton, joinPvPGameButton, findRandomPvPGameButton, gameIdInput, availableGamesDiv, pvpCharacterRadios } = ui.elements; // --- Вспомогательные функции --- function getSelectedCharacterKey() { let selectedKey = 'elena'; // Значение по умолчанию if (pvpCharacterRadios) { pvpCharacterRadios.forEach(radio => { if (radio.checked) { selectedKey = radio.value; } }); } return selectedKey; } function updateAvailableGamesList(games) { if (!availableGamesDiv) return; availableGamesDiv.innerHTML = '
Нет доступных игр. Создайте свою!
'; } ui.enableSetupButtons(); // Включаем основные кнопки создания/поиска после обновления списка } // --- Обработчики событий DOM --- if (createAIGameButton) { createAIGameButton.addEventListener('click', () => { if (!clientState.isLoggedIn) { ui.setGameStatusMessage("Пожалуйста, войдите, чтобы создать игру.", true); return; } ui.disableSetupButtons(); // Для AI игры персонаж может быть фиксированным или выбираемым // В вашем client.js был 'elena', оставим так socket.emit('createGame', { mode: 'ai', characterKey: 'elena' }); ui.setGameStatusMessage("Создание игры против AI..."); }); } if (createPvPGameButton) { createPvPGameButton.addEventListener('click', () => { if (!clientState.isLoggedIn) { ui.setGameStatusMessage("Пожалуйста, войдите, чтобы создать игру.", true); return; } ui.disableSetupButtons(); const characterKey = getSelectedCharacterKey(); socket.emit('createGame', { mode: 'pvp', characterKey: characterKey }); ui.setGameStatusMessage("Создание PvP игры..."); }); } if (joinPvPGameButton) { joinPvPGameButton.addEventListener('click', () => { if (!clientState.isLoggedIn) { ui.setGameStatusMessage("Пожалуйста, войдите, чтобы присоединиться к игре.", true); return; } const gameId = gameIdInput ? gameIdInput.value.trim() : ''; if (gameId) { ui.disableSetupButtons(); socket.emit('joinGame', { gameId: gameId }); ui.setGameStatusMessage(`Присоединение к игре ${gameId}...`); } else { ui.setGameStatusMessage("Введите ID игры, чтобы присоединиться.", true); } }); } if (findRandomPvPGameButton) { findRandomPvPGameButton.addEventListener('click', () => { if (!clientState.isLoggedIn) { ui.setGameStatusMessage("Пожалуйста, войдите, чтобы найти игру.", true); return; } ui.disableSetupButtons(); const characterKey = getSelectedCharacterKey(); socket.emit('findRandomGame', { characterKey: characterKey }); ui.setGameStatusMessage("Поиск случайной PvP игры..."); }); } // --- Обработчики событий Socket.IO --- // gameCreated: Сервер присылает это после успешного createGame // Это событие может быть важным для установки currentGameId и myPlayerId // перед тем, как придет gameStarted или waitingForOpponent. socket.on('gameCreated', (data) => { if (!clientState.isLoggedIn) return; // Игнорируем, если не залогинены console.log('[GameSetup] Game created by this client:', data); clientState.currentGameId = data.gameId; clientState.myPlayerId = data.yourPlayerId; // Сервер должен прислать роль создателя ui.updateGlobalWindowVariablesForUI(); // Обновляем глобальные переменные для ui.js // Если это PvP игра, обычно сервер следом пришлет 'waitingForOpponent' // Если AI, то сразу 'gameStarted' // На этом этапе UI не меняем кардинально, ждем следующего события. // ui.setGameStatusMessage(`Игра ${data.gameId.substring(0,8)} создана. Ожидание...`); // Кнопки уже должны быть заблокированы ui.disableSetupButtons() }); socket.on('availablePvPGamesList', (games) => { if (!clientState.isLoggedIn) return; // Только для залогиненных пользователей updateAvailableGamesList(games); }); // Это событие приходит, когда игрок искал случайную игру, но свободных не было, // и сервер создал новую игру для этого игрока. socket.on('noPendingGamesFound', (data) => { if (!clientState.isLoggedIn) return; ui.setGameStatusMessage(data.message || "Свободных игр не найдено. Создана новая для вас. Ожидание оппонента..."); updateAvailableGamesList([]); // Очищаем список доступных игр, так как мы уже в созданной // clientState.currentGameId и clientState.myPlayerId должны были быть установлены // через событие 'gameCreated', которое сервер должен прислать перед 'noPendingGamesFound'. // Если 'gameCreated' не присылается в этом сценарии, нужно будет получать gameId и yourPlayerId из data 'noPendingGamesFound'. if (data.gameId) clientState.currentGameId = data.gameId; if (data.yourPlayerId) clientState.myPlayerId = data.yourPlayerId; ui.updateGlobalWindowVariablesForUI(); clientState.isInGame = false; // Мы еще не в активной фазе боя, а в ожидании // ui.disableGameControls(); // Будет вызвано из gameplay.js, если он уже был инициализирован // или неактуально, так как мы не на игровом экране ui.disableSetupButtons(); // Мы в ожидающей игре, кнопки выбора не нужны // Можно оставить кнопку "Создать PvP" активной для возможности "отменить" и создать другую, // но это усложнит логику. Пока блокируем все. // Если есть таймер, его нужно сбросить или показать "Ожидание" if (window.gameUI?.updateTurnTimerDisplay) { window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); // Таймер неактивен в ожидании } }); // waitingForOpponent: Когда PvP игра создана и ожидает второго игрока socket.on('waitingForOpponent', () => { if (!clientState.isLoggedIn) return; ui.setGameStatusMessage("Ожидание присоединения оппонента..."); // clientState.isInGame = false; // Уже должно быть false или будет установлено при gameStarted // ui.disableGameControls(); // не на игровом экране ui.disableSetupButtons(); // Блокируем кнопки создания/присоединения // Можно оставить кнопку "Создать PvP" или добавить кнопку "Отменить ожидание", // но это требует дополнительной логики на сервере и клиенте. // if (ui.elements.createPvPGameButton) ui.elements.createPvPGameButton.disabled = false; if (window.gameUI?.updateTurnTimerDisplay) { window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); } }); // Примечание: gameNotFound обрабатывается в main.js, так как он может сбросить // игрока на экран выбора игры или даже на экран логина. }