Интерфейс диалога

Диалог 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)