about summary refs log tree commit diff
path: root/src/engine
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/engine
parentb4c007778cab749e9d163baec64d22349435ea3f (diff)
downloadzcatch-c75a75b64ff804e7a14374e17b31377aabff0d63.tar.gz
zcatch-c75a75b64ff804e7a14374e17b31377aabff0d63.zip
made it possible to automatically take game over screenshots. Closes #339
Diffstat (limited to 'src/engine')
-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
8 files changed, 44 insertions, 10 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;