86 lines
5.6 KiB
Markdown
86 lines
5.6 KiB
Markdown
# Stat Checks — бросаем стат против сложности
|
||
|
||
Stat Checks добавляет к сценариям одну команду, `check`: взять стат персонажа, прибавить бросок кубика и бонус, сравнить сумму со сложностью и продолжить историю в зависимости от успеха или провала. Визуальная новелла уговаривает ею стражника, тайловая RPG выламывает ржавую дверь. Сами статы приносят Stats Engine и правила игры (в RPG Plus — Classic RPG Rules).
|
||
|
||
## В игре
|
||
|
||
В прологе RPG Plus на перекрёстке сидит странница. Один из ответов сам называет свою проверку — Харизма против 10:
|
||
|
||
![Перекрёсток в сумерках; вопрос «Что скажешь ей?» и два ответа: «Вежливо спросить дорогу [Харизма 10]» и «Молча пройти мимо».](assets/seer-choice.jpg)
|
||
|
||
После ответа бросок показывается одной строкой:
|
||
|
||
![Диалоговое окно со строкой «[Харизма: 11 против 10] Успех».](assets/check-line.jpg)
|
||
|
||
Герой здесь — бродяга 1-го уровня с Харизмой 8; на d20 выпало 3, поэтому в сумме 11 против 10 — успех. История идёт по ветке успеха: странница отдаёт герою оберег.
|
||
|
||

|
||
|
||
С суммой меньше 10 в строке стояло бы *Провал*, и история ушла бы по другой ветке, где она отворачивается.
|
||
|
||
## Сценарий за этим
|
||
|
||
Из `rpg_plus_game/scenarios/rpg_plus/prologue.scenario` (строки сокращены):
|
||
|
||
```scenario
|
||
option "Вежливо спросить дорогу [Харизма 10]" -> :ask_way
|
||
option "Молча пройти мимо" -> :leave
|
||
|
||
:ask_way
|
||
check cha 10 who=rpg_hero else=snub -> :gift
|
||
|
||
:gift
|
||
text "— Вежливый. Надо же..."
|
||
action item.add id=classic/clover_charm
|
||
goto -> :leave
|
||
|
||
:snub
|
||
text "— Найдёшь сам..."
|
||
```
|
||
|
||
`check cha 10` бросает Харизму против сложности 10. При успехе переход к метке после стрелки, при провале — к метке из `else=`. Без `else=` провал просто продолжается следующей строкой.
|
||
|
||
## Команда check
|
||
|
||
```scenario
|
||
check <stat> <difficulty> [who=player] [dice=d20] [bonus=2] [else=label] [quiet=1] -> :label
|
||
```
|
||
|
||
- `<stat>` — id стата из игры, например `cha` или `str`.
|
||
- `<difficulty>` — число, которое нужно достичь: проверка успешна, когда сумма не меньше него.
|
||
- `who=` — id персонажа или `player` (по умолчанию).
|
||
- `dice=` — `d20`, `2d6`, `1d100` и так далее. `none` ничего не бросает: проверка превращается в простой порог — решает только стат, всегда одинаково. Удобно в новелле («достаточно ли смел»).
|
||
- `bonus=` — прибавляется к сумме; может быть отрицательным.
|
||
- `else=` — метка для провала.
|
||
- `quiet=1` — не показывать строку броска.
|
||
|
||
Сумма — это **стат + кубик + бонус**.
|
||
|
||
### Кубик по умолчанию
|
||
|
||
Без `dice=` проверка берёт настройку игры `checks.dice`, иначе `d20`. RPG Plus задаёт её в своей коллекции:
|
||
|
||
```json
|
||
"settings": { "checks.dice": "d20" }
|
||
```
|
||
|
||
Игра, которая хочет обойтись во всех проверках без случайности, ставит `"checks.dice": "none"`.
|
||
|
||
### Свой рассказ об исходе
|
||
|
||
После проверки бросок лежит в этих переменных диалога: `check_stat`, `check_value`, `check_roll`, `check_bonus`, `check_total`, `check_dc` и `check_result`. С `quiet=1` строка `ptext` может рассказать о нём словами истории:
|
||
|
||
```scenario
|
||
check str 14 quiet=1 else=stuck -> :open
|
||
:stuck
|
||
ptext "Ты выжимаешь все свои ${check_total}, но дверь держится."
|
||
```
|
||
|
||
Стандартная строка — ключ перевода `checks/line` (`[${check_stat}: ${check_total} против ${check_dc}] ${check_result}`); игра может переопределить его в своих файлах локализации.
|
||
|
||
## Если что-то пошло не так
|
||
|
||
1. **В сумме только кубик.** Id стата неверный, либо у персонажа нет такого стата.
|
||
2. **Результат всегда одинаковый.** У игры `checks.dice` равен `none`, либо в строке написано `dice=none`.
|
||
3. **Каша вместо кубика.** Неправильная запись `dice=` не ломает сцену, а просто ничего не бросает — проверка превращается в простой порог. Пишите кости как `d20`, `2d6`, `1d100`.
|