src/Input.cc
branchnew_graphics
changeset 414 cede5463b845
parent 413 7dddc163489a
child 415 c1069d23890b
--- a/src/Input.cc	Wed Jan 21 23:25:29 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,225 +0,0 @@
-
-#include "Input.hh"
-#include "Engine.hh"
-#include "Config.hh"
-
-InputKeymapEntry<PlayerInputBit> INPUT_PLAYER_KEYMAP[] = {
-    {   INPUT_AIM_UP,       INPUT_FLAG_UNLIMITED,   { -CL_KEY_ENTER,    CL_KEY_UP       } },
-    {   INPUT_AIM_DOWN,     INPUT_FLAG_UNLIMITED,   { -CL_KEY_ENTER,    CL_KEY_DOWN     } },
-    {   INPUT_MOVE_LEFT,    INPUT_FLAG_UNLIMITED,   { -CL_KEY_ENTER,    CL_KEY_LEFT     } },
-    {   INPUT_MOVE_RIGHT,   INPUT_FLAG_UNLIMITED,   { -CL_KEY_ENTER,    CL_KEY_RIGHT    } },
-    {   INPUT_JUMP,         INPUT_FLAG_SLOWREPEAT,  { -CL_KEY_ENTER,    CL_KEY_RSHIFT   } },
-    {   INPUT_DIG,          INPUT_FLAG_NOREPEAT,    { CL_KEY_LEFT,      CL_KEY_RIGHT    } },
-    {   INPUT_SHOOT,        INPUT_FLAG_UNLIMITED,   { CL_KEY_RCONTROL,  0               } },
-    {   INPUT_CHANGE_PREV,  INPUT_FLAG_SLOWREPEAT,  { CL_KEY_ENTER,     CL_KEY_LEFT     } },
-    {   INPUT_CHANGE_NEXT,  INPUT_FLAG_SLOWREPEAT,  { CL_KEY_ENTER,     CL_KEY_RIGHT    } },
-    {   INPUT_ROPE,         INPUT_FLAG_NOREPEAT,    { CL_KEY_ENTER,     CL_KEY_RSHIFT   } },
-    {   INPUT_UNROPE,       INPUT_FLAG_SLOWREPEAT,  { -CL_KEY_ENTER,    CL_KEY_RSHIFT   } },
-    {   INPUT_ROPE_UP,      INPUT_FLAG_UNLIMITED,   { CL_KEY_ENTER,     CL_KEY_UP       } },
-    {   INPUT_ROPE_DOWN,    INPUT_FLAG_UNLIMITED,   { CL_KEY_ENTER,     CL_KEY_DOWN     } },
-    {   INPUT_SUICIDE,      INPUT_FLAG_NOREPEAT,    { CL_KEY_LCONTROL,  CL_KEY_K        } },
-    {   INPUT_NONE,         0,                      { 0,                0               } }
-};
-
-InputKeymapEntry<GuiInputBit> INPUT_GUI_KEYMAP[] = {
-    {   GUI_INPUT_QUIT,                 0,                  { CL_KEY_ESCAPE,    0               } },
-    {   GUI_INPUT_DISPLAY_WEAPON,       0,                  { CL_KEY_ENTER,     0               } },
-    {   GUI_INPUT_DEBUG_PLAYER,         0,                  { CL_KEY_I,         0               } },
-    {   GUI_INPUT_TOGGLE_FULLSCREEN,    INPUT_FLAG_NOREPEAT,{ CL_KEY_LCONTROL,  CL_KEY_F        } },
-    {   GUI_INPUT_NONE,                 0,                  { 0,                0,              } }
-};
-
-/*
- * InputKeyRepeatEntry
- */
-template <typename BitEnumType> 
-InputKeyRepeatEntry<BitEnumType>::InputKeyRepeatEntry (BitEnumType value, TimeMS expire) : 
-    value(value), expire(expire) 
-{
-
-}
-
-template <typename BitEnumType> 
-bool InputKeyRepeatEntry<BitEnumType>::operator< (const struct InputKeyRepeatEntry &other) {
-    return other.expire > expire;
-}
-
-template <typename BitEnumType> 
-bool InputKeyRepeatEntry<BitEnumType>::updateExpired (TimeMS dt) {
-    if (expire == 0)
-        return false;
-
-    expire -= dt;
-
-    return (expire <= 0);
-}
-
-/*
- * InputKeyRepeatQueue
- */
-template <typename BitEnumType> 
-InputKeyRepeatQueue<BitEnumType>::InputKeyRepeatQueue (TimeMS expire) :
-    expire(expire)
-{
-
-}
-
-template <typename BitEnumType> 
-void InputKeyRepeatQueue<BitEnumType>::push (BitEnumType bit, bool expire) {
-    list.push_back(InputKeyRepeatEntry<BitEnumType>(bit, expire ? this->expire : 0));
-}
-
-template <typename BitEnumType> 
-void InputKeyRepeatQueue<BitEnumType>::forget (BitEnumType bit) {
-    // go through the list, looking for it
-    for (list_iterator it = list.begin(); it != list.end(); it++) {
-        if (it->value == bit) {
-            // found, erase it and return
-            list.erase(it);
-            
-            return;
-        }
-    }
-}
-
-template <typename BitEnumType> 
-bool InputKeyRepeatQueue<BitEnumType>::find (BitEnumType bit) {
-    for (list_iterator it = list.begin(); it != list.end(); it++) {
-        if (it->value == bit)
-            return true;
-    }
-
-    return false;
-}
-
-template <typename BitEnumType> 
-void InputKeyRepeatQueue<BitEnumType>::update (TimeMS dt) {
-    list_iterator it = list.begin();
-    
-    // go through each entry, updateExpired and remove if expired
-    while (it != list.end()) {
-        if (it->updateExpired(dt))
-            it = list.erase(it);
-        else
-            it++;
-    }
-}
-
-/*
- * InputHandler
- */
-template <typename BitEnumType, typename BitMaskType> 
-InputHandler<BitEnumType, BitMaskType>::InputHandler (CL_InputDevice &keyboard, InputKeymapEntry<BitEnumType> *keymap, TimeMS keyrepeat_expire) :
-    keyboard(keyboard), 
-    keymap(keymap), 
-    value(0), 
-    prev_value(0),
-    dt(0),
-    queue(keyrepeat_expire)
-{
-
-}
-
-template <typename BitEnumType, typename BitMaskType> 
-bool InputHandler<BitEnumType, BitMaskType>::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> 
-void InputHandler<BitEnumType, BitMaskType>::readValue (BitMaskType &mask, TimeMS &dt) {
-    // copy to args
-    mask = this->value;
-    dt = this->dt;
-
-    this->value = 0;
-    this->dt = 0;
-}
-
-template <typename BitEnumType, typename BitMaskType> 
-void InputHandler<BitEnumType, BitMaskType>::update (TimeMS dt) {
-    // all bits that are held down, even those ignored
-    BitMaskType raw_value = 0;
-
-    // update the key-repeat queue
-    queue.update(dt);
-
-    // then go through the keymap
-    for (InputKeymapEntry<BitEnumType> *e = keymap; e->input != 0; e++) {
-        // check if we've got the correct keycodes
-        if (checkKeycode(e->keycodes[0]) && checkKeycode(e->keycodes[1])) {
-            // set raw_value
-            raw_value |= e->input;
-
-            if (e->flags & INPUT_FLAG_SLOWREPEAT) {
-                // repeat, but slowly
-                if (!(prev_value & e->input)) {
-                    // we've released the key earlier, move it to the back of the queue
-                    queue.forget(e->input);
-                    queue.push(e->input);
-
-                } else if (queue.find(e->input)) {
-                    // it's still in the queue, so ignore, but set it in ignore_value
-                    continue;
-
-                } else {
-                    // ok, but add it to the queue
-                    queue.push(e->input);
-                }
-
-            } else if (e->flags & INPUT_FLAG_NOREPEAT) {
-                // do not repeat at all
-                if (prev_value & e->input) {
-                    // ignore repeats
-                    continue;
-                }
-            }
-
-            // set bit in masks
-            this->value |= e->input;
-        }
-    }
-
-    // update prev_value, also adding ignored values
-    prev_value = raw_value;
-
-    // then increment our dt
-    this->dt += dt;
-}
-
-/**
- * Input
- */
-Input::Input (CL_InputDevice &keyboard) :
-    keyboard(keyboard),
-    update_timer(INPUT_POLL_INTERVAL),
-    player(keyboard, INPUT_PLAYER_KEYMAP, INPUT_REPEAT_DELAY),
-    gui(keyboard, INPUT_GUI_KEYMAP, INPUT_REPEAT_DELAY)
-{
-    // connect timer 
-    slots.connect(update_timer.sig_tick(), &player, &InputHandler<PlayerInputBit, PlayerInput>::update);
-    slots.connect(update_timer.sig_tick(), &gui, &InputHandler<GuiInputBit, GuiInput>::update);
-
-    // enable timer
-    update_timer.start();
-}
-
-void Input::readPlayerInput (PlayerInput &mask, TimeMS &dt) {
-    player.readValue(mask, dt);
-}
-
-GuiInput Input::readGuiInput (void) {
-    GuiInput mask;
-    TimeMS dt;
-
-    gui.readValue(mask, dt);
-
-    return mask;
-}
-