Skip to content

Latest commit

 

History

History
157 lines (119 loc) · 5.72 KB

File metadata and controls

157 lines (119 loc) · 5.72 KB

06 - Text and localisation

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.

The shape of an Int file

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.

Control codes

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 encoding is code page 437

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.

Except in German levels 2 and 5

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.

The verb bar

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.

The front end

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).

The password system

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.