mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-30 21:42:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			131 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "rogueviz.h"
 | |
| 
 | |
| // a quick generator for the map used here: https://twitter.com/ZenoRogue/status/1423663341944377345
 | |
| 
 | |
| // options used:
 | |
| 
 | |
| // https://twitter.com/ZenoRogue/status/1423663341944377345
 | |
| // -fix -ch -noplayer -smart 1 -symbol 3^7 -7 -canvas-random 0 -weirdmaze 2 -ray-reflect .1 -switch-fpp -shot-fhd -ray-do -ray-cells 16384 -gfake 6 depth=.25 wall_height=.5 -smoothcam
 | |
| 
 | |
| // https://twitter.com/ZenoRogue/status/1423663397401501698
 | |
| // -fix -ch -noplayer -smart 1 -symbol 3^7 -7 -canvas-random 0 -weirdmaze 2 -ray-reflect .1 -switch-fpp -shot-fhd -ray-do -ray-cells 16384 -gfake 6 depth=1 wall_height=1 -smoothcam -ray-dont -gfake 7 -smoothcam "fixed_YZ=0" "draw_sky=0" -tstep 16 -noshadow -shot-1000 -run wall_height=2 -run wall_height=1..2 -animvideo 600 animated-fpp.mp4
 | |
| 
 | |
| // https://twitter.com/ZenoRogue/status/1423663473377038341
 | |
| // -fix -ch -noplayer -smart 1 -symbol 3^7 -7 -canvas-random 0 -weirdmaze 2 -ray-reflect .1 -switch-fpp -ray-do -ray-cells 16384 -gfake 6.9 depth=.25 wall_height=.5 -run -gfake 6.1 -run -gfake "7../0..6.01../0..|6.01../0..7../0" "depth=fake_edgelength" "wall_height=2*fake_edgelength" -shot-fhd -fov 110 -run -animvideo 600 animated-curvature.mp4
 | |
| 
 | |
| // most other scenes change the "weirdmaze" parameter (the number of filles tiles at every corner)
 | |
| 
 | |
| // (includes manual movement)
 | |
| 
 | |
| 
 | |
| namespace rogueviz {
 | |
| 
 | |
| namespace weirdmaze {
 | |
| 
 | |
| int atleast = 1;
 | |
| 
 | |
| set<cell*> visited;
 | |
| 
 | |
| bool restrict(cell *c, const shiftmatrix& V) {
 | |
| 
 | |
|   if(atleast == -1) {
 | |
|     c->wall = c->type == 3 ? waWaxWall : waNone;
 | |
|     return false;
 | |
|     }
 | |
| 
 | |
|   if(visited.count(c)) return false;
 | |
|   
 | |
|   visited.insert(c);
 | |
|   
 | |
|   for(int i=0; i<c->type; i++) {
 | |
|     cellwalker cw(c, i);
 | |
|     cellwalker cw0 = cw;
 | |
|     
 | |
|     int q = 0;
 | |
|     int walls = 0;
 | |
|     vector<cellwalker> unknown;
 | |
|     do {
 | |
|       q++;
 | |
|       cw += wstep;
 | |
|       cw++;
 | |
|       if(cw.at->wall == waWaxWall) walls++;
 | |
|       if(!visited.count(cw.at)) unknown.push_back(cw);
 | |
|       }
 | |
|     while(cw != cw0);
 | |
|     
 | |
|     if(walls == 0 && isize(unknown) == atleast) {
 | |
|       if(atleast == 2) {
 | |
|         cw = unknown[0];
 | |
|         cw0 = cw;
 | |
|         do {
 | |
|           visited.insert(cw.at);
 | |
|           cw.at->wall = waWaxWall;
 | |
|           cw += wstep;
 | |
|           cw--;
 | |
|           }
 | |
|         while(cw != cw0);
 | |
|         }
 | |
|       if(atleast > 2) {
 | |
|         cw = unknown[0];
 | |
|         vector<cellwalker> lst;
 | |
|         for(int i=0; i<200; i++) {
 | |
|           lst.push_back(cw);
 | |
|           if(gmod(i, atleast-1) == (atleast-2)) {
 | |
|             cw += wstep;
 | |
|             cw--;
 | |
|             }
 | |
|           else {
 | |
|             cw += wstep;
 | |
|             cw++;
 | |
|             }
 | |
|           }
 | |
|         cw = unknown[0];
 | |
|         for(int i=-1; i>=-200; i--) {
 | |
|           if(gmod(i, atleast-1) == (atleast-2)) {
 | |
|             cw++;
 | |
|             cw += wstep;
 | |
|             }
 | |
|           else {
 | |
|             cw--;
 | |
|             cw += wstep;
 | |
|             }
 | |
|           lst.push_back(cw);
 | |
|           }
 | |
|         int fil = 0;
 | |
|         for(auto w: lst) if(visited.count(w.at)) fil++;
 | |
|         if(fil == 0) {
 | |
|           for(auto cw: lst) {
 | |
|             visited.insert(cw.at);
 | |
|             for(int i=0; i<3; i++)
 | |
|               visited.insert((cw+i).cpeek());
 | |
|             cw.at->wall = waWaxWall;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       if(atleast == 1) {
 | |
|         unknown[0].at->wall = waWaxWall;
 | |
|         println(hlog, "added at ", unknown[0].at, " from ", c);
 | |
|         visited.insert(unknown[0].at);
 | |
|         }
 | |
|       }    
 | |
|     }
 | |
|   
 | |
|   return false;
 | |
|   }
 | |
| 
 | |
| void enable() {
 | |
|   using namespace arg;
 | |
|   shift();
 | |
|   atleast = argi();
 | |
|   visited.clear();
 | |
|   rv_hook(hooks_drawcell, 100, restrict);
 | |
|   }
 | |
|   
 | |
| auto plyhook = 
 | |
|   arg::add3("-weirdmaze", enable);
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 | |
| }
 | 
