extends RefCounted class_name ControllerMapper func _convert_joypad_path(path: String, device: int, fallback: ControllerSettings.Devices, force_controller_icon_style = ControllerSettings.Devices.NONE) -> String: match _get_joypad_type(device, fallback, force_controller_icon_style): ControllerSettings.Devices.LUNA: return _convert_joypad_to_luna(path) ControllerSettings.Devices.PS3: return _convert_joypad_to_ps3(path) ControllerSettings.Devices.PS4: return _convert_joypad_to_ps4(path) ControllerSettings.Devices.PS5: return _convert_joypad_to_ps5(path) ControllerSettings.Devices.STADIA: return _convert_joypad_to_stadia(path) ControllerSettings.Devices.STEAM: return _convert_joypad_to_steam(path) ControllerSettings.Devices.SWITCH: return _convert_joypad_to_switch(path) ControllerSettings.Devices.JOYCON: return _convert_joypad_to_joycon(path) ControllerSettings.Devices.XBOX360: return _convert_joypad_to_xbox360(path) ControllerSettings.Devices.XBOXONE: return _convert_joypad_to_xboxone(path) ControllerSettings.Devices.XBOXSERIES: return _convert_joypad_to_xboxseries(path) ControllerSettings.Devices.STEAM_DECK: return _convert_joypad_to_steamdeck(path) ControllerSettings.Devices.OUYA: return _convert_joypad_to_ouya(path) _: return "" func _get_joypad_type(device, fallback, force_controller_icon_style): if force_controller_icon_style != ControllerSettings.Devices.NONE: return force_controller_icon_style var available = Input.get_connected_joypads() if available.is_empty(): return fallback # If the requested joypad is not on the connected joypad list, try using the last known connected joypad if not device in available: device = ControllerIcons._last_controller # If that fails too, then use whatever joypad we have connected right now if not device in available: device = available.front() var controller_name = Input.get_joy_name(device) if "Luna Controller" in controller_name: return ControllerSettings.Devices.LUNA elif "PS3 Controller" in controller_name: return ControllerSettings.Devices.PS3 elif "PS4 Controller" in controller_name or \ "DUALSHOCK 4" in controller_name: return ControllerSettings.Devices.PS4 elif "PS5 Controller" in controller_name or \ "DualSense" in controller_name: return ControllerSettings.Devices.PS5 elif "Stadia Controller" in controller_name: return ControllerSettings.Devices.STADIA elif "Steam Controller" in controller_name: return ControllerSettings.Devices.STEAM elif "Switch Controller" in controller_name or \ "Switch Pro Controller" in controller_name: return ControllerSettings.Devices.SWITCH elif "Joy-Con" in controller_name: return ControllerSettings.Devices.JOYCON elif "Xbox 360 Controller" in controller_name: return ControllerSettings.Devices.XBOX360 elif "Xbox One" in controller_name or \ "X-Box One" in controller_name or \ "Xbox Wireless Controller" in controller_name: return ControllerSettings.Devices.XBOXONE elif "Xbox Series" in controller_name: return ControllerSettings.Devices.XBOXSERIES elif "Steam Deck" in controller_name or \ "Steam Virtual Gamepad" in controller_name: return ControllerSettings.Devices.STEAM_DECK elif "OUYA Controller" in controller_name: return ControllerSettings.Devices.OUYA else: return fallback func _convert_joypad_to_luna(path: String): path = path.replace("joypad", "luna") match path.substr(path.find("/") + 1): "select": return path.replace("/select", "/circle") "start": return path.replace("/start", "/menu") "share": return path.replace("/share", "/microphone") _: return path func _convert_joypad_to_playstation(path: String): match path.substr(path.find("/") + 1): "a": return path.replace("/a", "/cross") "b": return path.replace("/b", "/circle") "x": return path.replace("/x", "/square") "y": return path.replace("/y", "/triangle") "lb": return path.replace("/lb", "/l1") "rb": return path.replace("/rb", "/r1") "lt": return path.replace("/lt", "/l2") "rt": return path.replace("/rt", "/r2") _: return path func _convert_joypad_to_ps3(path: String): return _convert_joypad_to_playstation(path.replace("joypad", "ps3")) func _convert_joypad_to_ps4(path: String): path = _convert_joypad_to_playstation(path.replace("joypad", "ps4")) match path.substr(path.find("/") + 1): "select": return path.replace("/select", "/share") "start": return path.replace("/start", "/options") "share": return path.replace("/share", "/") _: return path func _convert_joypad_to_ps5(path: String): path = _convert_joypad_to_playstation(path.replace("joypad", "ps5")) match path.substr(path.find("/") + 1): "select": return path.replace("/select", "/share") "start": return path.replace("/start", "/options") "home": return path.replace("/home", "/assistant") "share": return path.replace("/share", "/microphone") _: return path func _convert_joypad_to_stadia(path: String): path = path.replace("joypad", "stadia") match path.substr(path.find("/") + 1): "lb": return path.replace("/lb", "/l1") "rb": return path.replace("/rb", "/r1") "lt": return path.replace("/lt", "/l2") "rt": return path.replace("/rt", "/r2") "select": return path.replace("/select", "/dots") "start": return path.replace("/start", "/menu") "share": return path.replace("/share", "/select") _: return path func _convert_joypad_to_steam(path: String): path = path.replace("joypad", "steam") match path.substr(path.find("/") + 1): "r_stick_click": return path.replace("/r_stick_click", "/right_track_center") "select": return path.replace("/select", "/back") "home": return path.replace("/home", "/system") "dpad": return path.replace("/dpad", "/left_track") "dpad_up": return path.replace("/dpad_up", "/left_track_up") "dpad_down": return path.replace("/dpad_down", "/left_track_down") "dpad_left": return path.replace("/dpad_left", "/left_track_left") "dpad_right": return path.replace("/dpad_right", "/left_track_right") "l_stick": return path.replace("/l_stick", "/stick") "r_stick": return path.replace("/r_stick", "/right_track") _: return path func _convert_joypad_to_switch(path: String): path = path.replace("joypad", "switch") match path.substr(path.find("/") + 1): "a": return path.replace("/a", "/b") "b": return path.replace("/b", "/a") "x": return path.replace("/x", "/y") "y": return path.replace("/y", "/x") "lb": return path.replace("/lb", "/l") "rb": return path.replace("/rb", "/r") "lt": return path.replace("/lt", "/zl") "rt": return path.replace("/rt", "/zr") "select": return path.replace("/select", "/minus") "start": return path.replace("/start", "/plus") "share": return path.replace("/share", "/square") _: return path func _convert_joypad_to_joycon(path: String): path = _convert_joypad_to_switch(path) match path.substr(path.find("/") + 1): "dpad_up": return path.replace("/dpad_up", "/up") "dpad_down": return path.replace("/dpad_down", "/down") "dpad_left": return path.replace("/dpad_left", "/left") "dpad_right": return path.replace("/dpad_right", "/right") _: return path func _convert_joypad_to_xbox360(path: String): path = path.replace("joypad", "xbox360") match path.substr(path.find("/") + 1): "select": return path.replace("/select", "/back") _: return path func _convert_joypad_to_xbox_modern(path: String): match path.substr(path.find("/") + 1): "select": return path.replace("/select", "/view") "start": return path.replace("/start", "/menu") _: return path func _convert_joypad_to_xboxone(path: String): return _convert_joypad_to_xbox_modern(path.replace("joypad", "xboxone")) func _convert_joypad_to_xboxseries(path: String): return _convert_joypad_to_xbox_modern(path.replace("joypad", "xboxseries")) func _convert_joypad_to_steamdeck(path: String): path = path.replace("joypad", "steamdeck") match path.substr(path.find("/") + 1): "lb": return path.replace("/lb", "/l1") "rb": return path.replace("/rb", "/r1") "lt": return path.replace("/lt", "/l2") "rt": return path.replace("/rt", "/r2") "select": return path.replace("/select", "/inventory") "start": return path.replace("/start", "/menu") "home": return path.replace("/home", "/steam") "share": return path.replace("/share", "/dots") _: return path func _convert_joypad_to_ouya(path: String): path = path.replace("joypad", "ouya") match path.substr(path.find("/") + 1): "a": return path.replace("/a", "/o") "x": return path.replace("/x", "/u") "b": return path.replace("/b", "/a") "lb": return path.replace("/lb", "/l1") "rb": return path.replace("/rb", "/r1") "lt": return path.replace("/lt", "/l2") "rt": return path.replace("/rt", "/r2") "start": return path.replace("/start", "/menu") "share": return path.replace("/share", "/microphone") _: return path