Разработка и ромхакинг > Ромхакинг и программирование
Как разжимать спрайты на Сега играх? [Streets of Rage 2]
(1/2) > >>
savokgear:
Хочу доделать свои тематические Street of Rage 2 хаки, например заменить спрайты врагов. Но беда в том, что они пережатые.
Кто шарит как правильно разжимать графику, поясните пожалуйста.
Для SoR2 есть программа Панкейк, в которой можно менять не пережатые спрайты персонажей и боссов, на её примере рассмотрим.

Стандартный, не пережатый персонаж, внизу кнопки для загрузки новых спрайтов доступны, Аrt address не серый. Всё нормально, с этим можно работать.



Вот для примера первый спрайт первого врага - Галсия. Внизу две кнопки серые,  Аrt address серый, вверху видим слово Compressed. Что я могу с этим сделать?



Жмём Edit, Decompress Art, в поле вводим адрес пережатого спрайта (видно в панкейке и на скриншоте), называем как нам удобно, сохраняем.

Полученный bin Файл со спрайтом можем спокойной открыть в хексе, скопировать и вставить в ром,(для примера по адресу 200000) вопрос в том, что делать дальше? Как сделать так, что-бы панкейк ссылался не на старый пережатый спрайт Гарлсии, а на новый, разжатый?


Кто с таким сталкивался, или с чем-то подобным, подскажите пожалуйста, или дайте ссылки на текстовые или видеогайды, где почитать или посмотреть?

Для удобства прикладываю Сам панкейк (нужна  Ява) и оригинальный РОМ


perfect_genius:
Распаковку легче написать, чем запаковку, а ещё запакованный может не влезть. Поэтому похоже, что просто не стали делать. В коде программы тоже не нашёл ничего про компрессию.
Sharpnull:
Похоже SUPER_ROBOT об этом коде https://github.com/gsaurus/sor_pancakes. Декомпрессия здесь https://github.com/gsaurus/sor_pancakes/blob/master/pk2/src/lib/map/Decompressor.java и там наверно что-то типа RLE. При желание можно разобраться или добавить карлика, если можно размеры персонажей менять :)

Тему стоило назвать связанной с этой игрой, так как алгоритмы разные бывают.
savokgear:
Мне не особо важно, если ром раздует и всё такое, главное понять на каком-то примере как это делать. То, что панкейк не умеет  работать с пережатой графикой мне известно.
Слышал, что кто-то в хаке МКУ графику разжимал, но информацию найти не могу. Беда в том, что я не программист, начал недавно, всего пару месяцев назад, мне пример нужен, как сделать первый спрайт, дальше уже сам всё сделаю, поменяю, под настрою. Есть хак (добавлю) где все персонажи разжаты и можно играть за всех врагов и боссов, и менять их как угодно, осталось понять как это сделать самому. Но без образца мне мозгов пока не хватает.
 
Sharpnull, Самих персонажей менять можно, главное слишком большого не делать иначе при игре на двоих графика поплывёт. Я по приколу собирал, но исключительно для одного игрока. 
Sharpnull:
Написал компрессор, сжимает чуть хуже оригинала. Попробовал вставить заменив байты. Если не ставить нули в оставшейся области, то работать не будет. Нужно разобраться как задавать размеры и т. п., чтобы правильно вставить. Проставил случайные байты для теста:

Результаты сжатия:

--- Код: ---FILE: decompressed_05_Galsia_161b90.bin
Comp   original: 8501
Comp           : 8520
Decomp         : 11904

FILE: decompressed_09_Electra_1647ca.bin
Comp   original: 8864
Comp           : 8890
Decomp         : 13504

FILE: decompressed_10_Signal_166e3e.bin
Comp   original: 6828
Comp           : 6855
Decomp         : 11392

FILE: decompressed_11_Biker_1bca08.bin
Comp   original: 9419
Comp           : 9442
Decomp         : 13440

FILE: decompressed_12_Ninja_1b972c.bin
Comp   original: 8439
Comp           : 8454
Decomp         : 13536

FILE: decompressed_13_Bongo_168fb8.bin
Comp   original: 7041
Comp           : 7069
Decomp         : 11456

FILE: decompressed_14_Hakuyo_1825cc.bin
Comp   original: 8306
Comp           : 8319
Decomp         : 13184
--- Конец кода ---
Размер в байтах. Comp original - сжато разработчиками, Comp - сжато мной, Decomp - несжатый размер.
Скрипт на Python 3. Опубликую позже, когда приведу в порядок и если всё ещё нужно вам.

Немного не понял с размером сжатой графики, вроде там указываются байты включая байты размера (+2), но похоже в коде Pancake 2 один символ может не считаться, я не стал искать пример для проверки.
Адреса не всех персонажей со сжатой графикой правильные: Donovan и Galsia в одних адресах, а Barbon вообще размера 0. Я не компилировал версию с github, может там получше.
savokgear:
Версия с гитхаба у меня есть, приложил. Я её сразу не добавлял, т.к. у разных версий панкейка немного разный функционал, и гитхабовская например не имеет функции  Decompress Art.
Я не совсем понимаю, но У Donovan и Galsia действительно одинаковые адреса спрайта, но SpriteMap разный. может это действительно один спрайт, они и правда очень похожи, может так хитро сделано?

Результат любопытный, будет круто если всё получится. Даже если враги после разжатия побитые, не пробовал заменить побитый спрайт через панкейк? В папке sor2_full_sprites есть оригинальные,  отрезать можно через ASU_19(тоже приложил).
Sharpnull:

--- Цитата: savokgear от 11 Ноябрь 2019, 01:20:07 ---Я не совсем понимаю, но У Donovan и Galsia действительно одинаковые адреса спрайта, но SpriteMap разный. может это действительно один спрайт, они и правда очень похожи, может так хитро сделано?
--- Конец цитаты ---
Так и есть, я просто не разбирался совсем в этом. Тайлы хранятся по адресу art address, а положения тайлов в SpriteMap. Их сложнее будет заменить. Изменил первый тайл, сделал одного цвета:

Здесь этот прямоугольник (персикового цвета) и ниже тайл, это один спрайт 8x16 пикселей (2 тайла). Все персонажи разбиты на несколько спрайтов, чтобы экономить VRAM, потому что тайлы спрайтов должны идти подряд в VRAM, вот и переиспользуют. Упомянутая каша, как раз результат нехватки памяти.
В общем, для нормальной модификации одного компрессора недостаточно.

--- Цитата: savokgear от 11 Ноябрь 2019, 01:20:07 ---Даже если враги после разжатия побитые, не пробовал заменить побитый спрайт через панкейк?
--- Конец цитаты ---
Они нормально разжимаются, если вы про скриншот.

На github почему-то версия старая 1.5. Может исходный код 1.6b потерялся.


--- Цитата: savokgear от 10 Ноябрь 2019, 01:26:32 ---Есть хак (добавлю) где все персонажи разжаты и можно играть за всех врагов и боссов, и менять их как угодно, осталось понять как это сделать самому.
--- Конец цитаты ---
Без знаний программирования под эту систему, никак. Я тоже в этом не разбираюсь.
Хак и правда мощный, в оригинале сжатые персонажи грузятся в VRAM один раз, потому что распаковка медленная. А здесь все враги подгружаются отдельно и динамически определяется место в VRAM. Но не идеально, потому что мусор при паузе появляется, не те тайлы при прыжке и в других местах. По скорости не заметно, но вероятно чуть медленнее должно быть. Хотя Gens кривой и забагованный, в нём тормоза заметны.
SeregaZ:
хы :) знакомые грабли :) у нас в Дюне похожая система, поэтому воевать надо не со спрайтами, а с тайлами и их расположением. а когда они уже расположены где надо - производить поиск и вырезание одинаковых тайлов, учитывая причем что тайлы могут быть отзеркалены и отзеркалены в 3 вариантах: по одной из осей или по обеим сразу.

то есть надо не по одному врагу-персонажу выдергивать и его править, а делать глобальный экспорт всего пака персонажей и врагов, с этим самым перерасчетом повторяющихся тайлов. тогда есть шанс, что в лимит все войдет. я правда такой глобальный экспорт сделал только для экранов в своем случае. а надо прям ну ваще глобальный делать - чтобы юниты, земля и заводы в одной процедуре экспортировались - тогда это будет правильное редактирование и с большими возможностями. так и в вашем случае надо - чтобы делался экспорт сразу с бекграундом, врагами, оружием, героями. вот тогда ничего плыть не будет.
savokgear:
Реверс инженерингом заниматься мне пока всё равно рано, я лишь новичок. Да и врагов я бы всех, или почти всех всё равно бы поменял, причём для каждого хака индивидуально. По этому, на данном этапе меня интересует в первую очередь декомпрессия спрайтов врагов, для последующей замены.
Sharpnull:

--- Цитата: SeregaZ от 11 Ноябрь 2019, 08:53:36 ---делать глобальный экспорт всего пака персонажей и врагов, с этим самым перерасчетом повторяющихся тайлов
--- Конец цитаты ---
Всё равно пришлось бы учитывать повторы тайлов у персонажей, не получилось бы сделать уникальные. Вот с хаком выше, где всё разжато проще, хоть размер выше и нужно дорабатывать.
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 и общем ограничении спрайтов и их размеров.
savokgear:
Нифига себе - это поражает. У меня голова аж взорвалась, буду разбираться.
Но пока не могу понять что мне с этим всем делать.

Как я представлял что нам нужно:
1. Распаковать файлы,
2. Добавить распакованные в ром, для последующий замены
3. Прописать где-то в роме что спрайты этого врага распакованные.
4. Прописать новый роут, путь для каждого спрайта на новое место.

И в принципе первые два пункта можно пропустить, И даже четвёртый пункт, так-же можно пропустить -  если, заставить игру думать, что спрайты распакованные и загружать через панкейк новый спрайт вместо скажем первого спрайта Макса, записывать адрес и map нового спрайта, и потом зная SpriteMap и Аrt address первого спрайта Макса - вернуть его на место.
Зная SpriteMap и Аrt address ваших новых спрайтов, если игра будет считать, что спрайты врагов распакованные, то просто прописать их в соответствующие поля.

То, что сделал ты безусловно поражает, невероятно поражает, но я пока не понимаю как это использовать. Ведь даже если получится вместо гарсии добавить спрайты нового персонажа на его место и потом обратно запаковать, я через панкейк не смогу уже пережатые новые спрайты поднастроить, передвинуть и где нужно подкрасить пару пикселей.

Буду разбираться.
Sharpnull:

--- Цитата: savokgear от 13 Ноябрь 2019, 12:16:03 ---Как я представлял что нам нужно:
--- Конец цитаты ---
Про вариант без сжатия я не подумал, от этого зависит только размер рома.
Вообще, глобальная задача влезть в VRAM. Знать где и какие враги, сколько занимают.
--- Цитата: savokgear от 13 Ноябрь 2019, 12:16:03 ---То, что сделал ты безусловно поражает
--- Конец цитаты ---
Всего лишь сделал сжатие, это было муторно, чем сложно. Ещё я не протестировал все крайние случаи входных данных, так что для надёжности можно сразу распаковывать и сверять с оригиналом.

Узнал почему Barbon не распаковывался, он просто не сжат :) В \guides\default.txt заменить:

--- Код: ---Barbon
14FF4
1
1612D8
--- Конец кода ---
на

--- Код: ---Barbon
14FF4
0
--- Конец кода ---
(4-я строка убрана). Тогда можно будет редактировать. Типы анимаций (сжат, не сжат) и адреса сжатой графики заданы в guides, но при разборе всё равно можно определить сжатый/не сжатый кадр (странно, почему не для всего персонажа).

Получилось переместить сжатую графику в конец рома, заменив все адреса в роме через hex-редактор. Не знаю какие именно нужно было менять, так как неизвестно откуда она берутся, а в Pancake 2 заданы заранее через файл. Главное чтобы после сжатой графики стоял один нулевой байт, иначе не заработает. Так что если не влезет где было, можно переместить в конец.

На счёт задания анимации, посмотрел код:
1. Основной адрес анимаций задан в файле. По нему находится список с адресами на анимации   для каждого персонажа.
2. Адрес указывает на список смещений относительно первого для адресов отдельных анимаций (может быть отрицательным). Кол-во анимаций из guides. // Character.java -> Character read()
3. В анимации список кадров, содержит количество кадров. // Animation.java -> Animation read()
4. Кадр содержит задержку, mapAddress (SpriteMap), artAddress. Ещё задаётся тип, но из файла guides\default.txt для всей анимации. // AnimFrame.java AnimFrame read()
Типов два и ещё какой-то, которого не было в guides\default.txt. Отличается от сжатого наличием artAddress в кадре. Возможно для какого-то хака.
5. Ну а в mapAddress задаётся информация для расположения тайлов из artAddress.
savokgear:
За Барбона гигантское спасибо, хоть сейчас иди и рисуй. Как-же жаль, что второй монитор в ремонте, работать с графикой с одним монитором очень долго и не удобно.

Насчёт VRAM ты полностью прав. С боссами я хоть как-то выкрутился. Я добавил босса, Абобо, который слишком большой, и он ломает курицы, сначала подумал, что ничего страшного и перенёс сундуки с курицами на предыдущую сцену, но пройдя уровень, оказалось что поломаны не только курицы а ещё и яблоки, стрелки "go", деньги, золото, жизни. Босс Абобо находится в конце четвёртого уровня, и если зайти сразу в пятый, то там всё нормально, если сначала пройти четвёртый, то в пятом и далее будет всё поломано. Мы пытались написать код на очистку врам памяти в конце каждого уровня, но ничего не вышло. Я не долго думая его поместил в лифт в конце игры, где ничего из поломанного уже не встречается. Не зря рабочее название хака Костели Эдишин. Остальные боссы тоже немного больше чем нужно, по этому после убийства босса третьего уровня в этом хаке уже не встретишь в сундуках жизни, деньги и золото, благо остальное не поломано.

 Для теста, если интересно вернул Абобо на место, в опциях есть выбор уровней, за Кунио нажимая вперёд+А на харде дойти до него не составит труда. Так он у меня встречается только в конце игры.
Да хак собирал не грамотно, ещё многого не зная, теперь смогу выиграть пол мегабайта ~ мегабайт места. Если получится поменять врагов буду переделывать с ноля, это минимум часов 20 времени.

Так вот если с заменой Боссов я обошёл проблему с VRAM, то с обычными врагами такого нельзя не в коем случае допускать.
С VRAM может помочь Sor2_LevelEditor (есть в гитхабовском панкейке), там у каждого врага указана VRAM память. Что не указано и что есть в игре - это VRAM каждой сцены. По этому в конце 7 уровня нельзя поменять роботов, в конце 6-го нельзя поменять проклятых Джетов.

Ах да, не удержался и для теста прописал в гайде панкейка так, что-бы панкейк считал, что Электра не пережата, попробовал поменять пару спрайтов, увы ничего не вышло.


Добавлено позже:


--- Цитата: Sharpnull от 13 Ноябрь 2019, 23:36:20 ---Так что если не влезет где было, можно переместить в конец.

--- Конец цитаты ---
Это кстати круто, т.к. я использую больше уникальных спрайтов, например для вставания на ноги.
Sharpnull:

--- Цитата: savokgear от 14 Ноябрь 2019, 02:49:29 ---За Барбона гигантское спасибо
--- Конец цитаты ---
Mr X - большую часть не сжат, а вот после 26-й анимации, где он сидит и курит (art address 1D01E8), уже сжато. Программа не может открыть ром, после изменения несжатой анимации. Вот Barbon похоже по ошибке сделали сжатым. Я заметил это всё когда переключал анимацию и кадры, у несжатых art address разный.
Баг в Pancake 2 можно исправить через компиляцию. Когда в файле указан тип 1, он блокирует интерфейс рисования (другое не пробовал), но если передать 0, то проблема здесь:

--- Код: --- // https://github.com/gsaurus/sor_pancakes/blob/master/pk2/src/lib/anim/Animation.java
public static Animation read(RandomAccessFile rom, long address, int type)  throws IOException{
    rom.seek(address);
    int size = rom.readUnsignedShort();
    Animation anim = new Animation(size, type);
    int accum = 0;
    for (int i = 0 ; i < size ; ++i){
        AnimFrame frame = AnimFrame.read(rom, address + 2 + accum, type);
        accum += AnimFrame.getTypeDependentSize(frame.type);
        anim.frames.add(frame);
    }
    return anim;
}
// https://github.com/gsaurus/sor_pancakes/blob/master/pk2/src/lib/anim/AnimFrame.java
public static AnimFrame read(RandomAccessFile rom, long address, int type)  throws IOException{
    if (type == 2) return readTypeTwo(rom, address);
//    if (type == 1) return readTypeOne(rom, address);
    else if (type == 0)return readTypeZero(rom, address);
    // type 1 may be mixed up (Mr. X)
    return readUnknownType(rom, address);
}
--- Конец кода ---
При 0 вызывается return readTypeZero(rom, address);, что неправильно прочитается, а если передать допустим 3, то new Animation(size, type); создаст анимацию типа 3, которая будет считаться не сжатой и вызовет ошибку public boolean isCompressed(){ return type == 1; }. Вероятно из-за чего-то ещё.
Странно, что формат анимации такой, что кадр может быть сжат отдельно, но такого наверно не встречается.
Yoti:
Sharpnull,
нажав на номер строки на гитхабе получишь ссылку с аатопромоткой до этой строки, к слову.
Sharpnull:
Добавил возможность редактировать несжатого Mr X, но там изменяется больше, чем пиксели, ещё адреса какие-то. Количество оружия при сохранении не сходилось, добавил проверку. Поэтому не уверен, что будет правильно отредактировано. Resize Animations работать не будет на нём, так как в коде учитывается только один несжатый тип. Вы помощью этого меняли положение тайлов и размеры персонажей?
Также добавил перетаскивание (drag'n'drop) рома для открытия, исправил сохранение при закрытии (при смене персонажа всё также молчаливое изменение рома), минимальная версия JDK/JRE повышена с 6 до 7. Возможно добавлю форк на гитхаб позже.

Хак под River City Girls выглядит хорошо.
Yoti, спасибо, что напомнили.
savokgear:
 За мистера Х спасибо. Анимация с сигарой всё равно в американской версии не доступна, и если патч не ставить, то её и не будет. Но Мистера Х всё равно довольно сложно будет менять, т.к. у него из боевых анимаций только удар прикладом и стрельба из автомата, мало спрайтов под это дело подойдут. Эх, лучше было бы двое Шивы. Но может где-то и прикрутим. Иметь возможность заменить это уже хорошо.

 Насчёт положения тайлов я не совсем понял, напрямую тайлы я почти не трогал, только спрайты. Я только с помощью yy-chr затирал портреты новых боссов, странно что через панкейк их нельзя менять, можно только персонажей, так. что пришлось затереть.
 Размеры анимаций персонажей и боссов действительно менял с помощью Resize Animations, но в отличии от того хака Sindicate Wars в оригинале есть лимит спрайтов, так что, где-то убираешь, и где-то добавляешь необходимое кол-во. Например уменьшаем idle анимацию Блейз  на шесть спрайтов и добавляем бег. Лимит конечно тоже огорчает, думал получится его как-то обойти, спрайтов из River City Girls где-то под 500 хороших, можно было бы сделать более плавный бег и всё прочее, но как есть.

Откопал на веб Архиве эти старые гайды:

--- Цитата ---https://web.archive.org/web/20160214150046/http://www.soronline.net/sor2_hacking.htm
https://web.archive.org/web/20151201080352/http://soronline.net/forum/viewtopic.php?f=13&t=241
https://web.archive.org/web/20160214150049/http://www.soronline.net/sor2_codes.htm
--- Конец цитаты ---
Увы не получилось исхитрится с размерами анимаций
eskayelle:
Good evening.  Please forgive the English, as it's my native language.

Would the compression tool in this forum work to compress and add new screens for the end credits?

There are six ending pictures in the credits.  Here is the data for the sixth:


--- Код: ---Offset of compressed picture: $02DDB2
Offset of palette: $02F930
Size of picture: 0x18E0 bytes
Tiles: 18 x 12
VRAM Offset: $005B80
Offset of compression routine: $0030C0

--- Конец кода ---

Would the compressor be able to compress a new picture such that it properly replaces the compressed picture at $02DDB2?  If yes, can you provide a few instructions on how I would use the compressor to do this?

Thank you in advance for your help!
Sharpnull:

--- Цитата: eskayelle от 16 Ноябрь 2019, 04:24:34 ---Would the compressor be able to compress a new picture such that it properly replaces the compressed picture at $02DDB2?
--- Конец цитаты ---
If the compressed picture has a small file size:

--- Код: ---sor2_comp.py -c "new_pic.bin" -r "Streets of Rage 2 (U) [!].gen" 0x02DDB2 -o "SoR2_hack.gen" -u
--- Конец кода ---
You should also know how to change the tilemap.

--- Цитата: savokgear от 14 Ноябрь 2019, 19:43:34 ---Насчёт положения тайлов я не совсем понял, напрямую тайлы я почти не трогал, только спрайты.
--- Конец цитаты ---
Я только сейчас понял, что Resize Animations просто меняет количество кадров, а замена спрайтов помещает их в конец рома по умолчанию. Хотя можно раньше, стандартный ром просто забит ненужными 0xFF байтами. У вас тоже осталось пустое место и звуки выровнены на 16 байт, предполагаю это требуется.

--- Цитата: savokgear от 14 Ноябрь 2019, 19:43:34 ---в отличии от того хака Sindicate Wars в оригинале есть лимит спрайтов, так что, где-то убираешь, и где-то добавляешь необходимое кол-во. Например уменьшаем idle анимацию Блейз  на шесть спрайтов и добавляем бег. Лимит конечно тоже огорчает, думал получится его как-то обойти
--- Конец цитаты ---
Там лимит кадров, а не спрайтов, немного другое понятие, потому что у разных кадров может быть один и тот же спрайт. Судя по изменению рома, в Sindicate Wars просто вся таблица персонажа перемещается в конец, если замечает, что не влезает. При этом SpriteMap и Art Address остаются. Так что я думаю можно избавиться от ограничения. Жалко нет исходного кода версии 1.6b.
--------
Получилось вручную перенести адрес анимаций Макса на конец и скопировать туда одну первую анимацию. Для открытия в Pancake пришлось указать в файле 1 анимацию вместо 50, resize - не сработал, но нарисовать карандашом получилось и в эмуляторе при выборе персонажа отображалось правильно.
Конечно, если редактировать уже отредактированный ром, будет неудобно перемещать постоянно графику или таблицу. Даже простое изменение спрайта, добавляет его в конец, а если нужно отредактировать его после добавления ещё одного, то придётся оба перемещать. Программа в текущем виде никак не узнает, где свободно, а где занято. Тут бы помог "файл проекта", который сохранял бы информацию об изменениях и изображениях, тогда смог бы перестраивать ром каждый раз без проблем.
savokgear:
Да, точно лимит кадров.
Но кстати не уверен какая версия последняя 1.5 или не смотря на название 1.6b. В  1.6b например есть баг, нельзя менять хитбоксы скейта

Добавлено позже:
Кстати да, я сейчас добавил  еще одного босса в хак ривер сити гелс, но использовал не пустое место, а стандартные адреса боссов и персонажей

Добавлено позже:
И еше стоить знать при resize animation меняя анимации через блокнот++   -   первый столб это кол-во спайтов для каждой анимации. Второй столб это кадры с оружием, третий это хитбоксы, атакующие кадры. И все ограничено, везде есть свой лимит.
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии