
World of Warcraft: кухня Азероту
Наїдки, смаколики й напої світу World of Warcraft від видавництва Mal’Opus у перекладі «Шлякбитраф» на вашій кухні.
Нещодавно наша команда нарешті завершила переклад 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
Він буде опублікован після модерації.