Difference between revisions of "GXT"

From GTAMods Wiki
Jump to navigation Jump to search
(CRC32 Calculation)
Line 81: Line 81:
 
===CRC32 Calculation===
 
===CRC32 Calculation===
  
Here is a sample source which converts an CHAR[]-Array to an CRC32-polynom:
+
Here is a simple CRC32 calculation class written in C++:
 +
<source lang="cpp">class Checksum
 +
{
 +
private:
 +
unsigned int m_aiCalcTable[265] =
 +
{
 +
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
 +
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
 +
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
 +
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
 +
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
 +
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
 +
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
 +
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
 +
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
 +
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
 +
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
 +
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
 +
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
 +
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
 +
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
 +
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
 +
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
 +
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
 +
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
 +
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
 +
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
 +
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
 +
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
 +
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
 +
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
 +
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
 +
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
 +
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
 +
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
 +
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
 +
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
 +
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
 +
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
 +
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
 +
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
 +
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
 +
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
 +
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
 +
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
 +
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
 +
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
 +
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
 +
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
 +
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
 +
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
 +
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
 +
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
 +
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
 +
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
 +
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
 +
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
 +
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
 +
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
 +
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
 +
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
 +
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
 +
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
 +
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
 +
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
 +
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
 +
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
 +
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
 +
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
 +
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
 +
    };
  
private static ulong[] table = new ulong[] {
+
public:
            0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
+
static void generateChecksumFromString(std::string source, bool caseSensitive, unsigned int &checksum)
            0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
+
{
            0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+
checksum = 0xFFFFFFFF;
            0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
+
            0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
+
if(!caseSensitive)
            0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+
{
            0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
+
toUpperCase(source);
            0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
+
}
            0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+
 
            0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
+
for(unsigned int i = 0; i < source.size(); i++)
            0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
+
{
            0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+
checksum = m_aiCalcTable[(checksum ^ source[i]) & 0xFF] ^ ((checksum >> 8) & 0x00FFFFFF);
            0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
+
}
            0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
+
}
            0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+
};</source>
            0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
 
            0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
 
            0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
 
            0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
 
            0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
 
            0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
 
            0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
 
            0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
 
            0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
 
            0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
 
            0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
 
            0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
 
            0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
 
            0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
 
            0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
 
            0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
 
            0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
 
            0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
 
            0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
 
            0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
 
            0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
 
            0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
 
            0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
 
            0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
 
            0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
 
            0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
 
            0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
 
            0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
 
            0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
 
            0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
 
            0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
 
            0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
 
            0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
 
            0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
 
            0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
 
            0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
 
            0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
 
            0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
 
            0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
 
            0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
 
            0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
 
            0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
 
            0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
 
            0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
 
            0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
 
            0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
 
            0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
 
            0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
 
            0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
 
        };
 
 
        public static ulong StringToCRC32(char[] Value)
 
        {
 
            ulong CRC = 0xFFFFFFFF;     // Register Base-Value
 
 
            for (int i = 0; i < Value.Length; i++)
 
            {
 
                CRC = ((CRC & 0xFFFFFF00) / 0x100) & 0xFFFFFF ^ table[(ulong)Value[i] ^ CRC & 0xFF];
 
            }
 
            return CRC;
 
        }
 
(C#/C migration by [[User:Aschratt|Aschratt]])
 
  
 
It is impossible to get a string out of an CRC32-value. The game only checks if two values are identical. However this is not a very reliably way because there can be more than two CRC32 Values for one string. But the probability for this is not very high!
 
It is impossible to get a string out of an CRC32-value. The game only checks if two values are identical. However this is not a very reliably way because there can be more than two CRC32 Values for one string. But the probability for this is not very high!

Revision as of 12:05, 31 January 2009

A GXT file contains almost all text that are displayed on the screen of GTA2 and above. The files are located in the text folder. An entire list of all entries between GTA3 and VCS is available with Sanny Builder. A list for GTA4 is available here.

File Stub

Each GXT-File can contain certain tables with subtables and entries. The entries are stored in ASCII standart. Just some special characters got some different bitsets.

GTA San Andreas / GTA IV Format

Header

The header contains data about the tables and their subtables.

INT32   - 4b   - Version? (Always 0x080004)
CHAR[4] - 4b   - TABL

Table Block

The Table Block contains data about the subtables and their offsets.

INT32   - 4b   - Blocksize

//Array of [Blocksize / 12 Entries]
CHAR[8] - 8b   - Subtablename
INT32   - 4b   - Offset

The Offset of the subtable points to an 8-byte Char Array with the subtable's name, followed by TKEY. For the MAIN Table this points directly to TKEY!

TKEY and TDAT

TKEY

The TKEY Block of an subtable contains the CRC32-values of the entrytitles. The game calculates the CRC32-value out of a given string and checks if they exist in the GXT.

CHAR[4] - 4b   - TKEY
INT32   - 4b   - Blocksize

//Array of [Blocksize / 8]
INT32   - 4b   - Entryoffset
INT32   - 4b   - CRC32 (Entrytitle)

The TKEY block is directly followed by the TDAT Block which contains the contents of the entries. The Entryoffset is relative to the TDAT + 4 offset.

TDAT

CHAR[4] - 4b   - TDAT
INT32   - 4b   - Blocksize

From here the Entryoffset of each entry points to the content. The content can have different size. However it always ends in '\0'! For Example "Hello!" needs to be "Hello!\0" here and this gives a size of 6 bytes. If this is the 1st content in TDAT the next got an offset of 0x06!

Special Characters

Here is a list of special characters for german language sets and their UINT8 Values:

Character Value
Ä 131
ä 154
Ö 145
ö 168
Ü 149
ü 172
ß 150

CRC32 Calculation

Here is a simple CRC32 calculation class written in C++:

class Checksum
{
private:
	unsigned int m_aiCalcTable[265] = 
	{
		0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
		0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
		0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
		0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
		0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
		0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
		0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
		0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
		0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
		0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
		0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
		0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
		0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
		0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
		0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
		0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
		0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
		0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
		0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
		0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
		0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
		0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
		0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
		0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
		0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
		0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
		0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
		0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
		0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
		0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
		0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
		0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
		0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
		0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
		0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
		0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
		0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
		0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
		0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
		0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
		0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
		0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
		0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
		0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
		0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
		0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
		0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
		0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
		0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
		0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
		0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
		0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
		0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
		0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
		0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
		0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
		0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
		0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
		0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
		0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
		0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
		0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
		0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
		0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
    };

public:
	static void generateChecksumFromString(std::string source, bool caseSensitive, unsigned int &checksum)
	{
		checksum = 0xFFFFFFFF;
		
		if(!caseSensitive)
		{
			toUpperCase(source);
		}

		for(unsigned int i = 0; i < source.size(); i++)
		{
			checksum = m_aiCalcTable[(checksum ^ source[i]) & 0xFF] ^ ((checksum >> 8) & 0x00FFFFFF);
		}
	}
};

It is impossible to get a string out of an CRC32-value. The game only checks if two values are identical. However this is not a very reliably way because there can be more than two CRC32 Values for one string. But the probability for this is not very high!

GTA III / GTA Vice City Format

Vice City and GTA III GXTs are very similar to the SA GXTs. In this article all those additional infos are not listed.

Header

The header contains data about the tables and their subtables.

CHAR[4] - 4b   - TABL

Table Block

INT32   - 4b   - Blocksize

//Array of [Blocksize / 12 Entries]
CHAR[8] - 8b   - Subtablename
INT32   - 4b   - Offset

TKEY and TDAT

TKEY

CHAR[4] - 4b   - TKEY
INT32   - 4b   - Blocksize

//Array of [Blocksize / 12]
INT32   - 4b   - Entryoffset
CHAR[8] - 8b   - Entryname

Unlike San Andreas entrynames are stored directly in 8b chararrays here. This means to calculate the entries in the table you have to divide the blocksize through 12. The Entryoffsets are relative to the end of the "TDAT Header". This means you have to add the entryoffset to the stream position after the TDAT size. (TDAT_Offset + 8 + Entryoffset), to get to the entry.

TDAT

CHAR[4] - 4b   - TDAT
INT32   - 4b   - Blocksize

The TDAT-Block contains the strings which are displayed by the game. But here are some differences towards San Andreas. The strings are encoded in unicode, which means that each character takes the space of 2 characters (which means 2 bytes per character). Mostly the last byte is 0x00.

GTA2 Format

Except for additional header at beginning GTA2 GXT files are identical to GTA3 format.

The first 4 bytes can be one of following, and identify the language for the file: GBLE - english GBLF - french GBLG - german GBLI - italian GBLS - spanish GBLJ - japanese

A uint16 file version follows which is always 100 (decimal)

Text is stored with some specialities, characters are 16 bit while only one of these bytes is actual character the other may store special data such as gang message icon id, etc.. the text is zero-terminated.

The rest of file is same as gta3 with familiar tkey & tdat sections.

GXT Editing

Symbols & Colorcodes (Control Character)

Symbol Description
~1~ number within a text
~a~ text within a text
~b~ blue text
~d~ ▼-icon
~g~ green text
~h~ highlight
~j~ ? (Consoles Only ?)
~k~ key (followed by Keypresses)
~l~ black text
~n~ newline
~m~ ? (Consoles Only ?)
~o~ ? (Consoles Only ?)
~p~ purple text
~r~ red text
~s~ Reset to standart
~u~ ▲-icon
~v~ ? (Consoles Only ?)
~w~ white text
~x~ ? (Consoles Only ?)
~y~ yellow text
~z~ subtitle (doesn't shown when the Subtitles option is off)
~<~ ◄-icon
~>~ ►-icon

Keypresses

Foot Controls

Key Entry SCM-Relation
Fire ~PED_FIREWEAPON~ 00E1: player 0 pressed_key 17
Next Weapon / Target ~PED_CYCLE_WEAPON_RIGHT~ 00E1: player 0 pressed_key 7
Previous Weapon / Target ~PED_CYCLE_WEAPON_LEFT~ 00E1: player 0 pressed_key 5
Group Ctrl Foward (SA) ~GROUP_CONTROL_FWD~ 00E1: player 0 pressed_key 9
Group Ctrl Back (SA) ~GROUP_CONTROL_BWD~ 00E1: player 0 pressed_key 8
Conversation - No (SA) ~CONVERSATION_NO~ 00E1: player 0 pressed_key 10
Conversation - Yes (SA) ~CONVERSATION_YES~ 00E1: player 0 pressed_key 11
Foward ~GO_FORWARD~ 00E1: player 0 pressed_key 1 *
Backwards ~GO_BACK~ 00E1: player 0 pressed_key 1 *
Left ~GO_LEFT~ 00E1: player 0 pressed_key 0 *
Right ~GO_RIGHT~ 00E1: player 0 pressed_key 0 *
Zoom In ~PED_SNIPER_ZOOM_IN~ 00E1: player 0 pressed_key 5
Zoom Out ~PED_SNIPER_ZOOM_OUT~ 00E1: player 0 pressed_key 7
Enter+Exit ~VEHICLE_ENTER_EXIT~ 00E1: player 0 pressed_key 15
Change Camera ~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~ 00E1: player 0 pressed_key 13
Jump ~PED_JUMPING~ 00E1: player 0 pressed_key 14
Sprint ~PED_SPRINT~ 00E1: player 0 pressed_key 16
Aim Weapon ~PED_LOCK_TARGET~ 00E1: player 0 pressed_key 6
Crouch (VC, SA) ~PED_DUCK~ 00E1: player 0 pressed_key 18
Action (VC, SA) ~PED_ANSWER_PHONE~ 00E1: player 0 pressed_key 4
Walk (SA) ~SNEAK_ABOUT~ 00E1: player 0 pressed_key LALT
Look Behind ~PED_LOOKBEHIND~ 00E1: player 0 pressed_key 19
* = Use opcode 0494 to get specific key presses

Vehicle Controls

Key Entry SCM-Relation
Fire ~VEHICLE_FIREWEAPON~ 00E1: player 0 pressed_key 17
Secondary Fire ~VEHICLE_FIREWEAPON_ALT~ 00E1: player 0 pressed_key 4
Accelerate ~VEHICLE_ACCELERATE~ 00E1: player 0 pressed_key 16
Brake / Reverse ~VEHICLE_BRAKE~ 00E1: player 0 pressed_key 14
Left ~VEHICLE_STEERLEFT~ 00E1: player 0 pressed_key 0 *
Right ~VEHICLE_STEERRIGHT~ 00E1: player 0 pressed_key 0 *
Steer Foward / Down ~VEHICLE_STEERDOWN~ 00E1: player 0 pressed_key 1 *
Steer Back / Up ~VEHICLE_STEERUP~ 00E1: player 0 pressed_key 1 *
Enter+Exit ~VEHICLE_ENTER_EXIT~ 00E1: player 0 pressed_key 15
Trip Skip ~CONVERSATION_YES~ 00E1: player 0 pressed_key 11
Next Radio Station ~VEHICLE_RADIO_STATION_UP~ 00E1: player 0 pressed_key 8
Previous Radio Station ~VEHICLE_RADIO_STATION_DOWN~ 00E1: player 0 pressed_key 9
User Track Skip (SA) none
Horn ~VEHICLE_HORN~ 00E1: player 0 pressed_key 18
Sub-mission ~TOGGLE_SUBMISSIONS~ 00E1: player 0 pressed_key 19
Change Camera ~CAMERA_CHANGE_VIEW_ALL_SITUATIONS~ 00E1: player 0 pressed_key 13
Handbrake ~VEHICLE_HANDBRAKE~ 00E1: player 0 pressed_key 6
Look Behind none
Mouse Look (SA) ~VEHICLE_MOUSELOOK~ 00E1: player 0 pressed_key RMB
Look Left ~VEHICLE_LOOKLEFT~ 00E1: player 0 pressed_key 5
Look Right ~VEHICLE_LOOKRIGHT~ 00E1: player 0 pressed_key 7
Special Ctrl Left ~VEHICLE_TURRETLEFT~ 00E1: player 0 pressed_key 2 *
Special Ctrl Right ~VEHICLE_TURRETRIGHT~ 00E1: player 0 pressed_key 2 *
Special Ctrl Up ~VEHICLE_TURRETUP~ 00E1: player 0 pressed_key 3 *
Special Ctrl Down ~VEHICLE_TURRETDOWN~ 00E1: player 0 pressed_key 3 *
* = Use opcode 0494 to get specific key presses

Unused

Here are some keypress codes only used during development stage. They were removed or replaced later but probably they are still working. Maybe this is useful for further research. Some are only used in PS2 Version.

~TAKE_SCREEN_SHOT~
~SWITCH_DEBUG_CAM_ON~
~TOGGLE_DPAD~
~NETWORK_TALK~
~SHOW_MOUSE_POINTER_TOGGLE~
~PED_1RST_PERSON_LOOK_DOWN~
~PED_1RST_PERSON_LOOK_UP~
~PED_1RST_PERSON_LOOK_RIGHT~
~PED_1RST_PERSON_LOOK_LEFT~
~PED_CENTER_CAMERA_BEHIND_PLAYER~