[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Представьте: код написан, архивы собраны, игра запускается. Вы ожидаете увидеть результат недельной работы — четкие 4К субтитры. Но вместо этого Dragon Engine выплевывает вам в лицо графический артефакт.

Текст стал желтым. Прозрачность исчезла, сменившись траурными черными прямоугольниками. Но самое страшное — сломалось то, что я даже не трогал: оригинальное английское меню поплыло, буквы начали наезжать друг на друга, превращая интерфейс в кашу. Казалось, что одна текстура убила всю игру.

В этой побочной истории я расскажу, как формат сжатия, предназначенный для 3D-рельефа, попал в 2D-интерфейс, почему «родной» английский текст сошел с ума, и как я написал свой софт, чтобы навести порядок в этом хаосе.

Акт 1. Желтая угроза

Я долго не мог понять: почему белый текст в игре становится желтым, а прозрачный фон — черным? Первая мысль была: «Наверное, я неправильно отрисовал буквы. Или скрипт сохраняет PNG с ошибкой?». Честно говоря, в глубинах форматов сжатия я не особо разбирался, поэтому проблема казалась мистикой.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Всё оказалось прозаичнее. Мой скрипт конвертации по умолчанию использовал сжатие BC5 (ATI2).

Как выяснилось позже, BC5 — это формат для Карт Нормалей (тех самых фиолетовых текстур для рельефа в 3D). Он хранит данные очень специфично: выкидывает Синий канал и, самое главное, Альфа-канал (прозрачность), чтобы экономить память.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Получилось, что я скармливал игре текстуру-инвалида без половины цветов. Движок пытался натянуть эту «карту высот» на меню интерфейса. Из-за отсутствия данных о прозрачности он залил фон черным, а белый текст (R+G+B) превратился в желтый (R+G, так как синий канал исчез). Кроме того, из-за другой структуры файла съехала разметка, и английский текст «уплыл».

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Решение: Одна строчка в коде. Замена формата на BC3_UNORM (он же DXT5).Этот формат создан специально для текстур с интерполированной прозрачностью. Как только я пересобрал файл в BC3, игра «прозрела»: шрифт стал кристально белым, фон исчез, а кнопки меню вернулись на место. Первый босс был повержен.

Акт 2. Укрощение «пляшущих» букв

После победы над цветом (привет, BC3!) вылезла геометрия. В 4К разрешении любая неточность режет глаз. Если английские буквы сидели в своих ячейках идеально, то русские — устроили бунт.

Особенно отличились буквы с «хвостами» (Д, Ц, Щ, р, у, ф) и «шляпами» (Й, Ё). Обычная математическая центровка просто ставила центр картинки в центр ячейки. Из-за этого буква «Д» с ногами висела выше остальных, поджав колени, а «Й» клевала носом вниз из-за галочки сверху.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Сначала я попробовал решить это «в лоб» через код: прописал таблицу смещений в пикселях. Мол, «если видишь Д, сдвинь её на 5px вниз». Не сработало. На глаз угадать идеальные значения оказалось нереально, шрифт всё равно выглядел "пьяным".

Пришлось действовать системно.Во-первых, я внедрил в редактор Калибровку по Базовой Линии. Теперь буквы не центрируются тупо по высоте, а стоят на жесткой невидимой линии (как в тетради в линейку). Хвосты свисают вниз, как положено, но строка остается ровной.

Во-вторых, я создал Ручные Пресеты. Для каждой заглавной буквы я руками выставил идеальную позицию и размер рамки очистки (bbox). Важно было не просто нарисовать букву, а чисто стереть старый европейский символ под ней, чтобы из-под нашей «Ш» не торчал кусок какого-нибудь немецкого умляута.

И только когда заглавные встали идеально, я включил скрипт. Вычислил, что строчные буквы в текстуре живут ровно на 260 пикселей ниже. Скрипт взял мои пресеты, добавил смещение и сгенерировал весь ряд «а-я» за секунду.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Акт 3. Чекпоинты, Моноширина и Эхо 0xFF

Чтобы инструмент был не одноразовой поделкой, а полноценным софтом, пришлось добавить "комфорта". Работа со шрифтами — это десятки часов, и потерять прогресс из-за случайного вылета обидно. Так появились Чекпоинты — мгновенные сохранения состояния текстуры.

Для цифр и таблиц добавил галку «Моноширина». В обычном тексте буквы имеют разную ширину, но в интерфейсе характеристик цифры должны стоять стройно, как солдаты. Галка принудительно выравнивает их по сетке. Есть и функция Массовой перерисовки — она позволяет в пару кликов обновить весь шрифт, если я вдруг решу сменить файл шрифта ttf на более красивый.

Позаботился и о будущем: если кто-то захочет доработать мой перевод, в папке с плагином лежит HTML-инструкция. Не нужно гадать, как работает софт — всё задокументировано.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация
[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

И, наконец, этот инструмент стал моим «штабом» в затянувшейся войне с Байтом-убийцей 0xFF. Помните тот вылет игры на фразе Кирю про «пустые руки»?

Я надеялся, что новый шрифт станет финальной точкой, но проблема оказалась куда коварнее. Расследование зашло в тупик: в конце некоторых файлов я обнаружил текст на чистом русском языке, что наталкивает на мысли о двойной кодировке в движке. Моя логика «подмены» символов столкнулась с чем-то, чего я пока не могу объяснить, и байт 0xFF всё еще заставляет игру совершать сеппуку.

Переносить буквы в другие слоты я пока не планирую, но теперь у меня хотя бы есть инструмент, позволяющий мгновенно тестировать новые гипотезы и видеть, как движок интерпретирует каждый пиксель. Битва продолжается.

Подробнее о том, как одна буква ломает легендарный движок, читайте в прошлом посте: Русификатор Yakuza 5 Remastered: 33 000 строк и решение проблемы 0xFF.

Итог: Чистота в 4К

Теперь в моем арсенале есть «Камуро-Дизайн». Шрифт перестал быть «мыльным» и желтым, исчезла черная пелена, буква «Д» не прыгает, а самые проблемные широкие символы (Ш, Ж, Ы) наконец-то влезли в свои рамки.

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Конечно, это не заводская штамповка. Где-то буквы стоят слишком близко, буква «ё» пока немного шире соседей, а высота некоторых знаков требует микро-калибровки. Но визуально это уже огромный шаг вперед. Интерфейс выглядит опрятно, текст читается, а глаза не вытекают от «мыла».

[Побочная история №3] Yakuza 5: Делаем шрифт Great Again. 4K, фикс цвета и полная автоматизация

Правда, в погоне за идеальным шрифтом плагин «Камуро-Дизайн» оброс таким количеством специфических настроек (калибровка, пресеты букв, моноширина), что работать в нем с обычными картинками стало неудобно. Он был захвачен шрифтами. Поэтому для редактирования текстур интерфейса, логотипов и мини-игр мне предстоит написать отдельный, новый инструмент.

Ну а прямо сейчас я ухожу перековывать главный меч: полностью переписывать основной текстовый инструмент — Редактор Дракона. Нужно научить его работать не с сырыми байтами, а с символами на уровне абстракции, чтобы проблема вылета 0xFF была решена не только в текстурах, но и в логике самой программы навсегда.

Инженерия Бешеного Пса продолжается.

15
18 комментариев