bc/server/game/logic/cooldownLogic.js
svoboda200786@gmail.com d0241d6053
Some checks failed
Deploy Project BC / deploy (push) Failing after 33s
test
2025-06-10 00:23:43 +03:00

154 lines
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// /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
};