New update

This commit is contained in:
2026-01-27 22:45:36 +03:00
parent 7d5769ac8b
commit dedc2635f2
3 changed files with 125 additions and 66 deletions

View File

@ -122,9 +122,18 @@ function initGame(room) {
// Если режим ИИ, добавляем ИИ игрока
if (room.aiMode) {
const starWarsHeroes = [
'Darth Maul', 'Count Dooku', 'General Grievous', 'Grand Moff Tarkin',
'Admiral Thrawn', 'Kylo Ren', 'Snoke', 'General Hux',
'Captain Phasma', 'Moff Gideon', 'Cad Bane', 'Asajj Ventress',
'Savage Opress', 'Darth Sidious', 'Darth Tyranus', 'Darth Plagueis',
'Jango Fett', 'Boba Fett', 'IG-88', 'Bossk',
'Dengar', 'Zuckuss', '4-LOM', 'Aurra Sing'
];
const randomHero = starWarsHeroes[Math.floor(Math.random() * starWarsHeroes.length)];
players.push({
id: 'AI_' + Date.now(),
name: 'ИИ Противник',
name: randomHero,
deck: createDeck(factionChoice),
hand: [],
board: [],
@ -1076,6 +1085,28 @@ function applySynergies(room) {
}
}
});
// Аура: Пока Дарт Вейдер на поле, все джедаи противника получают -1/-1
if (card.aura === 'jedi_debuff_enemy') {
gameState.players.forEach((enemyPlayer, enemyPlayerIndex) => {
if (enemyPlayerIndex !== playerIndex && enemyPlayer.board) {
enemyPlayer.board.forEach((enemyMinion) => {
const enemyCard = cardDb[enemyMinion.cardId];
if (enemyCard && (enemyCard.name?.includes('Jedi') ||
enemyCard.id === 'luke' || enemyCard.id === 'obiwan' ||
enemyCard.id === 'ahsoka' || enemyCard.id === 'mace' ||
enemyCard.id === 'quigon' || enemyCard.id === 'plo_koon' ||
enemyCard.id === 'ki_adi' || enemyCard.id === 'aayla' ||
enemyCard.id === 'shaak_ti' || enemyCard.id === 'kanan' ||
enemyCard.id === 'ezra' || enemyCard.id === 'cal_kestis' ||
enemyCard.id === 'yoda' || enemyCard.id === 'anakin')) {
enemyMinion.synergyAttackBonus = (enemyMinion.synergyAttackBonus || 0) - 1;
enemyMinion.synergyHealthBonus = (enemyMinion.synergyHealthBonus || 0) - 1;
}
});
}
});
}
}
// Люк Скайуокер даёт +1/+1 всем повстанцам
@ -1195,17 +1226,39 @@ function applySynergies(room) {
});
}
// Энакин даёт +1/+1 Оби-Вану
// Энакин даёт +1/+1 Оби-Вану, Падме и Асоке
if (card.id === 'anakin' || card.name === 'Anakin Skywalker') {
player.board.forEach((other, otherIdx) => {
if (idx !== otherIdx) {
const otherCard = cardDb[other.cardId];
if (otherCard && (otherCard.id === 'obiwan' || otherCard.name === 'Obi-Wan Kenobi')) {
if (otherCard && (otherCard.id === 'obiwan' || otherCard.name === 'Obi-Wan Kenobi' ||
otherCard.id === 'padme' || otherCard.name === 'Padmé Amidala' ||
otherCard.id === 'ahsoka' || otherCard.name === 'Ahsoka Tano')) {
other.synergyAttackBonus = (other.synergyAttackBonus || 0) + 1;
other.synergyHealthBonus = (other.synergyHealthBonus || 0) + 1;
}
}
});
// Аура: Пока Анакин на поле, все джедаи получают +1/+1
if (card.aura === 'jedi_buff_all') {
player.board.forEach((other, otherIdx) => {
if (idx !== otherIdx) {
const otherCard = cardDb[other.cardId];
if (otherCard && (otherCard.name?.includes('Jedi') ||
otherCard.id === 'luke' || otherCard.id === 'obiwan' ||
otherCard.id === 'ahsoka' || otherCard.id === 'mace' ||
otherCard.id === 'quigon' || otherCard.id === 'plo_koon' ||
otherCard.id === 'ki_adi' || otherCard.id === 'aayla' ||
otherCard.id === 'shaak_ti' || otherCard.id === 'kanan' ||
otherCard.id === 'ezra' || otherCard.id === 'cal_kestis' ||
otherCard.id === 'yoda')) {
other.synergyAttackBonus = (other.synergyAttackBonus || 0) + 1;
other.synergyHealthBonus = (other.synergyHealthBonus || 0) + 1;
}
}
});
}
}
// Йода даёт +1/+1 всем джедаям
@ -1390,11 +1443,11 @@ function playSpell(room, socketId, handIndex, targetPlayerIndex, targetBoardInde
const eff = card.spellEffect;
const needTarget = card.spellTarget && card.spellTarget !== 'none';
// Специальная обработка для steal_cards - требует только выбор противника (не требует targetBoardIndex)
// Специальная обработка для steal_cards - требует выбор противника и карт с его доски
if (eff === 'steal_cards') {
if (targetPlayerIndex == null || targetPlayerIndex === pi) return;
const targetPlayer = gameState.players[targetPlayerIndex];
if (!targetPlayer || targetPlayer.health <= 0 || !targetPlayer.deck || targetPlayer.deck.length === 0) return;
if (!targetPlayer || targetPlayer.health <= 0 || !targetPlayer.board || targetPlayer.board.length === 0) return;
// Отправляем запрос на выбор карт для кражи
const socket = io.sockets.sockets.get(p.id);
@ -1402,8 +1455,8 @@ function playSpell(room, socketId, handIndex, targetPlayerIndex, targetBoardInde
socket.emit('stealCardsRequest', {
targetPlayerIndex: targetPlayerIndex,
targetPlayerName: targetPlayer.name || `Игрок ${targetPlayerIndex + 1}`,
targetDeckSize: targetPlayer.deck.length,
maxCards: Math.min(2, targetPlayer.deck.length)
targetBoardSize: targetPlayer.board.length,
maxCards: Math.min(2, targetPlayer.board.length)
});
}
return; // Не тратим ману и не удаляем карту пока - это сделаем после выбора
@ -1579,22 +1632,25 @@ function stealCardsFromDeck(room, socketId, handIndex, targetPlayerIndex, cardIn
const targetPlayer = gameState.players[targetPlayerIndex];
if (!targetPlayer || targetPlayerIndex === pi || targetPlayer.health <= 0) return;
if (!targetPlayer.deck || targetPlayer.deck.length === 0) return;
if (!targetPlayer.board || targetPlayer.board.length === 0) return;
// Проверяем индексы карт
// Проверяем индексы карт на доске
if (!Array.isArray(cardIndices) || cardIndices.length === 0 || cardIndices.length > 2) return;
const validIndices = cardIndices.filter(idx => idx >= 0 && idx < targetPlayer.deck.length);
const validIndices = cardIndices.filter(idx => idx >= 0 && idx < targetPlayer.board.length);
if (validIndices.length === 0) return;
// Убираем дубликаты и сортируем по убыванию (чтобы удалять с конца)
const uniqueIndices = [...new Set(validIndices)].sort((a, b) => b - a);
// Крадём карты
// Крадём карты с доски противника
const stolenCards = [];
uniqueIndices.forEach(idx => {
if (idx >= 0 && idx < targetPlayer.deck.length) {
stolenCards.push(targetPlayer.deck[idx]);
targetPlayer.deck.splice(idx, 1);
uniqueIndices.forEach(boardIdx => {
if (boardIdx >= 0 && boardIdx < targetPlayer.board.length) {
const minion = targetPlayer.board[boardIdx];
if (minion && minion.cardId) {
stolenCards.push(minion.cardId);
targetPlayer.board.splice(boardIdx, 1);
}
}
});