- make use of map bindings

All automap controls have been moved there, and sizeup/sizedown have been made CCMDs, taking screen size management entirely out of the game modules
This commit is contained in:
Christoph Oelckers 2020-08-24 20:20:15 +02:00
parent 092fb55db3
commit f1a988b221
26 changed files with 84 additions and 439 deletions

View file

@ -699,11 +699,9 @@ static const char* actions[] = {
"Aim_Up",
"Aim_Down",
"SendMessage",
"Map",
"Shrink_Screen",
"Enlarge_Screen",
"Show_Opponents_Weapon",
"Map_Follow_Mode",
"See_Coop_View",
"Mouse_Aiming",
"Dpad_Select",

View file

@ -52,11 +52,9 @@ enum GameFunction_t
gamefunc_Aim_Up,
gamefunc_Aim_Down,
gamefunc_SendMessage,
gamefunc_Map,
gamefunc_Shrink_Screen,
gamefunc_Enlarge_Screen,
gamefunc_Show_Opponents_Weapon,
gamefunc_Map_Follow_Mode,
gamefunc_See_Coop_View,
gamefunc_Mouse_Aiming,
gamefunc_Dpad_Select,

View file

@ -183,26 +183,8 @@ void ctrlGetInput(void)
UsesToSend.byte = 0;
WeaponToSend = 0;
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
automapFollow = !automapFollow;
}
if (buttonMap.ButtonDown(gamefunc_Shrink_Screen))
{
if (automapMode == am_off)
{
buttonMap.ClearButton(gamefunc_Shrink_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(-1);
}
else
{
hud_scale = hud_scale - 4;
}
}
if (automapMode != am_off)
{
gZoom = ClipLow(gZoom - (gZoom >> 4), 64);
@ -212,18 +194,6 @@ void ctrlGetInput(void)
if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen))
{
if (automapMode == am_off)
{
buttonMap.ClearButton(gamefunc_Enlarge_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(1);
}
else
{
hud_scale = hud_scale + 4;
}
}
if (automapMode != am_off)
{
gZoom = ClipHigh(gZoom + (gZoom >> 4), 4096);

View file

@ -105,11 +105,20 @@ bool automapFollow;
CCMD(togglemap)
{
automapMode++;
if (automapMode == am_count) automapMode = am_off;
if ((g_gameType & GAMEFLAG_BLOOD) && automapMode == am_overlay) automapMode = am_full; // todo: investigate if this can be re-enabled
if (gamestate == GS_LEVEL)
{
automapMode++;
if (automapMode == am_count) automapMode = am_off;
if ((g_gameType & GAMEFLAG_BLOOD) && automapMode == am_overlay) automapMode = am_full; // todo: investigate if this can be re-enabled
gi->ResetFollowPos(false);
}
}
CCMD(togglefollow)
{
automapFollow = !automapFollow;
gi->ResetFollowPos(true);
}
glcycle_t thinktime, actortime, gameupdatetime, drawtime;

View file

@ -170,32 +170,6 @@ CUSTOM_CVARD(Int, hud_size, Hud_Stbar, CVAR_ARCHIVE | CVAR_NOINITCALL, "Defines
else setViewport(self);
}
// This is for game code to change the size, so that the range checks remain isolated here.
bool G_ChangeHudLayout(int direction)
{
if (direction < 0 && hud_size > 0)
{
hud_size = hud_size - 1;
return true;
}
else if (direction > 0 && hud_size < Hud_Nothing)
{
hud_size = hud_size + 1;
return true;
}
return false;
}
CCMD(sizeup)
{
if (G_ChangeHudLayout(1)) gi->PlayHudSound();
}
CCMD(sizedown)
{
if (G_ChangeHudLayout(-1)) gi->PlayHudSound();
}
CUSTOM_CVARD(Int, hud_scale, 100, CVAR_ARCHIVE | CVAR_NOINITCALL, "changes the hud scale")
{
if (self < 36) self = 36;
@ -203,20 +177,41 @@ CUSTOM_CVARD(Int, hud_scale, 100, CVAR_ARCHIVE | CVAR_NOINITCALL, "changes the h
else setViewport(hud_size);
}
CCMD(scaleup)
// Note: The shift detection here should be part of the key event data, but that requires a lot more work. Ideally use a ShiftBinds mapping. For control through bound keys this should be fine, bunt not for use from the console.
CCMD(sizeup)
{
int oldscale = hud_scale;
hud_scale = hud_scale + 4;
if (hud_scale != oldscale) gi->PlayHudSound();
if (!inputState.ShiftPressed())
{
if (hud_size < Hud_Nothing)
{
hud_size = hud_size + 1;
gi->PlayHudSound();
}
}
else
{
hud_scale = hud_scale + 4;
}
}
CCMD(scaledown)
CCMD(sizedown)
{
int oldscale = hud_scale;
hud_scale = hud_scale - 4;
if (hud_scale != oldscale) gi->PlayHudSound();
if (!inputState.ShiftPressed())
{
if (hud_size > 0)
{
hud_size = hud_size - 1;
gi->PlayHudSound();
}
}
else
{
hud_scale = hud_scale - 4;
}
}
CUSTOM_CVARD(Float, hud_statscale, 2, CVAR_ARCHIVE, "change the scale of the stats display")
{
if (self < 0.5) self = 0.5;

View file

@ -119,7 +119,6 @@ EXTERN_CVAR(Int, playercolor)
extern bool gNoAutoLoad;
extern int hud_statusbarrange; // will be set by the game's configuration setup.
bool G_ChangeHudLayout(int direction);
bool G_CheckAutorun(bool button);
inline int G_FPSLimit(void) { return 1; }
bool G_AllowAutoload();

View file

@ -90,6 +90,8 @@ struct GameInterface
virtual bool CheatAllowed(bool printmsg) { return true; }
virtual void ExitFromMenu() { throw CExitEvent(0); }
virtual ReservedSpace GetReservedScreenSpace(int viewsize) { return { 0, 0 }; }
virtual void ResetFollowPos(bool) {}
};

View file

@ -598,11 +598,9 @@ static const char* actions[] =
"Aim_Up",
"Aim_Down",
"SendMessage",
"Map",
"Shrink_Screen",
"Enlarge_Screen",
"Show_Opponents_Weapon",
"Map_Follow_Mode",
"See_Coop_View",
"Mouse_Aiming",
"Dpad_Select",

View file

@ -59,11 +59,9 @@ enum GameFunction_t
gamefunc_Aim_Up,
gamefunc_Aim_Down,
gamefunc_SendMessage,
gamefunc_Map,
gamefunc_Shrink_Screen,
gamefunc_Enlarge_Screen,
gamefunc_Show_Opponents_Weapon,
gamefunc_Map_Follow_Mode,
gamefunc_See_Coop_View,
gamefunc_Mouse_Aiming,
gamefunc_Dpad_Select,

View file

@ -128,35 +128,6 @@ void UpdateInputs()
void CheckKeys()
{
if (automapMode == am_off)
{
if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen))
{
buttonMap.ClearButton(gamefunc_Enlarge_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(1);
}
else
{
hud_scale = hud_scale + 4;
}
}
if (buttonMap.ButtonDown(gamefunc_Shrink_Screen))
{
buttonMap.ClearButton(gamefunc_Shrink_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(-1);
}
else
{
hud_scale = hud_scale - 4;
}
}
}
// go to 3rd person view?
if (buttonMap.ButtonDown(gamefunc_Third_Person_View))
{
@ -186,15 +157,6 @@ static int32_t nonsharedtimer;
void CheckKeys2()
{
if (buttonMap.ButtonDown(gamefunc_Map)) // e.g. TAB (to show 2D map)
{
buttonMap.ClearButton(gamefunc_Map);
if (!nFreeze) {
automapMode = (automapMode + 1) % 3;
}
}
if (automapMode != am_off)
{
int const timerOffset = ((int)totalclock - nonsharedtimer);

View file

@ -24,11 +24,9 @@ enum GameFunction_t
gamefunc_Strafe_Right,
gamefunc_Aim_Up,
gamefunc_Aim_Down,
gamefunc_Map, // CCMD
gamefunc_Shrink_Screen, // CCMD
gamefunc_Enlarge_Screen, // CCMD
gamefunc_Show_Opponents_Weapon, // CCMD
gamefunc_Map_Follow_Mode, // CCMD
gamefunc_See_Coop_View, // CCMD
gamefunc_Mouse_Aiming, // CCMD
gamefunc_Quick_Kick,

View file

@ -58,6 +58,7 @@ struct GameInterface : public ::GameInterface
void ExitFromMenu() override;
ReservedSpace GetReservedScreenSpace(int viewsize) override;
void DrawPlayerSprite(const DVector2& origin, bool onteam) override;
void ResetFollowPos(bool message) override;
};

View file

@ -255,11 +255,9 @@ static void SetupGameButtons()
"Strafe_Right",
"Aim_Up",
"Aim_Down",
"Map",
"Shrink_Screen",
"Enlarge_Screen",
"Show_Opponents_Weapon",
"Map_Follow_Mode",
"See_Coop_View",
"Mouse_Aiming",
"Quick_Kick",

View file

@ -47,6 +47,17 @@ static int turnheldtime;
static int lastcontroltime;
static double lastCheck;
void GameInterface::ResetFollowPos(bool message)
{
if (automapFollow)
{
ud.folx = ps[screenpeek].oposx;
ud.foly = ps[screenpeek].oposy;
ud.fola = ps[screenpeek].getoang();
}
if (message) FTA(automapFollow? QUOTE_MAP_FOLLOW_ON : QUOTE_MAP_FOLLOW_OFF, &ps[myconnectindex]);
}
//---------------------------------------------------------------------------
//
// handles UI side input not handled via CCMDs or CVARs.
@ -65,43 +76,6 @@ void nonsharedkeys(void)
if (System_WantGuiCapture())
return;
if (!ALT_IS_PRESSED && automapMode == am_off)
{
if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen))
{
buttonMap.ClearButton(gamefunc_Enlarge_Screen);
if (!SHIFTS_IS_PRESSED)
{
if (G_ChangeHudLayout(1))
{
gi->PlayHudSound();
}
}
else
{
hud_scale = hud_scale + 4;
}
}
if (buttonMap.ButtonDown(gamefunc_Shrink_Screen))
{
buttonMap.ClearButton(gamefunc_Shrink_Screen);
if (!SHIFTS_IS_PRESSED)
{
if (G_ChangeHudLayout(-1))
{
gi->PlayHudSound();
}
}
else
{
hud_scale = hud_scale - 4;
}
}
}
if (buttonMap.ButtonDown(gamefunc_See_Coop_View) && (ud.coop || ud.recstat == 2))
{
buttonMap.ClearButton(gamefunc_See_Coop_View);
@ -117,19 +91,6 @@ void nonsharedkeys(void)
FTA(QUOTE_WEAPON_MODE_OFF - ud.showweapons, &ps[screenpeek]);
}
if (automapMode != am_off && buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
automapFollow = !automapFollow;
if (automapFollow)
{
ud.folx = ps[screenpeek].oposx;
ud.foly = ps[screenpeek].oposy;
ud.fola = ps[screenpeek].getoang();
}
FTA(automapFollow? QUOTE_MAP_FOLLOW_ON : QUOTE_MAP_FOLLOW_OFF, &ps[myconnectindex]);
}
// Fixme: This really should be done via CCMD, not via hard coded key checks - but that needs alternative Shift and Alt bindings.
if (SHIFTS_IS_PRESSED || ALT_IS_PRESSED)
{

View file

@ -958,34 +958,6 @@ ResizeView(PLAYERp pp)
zoom = min<int32_t>(zoom + mulscale7(timepassed * synctics, zoom), 4096);
}
else
{
if (buttonMap.ButtonDown(gamefunc_Shrink_Screen)) // &&
{
buttonMap.ClearButton(gamefunc_Shrink_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(-1);
}
else
{
hud_scale = hud_scale - 4;
}
}
if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) // &&
{
buttonMap.ClearButton(gamefunc_Enlarge_Screen);
if (!SHIFTS_IS_PRESSED)
{
G_ChangeHudLayout(1);
}
else
{
hud_scale = hud_scale + 4;
}
}
}
}

View file

@ -196,11 +196,9 @@ static const char* actions[] = {
"Aim_Up",
"Aim_Down",
"SendMessage",
"Map",
"Shrink_Screen",
"Enlarge_Screen",
"Show_Opponents_Weapon",
"Map_Follow_Mode",
"See_Coop_View",
"Mouse_Aiming",
"Dpad_Select",

View file

@ -94,11 +94,9 @@ enum GameFunction_t
gamefunc_Aim_Up,
gamefunc_Aim_Down,
gamefunc_SendMessage,
gamefunc_Map,
gamefunc_Shrink_Screen,
gamefunc_Enlarge_Screen,
gamefunc_Show_Opponents_Weapon,
gamefunc_Map_Follow_Mode,
gamefunc_See_Coop_View,
gamefunc_Mouse_Aiming,
gamefunc_Dpad_Select,
@ -2379,7 +2377,8 @@ struct GameInterface : ::GameInterface
ReservedSpace GetReservedScreenSpace(int viewsize) override;
void clearlocalinputstate() override;
void QuitToTitle() override;
void ResetFollowPos(bool message) override;
FString statFPS() override;
GameStats getStats() override;
};

View file

@ -116,6 +116,13 @@ void DoPlayerTurn(PLAYERp pp, fix16_t *pq16ang, fix16_t q16angvel);
void DoPlayerHorizon(PLAYERp pp, fix16_t *pq16horiz, fix16_t q16aimvel);
void GameInterface::ResetFollowPos(bool)
{
auto pp = &Player[myconnectindex];
Follow_posx = pp->posx;
Follow_posy = pp->posy;
}
void
getinput(SW_PACKET *loc, SWBOOL tied)
{
@ -178,34 +185,6 @@ getinput(SW_PACKET *loc, SWBOOL tied)
if (paused)
return;
// MAP KEY
if (buttonMap.ButtonDown(gamefunc_Map))
{
buttonMap.ClearButton(gamefunc_Map);
// Init follow coords
Follow_posx = pp->posx;
Follow_posy = pp->posy;
automapMode++;
if (automapMode == am_count)
{
automapMode = am_off;
}
}
// Toggle follow map mode on/off
if (automapMode != am_off)
{
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
automapFollow = !automapFollow;
Follow_posx = pp->posx;
Follow_posy = pp->posy;
}
}
// If in 2D follow mode, scroll around using glob vars
// Tried calling this in domovethings, but key response it too poor, skips key presses
// Note: this get called only during follow mode

View file

@ -2473,16 +2473,6 @@ MoveScrollMode2D(PLAYERp pp)
}
#endif
// Toggle follow map mode on/off
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
automapFollow = !automapFollow;
// Reset coords
Follow_posx = pp->posx;
Follow_posy = pp->posy;
}
if (buttonMap.ButtonDown(gamefunc_Strafe))
mfsvel -= scrl_input.dyaw / 4;
mfsvel -= scrl_input.dx / 4;

View file

@ -35,10 +35,12 @@ Pause "pause"
` "toggleconsole"
T "+Send_Message"
Tab "+Map"
F "+Map_Follow_Mode"
- "+Shrink_Screen"
= "+Enlarge_Screen"
Tab "togglemap"
mapbind F "togglefollow"
mapbind - "+Shrink_Screen"
mapbind = "+Enlarge_Screen"
- "sizedown"
= "sizeup"
K "+See_Coop_View"
Mouse1 "+Fire"

View file

@ -12,7 +12,9 @@ KP1 "+Aim_Down"
KP5 "centerview"
KP9 "+Look_Up"
KP3 "+Look_Down"
KP- "+Shrink_Screen"
KP+ "+Enlarge_Screen"
mapbind KP- "+Shrink_Screen"
mapbind KP+ "+Enlarge_Screen"
- "sizedown"
+ "sizeup""
Y "+Show_Opponents_Weapon"
CapsLock "toggle cl_autorun"

View file

@ -695,7 +695,9 @@ OptionMenu "OtherControlsMenu"// protected
StaticText ""
Control "$CNTRLMNU_AUTOMAP" , "+map"
Control "$MAPCNTRLMNU_TOGGLEFOLLOW","+map_follow_mode"
MapControl "$MAPCNTRLMNU_TOGGLEFOLLOW","+map_follow_mode"
MapControl "$MAPCNTRLMNU_ZOOMIN" , "+enlarge_Screen"
MapControl "$MAPCNTRLMNU_ZOOMOUT" , "+shrink_screen"
StaticText ""
Control "$CNTRLMNU_CHASECAM" , "+third_person_view"
@ -706,8 +708,8 @@ OptionMenu "OtherControlsMenu"// protected
//Control "$CNTRLMNU_PAUSE" , "pause"
StaticText ""
Control "$CNTRLMNU_DISPLAY_INC" , "+enlarge_Screen"
Control "$CNTRLMNU_DISPLAY_DEC" , "+shrink_screen"
Control "$CNTRLMNU_DISPLAY_INC" , "sizeup"
Control "$CNTRLMNU_DISPLAY_DEC" , "sizedown"
Control "$CNTRLMNU_TOGGLE_MESSAGES" , "togglemessages"
Control "$CNTRLMNU_ADJUST_GAMMA" , "bumpgamma"

View file

@ -13,8 +13,10 @@ KP. "+Look_Right"
KP7 "+Aim_Up"
KP1 "+Aim_Down"
KP5 "centerview"
KP- "+Shrink_Screen"
KP+ "+Enlarge_Screen"
mapbind KP- "+Shrink_Screen"
mapbind KP+ "+Enlarge_Screen"
- "sizedown"
+ "sizeup""
U "+Mouse_Aiming"
I "toggle cl_crosshair"
CapsLock "toggle cl_autorun"

View file

@ -1,65 +1,4 @@
W "+Move_Forward"
KP8 "+Move_Forward"
S "+Move_Backward"
KP2 "+Move_Backward"
leftarrow "+Turn_Left"
KP4 "+Turn_Left"
rightarrow "+Turn_Right"
KP6 "+Turn_Right"
LAlt "+Strafe"
RAlt "+Strafe"
RCtrl "+Fire"
E "+Open"
LShift "+Run"
RShift "+Run"
Space "+Jump"
/ "+Jump"
Ctrl "+Crouch"
PgUp "+Look_Up"
KP9 "+Look_Up"
PgDn "+Look_Down"
KP3 "+Look_Down"
Ins "+Look_Left"
KP0 "+Look_Left"
Del "+Look_Right"
KP. "+Look_Right"
A "+Strafe_Left"
D "+Strafe_Right"
Home "+Aim_Up"
KP7 "+Aim_Up"
End "+Aim_Down"
KP1 "+Aim_Down"
1 "+Weapon_1"
2 "+Weapon_2"
3 "+Weapon_3"
4 "+Weapon_4"
5 "+Weapon_5"
6 "+Weapon_6"
7 "+Weapon_7"
Enter "+Inventory"
KP-Enter "+Inventory"
[ "+Inventory_Left"
] "+Inventory_Right"
Backspace "+TurnAround"
T "+Send_Message"
Tab "+Map"
- "+Shrink_Screen"
KP- "+Shrink_Screen"
= "+Enlarge_Screen"
KP+ "+Enlarge_Screen"
KP5 "+Center_View"
Scroll "+Holster_Weapon"
Y "+Show_Opponents_Weapon"
F "+Map_Follow_Mode"
K "+See_Coop_View"
' "+Next_Weapon"
; "+Previous_Weapon"
` "toggleconsole"
X "+Last_Used_Weapon"
F6 "+Quick_Save"
F9 "+Quick_Load"
F7 "+Third_Person_View"
C "+Toggle_Crouch"
Mouse1 "+Fire"
Mouse2 "+Strafe"
Mouse3 "+Move_Forward"

View file

@ -1,63 +1,2 @@
uparrow "+Move_Forward"
KP8 "+Move_Forward"
downarrow "+Move_Backward"
KP2 "+Move_Backward"
leftarrow "+Turn_Left"
KP4 "+Turn_Left"
rightarrow "+Turn_Right"
KP6 "+Turn_Right"
LAlt "+Strafe"
RAlt "+Strafe"
Ctrl "+Fire"
RCtrl "+Fire"
Space "+Open"
LShift "+Run"
RShift "+Run"
A "+Jump"
KP- "+Jump"
Z "+Crouch"
PgUp "+Look_Up"
PgDn "+Look_Down"
Ins "+Look_Left"
Del "+Look_Right"
, "+Strafe_Left"
KP7 "+Strafe_Left"
. "+Strafe_Right"
KP9 "+Strafe_Right"
Home "+Aim_Up"
End "+Aim_Down"
1 "+Weapon_1"
2 "+Weapon_2"
3 "+Weapon_3"
4 "+Weapon_4"
5 "+Weapon_5"
6 "+Weapon_6"
7 "+Weapon_7"
Enter "+Inventory"
KP-Enter "+Inventory"
[ "+Inventory_Left"
] "+Inventory_Right"
Backspace "+TurnAround"
T "+Send_Message"
Tab "+Map"
- "+Shrink_Screen"
= "+Enlarge_Screen"
//Scroll "+Holster_Weapon"
//W "+Show_Opponents_Weapon"
F "+Map_Follow_Mode"
K "+See_Coop_View"
U "+Mouse_Aiming"
I "toggle cl_crosshair"
//R "+Steroids"
//Q "+Quick_Kick"
' "+Next_Weapon"
; "+Previous_Weapon"
` "toggleconsole"
F6 "+Quick_Save"
F9 "+Quick_Load"
F7 "+Third_Person_View"
Mouse1 "+Fire"
Mouse2 "+Open"
Mouse3 "+Run"
MWheelUp "+Previous_Weapon"
MWheelDown "+Next_Weapon"

View file

@ -1,68 +1,2 @@
uparrow "+Move_Forward"
KP8 "+Move_Forward"
downarrow "+Move_Backward"
KP2 "+Move_Backward"
leftarrow "+Turn_Left"
KP4 "+Turn_Left"
rightarrow "+Turn_Right"
KP6 "+Turn_Right"
LAlt "+Strafe"
RAlt "+Strafe"
Ctrl "+Fire"
RCtrl "+Fire"
Space "+Open"
LShift "+Run"
RShift "+Run"
A "+Jump"
/ "+Jump"
Z "+Crouch"
PgUp "+Look_Up"
KP9 "+Look_Up"
PgDn "+Look_Down"
KP3 "+Look_Down"
Ins "+Look_Left"
KP0 "+Look_Left"
Del "+Look_Right"
KP. "+Look_Right"
, "+Strafe_Left"
. "+Strafe_Right"
Home "+Aim_Up"
KP7 "+Aim_Up"
End "+Aim_Down"
KP1 "+Aim_Down"
1 "+Weapon_1"
2 "+Weapon_2"
3 "+Weapon_3"
4 "+Weapon_4"
5 "+Weapon_5"
6 "+Weapon_6"
7 "+Weapon_7"
Enter "+Inventory"
KP-Enter "+Inventory"
[ "+Inventory_Left"
] "+Inventory_Right"
Backspace "+TurnAround"
T "+Send_Message"
Tab "+Map"
- "+Shrink_Screen"
KP- "+Shrink_Screen"
= "+Enlarge_Screen"
KP+ "+Enlarge_Screen"
KP5 "+Center_View"
//Scroll "+Holster_Weapon"
//W "+Show_Opponents_Weapon"
F "+Map_Follow_Mode"
K "+See_Coop_View"
U "+Mouse_Aiming"
I "toggle cl_crosshair"
//R "+Steroids"
//` "+Quick_Kick"
' "+Next_Weapon"
; "+Previous_Weapon"
` "toggleconsole"
F6 "+Quick_Save"
F9 "+Quick_Load"
F7 "+Third_Person_View"
Mouse1 "+Fire"
Mouse2 "+Strafe"
Mouse3 "+Move_Forward"