src/Input.cc
author terom
Mon, 08 Dec 2008 18:12:43 +0000
changeset 300 417183866f35
parent 282 e0e4dfc3e528
child 311 440763821484
permissions -rw-r--r--
suicide key and respawning

#define INPUT_CC

#include "Input.hh"

template <typename BitEnumType> struct InputKeymapEntry {
    BitEnumType input;
    int keycode1, keycode2;
};

InputKeymapEntry<PlayerInputBit> INPUT_PLAYER_KEYMAP[] = {
    {   INPUT_AIM_UP,       -CL_KEY_ENTER,      CL_KEY_UP       },
    {   INPUT_AIM_DOWN,     -CL_KEY_ENTER,      CL_KEY_DOWN     },
    {   INPUT_MOVE_LEFT,    -CL_KEY_ENTER,      CL_KEY_LEFT     },
    {   INPUT_MOVE_RIGHT,   -CL_KEY_ENTER,      CL_KEY_RIGHT    },
    {   INPUT_JUMP,         -CL_KEY_ENTER,      CL_KEY_RSHIFT   },
    {   INPUT_DIG,          CL_KEY_LEFT,        CL_KEY_RIGHT    },
    {   INPUT_SHOOT,        CL_KEY_RCONTROL,    0               },
    {   INPUT_CHANGE_PREV,  CL_KEY_ENTER,       CL_KEY_LEFT     },
    {   INPUT_CHANGE_NEXT,  CL_KEY_ENTER,       CL_KEY_RIGHT    },
    {   INPUT_ROPE,         CL_KEY_ENTER,       CL_KEY_RSHIFT   },
    {   INPUT_UNROPE,       -CL_KEY_ENTER,      CL_KEY_RSHIFT   },
    {   INPUT_ROPE_UP,      CL_KEY_ENTER,       CL_KEY_UP       },
    {   INPUT_ROPE_DOWN,    CL_KEY_ENTER,       CL_KEY_DOWN     },
    {   INPUT_SUICIDE,      CL_KEY_LCONTROL,    CL_KEY_K        },
    {   INPUT_NONE,         0,                  0               }
};

InputKeymapEntry<GuiInputBit> INPUT_GUI_KEYMAP[] = {
    {   GUI_INPUT_QUIT,             CL_KEY_ESCAPE,          0   },
    {   GUI_INPUT_DISPLAY_WEAPON,   CL_KEY_ENTER,           0   },
    {   GUI_INPUT_DEBUG_PLAYER,     CL_KEY_I,               0   },
};

Input::Input (CL_InputDevice &keyboard) :
    keyboard(keyboard)
{

}
    
bool Input::checkKeycode (int keycode) {
    if (keycode > 0)
        return keyboard.get_keycode(keycode);

    else if (keycode < 0)
        return !keyboard.get_keycode(-keycode);

    else // == 0
        return true;
}

template <typename BitEnumType, typename BitMaskType> BitMaskType Input::buildMask (InputKeymapEntry<BitEnumType> *keymap) {
    BitMaskType input_mask = 0;

    for (InputKeymapEntry<BitEnumType> *e = keymap; (e->keycode1 || e->keycode2) && e->input; e++) {
        if (checkKeycode(e->keycode1) && checkKeycode(e->keycode2))
            input_mask |= e->input;
    }
    
    return input_mask;
}

PlayerInput Input::readPlayerInput (void) {
    return buildMask<PlayerInputBit, PlayerInput>(INPUT_PLAYER_KEYMAP);
}

GuiInput Input::readGuiInput (void) {
    return buildMask<GuiInputBit, GuiInput>(INPUT_GUI_KEYMAP);
}