diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index fd30f3d3..b9495e44 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -383,30 +383,6 @@ void updateworld(int curtime, int lastmillis) // main game update loop gets2c(); showrespawntimer(); - if(autoscreenshotat) - { - if(autoscreenshotat > 0 && lastmillis > autoscreenshotat) - { - // force scoreboard on and give it time to display .. - showscores(true); - autoscreenshotat = -1 * (lastmillis + 141); - } - else if(autoscreenshotat < 0 && lastmillis > -1 * autoscreenshotat) - { - extern void screenshot(char *imagepath); - char fmttimestr[15]; // flowtron assumes "%b" is always 3 chars (true at least for DE and EN) - time_t t = time(NULL); - struct tm * timeinfo; - timeinfo = localtime (&t); - strftime(fmttimestr, 15, "%Y%b%d_%H%M", timeinfo); // 14 + "\0" - extern string smapname; - extern int screenshottype; - s_sprintfd(endscoreshot)("screenshots/%s_%s_%s.%s", modestr(gamemode, true), behindpath(clientmap), fmttimestr, screenshottype ? "jpg" : "bmp"); - screenshot(endscoreshot); - autoscreenshotat = 0; - } - } - // Added by Rick: let bots think if(m_botmode) BotManager.Think(); @@ -598,7 +574,8 @@ void timeupdate(int timeremain) if(!timeremain) { intermission = true; - if(autoscreenshot) autoscreenshotat = lastmillis + 3141; + extern bool needsautoscreenshot; + if(autoscreenshot) needsautoscreenshot = true; player1->attacking = false; conoutf("intermission:"); conoutf("game has ended!"); diff --git a/source/src/main.cpp b/source/src/main.cpp index de43e48d..0c2e8309 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -141,20 +141,27 @@ void setprocesspriority(bool high) VARP(screenshottype, 0, 1, 1); VARP(jpegquality, 10, 70, 100); +const char *maketimestr() +{ + static string buf; + time_t rawtime; + struct tm *timeinfo; + time(&rawtime); + timeinfo = localtime(&rawtime); + if(!timeinfo) return NULL; + int len = strftime(buf, sizeof(buf), "%Y%b%d_%H%M%S", timeinfo); + if(!len || len>=(int)sizeof(buf)) return NULL; + return buf; +} + void jpeg_screenshot(char *imagepath) { if(!imagepath[0]) { + const char *timestr = maketimestr(); + if(!timestr) return; static string buf; - time_t rawtime; - struct tm *timeinfo; - char buffer[80]; - time(&rawtime); - timeinfo = localtime(&rawtime); - if(!timeinfo) return; - int len = strftime(buffer, sizeof(buffer), "%Y%b%d_%H%M%S", timeinfo); - if(!len || len>=(int)sizeof(buffer)) return; - s_sprintf(buf)("screenshots/%s.jpg", buffer); + s_sprintf(buf)("screenshots/%s.jpg", timestr); imagepath = buf; } FILE *jpegfile = fopen(imagepath, "wb"); @@ -197,26 +204,28 @@ void jpeg_screenshot(char *imagepath) void bmp_screenshot(char *imagepath) { + if(!imagepath[0]) + { + const char *timestr = maketimestr(); + if(!timestr) return; + static string buf; + s_sprintf(buf)("screenshots/%s.jpg", timestr); + imagepath = buf; + } + SDL_Surface *image = SDL_CreateRGBSurface(SDL_SWSURFACE, screen->w, screen->h, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0); if(!image) return; uchar *tmp = new uchar[screen->w*screen->h*3]; glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, screen->w, screen->h, GL_RGB, GL_UNSIGNED_BYTE, tmp); uchar *dst = (uchar *)image->pixels; - loopi(scr_h) + loopi(screen->h) { memcpy(dst, &tmp[3*screen->w*(screen->h-i-1)], 3*screen->w); endianswap(dst, 3, screen->w); dst += image->pitch; } delete[] tmp; - if(!imagepath[0]) - { - static string buf; - systemtime(); - s_sprintf(buf)("screenshots/%d.bmp", now_utc); - imagepath = buf; - } SDL_SaveBMP(image, findfile(path(imagepath), "wb")); SDL_FreeSurface(image); } @@ -231,6 +240,18 @@ void screenshot(char *imagepath) } } +bool needsautoscreenshot = false; + +void makeautoscreenshot() +{ + needsautoscreenshot = false; + + const char *timestr = maketimestr(); + if(!timestr) return; + s_sprintfd(filename)("screenshots/%s_%s_%s.%s", modestr(gamemode, true), behindpath(getclientmap()), timestr, screenshottype==1 ? "jpg" : "bmp"); + screenshot(filename); +} + COMMAND(screenshot, ARG_1STR); COMMAND(quit, ARG_NONE); @@ -761,6 +782,8 @@ int main(int argc, char **argv) if(lastmillis) updateworld(curtime, lastmillis); + if(needsautoscreenshot) showscores(true); + serverslice(0); fps = (1000.0f/elapsed+fps*10)/11; @@ -775,6 +798,8 @@ int main(int argc, char **argv) if(frames>4) SDL_GL_SwapBuffers(); } + if(needsautoscreenshot) makeautoscreenshot(); + #ifdef _DEBUG if(millis>lastflush+60000) { fflush(stdout); lastflush = millis;