Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Экстрим хакинг » RLE - KONAMI (NES)


RLE - KONAMI (NES)

Сообщений 1 страница 20 из 35

1

Парни, не могу вспомнить, где-то выкладывали пакер/анапкер для алгоритма RLE, применяемого фирмой Конами в своих играх на NES. Во вложении расжатая тайловая карта и пожатая алгоритмом RLE. Может у кого есть в загашнике упаковщик. Особенности местного алгоритма, что кодирует как цепочки из повторяющихся байтов, так и цепочки из последовательных байтов.
P. S. По-моему нашёл что-то нужно на Zophar-e. Судя, по названию, похоже на какой-то развод. :) Хотя...
Надо скачать питон, чтобы понять, работает ли это.

Отредактировано Mefistotel (2011-05-28 11:26:49)

2

Там же описан принцип сжатия, сам бы и написал. Алгоритм-то действительно простой.

3

Я бы RLE не относил к экстриму :)

Рассмотрим первые несколько байт пожатого ресурса:
00 20 4B 00 8B 61 62 90 91 92 93 94 95 B3 B4 73 06 00

Смотрим первый бит первого байта, если он равен нулю, то идёт копирование нескольких байтов, если единице значит идёт несколько непожатых байтов.
Первый байт у нас 00, а его старший бит, соответственно - 0. Значит дальше идёт несколько одинаковых байт, длина определяется 7-ю младшими битами, то есть длина у нас будет 0. Дальше идёт байт, который у нас множится 0 раз. то есть пара 00 20 распаковывается в ничто  :D

Смотрим следующий байт: 4B
У него старший бит равен нулю, значит будет множество одинаковых байтов, их количество берём из младших семи бит 01001011, то есть длина отрезка с одинаковыми байтами - 4B. За ним идёт байт из которого составляется этот отрезок - 00. То есть пара 4B 00 превращается в состоящий из 00 отрезок длиной в 4B (75 в десятичной системе).

Теперь опять идёт флаговый байт: 8B
Смотрим его старший бит - он равен 1, значит дальше идёт не пожатый отрезок. Его длину получаем из 7 младших битов 10001011, то есть длина получается 0B. Следующие 0B (11 в десятичной системе) байтов у нас не пожатые: 61 62 90 91 92 93 94 95 B3 B4 73

И снова идёт флаговый байт, на этот раз он 06.
Смотрим первый бит, он равен нулю, остальные 7 бит дают длину отрезка - 06. Следующий за ним байт говорит из какого байта состоит отрезок - 00. То есть пара 06 00 превращается в шесть нулей (00 00 00 00 00 00).

З.Ы.: Возможно первые два байта и не предназначены для распаковки. Они могут служить просто индикатором RLE сжатия. Так что, если перепакованный ресурс вдруг начнёт выглядеть в игре странно, можно будет попробовать подставить перед ним байты 00 20. Они в любом случае не навредят, так как распаковываются в ничто.

Отредактировано TrickZter (2011-05-28 07:42:29)

4

В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.

5

В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.

Да, и это надо учитывать при запаковке. Если количество разных байт превышает 7E, то флаговый байт следует ограничить этим значением (FE), иначе игрушка посчитает его концом RLE.

6

Возможно первые два байта и не предназначены для распаковки.

Я считал, что это размер архива, h0200 - 512 байт.
Парни, я знаю, как это работает, но научиться програмировать у меня банально не было времени и не будет. Это факт.  :(
Поэтому и ищу готовый компрессор. Сейчас с этой кладбищенской уткой разберусь только. :) Скачал 3 питон, ругается зараза на синтаксис.
Хотя всё понятно изложено:

Код:
graveduck.py -c [FILENAME] [OFFSET] [BINARY]
graveduck.py -d [FILENAME] [OFFSET] [BINARY]

-c compresses BINARY and sticks it into FILENAME at OFFSET. Don't blame me if it overwrites stuff because the new compressed data is larger -- that is your own fault. My compression is 1-to-1 identical to Konami's and compresses data to exactly match Konami's version.

-d opens FILENAME, goes to OFFSET, decompressed everything and saves it to BINARY.
Соответсвенно, в батнике прописал:

Код:
graveduck.py -d DandyENG.nes hFD72 map
pause

Причем адрес пробовал вводить и через 0x, $ и h, и в десятичной системе. Пока бесполезно.
P.S. Обновил архив от начала до hFF, убрав ненужные байты в начале.

Отредактировано Mefistotel (2011-05-28 11:28:17)

7

Ну вот. Джинни был написан декомпрессор и компрессор.  Програмка то нужная. RLE алгоритм пожатия тайловых карт в каждой второй игре на НЕС. У меня карта разжатая без палитры была, то есть без 64 байт.
Во вложении программы. В архиве также находятся исходные коды для Дельфи, bat файлы для примера и прочее необходимое для понимания процесса.
P. S. Кстати, игрушка  Adventures of Bayou Billy, The (U) [!]. :P

Отредактировано Mefistotel (2011-05-28 13:36:48)

8

Гайв, иконки намутишь? Ещё бы гуи нормальный.

Отредактировано Mefistotel (2013-01-10 13:01:31)

9

Ну, пусть заодно и GUI версию сделает. Раз исходники есть.

10

Иконка

Отредактировано Guyver (2013-01-10 16:46:30)

11

Как я понимаю, иконку нужно одну, ведь гуи можно сделать общим для 2 программ? Если не извращаться - можно сделать посторонний exe, а всё остальное будет в папке. И этот exe сам будет переписывать инфу в батники, сам их запускать - т.е. будет видимость того, что это этот exe всё и делает. Я так всегда делаю, если есть консольное приложение (например не моё) и батник для его запуска. Пишу нужную мне "оболочку" - и делов! Минут на 20 всего делов ;о)))))))))

Отредактировано Guyver (2013-01-10 17:27:34)

12

Короче, я уже почти всё сделал...

13

Может сразу оконную программу сделать? Без консолей. У тебя же исходники есть.

14

Да просто мне так неохота в чужом коде копаться... Эх...

Вот сделал так, пока работает только если файлы лежат в той же директории, что и программа. Ещё и имена сохраняемым файлам надо давать на инглише (но это же и у Джинна так, ибо батники, и получается если файл даже исходный на кириллице - ничего работать не будет). Но это решаемо, дело 5 минут...

П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))

Отредактировано Guyver (2013-01-11 01:55:37)

15

Смотрел конечно. Уже сколько его программ у меня лежат.

16

Такс, проблему с кириллицей решил!

17

Да просто мне так неохота в чужом коде копаться... Эх...
...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))

А вот и неправда :P в Djinn Tile Mapper'е всё понятно написано было (до того, как я за него взялся ;) ), и даже кодеки не стали большой проблемой.

18

Такс, кое-как домой приплёлся, вот что успел доделать - сделал, вроде нормально, но не мешало бы потестить (особенно с разными папками в разных местах и с именами, в том числе с пробелами и кириллицей с латиницей)

По идее теперь косяков быть не должно... Можно брать файлы откуда угодно и с какими угодно именами (я надеюсь ;о)))). Если так покатит - то я уменьшу вес проги раз так в 10, если эта поделка того стоит и если уменьшение веса вообще нужно с исходным весом под 400 кБ. Перепишу на KOL.

KONAMI UP (unpacker/packer)

http://s018.radikal.ru/i514/1301/10/06bb22f2faf9.png

По-моему, даже хорошо, что остаются консольные версии и батники - как раз для любителей таких дел, коих порядочное количество. А для прочих - главный файл, а остальные файлы вынесены в отдельную папку и никому не мешают... Даже не видно что батники работают, я скрыл их запуск... И Джинни не будет нервничать и волноваться - это как с патчами получится. Его проги мы не трогали, код не изменяли и даже исходники не смотрели ;о))))))))))))))))))))

Только я вот про это не понял:

0xaddress - адрес начало сжатого блока в оригинальном файле. Если вы используете уже вынутый блок запакованных данных, то данный параметр можно опустить.

Какого вида число в батник надо вставлять? А то в примере адреса нет. В анпакере же такого адреса нет, да? Только в анпакере?

Т.е. вводить надо так: 0x5F к примеру? Шестнадцетиричный вид? Или как? Я сделал 16-ричный. Работает, кажется, но верный результат или нет - я точно не знаю... Надо протестировать на каком-нить роме, зная адрес начала пакета...

Отредактировано Guyver (2013-01-11 03:22:33)

19

Володя,  "0x" в 0xaddress говорит об том, что адреса нужно вводить в шестнадцатиричном исчислении. Особенность синтаксиса некоторых языков.
То есть 0x5F - это правильно.
Вечерком проверю работу программы.

Отредактировано Mefistotel (2013-01-11 04:29:54)

20

Давай, лови баги. Надеюсь, она у тебя хотя бы 1 раз сработает как надо ;о)))


Вы здесь » Chief-NET » Экстрим хакинг » RLE - KONAMI (NES)