Input method manager

I have a strong notion, a game should always have gamepad and keyboard controls and a player shouldn't spend a lot of time on switching between them.

That's why I've made a simple input method manager which I used in HONK. You should place this object in all rooms and it will change your input method on the go.

Create Event

``` // Create a list of gamepad slots connectedGamepads = dslistcreate();

// Set active gamepad global.ActiveGamepad = noone;

// Setup input methods enum InputMethod { Gamepad, KeyboardMouse }

// Set current input global.CurrentInput = InputMethod.KeyboardMouse;

// Set deadzone and threshhold for Xbox gamepad xboxAxisDeadzone = 0.25; xboxButtonThreshhold = 0.1;

// Set deadzone and threshhold for PS4 gamepad ps4AxisDeadzone = 0.2; ps4ButtonThreshhold = 0.1; ```

Clean Up event

ds_list_destroy(connectedGamepads);

Begin step

``` /// @description InputSwitcher

var listSize = dslist_size(connectedGamepads);

if (_listSize != 0) { for (var i = 0; i < _listSize; i++) { var _slot = connectedGamepads[| i];

    var _leftStickV = gamepad_axis_value(_slot, gp_axislv) != 0;
    var _leftStickH = gamepad_axis_value(_slot, gp_axislh) != 0;
    var _rightStickV = gamepad_axis_value(_slot, gp_axisrv) != 0;
    var _rightStickH = gamepad_axis_value(_slot, gp_axisrh) != 0;

    for (var k = gp_face1; k < gp_axisrv; k++) 
    {
        if (gamepad_button_check_pressed(_slot, k)) 
        {
            global.CurrentInput = InputMethod.Gamepad;
            set_active_gamepad(_slot);
        }
    }

    if (_leftStickV && _leftStickH) || (_rightStickV && _rightStickH)
    {
        global.CurrentInput = InputMethod.Gamepad;
        set_active_gamepad(_slot);
    }
}

if (global.CurrentInput != InputMethod.KeyboardMouse)
{
    var _mouseKeyPressed = mouse_check_button_pressed(mb_any);
    var _keyboardKeyPressed = keyboard_check_pressed(vk_anykey);

    if (_mouseKeyPressed || _keyboardKeyPressed)
    {
        global.CurrentInput = InputMethod.KeyboardMouse;
    }
}

} ```

Async - System event

``` /// @description GamepadConnectionHandler

switch(asyncload[? "eventtype"])
{ case "gamepad discovered": var gamepadSlot = asyncload[? "pad_index"];

    if (gamepad_is_supported())
    {
        ds_list_add(connectedGamepads, _gamepadSlot);
        set_active_gamepad(_gamepadSlot);
        global.CurrentInput = InputMethod.Gamepad;
    }
break;

case "gamepad lost":
    var _gamepadSlot = async_load[? "pad_index"];
    var _gamepadListIndex = ds_list_find_index(connectedGamepads, _gamepadSlot);

    ds_list_delete(connectedGamepads, _gamepadListIndex);

    var _listSize = ds_list_size(connectedGamepads);

    if (_listSize == 0)
    {
        global.ActiveGamepad = noone;
        global.CurrentInput = InputMethod.KeyboardMouse;
    }
    else if (_gamepadSlot == global.ActiveGamepad)
    {
        global.ActiveGamepad = connectedGamepads[| 0];
    }
break;

} ```

setactivegamepad script

``` // @param gamepadSlot

var _gamepadSlot = argument0;

global.ActiveGamepad = gamepadSlot; if (gamepadSlot >= 0 && gamepadSlot <= 3) // Set dead zones for Xbox controller { gamepadsetaxisdeadzone(gamepadSlot, xboxAxisDeadzone); gamepadsetbuttonthreshold(gamepadSlot, xboxButtonThreshhold); } else // Set dead zones for Playstation controller { gamepadsetaxisdeadzone(gamepadSlot, ps4AxisDeadzone); gamepadsetbuttonthreshold(_gamepadSlot, ps4ButtonThreshhold); } ```