mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "rogueviz.h"
 | |
| 
 | |
| namespace rogueviz {
 | |
| 
 | |
| namespace statshot {
 | |
| 
 | |
| void fadeout(ld val) {
 | |
|   flat_model_enabler fme;
 | |
|   initquickqueue();
 | |
|   curvepoint(hyperpoint(-10, -10, 1, 1));
 | |
|   curvepoint(hyperpoint(vid.xres + 10, -10, 1, 1));
 | |
|   curvepoint(hyperpoint(vid.xres + 10, vid.yres + 10, 1, 1));
 | |
|   curvepoint(hyperpoint(-10, vid.yres + 10, 1, 1));
 | |
|   curvepoint(hyperpoint(-10, -10, 1, 1));
 | |
|   queuecurve(atscreenpos(0, 0), 0, (backcolor << 8) | int(val * 255), PPR::LINE);
 | |
|   quickqueue();
 | |
|   }
 | |
| 
 | |
| void shot_with_stats(int fade, vector<string> desc) {
 | |
|   cmode = sm::SIDE | sm::MAYDARK;
 | |
|   gamescreen();
 | |
| 
 | |
|   dialog::init();
 | |
|   for(const string& s: desc) {
 | |
|     if(s[0] == '*') dialog::addTitle(s.substr(1), 0xFFD500, 150);
 | |
|     if(s[0] == '-') dialog::addInfo(s.substr(1));
 | |
|     if(s[0] == '=') dialog::addBreak(100);
 | |
|     if(s[0] == ':') {
 | |
|       int pos = s.find("=");
 | |
|       string cap = s.substr(1, pos-1);
 | |
|       string val = s.substr(pos+1);
 | |
|       dialog::addSelItem(cap, val, 0);
 | |
|       }
 | |
|     if(s[0] == '@') {
 | |
|       rogueviz::pres::dialog_add_latex(s.substr(1), (dialog::dialogcolor << 8) | 0xFF, 100, 0);
 | |
|       }
 | |
|     if(s[0] == '$') {
 | |
|       rogueviz::pres::dialog_add_latex(s.substr(1), 0xFFD500FF, 150, 0);
 | |
|       }
 | |
|     }
 | |
|   dialog::display();
 | |
|   glflush();
 | |
|   auto& f = anims::record_frame_id;
 | |
|   auto ease = [] (ld x) { return x * x * (3-2*x); };
 | |
|   if(f < fade) fadeout(ease(1 - (f+.5) / fade));
 | |
| 
 | |
|   if(f >= anims::noframes - fade) fadeout(ease(1 - (anims::noframes - f - 0.5) / fade));
 | |
|   }
 | |
| 
 | |
| int a = arg::add3("-label-video", [] {
 | |
|   string fname;
 | |
|   arg::shift(); fname = arg::args();
 | |
| 
 | |
|   vector<string> desc;
 | |
|   fhstream f(fname, "rt");
 | |
|   int i = atoi(scanline_noblank(f).c_str()); if(i) anims::noframes = i;
 | |
|   anims::videofile = scanline_noblank(f);
 | |
|   int fade = atoi(scanline_noblank(f).c_str());
 | |
|   hr::ignore(fade);
 | |
|   string s;
 | |
|   while(true) {
 | |
|     s = scanline_noblank(f);
 | |
|     if(s.empty()) break;
 | |
|     desc.push_back(s);
 | |
|     }
 | |
|   hide_hud = false;
 | |
|   #if CAP_VIDEO
 | |
|   anims::record_video(anims::videofile, [fade, desc] { return anims::record_animation_of([=] { shot_with_stats(fade, desc); }); });
 | |
|   #endif
 | |
|   });
 | |
| 
 | |
| }}
 | 
