|
|
Строка 7: |
Строка 7: |
| Для вычисления хэша используется следующая разновидность алгоритма [http://en.wikipedia.org/wiki/Hash_table#Choosing_a_good_hash_function Jenkins One-at-a-time hash]: | | Для вычисления хэша используется следующая разновидность алгоритма [http://en.wikipedia.org/wiki/Hash_table#Choosing_a_good_hash_function Jenkins One-at-a-time hash]: |
| <source lang="cpp"> | | <source lang="cpp"> |
− | DWORD GetHash(char *szKeyName)
| + | DWORD GetHash(char *szKeyName) |
− | {
| + | { |
− | DWORD hash = 0;
| + | DWORD hash = 0; |
− | BOOL bQuote = FALSE;
| + | BOOL bQuote = FALSE; |
− | char ch;
| + | char ch; |
− | if(*szKeyName == '"')
| + | if(*szKeyName == '"') |
− | {
| + | { |
− | bQuote = TRUE;
| + | bQuote = TRUE; |
− | szKeyName++;
| + | szKeyName++; |
− | }
| + | } |
− | ch = *szKeyName;
| + | ch = *szKeyName; |
− | while(ch)
| + | while(ch) |
− | {
| + | { |
− | if(bQuote)
| + | if(bQuote && (ch == '"')) break; |
− | if(ch == '"')
| + | ch = tolower(ch); |
− | break;
| + | if(ch == '\\') ch = '/'; |
− | if((ch >= 'A') && (ch <= 'Z')) // make lowercase
| + | hash = (hash + (ch)) * 1025; // 0x0401 |
− | ch += 0x20;
| + | hash = hash ^ (hash >> 6); |
− | else if(ch == '\\')
| + | ch = *++szKeyName; |
− | ch = '/';
| + | } |
− | hash = (hash + (ch)) * 1025; // 0x0401
| + | hash *= 9; |
− | hash = hash ^ (hash >> 6);
| + | hash = ((hash >> 11) ^ hash) * 32769; // 0x8001 |
− | szKeyName++;
| + | return hash; |
− | ch = *szKeyName;
| + | } |
− | }
| + | |
− | hash *= 9;
| + | |
− | hash = ((hash >> 11) ^ hash) * 32769; // 0x8001
| + | |
− | return hash;
| + | |
− | }
| + | |
| </source> | | </source> |
| Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы: | | Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы: |
Текущая версия на 16:48, 5 октября 2013
Бинарные файлы с расширением .gxt
используются для хранения текстовых строк на разных языках (для каждого языка свой файл). В упрощённом виде файл состоит из нескольких таблиц, которые содержат наборы пар ключ=значение.
Формат .gxt
файлов для GTA 4 идентичен формату файлов для GTA San Andreas. Основное отличие состоит в алгоритме вычисления хэша строки, а также в длине и наборе символов в идентификаторах.
Алгоритм вычисления хэша строки
Для вычисления хэша используется следующая разновидность алгоритма Jenkins One-at-a-time hash:
DWORD GetHash(char *szKeyName)
{
DWORD hash = 0;
BOOL bQuote = FALSE;
char ch;
if(*szKeyName == '"')
{
bQuote = TRUE;
szKeyName++;
}
ch = *szKeyName;
while(ch)
{
if(bQuote && (ch == '"')) break;
ch = tolower(ch);
if(ch == '\\') ch = '/';
hash = (hash + (ch)) * 1025; // 0x0401
hash = hash ^ (hash >> 6);
ch = *++szKeyName;
}
hash *= 9;
hash = ((hash >> 11) ^ hash) * 32769; // 0x8001
return hash;
}
Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы:
- заглавные латинские буквы ( A-Z )
- символ подчеркивания ( _ )
Перед вычислением хэша идентификатор приводится к нижнему регистру.
Примеры идентификаторов:
BLISTA
GERV4_AIDS_86
PB_MISC_02
Теги
В текст GXT можно вставлять различные теги, которые изменяют цвет последующего текста или вставляют различные объекты в текст. Теги отгораживаются с двух сторон знаками ~ (тильда), например: ~INPUT_JUMP~ и состоят из знаков латинского алфавита, цифр и знака подчёркивания.
Теги вставки скриптовых значений
Тег
|
Что вставляет
|
~1~
|
Вставляет целое число (Скриптовые функции PRINT_HELP_FOREVER_WITH_NUMBER, PRINT_HELP_WITH_NUMBER, PRINT_WITH_2_NUMBERS, PRINT_WITH_2_NUMBERS_NOW, PRINT_WITH_NUMBER, PRINT_WITH_NUMBER_BIG, PRINT_WITH_NUMBER_NOW и др.)
|
~a~
|
Вставляет GXT-строку (Скриптовые функции PRINT_HELP_FOREVER_WITH_STRING, PRINT_HELP_FOREVER_WITH_STRING_NO_SOUND, PRINT_HELP_WITH_STRING, PRINT_HELP_WITH_STRING_NO_SOUND, PRINT_STRING_IN_STRING, PRINT_STRING_IN_STRING_NOW и др.)
|
~e~
|
Вставляет литеральную строку (Скриптовые функции PRINT_STRING_WITH_LITERAL_STRING_NOW и др.)
|
Теги изменения цвета
Цвет
|
Тег
|
Примечание
|
|
~b~
|
Имя друга или машина
|
|
~c~
|
На другом языке
|
|
~g~
|
Предмет
|
|
~h~
|
Выделение слов
|
|
~l~
|
|
|
~m~
|
|
|
~p~
|
|
|
~r~
|
Враг
|
|
~s~
|
Обычный цвет
|
|
~w~
|
Обычный цвет
|
|
~y~
|
Название места
|
|
~COL_NET_1~
|
|
|
~COL_NET_2~
|
|
|
~COL_NET_3~
|
|
|
~COL_NET_4~
|
|
|
~COL_NET_5~
|
|
|
~COL_NET_6~
|
|
|
~COL_NET_7~
|
|
|
~COL_NET_8~
|
|
|
~COL_NET_9~
|
|
|
~COL_NET_10~
|
|
|
~COL_NET_11~
|
|
|
~COL_NET_12~
|
|
|
~COL_NET_13~
|
|
|
~COL_NET_14~
|
|
|
~COL_NET_15~
|
|
|
~COL_NET_16~
|
|
Теги вставки изображений
В GTA4 в текст можно вставить значки радара тегом ~BLIP_НомерЗначка~, например тег ~BLIP_74~ вставит в текст значок радара . Номера значков можно узнать из статьи Иконки радара.
Теги кнопок геймпада
В ПК-версии осталась возможность вставлять в текст значки кнопок геймпада Xbox360:
Рисунок
|
Тег
|
Описание
|
В ПК-версии
|
|
~PAD_A~
|
Кнопка A
|
Да
|
|
~PAD_B~
|
Кнопка B
|
Да
|
|
~PAD_X~
|
Кнопка X
|
Заменяется на кл. ПРОБЕЛ
|
|
~PAD_Y~
|
Кнопка Y
|
Заменяется на кл. F
|
|
~PAD_LSTICK_ALL~
|
Левый стик
|
Заменяется на кл. W S A D
|
|
~PAD_LSTICK_LEFTRIGHT~ или ~PAD_LSTICK_LEFTRIGHT_VEH~
|
Левый стик вправо-влево
|
Заменяется на кл. A D
|
|
~PAD_LSTICK_UPDOWN~
|
Левый стик вверх-вниз
|
Заменяется на кл. W S
|
|
~PAD_LSTICK_LEFT~
|
Левый стик влево
|
Заменяется на кл. A
|
|
~PAD_LSTICK_RIGHT~
|
Левый стик вправо
|
Заменяется на кл. D
|
|
~PAD_LSTICK_UP~
|
Левый стик вверх
|
Заменяется на кл. W
|
|
~PAD_LSTICK_DOWN~
|
Левый стик вниз
|
Заменяется на кл. S
|
|
~PAD_LSTICK_NONE~
|
Левый стик ничего
|
Заменяется на кл. W S A D
|
|
~PAD_RSTICK_ALL~
|
Правый стик во все стороны
|
Заменяется на кл. МЫШЬ
|
|
~PAD_RSTICK_LEFTRIGHT~
|
Правый стик влево-вправо
|
Заменяется на кл. МЫШЬ
|
|
~PAD_RSTICK_UPDOWN~
|
Правый стик вверх-вниз
|
Заменяется на кл. МЫШЬ
|
|
~PAD_RSTICK_UPDOWN_ONLY~
|
|
Да
|
|
~PAD_RSTICK_LEFT~
|
Правый стик влево
|
Да
|
|
~PAD_RSTICK_RIGHT~
|
Правый стик вправо
|
Да
|
|
~PAD_RSTICK_UP~
|
Правый стик вверх
|
Да
|
|
~PAD_RSTICK_DOWN~
|
Правый стик вниз
|
Да
|
|
~PAD_RSTICK_NONE~
|
Правый стик ничего
|
Заменяется на кл. МЫШЬ
|
|
~PAD_DPAD_ALL~
|
Крестовина во все стороны
|
Заменяется на кл.
|
|
~PAD_DPAD_LEFTRIGHT~
|
Крестовина влево-вправо
|
Заменяется на кл.
|
|
~PAD_DPAD_UPDOWN~
|
Крестовина вверх-вниз
|
Заменяется на кл.
|
|
~PAD_DPAD_LEFT~
|
Крестовина влево
|
Заменяется на кл.
|
|
~PAD_DPAD_RIGHT~
|
Крестовина вправо
|
Заменяется на кл.
|
|
~PAD_DPAD_UP~
|
Крестовина вверх
|
Заменяется на кл.
|
|
~PAD_DPAD_DOWN~
|
Крестовина вниз
|
Заменяется на кл.
|
|
~PAD_DPAD_NONE~
|
Крестовина ничего
|
Да
|
|
~PAD_BACK~
|
Назад
|
Заменяется на кл. V
|
|
~PAD_START~
|
Старт
|
Заменяется на кл. ESC
|
|
~PAD_LT~
|
Левый шифт
|
Да
|
|
~PAD_LB~
|
Левый курок
|
Заменяется на кл. E
|
|
~PAD_RT~
|
Правый шифт
|
Да
|
|
~PAD_RB~
|
Правый курок
|
Заменяется на кл. Q
|
|
~PAD_LEFT~
|
Влево(?)
|
Да?
|
|
~PAD_RIGHT~
|
Вправо(?)
|
Да?
|
|
~PAD_UP~
|
Вверх(?)
|
Да?
|
|
~PAD_DOWN~
|
Вниз(?)
|
Да?
|
Теги игровых клавиш
Тег
|
Функция
|
Клавиша по умолчанию
|
~INPUT_AIM~
|
Прицелиться
|
ПКМ
|
~INPUT_ATTACK~
|
Атаковать
|
ЛКМ
|
~INPUT_COVER~
|
В укрытие
|
Q
|
~INPUT_DROP_WEAPON~
|
Бросить(?) оружие
|
R
|
~INPUT_DUCK~
|
Присесть, нагнуться
|
Левый CTRL
|
~INPUT_ENTER~
|
Enter
|
F
|
~INPUT_FE_REPLAY_PREVIEW~
|
|
Пробел
|
~INPUT_FE_REPLAY_TOGGLETIME~
|
|
C
|
~INPUT_FE_REPLAY_TOGGLETIPS~
|
|
V
|
~INPUT_FREE_AIM~
|
|
ПКМ
|
~INPUT_FRONTEND_ACCEPT~
|
|
Enter
|
~INPUT_FRONTEND_APPLY~
|
|
Пробел
|
~INPUT_FRONTEND_AXIS_BACK~
|
|
S
|
~INPUT_FRONTEND_AXIS_FWD~
|
|
W
|
~INPUT_FRONTEND_AXIS_LEFT~
|
|
A
|
~INPUT_FRONTEND_AXIS_RIGHT~
|
|
D
|
~INPUT_FRONTEND_CANCEL~
|
|
Backspace
|
~INPUT_FRONTEND_CUT~
|
|
CTRL+X
|
~INPUT_FRONTEND_COPY~
|
|
CTRL+C
|
~INPUT_FRONTEND_PASTE~
|
|
CTRL+V
|
~INPUT_FRONTEND_DELETE_FILTER~
|
|
DEL
|
~INPUT_FRONTEND_UP~
|
|
|
~INPUT_FRONTEND_DOWN~
|
|
|
~INPUT_FRONTEND_F6~
|
|
F6
|
~INPUT_FRONTEND_LB~
|
|
E
|
~INPUT_FRONTEND_LEGEND~
|
|
Tab
|
~INPUT_FRONTEND_LOCK_LOBBY~
|
|
Левый Shift
|
~INPUT_FRONTEND_LT~
|
|
Колёсико вниз
|
~INPUT_FRONTEND_MARKER_DELETE~
|
|
Del
|
~INPUT_FRONTEND_MINIGAME_1~
|
|
1
|
~INPUT_FRONTEND_MINIGAME_2~
|
|
2
|
~INPUT_FRONTEND_MINIGAME_3~
|
|
3
|
~INPUT_FRONTEND_MINIGAME_4~
|
|
4
|
~INPUT_FRONTEND_MODEL_SCREEN~
|
|
M
|
~INPUT_FRONTEND_PAUSE~
|
|
ESC
|
~INPUT_FRONTEND_PLAYER_LIST~
|
|
P
|
~INPUT_FRONTEND_RB~
|
|
Q
|
~INPUT_FRONTEND_REFRESH~
|
|
F5
|
~INPUT_FRONTEND_REPLAY_ADVANCE~
|
|
|
~INPUT_FRONTEND_REPLAY_BACK~
|
|
|
~INPUT_FRONTEND_REPLAY_CYCLEMARKERLEFT~
|
|
,
|
~INPUT_FRONTEND_REPLAY_CYCLEMARKERRIGHT~
|
|
.
|
~INPUT_FRONTEND_REPLAY_FFWD~
|
|
|
~INPUT_FRONTEND_REPLAY_HIDEHUD~
|
|
H
|
~INPUT_FRONTEND_REPLAY_NEWMARKER~
|
|
M
|
~INPUT_FRONTEND_REPLAY_PAUSE~
|
|
Пробел
|
~INPUT_FRONTEND_REPLAY_RESTART~
|
|
B
|
~INPUT_FRONTEND_REPLAY_REWIND~
|
|
|
~INPUT_FRONTEND_REPLAY_SCREENSHOT~
|
|
U
|
~INPUT_FRONTEND_REPLAY_SHOWHOTKEY~
|
|
K
|
~INPUT_FRONTEND_REPLAY_TOOLS~
|
|
T
|
~INPUT_FRONTEND_RT~
|
|
Колёсико вверх
|
~INPUT_FRONTEND_VEHICLE_TOGGLE~
|
|
V
|
~INPUT_FRONTEND_X~
|
|
Пробел
|
~INPUT_FRONTEND_Y~
|
|
F
|
~INPUT_JUMP~
|
|
Пробел
|
~INPUT_KB_DOWN~
|
|
|
~INPUT_KB_LEFT~
|
|
|
~INPUT_KB_RIGHT~
|
|
|
~INPUT_KB_UP~
|
|
|
~INPUT_MELEE_ATTACK1~
|
|
ЛКМ
|
~INPUT_MELEE_ATTACK2~
|
|
R
|
~INPUT_MELEE_ATTACK3~
|
|
ESC
|
~INPUT_MELEE_BLOCK~
|
|
Пробел
|
~INPUT_MELEE_KICK~
|
|
Q
|
~INPUT_MOUSE_LMB~
|
|
ЛКМ
|
~INPUT_MOUSE_RMB~
|
|
ПКМ
|
~INPUT_MOUSE_UD~
|
|
Мышь
|
~INPUT_MOUSE_WHEEL_DOWN~
|
|
Колёсико вниз
|
~INPUT_MOUSE_WHEEL_UP~
|
|
Колёсико вверх
|
~INPUT_MOVE_LEFT~
|
|
|
~INPUT_NEXT_CAMERA~
|
|
V
|
~INPUT_NEXT_TRACK~
|
|
N
|
~INPUT_NEXT_WEAPON~
|
|
Колёсико вверх
|
~INPUT_PHONE_ACCEPT~
|
|
Enter
|
~INPUT_PHONE_CANCEL~
|
|
Backspace
|
~INPUT_PHONE_PUT_AWAY~
|
|
Scroll Lock
|
~INPUT_PHONE_TAKE_OUT~
|
|
|
~INPUT_PICKUP~
|
|
E
|
~INPUT_PREV_TRACK~
|
|
B
|
~INPUT_PREV_WEAPON~
|
|
Колёсико вниз
|
~INPUT_RELOAD~
|
|
R
|
~INPUT_REPLAY_SAVE_TO_HDD~
|
|
F2
|
~INPUT_SNIPER_ZOOM_IN_ALTERNATE~
|
|
Колёсико вверх
|
~INPUT_SNIPER_ZOOM_IN~
|
|
Колёсико вверх
|
~INPUT_SNIPER_ZOOM_OUT_ALTERNATE~
|
|
Колёсико вниз
|
~INPUT_SNIPER_ZOOM_OUT~
|
|
Колёсико вниз
|
~INPUT_SPRINT~
|
|
Левый Shift
|
~INPUT_TEXT_CHAT_RESULTS_TOGGLE~
|
|
C
|
~INPUT_TEXT_CHAT_Y~
|
|
Y
|
~INPUT_TURN_OFF_RADIO~
|
|
X
|
~INPUT_VEH_ACCELERATE~
|
|
W
|
~INPUT_VEH_ATTACK~
|
|
ЛКМ
|
~INPUT_VEH_ATTACK2~
|
|
ЛКМ
|
~INPUT_VEH_BRAKE~
|
|
S
|
~INPUT_VEH_CIN_CAM~
|
|
Caps Lock
|
~INPUT_VEH_EXIT~
|
|
F
|
~INPUT_VEH_FLY_PITCH_DOWN~
|
|
Цифр. кл. "2"
|
~INPUT_VEH_FLY_PITCH_UP~
|
|
Цифр. кл. "8"
|
~INPUT_VEH_FLY_ROLL_LEFT~
|
|
A
|
~INPUT_VEH_FLY_ROLL_RIGHT~
|
|
D
|
~INPUT_VEH_FLY_THROTTLE_DOWN~
|
|
S
|
~INPUT_VEH_FLY_THROTTLE_UP~
|
|
W
|
~INPUT_VEH_FLY_YAW_LEFT~
|
|
Цифр. кл. "4"
|
~INPUT_VEH_FLY_YAW_RIGHT~
|
|
Цифр. кл. "6"
|
~INPUT_VEH_HANDBRAKE_ALT~
|
|
|
~INPUT_VEH_HANDBRAKE~
|
|
Пробел
|
~INPUT_VEH_HEADLIGHT~
|
|
H
|
~INPUT_VEH_HORN~
|
|
G
|
~INPUT_VEH_HOTWIRE_LEFT~
|
|
W
|
~INPUT_VEH_HOTWIRE_RIGHT~
|
|
S
|
~INPUT_VEH_KEY_UD~
|
|
[Левый Shift][Левый CTRL]
|
~INPUT_VEH_KEY_LR~
|
|
[A][D]
|
~INPUT_VEH_LOOK_BEHIND~
|
|
C
|
~INPUT_VEH_LOOK_LEFT~
|
|
нет?
|
~INPUT_VEH_LOOK_RIGHT~
|
|
нет?
|
~INPUT_VEH_NEXT_RADIO~
|
|
Колёсико вверх
|
~INPUT_VEH_NEXT_WEAPON~
|
|
Q
|
~INPUT_VEH_PREV_RADIO~
|
|
Колёсико вниз
|
~INPUT_ZOOM_RADAR~
|
|
T
|
Другие теги
- ~z~ - Применяется, если текст - реплика диалога
- ~x~ - Неизвестно. Применяется всегда вместе с ~z~
Ссылки