diff --git a/assets/opensb/interface/opensb/bindings/bindings.lua b/assets/opensb/interface/opensb/bindings/bindings.lua index 1287636..cafcc15 100644 --- a/assets/opensb/interface/opensb/bindings/bindings.lua +++ b/assets/opensb/interface/opensb/bindings/bindings.lua @@ -29,12 +29,16 @@ local function getMods(key) if bindMods[1] then return bindMods end end -local function finishBind(type, value) +local function finishBind(a, b) widget.blur("snare") snared = false - snareFinished{ type = type, value = value, mods = getMods(value) } - for i, mod in ipairs(mods) do - mod.active = false + if (type(a) == "table") then + snareFinished(a) + else + snareFinished{ type = a, value = b, mods = getMods(value) } + for i, mod in ipairs(mods) do + mod.active = false + end end end @@ -50,6 +54,8 @@ local function scanInputEvents() return finishBind("key", data.key) elseif type == "MouseButtonDown" then return finishBind("mouse", data.mouseButton) + elseif type == "ControllerButtonDown" then + return finishBind{ type = "controller", value = data.controllerButton, controller = data.controller } end end end @@ -127,9 +133,9 @@ function bindsToString(binds) str = str .. v .. " + " end end - if bind.type == "key" then - str = str .. bind.value - elseif bind.type == "mouse" then + if bind.type == "controller" then + str = str .. "🎮 " .. bind.value + else str = str .. bind.value end local _i = (i - 1) * 2 @@ -362,7 +368,7 @@ local function initCallbacks() end function init() - --log = sb.logInfo + --log = chat and chat.addMessage or sb.logInfo widget.clearListItems(CATEGORY_LIST_WIDGET) initCallbacks() diff --git a/source/client/StarClientApplication.cpp b/source/client/StarClientApplication.cpp index 6cc6cf1..b3460c1 100644 --- a/source/client/StarClientApplication.cpp +++ b/source/client/StarClientApplication.cpp @@ -301,20 +301,19 @@ void ClientApplication::processInput(InputEvent const& event) { m_controllerRightStick[1] = cAxis->controllerAxisValue; } - if (!m_errorScreen->accepted() && m_errorScreen->handleInputEvent(event)) - return; + bool processed = !m_errorScreen->accepted() && m_errorScreen->handleInputEvent(event); - bool processed = false; + if (!processed) { + if (m_state == MainAppState::Splash) { + processed = m_cinematicOverlay->handleInputEvent(event); + } else if (m_state == MainAppState::Title) { + if (!(processed = m_cinematicOverlay->handleInputEvent(event))) + processed = m_titleScreen->handleInputEvent(event); - if (m_state == MainAppState::Splash) { - processed = m_cinematicOverlay->handleInputEvent(event); - } else if (m_state == MainAppState::Title) { - if (!(processed = m_cinematicOverlay->handleInputEvent(event))) - processed = m_titleScreen->handleInputEvent(event); - - } else if (m_state == MainAppState::SinglePlayer || m_state == MainAppState::MultiPlayer) { - if (!(processed = m_cinematicOverlay->handleInputEvent(event))) - processed = m_mainInterface->handleInputEvent(event); + } else if (m_state == MainAppState::SinglePlayer || m_state == MainAppState::MultiPlayer) { + if (!(processed = m_cinematicOverlay->handleInputEvent(event))) + processed = m_mainInterface->handleInputEvent(event); + } } m_input->handleInput(event, processed); diff --git a/source/game/StarInput.cpp b/source/game/StarInput.cpp index 3a2fa9f..2400207 100644 --- a/source/game/StarInput.cpp +++ b/source/game/StarInput.cpp @@ -122,6 +122,22 @@ Json Input::inputEventToJson(InputEvent const& input) { {"mouseMove", jsonFromVec2I(mouseMove->mouseMove)}, {"mousePosition", jsonFromVec2I(mouseMove->mousePosition)} }; + } else if (auto controllerDown = input.ptr()) { + type = "ControllerButtonDown"; + data = JsonObject{ + {"controllerButton", ControllerButtonNames.getRight(controllerDown->controllerButton)}, + {"controller", controllerDown->controller}}; + } else if (auto controllerUp = input.ptr()) { + type = "ControllerButtonUp"; + data = JsonObject{ + {"controllerButton", ControllerButtonNames.getRight(controllerUp->controllerButton)}, + {"controller", controllerUp->controller}}; + } else if (auto controllerAxis = input.ptr()) { + type = "ControllerAxis"; + data = JsonObject{ + {"controllerAxis", ControllerAxisNames.getRight(controllerAxis->controllerAxis)}, + {"controllerAxisValue", controllerAxis->controllerAxisValue}, + {"controller", controllerAxis->controller}}; } if (data) { @@ -186,7 +202,8 @@ Json Input::bindToJson(Bind const& bind) { else if (auto controllerBind = bind.ptr()) { return JsonObject{ {"type", "controller"}, - {"value", ControllerButtonNames.getRight(controllerBind->button)} + {"value", ControllerButtonNames.getRight(controllerBind->button)}, + {"controller", controllerBind->controller} }; } @@ -392,7 +409,8 @@ bool Input::handleInput(InputEvent const& input, bool gameProcessed) { m_bindStates[bind].press(); } } - } else if (auto keyUp = input.ptr()) { + } + else if (auto keyUp = input.ptr()) { auto keyToMod = KeysToMods.rightPtr(keyUp->key); if (keyToMod) m_pressedMods &= ~*keyToMod; @@ -410,7 +428,8 @@ bool Input::handleInput(InputEvent const& input, bool gameProcessed) { state->release(); } } - } else if (auto mouseDown = input.ptr()) { + } + else if (auto mouseDown = input.ptr()) { m_mousePosition = mouseDown->mousePosition; if (!gameProcessed) { auto& state = m_mouseStates[mouseDown->mouseButton]; @@ -422,7 +441,8 @@ bool Input::handleInput(InputEvent const& input, bool gameProcessed) { m_bindStates[bind].press(); } } - } else if (auto mouseUp = input.ptr()) { + } + else if (auto mouseUp = input.ptr()) { m_mousePosition = mouseUp->mousePosition; if (auto state = m_mouseStates.ptr(mouseUp->mouseButton)) { state->releasePositions.append(mouseUp->mousePosition); @@ -439,6 +459,28 @@ bool Input::handleInput(InputEvent const& input, bool gameProcessed) { else if (auto mouseMove = input.ptr()) { m_mousePosition = mouseMove->mousePosition; } + else if (auto controllerDown = input.ptr()) { + if (!gameProcessed) { + auto& state = m_controllerStates[controllerDown->controllerButton]; + state.press(); + + if (auto binds = m_bindMappings.ptr(controllerDown->controllerButton)) { + for (auto bind : filterBindEntries(*binds, m_pressedMods)) + m_bindStates[bind].press(); + } + } + } + else if (auto controllerUp = input.ptr()) { + if (auto state = m_controllerStates.ptr(controllerUp->controllerButton)) + state->release(); + + if (auto binds = m_bindMappings.ptr(controllerUp->controllerButton)) { + for (auto& bind : *binds) { + if (auto state = m_bindStates.ptr(bind.entry)) + state->release(); + } + } + } return false; }