GMS2 Gamepad DB Composer, @offalynne, 2021
February 13, 2023 ยท View on GitHub
#!/usr/bin/python
GMS2 Gamepad DB Composer, @offalynne, 2021
processes the SDL2 Community Gamepad Mapping DB for GMS2 compatibility
run script and place the resulting gamecontrollerdb.txt in datafiles
import re import os import sys import urllib.request
print("Running revision 18") print("Warning !! As of GMS2022.11.1.75 GUID format for Windows has changed") print("Loading remote source")
get source db
source_url = "https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt" source_content = None try: source_content = urllib.request.urlopen(source_url).read().decode('utf-8') except Exception as e: print(e); exit("Failed to fetch remote source")
print("Rebuilding DB")
clean up unsupported features
content = source_content
move hat-on-stick to dpad
content = content.replace("+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1", "dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1")
move axis-on-dpad to stick
content = re.compile(r"dpdown:+a(.+?),dpleft:-a(.+?),dpright:+a\2,dpup:-a\1").sub("leftx:a\2,lefty:a\1", content)
remove negative axis triggers
content = re.compile(r"((left|right)trigger:-a[0-999],)").sub("", content)
remove remaining maps with axis limiters
content = re.compile(r"([0-9a-f]{32},.,[-|+].\n)").sub("", content)
remove inverters
content = content.replace("~", "")
remove unsupported fields
content = re.compile(r"(,(guide|touchpad|misc1|paddle[1-4]):(.+?),)").sub(",", content)
swap back to guide (gp_select)
content = content.replace(",back:", ",guide:")
downgrade GUID !! Pre GMS2022.11.1.75 only !!
windows_maps = "" re_find = re.compile(r"[03|05][0-9a-f]{6}([0-9a-f]{4})[0-9a-f]{4}([0-9a-f]{4})[0-9a-f]{12}(,.*platform:Windows,)") for m in re.finditer(re_find, content): windows_maps += m.group(1) + m.group(2) + "000000000000504944564944" + m.group(3) + "\n"
remove dpad button keymaps
android_maps = "" re_find = re.compile(r"(.)(,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,)(.,platform:Android,)") for m in re.finditer(re_find, content): android_maps += m.group(1) + ",dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1," + m.group(3) + "\n"
omit unsupported platforms
seek_after = "# Mac OS X" seek_before = "\n\n# Android" seek_start = content.index(seek_after) + len(seek_after) seek_end = content.index(seek_before, seek_start) content = content[seek_start:seek_end]
rebuild db
rebuild_content = "# Game Controller DB for SDL\n" rebuild_content += "# Source: https://github.com/gabomdq/SDL_GameControllerDB\n\n# Windows\n" rebuild_content += windows_maps + "\n# Mac OS X" + content + "\n\n# Android\n" + android_maps content = rebuild_content
print("Writing DB file")
write file
db_filename = "gamecontrollerdb.txt" if os.path.isfile(db_filename): os.remove(db_filename)
file_handle = open(db_filename, "a") file_handle.write(content)
print("Done")