// /server/game/logic/cooldownLogic.js // GAME_CONFIG будет передаваться в функции как параметр configToUse // const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужен для внутренних констант /** * Обрабатывает отсчет общих кулдаунов для способностей игрока в конце его хода. * Длительность кулдауна уменьшается на 1. * @param {object} cooldownsObject - Объект с кулдаунами способностей ({ abilityId: turnsLeft }). * @param {Array} characterAbilities - Полный список способностей персонажа (для получения имени). * @param {string} characterName - Имя персонажа (для лога). * @param {function} addToLogCallback - Функция для добавления лога. * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). */ function processPlayerAbilityCooldowns(cooldownsObject, characterAbilities, characterName, addToLogCallback, configToUse) { if (!cooldownsObject || !characterAbilities) { // console.warn(`[CooldownLogic] processPlayerAbilityCooldowns: Missing cooldownsObject or characterAbilities for ${characterName}`); return; } for (const abilityId in cooldownsObject) { // Проверяем, что свойство принадлежит самому объекту, а не прототипу, и что кулдаун активен if (Object.prototype.hasOwnProperty.call(cooldownsObject, abilityId) && cooldownsObject[abilityId] > 0) { cooldownsObject[abilityId]--; // Уменьшаем кулдаун if (cooldownsObject[abilityId] === 0) { const ability = characterAbilities.find(ab => ab.id === abilityId); if (ability && addToLogCallback) { addToLogCallback( `Способность "${ability.name}" персонажа ${characterName} снова готова!`, configToUse.LOG_TYPE_INFO // Используем LOG_TYPE_INFO из переданного конфига ); } } } } } /** * Обрабатывает отсчет для отключенных (заглушенных) способностей игрока в конце его хода. * Длительность заглушения уменьшается на 1. * @param {Array} disabledAbilitiesArray - Массив объектов заглушенных способностей. * @param {Array} characterAbilities - Полный список способностей персонажа (для получения имени). * @param {string} characterName - Имя персонажа (для лога). * @param {function} addToLogCallback - Функция для добавления лога. * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). */ function processDisabledAbilities(disabledAbilitiesArray, characterAbilities, characterName, addToLogCallback, configToUse) { if (!disabledAbilitiesArray || disabledAbilitiesArray.length === 0) { return; } const stillDisabled = []; // Новый массив для активных заглушений for (let i = 0; i < disabledAbilitiesArray.length; i++) { const dis = disabledAbilitiesArray[i]; dis.turnsLeft--; // Уменьшаем длительность заглушения if (dis.turnsLeft > 0) { stillDisabled.push(dis); } else { // Заглушение закончилось if (addToLogCallback) { const ability = characterAbilities.find(ab => ab.id === dis.abilityId); if (ability) { addToLogCallback( `Способность "${ability.name}" персонажа ${characterName} больше не заглушена!`, configToUse.LOG_TYPE_INFO ); } else { // Если способность не найдена по ID (маловероятно, но возможно при ошибках данных) addToLogCallback( `Заглушение для неизвестной способности персонажа ${characterName} (ID: ${dis.abilityId}) закончилось.`, configToUse.LOG_TYPE_INFO ); } } // Также нужно удалить соответствующий эффект из activeEffects, если он там был (например, playerSilencedOn_X) // Это должно происходить в effectsLogic.processEffects, когда эффект с id `playerSilencedOn_${dis.abilityId}` истекает. // Здесь мы только управляем массивом `disabledAbilities`. } } // Обновляем исходный массив, удаляя истекшие заглушения disabledAbilitiesArray.length = 0; // Очищаем массив (сохраняя ссылку, если она используется где-то еще) disabledAbilitiesArray.push(...stillDisabled); // Добавляем обратно только те, что еще активны } /** * Устанавливает или обновляет кулдаун для способности. * Также обрабатывает специальные внутренние кулдауны для Баларда. * @param {object} ability - Объект способности, для которой устанавливается кулдаун. * @param {object} casterState - Состояние персонажа, применившего способность. * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). */ function setAbilityCooldown(ability, casterState, configToUse) { if (!ability || !casterState || !casterState.abilityCooldowns) { console.warn("[CooldownLogic] setAbilityCooldown: Missing ability, casterState, or casterState.abilityCooldowns."); return; } let baseCooldown = 0; if (typeof ability.cooldown === 'number' && ability.cooldown > 0) { // Убедимся, что исходный КД > 0 baseCooldown = ability.cooldown; } // Специальные внутренние КД для Баларда - они могут перебивать общий КД if (casterState.characterKey === 'balard') { if (ability.id === configToUse.ABILITY_ID_BALARD_SILENCE && typeof ability.internalCooldownFromConfig === 'string' && // Проверяем, что есть ключ для конфига typeof configToUse[ability.internalCooldownFromConfig] === 'number') { // Устанавливаем значение для специального счетчика КД Баларда casterState.silenceCooldownTurns = configToUse[ability.internalCooldownFromConfig]; // Этот специальный КД также становится текущим общим КД для этой способности baseCooldown = configToUse[ability.internalCooldownFromConfig]; } else if (ability.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN && typeof ability.internalCooldownValue === 'number') { // Здесь КД задан прямо в данных способности casterState.manaDrainCooldownTurns = ability.internalCooldownValue; baseCooldown = ability.internalCooldownValue; } } if (baseCooldown > 0) { // Устанавливаем кулдаун. Добавляем +1, так как кулдаун уменьшится в конце текущего хода // (когда будет вызван processPlayerAbilityCooldowns для этого персонажа). casterState.abilityCooldowns[ability.id] = baseCooldown + 1; } else { // Если у способности нет базового кулдауна (baseCooldown === 0), // убеждаемся, что в abilityCooldowns для нее стоит 0. casterState.abilityCooldowns[ability.id] = 0; } } /** * Обрабатывает специальные кулдауны для Баларда в конце его хода. * @param {object} balardState - Состояние Баларда. */ function processBalardSpecialCooldowns(balardState) { if (balardState.characterKey !== 'balard') return; if (balardState.silenceCooldownTurns !== undefined && balardState.silenceCooldownTurns > 0) { balardState.silenceCooldownTurns--; } if (balardState.manaDrainCooldownTurns !== undefined && balardState.manaDrainCooldownTurns > 0) { balardState.manaDrainCooldownTurns--; } } module.exports = { processPlayerAbilityCooldowns, processDisabledAbilities, setAbilityCooldown, processBalardSpecialCooldowns };