Решили: экспорт частей юнита гоняется из Aseprite в batch
(Aseprite.exe -b <файл> --script-param … --script export_bone_parts.lua), а не только руками из
меню редактора. Скрипт получил параметры group / scale / subdir и уникализацию имён.
Почему: редактор Макса занят рисованием, а части нужны в проекте; открывать его ради экспорта
значит ждать человека. Альтернатива — выгружать PNG своим питоновским разборщиком .aseprite —
отвергнута: конвенция экспорта (папка, ×10 nearest, trim, правила @/_) уже живёт в lua-скрипте,
и второй разборщик стал бы вторым владельцем этой конвенции.
Грабли — четыре штуки, и все четыре молчат, то есть выглядят как «сработало, но пусто»:
- Установленное расширение роняет весь batch-запуск.
pixellabпадает наdlg= nil, когда UI недоступен. Лечится подменойAPPDATAна пустую папку: чистый профиль не грузит расширений. app.alertбез UI не делает ничего, поэтомуreturn app.alert("…")даёт пустой вывод и код возврата 0. Любой отказ в скрипте, который должен работать в batch, обязан печатать.- Путь спрайта в CLI приходит таким, как передан. Относительный путь уводил поиск корня проекта
в пустоту. Достраиваем от
app.fs.currentPath, ноapp.fs.isAbsolutePathиспользовать нельзя — поля нет в части версий API, и обращение к нему роняет скрипт целиком (Field isAbsolutePath does not exist). - Слои-листья левой и правой конечности названы одинаково (
Leg (Down)в обеих группах), а имя PNG берётся из имени слоя: 18 экспортов давали 12 файлов, шесть частей затирались молча. Теперь при коллизии имя получает префикс родительской группы (Leg (Right) - Leg (Down).png), а имена без коллизий не меняются — иначе поехали бы ссылки в уже собранных ригах.
Отдельно: фильтр по группе обязателен для верстака. Без --script-param group в проект уезжают
и снятые болванки, и реф-борды, которые лежат на том же холсте рядом с рабочей фигурой.
Владелец правды: Aseprite/scripts/export_bone_parts.lua (конвенция и параметры),
Aseprite/scripts/README.md (установка), docs/unit-128-rig-progress.md (живой заход, временный).