Skip to content

Localization packages

AnvilGameplay dataApplies toSWS

The game’s text is in LocalizationPackage objects (0x6E3C9C6F, the CRC-32 of the class name). The English package is entry 10 of DataPC.forge in the base install and entry 26 holds the manual text; the Russian-language copy of the data examined carries its own language’s packages instead. Observed · SWS

In the Russian copy (the patched copy on the game’s page) the text is in three packages named for the language: the name records of DataPC.forge hold LocalizationPackage_Russian, LocalizationPackage_Russian_Subtitles and LocalizationPackage_Russian_eManual, and no forge of that copy holds another language’s text. The text a copy can show is therefore the language its data was released in. Spoken audio is not limited the same way: that copy also carries the streamed-sound forges of six languages (see the game’s files). Observed · the patched copy, which is Russian

The package follows the layout of the Assassin’s Creed II generation. Unlike the rest of the game’s data its indexed text block is big-endian, starting at body offset 73. Observed

IndexedData (big-endian)variableSWS100% known

Big-endian. Offsets inside the table entries are relative to the start of this block.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x02u16 = 254MaxIndexSizeObserved
0x22u16 = 589fragment count nObserved
0x44nu16[2][n]fragmentsObservedper fragment a right word then a left word
4+4n2u16table count tObserved
6+4n12tu32[3][t]tablesObservedper table: first string id, offset of its string data, offset of its end-offset list

A fragment whose left word is 0 is the UTF-16 character in its right word (or empty when both are 0); any other fragment is the text of fragment left followed by the text of fragment right, so the fragments form a pair-compression tree. A table’s end-offset list is a u16 count, the end of the first string, then count pairs of a u16 id step and a u16 end offset. A string is the concatenation of fragments coded in its data one to three bytes at a time: a byte below MaxIndexSize is fragment b + 1, the byte 255 is followed by a signed 16-bit index (fragment k + 1), and any other byte b with the next byte c is fragment (b·256 + c) − 254·255 + 1. Observed

Decoding the English package this way gives 1,040 strings, each with a numeric id, on the first attempt. Observed

The strings include the names of the city’s districts, sub-areas and monorail stations. Other data refers to them by id: the district and station tables in the Game Bootstrap entry hold string references and the worlds each district contains. See the levels of the game. Observed