Voglio solo dare due specifiche due relative al programma per estrarre le parti testuali(ma non solo) che ho pubblicato l’altro giorno (extracthag.exe).
EXTRACTHAG accetta al momento come unico parametro il suffisso “L“, che sta per List. In questo modo verrà data a video la lista dei(l) file contenuti nel file *.HAG specificato. Tipicamente il comando tipo è: extracthag [L] nomefile.HAG [nomefile.ext] , dove <nomefile.ext> è un qualsiasi file contenuto nel file di risorse <nomefile.HAG>.
Digitando <extracthag L global.hag>, ad esempio, otterrete la lista di tutti i file impaccati dentro a global.hag. Digitando invece<extracthag global.hag>, il programma estrarrà e, se del caso, decomprimerà, automaticamente tutti i file contenenti testo (descrizioni, eventuali parti di dialoghi, messaggi di errore e non da inviare a video, i credits).
Messages.dat
In particolare, il file MESSAGES.DAT riporta tutte le frasi relative all’ambiente e agli oggetti ognuna compressa con una variante dell’algoritmo di Fabrice Bellard usato in UNLZEXE, un vecchio compressore per eseguibili degli anni ’80-’90. All’inizio del file è presente l’indicazione del numero di frasi, espressa come word [Notazione: ai fini di questa documentazione, senza entrare in merito alle differenze tra le diverse notazioni per le variabili tra C, Pascal ed altri linguaggi, “byte”, “word”, “integer”, saranno sempre numero esadecimale rispettivamente di un byte, di un word (due byte), di un dword (quattro byte) non segnati se non altrimenti specificato, espressi in little endian, ossia da destra verso sinistra (p.e. “ABCD” è il valore esadecimale CDAB, e “01234567” è il valore 67452301) .], e di seguito una tabella avente tanti record quante sono le frasi.
Più esattamente, si avrà il seguente tracciato:
Tracciato di Messages.dat:
Nfrasi: word;
Progressivo(1): integer;
Inizio_frase(1): integer;
Lungh_frase(1): word;
Progressivo(2): integer;
Inizio_frase(2): integer;
Lungh_frase(2): word;
…..
…..
Progressivo(Nfrasi): integer;
Inizio_frase(Nfrasi): integer;
Lungh_frase(Nfrasi): word.
dove: Progressivo(i) è un progressivo che numera l’i-esima frase, Inizio_frase(i) è l’indirizzo assoluto, relativamente al file messages.dat, della i-esima frase, e Lungh_frase è la lunghezza in byte della i-esima frase decompressa.
Di seguito alla tabella, vengono elencate sino alla fine del file tutte le frasi in formato compresso.
L’inizio di ogni frase è facilmente riconoscibile dal prefisso “FAB”+x0C (cioè la stringa “FAB” seguita da un byte di valore 12 esadecimale). Il programma decomprime tutte queste frasi in chiaro nel file MESSAGES.DAT.TXT. Alcune frasi, rivelano una struttura generalizzata, per potersi adattare a più oggetti, orientata alla grammatica della lingua, ad esempio la seguente:
[width28][y5][noun2:custom:The:The:The:::The:The:The] [noun2]§[noun2:custom:is:are:is:is:is:is:is:is] hardly§threatening you enough to warrant using your§special magical defense on [noun2:custom:it:them:it:him:her:it:him:her].§
Come si può vedere, le istruzioni destinate al motore del gioco sono tra parentesi: subito all’inizio c’è l’indicazione sulla larghezza in caratteri e la posizione della finestra a video che dovrà accogliere il testo. Questi parametri devono essere lasciati inalterati, pena risultati inaspettati in esecuzione. <noun2> è una variabile passata dall’interfaccia che accoglie un qualsiasi nome di oggetto censito, sembrerebbe di capire che l’interfaccia concorda di conseguenza gli articoli e i pronomi secondo il genere ed il numero. Ho evidenziato alcuni caratteri speciali §: si tratta di punti dove era presente un “low value” (zero esadecimale).
L’algoritmo che estrae tali testi sostituisce ad ogni low-value il carattere §, sia per facilitare la manipolazione della stringa, sia per evitare ogni possibile confusione con caratteri blank. E’ bene, in fase di traduzione, non cancellare tali caratteri che, in fase di reinserimento nelle risorse del gioco, verranno ritrasformati in low-value.
Vocab.db , Vocabh.db (& Vocab.dat)
Questi due file, testuali, contengono la dicitura rispettivamente, a) degli oggetti/hotspot gestiti dall’interfaccia (oggetti d’inventario, luoghi, personaggi, e quant’altro produca una scritta a fronte della loro selezione sul video) e b) dei verbi/azione nel menu dell’interfaccia.
I nomi sono elencati in chiaro, in colonna, con carriage return a separarli.
Il file Vocab.dat, sembra essere il file realmente caricato in runtime ed appare come un merge dei due suddetti file, in cui però ogni verbo/nome è separato da ciascun precedente/successore da un low-value.
Particolare attenzione va posta nell’editare i verbi del menu del parser, giacché si rischia di incorrere nella sovrapposizione a video di due verbi della stessa riga su colonne contigue.
*.cnv & *.cnd
Il programma di estrazione extracthag.exe può estrarre i file *cnv che, almeno in Dragonsphere (non mi risulta in Rex Nebular, e non ho controllato in Return of the Phantom) contengono le frasi dei dialoghi.
File dei font (*.FF)
Questi file, estraibili anch’essi attraverso il programma extracthag.exe, hanno una struttura abbastanza elementare (che però mi ha fatto perdere un mese per essere completamente decifrata):
Numero max in pixel altezza carattere: byte;
Numero max in pixel larghezza carattere: byte;
Tab_width: array[1..128] of byte (è una tabella contenente la larghezza di ciascun carattere);
Tab_addr: array[1..128] of word (è una tabella contenente l’indirizzo dei dati relativi a ciascun carattere);
Dati relativi a ciascun carattere, di lunghezza variabile.
Questi ultimi hanno come elemento la coppia di bit: i glifi sono a quattro colori, quindi la larghezza di ogni carattere va moltiplicata per due per poter leggere (in bit) un’intera riga.
Vi sono alcuni caratteri (“<“, “>”, “#”, “$”, “%”, “&”) che, non essendo utilizzati nei testi, possono sicuramente essere sostitutiti con i glifi dei caratteri “locali”, nel caso della lingua italiana “è”, “é”, “ì”, “à”, “ò”, “ù”. Ciò crea dunque un ulteriore di livello di complessità nel progettare il codice del programma di traduzione, dal momento che il set di caratteri transcodificabili dovrà essere gestito dal programma di editazione dei font, e poi gestito dal programma di editing dei testi per la necessaria transcodifica.
Hi, I would like to ask you, if you could me help with re-import your file messages.dat.txt back to messages.dat? I can not figure out the correct algorithm Thank you for answer. Jurgen.
I replied you to your email address. Alberto