/* ResidualVM - A 3D game interpreter * * ResidualVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the AUTHORS * file distributed with this source distribution. * * Additional copyright for this file: * Copyright (C) 1999-2000 Revolution Software Ltd. * This code is based on source code created by Revolution Software, * used with permission. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "engines/icb/common/px_rccommon.h" #if defined (SDL_BACKEND) #include #endif #include "engines/icb/p4_generic.h" #include "engines/icb/debug.h" #include "engines/icb/p4.h" #include "engines/icb/player.h" #include "engines/icb/direct_input.h" #include "engines/icb/cluster_manager_pc.h" #include "common/textconsole.h" #include "common/events.h" #include "common/keyboard.h" namespace ICB { uint32 dinputTime = 0; // Initialise global joystick variables // This is given an initial value during init_direct_input() but can be // used as a switch to alter joystick behaviour (analogue/digital/off) int currentJoystick = NO_JOYSTICK; int attachedJoystick = NO_JOYSTICK; // Initialised to unset values // For mapping purposes uint8 up_joy = 0xFF; uint8 down_joy = 0xFF; uint8 left_joy = 0xFF; uint8 right_joy = 0xFF; uint8 sidestep_button = 0xFF; uint8 run_button = 0xFF; uint8 crouch_button = 0xFF; uint8 interact_button = 0xFF; uint8 arm_button = 0xFF; uint8 fire_button = 0xFF; uint8 inventory_button = 0xFF; uint8 remora_button = 0xFF; uint8 pause_button = 0xFF; // These are the structures used to hold the data we are polling for joysticks #define MAX_AXES 8 typedef struct { bool8 held_down; // For polling char name[12]; // For the options screen configuration } BUTTON; typedef struct { int32 val; // For polling char name[12]; // For the options screen configuration } HALFAXIS; int g_noButtons = 0; // Available number of buttons int g_noAxes = 0; // Available number of axes BUTTON g_buttons[32]; // Button data (max 32) bool8 g_buttonsRepeats[32]; // Button repeat data (max 32) HALFAXIS g_axes[MAX_AXES]; // Axes data (max 8 * 2) // Fixed defines for mapping #define AXIS_1_POS 0 #define AXIS_1_NEG 1 #define AXIS_2_POS 2 #define AXIS_2_NEG 3 #define AXIS_3_POS 4 #define AXIS_3_NEG 5 #define AXIS_4_POS 6 #define AXIS_4_NEG 7 #define JOY_B1 1 #define JOY_B2 2 #define JOY_B3 4 #define JOY_B4 8 typedef struct { uint32 posX; uint32 posY; uint32 buttons; } JoyInfo; class NTJoystickHandler { private: int joyThere[16]; // 1 if joystick is plugged in, 0 otherwise #if defined (SDL_BACKEND) SDL_Joystick *joy[16]; #endif JoyInfo cached_joyinfo[16]; public: NTJoystickHandler(void); ~NTJoystickHandler(void); bool8 isValid; void Init(void); // HW Query functions: determine whether or not a device exists. // Return 0 if no such device, > 0 (depending on device) if it does. int QueryJoystick(void); // 0=none, else number of joysticks // Input functions: anyone wishing for input needs to call these: int GetJoystick(int joynum, JoyInfo *joypos); void UpdateJoystick(void); }; NTJoystickHandler::NTJoystickHandler(void) { memset(joyThere, 0, sizeof(int) * 16); isValid = FALSE8; } NTJoystickHandler::~NTJoystickHandler(void) { for (int x = 0; x < 16; x++) { if (joyThere[x]) { // FIXME: By the time we're in this destructor, SDL has already been terminated. // SDL_JoystickClose(joy[x]); } } } void NTJoystickHandler::Init() { for (int x = 0; x < QueryJoystick(); x++) { #if defined (SDL_BACKEND) SDL_Joystick *j = SDL_JoystickOpen(x); if (j) { // there *is* a joystick 'x' installed! ++joyThere[x]; joy[x] = j; } #endif } UpdateJoystick(); } int NTJoystickHandler::QueryJoystick(void) { // if no joystick(s), returns 0 else number of joysticks attached. return #if defined (SDL_BACKEND) (SDL_NumJoysticks()); #else 0; #endif } int normalize(int val, int minval, int maxval) { // error detection: if ((maxval - minval) == 0) { return (0); } // zero-base: val -= minval; // normalize to 0..255: val = (255L * val) / (maxval - minval); return (val); } void NTJoystickHandler::UpdateJoystick() { #ifdef ENABLE_JOYSTICK for (int x = 0; x < 16; x++) { if (joyThere[x] && SDL_JoystickGetAttached(joy[x])) { cached_joyinfo[x].posX = SDL_JoystickGetAxis(joy[x], 0); cached_joyinfo[x].posY = SDL_JoystickGetAxis(joy[x], 1); cached_joyinfo[x].buttons = 0; if (SDL_JoystickGetButton(joy[x], 0)) { cached_joyinfo[x].buttons |= JOY_B1; } if (SDL_JoystickGetButton(joy[x], 1)) { cached_joyinfo[x].buttons |= JOY_B2; } if (SDL_JoystickGetButton(joy[x], 2)) { cached_joyinfo[x].buttons |= JOY_B3; } if (SDL_JoystickGetButton(joy[x], 3)) { cached_joyinfo[x].buttons |= JOY_B4; } } } #endif } int NTJoystickHandler::GetJoystick(int joynum, JoyInfo *joypos) { if ((joynum >= 16) || (joynum <= 0) || !joyThere[joynum - 1]) return (0); memcpy(joypos, &(cached_joyinfo[joynum - 1]), sizeof(JoyInfo)); // normalize the joypos to -127, 0, 127 scale.... joypos->posX = normalize(joypos->posX, -32768, 32768); joypos->posY = normalize(joypos->posY, -32768, 32768); // To overcome UINT type within JOYINFO struct int32 ntX = joypos->posX - 127; int32 ntY = joypos->posY - 127; g_axes[AXIS_1_POS].val = (ntX < 0) ? 0 : ntX; g_axes[AXIS_1_NEG].val = (ntX >= 0) ? 0 : ntX; g_axes[AXIS_2_POS].val = (ntY < 0) ? 0 : ntY; g_axes[AXIS_2_NEG].val = (ntY >= 0) ? 0 : ntY; return (1); } NTJoystickHandler ntJoystick; bool PollNTJoystick() { ntJoystick.UpdateJoystick(); // State structre JoyInfo inf; // Get current state if (ntJoystick.GetJoystick(1, &inf) == 0) { ntJoystick.isValid = FALSE8; attachedJoystick = NO_JOYSTICK; Zdebug("GetJoystick failed"); return false; } // Buttons if (inf.buttons & JOY_B1) g_buttons[0].held_down = TRUE8; else g_buttons[0].held_down = FALSE8; if (inf.buttons & JOY_B2) g_buttons[1].held_down = TRUE8; else g_buttons[1].held_down = FALSE8; if (inf.buttons & JOY_B3) g_buttons[2].held_down = TRUE8; else g_buttons[2].held_down = FALSE8; if (inf.buttons & JOY_B4) g_buttons[3].held_down = TRUE8; else g_buttons[3].held_down = FALSE8; return true; } bool8 keyboard_buf_scancodes[512]; // SDL_NUM_SCANCODES bool8 repeats_scancodes[512]; // SDL_NUM_SCANCODES void Init_direct_input() { uint32 k; // Zero everything out for (k = 0; k < 32; k++) { g_buttons[k].held_down = FALSE8; memset(g_buttons[k].name, 0, 12); g_buttonsRepeats[k] = FALSE8; } for (k = 0; k < MAX_AXES; k++) { g_axes[k].val = 0; memset(g_axes[k].name, 0, 12); } // Default axes to use (overriden by ini file config) up_joy = AXIS_2_NEG; down_joy = AXIS_2_POS; left_joy = AXIS_1_NEG; right_joy = AXIS_1_POS; // Initialize joystick(s) ntJoystick.Init(); if (ntJoystick.QueryJoystick() == 0) { ntJoystick.isValid = FALSE8; Zdebug("Joystick not installed"); currentJoystick = NO_JOYSTICK; } else { ntJoystick.isValid = TRUE8; // For development give these defaults g_noButtons = 4; strcpy(g_buttons[0].name, "Button 1"); strcpy(g_buttons[1].name, "Button 2"); strcpy(g_buttons[2].name, "Button 3"); strcpy(g_buttons[3].name, "Button 4"); g_noAxes = 2; strcpy(g_axes[AXIS_1_POS].name, "+ve X-Axis"); strcpy(g_axes[AXIS_1_NEG].name, "-ve X-Axis"); strcpy(g_axes[AXIS_2_POS].name, "+ve Y-Axis"); strcpy(g_axes[AXIS_2_NEG].name, "-ve Y-Axis"); attachedJoystick = ANALOGUE_JOYSTICK; currentJoystick = ANALOGUE_JOYSTICK; } SetDefaultKeys(); // Ready to accept all input if we're on NT or not !!! } void setKeyState(Common::KeyCode key, bool pressed) { keyboard_buf_scancodes[key] = pressed; } void Poll_direct_input() { //warning("TODO: Fix Poll_direct_input"); #if 0 int keys = 0; const Uint8 *key_state = SDL_GetKeyboardState(&keys); for (uint32 i = 0; i < keys; i++) { keyboard_buf_scancodes[i] = key_state[i] ? TRUE8 : FALSE8; } // Already set to NULL if no pad attached so don't worry if (ntJoystick.isValid) { if (!PollNTJoystick()) { ntJoystick.isValid = FALSE8; currentJoystick = NO_JOYSTICK; Zdebug("PollNTJoystick failed"); } } #endif } uint32 Get_DI_key_press() { for (uint32 i = 0; i < 512; i++) { if (Read_DI_once_keys(i)) { return i; } } return 0; } void Clear_DI_key_buffer() { for (uint32 i = 0; i < 512; i++) { repeats_scancodes[i] = FALSE8; keyboard_buf_scancodes[i] = FALSE8; } } bool8 Read_DI_once_keys(uint32 key) { // in // key = keycode // out // 0 not pressed down currently // 1 pressed down // set repeat if (keyboard_buf_scancodes[key] && (repeats_scancodes[key])) return (0); // key is still pressed so return 0 repeats_scancodes[key] = keyboard_buf_scancodes[key]; return (repeats_scancodes[key]); } bool8 Read_DI_keys(uint32 key) { // in // key = keycode // out // 0 not pressed down currently // 1 pressed down // set repeat repeats_scancodes[key] = keyboard_buf_scancodes[key]; return (repeats_scancodes[key]); } bool8 DI_key_waiting() { for (uint32 i = 0; i < 512; i++) { if (keyboard_buf_scancodes[i]) return TRUE8; } return FALSE8; } void SetDefaultKeys() { fire_key = Common::KEYCODE_SPACE; interact_key = Common::KEYCODE_LCTRL; inventory_key = Common::KEYCODE_RETURN; arm_key = Common::KEYCODE_LALT; remora_key = Common::KEYCODE_DELETE; crouch_key = Common::KEYCODE_x; sidestep_key = Common::KEYCODE_LSHIFT; run_key = Common::KEYCODE_z; up_key = Common::KEYCODE_UP; down_key = Common::KEYCODE_DOWN; left_key = Common::KEYCODE_LEFT; right_key = Common::KEYCODE_RIGHT; pause_key = Common::KEYCODE_ESCAPE; } void UnsetKeys() { // Unset all fire_key = 0; interact_key = 0; inventory_key = 0; arm_key = 0; remora_key = 0; crouch_key = 0; sidestep_key = 0; run_key = 0; up_key = 0; down_key = 0; left_key = 0; right_key = 0; pause_key = Common::KEYCODE_ESCAPE; // So we can always bring up the options } const char *GetKeyName(uint32 key) { TLANGUAGE tl = g_theClusterManager->GetLanguage(); switch (tl) { case T_FRENCH: // French key names switch (key) { case Common::KEYCODE_ESCAPE: return "Echap"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "Moins"; case Common::KEYCODE_EQUALS: return "Egal"; case Common::KEYCODE_BACKSPACE: return "Retour arri" "\xe8" "re"; case Common::KEYCODE_TAB: return "Tabulation"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "Parenth" "\xe8" "se g"; case Common::KEYCODE_RIGHTBRACKET: return "Parenth" "\xe8" "se d"; case Common::KEYCODE_RETURN: return "Entr" "\xe9" "e"; case Common::KEYCODE_LCTRL: return "Ctrl gauche"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "Point-virgule"; case Common::KEYCODE_QUOTE: return "Apostrophe"; case Common::KEYCODE_BACKQUOTE: return "Carr" "\xe9"; case Common::KEYCODE_LSHIFT: return "Maj gauche"; case Common::KEYCODE_BACKSLASH: return "Di" "\xe8" "se"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "Virgule"; case Common::KEYCODE_PERIOD: return "Point"; case Common::KEYCODE_SLASH: return "Barre oblique"; case Common::KEYCODE_RSHIFT: return "Maj droite"; case Common::KEYCODE_KP_MULTIPLY: return "Multiplier num."; case Common::KEYCODE_SPACE: return "Espace"; case Common::KEYCODE_CAPSLOCK: return "Verr. num."; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "Soustraire num"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "Ajouter num."; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "D" "\xe9" "cimal num."; case Common::KEYCODE_KP_ENTER: return "Entr"; case Common::KEYCODE_RCTRL: return "Ctrl droite"; case Common::KEYCODE_KP_DIVIDE: return "Diviser num"; case Common::KEYCODE_HOME: return "Origine"; case Common::KEYCODE_UP: return "Fl" "\xe8" "che haut"; case Common::KEYCODE_PAGEUP: return "Pg pr" "\xe9" "c."; case Common::KEYCODE_LEFT: return "Fl" "\xe8" "che gauche"; case Common::KEYCODE_RIGHT: return "Fl" "\xe8" "che droite"; case Common::KEYCODE_END: return "Fin"; case Common::KEYCODE_DOWN: return "Fl" "\xe8" "che bas"; case Common::KEYCODE_PAGEDOWN: return "Pg Suiv."; case Common::KEYCODE_INSERT: return "Inser"; case Common::KEYCODE_DELETE: return "Suppr"; case Common::KEYCODE_LALT: return "Alt gauche"; case Common::KEYCODE_RALT: return "Alt droite"; default: return NULL; } return NULL; case T_GERMAN: // German key names switch (key) { case Common::KEYCODE_ESCAPE: return "ESC"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "Minus"; case Common::KEYCODE_EQUALS: return "Gleich"; case Common::KEYCODE_BACKSPACE: return "Rucktaste"; case Common::KEYCODE_TAB: return "Tab"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Z"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "Klammer L"; case Common::KEYCODE_RIGHTBRACKET: return "Klammer R"; case Common::KEYCODE_RETURN: return "Eingabe"; case Common::KEYCODE_LCTRL: return "Strg links"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "Semikolon"; case Common::KEYCODE_QUOTE: return "Apostroph"; case Common::KEYCODE_BACKQUOTE: return "Akzent"; case Common::KEYCODE_LSHIFT: return "Umschalt L"; case Common::KEYCODE_BACKSLASH: return "Raute"; case Common::KEYCODE_z: return "Y"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "Komma"; case Common::KEYCODE_PERIOD: return "Punkt"; case Common::KEYCODE_SLASH: return "Schragstrich"; case Common::KEYCODE_RSHIFT: return "Umschalt R"; case Common::KEYCODE_KP_MULTIPLY: return "Num Mal"; case Common::KEYCODE_SPACE: return "Leertaste"; case Common::KEYCODE_CAPSLOCK: return "Feststelltaste"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "Num Minus"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "Num Plus"; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "Num Dezimal"; case Common::KEYCODE_KP_ENTER: return "Eingabe"; case Common::KEYCODE_RCTRL: return "Strg rechts"; case Common::KEYCODE_KP_DIVIDE: return "Num Geteilt"; case Common::KEYCODE_HOME: return "Pos1"; case Common::KEYCODE_UP: return "Pfeil hoch"; case Common::KEYCODE_PAGEUP: return "Bild hoch"; case Common::KEYCODE_LEFT: return "Pfeil links"; case Common::KEYCODE_RIGHT: return "Pfeil rechts"; case Common::KEYCODE_END: return "Ende"; case Common::KEYCODE_DOWN: return "Pfeil runter"; case Common::KEYCODE_PAGEDOWN: return "Bild runter"; case Common::KEYCODE_INSERT: return "Einf."; case Common::KEYCODE_DELETE: return "Entf"; case Common::KEYCODE_LALT: return "Alt links"; case Common::KEYCODE_RALT: return "Alt rechts"; default: return NULL; } return NULL; case T_ITALIAN: // Italian key names switch (key) { case Common::KEYCODE_ESCAPE: return "esci"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "meno"; case Common::KEYCODE_EQUALS: return "uguale"; case Common::KEYCODE_BACKSPACE: return "spazio indietro"; case Common::KEYCODE_TAB: return "Tab"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "parentesi sinistra"; case Common::KEYCODE_RIGHTBRACKET: return "parentesi destra"; case Common::KEYCODE_RETURN: return "torna indietro"; case Common::KEYCODE_LCTRL: return "control a sinistra"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "punto e virgola"; case Common::KEYCODE_QUOTE: return "apostrofo"; case Common::KEYCODE_BACKQUOTE: return "slash sinistra"; // ANDYB: TOO LONG "barra obliqua a sinistra" case Common::KEYCODE_LSHIFT: return "maiuscolo sinistro"; case Common::KEYCODE_BACKSLASH: return "cancelletto"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "virgola"; case Common::KEYCODE_PERIOD: return "punto"; case Common::KEYCODE_SLASH: return "segno di frazione"; case Common::KEYCODE_RSHIFT: return "maiuscolo destro"; case Common::KEYCODE_KP_MULTIPLY: return "moltiplicazione"; case Common::KEYCODE_SPACE: return "spazio"; case Common::KEYCODE_CAPSLOCK: return "lucchetto"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "sottrazione"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "addizione"; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "numero decimale"; case Common::KEYCODE_KP_ENTER: return "invio"; case Common::KEYCODE_RCTRL: return "control a destra"; case Common::KEYCODE_KP_DIVIDE: return "divisione"; case Common::KEYCODE_HOME: return "Home"; case Common::KEYCODE_UP: return "freccia in su"; case Common::KEYCODE_PAGEUP: return "pagina in su"; case Common::KEYCODE_LEFT: return "freccia a sinistra"; case Common::KEYCODE_RIGHT: return "freccia a destra"; case Common::KEYCODE_END: return "fine"; case Common::KEYCODE_DOWN: return "freccia in gi" "\xf9"; case Common::KEYCODE_PAGEDOWN: return "pagina in gi" "\xf9"; case Common::KEYCODE_INSERT: return "inserisci"; case Common::KEYCODE_DELETE: return "cancella"; case Common::KEYCODE_LALT: return "alt a sinistra"; case Common::KEYCODE_RALT: return "alt a destra"; default: return NULL; } return NULL; case T_SPANISH: // Spanish key names switch (key) { case Common::KEYCODE_ESCAPE: return "Escape"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "Ap" "\xf3" "strofo"; case Common::KEYCODE_EQUALS: return "Admiraci" "\xf3" "n"; case Common::KEYCODE_BACKSPACE: return "Retroceso"; case Common::KEYCODE_TAB: return "Tabulador"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "Suma"; case Common::KEYCODE_RIGHTBRACKET: return "Tilde"; case Common::KEYCODE_RETURN: return "Intro"; case Common::KEYCODE_LCTRL: return "Control Izquierdo"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "\xd1"; case Common::KEYCODE_QUOTE: return "Tilde Invertida"; case Common::KEYCODE_BACKQUOTE: return "O Altilla"; case Common::KEYCODE_LSHIFT: return "May\xfasculas Izquierda"; case Common::KEYCODE_BACKSLASH: return "Barra Invertida"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "Coma"; case Common::KEYCODE_PERIOD: return "Punto"; case Common::KEYCODE_SLASH: return "Menos"; case Common::KEYCODE_RSHIFT: return "May\xfasculas Derecha"; case Common::KEYCODE_KP_MULTIPLY: return "Asterisco"; case Common::KEYCODE_SPACE: return "Barra Espaciadora"; case Common::KEYCODE_CAPSLOCK: return "Bloqueo May\xfasculas"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "Menos"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "M\xe1s"; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "Punto"; case Common::KEYCODE_KP_ENTER: return "Intro"; case Common::KEYCODE_RCTRL: return "Control Derecho"; case Common::KEYCODE_KP_DIVIDE: return "Dividir"; case Common::KEYCODE_HOME: return "Inicio"; case Common::KEYCODE_UP: return "Flecha Arriba"; case Common::KEYCODE_PAGEUP: return "Avance P\xe1gina"; case Common::KEYCODE_LEFT: return "Flecha Izquierda"; case Common::KEYCODE_RIGHT: return "Flecha Derecha"; case Common::KEYCODE_END: return "Fin"; case Common::KEYCODE_DOWN: return "Flecha Abajo"; case Common::KEYCODE_PAGEDOWN: return "Retroceder P" "\xe1" "gina"; case Common::KEYCODE_INSERT: return "Insertar"; case Common::KEYCODE_DELETE: return "Suprimir"; case Common::KEYCODE_LALT: return "Alt Izquierdo"; case Common::KEYCODE_RALT: return "Alt Derecho"; default: return NULL; } return NULL; case T_RUSSIAN: // Russian key names switch (key) { case Common::KEYCODE_ESCAPE: return "Escape"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "\xCC\xE8\xED\xF3\xF1"; case Common::KEYCODE_EQUALS: return "\xD0\xE0\xE2\xED\xEE"; case Common::KEYCODE_BACKSPACE: return "Backspace"; case Common::KEYCODE_TAB: return "Tab"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "\xCB.\xEA\xE2.\xF1\xEA\xEE\xE1."; case Common::KEYCODE_RIGHTBRACKET: return "\xCF.\xEA\xE2.c\xEA\xEE\xE1."; case Common::KEYCODE_RETURN: return "\xC2\xE2\xEE\xE4"; case Common::KEYCODE_LCTRL: return "\xCB\xE5\xE2\xFB\xE9 Ctrl"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "\xD2\xEE\xF7\xEA\xE0 \xF1 \xE7\xE0\xEF\xFF\xF2\xEE\xE9"; case Common::KEYCODE_QUOTE: return "\xC0\xEF\xEE\xF1\xF2\xF0\xEE\xF4"; case Common::KEYCODE_BACKQUOTE: return "\xD3\xE4\xE0\xF0\xE5\xED\xE8\xE5"; case Common::KEYCODE_LSHIFT: return "\xCB\xE5\xE2\xFB\xE9 Shift"; case Common::KEYCODE_BACKSLASH: return "\xD0\xE5\xF8\xE5\xF2\xEA\xE0"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "\xC7\xE0\xEF\xFF\xF2\xE0\xFF"; case Common::KEYCODE_PERIOD: return "\xD2\xEE\xF7\xEA\xE0"; case Common::KEYCODE_SLASH: return "\xD1\xEB\xFD\xF8"; case Common::KEYCODE_RSHIFT: return "\xCF\xF0\xE0\xE2\xFB\xE9 Shift"; case Common::KEYCODE_KP_MULTIPLY: return "\xC7\xE2."; case Common::KEYCODE_SPACE: return "\xCF\xF0\xEE\xE1\xE5\xEB"; case Common::KEYCODE_CAPSLOCK: return "Caps Lock"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "\xCC\xE8\xED\xF3\xF1 \xED\xE0 \xE4\xEE\xEF. \xEA\xEB "; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "\xCF\xEB\xFE\xF1 \xED\xE0 \xE4\xEE\xEF. \xEA\xEB "; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "\xD2\xF7\xEA."; case Common::KEYCODE_KP_ENTER: return "Enter"; case Common::KEYCODE_RCTRL: return "\xCF\xF0\xE0\xE2\xFB\xE9 Ctrl"; case Common::KEYCODE_KP_DIVIDE: return "\xD1\xEB\xFD\xF8 \xED\xE0 \xE4\xEE\xEF. \xEA\xEB"; case Common::KEYCODE_HOME: return "Home"; case Common::KEYCODE_UP: return "\xD1\xF2\xF0\xE5\xEB\xEA\xE0 \xE2\xE2\xE5\xF0\xF5"; case Common::KEYCODE_PAGEUP: return "Page Up"; case Common::KEYCODE_LEFT: return "\xD1\xF2\xF0\xE5\xEB\xEA\xE0 \xE2\xEB\xE5\xE2\xEE"; case Common::KEYCODE_RIGHT: return "\xD1\xF2\xF0\xE5\xEB\xEA\xE0 \xE2\xEF\xF0\xE0\xE2\xEE"; case Common::KEYCODE_END: return "End"; case Common::KEYCODE_DOWN: return "\xD1\xF2\xF0\xE5\xEB\xEA\xE0 \xE2\xED\xE8\xE7"; case Common::KEYCODE_PAGEDOWN: return "Page Down"; case Common::KEYCODE_INSERT: return "Insert"; case Common::KEYCODE_DELETE: return "Delete"; case Common::KEYCODE_LALT: return "\xCB\xE5\xE2\xFB\xE9 Alt"; case Common::KEYCODE_RALT: return "\xCF\xF0\xE0\xE2\xFB\xE9 Alt"; default: return NULL; } return NULL; case T_POLISH: // Polish key names switch (key) { case Common::KEYCODE_ESCAPE: return "Escape"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "Minus"; case Common::KEYCODE_EQUALS: return "R\xF3wna sie"; case Common::KEYCODE_BACKSPACE: return "Wstecz"; case Common::KEYCODE_TAB: return "Tabulator"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "Lewy nawias"; case Common::KEYCODE_RIGHTBRACKET: return "Prawy nawias"; case Common::KEYCODE_RETURN: return "Enter"; case Common::KEYCODE_LCTRL: return "Lewy Ctrl"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "Przecinek"; case Common::KEYCODE_QUOTE: return "Apostrof"; case Common::KEYCODE_BACKQUOTE: return "Apostrof1"; case Common::KEYCODE_LSHIFT: return "Lewy shift"; case Common::KEYCODE_BACKSLASH: return "Krzyzyk"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "Precinek"; case Common::KEYCODE_PERIOD: return "Kropka"; case Common::KEYCODE_SLASH: return "Ukosnik"; case Common::KEYCODE_RSHIFT: return "Prawy shift"; case Common::KEYCODE_KP_MULTIPLY: return "Razy (klaw.num.)"; case Common::KEYCODE_SPACE: return "Spacja"; case Common::KEYCODE_CAPSLOCK: return "Caps Lock"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "Minus (klaw. num.)"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "Plus (klaw num.)"; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "Kropka (klaw. num.)"; case Common::KEYCODE_KP_ENTER: return "Numeryczny Enter"; case Common::KEYCODE_RCTRL: return "Prawy Ctrl"; case Common::KEYCODE_KP_DIVIDE: return "Podziel (klaw. num.)"; case Common::KEYCODE_HOME: return "Home"; case Common::KEYCODE_UP: return "Kursor do g\xF3ry"; case Common::KEYCODE_PAGEUP: return "Page Up"; case Common::KEYCODE_LEFT: return "Kursor w lewo"; case Common::KEYCODE_RIGHT: return "Kursor w prawo"; case Common::KEYCODE_END: return "End"; case Common::KEYCODE_DOWN: return "Kursor do dolu"; case Common::KEYCODE_PAGEDOWN: return "Page Down"; case Common::KEYCODE_INSERT: return "Insert"; case Common::KEYCODE_DELETE: return "Delete"; case Common::KEYCODE_LALT: return "Lewy Alt"; case Common::KEYCODE_RALT: return "Prawy Alt"; default: return NULL; } return NULL; default: // English key names switch (key) { case Common::KEYCODE_ESCAPE: return "Escape"; case Common::KEYCODE_1: return "1"; case Common::KEYCODE_2: return "2"; case Common::KEYCODE_3: return "3"; case Common::KEYCODE_4: return "4"; case Common::KEYCODE_5: return "5"; case Common::KEYCODE_6: return "6"; case Common::KEYCODE_7: return "7"; case Common::KEYCODE_8: return "8"; case Common::KEYCODE_9: return "9"; case Common::KEYCODE_0: return "0"; case Common::KEYCODE_MINUS: return "Minus"; case Common::KEYCODE_EQUALS: return "Equals"; case Common::KEYCODE_BACKSPACE: return "Backspace"; case Common::KEYCODE_TAB: return "Tab"; case Common::KEYCODE_q: return "Q"; case Common::KEYCODE_w: return "W"; case Common::KEYCODE_e: return "E"; case Common::KEYCODE_r: return "R"; case Common::KEYCODE_t: return "T"; case Common::KEYCODE_y: return "Y"; case Common::KEYCODE_u: return "U"; case Common::KEYCODE_i: return "I"; case Common::KEYCODE_o: return "O"; case Common::KEYCODE_p: return "P"; case Common::KEYCODE_LEFTBRACKET: return "Left Bracket"; case Common::KEYCODE_RIGHTBRACKET: return "Right Bracket"; case Common::KEYCODE_RETURN: return "Return"; case Common::KEYCODE_LCTRL: return "Left Control"; case Common::KEYCODE_a: return "A"; case Common::KEYCODE_s: return "S"; case Common::KEYCODE_d: return "D"; case Common::KEYCODE_f: return "F"; case Common::KEYCODE_g: return "G"; case Common::KEYCODE_h: return "H"; case Common::KEYCODE_j: return "J"; case Common::KEYCODE_k: return "K"; case Common::KEYCODE_l: return "L"; case Common::KEYCODE_SEMICOLON: return "Semicolon"; case Common::KEYCODE_QUOTE: return "Apostrophe"; case Common::KEYCODE_BACKQUOTE: return "Grave"; case Common::KEYCODE_LSHIFT: return "Left Shift"; case Common::KEYCODE_BACKSLASH: return "Hash"; case Common::KEYCODE_z: return "Z"; case Common::KEYCODE_x: return "X"; case Common::KEYCODE_c: return "C"; case Common::KEYCODE_v: return "V"; case Common::KEYCODE_b: return "B"; case Common::KEYCODE_n: return "N"; case Common::KEYCODE_m: return "M"; case Common::KEYCODE_COMMA: return "Comma"; case Common::KEYCODE_PERIOD: return "Full Stop"; case Common::KEYCODE_SLASH: return "Slash"; case Common::KEYCODE_RSHIFT: return "Right Shift"; case Common::KEYCODE_KP_MULTIPLY: return "Num Multiply"; case Common::KEYCODE_SPACE: return "Spacebar"; case Common::KEYCODE_CAPSLOCK: return "Caps Lock"; case Common::KEYCODE_F1: return "F1"; case Common::KEYCODE_F2: return "F2"; case Common::KEYCODE_F3: return "F3"; case Common::KEYCODE_F4: return "F4"; case Common::KEYCODE_F5: return "F5"; case Common::KEYCODE_F6: return "F6"; case Common::KEYCODE_F7: return "F7"; case Common::KEYCODE_F8: return "F8"; case Common::KEYCODE_F9: return "F9"; case Common::KEYCODE_F10: return "F10"; case Common::KEYCODE_F11: return "F11"; case Common::KEYCODE_F12: return "F12"; case Common::KEYCODE_KP7: return "Num 7"; case Common::KEYCODE_KP8: return "Num 8"; case Common::KEYCODE_KP9: return "Num 9"; case Common::KEYCODE_KP_MINUS: return "Num Subtract"; case Common::KEYCODE_KP4: return "Num 4"; case Common::KEYCODE_KP5: return "Num 5"; case Common::KEYCODE_KP6: return "Num 6"; case Common::KEYCODE_KP_PLUS: return "Num Add"; case Common::KEYCODE_KP1: return "Num 1"; case Common::KEYCODE_KP2: return "Num 2"; case Common::KEYCODE_KP3: return "Num 3"; case Common::KEYCODE_KP0: return "Num 0"; case Common::KEYCODE_KP_PERIOD: return "Num Decimal"; case Common::KEYCODE_KP_ENTER: return "Enter"; case Common::KEYCODE_RCTRL: return "Right Control"; case Common::KEYCODE_KP_DIVIDE: return "Num Divide"; case Common::KEYCODE_HOME: return "Home"; case Common::KEYCODE_UP: return "Up Arrow"; case Common::KEYCODE_PAGEUP: return "Page Up"; case Common::KEYCODE_LEFT: return "Left Arrow"; case Common::KEYCODE_RIGHT: return "Right Arrow"; case Common::KEYCODE_END: return "End"; case Common::KEYCODE_DOWN: return "Down Arrow"; case Common::KEYCODE_PAGEDOWN: return "Page Down"; case Common::KEYCODE_INSERT: return "Insert"; case Common::KEYCODE_DELETE: return "Delete"; case Common::KEYCODE_LALT: return "Left Alt"; case Common::KEYCODE_RALT: return "Right Alt"; default: return NULL; } return NULL; } } const char *GetJoystickName() { const char *name = NULL; if (ntJoystick.isValid) { name = "Joystick"; } return name; } const char *GetButtonName(uint8 part) { // Unset if (part == 0xFF) return NULL; // Only have 32 buttons maximum if (part < 0 || part >= g_noButtons) return NULL; return g_buttons[part].name; } const char *GetAxisName(uint8 part) { char *name = NULL; if (part != 0xFF) { if (strcmp(g_axes[part].name, "") != 0) name = g_axes[part].name; } return name; } int32 Read_Joystick(uint8 part) { // Unset value if (part == 0xFF) return 0; if (!ntJoystick.isValid) { return 0; } // Axes we are configured to use int32 upVal = (up_joy == 0xFF) ? 0 : g_axes[up_joy].val; int32 downVal = (down_joy == 0xFF) ? 0 : g_axes[down_joy].val; int32 leftVal = (left_joy == 0xFF) ? 0 : g_axes[left_joy].val; int32 rightVal = (right_joy == 0xFF) ? 0 : g_axes[right_joy].val; // Ensure we report axes data with consistent sign if (upVal > 0) upVal *= -1; if (downVal < 0) downVal *= -1; if (leftVal > 0) leftVal *= -1; if (rightVal < 0) rightVal *= -1; // Are we returning a digital response if (currentJoystick == DIGITAL_JOYSTICK) { // Windows98 and NT (both sytem methods modify the same data) // Map analogue axis values to digital extremes if (part == X_AXIS) { if (rightVal > 20) return JOY_RIGHT; else if (leftVal < -20) return JOY_LEFT; else return 0; } else if (part == Y_AXIS) { if (downVal > 20) return JOY_DOWN; else if (upVal < -20) return JOY_UP; else return 0; } else { g_buttonsRepeats[part] = g_buttons[part].held_down; return g_buttons[part].held_down; } } else // We want axis ranges please if (currentJoystick == ANALOGUE_JOYSTICK) { // Get analogue axis values if (part == X_AXIS) { if ((rightVal > 20) || (leftVal < -20)) return (leftVal + rightVal); else return 0; } else if (part == Y_AXIS) { if ((downVal > 20) || (upVal < -20)) return (downVal + upVal); else return 0; } else { g_buttonsRepeats[part] = g_buttons[part].held_down; return g_buttons[part].held_down; } } else return 0; } int32 Read_Joystick_once(uint8 part) { // Fuck axis nonsense off if (part == X_AXIS || part == Y_AXIS) return Read_Joystick(part); // Unset value if (part == 0xFF) return 0; if (!ntJoystick.isValid) { return 0; } if (currentJoystick == ANALOGUE_JOYSTICK || currentJoystick == DIGITAL_JOYSTICK) { // Button still pressed so return false if (g_buttons[part].held_down && g_buttonsRepeats[part]) return 0; // Set repeat g_buttonsRepeats[part] = g_buttons[part].held_down; // Return correct value return g_buttons[part].held_down; } return 0; } void SetDefaultJoystick() { SetDefaultKeys(); up_joy = AXIS_2_NEG; down_joy = AXIS_2_POS; left_joy = AXIS_1_NEG; right_joy = AXIS_1_POS; // Can only really assume two buttons sidestep_button = 0xFF; run_button = 0xFF; crouch_button = 0xFF; interact_button = 0; arm_button = 0xFF; fire_button = 1; inventory_button = 0xFF; remora_button = 0xFF; pause_button = 0xFF; } void UnsetJoystickConfig() { // Unset all up_joy = 0xFF; down_joy = 0xFF; left_joy = 0xFF; right_joy = 0xFF; sidestep_button = 0xFF; run_button = 0xFF; crouch_button = 0xFF; interact_button = 0xFF; arm_button = 0xFF; fire_button = 0xFF; inventory_button = 0xFF; remora_button = 0xFF; pause_button = 0xFF; } uint8 GetJoystickButtonPress() { for (int32 i = 0; i < g_noButtons; i++) { if (Read_Joystick((uint8)i)) { return (uint8)i; } } // Perhaps we need to loop over axis settings here for directional config too return 0xFF; } uint8 GetJoystickAxisPress() { // Check for the first non-zero positioned axis for (int32 i = 0; i < MAX_AXES; i++) { // Ignore meaningless data if the axis has no name if (strcmp(g_axes[i].name, "") == 0) continue; // Return axis index if (g_axes[i].val > 20 || g_axes[i].val < -20) return (uint8)i; } return 0xFF; } } // End of namespace ICB