Information for Translating Final Fantasy II

Version 0.06 Released January 2541. (1998)
By Joke

This page describe all information needed to translate Final Fantasy II (US version which is (almost) equivalent to Final Fantasy IV Japanese version) to other language (than English).

Some part of this information may be able to apply to Japanese version of Final Fantasy IV.

I released the first version early September. The document is far from complete, but I will continuously update it along with my FF4 Thai translation.

Content

Introduction.

Translating game is a chalanging work. Most of translating projects are translating Japanese-only game to English. However, this page was built to provide *all* needed information for translating Final Fantasy II (US) to other language than English.

Current know FF2 translation project are Spanish translation and Thai translation.

You may want to read basic concept on translating game ROM. These are some useful links.

Essential Tools.

You must have some good tools to translate the game. Ranging from hex editor to tile editor (font editor) to word finder to special code editor, etc.

These are the tools I use.

Other useful tools. Note! All ROM addresses mentioned in this document includes 512 (0200h) bytes header. This mean the ROM size must be 1,049,088 bytes.

Font.

The font in FF2 is 8x8 font and located at 057200h (include 0200h bytes header.) There are English characters, digits, marks, symbols and borders. However, there are quite a lot of free tiles.


Figure 1. FF2 font table. The tile No. 8Ah - BFh and CAh - F6h are free (letter v, w, H, ... and v at bottom are not used.)

Code.

Unfortunately, the code used in FF2 is not ASCII. It is propritary code. From figure 1, capital letter A - Z are located at 42h - 5Bh, lower letter a - z are located at 5Ch - 75h. Digit 0 - 9 are located at 80h - 89h. Finally, some mark are located at C0h - C9h.

For example, the word 'Hello.' will be kept in ROM as 49h 60h 67h 67h 6Ah C1h.

Dual-tile encoding.

Most story texts in FF2 are kept compressed. They are encoded with simple algorithm 'Dual-tile encoding'. Square select most frequency used two-character such as 'th', 'at', 're', etc. and use single byte to represent these two-character set. For example, 8Ch is used to keep 'th' and 8Dh is used to keep 'he'.

80h090h aA0hyoB0henC0h'D0hetE0hotF0hge
81h191hs A1h yB1hedC1h.D1hleE1hbeF1h n
82h292herA2h iB2hhiC2h-D2hf E2helF2hee
83h393hinA3halB3horC3h_D3h gE3homF3hwi
84h494hreA4harB4h, C4h!D4hesE4h'sF4h M
85h595hd A5h hB5hI C5h?D5hroE5hilF5hke
86h696hanA6hr B6hu C6h%D6hneE6hdeF6hwe
87h797h oA7h sB7hmeC7h/D7hryE7hghF7h p
88h898honA8hatB8htaC8h:D8h lE8hayF8hig
89h999hstA9hn B9h bC9h,D9husE9hntF9hys
8Ahe 9Ah wAAh cBAh ICAh fDAhnoEAhWhFAh B
8Bh t9Bho ABhngBBhteCBh dDBhutEBhYoFBham
8Chth9Ch mAChveBChofCChowDChcaEChwaFChld
8Dhhe9DhhaADhllBDheaCDhseDDhasEDhooFDh W
8Eht 9EhtoAEhy BEhurCEh  DEhThEEhWeFEhla
8Fhou9FhisAFhndBFhl CFhitDFhaiEFhg FFh 
Table 1. Dual-tile encoding table. (Green values are not encoded. They are shown as single tile.)

There are a lot of free space in character table to do this. Square use data from 8Ah to BFh and CAh to FEh to keep these two-character.

For example, the word 'thank' can be kept in ROM as 8Ch 96h 66h. This can save two bytes. Imagin that there are tens of kilobyte of text, thus dual-tile encoding can save a lot of space.

The decoding can be disable so you will see actual data instead of two character it represent. For example, you will see the tile 8Ch instead of letters 'th' in above example. You can change the font so you will know that the tile 8Ch is displayed.

To disable the decoding, change the byte 003472h in ROM image from 8Ah to FFh.

Texts Address.

There are a lot of text in the game, character names, items, magics, etc. They are located in groups and thus translating them is easy. However, curtain text are encoded with dual-tile encoding. Most of story text and conversation do, also some of message dialogs.

Text in FF2 can be divided into 2 groups, series of constant length text and variable length text. First group consists of character names, jobs, items, monster and called monster. Second group can be devided into 2 types, story text and other text. Story text is big issue so I will discuss it in next section.

All constant length text are kept unencoded. Most story text are kept encoded and some of other text does.

Constant Length Texts

Constant length texts are kept in series. Table 2 shows start address of each series, size of each item and number of items in series.

TextsStart AddrSizeNumber
Character Names07A910h06h000Eh
Jobs07A964h07h000Eh
Items078200h09h0100h
Magic078B00h06h0048h
Monster071A00h08h00E0h
Called Monster078CB0h08h0068h
Table 2. Constant length text

Variable Length Texts

Option Screen

All texts in option screen except the word Level are kept unencoded. Search for them strightforwardly.

Story Text.

Stories are kept at various address in the ROM. It is impossible to list all of them here. Just search it by using Hex Editor. Or you can wait me to release my searching tool. (I can't guarantee when will it be released!)

If you decide to search, make sure that you have disabled the dual-tile encoding. Or you won't found them.

There are a lot of code used in story text. For example, the code 01h means new line marker, the code 09h means one blank line, etc. Table 3 shows known codes.

CodeMeaning
00hEnd of message marker
01hEnd of line marker
02hUnknown
03h XXhSound Effect (To be explain.)
04h XXhCharacter name. See Characters subsection below.
05hUnknown
06h XXhSome constant used in status box (at the top of screen in fighting screen.) For example, 'Learn xxx', 'Receive xxx GP', etc. (To be explain.)
07hUnknown
08hUnknown
09hOne blank line. Use more than one of 01h to put more than one blank line won't work. You can put 01h at the first position to advance to new line. But next blank line, you need 09h.
Table 3. Story codes.

Characters Due to the fact that player can change character's name. The name mentioned in any text was kept as a code. For example, Cecil's name was kept as 04h 00h. This 2 bytes code represents Cecil's name (whatever his name is.)

NameCodeNameCode
Cecil04h 00hPalom04h 07h
Kain04h 01hPorom04h 08h
Rydia04h 02hCid04h 09h
Tellah04h 03hEdge04h 0Ah
Edward04h 04hFuSoYa04h 0Bh
Rosa04h 05hGolbez04h 0Ch
Yang04h 06hAnna04h 0Dh
Table 4. Character's name encoding

For example, the text 49h 64h C4h FFh 04h 00h C1h represents "Hi! Cecil."

Level, Parry and Change.

The word 'Level' in option screen and 'Parry' and 'Change' in fighting screen are very annoying. How hard method square use to keep easy word! I found that the word 'Parry' is kept as 'Pary' and the word 'Change' is kept as 'Chnge'. 'Pary' is kept at 0B7D90h and 'Chnge' is kept at 0B7D94h

When the word will be displayed, the game insert third letter of 'Pary' (r) at forth position. Thus makes the word 'Parry'! The bad thing goes worse, the game use second letter of word 'Pary' inserts at third position of 'Chnge'. And... Haleluya! We get 'Change'!

I will work to disable those insertions. But as I know *very* little about 65816 assembly, don't expect it will be solve soon. (It may not be solved by me at all.)

I still don't know about the word 'Level'. :-(

Legal Note.

jmeam@geocities.com
28/02/2541 (1998)