ROM Hack Need Help: Chrono Trigger Translation

  • Thread starter Thread starter nIxx
  • Start date Start date
  • Views Views 23,123
  • Replies Replies 101
Really nice job with that font editor. However, I think the text program is broken or something. All I get is a small file with only a couple strings.

Anyway, is it supposed to dump only strings for a language or it dumps everything in the same file? Because I'm not sure you really need all the languages for every file.
 
Crosser said:
However, I think the text program is broken or something. All I get is a small file with only a couple strings.
Show them please.
I wrote tools based on the American version of the game. Here, two options: either to other structures of text files or need to create new encoding tables. Give me text files and the font, I see them.

QUOTE(Crosser @ Mar 2 2009, 10:20 PM) Anyway, is it supposed to dump only strings for a language or it dumps everything in the same file? Because I'm not sure you really need all the languages for every file.
Program dump only the first language. I can do to dump specified.

P.S. Sorry for my English.
 
HoRRoR_X said:
Give me text files and the font, I see them.I've used it on the files it's supposed to work with, with the tables you provided. American version here, nothing less, nothing more.

QUOTEProgram dump only the first language.
From what I could see, it dumped English. English is really the second language, while the first is Japanese (or it's supposed to be), and the fourth is French. Third is always dummied out. I guess it was meant to be some other language like German, but they didn't really include it and left empty strings instead.
 
To prevent the text extracted completely, big.tbl need to replace "02!=" to "02!=" ( I re-wrote the code and forgot to change the table under it).

The new version of the program. If the last parameter to specify the language ID, it will extract it.
 
QUOTE said:
To prevent the text extracted completely, big.tbl need to replace "02!=" to "02!=" ( I re-wrote the code and forgot to change the table under it).
Oops, I mean "02=\ 0" to "02=".
(The forum does not allow to write '\' and '0' together)
 
Fixing that entry in the table I get this error instead:
Code:
***WARNING: TGameText.LoadTable: Invalid table line: //.normal
***WARNING: TGameText.LoadTable: Invalid table line: //C696C69711={/PAUSE}\n--\n

battle.msg
Exception EAccessViolation in module ct.exe at 0001D1FF.
Access violation at address 0041D1FF in module 'ct.exe'. Read of address 00898000.

Anyway, let's forget for the moment about dumping/insertion and let's focus on something that has been bothering me for quite a long time: variable names. I'm not talking about expanding them up to 7 letters to make "Silbird" fit (the original name for Epoch/Ibis), but about the other issue with Chrono's "nick" and Marl's princess names. For the first one, the Japanese version takes the first two kana of his name, so ??? becomes ??, which would roughly correspond to "Chro". As for Marl's name, it takes the first 3 kana and adds the "dia" suffix, so you get ???+??? (Mar+dia).
Now for Chrono's name, using the default name and applying the Japanese rule we'd have "Ch", which looks just plain wrong. How would you do to reproduce the original effect, then? Adapt the Japanese code to be more "Occidental", which means that instead of the first 2 character you copy 4 to have "Chro" and reproduce the effect, or would you apply some other weird mechanism of transformation on the string? Take into account that this name is not used as a nick, even tho it's usually referred as such. It's just Eira's way to call Chrono, and it's also used once by Marl to indicate a pause in the speech (I believe it's when the royal guards take him away to the prisons). Think of it as "Chro... Chrono!".
As for Marl, her case is a little different, more or less. Her princess name is actually supposed to be "Mardia" in latin characters, to reflect some kind of joke with the word Gardia (please, let us forget of the wrong transliteration "Guardia", because even the French team got it correct), or maybe it's some way to put it as royal name; no clue here. I've seen the French version using a static version of this, but they "expanded" it to the whole name string, so she's called "Marledia" by her father and the whole castle. No idea how the hell anybody can pronounce the word "Marledia", considering the 'e' is completely mute, not to mention that her name is supposed to have no vowels at the end of it according to the official names. Speaking of static crap, the American version just goes for Nadia, which is the biggest problem I'm having with this, since it completely removes the joke with variable names. To make it brief, would you go for Mar+dia and just have the first 3 characters of her name? Any other suggestions?
 
o_O I will run without error... Extracted English text.

QUOTE said:
Oops, I mean "02=\ 0" to "02=".
Again wrong
frown.gif
"02!=\ 0" to "02!="... ('!' means that the stop data)

Translated into Russian, we have decided to ban the names input (that is, the game was only the original names, translated by us, the player could not use their), because in Russian different names in different cases are written in different ways (names characters occupy 2 bytes, but you can use single encoding, and even hold long names).
In your case I can try to add 2-3 characters, changing arm9 code. The basic code is packed, but the decompressor/compressor I already wrote.
 
To answer again to nIxx, I've got a formula to calculate the encoding for all symbols:
Code:
if(val>=0x80)
{
ÂÂÂÂdest[pos++]=((val&~0xF)>>6)+0xC0;
ÂÂÂÂdest[pos++]=(val&0x3F)|0x80;
}
// regular symbol
else
ÂÂÂÂdest[pos++]=(BYTE)val;
This way you don't need those stupid tables to try and guess how all symbols and tags have to be encoded. Just build an array with all the characters and let it search through that, then convert the index found with that piece of code and you have the actual binary. Example:
Code:
TCHAR table_ds[]=
{
ÂÂÂÂ_T("e ¶atorsniuldh.m")
ÂÂÂÂ_T("c¶pgvfy:bé'!,w-S")
ÂÂÂÂ_T("k?qCIMTAPLDzOBGR")
ÂÂÂÂ_T("FNjHEVWx?0JèàY¶1")
ÂÂÂÂ_T("ê2UKQ3)(/4â569Éô")
ÂÂÂÂ_T("Z87?ç+–î?\"_Xù??Â")
ÂÂÂÂ_T("%œ?û«»*°ÀÇ??²ï&?")
ÂÂÂÂ_T("¶=×ÊÔ¶¶Œ?›¶?íP§§")
ÂÂÂÂ_T("¶úVM¶#÷‹öLHN?¶¶³")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")ÂÂÂÂ
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("????????????????")ÂÂÂÂ
ÂÂÂÂ_T("?????×??????????")
ÂÂÂÂ_T("????????????????")
ÂÂÂÂ_T("´¡¿ÁÄÈËÌÍÎÏÑÒÓÖÙ")
ÂÂÂÂ_T("ÚÛÜßáäëìñòóü¶¶­®")
ÂÂÂÂ_T("™©$;@[\\]^`{|}~")
};

static int GetSymbol(TCHAR unicode)
{
ÂÂÂÂfor(int i=0; table_ds[i]!=0; i++) if(unicode==table_ds[i]) return i;
ÂÂÂÂreturn GetSymbol(_T('?'));
}

HoRRoR_X said:
o_O I will run without error... Extracted English text.Interesting format, but it's kinda hard to follow without some kind of editor to separate all the strings.

QUOTEIn your case I can try to add 2-3 characters, changing arm9 code.
Why would I need to add more characters? The question was entirely different. It was about Chrono's and Marl's name post-processing. Expansion is barely a problem.
 
@HoRRoR_X: Thank you espacially for the font editor
wink.gif


@Crosser: Nice thank you very much for this
wink.gif


PS: A beginner question
wink.gif

Is it very difficult to find such a decoding formula ?
I´ve never done something with decoding before
biggrin.gif
 
nIxx said:
PS: A beginner question
wink.gif

Is it very difficult to find such a decoding formula ?
Not if you can rely on this:
CODEROM:0203D858ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ LDRBÂÂÂÂR4, [R4,#1]ÂÂÂÂ; c2=data[i++]
ROM:0203D85CÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ MOVÂÂÂÂ R5, R2,LSL#27ÂÂ; c1
 
i'm analyzing the structure of chrono trigger rom and i found the pointer used by game to find the msg file in the cartridge (or rom).
we can change it and insert in empty space a bigger msg file.
this information is useful to make a tool to translating chrono trigger.
 
And what's the point of that...? Just rebuild the whole rom entirely or partially. Also, you can just dummy out the other languages, if you really don't want to regenerate a thing in the file structure.
 
SCVgeo said:
Mentz said:
I'm analysing the file structure...

4 byte: zero filled
4 byte: ascii "text"
4 byte: ???
4 byte: file length or end dialog
4:byte: end table pointer or start dialogs

someone knows how is used the "???" part ?
Maybe it's important on repointing the whole msg file...
The ??? part points to another text. Just try changing it to 0000 then 0100 for the tutorial, etc and you'll see.

Also this affects the lower screen.

So:

4 byte: Zero Filled
4 byte: TEXT
4 byte: text entry that bottom screen starts with
4 byte: File length
Then:
4 byte: Offset to delimiter of first entry
4 byte: Offset to beginning of text for first entry (the text entry ends when the delimiter is arrived at)
4 byte: Offset to delimiter of second entry
4 byte: Offset to beginning of text for second entry (the text entry ends when the delimiter is arrived at)
4 byte: Offset to delimiter of third entry
4 byte: Offset to beginning of text for third entry (the text entry ends when the delimiter is arrived at)
....

1 byte: Delimiter for first text entry
Variable bytes: First text entry
....

the ??? seem to be the bytes length from "File Length" to end of offset.
so

0000 TEXT ABCD EEEE
OFFSET
TEXT_ENTRY

ABCD is length from end of ABCD to end of OFFSET (B
 
It's something totally different. The first u16 value of that is the counter of strings for each text entry, or to make it easier to understand, it's the total of languages for the file. The u16 value right after it seems to be unused in game, like the depth index used in the font files.
 
if it is as you said, "4 byte: Offset to delimiter of first entry" is wrong.
Is it an offset to another language entry instead, and it is an empty entry.

however i tried to take it as i said and it is valid for ALL msg file.
 
Whivel said:
if it is as you said, "4 byte: Offset to delimiter of first entry" is wrong.
This is what I said:
CODEtypedef struct TOSE_TEXT
{
ÂÂÂÂu32 magic[2];
ÂÂÂÂu16 entries;
ÂÂÂÂu16 unknown;ÂÂÂÂ// unused
ÂÂÂÂu32 filesize;
} TOSE_TEXT;
What is called here the "Offset to delimiter of first entry" is nothing but a mere part of the pointer table to the strings, not a piece of the header structure.
 

Site & Scene News

Popular threads in this forum