98 lines
7.4 KiB
Markdown
98 lines
7.4 KiB
Markdown
# Turn Battle Base — общая платформа для всех боёв
|
||
|
||
Turn Battle Base — это то общее, что есть у всех пошаговых боёв в коллекции: запуск боя из сценария, боевая сцена с фоном того места, где бой начался, экраны победы и поражения, опыт и добыча, статусные эффекты вроде оглушения — и выбор **боевой системы**. Как именно сражается игрок, платформа не решает: это задача мода боевой системы — **FF Battle** (меню команд) или **Card Battle** (карты, которые перетаскивают на цели).
|
||
|
||
## Две боевые системы, одна платформа
|
||
|
||
Один и тот же бой в RPG Plus — воин против волка в деревне — в обеих системах:
|
||
|
||

|
||
|
||
Всё вокруг боя одинаковое: фон деревни, цифры волка, кнопки скорости **x1 / x4 / x8** в правом верхнем углу (они ускоряют анимации, а выбор запоминается) и то, что происходит после боя.
|
||
|
||
Свою систему игра выбирает настройкой коллекции `battle.core`; в RPG Plus это `ff_battle`. Без настройки берётся первая из установленных систем. В редакторе коллекций настройка называется «Боевая система».
|
||
|
||
## Как проходит бой
|
||
|
||
```text
|
||
scenario: battle.init / rpg.battle
|
||
|
|
||
v
|
||
battle scene: backdrop of the current place, party from the roster, enemies from their files
|
||
|
|
||
v
|
||
battle system (ff_battle or card_battle): player turn <-> enemy turn
|
||
| |
|
||
all enemies defeated party defeated
|
||
v v
|
||
Victory: experience, loot Defeat: Main menu
|
||
|
|
||
v
|
||
back to the scene the battle started from
|
||
```
|
||
|
||
## Победа и поражение
|
||
|
||
Когда падает последний враг, экран победы показывает опыт каждого уцелевшего члена отряда и добычу:
|
||
|
||

|
||
|
||
- **Опыт.** Каждый побеждённый враг приносит свой `Level × Exp`, который поровну делится между теми, кто остался на ногах. Волк — 2-го уровня с `Exp` 12, итого **+24**.
|
||
- **Добыча.** Для каждого побеждённого врага разыгрывается его список `Loot`; предметы сразу попадают в инвентарь.
|
||
- **Continue** возвращает в сцену, откуда пришёл бой. Потерянное в бою здоровье не восстанавливается.
|
||
|
||
Если падает весь отряд, экран поражения предлагает только **Main menu** — без опыта и без добычи.
|
||
|
||

|
||
|
||
## Запуск боя из сценария
|
||
|
||
```scenario
|
||
action battle.init scene=town_entry enemies=wolf_1,wolf_2 quest_id=MeetingMurakamiQuest new_tag=wolf_battle
|
||
switch_scene Battle
|
||
end
|
||
```
|
||
|
||
- `enemies` — id персонажей через запятую; один и тот же id дважды — это два врага.
|
||
- `scene` — сцена, в которую игра вернётся после победы.
|
||
- `quest_id`, `new_tag` (необязательные) — привязывают бой к заданию и помечают его тегом (уведомление в журнале).
|
||
- Фон боя — тот, что показан в этот момент, поэтому задайте его до `battle.init`.
|
||
|
||
На тайловой карте вместо этого используйте `action rpg.battle enemies=rpg_wolf win_flag=rpg_wolf_dead` из мода RPG: отряд вернётся в ту же клетку карты, а при победе выставится флаг.
|
||
|
||
Команда `action battle.set_core core=card_battle` переключает боевую систему для последующих боёв.
|
||
|
||
## Враги, добыча и статусные эффекты в данных
|
||
|
||
Враги — обычные персонажи (см. Characters Engine). Добыча волка из RPG Plus:
|
||
|
||
```json
|
||
{
|
||
"Id": "rpg_wolf",
|
||
"Loot": [
|
||
{ "ItemId": "rpg_plus/wolf_pelt", "MinCount": 2, "MaxCount": 3, "Probability": 100 },
|
||
{ "ItemId": "money/coin", "MinCount": 8, "MaxCount": 14, "Probability": 100 }
|
||
]
|
||
}
|
||
```
|
||
|
||
`Probability` — вероятность в процентах; количество — случайное число от `MinCount` до `MaxCount` включительно.
|
||
|
||
**Статусные эффекты** — это сущности вида `status_effect`. Уже в платформе есть оглушение: персонаж пропускает свои ходы:
|
||
|
||
```json
|
||
{ "Id": "effect/physics/stun", "Icon": "characters/effects/stun", "Type": "Stun", "Duration": 3, "Actions": "basic/stun" }
|
||
```
|
||
|
||
Боевое действие, накладывающее эффект, может задать своё число ходов; длительность уменьшается в начале каждого хода.
|
||
|
||
## Авторам модов
|
||
|
||
Боевая система — мод, регистрирующий `IBattleCore` (и `IBattleAutoPlayable` для автоматических тестов). Её действия выполняются через исполнители платформы, поэтому мод вроде Battle Formulas добавляет новые виды действий сразу всем системам. Код может узнавать о конце боя через `BattleEndedEvent`, а о победе — через `IWingroundListener`; так работает Recruiting, предлагая побеждённым врагам место в отряде.
|
||
|
||
## Если что-то пошло не так
|
||
|
||
1. **У боя пустой фон.** `battle.init` выполнился раньше, чем у сцены появился фон.
|
||
2. **Открывается не та система.** Проверьте настройку игры `battle.core` и не переключал ли её какой-нибудь сценарий через `battle.set_core`.
|
||
3. **После победы нет опыта.** Враги с `Exp` 0 не дают опыта; павшие члены отряда его не получают.
|