diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 4689c4a41..a1d7e2ddb 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -25,6 +25,12 @@ #include "client.h" +#if defined(CONF_FAMILY_WINDOWS) + #define _WIN32_WINNT 0x0500 + #define NOGDI + #include +#endif + void CGraph::Init(float Min, float Max) { @@ -2024,6 +2030,17 @@ extern "C" int SDL_main(int argc, const char **argv) // ignore_convention int main(int argc, const char **argv) // ignore_convention #endif { +#if defined(CONF_FAMILY_WINDOWS) + for(int i = 1; i < argc; i++) // ignore_convention + { + if(str_comp("-s", argv[i]) == 0 || str_comp("--silent", argv[i]) == 0) // ignore_convention + { + ShowWindow(GetConsoleWindow(), SW_HIDE); + break; + } + } +#endif + // init the engine dbg_msg("client", "starting..."); m_Client.InitEngine("Teeworlds"); diff --git a/src/engine/demo.h b/src/engine/demo.h index 6abc9b2d8..e0cad3875 100644 --- a/src/engine/demo.h +++ b/src/engine/demo.h @@ -24,6 +24,7 @@ public: virtual void Pause() = 0; virtual void Unpause() = 0; virtual const CInfo *BaseInfo() const = 0; + virtual char *GetDemoName() = 0; }; class IDemoRecorder : public IInterface diff --git a/src/engine/shared/demorec.cpp b/src/engine/shared/demorec.cpp index 960634b19..0c2efd40c 100644 --- a/src/engine/shared/demorec.cpp +++ b/src/engine/shared/demorec.cpp @@ -516,6 +516,9 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const return -1; } + // store the filename + str_copy(m_aFilename, pFilename, sizeof(m_aFilename)); + // clear the playback info mem_zero(&m_Info, sizeof(m_Info)); m_Info.m_Info.m_FirstTick = -1; @@ -722,7 +725,19 @@ int CDemoPlayer::Stop() m_File = 0; mem_free(m_pKeyFrames); m_pKeyFrames = 0; + str_copy(m_aFilename, "", sizeof(m_aFilename)); return 0; } +char *CDemoPlayer::GetDemoName() +{ + // get the name of the demo without its path + char *pDemoShortName = &m_aFilename[0]; + for(int i = 0; i < str_length(m_aFilename)-1; i++) + { + if(m_aFilename[i] == '/' || m_aFilename[i] == '\\') + pDemoShortName = &m_aFilename[i+1]; + } + return pDemoShortName; +} diff --git a/src/engine/shared/demorec.h b/src/engine/shared/demorec.h index cdf46e99a..39e9ebdb9 100644 --- a/src/engine/shared/demorec.h +++ b/src/engine/shared/demorec.h @@ -83,6 +83,7 @@ private: class IConsole *m_pConsole; IOHANDLE m_File; + char m_aFilename[256]; CKeyFrame *m_pKeyFrames; CPlaybackInfo m_Info; @@ -109,6 +110,7 @@ public: void SetSpeed(float Speed); int SetPos(float Precent); const CInfo *BaseInfo() const { return &m_Info.m_Info; } + char *GetDemoName(); int Update(); diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 8e89ee061..6c5dcbe4c 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -42,11 +43,12 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) const float SeekBarHeight = 15.0f; const float ButtonbarHeight = 20.0f; + const float NameBarHeight = 20.0f; const float Margins = 5.0f; float TotalHeight; if(m_MenuActive) - TotalHeight = SeekBarHeight+ButtonbarHeight+Margins*3; + TotalHeight = SeekBarHeight+ButtonbarHeight+NameBarHeight+Margins*3; else TotalHeight = SeekBarHeight+Margins*2; @@ -58,7 +60,7 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) MainView.Margin(5.0f, &MainView); - CUIRect SeekBar, ButtonBar; + CUIRect SeekBar, ButtonBar, NameBar; int CurrentTick = pInfo->m_CurrentTick - pInfo->m_FirstTick; int TotalTicks = pInfo->m_LastTick - pInfo->m_FirstTick; @@ -67,6 +69,8 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) { MainView.HSplitTop(SeekBarHeight, &SeekBar, &ButtonBar); ButtonBar.HSplitTop(Margins, 0, &ButtonBar); + ButtonBar.HSplitBottom(NameBarHeight, &ButtonBar, &NameBar); + NameBar.HSplitTop(4.0f, 0, &NameBar); } else SeekBar = MainView; @@ -198,6 +202,14 @@ void CMenus::RenderDemoPlayer(CUIRect MainView) static int s_ExitButton = 0; if(DoButton_DemoPlayer(&s_ExitButton, Localize("Close"), 0, &Button)) Client()->Disconnect(); + + // demo name + char aBuf[128]; + str_format(aBuf, sizeof(aBuf), "Demofile: %s", DemoPlayer()->GetDemoName()); + CTextCursor Cursor; + TextRender()->SetCursor(&Cursor, NameBar.x, NameBar.y, Button.h*0.5f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); + Cursor.m_LineWidth = MainView.w; + TextRender()->TextEx(&Cursor, aBuf, -1); } } diff --git a/src/game/client/components/scoreboard.cpp b/src/game/client/components/scoreboard.cpp index 84211bafc..b64cf341f 100644 --- a/src/game/client/components/scoreboard.cpp +++ b/src/game/client/components/scoreboard.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -310,6 +311,29 @@ void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const ch } } +void CScoreboard::RenderRecordingNotification(float x) +{ + if(!m_pClient->DemoRecorder()->IsRecording()) + return; + + //draw the box + Graphics()->BlendNormal(); + Graphics()->TextureSet(-1); + Graphics()->QuadsBegin(); + Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.4f); + RenderTools()->DrawRoundRectExt(x, 0.0f, 120.0f, 50.0f, 15.0f, CUI::CORNER_B); + Graphics()->QuadsEnd(); + + //draw the red dot + Graphics()->QuadsBegin(); + Graphics()->SetColor(1.0f, 0.0f, 0.0f, 1.0f); + RenderTools()->DrawRoundRect(x+20, 15.0f, 20.0f, 20.0f, 10.0f); + Graphics()->QuadsEnd(); + + //draw the text + TextRender()->Text(0, x+50.0f, 8.0f, 24.0f, "REC", -1); +} + void CScoreboard::OnRender() { bool DoScoreBoard = false; @@ -374,6 +398,7 @@ void CScoreboard::OnRender() RenderGoals(Width/2-w/2, 150+750+25, w); RenderSpectators(Width/2-w/2, 150+750+25+50+25, w); + RenderRecordingNotification((Width/7)*4); } bool CScoreboard::Active() diff --git a/src/game/client/components/scoreboard.h b/src/game/client/components/scoreboard.h index c894cbb93..b4e9312bd 100644 --- a/src/game/client/components/scoreboard.h +++ b/src/game/client/components/scoreboard.h @@ -7,6 +7,7 @@ class CScoreboard : public CComponent void RenderGoals(float x, float y, float w); void RenderSpectators(float x, float y, float w); void RenderScoreboard(float x, float y, float w, int Team, const char *pTitle); + void RenderRecordingNotification(float x); static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData, int ClientID);