Замена шрифта в играх на Source

Проблемы недоработки

Очень часто в переведённых играх можно заметить неприятный феномен: на шрифт просто забивают. Обычно это случается из-за:

Пример отсутствия нормальной поддержки кириллицы можно увидеть в Left 4 Dead.

Из-за этого сразу возникает несколько проблем.

Одна из проблем в том, что когда разработчик делает игру, он создаёт определённую атмосферу. Здесь роль играет каждый элемент. В том числе и шрифт. Поэтому такие проблемы со шрифтом, можно сказать, частично "убивают" задумку разработчиков. Может, малую часть, правда, но всё же. Хотя очень часто это делает и локализация в принципе, но сейчас не об этом.

Другая проблема состоит в том, как шрифт вписывается в дизайн. Я ничего не имею против шрифта Tahoma. В старом ВК, например, он смотрелся хорошо. Но когда его используют там, где он не особо вписывается в стилистику, это начинает раздражать. Особенно, если оригинальный смотрится гораздо лучше. Или если он смешивается с оригинальным, что ещё хуже.

Третья проблема состоит в том, что текст вылезти за рамки при некоторых обстоятельствах. Пример из The Stanley Parable.

Оригинальный шрифт был сжатым, а вот Tahoma к таким шрифтам не отосится. Из-за чего текст занимает куда больше, чем должен. И, как следствие, вылезает за рамки, предназначенные для него.

Проблемы движка Source

Разбиравшись с Source, я понял, что заменить шрифт в играх на нём вполне реально. Но с этим связано довольно много трудностей.

Версии движка Source до выхода Portal 2 нормально поддерживают замену шрифта только для двух кодировок:

Если символы в шрифте не относятся к вышеперечисленным, или же символы отсутствуют, используется подстановочный шрифт (fallback font), которым на движке Source для кириллицы является Tahoma. Это прописано в vgui2.dll (если верить hex-редактору). Исходников этого файла в бесплатной версии нет. Возможно, они есть в коммерческой, но я нигде не видел, чтобы проблему со шрифтом решил кто-нибудь ещё, кроме Valve (ну, заменить смогли ещё и в The Stanley Parable, но не напрямую через исходники, поэтому это не считается). Поэтому, возможно, исходников vgui2.dll нет и в коммерческой версии.

К слову: так как Source 2 будет бесплатным и с открытыми исходниками, там такие проблемы решить будет в разы проще.

Замена шрифта в Left 4 Dead

С одной стороны, когда латинские символы берутся из одного шрифта, а кириллические – из другого, это выглядит отвратительно. А с другой стороны, в первом Left 4 Dead мне это дало возможность заменить шрифт.

В каждой игре свои проблемы с внедрением русского шрифта. В некоторых приходится заменять английские буквы, из-за чего либо везде КАПС, либо переводы уровня San Andreas. Здесь же всё решилось намного проще.

И в кодировке 1251 (Cyrillic), и в 1252 (Latin-1) есть стандартные английские буквы, цифры и знаки пунктуации. Отличаются они лишь тем, что в одной часть диапазона отводится за кириллицу, а в другой эта же часть отводится на латиницу. Таким образом мы приходим к следующему решению: заменить кириллическую составляющую на латиницу. Приведём таблицу замен (коды символов взяты из Unicode).

Кириллица Латиница Кириллица Латиница
А (0410) À (00C0) а (0430) à (00E0)
Б (0411) Á (00C1) б (0431) á (00E1)
В (0412) Â (00C2) в (0432) â (00E2)
Г (0413) Ã (00C3) г (0433) ã (00E3)
Д (0414) Ä (00C4) д (0434) ä (00E4)
Е (0415) Å (00C5) е (0435) å (00E5)
Ё (0401) ¨ (00A8) ё (0451) ¸ (00B8)
Ж (0416) Æ (00C6) ж (0436) æ (00E6)
З (0417) Ç (00C7) з (0437) ç (00E7)
И (0418) È (00C8) и (0438) è (00E8)
Й (0419) É (00C9) й (0439) é (00E9)
К (041A) Ê (00CA) к (043A) ê (00EA)
Л (041B) Ë (00CB) л (043B) ë (00EB)
М (041C) Ì (00CC) м (043C) ì (00EC)
Н (041D) Í (00CD) н (043D) í (00ED)
О (041E) Î (00CE) о (043E) î (00EE)
П (041F) Ï (00CF) п (043F) ï (00EF)
Р (0420) Ð (00D0) р (0440) ð (00F0)
С (0421) Ñ (00D1) с (0441) ñ (00F1)
Т (0422) Ò (00D2) т (0442) ò (00F2)
У (0423) Ó (00D3) у (0443) ó (00F3)
Ф (0424) Ô (00D4) ф (0444) ô (00F4)
Х (0425) Õ (00D5) х (0445) õ (00F5)
Ц (0426) Ö (00D6) ц (0446) ö (00F6)
Ч (0427) × (00D7) ч (0447) ÷ (00F7)
Ш (0428) Ø (00D8) ш (0448) ø (00F8)
Щ (0429) Ù (00D9) щ (0449) ù (00F9)
Ъ (042A) Ú (00DA) ъ (044A) ú (00FA)
Ы (042B) Û (00DB) ы (044B) û (00FB)
Ь (042C) Ü (00DC) ь (044C) ü (00FC)
Э (042D) Ý (00DD) э (044D) ý (00FD)
Ю (042E) Þ (00DE) ю (044E) þ (00FE)
Я (042F) ß (00DF) я (044F) ÿ (00FF)

Шрифт

Для начала мы берём какой-нибудь шрифт, поддерживающий кириллицу (например, Univers Condensed), находим там кириллические символы, и присваиваем им соответствующее значение латинского символа из таблицы. Обязательно нужно изменить название шрифта, чтобы случайно не заменить оригинальный. После этих процедур шрифт нужно установить в систему (подгружать его Left 4 Dead почему-то не хочет).

Текст локализации

Текст локализации состоит из нескольких файлов. Это:

В файлах локализации каждый кириллический символ нужно заменить латинским, и просто сохранить в той же кодировке (1200: UTF-16 LE). Единственное исключение здесь составляет closecaption_russian.txt. Субтитры читаются не из этого файла, а из closecaption_russian.dat. В closecaption_russian.dat нужно переконвертировать файл closecaption_russian.txt с помощью программы captioncompiler из Left 4 Dead Authoring Tools.

После подобного всё заработало, но возникла одна маленькая проблема. Я бы даже сказал "строчная проблема".

В оригинальном тексте эти фразы начинались с прописной, а все остальные буквы были строчными. В Left 4 Dead вместо того, чтобы в тексте изначально прописать эти фразы прописными, решили не заморачиваться, и сделали функцию изменения регистра. Разумеется, знак "×" (умножить) не является прописной версией знака "÷" (разделить), из-за чего эти символы функция успешно пропускает. И разумеется, разработчики не рассчитывали на то, что кто-то очень наглый будет лезть в файлы локализации ради замены шрифта.

Но всё же такой наглец находится, и перед ним теперь стоит подобная задача. Что же делать, как её решить? На ум сразу приходит самое очевидное: поменять регистр фраз в файле локализации. Но не всё так просто. А если эта строка используется и в оригинальном регистре, и в верхнем? А если добавятся новые? Не говоря уже о том, что искать их довольно трудно.

Оказалось, что есть куда более быстрый и удобный вариант решения проблемы. Некоторые символы в основной латинице и кириллице совпадают, причём как заглавные, так и прописные (А, Е, С, О, Р, Х). Благодаря этому при замене разницы никто не увидит. Вывод не заставил себя ждать: заменить кириллическую "А" на английскую "А", и заменить "Ч" на символ, который ранее был присвоен кириллической "А".

Не буду приводить всё таблицу замен, укажу только те, что поменял.

Кириллица Латиница Кириллица Латиница
А (0410) A (0041) а (0430) a (0061)
Ч (0427) À (00C0) ч (0447) à (00E0)

Разумеется, старые шрифты под это не походят. Иначе получается что-то подобное.

Единственное, что нельзя исправить никак: русские буквы в никах и чате. Они всё равно отображаются шрифтом Tahoma. Но это напрягает меньше, чем когда большая часть текста в Tahoma.

В других играх на Source

В модификации Black Mesa: Source я использовал абсолютно такой же способ, разве что файлы локализации там другие были.

The Stanley Parable сделан на Source версии Portal 2, что значит, что fallback font там не только Tahoma, а ещё и Univers. Точнее, UniversLTCYR-57Condensed и UniversLTCYR-67BoldCond. Поэтому шрифт без всяких переконвертирований можно заменить на шрифт из Portal 2. Правда, в .res-файлах заменять название всё же придётся.

Также с помощью этого можно было сделать подмену шрифта: переименовать шрифт в UniversLTCYR-57Condensed или UniversLTCYR-67BoldCond. Собственно, именно так разработчки The Stanley Parable и смогли решить эту проблему.

В Left 4 Dead 2 мне эту проблему решить не удалось, так как для русского языка они включили принудительный fallback font, и убрать это нельзя. Можно повозиться с hex-редактором и vgui2.dll, но там причину обнаружить куда труднее.

В заключение

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

С другой стороны, поддержку нормальной кириллицы (да и Юникода в целом) стоит делать, даже если ты не делаешь шрифт, а fallback font использовать в крайних случаях, чтобы было меньше проблем, если вдруг потом нужно будет издавать на других языках.

Всё-таки не стоит убивать хоть даже мельчайшую частичку атмосферы, если есть такая возможность.