Учим S.T.A.L.K.E.R. ТЧ русскому языку — S.T.A.L.K.E.R. Inside Wiki

Учим S.T.A.L.K.E.R. ТЧ русскому языку

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке. Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор. Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.

Начинаем. Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:

<form>
<!-- оставляем исходное -->
<st_lang x="280" y="400" width="30" height="20">
<text font="graffiti22" align="c" />
<text_color> <e r="227" g="199" b="178"/> <h r="255" g="0" b="0"/> </text_color>
</st_lang>
</form>

Закрываем файл. Он нам больше не понадобится. Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл ui_save_dlg_rus.script. Выглядит эта таблица так:

local tbl_ansii = {
[ 034 ] = 221, -- " --> Э
[ 035 ] = 185, -- # --> №
[ 039 ] = 253, -- ' --> э
[ 044 ] = 225, -- , --> б
[ 046 ] = 254, -- . --> ю
[ 047 ] = 046, -- / --> .
[ 058 ] = 198, -- : --> Ж
[ 059 ] = 230, -- ; --> ж
[ 060 ] = 193, -- < --> Б
[ 062 ] = 222, -- > --> Ю
[ 065 ] = 212, -- A --> Ф
[ 066 ] = 200, -- B --> И
[ 067 ] = 209, -- C --> С
[ 068 ] = 194, -- D --> В
[ 069 ] = 211, -- E --> У
[ 070 ] = 192, -- F --> А
[ 071 ] = 207, -- G --> П
[ 072 ] = 208, -- H --> Р
[ 073 ] = 216, -- I --> Ш
[ 074 ] = 206, -- J --> О
[ 075 ] = 203, -- K --> Л
[ 076 ] = 196, -- L --> Д
[ 077 ] = 220, -- M --> Ь
[ 078 ] = 210, -- N --> Т
[ 079 ] = 217, -- O --> Щ
[ 080 ] = 199, -- P --> З
[ 081 ] = 201, -- Q --> Й
[ 082 ] = 202, -- R --> К
[ 083 ] = 219, -- S --> Ы
[ 084 ] = 197, -- T --> Е
[ 085 ] = 195, -- U --> Г
[ 086 ] = 204, -- V --> М
[ 087 ] = 214, -- W --> Ц
[ 088 ] = 215, -- X --> Ч
[ 089 ] = 205, -- Y --> Н
[ 090 ] = 223, -- Z --> Я
[ 091 ] = 245, -- [ --> х
[ 093 ] = 250, -- ] --> ъ
[ 097 ] = 244, -- a --> ф
[ 098 ] = 232, -- b --> и
[ 099 ] = 241, -- c --> с
[ 100 ] = 226, -- d --> в
[ 101 ] = 243, -- e --> у
[ 102 ] = 224, -- f --> а
[ 103 ] = 239, -- g --> п
[ 104 ] = 240, -- h --> р
[ 105 ] = 248, -- i --> ш
[ 106 ] = 238, -- j --> о
[ 107 ] = 235, -- k --> л
[ 108 ] = 228, -- l --> д
[ 109 ] = 252, -- m --> ь
[ 110 ] = 242, -- n --> т
[ 111 ] = 249, -- o --> щ
[ 112 ] = 231, -- p --> з
[ 113 ] = 233, -- q --> й
[ 114 ] = 234, -- r --> к
[ 115 ] = 251, -- s --> ы
[ 116 ] = 229, -- t --> е
[ 117 ] = 227, -- u --> г
[ 118 ] = 236, -- v --> м
[ 119 ] = 246, -- w --> ц
[ 120 ] = 247, -- x --> ч
[ 121 ] = 237, -- y --> н
[ 122 ] = 255, -- z --> я
[ 123 ] = 213, -- { --> Х
[ 125 ] = 218, -- } --> Ъ
}

И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл ui_save_dialog.script.

1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных:

local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}

где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.

2. Создадим индикатор текущего языка ввода текста.

Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt. Для этого в методе save_dialog:InitControls() в самом конце вставим:

self.ind_lan = xml:Init3tButton("form:st_lang", self.form)
self:Register(self.ind_lan, "button_lang")
self.ind_lan:SetText("Рус")
self.mode_lang = true

где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский) Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование. Для этого в функцию InitCallBacks() вставим строку:

self:AddCallback("button_lang", ui_events.BUTTON_CLICKED, self.OnChg_lan, self)

а этим под блоком вставляем функцию:

function save_dialog:OnChg_lan()
self.mode_lang = not self.mode_lang
if self.mode_lang then self.ind_lan:SetText("Рус")
else self.ind_lan:SetText("Eng") end
end

Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.

Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:

function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function
ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)
DIK_RETURN = 28
WINDOW_KEY_PRESSED = 6
if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then
self:OnButton_ok_clicked()
self.owner:Show(true)
elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then
self:OnChg_lan()
elseif dik == DIK_keys.DIK_LEFT then
if edb_Pos > 1 then edb_Pos = edb_Pos - 1 end
elseif dik == DIK_keys.DIK_RIGHT then
if edb_Pos <= #edb_Str then edb_Pos = edb_Pos + 1 end
elseif dik == DIK_keys.DIK_DELETE then
if edb_Pos <= #edb_Str then table.remove(edb_Str,edb_Pos) end
elseif dik == DIK_keys.DIK_BACK then
if edb_Pos > 1 then edb_Pos = edb_Pos-1 end
table.remove(edb_Str,edb_Pos)
elseif (dik >= 2 and dik <= 13) or
(dik >= 16 and dik <= 27) or
(dik >= 30 and dik <= 40) or
(dik >= 44 and dik <= 53) or
dik == 57 or
(dik >= 71 and dik <= 83) then self:OnEdit_CHANGED()
end
elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then
if dik == DIK_keys.DIK_LMENU then
self:OnChg_lan()
end
end
return true
end

Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли. И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция self:OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.

Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:

function save_dialog:OnEdit_CHANGED()
local str_edit = self:GetEditBox("edit_filename") -- /1
local sim = str_edit:GetText():match ('.',edb_Pos) -- /2
local cls = self.mode_lang and t_lang[sim:byte()] -- /3
sim = cls and string.char(cls) or sim -- /4
table.insert(edb_Str,edb_Pos,sim) -- /5
edb_Pos = #edb_Str + 1 -- /6
str_edit:SetText(table.concat(edb_Str)) -- /7
end

Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия. Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).

Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.

Послесловие: Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.

Другие места
LANGUAGE