---
 src/interface/keyboard.cpp              |  193 +++++++++++++++++++++----------
 src/interface/keyboard.h                |    6 +
 src/interface/man_machine_interface.cpp |  179 +++++++++++++++++++----------
 src/interface/man_machine_interface.h   |   55 +++++++--
 4 files changed, 299 insertions(+), 134 deletions(-)

diff --git a/src/interface/keyboard.cpp b/src/interface/keyboard.cpp
index 7debe61..b5dc813 100644
--- a/src/interface/keyboard.cpp
+++ b/src/interface/keyboard.cpp
@@ -24,6 +24,15 @@
 #include "network/chat.h"
 #include <SDL_events.h>
 
+#define MODIFIER_OFFSET (SDLK_LAST + 1)
+#define SHIFT_BIT 0x1
+#define ALT_BIT 0x2
+#define CONTROL_BIT 0x4
+#define SHIFT_OFFSET (MODIFIER_OFFSET * SHIFT_BIT)
+#define CONTROL_OFFSET (MODIFIER_OFFSET * CONTROL_BIT)
+#define ALT_OFFSET (MODIFIER_OFFSET * ALT_BIT)
+
+
 Keyboard::Keyboard() : ManMachineInterface()
 {
   //Disable repeated events when a key is kept down
@@ -37,43 +46,106 @@ Keyboard::Keyboard() : ManMachineInterface()
 
 void Keyboard::SetDefaultConfig()
 {
-  SetKeyAction(SDLK_LEFT,      ManMachineInterface::KEY_MOVE_LEFT);
-  SetKeyAction(SDLK_RIGHT,     ManMachineInterface::KEY_MOVE_RIGHT);
-  SetKeyAction(SDLK_UP,        ManMachineInterface::KEY_UP);
-  SetKeyAction(SDLK_DOWN,      ManMachineInterface::KEY_DOWN);
-  SetKeyAction(SDLK_RETURN,    ManMachineInterface::KEY_JUMP);
-  SetKeyAction(SDLK_BACKSPACE, ManMachineInterface::KEY_HIGH_JUMP);
-  SetKeyAction(SDLK_b,         ManMachineInterface::KEY_BACK_JUMP);
-  SetKeyAction(SDLK_SPACE,     ManMachineInterface::KEY_SHOOT);
-  SetKeyAction(SDLK_TAB,       ManMachineInterface::KEY_NEXT_CHARACTER);
-  SetKeyAction(SDLK_ESCAPE,    ManMachineInterface::KEY_QUIT);
-  SetKeyAction(SDLK_PAUSE,     ManMachineInterface::KEY_PAUSE);
-  SetKeyAction(SDLK_F10,       ManMachineInterface::KEY_FULLSCREEN);
-  SetKeyAction(SDLK_F9,        ManMachineInterface::KEY_TOGGLE_INTERFACE);
-  SetKeyAction(SDLK_F1,        ManMachineInterface::KEY_WEAPONS1);
-  SetKeyAction(SDLK_F2,        ManMachineInterface::KEY_WEAPONS2);
-  SetKeyAction(SDLK_F3,        ManMachineInterface::KEY_WEAPONS3);
-  SetKeyAction(SDLK_F4,        ManMachineInterface::KEY_WEAPONS4);
-  SetKeyAction(SDLK_F5,        ManMachineInterface::KEY_WEAPONS5);
-  SetKeyAction(SDLK_F6,        ManMachineInterface::KEY_WEAPONS6);
-  SetKeyAction(SDLK_F7,        ManMachineInterface::KEY_WEAPONS7);
-  SetKeyAction(SDLK_F8,        ManMachineInterface::KEY_WEAPONS8);
-  SetKeyAction(SDLK_c,         ManMachineInterface::KEY_CENTER);
-  SetKeyAction(SDLK_1,         ManMachineInterface::KEY_WEAPON_1);
-  SetKeyAction(SDLK_2,         ManMachineInterface::KEY_WEAPON_2);
-  SetKeyAction(SDLK_3,         ManMachineInterface::KEY_WEAPON_3);
-  SetKeyAction(SDLK_4,         ManMachineInterface::KEY_WEAPON_4);
-  SetKeyAction(SDLK_5,         ManMachineInterface::KEY_WEAPON_5);
-  SetKeyAction(SDLK_6,         ManMachineInterface::KEY_WEAPON_6);
-  SetKeyAction(SDLK_7,         ManMachineInterface::KEY_WEAPON_7);
-  SetKeyAction(SDLK_8,         ManMachineInterface::KEY_WEAPON_8);
-  SetKeyAction(SDLK_9,         ManMachineInterface::KEY_WEAPON_9);
-  SetKeyAction(SDLK_PAGEUP,    ManMachineInterface::KEY_WEAPON_MORE);
-  SetKeyAction(SDLK_PAGEDOWN,  ManMachineInterface::KEY_WEAPON_LESS);
-  SetKeyAction(SDLK_s,         ManMachineInterface::KEY_CHAT);
-  SetKeyAction(SDLK_t,         ManMachineInterface::KEY_CHAT);
-  SetKeyAction(SDLK_F11,       
ManMachineInterface::KEY_MENU_OPTIONS_FROM_GAME);
-  SetKeyAction(SDLK_m,         ManMachineInterface::KEY_MINIMAP_FROM_GAME);
+  SetKeyAction(SDLK_LEFT,                    
ManMachineInterface::KEY_MOVE_LEFT);
+  SetKeyAction(SHIFT_OFFSET + SDLK_LEFT,     
ManMachineInterface::KEY_MOVE_LEFT_SLOWLY);
+  SetKeyAction(SDLK_RIGHT,                   
ManMachineInterface::KEY_MOVE_RIGHT);
+  SetKeyAction(SHIFT_OFFSET + SDLK_RIGHT,    
ManMachineInterface::KEY_MOVE_RIGHT_SLOWLY);
+  SetKeyAction(SDLK_UP,                      ManMachineInterface::KEY_UP);
+  SetKeyAction(SHIFT_OFFSET + SDLK_UP,       
ManMachineInterface::KEY_UP_SLOWLY);
+  SetKeyAction(SDLK_DOWN,                    ManMachineInterface::KEY_DOWN);
+  SetKeyAction(SHIFT_OFFSET + SDLK_DOWN,     
ManMachineInterface::KEY_DOWN_SLOWLY);
+  SetKeyAction(CONTROL_OFFSET + SDLK_LEFT,   
ManMachineInterface::KEY_MOVE_CAMERA_LEFT);
+  SetKeyAction(CONTROL_OFFSET + SDLK_RIGHT,  
ManMachineInterface::KEY_MOVE_CAMERA_RIGHT);
+  SetKeyAction(CONTROL_OFFSET + SDLK_UP,     
ManMachineInterface::KEY_MOVE_CAMERA_UP);
+  SetKeyAction(CONTROL_OFFSET + SDLK_DOWN,   
ManMachineInterface::KEY_MOVE_CAMERA_DOWN);
+  SetKeyAction(SDLK_RETURN,                  ManMachineInterface::KEY_JUMP);
+  SetKeyAction(SDLK_BACKSPACE,               
ManMachineInterface::KEY_HIGH_JUMP);
+  SetKeyAction(SDLK_b,                       
ManMachineInterface::KEY_BACK_JUMP);
+  SetKeyAction(SDLK_SPACE,                   ManMachineInterface::KEY_SHOOT);
+  SetKeyAction(SDLK_TAB,                     
ManMachineInterface::KEY_NEXT_CHARACTER);
+  SetKeyAction(SDLK_ESCAPE,                  ManMachineInterface::KEY_QUIT);
+  SetKeyAction(SDLK_PAUSE,                   ManMachineInterface::KEY_PAUSE);
+  SetKeyAction(SDLK_F10,                     
ManMachineInterface::KEY_FULLSCREEN);
+  SetKeyAction(SDLK_F9,                      
ManMachineInterface::KEY_TOGGLE_INTERFACE);
+  SetKeyAction(SDLK_F1,                      
ManMachineInterface::KEY_WEAPONS1);
+  SetKeyAction(SDLK_F2,                      
ManMachineInterface::KEY_WEAPONS2);
+  SetKeyAction(SDLK_F3,                      
ManMachineInterface::KEY_WEAPONS3);
+  SetKeyAction(SDLK_F4,                      
ManMachineInterface::KEY_WEAPONS4);
+  SetKeyAction(SDLK_F5,                      
ManMachineInterface::KEY_WEAPONS5);
+  SetKeyAction(SDLK_F6,                      
ManMachineInterface::KEY_WEAPONS6);
+  SetKeyAction(SDLK_F7,                      
ManMachineInterface::KEY_WEAPONS7);
+  SetKeyAction(SDLK_F8,                      
ManMachineInterface::KEY_WEAPONS8);
+  SetKeyAction(SDLK_c,                       ManMachineInterface::KEY_CENTER);
+  SetKeyAction(SDLK_1,                       
ManMachineInterface::KEY_WEAPON_1);
+  SetKeyAction(SDLK_2,                       
ManMachineInterface::KEY_WEAPON_2);
+  SetKeyAction(SDLK_3,                       
ManMachineInterface::KEY_WEAPON_3);
+  SetKeyAction(SDLK_4,                       
ManMachineInterface::KEY_WEAPON_4);
+  SetKeyAction(SDLK_5,                       
ManMachineInterface::KEY_WEAPON_5);
+  SetKeyAction(SDLK_6,                       
ManMachineInterface::KEY_WEAPON_6);
+  SetKeyAction(SDLK_7,                       
ManMachineInterface::KEY_WEAPON_7);
+  SetKeyAction(SDLK_8,                       
ManMachineInterface::KEY_WEAPON_8);
+  SetKeyAction(SDLK_9,                       
ManMachineInterface::KEY_WEAPON_9);
+  SetKeyAction(SDLK_PAGEUP,                  
ManMachineInterface::KEY_WEAPON_MORE);
+  SetKeyAction(SDLK_PAGEDOWN,                
ManMachineInterface::KEY_WEAPON_LESS);
+  SetKeyAction(SDLK_s,                       ManMachineInterface::KEY_CHAT);
+  SetKeyAction(SDLK_t,                       ManMachineInterface::KEY_CHAT);
+  SetKeyAction(ALT_OFFSET + SDLK_RETURN,     ManMachineInterface::KEY_CHAT);
+  SetKeyAction(SDLK_F11,                     
ManMachineInterface::KEY_MENU_OPTIONS_FROM_GAME);
+  SetKeyAction(SDLK_m,                       
ManMachineInterface::KEY_MINIMAP_FROM_GAME);
+}
+
+
+void Keyboard::HandleKeyComboEvent(int key_code, Key_Event_t event_type)
+{
+  MSG_DEBUG("keyboard", "%s %s%s%s%d",
+            event_type == KEY_PRESSED ?"pressed":"released",
+            ((key_code / MODIFIER_OFFSET) & CONTROL_BIT)?"[control] + ": "",
+            ((key_code / MODIFIER_OFFSET) & ALT_BIT)?"[alt] + ": "",
+            ((key_code / MODIFIER_OFFSET) & SHIFT_BIT)?"[shift] + ": "",
+            key_code % MODIFIER_OFFSET);
+  std::map<int, Key_t>::iterator it = layout.find(key_code);
+
+  if(it == layout.end())
+    return;
+
+
+  Key_t key = it->second;
+
+  //While player writes, it cannot control the game but QUIT or PAUSE.
+  if (Game::GetInstance()->chatsession.CheckInput()) {
+    switch (key) {
+    case KEY_QUIT:
+    case KEY_PAUSE:
+      break;
+    default:
+      return;
+    }
+  }
+
+  if(event_type == KEY_PRESSED) {
+    HandleKeyPressed(key);
+    return;
+  }
+
+  if(event_type == KEY_RELEASED) {
+    HandleKeyReleased(key);
+    return;
+  }
+}
+
+static int GetModifierBitsFromSDL() {
+  SDLMod sdl_modifier_bits = SDL_GetModState();
+  int result = 0;
+  if (sdl_modifier_bits & KMOD_SHIFT)
+    result |= SHIFT_BIT;
+
+  if (sdl_modifier_bits & KMOD_ALT)
+    result |= ALT_BIT;
+
+  if (sdl_modifier_bits & KMOD_CTRL)
+    result |= CONTROL_BIT;
+
+  return result;
 }
 
 void Keyboard::HandleKeyEvent(const SDL_Event& event)
@@ -101,31 +173,32 @@ void Keyboard::HandleKeyEvent(const SDL_Event& event)
     return;
   }
 
-  std::map<int, Key_t>::iterator it = layout.find(event.key.keysym.sym);
-
-  if(it == layout.end())
+  int previos_modifier_bits = modifier_bits;
+  modifier_bits = GetModifierBitsFromSDL();
+  SDLKey basic_key_code = event.key.keysym.sym;
+  if (basic_key_code >= MODIFIER_OFFSET)
     return;
-
-  Key_t key = it->second;
-
-  //While player writes, it cannot control the game but QUIT or PAUSE.
-  if (Game::GetInstance()->chatsession.CheckInput()) {
-    switch (key) {
-    case KEY_QUIT:
-    case KEY_PAUSE:
-      break;
-    default:
-      return;
+  int key_code;
+  if (modifier_bits != previos_modifier_bits) {
+    std::set<SDLKey>::iterator it;
+    for (it = pressed_keys.begin();  it !=  pressed_keys.end(); it++) {
+      int basic_key_code_it = *it;
+      if (basic_key_code != basic_key_code_it) {
+        key_code = basic_key_code_it + MODIFIER_OFFSET * previos_modifier_bits;
+        HandleKeyComboEvent(key_code, KEY_RELEASED);
+        key_code = basic_key_code_it + MODIFIER_OFFSET * modifier_bits;
+        HandleKeyComboEvent(key_code, KEY_PRESSED);
+      }
     }
   }
-
-  if(event_type == KEY_PRESSED) {
-    HandleKeyPressed(key);
-    return;
-  }
-
-  if(event_type == KEY_RELEASED) {
-    HandleKeyReleased(key);
-    return;
+  if (event_type == KEY_PRESSED) {
+    key_code = basic_key_code + (MODIFIER_OFFSET * modifier_bits);
+    HandleKeyComboEvent(key_code, KEY_PRESSED);
+    pressed_keys.insert(basic_key_code);
+  } else {
+    ASSERT(event_type == KEY_RELEASED);
+    key_code = basic_key_code + (MODIFIER_OFFSET * previos_modifier_bits);
+    HandleKeyComboEvent(key_code, KEY_RELEASED);
+    pressed_keys.erase(basic_key_code);
   }
 }
diff --git a/src/interface/keyboard.h b/src/interface/keyboard.h
index 44c4856..5c65efd 100644
--- a/src/interface/keyboard.h
+++ b/src/interface/keyboard.h
@@ -24,10 +24,16 @@
 //-----------------------------------------------------------------------------
 #include "interface/man_machine_interface.h"
 #include <WORMUX_singleton.h>
+#include <set>
+#include "SDL_keyboard.h"
 //-----------------------------------------------------------------------------
 
 class Keyboard : public ManMachineInterface, public Singleton<Keyboard>
 {
+private:
+  int modifier_bits;
+  std::set<SDLKey> pressed_keys;
+  void HandleKeyComboEvent(int key_code, Key_Event_t event_type);
 protected:
   friend class Singleton<Keyboard>;
   Keyboard();
diff --git a/src/interface/man_machine_interface.cpp 
b/src/interface/man_machine_interface.cpp
index 6a40e19..034f351 100644
--- a/src/interface/man_machine_interface.cpp
+++ b/src/interface/man_machine_interface.cpp
@@ -75,16 +75,16 @@ bool ManMachineInterface::MoveCamera(const Key_t &key) const
   bool r = true;
 
   switch(key) {
-  case KEY_MOVE_RIGHT:
+  case KEY_MOVE_CAMERA_RIGHT:
     Camera::GetInstance()->SetXY(Point2i(SCROLL_KEYBOARD, 0));
     break;
-  case KEY_MOVE_LEFT:
+  case KEY_MOVE_CAMERA_LEFT:
     Camera::GetInstance()->SetXY(Point2i(-SCROLL_KEYBOARD, 0));
     break;
-  case KEY_UP:
+  case KEY_MOVE_CAMERA_UP:
     Camera::GetInstance()->SetXY(Point2i(0, -SCROLL_KEYBOARD));
     break;
-  case KEY_DOWN:
+  case KEY_MOVE_CAMERA_DOWN:
     Camera::GetInstance()->SetXY(Point2i(0, SCROLL_KEYBOARD));
     break;
   default:
@@ -101,12 +101,9 @@ bool ManMachineInterface::MoveCamera(const Key_t &key) 
const
 // Handle a pressed key
 void ManMachineInterface::HandleKeyPressed(const Key_t &key)
 {
-  SDLMod mod = SDL_GetModState();
-  if (mod & KMOD_CTRL) {
-    if (MoveCamera(key)) {
-      PressedKeys[key] = true;
-      return;
-    }
+  if (MoveCamera(key)) {
+    PressedKeys[key] = true;
+    return;
   }
 
   // Key repeat is useful in the menu, but we are handling it manually
@@ -122,30 +119,41 @@ void ManMachineInterface::HandleKeyPressed(const Key_t 
&key)
   if (Game::GetInstance()->ReadState() == Game::END_TURN) return;
   if (ActiveCharacter().IsDead()) return;
 
-  bool shift = !!(SDL_GetModState() & KMOD_SHIFT);
   if (Game::GetInstance()->ReadState() == Game::HAS_PLAYED) {
     switch (key) {
 
     case KEY_MOVE_RIGHT:
-      ActiveCharacter().HandleKeyPressed_MoveRight(shift);
+      ActiveCharacter().HandleKeyPressed_MoveRight(false);
+      break;
+    case KEY_MOVE_RIGHT_SLOWLY:
+      ActiveCharacter().HandleKeyPressed_MoveRight(true);
       break;
     case KEY_MOVE_LEFT:
-      ActiveCharacter().HandleKeyPressed_MoveLeft(shift);
+      ActiveCharacter().HandleKeyPressed_MoveLeft(false);
+      break;
+    case KEY_MOVE_LEFT_SLOWLY:
+      ActiveCharacter().HandleKeyPressed_MoveLeft(true);
       break;
     case KEY_UP:
-      ActiveCharacter().HandleKeyPressed_Up(shift);
+      ActiveCharacter().HandleKeyPressed_Up(false);
+      break;
+    case KEY_UP_SLOWLY:
+      ActiveCharacter().HandleKeyPressed_Up(true);
       break;
     case KEY_DOWN:
-      ActiveCharacter().HandleKeyPressed_Down(shift);
+      ActiveCharacter().HandleKeyPressed_Down(false);
+      break;
+    case KEY_DOWN_SLOWLY:
+      ActiveCharacter().HandleKeyPressed_Down(true);
       break;
     case KEY_JUMP:
-      ActiveCharacter().HandleKeyPressed_Jump(shift);
+      ActiveCharacter().HandleKeyPressed_Jump(false);
       break;
     case KEY_HIGH_JUMP:
-      ActiveCharacter().HandleKeyPressed_HighJump(shift);
+      ActiveCharacter().HandleKeyPressed_HighJump(false);
       break;
     case KEY_BACK_JUMP:
-      ActiveCharacter().HandleKeyPressed_BackJump(shift);
+      ActiveCharacter().HandleKeyPressed_BackJump(false);
       break;
     case KEY_SHOOT:
       // Shoot key is not accepted in HAS_PLAYED state
@@ -160,29 +168,41 @@ void ManMachineInterface::HandleKeyPressed(const Key_t 
&key)
     switch (key) {
 
     case KEY_MOVE_RIGHT:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveRight(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveRight(false);
+      break;
+    case KEY_MOVE_RIGHT_SLOWLY:
+      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveRight(true);
       break;
     case KEY_MOVE_LEFT:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveLeft(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveLeft(false);
+      break;
+    case KEY_MOVE_LEFT_SLOWLY:
+      ActiveTeam().AccessWeapon().HandleKeyPressed_MoveLeft(true);
       break;
     case KEY_UP:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_Up(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_Up(false);
+      break;
+    case KEY_UP_SLOWLY:
+      ActiveTeam().AccessWeapon().HandleKeyPressed_Up(true);
       break;
     case KEY_DOWN:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_Down(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_Down(false);
+      break;
+    case KEY_DOWN_SLOWLY:
+      ActiveTeam().AccessWeapon().HandleKeyPressed_Down(true);
       break;
     case KEY_JUMP:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_Jump(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_Jump(false);
       break;
     case KEY_HIGH_JUMP:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_HighJump(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_HighJump(false);
       break;
     case KEY_BACK_JUMP:
-      ActiveTeam().AccessWeapon().HandleKeyPressed_BackJump(shift);
+      ActiveTeam().AccessWeapon().HandleKeyPressed_BackJump(false);
       break;
     case KEY_SHOOT:
       if (Game::GetInstance()->ReadState() == Game::PLAYING) {
-        ActiveTeam().AccessWeapon().HandleKeyPressed_Shoot(shift);
+        ActiveTeam().AccessWeapon().HandleKeyPressed_Shoot(false);
         break;
       }
     default:
@@ -271,25 +291,37 @@ void ManMachineInterface::HandleKeyReleased(const Key_t 
&key)
     if (Game::GetInstance()->ReadState() == Game::HAS_PLAYED) {
       switch (key) {
       case KEY_MOVE_RIGHT:
-        ActiveCharacter().HandleKeyReleased_MoveRight(shift);
+        ActiveCharacter().HandleKeyReleased_MoveRight(false);
+        return;
+      case KEY_MOVE_RIGHT_SLOWLY:
+        ActiveCharacter().HandleKeyReleased_MoveRight(true);
         return;
       case KEY_MOVE_LEFT:
-        ActiveCharacter().HandleKeyReleased_MoveLeft(shift);
+        ActiveCharacter().HandleKeyReleased_MoveLeft(false);
+        return;
+      case KEY_MOVE_LEFT_SLOWLY:
+        ActiveCharacter().HandleKeyReleased_MoveLeft(true);
         return;
       case KEY_UP:
-        ActiveCharacter().HandleKeyReleased_Up(shift);
+        ActiveCharacter().HandleKeyReleased_Up(false);
+        return;
+      case KEY_UP_SLOWLY:
+        ActiveCharacter().HandleKeyReleased_Up(true);
         return;
       case KEY_DOWN:
-        ActiveCharacter().HandleKeyReleased_Down(shift);
+        ActiveCharacter().HandleKeyReleased_Down(false);
+        return;
+      case KEY_DOWN_SLOWLY:
+        ActiveCharacter().HandleKeyReleased_Down(true);
         return;
       case KEY_JUMP:
-        ActiveCharacter().HandleKeyReleased_Jump(shift);
+        ActiveCharacter().HandleKeyReleased_Jump(false);
         return;
       case KEY_HIGH_JUMP:
-        ActiveCharacter().HandleKeyReleased_HighJump(shift);
+        ActiveCharacter().HandleKeyReleased_HighJump(false);
         return;
       case KEY_BACK_JUMP:
-        ActiveCharacter().HandleKeyReleased_BackJump(shift);
+        ActiveCharacter().HandleKeyReleased_BackJump(false);
         return;
       case KEY_SHOOT:
       // Shoot key is not accepted in HAS_PLAYED state
@@ -304,65 +336,77 @@ void ManMachineInterface::HandleKeyReleased(const Key_t 
&key)
       switch (key) {
 
       case KEY_MOVE_RIGHT:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveRight(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveRight(false);
+        return;
+      case KEY_MOVE_RIGHT_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveRight(true);
         return;
       case KEY_MOVE_LEFT:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveLeft(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveLeft(false);
+        return;
+      case KEY_MOVE_LEFT_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyReleased_MoveLeft(true);
         return;
       case KEY_UP:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Up(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Up(false);
+        return;
+      case KEY_UP_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Up(true);
         return;
       case KEY_DOWN:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Down(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Down(false);
+        return;
+      case KEY_DOWN_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Down(true);
         return;
       case KEY_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Jump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Jump(false);
         return;
       case KEY_HIGH_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_HighJump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_HighJump(false);
         return;
       case KEY_BACK_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_BackJump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_BackJump(false);
         return;
 
         // Shoot key
       case KEY_SHOOT:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Shoot(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Shoot(false);
         return;
 
         // Other keys usefull for weapons
       case KEY_WEAPON_1:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num1(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num1(false);
         return;
       case KEY_WEAPON_2:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num2(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num2(false);
         return;
       case KEY_WEAPON_3:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num3(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num3(false);
         return;
       case KEY_WEAPON_4:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num4(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num4(false);
         return;
       case KEY_WEAPON_5:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num5(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num5(false);
         return;
       case KEY_WEAPON_6:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num6(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num6(false);
         return;
       case KEY_WEAPON_7:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num7(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num7(false);
         return;
       case KEY_WEAPON_8:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num8(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num8(false);
         return;
       case KEY_WEAPON_9:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Num9(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Num9(false);
         return;
       case KEY_WEAPON_LESS:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_Less(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_Less(false);
         return;
       case KEY_WEAPON_MORE:
-        ActiveTeam().AccessWeapon().HandleKeyReleased_More(shift);
+        ActiveTeam().AccessWeapon().HandleKeyReleased_More(false);
         return;
       default:
         break;
@@ -443,7 +487,7 @@ void ManMachineInterface::Refresh() const
     if (PressedKeys[i]) {
       Key_t key = static_cast<Key_t>(i);
 
-      if (SDL_GetModState()&KMOD_CTRL && MoveCamera(key))
+      if (MoveCamera(key))
         continue;
 
       // Managing keys related to character moves
@@ -453,33 +497,44 @@ void ManMachineInterface::Refresh() const
       if (Game::GetInstance()->ReadState() == Game::END_TURN) return;
 
       // Movements are managed by weapons because sometimes it overrides the 
keys
-      bool shift = !!(SDL_GetModState() & KMOD_SHIFT);
       switch (key) {
 
       case KEY_MOVE_RIGHT:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveRight(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveRight(false);
+        break;
+      case KEY_MOVE_RIGHT_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveRight(true);
         break;
       case KEY_MOVE_LEFT:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveLeft(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveLeft(false);
+        break;
+      case KEY_MOVE_LEFT_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_MoveLeft(true);
         break;
       case KEY_UP:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Up(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Up(false);
+        break;
+      case KEY_UP_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Up(true);
         break;
       case KEY_DOWN:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Down(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Down(false);
+        break;
+      case KEY_DOWN_SLOWLY:
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Down(true);
         break;
       case KEY_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Jump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_Jump(false);
         break;
       case KEY_HIGH_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_HighJump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_HighJump(false);
         break;
       case KEY_BACK_JUMP:
-        ActiveTeam().AccessWeapon().HandleKeyRefreshed_BackJump(shift);
+        ActiveTeam().AccessWeapon().HandleKeyRefreshed_BackJump(false);
         break;
       case KEY_SHOOT:
         if (Game::GetInstance()->ReadState() == Game::PLAYING) {
-          ActiveTeam().AccessWeapon().HandleKeyRefreshed_Shoot(shift);
+          ActiveTeam().AccessWeapon().HandleKeyRefreshed_Shoot(false);
         }
         break;
       default:
diff --git a/src/interface/man_machine_interface.h 
b/src/interface/man_machine_interface.h
index 4fbc198..ff0c3bc 100644
--- a/src/interface/man_machine_interface.h
+++ b/src/interface/man_machine_interface.h
@@ -37,18 +37,49 @@ class ManMachineInterface
 public:
   typedef enum
   {
-    KEY_QUIT,        KEY_WEAPONS1,                KEY_WEAPONS2,
-    KEY_WEAPONS3,    KEY_WEAPONS4,                KEY_WEAPONS5,
-    KEY_WEAPONS6,    KEY_WEAPONS7,                KEY_WEAPONS8,
-    KEY_PAUSE,       KEY_FULLSCREEN,              KEY_TOGGLE_INTERFACE,
-    KEY_CENTER,      KEY_TOGGLE_WEAPONS_MENUS,    KEY_CHAT,
-    KEY_MOVE_LEFT,   KEY_MOVE_RIGHT,              KEY_UP,   KEY_DOWN,
-    KEY_JUMP,        KEY_HIGH_JUMP,               KEY_BACK_JUMP,
-    KEY_SHOOT,       KEY_CHANGE_WEAPON,
-    KEY_WEAPON_1,    KEY_WEAPON_2,                KEY_WEAPON_3,
-    KEY_WEAPON_4,    KEY_WEAPON_5,                KEY_WEAPON_6,
-    KEY_WEAPON_7,    KEY_WEAPON_8,                KEY_WEAPON_9,
-    KEY_WEAPON_LESS, KEY_WEAPON_MORE,
+    KEY_QUIT,
+    KEY_WEAPONS1,
+    KEY_WEAPONS2,
+    KEY_WEAPONS3,
+    KEY_WEAPONS4,
+    KEY_WEAPONS5,
+    KEY_WEAPONS6,
+    KEY_WEAPONS7,
+    KEY_WEAPONS8,
+    KEY_PAUSE,
+    KEY_FULLSCREEN,
+    KEY_TOGGLE_INTERFACE,
+    KEY_CENTER,
+    KEY_TOGGLE_WEAPONS_MENUS,
+    KEY_CHAT,
+    KEY_MOVE_LEFT,
+    KEY_MOVE_LEFT_SLOWLY,
+    KEY_MOVE_RIGHT,
+    KEY_MOVE_RIGHT_SLOWLY,
+    KEY_UP,
+    KEY_UP_SLOWLY,
+    KEY_DOWN,
+    KEY_DOWN_SLOWLY,
+    KEY_MOVE_CAMERA_LEFT,
+    KEY_MOVE_CAMERA_RIGHT,
+    KEY_MOVE_CAMERA_UP,
+    KEY_MOVE_CAMERA_DOWN,
+    KEY_JUMP,
+    KEY_HIGH_JUMP,
+    KEY_BACK_JUMP,
+    KEY_SHOOT,
+    KEY_CHANGE_WEAPON,
+    KEY_WEAPON_1,
+    KEY_WEAPON_2,
+    KEY_WEAPON_3,
+    KEY_WEAPON_4,
+    KEY_WEAPON_5,
+    KEY_WEAPON_6,
+    KEY_WEAPON_7,
+    KEY_WEAPON_8,
+    KEY_WEAPON_9,
+    KEY_WEAPON_LESS,
+    KEY_WEAPON_MORE,
     KEY_NEXT_CHARACTER,
     KEY_MENU_OPTIONS_FROM_GAME,
     KEY_MINIMAP_FROM_GAME,
-- 
1.6.0.4


_______________________________________________
Wormux-dev mailing list
Wormux-dev@gna.org
https://mail.gna.org/listinfo/wormux-dev

Répondre à