about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2010-12-12 16:48:13 +0100
committeroy <Tom_Adams@web.de>2010-12-12 16:48:13 +0100
commitc75a75b64ff804e7a14374e17b31377aabff0d63 (patch)
tree0b49986e39b44ae0b1f4673753a712779723813d /src
parentb4c007778cab749e9d163baec64d22349435ea3f (diff)
downloadzcatch-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.h1
-rw-r--r--src/engine/client/client.cpp28
-rw-r--r--src/engine/client/client.h4
-rw-r--r--src/engine/client/graphics.cpp12
-rw-r--r--src/engine/client/graphics.h3
-rw-r--r--src/engine/graphics.h2
-rw-r--r--src/engine/shared/config_variables.h2
-rw-r--r--src/engine/shared/storage.cpp2
-rw-r--r--src/game/client/components/menus_settings.cpp21
-rw-r--r--src/game/client/gameclient.cpp12
-rw-r--r--src/game/client/gameclient.h1
-rw-r--r--src/game/editor/ed_editor.cpp2
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;
 	}