Замена шрифта в играх на 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).


       Заглавные       |       Строчные
 Кириллица | Латиница  | Кириллица | Латиница 

А (0x0410) |À (0x00C0) |а (0x0430) |à (0x00E0) 
Б (0x0411) |Á (0x00C1) |б (0x0431) |á (0x00E1) 
В (0x0412) |Â (0x00C2) |в (0x0432) |â (0x00E2) 
Г (0x0413) |Ã (0x00C3) |г (0x0433) |ã (0x00E3) 
Д (0x0414) |Ä (0x00C4) |д (0x0434) |ä (0x00E4) 
Е (0x0415) |Å (0x00C5) |е (0x0435) |å (0x00E5) 
Ё (0x0401) |¨ (0x00A8) |ё (0x0451) |¸ (0x00B8) 
Ж (0x0416) |Æ (0x00C6) |ж (0x0436) |æ (0x00E6) 
З (0x0417) |Ç (0x00C7) |з (0x0437) |ç (0x00E7) 
И (0x0418) |È (0x00C8) |и (0x0438) |è (0x00E8) 
Й (0x0419) |É (0x00C9) |й (0x0439) |é (0x00E9) 
К (0x041A) |Ê (0x00CA) |к (0x043A) |ê (0x00EA) 
Л (0x041B) |Ë (0x00CB) |л (0x043B) |ë (0x00EB) 
М (0x041C) |Ì (0x00CC) |м (0x043C) |ì (0x00EC) 
Н (0x041D) |Í (0x00CD) |н (0x043D) |í (0x00ED) 
О (0x041E) |Î (0x00CE) |о (0x043E) |î (0x00EE) 
П (0x041F) |Ï (0x00CF) |п (0x043F) |ï (0x00EF) 
Р (0x0420) |Ð (0x00D0) |р (0x0440) |ð (0x00F0) 
С (0x0421) |Ñ (0x00D1) |с (0x0441) |ñ (0x00F1) 
Т (0x0422) |Ò (0x00D2) |т (0x0442) |ò (0x00F2) 
У (0x0423) |Ó (0x00D3) |у (0x0443) |ó (0x00F3) 
Ф (0x0424) |Ô (0x00D4) |ф (0x0444) |ô (0x00F4) 
Х (0x0425) |Õ (0x00D5) |х (0x0445) |õ (0x00F5) 
Ц (0x0426) |Ö (0x00D6) |ц (0x0446) |ö (0x00F6) 
Ч (0x0427) |× (0x00D7) |ч (0x0447) |÷ (0x00F7) 
Ш (0x0428) |Ø (0x00D8) |ш (0x0448) |ø (0x00F8) 
Щ (0x0429) |Ù (0x00D9) |щ (0x0449) |ù (0x00F9) 
Ъ (0x042A) |Ú (0x00DA) |ъ (0x044A) |ú (0x00FA) 
Ы (0x042B) |Û (0x00DB) |ы (0x044B) |û (0x00FB) 
Ь (0x042C) |Ü (0x00DC) |ь (0x044C) |ü (0x00FC) 
Э (0x042D) |Ý (0x00DD) |э (0x044D) |ý (0x00FD) 
Ю (0x042E) |Þ (0x00DE) |ю (0x044E) |þ (0x00FE) 
Я (0x042F) |ß (0x00DF) |я (0x044F) |ÿ (0x00FF) 

Шрифт

Для начала мы берём какой-нибудь шрифт, поддерживающий кириллицу (например, 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 вместо того, чтобы в тексте изначально прописать эти фразы прописными, решили не заморачиваться, и сделали функцию изменения регистра. Разумеется, знак × (умножить) не является прописной версией знака ÷ (разделить), из-за чего эти символы функция успешно пропускает. И разумеется, разработчики не рассчитывали на то, что кто-то очень наглый будет лезть в файлы локализации ради замены шрифта.

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

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

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


       Заглавные       |       Строчные
 Кириллица | Латиница  | Кириллица | Латиница 

А (0x0410) |A (0x0041) |а (0x0430) |a (0x0061)
...
Ч (0x0427) |À (0x00C0) |ч (0x0447) |à (0x00E0)
...

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

Единственное, что нельзя исправить никак: русские буквы в никах и чате. Они всё равно отображаются шрифтом 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, но там причину обнаружить куда труднее.

В Team Fortress 2 всё куда проще, так как там кириллический шрифт работает без проблем. Отображение символов зависит там от параметра range, в котором указывается начальный и конечный символ диапазона.

Честно говоря, я не тестировал наличие range в других играх. Возможно, всё было гораздо проще, и я зря парился.

В заключение

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

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

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