Описание: АРХИВНАЯ ТЕМА 2008-2009 года |
Поиск в теме | Версия для печати |
ReCom |
Отправлено: 02 Августа, 2016 - 07:35:39
|
Покинул форум
Сообщений всего: 246
Дата рег-ции: Июнь 2015
|
ReCom
Horror, помощь уже не нужна.
В игре, видимо, используется несколько алгоритмов сжатия графики.
Один из них - LZ77 такого типа:
1. Читается первый байт из блока, например h5C, т.е. b01011100.
2. Далее читаются 8 байт, каждый из которых в соответствии с битами первого байта выполняет свою функцию:
если 0 - расжатый байт;
если 1 - байт вида bxxxyyyyy (в двоичной системе), информирующий о том, откуда (А) и сколько байт повторить (В):
(А) = yyyyy+1 - отсылка назад на yyyyy байт (до 32).
(В) = xxx+1 - количество подряд идущих байт, которые нужно повторить (до 8 байт)
если xxx = 000, то (В) = следующий байт (если нужно повторить большее кол-во байт).
3. Возвращаемся к пункту 1. |
|
|
GD |
Отправлено: 02 Августа, 2016 - 07:36:00
|
Призрак
Покинул форум
Сообщений всего: 2052
Дата рег-ции: Окт. 2014
|
GDgt;
Так и знал.... <_<
Вот прога, которая занимается декомпрес. и компрес. графики LZ77.
(Виртуал Киллер, писал ее.)
Описание:
LZ77 Restructor - это программа для компрессии и декомпрессии LZ77 данных. В первую очередь она рассчитана на компрессию и декомпрессию графики, но может и работать с другими типами данных.
Описание функций:
- Пока что она поддерживает только 4 графических форматов: Linear 8BPP, Linear 4BPP, Linear 2BPP и Linear 1BPP, так что выбор других значений BPP (3, 5, 6 и 7) может вызвать ошибку.
- При установленном флажке на "Заголовок под LZ", программа закодирует под LZ заголовок следующего вида: 00 XX XX XX, где X - размер незапаковынных данных.
- При установленном флажке на "Без нулей", программа будет применять менее эффективный метод сжатия, исключающий появление нулей в LZ коде (используется в некоторых играх).
"СКАЧАТЬ"
ПС
Догадываюсь, что скажет Хоррор...
Но есё же) Если есть, зачем парится и создавать? |
|
|
ReCom |
Отправлено: 02 Августа, 2016 - 07:38:12
|
Покинул форум
Сообщений всего: 246
Дата рег-ции: Июнь 2015
|
ReCom
GD, во-первых, в GBC используется формат Planar 4BPP,
во-вторых, есть множество видов/модификаций алгоритма LZ77.
Так что LZ77 Restructor VK-ра для Зельды не подойдет...
Написал свой реструктор, который позволяет разжимать и просматривать содержимое рома.
GD, поможешь мне? Нужно найти с помощью неё все сжатые LZ77 надписи, подровнять их (с помощью + и -), чтобы выглядели корректно, сохранить в отдельные файлы, перевести на русский язык в любом тайловом редакторе и выслать обратно мне.
Просто лень искать...
Вот некоторые адреса запакованного содержимого:
h000C3E3E - "Press Start"
h000C3A19 - логотип "Nintendo" - не изменять!
h000C3281, C365C - "Produced..."
h000C2F19 - "Zelda..."
Сейчас пишу компрессор графики - нужно же как-то вернуть всё это в ром |
|
|
ReCom |
Отправлено: 02 Августа, 2016 - 07:47:41
|
Покинул форум
Сообщений всего: 246
Дата рег-ции: Июнь 2015
|
ReCom
Цитата:ReCom, послушай. А нельзя ли ты твою прогу приспособить и к другим играм??? В окне выбора сделать и другие игры, а не только Zelda.
Распаковщик работает только с 2-мя модификациями LZ77, одна его модификация описана выше в этой теме.
Распаковщик писал только для Зельды.
Цитата:Дельфи тут совершенно не при чём. Как пишешь - так и отрисовывает. Я писал вьюверы без прямого обращения к DirectX/OpenGL, причём конвертируя рисунок в битмап и дополнительно прорисовывая его со скаллингом - мгновенно всё происходит.
Можно поподробнее? Подскажешь - перепишу по-нормальному...
Я лично использовал TBitmap.Canvas.Pixels[x,y]...
Цитата:Мене интересно знать, возможно ли его использовать в других играх с шрифтом 4 bpp Linear и подобным сжатием...
Вот в чём вопрос.
Можно! (если алгоритм сжатия тот же)
Правда, в окошке тайлы будут вырисовываться planar-ом. Тут главное знать начальный адрес распаковываемого ресурса.
Цитата:Да, но не факт, что игр с подобным сжатием больше одной
Не знаю, не знаю... Oracle of Ages нужно проверить...
Там то же самое сжатие.
Цитата:Так, перерисованную графу (не всю), скину завтра вечером. (или после завтра утром)
Подожду... |
|
|
HoRRoR |
Отправлено: 02 Августа, 2016 - 07:48:09
|
Покинул форум
Сообщений всего: 654
Дата рег-ции: Окт. 2014
|
HoRRoR
Цитата:Можно поподробнее? Подскажешь - перепишу по-нормальному...
Я лично использовал TBitmap.Canvas.Pixels[x,y]...
Скачай DelphiX и юзай либо TDIB + TImage, либо DXDraw для отрисовки.
Отрисовка графики на 8bpp TDIB (4bpp planar/linear + 8bpp):
CODE:
Procedure TileToPic(P: Pointer; W,H,TW,TH,BitCount: Integer; Rev: Boolean = True; Mat: TMatrix = NIL);
var n,m,l,r,ByteCount: Integer; B,WB: ^Byte;
begin
B:=P;
Pic.Width:=W*TW;
Pic.Height:=H*TH;
ByteCount:=W*BitCount div 8;
For l:=0 To TH-1 do
begin
For r:=0 To TW-1 do
begin
For m:=0 To H-1 do
begin
Case BitCount of
4:
begin
WB:=Pointer(DWord(Pic.ScanLine[m+l*H])+r*W);
For n:=0 To ByteCount-1 do
begin
If Rev Then WB^:=B^ and $F else WB^:=B^ SHR 4; Inc(WB);
If Rev Then WB^:=B^ shr 4 else WB^:=B^ AND $F; Inc(WB); Inc(B);
end;
Dec(B,ByteCount);
end;
8: Move(B^,Pointer(DWord(Pic.ScanLine[m+l*H])+r*W)^,W);
end;
Inc(B,ByteCount);
end;
end;
end;
end;
Отрисовка этого TDIB на TImage, Sc - масштаб:
CODE:
Img.Canvas.CopyRect(Bounds(0,0,Pic.Width*Sc,Pic.Height*Sc),Pic.Canvas,Bounds(0,0,Pic.Width,Pic.Height));
А на DXDraw можно даже и таким же способом, как ты отрисовывать.
DXDraw.Surface.Canvas.Pixels[x,y]...
Но после полной отрисовки пикселей, необходимо выполнить две строки:
DXDraw.Surface.Canvas.Release;
DXDraw.Flip;
Они обновляют картинку. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (12): « 1 2 3 [4] 5 6 7 8 9 ... » В конец |
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0) |
« Переводы » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|