| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** 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 3 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, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : Commando *
- * *
- * $Archive:: /Commando/Code/Combat/input.cpp $*
- * *
- * $Author:: Byon_g $*
- * *
- * $Modtime:: 3/15/02 3:22p $*
- * *
- * $Revision:: 120 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "input.h"
- #include "slist.h"
- #include "assets.h"
- #include "ini.h"
- #include "directinput.h"
- #include "debug.h"
- #include "timemgr.h"
- #include "registry.h"
- #include "ffactory.h"
- #include "win.h"
- #include "translatedb.h"
- #include "string_ids.h"
- #include "vehicle.h"
- #include "combat.h"
- #include "ccamera.h"
- #define DIRECTINPUT_VERSION 0x0800
- #include <dinput.h>
- #include <stdio.h>
- ////////////////////////////////////////////////////////////////
- // Special virtual keys
- ////////////////////////////////////////////////////////////////
- #define VK_MOUSEWHEEL_UP 0x100
- #define VK_MOUSEWHEEL_DOWN 0x101
- /*
- **
- */
- float MouseSensitivity = 0.5f;
- float MouseScale = 1;
- bool MouseInvert = true;
- bool Mouse2DInvert = false;
- const char *DEFAULT_INPUT_FILENAME = "DEFAULT_INPUT.CFG";
- #define BUTTON_BIT_HELD DirectInput::DI_BUTTON_HELD
- #define BUTTON_BIT_HIT DirectInput::DI_BUTTON_HIT
- #define BUTTON_BIT_RELEASED DirectInput::DI_BUTTON_RELEASED
- #define BUTTON_BIT_DOUBLE 8
- #define SLIDER_DEAD_ZONE 0.01f
- /*
- ** Button states
- */
- #define BUTTON_UP 0x0000
- #define BUTTON_HIT 0x0001
- #define BUTTON_RELEASE 0x0002
- #define BUTTON_HELD 0x0003
- #define BUTTON_DOUBLE 0x0004
- #define BUTTON_SHIFT 0x1000
- #define BUTTON_CTRL 0x2000
- #define BUTTON_ALT 0x4000
- #define BUTTON_DEBUG 0x8000
- /*
- ** Database Strings
- */
- #define ENTRY_ACTIVATE_BUTTON "ActivateButton"
- #define ENTRY_FUNCTION "Function"
- #define ENTRY_MIN "Min"
- #define ENTRY_MAX "Max"
- #define ENTRY_ACCELERATION "Acceleration"
- #define SECTION_MISC_SETTINGS "Misc Settings"
- #define ENTRY_DAMAGE_INDICATORS "DamageIndicatorsEnabled"
- #define ENTRY_MOUSE_SENSITIVITY "MouseSensitivity"
- #define ENTRY_MOUSE_SCALE "MouseScale"
- #define ENTRY_MOUSE_INVERT "MouseInvert"
- #define ENTRY_MOUSE_2D_INVERT "Mouse2DInvert"
- #define ENTRY_TARGET_STEERING "TargetSteering"
- typedef struct {
- short ID;
- char *Name;
- } StringID;
- StringID ButtonNames[] = {
- { DIK_F1, "F1_Key" },
- { DIK_F2, "F2_Key" },
- { DIK_F3, "F3_Key" },
- { DIK_F4, "F4_Key" },
- { DIK_F5, "F5_Key" },
- { DIK_F6, "F6_Key" },
- { DIK_F7, "F7_Key" },
- { DIK_F8, "F8_Key" },
- { DIK_F9, "F9_Key" },
- { DIK_F10, "F10_Key" },
- { DIK_F11, "F11_Key" },
- { DIK_F12, "F12_Key" },
- { DIK_0, "0_Key" },
- { DIK_1, "1_Key" },
- { DIK_2, "2_Key" },
- { DIK_3, "3_Key" },
- { DIK_4, "4_Key" },
- { DIK_5, "5_Key" },
- { DIK_6, "6_Key" },
- { DIK_7, "7_Key" },
- { DIK_8, "8_Key" },
- { DIK_9, "9_Key" },
- { DIK_A, "A_Key" },
- { DIK_B, "B_Key" },
- { DIK_C, "C_Key" },
- { DIK_D, "D_Key" },
- { DIK_E, "E_Key" },
- { DIK_F, "F_Key" },
- { DIK_G, "G_Key" },
- { DIK_H, "H_Key" },
- { DIK_I, "I_Key" },
- { DIK_J, "J_Key" },
- { DIK_K, "K_Key" },
- { DIK_L, "L_Key" },
- { DIK_M, "M_Key" },
- { DIK_N, "N_Key" },
- { DIK_O, "O_Key" },
- { DIK_P, "P_Key" },
- { DIK_Q, "Q_Key" },
- { DIK_R, "R_Key" },
- { DIK_S, "S_Key" },
- { DIK_T, "T_Key" },
- { DIK_U, "U_Key" },
- { DIK_V, "V_Key" },
- { DIK_W, "W_Key" },
- { DIK_X, "X_Key" },
- { DIK_Y, "Y_Key" },
- { DIK_Z, "Z_Key" },
- { DIK_MINUS, "Minus_Key" },
- { DIK_EQUALS, "Equals_Key" },
- { DIK_BACK, "Backspace_Key" },
- { DIK_TAB, "Tab_Key" },
- { DIK_LBRACKET, "Left_Bracket_Key" },
- { DIK_RBRACKET, "Right_Bracket_Key" },
- { DIK_RETURN, "Enter_Key" },
- { DIK_SEMICOLON, "Semicolon_Key" },
- { DIK_APOSTROPHE, "Apostrophe_Key" },
- { DIK_GRAVE, "Grave_Key" },
- { DIK_BACKSLASH, "Backslash_Key" },
- { DIK_COMMA, "Comma_Key" },
- { DIK_PERIOD, "Period_Key" },
- { DIK_SLASH, "Slash_Key" },
- { DIK_SPACE, "Space_Bar_Key" },
- { DIK_CAPITAL, "Caps_Lock_Key" },
- { DIK_NUMLOCK, "Num_Lock_Key" },
- { DIK_SCROLL, "Scroll_Lock_Key" },
- { DIK_ESCAPE, "Escape_Key" },
- { DIK_NUMPAD0, "Keypad_0_Key" },
- { DIK_NUMPAD1, "Keypad_1_Key" },
- { DIK_NUMPAD2, "Keypad_2_Key" },
- { DIK_NUMPAD3, "Keypad_3_Key" },
- { DIK_NUMPAD4, "Keypad_4_Key" },
- { DIK_NUMPAD5, "Keypad_5_Key" },
- { DIK_NUMPAD6, "Keypad_6_Key" },
- { DIK_NUMPAD7, "Keypad_7_Key" },
- { DIK_NUMPAD8, "Keypad_8_Key" },
- { DIK_NUMPAD9, "Keypad_9_Key" },
- { DIK_SUBTRACT, "Keypad_Minus_Key" },
- { DIK_MULTIPLY, "Keypad_Star_Key" },
- { DIK_ADD, "Keypad_Plus_Key" },
- { DIK_DECIMAL, "Keypad_Period_Key" },
- { DIK_NUMPADENTER, "Keypad_Enter_Key" },
- { DIK_DIVIDE, "Keypad_Slash_Key" },
- { DIK_HOME, "Home_Key" },
- { DIK_PRIOR, "Page_Up_Key" },
- { DIK_END, "End_Key" },
- { DIK_NEXT, "Page_Down_Key" },
- { DIK_INSERT, "Insert_Key" },
- { DIK_DELETE, "Delete_Key" },
- { DIK_UP, "Up_Key" },
- { DIK_DOWN, "Down_Key" },
- { DIK_LEFT, "Left_Key" },
- { DIK_RIGHT, "Right_Key" },
- { DIK_SYSRQ, "Sys_Req_Key" },
- { DIK_CONTROL, "Control_Key" },
- { DIK_LCONTROL, "Left_Control_Key" },
- { DIK_RCONTROL, "Right_Control_Key" },
- { DIK_SHIFT, "Shift_Key" },
- { DIK_LSHIFT, "Left_Shift_Key" },
- { DIK_RSHIFT, "Right_Shift_Key" },
- { DIK_ALT, "Alt_Key" },
- { DIK_LALT, "Left_Alt_Key" },
- { DIK_RALT, "Right_Alt_Key" },
- { DIK_WIN, "Windows_Key" },
- { DIK_LWIN, "Left_Windows_Key" },
- { DIK_RWIN, "Right_Windows_Key" },
- { DIK_APPS, "App_Menu_Key" },
- { DirectInput::BUTTON_MOUSE_LEFT, "Left_Mouse_Button" },
- { DirectInput::BUTTON_MOUSE_RIGHT, "Right_Mouse_Button" },
- { DirectInput::BUTTON_MOUSE_CENTER, "Center_Mouse_Button" },
- { DirectInput::BUTTON_JOYSTICK_A, "Joystick_Button_A" },
- { DirectInput::BUTTON_JOYSTICK_B, "Joystick_Button_B" },
- };
- #define NUM_BUTTON_NAMES ( sizeof(ButtonNames) / sizeof(ButtonNames[0]) )
- StringID SliderNames[] = {
- { Input::SLIDER_MOUSE_LEFT, "Mouse_Left" },
- { Input::SLIDER_MOUSE_RIGHT, "Mouse_Right" },
- { Input::SLIDER_MOUSE_UP, "Mouse_Up" },
- { Input::SLIDER_MOUSE_DOWN, "Mouse_Down" },
- { Input::SLIDER_MOUSE_WHEEL_FORWARD, "Mouse_Wheel_Forward" },
- { Input::SLIDER_MOUSE_WHEEL_BACKWARD, "Mouse_Wheel_Backward" },
- { Input::SLIDER_JOYSTICK_LEFT, "Joystick_Left" },
- { Input::SLIDER_JOYSTICK_RIGHT, "Joystick_Right" },
- { Input::SLIDER_JOYSTICK_UP, "Joystick_Up" },
- { Input::SLIDER_JOYSTICK_DOWN, "Joystick_Down" },
- };
- #define NUM_SLIDER_NAMES ( sizeof( SliderNames ) / sizeof( SliderNames[0] ) )
- #define NUM_FUNCTIONS INPUT_FUNCTION_COUNT
- StringID Functions[ NUM_FUNCTIONS ] = {
- { INPUT_FUNCTION_MOVE_FORWARD, "MoveForward" },
- { INPUT_FUNCTION_MOVE_BACKWARD, "MoveBackward" },
- { INPUT_FUNCTION_MOVE_LEFT, "MoveLeft" },
- { INPUT_FUNCTION_MOVE_RIGHT, "MoveRight" },
- { INPUT_FUNCTION_MOVE_UP, "MoveUp" },
- { INPUT_FUNCTION_MOVE_DOWN, "MoveDown" },
- { INPUT_FUNCTION_WALK_MODE, "WalkMode" },
- { INPUT_FUNCTION_TURN_LEFT, "TurnLeft" },
- { INPUT_FUNCTION_TURN_RIGHT, "TurnRight" },
- { INPUT_FUNCTION_VEHICLE_TURN_LEFT, "VehicleTurnLeft" },
- { INPUT_FUNCTION_VEHICLE_TURN_RIGHT, "VehicleTurnRight" },
- { INPUT_FUNCTION_VEHICLE_TOGGLE_GUNNER, "VehicleToggleGunner"},
- { INPUT_FUNCTION_WEAPON_UP, "WeaponUp" },
- { INPUT_FUNCTION_WEAPON_DOWN, "WeaponDown" },
- { INPUT_FUNCTION_WEAPON_LEFT, "WeaponLeft" },
- { INPUT_FUNCTION_WEAPON_RIGHT, "WeaponRight" },
- { INPUT_FUNCTION_WEAPON_RESET, "WeaponReset" },
- { INPUT_FUNCTION_ZOOM_IN, "ZoomIn" },
- { INPUT_FUNCTION_ZOOM_OUT, "ZoomOut" },
- { INPUT_FUNCTION_ACTION, "Action" }, // Was Ladder
- { INPUT_FUNCTION_JUMP, "Jump" },
- { INPUT_FUNCTION_CROUCH, "Crouch" },
- { INPUT_FUNCTION_DIVE_FORWARD, "DiveForward" },
- { INPUT_FUNCTION_DIVE_BACKWARD, "DiveBackward" },
- { INPUT_FUNCTION_DIVE_LEFT, "DiveLeft" },
- { INPUT_FUNCTION_DIVE_RIGHT, "DiveRight" },
- { INPUT_FUNCTION_TURN_AROUND, "TurnAround" },
- { INPUT_FUNCTION_DROP_FLAG, "DropFlag" },
- { INPUT_FUNCTION_NEXT_WEAPON, "NextWeapon" },
- { INPUT_FUNCTION_PREV_WEAPON, "PrevWeapon" },
- { INPUT_FUNCTION_FIRE_WEAPON_PRIMARY, "FireWeaponPrimary" },
- { INPUT_FUNCTION_FIRE_WEAPON_SECONDARY, "FireWeaponSecondary"},
- { INPUT_FUNCTION_USE_WEAPON, "UseWeapon" },
- { INPUT_FUNCTION_RELOAD_WEAPON, "ReloadWeapon" },
- { INPUT_FUNCTION_SELECT_NO_WEAPON, "SelectNoWeapon" },
- { INPUT_FUNCTION_SELECT_WEAPON_0, "SelectWeapon0" },
- { INPUT_FUNCTION_SELECT_WEAPON_1, "SelectWeapon1" },
- { INPUT_FUNCTION_SELECT_WEAPON_2, "SelectWeapon2" },
- { INPUT_FUNCTION_SELECT_WEAPON_3, "SelectWeapon3" },
- { INPUT_FUNCTION_SELECT_WEAPON_4, "SelectWeapon4" },
- { INPUT_FUNCTION_SELECT_WEAPON_5, "SelectWeapon5" },
- { INPUT_FUNCTION_SELECT_WEAPON_6, "SelectWeapon6" },
- { INPUT_FUNCTION_SELECT_WEAPON_7, "SelectWeapon7" },
- { INPUT_FUNCTION_SELECT_WEAPON_8, "SelectWeapon8" },
- { INPUT_FUNCTION_SELECT_WEAPON_9, "SelectWeapon9" },
- { INPUT_FUNCTION_CYCLE_POG, "CyclePog" },
- // { INPUT_FUNCTION_HUD_ZOOM_RADAR_IN, "HudZoomRadarIn" },
- // { INPUT_FUNCTION_HUD_ZOOM_RADAR_OUT, "HudZoomRadarOut" },
- { INPUT_FUNCTION_PANIC, "Panic" },
- { INPUT_FUNCTION_CURSOR_TARGETING, "CursorTargeting" },
- { INPUT_FUNCTION_FIRST_PERSON_TOGGLE, "FirstPersonToggle" },
- { INPUT_FUNCTION_SUICIDE, "Suicide" },
- { INPUT_FUNCTION_VERBOSE_HELP, "VerboseHelp" },
- { INPUT_FUNCTION_BEGIN_PUBLIC_MESSAGE, "BeginPublicMessage" },
- { INPUT_FUNCTION_BEGIN_TEAM_MESSAGE, "BeginTeamMessage" },
- { INPUT_FUNCTION_BEGIN_PRIVATE_MESSAGE, "BeginPrivateMessage"},
- { INPUT_FUNCTION_BEGIN_CONSOLE, "BeginConsole" },
- { INPUT_FUNCTION_HELP_SCREEN, "HelpScreen" },
- { INPUT_FUNCTION_EVA_OBJECTIVES_SCREEN, "ObjectivesScreen" },
- { INPUT_FUNCTION_EVA_MAP_SCREEN, "MapScreen" },
- // DEBUGGING
- { INPUT_FUNCTION_CAMERA_HEADING_LEFT, "CameraHeadingLeft" },
- { INPUT_FUNCTION_CAMERA_HEADING_RIGHT, "CameraHeadingRight" },
- { INPUT_FUNCTION_CAMERA_TRANSTILT_INC, "CameraTransTiltInc" },
- { INPUT_FUNCTION_CAMERA_TRANSTILT_DEC, "CameraTransTiltDec" },
- { INPUT_FUNCTION_CAMERA_VIEWTILT_INC, "CameraViewTiltInc" },
- { INPUT_FUNCTION_CAMERA_VIEWTILT_DEC, "CameraViewTiltDec" },
- { INPUT_FUNCTION_CAMERA_DIST_INC, "CameraDistInc" },
- { INPUT_FUNCTION_CAMERA_DIST_DEC, "CameraDistDec" },
- { INPUT_FUNCTION_CAMERA_FOV_INC, "CameraFOVInc" },
- { INPUT_FUNCTION_CAMERA_FOV_DEC, "CameraFOVDec" },
- { INPUT_FUNCTION_CAMERA_HEIGHT_INC, "CameraHeightInc" },
- { INPUT_FUNCTION_CAMERA_HEIGHT_DEC, "CameraHeightDec" },
- { INPUT_FUNCTION_MENU_SERVERQUICKSTART, "ServerQuickStart" },
- { INPUT_FUNCTION_MENU_CLIENTQUICKSTART, "ClientQuickStart" },
- { INPUT_FUNCTION_MAKE_SCREEN_SHOT, "MakeScreenShot" },
- { INPUT_FUNCTION_TOGGLE_MOVIE_CAPTURE, "ToggleMovieCapture" },
- //{ INPUT_FUNCTION_INCREMENT_ACTIVE_MESSAGE, "IncrementActiveMessage" },
- //{ INPUT_FUNCTION_DECREMENT_ACTIVE_MESSAGE, "DecrementActiveMessage" },
- //{ INPUT_FUNCTION_INCREMENT_DEBUG_SWITCH_1, "IncrementDebugSwitch1" },
- //{ INPUT_FUNCTION_INCREMENT_DEBUG_SWITCH_2, "IncrementDebugSwitch2" },
- { INPUT_FUNCTION_DEBUG_SINGLE_STEP, "DebugSingleStep" },
- { INPUT_FUNCTION_DEBUG_SINGLE_STEP_STEP, "DebugSingleStepStep"},
- { INPUT_FUNCTION_DEBUG_RAPID_MOVE, "DebugRapidMove" },
- { INPUT_FUNCTION_DEBUG_GENERIC0, "GenericDebug0" },
- { INPUT_FUNCTION_DEBUG_GENERIC1, "GenericDebug1" },
- { INPUT_FUNCTION_DEBUG_FAR_CLIP_IN, "DebugFarClipIn" },
- { INPUT_FUNCTION_DEBUG_FAR_CLIP_OUT, "DebugFarClipOut" },
- { INPUT_FUNCTION_QUICK_FULL_EXIT, "QuickFullExit" },
- { INPUT_FUNCTION_VIS_UPDATE, "VisUpdate" },
- // { INPUT_FUNCTION_TOGGLE_PERFORMANCE_SAMPLING, "TogglePerformanceSampling" },
- { INPUT_FUNCTION_TOGGLE_SNAP_SHOT_MODE, "ToggleSnapShotMode" },
- { INPUT_FUNCTION_SNAP_SHOT_ADVANCE, "SnapShotAdvance" },
- //{ INPUT_FUNCTION_DEBUG_OPTIONS_DIALOG, "DebugOptionsDialog" },
- { INPUT_FUNCTION_CNC, "CNC" },
- { INPUT_FUNCTION_QUICKSAVE, "Quicksave" },
- // Menu
- { INPUT_FUNCTION_MENU_TOGGLE, "MenuToggle" },
- // In game EVA
- { INPUT_FUNCTION_EVA_MISSION_OBJECTIVES_TOGGLE, "EvaMissionObjectives" },
- { INPUT_FUNCTION_RADIO_CMD_01, "RadioCommand01"},
- { INPUT_FUNCTION_RADIO_CMD_02, "RadioCommand02"},
- { INPUT_FUNCTION_RADIO_CMD_03, "RadioCommand03"},
- { INPUT_FUNCTION_RADIO_CMD_04, "RadioCommand04"},
- { INPUT_FUNCTION_RADIO_CMD_05, "RadioCommand05"},
- { INPUT_FUNCTION_RADIO_CMD_06, "RadioCommand06"},
- { INPUT_FUNCTION_RADIO_CMD_07, "RadioCommand07"},
- { INPUT_FUNCTION_RADIO_CMD_08, "RadioCommand08"},
- { INPUT_FUNCTION_RADIO_CMD_09, "RadioCommand09"},
- { INPUT_FUNCTION_RADIO_CMD_10, "RadioCommand10"},
- { INPUT_FUNCTION_RADIO_CMD_11, "RadioCommand11"},
- { INPUT_FUNCTION_RADIO_CMD_12, "RadioCommand12"},
- { INPUT_FUNCTION_RADIO_CMD_13, "RadioCommand13"},
- { INPUT_FUNCTION_RADIO_CMD_14, "RadioCommand14"},
- { INPUT_FUNCTION_RADIO_CMD_15, "RadioCommand15"},
- { INPUT_FUNCTION_RADIO_CMD_16, "RadioCommand16"},
- { INPUT_FUNCTION_RADIO_CMD_17, "RadioCommand17"},
- { INPUT_FUNCTION_RADIO_CMD_18, "RadioCommand18"},
- { INPUT_FUNCTION_RADIO_CMD_19, "RadioCommand19"},
- { INPUT_FUNCTION_RADIO_CMD_20, "RadioCommand20"},
- { INPUT_FUNCTION_RADIO_CMD_21, "RadioCommand21"},
- { INPUT_FUNCTION_RADIO_CMD_22, "RadioCommand22"},
- { INPUT_FUNCTION_RADIO_CMD_23, "RadioCommand23"},
- { INPUT_FUNCTION_RADIO_CMD_24, "RadioCommand24"},
- { INPUT_FUNCTION_RADIO_CMD_25, "RadioCommand25"},
- { INPUT_FUNCTION_RADIO_CMD_26, "RadioCommand26"},
- { INPUT_FUNCTION_RADIO_CMD_27, "RadioCommand27"},
- { INPUT_FUNCTION_RADIO_CMD_28, "RadioCommand28"},
- { INPUT_FUNCTION_RADIO_CMD_29, "RadioCommand29"},
- { INPUT_FUNCTION_RADIO_CMD_30, "RadioCommand30"},
- { INPUT_FUNCTION_TEAM_INFO_TOGGLE, "TeamInfoToggle" },
- { INPUT_FUNCTION_BATTLE_INFO_TOGGLE, "BattleInfoToggle" },
- { INPUT_FUNCTION_SERVER_INFO_TOGGLE, "ServerInfoToggle" },
- // Profiler Controls
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD0, "ProfileEnterChild0" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD1, "ProfileEnterChild1" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD2, "ProfileEnterChild2" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD3, "ProfileEnterChild3" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD4, "ProfileEnterChild4" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD5, "ProfileEnterChild5" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD6, "ProfileEnterChild6" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD7, "ProfileEnterChild7" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD8, "ProfileEnterChild8" },
- { INPUT_FUNCTION_PROFILE_ENTER_CHILD9, "ProfileEnterChild9" },
- { INPUT_FUNCTION_PROFILE_ENTER_PARENT, "ProfileEnterParent" },
- { INPUT_FUNCTION_PROFILE_RESET, "ProfileReset" },
- };
- /*
- ** FunctionKeyStates
- */
- int FunctionKeyStates[ NUM_FUNCTIONS ] =
- {
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_FORWARD,
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_BACKWARD,
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_LEFT,
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_RIGHT,
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_UP,
- BUTTON_HELD, //INPUT_FUNCTION_MOVE_DOWN,
- BUTTON_HELD, //INPUT_FUNCTION_WALK_MODE,
- BUTTON_HELD, //INPUT_FUNCTION_TURN_LEFT,
- BUTTON_HELD, //INPUT_FUNCTION_TURN_RIGHT,
- BUTTON_HELD, //INPUT_FUNCTION_VEHICLE_TURN_LEFT,
- BUTTON_HELD, //INPUT_FUNCTION_VEHICLE_TURN_RIGHT,
- BUTTON_HIT, //INPUT_FUNCTION_VEHICLE_TOGGLE_GUNNER,
- BUTTON_HELD, //INPUT_FUNCTION_WEAPON_UP,
- BUTTON_HELD, //INPUT_FUNCTION_WEAPON_DOWN,
- BUTTON_HELD, //INPUT_FUNCTION_WEAPON_LEFT,
- BUTTON_HELD, //INPUT_FUNCTION_WEAPON_RIGHT,
- BUTTON_HELD, //INPUT_FUNCTION_WEAPON_RESET,
- BUTTON_HELD, //INPUT_FUNCTION_ZOOM_IN,
- BUTTON_HELD, //INPUT_FUNCTION_ZOOM_OUT,
- BUTTON_HIT, //INPUT_FUNCTION_ACTION,
- BUTTON_HIT, //INPUT_FUNCTION_JUMP,
- // BUTTON_HIT, //INPUT_FUNCTION_CROUCH,
- BUTTON_HELD, //INPUT_FUNCTION_CROUCH,
- BUTTON_DOUBLE, //INPUT_FUNCTION_DIVE_FORWARD,
- BUTTON_DOUBLE, //INPUT_FUNCTION_DIVE_BACKWARD,
- BUTTON_DOUBLE, //INPUT_FUNCTION_DIVE_LEFT,
- BUTTON_DOUBLE, //INPUT_FUNCTION_DIVE_RIGHT,
- BUTTON_HIT, //INPUT_FUNCTION_TURN_AROUND,
- BUTTON_HIT, //INPUT_FUNCTION_DROP_FLAG,
- BUTTON_HIT, //INPUT_FUNCTION_NEXT_WEAPON,
- BUTTON_HIT, //INPUT_FUNCTION_PREV_WEAPON,
- BUTTON_HELD, //INPUT_FUNCTION_FIRE_WEAPON_PRIMARY,
- BUTTON_HELD, //INPUT_FUNCTION_FIRE_WEAPON_SECONDARY,
- BUTTON_HIT, //INPUT_FUNCTION_USE_WEAPON,
- BUTTON_HIT, //INPUT_FUNCTION_RELOAD_WEAPON,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_NO_WEAPON,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_0,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_1,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_2,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_3,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_4,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_5,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_6,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_7,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_8,
- BUTTON_HIT, //INPUT_FUNCTION_SELECT_WEAPON_9,
- BUTTON_HIT, //INPUT_FUNCTION_CYCLE_POG
- // BUTTON_HIT, //INPUT_FUNCTION_HUD_ZOOM_RADAR_IN,
- // BUTTON_HIT, //INPUT_FUNCTION_HUD_ZOOM_RADAR_OUT,
- BUTTON_HIT, //INPUT_FUNCTION_PANIC,
- BUTTON_HELD, //INPUT_FUNCTION_CURSOR_TARGETING,
- BUTTON_HIT, //INPUT_FUNCTION_FIRST_PERSON_TOGGLE,
- BUTTON_HIT, //INPUT_FUNCTION_SUICIDE,
- BUTTON_HIT, //INPUT_FUNCTION_VERBOSE_HELP,
- BUTTON_HIT, //INPUT_FUNCTION_BEGIN_PUBLIC_MESSAGE,
- BUTTON_HIT, //INPUT_FUNCTION_BEGIN_TEAM_MESSAGE,
- BUTTON_HIT, //INPUT_FUNCTION_BEGIN_PRIVATE_MESSAGE,
- BUTTON_HIT, //INPUT_FUNCTION_BEGIN_CONSOLE,
- BUTTON_HIT, //INPUT_FUNCTION_HELP_SCREEN,
- BUTTON_HIT, //INPUT_FUNCTION_EVA_OBJECTIVES_SCREEN
- BUTTON_HIT, //INPUT_FUNCTION_EVA_MAP_SCREEN
- // DEBUGGING
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_HEADING_LEFT,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_HEADING_RIGHT,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_TRANSTILT_INC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_TRANSTILT_DEC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_VIEWTILT_INC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_VIEWTILT_DEC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_DIST_INC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_DIST_DEC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_FOV_INC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_FOV_DEC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_HEIGHT_INC,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_CAMERA_HEIGHT_DEC,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_MENU_SERVERQUICKSTART,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_MENU_CLIENTQUICKSTART,
- BUTTON_HIT, //INPUT_FUNCTION_MAKE_SCREEN_SHOT,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_TOGGLE_MOVIE_CAPTURE,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_SINGLE_STEP,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_SINGLE_STEP_STEP,
- BUTTON_HELD, //INPUT_FUNCTION_DEBUG_RAPID_MOVE,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_GENERIC0,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_GENERIC1,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_FAR_CLIP_IN,
- BUTTON_HELD | BUTTON_DEBUG, //INPUT_FUNCTION_DEBUG_FAR_CLIP_OUT,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_QUICK_FULL_EXIT,
- BUTTON_HIT | BUTTON_DEBUG, //INPUT_FUNCTION_VIS_UPDATE,
- BUTTON_HIT, //INPUT_FUNCTION_TOGGLE_SNAP_SHOT_MODE,
- BUTTON_HIT, //INPUT_FUNCTION_SNAP_SHOT_ADVANCE,
- BUTTON_HIT, //INPUT_FUNCTION_CNC,
- BUTTON_HIT, //INPUT_FUNCTION_QUICKSAVE,
- // Menu
- BUTTON_HIT, //INPUT_FUNCTION_MENU_TOGGLE,
- // In game EVA
- BUTTON_HIT, //INPUT_FUNCTION_EVA_MISSION_OBJECTIVES_TOGGLE,
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_01
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_02
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_03
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_04
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_05
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_06
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_07
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_08
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_09
- BUTTON_HIT | BUTTON_CTRL, // INPUT_FUNCTION_CNC_RADIO_CMD_10
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_11,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_12,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_13,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_14,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_15,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_16,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_17,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_18,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_19,
- BUTTON_HIT | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_20,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_21,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_22,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_23,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_24,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_25,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_26,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_27,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_28,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_29,
- BUTTON_HIT | BUTTON_CTRL | BUTTON_ALT, // INPUT_FUNCTION_RADIO_CMD_30,
- BUTTON_HIT, //INPUT_FUNCTION_TEAM_INFO_TOGGLE,
- BUTTON_HIT, //INPUT_FUNCTION_BATTLE_INFO_TOGGLE,
- BUTTON_HIT, //INPUT_FUNCTION_SERVER_INFO_TOGGLE
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD0,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD1,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD2,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD3,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD4,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD5,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD6,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD7,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD8,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_CHILD9,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_ENTER_PARENT,
- BUTTON_HIT, //INPUT_FUNCTION_PROFILE_RESET,
- };
- /*
- **
- */
- class AcceleratedKeyDef {
- public:
- float Value;
- short Function;
- float Min;
- float Max;
- float Acceleration;
- };
- /*
- **
- */
- float Input::Sliders[ NUM_SLIDERS ];
- bool Input::ConsoleMode = false;
- bool Input::MenuMode = false;
- int Input::Queue[ Input::QUEUE_MAX ];
- int Input::QueueHead;
- int Input::QueueTail;
- int Input::QueueSize;
- float Input::FunctionValue[ INPUT_FUNCTION_COUNT ];
- float Input::FunctionClamp[ INPUT_FUNCTION_COUNT ];
- int Input::FunctionPrimaryKeys[ INPUT_FUNCTION_COUNT ];
- int Input::FunctionSecondaryKeys[ INPUT_FUNCTION_COUNT ];
- bool Input::DamageIndicatorsEnabled = true;
- bool Input::UsingDirectInput = true;
- SimpleDynVecClass<AcceleratedKeyDef> AcceleratedKeyList;
- int _StatsHelpScreen;
- int _StatsObjectives;
- int _StatsMap;
- int _StatsMenu;
- /*
- **
- */
- void Input::Init(bool use_dinput)
- {
- ConsoleMode = false;
- MenuMode = false;
- if (use_dinput) {
- DirectInput::Init();
- }
- UsingDirectInput = use_dinput;
- _StatsHelpScreen = 0;
- _StatsObjectives = 0;
- _StatsMap = 0;
- _StatsMenu = 0;
- memset( FunctionValue, 0, sizeof( FunctionValue ) );
- return ;
- }
- void Input::Shutdown( void )
- {
- Free_Mappings();
- if (UsingDirectInput) {
- DirectInput::Shutdown();
- }
- Debug_Say(( "Help Screen Hits: %d\n", _StatsHelpScreen ));
- Debug_Say(( " Objectives Hits: %d\n", _StatsObjectives ));
- Debug_Say(( " Map Screen Hits: %d\n", _StatsMap ));
- Debug_Say(( "Menu Screen Hits: %d\n", _StatsMenu ));
- return ;
- }
- void Input::Free_Mappings( void )
- {
- //
- // Simply reset the key arrays
- //
- ::memset (FunctionPrimaryKeys, 0, sizeof (FunctionPrimaryKeys));
- ::memset (FunctionSecondaryKeys, 0, sizeof (FunctionSecondaryKeys));
- //
- // Free the accelerated key list
- //
- AcceleratedKeyList.Delete_All ();
- return;
- }
- void Input::Load_Registry( const char * key )
- {
- /*RegistryClass * registry = new RegistryClass( key );
- WWASSERT( registry );
- if ( registry->Is_Valid() ) {
- MouseSensitivity = registry->Get_Float( "MouseSensitivity", MouseSensitivity );
- MouseScale = registry->Get_Float( "MouseScale", MouseScale );
- MouseInvert = registry->Get_Bool( "MouseInvert", MouseInvert );
- Mouse2DInvert = registry->Get_Bool( "Mouse2DInvert", Mouse2DInvert );
- }
- delete registry;*/
- //Input::Set_Mouse_Sensitivity( MouseSensitivity );
- }
- void Input::Save_Registry( const char * key )
- {
- /*RegistryClass * registry = new RegistryClass( key );
- WWASSERT( registry );
- if ( registry->Is_Valid() ) {
- registry->Set_Float( "MouseSensitivity", MouseSensitivity );
- registry->Set_Float( "MouseScale", MouseScale );
- registry->Set_Bool( "MouseInvert", MouseInvert );
- registry->Set_Bool( "Mouse2DInvert", Mouse2DInvert );
- }
- delete registry;*/
- }
- float Input::Get_Mouse_Sensitivity( void )
- {
- return MouseSensitivity;
- }
- void Input::Set_Mouse_Sensitivity( float mouse_sensitivity )
- {
- // save this in the registry...
- MouseSensitivity = WWMath::Clamp( mouse_sensitivity, 0, 1 );
- /*
- When MouseSensitivity == 0, set MouseScale to 0.00025
- When MouseSensitivity == 1, set MouseScale to 0.025
- When MouseSensitivity == x, set MouseScale to 25 * 10^(2x-5)
- */
- MouseScale = 25.0f * pow( 10.0f, 2*MouseSensitivity - 5 );
- }
- bool Input::Get_Mouse_Invert( void )
- {
- return MouseInvert;
- }
- void Input::Set_Mouse_Invert( bool invert )
- {
- // save this in the registry...
- MouseInvert = invert;
- }
- bool Input::Get_Mouse_2D_Invert( void )
- {
- return Mouse2DInvert;
- }
- void Input::Set_Mouse_2D_Invert( bool invert )
- {
- // save this in the registry...
- Mouse2DInvert = invert;
- }
- void Input::Flush( void )
- {
- if (UsingDirectInput) {
- DirectInput::Flush();
- }
- }
- void Input::Update_Sliders( void )
- {
- if (!UsingDirectInput) {
- return;
- }
- float wheel_scale = -0.05f;
- //
- // Update mouse sliders
- //
- float mouse_x = MouseScale * (float)(DirectInput::Get_Mouse_Axis( DirectInput::MOUSE_X_AXIS ));
- float mouse_y = MouseScale * (float)(DirectInput::Get_Mouse_Axis( DirectInput::MOUSE_Y_AXIS ));
- float mouse_z = wheel_scale * (float)(DirectInput::Get_Mouse_Axis( DirectInput::MOUSE_Z_AXIS ));
- if (TimeManager::Get_Frame_Real_Seconds() > 0.0f) {
- mouse_x /= TimeManager::Get_Frame_Real_Seconds();
- mouse_y /= TimeManager::Get_Frame_Real_Seconds();
- } else {
- mouse_x = 0.0f;
- mouse_y = 0.0f;
- mouse_z = 0.0f;
- }
- WWASSERT(WWMath::Is_Valid_Float(mouse_x));
- WWASSERT(WWMath::Is_Valid_Float(mouse_y));
- // it comes in as inverted
- if ( !MouseInvert ) {
- mouse_y = -mouse_y;
- }
- // Debug_Say(( "Mouse %f %f\n", mouse_x, mouse_y ));
- Sliders[ SLIDER_MOUSE_LEFT - FIRST_SLIDER ] = MAX( -mouse_x , 0.0f );
- Sliders[ SLIDER_MOUSE_RIGHT - FIRST_SLIDER ] = MAX( mouse_x , 0.0f );
- Sliders[ SLIDER_MOUSE_UP - FIRST_SLIDER ] = MAX( -mouse_y , 0.0f );
- Sliders[ SLIDER_MOUSE_DOWN - FIRST_SLIDER ] = MAX( mouse_y , 0.0f );
- Sliders[ SLIDER_MOUSE_WHEEL_FORWARD - FIRST_SLIDER ] = MAX( -mouse_z , 0.0f );
- Sliders[ SLIDER_MOUSE_WHEEL_BACKWARD - FIRST_SLIDER ] = MAX( mouse_z , 0.0f );
- //
- // Update joystick sliders
- //
- float joystick_x = (float)DirectInput::Get_Joystick_Axis_State( DirectInput::JOYSTICK_X_AXIS ) / 1000.0f;
- float joystick_y = (float)DirectInput::Get_Joystick_Axis_State( DirectInput::JOYSTICK_Y_AXIS ) / 1000.0f;
- const float DEAD_ZONE = 0.15f;
- if (WWMath::Fabs(joystick_x) < DEAD_ZONE) {
- joystick_x = 0.0f;
- } else {
- joystick_x = WWMath::Sign(joystick_x) * (WWMath::Fabs(joystick_x) - DEAD_ZONE) * 1.5f / (1.0f - DEAD_ZONE);
- }
- Sliders[ SLIDER_JOYSTICK_LEFT - FIRST_SLIDER ] = MAX( -joystick_x , 0.0f );
- Sliders[ SLIDER_JOYSTICK_RIGHT - FIRST_SLIDER ] = MAX( joystick_x , 0.0f );
- Sliders[ SLIDER_JOYSTICK_UP - FIRST_SLIDER ] = MAX( -joystick_y , 0.0f );
- Sliders[ SLIDER_JOYSTICK_DOWN - FIRST_SLIDER ] = MAX( joystick_y , 0.0f );
- return ;
- }
- void Input::Update( void )
- {
- if (!UsingDirectInput) {
- return;
- }
- if (!GameInFocus) {
- DirectInput::Unacquire();
- return;
- }
- // Update Direct Input
- DirectInput::Read();
- Update_Sliders ();
- //
- // zero all values
- //
- memset( FunctionValue, 0, sizeof( FunctionValue ) );
- // No ESC, O, M, F1, etc in cinematics!
- if ( COMBAT_CAMERA && COMBAT_CAMERA->Is_In_Cinematic() && !DebugManager::Allow_Cinematic_Keys() ) {
- return;
- }
- //
- // Don't process function inputs if we're in the menu
- //
- if ( MenuMode == false || ConsoleMode ) {
- //
- // Update the value of each function based on what keys are down
- //
- for (int index = 0; index < INPUT_FUNCTION_COUNT; index ++) {
- float value1 = Get_Value (index, FunctionPrimaryKeys[index], 1.0F);
- float value2 = Get_Value (index, FunctionSecondaryKeys[index], 1.0F);
- //
- // Special case the enter key. If the enter key isn't hit, then
- // check for the num-pad enter key
- //
- if (value1 == 0.0F && value2 == 0.0F) {
- if ( FunctionPrimaryKeys[index] == DIK_RETURN ||
- FunctionSecondaryKeys[index] == DIK_RETURN)
- {
- value1 = Get_Value (index, DIK_NUMPADENTER, 1.0F);
- }
- }
- FunctionValue[index] = max (value1, value2);
- }
- _StatsHelpScreen += Get_State( INPUT_FUNCTION_HELP_SCREEN ) ? 1 : 0;
- _StatsObjectives += Get_State( INPUT_FUNCTION_EVA_OBJECTIVES_SCREEN ) ? 1 : 0;
- _StatsMap += Get_State( INPUT_FUNCTION_EVA_MAP_SCREEN ) ? 1 : 0;
- _StatsMenu += Get_State( INPUT_FUNCTION_MENU_TOGGLE ) ? 1 : 0;
- //
- // Special case sniping mode. In sniping mode we make the primary zoom-in and zoom-out
- // keys exclusive.
- //
- if (COMBAT_CAMERA->Is_Star_Sniping ()) {
- int key1 = FunctionPrimaryKeys[INPUT_FUNCTION_ZOOM_IN];
- int key2 = FunctionPrimaryKeys[INPUT_FUNCTION_ZOOM_OUT];
- //
- // Loop over and zero out any function that uses either of these primary keys
- //
- for (index = 0; index < INPUT_FUNCTION_COUNT; index ++) {
- //
- // Does this function use one of the keys that is mapped to the zoom functions?
- //
- if ( FunctionPrimaryKeys[index] == key1 || FunctionSecondaryKeys[index] == key1 ||
- FunctionPrimaryKeys[index] == key2 || FunctionSecondaryKeys[index] == key2)
- {
- //
- // Zero out this function as necessary
- //
- if (index != INPUT_FUNCTION_ZOOM_IN && index != INPUT_FUNCTION_ZOOM_OUT) {
- FunctionValue[index] = 0;
- }
- }
- }
- }
- //
- // Special case the vehicle turning so it inherits the values
- // of the strafe command
- //
- FunctionValue[INPUT_FUNCTION_VEHICLE_TURN_LEFT] = max (FunctionValue[INPUT_FUNCTION_MOVE_LEFT], FunctionValue[INPUT_FUNCTION_TURN_LEFT]);
- FunctionValue[INPUT_FUNCTION_VEHICLE_TURN_RIGHT] = max (FunctionValue[INPUT_FUNCTION_MOVE_RIGHT], FunctionValue[INPUT_FUNCTION_TURN_RIGHT]);
- //
- // Apply accelerated keys
- //
- for (index = 0; index < AcceleratedKeyList.Count (); index ++) {
- AcceleratedKeyDef &def = AcceleratedKeyList[index];
- //
- // Is this fuction activated?
- //
- if ( Get_Value (def.Function, FunctionPrimaryKeys[def.Function], 1.0F) ||
- Get_Value (def.Function, FunctionSecondaryKeys[def.Function], 1.0F))
- {
- //
- // Apply the accelerated value
- //
- def.Value += def.Acceleration * TimeManager::Get_Frame_Real_Seconds ();
- def.Value = WWMath::Clamp (def.Value, def.Min, def.Max);
- //
- // Store the function's value (if necessary)
- //
- if (def.Value != 0.0F) {
- FunctionValue[def.Function] = def.Value;
- }
- } else {
- //
- // Reset the function's accelerated value
- //
- def.Value = 0.0F;
- }
- }
- } else {
- int index = INPUT_FUNCTION_BEGIN_CONSOLE;
- float value1 = Get_Value (index, FunctionPrimaryKeys[index], 1.0F);
- float value2 = Get_Value (index, FunctionSecondaryKeys[index], 1.0F);
- FunctionValue[index] = max (value1, value2);
- }
- return ;
- }
- int Input::Console_Get_Key()
- {
- if ( QueueSize > 0 ) {
- int key = Queue[ QueueTail ];
- if ( ++QueueTail == QUEUE_MAX ) {
- QueueTail = 0;
- }
- QueueSize--;
- return key;
- }
- return 0;
- }
- void Input::Console_Add_Key( int key )
- {
- if ( QueueSize < QUEUE_MAX ) {
- Queue[ QueueHead ] = key;
- if ( ++QueueHead == QUEUE_MAX ) {
- QueueHead = 0;
- }
- QueueSize++;
- }
- }
- /*
- **
- */
- bool Input::Is_Button_Down (int button_id)
- {
- if (!UsingDirectInput) {
- return(false);
- }
- return ((DirectInput::Get_Button_Value(button_id) & BUTTON_BIT_HELD) != 0);
- }
- /*
- **
- */
- float Input::Get_Value( int function_index, int input, float clamp )
- {
- if (!UsingDirectInput) {
- return(0.0f);
- }
- if ( input >= FIRST_SLIDER ) { // return slider state
- float slider = Sliders[ input - FIRST_SLIDER ];
- //
- // ignore the dead zone
- #if 0
- if ( slider < SLIDER_DEAD_ZONE ) {
- slider = 0;
- }
- // Ignore the clamp
- if ( slider > clamp ) {
- slider = clamp;
- }
- #endif
- // if ( input == SLIDER_MOUSE_LEFT ) Debug_Say(( "Slider %f\n", slider ));
- return slider;
- } else {
- #if(0)
- //
- // Bail if this is a debug key and the debug button isn't down
- //
- if ((FunctionKeyStates[function_index] & 0xF000) & BUTTON_DEBUG) {
- if ((DirectInput::Get_Button_Value(DIK_F9) & BUTTON_BIT_HELD) == 0) {
- return 0.0F;
- }
- } else if ((DirectInput::Get_Button_Value(DIK_F9) & BUTTON_BIT_HELD)) {
- return 0.0F;
- }
- #endif
- int modifier = 0;
- // Special case ctrl and alt for the 0 - 9 keys
- // Assumtion: DIK_keys go 1,2,3..9,0
- if ( (input&0xFF) >= DIK_1 && (input&0xFF) <= DIK_0 ) {
- // Shift is a key, used for walk!
- // modifier |= ((DirectInput::Get_Button_Value(DIK_SHIFT) & BUTTON_BIT_HELD) ? BUTTON_SHIFT : 0);
- modifier |= ((DirectInput::Get_Button_Value(DIK_CONTROL) & BUTTON_BIT_HELD) ? BUTTON_CTRL : 0);
- modifier |= ((DirectInput::Get_Button_Value(DIK_ALT) & BUTTON_BIT_HELD) ? BUTTON_ALT : 0);
- }
- modifier |= ((DirectInput::Get_Button_Value(DIK_F9) & BUTTON_BIT_HELD) ? BUTTON_DEBUG : 0);
- int funcModifier = (FunctionKeyStates[function_index] & 0xF000);
- if (funcModifier != modifier) {
- return 0.0f;
- }
- switch( FunctionKeyStates[ function_index ] & 0x0F ) {
- case BUTTON_UP:
- return (DirectInput::Get_Button_Value( input ) & BUTTON_BIT_HELD) ? 0.0 : 1.0;
- case BUTTON_HIT:
- return (DirectInput::Get_Button_Value( input ) & BUTTON_BIT_HIT) ? 1.0 : 0.0;
- case BUTTON_RELEASE:
- return (DirectInput::Get_Button_Value( input ) & BUTTON_BIT_RELEASED) ? 1.0 : 0.0;
- case BUTTON_HELD:
- return (DirectInput::Get_Button_Value( input ) & BUTTON_BIT_HELD) ? 1.0 : 0.0;
- case BUTTON_DOUBLE:
- return (DirectInput::Get_Button_Value( input ) & BUTTON_BIT_DOUBLE) ? 1.0 : 0.0;
- }
- }
- return 0.0f;
- }
- /*
- **
- */
- short Input::Get_Function( const char *name )
- {
- if ( name && name[0] ) {
- // find function
- for ( int function = 0; function < NUM_FUNCTIONS; function++ ) {
- if ( !stricmp( name, Functions[function].Name ) ) {
- return Functions[function].ID;
- }
- }
- Debug_Say(( "Unknown function name %s\n", name ));
- }
- return 0;
- }
- /*
- **
- */
- const char *Input::Get_Key_Name( short key_id )
- {
- //
- // Check each button name
- //
- for (int index = 0; index < NUM_BUTTON_NAMES; index ++) {
- if (ButtonNames[index].ID == key_id) {
- return ButtonNames[index].Name;
- }
- }
- //
- // Check each slider name
- //
- for (index = 0; index < NUM_SLIDER_NAMES; index ++) {
- if (SliderNames[index].ID == key_id) {
- return SliderNames[index].Name;
- }
- }
- Debug_Say(( "Could not find a name for key %d\n", key_id ));
- return NULL;
- }
- /*
- **
- */
- short Input::Get_Key( const char *name )
- {
- if (name != NULL && name[0] != 0) {
- //
- // Check each button name
- //
- for (int index = 0; index < NUM_BUTTON_NAMES; index ++) {
- if (::stricmp (name, ButtonNames[index].Name) == 0) {
- return ButtonNames[index].ID;
- }
- }
- //
- // Check each slider name
- //
- for (index = 0; index < NUM_SLIDER_NAMES; index ++) {
- if (::stricmp (name, SliderNames[index].Name) == 0) {
- return SliderNames[index].ID;
- }
- }
- Debug_Say(( "Could not find key name %s\n", name ));
- }
- return 0;
- }
- /*
- **
- */
- int
- Input::Get_Primary_Key_For_Function (int function_id)
- {
- return FunctionPrimaryKeys[ function_id ];
- }
- /*
- **
- */
- int
- Input::Get_Secondary_Key_For_Function (int function_id)
- {
- return FunctionSecondaryKeys[ function_id ];
- }
- /*
- **
- */
- void
- Input::Set_Primary_Key_For_Function (int function_id, int key_id)
- {
- FunctionPrimaryKeys[ function_id ] = key_id;
- // Use weapon key is the same as secondary fire, just hit rather than held
- if ( function_id == INPUT_FUNCTION_FIRE_WEAPON_SECONDARY ) {
- Set_Primary_Key_For_Function ( INPUT_FUNCTION_USE_WEAPON, key_id );
- }
- // Copy jump and crouch to move up and down
- if ( function_id == INPUT_FUNCTION_CROUCH ) {
- Set_Primary_Key_For_Function ( INPUT_FUNCTION_MOVE_DOWN, key_id );
- }
- if ( function_id == INPUT_FUNCTION_JUMP ) {
- Set_Primary_Key_For_Function ( INPUT_FUNCTION_MOVE_UP, key_id );
- }
- return ;
- }
- /*
- **
- */
- void
- Input::Set_Secondary_Key_For_Function (int function_id, int key_id)
- {
- FunctionSecondaryKeys[ function_id ] = key_id;
- // Use weapon key is the same as secondary fire, just hit rather than held
- if ( function_id == INPUT_FUNCTION_FIRE_WEAPON_SECONDARY ) {
- Set_Secondary_Key_For_Function ( INPUT_FUNCTION_USE_WEAPON, key_id );
- }
- // Copy jump and crouch to move up and down
- if ( function_id == INPUT_FUNCTION_CROUCH ) {
- Set_Secondary_Key_For_Function ( INPUT_FUNCTION_MOVE_DOWN, key_id );
- }
- if ( function_id == INPUT_FUNCTION_JUMP ) {
- Set_Secondary_Key_For_Function ( INPUT_FUNCTION_MOVE_UP, key_id );
- }
- return ;
- }
- /*
- **
- */
- void
- Input::Save_Configuration (const char *filename)
- {
- INIClass input_ini;
- //
- // Loop over each function and save its key mappings to the INI file
- //
- for (int index = 0; index < NUM_FUNCTIONS; index ++) {
- StringClass pri_name;
- StringClass sec_name;
- pri_name.Format ("%s_Primary", Functions[index].Name);
- sec_name.Format ("%s_Secondary", Functions[index].Name);
- StringClass pri_key;
- StringClass sec_key;
- //
- // Get the name of the primary key that's mapped to this function
- //
- if (FunctionPrimaryKeys[index] != 0) {
- pri_key = Get_Key_Name (FunctionPrimaryKeys[index]);
- }
- //
- // Get the name of the secondary key that's mapped to this function
- //
- if (FunctionSecondaryKeys[index] != 0) {
- sec_key = Get_Key_Name (FunctionSecondaryKeys[index]);
- }
- //
- // Read the primary and secondary keys for this function
- //
- input_ini.Put_String ("Generic Key Mappings", pri_name, pri_key);
- input_ini.Put_String ("Generic Key Mappings", sec_name, sec_key);
- }
- //
- // Save the accelerated functions
- //
- Save_Accelerated_Keys (&input_ini);
- Save_Misc_Settings (&input_ini);
- //
- // Save the data to a file
- //
- StringClass config_filename;
- config_filename.Format( "config\\%s", filename );
- FileClass *ini_file = _TheWritingFileFactory->Get_File (config_filename);
- if (ini_file != NULL) {
- ini_file->Open (FileClass::WRITE);
- input_ini.Save (*ini_file);
- _TheWritingFileFactory->Return_File (ini_file);
- }
- return ;
- }
- /*
- **
- */
- typedef struct
- {
- int text_id;
- int dik_id;
- } KEY_NAME_MAPPING;
- const KEY_NAME_MAPPING DIK_KEY_NAME_ARRAY[] =
- {
- { IDS_KEYNAME_DIK_F1, DIK_F1 },
- { IDS_KEYNAME_DIK_F2, DIK_F2 },
- { IDS_KEYNAME_DIK_F3, DIK_F3 },
- { IDS_KEYNAME_DIK_F4, DIK_F4 },
- { IDS_KEYNAME_DIK_F5, DIK_F5 },
- { IDS_KEYNAME_DIK_F6, DIK_F6 },
- { IDS_KEYNAME_DIK_F7, DIK_F7 },
- { IDS_KEYNAME_DIK_F8, DIK_F8 },
- { IDS_KEYNAME_DIK_F9, DIK_F9 },
- { IDS_KEYNAME_DIK_F10, DIK_F10 },
- { IDS_KEYNAME_DIK_F11, DIK_F11 },
- { IDS_KEYNAME_DIK_F12, DIK_F12 },
- { IDS_KEYNAME_DIK_0, DIK_0 },
- { IDS_KEYNAME_DIK_1, DIK_1 },
- { IDS_KEYNAME_DIK_2, DIK_2 },
- { IDS_KEYNAME_DIK_3, DIK_3 },
- { IDS_KEYNAME_DIK_4, DIK_4 },
- { IDS_KEYNAME_DIK_5, DIK_5 },
- { IDS_KEYNAME_DIK_6, DIK_6 },
- { IDS_KEYNAME_DIK_7, DIK_7 },
- { IDS_KEYNAME_DIK_8, DIK_8 },
- { IDS_KEYNAME_DIK_9, DIK_9 },
- { IDS_KEYNAME_DIK_A, DIK_A },
- { IDS_KEYNAME_DIK_B, DIK_B },
- { IDS_KEYNAME_DIK_C, DIK_C },
- { IDS_KEYNAME_DIK_D, DIK_D },
- { IDS_KEYNAME_DIK_E, DIK_E },
- { IDS_KEYNAME_DIK_F, DIK_F },
- { IDS_KEYNAME_DIK_G, DIK_G },
- { IDS_KEYNAME_DIK_H, DIK_H },
- { IDS_KEYNAME_DIK_I, DIK_I },
- { IDS_KEYNAME_DIK_J, DIK_J },
- { IDS_KEYNAME_DIK_K, DIK_K },
- { IDS_KEYNAME_DIK_L, DIK_L },
- { IDS_KEYNAME_DIK_M, DIK_M },
- { IDS_KEYNAME_DIK_N, DIK_N },
- { IDS_KEYNAME_DIK_O, DIK_O },
- { IDS_KEYNAME_DIK_P, DIK_P },
- { IDS_KEYNAME_DIK_Q, DIK_Q },
- { IDS_KEYNAME_DIK_R, DIK_R },
- { IDS_KEYNAME_DIK_S, DIK_S },
- { IDS_KEYNAME_DIK_T, DIK_T },
- { IDS_KEYNAME_DIK_U, DIK_U },
- { IDS_KEYNAME_DIK_V, DIK_V },
- { IDS_KEYNAME_DIK_W, DIK_W },
- { IDS_KEYNAME_DIK_X, DIK_X },
- { IDS_KEYNAME_DIK_Y, DIK_Y },
- { IDS_KEYNAME_DIK_Z, DIK_Z },
- { IDS_KEYNAME_DIK_MINUS, DIK_MINUS },
- { IDS_KEYNAME_DIK_EQUALS, DIK_EQUALS },
- { IDS_KEYNAME_DIK_BACK, DIK_BACK },
- { IDS_KEYNAME_DIK_TAB, DIK_TAB },
- { IDS_KEYNAME_DIK_LBRACKET, DIK_LBRACKET },
- { IDS_KEYNAME_DIK_RBRACKET, DIK_RBRACKET },
- { IDS_KEYNAME_DIK_RETURN, DIK_RETURN },
- { IDS_KEYNAME_DIK_SEMICOLON, DIK_SEMICOLON },
- { IDS_KEYNAME_DIK_APOSTROPHE,DIK_APOSTROPHE },
- { IDS_KEYNAME_DIK_GRAVE, DIK_GRAVE },
- { IDS_KEYNAME_DIK_BACKSLASH, DIK_BACKSLASH },
- { IDS_KEYNAME_DIK_COMMA, DIK_COMMA },
- { IDS_KEYNAME_DIK_PERIOD, DIK_PERIOD },
- { IDS_KEYNAME_DIK_SLASH, DIK_SLASH },
- { IDS_KEYNAME_DIK_SPACE, DIK_SPACE },
- { IDS_KEYNAME_DIK_CAPITAL, DIK_CAPITAL },
- { IDS_KEYNAME_DIK_NUMLOCK, DIK_NUMLOCK },
- { IDS_KEYNAME_DIK_SCROLL, DIK_SCROLL },
- { IDS_KEYNAME_DIK_ESCAPE, DIK_ESCAPE },
- { IDS_KEYNAME_DIK_NUMPAD0, DIK_NUMPAD0 },
- { IDS_KEYNAME_DIK_NUMPAD1, DIK_NUMPAD1 },
- { IDS_KEYNAME_DIK_NUMPAD2, DIK_NUMPAD2 },
- { IDS_KEYNAME_DIK_NUMPAD3, DIK_NUMPAD3 },
- { IDS_KEYNAME_DIK_NUMPAD4, DIK_NUMPAD4 },
- { IDS_KEYNAME_DIK_NUMPAD5, DIK_NUMPAD5 },
- { IDS_KEYNAME_DIK_NUMPAD6, DIK_NUMPAD6 },
- { IDS_KEYNAME_DIK_NUMPAD7, DIK_NUMPAD7 },
- { IDS_KEYNAME_DIK_NUMPAD8, DIK_NUMPAD8 },
- { IDS_KEYNAME_DIK_NUMPAD9, DIK_NUMPAD9 },
- { IDS_KEYNAME_DIK_SUBTRACT, DIK_SUBTRACT },
- { IDS_KEYNAME_DIK_MULTIPLY, DIK_MULTIPLY },
- { IDS_KEYNAME_DIK_ADD, DIK_ADD },
- { IDS_KEYNAME_DIK_DECIMAL, DIK_DECIMAL },
- { IDS_KEYNAME_DIK_NUMPADENTER, DIK_NUMPADENTER },
- { IDS_KEYNAME_DIK_DIVIDE, DIK_DIVIDE },
- { IDS_KEYNAME_DIK_HOME, DIK_HOME },
- { IDS_KEYNAME_DIK_PRIOR, DIK_PRIOR },
- { IDS_KEYNAME_DIK_END, DIK_END },
- { IDS_KEYNAME_DIK_NEXT, DIK_NEXT },
- { IDS_KEYNAME_DIK_INSERT, DIK_INSERT },
- { IDS_KEYNAME_DIK_DELETE, DIK_DELETE },
- { IDS_KEYNAME_DIK_UP, DIK_UP },
- { IDS_KEYNAME_DIK_DOWN, DIK_DOWN },
- { IDS_KEYNAME_DIK_LEFT, DIK_LEFT },
- { IDS_KEYNAME_DIK_RIGHT, DIK_RIGHT },
- { IDS_KEYNAME_DIK_SYSRQ, DIK_SYSRQ },
- { IDS_KEYNAME_DIK_CONTROL, DIK_CONTROL },
- { IDS_KEYNAME_DIK_LCONTROL, DIK_LCONTROL },
- { IDS_KEYNAME_DIK_RCONTROL, DIK_RCONTROL },
- { IDS_KEYNAME_DIK_SHIFT, DIK_SHIFT },
- { IDS_KEYNAME_DIK_LSHIFT, DIK_LSHIFT },
- { IDS_KEYNAME_DIK_RSHIFT, DIK_RSHIFT },
- { IDS_KEYNAME_DIK_ALT, DIK_ALT },
- { IDS_KEYNAME_DIK_LALT, DIK_LALT },
- { IDS_KEYNAME_DIK_RALT, DIK_RALT },
- { IDS_KEYNAME_DIK_WIN, DIK_WIN },
- { IDS_KEYNAME_DIK_LWIN, DIK_LWIN },
- { IDS_KEYNAME_DIK_RWIN, DIK_RWIN },
- { IDS_KEYNAME_DIK_APPS, DIK_APPS },
- { IDS_INPUT_LBUTTON, DirectInput::BUTTON_MOUSE_LEFT },
- { IDS_INPUT_RBUTTON, DirectInput::BUTTON_MOUSE_RIGHT },
- { IDS_INPUT_MBUTTON, DirectInput::BUTTON_MOUSE_CENTER },
- { IDS_INPUT_MW_UP, Input::SLIDER_MOUSE_WHEEL_FORWARD },
- { IDS_INPUT_MW_DN, Input::SLIDER_MOUSE_WHEEL_BACKWARD },
- { 0, DirectInput::BUTTON_JOYSTICK_A },
- { 0, DirectInput::BUTTON_JOYSTICK_B },
- { 0, Input::SLIDER_MOUSE_LEFT },
- { 0, Input::SLIDER_MOUSE_RIGHT },
- { 0, Input::SLIDER_MOUSE_UP },
- { 0, Input::SLIDER_MOUSE_DOWN },
- { 0, Input::SLIDER_JOYSTICK_LEFT },
- { 0, Input::SLIDER_JOYSTICK_RIGHT },
- { 0, Input::SLIDER_JOYSTICK_UP },
- { 0, Input::SLIDER_JOYSTICK_DOWN },
- };
- const int KEYNAME_MAP_COUNT = sizeof (DIK_KEY_NAME_ARRAY) / sizeof (KEY_NAME_MAPPING);
- /*
- **
- */
- void
- Input::Load_Configuration (const char *filename)
- {
- Free_Mappings ();
- //
- // Try to load the INI file
- //
- INIClass *input_ini = Get_INI (filename);
- if (input_ini == NULL) {
- Debug_Say(("Input::Load_Configuration - Unable to load %s\n", filename));
- return ;
- }
- //
- // Loop over each function and try to read data about it from the INI
- //
- for (int index = 0; index < NUM_FUNCTIONS; index ++) {
- StringClass pri_name;
- StringClass sec_name;
- pri_name.Format ("%s_Primary", Functions[index].Name);
- sec_name.Format ("%s_Secondary", Functions[index].Name);
- //
- // Read the primary and secondary keys for this function
- //
- StringClass pri_key(0,true);
- input_ini->Get_String (pri_key,"Generic Key Mappings", pri_name);
- StringClass sec_key(0,true);
- input_ini->Get_String (sec_key,"Generic Key Mappings", sec_name);
- //
- // Set the primary key for this function
- //
- if (pri_key.Is_Empty () == false) {
- FunctionPrimaryKeys[index] = Get_Key (pri_key);
- }
- //
- // Set the secondary key for this function
- //
- if (pri_key.Is_Empty () == false) {
- FunctionSecondaryKeys[index] = Get_Key (sec_key);
- }
- }
- //
- // Load the accelerated keys from the ini
- //
- Load_Accelerated_Keys (input_ini);
- Load_Misc_Settings (input_ini);
- //
- // Free the INI
- //
- Release_INI (input_ini);
- //
- // Reset the mouse sensitivity to ensure its clamped properly
- //
- Input::Set_Mouse_Sensitivity (MouseSensitivity);
- return ;
- }
- /*
- **
- */
- void
- Input::Load_Accelerated_Keys (INIClass *input_ini)
- {
- int count = input_ini->Entry_Count ("Accelerated Keys");
- //
- // Load information about each accelerated key
- //
- for (int index = 0; index < count; index ++) {
- StringClass entry_name(input_ini->Get_Entry ("Accelerated Keys", index),true);
- StringClass section_name(0,true);
- input_ini->Get_String (section_name, "Accelerated Keys", entry_name);
- Load_Accelerated_Key (input_ini, section_name);
- }
- return ;
- }
- /*
- **
- */
- void
- Input::Load_Accelerated_Key (INIClass *input_ini, const char *section_name)
- {
- StringClass function_name(0,true);
- input_ini->Get_String (function_name, section_name, ENTRY_FUNCTION);
- //
- // Fill in the structure we use to describe the accelerated key from the INI section.
- //
- AcceleratedKeyDef def;
- def.Function = Get_Function (function_name);
- def.Min = input_ini->Get_Float (section_name, ENTRY_MIN, 0);
- def.Max = input_ini->Get_Float (section_name, ENTRY_MAX, 0);
- def.Acceleration = input_ini->Get_Float (section_name, ENTRY_ACCELERATION, 1);
- //
- // Add this definition to the list
- //
- AcceleratedKeyList.Add (def);
- return ;
- }
- /*
- **
- */
- void
- Input::Save_Accelerated_Keys (INIClass *input_ini)
- {
- for (int index = 0; index < AcceleratedKeyList.Count (); index ++) {
- AcceleratedKeyDef &def = AcceleratedKeyList[index];
- //
- // Add an entry for this key to the section
- //
- StringClass entry_name;
- StringClass section_name;
- entry_name.Format ("%d", index + 1);
- section_name.Format ("AcceleratedKey%d", index + 1);
- input_ini->Put_String ("Accelerated Keys", entry_name, section_name);
- //
- // Save this accelerated key's definition to its own section
- //
- input_ini->Put_String (section_name, ENTRY_FUNCTION, Functions[def.Function].Name);
- input_ini->Put_Float (section_name, ENTRY_MIN, def.Min);
- input_ini->Put_Float (section_name, ENTRY_MAX, def.Max);
- input_ini->Put_Float (section_name, ENTRY_ACCELERATION, def.Acceleration);
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Get_Translated_Key_Name
- //
- ////////////////////////////////////////////////////////////////
- void
- Input::Get_Translated_Key_Name (int dik_id, WideStringClass &name)
- {
- for (int index = 0; index < KEYNAME_MAP_COUNT; index ++) {
- //
- // Is this the entry we're looking for?
- //
- if (DIK_KEY_NAME_ARRAY[index].dik_id == dik_id) {
- if (DIK_KEY_NAME_ARRAY[index].text_id != 0) {
- name = TRANSLATE (DIK_KEY_NAME_ARRAY[index].text_id);
- }
- break;
- }
- }
- return ;
- }
- /*
- **
- */
- void
- Input::Load_Misc_Settings (INIClass *input_ini)
- {
- DamageIndicatorsEnabled = input_ini->Get_Bool (SECTION_MISC_SETTINGS, ENTRY_DAMAGE_INDICATORS, true);
- MouseSensitivity = input_ini->Get_Float (SECTION_MISC_SETTINGS, ENTRY_MOUSE_SENSITIVITY, 0.5F);
- MouseScale = input_ini->Get_Float (SECTION_MISC_SETTINGS, ENTRY_MOUSE_SCALE, 1.0F);
- MouseInvert = input_ini->Get_Bool (SECTION_MISC_SETTINGS, ENTRY_MOUSE_INVERT, true);
- Mouse2DInvert = input_ini->Get_Bool (SECTION_MISC_SETTINGS, ENTRY_MOUSE_2D_INVERT, false);
- bool is_target_steering = input_ini->Get_Bool (ENTRY_TARGET_STEERING, false);
- VehicleGameObj::Set_Target_Steering (is_target_steering);
- //
- // Apply the settings
- //
- Input::Set_Mouse_Sensitivity( MouseSensitivity );
- return ;
- }
- /*
- **
- */
- void
- Input::Save_Misc_Settings (INIClass *input_ini)
- {
- input_ini->Put_Bool (SECTION_MISC_SETTINGS, ENTRY_DAMAGE_INDICATORS, DamageIndicatorsEnabled);
- input_ini->Put_Float (SECTION_MISC_SETTINGS, ENTRY_MOUSE_SENSITIVITY, MouseSensitivity);
- input_ini->Put_Float (SECTION_MISC_SETTINGS, ENTRY_MOUSE_SCALE, MouseScale);
- input_ini->Put_Bool (SECTION_MISC_SETTINGS, ENTRY_MOUSE_INVERT, MouseInvert);
- input_ini->Put_Bool (SECTION_MISC_SETTINGS, ENTRY_MOUSE_2D_INVERT, Mouse2DInvert);
- input_ini->Put_Bool (SECTION_MISC_SETTINGS, ENTRY_TARGET_STEERING, VehicleGameObj::Is_Target_Steering ());
- return ;
- }
- /*
- **
- */
- int
- Input::Find_First_Function_By_Primary_Key (int key_id)
- {
- return Find_Next_Function_By_Primary_Key (-1, key_id);
- }
- /*
- **
- */
- int
- Input::Find_Next_Function_By_Primary_Key (int function_id, int key_id)
- {
- int retval = -1;
- for (int index = (function_id + 1); index < INPUT_FUNCTION_COUNT; index ++) {
- if (FunctionPrimaryKeys[index] == key_id) {
- retval = index;
- break;
- }
- }
- return retval;
- }
- /*
- **
- */
- int
- Input::Find_First_Function_By_Secondary_Key (int key_id)
- {
- return Find_Next_Function_By_Secondary_Key (-1, key_id);
- }
- /*
- **
- */
- int
- Input::Find_Next_Function_By_Secondary_Key (int function_id, int key_id)
- {
- int retval = -1;
- for (int index = (function_id + 1); index < INPUT_FUNCTION_COUNT; index ++) {
- if (FunctionSecondaryKeys[index] == key_id) {
- retval = index;
- break;
- }
- }
- return retval;
- }
|