src/Input.cc
author terom
Mon, 08 Dec 2008 01:08:00 +0000
changeset 276 87434abc1ba1
parent 237 3d5465bcb67d
child 282 e0e4dfc3e528
permissions -rw-r--r--
ability to send NetworkObjectID's via packets, modify Network Projectiles to use this and fix recoil/reloading

#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                     },
    {   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_NONE,                                             }
};

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

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