diff options
| author | oy <Tom_Adams@web.de> | 2010-12-12 16:48:13 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2010-12-12 16:48:13 +0100 |
| commit | c75a75b64ff804e7a14374e17b31377aabff0d63 (patch) | |
| tree | 0b49986e39b44ae0b1f4673753a712779723813d /src | |
| parent | b4c007778cab749e9d163baec64d22349435ea3f (diff) | |
| download | zcatch-c75a75b64ff804e7a14374e17b31377aabff0d63.tar.gz zcatch-c75a75b64ff804e7a14374e17b31377aabff0d63.zip | |
made it possible to automatically take game over screenshots. Closes #339
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine/client.h | 1 | ||||
| -rw-r--r-- | src/engine/client/client.cpp | 28 | ||||
| -rw-r--r-- | src/engine/client/client.h | 4 | ||||
| -rw-r--r-- | src/engine/client/graphics.cpp | 12 | ||||
| -rw-r--r-- | src/engine/client/graphics.h | 3 | ||||
| -rw-r--r-- | src/engine/graphics.h | 2 | ||||
| -rw-r--r-- | src/engine/shared/config_variables.h | 2 | ||||
| -rw-r--r-- | src/engine/shared/storage.cpp | 2 | ||||
| -rw-r--r-- | src/game/client/components/menus_settings.cpp | 21 | ||||
| -rw-r--r-- | src/game/client/gameclient.cpp | 12 | ||||
| -rw-r--r-- | src/game/client/gameclient.h | 1 | ||||
| -rw-r--r-- | src/game/editor/ed_editor.cpp | 2 |
12 files changed, 76 insertions, 14 deletions
diff --git a/src/engine/client.h b/src/engine/client.h index df69fbb5..ab1f0547 100644 --- a/src/engine/client.h +++ b/src/engine/client.h @@ -78,6 +78,7 @@ public: virtual const char *DemoPlayer_Play(const char *pFilename, int StorageType) = 0; virtual void DemoRecorder_Start(const char *pFilename, bool WithTimestamp) = 0; virtual void DemoRecorder_Stop() = 0; + virtual void AutoScreenshot_Start() = 0; // networking virtual void EnterGame() = 0; diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 82e79a85..a2d5a53f 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -413,6 +413,7 @@ CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta), m_DemoRecorder(&m_SnapshotD m_WindowMustRefocus = 0; m_SnapCrcErrors = 0; + m_AutoScreenshotRecycle = false; m_AckGameTick = -1; m_CurrentRecvTick = 0; @@ -1938,6 +1939,8 @@ void CClient::Run() } } + AutoScreenshot_Cleanup(); + // check conditions if(State() == IClient::STATE_QUITING) break; @@ -2023,10 +2026,33 @@ void CClient::Con_Ping(IConsole::IResult *pResult, void *pUserData) pSelf->m_PingStartTime = time_get(); } +void CClient::AutoScreenshot_Start() +{ + if(g_Config.m_ClAutoScreenshot) + { + Graphics()->TakeScreenshot("auto/autoscreen"); + m_AutoScreenshotRecycle = true; + } +} + +void CClient::AutoScreenshot_Cleanup() +{ + if(m_AutoScreenshotRecycle) + { + if(g_Config.m_ClAutoScreenshotMax) + { + // clean up auto taken screens + CFileCollection AutoScreens; + AutoScreens.Init(Storage(), "screenshots/auto", "autoscreen", ".png", g_Config.m_ClAutoScreenshotMax); + } + m_AutoScreenshotRecycle = false; + } +} + void CClient::Con_Screenshot(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; - pSelf->Graphics()->TakeScreenshot(); + pSelf->Graphics()->TakeScreenshot(0); } void CClient::Con_Rcon(IConsole::IResult *pResult, void *pUserData) diff --git a/src/engine/client/client.h b/src/engine/client/client.h index 8486e481..a7385037 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -140,6 +140,7 @@ class CClient : public IClient, public CDemoPlayer::IListner NETADDR m_ServerAddress; int m_WindowMustRefocus; int m_SnapCrcErrors; + bool m_AutoScreenshotRecycle; int m_AckGameTick; int m_CurrentRecvTick; @@ -319,6 +320,9 @@ public: void DemoRecorder_HandleAutoStart(); void DemoRecorder_Stop(); + void AutoScreenshot_Start(); + void AutoScreenshot_Cleanup(); + virtual class CEngine *Engine() { return &m_Engine; } }; #endif diff --git a/src/engine/client/graphics.cpp b/src/engine/client/graphics.cpp index fb994953..82248f05 100644 --- a/src/engine/client/graphics.cpp +++ b/src/engine/client/graphics.cpp @@ -873,8 +873,11 @@ int CGraphics_SDL::WindowOpen() } -void CGraphics_SDL::TakeScreenshot() +void CGraphics_SDL::TakeScreenshot(const char *pFilename) { + char aDate[20]; + str_timestamp(aDate, sizeof(aDate)); + str_format(m_aScreenshotName, sizeof(m_aScreenshotName), "screenshots/%s_%s.png", pFilename?pFilename:"screenshot", aDate); m_DoScreenshot = true; } @@ -882,12 +885,7 @@ void CGraphics_SDL::Swap() { if(m_DoScreenshot) { - char aFilename[128]; - char aDate[20]; - - str_timestamp(aDate, sizeof(aDate)); - str_format(aFilename, sizeof(aFilename), "screenshots/screenshot_%s.png", aDate); - ScreenshotDirect(aFilename); + ScreenshotDirect(m_aScreenshotName); m_DoScreenshot = false; } diff --git a/src/engine/client/graphics.h b/src/engine/client/graphics.h index 17e3a83f..20be3504 100644 --- a/src/engine/client/graphics.h +++ b/src/engine/client/graphics.h @@ -41,6 +41,7 @@ protected: float m_Rotation; int m_Drawing; bool m_DoScreenshot; + char m_aScreenshotName[128]; float m_ScreenX0; float m_ScreenY0; @@ -136,7 +137,7 @@ public: virtual int WindowActive(); virtual int WindowOpen(); - virtual void TakeScreenshot(); + virtual void TakeScreenshot(const char *pFilename); virtual void Swap(); virtual int GetVideoModes(CVideoMode *pModes, int MaxModes); diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 305319f9..de99caac 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -127,7 +127,7 @@ public: virtual void SetColorVertex(const CColorVertex *pArray, int Num) = 0; virtual void SetColor(float r, float g, float b, float a) = 0; - virtual void TakeScreenshot() = 0; + virtual void TakeScreenshot(const char *pFilename) = 0; virtual int GetVideoModes(CVideoMode *pModes, int MaxModes) = 0; virtual void Swap() = 0; diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index b34e733b..ad84da0d 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -19,6 +19,8 @@ MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClAutoDemoRecord, cl_auto_demo_record, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Automatically record demos") MACRO_CONFIG_INT(ClAutoDemoMax, cl_auto_demo_max, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Maximum number of automatically recorded demos (0 = no limit)") +MACRO_CONFIG_INT(ClAutoScreenshot, cl_auto_screenshot, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Automatically take game over screenshot") +MACRO_CONFIG_INT(ClAutoScreenshotMax, cl_auto_screenshot_max, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Maximum number of automatically created screenshots (0 = no limit)") MACRO_CONFIG_INT(ClEventthread, cl_eventthread, 0, 0, 1, CFGFLAG_CLIENT, "Enables the usage of a thread to pump the events") diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index d19be8a8..ffbd3aff 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -57,10 +57,12 @@ public: { char aPath[MAX_PATH_LENGTH]; fs_makedir(GetPath(TYPE_SAVE, "screenshots", aPath, sizeof(aPath))); + fs_makedir(GetPath(TYPE_SAVE, "screenshots/auto", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "maps", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "dumps", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "downloadedmaps", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "demos", aPath, sizeof(aPath))); + fs_makedir(GetPath(TYPE_SAVE, "demos/auto", aPath, sizeof(aPath))); } return m_NumPaths ? 0 : 1; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index b12a0c8d..c0ea2b5a 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -729,18 +729,22 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) int OldSelected = s_SelectedLanguage; - CUIRect List, Button, Label, Left; + CUIRect List, Button, Label, Left, Right; MainView.HSplitBottom(10.0f, &MainView, 0); MainView.HSplitBottom(70.0f, &MainView, &Left); - Left.VSplitMid(&Left, 0); - Left.HSplitTop(20.0f, &Button, &Left); + Left.VSplitMid(&Left, &Right); MainView.HSplitBottom(20.0f, &List, &MainView); // auto demo settings { + Left.HSplitTop(20.0f, &Button, &Left); if(DoButton_CheckBox(&g_Config.m_ClAutoDemoRecord, Localize("Automatically record demos"), g_Config.m_ClAutoDemoRecord, &Button)) g_Config.m_ClAutoDemoRecord ^= 1; + Right.HSplitTop(20.0f, &Button, &Right); + if(DoButton_CheckBox(&g_Config.m_ClAutoScreenshot, Localize("Automatically take game over screenshot"), g_Config.m_ClAutoScreenshot, &Button)) + g_Config.m_ClAutoScreenshot ^= 1; + Left.HSplitTop(10.0f, 0, &Left); Left.VSplitLeft(20.0f, 0, &Left); Left.HSplitTop(20.0f, &Label, &Button); @@ -752,6 +756,17 @@ void CMenus::RenderSettingsGeneral(CUIRect MainView) str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Max demos"), Localize("no limit")); UI()->DoLabel(&Label, aBuf, 13.0f, -1); g_Config.m_ClAutoDemoMax = static_cast<int>(DoScrollbarH(&g_Config.m_ClAutoDemoMax, &Button, g_Config.m_ClAutoDemoMax/1000.0f)*1000.0f+0.1f); + + Right.HSplitTop(10.0f, 0, &Right); + Right.VSplitLeft(20.0f, 0, &Right); + Right.HSplitTop(20.0f, &Label, &Button); + Button.VSplitRight(20.0f, &Button, 0); + if(g_Config.m_ClAutoScreenshotMax) + str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Max Screenshots"), g_Config.m_ClAutoScreenshotMax); + else + str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Max Screenshots"), Localize("no limit")); + UI()->DoLabel(&Label, aBuf, 13.0f, -1); + g_Config.m_ClAutoScreenshotMax = static_cast<int>(DoScrollbarH(&g_Config.m_ClAutoScreenshotMax, &Button, g_Config.m_ClAutoScreenshotMax/1000.0f)*1000.0f+0.1f); } UiDoListboxStart(&s_LanguageList , &List, 24.0f, Localize("Language"), "", s_Languages.size(), 1, s_SelectedLanguage, s_ScrollValue); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 08459abc..4696bdcd 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -584,6 +584,12 @@ void CGameClient::OnStateChange(int NewState, int OldState) void CGameClient::OnShutdown() {} void CGameClient::OnEnterGame() {} +void CGameClient::OnGameOver() +{ + if(Client()->State() != IClient::STATE_DEMOPLAYBACK) + Client()->AutoScreenshot_Start(); +} + void CGameClient::OnRconLine(const char *pLine) { m_pGameConsole->PrintLine(CGameConsole::CONSOLETYPE_REMOTE, pLine); @@ -769,7 +775,13 @@ void CGameClient::OnNewSnapshot() } } else if(Item.m_Type == NETOBJTYPE_GAME) + { + static int s_GameOver = 0; m_Snap.m_pGameobj = (CNetObj_Game *)pData; + if(s_GameOver == 0 && m_Snap.m_pGameobj->m_GameOver != 0) + OnGameOver(); + s_GameOver = m_Snap.m_pGameobj->m_GameOver; + } else if(Item.m_Type == NETOBJTYPE_FLAG) m_Snap.m_paFlags[Item.m_Id%2] = (const CNetObj_Flag *)pData; } diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index d60fef2a..2f8e21ea 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -180,6 +180,7 @@ public: virtual void OnShutdown(); virtual void OnEnterGame(); virtual void OnRconLine(const char *pLine); + virtual void OnGameOver(); virtual const char *GetItemName(int Type); virtual const char *Version(); diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index bb9a1721..b0ff42b2 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -3306,7 +3306,7 @@ void CEditor::UpdateAndRender() if(Input()->KeyDown(KEY_F10)) { - Graphics()->TakeScreenshot(); + Graphics()->TakeScreenshot(0); m_ShowMousePointer = true; } |