diff options
author | oy <tom_adams@web.de> | 2023-06-12 22:29:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-12 22:29:28 +0200 |
commit | f24ef24fa4672fc084be1464d592988f27010369 (patch) | |
tree | 24350a8703cd502fcd13a6955fb5ab25ccb249bf | |
parent | f839f807e0973f9814ecb1fcd1fb1e5c984564a6 (diff) | |
parent | f798645fec81d0889e4737b3231ca050ea489a26 (diff) |
Merge pull request #3145 from Robyt3/DemoPlayer-NumberKeys-Refactoring
Add demo skipping to 0%, 10%, ..., 90% with number/keypad keys, refactoring
-rw-r--r-- | src/engine/demo.h | 2 | ||||
-rw-r--r-- | src/engine/keys.h | 16 | ||||
-rw-r--r-- | src/engine/shared/demo.cpp | 10 | ||||
-rw-r--r-- | src/engine/shared/demo.h | 3 | ||||
-rw-r--r-- | src/game/client/components/menus_demo.cpp | 80 |
5 files changed, 64 insertions, 47 deletions
diff --git a/src/engine/demo.h b/src/engine/demo.h index cfe648cbc..9339b08d8 100644 --- a/src/engine/demo.h +++ b/src/engine/demo.h @@ -34,6 +34,7 @@ public: public: bool m_Paused; float m_Speed; + int m_SpeedIndex; int m_FirstTick; int m_CurrentTick; @@ -52,6 +53,7 @@ public: ~IDemoPlayer() {} virtual void SetSpeed(float Speed) = 0; + virtual void SetSpeedIndex(int Offset) = 0; virtual int SetPos(float Percent) = 0; virtual int SetPos(int WantedTick) = 0; virtual void Pause() = 0; diff --git a/src/engine/keys.h b/src/engine/keys.h index be6c3b7d8..b7345f057 100644 --- a/src/engine/keys.h +++ b/src/engine/keys.h @@ -327,4 +327,20 @@ enum inline int KeyToKeycode(int Key) { return (Key>=0x80) ? (Key-0x80)|(1<<30) : Key; } inline int KeycodeToKey(int Keycode) { return (Keycode&(1<<30)) ? Keycode-(1<<30)+0x80 : Keycode; } +inline int DigitToNumberKey(int Digit) +{ + if(Digit < 0 || Digit > 9) + return KEY_UNKNOWN; + return KEY_0 + Digit; +} + +inline int DigitToKeypadKey(int Digit) +{ + if(Digit < 0 || Digit > 9) + return KEY_UNKNOWN; + if(Digit == 0) + return KEY_KP_0; + return KEY_KP_1 + Digit - 1; +} + #endif diff --git a/src/engine/shared/demo.cpp b/src/engine/shared/demo.cpp index 4df8d08b3..4eb7a0631 100644 --- a/src/engine/shared/demo.cpp +++ b/src/engine/shared/demo.cpp @@ -338,6 +338,7 @@ void CDemoRecorder::AddDemoMarker() } +const float CDemoPlayer::ms_aSpeeds[] = {0.05f, 0.1f, 0.25f, 0.5f, 0.75f, 1.0f, 2.0f, 4.0f, 8.0f}; CDemoPlayer::CDemoPlayer(class CSnapshotDelta *pSnapshotDelta) { @@ -633,7 +634,8 @@ const char *CDemoPlayer::Load(const char *pFilename, int StorageType, const char m_Info.m_NextTick = -1; m_Info.m_Info.m_CurrentTick = -1; m_Info.m_PreviousTick = -1; - m_Info.m_Info.m_Speed = 1; + m_Info.m_Info.m_Speed = 1.0f; + m_Info.m_Info.m_SpeedIndex = 5; m_LastSnapshotDataSize = -1; @@ -772,6 +774,12 @@ void CDemoPlayer::SetSpeed(float Speed) m_Info.m_Info.m_Speed = Speed; } +void CDemoPlayer::SetSpeedIndex(int Offset) +{ + m_Info.m_Info.m_SpeedIndex = clamp<int>(m_Info.m_Info.m_SpeedIndex + Offset, 0, sizeof(ms_aSpeeds) / sizeof(ms_aSpeeds[0]) - 1); + SetSpeed(ms_aSpeeds[m_Info.m_Info.m_SpeedIndex]); +} + int CDemoPlayer::Update() { int64 Now = time_get(); diff --git a/src/engine/shared/demo.h b/src/engine/shared/demo.h index e4247be7c..9a8139a08 100644 --- a/src/engine/shared/demo.h +++ b/src/engine/shared/demo.h @@ -71,6 +71,8 @@ public: }; private: + static const float ms_aSpeeds[]; + IListener *m_pListener; @@ -117,6 +119,7 @@ public: void Unpause(); int Stop(); void SetSpeed(float Speed); + void SetSpeedIndex(int Offset); int SetPos(float Percent); int SetPos(int WantedTick); const CInfo *BaseInfo() const { return &m_Info.m_Info; } diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 01a6aa093..56d81e7b1 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -35,22 +35,19 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) const float NameBarHeight = 20.0f; const float Margins = 5.0f; - float TotalHeight; + float TotalHeight = SeekBarHeight + Margins * 2; if(m_MenuActive) - TotalHeight = SeekBarHeight+ButtonbarHeight+NameBarHeight+Margins*3; - else - TotalHeight = SeekBarHeight+Margins*2; + TotalHeight += ButtonbarHeight + NameBarHeight + Margins; MainView.HSplitBottom(TotalHeight, 0, &MainView); MainView.VSplitLeft(50.0f, 0, &MainView); MainView.VSplitRight(450.0f, &MainView, 0); - if (m_SeekBarActive || m_MenuActive) // only draw the background if SeekBar or Menu is active + if(m_SeekBarActive || m_MenuActive) // only draw the background if SeekBar or Menu is active MainView.Draw(vec4(0.0f, 0.0f, 0.0f, Config()->m_ClMenuAlpha/100.0f), 10.0f, CUIRect::CORNER_T); MainView.Margin(5.0f, &MainView); - CUIRect SeekBar, ButtonBar, NameBar; const bool CtrlDown = UI()->KeyIsPressed(KEY_LCTRL) || UI()->KeyIsPressed(KEY_RCTRL); static bool s_LastCtrlDown = CtrlDown; @@ -62,7 +59,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) // we can toggle the seekbar using CTRL if(!m_MenuActive && !s_LastCtrlDown && CtrlDown) { - if (m_SeekBarActive) + if(m_SeekBarActive) m_SeekBarActive = false; else { @@ -75,14 +72,15 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) if(m_SeekBarActivatedTime < Now - 5*time_freq()) m_SeekBarActive = false; + CUIRect SeekBar, ButtonBar, NameBar; + bool SeekBarActivate = false; if(m_MenuActive) { MainView.HSplitTop(SeekBarHeight, &SeekBar, &ButtonBar); ButtonBar.HSplitTop(Margins, 0, &ButtonBar); ButtonBar.HSplitBottom(NameBarHeight, &ButtonBar, &NameBar); NameBar.HSplitTop(4.0f, 0, &NameBar); - m_SeekBarActive = true; - m_SeekBarActivatedTime = Now; + SeekBarActivate = true; } else SeekBar = MainView; @@ -172,8 +170,10 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) PositionToSeek = 0.0f; } - bool IncreaseDemoSpeed = UI()->KeyPress(KEY_MOUSE_WHEEL_UP) || UI()->KeyPress(KEY_PLUS) || UI()->KeyPress(KEY_KP_PLUS); - bool DecreaseDemoSpeed = UI()->KeyPress(KEY_MOUSE_WHEEL_DOWN) || UI()->KeyPress(KEY_MINUS) || UI()->KeyPress(KEY_KP_MINUS); + if(UI()->KeyPress(KEY_MOUSE_WHEEL_UP) || UI()->KeyPress(KEY_PLUS) || UI()->KeyPress(KEY_KP_PLUS)) + DemoPlayer()->SetSpeedIndex(+1); + else if(UI()->KeyPress(KEY_MOUSE_WHEEL_DOWN) || UI()->KeyPress(KEY_MINUS) || UI()->KeyPress(KEY_KP_MINUS)) + DemoPlayer()->SetSpeedIndex(-1); // add spacebar for toggling Play/Pause if(UI()->KeyPress(KEY_SPACE)) @@ -182,9 +182,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) DemoPlayer()->Pause(); else DemoPlayer()->Unpause(); - - m_SeekBarActive = true; - m_SeekBarActivatedTime = Now; + SeekBarActivate = true; } // skip forward/backward using left/right arrow keys @@ -199,8 +197,8 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) // Go to previous/next marker if ctrl is held. // Go to start/end if there is no marker. - // Threshold to consider all ticks close to a marker to be that markers position. - // Necessary, as setting the demo players position does not set it to exactly the desired tick. + // Threshold to consider all ticks close to a marker to be that marker's position. + // Necessary, as setting the demo player's position does not set it to exactly the desired tick. const int Threshold = 10; if(SkipForwards) @@ -253,10 +251,20 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) } PositionToSeek = clamp(DesiredTick, 0, TotalTicks-1)/(float)TotalTicks; - - // Show the seek bar for a few seconds after skipping - m_SeekBarActive = true; - m_SeekBarActivatedTime = Now; + SeekBarActivate = true; + } + else + { + // Skip to 0%, 10%, ..., 90% with number keys + for(int Digit = 0; Digit < 10; ++Digit) + { + if(UI()->KeyPress(DigitToNumberKey(Digit)) || UI()->KeyPress(DigitToKeypadKey(Digit))) + { + PositionToSeek = Digit / 10.0f; + SeekBarActivate = true; + break; + } + } } // Advance single frame forward/backward with period/comma key @@ -268,8 +276,11 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) DemoPlayer()->SetPos(pInfo->m_CurrentTick + (TickForwards ? 3 : 0)); m_pClient->m_SuppressEvents = false; DemoPlayer()->Pause(); + SeekBarActivate = true; + } - // Show the seek bar for a few seconds after skipping + if(SeekBarActivate) + { m_SeekBarActive = true; m_SeekBarActivatedTime = Now; } @@ -308,14 +319,14 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static CButtonContainer s_SlowDownButton; if(DoButton_SpriteID(&s_SlowDownButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_SLOWER, false, &Button, CUIRect::CORNER_ALL)) - DecreaseDemoSpeed = true; + DemoPlayer()->SetSpeedIndex(-1); // fastforward ButtonBar.VSplitLeft(Margins, 0, &ButtonBar); ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static CButtonContainer s_FastForwardButton; if(DoButton_SpriteID(&s_FastForwardButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_FASTER, false, &Button, CUIRect::CORNER_ALL)) - IncreaseDemoSpeed = true; + DemoPlayer()->SetSpeedIndex(+1); // speed meter ButtonBar.VSplitLeft(Margins*3, 0, &ButtonBar); @@ -337,29 +348,6 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) UI()->DoLabel(&NameBar, aBuf, Button.h*0.5f, TEXTALIGN_TL, NameBar.w); } - if(IncreaseDemoSpeed) - { - if(pInfo->m_Speed < 0.1f) DemoPlayer()->SetSpeed(0.1f); - else if(pInfo->m_Speed < 0.25f) DemoPlayer()->SetSpeed(0.25f); - else if(pInfo->m_Speed < 0.5f) DemoPlayer()->SetSpeed(0.5f); - else if(pInfo->m_Speed < 0.75f) DemoPlayer()->SetSpeed(0.75f); - else if(pInfo->m_Speed < 1.0f) DemoPlayer()->SetSpeed(1.0f); - else if(pInfo->m_Speed < 2.0f) DemoPlayer()->SetSpeed(2.0f); - else if(pInfo->m_Speed < 4.0f) DemoPlayer()->SetSpeed(4.0f); - else DemoPlayer()->SetSpeed(8.0f); - } - else if(DecreaseDemoSpeed) - { - if(pInfo->m_Speed > 4.0f) DemoPlayer()->SetSpeed(4.0f); - else if(pInfo->m_Speed > 2.0f) DemoPlayer()->SetSpeed(2.0f); - else if(pInfo->m_Speed > 1.0f) DemoPlayer()->SetSpeed(1.0f); - else if(pInfo->m_Speed > 0.75f) DemoPlayer()->SetSpeed(0.75f); - else if(pInfo->m_Speed > 0.5f) DemoPlayer()->SetSpeed(0.5f); - else if(pInfo->m_Speed > 0.25f) DemoPlayer()->SetSpeed(0.25f); - else if(pInfo->m_Speed > 0.1f) DemoPlayer()->SetSpeed(0.1f); - else DemoPlayer()->SetSpeed(0.05f); - } - if(PositionToSeek >= 0.0f && PositionToSeek <= 1.0f) { m_pClient->OnReset(); |