Files
mod_validator/docs/ru.md
T

5.9 KiB

Validator — проверка модов без запуска игры

Validator читает каждый мод запущенной игры — манифесты, файлы данных, сценарии, патчи сцен и исходники C# — и сообщает, что сломано или подозрительно: ссылку на предмет, сцену или фон, которые никто не объявляет, неизвестную команду сценария, неверный параметр, недостающую зависимость. Проверка запускается в фоне при каждом старте игры и пишет отчёт, так что опечатка находится раньше, чем игрок доберётся до строки с ней.

Проверяется то, что видно в файлах. Validator не играет в игру: сценарий, который он принял, всё равно может вести себя не так, как задумывал автор, а код, собирающий идентификаторы на ходу, проследить невозможно.

Ошибка и её исправление

Строка сценария, выдающая игроку волчье мясо, с опечаткой в id предмета:

scene: home_kitchen
priority: 0
---
action item.add id=food/wolf_meet count=1
end

После следующего запуска Cthangover в отчёте появляется:

{
  "severity": "error",
  "code": "REF_NOT_FOUND",
  "message": "item 'food/wolf_meet' is referenced but never declared",
  "mod": "cthangover_game",
  "file": "scenarios/doc_validator_demo.scenario",
  "line": 4,
  "suggestion": "declare item 'food/wolf_meet' or fix the reference",
  "related": null
}

Мод, файл и строка указывают на ошибку. С food/wolf_meat проблема исчезает, а счётчик ошибок в сводке уменьшается на единицу (с 18 до 17 в этом прогоне).

Как запустить и как читать отчёт

  • Проверка стартует сама, когда входишь в игру, которая его содержит (Cthangover включает его в свой набор инструментов разработчика), после загрузки модов и идёт в фоновом потоке; игре она не мешает.
  • В лог на каждый прогон пишется строка: validator: started, 33 mod(s) queued, затем итоги по ошибкам, предупреждениям и заметкам.
  • Отчёт пишется в user://validation/report.json (в папке пользовательских данных игры). В нём сводка, проверенные моды с их версиями и контрольными суммами и список проблем.

У каждой проблемы есть:

  • severity — error (что-то сломано), warning (похоже на ошибку) или info (стоит взглянуть, например предмет, на который никто не ссылается);
  • code — род проблемы, например REF_NOT_FOUND, JSON_PARSE_ERROR, SCHEMA_MISSING_FIELD, SCHEMA_UNKNOWN_PARAM, DECL_UNUSED, DYNAMIC_KEY;
  • mod, file, line — где исправлять; suggestion — что делать.

Заметки DYNAMIC_KEY означают, что ключ собирается во время выполнения, и Validator не может его проверить; ошибками они не являются.

Что проверяется

Проверки идут в три фазы:

  1. Схема — в manifest.json есть строки id и version; JSON-файлы разбираются.
  2. Контракты — что мод объявляет и на что ссылается: сущности всех видов (персонажи, предметы, задания, навыки, рецепты, действия и виды, описанные схемами), команды и действия сценария с их параметрами, патчи сцен, свойства, которые читает и пишет код C#.
  3. Сверка — у каждой ссылки есть объявление, depends покрывает то, что мод берёт у других, а объявления, которыми никто не пользуется, перечислены.

Сценарные действия и их параметры сверяются со схемами, которые поставляют моды (см. Schemas), по тем же правилам, что и в палитре команд.

Настройки

На вкладке настроек мода в менеджере модов:

  • Enabled, Run on start — отключают прогон;
  • Parse C#, Parse GDScript (по умолчанию выключено, медленно), Parse scenarios — какие источники читать;
  • Write report, Report path — куда пишется report.json;
  • Block mods on error — есть в настройках, но в текущей версии ни на что не влияет: моды не блокируются никогда.

Если что-то пошло не так

  1. Отчёта нет. Игра закрылась до конца прогона (для Cthangover это около полуминуты) или выключен Write report.
  2. Много строк DYNAMIC_KEY. Нормально для кода, который собирает ключи; это заметки.