341 lines
21 KiB
JavaScript
341 lines
21 KiB
JavaScript
// /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);
|