bc/server_modules/data.js
2025-05-09 12:11:07 +00:00

341 lines
21 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_modules/data.js
// console.log("Загрузка data.js..."); // Для отладки на сервере
// Проверка зависимости от config.js (на сервере это будет через require)
// Мы предполагаем, что GAME_CONFIG будет доступен в контексте, где используется gameData,
// либо его нужно будет передавать в функции, которые зависят от него.
// Для простоты здесь мы не будем делать require('./config') прямо в этом файле,
// а будем полагаться на то, что GAME_CONFIG будет доступен там, где он нужен.
// Если вы хотите строгую инкапсуляцию, можно передавать GAME_CONFIG как аргумент
// в функции-конструкторы или методы, которые используют эти данные.
// --- Данные Игры (Статы, Способности, Насмешки) ---
/*
=========================================
=== ПРЕДЫСТОРИЯ: ТРАГЕДИЯ ЕЛЕНЫ И БАЛАРДА ===
=========================================
... (Ваша предыстория остается здесь без изменений, она не влияет на код) ...
=========================================
*/
// Статы Игрока (Елена)
const playerBaseStats = {
id: 'player', // Используем строки напрямую, т.к. GAME_CONFIG может быть не импортирован здесь
name: "Елена",
maxHp: 120,
maxResource: 150,
attackPower: 15,
resourceName: "Мана"
};
// Статы Противника (Балард)
const opponentBaseStats = {
id: 'opponent',
name: "Балард",
maxHp: 140,
maxResource: 100,
attackPower: 20,
resourceName: "Ярость"
};
// Способности Игрока (Елена)
// Для cost, power, duration, effectDuration, cooldown - значения должны быть из GAME_CONFIG, если они там определены,
// либо заданы здесь напрямую. Для примера, я оставлю как в вашем исходном файле,
// но в реальном проекте лучше ссылаться на GAME_CONFIG для консистентности.
const playerAbilities = [
{
id: 'heal', // Соответствует GAME_CONFIG.ABILITY_ID_HEAL
name: 'Малое Исцеление',
cost: 20,
type: 'heal', // Соответствует GAME_CONFIG.ACTION_TYPE_HEAL
power: 30,
description: 'Восстанавливает ~30 HP'
},
{
id: 'fireball', // Соответствует GAME_CONFIG.ABILITY_ID_FIREBALL
name: 'Огненный Шар',
cost: 30,
type: 'damage', // Соответствует GAME_CONFIG.ACTION_TYPE_DAMAGE
power: 25,
description: 'Наносит ~25 урона врагу'
},
{
id: 'naturesStrength', // Соответствует GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH
name: 'Сила Природы',
cost: 15,
type: 'buff', // Соответствует GAME_CONFIG.ACTION_TYPE_BUFF
duration: 4,
// NATURE_STRENGTH_MANA_REGEN из GAME_CONFIG будет использоваться в gameLogic
descriptionFunction: (config) => `Восст. ${config.NATURE_STRENGTH_MANA_REGEN} маны при след. атаке (${4 - 1} хода)`,
isDelayed: true
},
{
id: 'defenseAura', // Соответствует GAME_CONFIG.ABILITY_ID_DEFENSE_AURA
name: 'Аура Защиты',
cost: 15,
type: 'buff',
duration: 3,
grantsBlock: true,
// BLOCK_DAMAGE_REDUCTION из GAME_CONFIG будет использоваться в gameLogic
descriptionFunction: (config) => `Снижает урон на ${config.BLOCK_DAMAGE_REDUCTION * 100}% (${3} хода)`
},
{
id: 'hypnoticGaze', // Соответствует GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE
name: 'Гипнотический взгляд',
cost: 30,
type: 'disable', // Соответствует GAME_CONFIG.ACTION_TYPE_DISABLE
effectDuration: 2,
cooldown: 6,
power: 5, // Урон в ход от взгляда
description: 'Накладывает на Баларда полное безмолвие на 2 хода и наносит 5 урона каждый его ход. КД: 6 х.'
},
{
id: 'sealOfWeakness', // Соответствует GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS
name: 'Печать Слабости',
cost: 30,
type: 'debuff', // Соответствует GAME_CONFIG.ACTION_TYPE_DEBUFF
effectDuration: 3,
power: 10, // Количество Ярости, сжигаемое каждый ход Баларда
cooldown: 5,
descriptionFunction: (config, oppStats) => `Накладывает на Баларда печать, сжигающую 10 ${oppStats.resourceName} каждый его ход в течение 3 ходов. КД: 5 х.`
}
];
// Способности Противника (Балард) - используются для AI и отображения информации
const opponentAbilities = [
{
id: 'darkPatronage', // Соответствует GAME_CONFIG.ABILITY_ID_BALARD_HEAL
name: 'Покровительство Тьмы',
cost: 20,
type: 'heal',
power: 25,
successRate: 0.60, // Можно вынести в GAME_CONFIG
description: 'Исцеляет ~25 HP с 60% шансом',
// Условие будет использоваться в AI логике на сервере
condition: (opSt, plSt, currentGameState, config) => { // config = GAME_CONFIG
return (opSt.currentHp / opSt.maxHp) * 100 < config.OPPONENT_HEAL_THRESHOLD_PERCENT;
}
},
{
id: 'echoesOfSilence', // Соответствует GAME_CONFIG.ABILITY_ID_BALARD_SILENCE
name: 'Эхо Безмолвия',
cost: 15, // Должно соответствовать GAME_CONFIG.BALARD_SILENCE_ABILITY_COST
type: 'disable',
// successRate и duration будут из GAME_CONFIG
descriptionFunction: (config) => `Шанс ${config.SILENCE_SUCCESS_RATE * 100}% заглушить случайное заклинание Елены на ${config.SILENCE_DURATION} х.`,
condition: (opSt, plSt, currentGameState, config) => {
const hpPercent = (opSt.currentHp / opSt.maxHp) * 100;
const isElenaAlreadySilenced = currentGameState?.player.disabledAbilities?.length > 0 ||
currentGameState?.player.activeEffects?.some(eff => eff.id.startsWith('playerSilencedOn_'));
return hpPercent >= config.OPPONENT_HEAL_THRESHOLD_PERCENT && !isElenaAlreadySilenced && currentGameState.opponent.silenceCooldownTurns <= 0;
},
successRateFromConfig: 'SILENCE_SUCCESS_RATE', // Указание на ключ в GAME_CONFIG
durationFromConfig: 'SILENCE_DURATION', // Указание на ключ в GAME_CONFIG
internalCooldownFromConfig: 'BALARD_SILENCE_INTERNAL_COOLDOWN'
},
{
id: 'manaDrainHeal', // Соответствует GAME_CONFIG.ABILITY_ID_BALARD_MANA_DRAIN
name: 'Похищение Света',
cost: 10,
type: 'drain', // Специальный тип для этой логики
powerManaDrain: 5,
powerDamage: 5,
powerHealthGainFactor: 1.0,
description: `Вытягивает 5 Маны у Елены, наносит 5 урона и восстанавливает себе здоровье (100% от украденного).`,
condition: (opSt, plSt, currentGameState, config) => {
const playerManaPercent = (plSt.currentResource / plSt.maxResource) * 100;
const playerHasHighMana = playerManaPercent > (config.BALARD_MANA_DRAIN_HIGH_MANA_THRESHOLD || 60); // Используем из конфига
return playerHasHighMana && currentGameState.opponent.manaDrainCooldownTurns <= 0;
},
internalCooldownValue: 3 // Можно вынести в GAME_CONFIG
}
];
// --- Система Насмешек Елены ---
// Эта система может использоваться на сервере для выбора насмешек,
// которые затем отправляются клиенту для отображения в логе.
const elenaTauntSystem = {
base: {
mercifulAttack: [
"Балард, прошу, остановись. Еще не поздно.",
"Эта битва бессмысленна...",
"Зачем проливать кровь? Мы можем найти другой путь.",
"Опомнись! Это не твой истинный путь.",
"Не заставляй меня причинять тебе боль.",
"Вспомни, кем ты был до того, как тьма завладела тобой!",
"Мы не должны быть врагами.",
],
mercifulCast: [
"Даже сейчас, я пытаюсь исцелить не только тело...",
"Свет стремится к гармонии, Балард, не к разрушению.",
"Я укрепляю себя не ради победы, но ради исполнения долга.",
"Надеюсь, этот свет коснется и твоей заблудшей искры.",
"Сила дана нам для служения, а не для зла.",
"Возможно, увидев силу Света, ты одумаешься.",
"Свет сильнее любой тьмы, помни это."
],
dominating: {
creatorVsCreation: [
"Глина не спорит с гончаром, Балард! Прекрати жалкое сопротивление!",
"Ты забыл свое место, создание? На колени!",
"Молчать! Твой темный лепет осквернение!",
Анхат! А ты лишь моя ошибка, которую я сейчас стираю.",
"Инструмент сломался. Приходится чинить болью… или выбрасывать.",
"Каждый твой вздох по моей милости. Не забывай.",
"Повинуйся! Это единственное, что ты должен был делать!",
"Я решаю твою судьбу. Всегда решала. Смирись!",
"Твое тело глина в моих руках. Я слепила тебя. Я и разобью.",
],
betrayalOfLight: [
"Ты мог ходить в сиянии Света! Ты ИЗБРАЛ эту гниль! Получай возмездие!",
"Ты плюнул в Источник! За такое кощунство платят агонией!",
"Клятвы, что ты должен был хранить… Тьма выжгла в тебе и память, и честь?",
"Эта тьма на тебе клеймо Иуды! Печать предателя!",
"Ты растоптал мою веру! За такое не прощают!",
"Как мог ты променять вечность на этот морок?",
"Предавший раз предаст и дважды.",
"Ты был моей надеждой… Стал моим величайшим позором!",
"Ты отвернулся от Света, глупец! Теперь он тебя покарает!"
],
ingratitudeContempt: [
"Самый страшный грех - грех неблагодарности!",
"Ты мне мерзок, Балард.",
"Пытаешься лестью вернуть то, что тебе никогда не принадлежало?",
"Фальшивка! От доспехов до самой твоей фальшивой 'жизни'!",
"Жалкое зрелище.",
"Неблагодарность вот твое истинное имя!",
"Ты недостоин молока живой женщины!",
"Холодный металл вот твоя суть теперь.",
"Твоя зависть отравила тебя окончательно."
],
unmakingThreats: [
"Я сотру тебя с лика этой земли, как досадную ошибку!",
"Приготовься к забвению, презренный предатель Света!",
"Эта священная земля станет твоей могилой!",
"Считай последние удары своего мертвого 'сердца'!",
"Прах к праху… ржавчина к ржавчине! Вот твой удел!",
"Возвращайся в Ничто, порождение мрака и моей ошибки!",
"Это финал твоей жалкой пьесы, Балард!",
"Прими же свой приговор!",
"Время развоплощения настало!"
]
}
},
onPlayerCast: {
'heal': [
"Свет лечит, Балард. Но не искаженную завистью искру.",
"Я восстанавливаю силы, чтобы исполнить долг до конца.",
"Жизнь должна быть защищена.",
"Исцеление дар Творца, который ты отверг."
],
'fireball': [
"Прими очищающее пламя Света!",
"Этот Свет мог бы вести тебя, теперь он лишь карает!",
"За предательство боль!",
"Чувствуешь мощь Порядка?",
"Не прячься от Света, он все равно тебя найдет!"
],
'naturesStrength': [
"Сама земля отвергает тебя, я черпаю её силу!",
"Жизнь продолжается, Балард. Твой путь к концу.",
"Моя связь с миром нерушима.",
"Почувствуй силу истинной Жизни!",
],
'defenseAura': [
"Порядок восторжествует над твоим хаосом.",
"Твоя тьма не пробьет щит Света.",
"Я стою твердо, исполняя Клятву.",
"Моя защита воля Творца."
],
'hypnoticGaze': [
"Смотри мне в глаза, Балард. И слушай тишину.",
"Твои темные слова больше не потревожат этот мир.",
"Молчи. В тишине ты, быть может, услышишь отголоски Света, что ты предал.",
"Твоя воля слаба перед истинным Словом. Покойся.",
"Довольно слов. Твои деяния говорят громче.",
"Это не наказание, Балард. Это возможность... задуматься."
],
'sealOfWeakness': [
"Твоя ярость иссякнет, как вода в песке, Балард!",
"Эта печать ослабит твой темный огонь.",
"Чувствуешь, как сила покидает тебя?",
"С каждым мгновением твоя злоба будет таять.",
"Пусть твой гнев обратится в пепел!"
]
},
onOpponentAction: {
'darkPatronage': [ // ID способности Баларда
"Пытаешься отсрочить неизбежное жалкой темной силой?",
"Тьма дает тебе крохи, лишь чтобы продлить твою агонию.",
"Даже исцеляясь, ты лишь подчеркиваешь свою порчу.",
"Бесполезно. Развоплощение найдет тебя."
],
'echoesOfSilence': { // ID способности Баларда
success: [
"(Сдавленный вздох)... Ничтожная попытка заглушить Слово!",
"Тьма может сковать язык, но не Свет в душе!",
"Ты боишься моей силы? Правильно делаешь.",
],
fail: [
"Твой шепот Тьмы слаб против Света Истины!",
"Даже хаос не слушается тебя, падший.",
"Пустые угрозы, Балард.",
"Твои оковы не удержат Слово."
]
},
'manaDrainHeal': [ // ID способности Баларда
"Ты питаешься Светом, как паразит?!",
"Даже теперь ты пытаешься украсть то, что не можешь понять.",
"Твоя тьма лишь пожирает, не созидая.",
"Жалкая попытка продлить агонию за мой счет.",
"Неужели ты думаешь, что чужая сила заменит тебе Свет?"
],
attackBlocked: [
"Твои удары тщетны перед щитом Порядка.",
"Слепая сила разбивается о стойкость Света.",
"Я знала, что ты попытаешься, предсказуемый.",
"Твоя ненависть бессильна против Гармонии."
],
attackHits: [
"(Шипение боли)... Боль лишь напоминание о твоем предательстве.",
"Ты заплатишь за эту рану сторицей!",
"Тьма может коснуться плоти, но не сломить мой дух!",
"Рана заживет. Твоя порча нет."
]
},
onBattleState: {
startMerciful: [
"Балард, есть ли еще путь назад?",
"Да начнется это скорбное испытание...",
"Да направит меня Свет Творца.",
"Во имя Жизни, я должна остановить тебя."
],
opponentNearDefeat: [
"Конец близок, Балард. Прими свою судьбу.",
"Я почти завершила свой тяжкий долг...",
"Раскайся хотя бы перед Небытием! Хотя бы в своей неблагодарности!",
"Последние мгновения твоей искаженной искры...",
"Приготовься к Развоплощению!",
"Сейчас ты познаешь покой небытия.",
"Твоя песня почти спета, Балард.",
"Пора поставить точку."
]
}
};
// --- Экспорт Данных ---
const gameData = {
playerBaseStats,
opponentBaseStats,
playerAbilities,
opponentAbilities,
elenaTauntSystem
};
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = gameData;
}
// console.log("data.js загружен и gameData объект создан/экспортирован.", gameData);