made it possible to automatically take game over screenshots. Closes #339

This commit is contained in:
oy 2010-12-12 16:48:13 +01:00
parent b4c007778c
commit c75a75b64f
25 changed files with 154 additions and 14 deletions

View file

@ -513,6 +513,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -699,6 +702,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -489,6 +489,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -687,6 +690,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -936,6 +936,12 @@ ZO
Automatically record demos
==
Automatically take game over screenshot
==
Max Screenshots
==
Max demos
==

View file

@ -513,6 +513,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -699,6 +702,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -747,6 +747,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -819,6 +822,9 @@ Left mouse button to move. Hold shift to move the texture.
Left mouse to drag. Hold ctrl to be more precise. Hold shift to alter time point aswell. Right click to delete.
==
Max Screenshots
==
Max demos
==

View file

@ -936,6 +936,12 @@ ZO
Automatically record demos
==
Automatically take game over screenshot
==
Max Screenshots
==
Max demos
==

View file

@ -483,6 +483,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -684,6 +687,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -795,6 +795,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -855,6 +858,9 @@ Load
Load map
==
Max Screenshots
==
Max demos
==

View file

@ -510,6 +510,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -699,6 +702,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -807,6 +807,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -861,6 +864,9 @@ Left mouse to drag. Hold ctrl to be more precise. Hold shift to alter time point
Load map
==
Max Screenshots
==
Max demos
==

View file

@ -513,6 +513,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -699,6 +702,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -483,6 +483,9 @@ Aspect ratio
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -684,6 +687,9 @@ Make collision
Make external
==
Max Screenshots
==
Max demos
==

View file

@ -855,6 +855,9 @@ Alpha value of the envelope
Automatically record demos
==
Automatically take game over screenshot
==
Blue value of the envelope
==
@ -891,6 +894,9 @@ Left mouse to drag. Hold ctrl to be more precise. Hold shift to alter time point
Load map
==
Max Screenshots
==
Max demos
==

View file

@ -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;

View file

@ -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)

View file

@ -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

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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")

View file

@ -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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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();

View file

@ -3306,7 +3306,7 @@ void CEditor::UpdateAndRender()
if(Input()->KeyDown(KEY_F10))
{
Graphics()->TakeScreenshot();
Graphics()->TakeScreenshot(0);
m_ShowMousePointer = true;
}