# Battle Formulas — боевые навыки в виде данных Battle Formulas позволяет записать боевое действие целиком в данных: сколько оно ранит или лечит — это **формула** от характеристик действующего и цели; действие может тратить ману, игнорировать щит или оглушать. Код не нужен, и один и тот же навык работает в обеих боевых системах — FF Battle и Card Battle. Таковы Power strike, Fireball, Heal и Guard break из Classic RPG Rules. Кроме того, мод вычисляет боевые числа врагов из их характеристик и рисует запасы вроде маны полосками на боевых картах. Формулы написаны на языке формул Stats Engine; боевые экраны принадлежат боевым системам. Этот мод — связующее звено между ними. ## Навык шаг за шагом Power strike из Classic RPG Rules: ```json { "Id": "classic/power_strike", "Type": "ToEnemy", "Values": [ "RequiredPoint=1", "Formula=a.atk * 1.5 + rand(0, a.str / 2)" ] } ``` В меню боя FF на карте видно формулу, а подсказкой служит описание навыка: ![Меню действий героя с выбранным Power strike; на карте — Target enemy, 1 AP и Formula a.atk * 1.5 + rand(0, a.str / 2), а также описание «Полный замах: полторы атаки и ещё немного от силы».](assets/formula-menu.jpg) У воина из RPG Plus атака 12 и сила 9, поэтому удар наносит 12 × 1.5 = 18 плюс случайное от 0 до 4.5. В записанном здесь бою выпало 22: ![Журнал боя: Hero: Power strike → Wolf; Wolf's shield absorbed 2 · left 0; Power strike: Hero → Wolf · -20 HP; затем Defence волка, +4 DEF (всего 4).](assets/formula-log.jpg) Щит волка (2) принял на себя первую часть — Power strike не игнорирует щиты, — и волк потерял 20 здоровья: с 31 до 11. Та же карта в Card Battle: ![Карта действия Power strike в Card Battle: Target enemy, 1 AP, Formula a.atk * 1.5 + rand(0, a.str / 2), RequiredPoint 1.](assets/formula-card.jpg) ## Враги берут числа из своих характеристик Здоровье волка 31, атака 7 и щит 2 нигде не записаны числами. RPG Plus даёт волку характеристики патчем: ```json { "Id": "rpg_wolf", "Stats": { "str": 5, "vit": 5, "agi": 7 } } ``` Когда начинается бой, мод считает лист волка по правилам Classic RPG Rules для его 2-го уровня: здоровье `12 + vit * 3 + level * 2` = 31, атака `str + level` = 7, защита `floor(vit / 2)` = 2. Враг без данных о характеристиках оставляет числа из своего файла персонажа. ## Значения действия-формулы Сущность действия (вид `action`, см. Characters Engine) со значением `Formula=`: - `Formula=` — величина; никогда не меньше 0. `a.` — действующий, `b.` — цель: любые их характеристики, а также `hp`, `hp_max`, `attack`, `defence`, `point`. Функции вроде `rand(lo, hi)`, `floor`, `min`, `max` приходят из Stats Engine. - `Effect=damage` (по умолчанию) или `Effect=heal`. - `Cost=mp:4` — тратит 4 из характеристики-запаса; если члену отряда её не хватает, действие отклоняется и ничего не тратится. Враги не платят ничего. - `RequiredPoint=1` — очки действий, как в любой боевой системе. - `Pierce=1` — игнорирует щит цели. - `State=effect/physics/stun` вместе с `StateTurns=1` и `StateChance=35` — с шансом 35% вешает на цель статусный эффект на столько ходов. - `Type` — `ToEnemy`, `ToSelf` или `ToAlias` (союзник), как у любого действия. Например, Fireball из Classic RPG Rules: ```json "Values": [ "RequiredPoint=1", "Cost=mp:4", "Pierce=1", "Formula=a.mag * 2 + rand(1, 6)" ] ``` ## Если что-то пошло не так 1. **Навык делает 0.** Какое-то имя в формуле — не характеристика игры (неизвестные имена считаются за 0), либо результат вышел отрицательным. 2. **Навык отклонён.** Персонажу не хватило очков действий либо характеристики-запаса, указанной в `Cost=`. 3. **У врага числа из файла, а не из характеристик.** У него нет `Stats`, `Archetype` или `Traits`.