Спроба українізувати Ravenswatch
- 2 дня назад
- 8 мин. чтения
Обновлено: 2 часа назад
Частина 1
Нещодавно почали з кумом грати в гру:
І дуже вона мені сподобалась. Хотілось спробувати її перекласти... Але, але, але.
Я мав досвід лише з іграми на рушії Unity. Навіть Unreal Engine ще не торкався. Аж раптом з'ясувалось, що гра взагалі побудована на OEngine, І не те щоб це був прям популярний рушій. Більш того - він пропрієтарний, його немає у вільному доступі. З якихось відомих комерційних ігор я пам'ятаю тільки White Night (хороша гра, до речі). На сторінці рушію вказана ще одна якась. Ось більш повний перелік. Коротше, на нього утіліт ніяких немає, як це було на Unity, то ж витащити ресурси з нього... Хз. Отут я і склав руки.
І, схоже, дарма.
Пізніше я наткнувся на канал ще одного перекладача - Галицький Розбишака. Він копається в іграх і дивиться, чи можна їх редагувати. Інколи - дає іншим на переклад з усіма необхідними ресурсами, якщо самому перекладати гру нецікаво.
Це наштовхнуло мене на відповідну думку, і я звернувся до нього.
Він вказав мені на утіліту для витаскування і заміни тексту в конкретно цій грі - Ravenswatch Text Tool (судячи з опису, до речі, зроблена на Python). Цікаво, чи працює вона для інших ігор на цьому ж рушії.
Це ж треба, хтось робив утіліту під конкретну гру, ще й під конкретно цю. Як пощастило)
Про всяк випадок, раптом стане недоступна, залишаю її тут:
Кнопки Export/Import ніяк не натякали на розширення файлу, тому який саме з овердофіга автозгенерованих імен файлів в теці гри йому згодовувати - я не знав. Зв'язався на тому ж форумі з творцем програми - він каже, буквально - "Я просто зробив програму для декого, я хз які файли їй треба". Що мене посміхнуло, бо звучить це доволі кумедно. Проте, в принципі - має сенс, якщо ти знаєш що робиш і просто реалізовував певний алгоритм. Натомість, він скинув мені локалізаційні файли. Гадаю, на них і проводив тестування. Файли, як і в теці гри, мали дивні зашифровані імена з різними "розширеннями".
Послуговуватись цими файлами напряму ненадійно, оскільки гра вийшла кілька років тому, утиліта - тоді ж. Багато чого в файлах могло змінитись. Проте я почав шукати аналогічні та подібні файли в теці гри.
Знайшов якісь файли (з примішком додаткових символів), що схожі на репліки героїв, за шляхом:
<steam-games-folder>\Ravenswatch\DarkTalesResources\_Cooking\Qqpi. Відкрив один з файлів навмання:
° ° W *I am the Sandman, sower of sleep and inspirer of dreams. It is a treasure to meet you.) *I am most pleased to see you, my friend.4 *It is always a joy to be graced with your presence.& *I am delighted to see you, as always. *Greetings, traveler. *Salutations, esteemed visitor...
Тепер мені треба було зачепитись за щось, щоб перевірити можливість заміни. Я спробував перекласти пункт налаштувань (в грі є пункт Settings), але мені треба було його знайти. Перебирати це по купі файлів - таке собі, тому я заюзав bash-цикл, який виводить назву файлу та строку, в якій зустрічається шуканий текст (у віндовс треба встановити ubuntu як wsl і перейти терміналом в теку файлів), після чого виконати:
for f in *.*; do
strings "$f" | grep 'Settings' | sed "s|^|$f: |"
done
Всі команди для bash/powershell генерувались за допомоги ChatGPT, хоч якийсь з нього толк.
Консоль мені показала відповідні файли:
Srxxrz~KWH.plv.GrbglQqpi.yqz: Menu_Settings
Srxxrz~KWH.plv.GrbglQqpi.yqz.GgzyLWR: *Settings
Srxxrz~KWH.plv.GrbglQqpi.yqz.GgzyMU: Settings
NOTE: Це linux-версія. Чому я і запускав його через WSL (в мене вже була встановлена). Через те, що strings є дефолтною на linux. Ось варіант для Windows:
встановити strings:
>>winget install --id=Microsoft.Sysinternals --source=winget
також можна скачати звідси.
додати шлях до неї (C:\Program Files\Sysinternals\strings.exe) в PATH змінну оточення. Як це зробити, можна знайти в інеті.
І тоді скрипт для Windows PowerShell:
Get-ChildItem -File -Recurse | ForEach-Object {
$output = strings $_.FullName 2>$null | Select-String 'Settings'
if ($output) {
foreach ($line in $output) {
"$($_.FullName): $($line.Line)"
}
}
}
Або якщо шукати одразу кілька різних слів:
$patterns = "Settings|Graphics|Audio"
Get-ChildItem -Recurse -File | ForEach-Object {
$file = $_.FullName
strings $file | Select-String -Pattern $patterns | ForEach-Object {
"${file}: $($_.Line)"
}
}
Дивимось на файли:

Контент в них може бути різними мовами і різного рівня читабельності, шукаємо те, що схоже на цільову мову (в даному випадку - ангілйську).
Спробуємо файл Srxxrz~KWH.plv.GrbglQqpi.yqz.GgzyLWR.
л л *Ravenswatch *Back *Choose a talent *Talent! *Leashed! *Trapped! *Weakened! *Regeneration *Strength *Max Health up! *Cursed! *Diseased! *Common *Rare *Epic *Legendary *Use a Raven Feather *Feathers left: {0} *Death's Door *You died *Dash *Quickly dash forward *Attack *Power *Special *Defense *Ultimate *Trait *Loading *Baba Yaga *Cynric Swyne *Godric Swyne *Alaric Swyne *Choose a magical object *Cursed *Tumor destroyed!, *Master Nightmare has lost {}% of its health *Sinbad *Select Hero *Confirm *View ability *View talent *Ready *Wait... *Ready *Quit *Hero already selected5 *Romeo & Juliet are recommended to be played together *Switch Hero *Join a session *Code: *Random *Warning& *Master Nightmare awakens in {} day(s) *Starting... *OK *Enter invite code *Play *Discord *Latest update: 05/31/2023 *Resume *Settings...
Оце вже схоже на частини інтерфейсу. Спробуємо щось змінити і запускаємо.
Нотатка перша - просто відредагувати через редактор не вийде. Судячи з усього, збереження могло перезаписати якісь технічні символи (інше кодування тощо), через що весь текст "злетів" і в грі відображався "дефолтний текст":

З цікавого - такого не траплялось, якщо кількість замінених символів співпадала. Але й результату в грі це не давало.
Повертаємо назад. На цей раз, спробуємо другий файл (оскільки редагування першого нічого не дало) - Srxxrz~KWH.plv.GrbglQqpi.yqz.GgzyMU. Спойлер - редагування файлу вручну дає той самий ефект, а якщо співпадає по кількості символам - текст просто зникає з гри.
Отже:
запускаємо утіліту
натискаємо "Експорт", обираємо реальний файл, який треба експортувати в зручному режимі
потім - місце і ім'я файлу, куди його зберегти.
В результаті - маємо нормальний txt файл для редагування.
Відкрили, відредагували те, що треба. Далі зворотня процедура:
Натиснули Import
Обрали той файл який щойно відредагували
Обрали оригінальний файл для заміни (той, з якого експортували)
Це зручно, з точки зору користувача. Але практика показала, що (принаймні напочатку, при багатократних тестах і генераціях) простіше користуватись нею з командної строки:
тека з утілітою>>Ravenswatch_Text_Tools_by_Sadamekaze.exe -e <шлях до оригінального файлу> <шлях, куди зберегти txt> (для експорту)
тека з утілітою>>Ravenswatch_Text_Tools_by_Sadamekaze.exe -i <шлях, до редагованого txt> <шлях до оригінального файлу> (для імпорту в гру)
Що цікаво - гра (рушій?) не дуже дружить з кириллицею. Принаймні не на цільовій мові. Відповідно, гра спробувала замінити це якоюсь іншою мовою, якою змогла. Ось візуально, те що було замінено і те, як воно було в грі:
Цікаво вийшло, гра не знайшла цих символів в закріпленому за англійською мовою шрифті, і адресувала це на якусь іншу мову. І вийшла в підсумку транслітерація))) Хоча дивно, що не на кириличний шрифт (російська є в грі), він же ближче за схожістю символів.
Поки що з цим незрозуміло що робити. Треба якимось чином знайти де перебувають ресурси зі шрифтами (назви і формати файлів тут нестандратні, зашифровані). А також - спосіб їх відредагувати. І, здається мені, це близько до неможливого, оскільки рушій пропрієтарний, у вільному доступі його нема (тобдто створити проект, в ньому створити шрифт і підмахнути його в гру не вийде). Тоді вже залишиться діло за малим - перекласти (овердофіга строк). Колись. Можливо.
Частина 2
Поки що - нотатка. Копирсаючись в файлах цієї теки, можу зробити такий висновок. Назви (принаймні кінцівки, співпадають з певною мовою). Поки що виглядає це так:
*.GgzyMU = EN (Srxxrz~KWH.plv.GrbglQqpi.yqz.GgzyMU, UTS_Fgztxgz~KWH.plv.GrbglQqpi.yqz.GgzyMU)
*.GgzyLWR = EN (але незрозуміло нащо, зміни в цих файлах нічого не дають в грі. Можливо це для білдів інших систем типу XBOX, PS, Nintendo...)
*.GgzyLJ - схоже, російською
*.GgzyMF - ймовірно, іспанська
*.GgzyNM - німецька
*.GgzyTG - польска
*.GgzyTQ-BL - португальска
*.GgzyVL - французька
*.GgzyXQ - італійська
*.GgzyYA-F - ймовірно, китайською (але нечитабельно закодований)
*.GgzyYA-Q - також. Але можливо одна з них спрлщена китайська, або що.
*.GgzyEW - ймовірно, японська.
*.GgzyIO - ймовірно, корейська
Спойлер - оце кодування майже не зберігається ніде в інших теках за невеликим виключенням.
Замінити шрифт може й не вдасться, але є одна невеличка примарна надія. Все залежить від того, наскільки багато символів включає кириличний шрифт для російської мови. Бо в принципі, якщо експортувати, змінити та переімпортувати файл для російської локалізації - воно ніби працює. І ніби навіть якось відображається (звичайно, перевірялись не всі символи):

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

Залишається лише якось перемкнути шрифт для англійської мови... Як? Жодного уявлення. Файли - нестандартні. Утиліт для роботи з ними - нема. Конкретних ресурсів зі шрифтами я поки не знайду. А навіть якщо знайду - не факт що це можна відредагувати текстовим редактором.
Нащо? Причина проста - не можна ставити українізатор поверх російської, бо це піднімить ігрову статистику росіянам в очах розробників. Далі буде... (?)
Частина 3
Ймовірно, шрифти в теці <steam-games-folder>\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\. І далі в одній з тек. наприклад Vrzidz Fgzv. Судячи з того що кожна з 3 тек відповідає за різні типи тексту. При редагуванні файлу одного з них (для польскої локалізації, бо не побачив поки в ній файлів для англійської), текст зламався тільки на стартовому екрані, де "Натисніть будь-яку кнопку" та версія гри. Попередній текст "завантаження" та інший в меню не зламався. Отже, як я сюди дістався? ChatGPT підказав які приблизно ключові слова можна пошукати у файлах, я і спробував:
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking>$patterns = "otf|ttf|Font|bitmap|glyph|character|typeface|kerning|draw_text"
PS C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking> Get-ChildItem -Recurse -File | ForEach-Object {
$file = $_.FullName
strings $file | Select-String -Pattern $patterns | ForEach-Object {
"${file}: $($_.Line)"
}
}
Операція тривала дуже багато часу, і результатів було також достобіса.
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\MzidisFqiidzyv\Aqurqv\Aqur_Bqrowlh!Aqur_Bqrowlh.qzidis.JvqtLvbSgbnq.ri: Fonts|Germania One\Germania_One_Outline~GAM.fnt|oCFont
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\MzidisFqiidzyv\Aqurqv\Aqur_Bqrowlh!Aqur_Bqrowlh_Cyytugvdl.qzidis.JvqtLvbSgbnq.ri: Fonts|Germania One\Germania_One_Outline_0~GAM.png|oCTexture
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\MzidisFqiidzyv\Aqurqv\Aqur_Bqrowlh!Aqur_Bqrowlh_Cyytugvdl.qzidis.JvqtLvbSgbnq.ri: Fonts|Germania One\Germania_One_Outline~GAM.fnt|oCFont
...
Довелось передивляться всі в пошуках ймовірних вказівників на файли. Або в крайнтьому випадку - відкривати і дивитись майже кожен.
А вже в самому кінці були більш цікаві посилання на, ймовірно, самі атласи шрифтів (Fontin_Sans_RG_Shadow~GAM.JA_0.png тощо, досвід з Unity нагадав що атлас літер зберігаєтсья як зображення):
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.EW.hzal: Fontin_Sans_RG_Shadow~GAM.JA_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.hza: Fontin_Sans_RG_Shadow_0~GAM.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.IO.hzal: Fontin_Sans_RG_Shadow~GAM.KO_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.LJ.hzal: Fontin_Sans_RG_Shadow~GAM.RU_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.TG.hzal: Fontin_Sans_RG_Shadow~GAM.PL_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.YA-F.hzal: Fontin_Sans_RG_Shadow~GAM.ZH-S_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.YA-Q.hzal: Fontin_Sans_RG_Shadow~GAM.ZH-T_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.EW.hzal: Fontin_Sans_RG~GAM.JA_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.hza: Fontin_Sans_RG_0~GAM.png
\C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.IO.hzal: Fontin_Sans_RG~GAM.KO_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.LJ.hzal: Fontin_Sans_RG~GAM.RU_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.TG.hzal: Fontin_Sans_RG~GAM.PL_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.YA-F.hzal: Fontin_Sans_RG~GAM.ZH-S_0.png
C:\Program Files (x86)\Steam\steamapps\common\Ravenswatch\DarkTalesResources\_Cooking\Vrziv\Vrzidz Fgzv\Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.YA-Q.hzal: Fontin_Sans_RG~GAM.ZH-T_0.png
От я туди і пішов, дивитись що там. А там - три різних типи найменування для кожної локи (наприклад, полської).
Тека Vrzidz Fgzv:
Vrzidz_Fgzv_LK_Fngtro~KWH.TG_0.jzy.Qqpiwuq.tpi
Vrzidz_Fgzv_LK~KWH.TG_0.jzy.Qqpiwuq.tpi
Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.TG.hzal (дрібний текст версії , шрифт Fontin_Sans_RG~GAM.PL_0.png)
.
Тека Nqwivbn (тут чомусь 2 файли):
Nqwivbn~KWH.TG_0.jzy.Qqpiwuq.tpi
Nqwivbn~KWH.hzi.Vrzi.TG.hzal (підпункти меню тощо, шрифт Deutsch~GAM.PL_0.png)
Тека Kquxgzdg Ozq (а тут їх аж 4):
Kquxgzdg_Ozq_Owildzq~KWH.TG_0.jzy.Qqpiwuq.tpi
Kquxgzdg_Ozq~KWH.TG_0.jzy.Qqpiwuq.tpi
Kquxgzdg_Ozq_Owildzq~KWH.hzi.Vrzi.TG.hzal (схоже, що великі написи. Germania_One_Outline~GAM.PL_0.png)
Kquxgzdg_Ozq~KWH.hzi.Vrzi.TG.hzal (ймовірно, весь інший текст , Germania_One~GAM.ZH-S_0.png)
То ж, що я робив. Завдяки тому, що шрифт для російської мови мав всі наявні літери, мені треба було просто підмінити файли. Аналогічні файли мали замість TG частинку LJ. Тому я просто перейменував TG-файли в "*_backup", а файли для російської копіював і перейменовував в TG. Тобто:
Kquxgzdg_Ozq_Owildzq~KWH.TG_0.jzy.Qqpiwuq.tpi -> Kquxgzdg_Ozq_Owildzq~KWH.TG_0.jzy.Qqpiwuq.tpi_backup
CTRL+C, Kquxgzdg_Ozq_Owildzq~KWH.LJ_0.jzy.Qqpiwuq.tpi, CTRL+V, Kquxgzdg_Ozq_Owildzq~KWH.TG_0.jzy.Qqpiwuq - копія.tpi -> Kquxgzdg_Ozq_Owildzq~KWH.TG_0.jzy.Qqpiwuq.tpi
І так для всіх перелічених файлів.
І що? І в підсумку - маємо прийнятний результат!
Це вже щось! Тільки перекладати з польскої - таке собі. навіть просто працювати з польским файлом, а перекладати з англійської - також таке. Англійська типу як дефолтна, то ж назви файлів не будуть мати поміток типу TG тощо. Виходить, картина така. Пункти писатимуться в форматі EN <- замінити RU файлом (як раніше)
Тека Vrzidz Fgzv:
Fontin_Sans_RG_Shadow_0~GAM.png:
Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.hza <- Vrzidz_Fgzv_LK_Fngtro~KWH.hzi.Vrzi.LJ.hzal
Vrzidz_Fgzv_LK_Fngtro_0~KWH.jzy.Qqpiwuq.tpi <- Vrzidz_Fgzv_LK_Fngtro~KWH.LJ_0.jzy.Qqpiwuq.tpi
Fontin_Sans_RG_0~GAM.png:
Vrzidz_Fgzv_LK_0~KWH.jzy.Qqpiwuq.tpi <- Vrzidz_Fgzv_LK~KWH.LJ_0.jzy.Qqpiwuq.tpi
Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.hza <- Vrzidz_Fgzv_LK~KWH.hzi.Vrzi.LJ.hzal
.
Тека Nqwivbn (тут чомусь по 2 файли):
Deutsch_0~GAM.png:
Nqwivbn_0~KWH.jzy.Qqpiwuq.tpi <- Nqwivbn~KWH.LJ_0.jzy.Qqpiwuq.tpi
Nqwivbn~KWH.hzi.Vrzi.hza <- Nqwivbn~KWH.hzi.Vrzi.LJ.hzal
Тека Kquxgzdg Ozq :
Germania_One_0~GAM.png
Kquxgzdg_Ozq_0~KWH.jzy.Qqpiwuq.tpi <- Kquxgzdg_Ozq~KWH.LJ_0.jzy.Qqpiwuq.tpi
Kquxgzdg_Ozq~KWH.hzi.Vrzi.hza <- Kquxgzdg_Ozq~KWH.hzi.Vrzi.LJ.hzal
Germania_One_Outline_0~GAM.png
Kquxgzdg_Ozq_Owildzq_0~KWH.jzy.Qqpiwuq.tpi < - Kquxgzdg_Ozq_Owildzq~KWH.LJ_0.jzy.Qqpiwuq.tpi
Kquxgzdg_Ozq_Owildzq~KWH.hzi.Vrzi.hza <- Kquxgzdg_Ozq_Owildzq~KWH.hzi.Vrzi.LJ.hzal
Отже, провівши ці маніпуляції, і переклавши відповідні рядки у вищезгаданому файлі, маємо наступний результат:
Перекладено було все трошки на поспіх через емоції і бажання швидше добити цю статтю і подивитись результат. Звичайно, ще треба все вичитати, узгодити словник термінів і внести правки (в файлі дані сирі слова без контексту, де вони використаються), а також - перекласти купу інших файлів, а не тільки основний ігровий інтерфейс)
І це все буде. Проте - трохи згодом.
Єдине, в чому я вбачаю проблему підтримки - назви файлів і тек. Виглядає так (і на думку ChatGPT також), що назви файлів і тек згенеровані випадковою послідовністю літер. Відповідно при новому оновленні гри (тобто при новому білді) шляхи до файлів (а можливо і самі файли) зміняться. І доведеться кожен раз вручну адаптувати переклад, файли, а також - перевіряти їх зміст (ну це, мубть дефолт при оновленнях). Але чи правдиві мої побоювання, буде видно лише з наступними апдейтами). Зараз це працює на версії 1.02.02.00.2687. Ну а далі - побачимо.
Мені б ще трилогію з The Cub добити...
Comentários