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 не может его проверить; ошибками они не являются.
Что проверяется
Проверки идут в три фазы:
- Схема — в
manifest.jsonесть строкиidиversion; JSON-файлы разбираются. - Контракты — что мод объявляет и на что ссылается: сущности всех видов (персонажи, предметы, задания, навыки, рецепты, действия и виды, описанные схемами), команды и действия сценария с их параметрами, патчи сцен, свойства, которые читает и пишет код C#.
- Сверка — у каждой ссылки есть объявление,
dependsпокрывает то, что мод берёт у других, а объявления, которыми никто не пользуется, перечислены.
Сценарные действия и их параметры сверяются со схемами, которые поставляют моды (см. Schemas), по тем же правилам, что и в палитре команд.
Настройки
На вкладке настроек мода в менеджере модов:
- Enabled, Run on start — отключают прогон;
- Parse C#, Parse GDScript (по умолчанию выключено, медленно), Parse scenarios — какие источники читать;
- Write report, Report path — куда пишется
report.json; - Block mods on error — есть в настройках, но в текущей версии ни на что не влияет: моды не блокируются никогда.
Если что-то пошло не так
- Отчёта нет. Игра закрылась до конца прогона (для Cthangover это около полуминуты) или выключен Write report.
- Много строк
DYNAMIC_KEY. Нормально для кода, который собирает ключи; это заметки.