384 lines
21 KiB
JavaScript
384 lines
21 KiB
JavaScript
// /server_modules/data.js
|
||
|
||
const GAME_CONFIG = require('./config'); // Подключаем конфиг для ID способностей и других значений
|
||
|
||
// --- Базовые Статы Персонажей ---
|
||
|
||
const playerBaseStats = {
|
||
id: GAME_CONFIG.PLAYER_ID, // Технический ID слота
|
||
characterKey: 'elena', // Уникальный ключ персонажа
|
||
name: "Елена",
|
||
maxHp: 120,
|
||
maxResource: 150,
|
||
attackPower: 15,
|
||
resourceName: "Мана",
|
||
avatarPath: 'images/elena_avatar.webp' // Пример пути к аватару
|
||
};
|
||
|
||
const opponentBaseStats = { // Балард (для AI)
|
||
id: GAME_CONFIG.OPPONENT_ID, // Технический ID слота
|
||
characterKey: 'balard', // Уникальный ключ персонажа
|
||
name: "Балард",
|
||
maxHp: 140,
|
||
maxResource: 100,
|
||
attackPower: 20,
|
||
resourceName: "Ярость",
|
||
avatarPath: 'images/balard_avatar.jpg' // Пример пути к аватару
|
||
};
|
||
|
||
const almagestBaseStats = { // Альмагест (для PvP)
|
||
id: GAME_CONFIG.OPPONENT_ID, // Технический ID слота (занимает слот оппонента)
|
||
characterKey: 'almagest', // Уникальный ключ персонажа
|
||
name: "Альмагест",
|
||
maxHp: 120, // Статы как у Елены для зеркальности
|
||
maxResource: 150,
|
||
attackPower: 15,
|
||
resourceName: "Темная Энергия",
|
||
avatarPath: 'images/almagest_avatar.webp' // Пример пути к аватару (нужно создать изображение)
|
||
};
|
||
|
||
|
||
// --- Способности Персонажей ---
|
||
|
||
// Способности Игрока (Елена)
|
||
const playerAbilities = [
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_HEAL,
|
||
name: 'Малое Исцеление',
|
||
cost: 20,
|
||
type: GAME_CONFIG.ACTION_TYPE_HEAL,
|
||
power: 30,
|
||
description: 'Восстанавливает ~30 HP'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_FIREBALL,
|
||
name: 'Огненный Шар',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DAMAGE,
|
||
power: 25,
|
||
description: 'Наносит ~25 урона врагу'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH,
|
||
name: 'Сила Природы',
|
||
cost: 15,
|
||
type: GAME_CONFIG.ACTION_TYPE_BUFF,
|
||
duration: 4,
|
||
descriptionFunction: (config) => `Восст. ${config.NATURE_STRENGTH_MANA_REGEN} маны при след. атаке (${4 - 1} хода)`,
|
||
isDelayed: true
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_DEFENSE_AURA,
|
||
name: 'Аура Защиты',
|
||
cost: 15,
|
||
type: GAME_CONFIG.ACTION_TYPE_BUFF,
|
||
duration: 3,
|
||
grantsBlock: true,
|
||
descriptionFunction: (config) => `Снижает урон на ${config.BLOCK_DAMAGE_REDUCTION * 100}% (${3} хода)`
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE,
|
||
name: 'Гипнотический взгляд',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DISABLE,
|
||
effectDuration: 2, // Длительность безмолвия
|
||
cooldown: 6,
|
||
power: 5, // Урон в ход от взгляда
|
||
description: 'Накладывает на противника полное безмолвие на 2 хода и наносит 5 урона каждый его ход. КД: 6 х.'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS,
|
||
name: 'Печать Слабости',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DEBUFF,
|
||
effectDuration: 3,
|
||
power: 10, // Количество ресурса противника, сжигаемое каждый ход
|
||
cooldown: 5,
|
||
// Описание теперь может адаптироваться к ресурсу оппонента
|
||
descriptionFunction: (config, oppStats) => `Накладывает печать, сжигающую 10 ${oppStats.resourceName} противника каждый его ход в течение 3 ходов. КД: 5 х.`
|
||
}
|
||
];
|
||
|
||
// Способности Противника (Балард - AI)
|
||
const opponentAbilities = [
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_BALARD_HEAL,
|
||
name: 'Покровительство Тьмы',
|
||
cost: 20,
|
||
type: GAME_CONFIG.ACTION_TYPE_HEAL,
|
||
power: 25,
|
||
successRate: 0.60, // Можно вынести в GAME_CONFIG
|
||
description: 'Исцеляет ~25 HP с 60% шансом',
|
||
condition: (opSt, plSt, currentGameState, config) => {
|
||
return (opSt.currentHp / opSt.maxHp) * 100 < config.OPPONENT_HEAL_THRESHOLD_PERCENT;
|
||
}
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_BALARD_SILENCE,
|
||
name: 'Эхо Безмолвия',
|
||
cost: GAME_CONFIG.BALARD_SILENCE_ABILITY_COST,
|
||
type: GAME_CONFIG.ACTION_TYPE_DISABLE,
|
||
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',
|
||
durationFromConfig: 'SILENCE_DURATION',
|
||
internalCooldownFromConfig: 'BALARD_SILENCE_INTERNAL_COOLDOWN'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_BALARD_MANA_DRAIN,
|
||
name: 'Похищение Света',
|
||
cost: 10,
|
||
type: GAME_CONFIG.ACTION_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
|
||
}
|
||
];
|
||
|
||
// Способности Альмагест (PvP - зеркало Елены)
|
||
const almagestAbilities = [
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_HEAL,
|
||
name: 'Темное Восстановление',
|
||
cost: 20,
|
||
type: GAME_CONFIG.ACTION_TYPE_HEAL,
|
||
power: 30,
|
||
description: 'Поглощает жизненные тени, восстанавливая ~30 HP'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DAMAGE,
|
||
name: 'Теневой Сгусток',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DAMAGE,
|
||
power: 25,
|
||
description: 'Запускает сгусток чистой тьмы, нанося ~25 урона врагу'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK,
|
||
name: 'Усиление Тьмой',
|
||
cost: 15,
|
||
type: GAME_CONFIG.ACTION_TYPE_BUFF,
|
||
duration: 4,
|
||
// Аналогично Силе Природы, но использует Темную Энергию
|
||
descriptionFunction: (config) => `Восст. ${config.NATURE_STRENGTH_MANA_REGEN} Темной Энергии при след. атаке (${4 - 1} хода)`,
|
||
isDelayed: true
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_DEFENSE,
|
||
name: 'Щит Пустоты',
|
||
cost: 15,
|
||
type: GAME_CONFIG.ACTION_TYPE_BUFF,
|
||
duration: 3,
|
||
grantsBlock: true,
|
||
descriptionFunction: (config) => `Создает щит, снижающий урон на ${config.BLOCK_DAMAGE_REDUCTION * 100}% (${3} хода)`
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DISABLE,
|
||
name: 'Раскол Разума',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DISABLE,
|
||
effectDuration: 2,
|
||
cooldown: 6,
|
||
power: 5, // Урон от ментального воздействия
|
||
description: 'Вторгается в разум противника, накладывая полное безмолвие на 2 хода и нанося 5 урона каждый его ход. КД: 6 х.'
|
||
},
|
||
{
|
||
id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DEBUFF,
|
||
name: 'Проклятие Увядания',
|
||
cost: 30,
|
||
type: GAME_CONFIG.ACTION_TYPE_DEBUFF,
|
||
effectDuration: 3,
|
||
power: 10, // Количество ресурса противника, сжигаемое/истощаемое
|
||
cooldown: 5,
|
||
descriptionFunction: (config, oppStats) => `Накладывает проклятие, истощающее 10 ${oppStats.resourceName} противника каждый его ход в течение 3 ходов. КД: 5 х.`
|
||
}
|
||
];
|
||
|
||
|
||
// --- Система Насмешек Елены (Переработанная) ---
|
||
// Ключи верхнего уровня: 'aiBalard' для игры против Баларда (AI)
|
||
// 'pvpAlmagest' для игры против Альмагест (PvP)
|
||
const elenaTauntSystem = {
|
||
aiBalard: { // Насмешки против Баларда (AI) - существующая логика
|
||
base: {
|
||
mercifulAttack: [ "Балард, прошу, остановись. Еще не поздно.", /* ... другие ... */ ],
|
||
mercifulCast: [ "Даже сейчас, я пытаюсь исцелить не только тело...", /* ... другие ... */ ],
|
||
dominating: {
|
||
creatorVsCreation: [ "Глина не спорит с гончаром, Балард! Прекрати жалкое сопротивление!", /* ... другие ... */ ],
|
||
betrayalOfLight: [ "Ты мог ходить в сиянии Света! Ты ИЗБРАЛ эту гниль! Получай возмездие!", /* ... другие ... */ ],
|
||
ingratitudeContempt: [ "Самый страшный грех - грех неблагодарности!", /* ... другие ... */ ],
|
||
unmakingThreats: [ "Я сотру тебя с лика этой земли, как досадную ошибку!", /* ... другие ... */ ]
|
||
}
|
||
},
|
||
onPlayerCast: {
|
||
[GAME_CONFIG.ABILITY_ID_HEAL]: [ "Свет лечит, Балард. Но не искаженную завистью искру.", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_FIREBALL]: [ "Прими очищающее пламя Света!", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH]: [ "Сама земля отвергает тебя, я черпаю её силу!", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_DEFENSE_AURA]: [ "Порядок восторжествует над твоим хаосом.", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE]: [ "Смотри мне в глаза, Балард. И слушай тишину.", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS]: [ "Твоя ярость иссякнет, как вода в песке, Балард!", /* ... другие ... */ ]
|
||
},
|
||
onOpponentAction: { // Действия Баларда
|
||
[GAME_CONFIG.ABILITY_ID_BALARD_HEAL]: [ "Пытаешься отсрочить неизбежное жалкой темной силой?", /* ... другие ... */ ],
|
||
[GAME_CONFIG.ABILITY_ID_BALARD_SILENCE]: {
|
||
success: [ "(Сдавленный вздох)... Ничтожная попытка заглушить Слово!", /* ... другие ... */ ],
|
||
fail: [ "Твой шепот Тьмы слаб против Света Истины!", /* ... другие ... */ ]
|
||
},
|
||
[GAME_CONFIG.ABILITY_ID_BALARD_MANA_DRAIN]: [ "Ты питаешься Светом, как паразит?!", /* ... другие ... */ ],
|
||
attackBlocked: [ "Твои удары тщетны перед щитом Порядка.", /* ... другие ... */ ],
|
||
attackHits: [ "(Шипение боли)... Боль – лишь напоминание о твоем предательстве.", /* ... другие ... */ ]
|
||
},
|
||
onBattleState: {
|
||
startMerciful: [ "Балард, есть ли еще путь назад?", /* ... другие ... */ ],
|
||
opponentNearDefeat: [ "Конец близок, Балард. Прими свою судьбу.", /* ... другие ... */ ]
|
||
}
|
||
},
|
||
pvpAlmagest: { // Насмешки против Альмагест (PvP) - НОВАЯ ЛОГИКА
|
||
base: {
|
||
generalAttack: [ // Общие фразы при атаке
|
||
"Тьма не победит, Альмагест!",
|
||
"Твои иллюзии рассеются перед Светом!",
|
||
"Пока я стою, порядок будет восстановлен!",
|
||
"Не думай, что твои трюки остановят меня.",
|
||
"За каждую искаженную душу - получишь сторицей!",
|
||
"Сражайся честно, если осмелишься!",
|
||
"Даже тень боится истинного Света."
|
||
],
|
||
generalCast: [ // Общие фразы при касте Еленой
|
||
"Сила Света на моей стороне!",
|
||
"Гармония мира укрепит меня.",
|
||
"Твоя магия хаоса бессильна здесь.",
|
||
"Истинная сила - в созидании, не в разрушении.",
|
||
"Я призываю чистую энергию!",
|
||
"Свет очистит эту землю от твоей скверны."
|
||
]
|
||
},
|
||
onPlayerCast: { // Реакция на конкретные касты Елены
|
||
[GAME_CONFIG.ABILITY_ID_HEAL]: [
|
||
"Я исцеляюсь Светом, который ты отвергла.",
|
||
"Жизнь восторжествует над твоей некромантией!",
|
||
"Мое сияние не померкнет."
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_FIREBALL]: [
|
||
"Очищающий огонь для твоей тьмы!",
|
||
"Почувствуй гнев праведного Света!",
|
||
"Это пламя ярче твоих теней!"
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH]: [
|
||
"Природа дает мне силу, а тебе - лишь презрение.",
|
||
"Я черпаю из источника жизни, ты - из могилы.",
|
||
"Естественный порядок против твоего искажения."
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_DEFENSE_AURA]: [
|
||
"Мой щит отразит твою злобу.",
|
||
"Свет - лучшая защита.",
|
||
"Твои темные чары не пройдут!"
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE]: [
|
||
"Смотри в глаза Истине, колдунья!",
|
||
"Твои лживые речи умолкнут!",
|
||
"Хватит прятаться за иллюзиями!",
|
||
"Я вижу твою истинную, уродливую суть."
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS]: [
|
||
"Твоя темная сила иссякнет!",
|
||
"Я ослабляю твою связь с бездной!",
|
||
"Почувствуй, как тает твоя энергия!"
|
||
]
|
||
},
|
||
onOpponentAction: { // Реакция на действия Альмагест
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_HEAL]: [
|
||
"Лечишь раны тьмой? Она лишь глубже проникнет в тебя.",
|
||
"Твоя магия несет лишь порчу, даже исцеляя.",
|
||
"Жалкие попытки отсрочить возмездие."
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_DAMAGE]: [
|
||
"Твоя тень лишь царапает, не ранит.",
|
||
"Слабый удар! Тьма делает тебя немощной.",
|
||
"Думала, это причинит мне боль?",
|
||
"Свет поглотит твой мрак!"
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK]: [
|
||
"Черпаешь силы из бездны? Она поглотит и тебя.",
|
||
"Твое усиление - лишь агония искаженной энергии.",
|
||
"Сколько бы ты ни копила тьму, Свет сильнее."
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_DEFENSE]: [
|
||
"Щит из теней? Он рассыплется прахом!",
|
||
"Твоя защита иллюзорна, как и твоя сила.",
|
||
"Не спрячешься от Света за этой ширмой!"
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_DISABLE]: [ // Если попала под Раскол Разума
|
||
"(Сдавленно) Твои ментальные атаки отвратительны!",
|
||
"Тьма в моей голове... я вырвусь!",
|
||
"Не сломить мой дух твоими фокусами!"
|
||
],
|
||
[GAME_CONFIG.ABILITY_ID_ALMAGEST_DEBUFF]: [ // Если попала под Проклятие Увядания
|
||
"Истощаешь мою силу? Я восстановлю ее Светом!",
|
||
"Твое проклятие слабо.",
|
||
"Чувствую холод... но он лишь закаляет волю!"
|
||
],
|
||
attackBlocked: [
|
||
"Твоя атака разбилась о мой щит Света!",
|
||
"Предсказуемо и слабо, Альмагест.",
|
||
"Моя защита безупречна."
|
||
],
|
||
attackHits: [
|
||
"(Резкий вздох) Коснулась... Но Свет исцелит рану.",
|
||
"Эта царапина - ничто!",
|
||
"Ты заплатишь за это!",
|
||
"Боль лишь укрепляет мою решимость!"
|
||
]
|
||
},
|
||
onBattleState: {
|
||
start: [ // Начало PvP боя
|
||
"Альмагест! Твоим темным делам пришел конец!",
|
||
"Во имя Света, я остановлю тебя!",
|
||
"Приготовься к битве, служительница тьмы!",
|
||
"Эта дуэль решит судьбу многих."
|
||
],
|
||
opponentNearDefeat: [ // Альмагест почти побеждена
|
||
"Твоя тьма иссякает, колдунья!",
|
||
"Сдавайся, пока Свет не испепелил тебя!",
|
||
"Конец твоим злодеяниям близок!",
|
||
"Прими свое поражение!"
|
||
]
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
// --- Экспорт Данных ---
|
||
const gameData = {
|
||
// Базовые статы
|
||
playerBaseStats,
|
||
opponentBaseStats, // Балард
|
||
almagestBaseStats, // Альмагест
|
||
|
||
// Способности
|
||
playerAbilities, // Елена
|
||
opponentAbilities, // Балард
|
||
almagestAbilities, // Альмагест
|
||
|
||
// Система насмешек (с разделением)
|
||
elenaTauntSystem
|
||
};
|
||
|
||
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
|
||
module.exports = gameData;
|
||
}
|
||
// console.log("data.js загружен и gameData объект создан/экспортирован.");
|