aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorlolbot-iichan2018-08-27 00:55:09 +0300
committerFilippos Karapetis2020-01-11 18:05:39 +0200
commit1754aed61dc69d1ff16739935ff87ebd9b503e25 (patch)
tree17c006054924fd43d90d25cc4389b9c2a579e9fe /engines
parent7d9b584a84e0d6c302ba262eb2a336ea7c638ef2 (diff)
downloadscummvm-rg350-1754aed61dc69d1ff16739935ff87ebd9b503e25.tar.gz
scummvm-rg350-1754aed61dc69d1ff16739935ff87ebd9b503e25.tar.bz2
scummvm-rg350-1754aed61dc69d1ff16739935ff87ebd9b503e25.zip
WINTERMUTE: Add FoxTail key codes mapping
FoxTail code is hacked to use key codes from different from usual WME. Got correct mapping using script decompiling, verified with sample game.
Diffstat (limited to 'engines')
-rw-r--r--engines/wintermute/base/base_keyboard_state.cpp226
1 files changed, 225 insertions, 1 deletions
diff --git a/engines/wintermute/base/base_keyboard_state.cpp b/engines/wintermute/base/base_keyboard_state.cpp
index 13b753a7d6..d9334b6228 100644
--- a/engines/wintermute/base/base_keyboard_state.cpp
+++ b/engines/wintermute/base/base_keyboard_state.cpp
@@ -231,6 +231,11 @@ bool BaseKeyboardState::readKey(Common::Event *event) {
else if (code >= Common::KEYCODE_SPACE && code < Common::KEYCODE_DELETE) {
_currentCharCode = event->kbd.ascii;
_currentPrintable = true;
+#ifdef ENABLE_FOXTAIL
+ if (BaseEngine::instance().isFoxTail()) {
+ _currentCharCode = tolower(_currentCharCode);
+ }
+#endif
}
// use ASCII value for numpad '/', '*', '-', '+'
@@ -258,7 +263,7 @@ bool BaseKeyboardState::readKey(Common::Event *event) {
}
// use keyCodeToVKey mapping for all other events
- // in WME_LITE all of those key are not printable
+ // all of those key are not printable in WME_LITE and FOXTAIL
else {
_currentCharCode = keyCodeToVKey(event);
_currentPrintable = false;
@@ -403,8 +408,222 @@ enum VKeyCodes {
//TODO: shift, ctrl, menu, etc...
};
+#ifdef ENABLE_FOXTAIL
+enum FoxtailVKeyCodes {
+ kFtVkBack = 8,
+ kFtVkTab = 9,
+ kFtVkClear = 1073741980,
+ kFtVkReturn = 13,
+ kFtVkPause = 1073741896,
+ kFtVkCapital = 1073741881,
+ kFtVkEscape = 27,
+ kFtVkSpace = 32, //printable
+
+ kFtVkPrior = 1073741899,
+ kFtVkNext = 1073741902,
+ kFtVkEnd = 1073741901,
+ kFtVkHome = 1073741898,
+ kFtVkLeft = 1073741904,
+ kFtVkUp = 1073741906,
+ kFtVkRight = 1073741903,
+ kFtVkDown = 1073741905,
+ kFtVkPrint = 1073741894,
+ kFtVkInsert = 1073741897,
+ kFtVkDelete = 127,
+
+ kFtVkF1 = 1073741882,
+ kFtVkF2 = 1073741883,
+ kFtVkF3 = 1073741884,
+ kFtVkF4 = 1073741885,
+ kFtVkF5 = 1073741886,
+ kFtVkF6 = 1073741887,
+ kFtVkF7 = 1073741888,
+ kFtVkF8 = 1073741889,
+ kFtVkF9 = 1073741890,
+ kFtVkF10 = 1073741891,
+ kFtVkF11 = 1073741892,
+ kFtVkF12 = 1073741893,
+
+ kFtVkNumLock = 1073741907,
+ kFtVkScroll = 1073741895
+};
+
+//////////////////////////////////////////////////////////////////////////
+uint32 keyCodeToVKeyFoxtail(Common::Event *event) {
+ switch (event->kbd.keycode) {
+ case Common::KEYCODE_BACKSPACE:
+ return kFtVkBack;
+ case Common::KEYCODE_TAB:
+ return kFtVkTab;
+ case Common::KEYCODE_CLEAR:
+ case Common::KEYCODE_KP5:
+ return kFtVkClear;
+ case Common::KEYCODE_RETURN:
+ case Common::KEYCODE_KP_ENTER:
+ return kFtVkReturn;
+ case Common::KEYCODE_PAUSE:
+ return kFtVkPause;
+ case Common::KEYCODE_CAPSLOCK:
+ return kFtVkCapital;
+ case Common::KEYCODE_ESCAPE:
+ return kFtVkEscape;
+ case Common::KEYCODE_SPACE:
+ return kFtVkSpace;
+ case Common::KEYCODE_KP9:
+ case Common::KEYCODE_PAGEUP:
+ return kFtVkPrior;
+ case Common::KEYCODE_KP3:
+ case Common::KEYCODE_PAGEDOWN:
+ return kFtVkNext;
+ case Common::KEYCODE_END:
+ case Common::KEYCODE_KP1:
+ return kFtVkEnd;
+ case Common::KEYCODE_HOME:
+ case Common::KEYCODE_KP7:
+ return kFtVkHome;
+ case Common::KEYCODE_LEFT:
+ case Common::KEYCODE_KP4:
+ return kFtVkLeft;
+ case Common::KEYCODE_RIGHT:
+ case Common::KEYCODE_KP6:
+ return kFtVkRight;
+ case Common::KEYCODE_UP:
+ case Common::KEYCODE_KP8:
+ return kFtVkUp;
+ case Common::KEYCODE_DOWN:
+ case Common::KEYCODE_KP2:
+ return kFtVkDown;
+ case Common::KEYCODE_PRINT:
+ return kFtVkPrint;
+ case Common::KEYCODE_INSERT:
+ case Common::KEYCODE_KP0:
+ return kFtVkInsert;
+ case Common::KEYCODE_DELETE:
+ case Common::KEYCODE_KP_PERIOD:
+ return kFtVkDelete;
+ case Common::KEYCODE_F1:
+ return kFtVkF1;
+ case Common::KEYCODE_F2:
+ return kFtVkF2;
+ case Common::KEYCODE_F3:
+ return kFtVkF3;
+ case Common::KEYCODE_F4:
+ return kFtVkF4;
+ case Common::KEYCODE_F5:
+ return kFtVkF5;
+ case Common::KEYCODE_F6:
+ return kFtVkF6;
+ case Common::KEYCODE_F7:
+ return kFtVkF7;
+ case Common::KEYCODE_F8:
+ return kFtVkF8;
+ case Common::KEYCODE_F9:
+ return kFtVkF9;
+ case Common::KEYCODE_F10:
+ return kFtVkF10;
+ case Common::KEYCODE_F11:
+ return kFtVkF11;
+ case Common::KEYCODE_F12:
+ return kFtVkF12;
+ case Common::KEYCODE_NUMLOCK:
+ return kFtVkNumLock;
+ case Common::KEYCODE_SCROLLOCK:
+ return kFtVkScroll;
+ default:
+ // check if any non-sticky keys were used, otherwise key is unknown to us
+ if ((event->kbd.flags & Common::KBD_NON_STICKY) == 0) {
+ warning("Key pressed is not recognized, ASCII returned (%d '%c').", event->kbd.keycode, event->kbd.keycode);
+ }
+ // return ASCII if no match, since it could be used for typing
+ return event->kbd.ascii;
+ break;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+Common::KeyCode vKeyToKeyCodeFoxtail(uint32 vkey) {
+ switch (vkey) {
+ case kFtVkBack:
+ return Common::KEYCODE_BACKSPACE;
+ case kFtVkTab:
+ return Common::KEYCODE_TAB;
+ case kFtVkClear:
+ return Common::KEYCODE_CLEAR;
+ case kFtVkReturn:
+ return Common::KEYCODE_RETURN;
+ case kFtVkPause:
+ return Common::KEYCODE_PAUSE;
+ case kFtVkCapital:
+ return Common::KEYCODE_CAPSLOCK;
+ case kFtVkEscape:
+ return Common::KEYCODE_ESCAPE;
+ case kFtVkSpace:
+ return Common::KEYCODE_SPACE;
+ case kFtVkPrior:
+ return Common::KEYCODE_PAGEUP;
+ case kFtVkNext:
+ return Common::KEYCODE_PAGEDOWN;
+ case kFtVkHome:
+ return Common::KEYCODE_HOME;
+ case kFtVkEnd:
+ return Common::KEYCODE_END;
+ case kFtVkLeft:
+ return Common::KEYCODE_LEFT;
+ case kFtVkRight:
+ return Common::KEYCODE_RIGHT;
+ case kFtVkUp:
+ return Common::KEYCODE_UP;
+ case kFtVkDown:
+ return Common::KEYCODE_DOWN;
+ case kFtVkPrint:
+ return Common::KEYCODE_PRINT;
+ case kFtVkInsert:
+ return Common::KEYCODE_INSERT;
+ case kFtVkDelete:
+ return Common::KEYCODE_DELETE;
+ case kFtVkF1:
+ return Common::KEYCODE_F1;
+ case kFtVkF2:
+ return Common::KEYCODE_F2;
+ case kFtVkF3:
+ return Common::KEYCODE_F3;
+ case kFtVkF4:
+ return Common::KEYCODE_F4;
+ case kFtVkF5:
+ return Common::KEYCODE_F5;
+ case kFtVkF6:
+ return Common::KEYCODE_F6;
+ case kFtVkF7:
+ return Common::KEYCODE_F7;
+ case kFtVkF8:
+ return Common::KEYCODE_F8;
+ case kFtVkF9:
+ return Common::KEYCODE_F9;
+ case kFtVkF10:
+ return Common::KEYCODE_F10;
+ case kFtVkF11:
+ return Common::KEYCODE_F11;
+ case kFtVkF12:
+ return Common::KEYCODE_F12;
+ case kFtVkNumLock:
+ return Common::KEYCODE_NUMLOCK;
+ case kFtVkScroll:
+ return Common::KEYCODE_SCROLLOCK;
+ default:
+ warning("Unknown VKEY: %d", vkey);
+ return (Common::KeyCode)(vkey < KEYSTATES_ARRAY_SIZE ? vkey : 0);
+ break;
+ }
+}
+#endif
+
//////////////////////////////////////////////////////////////////////////
uint32 BaseKeyboardState::keyCodeToVKey(Common::Event *event) {
+#ifdef ENABLE_FOXTAIL
+ if (BaseEngine::instance().isFoxTail()) {
+ return keyCodeToVKeyFoxtail(event);
+ }
+#endif
switch (event->kbd.keycode) {
case Common::KEYCODE_BACKSPACE:
return kVkBack;
@@ -496,6 +715,11 @@ uint32 BaseKeyboardState::keyCodeToVKey(Common::Event *event) {
//////////////////////////////////////////////////////////////////////////
Common::KeyCode BaseKeyboardState::vKeyToKeyCode(uint32 vkey) {
+#ifdef ENABLE_FOXTAIL
+ if (BaseEngine::instance().isFoxTail()) {
+ return vKeyToKeyCodeFoxtail(vkey);
+ }
+#endif
switch (vkey) {
case kVkBack:
return Common::KEYCODE_BACKSPACE;