RT2 - RText Localization File¶
 Applies to: GT4, GT5, GTPSP, GT6, GT7 ·  Extension: .rt2
RT2 Stands for RText 2 (Region Text 2?).
They are key-value dictionaries for localized text.
Editing¶
GT.RText by Razer2015 can be used to edit these files.
A C# library is also available - PDTools.RText by Nenkai
RT05 (RTextV5)¶
Applies to GT Sport, GT7 · Endian: Big (GT5/GT6) · Little (GT4, GT Sport, GT7)
Header¶
Size: 0x20
| Field | Offset | Type | Description | 
|---|---|---|---|
RT0x | 
0x00 | 
Int | 
Magic, (Enforced, cannot be different) | 
| Page Count | 0x04 | 
Int | 
Number of pages (categories) in the RText | 
| Unknown | 0x08 | 
Byte | 
This field is not read | 
| Relocation Pointer | 0x10 | 
Int | 
Relocation Pointer | 
| Padding | Until 0x20 | 
Byte | 
N/A | 
Page¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
| Page Name Pointer | 0x00 | 
Int | 
String Offset to Name (Zero-terminated) | 
| Pair Count | 0x04 | 
Int | 
Number of pairs in this category | 
| Empty | 0x08 | 
Int | 
N/A | 
| Pairs Pointer | 0x0C | 
Pair* | 
Offset to the pairs | 
Pair¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
| ID | 0x00 | 
UInt | 
String Offset to Name (Zero-terminated) | 
| Label Name Length | 0x04 | 
UShort | 
Length of the label string | 
| Value Name Length | 0x06 | 
UShort | 
Length of the value string | 
| Label String Pointer | 0x08 | 
char* | 
Offset to the key's encrypted label (Zero-terminated) | 
| Value String Pointer | 0x0C | 
char* | 
Offset to the key's encrypted value (Zero-terminated) | 
Encryption¶
The content is encrypted with Salsa20, use the following sample code to decrypt it:
static string Key = "majimenihataraiteimasu";
static byte[] Decrypt(byte[] encrypted, string key)
{
    if (encrypted.Length == 0)
        return encrypted;
    using (SymmetricAlgorithm salsa20 = new Salsa20SymmetricAlgorithm())
    {
        var dataKey = new byte[8];
        var keyBytes = Encoding.UTF8.GetBytes(key);
        byte[] decrypted = new byte[encrypted.Length];
        using (var decrypt = salsa20.CreateDecryptor(keyBytes, dataKey))
            decrypt.TransformBlock(encrypted, 0, encrypted.Length, decrypted, 0);
        return decrypted;
    }
}
[...]
Decrypt(..., Key);
RT04 (RTextV4)¶
Applies to GTPSP, GT5 · Endian: Big (GT5) · Little (GT4/GTPSP)
Header¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
RT04 | 
0x00 | 
Int | 
Magic, (Enforced, cannot be different) | 
| Relocation Pointer | 0x04 | 
Int | 
Relocation Pointer | 
| Empty | 0x08 | 
Int | 
N/A | 
| Page Count | 0x0C | 
Int | 
Number of pages (categories) in the RText | 
Page¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
| Page Name Pointer | 0x00 | 
Int | 
String Offset to Name (Zero-terminated) | 
| Pair Count | 0x04 | 
Int | 
Number of pairs in this category | 
| Pairs Pointer | 0x08 | 
Pair* | 
Offset to the pairs | 
| Padding | 0x0C | 
Int | 
Padding 5E 5E 5E 5E | 
Pair¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
| ID | 0x00 | 
UInt | 
ID | 
| Label String Pointer | 0x04 | 
char* | 
Offset to the key's label (Zero-terminated) | 
| Value String Pointer | 0x08 | 
char* | 
Offset to the key's value (Zero-terminated) | 
RT03 (RTextV3)¶
Applies to GT4 · Little (GT4/GTPSP)
RTextV3 did not have pair IDs.
Header¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
RT03 | 
0x00 | 
Int | 
Magic, (Enforced, cannot be different) | 
| Relocation Pointer | 0x04 | 
Int | 
Relocation Pointer | 
| Empty | 0x08 | 
Int | 
N/A | 
| Page Count | 0x0C | 
Int | 
Number of pages (categories) in the RText | 
Page¶
Size: 0x10
| Field | Offset | Type | Description | 
|---|---|---|---|
| Page Name Pointer | 0x00 | 
Int | 
String Offset to Name (Zero-terminated) | 
| Pair Count | 0x04 | 
Int | 
Number of pairs in this category | 
| Pairs Pointer | 0x08 | 
Pair* | 
Offset to the pairs | 
| Padding | 0x0C | 
Int | 
Padding 5E 5E 5E 5E | 
Pair¶
Size: 0x08
| Field | Offset | Type | Description | 
|---|---|---|---|
| Label String Pointer | 0x00 | 
char* | 
Offset to the key's label (Zero-terminated) | 
| Value String Pointer | 0x04 | 
char* | 
Offset to the key's value (Zero-terminated) | 
Notes¶
All games after GT4 have backwards compatibility with RTextV3 and RTextV4. Endianess will depend of the current platform.
The string table must be properly ordered alphanumerically as the game uses binary searching.
String/Data alignment is 0x04.