Интерфейс диалога
Диалог Jester состоит из веб-интерфейса и предлагает API, доступный для Lua, для изменения его содержимого и реакции на действия.
Интерфейс
Интерфейс - это веб-сайт на основе Pixi JS, определённый в
f-4e\ModFolders\Mods\aircraft\F-4E\UI\JesterDialog
Открытие index.html
в браузере показывает диалог, заполненный примером содержимого.
Веб-сайт можно свободно редактировать, изменения видны после перезагрузки DCS (SHIFT+R).
Логика интерфейса, такая как анимация, определена в renderer.js
, а взаимодействие обрабатывается в main.js
.
interface.js
объявляет основное содержимое диалога, а также все методы, относящиеся к связи C++ с JS.
Метод hb_send_proxy
используется для отправки команд в C++, например, для уведомления о том, что действие было выбрано.
Lua
Диалоги отображаются по требованию и по порядку. Они отображаются в течение определённого времени, и пользователю предоставляется возможность участвовать в диалоге или игнорировать его, после чего он истечёт и исчезнет.
Диалог состоит из вопроса с максимум 4 выбираемыми вариантами. Вариант либо является окончательным, либо запускает следующий вопрос с новыми вариантами для выбора.
Диалоги хранятся и отображаются из очереди. Новый диалог можно поместить в очередь с помощью:
Dialog.Push(dialog)
Ниже показан простой пример добавления нового диалога:
local fuel_check_dialog = Dialog.Question:new({
name = "Jester",
content = "How is the fuel?",
phrase = "dialog/fuel_check",
label = "Fuel Check",
timing = Dialog.Timing:new({
question = s(5),
action = s(10),
}),
options = {
Dialog.Option:new({ response = "We are good", action = "fuel_good" }),
Dialog.Option:new({
response = "Fuel is low",
follow_up_question = Dialog.FollowUpQuestion:new({
name = "Jester",
content = "Okay, how do you want to proceed?",
phase = "dialog/fuel_low_proceed",
options = {
Dialog.Option:new({ response = "Remain on Mission" }),
Dialog.Option:new({ response = "RTB", action = "fuel_low_rtb" })
},
}),
})
},
})
Dialog.Push(fuel_check_dialog)
Чтобы отреагировать на выбранный вариант, прослушайте соответствующее событие:
ListenTo("fuel_low_rtb", function(task)
-- Component interface
task:Click("Nav Panel Function", "TARGET_1")
-- or Raw interface
task:Then(function()
ClickRaw(
devices.NavigationComputer_AN_ASN_46A,
device_commands.RIO_NAV_COMP_FUNCTION_SELECTOR_KNOB,
3,
5
) -- Target 1
end)
end)