terom@221: terom@221: #define INPUT_CC terom@221: terom@221: #include "Input.hh" terom@221: terom@233: template struct InputKeymapEntry { terom@233: BitEnumType input; terom@233: int keycode1, keycode2; terom@221: }; terom@221: terom@233: InputKeymapEntry INPUT_PLAYER_KEYMAP[] = { terom@233: { INPUT_AIM_UP, -CL_KEY_ENTER, CL_KEY_UP }, terom@233: { INPUT_AIM_DOWN, -CL_KEY_ENTER, CL_KEY_DOWN }, terom@233: { INPUT_MOVE_LEFT, -CL_KEY_ENTER, CL_KEY_LEFT }, terom@233: { INPUT_MOVE_RIGHT, -CL_KEY_ENTER, CL_KEY_RIGHT }, terom@233: { INPUT_JUMP, -CL_KEY_ENTER, CL_KEY_RSHIFT }, terom@233: { INPUT_DIG, CL_KEY_LEFT, CL_KEY_RIGHT }, terom@233: { INPUT_SHOOT, CL_KEY_RCONTROL }, terom@237: { INPUT_CHANGE_PREV, CL_KEY_ENTER, CL_KEY_LEFT }, terom@237: { INPUT_CHANGE_NEXT, CL_KEY_ENTER, CL_KEY_RIGHT }, terom@233: { INPUT_ROPE, CL_KEY_ENTER, CL_KEY_RSHIFT }, terom@233: { INPUT_UNROPE, -CL_KEY_ENTER, CL_KEY_RSHIFT }, terom@233: { INPUT_ROPE_UP, CL_KEY_ENTER, CL_KEY_UP }, terom@233: { INPUT_ROPE_DOWN, CL_KEY_ENTER, CL_KEY_DOWN }, terom@233: { INPUT_NONE, } terom@233: }; terom@233: terom@233: InputKeymapEntry INPUT_GUI_KEYMAP[] = { terom@233: { GUI_INPUT_QUIT, CL_KEY_ESCAPE }, terom@233: { GUI_INPUT_DISPLAY_WEAPON, CL_KEY_ENTER }, terom@233: { GUI_INPUT_DEBUG_PLAYER, CL_KEY_I }, terom@233: }; terom@230: terom@235: Input::Input (CL_InputDevice &keyboard) : terom@235: keyboard(keyboard) terom@235: { terom@235: terom@235: } terom@235: terom@235: bool Input::checkKeycode (int keycode) { terom@230: if (keycode > 0) terom@230: return keyboard.get_keycode(keycode); terom@230: terom@230: else if (keycode < 0) terom@230: return !keyboard.get_keycode(-keycode); terom@230: terom@230: else // == 0 terom@230: return true; terom@230: } terom@230: terom@235: template BitMaskType Input::buildMask (InputKeymapEntry *keymap) { terom@233: BitMaskType input_mask = 0; terom@230: terom@233: for (InputKeymapEntry *e = keymap; (e->keycode1 || e->keycode2) && e->input; e++) { terom@235: if (checkKeycode(e->keycode1) && checkKeycode(e->keycode2)) terom@233: input_mask |= e->input; terom@230: } terom@230: terom@233: return input_mask; terom@230: } terom@233: terom@235: PlayerInput Input::readPlayerInput (void) { terom@235: return buildMask(INPUT_PLAYER_KEYMAP); terom@233: } terom@233: terom@235: GuiInput Input::readGuiInput (void) { terom@235: return buildMask(INPUT_GUI_KEYMAP); terom@233: } terom@233: