Some checks failed
Deploy Project BC / deploy (push) Failing after 33s
154 lines
9.3 KiB
JavaScript
154 lines
9.3 KiB
JavaScript
// /server/game/logic/cooldownLogic.js
|
||
|
||
// GAME_CONFIG будет передаваться в функции как параметр configToUse
|
||
// const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужен для внутренних констант
|
||
|
||
/**
|
||
* Обрабатывает отсчет общих кулдаунов для способностей игрока в конце его хода.
|
||
* Длительность кулдауна уменьшается на 1.
|
||
* @param {object} cooldownsObject - Объект с кулдаунами способностей ({ abilityId: turnsLeft }).
|
||
* @param {Array<object>} 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<object>} disabledAbilitiesArray - Массив объектов заглушенных способностей.
|
||
* @param {Array<object>} 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
|
||
}; |