From 761a3f6d31c1489b2afdbe57de8fe61ce965b292 Mon Sep 17 00:00:00 2001 From: Bonchellon Date: Tue, 27 Jan 2026 22:59:37 +0300 Subject: [PATCH] 123 --- public/game.js | 64 +++++++++++--------------------------------------- server.js | 47 ++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 62 deletions(-) diff --git a/public/game.js b/public/game.js index af5354b..2e36e37 100644 --- a/public/game.js +++ b/public/game.js @@ -1592,25 +1592,16 @@ return; } - // Специальная обработка для Грабежа - открываем модальное окно + // Специальная обработка для Грабежа - отправляем playSpell на сервер const spellCard = cardDb[spellMode.cardId]; if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) { // Выбираем противника (tp должен быть индексом противника, tb игнорируем для enemy_player) if (tp !== state.yourIndex && tp >= 0) { const targetPlayer = state.players[tp]; if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) { - stealCardsMode.active = true; - stealCardsMode.handIndex = spellMode.handIndex; - stealCardsMode.targetPlayerIndex = tp; - // Получаем актуальную доску из gameState - stealCardsMode.targetDeck = targetPlayer.board ? targetPlayer.board.map(m => m.cardId) : []; - stealCardsMode.selectedIndices = []; - showStealCardsModal(state, { - targetPlayerIndex: tp, - targetPlayerName: targetPlayer.name || `Игрок ${tp + 1}`, - targetBoardSize: targetPlayer.board.length, - maxCards: Math.min(2, targetPlayer.board.length) - }); + // Отправляем playSpell на сервер, чтобы сервер знал о выборе противника + socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null }); + // Сервер отправит stealCardsRequest, который откроет модальное окно spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' }; $('spell-mode')?.classList.add('hidden'); return; @@ -1635,24 +1626,15 @@ var tp = parseInt(el.dataset.dropPlayer ?? el.dataset.playerIndex, 10); var tb = parseInt(el.dataset.dropBoard ?? el.dataset.boardIndex, 10); - // Специальная обработка для Грабежа + // Специальная обработка для Грабежа - отправляем playSpell на сервер const spellCard = cardDb[spellMode.cardId]; if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) { if (tp !== state.yourIndex && tp >= 0) { const targetPlayer = state.players[tp]; if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) { - stealCardsMode.active = true; - stealCardsMode.handIndex = spellMode.handIndex; - stealCardsMode.targetPlayerIndex = tp; - // Получаем актуальную доску из gameState - stealCardsMode.targetDeck = targetPlayer.board ? targetPlayer.board.map(m => m.cardId) : []; - stealCardsMode.selectedIndices = []; - showStealCardsModal(state, { - targetPlayerIndex: tp, - targetPlayerName: targetPlayer.name || `Игрок ${tp + 1}`, - targetBoardSize: targetPlayer.board.length, - maxCards: Math.min(2, targetPlayer.board.length) - }); + // Отправляем playSpell на сервер, чтобы сервер знал о выборе противника + socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null }); + // Сервер отправит stealCardsRequest, который откроет модальное окно spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' }; $('spell-mode')?.classList.add('hidden'); return; @@ -1711,18 +1693,9 @@ if (tp === state.yourIndex || tp < 0) return; const targetPlayer = state.players[tp]; if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) { - stealCardsMode.active = true; - stealCardsMode.handIndex = spellMode.handIndex; - stealCardsMode.targetPlayerIndex = tp; - // Получаем актуальную доску из gameState - stealCardsMode.targetDeck = targetPlayer.board ? targetPlayer.board.map(m => m.cardId) : []; - stealCardsMode.selectedIndices = []; - showStealCardsModal(state, { - targetPlayerIndex: tp, - targetPlayerName: targetPlayer.name || `Игрок ${tp + 1}`, - targetBoardSize: targetPlayer.board.length, - maxCards: Math.min(2, targetPlayer.board.length) - }); + // Отправляем playSpell на сервер, чтобы сервер знал о выборе противника + socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null }); + // Сервер отправит stealCardsRequest, который откроет модальное окно spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' }; $('spell-mode')?.classList.add('hidden'); } @@ -1740,18 +1713,9 @@ if (tp === state.yourIndex || tp < 0) return; const targetPlayer = state.players[tp]; if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) { - stealCardsMode.active = true; - stealCardsMode.handIndex = spellMode.handIndex; - stealCardsMode.targetPlayerIndex = tp; - // Получаем актуальную доску из gameState - stealCardsMode.targetDeck = targetPlayer.board ? targetPlayer.board.map(m => m.cardId) : []; - stealCardsMode.selectedIndices = []; - showStealCardsModal(state, { - targetPlayerIndex: tp, - targetPlayerName: targetPlayer.name || `Игрок ${tp + 1}`, - targetBoardSize: targetPlayer.board.length, - maxCards: Math.min(2, targetPlayer.board.length) - }); + // Отправляем playSpell на сервер, чтобы сервер знал о выборе противника + socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null }); + // Сервер отправит stealCardsRequest, который откроет модальное окно spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' }; $('spell-mode')?.classList.add('hidden'); } diff --git a/server.js b/server.js index 5822838..6a97df0 100644 --- a/server.js +++ b/server.js @@ -1526,10 +1526,16 @@ function playSpell(room, socketId, handIndex, targetPlayerIndex, targetBoardInde const needTarget = card.spellTarget && card.spellTarget !== 'none'; // Специальная обработка для steal_cards - требует выбор противника и карт с его доски + // Если targetPlayerIndex указан, значит клиент уже выбрал противника и нужно отправить запрос на выбор карт if (eff === 'steal_cards') { - if (targetPlayerIndex == null || targetPlayerIndex === pi) return; + if (targetPlayerIndex == null || targetPlayerIndex === pi) { + // Если противник не выбран, просто возвращаемся (клиент должен выбрать противника) + return; + } const targetPlayer = gameState.players[targetPlayerIndex]; - if (!targetPlayer || targetPlayer.health <= 0 || !targetPlayer.board || targetPlayer.board.length === 0) return; + if (!targetPlayer || targetPlayer.health <= 0 || !targetPlayer.board || targetPlayer.board.length === 0) { + return; + } // Отправляем запрос на выбор карт для кражи const socket = io.sockets.sockets.get(p.id); @@ -1541,7 +1547,8 @@ function playSpell(room, socketId, handIndex, targetPlayerIndex, targetBoardInde maxCards: Math.min(2, targetPlayer.board.length) }); } - return; // Не тратим ману и не удаляем карту пока - это сделаем после выбора + // Не тратим ману и не удаляем карту пока - это сделаем в stealCardsFromDeck после выбора карт + return; } // Для других заклинаний проверяем targetBoardIndex только если это не выбор игрока @@ -2060,15 +2067,31 @@ io.on('connection', (socket) => { }); socket.on('getRoomsList', () => { - const roomsList = Array.from(rooms.entries()).map(([code, room]) => ({ - code, - playerCount: room.lobby?.length || 0, - maxPlayers: MAX_PLAYERS, - gameStarted: room.gameStarted || false, - hasAI: room.aiMode || false, - players: room.lobby?.map(p => p.name) || [], - spectators: (room.spectators || []).length - })); + const roomsList = Array.from(rooms.entries()).map(([code, room]) => { + if (room.gameStarted && room.gameState) { + // Для запущенных игр используем данные из gameState + return { + code, + playerCount: room.gameState.players?.length || 0, + maxPlayers: MAX_PLAYERS, + gameStarted: true, + hasAI: room.aiMode || false, + players: room.gameState.players?.map(p => p.name) || [], + spectators: (room.spectators || []).length + }; + } else { + // Для лобби используем данные из lobby + return { + code, + playerCount: room.lobby?.length || 0, + maxPlayers: MAX_PLAYERS, + gameStarted: false, + hasAI: room.aiMode || false, + players: room.lobby?.map(p => p.name) || [], + spectators: (room.spectators || []).length + }; + } + }); socket.emit('roomsList', roomsList); });