Every level ships its dialogue three times: L?_Int_E.cru, L?_Int_F.cru,
L?_Int_G.cru -- English, French, German. Thirty-three files, all unpacking to
exactly 81,920 bytes, 2.7 MB of text and portrait art between them. That is
26 % of everything on the disc, and the largest single category after the
level tile banks.
0x0000 a short table of (u32 offset, u16 count) records
... planar graphics -- the talking-head portraits for this level
... script bytecode, dense with 16-bit file offsets
... one contiguous block of dialogue
(end) zero padding out to 81,920
The dialogue block for a given level starts at the same offset in all three languages and holds the same number of strings:
| Level | Dialogue at | Strings |
|---|---|---|
| L1 | 0x0541A | 30 |
| L2 | 0x0B938 | 156 |
| L3 | 0x0C9ED | 37 |
| L5 | 0x0B1C4 | 93 |
| L6 | 0x129AC | 14 |
| L7 | 0x12B55 | 13 |
| L8 | 0x0116B | 17 |
| L9 | 0x12D94 | 16 |
| La | 0x128AB | 10 |
| Lb | 0x12D87 | 14 |
| Lc | 0x024BC | 9 |
That is not a coincidence: the three files are identical from byte 0 up to
within a few hundred bytes of the text block. For L1 the first difference
between the English and the French file is at 0x52BC, 350 bytes before the
text begins, and the English and German files diverge at exactly the same
place. Everything before it -- the portraits, the script -- is one shared
build; what differs is the run of 16-bit string pointers embedded in the
script, which have to move because French sentences are longer than English
ones.
So the localisation model is: assemble the level once, then produce three files that differ only in the string table and the text.
Level 2 -- the village -- carries 156 of the 409 strings on the disc. Levels 6, 7, 9, a and b have barely a dozen each, most of them the generic "you cannot read this" responses. The game front-loads its talking.
Strings are separated by 0xFF. Inside a string:
| Byte | Meaning |
|---|---|
0xFF |
end of string |
0xFE |
line break |
0xFC |
wait for the player, then continue on a fresh page |
0xFD |
substitute the name the player entered at the start of the game |
0xFD is the reason the front end asks for a name. In use:
Hello, and who are you?
<page>..... ..... .....<page>I must say<name>you look very adventurous, I wonder if you can help me, I seem to be missing the final ingredient for my broth.
The accented characters are single bytes above 0x7F, and they are IBM
CP437 -- the DOS PC set -- not the Amiga's own Latin-1 (ECMA-94):
0x80 Ç 0x82 é 0x83 â 0x85 à 0x87 ç 0x88 ê 0x8A è 0x8C î
0x90 É 0x93 ô 0x96 û 0x97 ù (French)
0x81 ü 0x84 ä 0x8E Ä 0x94 ö 0x9A Ü 0xE1 ß (German)
On an Amiga, é is 0xE9 and ü is 0xFC. These are the PC values. The
localised text was written on a PC and carried across as bytes.
Nine of the eleven German files use the table above. L2_Int_G and L5_Int_G
do not:
| File | ü | ä | ö | ß |
|---|---|---|---|---|
| the other nine | 0x81 |
0x84 |
0x94 |
0xE1 |
L2_Int_G, L5_Int_G |
0x8F |
0xA5 |
0x8C |
0xE1 |
ß stays where it was; the three umlauts move. In CP437 the replacement codes
are Å, Ñ and î, so decoding those two files with the code page that works
everywhere else turns Holztür into HolztÅr and Händler into HÑndler.
A handful of correctly-encoded umlauts survive inside both files (L2_Int_G
has two 0x84 and one 0x94 among 143 of the odd ones), so the two encodings
are mixed within a single file.
Levels 2 and 5 are the two biggest German text files on the disc. Whether the game's font carries duplicate umlaut glyphs at both sets of codes -- and so whether a German player ever saw the difference -- is an open question.
Lx_ReloD carries the interaction UI, three languages, 0xFE-separated the
same way the dialogue is:
TALK USE EXAMINE EXIT
PARLER UTILISER EXAMINER QUITTER
ANSPRECHEN BENUTZEN UNTERSUCHEN VERLASSEN
Select item to use. Select item to examine.
Sélectionnez l'objet à utiliser. Sélectionnez l'objet à examiner.
Gegenstand zum Benutzen wählen. Gegenstand zum Untersuchen wählen.
Four verbs. That, plus a cursor, is the whole interface.
Lx_TPage holds the title screen and its menus, again in three languages:
START NEW GAME RESTORE GAME
COMMENCER À NOUVEAU JEU RESTAURER À JEU
NEUES SPIEL STARTEN SPIEL WIEDER AUFNEHMEN
ONCE UPON A TIME.... IL ÉTAIT UNE FOIS... ES WAR EINMAL...
PRESS FIRE TO SELECT FORM...
APPUYEZ SUR FEU POUR SÉLECTIONNER SEXE
FEUER DRÜCKEN, UM FORM ZU WÄHLEN....
PLEASE ENTER YOUR NAME PLEASE ENTER YOUR PASSWORD INCORRECT PASSWORD
The English is coy -- "select form" -- where the French says plainly
sélectionner sexe. What is being chosen is the hero's sex, which is why the
disc carries Lx_MSprM.cru and Lx_MSprF.cru (identical 67,840-byte sprite
banks for the male and female hero) and Lx_SFX_M.bin and Lx_SFX_F.bin
(identical 6,144-byte sample banks for his and her voice).
There is no save file and no NVRAM use. Progress is a password, and the
alphabet is spelled out in Lx_TPage at offset 0x13DE:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-
Exactly 64 characters -- 6 bits each. The + and - at the end are the
giveaway: this is a base-64 alphabet, and a password is a bit field printed six
bits at a time. The name-entry alphabet next to it is only A-Z.