|
shedevr.org.ru Группа перевода приставочных игр "ШЕДЕВР"
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 05, 2006 1:34 pm Заголовок сообщения: Сжатая графика в Tombs & Treasure(NES) |
|
|
Ломал я голову над этой проблемой, ломал, ломал и доламался - почти вывел алгоритм сжатия. Но почти, как известно, не считается. Я попытаюсь поподробнее описать ситуацию - может у кого найдутся соображения на этот счет.
Я определил, что графика сжимается системой байтов в таком формате:
{Неизвестный байт}{00}{Описывающий байт}{Байты графики}
Теперь подробнее:
{Неизвестный байт} - байт, предназначение которого мне еще неизвестно, но стоит хоть чуть-чуть его изменить и картинка сразу-же изменяется. Измениться может цвет, положение части картинки, возможно кодировка графики с 1BPP на 2BPP(еще не уверен, с 2BPP не разбирался).
{00} - не знаю, отделяющий это байт или просто так совпало, что это продолжение неизвестного байта, но он есть после каждого неизвестного байта.
{Описывающий байт} - байт, который описывает, сколько впереди него будет байт, отвечающих за графику. Если байт {0X}, то X - это количество идущих друг за другом байт графики(о них чуть ниже), а если байт {8X}, то после него идет один байт, рисующий свою графику X раз подряд(то есть будет X одинаковых восьми-пиксельных линий подряд).
{Байт графики} - байт, описывающий графику в кодировке 1BPP, кто не знает, объясню:
Допустим у нас есть байт D5, если перевести его в биты получиться 11010101(B=1011, 5=0101). Так вот, графика будет отображаться также, только вместо нулей и едениц будут точки двух разных цветов(я говорю только про 1BPP), то есть получиться строка из восьми точек.
Надеюсь, ситуация понятна. Ну так вот, я пытался переписать этот промежуток, но тогда картинка портилась, наверное дело в этих "неизвестных байтах", а может там есть что-то типа поинтеров - не знаю. Самому пока-что в эту хитрую систёму полностью въехать не получаеться, могу только распаковать графику, а обратно она не хотит. Может кто сталкивался с подобным и может дать какой-нибудь совет, буду очень благодарен.
З.Ы. Самое обидное то, что эта графика особого значения не имеет - в ней только названия локаций, а по тексту и так можно догадаться, где ты находишься. Обычно сразу и пишеться, что за локация. |
|
Вернуться к началу |
|
|
Axel Советник
Зарегистрирован: 14.11.2003 Сообщения: 680
|
Добавлено: Ср Июл 05, 2006 7:52 pm Заголовок сообщения: |
|
|
Нинтендо обычно использует сжатие по алгоритму LZ77
либо ты описываешь тривиальный RLE (он даже в .BMP используется...иногда) _________________ Всех их вместе переведём! |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Ср Июл 05, 2006 8:52 pm Заголовок сообщения: |
|
|
А в гугле это точно есть? А то с 1BPP я сам разбирался, в гугле не нашел ничего, кроме ссылок на этот форум. |
|
Вернуться к началу |
|
|
tmax
Зарегистрирован: 24.12.2003 Сообщения: 53
|
Добавлено: Чт Июл 06, 2006 5:56 am Заголовок сообщения: |
|
|
Axel писал(а): | Нинтендо обычно использует сжатие по алгоритму LZ77
либо ты описываешь тривиальный RLE (он даже в .BMP используется...иногда) |
Насколько я понял из объяснения все-таки RLE. |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Чт Июл 06, 2006 7:30 am Заголовок сообщения: |
|
|
Да, RLE. Проблема только в том, что распаковать и запаковать я могу, а вот вставить в ром не могу. Видимо где-то есть ссылки на определенные участки, да и с этими "неизвестными байтами" проблема - нафига они их и {00} сували? Не могли что-ли только описывающие и графические байты оставить? Да изачем сжимать-то? Свободного места они от этого совсем не выиграли, да его-то как раз вроде бы в роме хватает. |
|
Вернуться к началу |
|
|
CaH4e3
Зарегистрирован: 21.01.2004 Сообщения: 195
|
Добавлено: Вс Июл 09, 2006 1:16 pm Заголовок сообщения: |
|
|
В игре испольуется самый обычный RLE, даже без каких бы то ни было расширений. И никаких неизвестных байтов в начале нет. Блок запакованных данных всегда начинается с RLE кода, который содержит счетчик (младшие 7 бит) и RLE флаг (старший бит). Если RLE флаг равен 1, то следующий за кодом байт данных повторяется столько раз, сколько указано в счетчике. Если RLE флаг равен нулю, то следующие за кодом байты в количестве равном значению счетчика переписываются в принимающий буфер. Декодирование останавливается, когда очередной RLE код равен 0x7F.
Как правило, в начале каждого пакуемого блока находится пустое место - пробел или просто пара пустых строк - потому каждый блок в массе своей начинается как {1xxxxxxb}{00000000b} данными...
Ты забыл совсем про такую штуку, как указатели... Это такая хрень, которая говорит декодеру, где лежат данные и без них никакой декодер работать не будет... Указатели могут быть записаны непосредственно кодом в соответствующие переменные декодера, а могут быть считаны из таблиц указателей... Так вот скажу по секрету, что почти всегда, а в данной игре уж и подавно, таблицы указателей лежат в начале банка, содержащего данные... В данном случае, это восьмой 16кб банк (считая от нуля), и адрес начала таблицы - 0х8010. Каждый элемент - трехбайтовый. Первые два байта - и есть смещение начала запакованного фрагмента.
Вообще, если тебе удастся ужать перерисованный блок в размер не больший, чем занимал исходный блок упакованных данных, тогда поинтеры тебе не понадобятся... А вот если у небя не получается оставлять блоки на своих местах - будь добр поправь и указатель... |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Вс Июл 09, 2006 6:54 pm Заголовок сообщения: |
|
|
CaH4e3 писал(а): | Ты забыл совсем про такую штуку, как указатели... |
Я о ней вообще не знал
Спасибо за информацию, будет над чем подумать, когда еще немного кой-чему подучусь, а то за эту неделю моё представление о ромхакинге сильно изменилось... Но это не значит, что я его брошу - я упорный, если не могу что-то сделать, то буду биться до тех пор, пока это не сделаю. Другое дело, если я знаю, как сделать, но не хочу - тогда и забросить могу. |
|
Вернуться к началу |
|
|
АнС RRC2008
Зарегистрирован: 08.11.2003 Сообщения: 2818
|
Добавлено: Вс Июл 09, 2006 10:52 pm Заголовок сообщения: |
|
|
HoRRoR писал(а): | я упорный, если не могу что-то сделать, то буду биться до тех пор, пока это не сделаю. Другое дело, если я знаю, как сделать, но не хочу - тогда и забросить могу. |
Вот так всегда бывает. Пока не знаешь - хочешь, а значит, прилагаешь максимум усилий. Потом уже всё знаешь, но ничего не хочешь. И чем дольше продлится пограничный период с момента "не знаю, но хочу" до "знаю, но не хочу" - тем лучше... |
|
Вернуться к началу |
|
|
HoRRoR RRC2008
Зарегистрирован: 21.06.2006 Сообщения: 2341 Откуда: Ростов-на-Дону
|
Добавлено: Пн Июл 10, 2006 6:58 am Заголовок сообщения: |
|
|
АнС писал(а): | HoRRoR писал(а): | я упорный, если не могу что-то сделать, то буду биться до тех пор, пока это не сделаю. Другое дело, если я знаю, как сделать, но не хочу - тогда и забросить могу. |
Вот так всегда бывает. Пока не знаешь - хочешь, а значит, прилагаешь максимум усилий. Потом уже всё знаешь, но ничего не хочешь. И чем дольше продлится пограничный период с момента "не знаю, но хочу" до "знаю, но не хочу" - тем лучше... |
Не всегда. Из-за этого "не знаю" в основном и стопоришься, а как только узнал - делаешь дальше, пока не надоест. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|