Автор Тема: Как разжимать спрайты на Сега играх? [Streets of Rage 2]  (Прочитано 5004 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Хочу доделать свои тематические Street of Rage 2 хаки, например заменить спрайты врагов. Но беда в том, что они пережатые.
Кто шарит как правильно разжимать графику, поясните пожалуйста.
Для SoR2 есть программа Панкейк, в которой можно менять не пережатые спрайты персонажей и боссов, на её примере рассмотрим.

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



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



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

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


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

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


« Последнее редактирование: 12 Ноябрь 2019, 00:07:58 от savokgear »

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1052
    • ВКонтакте
    • Steam
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #1 : 09 Ноябрь 2019, 19:04:04 »
Распаковку легче написать, чем запаковку, а ещё запакованный может не влезть. Поэтому похоже, что просто не стали делать. В коде программы тоже не нашёл ничего про компрессию.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #2 : 09 Ноябрь 2019, 20:29:17 »
Похоже SUPER_ROBOT об этом коде https://github.com/gsaurus/sor_pancakes. Декомпрессия здесь https://github.com/gsaurus/sor_pancakes/blob/master/pk2/src/lib/map/Decompressor.java и там наверно что-то типа RLE. При желание можно разобраться или добавить карлика, если можно размеры персонажей менять :)

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

Оффлайн savokgear

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #4 : 10 Ноябрь 2019, 23:43:06 »
Написал компрессор, сжимает чуть хуже оригинала. Попробовал вставить заменив байты. Если не ставить нули в оставшейся области, то работать не будет. Нужно разобраться как задавать размеры и т. п., чтобы правильно вставить. Проставил случайные байты для теста:

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

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

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #5 : 11 Ноябрь 2019, 01:20:07 »
Версия с гитхаба у меня есть, приложил. Я её сразу не добавлял, т.к. у разных версий панкейка немного разный функционал, и гитхабовская например не имеет функции  Decompress Art.
Я не совсем понимаю, но У Donovan и Galsia действительно одинаковые адреса спрайта, но SpriteMap разный. может это действительно один спрайт, они и правда очень похожи, может так хитро сделано?

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #6 : 11 Ноябрь 2019, 05:34:51 »
Я не совсем понимаю, но У Donovan и Galsia действительно одинаковые адреса спрайта, но SpriteMap разный. может это действительно один спрайт, они и правда очень похожи, может так хитро сделано?
Так и есть, я просто не разбирался совсем в этом. Тайлы хранятся по адресу art address, а положения тайлов в SpriteMap. Их сложнее будет заменить. Изменил первый тайл, сделал одного цвета:

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

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

Есть хак (добавлю) где все персонажи разжаты и можно играть за всех врагов и боссов, и менять их как угодно, осталось понять как это сделать самому.
Без знаний программирования под эту систему, никак. Я тоже в этом не разбираюсь.
Хак и правда мощный, в оригинале сжатые персонажи грузятся в VRAM один раз, потому что распаковка медленная. А здесь все враги подгружаются отдельно и динамически определяется место в VRAM. Но не идеально, потому что мусор при паузе появляется, не те тайлы при прыжке и в других местах. По скорости не заметно, но вероятно чуть медленнее должно быть. Хотя Gens кривой и забагованный, в нём тормоза заметны.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2327
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Как разжимать спрайты на Сега играх?
« Ответ #7 : 11 Ноябрь 2019, 08:53:36 »
хы :) знакомые грабли :) у нас в Дюне похожая система, поэтому воевать надо не со спрайтами, а с тайлами и их расположением. а когда они уже расположены где надо - производить поиск и вырезание одинаковых тайлов, учитывая причем что тайлы могут быть отзеркалены и отзеркалены в 3 вариантах: по одной из осей или по обеим сразу.

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

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Реверс инженерингом заниматься мне пока всё равно рано, я лишь новичок. Да и врагов я бы всех, или почти всех всё равно бы поменял, причём для каждого хака индивидуально. По этому, на данном этапе меня интересует в первую очередь декомпрессия спрайтов врагов, для последующей замены.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
делать глобальный экспорт всего пака персонажей и врагов, с этим самым перерасчетом повторяющихся тайлов
Всё равно пришлось бы учитывать повторы тайлов у персонажей, не получилось бы сделать уникальные. Вот с хаком выше, где всё разжато проще, хоть размер выше и нужно дорабатывать.

savokgear, Дописал компрессор (распаковщик/запаковщик), смог добиться сжатия как у разработчиков: размер одинаковый, но некоторые байты различаются из-за вариантов сжатия одного и того же. Нашёл способ сжать лучше, но в два раза медленнее, даёт уменьшение на 1-9 байт где-то. Не реализовал последнюю проверку для улучшенного сжатия, например для Ninja можно было сжать на 1 байт лучше, просто там нужно код перестраивать замысловато.

Сравнение улучшенного сжатия

Описание алгоритма сжатия

Скрипт на 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

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Нифига себе - это поражает. У меня голова аж взорвалась, буду разбираться.
Но пока не могу понять что мне с этим всем делать.

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

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

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

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
Как я представлял что нам нужно:
Про вариант без сжатия я не подумал, от этого зависит только размер рома.
Вообще, глобальная задача влезть в VRAM. Знать где и какие враги, сколько занимают.
То, что сделал ты безусловно поражает
Всего лишь сделал сжатие, это было муторно, чем сложно. Ещё я не протестировал все крайние случаи входных данных, так что для надёжности можно сразу распаковывать и сверять с оригиналом.

Узнал почему 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.
« Последнее редактирование: 13 Ноябрь 2019, 23:45:59 от Sharpnull »

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
За Барбона гигантское спасибо, хоть сейчас иди и рисуй. Как-же жаль, что второй монитор в ремонте, работать с графикой с одним монитором очень долго и не удобно.

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

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

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

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


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

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
За Барбона гигантское спасибо
Mr X - большую часть не сжат, а вот после 26-й анимации, где он сидит и курит (art address 1D01E8), уже сжато. Программа не может открыть ром, после изменения несжатой анимации. Вот Barbon похоже по ошибке сделали сжатым. Я заметил это всё когда переключал анимацию и кадры, у несжатых art address разный.
Баг в Pancake 2 можно исправить через компиляцию. Когда в файле указан тип 1, он блокирует интерфейс рисования (другое не пробовал), но если передать 0, то проблема здесь:
При 0 вызывается return readTypeZero(rom, address);, что неправильно прочитается, а если передать допустим 3, то new Animation(size, type); создаст анимацию типа 3, которая будет считаться не сжатой и вызовет ошибку public boolean isCompressed(){ return type == 1; }. Вероятно из-за чего-то ещё.
Странно, что формат анимации такой, что кадр может быть сжат отдельно, но такого наверно не встречается.

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4327
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Sharpnull,
нажав на номер строки на гитхабе получишь ссылку с аатопромоткой до этой строки, к слову.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
Добавил возможность редактировать несжатого Mr X, но там изменяется больше, чем пиксели, ещё адреса какие-то. Количество оружия при сохранении не сходилось, добавил проверку. Поэтому не уверен, что будет правильно отредактировано. Resize Animations работать не будет на нём, так как в коде учитывается только один несжатый тип. Вы помощью этого меняли положение тайлов и размеры персонажей?
Также добавил перетаскивание (drag'n'drop) рома для открытия, исправил сохранение при закрытии (при смене персонажа всё также молчаливое изменение рома), минимальная версия JDK/JRE повышена с 6 до 7. Возможно добавлю форк на гитхаб позже.

Хак под River City Girls выглядит хорошо.

Yoti, спасибо, что напомнили.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
 За мистера Х спасибо. Анимация с сигарой всё равно в американской версии не доступна, и если патч не ставить, то её и не будет. Но Мистера Х всё равно довольно сложно будет менять, т.к. у него из боевых анимаций только удар прикладом и стрельба из автомата, мало спрайтов под это дело подойдут. Эх, лучше было бы двое Шивы. Но может где-то и прикрутим. Иметь возможность заменить это уже хорошо.

 Насчёт положения тайлов я не совсем понял, напрямую тайлы я почти не трогал, только спрайты. Я только с помощью 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
Увы не получилось исхитрится с размерами анимаций
« Последнее редактирование: 15 Ноябрь 2019, 03:50:02 от savokgear »

Оффлайн eskayelle

  • Пользователь
  • Сообщений: 12
    • Просмотр профиля
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

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
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" -uYou should also know how to change the tilemap.

Насчёт положения тайлов я не совсем понял, напрямую тайлы я почти не трогал, только спрайты.
Я только сейчас понял, что Resize Animations просто меняет количество кадров, а замена спрайтов помещает их в конец рома по умолчанию. Хотя можно раньше, стандартный ром просто забит ненужными 0xFF байтами. У вас тоже осталось пустое место и звуки выровнены на 16 байт, предполагаю это требуется.
в отличии от того хака Sindicate Wars в оригинале есть лимит спрайтов, так что, где-то убираешь, и где-то добавляешь необходимое кол-во. Например уменьшаем idle анимацию Блейз  на шесть спрайтов и добавляем бег. Лимит конечно тоже огорчает, думал получится его как-то обойти
Там лимит кадров, а не спрайтов, немного другое понятие, потому что у разных кадров может быть один и тот же спрайт. Судя по изменению рома, в Sindicate Wars просто вся таблица персонажа перемещается в конец, если замечает, что не влезает. При этом SpriteMap и Art Address остаются. Так что я думаю можно избавиться от ограничения. Жалко нет исходного кода версии 1.6b.
--------
Получилось вручную перенести адрес анимаций Макса на конец и скопировать туда одну первую анимацию. Для открытия в Pancake пришлось указать в файле 1 анимацию вместо 50, resize - не сработал, но нарисовать карандашом получилось и в эмуляторе при выборе персонажа отображалось правильно.
Конечно, если редактировать уже отредактированный ром, будет неудобно перемещать постоянно графику или таблицу. Даже простое изменение спрайта, добавляет его в конец, а если нужно отредактировать его после добавления ещё одного, то придётся оба перемещать. Программа в текущем виде никак не узнает, где свободно, а где занято. Тут бы помог "файл проекта", который сохранял бы информацию об изменениях и изображениях, тогда смог бы перестраивать ром каждый раз без проблем.
« Последнее редактирование: 16 Ноябрь 2019, 09:59:43 от Sharpnull »

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Да, точно лимит кадров.
Но кстати не уверен какая версия последняя 1.5 или не смотря на название 1.6b. В  1.6b например есть баг, нельзя менять хитбоксы скейта

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

Добавлено позже:
И еше стоить знать при resize animation меняя анимации через блокнот++   -   первый столб это кол-во спайтов для каждой анимации. Второй столб это кадры с оружием, третий это хитбоксы, атакующие кадры. И все ограничено, везде есть свой лимит.
« Последнее редактирование: 16 Ноябрь 2019, 10:25:48 от savokgear »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
savokgear, 1.6b новее, возможно исходный код был потерян. Попробовал декомпилировать версию 1.6b, все имена методов сохранились, только почему-то нет form-файлов.  При желании автор мог бы всё восстановить, но это не быстро сливать оба кода.

Оффлайн eskayelle

  • Пользователь
  • Сообщений: 12
    • Просмотр профиля
Цитата
Quote: eskayelle on Today at 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:
Code: [Highlight]
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.

Sharpnull, is there a specific format you recommend for the new picture (.bmp? .png?) and a tool that'd work best to convert that format to .bin for use with the script?

sor2_comp.py is a Python script that first needs to be compiled, correct?

The file size will be 6KB when compressed.  Will that be too large for the compressor?

I do have access to the tile map to modify it, as needed.  It's at $02F6D2, with the pointer at $022E90.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Sharpnull, Благодаря тебе обновил хак River City Girls, теперь там все новые боссы, кроме мистера Х. И даже с альтернативной палитрой. По прежнему это костели эдишин, пришлось убрать поломанные мешки с деньгами и золото, но все работает без проблем. Осталось разобраться с обычными врагами.
« Последнее редактирование: 18 Ноябрь 2019, 08:03:32 от savokgear »

Оффлайн eskayelle

  • Пользователь
  • Сообщений: 12
    • Просмотр профиля
Sharpnull, I want to extend a thanks as well.  I created a template in a tile editor, saved the template to .bin, set the codec to 4bpp planar, and dropped my image in. 

I then used a Python compiler to run the compressor and it inserted the image right where I needed it.  The tile map needed some massaging, and the Mega Drive's palette limitations weren't too friendly with my image, but I think it turned out very well!

Thanks again!

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2327
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
split your image to different pieces. use it not as image + 1 pallete for all image, but a few pieces with 1-2-3-4 palletes. as it was for a Dune 2


Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
savokgear, как глупо, я не посмотрел другие ветки (branch) на github, автор уже давно восстановил потерянную версию 1.6b, она была здесь https://github.com/gsaurus/sor_pancakes/tree/feature/revive_pk2, а не в основной (master) ветке. Кроме восстановления он что-то ещё пофиксил и добавил удаление персонажа (не знаю как работает). Прикладываю билд, на всякий случай. Я ничего своего не добавлял, Barbon всё также не исправлен в default.txt.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Скачал, кнопка удаления персонажа похоже, что не работает, попробовал нажать, но ничего не изменилось. Пробовал на Хаке, думал может удалит все новые спрайты и вернёт стандартного персонажа, ничего. Пробовал на оригинале. Возможно эта кнопка для хака синдикат ворс. Лучше бы была кнопка добавить персонажа, для оригинала. :lol:
Так-же остался баг - невозможность редактировать хитбоксы скейта.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4598
    • Просмотр профиля
savokgear, посмотрел код, эта магия с удалением работает только после использования "Generate From Image" или Import Character -> Generate from Spritesheet и Import from other ROM. Эта фича меняет только адреса, на основе которых будет выбираться куда вставить спрайт/анимацию после использования тех же "Generate..." и ..., ... . Она ничего не сделает, если просто открыть ром.

Наверно потому он не добавил обновление в основную ветку, так как не доделал: адрес у Generate Sprite пропал (специально?), интерфейс кривоват, в коде вместо переменных констант просто числа (после декомпиляции). Если я бы хотел делать хаки для SOR2, написал бы программу заново :)
Так-же остался баг - невозможность редактировать хитбоксы скейта.
Нашёл ошибку:
if (id == 24 && numPlayableChars < 24 || id == numPlayableChars - 1) break;Эта проверка встречается ещё два раза при записи. Добавлено было для SW, где количество игровых персонажей (numPlayableChars) может быть больше 4. id - персонажа от 0. Очень странная проверка на 24 (25-й персонаж) - это граната, которую в версии 1.5 не допускали до этого участка кода, а здесь разрешается, но потом идёт проверка именно на неё (id == 24 && numPlayableChars < 24) и почему-то не numPlayableChars <= 24. Чем не угодил последний игровой персонаж (как Skate) неясно.
Исправить можно, но думаю нет смысла для вас.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Если я бы хотел делать хаки для SOR2, написал бы программу заново :)

Да вот многие на панкейк жалуются, но я не программист.
Import from other ROM кстати говоря вообще глюченная функция. Персонажи в SoR подвязаны по двое - Макс с Акселем и Блейз с Скейтом. И стоит импотировать скажем Скейта поломаются хитбоксы Блейз. Они появятся на других спрайтах, высота и длинна поплывет и прочее. Можно потратить время, восстановить и обнаружить, что теперь поломалось все у Скейта, и так по кругу чинишь у одного ломается у другого. Ром в этот момент проще выбросить.

Оффлайн savokgear

  • Пользователь
  • Сообщений: 38
    • Twitter
    • Youtube
    • Просмотр профиля
Как оказалась Resize Animation тоже крашит РоМ. В последнем хаке собрал Макса, проверил, всё работает. Потом собрал Акселя, всё работает, и обнаружил, что пропали первые два спрайта бега Макса. Если в этот момент попробовать обновить поломанные спрайты - ром точно можно выбрасывать. Опытным путём удалось выяснить, что если добавляешь уникальные спрайты атаки мечём для Акселя, то ломаются первые два спрайта бега Макса, и если бы бег был из 4 или менее спрайтов, то всё бы было в порядке. Пришлось отказаться от уникальных спрайтов и дублировать спрайты трубы.

 Панкейк страшная штука, куда не чихнёшь - всё ломается. Собирать персонажей с ним хоть и просто, но ой как не просто на самом деле.
« Последнее редактирование: 21 Ноябрь 2019, 19:44:25 от savokgear »