Gamepad can be better handled by using SDL_gamecontroller instead of directly SDL_joystick API.
Pros :
One future improvement which can be nice is to deport saved mapping from save game to an engine settings file + an engine menu and save mapping by controller.
Pros :
- Mapped buttons with "real" name
- No need to remap buttons while switching controller
- A default mapping can be hard coded (and why not overrideable with an engine settings file)
- If the controller is not known, it must be added "manually" before it can be used (which is not the case with SDL_joystick)
- Replace SDL_joystick by SDL_gamecontroller
- Add a hard coded default mapping
A -> action
B -> attack
X -> item_1
Y -> item_2
start -> "pause"
Map both left joystick (axis) and dpad (hat) to directions.
Maybe deprecate Lua axis/hat functions (sol.input..._joypad_..., game:on_joypad_..., ...) and add something like ..._joypad_direction(direction) or use existing ...joypad_button_.. functions ? - Load game controller (SDL) mappings from a file E.g : Solarus_save_path/gamecontrollerdb.txt to let user add gamepad mappings if needed.
// see SDL_GameControllerDB
// Several gamepad are already mapped in SDL 2.0.7 (I don't know for previous version) : http://hg.libsdl.org/SDL/file/2088cd828335/src/joystick/SDL_gamecontrollerdb.h - Try to create a default (SDL) mapping if the controller is not supported
- Handle joystick added/removed event.
on added : If there is no controller or this controller was used before, use it.
on removed : "do nothing" (I mean we don't pick the next one). - Convert "button X" from old save game with new mapping
- Add haptic rumble in Lua API
bool is_joypad_rumble_enabled()
void set_joypad_rumble_enabled([bool enabled])
void joypad_rumble_play(float strength, int duration) // strength [0-1], duration in ms
void joypad_rumble_stop()
A function for periodic effect can be nice too for boss/cinematic/...
One future improvement which can be nice is to deport saved mapping from save game to an engine settings file + an engine menu and save mapping by controller.