Caesar II's text and help files
C2.ENG and HELP.ENG aren't text files in the ordinary sense. Every string is addressed by a (group, index) pair the game's own code compiles into, and a from-scratch reimplementation reproduces both files byte-for-byte in every language tested — which is why the model below can be stated as fact rather than read off a hex dump.
Used by Caesar II
C2.ENG holds every string in the game — menus, panels, in-game messages — addressed as (group, index): a call site reads as font_list(0x2f, 3, …) to mean "string 3 of group 0x2f", and there are 147 groups. HELP.ENG is addressed differently, by help page number, and each page carries a title string and a body string plus non-text fields — an illustration name, a voice-clip name, a sprite id, layout widths — that the port treats as language-neutral and compiles from the 1996 English file regardless of which language's text is active.
Both files are read into fixed buffers the engine never grows: a help page into 2,000 bytes, the whole of C2.ENG into 40,000. A translation that overflows either limit is rejected before it ships, not discovered by a player.
What the addressing scheme guarantees
- (group, index) for C2.ENG
- 147 groups; two of them, 117 and 118, deliberately share group 116's payload, and 120 shares 119's — the same string reused under more than one address rather than duplicated.
- (page, slot) for HELP.ENG
- Slot 0 is a page's title, slot 1 its body. A page that reuses another page's text stores the reference "@1234" instead of repeating it — the German translation uses this to link spare pages differently where a chapter ran long.
- In-body markup
- "$" is the engine's own line break; "#12text#" is a clickable link to help page 12, and both must survive translation unchanged.