123
This commit is contained in:
@ -1592,25 +1592,16 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Специальная обработка для Грабежа - открываем модальное окно
|
// Специальная обработка для Грабежа - отправляем playSpell на сервер
|
||||||
const spellCard = cardDb[spellMode.cardId];
|
const spellCard = cardDb[spellMode.cardId];
|
||||||
if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) {
|
if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) {
|
||||||
// Выбираем противника (tp должен быть индексом противника, tb игнорируем для enemy_player)
|
// Выбираем противника (tp должен быть индексом противника, tb игнорируем для enemy_player)
|
||||||
if (tp !== state.yourIndex && tp >= 0) {
|
if (tp !== state.yourIndex && tp >= 0) {
|
||||||
const targetPlayer = state.players[tp];
|
const targetPlayer = state.players[tp];
|
||||||
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
||||||
stealCardsMode.active = true;
|
// Отправляем playSpell на сервер, чтобы сервер знал о выборе противника
|
||||||
stealCardsMode.handIndex = spellMode.handIndex;
|
socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null });
|
||||||
stealCardsMode.targetPlayerIndex = tp;
|
// Сервер отправит stealCardsRequest, который откроет модальное окно
|
||||||
// Получаем актуальную доску из 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)
|
|
||||||
});
|
|
||||||
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
||||||
$('spell-mode')?.classList.add('hidden');
|
$('spell-mode')?.classList.add('hidden');
|
||||||
return;
|
return;
|
||||||
@ -1635,24 +1626,15 @@
|
|||||||
var tp = parseInt(el.dataset.dropPlayer ?? el.dataset.playerIndex, 10);
|
var tp = parseInt(el.dataset.dropPlayer ?? el.dataset.playerIndex, 10);
|
||||||
var tb = parseInt(el.dataset.dropBoard ?? el.dataset.boardIndex, 10);
|
var tb = parseInt(el.dataset.dropBoard ?? el.dataset.boardIndex, 10);
|
||||||
|
|
||||||
// Специальная обработка для Грабежа
|
// Специальная обработка для Грабежа - отправляем playSpell на сервер
|
||||||
const spellCard = cardDb[spellMode.cardId];
|
const spellCard = cardDb[spellMode.cardId];
|
||||||
if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) {
|
if (spellCard && spellCard.spellEffect === 'steal_cards' && (spellCard.spellTarget === 'enemy_player' || spellCard.spellTarget === 'enemy_board')) {
|
||||||
if (tp !== state.yourIndex && tp >= 0) {
|
if (tp !== state.yourIndex && tp >= 0) {
|
||||||
const targetPlayer = state.players[tp];
|
const targetPlayer = state.players[tp];
|
||||||
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
||||||
stealCardsMode.active = true;
|
// Отправляем playSpell на сервер, чтобы сервер знал о выборе противника
|
||||||
stealCardsMode.handIndex = spellMode.handIndex;
|
socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null });
|
||||||
stealCardsMode.targetPlayerIndex = tp;
|
// Сервер отправит stealCardsRequest, который откроет модальное окно
|
||||||
// Получаем актуальную доску из 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)
|
|
||||||
});
|
|
||||||
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
||||||
$('spell-mode')?.classList.add('hidden');
|
$('spell-mode')?.classList.add('hidden');
|
||||||
return;
|
return;
|
||||||
@ -1711,18 +1693,9 @@
|
|||||||
if (tp === state.yourIndex || tp < 0) return;
|
if (tp === state.yourIndex || tp < 0) return;
|
||||||
const targetPlayer = state.players[tp];
|
const targetPlayer = state.players[tp];
|
||||||
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
||||||
stealCardsMode.active = true;
|
// Отправляем playSpell на сервер, чтобы сервер знал о выборе противника
|
||||||
stealCardsMode.handIndex = spellMode.handIndex;
|
socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null });
|
||||||
stealCardsMode.targetPlayerIndex = tp;
|
// Сервер отправит stealCardsRequest, который откроет модальное окно
|
||||||
// Получаем актуальную доску из 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)
|
|
||||||
});
|
|
||||||
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
||||||
$('spell-mode')?.classList.add('hidden');
|
$('spell-mode')?.classList.add('hidden');
|
||||||
}
|
}
|
||||||
@ -1740,18 +1713,9 @@
|
|||||||
if (tp === state.yourIndex || tp < 0) return;
|
if (tp === state.yourIndex || tp < 0) return;
|
||||||
const targetPlayer = state.players[tp];
|
const targetPlayer = state.players[tp];
|
||||||
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
if (targetPlayer && targetPlayer.board && targetPlayer.board.length > 0) {
|
||||||
stealCardsMode.active = true;
|
// Отправляем playSpell на сервер, чтобы сервер знал о выборе противника
|
||||||
stealCardsMode.handIndex = spellMode.handIndex;
|
socket.emit('playSpell', { handIndex: spellMode.handIndex, targetPlayerIndex: tp, targetBoardIndex: null });
|
||||||
stealCardsMode.targetPlayerIndex = tp;
|
// Сервер отправит stealCardsRequest, который откроет модальное окно
|
||||||
// Получаем актуальную доску из 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)
|
|
||||||
});
|
|
||||||
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
spellMode = { active: false, handIndex: -1, cardId: '', spellTarget: '' };
|
||||||
$('spell-mode')?.classList.add('hidden');
|
$('spell-mode')?.classList.add('hidden');
|
||||||
}
|
}
|
||||||
|
|||||||
35
server.js
35
server.js
@ -1526,10 +1526,16 @@ function playSpell(room, socketId, handIndex, targetPlayerIndex, targetBoardInde
|
|||||||
const needTarget = card.spellTarget && card.spellTarget !== 'none';
|
const needTarget = card.spellTarget && card.spellTarget !== 'none';
|
||||||
|
|
||||||
// Специальная обработка для steal_cards - требует выбор противника и карт с его доски
|
// Специальная обработка для steal_cards - требует выбор противника и карт с его доски
|
||||||
|
// Если targetPlayerIndex указан, значит клиент уже выбрал противника и нужно отправить запрос на выбор карт
|
||||||
if (eff === 'steal_cards') {
|
if (eff === 'steal_cards') {
|
||||||
if (targetPlayerIndex == null || targetPlayerIndex === pi) return;
|
if (targetPlayerIndex == null || targetPlayerIndex === pi) {
|
||||||
|
// Если противник не выбран, просто возвращаемся (клиент должен выбрать противника)
|
||||||
|
return;
|
||||||
|
}
|
||||||
const targetPlayer = gameState.players[targetPlayerIndex];
|
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);
|
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)
|
maxCards: Math.min(2, targetPlayer.board.length)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return; // Не тратим ману и не удаляем карту пока - это сделаем после выбора
|
// Не тратим ману и не удаляем карту пока - это сделаем в stealCardsFromDeck после выбора карт
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Для других заклинаний проверяем targetBoardIndex только если это не выбор игрока
|
// Для других заклинаний проверяем targetBoardIndex только если это не выбор игрока
|
||||||
@ -2060,15 +2067,31 @@ io.on('connection', (socket) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.on('getRoomsList', () => {
|
socket.on('getRoomsList', () => {
|
||||||
const roomsList = Array.from(rooms.entries()).map(([code, room]) => ({
|
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,
|
code,
|
||||||
playerCount: room.lobby?.length || 0,
|
playerCount: room.lobby?.length || 0,
|
||||||
maxPlayers: MAX_PLAYERS,
|
maxPlayers: MAX_PLAYERS,
|
||||||
gameStarted: room.gameStarted || false,
|
gameStarted: false,
|
||||||
hasAI: room.aiMode || false,
|
hasAI: room.aiMode || false,
|
||||||
players: room.lobby?.map(p => p.name) || [],
|
players: room.lobby?.map(p => p.name) || [],
|
||||||
spectators: (room.spectators || []).length
|
spectators: (room.spectators || []).length
|
||||||
}));
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
socket.emit('roomsList', roomsList);
|
socket.emit('roomsList', roomsList);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user