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