
fa7f076 extract joystick methods into IJoystick interface - Robyt3
bae85e5 fix joystick menu background height calculation - Robyt3
a3aaa93 allow joystick axis to be bound as keys - Robyt3
d939093 fix text color not being reset after joystick a... - Robyt3
c5e72a3 minor refactoring of joystick settings - Robyt3




str_quickhash

fs_listdir and fs_listdir_fileinfo by reducing nested calls to fs_is_dir (and subsequent additional system API calls).
WIN32_FIND_DATAW finddata instead of calling WinAPI again.
struct dirent *entry instead of calling stat. The file type may not be available on all filesystems, so a call to fs_is_dir is used as fallback.

SpecID can be -1, resulting in
```
src/game/client/components/hud.cpp:787:132: runtime error: index -1 out of bounds for type 'CClientData [64]'
#0 0x561ffa4cdc3f in CHud::RenderSpectatorHud() src/game/client/components/hud.cpp:787
#1 0x561ffa4daf12 in CHud::OnRender() src/game/client/components/hud.cpp:1007
#2 0x561ffa1b9fd6 in CGameClient::OnRender() src/game/client/gameclient.cpp:611
#3 0x561ffa08d4eb in CClient::Render() src/engine/client/client.cpp:798
#...



MAX_MAPS_PER_PACKET = 48. I also tested with MAX_MAPS_PER_PACKET = 2 to confirm that it works when the maplist is split over multiple packets.
Closes #1781.
I can't reproduce #2380. Can probably be closed as well unless someone can confirm that it's broken and provide details.const to generated output in accordance with #3044.
Add a comment explaining that the tool always uses the second storage path, which is assumed the default data dir.
I was getting an empty output, because my second storage path didn't have any maps in it.
