Ultima VI: The False Prophet
Una grande sfida: tradurre un gioco del 1990
Premessa
Su Good Old Games è tempo di promozioni estive. In offerta c'è anche tutta la serie Ultima. In particolare a me interessa Ultima VI: The False Prophet, che vent'anni fa ha rappresentato il mio approccio al mondo dei giochi di ruolo. E' molto difficile spiegare al giorno d'oggi perché questo gioco mi piace così tanto, ma ci proverò comunque. Immaginate un mondo vivo, liberamente esplorabile, con un mondo sotterraneo, con tantissimi personaggi che dormono, lavorano, parlano, una trama di alto livello e una libertà completa di utilizzare tutti gli oggetti sparsi per il territorio. Qualcuno potrebbe dire "Cos'è? L'antenato di The Elder Scrolls III: Morrowind?". No, in realtà è molto di più. Per capire si deve giocarlo esplorandone ogni sfacettatura, immergendosi completamente in una realtà alternativa creata dalla mente dalla mente di Richard Garriott che nel 1980 iniziò una saga che è unica nel suo genere. Un mondo che durante i vari episodi si evolve, con isole che nascono e spariscono, personaggi che muoiono o che cambiano, luoghi che assumono una diversa identità. Lui stesso si identifica nel gioco come Lord British e noi siamo lo straniero giunto da un altro mondo per sua volontà e destinati a salvare il mondo dal male. Un game-style a cui è difficile abituarsi fatto di comandi testuali, di movimento a turni, nessun diario che ci dica cosa dobbiamo fare, nessuna mappa che ci dica dove dobbiamo andare, tutto è lasciato al nostro ragionamento e alla nostra capacità di prendere appunti su ogni cosa e collegare gli eventi a cui assistiamo. E completamente in inglese con un retrogusto medievale. E da qui è nata la mia idea. Tradurlo in italiano, renderlo fruibile a tutti coloro che abbiano la volontà di provarlo. Pur essendo un gioco del 1990, farlo funzionare non è per nulla impossibile. La versione venduta da GOG va a meraviglia sfruttando il DosBox, ma se si vuole qualcosa in più si può utilizzare il Nuvie, un progetto lungo 11 anni che è giunto alla versione 0.5 e che permette di giocare questo magnifico rpg su tantissimi sistemi operativi con molte migliorie. A me onestamente piace la versione originale, ma questi lavori portati avanti dagli appassionati li apprezzo sempre.
La ricerca degli strumenti
Tradurre un videogioco non è un'impresa semplice, non soltanto per la lingua, ma soprattutto per i problemi tecnici che si incontrano. Cercando su internet riesco a trovare Ultima Codex, un fansite dove si possono trovare moltissime risorse su questa serie e nella sezione dedicata a Ultima VI mi imbatto in tante cose interessanti. La più utile per me è sicuramente l'U6Edit, un editor creato da Paul Gilbert dieci anni fa, che permette di avere accesso a quasi tutti i file del gioco in modo semplice. Per il mio scopo è fondamentale perché mi permette di modificare con facilità i file BOOK.DAT, CONVERSE.A e CONVERSE.B che contengono i testi dei libri e delle segnaletiche e le conversazioni dei personaggi ricompilandoli automaticamente. Non esistono file di puro testo in questo gioco, tutti i file sono compilati e compressi ed è quindi impossibile accedervi con un editor di testi. Purtroppo questo editor non può fare tutto, i nomi degli oggetti, l'interfaccia, i comandi, la sequenza introduttiva e finale non vengono gestite. Cercando ulteriormente scopro che il file LOOK.LZD contiene i nomi degli oggetti, ma è codificato in LZW di cui riesco a reperire gli strumenti per decodificare e ricodificare. Infine analizzando con Notepad++ i file *.EXE trovo alcune stringhe di testo che corrispondono a quanto mi manca. Peccato che questi file non si possano modificare così tranquillamente, sono degli eseguibili che contengono precise istruzioni e variare anche un solo carattere può comportarne il malfunzionamento. Insomma, a parte l'U6Edit, il resto mi sembra piuttosto problematico e dovrò comprendere bene come agire.
Ulteriori scoperte
Cercando con pazienza riesco a trovare con mia somma gioia il sito di un appassionato tedesco che ha avuto la mia stessa idea. Oltre a confermare quanto avevo già appurato da solo, scopro altri strumenti utili, l'U6 Items Editor e l'U6 LZW Compressing Utility creati da SkaZZ, un traduttore amatoriale spagnolo molto bravo, e un programmino per modificare i font del gioco così da utilizzare le nostre lettere accentate senza dover far uso dell'apostrofo stilisticamente molto brutto. Inoltre, come già sospettavo, i fle *.EXE non sono facili da gestire e l'unico modo è utilizzare un editor esadecimale anche se rimane un grosso problema: gli offset o puntatori a dirla in italiano. Io non sono un programmatore, ma qualcosa ci capisco avendo creato qualche programmino in php. In breve, le stringhe di testo presenti in questi file possono essere sostituite con altri caratteri, ma non possono essere allungate perché altrimenti si perdono i rifermenti alle stringhe stesse e le istruzioni non capiscono più cosa devono fare. Bisogna quindi modificare i puntatori, ma prima bisogna trovarli e ciò può voler dire che bisogna disassemblare il file, operazione complessa e improponibile per uno come me che già non conosce il C, figurarsi l'Assembly.
Sono riuscito a prendere contatto con Sir John e SkaZZ che sono disposti a darmi una mano con la mia imponente opera. Ci siamo scambiati qualche email e questo fine settimana inizierò a fare i primi esperimenti.
Inizia la sfida
Il mio primo obiettivo di oggi consiste nel modificare la tabella dei font utilizzati dal gioco per includervi le nostre lettere accentate (à, è, é, ì, ò, ù, È) anziché utilizzare l'apostrofo per simulare l'accento, cosa che tra l'altro comporta l'uso di due bit. Come suggerito da Sir John bisogna individuare dei caratteri obsoleti che possano essere riutilizzati per disegnare i nuovi caratteri. I font si trovano nel file U6.CH che posso aprire con l'U6Edit e ancor meglio con l'YY-CHR 99 per modificare i disegni che mi interessano. Caricato il file, modifico il Graphic format in 1BPP, e analizzo i caratteri contenuti nella tabella. Ovviamente non dovrò modificare le rune e il linguaggio dei gargoyle e altri disegni speciali utilizzati nel gioco e dovrò fare delle prove per capire su quali mettere mano per il mio scopo. Nella barra di stato, alla voce pattern posso vedere il codice esadecimale associato al singolo carattere. Questo sarà fondamentale quando scriverò le stringhe di testo perché dovrò tenere bene a mente che il carattere che digiterò dovrà corrispondere al codice esadecimale appropriato che il gioco convertirà nel disegno ad esso abbinato. Sembra complicato, ma in realtà non lo è più di tanto. Ad esempio se io decidessi che il carattere "_" deve diventare "à" allora la prima cosa da fare è ricordare che "_" corrisponde al codice esadecimale "5F" e quindi quando scriverò le stringhe questo è quanto deve apparire. Il gioco poi capirà che ora il "5F" non è più il disegno "_", ma "à" e a video vedremo proprio questo. Bellissimo! Il secondo obiettivo è capire come sono strutturati i dialoghi, i libri e le segnaletiche. Aprendo l'U6Edit non è difficile capirlo. Le conversazioni sono divise per personaggio e sono piuttosto facili da modificare. Si cambia la parola chiave (se sono più di una vanno divise da una virgola senza spazi) e il testo associato. Con ALT+O si può vedere il codice esadecimale, con CTRL+S si salva lo script e con F9 si compila il file e in teoria nella cartella del progetto dovrebbero comparire i nuovi CONVERSE.A e CONVERSE.B modificati. Per i libri e le segnaletiche sembra che basti modificare la scritta e cliccare su OK. Se i testi devono essere scritti con le rune britanniche questi devono essere preceduti da "<" e seguiti da ">". Terzo obiettivo, i nomi degli oggetti. Essi sono contenuti nel file LOOK.LZD che va decompresso utilizzando l'U6Decode v.2.1. L'operazione non è difficile se si sanno ancora usare i comdandi DOS, una volta decompresso il file è perfettamente leggibile anche con un editor di testi non esadecimale, ma per modificarlo è meglio utilizzare l'U6 Items Editor di SkaZZ che permette maggior precisione. Poi il file va ricompresso usando l'U6 LZW Compiler sempre sotto DOS. E' ora di iniziare! Il modo migliore per provare è iniziare una partita e provare a tradurre le prime frasi che incontro parlando con i personaggi e guardando la mappa. Vediamo che risultati ottengo.
Oggi ho trascorso invano molte ore a capire come trovare i puntatori all'interno dei file eseguibili. Scoraggiato, e sperando che SkaZZ riesca a fare chiarezza nella mia mente annebbiata, ho deciso di provare comunque a tradurre la sequenza introduttiva del gioco. Sostituire i blocchi di testo mantenendo inalterata la lunghezza delle stringhe non è un compito facile. Devo riuscire a costruire delle frasi corrette e belle da leggere pur senza spostare o cancellare l'indicatore di fine testo. Frasi più corte non implicano problemi, basta aggiungere deli 00 esadecimali e il gioco è fatto, ma quelle più lunghe necessitano per forza di un lavoro sugli offset di cui ancora non conosco la tecnica. Inoltre in questa fase devo rinunciare ai caratteri accentati che non vengono gestiti all'interno dei file *.EXE e quindi devo usare l'apostrofo per simulare l'accento (bruttissimo!). Comunque ho disegnato il mio primo font, il 5F esadecimale diventa una à al posto di _.
Ecco le immagini della sequenza di apertura del gioco...
Ieri ho finito di tradurre la sequenza di apertura e oggi sto per completare quella inroduttiva. Sto lavorando con l'editor esadecimale direttamente sul file U.EXE e sono rimasto sorpreso di una cosa. Come ho scritto domenica scorsa in questi file non vengono gestite le lettere accentate e altri caratteri speciali il che mi fa presupporre che venga utilizzta la tabella ASCII standard da 128 caratteri anziché quella estesa da 256 caratteri. Ad ogni carattere ASCII corrisponde un valore esadecimale e questo mi ha permesso di capire ulteriormente perché il valore 00 sia così delicato da gestire e come invece il valore 0A sia spostabile a piacimento. Il 0A è il line feed e indica una nuova linea, equivale al \n del php ed è quello che nei caratteri non stampabili viene scritto come LF. Il 00 invece è un carattere NUL che indica il termine di un frammento di codice e determina ad esempio se una stringa è terminata e quindi ha un'importanza fondamentale nelle istruzioni di un programma. Ciò che però mi lascia perplesso è che è stato utilizzata la combinazione di lettere ASCII %c, 25 63 in valori esadecimali e a monitor vengono visualizzate le virgolette doppie di chiusura. Le virgolette doppie esistono nella tabella ASCII standard e corrispondono al valore esadecimale 22, ma generalmente sono virgolette doppie semplici, invece in queste sequenze vengono rappresentate da virgolette doppie aperte. Secondo me, ma devo ancora verificare e non è detto che ci riesca, i programmatori hanno creato una tabella di caratteri o una variabile per stampare le virgolette doppie.
Ecco le immagini della sequenza introduttiva del gioco...
Per agevolare la traduzione dei nomi degli oggetti e dei libri, SkaZZ ha creato Avatarkus, un programma che fonde l'U6 Book Editor, l'U6 Items Editor, il decode e l'encode. L'aspetto più interessante è che la decompilazione e la compilazione del file LOOK.LZD sono state automatizzate evitando i passaggi del DOS. Inoltre, ancora giovedì scorso, ha corretto degli errori che non permettevano all'encode di funzionare a pieno.
Ho fatto un primo esperimento per riuscire a tradurre i nomi degli oggetti che nel gioco hanno una quantità in modo che il singolare e il plurale siano grammaticalmente corretti e ha funzionato. Il sistema di programmazione si adatta perfettamente alle esigenze della nostra lingua dove il plurale non implica mai l'aggiunta di lettere come la "s" inglese, ma il cambio finale della parola. Quindi "coin\s gold" diventa "monet/a\e d'oro" e il gioco restituisce "30 monete d'oro" oppure "1 moneta d'oro". Inoltre per una buona leggibilità degli oggetti che nel gioco non hanno il plurale ho aggiunto l'articolo appropriato unendolo al nome e ho tolto dal file GAME.EXE gli articoli inglesi sostituendoli con degli 00 esadecimali. Il gioco funziona senza problemi e la lettura è scorrevole. Prima però devo completare la traduzione del file U.EXE ed è il momento di occuparsi della fase di creazione del personaggio. Sarà lunga e impegnativa, ma ce la farò!
La traduzione della fase di creazione del personaggio sta procedendo bene. E' particolarmente ostico riuscire a far stare alcune frasi nello spazio consentito, ma lavorando con la sintassi ci sto riuscendo piuttosto bene. Sinora 18 domande della zingara su 28 sono state convertite oltre al preambolo. Ecco il preambolo...
...ed ecco alcune delle domande delle otto virtù!
Seguendo una critica che mi è stata mossa nella sezione "Ditemi...", oggi ho riletto la traduzione eseguita sinora e ho corretto alcune inesattezze che erano effettivamente presenti. Ciò che non ho la minima intenzione di fare, però, è di abbandonare questo progetto come mi è stato pregato di fare. L'ho iniziato proprio per l'amore che nutro per questa splendida opera e per permettere a chi non conosce l'inglese di poterla comprendere. Una revisione del lavoro va sempre fatta e spero che l'ignoto appassionato ne comprenda le difficoltà tecnico-linguistiche.
Anche le ultime 10 frasi della zingara sono concluse...
...e pure l'epilogo della creazione del personaggio!
Ho provato a completare la traduzione del file U.EXE, ma dopo alcune considerazioni ho deciso di lasciar perdere, almeno per ora. Si tratta delle frasi inerenti il trasferimento del personaggio da Ultima V e la segnalazione che esiste già una partita in corso nel caso si voglia creare un nuovo personaggio. Lo spazio disponibile è difficile da gestire e nella seconda frase non viene gestito l'apostrofo. Ritengo che non siano così importanti e che quindi possano essere tralasciate. Ora posso iniziare a dedicarmi alla parte più grossa del lavoro. Potrei seguire la strada di Sir John traducendo per prima cosa tutti i nomi degli oggetti e tutti i testi dei libri, ma non sono così sicuro di riuscire ad identificare il ruolo di tutte le componenti all'interno del gioco. Preferisco quindi iniziare una nuova partita e tradurre i vari pezzi mano a mano che gioco in modo da capire esattamente di cosa sto parlando. Penso che così facendo eviterò di tralasciare delle parole essendo costretto ad osservare tutto il possibile. Diamo il via alla sperimentazione! Ma, un momento! Prima devo sistemare il file dei caratteri per poter stampare a video le lettere accentate. Senza complicarmi la vita farò in modo analogo a Sir John e SkaZz, se ci sono dei problemi li troverò strada facendo. Dopo i primi esperimenti devo purtroppo evidenziare che la mia idea di togliere gli articoli degli oggetti e inserire l'articolo corretto assieme al corrispondente oggetto non funziona esattamente come mi aspettavo. Non mi sembra un bell'effetto leggere "Un gargoyle un po' ferito" anziché "Gargoyle un po' ferito" durante il combattimento e nemmeno avere la didascalia di un'immagine che riporta "un gargoyle". Per ora manterrò la linea di eliminare gli articoli posizionati all'offset 2F4E5 del file GAME.EXE, ma lascerò i nomi senza articolo nel file LOOK.LZD. Il file GAME.EXE si sta rivelando molto impegnativo, è difficile trovare le parole adeguate per tutti gli eventi che intervengono nel gioco sempre per il solito problema di riuscire a farcele stare nello spazio disponibile. Comprendere il contesto in cui sono utilizzati i termini è fondamentale per poter almeno sperare di trovare una traduzione adeguata. Spero che gli appasionati non si offenderanno troppo per questo...
Una grande sfida! Non potevo trovare un titolo migliore per questa mia impresa. Il file GAME.EXE è l'incubo peggiore che potessi trovare. La traduzione di ogni singola azione del gioco richiede uno studio approfondito del contesto in cui la frase viene generata e una scelta di termini che permettano di mantenere il significato dell'evento senza superare la lunghezza della stringa originaria. Ieri sera ho dedicato il mio tempo a leggere il forum di Old Games Italia dedicato alla traduzione di Ultima Underworld: The Stygian Abyss per verificare se i problemi che sto incontrando io sono comuni in questo genere di lavori. Non sono rimasto molto sorpreso nel leggere confronti e punti di vista differenti tra i vari membri del gruppo sulla necessità o meno di adattare un termine, ma soprattutto nel vedere che i file eseguibili sono per tutti una battaglia consistente. Mi consolo conscio del fatto che sto cercando di fare del mio meglio e che l'unico modo per comprendere i problemi è sperimentarli di persona. Ha ragione Ragfox quando, in una sua intervista rilasciata alla purtroppo ormai defunta rivista Giochi per il Mio Computer in merito alla sua traduzione di Fallout, afferma:
"Sicuramente la passione è fondamentale, ma non basta. Gli studi specialistici aiutano, ma non sono strettamente necessari. Ciò che spesso si trascura, sbagliando, è l'importanza della conoscenza dell'italiano. Se non si riesce a rendere con efficacia nella propria lingua i concetti espressi dal testo originale, la traduzione rischia di essere di scarsa qualità."
Se poi si è pure costretti a rispettare uno spazio predefinito riuscirci è ancora più impegnativo... Un esempio? Nel gioco si possono lanciare delle magie, ma per poterlo fare è necessario che il personaggio abbia in mano il libro degli incantesimi. Se non è così il gioco ci avvisa con la frase "No spellbook is readied." che io ho tradotto "Nessun grimorio in mano.". La rappresentazione del concetto secondo me è perfetta. Infatti, se avessi scritto "Non hai un libro di magie" non sarebbe stato corretto (oltre a essere un testo troppo lungo) perché l'oggetto è a nostra disposizione, ma nell'inventario, e il gioco richiede invece che sia pronto (readied) ossia in mano. E poi il termine grimorio fornisce un'atmosfera medievalizzante che non ci sta niente male...
Forse ho iniziato a capire la logica che sta alla base dei famosi puntatori che regolano la posizione iniziale delle varie stringhe. Confrontando il mio file GAME.EXE con la versione spagnola di SkaZz ho trovato delle differenze tra alcuni caratteri esadecimali che non c'entrano nulla con i testi stampati a video. In particolare si tratta di quelli che definiscono l'atteggiamento combattivo dei seguaci e gli 00 esadecimali sono stati spostati per consentire di avere alcune stringhe più lunghe rispetto alla versione inglese. La stessa cosa è stata fatta anche per i nomi degli incantesimi. Sembra che il file sia diviso in blocchi, ognuno dei quali si occupa di una sezione dell'interfaccia (comandi di gioco, caratteristiche del personaggio, sistema magico, ecc.), e che i puntatori siano definiti appena prima dell'inizio delle stringhe. Dovrò fare l'alchimista informatico e cercare in modo empirico la corrispondenza tra puntatori e stringhe per poterli poi adattare alle eventuali esigenze che potrei avere. Vediamo cosa salta fuori...
FUNZIONA!!! Per la prima volta sono riuscito a modificare alcuni offset (blocco 2DF4D-2DF5A) e il gioco continua a funzionare perfettamente.
COMMAND.FRONT.REAR.FLANK.BERSERK.RETREAT.ASSAULT.
ORDINE.FRONTE.RETRO.FIANCO.CARICA.RITIRO.ASSALTO.
ORDEN.FRENTE.ATRAS.FLANCO.CARGAR.HUIDA....ASALTO.
31 08 39 08 3F 08 44 08 4A 08 52 08 5A 08
31 08 38 08 3F 08 45 08 4C 08 53 08 5A 08
31 08 37 08 3E 08 44 08 4B 08 52 08 5B 08
Prima giornata di ferie dedicata ad analizzare più approfonditamente il file GAME.EXE. I testi da tradurre sono meno di quanti pensassi in un primo momento. Li ho raggruppati per blocchi in modo da tenere meglio la traccia di quanto rimane da fare e per ora ho convertito le frasi inerenti il riposo del gruppo tranne quelle relative all'imbarcazione. Purtroppo anche la parola "none" ("nessuno") è rimasta in inglese, se solo riuscissi a trovare gli offset potrei spostare alcune frasi e recuperare lo spazio utile...
Anche i punti cardinali sono sistemati con la modifica di un offset nel blocco 2D9E6-2D9F5...
North.Northeast.East.Southeast.South.Southwest.West.Northwest.
Nord..Nordest...Est..Sudest....Sud...Sudovest.Ovest.Nordovest.
Norte.Noreste...Este.Sudeste...Sur...Sudoeste.Oeste.Noroeste..
26 02 2C 02 36 02 3B 02 45 02 4B 02 55 02 5A 02
26 02 2C 02 36 02 3B 02 45 02 4B 02 54 02 5A 02
26 02 2C 02 36 02 3B 02 45 02 4B 02 54 02 5A 02
Seguendo le istruzioni di Sir John e SkaZz sono riuscito a modificare anche gli offset relativi alle azioni effettuabili dal giocatore (Attack, Cast, Talk, Look, Get, Drop, Move, Use, Rest, Save). In realtà, analizzando nel dettaglio i comandi, mi sono reso conto che premendo i pulsanti relativi alle azioni "Attack", "Rest" e "Save" vengono attivate delle frasi diverse da quelle presenti in questo elenco che quindi risultano a mio avviso totalmente inutili. A questo punto ho provato a scrivere le parole in italiano e a modificare i relativi offset (blocco 2D8D3-2D8E6) mantenendo per sicurezza la "A" di "Attack" e trascurando "Rest" e "Save" (tra l'altro quest'ultimo non esiste nemmeno dato che il pulsante serve per iniziare e terminare il combattimento... Bah, a mio avviso sono dei refusi di programmazione.). La cosa buffa e incomprensibile per me che non sono un programmatore è che la nuova parola "Usa" va a sostituirsi esattamente alla vecchia "Rest" e gli offset seppur identici non vanno in conflitto. Boh! Il risultato comunque è il seguente:
Attack.Cast.Talk.Look.Get.Drop.Move.Use.Rest.Save.
A.Magia.Parla.Guarda.Prendi.Getta.Muovi.Usa.Dormi.
Atq.Magia.Habla.Ver.Coge.Deja.Mover.Usa.Zzz.Graba.
DC 03 E3 03 E8 03 ED 03 F2 03 F6 03 FB 03 00 04 04 04 09 04
DC 03 DE 03 E4 03 EA 03 F1 03 F8 03 FE 03 04 04 04 04 09 04
DC 03 E0 03 E6 03 EC 03 F0 03 F5 03 FA 03 00 04 04 04 08 04
Oggi ho dedicato la giornata a cercare di capire dove sono i puntatori per poter allungare le stringhe di testo che non mi consentono una traduzione degna di questo nome. Peccato che tutti i miei sforzi siano stati vani. Non ci sono riuscito e quindi credo che dovrò iniziare a dedicarmi ai dialoghi, ai libri e ai nomi degli oggetti partendo dal castello di Lord British. Ci sarà tempo anche più avanti per occuparsi di questo file che si rivela essere quello più rigido come era lecito aspettarsi da un eseguibile.
Ho trascorso la giornata odierna a ripassare per bene un po' tutta la grammatica inglese, soprattutto verbi, comparativi e superlativi, aggettivi, avverbi e preposizioni. Mi sembrava necessario date le critiche che mi sono state mosse e comunque utile per affrontare i dialoghi dei 200 personaggi di cui è costituito il gioco, soprattutto perché non è il mio lavoro di tutti i giorni. L'inglese può sembrare una lingua più facile di molte altre, e probabilmente lo è, ma questo non significa che sia da sottovalutare. Le regole grammaticali e di sintassi sono il fondamento di ogni linguaggio codificato così come accade nella programmazione.
Ho tradotto i dialoghi dei primi due personaggi, Dupre e Shamino, e devo ammettere che mi sto divertendo veramente, ma veramente molto. Umilmente (anch'io incarno le Virtù dell'Avatar) ho rafforzato la mia idea di proseguire con questa notevole impresa pur comprendendo che il cammino sarà lungo e impervio. Il mio inglese non è certamente paragonabile a quello di un laureato a pieni voti in lingue, ma con pazienza e attenzione ritengo di poter portare avanti questo appassionante progetto che serve anche a me per poter capire uno dei giochi di ruolo più belli che si siano mai visti. Ora proseguo fino a che il castello di Lord British non parlerà italiano, dai personaggi, agli oggetti, ai libri. Rimarrà parzialmente insuperato lo scoglio del file GAME.EXE, ma sono fiducioso che vi si potrà porre rimedio. E non è escluso che rifaccia anche una revisione della parte iniziale che mi è stata criticata. Non c'è mai limite al miglioramento.
Come al solito mi programmo di fare una cosa e poi per un motivo o per l'altro va a finire che mi dedico ad altro. Stamane, dopo aver letto la risposta di SkaZz ad una mia richiesta di chiarimenti, ho riesaminato il problema dei nomi degli oggetti. Dopo vari confronti di file ho definitivamente compreso che il file LOOK.LZD contiene soltanto l'ID e il nome degli oggetti e che il file TILEFLAG contiene gli articoli degli oggetti o forse è meglio dire l'abbinamento agli articoli che sono scritti nel file GAME.EXE nel blocco 2F4E4-2F4F0. Le note della traduzione di SkaZz riportano proprio questo, ma se io cambio un valore nel file TILEFLAG non succede nulla o almeno così sembra. Ho chiesto ulteriori delucidazioni di cui attendo risposta, ma rimane il problema che ho evidenziato sabato scorso: o annullo gli articoli nel file GAME.EXE e aggiungo l'articolo direttamente nel nome dell'oggetto accettando però il fatto che comparirà ovunque nel gioco anche dove effettivamente non servirebbe oppure lascio i nomi senza articolo rendendo la lettura meno gradevole in alcuni punti, ma più coerente in altri. Dovrò fare degli esperimenti per capire quale può essere la soluzione migliore sapendo sin da ora che la perfezione non verrà raggiunta.
Prima di proseguire la traduzione dei dialoghi dei personaggi del castello, ho deciso di approfondire ulteriormente la questione degli articoli degli oggetti. Credo di aver finalmente capito come funziona il tutto. Il file TILEFLAG contiene effettivamente gli articoli degli oggetti a partire dall'offset 0x1400, il loro ordinamento corrisponde a quello dei nomi presenti nel file LOOK.LZD. Ciò vuol dire che alla posizione 0x1400 c'è l'articolo di "Nothing", alla posizione 0x1401 c'è l'articolo di "grass", ma non è detto che ad ogni nome corrisponda un singolo byte. Infatti, l'articolo di "swamp", che è il terzo nome della lista, viene attribuito alla posizione 0x1404 dal programma Avatarkus. In realtà, però, anche le posizioni 0x1402 e 0x1403 corrispondono a "swamp" perché questo oggetto prevede tre tile differenti. La comprova è data dall'articolo di "carpet", il tappeto del castello. Questo oggetto, visto con l'U6Edit, ha 18 tile differenti e nel file TILEFLAG ci sono effettivamente 18 byte (blocco 0x1850-0x1861). Cambiando l'articolo con Avatarkus viene modificato solo l'ultimo byte e nel gioco non cambia nulla, ma cambiando manualmente il terzultimo, che seguendo la logica dovrebbe corrispondere al tile con il simbolo viola, il gioco mi visualizza il nuovo articolo. Anche per "swamp" il funzionamento è lo stesso. Ciò vuol dire che in questo momento Avatarkus è utile per capire l'abbinamento articolo-nome e per gli oggetti con più tile si devono modificare manualmente i byte precedenti sino all'oggetto precedente. A questo punto questo problema dovrebbe essere risolto, si tratta di capire come sfruttarlo per la traduzione italiana. Sabato scorso ho scritto le due possibili soluzioni, ma forse ce n'è una terza. L'idea è di lasciare gli oggetti senza articolo così come sono, inserire l'articolo davanti al nome direttamente nel file LOOK.LZD per gli oggetti con l'articolo determinativo, mentre per quelli con l'articolo indeterminativo procedere lasciando il nome senza articolo e abbinare l'articolo corretto nel file TILEFLAG. Ovviamente questo implica che nel file GAME.EXE debba modificare "a", "an" e "the" con degli articoli indeterminativi e sto pensando di mettere "un" per i maschili e "una" per i femminili accettando il fatto di veder scritto "un scudo" anziché "uno scudo" o "una ascia" anziché "un'ascia". Sperimenterò strada facendo. C'è un'altra cosa su cui far attenzione. Questi byte non contengono solo l'articolo dell'oggetto, ma anche altre informazioni (SkaZz mi ha indicato un link del progetto Nuvie dove lo spiegano). Di conseguenza non sempre compaiono i numeri "00", "40", "80" o "C0", ma possono esserci delle varianti tipo, nel caso del tappeto, "60" al posto di "40". La spiegazione si ottiene convertendo il numero da esadecimale a binario. Ogni tile ha delle caratteristiche che possono essere attive o meno (da qui il nome TILEFLAG). Un byte espresso in esadecimale corrisponde a 256 possibili combinazioni (da 00 a FF) e quindi a un numero binario a 8 cifre. Leggendo il file "tileflag.txt" si possono scoprire queste informazioni e capire il tipo di caratteristiche che ha una particolare tile. Riprendendo l'esempio del tappeto, la casella centrale non ha il valore "40", ma il valore "60". In binario il valore "40" è uguale a "01000000" mentre "60" è uguale a "01100000". I primi due bit corrispondono all'articolo e infatti sono identici, mentre il terzo bit identifica se la tile è parzialmente invisibile (0) o meno (1). In questo caso essendoci il valore "1" indica che non è parzialmente visibile e ha una sua logica in quanto è la casella centrale del tappeto. Le altre che rappresentano i bordi sono impostate a "0" perché intorno può esserci il pavimento. Di conseguenza per modificare l'articolo lasciando inalterate le altre caratteristiche può essere una buona pratica quella di convertire il numero da esadecimale a binario, modificare i primi due bit e riconvertire il numero in esadecimale. Il nostro "60" può così diventare "E0". Per chi vuole approfondire ulteriormente il discorso il file "tileflag_data.txt" contiene tutti i numeri binari di ogni singola tile.
Dopo aver completato i dialoghi di Iolo e Lord British, ho deciso di dedicare un po' della mia attenzione al discorso nomi degli oggetti e articoli connessi. Partendo dal file "tileflag_data.txt" ho creato uno schema con la traduzione italiana della tile, l'offset del file TILEFLAG, il valore esadecimale originario e quello modificato. Ora che ho tutta la mappatura del file posso iniziare a sperimentare quanto scritto sabato scorso. L'uso dell'articolo indeterminativo funziona bene e mantiene l'impostazione originaria del gioco. Il problema eventualmente si può presentare con l'articolo determinativo. A questo è utile capire quanti sono gli oggetti che ne fanno uso. Applicando un filtro al valore binario per trovare i valori che iniziano con "11" scopro che sono molto pochi e probabilmente inserire l'articolo davanti al nome dell'oggetto non dovrebbe incidere negativamente né sulla scorrevolezza del testo né sulle azioni connesse all'oggetto stesso. Anche quelli senza articolo sono pochi. Comunque vanno ragionati singolarmente anche perché stranamente un elemento come "wall" ("muro") esiste sia con l'articolo indeterminativo che senza e dovrò capirne la differenza.
Una brutta sorpresa mi ha colto impreparato questa sera. Dopo aver convertito in italiano gli ultimi oggetti della sala del trono e i dialoghi di Nystul, mi sono accorto di una strana anomalia del U6Edit. Cancellando il file "u6edit.sav" e ricaricando i dialoghi già tradotti, il programma oltre ad accorciare le stringhe (operazione che non comporta nessun problema dato che vengono aggiunte le parentesi quadre automaticamente) mi ha cancellato tutti i caratteri "|" che nel mio caso corrispondono alla "é" inserendo la funzione "asm();" e il commento "// Invalid instruction". Dopo vari ragionamenti, varie prove, e un confronto con i file di SkaZz e Sir John ho deciso di usare la "(" sperando che non debba mai usare le parentesi tonde nel gioco.
Uno dei personaggi più complessi di tutto il gioco mi attende... Chuckles, il giullare di corte. Questo nome potrebbe dare l'impressione di non essere stato messo a caso, il termine infatti significa sogghigno. In un primo momento avevo pensato di italianizzarlo in Ridolini in omaggio al comico del cinema muto Larry Semon, ma poi analizzando meglio non è giusto. Infatti la controparte reale di Chuckles è Chuck Bueche, un amico di scuola di Richard Garriott e uno dei fondatori originali della Origin Systems. Quindi rimarrà Chuckles. Ce la farò a mantenere la sua vena canzonatoria nella traduzione? Riuscirò a convertire le rime inglesi e la musicalità delle frasi nella nostra lingua? Dopo un'intera giornata di lavoro penso di aver ottenuto un buon risultato. C'era qualche doppiosenso e alcune rime, ma ce l'ho fatta. Spero di aver centrato il bersaglio. Non mi manca molto per finire il castello di Lord British.
Questo gioco non finisce mai di stupirmi. Richard Garriott è decisamente un maestro nello sviluppare videogiochi. Ho scoperto che la storia di "Hubert the Lion" che piace tanto a Lord British esiste veramente. E' un libro illustrato per bamibini scritto nel 1959 da Bill Peet e il suo titolo originale è "Hubert's Hair-Raising Adventure" come riportato nel libro presente nella stanza di Sua Meastà. E pure questo è scritto in rima. Sarà molto dura tradurne le prime righe dato che non esiste in italiano. E soprattutto dovrò stare molto attento perché in questo gioiello della storia videoludica ce ne sono molte di cose simili.
Giornata iniziata con il proseguimento della traduzione dei nomi degli oggetti, ma conclusa con un approfondimento generale inerente la complessità del mondo di gioco. Per riuscire a rendere in italiano la magnificenza di questa perla videoludica dovrò con piacere ricorrere spesso al Compendium e al Cluebook oltre alle innumerevoli risorse pubblicate su The Codex of Ultima Wisdom. Mi sono divertito molto a scoprire la filosofia delle virtù, la scrittura runica e gargoyle, l'ispirazione delle musiche ("Stones", "Rule Britannia" e "Audchar Gargl Zenmur" su tutte!) e tanto altro. Non è escluso che in futuro possa inserire delle sezioni dedicate a questo meraviglioso mondo parallelo. Giusto per assaggio:
AMO QUESTO GIOCO MA QUESTA PAROLA NON RENDE GIUSTIZIA ALLA SUA MAGNIFICENZA
amo questo gioco ma questa parola non rende giustizia alla sua magnificenza
E se proprio non vi accontentate ecco come verrebbe scritto in ophidian (da Ultima VII parte 2)
amp questp gipcp ma questa oarpla npn rende giustizia alla sua magnificenza
Finalmente! Tutti gli elementi della mappa sono in italiano! E ora è il momento di insegnare la nostra lingua a tutti i personaggi e convertire tutti le opere scritte.
Oggi ci tengo a precisare due punti.
Primo: l'editor delle conversazioni è in grado di creare delle frasi personalizzate in base al sesso del personaggio. Ho deciso quindi di sfruttarne la potenzialità per rendere i dialoghi più reali e fornire ai giocatori il massimo senso di interpretazione.
Secondo: viste la difficoltà di tradurre degnamente alcune stringhe del file GAME.EXE ho pensato alla possibilità di sfruttare Nuvie per ovviare ai problemi. Ho analizzato i file *.lua per capire se ho spazio di manovra, ma solo alcune stringhe sono visibili. Allora ho deciso di contattare il coordinatore del progetto, Eric Fry, per capire dove sono le stringhe mancanti. Come sospettavo varie componenti sono inserite nei file *.cpp che poi vengono compilati. L'idea di Eric è di creare un sistema multilingua che permetta di rendere flessibili i file e agevolare così la traduzione dei testi in-game. Seguirò gli sviluppi per poi decidere il da farsi.
Piccola, ma importante, nota tecnica. L'editor dei dialoghi non permette di inserire degli if
nidificati e quindi nel caso in cui si presenti la necessità si deve creare un JUMP
ad un nuovo L
che gestisca lo script condizionale interno. L'ho scoperto traducendo le frasi di Terri e inserendo i testi differenziati per maschi e femmine all'interno della condizione if (flag(SELF,F_MET))
.
Pur avendo i suoi limiti, l'editor dei dialoghi permette di creare condizioni di conversazione abbastanza complesse. Il converse
iniziale di Peyton in inglese non era molto complesso pur distinguendo tra plurale e singolare perché la distinzione tra maschile e femminile non c'era e per creare il plurale è stato sufficiente aggiungere una "s" finale ai sostantivi. Per rendere lo stesso effetto in italiano ho dovuto creare un if
iniziale per distinguere tra plurale e singolare, un altro if
per differenziare maschile e femminile e quindi in totale quattro più uno L
di cui l'ultimo che punta a L1
per non bloccare tutto in loop.
Tabella conversione caratteri
dec | hex | ascii | nuovo |
---|---|---|---|
40 | 28 | ( | é |
43 | 2B | + | è |
59 | 3B | ; | ì |
61 | 3D | = | ò |
91 | 5B | [ | ù |
93 | 5D | ] | È |
95 | 5F | _ | à |
I ferri del mestiere
Di seguito elenco i programmi che sto utilizzando per la traduzione. Se volete, potete scaricarli da qui.
strumento | autore | utilizzo |
---|---|---|
U6Edit | Paul Gilbert | Traduzione dialoghi, libri, segnaletiche, tombe, quadri |
Avatarkus | Miguel Rodríguez (SkaZZ) | Traduzione libri, segnaletiche, tombe, quadri (in alternativa a U6Edit). Decodifica, traduzione e codifica nomi degli oggetti. |
YY-CHR 0.99 | YY | Modifica caratteri ASCII |
HxD | Maël Hörz | Traduzione file eseguibili e modifica file TILEFLAG |
Work in progress
Nella tabella che segue evidenzio lo stato di avanzamento dei lavori.
fase di lavoro | progresso | file |
---|---|---|
Creazione lettere accentate | U6.CH | |
Traduzione sequenza di apertura, introduzione e creazione del personaggio | U.EXE | |
Traduzione dialoghi | CONVERSE.A, CONVERSE.B | |
Traduzione libri e segnaletiche | BOOK.DAT | |
Traduzione nomi degli oggetti | LOOK.LZD | |
Modifica articoli degli oggetti | TILEFLAG | |
Traduzione interfaccia, comandi, azioni di gioco | GAME.EXE | |
Traduzione sequenza di chiusura | END.EXE |