Программы: Вытягиваем изображения из визуальных романов
17.04.2017


Распаковщик в боевых условиях бесконечного лета

Встала тут передо мной задача стянуть картинки из «Бесконечного лета». Собственно, распространяются они по Creative Commons, всё легально и скрипт для распаковки архивов выложен в свободный доступ одним из разработчиков игры. Но надо помнить, что спрайты в этой игре многослойные: на голое "обезличенное" тело накладывается различная одежда и эмоции. Конечно, можно всё это собрать вручную, но зачем, если можно вытащить уже собранные спрайты из самой игры?

«Бесконечное лето» построено на движке Ren'Py, основанного на библиотеке pygame языка Python. Движок "опенсорсный" и его код можно спокойно скачать и посмотреть, что нехило помогает в понимании внутреннего устройства игр, сделанных на нём. Благодаря этому и исследованию некоторых частей кода самой игры мне-таки удалось написать скрипт, который выполняет поставленную задачу!

Репозиторий

Ren'Py, как движок, интересен тем, что он компилирует и выполняет любые файлы с кодом, которые находит в папке с игрой. На этом основано как создание модификаций для игр на нём, так и вышеуказанные скрипты Лолбота для распаковки ресурсов и декомпиляции кода игр. Так что Вам следует извлечь *.rpy-скрипт из архива в папку game внутри директории с игрой. Дальнейшие действия зависят от конкретной игры. Из коробки поддерживается, собственно, только БЛ:

  1. Запустите игру и зайдите в меню выбора модов.
  2. Выберите мод с названием Image Puller
  3. Дальше, следуя инструкциям, выберите персонажей, для которых хотите извлечь спрайты.
  4. Ждите.
  5. Когда игра перестанет тормозить, а в папке Pulled images больше не будут появляться новые файлы, можно выйти из мода через меню.

С другими играми немного сложнее. Потребуется редактировать код. Впрочем сразу обнадёжу, что если повезёт, то всё обойдётся малой кровью! Класс koz_ImagePuller, содержащий в себе всю основную логику скрипта по извлечению файлов, более-менее универсален, так что на Ваши плечи ложится лишь ответственность за его запуск в нужном месте.

Итак, сперва попробуйте просто пролистать код скрипта до конца блока инициализации, где кончается описание класса, перед описаниями меток (label). Среди комментариев будет такая строка:

# $ koz_ImagePuller().pull_async(delay=10)

Раскомментируйте её, убрав знак решётки и пробел после него ("# "). Попробуйте запустить игру и подождать 10 секунд (можете попробовать уменьшить или увеличить это значение). Если игра не вылетит и начнётся распаковка, то Вам повезло! Ждите окончания тормозов и появления файлов в вышеназванной папке.

Если же ресурсы инициализируются как-то более хитро, то Вам может понадобиться декомпилировать код игры или ещё каким-либо методом запускать распаковку в другой момент выполнения кода, как я это делаю для БЛ. Это уже более сложная операция, так что я не буду её расписывать здесь: желающие могут ознакомиться с хорошо откомментированным содержимым скрипта и моим примером с «Бесконечным летом».


Обновление от 19.05.2017 (v1.1.0)

Добавлено:

  • прогресс-бар;
  • обрезание прозрачного фона у спрайтов;
  • сортировка изображений по папкам;
  • больше возможностей для фильтрации извлекаемых изображений;
  • логирование и игнорирование различных ошибок (возникающие, например, при попытке извлечь несуществующее изображение);
  • возможность штатно прервать извлечение.

Также менюшки выбора параметров теперь не сохраняют выборы между запусками. Ну и, само собой, были исправлены некоторые ошибки (впрочем, некоторые ещё остались — см. здесь).

Распаковщик с прогресс-баром

Скачать старую версию: v1.0.0.

С Днём пионерии!