Ссылки Команда Главная Форум Гостевая
МЕНЮ
Новости
01.01.2017
Переводы
01.01.2017
Проекты
10.05.2010
Программы
26.05.2012
Документация
26.11.2016
Прохождения
08.05.2011
Разное
07.06.2009
    rss
БАННЕРЫ
Наш баннер
Сайт JurasskPark
Griever Stuff
Новая реальность
Emu-Land
ConsolGames
CHIEF-NET
PSCD.RU
Langrisser
Battletoads
Valid HTML 4.01 Transitional
Правильный CSS!
HotLog
 

 

 

 

 

Работа с графикой сжатой алгоритмом LZ77

Сегодня я расскажу про то, как я вставляю сжатую графику с картами в ROM.
Начнём по порядку.
LZ77 - это сжатие данных. Кто бы мог такое подумать? :) LZ77 на GBA и NDS всегда начинается c байта 10 и состоит из четвёрки байтов, т.е. 10 ХХ ХХ ХХ. Адреса всех изображений и карт всегда кратны 4, то есть адрес должен заканчиваться на 0, 4, 8 или C. Карта в основном всегда находится рядом с тайлами. Это к сведению, потому что нам это поможет при вставке данных. :) Сначала TrickZter показал программу unLZ-GBA с помощью которой можно искать графику сжатую в lz77 c Хаффманом.

скриншот

С помощью кнопки RawDump программа извлекает данные, на которых вы сейчас находитесь. Данные уже извлекаются распакованные из формата lz77 и у них расширение буде .raw. И хоть вы убейтесь об стенку при сохранении расширение вам не поменять, что в дальнейшем очень будет злить. :( Как вы видели, то на первой картинке адрес 0068B3D4 и он заканчивается на 4, а у карты адрес 0068B900 и заканчивает на 0. Значит, я не обманул. :-P

скриншот

Если подвести итоги, то 0068B3D4 - это тайлы изображения, а 0068B900 - это карта этого изображения.

Можно извлечь данные. У тайлов изображений расширение поставим .chr, а карты сделаем .map. Это поможет нам в дальнейшем.
Кстати, можно так фигачить все картинки и дальше, но от этого можно заработать геморрой, так как кроме извлечения данных и замены разрешения нужно будет вести учёт их адресов, чтобы потом не вспоминать, откуда мы их извлекли и та ли карта для этого изображения или другая.
Примерно вот так.
You can only use...
0068B3D4 - тайлы
0068B900 - карта
6144 - размер тайлов
1152 - размер карты

Вопрос: а нафига нам размер тайлов и карты???
Ответ: а для того, деточка, чтобы лучше жилось! :) На самом деле новый размер тайлов и карты не может быть больше предыдущего, если вы вставляет данные на это же место. Иначе они затрут данные, которые идут после них, а это влечёт за собой БОЛЬШИЕ ПРОБЛЕМЫ.
И тут нам на помощь приходит на помощь LZ77Restructor 2 от всемирно известного TrickZter’a.

скриншот

Красявая, правда? :)
Из плюсов мне понравилось:
+ Отсутствие багов как в unLZ-GBA, если возвращаемся назад по данным, то адресам не меняются и не показывается мусор с левыми адресами, то есть могут быть показанные данные, у которых адрес не делятся на 4, а это не 0, 4, 8 и С.
+ Очень понравилась быстрая работа программы. Прям вжик и всё открыто, распаковано, по холодильнику разложено... X-D
+ Удобный и быстрый режим переключения между форматами 4BPP и 8BPP.
+ У извлеченных данных указывается адрес, откуда их извлекли и их оригинальный размер.
+ Возможность вставки графики в ROM сразу из картинки.

Так. Вернёмся к нашим бара...байтам. :)
Ещё нам нужна палитра. В данной доке я писать, как её делают, не буду, но по многочисленным просьбам напишу. :)
Теперь нужна супер-пупер программа Map Image 2 от Джинни. Она продаётся за 4.99 $ и если вы сделаете заказ прямо сейчас, то мы сделаем для вас скидку и продадим её за 3.99 $!!! Это очень выгодное предложение. Спешите делать заказ!!!
Так. Запускаем программу.

скриншот

Переходим в Image - Load Map without Header, Tiles and Palette...
Появляется окно выбора карты изображения.

скриншот

Программе нужен файл только с расширением .map. Других видеть она не хочет. Очень привередливая. :)

скриншот

Потом появляется окно выбора файла с тайлами. Для этого файла мы тоже ранее меняли расширение на .chr.

скриншот

Теперь выбираем файл с палитрой.
Снова от нас программа что-то хочет!

скриншот

скриншот

А! Она хочет, чтобы мы указали ширину и высоту в тайлах для построения изображения. Так как в нашем случае игра на платформе GBA, то для построения ширины изображения будут 32 тайла, а вот высоту нужно будет уже смотреть в зависимости от изображения Главное, чтобы изображение в высоту не обрезалось. Ничего страшного если высоту с первого раза не угадаем. :) Можно попробовать ещё раз. Я с запасом поставил высоту 24 тайла.
Смотрим, что у нас получилось.

скриншот

Красяво! :)

Сохраняем изображение в BMP.
Image - Save to BMP... (Ctrl+S)
Вот она.

скриншот

Ахалай-махалай текст-драйвер-джипи давай!
И у нас уже есть готовое изображение. :)

скриншот

А вы заметили, что картинка больше по сравнению с оригиналом стала?
Что это значит? Ну как ясень-пень, что карта изображения будет больше.

Когда картинка, которую вы хотите вставить уже готова и Map Image 2.0 вы уже давно закрыли, а вы ведь его закрыли? ;o)
Проделываем ту же процедуру, что и при сохранении изображения, единственное, что мы его будем уже загружать через Image - Load from BMP... (Ctrl+L).

Теперь сохраняем карту.
Image - Save Map without Header...
Я оставляю имя этим же, только в конце добавляю _rus и получается 0068B900 (331)_rus.map.
Сохраняем тайлы.
Image - Save Tiles... (Сtrl+T)
И новое имя будет 0068B3D4 (1322)_rus.chr.

Теперь пойду и выпью чаю.

*Через 5 минут*

Так про что я говорил? Ах да! Мы хотели взломать сайт Чи... Ой, нет...

Внимание! Далее информация не актуальная, т.к. сжатие с помощью GBA Crusher'a делалось, когда программа ещё была не до конца доделана! Или... можете прочитать и понять, что LZ77Restructor 2 делает жизнь проще. :)
Нам надо снова сжать картинки в lz77. Для этого нам снова понадобиться GBA Crusher.
Запускаем GBA Crusher. Открываем файл с тайлами 0068B3D4 (1322)_rus.chr через кнопку Add File(s). Выбираем режим LZ77, Vram safe. Нажимаем кнопку CRUNCH IT! и сохраняем файл под новым именем, например, 0068B3D4 (1322)_rus.chr.lz77. Ту же самую процедуру проделываем с картой.

Ну? Кто прав был? :) Карта изображения у нас по размеру больше оригинала, а вот карта тайлов нет.

скриншот

скриншот

Тут можно поступить двумя путями:
1) В самом ROM’е искать пустое место, главное не попасть на место, которое может быть специальным черным фоном и состоят из FF. XD
2) Увеличить РОМ. Для увеличения РОМ’а. Я использовал Magic File Resizer.
Снова вспоминаем, что чтобы вставить данные, то адреса должны заканчиваться на 0,4,8 и C.
Так как места при увеличении РОМ’а до фига, то можно шиковать и не запариваться с адресами.
Я их делал гламурными. :) Но до написания этого текста я уже успел немного поставлять картинок.
Сейчас найду место.

Вот оно! Адрес 802600. Легко запомнить, но в отдельный файлик лучше сразу записать. Будь он не ладен этот склероз! :)

скриншот

Теперь понадобиться программа Copy File от Джинни.
Input File - файл, откуда забираем данные - это например, 0068B3D4 (1322)_rus.chr.lz77
Output File - файл, куда записываем данные - это naruto2rus.gba
Input File Offset - адрес в исходном файле.
Output File Offset - адрес в изменяемом файле - это h802600 (h значит, что используется 16-ный адрес)
Data Length - длина данных.
Input File Offset и Data Length не трогаем.

скриншот

0068B900 (331)_rus.map.lz77 будем также вставлять, но уже по адресу 802B00.

Внимание! Отсюда читаем, если вы предыдущий текст пропустили. :)
Вставлять графику мы будем через LZ77Restructor 2 по адресу 00802600, а карту уже по адресу 802B00. Отличие здесь в том, что после сохранения графики и карты тайлов через Map Image 2.0, мы не будем их сжимать с помощью GBA Crusher'а и вставлять с помощью Copy File - это всё будет делать LZ77Restructor 2.
Нажимаем кнопку "Insert from file". Тут уже идёт скрины с Windows 7 (стиль классический), потому что сделаны позднее.

скриншот

Появляется окно, где мы выбираем файл для вставки. Выбираем файл с тайлами naruto1_rus.chr - это переименованный 0068B3D4 (1322)_rus.chr

скриншот

В следующем окне выбираем адрес 00802600, куда вставляем данные и режим сжатия. Нам нужен LZ77, VRAM safe.
скриншот

Теперь появляется окно, в котором сообщается, что мы пытаемся вставить данные по адресу 00802600 и размер данных сжатых LZ77 не обнаружен, продолжить вставлять данные размером 656 байт.
Объясняю для чего оно нужно. Допустим мы вставляем графику по прежнему адресу, поэтому нам нужно быть уверенным, что новые данные по размеру не будут больше старых. Нажимаем кнопку Yes.
скриншот

Проводим те же самые действия только с картой тайлов.

А теперь чтобы проверить все нормально или нет, мы должны в игре найти место, где появляется это изображение.
И сделать быстрое сохранение до появления этого изображения.

скриншот

Теперь включаем голову, потому что я буду менять ВЕЛИКИЕ и УЖАСНЫЕ пойнтеры на изображение.
Изображение у нас было по адресу 0068B3D4.
Ищем порядок байтов в порядке D4 B3 68 08.
Откуда взялась цифра 08? Я не знаю, но мне сказали, что "ROM у тебя меньше h1000000, так что последняя цифра всегда будет 08". Поэтому будем верить. :)
Ещё раз покажу чтобы было понятно как цифры поменялись.
00 68 B3 D4
D4 B3 68 08

Ищу порядок байтов с помощью ЗоПа т.е. Золотого Пальца. X-D

скриншот

Он показал адрес 4f4888. Как мы видим, последнее число опять делится на 4, значит всё нормально.

скриншот

D4 B3 68 08 мы должны заменить на новый адрес.
Адрес новых тайлов 802600 по тому же принципу это будет 00 26 80 08.
Меняем D4 B3 68 08 на 00 26 80 08.

скриншот

Коротко эта запись будет выглядеть так.
68B3D4 (802600) пойнтер 00 26 80 08 ищем D4 B3 68 08 адрес 4f4888
Тоже самое делаем с картой тайлов.
68B900 (802B00) пойнтер 00 2B 80 08 ищем 00 B9 68 08 адрес 4f488C.

скриншот

Как мы видим, адреса пойнтеров находятся рядом.

А теперь запускаем игру и видим.

скриншот

Эм-м-м-м… Да пофиг!!! И так сойдёт! :-P
Да ладно. Шучу, шучу. По кусочкам графики могли заметить, что это не та картинка, что мы рисовали. :)
Вот правильная картинка. :)

скриншот

Конец.