Невозможность запуска игры с некорректным кодом / данными
При запуске дебага игры можно заранее прогонять:
- type-checker'ы
- линтеры
- валидацию данных (yaml-ов, json-ов, csv, наличие картинок, наличие звуков и пр.)
Если что-то падает — сделать так, чтобы игра не запускалась
Зачем? — Для экономии времени. Пойду от примеров
Проблема 1. Запускаю, а игра падает из-за банальной ошибки в коде
Это растягивает длительность итераций (от начала «я хочу сделать Х» до «у меня в игре работает Х»)
Ряд ошибок могут быть отловлены линтерами / type-checker-ами / компиляторами до запуска
Как контрю
Для игры на Godot (GDScript) я выстроил процесс такой: (упрощённо)
- В VSCode нажимаю F5
- Отрабатывает task:
ty check(type checker для python) - Отрабатывает task:
ruff check(linter для python) - Запускается python launch config
bf_cli.py run- Прогоняет
gdlint(linter для gdscript) - Прогоняет
godot --quit --headless --check-only --debug(проверка на типы / линтинг GDScript) (в Godot ⇒ Project ⇒ Project Settings ⇒ Debug ⇒ GDScript стоит ужесточить проверки) - Если все прошло без ошибок, запускается 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
Да, примитивно. Зато помогает довести до конца небольшого размера проект в соло, когда он обрастает сложностью
Обобщая, команды можно прогонять для валидации данных перед запуском