Skip to content

Instantly share code, notes, and snippets.

@JujuAdams
Created June 12, 2019 20:03
Show Gist options
  • Save JujuAdams/c0c8948e747459622ff1ba0aaee00ef0 to your computer and use it in GitHub Desktop.
Save JujuAdams/c0c8948e747459622ff1ba0aaee00ef0 to your computer and use it in GitHub Desktop.
//// quick n dirty script to get gms2-mapped pad device type across pc/android
//
// takes gamepad id (real), returns device type (string)
// types: xb360, xbone, ps3, ps4, switch, snes, saturn, 8bitdo, steam, ouya
// note: xb360 & xbone are conflated on windows target
//
// refs:
// https://github.com/gabomdq/SDL_GameControllerDB/
// https://yachtclubgames.com/2014/03/steam-controller-support/
// https://github.com/libretro/retroarch-joypad-autoconfig/
// https://support.steampowered.com/kb_article.php?ref=5199-TOKV-4426
// http://www.linux-usb.org/usb.ids
//
// covers all but the following ids which i haven't been able to identify:
// Android: 0500000011010000201400000f7e0f00, 31326235383662333266633463653332
// Linux: 05000000362000010000000201000000, 03000000c6240000fdfa000000010000
var _gamepad_index = argument0;
// smoke check
if !(gamepad_is_supported() &&
(os_type == os_windows || os_type == os_macosx ||
os_type == os_linux || os_type == os_android))
show_error("Unsupported Platform", true)
// empty slot
if !gamepad_is_connected(_gamepad_index)
return "disconnected";
var _guid = gamepad_get_guid(_gamepad_index);
var _device_type = "unknown";
// handle out of range
if _guid = "device index out of range"
show_error(string(_gamepad_index) + ": " + _guid, true);
// handle missing map
if _guid == "" || _guid == "none"
return _device_type;
switch (os_type) {
#region windows
case os_windows:
// slots 0-3 are reserved for xinput
if _gamepad_index < 4
return "xb360";
// abbreviate format for windows target (vid/pid only)
_guid = string_copy(gamepad_get_guid(_gamepad_index),0,8)
// test for known guids (see refs)
switch (_guid) {
case "02200090":
case "20380900":
_device_type = "8bitdo"; // snes button w/ 2 sticks
break;
case "36280100":
_device_type = "ouya";
break;
case "10080300":
case "0d0f4900":
case "0d0f6e00":
case "10080100":
case "25090500":
case "341a3608":
case "4c056802":
case "4f0400b3":
case "4f0423b3":
case "6d0419c2":
case "6f0e1e01":
case "88880803":
case "8f0e0d31":
case "8f0e1200":
case "d6206dca":
_device_type = "ps3";
break;
case "4c05a00b":
case "4c05c405":
case "4c05cc09":
_device_type = "ps4";
break;
case "00f00300":
case "00f0f100":
case "100801e5":
case "10280900":
case "79000600":
case "83056020":
_device_type = "snes";
break;
case "28040140":
case "7e050920":
case "2509e803":
case "79000018":
_device_type = "switch";
break;
case "300f1001":
case "341a0108":
case "49190204":
case "8f0e0300":
_device_type = "xb360";
break;
}
break;
#endregion
#region macos
case os_macosx:
switch (_guid) {
case "03000000022000000090000001000000":
case "03000000203800000900000000010000":
_device_type = "8bitdo";
break;
case "030000000d0f00004d00000000000000":
case "030000000d0f00005f00000000000000":
case "030000000d0f00005f00000000010000":
case "030000000d0f00006e00000000010000":
case "030000004c0500006802000000010000":
case "030000006d04000016c2000000000000":
case "030000006d04000019c2000000000000":
case "030000006d0400001fc2000000000000":
case "030000008f0e00000300000000000000":
case "03000000a306000022f6000001030000":
case "03000000bd12000015d0000000000000":
_device_type = "ps3";
break;
case "030000000d0f00005e00000000000000":
case "030000000d0f00005e00000000010000":
case "030000000d0f00006600000000000000":
case "030000000d0f00006600000000010000":
case "03000000120c0000100e000000010000":
case "03000000321500000010000000010000":
case "03000000380700005032000000010000":
case "03000000380700005082000000010000":
case "030000004c0500006802000000000000":
case "030000004c050000a00b000000000000":
case "030000004c050000a00b000000010000":
case "030000004c050000c405000000000000":
case "030000004c050000c405000000010000":
case "030000004c050000cc09000000000000":
case "030000004c050000cc09000000010000":
case "030000006b140000010d000000010000":
_device_type = "ps4";
break;
case "03000000811700007e05000000000000":
case "03000000b40400000a01000000000000":
_device_type = "saturn";
break;
case "030000001008000001e5000006010000":
case "03000000102800000900000000000000":
case "030000003512000021ab000000000000":
case "03000000790000001100000000000000":
case "03000000790000001100000006010000":
case "03000000830500006020000000000000":
case "03000000830500006020000000010000":
case "030000008f0e00001330000011010000":
case "03000000bd12000015d0000000010000":
case "050000005769696d6f74652028303000":
case "03000000a00500003232000008010000":
_device_type = "snes";
break;
case "030000005e0400008e02000001000000":
_device_type = "steam";
break;
case "0300000025090000e803000000000000":
case "03000000790000000018000000000000":
case "030000007e0500000920000000000000":
case "030000007e0500000920000001000000":
case "050000005769696d6f74652028313800":
_device_type = "switch";
break;
case "0300000032150000030a000000000000":
case "030000005e040000d102000000000000":
case "030000005e040000dd02000000000000":
case "030000005e040000e002000000000000":
case "030000005e040000e002000003090000":
case "030000005e040000e302000000000000":
case "030000005e040000ea02000000000000":
case "030000005e040000fd02000003090000":
_device_type = "xbone";
break;
case "03000000110100001714000000000000":
case "03000000110100001714000020010000":
case "03000000110100002014000000000000":
case "03000000110100002014000001000000":
case "03000000172700004431000029010000":
case "03000000381000002014000001000000":
case "030000005e0400008e02000000000000":
case "030000008916000000fd000000000000":
case "03000000ad1b000001f9000000000000":
case "03000000c6240000045d000000000000":
case "03000000d8140000cecf000000000000":
_device_type = "xb360";
break;
}
break;
#endregion
#region linux
case os_linux:
switch (_guid) {
case "050000007e0500003003000001000000":
_device_type = "8bitdo";
break;
case "03000000de280000ff11000001000000":
_device_type = "steam";
break;
case "05000000362800000100000002010000":
case "05000000362800000100000003010000":
_device_type = "ouya";
break;
case "0300000000f000000300000000010000":
case "0300000000f00000f100000000010000":
case "03000000790000001100000010010000":
case "03000000830500006020000010010000":
case "03000000bd12000015d0000010010000":
case "05000000102800000900000000010000":
_device_type = "snes";
break;
case "030000004c050000a00b000011010000":
case "030000004c050000c405000011010000":
case "030000004c050000cc09000011010000":
case "03000000ba2200002010000001010000":
case "050000004c050000c405000000010000":
case "050000004c050000cc09000000010000":
_device_type = "ps4";
break;
case "030000000d0f00001000000011010000":
case "030000000d0f00002200000011010000":
case "03000000100800000100000010010000":
case "03000000250900000500000000010000":
case "030000004c0500006802000011010000":
case "030000004f04000008d0000000010000":
case "030000004f04000009d0000000010000":
case "030000004f04000015b3000010010000":
case "030000004f04000020b3000010010000":
case "030000004f04000023b3000000010000":
case "03000000666600000488000000010000":
case "030000006d04000019c2000011010000":
case "030000006d0400001fc2000005030000":
case "030000006f0e00001e01000011010000":
case "030000006f0e00003001000001010000":
case "030000008f0e00000300000010010000":
case "030000008f0e00001200000010010000":
case "03000000d814000007cd000011010000":
case "03000000d81400000862000011010000":
case "03000000f0250000c183000010010000":
case "050000004c0500006802000000010000":
case "060000004c0500006802000000010000":
_device_type = "ps3";
break;
case "030000005e0400008502000000010000":
case "030000005e0400008902000021010000":
case "030000005e040000d102000001010000":
case "030000005e040000dd02000003020000":
case "030000006f0e00003901000020060000":
case "030000006f0e00004601000001010000":
_device_type = "xbone";
break;
case "0000000058626f782047616d65706100":
case "03000000380700001647000010040000":
case "030000005e0400001907000000010000":
case "030000005e0400008e02000004010000":
case "030000005e0400008e02000010010000":
case "030000005e0400008e02000014010000":
case "030000005e0400008e02000020200000":
case "030000005e0400008e02000062230000":
case "030000005e0400009102000007010000":
case "030000006d04000011c2000010010000":
case "030000006e0500000320000010010000":
case "030000006f0e00000103000000020000":
case "030000006f0e00001304000000010000":
case "030000006f0e00001f01000000010000":
case "030000008916000000fd000024010000":
case "030000008916000001fd000024010000":
case "03000000ad1b000001f5000033050000":
case "03000000ad1b000016f0000090040000":
case "03000000c9110000f055000011010000":
case "0500000047532047616d657061640000":
case "05000000d6200000ad0d000001000000":
_device_type = "xb360";
break;
}
break;
#endregion
#region android
case os_android:
switch (_guid) {
case "05000000de2800000511000001000000":
_device_type = "steam";
break;
case "050000005e040000fd020000ffff3f00":
_device_type = "xbone";
break;
case "050000004c050000c4050000fffe3f00":
case "35643031303033326130316330353564":
_device_type = "ps4";
break;
case "050000005509000003720000cf7f3f00":
case "0500000011010000201400000f7e0f00":
case "34356136633366613530316338376136":
case "37336435666338653565313731303834":
case "4e564944494120436f72706f72617469":
case "61363931656135336130663561616264":
case "64633436313965656664373634323364":
_device_type = "xb360";
break;
}
break;
#endregion
}
return _device_type;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment