diff --git a/source/common/console/c_bind.cpp b/source/common/console/c_bind.cpp index 1aad2d255..85d8dcc18 100644 --- a/source/common/console/c_bind.cpp +++ b/source/common/console/c_bind.cpp @@ -155,6 +155,7 @@ const char *KeyNames[NUM_KEYS] = FKeyBindings Bindings; FKeyBindings DoubleBindings; FKeyBindings AutomapBindings; +FKeyBindings ShiftBindings; static unsigned int DClickTime[NUM_KEYS]; static FixedBitArray DClicked; diff --git a/source/common/console/c_bind.h b/source/common/console/c_bind.h index 76c911a65..62f1235c5 100644 --- a/source/common/console/c_bind.h +++ b/source/common/console/c_bind.h @@ -87,7 +87,7 @@ public: extern FKeyBindings Bindings; extern FKeyBindings DoubleBindings; extern FKeyBindings AutomapBindings; -extern FKeyBindings MenuBindings; +extern FKeyBindings ShiftBindings; bool C_DoKey (event_t *ev, FKeyBindings *binds, FKeyBindings *doublebinds); diff --git a/source/common/platform/win32/i_keyboard.cpp b/source/common/platform/win32/i_keyboard.cpp index 7fdb83e3e..ce204f71c 100644 --- a/source/common/platform/win32/i_keyboard.cpp +++ b/source/common/platform/win32/i_keyboard.cpp @@ -277,6 +277,8 @@ void FKeyboard::PostKeyEvent(int key, INTBOOL down, bool foreground) } ev.data1 = key; ev.data2 = Convert[key]; + ev.data3 = 0; + if (CheckKey(DIK_LSHIFT) || CheckKey(DIK_RSHIFT)) ev.data3 |= 1; D_PostEvent(&ev); } diff --git a/source/core/console/d_event.cpp b/source/core/console/d_event.cpp index 71787e781..c078b2d49 100644 --- a/source/core/console/d_event.cpp +++ b/source/core/console/d_event.cpp @@ -49,15 +49,16 @@ bool G_Responder (event_t *ev) { + FKeyBindings* binds = &Bindings; switch (ev->type) { case EV_KeyDown: - if (C_DoKey (ev, &Bindings, &DoubleBindings)) + if (C_DoKey (ev, binds, &DoubleBindings)) return true; break; case EV_KeyUp: - C_DoKey (ev, &Bindings, &DoubleBindings); + C_DoKey (ev, binds, &DoubleBindings); break; #if 0 diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index 1dba146be..b3bb83deb 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -1101,7 +1101,7 @@ bool CheckCheatmode(bool printmsg) void updatePauseStatus() { bool GUICapture = System_WantGuiCapture(); - if (M_Active() || GUICapture) + if ( GUICapture) { paused = 1; } diff --git a/source/core/gamecvars.cpp b/source/core/gamecvars.cpp index 263f8f6bd..37b8f7d1f 100644 --- a/source/core/gamecvars.cpp +++ b/source/core/gamecvars.cpp @@ -178,13 +178,6 @@ CUSTOM_CVARD(Int, hud_size, 9, CVAR_ARCHIVE | CVAR_NOINITCALL, "Defines the HUD } } -CUSTOM_CVARD(Int, hud_scale, 100, CVAR_ARCHIVE | CVAR_NOINITCALL, "changes the hud scale") -{ - if (self < 35) self = 35; - else if (self > 100) self = 100; - else gi->set_hud_scale(self); -} - // This is to allow flattening the overly complicated HUD configuration to one single value and keep the complexity safely inside the HUD code. bool G_ChangeHudLayout(int direction) { @@ -211,6 +204,37 @@ bool G_ChangeHudLayout(int direction) 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; + else if (self > 100) self = 100; + else gi->set_hud_scale(self); +} + +CCMD(scaleup) +{ + int oldscale = hud_scale; + hud_scale = hud_scale + 4; + if (hud_scale != oldscale) gi->PlayHudSound(); +} + +CCMD(scaledown) +{ + int oldscale = hud_scale; + hud_scale = hud_scale - 4; + if (hud_scale != oldscale) gi->PlayHudSound(); +} + int hud_statusbarrange; // will be set by the game's configuration setup. CUSTOM_CVARD(Int, hud_custom, 0, CVAR_ARCHIVE|CVAR_NOINITCALL, "change the custom hud") // this has no backing implementation, it seems to be solely for scripted HUDs. { diff --git a/source/core/gamestruct.h b/source/core/gamestruct.h index 1ae93a1d5..c7e763fd9 100644 --- a/source/core/gamestruct.h +++ b/source/core/gamestruct.h @@ -58,6 +58,8 @@ struct GameInterface virtual bool validate_hud(int) { return true; } virtual void set_hud_layout(int size) = 0; virtual void set_hud_scale(int size) {} + virtual bool automapActive() { return false; } + virtual void PlayHudSound() {} virtual FString statFPS() { return "FPS display not available"; } virtual GameStats getStats() { return {}; } virtual void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) {} diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 662d6b336..76447fa3c 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -43,6 +43,8 @@ struct GameInterface : ::GameInterface bool validate_hud(int) override; void set_hud_layout(int size) override; void set_hud_scale(int size) override; + void PlayHudSound() override; + bool automapActive() override; FString statFPS() override; GameStats getStats() override; void DrawNativeMenuText(int fontnum, int state, double xpos, double ypos, float fontscale, const char* text, int flags) override; diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 61d6b856b..c97a6a7c0 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -229,5 +229,6 @@ void newgame(MapRecord* mi, int sk); void startnewgame(MapRecord* map, int skill); void setlocalplayerinput(player_struct *pp); void PlayerColorChanged(void); +void nonsharedkeys(void); END_DUKE_NS diff --git a/source/games/duke/src/game.h b/source/games/duke/src/game.h index fdd4d5095..4906f40a5 100644 --- a/source/games/duke/src/game.h +++ b/source/games/duke/src/game.h @@ -51,7 +51,6 @@ extern int32_t tempwallptr; void G_BackToMenu(void); -void G_HandleLocalKeys(void); void G_UpdatePlayerFromMenu(void); diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp index 3674d2ca6..b0b52c7f0 100644 --- a/source/games/duke/src/game_misc.cpp +++ b/source/games/duke/src/game_misc.cpp @@ -915,6 +915,11 @@ void setupbackdrop() } } +bool GameInterface::automapActive() +{ + return ud.overhead_on != 0; +} + END_DUKE_NS diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index 779243b44..1a882b43d 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -39,6 +39,193 @@ source as it is released. BEGIN_DUKE_NS + +//--------------------------------------------------------------------------- +// +// handles UI side input not handled via CCMDs or CVARs. +// Most of what's in here needs to be offloaded to CCMDs +// +//--------------------------------------------------------------------------- + +void nonsharedkeys(void) +{ + static int nonsharedtimer; + short i, ch, weapon; + int j; + + if (ud.recstat == 2) + { + ControlInfo noshareinfo; + CONTROL_GetInput(&noshareinfo); + } + + if (System_WantGuiCapture()) + return; + + if (!ALT_IS_PRESSED && ud.overhead_on == 0) + { + if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) + { + buttonMap.ClearButton(gamefunc_Enlarge_Screen); + + if (!SHIFTS_IS_PRESSED) + { + if (G_ChangeHudLayout(1)) + { + S_PlaySound(isRR() ? 341 : THUD, CHAN_AUTO, CHANF_UI); + } + } + 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)) + { + S_PlaySound(isRR() ? 341 : THUD, CHAN_AUTO, CHANF_UI); + } + } + else + { + hud_scale = hud_scale - 4; + } + } + } + + if (buttonMap.ButtonDown(gamefunc_See_Coop_View) && (ud.coop || ud.recstat == 2)) + { + buttonMap.ClearButton(gamefunc_See_Coop_View); + screenpeek = connectpoint2[screenpeek]; + if (screenpeek == -1) screenpeek = 0; + } + + if ((ud.multimode > 1) && buttonMap.ButtonDown(gamefunc_Show_Opponents_Weapon)) + { + buttonMap.ClearButton(gamefunc_Show_Opponents_Weapon); + ud.showweapons = 1 - ud.showweapons; + cl_showweapon = ud.showweapons; + FTA(QUOTE_WEAPON_MODE_OFF - ud.showweapons, &ps[screenpeek]); + } + + if (buttonMap.ButtonDown(gamefunc_Toggle_Crosshair)) + { + buttonMap.ClearButton(gamefunc_Toggle_Crosshair); + cl_crosshair = !cl_crosshair; + FTA(QUOTE_CROSSHAIR_OFF - cl_crosshair, &ps[screenpeek]); + } + + if (ud.overhead_on && buttonMap.ButtonDown(gamefunc_Map_Follow_Mode)) + { + buttonMap.ClearButton(gamefunc_Map_Follow_Mode); + ud.scrollmode = 1 - ud.scrollmode; + if (ud.scrollmode) + { + ud.folx = ps[screenpeek].oposx; + ud.foly = ps[screenpeek].oposy; + ud.fola = ps[screenpeek].getoang(); + } + FTA(QUOTE_MAP_FOLLOW_OFF + ud.scrollmode, &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) + { + int taunt = 0; + + // NOTE: sc_F1 .. sc_F10 are contiguous. sc_F11 is not sc_F10+1. + for (int j = sc_F1; j <= sc_F10; j++) + if (inputState.UnboundKeyPressed(j)) + { + inputState.ClearKeyStatus(j); + taunt = j - sc_F1 + 1; + break; + } + + if (taunt) + { + if (SHIFTS_IS_PRESSED) + { + Printf(PRINT_NOTIFY, *CombatMacros[taunt - 1]); + //Net_SendTaunt(taunt); + return; + } + + if (startrts(taunt, 1)) + { + //Net_SendRTS(taunt); + return; + } + } + } + + if (!ALT_IS_PRESSED && !SHIFTS_IS_PRESSED) + { + if (buttonMap.ButtonDown(gamefunc_Third_Person_View)) + { + buttonMap.ClearButton(gamefunc_Third_Person_View); + + if (!isRRRA() || (!ps[myconnectindex].OnMotorcycle && !ps[myconnectindex].OnBoat)) + { + if (ps[myconnectindex].over_shoulder_on) + ps[myconnectindex].over_shoulder_on = 0; + else + { + ps[myconnectindex].over_shoulder_on = 1; + cameradist = 0; + cameraclock = (int)totalclock; + } + FTA(QUOTE_VIEW_MODE_OFF + ps[myconnectindex].over_shoulder_on, &ps[myconnectindex]); + } + } + + if (ud.overhead_on != 0) + { + int j = (int)totalclock - nonsharedtimer; + nonsharedtimer += j; + + if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) + ps[myconnectindex].zoom += mulscale6(j, max(ps[myconnectindex].zoom, 256)); + if (buttonMap.ButtonDown(gamefunc_Shrink_Screen)) + ps[myconnectindex].zoom -= mulscale6(j, max(ps[myconnectindex].zoom, 256)); + + ps[myconnectindex].zoom = clamp(ps[myconnectindex].zoom, 48, 2048); + } + } + +#if 0 // ESC is blocked by the menu, this function is not particularly useful anyway. + if (inputState.GetKeyStatus(sc_Escape) && ud.overhead_on && ps[myconnectindex].newowner == -1) + { + inputState.ClearKeyStatus(sc_Escape); + ud.last_overhead = ud.overhead_on; + ud.overhead_on = 0; + ud.scrollmode = 0; + } +#endif + + if (buttonMap.ButtonDown(gamefunc_Map)) + { + buttonMap.ClearButton(gamefunc_Map); + if (ud.last_overhead != ud.overhead_on && ud.last_overhead) + { + ud.overhead_on = ud.last_overhead; + ud.last_overhead = 0; + } + else + { + ud.overhead_on++; + if (ud.overhead_on == 3) ud.overhead_on = 0; + ud.last_overhead = ud.overhead_on; + } + } +} + //--------------------------------------------------------------------------- // // handles all HUD related input, i.e. inventory item selection and activation plus weapon selection. diff --git a/source/games/duke/src/sbar.cpp b/source/games/duke/src/sbar.cpp index daf516bac..ea8e1beae 100644 --- a/source/games/duke/src/sbar.cpp +++ b/source/games/duke/src/sbar.cpp @@ -346,6 +346,11 @@ void GameInterface::set_hud_layout(int layout) } } +void GameInterface::PlayHudSound() +{ + S_PlaySound(isRR() ? 341 : THUD, CHAN_AUTO, CHANF_UI); +} + void GameInterface::set_hud_scale(int scale) { ud.statusbarscale = clamp(scale, 36, 100); diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index 17b326ec1..3c7ab0c36 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -67,7 +67,7 @@ struct user_defs int m_respawn_items, m_respawn_monsters, m_respawn_inventory, m_recstat, m_monsters_off, detail; int m_ffire, ffire, m_player_skill, multimode; int player_skill, m_marker, marker, mouseflip; - int statusbarmode, althud, ShowOpponentWeapons; + int statusbarmode, althud; MapRecord* nextLevel; }; diff --git a/source/games/duke/src/zz_game.cpp b/source/games/duke/src/zz_game.cpp index 5787d1fc5..1e9764a67 100644 --- a/source/games/duke/src/zz_game.cpp +++ b/source/games/duke/src/zz_game.cpp @@ -72,7 +72,6 @@ int32_t g_Shareware = 0; int32_t tempwallptr; int32_t actor_tog; -static int32_t nonsharedtimer; weaponhit hittype[MAXSPRITES]; ActorInfo actorinfo[MAXTILES]; player_struct ps[MAXPLAYERS]; @@ -102,179 +101,6 @@ void G_InitTimer(int32_t ticspersec) -void G_HandleLocalKeys(void) -{ -// CONTROL_ProcessBinds(); - - if (ud.recstat == 2) - { - ControlInfo noshareinfo; - CONTROL_GetInput(&noshareinfo); - } - - if (!ALT_IS_PRESSED && ud.overhead_on == 0 && (ps[myconnectindex].gm & MODE_TYPE) == 0) - { - if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) - { - buttonMap.ClearButton(gamefunc_Enlarge_Screen); - - if (!SHIFTS_IS_PRESSED) - { - if (G_ChangeHudLayout(1)) - { - S_PlaySound(isRR() ? 341 : THUD, CHAN_AUTO, CHANF_UI); - } - } - 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)) - { - S_PlaySound(isRR() ? 341 : THUD, CHAN_AUTO, CHANF_UI); - } - } - else - { - hud_scale = hud_scale - 4; - } - } - } - - if ((ps[myconnectindex].gm&(MODE_MENU|MODE_TYPE)) || System_WantGuiCapture()) - return; - - if (buttonMap.ButtonDown(gamefunc_See_Coop_View) && (ud.coop || ud.recstat == 2)) - { - buttonMap.ClearButton(gamefunc_See_Coop_View); - screenpeek = connectpoint2[screenpeek]; - if (screenpeek == -1) screenpeek = 0; - } - - if ((ud.multimode > 1) && buttonMap.ButtonDown(gamefunc_Show_Opponents_Weapon)) - { - buttonMap.ClearButton(gamefunc_Show_Opponents_Weapon); - ud.ShowOpponentWeapons = ud.showweapons = 1-ud.showweapons; - FTA(QUOTE_WEAPON_MODE_OFF-ud.showweapons,&ps[screenpeek]); - } - - if (buttonMap.ButtonDown(gamefunc_Toggle_Crosshair)) - { - buttonMap.ClearButton(gamefunc_Toggle_Crosshair); - cl_crosshair = !cl_crosshair; - FTA(QUOTE_CROSSHAIR_OFF-cl_crosshair,&ps[screenpeek]); - } - - if (ud.overhead_on && buttonMap.ButtonDown(gamefunc_Map_Follow_Mode)) - { - buttonMap.ClearButton(gamefunc_Map_Follow_Mode); - ud.scrollmode = 1-ud.scrollmode; - if (ud.scrollmode) - { - ud.folx = ps[screenpeek].oposx; - ud.foly = ps[screenpeek].oposy; - ud.fola = fix16_to_int(ps[screenpeek].oq16ang); - } - FTA(QUOTE_MAP_FOLLOW_OFF+ud.scrollmode,&ps[myconnectindex]); - } - - - if (SHIFTS_IS_PRESSED || ALT_IS_PRESSED || WIN_IS_PRESSED) - { - int ridiculeNum = 0; - - // NOTE: sc_F1 .. sc_F10 are contiguous. sc_F11 is not sc_F10+1. - for (bssize_t j=sc_F1; j<=sc_F10; j++) - if (inputState.UnboundKeyPressed(j)) - { - inputState.ClearKeyStatus(j); - ridiculeNum = j - sc_F1 + 1; - break; - } - - if (ridiculeNum) - { - if (SHIFTS_IS_PRESSED) - { - Printf(PRINT_NOTIFY, *CombatMacros[ridiculeNum-1]); - //Net_SendTaunt(ridiculeNum); - return; - } - - // Not SHIFT -- that is, either some ALT or WIN. - if (startrts(ridiculeNum, 1)) - { - //Net_SendRTS(ridiculeNum); - return; - } - } - } - else - { - if (buttonMap.ButtonDown(gamefunc_Third_Person_View)) - { - buttonMap.ClearButton(gamefunc_Third_Person_View); - - if (!isRRRA() || (!ps[myconnectindex].OnMotorcycle && !ps[myconnectindex].OnBoat)) - { - ps[myconnectindex].over_shoulder_on = !ps[myconnectindex].over_shoulder_on; - - cameradist = 0; - cameraclock = (int32_t) totalclock; - - FTA(QUOTE_VIEW_MODE_OFF + ps[myconnectindex].over_shoulder_on, &ps[myconnectindex]); - } - } - - if (ud.overhead_on != 0) - { - int const timerOffset = ((int) totalclock - nonsharedtimer); - nonsharedtimer += timerOffset; - - if (buttonMap.ButtonDown(gamefunc_Enlarge_Screen)) - ps[myconnectindex].zoom += mulscale6(timerOffset, max(ps[myconnectindex].zoom, 256)); - - if (buttonMap.ButtonDown(gamefunc_Shrink_Screen)) - ps[myconnectindex].zoom -= mulscale6(timerOffset, max(ps[myconnectindex].zoom, 256)); - - ps[myconnectindex].zoom = clamp(ps[myconnectindex].zoom, 48, 2048); - } - } - -#if 0 // fixme: We should not query Esc here, this needs to be done differently - if (I_EscapeTrigger() && ud.overhead_on && ps[myconnectindex].newowner == -1) - { - I_EscapeTriggerClear(); - ud.last_overhead = ud.overhead_on; - ud.overhead_on = 0; - ud.scrollmode = 0; - } -#endif - - if (buttonMap.ButtonDown(gamefunc_Map)) - { - buttonMap.ClearButton(gamefunc_Map); - if (ud.last_overhead != ud.overhead_on && ud.last_overhead) - { - ud.overhead_on = ud.last_overhead; - ud.last_overhead = 0; - } - else - { - ud.overhead_on++; - if (ud.overhead_on == 3) ud.overhead_on = 0; - ud.last_overhead = ud.overhead_on; - } - } -} static int parsedefinitions_game(scriptfile *, int); @@ -430,7 +256,6 @@ int GameInterface::app_main() checkcommandline(); ps[0].aim_mode = 1; - ud.ShowOpponentWeapons = 0; ud.camerasprite = -1; ud.camera_time = 0;//4; @@ -556,7 +381,7 @@ MAIN_LOOP_RESTART: } } - ud.showweapons = ud.ShowOpponentWeapons; + ud.showweapons = cl_showweapon; setlocalplayerinput(&ps[myconnectindex]); PlayerColorChanged(); inputState.ClearAllInput(); @@ -572,7 +397,7 @@ MAIN_LOOP_RESTART: //Net_GetPackets(); - G_HandleLocalKeys(); + nonsharedkeys(); C_RunDelayedCommands();