Локалізація текстур у Planescape: Torment

Нещодавно наша команда нарешті завершила переклад Planescape: Torment. Українська локалізація згодом має вийти офіційно, але для нетерплячих вже доступний українізатор.

Дякуємо за повідомлення про помилки, ми їх оперативно виправили. Проте одна річ не давала нам спокою.

Два з половиною роки роботи, мільйон перекладених слів… І все ж ледь не перше, що бачить гравець — це головне меню іноземною мовою 🙁

Річ у тім, що на відміну від решти місць у грі, текст на цих кнопках є частиною зображень. За нагоди ми українізуємо й текстури теж, однак тут нас спіткала невдача. Тож якщо вам цікаві технічні деталі, з якими доводиться мати справу локалізаторам, ця стаття для вас. (Спойлер: нам усе вдалося).

ЛОКАЛІЗАЦІЯ МЕНЮ

Отже, головне меню складається з дюжини текстур. І перша з них, наприклад, має такий вигляд:

Як бачите, з метою оптимізації розробники порізали все на сотні шматочків і запхали все в такий собі текстурний атлас. Перемальовувати кнопки в такому вигляді — нереальна задача.

Тож я почав шукати способи зібрати все це назад докупи. Форуми модерів не надто допомогли. Однак за якийсь час зʼясувалося, що інформація про те, як з цих шматків отримати нормальні зображення, зберігається у файлі з анімацією: кожен окремий стан кожної кнопки закодований як окремий кадр. І нарешті вдалося це побачити у Near Infinity — редакторі для ігрового рушія, що використовується в Planescape: Torment та інших іграх.

Діставши кожен кадр цієї анімації окремо, Юра пішов українізувати їх у графічному редакторі. А я зайнявся пошуками шляху, як ці окремі зображення додати назад до гри.

Першою спробою було використати інструмент для створення власних анімацій з того ж Near Infinity, однак, на жаль, він виявився дуже проблемним. Навіть нередаговані текстури розрізалися зовсім інакше, що призводило до результатів на кшталт оцього:

Вочевидь, цей спосіб нам не підійшов. А коли не виходить дати раду з наявними інструментами, то лишається тільки створити натомість власні!

Файл анімації виявився бінарним форматом з доволі простою структурою. Тож створити парсер для нього було доволі тривіально, особливо з таким чудовим допоміжним інструментом як Kaitai Struct:

Як видно на відео, файл містить в собі інформацію про всі кадри, а кожний кадр складається з низки блоків, які так само беруться з текстурних атласів, що ми бачили на початку.

Для початку я вирішив написати програму, яка б діставала всі ці блоки, а потім склеювала їх в окремі кадри — тобто саме те, що вже робить Near Infinity. На перший погляд, це зайва робота, та це критично важливо для того, щоб переконатися, що все працює правильно. Іншими словами — добре, коли є, з чим порівняти 🙂

Моєю обраницею для розвʼязання цієї задачі стала мова програмування Go. По-перше, вона доволі легка і зручна, а по-друге, з нею дуже легко отримати виконуваний файл під будь-яку систему, який не треба «встановлювати». Я переважно користуюся macOS, а більшість моїх колег Windows, тож це був вагомий фактор.

Отже… Код написаний, окремі кадри збережені — на вигляд все коректно. Тепер час зайнятися зворотним процесом: підмінити кадри українізованими версіями, порізати їх на шматки й записати назад в текстурні атласи.

Так я й зробив, натрапивши на другу проблему:

Як бачите, між блоками зʼявилися «кордони», яких не було в оригіналі. Щоб упевнитися, що я точно ніде не помилився, я тричі перевірив, що зображення розрізаються й склеюються коректно:

І все ж у самій грі ці ледве помітні контури були присутні, що дуже різало нам око:

Звісно, випускати оновлення для нашого українізатора в такому вигляді ми не могли. Тому я сів шукати помилку у своєму коді… і не знайшов! 🤯

Якщо ви хоч трохи знайомі з галуззю розробки програмного забезпечення, то знаєте, що помилки є завжди й усюди. У мене безумовно теж, але явно не ті, що могли б призводити до такого результату. Тому я збагнув, що ймовірно маю справу з якоюсь особливістю саме цього ігрового рушія.

Витративши кілька додаткових годин на попіксельне порівняння зображень у різних варіаціях, я нарешті дійшов висновку, що треба просто брати блоки на 1 піксель ширше з кожного боку 🙂 Тобто якщо ми маємо квадрат розміром 32×32 в координатах (0; 0), то насправді треба брати квадрат розміром 34×34 з координат (-1; -1). Звісно, відʼємних координат в зображеннях немає, тому всі такі шматки лишаються просто прозорими.

Я вніс відповідні зміни в код програми — і вуаля! Нове життя!

Зверніть увагу, як красиво «Нове життя» вигнуте по колу, тоді як «New life» в оригіналі написано просто рівно. Ми спочатку теж пробували написати рівно, але напис такої довжини виглядав зовсім незграбно. Тому Юра не міг це так лишити 😎 — йому дякуйте. І ще Єгору за низку слушних зауважень.

ЕКРАН СТВОРЕННЯ ПЕРСОНАЖА

Окрім головного меню ще лишалися нелокалізованими назви характеристик на цьому екрані:

Маю на увазі ті STR, INT, WIS, DEX, CON і CHA навколо персонажа. Вони теж «зашиті» в ресурсах гри в такому ж текстурному атласі (насправді навіть вони ділять один атлас з головним меню). І якщо вже в нас є новий інструмент для цього, то гріх було лишати це неукраїнізованим.

І знов ми натрапили на труднощі! Локалізований текст деяких характеристик чомусь малювався в грі обрізаним:


 
Бачите, як літера «С» трохи обрізана зліва, а у літери «Д» хтось наче зʼїв зарубку? Виявляється, що попри свій розмір, рушій гри використовує не всю доступну область зображення. Ми цього спочатку не врахували, але зараз усе вже виправлено.

На все це загалом у нас пішло близько двох днів. Ми зробили купу спроб і подальших виправлень. І тепер нарешті задоволені результатом!

Сподіваємося, що й вам теж до вподоби. Тож якщо досі у вас не було нагоди спробувати цю чудову гру, зараз саме час.

Ваша команда «Шлякбитраф» ♥

Автор: Сергій Олендаренко
Також участь брали: Юра Драгон, Єгор Власов

02.07.2025

5 10 голоси
Рейтинг статті
5 10 голоси
Рейтинг статті
Підписатися
Сповістити про
guest
0 Коментарів
Найстаріші
Найновіше Найбільше голосів
Зворотній зв'язок в режимі реального часу
Переглянути всі коментарі

Останні новини

Усі новини
Усі новини
0
Буду рада вашим думкам, прокоментуйте.x