Betekintő: PAYDAY: The Heist
Sziasztok. Viszonylag ritkán jelentkezem ezzel a rovattal, bár ez annak is betudható, hogy az utóbbi években nem igazán volt saját projektem. A New Vegas sok időmet elvitte, na! Egy hasonló bejegyzést anno már írtam a Kane & Lynch: Dead Men esetében, amit itt el is lehet olvasni és most úgy gondoltam ennek apropóján a PAYDAY magyarításának menetéről is írok egy ilyen kis szösszenetet. Mivel sokan nem látnak bele egy magyarítás készítésének menetébe és az azzal járó rejtelmekbe, gondoltam ez az alkalom kiváló példa lesz arra, hogy kis betekintést nyújtsak a procedúrába.
Annak idején a Kane & Lynch esetében panaszkodtam ugye, mennyire macerás a fájlok kinyerése, visszarakása, arról nem is beszélve, hogy ott ráadásul minden egyes szövegfájl tele volt felesleges szeméttel. (Melyek utólag belegondolva nagy valószínűséggel a többjátékos mód párbeszédeinek feliratai voltak, de ez már nem releváns számunkra) Na hát a PAYDAY esetében valami hasonlót éltem meg. De honnan is induljunk? Nos, ez a cuki kis programocska egy kevésbé ismert, nem túl elegánsan festő Diesel néven ismert motor alatt fut, ami... hát nem a játékkészítés fellegvára, maradjunk annyiban. A játék minden egyes asset-et .bundle fájlokban tárol, a textúráktól megkezdve a hangokon át a szövegekig, mindent! Ezzel nincs is baj... a probléma ott kezdődik, hogy ezek nincsenek nevesítve, csak egy random szám generátor által kihányt kódnéven futnak, ami 0b03828726d76f54_h.bundle-től kezdve lehet akár all_46.bundle, vagy fb4789c7fe353b36.bundle. Na jó szórakozást hülyegyerek! De akkor mégis hogy jöjjünk rá, melyekben is vannak a szövegek? Szerencsére a Total Commander rendelkezik egy elég hasznos funkcióval, ami képes bizonyos szótöredékekre rákeresni (többnyire) bármilyen típusú fájlról is legyen szó, így hamar megtaláltam, melyik .bundle fájlt is kellene elkezdenem atomjaira bontani. (Ha valakinek ez számít valamit, a megfejtés az 5ec080cae6025b76.bundle volt. Nem, ezért nem jár semmiféle jutalom, még csak hátba veregetés sem.) Innentől kezdődik meg a móka!
Ha nem tévedek talán a Kínaiak készítettek egy bundle kicsomagoló eszközt, de ha nem is ők voltak azok az tuti biztos, hogy egy Kínai nyelvű oldalról tallóztam össze a programot. Ez gyönyörű szépen egy azonos nevű mappába tömörít minden fájlt, ami az adott csomagban található. Fontok, modellek, GUI elemek és a sok lom között felcsillanó szemekkel pillantom meg a strings nevezetű mappát! Ezt megnyitván fogadott egy olyan látvány, amitől megint levert a víz. Az még csak egy dolog, hogy a különféle feliratok mind más és más fájlba vannak tömörítve (szám szerint 7-ről beszélünk) de mindezek négy variánssal rendelkeznek. Vegyük például a menüelemek nagy részét magába foglaló atmospheric_text fájlt (mert persze bizonyos elemeket ez is más és más fájlból olvas, csak hogy ne legyen olyan egyszerű dolgom a tesztelés során...) amiből kapásból négy darab is van: atmospheric_text.0.strings, atmospheric_text.128.strings, atmospheric_text.512.strings, atmospheric_text.1024.strings és végül atmospheric_text.4096.strings. Arra viszonylag hamar sikerült rájönnöm, hogy a különböző számokkal megjelölt fájlok más és más nyelveket jelentenek, de első blikkre marha nehéz volt megjósolni, ebből melyik is lehet az Angol!? Szerencsém volt, sorban haladtam és a nullával megjelölt fájlokban voltak az áhított szövegek, no de odáig eljutni is egy külön kihívás volt.
Természetesen ez a .strings fájl nem csak egy jól rendezett, átnevezett .txt fájl, hanem egy kódolt maszlag, aminek szerkeszthető állapotba varázsláshoz egy újabb eszközre volt szükségem. Szerencsére valahonnan a kezem ügyébe került egy .strings editor, amit vagy Mortal-tól kaptam, vagy a Xentax-on találtam... a fene nem emlékszik már rá, sajnos ennyi év távlatából ezt már nem tudom megmondani. Bárhogy is legyen, köszönet érte a program írójának! Az addig oké, hogy egy egyszerű cmd paranccsal oda-vissza átalakíthatóak a fájlok, de ez a kódsor nem hajlandó normálisan lefutni, ha nincs telepítve a Python keretrendszer a számítógépre. Tehát újabb kört kell futni csak azért, hogy le tudjam hámozni a harmadik réteget is erről a kifejezetten büdös szagú hagymáról. Ezek után hozzáférhettem a fent említett 7 szövegfájl valójában szerkeszthető formátumához. Hurrá! És ráadásul még csak felesleges sallangok sem voltak benne, leszámítva a változókat. Innentől kezdve elég lett volna csak simán Notepad++-ba behajigálni a szövegfájlokat és nekilátni a fordításnak, de itt csavartam még egyet a dolgon és saját kútfőre feldobtam a fájlokat a Crowdin fordítástámogató rendszerébe, mert így sokkal könnyebben meg tudtuk oldani az egyidejűleg történő fordítást Ateszkomával. Arról már nem is beszélve, hogy így egyből kikerültük a fájlok oda-vissza történő küldözgetését és az esetleges kavarodásokat. (Igen, tudom, léteznek erre a célra elég komoly fordítás támogató programok is, de akik egy egyszerűbb alternatívában gondolkoznak és több főt számláló projektet vesznek a hónuk alá, azoknak meleg szívvel tudom ajánlani ezt a platformot! És még csak fizetni sem kell érte, ha nagyon szépen pislogsz a Support-ra :) )
Innentől kezdetét is vehette a munka. A legnagyobb problémát nem az ékezetes karakterek hiánya okozta, mert azt könnyen át lehet hidalni a kalapos megfelelők használatával, hanem az, hogy bizonyos sorok karakterlimitesek. Ezt nem úgy kell elképzelni, hogy ha egy adott string átlépi az X karakterszámot a motor egy az egyben összeomlik, hanem az előre megrajzolt GUI elemekből kicsúszik a szöveg, vagy ami még ennél is jobb, a mondat elejét és végét is lecsípi. Mindkét esetre alant láthattok egy-egy tökéletes példát:
Ez sajnos azt eredményezte, hogy sok esetben kénytelen voltam rövidíteni és kissé magyartalanul fogalmazni csak azért, hogy a felirat ne csússzon el az eredetileg tervezett formától. Ezért találkozhattok sok esetben (leginkább interakciók során) ezzel a nem túl elegáns formával:
A másik "kedvencem", amit szintén tökéletesen reprezentál a fenti kép, hogy az ékezetes karakterekkel egyszerűen nem tud mit kezdeni a motor, ha azokat nem nekifutásból kapitális formában írod bele a szövegfájlba. Minden mást magától átkonvertál, de az ékezetes betűket valamiért nem. Ez azt eredményezte, hogy egyesével kellett nagybetűssé alakítanom minden sort, amivel a játékon belül probléma volt. A menüktől kezdve a GUI elemekig szinte mindennel probléma volt ilyen téren! Leszámítva a párbeszédek feliratait. Ott valamiért abban a formátumban írta ki a szöveget, ahogy azt bepötyögtem korábban. Roppant érdekes... erre is mutatok egy gyakorlati példát:
Azt az apróságot meg sem említem, hogy a kaszt, mint Támadó (Assault) és a melók során piros háromszöggel jelző Támadás (Assault) feliratot egy sorból olvassa a játék, így akarva-akaratlanul meg voltam lőve és a kettő között kénytelen voltam letenni a voksomat valamelyik mellett. Így történt meg tehát az, hogy a kasztoknál a 'Támadó' az 'Támadás'-ként szerepel. Ezzel sajnos nincs mit kezdeni, ezt el kell fogadnunk úgy, ahogy van:
Ha ezeken túllendültünk, akkor nincs is más hátra, ideje visszapakolni a fordítást a játékba és letesztelni. A szövegfájlokat visszakonvertálni .string formátumúba, a kapott .string fájlokat visszamásolni a kicsomagolt bundle fájl mappájának strings almappájába, a kicsomagolt .bundle fájlt vissza alakítani .bundle formátumra, majd a kapott két fájlt visszahelyezni a játék assets könyvtárába. izgalmasnak hangzik, mi? És ezt minden... egyes... alkalommal meg kellett csinálni, akárhányszor valami változást eszközöltem a fordításon és ki akartam próbálni, működik-e a dolog! (Szerencsére kicsomagolni csak egyszer kellett.)
Ez leírva kissé száraznak tűnhet, de talán ezzel a kis írással jobb megvilágításba kerül az a tény, hogy egy játék magyarítása nem csupán annyiból áll, hogy leülünk és gépelünk, mint az állat. Mindezt megelőzi egy masszív technikai bűvészkedés is és az még csak a jobbik eset, hogy ha még ennyi kínlódás árán is, de az adott játék kötöttségek nélkül fordítható. Ha tetszett ez a kis iromány, a jövőben szívesen megosztok még veletek hasonlókat, akár néhány múltbéli projektre visszatekintőleg is.