Skip to content

UI ru RU

PRXPHET edited this page May 27, 2025 · 1 revision

Поддержка переключения языка

Для переключения языка используйте команду g_language. Можно добавить настройку в меню и переключать язык до загрузки уровня. Переключение действует только на тексты. Шрифты, звуки и т.п. - не меняются. Языки указываются тут:

[string_table]
language = rus, ukr, eng

Поддержка звуков для talk.xml и carbody_new.xml

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>

Отображение эффектов, влияющих на актора в outfit_info в инвентаре

Для включения нужно добавить в конфиги инвентаря:

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

Ввод многострочного текста с помощью CUIEditBoxEx

Параметры точно такие же, как и у 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

  • Добавлены инструменты для настройки 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, включая окно новостей и курсор, что бы было удобнее делать скриншоты
Clone this wiki locally