делать глобальный экспорт всего пака персонажей и врагов, с этим самым перерасчетом повторяющихся тайлов
Всё равно пришлось бы учитывать повторы тайлов у персонажей, не получилось бы сделать уникальные. Вот с хаком выше, где всё разжато проще, хоть размер выше и нужно дорабатывать.
savokgear, Дописал компрессор (распаковщик/запаковщик), смог добиться сжатия как у разработчиков: размер одинаковый, но некоторые байты различаются из-за вариантов сжатия одного и того же. Нашёл способ сжать лучше, но в два раза медленнее, даёт уменьшение на 1-9 байт где-то. Не реализовал последнюю проверку для улучшенного сжатия, например для Ninja можно было сжать на 1 байт лучше, просто там нужно код перестраивать замысловато.
Сравнение улучшенного сжатияFILE: decompressed_05_Galsia_161b90.bin
Comp original: 8501
Comp : 8497
Decomp original: 11904
FILE: decompressed_09_Electra_1647ca.bin
Comp original: 8864
Comp : 8861
Decomp original: 13504
FILE: decompressed_10_Signal_166e3e.bin
Comp original: 6828
Comp : 6822
Decomp original: 11392
FILE: decompressed_11_Biker_1bca08.bin
Comp original: 9419
Comp : 9415
Decomp original: 13440
FILE: decompressed_12_Ninja_1b972c.bin
Comp original: 8439
Comp : 8439
Decomp original: 13536
FILE: decompressed_13_Bongo_168fb8.bin
Comp original: 7041
Comp : 7037
Decomp original: 11456
FILE: decompressed_14_Hakuyo_1825cc.bin
Comp original: 8306
Comp : 8297
Decomp original: 13184
FILE: decompressed_15_Kickboxer_1979b6.bin
Comp original: 7634
Comp : 7631
Decomp original: 12160
FILE: decompressed_16_Jet_19a29a.bin
Comp original: 9185
Comp : 9182
Decomp original: 15008
FILE: decompressed_20_Particle_1bf99c.bin
Comp original: 4768
Comp : 4766
Decomp original: 10368
Описание алгоритма сжатияВ этом формате можно указывать (1) повторяющуюся последовательность (серию) из одного байта (AAAA, BBBB и т.п.), (2) серию, которая была ранее из одно и больше байт (AAAA, ABAB, ABCABC), (3) записывать несжатые байты. Проходим по каждому байту, ищем самую длинную серию позади и подсчитываем количество одинаковых байтов впереди. Если нету серий, запоминаем, что байт нужно будет записать как есть. Если находим одну из серий больше или равно 4 байтам, то записываем. Если находим обе, то выбираем с учётом контрольных байтов. И вот здесь интересный момент, что делать если размер будет одинаковый, иногда от этого выбора зависит сжатие, поэтому в "улучшенном сжатии" я сверял размеры от предыдущего выбора перед следующем. От этого и работа в 2 раза медленнее. Если всегда выбирать один вариант, то размер будет как у разработчиков, другой вариант может давать как лучше результаты, так и хуже, а проверяя каждый вариант, сжатие либо как у разработчиков, либо лучше. Не знаю, максимальное ли сжатие. Как писал выше, последнюю проверку на лучший вариант не сделал.
Скрипт на Python 3, лучше ставить последнюю версию 3.8.0.
[
Скачать] (ПКМ по Raw -> Сохранить объект)
Как пользоватьсяЧерез командную строку (в Проводнике Shift + ПКМ -> Открыть окно команд) вводите команды
.
Распаковка из рома по смещению 0x161b90 (можно целыми 1448848, восьмеричными 0o5415620, двоичными 0b101100001101110010000), которое можно не указывать (тогда с нуля):
sor2_comp.py -d "Streets of Rage 2 (U) [!].gen" 0x161b90 -o Galsia.bin
Запаковка:
sor2_comp.py -c Galsia.bin -o Galsia_compressed.bin
Запаковка с улучшенным сжатием (-u/--ultra):
sor2_comp.py -c Galsia.bin -o Galsia_compressed.bin -u
Замена тайлсета в роме с добавление нулей, если слишком большой, то не запишется и будет надпись "Too big!":
sor2_comp.py -c Galsia.bin -r "Streets of Rage 2 (U) [!].gen" 0x161b90 -o "SoR2_hack.gen" -u
Вставка тайлсета в файл без добавления нулей и проверок (-f/--force), просто заменит байты или расширит файл (ром будет не рабочий):
sor2_comp.py -c Galsia.bin -r "Streets of Rage 2 (U) [!].gen" 0x161b90 -o "SoR2_hack.gen" -u -f
Конечно это не очень удобно, распакованные тайлы вперемешку (для этого нужно смотреть реализацию Pancake 2 и дописывать сжатие туда и сделать свою программу). Если не менять положение тайлов (отдельных спрайтов), то не получиться изменить размеры персонажей, только изменить цвет и внешний вид.
Если остановиться на варианте со сжатой графикой и не менять количество тайлов, но менять положение и узнать как делать смещения графики за счёт расширения рома, то уже можно не беспокоиться о сжатии, но придётся оставить героев с одинаковыми тайлами. В таком варианте не будет перерасхода VRAM.
Самый сложный вариант со сжатием: как выше + менять кол-во тайлов. Тогда можно делать с большими размерами персонажей, но нужно контролировать VRAM.
Это не говоря ещё об ограничении количества спрайтов на scanline и общем ограничении спрайтов и их размеров.