Hey! This patch is good :) I would just replace "previos_modifier_bits" by "previous_modifier_bits" or "prev_modifier_bits" ;)
You can push it on the trunk! Thanks, Matt (gentildemon) Florian Köberle a écrit : > --- > 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, > _______________________________________________ Wormux-dev mailing list Wormux-dev@gna.org https://mail.gna.org/listinfo/wormux-dev