Учим 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

Перейти к: навигация, поиск
(Новая страница: «За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игр…»)
 
(нет различий)

Версия 00:14, 21 октября 2015

За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке. Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор. Для решения нашей задачи нам понадобятся файлы: 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 добавим строчки, чтобы получилось так: <st_lang x="280" y="400" width="30" height="20">

 

<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 = { [ 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_lang:SetText("Рус") else self.ind_lang: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(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли. И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.

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

function save_dialog:OnEdit_CHANGED()

   local str_edit = self:GetEditBox("edit_filename")
   local sim = str_edit:GetText():match ('.',edb_Pos)
   local cls = self.mode_lang and t_lang[sim:byte()]
   sim = cls and string.char(cls) or sim
   table.insert(edb_Str,edb_Pos,sim)
   edb_Pos = #edb_Str + 1
   str_edit:SetText(table.concat(edb_Str))

end

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

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

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

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