Невозможность запуска игры с некорректным кодом / данными


При запуске дебага игры можно заранее прогонять:

Если что-то падает — сделать так, чтобы игра не запускалась


Зачем? — Для экономии времени. Пойду от примеров


Проблема 1. Запускаю, а игра падает из-за банальной ошибки в коде

Это растягивает длительность итераций (от начала «я хочу сделать Х» до «у меня в игре работает Х»)

Ряд ошибок могут быть отловлены линтерами / type-checker-ами / компиляторами до запуска


Как контрю

Для игры на Godot (GDScript) я выстроил процесс такой: (упрощённо)

  1. В VSCode нажимаю F5
  2. Отрабатывает task: ty check (type checker для python)
  3. Отрабатывает task: ruff check (linter для python)
  4. Запускается python launch config bf_cli.py run
    1. Прогоняет gdlint (linter для gdscript)
    2. Прогоняет godot --quit --headless --check-only --debug (проверка на типы / линтинг GDScript) (в Godot ⇒ Project ⇒ Project Settings ⇒ Debug ⇒ GDScript стоит ужесточить проверки)
    3. Если все прошло без ошибок, запускается AutoHotkey (AHK) скрипт cli.ahk run_in_godot, что посылает в окно godot-а event нажатия «F5» — запуска игры

Таким образом, я никогда не запускаю игру с легкоуловимыми ошибками в коде. Кукуха сохранена. Время не было потрачено впустую


Это бы работало даже если в коде динамически подгружаются GDScript файлы с помощью load(). Напротив, не используя этот подход, если бы запускали игру просто через Godot, она бы упала в момент вызова load() на некорректном gdscript файле ⇒ мы бы потратили время


Обобщая, команды можно прогонять для валидации корректности кода перед запуском


Проблема 2. Запустил игру, а данные в yaml файле я изначально забил некорректные

Как контрю

В том же bf_cli.py у меня есть стадия валидации данных glib.yaml (моего большого файла с данными по игре). Я прогоняюсь по нему тучей assert-ов. Если упадет — увижу проблему ещё до запуска.


Прикладной пример

Допустим, у меня есть мобы в игре. У каждого из них в glib.yaml должен был быть указан damage > 0. Я бы это решил через

for creature in glib["creatures"]:
  assert creature.get("damage", 0) > 0

Да, примитивно. Зато помогает довести до конца небольшого размера проект в соло, когда он обрастает сложностью


Обобщая, команды можно прогонять для валидации данных перед запуском


Hulvdan