Skip to content

Dialogs ru RU

PRXPHET edited this page May 27, 2025 · 1 revision

Расширение диалогов

  • Force reload режим, будет вызывать init_func при каждом открытии окна диалога. Позволяет перестраивать граф целиком. Работает только если c init_func (и соответственно нету phrase_list) в xml:

XML: force_reload="1"

LUA: dlg.SetForceReload(true)

  • Для фраз установка текста через скрипты:

XML: <script_text>dialog_manager.create_bye_phrase</script_text>

LUA: phrase_script:SetScriptText("travel_manager.squad_action_description")

Параметры такие же, как для action\predicate.

  • Новые скриптовые методы для построения диалогов через init_func:
dlg.SetPriority(123)      -- изменить приоритет диалога
dlg.SetCaption("test")    -- изменить заголовок
dlg.SetForceReload(false) -- изменить флаг force_reload (перестать обновлять диалог после какого то уловия)
dlg.GetPhrase("PhraseId") -- получить фразу по id
dlg.GetPhraseScript()     -- доступ к CPhraseScript самого диалога. (работают только методы AddPrecondition/AddHasInfo/AddDontHasInfo)

phrase.GetText()    -- получить текст фразы
phrase.SetText(str) -- изменить текст фразы
  • Поддержка передачи аргументов в функции, вызываемые из диалогов, например:
<precondition>my_script.test_func(123, true, nil, ...)</precondition>
<action>my_script.test_func(123, true, nil, ...)</action>

Если указать в конце переменное кол-во аргументов ... , то туда будут переданы стандартные аргументы, типа pSpeakerGO1->lua_game_object(), pSpeakerGO2->lua_game_object(), dialog_id, phrase_id.

Акселераторы для ответных диалогов

  • Каждой фразе назначается акселлратор от 1 до 0. Т.е. если нажать соотв. кнопку - будет выбрана соответствующая фраза. Что бы эти номера показывались перед фразами, нужно включить опцию show_dialog_numbers в секции features, т.к. для этого требуется дополнительный статик "num_text" в talk.xml, как в ЗП. Вот рабочий пример:
<question_item x="0" y="0" width="527" height="20" min_height="13">
	<num_text x="0" y="0" width="8" height="20">
		<text font="letterica18" r="255" g="232" b="208" align="l" />
	</num_text>
	<content_text x="15" y="0" width="512" height="20">
	<text font="letterica18" r="255" g="232" b="208" align="l" complex_mode="1"/>
	<text_color>
		<t r="231" g="168" b="12"/> <e r="255" g="232" b="208"/> <h r="255" g="255" b="255"/>
	</text_color>
	
	</content_text>
</question_item>
  • Добавил скриптовым кнопкам метод SetAccelerator( dik, idx ) Позволяет из скрипта назначить кнопке клавишу, при нажатии которой она должна сработать. Тоже самое, что и атрибут "accel" в xml конфиге.

Возможность перезагрузки измененных заданий

Выданные задания сохраняются в сейве и сохраняются полностью: текст, поршни, функции и т.д. Поэтому, изменение соотв. <game_task/> на уже выданное задание не повлияет. Для того, что бы повлияло, я добавил два аттрибута. Это version и objectives_version. По умолчанию оба равны 0. При увеличении version, например

<game_task id="shax_plennik" prio="0" version="1">
</game_task>

параметры задания из сейва будут проигнорированы, за исключением времени выдачи и т.п, а так же состояний <objective/>. Т.е. те подзадания, которые уже были выполнены, так и остануться выполненными. Если дополнительно к version увеличить objectives_version, например

<game_task id="shax_plennik" prio="0" version="1" objectives_version="1">
</game_task>

то сохраненное состояние подзаданий использоваться не будет. Такое имеет смысл делать в том случае, если в конфиге меняется кол-во подзаданий или их смысл.

Обращаю внимание. Это не флаги. Это номера версий и они должны монотонно увеличиваться.

Поддержка отмены заданий

  • Для xml тасков добавились : infoportion_skipped, infoportion_set_skipped, function_skipped, function_call_skipped.
  • Для xml ui тасков добавились цвет task_sub_item:description:text_colors:skiped и текстура ui_icons_PDA_subtask_skiped.
  • Для скриптов добавились методы для класса SGameTaskObjective: add_skipped_info, add_on_skipped_info, add_skipped_func, add_on_skipped_func и новый ETaskState: skipped.

Для добавления вкладки с отменёнными заданиями в PDA добавьте новую кнопку в pda_events.xml. Пример:

<button x="155" y="0" width="50" height="18"hint="pda_btn_skipped_hint">
    <text align="c" x="0" y="0" font="letterica18" r="255" g="255" b="255" complex_mode="0">pda_btn_skipped</text>
    <text_color>
		<t r="231" g="168" b="12"/> <d r="181" g="170" b="148"/> <e r="127" g="127" b="127"/> <h r="255" g="255" b="255"/>
    </text_color>
</button>
Clone this wiki locally