diff --git a/libultraship b/libultraship index 9a974e002..2e7d1fe6f 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 9a974e002f84cd1fe834ee9d2fa4ccf16d899e0f +Subproject commit 2e7d1fe6fdc8ba7ea6ee0682b8f00f48b38a4e89 diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp index 492517738..7967c3d15 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.cpp @@ -46,13 +46,6 @@ void SohInputEditorWindow::InitElement() { addButtonName(BTN_DLEFT, "D-pad left"); addButtonName(BTN_DRIGHT, "D-pad right"); addButtonName(0, "None"); - - mDeviceIndexVisiblity.clear(); - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = true; - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Blue] = true; - for (auto index = 1; index < Ship::ShipDeviceIndex::Max; index++) { - mDeviceIndexVisiblity[static_cast(index)] = false; - } } #define INPUT_EDITOR_WINDOW_GAME_INPUT_BLOCK_ID 95237929 @@ -176,6 +169,9 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #define BUTTON_COLOR_KEYBOARD_BEIGE ImVec4(0.651f, 0.482f, 0.357f, 0.5f) #define BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED ImVec4(0.651f, 0.482f, 0.357f, 1.0f) +#define BUTTON_COLOR_MOUSE_BEIGE ImVec4(0.5f, 0.5f, 0.5f, 0.5f) +#define BUTTON_COLOR_MOUSE_BEIGE_HOVERED ImVec4(0.5f, 0.5f, 0.5f, 1.0f) + #define BUTTON_COLOR_GAMEPAD_BLUE ImVec4(0.0f, 0.255f, 0.976f, 0.5f) #define BUTTON_COLOR_GAMEPAD_BLUE_HOVERED ImVec4(0.0f, 0.255f, 0.976f, 1.0f) @@ -191,29 +187,21 @@ void SohInputEditorWindow::DrawAnalogPreview(const char* label, ImVec2 stick, fl #define BUTTON_COLOR_GAMEPAD_PURPLE ImVec4(0.431f, 0.369f, 0.706f, 0.5f) #define BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED ImVec4(0.431f, 0.369f, 0.706f, 1.0f) -void SohInputEditorWindow::GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor, +void SohInputEditorWindow::GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, ImVec4& buttonHoveredColor) { switch (lusIndex) { - case Ship::ShipDeviceIndex::Keyboard: + case Ship::PhysicalDeviceType::Keyboard: buttonColor = BUTTON_COLOR_KEYBOARD_BEIGE; buttonHoveredColor = BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED; break; - case Ship::ShipDeviceIndex::Blue: + case Ship::PhysicalDeviceType::Mouse: + buttonColor = BUTTON_COLOR_MOUSE_BEIGE; + buttonHoveredColor = BUTTON_COLOR_MOUSE_BEIGE_HOVERED; + break; + case Ship::PhysicalDeviceType::SDLGamepad: buttonColor = BUTTON_COLOR_GAMEPAD_BLUE; buttonHoveredColor = BUTTON_COLOR_GAMEPAD_BLUE_HOVERED; break; - case Ship::ShipDeviceIndex::Red: - buttonColor = BUTTON_COLOR_GAMEPAD_RED; - buttonHoveredColor = BUTTON_COLOR_GAMEPAD_RED_HOVERED; - break; - case Ship::ShipDeviceIndex::Orange: - buttonColor = BUTTON_COLOR_GAMEPAD_ORANGE; - buttonHoveredColor = BUTTON_COLOR_GAMEPAD_ORANGE_HOVERED; - break; - case Ship::ShipDeviceIndex::Green: - buttonColor = BUTTON_COLOR_GAMEPAD_GREEN; - buttonHoveredColor = BUTTON_COLOR_GAMEPAD_GREEN_HOVERED; - break; default: buttonColor = BUTTON_COLOR_GAMEPAD_PURPLE; buttonHoveredColor = BUTTON_COLOR_GAMEPAD_PURPLE_HOVERED; @@ -266,9 +254,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt if (mapping == nullptr) { return; } - if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) { - return; - } ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); std::string icon = ""; @@ -287,7 +272,7 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); auto physicalInputDisplayName = StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto popupId = StringHelper::Sprintf("editButtonMappingPopup##%s", id.c_str()); @@ -324,19 +309,12 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::PopStyleVar(); ImGui::SameLine(0, 0); -#ifndef __WIIU__ auto sdlAxisDirectionToButtonMapping = std::dynamic_pointer_cast(mapping); - auto indexMapping = Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetDeviceIndexMappingFromShipDeviceIndex(mapping->GetShipDeviceIndex()); - auto sdlIndexMapping = std::dynamic_pointer_cast(indexMapping); - - if (sdlIndexMapping != nullptr && sdlAxisDirectionToButtonMapping != nullptr) { + if (sdlAxisDirectionToButtonMapping != nullptr) { ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(1.0f, 0.5f)); @@ -357,17 +335,19 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::Text("Axis Threshold\n\nThe extent to which the joystick\nmust be moved or the trigger\npressed to " "initiate the assigned\nbutton action.\n\n"); + auto globalSettings = Ship::Context::GetInstance()->GetControlDeck()->GetGlobalSDLDeviceSettings(); + if (sdlAxisDirectionToButtonMapping->AxisIsStick()) { ImGui::Text("Stick axis threshold:"); - int32_t stickAxisThreshold = sdlIndexMapping->GetStickAxisThresholdPercentage(); + int32_t stickAxisThreshold = globalSettings->GetStickAxisThresholdPercentage(); if (stickAxisThreshold == 0) { ImGui::BeginDisabled(); } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("-##Stick Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold - 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold - 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (stickAxisThreshold == 0) { @@ -377,8 +357,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); if (ImGui::SliderInt(StringHelper::Sprintf("##Stick Axis Threshold%s", id.c_str()).c_str(), &stickAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { - sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold); + globalSettings->SaveToConfig(); } ImGui::SameLine(0.0f, 0.0f); if (stickAxisThreshold == 100) { @@ -386,8 +366,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("+##Stick Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetStickAxisThresholdPercentage(stickAxisThreshold + 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetStickAxisThresholdPercentage(stickAxisThreshold + 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (stickAxisThreshold == 100) { @@ -398,14 +378,14 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt if (sdlAxisDirectionToButtonMapping->AxisIsTrigger()) { ImGui::Text("Trigger axis threshold:"); - int32_t triggerAxisThreshold = sdlIndexMapping->GetTriggerAxisThresholdPercentage(); + int32_t triggerAxisThreshold = globalSettings->GetTriggerAxisThresholdPercentage(); if (triggerAxisThreshold == 0) { ImGui::BeginDisabled(); } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("-##Trigger Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold - 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (triggerAxisThreshold == 0) { @@ -415,8 +395,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::SetNextItemWidth(SCALE_IMGUI_SIZE(160.0f)); if (ImGui::SliderInt(StringHelper::Sprintf("##Trigger Axis Threshold%s", id.c_str()).c_str(), &triggerAxisThreshold, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp)) { - sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold); + globalSettings->SaveToConfig(); } ImGui::SameLine(0.0f, 0.0f); if (triggerAxisThreshold == 100) { @@ -424,8 +404,8 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt } ImGui::PushButtonRepeat(true); if (ImGui::Button(StringHelper::Sprintf("+##Trigger Axis Threshold%s", id.c_str()).c_str())) { - sdlIndexMapping->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1); - sdlIndexMapping->SaveToConfig(); + globalSettings->SetTriggerAxisThresholdPercentage(triggerAxisThreshold + 1); + globalSettings->SaveToConfig(); } ImGui::PopButtonRepeat(); if (triggerAxisThreshold == 100) { @@ -444,7 +424,6 @@ void SohInputEditorWindow::DrawButtonLineEditMappingButton(uint8_t port, N64Butt ImGui::PopStyleVar(); ImGui::SameLine(0, 0); } -#endif ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); @@ -539,9 +518,6 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port, if (mapping == nullptr) { return; } - if (!mDeviceIndexVisiblity[mapping->GetShipDeviceIndex()]) { - return; - } ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f)); std::string icon = ""; @@ -560,7 +536,7 @@ void SohInputEditorWindow::DrawStickDirectionLineEditMappingButton(uint8_t port, auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); auto physicalInputDisplayName = StringHelper::Sprintf("%s %s", icon.c_str(), mapping->GetPhysicalInputName().c_str()); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); auto popupId = StringHelper::Sprintf("editStickDirectionMappingPopup##%s", id.c_str()); @@ -885,7 +861,7 @@ void SohInputEditorWindow::DrawRumbleSection(uint8_t port) { ImGui::SetNextItemOpen(true, ImGuiCond_Once); auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); + GetButtonColorsForDeviceType(mapping->GetPhysicalDeviceType(), buttonColor, buttonHoveredColor); // begin hackaround https://github.com/ocornut/imgui/issues/282#issuecomment-123763192 // spaces to have background color for text in a tree node std::string spaces = ""; @@ -1256,209 +1232,6 @@ void SohInputEditorWindow::DrawGyroSection(uint8_t port) { } } -void SohInputEditorWindow::DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks) { - std::set allLusDeviceIndices; - allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard); - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - for (auto [bitmask, button] : - Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetAllButtons()) { - if (!bitmasks.contains(bitmask)) { - continue; - } - - if (button->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : button->GetAllButtonMappings()) { - if (mapping->GetShipDeviceIndex() == lusIndex) { - lusDeviceIndiciesWithMappings.push_back( - std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); - break; - } - } - break; - } - } - } - - for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - ImGui::SameLine(); - if (lusIndex == Ship::ShipDeviceIndex::Keyboard) { - ImGui::SmallButton(ICON_FA_KEYBOARD_O); - } else { - ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); - } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - } -} - -void SohInputEditorWindow::DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex) { - std::set allLusDeviceIndices; - allLusDeviceIndices.insert(Ship::ShipDeviceIndex::Keyboard); - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - auto controllerStick = - stickIndex == Ship::StickIndex::LEFT_STICK - ? Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetLeftStick() - : Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetRightStick(); - if (controllerStick->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [direction, mappings] : controllerStick->GetAllAxisDirectionMappings()) { - bool foundMapping = false; - for (auto [id, mapping] : mappings) { - if (mapping->GetShipDeviceIndex() == lusIndex) { - foundMapping = true; - lusDeviceIndiciesWithMappings.push_back( - std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); - break; - } - } - if (foundMapping) { - break; - } - } - } - } - - for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - ImGui::SameLine(); - if (lusIndex == Ship::ShipDeviceIndex::Keyboard) { - ImGui::SmallButton(ICON_FA_KEYBOARD_O); - } else { - ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); - } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - } -} - -void SohInputEditorWindow::DrawRumbleDeviceIcons(uint8_t portIndex) { - std::set allLusDeviceIndices; - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - if (Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->GetAllRumbleMappings()) { - if (mapping->GetShipDeviceIndex() == lusIndex) { - lusDeviceIndiciesWithMappings.push_back( - std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); - break; - } - } - } - } - - for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - ImGui::SameLine(); - ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - } -} - -void SohInputEditorWindow::DrawGyroDeviceIcons(uint8_t portIndex) { - auto mapping = - Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->GetGyro()->GetGyroMapping(); - if (mapping == nullptr) { - return; - } - - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(mapping->GetShipDeviceIndex(), buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - ImGui::SameLine(); - ImGui::SmallButton(mapping->PhysicalDeviceIsConnected() ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); -} - -void SohInputEditorWindow::DrawLEDDeviceIcons(uint8_t portIndex) { - std::set allLusDeviceIndices; - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - allLusDeviceIndices.insert(lusIndex); - } - - std::vector> lusDeviceIndiciesWithMappings; - for (auto lusIndex : allLusDeviceIndices) { - if (Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetRumble() - ->HasMappingsForShipDeviceIndex(lusIndex)) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->GetLED() - ->GetAllLEDMappings()) { - if (mapping->GetShipDeviceIndex() == lusIndex) { - lusDeviceIndiciesWithMappings.push_back( - std::pair(lusIndex, mapping->PhysicalDeviceIsConnected())); - break; - } - } - } - } - - for (auto [lusIndex, connected] : lusDeviceIndiciesWithMappings) { - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - ImGui::SameLine(); - ImGui::SmallButton(connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN); - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - } -} - const ImGuiTableFlags PANEL_TABLE_FLAGS = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV; @@ -1651,66 +1424,52 @@ void SohInputEditorWindow::DrawDpadControlPanel() { Ship::GuiWindow::EndGroupPanel(0); } -void SohInputEditorWindow::DrawDeviceVisibilityButtons() { - std::map> indexMappings; - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappingsFromConfig()) { - auto sdlIndexMapping = std::static_pointer_cast(mapping); - if (sdlIndexMapping == nullptr) { - continue; - } - - indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), -1 }; - } - - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappings()) { - auto sdlIndexMapping = std::static_pointer_cast(mapping); - if (sdlIndexMapping == nullptr) { - continue; - } - - indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() }; - } +void SohInputEditorWindow::DrawDeviceToggles(uint8_t portIndex) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); auto keyboardButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto keyboardButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Keyboard, keyboardButtonColor, keyboardButtonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, keyboardButtonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, keyboardButtonHoveredColor); - bool keyboardVisible = mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard]; - if(ImGui::Button( - StringHelper::Sprintf("%s %s Keyboard", keyboardVisible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, ICON_FA_KEYBOARD_O) - .c_str())) { - mDeviceIndexVisiblity[Ship::ShipDeviceIndex::Keyboard] = !keyboardVisible; - } + ImGui::Button(StringHelper::Sprintf("%s Keyboard", ICON_FA_KEYBOARD_O).c_str()); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + auto mouseButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto mouseButtonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::Mouse, mouseButtonColor, mouseButtonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, mouseButtonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, mouseButtonHoveredColor); + ImGui::Button(StringHelper::Sprintf("%s Mouse", ICON_FA_KEYBOARD_O).c_str()); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); - for (auto [lusIndex, info] : indexMappings) { - auto [name, sdlIndex] = info; - bool connected = sdlIndex != -1; + ImGui::PopItemFlag(); + auto connectedDeviceManager = Ship::Context::GetInstance()->GetControlDeck()->GetConnectedPhysicalDeviceManager(); + for (const auto& [instanceId, name] : connectedDeviceManager->GetConnectedSDLGamepadNames()) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor); ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - bool visible = mDeviceIndexVisiblity[lusIndex]; - if(ImGui::Button( - StringHelper::Sprintf("%s %s %s (%s)", visible ? ICON_FA_EYE : ICON_FA_EYE_SLASH, connected ? ICON_FA_GAMEPAD : ICON_FA_CHAIN_BROKEN, name.c_str(), - connected ? StringHelper::Sprintf("SDL %d", sdlIndex).c_str() : "Disconnected") - .c_str())) { - mDeviceIndexVisiblity[lusIndex] = !visible; - } + auto notIgnored = !connectedDeviceManager->PortIsIgnoringInstanceId(portIndex, instanceId); + ImGui::PopItemFlag(); + if(ImGui::Checkbox(StringHelper::Sprintf("###instanceId_%d", instanceId).c_str(), ¬Ignored)) { + if (notIgnored) { + connectedDeviceManager->UnignoreInstanceIdForPort(portIndex, instanceId); + } else { + connectedDeviceManager->IgnoreInstanceIdForPort(portIndex, instanceId); + } + }; + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::SameLine(); + ImGui::Button(StringHelper::Sprintf("%s %s (SDL)", ICON_FA_GAMEPAD, name.c_str()).c_str()); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + ImGui::PopItemFlag(); } } @@ -1719,7 +1478,7 @@ void SohInputEditorWindow::DrawLinkTab() { if (ImGui::BeginTabItem(StringHelper::Sprintf("Link (P1)###port%d", portIndex).c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1729,7 +1488,6 @@ void SohInputEditorWindow::DrawLinkTab() { ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED); @@ -1744,57 +1502,36 @@ void SohInputEditorWindow::DrawLinkTab() { CHIP_COLOR_N64_YELLOW); DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, CHIP_COLOR_N64_YELLOW); - } else { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); } if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); - } else { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); } if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } if (ImGui::CollapsingHeader("Additional (\"Right\") Stick")) { - DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK); DrawStickSection(portIndex, Ship::RIGHT, 1, CHIP_COLOR_N64_YELLOW); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::RIGHT_STICK); } if (ImGui::CollapsingHeader("Rumble")) { - DrawRumbleDeviceIcons(portIndex); DrawRumbleSection(portIndex); - } else { - DrawRumbleDeviceIcons(portIndex); } if (ImGui::CollapsingHeader("Gyro")) { - DrawGyroDeviceIcons(portIndex); DrawGyroSection(portIndex); - } else { - DrawGyroDeviceIcons(portIndex); } if (ImGui::CollapsingHeader("LEDs")) { - DrawLEDDeviceIcons(portIndex); DrawLEDSection(portIndex); - } else { - DrawLEDDeviceIcons(portIndex); } if (ImGui::CollapsingHeader("Modifier Buttons")) { - DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks); DrawButtonLine("M1", portIndex, BTN_CUSTOM_MODIFIER1); DrawButtonLine("M2", portIndex, BTN_CUSTOM_MODIFIER2); @@ -1827,15 +1564,10 @@ void SohInputEditorWindow::DrawLinkTab() { Ship::GuiWindow::EndGroupPanel(0); } ImGui::EndDisabled(); - } else { - DrawButtonDeviceIcons(portIndex, mModifierButtonsBitmasks); } if (ImGui::CollapsingHeader("Ocarina Controls")) { - DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks); DrawOcarinaControlPanel(); - } else { - DrawButtonDeviceIcons(portIndex, mCustomOcarinaButtonsBitmasks); } if (ImGui::CollapsingHeader("Camera Controls")) { @@ -1875,7 +1607,7 @@ void SohInputEditorWindow::DrawIvanTab() { if (ImGui::BeginTabItem(StringHelper::Sprintf("Ivan (P2)###port%d", portIndex).c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1885,7 +1617,6 @@ void SohInputEditorWindow::DrawIvanTab() { ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); DrawButtonLine("Z", portIndex, BTN_Z); @@ -1897,25 +1628,17 @@ void SohInputEditorWindow::DrawIvanTab() { CHIP_COLOR_N64_YELLOW); DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, CHIP_COLOR_N64_YELLOW); - } else { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); } if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); - } else { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); } if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } ImGui::PopStyleColor(); @@ -1931,7 +1654,7 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo : customName.c_str())) { DrawClearAllButton(portIndex); DrawSetDefaultsButton(portIndex); - DrawDeviceVisibilityButtons(); + DrawDeviceToggles(portIndex); UpdateBitmaskToMappingIds(portIndex); UpdateStickDirectionToMappingIds(portIndex); @@ -1941,7 +1664,6 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); if (ImGui::CollapsingHeader("Buttons", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); DrawButtonLine("A", portIndex, BTN_A, CHIP_COLOR_N64_BLUE); DrawButtonLine("B", portIndex, BTN_B, CHIP_COLOR_N64_GREEN); DrawButtonLine("Start", portIndex, BTN_START, CHIP_COLOR_N64_RED); @@ -1956,25 +1678,16 @@ void SohInputEditorWindow::DrawDebugPortTab(uint8_t portIndex, std::string custo CHIP_COLOR_N64_YELLOW); DrawButtonLine(StringHelper::Sprintf("C %s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_CRIGHT, CHIP_COLOR_N64_YELLOW); - } else { - DrawButtonDeviceIcons(portIndex, mButtonsBitmasks); } - if (ImGui::CollapsingHeader("D-Pad", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_UP).c_str(), portIndex, BTN_DUP); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_DOWN).c_str(), portIndex, BTN_DDOWN); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_LEFT).c_str(), portIndex, BTN_DLEFT); DrawButtonLine(StringHelper::Sprintf("%s", ICON_FA_ARROW_RIGHT).c_str(), portIndex, BTN_DRIGHT); - } else { - DrawButtonDeviceIcons(portIndex, mDpadBitmasks); } if (ImGui::CollapsingHeader("Analog Stick", NULL, ImGuiTreeNodeFlags_DefaultOpen)) { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); DrawStickSection(portIndex, Ship::LEFT, 0); - } else { - DrawAnalogStickDeviceIcons(portIndex, Ship::LEFT_STICK); } ImGui::PopStyleColor(); @@ -2010,19 +1723,6 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { } if (ImGui::BeginPopup(popupId.c_str())) { - std::map> indexMappings; - for (auto [lusIndex, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetDeviceIndexMappingManager() - ->GetAllDeviceIndexMappings()) { - auto sdlIndexMapping = std::static_pointer_cast(mapping); - if (sdlIndexMapping == nullptr) { - continue; - } - - indexMappings[lusIndex] = { sdlIndexMapping->GetSDLControllerName(), sdlIndexMapping->GetSDLDeviceIndex() }; - } - bool shouldClose = false; ImGui::PushStyleColor(ImGuiCol_Button, BUTTON_COLOR_KEYBOARD_BEIGE); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, BUTTON_COLOR_KEYBOARD_BEIGE_HOVERED); @@ -2041,49 +1741,42 @@ void SohInputEditorWindow::DrawSetDefaultsButton(uint8_t portIndex) { Ship::Context::GetInstance() ->GetControlDeck() ->GetControllerByPort(portIndex) - ->ClearAllMappingsForDevice(Ship::ShipDeviceIndex::Keyboard); + ->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::Keyboard); Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( - Ship::ShipDeviceIndex::Keyboard); + Ship::PhysicalDeviceType::Keyboard); shouldClose = true; ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); } - for (auto [lusIndex, info] : indexMappings) { - auto [name, sdlIndex] = info; - auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); - auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); - GetButtonColorsForLUSDeviceIndex(lusIndex, buttonColor, buttonHoveredColor); - ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); - if (ImGui::Button(StringHelper::Sprintf("%s %s (%s)", ICON_FA_GAMEPAD, name.c_str(), - StringHelper::Sprintf("SDL %d", sdlIndex).c_str()) - .c_str())) { - ImGui::OpenPopup(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str()); + auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button); + auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered); + GetButtonColorsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad, buttonColor, buttonHoveredColor); + ImGui::PushStyleColor(ImGuiCol_Button, buttonColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, buttonHoveredColor); + if (ImGui::Button(StringHelper::Sprintf("%s %s", ICON_FA_GAMEPAD, "Gamepad (SDL)").c_str())) { + ImGui::OpenPopup("Set Defaults for Gamepad (SDL)"); + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + if (ImGui::BeginPopupModal("Set Defaults for Gamepad (SDL)", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::Text("This will clear all existing mappings for\nGamepad (SDL) on port %d.\n\nContinue?", portIndex + 1); + if (ImGui::Button("Cancel")) { + shouldClose = true; + ImGui::CloseCurrentPopup(); } - ImGui::PopStyleColor(); - ImGui::PopStyleColor(); - if (ImGui::BeginPopupModal(StringHelper::Sprintf("Set Defaults for %s", name.c_str()).c_str(), NULL, - ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Text("This will clear all existing mappings for\n%s (SDL %d) on port %d.\n\nContinue?", - name.c_str(), sdlIndex, portIndex + 1); - if (ImGui::Button("Cancel")) { - shouldClose = true; - ImGui::CloseCurrentPopup(); - } - if (ImGui::Button("Set defaults")) { - Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(portIndex) - ->ClearAllMappingsForDevice(lusIndex); - Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( - lusIndex); - shouldClose = true; - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); + if (ImGui::Button("Set defaults")) { + Ship::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(portIndex) + ->ClearAllMappingsForDeviceType(Ship::PhysicalDeviceType::SDLGamepad); + Ship::Context::GetInstance()->GetControlDeck()->GetControllerByPort(portIndex)->AddDefaultMappings( + Ship::PhysicalDeviceType::SDLGamepad); + shouldClose = true; + ImGui::CloseCurrentPopup(); } + ImGui::EndPopup(); } if (ImGui::Button("Cancel") || shouldClose) { diff --git a/soh/soh/Enhancements/controls/SohInputEditorWindow.h b/soh/soh/Enhancements/controls/SohInputEditorWindow.h index fdb3c77b0..4545f771d 100644 --- a/soh/soh/Enhancements/controls/SohInputEditorWindow.h +++ b/soh/soh/Enhancements/controls/SohInputEditorWindow.h @@ -83,7 +83,7 @@ class SohInputEditorWindow : public Ship::GuiWindow { void UpdateBitmaskToMappingIds(uint8_t port); void UpdateStickDirectionToMappingIds(uint8_t port); - void GetButtonColorsForLUSDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor, + void GetButtonColorsForDeviceType(Ship::PhysicalDeviceType lusIndex, ImVec4& buttonColor, ImVec4& buttonHoveredColor); void DrawLinkTab(); void DrawIvanTab(); @@ -92,15 +92,9 @@ class SohInputEditorWindow : public Ship::GuiWindow { std::set mDpadBitmasks; std::set mModifierButtonsBitmasks; std::set mCustomOcarinaButtonsBitmasks; - void DrawButtonDeviceIcons(uint8_t portIndex, std::set bitmasks); - void DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::StickIndex stickIndex); - void DrawRumbleDeviceIcons(uint8_t portIndex); - void DrawGyroDeviceIcons(uint8_t portIndex); - void DrawLEDDeviceIcons(uint8_t portIndex); bool mInputEditorPopupOpen; void DrawSetDefaultsButton(uint8_t portIndex); void DrawClearAllButton(uint8_t portIndex); - std::map mDeviceIndexVisiblity; - void DrawDeviceVisibilityButtons(); + void DrawDeviceToggles(uint8_t portIndex); }; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 1519bfe48..6d5430d69 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -341,7 +341,6 @@ OTRGlobals::OTRGlobals() { BTN_CUSTOM_OCARINA_PITCH_DOWN, })); context->InitControlDeck(controlDeck); - context->GetControlDeck()->SetSinglePlayerMappingMode(true); context->InitCrashHandler(); context->InitConsole(); @@ -1836,17 +1835,25 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { } extern "C" int Controller_ShouldRumble(size_t slot) { - for (auto [id, mapping] : Ship::Context::GetInstance() - ->GetControlDeck() - ->GetControllerByPort(static_cast(slot)) - ->GetRumble() - ->GetAllRumbleMappings()) { - if (mapping->PhysicalDeviceIsConnected()) { - return 1; - } + // don't rumble if we don't have rumble mappings + if (Ship::Context::GetInstance() + ->GetControlDeck() + ->GetControllerByPort(static_cast(slot)) + ->GetRumble() + ->GetAllRumbleMappings().empty()) { + return 0; } - return 0; + // don't rumble if we don't have connected gamepads + if (Ship::Context::GetInstance() + ->GetControlDeck() + ->GetConnectedPhysicalDeviceManager() + ->GetConnectedSDLGamepadsForPort(slot).empty()) { + return 0; + } + + // rumble + return 1; } extern "C" void* getN64WeirdFrame(s32 i) {