Форум PSCD.ru

Игровые приставки и Эмуляция => Ромхакинг и программирование => Уроки / Документация => Тема начата: SPOT от 11 декабря 2016, 14:56

Название: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 11 декабря 2016, 14:56
В этой статье я хочу рассмотреть формат хранения текстур (графических изображений) в игре Lego Racers (http://pscd.ru/games/psx/l/45-lego-racers.html) для Sony PlayStation.
 
Хранение текстур (графики / изображения) (http://pscd.ru/forum/index.php?/topic/600-lego-racers-tekstury-szhataia-grafika-psx/?p=6734)
 
 
Lego Racers Viever Textures (http://pscd.ru/forum/index.php?/topic/600-lego-racers-tekstury-szhataia-grafika-psx/?p=6746)- Программа для просмотра графики в игре Lego Racers.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 11 декабря 2016, 14:56
Хранение текстур (графики / изображения)
 
Графика в игре хранится в пожатом виде. Скорее всего это какой-то аналог LZ77.
 
Текстуры (графика) хранятся в файле LEGO.JAM. Судя по всему, исходными файлами были *.BMP. В качестве примера мы рассмотрим «DSHOCK».
 
Адрес: $139982
Размер: $19F (415 байт)
 
Для удобства мы извлечём данный архив в отдельный файл. Он будет прикреплён к этой статье.
 
Для начала нужно сказать пару строк об особенности вывода графики.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-66232700-1481461332.png)
Как рисунок выглядит в игре.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-98009000-1481461332.png)
Как рисунок выглядит в распакованном виде (оригинал).
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-47385500-1481461332.png)
Конечно рисунки маленькие и разницу между ними сложно заметить, но в игре дублируется пиксель поверху и с левого края. На рисунке эта область обозначена красным цветом. За счёт этого изображение сдвигается и часть его попадает в невидимую область (на рисунке обозначена зелёным цветом).
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-13295800-1481461332.png)
Такой вид имеет «архив» в hex-редакторе.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-56364100-1481461583.png)
Первый байт (04) – указывает на тип изображения. 04 - то сколько будет занимать один пиксель бит. В нашем случае это 4 бита или пол байта.
 
Если встречаем значение 08, то один пиксель будет равен 1 байту.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-76676000-1481461583.png)
Второй байт (06) – указывает на количество цветов в рисунке. Проще говоря сколько цветов будет содержать палитра. В нашем случае это 7 цветов, так как ноль учитывается.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-97236600-1481461583.png)
Ширина (длинна) изображения в пикселях по X. У нас оно составляет 52 пикселей.
 

(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-16289800-1481461584.png)
Высота изображения в пикселях по Y. У нас оно составляет 32 пикселя.
 

(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-32341800-1481461584.png)
Палитра – занимает 15 байт.
 
7 * 3 = 15.
7 – количество цветов
3 – сколько байт занимает один цвет.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-49399300-1481461584.png)
Один цвет занимает 3 байта.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-85497900-1481461584.png)
Палитра хранится в формате RGB, права в перевёрнутом виде.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-21864300-1481461886.png)
(40 03) - сколько байт данные занимают в распакованном виде. В нашем случае это 832
байта. Это так же блок, в пределах которого будет идти отсчёт сжатия.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-41230500-1481461886.png)
Следующие два байта (80 01) - размер блока (сжатых данных). Он равен 384 (0x0180) байта.
 
Если размер запакованных данных равен размеру распакованных, то это значит, что данные не сжаты. 
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-74447400-1481461886.png)
Размер сжатой графики, как написано выше, 384 байта.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-06980400-1481461887.png)
00 – два пикселя цвета 0 и 0. При чём вывод пикселей идёт справа налево.

 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-38429100-1481461887.png)
8C – служебный байт. В битах данный байт имеет следующий вид 10001100.
1 – данные сжаты.
0 – считывает не сжатые данные.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-93367800-1481462066.png)
Для начала начнём с простых примеров.
 
00 – служебный байт. В битах имеет вид 00000000. Это значит, что сжатых данных не содержится. Считываем следующие 8 байт.
Напомню, что один пиксель равен 4 байтам. То есть данные будут иметь следующий вид.
5 5 4 6 6 6 6 2 4 1 6 2 3 2 1 4
 
98 – следующий служебный байт, но сейчас мы его рассматривать не будем.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-22324200-1481462067.png)
Теперь рассмотрим пример содержащий сжатые данные.
 
80 – служебный байт. В битах имеет вид 10000000.
1 – обозначает сжатые данные, считываем их. (Сжатые данные обозначены оранжевым цветом)
 
0F 4D - сжатые данные имеют вид.  Данные нужно преобразовать следующим образом
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-66940700-1481462066.png)
F 04D
 
F – Сколько байт считывать. В данном случае это 3 байта, что равно 6 пикселям.
Расчёт производится по следующей формуле.
 
0x0f-XX+3
 
Таким образом подставив вместо XX значение F мы получим 3.
 
0x0f-0x0f+3=3
 
04D – на сколько байт нам нужно вернуться в изображение. В нашем случае это 77 байт. Хочу обратить ваше внимание, что возврат происходит именно в изображение (но в пределах блока).
 
Далее идут не сжатые данные.
 
80 – следующий служебный байт
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-38234500-1481462067.png)
Теперь вернёмся в самое начало и рассмотрим данный пример.
 
8C – служебный байт. В битах данный байт имеет следующий вид 10001100.
00 01 44 – Мы ещё не рассматривали данный способ сжатия. Тут всё намного сложнее и запутаннее.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-55158100-1481462067.png)
Данные 4 бита (пол байта) (равны нулю) говорят нам о том, что это другой способ сжатия и он занимает 3 байта.
 
Тут в принципе всё тоже самое что и в предыдущем случае, но с небольшим дополнением.
 
Переворачиваем данные
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-45989400-1481462066.png)
 
0 44 001
 
0 – Сколько байт считывать. В данном случае это 18 байт, что равно 36 пикселям.
Расчёт производится по следующей формуле.
 
0x0f-XX+3
 
Таким образом подставив вместо XX значение 0 мы получим 36.
 
0x0f-0x00+3=18
 
Но это ещё не всё, к этому числу (18) нужно прибавить 0x44 (68)
18 + 68 = 86 байт.
 
Вот теперь мы получили окончательное значение сколько байт считывать.
 
001 – на сколько байт нам нужно вернуться в изображение. В нашем случае это 1 байт.
 
06 – следующий служебный байт
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-1-0-73379800-1481462067.png)
FF 00 00 – что-то вроде стоп байт.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 12 декабря 2016, 17:36
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-98382300-1481556948.png)
Немного развлёкся и вставил текстуру от призрака на голову. Получилось довольно забавно. Учитывая ещё тот факт, что подобной детальки нет в наборах LEGO.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 12 декабря 2016, 20:00
Lego Racers Viever Textures
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-40604200-1481565453.png)
Написал программу Lego Racers Viever Textures для просмотра текстур (графики) в игре Lego Racers (http://pscd.ru/games/psx/l/45-lego-racers.html).
В программе нужно открыть файл LEGO.JAM (в нём хранится графика и другие данные). После чего можно просмотреть графику из игры непосредственно в программе. Так же изображение можно сохранить в *.BMP. Для удобства можно сохранить сразу все изображения (текстуры) в *.BMP.
 
Скачать Lego Racers Viever Textures:

 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-94071200-1481565451.png)(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-27676500-1481565452.png)
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: Alon от 13 декабря 2016, 13:34
Круто, может быть теперь благодаря проделанной вами работы кто-то переведён Lego Racers на русский язык. А то с имеющейся руссификацией хуже, чем играть без неё.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: PSXDev от 14 декабря 2016, 14:12
Никогда особа не понимал зачем на CD носителях жать данные. Вот в Lego Racers вытащенная графа с помощью Lego Racers Viever Textures весит 35 МБ. Что для диска эти 35 МБ, капля в море. Так это в БМП, а в том же tim я думаю файлы бы занимали меньше места.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: Diablo от 14 декабря 2016, 15:52
Цитата: PSXDev от 14 декабря 2016, 14:12Никогда особа не понимал зачем на CD носителях жать данные. Вот в Lego Racers вытащенная графа с помощью Lego Racers Viever Textures весит 35 МБ. Что для диска эти 35 МБ, капля в море. Так это в БМП, а в том же tim я думаю файлы бы занимали меньше места.
Возможно для зашиты данных от хакеров, что бы было не так просто перерисовать графику или переделать какие-либо данные.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 15 декабря 2016, 09:31
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-95269000-1481786914.png)
Вставил стороннее изображение в игру. Графу не зажимал. Судя по всему изображения типа 08 (1 пиксель равен 1 байту) нельзя не пожатыми вставить в игру.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 15 декабря 2016, 19:13
Заметил кое-что интересное связанное с региональными отличиями.
 
SLUS_005.81 – Версия для США
SLES_012.07 – Европейская версия
 
Судя по всему, файлы для европейской версии были созданы чуть раньше, чем для версии для США. Хотя в европейской версии файл SYSTEM.CNF, создан позже, чем аналогичный файл в версии для США. Но не об этом я хотел сказать.
Заметил, что некоторые картинки в европейской версии большего разрешения.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-61683200-1481821923.png)
Так, например, в версии для США картинка разрешения 512х240
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-10811700-1481821924.png)
В то время как в Европейской версии - 512х256. Заметьте, в европейской версии на картинке нет надписи Loading.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: Diablo от 15 декабря 2016, 19:23
Цитата: SPOT от 15 декабря 2016, 19:13Заметил, что некоторые картинки в европейской версии большего разрешения.
 
Возможно это было нужно для чего-то связанного с разрешением экрана, ведь у NTSC (США) разрешение экрана 720х480, а у PAL (Европа) - 720х576.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: Alon от 16 декабря 2016, 09:34
Цитата: Diablo от 15 декабря 2016, 19:23 

Цитата: SPOT от 15 декабря 2016, 19:13Заметил, что некоторые картинки в европейской версии большего разрешения.
 
Возможно это было нужно для чего-то связанного с разрешением экрана, ведь у NTSC (США) разрешение экрана 720х480, а у PAL (Европа) - 720х576.
 
Всегда думал что в играх для США разрешение больше. Выходит, что лучше в случае Lego Racers играть в европейскую версию.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: SPOT от 20 декабря 2016, 13:24
В игре имеется следующий текст:

ЦитироватьTHE MULTI-TAP IS NOT FULLY INSERTED.
и

ЦитироватьPLEASE RE-INSERT THE MULTI-TAP.
 
(http://pscd.ru/forum/uploads/monthly_12_2016/post-95-0-76580500-1482232897.jpg)
А Multitap (SCPH-1070) называется "расчетверитель" для PSX. Устройство позволяющее подключить больше контроллеров.
Выходит, что изначально планировалось сделать возможность играть вчетвером.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: Марат от 21 декабря 2016, 17:54
Правильней будет  viewer.
Название: Re: Lego Racers Текстуры (Сжатая графика) [PSX]
Отправлено: admin от 10 января 2017, 10:45
Цитата: Alon от 13 декабря 2016, 13:34Круто, может быть теперь благодаря проделанной вами работы кто-то переведён Lego Racers на русский язык. А то с имеющейся руссификацией хуже, чем играть без неё.
Перевод Lego Racers (http://pscd.ru/forum/index.php?/topic/628-lego-racers-psx/#entry6930)на русский язык от PSCD.RU