Pull to refresh

Comments 7

Если Вам интересна тематика

Интересна. Текстуры шрифтов, их нарезка движком, трансляция текста из ресурсов игры в отображаемое на экране, плюс что приходится делать при несовпадении количества символов в разных алфавитах.

В старых играх текстура шрифта представляет собой DDS-текстуру с сеткой 16x16 (по сути вся таблица ASCII), где каждый байт соответствует своему индексу на текстуре.

В новых играх текстуры могут быть больше. Либо вообще свои текстуры под конкретный алфавит, как это в MGRR (там вообще всё очень страшно по структуре)

Часто вместе с текстурой идёт символьная таблица с указанием кода символа и его положением на текстуре:

struct {
	wchat_t code;
  int32_t left;
  int32_t top;
  int32_t width;
  int32_t height;
  // доп. данные типа кернинга и т.д.
} symbol;

Обычно применяются прямые координаты, реже полярные (опять же MGRR).

Всё зависит от конкретного движка и игры

Интересен вот какой вопрос - например, исходная строка текста на английском в игре занимает одну длину, а на русском другую. Вот если на русском строка длиннее, как ее вставить и заменить в игре? Просто в hex редакторе не получится.

Просто в hex-редакторе менять строки неправильно. Тем более, что русский текст обычно представляется в UTF-8 кодировке, а там уже другое количество байт на символ.

Зачастую текст игры представлен в виде некоторого бинарного текстового файла, состоящего их массива элементов. Типа такого

struct {
  int32_t len;  // может быть int8_t либо int16_t, в зависимости от макс. длины строк трок
  char    text[len + 1]; // в конце терминирующий \0
} text_node;

И перевод нужно делать десериализуя текст в обычный текстовый файл, и потом обратно сериализуя его. Новые игры обычно поддерживают возможность локализации по умолчанию. В старых играх приходится подменять одну из существующих локализаций.

Иногда текст хранится в json или xml. Тогда переводить проще, но всё равно необходимо писать парсер, чтобы вытащить только текст, без прочей шелухи, и затем обратно его вставить.

Редко, когда текст зашит в exe файл, тогда там приходится применять разные хаки для перевода, и это намного более трудоемкий процесс, и в играх с защитой он практически невозможен.

И в общем-то, чтобы это всё расписать не хватит 10 статей. Есть много различных движков, и в каждом своя система локализации.

И, к сожалению, в статье не приведены ни примеры реверс-инжиниринга алгоритмов, ни та структура архивов LFS, ни формат текста, и особенности представления данных на разных платформах.

Насчет GameCube/Wii предполагаю, что там какая-то вариация алгоритма LZMA. LZX, LZO, zlib не дадут нужной степени сжатия, а больше на тот момент и не было ассиметричных алгоритмов с высокой степенью сжатия. Но я могу и ошибаться

А как же тогда на русский были переведены 3 Zelda - Skyward Sword, The Wind Waker и Twilight Princess, раз на GameCube/Wii такие сложности с распаковкой?

Проблемы конкретно с Resident Evil 4

Sign up to leave a comment.

Articles