Pull to refresh

Разбор ресурсов старого квеста Harvester 96 года

Reading time4 min
Views6.8K
Добрый всем, хочу рассказать про палитру цветов в старых играх времен 256 цветов, про шрифты и немного Делфи.
На квест про квест, описанный ниже, я потратил примерно 100 часов времени.
Рассказ про путь.

image

Палитра


Из вики:
В компьютерной графике палитра — ограниченный набор цветов, который позволяет отобразить графическая система компьютера.
Из широкого цветового пространства выбираются любые N цветов, и их координаты (обычно: R, G и B) хранятся в специальной таблице — палитре. Данные растровой графики, использующие палитру, представляют собой массив, где хранятся номера (индексы) цветов в палитре.

image

От себя. Палитра — это файл или блок данных размеров 768 байт (256 индексов из трех байт R, G, B) или 1024 байт (4*256, RGB плюс резерв).
Обычно кладут палитру отдельно для группы картинок, причем для разных частей игры могут быть разные палитры.
Картинка имеет максимальные координаты X, Y, размер равен X * Y, левый-верхний угол — это ноль, нужно для каждой игры определять такие вещи как начало координат, величины XY шрифта, хранятся ли эти переменные где-нибудь в потоке данных.
Сама картинка шрифта состоит из потока байт индексов, читаем 1 байт, берем из массива палитры:
R = buf_pal [индекс * 3 + 0]
G = buf_pal [индекс * 3 + 1]
B = buf_pal [индекс * 3 + 2]
где buf_pal массив данных, прочитанных из файла палитры.

Пока что мне встречались только палитры на 768 байт с чередованием (RGB).
Иногда цвета расположены не RGB-RGB, а, например, BGR-BGR.
Иногда изображение получается слишком темное и нужно для каждого R, G, B делать битовый сдвиг влево на 2 (умножение на 4).
Способ определения — на глаз, сбитую палитру вы узнаете сразу.

image

В делфи получить цвет можно функцией RGB (r,g,b).
В игре Harvester палитра лежит несжатым файлом harv_cd\GRAPHIC\PAL\INVHELP.PAL

Отлично, квест с палитрой выполнен. Нашли её и она не спрятана. Переходим к поиску и исследованию шрифта.

Шрифт


Шрифт — это таблица с указателями на начало картинок, изображений символов. В старых играх можно принять, что все игры использовали таблицу из 256 символов, всякие там юникоды на моей памяти не встречались.
В первую очередь нужна зацепка как смотреть всю таблицу, в случае сабж игры — это Gameplay Tips, фразы подсказок в начале игры, прописаны в файле \harv_cd\ADJHEAD.RCS, просто отлично! Загоним туда в hex-редакторе все коды по-порядку от 32 до 255 или только нужные и поглядим, что позволяет вывести стандартный шрифт игры.

image

image

Отлично! Количество умляутов на первый взгляд достаточно для одного набора русских букв, либо строчных либо заглавных. Уже хорошие новости.
Теперь нужно найти, где физически лежат данные шрифтов и что с ними можно сделать.
В данной игре это задача легкая, файлы шрифтов со звучными именами HARVFNT2.CFT, HARVFONT.CFT и т.д. лежат в каталоге \harv_cd\GRAPHIC\FONT\.

Начинаю смотреть файл в программе GBS (GraphBitStream с old-games.ru). Он состоит из заголовка и массива данных прямоугольной картинки из букв. Очень часто шрифт однобитный, в данной игре он 8-битный. Каждый байт — это индекс цвета, а картинка шрифта имеет размер примерно 800 х 12 пикселей.
Выглядит примерно вот так:
image

Последовательность символов шрифта TEXTFONT.CFT
Шрифт шириной 6-8 и высотой ~12, начало в файле с 0454h. Это будет левый-верхний угол за ноль, затем строка идет вправо по координате X, с 801 байта начинается вторая строка.
image

image

В потоке данных файла нужно за что-то зацепиться, начал портить файл и определил примерные размеры высоты и ширины изображения символов, писал однотипные байты, вроде EEh группами по 10-20-30 байт и смотрел что произойдет в игре. Выяснил, что шрифт можно рисовать в 256 цветах, что очень необычно. Выяснил, что для всех шрифтов данные начинаются с 0454h.
Выглядело это примерно вот так:
image

Отлично, с учетом этих знаний уже можно перерисовать существующие умляуты и получить русские буквы. Сразу вылезают минусы. Например, каждая буква имеет разную ширину и если её не менять, то буквы будут разбросаны не по-порядку и придется делать перекодировщик индексов для вставки текста.

Пришлось изучать заголовок файла шрифта, выглядело это примерно вот так:
image

Выяснилось следующее. Суть такова:
Существует таблица из 256 значений для каждого кода буквы, в которой перечислены ширины символов и указатели на начало потока данных конкретного символа. У некоторых символов, например, "@" стоял ноль, то есть в игре это пустое место. Пришла мысль, что если в таблицу прописать нужную ширину и нужный указатель на начало данных, то можно вставлять данные с учетом цвета пикселя.
Отлично, уже намного лучше чем было.
Накидал в делфи графический редактор, накидал парсер файлов шрифтов, в итоге получил прототип:
image

И вариант, в котором я перерисовал весь шрифт. Левая кнопка мыши — карандаш с выбранным цветом, правой кнопкой мыши — ластик. Можно делать увеличение, можно выбирать цвет из палитры.
image

Первые эксперименты:
image

image

И итог:
image

Аналогично перерисовал оставшиеся шрифты, всего 6 штук.
Коды взял у CP1251, шрифт Arial.
Квест со шрифтами закончен, результат и инструмент есть.
Переходим к поиску текста.

Текст


Текст диалогов с NPC хранится в файле \harv_cd\DIALOGUE.IDX
Файл закодирован очень забавно. Если встречаются коды 0Dh, 0Ah, то пропускаем байт, иначе делаем xor 170, то есть имеем несложное xor кодирование. Можно спрятать ресурс-текст от посторонних глаз и не сильно тратиться на декодирование.
Эта часть была подсмотрена на форуме old-games.ru
Сложностей со вставкой текста в игру никаких, файл в cp1251 кодируется xor'ом и подменяется в оригинале.

Затем существует файл DIALOG.RSP в котором открытым текстом идут вопросы в диалогах.

Затем в файле harvest.exe есть немного текста, вроде LOOK, TALK и т.д. Навскидку получается, что увеличивать длину фразы нельзя без ковыряния .exe файла отладчиком в поисках таблицы текста. Получилась проблема номер один.

Затем в файле HARVEST.SCR за xor'еный числом 170 находится скрипт игры.

Проблема номер джва. Никак не получается найти текст описаний предметов, а там он должен быть довольно обширный.
И пока остановился на этапе переведенных диалогов:

image

Тест Ёё.
image

image

image

И демо-видео:
Tags:
Hubs:
0
Comments0

Articles

Change theme settings