-
Notifications
You must be signed in to change notification settings - Fork 87
UI ru RU
Для переключения языка используйте команду g_language
. Можно добавить настройку в меню и переключать язык до загрузки уровня. Переключение действует только на тексты. Шрифты, звуки и т.п. - не меняются. Языки указываются тут:
[string_table]
language = rus, ukr, eng
talk.xml
:
<action_sounds>
<snd_open>interface\inv_open2</snd_open>
<snd_close>interface\inv_open2</snd_close>
<snd_say>interface\inv_page2</snd_say>
</action_sounds>
carbody_new.xml
:
<action_sounds>
<snd_open>interface\inv_open</snd_open>
<snd_close>interface\inv_close</snd_close>
<snd_properties>interface\inv_properties</snd_properties>
<snd_drop_item>interface\inv_drop</snd_drop_item>
<snd_detach_addon>interface\inv_detach_addon</snd_detach_addon>
<snd_item_use>interface\inv_slot</snd_item_use>
</action_sounds>
- Переделана система шрифтов и парсер текста для корректной поддержки
UTF-8
. Шрифты с поддержкойUTF-8
можно генерировать используя Fonts_generator. Обратная совместимость сANSI
-символами, детектUTF-8 BOM
и прочие нюансы учтены. - Добавлены тени для шрифтов. В будущем надо будет подумать как лучше их настраивать.
- В меню добавлена настройка размера шрифтов - особенно пригодится обладателям мониторов с сверхвысокими разрешениями. Регулируется ширина и высота шрифтов конс. командами
g_font_scale_x
,g_font_scale_y
. - Добавлена поддержка использования любых секций шрифтов для UI через xml & lua без необходимости править движок. Например, создаем где-нибудь в
font.ltx
шрифт[letterica18_small]
, и используем в xml:<text font="letterica18_small" r="127" g="127" b="127"/>
- Добавлен экспорт в скрипты для всех именных шрифтов, которые есть в движке.
- Починен параметр
width_correction
у шрифтов, и поэтому переименован вfont_width_correction
- Чтобы не создавать кучу текстур шрифтов для разных размеров текста, можно создать одну текстуру большого размера и уменьшать через конфиг до нужной величины, например:
[ui_font_bender]
shader = font
texture = ui\ui_font_bender ;Текстура сгенерированного шрифта большого размера
scale_x = 0.5 ;Уменьшаем в два раза высоту
scale_y = 0.5 ;Уменьшаем в два раза ширину
interval = 1, 0.75 ;Можно регулировать интервал между буквами сверху и сбоку.
- Добавлен
skip_prefix = true
для секций шрифтов. Двиг не будет требовать добавлятьfont_prefix
(из[string_table]
) к имени текстуры такого шрифта:
[ui_font_digital_16]
skip_prefix = true
shader = font
texture = ui\fonts\Digital52
scale_x = 0.30
scale_y = 0.30
Включается в секции features
параметром show_inv_item_condition
. Для работы нужно добавить в inventory_new.xml
:
<condition_progess_bar x="3" y="1" width="29" height="4" horz="1" min="0" max="100" pos="1">
<background x="0" y="0" width="30" height="5">
<texture r="196" g="18" b="18" a="200">ui_mg_progress_efficiency_full</texture>
</background>
<progress>
<texture>ui_mg_progress_efficiency_full</texture>
</progress>
<min_color r="107" g="207" b="119"/>
<middle_color r="255" g="255" b="118"/>
<max_color r="107" g="207" b="119"/>
</condition_progess_bar>
<cell_item_text x="0" y="0" width="35" height="16" stretch="1">
<text x="0" y="0" width="35" height="16" font="letterica16" color="white" align="l" vert_align="t"/>
</cell_item_text>
condition_progess_bar
- это статик полоски состояния.
cell_item_text
- это статик с числом, кол-во предметов.
Аттрибут width
у condition_progess_bar
- не обязательный. Если его нет, то длина полоски будет рассчитана автоматически, на основе ширины ячейки.
Далее dragdrop элементам нужно добавить аттрибут condition_progress_bar="1"
, который включит показ шкал состояния. По умолчанию будет показываться состояние оружия и брони. Что бы показывалось состояние других предметов, им нужно добавить в секцию:
inv_show_condition = true
Дополнительно добавлены аттрибуты cell_sp_x
и cell_sp_y
для dragdrop элементов. Они задают отступы после иконки предмета по горизонтали и вертикали. Для dragdrop_bag использовать не имеет смысла, т.к. несколько неожиданный результат будет для предметов, которые занимают больше одной ячейки в любую сторону. Отступ-то расчитывается для одной ячейки и если их больше, то и отступ будет больше. Т.е. если предмет три ячейки в высоту, то вертикальный отступ у него будет утроенный. А вот для пояса, к примеру, вполне можно использовать.
Прогрессбары состояния предметов анимированные. При открытии инвентаря они плавно увеличиваются до своих значений. Отключить анимации можно через аттрибут animated="0"
.
Примеры использования всего этого можно посмотреть здесь.
- Добавлена пауза после загрузки сейва в стиле ЗП, но, в отличие от ЗП, сделана полностью в движке. Включается консольной командой
keypress_on_start
. - Добавлена поддержка советов при загрузке в новом виде.
- Возможность разделения
ui_icon_equipment.dds
на разные полотна. Параметрicon_group
, в секции предмета, задаёт, с какого полотна брать иконку. Если значение параметра0
, а так оно по умолчанию, то используется стандартная текстураui_icon_equipment.dds
. Если значение больше нуля, например
icon_group = 1
то будет использоваться ui_icon_equipment_1.dds
, т.е. к имени стандартной текстуры прибавляется _число
.
- Поддержка
icon_name
в секции предмета. Например:
[vodka]
icon_name = ui_icon_vodka
В этом случае иконка водки будет браться не с полотна по координатам inv_grid_x
и inv_grid_y
, а будет использована текстура ui_icon_vodka
, которая должна быть описана в одном из xml описания текстур, вот так, например:
<ui_texture>
<file_name>ui\ui_icons_items</file_name>
<texture id="ui_icon_vodka" x="0" y="200" width="500" height="200" />
...
</ui_texture>
Для включения нужно добавить в конфиги инвентаря:
gamedata/config/ui/inventory_new.xml
gamedata/config/ui/inventory_new_16.xml
в секцию outfit_info
новые ноды:
<static_health_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_health_restore_speed</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_health_restore_speed>
<static_satiety_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_satiety_restore_speed</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_satiety_restore_speed>
<static_power_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_power_restore_speed</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_power_restore_speed>
<static_bleeding_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_bleeding_restore_speed</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_bleeding_restore_speed>
<static_radiation_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_radiation_restore_speed</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_radiation_restore_speed>
<static_psy_health_restore_speed x="0" y="0" width="180" height="19" complex_mode="1">
<texture>ui_inv_icon_telepatic_immunity</texture>
<text font="letterica16" x="17" y="0" color="ui_clr_1"/>
</static_psy_health_restore_speed>
Пример можно взять из файлов:
gamedata/config/ui/af_params.xml
gamedata/config/ui/af_params_16.xml
Параметры точно такие же, как и у CUIEditBox
(xml и lua). Но можно указывать высоту больше одной строки, тогда текст будет автоматически переноситься на новую строчку.
Пример: https://www.youtube.com/watch?v=HNksw-86L_8
Для создания CUIEditBoxEx
подходит точно такой же код как и для обычного CUIEditBox
. Но текстура для подложки должна быть в формате для диалогов или рамок. То есть, должно быть 8 частей для рамки + сама подложка. Пример текстуры из ванильной игры: ui_stroketextbox
.
Создание:
Через lua:
local edit_box1 = CUIEditBoxEx()
edit_box1:SetAutoDelete(true)
edit_box1:Init(120, 200, 43, 90) -- 90 - высота, желательно что то кратное высоте шрифта
edit_box1:InitTexture("ui_stroketextbox")
edit_box1:SetFont(GetFontLetterica18Russian())
self:AttachChild(edit_box1)
Через xml:
<edit_box x="120" y="200" width="43" height="90">
<texture>ui_stroketextbox</texture>
<text font="letterica18" a="255" r="200" g="255" b="200"/>
</edit_box>
lua часть:
local edit_box = xml:InitEditBoxEx("main_dialog:edit_box", dialog)
Для демонстрации многострочный ввод текста добавлен в окно пользовательских меток в ПДА.
- Добавлены инструменты для настройки UI в пикселах на мониторе конечного юзера, а не в координатной системе 1024х768. Это нужно что бы можно было избежать растянутого UI на широких мониторах, например ( #378 ).
При включении атрибута
as_is="1"
в конфиге, GUI элементы будут читать координаты в пикселах конечного монитора, а не в сетке 1024х768 как было в ванили. Поэтому размеры и координаты в GUI-конфигах придется править, чтобы выглядело нормально и влезало в экран. Скорее всего придется поэкспериментировать. Но зато когда правкой конфигов удастся получить хороший результат, этот результат будет таким же хорошим для всех мониторов. - Для drag-drop элементов так же добавлен атрибут
as_is
, чтобы иконки инвентаря сохраняли правильные пропорции при любом отношении сторон экрана. - Так же для drag-drop элементов добавлен атрибут
autocalc
(0 or 1) управляющий автокалькуляцией размера и количества ячеек. Иконки инвентаря авто-масштабируются в сторону уменьшения, если это необходимо для того чтобы в драгдроп-лист вместилось то число ячеек, что указано в его конфиге. Драгдроп-лист до-заполняется дополнительными ячейками в ширину или высоту, до полного заполнения, если после применения вышеописанных манипуляций в нем осталось свободное место. Размер ячеек регулируется новым атрибутомcell_size
(по умолчанию 50), старые атрибутыcell_width
,cell_height
не используются.
-
Добавлена для скриптов возможность получить
CUIButton
изCUIWindow
Позволяет делать например вот так:
-- В данном случае, кнопке выхода из инвентаря назначается акселератор.
local wnd = level.get_inventory_wnd()
local btn_exit = wnd:FindChild( "exit_button" )
if btn_exit then
local btn = btn_exit:GetButton()
if btn then
btn:SetAccelerator( k_inv_open )
end
end
- Добавлен коллбэк
level_changer_action
для актора. Вызывается перед тем, как будет показан диалог подтверждения перехода на другую локацию. Можно использовать для того, что бы поменять этот самый диалог. Например:
-- Здесь в подтверждение добавляется имя локации, на которую переходим.
function actor_binder:level_changer_action( obj, wnd )
local sobj = obj:get_alife_object()
local lc = sobj:get_level_changer()
local dest_vertex = lc.dest_game_vertex_id
local dest_lname = alife():level_name(
game_graph():vertex( dest_vertex ):level_id()
)
local msg_text_wnd = wnd:FindChild( "message_box_change_level:message_text" )
msg_text_wnd:GetCUIStatic():SetText(
game.translate_string( dest_lname ) .. ": "
.. game.translate_string( "level_changer_invitation" )
)
end
- Исправлена утечка памяти в
m_callbacks
. При уничтожении окна все коллбэки к нему будут также очищены. Ранее этого не происходило, что вызывало утечку памяти. ФункциейClearCallbacks()
также можно самостоятельно очистить все коллбэки. - Добавлена поддержка ЗП формата для файлов описания текстур
texture_desc
. Они удобнее - можно кучу текстур описать в одном файле. Так же автозагрузка описаний по путиui\textures_descr\*.xml
- Добавлен плавный scroll в ui
- Добавлена поддержка круглой миникарты и часов на ней. Пример настройки:
<minimap rounded="1" alpha="220">
<level_frame x="75" y="670" width="172" height="172" stretch="1" alignment="c"/>
<background width="350" height="380" stretch="1" alignment="c">
<texture></texture>
<dist_text x="75" y="3" width="100" height="20">
<text align="r" font="letterica16" color="ui_clr_1" />
</dist_text>
</background>
<clock_wnd x="18" y="170" width="39" height="16" alignment="c">
<text x="0" y="0" font="letterica16" color="ui_clr_1" align="c" vert_align="c" />
</clock_wnd>
<compass x="75" y="670" width="192" height="192" stretch="1" heading="1" alignment="c">
<texture></texture>
</compass>
<center width="4" height="4" alignment="c" stretch="1" heading="1">>
<texture></texture>
</center>
</minimap>
- Клавиши скрытия/показа худа теперь можно настроить в опциях, т.к. стандартные
NUM+
/NUM-
есть не на каждой клавиатуре - При скрытии худа теперь будет скрываться весь UI, включая окно новостей и курсор, что бы было удобнее делать скриншоты