Привіт.
Хочу з вами поділитись відносно проривним поступом, щодо нашого фанатського перекладу Final Fantasy XIV Online.
Сьогодні говоритимемо знову про внутрішню кухню ресурсів гри, та чому це досить складно зробити.
Мало хто знає, але для цієї гри вже було створено багато імплементацій розпакування ресурсів. Їх можна знайти на Github і не тільки. Це дуже добре, та розкриває багато таємниць при вичитуванні файлів гри, от тільки як це потім запакувати назад? Ну логічно ж, зробити все навпаки до розпакування😜. Все було б чудово, але нажаль такої імплементації я ніде не знайшов, ще на підступах до початку цього проєкту. Як то кажуть, якщо її нема, але дуже треба, то прийдеться писати самому. Тому перед початком проєкту цим я і займався, розбирався з внутрішнім типом EXD файлів гри, зробив конвертори в XML та назад в EXD. Це були доволі насичені дні та ночі над HEX редактором, частковими описами з давно закинутих проєктів, міні документацій та читання реально працюючого коду для розпакування. Не скажу що це було не весело, в такі моменти, коли все виходить звичайно, вкінці кінців, то слово "еврика" в голові пролітало не раз, як і посмішка після тестування працюючої частини пакувальника. Але і тут все було непросто, ці файли EXD бувають різних типів, тому деякі ми ще не підтримуємо (не сильно і треба), але тема допису не про це, а про скрипти! всередині! тексту!. Це ускладнювало переклад дуже сильно, бо іноді замість тексту, який людина може прочитати і потенційно перекласти, ми отримуємо набір незрозумілих байтів інформації. Що цікаво, бібліотека, яку ми використовуємо для розпакування, вміє ці скрипти правильно відображати, але ж знову, їх треба запакувати назад, а це зовсім інша історія, що не стосується самого файлу EXD. Тому на початку проєкту я прийняв рішення відображати в записі тільки текст, а саме частину зі скриптами залишити як є, закодовану в тексті. Перекладачі були проінструктовані, що ці частини чіпати ніяк не можна. Виглядало це приблизно так:
Accept linkshell invite to “_|[0x02][0x29][0x03][0xEA][0x02][0x03]|_”?
Як ви можете бачити, перекладач міг спокійно перекладати текст "Accept linkshell invite to", але що заховано під "|[0x02][0x29][0x03][0xEA][0x02][0x03]|" ніхто не знав 🙈. До сьогоднішнього дня😜. Може хтось здогадався, але у прикладі вище було закодовано просто системна інформація з посиланням на ім'я персонажа (що в принципі не перекладається і має залишитись як є), але є і інші приклади, такі як ось:
_|[0x02][0x48][0x04][0xF2][0x01][0xFC][0x03]|__|[0x02][0x49][0x04][0xF2][0x01][0xFD][0x03]|_Discard _|[0x02][0x31][0x0C][0xFF][0x05][0x49][0x74][0x65][0x6D][0x03][0xE8][0x02][0x02][0x02][0x03]|__|[0x02][0x08][0x29][0xE1][0xE8][0x03][0x01][0xFF][0x21][0x20][0x28][0x43][0x6F][0x6C][0x6C][0x65][0x63][0x74][0x61][0x62][0x69][0x6C][0x69][0x74][0x79][0x20][0x52][0x61][0x74][0x69][0x6E][0x67][0x3A][0x20][0x02][0x20][0x03][0xE8][0x03][0x03][0x29][0xFF][0x01][0x03]|_?_|[0x02][0x49][0x02][0x01][0x03]|__|[0x02][0x48][0x02][0x01][0x03]|_
Все що тут можна перекласти, це "Discard". Але з підтримкою скриптів цей запис виглядає як:
<UIForeground>F201FC</UIForeground><UIGlow>F201FD</UIGlow>Discard <SheetEn(Item,2,IntegerParameter(1),1,1)/><If(GreaterThan(IntegerParameter(2),0))> (Collectability Rating: <Value>IntegerParameter(2)</Value>)<Else/></If>?<UIGlow>01</UIGlow><UIForeground>01</UIForeground>
Як бачите, тепер є як "Discard", так і "Collectability Rating". Ось і вся проблема, в попередній версії часто було перекладено не весь текст🥲. But no more (с).
Дякую всім за підтримку.
Buy Me a Coffee
Топ коментарі (0)