Skip to content

Commit 9de85fb

Browse files
committed
Fix Nintendo controller layout
1 parent 66f7d31 commit 9de85fb

File tree

1 file changed

+41
-14
lines changed

1 file changed

+41
-14
lines changed

Sources/GateEngine/System/HID/GamePad/GamePadInterpreter/Interpreters/MFIGamePadInterpreter.swift

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ internal final class MFIGamePadInterpreter: GamePadInterpreter {
6868
guard let gcController = gamePad.identifier as? GCController else { return }
6969

7070
switch gcController.productCategory {
71-
case "DualShock 4", "DualSense":
71+
case GCProductCategoryDualShock4, GCProductCategoryDualSense:
7272
gamePad.symbols = .sonyPlaystation
73-
case "Xbox One":
73+
case GCProductCategoryXboxOne:
7474
gamePad.symbols = .microsoftXbox
7575
case "Switch Pro Controller":
7676
gamePad.symbols = .nintendoSwitch
77-
case "MFi":
77+
case GCProductCategoryMFi:
7878
gamePad.symbols = .appleMFI
7979
default:
8080
gamePad.symbols = .unknown
@@ -99,18 +99,45 @@ internal final class MFIGamePadInterpreter: GamePadInterpreter {
9999

100100
gamePad.dpad.right.isPressed = gcGamePad.dpad.right.isPressed
101101
gamePad.dpad.right.value = gcGamePad.dpad.right.value
102-
103-
gamePad.button.north.isPressed = gcGamePad.buttonY.isPressed
104-
gamePad.button.north.value = gcGamePad.buttonY.value
105-
106-
gamePad.button.east.isPressed = gcGamePad.buttonB.isPressed
107-
gamePad.button.east.value = gcGamePad.buttonB.value
108-
109-
gamePad.button.south.isPressed = gcGamePad.buttonA.isPressed
110-
gamePad.button.south.value = gcGamePad.buttonA.value
111102

112-
gamePad.button.west.isPressed = gcGamePad.buttonX.isPressed
113-
gamePad.button.west.value = gcGamePad.buttonX.value
103+
switch gamePad.symbols {
104+
case .nintendoSwitch:
105+
// At some point the nintendo gamepad face button layout changed.
106+
// This could be becuase of Apple meddling,
107+
// or a firmware change from Nintendo
108+
// or Nintendo meddling with Apple.
109+
// It's unclear exactly when this change was made. But it's fucking stupid...
110+
// We'll just assume the change happened in 2024.
111+
if #available(macOS 15, iOS 18, tvOS 18, macCatalyst 18, *) {
112+
// Nintendo has buttons in different spots
113+
gamePad.button.north.isPressed = gcGamePad.buttonX.isPressed
114+
gamePad.button.north.value = gcGamePad.buttonX.value
115+
116+
gamePad.button.east.isPressed = gcGamePad.buttonA.isPressed
117+
gamePad.button.east.value = gcGamePad.buttonA.value
118+
119+
gamePad.button.south.isPressed = gcGamePad.buttonB.isPressed
120+
gamePad.button.south.value = gcGamePad.buttonB.value
121+
122+
gamePad.button.west.isPressed = gcGamePad.buttonY.isPressed
123+
gamePad.button.west.value = gcGamePad.buttonY.value
124+
}else{
125+
// Use the default layout if the OS is older
126+
fallthrough
127+
}
128+
default: // Only Nintendo fucks up the layout, every other gamepad is physically identical
129+
gamePad.button.north.isPressed = gcGamePad.buttonY.isPressed
130+
gamePad.button.north.value = gcGamePad.buttonY.value
131+
132+
gamePad.button.east.isPressed = gcGamePad.buttonB.isPressed
133+
gamePad.button.east.value = gcGamePad.buttonB.value
134+
135+
gamePad.button.south.isPressed = gcGamePad.buttonA.isPressed
136+
gamePad.button.south.value = gcGamePad.buttonA.value
137+
138+
gamePad.button.west.isPressed = gcGamePad.buttonX.isPressed
139+
gamePad.button.west.value = gcGamePad.buttonX.value
140+
}
114141

115142
gamePad.shoulder.left.isPressed = gcGamePad.leftShoulder.isPressed
116143
gamePad.shoulder.left.value = gcGamePad.leftShoulder.value

0 commit comments

Comments
 (0)