#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);
}