mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // this generates data for Klein's Quartic (-geo 0 -quartic) and Bolza surface (in -geo 7 -quartic) and 2x Bolza (-geo7 -quartic2)
 | |
| // Copyright (C) 2018 Zeno Rogue, see 'hyper.cpp' for details
 | |
| 
 | |
| #include "../init.cpp"
 | |
| 
 | |
| using namespace hr;
 | |
| 
 | |
| int qty;
 | |
| 
 | |
| namespace hr {
 | |
| cellwalker& operator += (cellwalker& cw, int spin);
 | |
| cellwalker& operator += (cellwalker& cw, wstep_t);
 | |
| }
 | |
| 
 | |
| void recursive(cell *c, int col, int dir, int dbl) {
 | |
|   c->landparam = col;
 | |
|   c->mondir = dir;
 | |
|   c->monst = moButterfly;
 | |
|   if(S7 == 7) {
 | |
|     for(int i=0; i<7; i++) {
 | |
|       for(int j=3; j<5; j++) {
 | |
|         cellwalker cw(c, dir + i);
 | |
|         for(int u=0; u<4; u++) {
 | |
|           cw += wstep;
 | |
|           cw += j;
 | |
|           }
 | |
|         cw += -dir;
 | |
|         if(cw.c->landparam == -1) recursive(cw.c, col^dbl, dir, dbl);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   if(S7 == 8) {
 | |
|     for(int i=0; i<8; i++) {
 | |
|       cellwalker cw(c, dir);
 | |
|       cw += i;
 | |
|       cw += wstep;
 | |
|       cw += 4;
 | |
|       cw += wstep;
 | |
|       cw += (4-i);
 | |
| //    if(cw.c->landparam == -1) recursive(cw.c, (col ^ 1));
 | |
|       if(cw.c->landparam == -1) recursive(cw.c, col ^ dbl, cw.spin, dbl);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
| void generate_quartic(bool dbl) {
 | |
|   celllister clgen(cwt.c, S7==7?10:8, 1000000, NULL);
 | |
|   int d;
 | |
|   for(cell *c1: clgen.lst) { c1->landparam = -1; d = celldist(c1); }
 | |
|   for(cell *c1: clgen.lst) if(c1->landparam == -1) {
 | |
|     recursive(c1, qty, 0, dbl);
 | |
|     qty++;
 | |
|     if(dbl) qty++;
 | |
|     }
 | |
|   vector<unsigned> colors;
 | |
|   for(cell *c1: clgen.lst) {
 | |
|     if(celldist(c1) >= d-1) continue;
 | |
|     if(c1->mov[c1->mondir]->landparam > c1->mov[c1->mondir ^ 4]->landparam)
 | |
|       c1->mondir ^= 4;
 | |
|     }
 | |
| 
 | |
|   if(0) for(cell *c1: clgen.lst) {
 | |
|     if(celldist(c1) >= d-2) continue;
 | |
|     vector<int> connections;
 | |
|     cellwalker cw(c1, c1->mondir);
 | |
|     for(int i=0; i<S7; i++) {
 | |
|       cellwalker cwx = cw; cwx += wstep;
 | |
|       connections.push_back(cwx.c->landparam * S7 + (cwx.spin - cwx.c->mondir + MODFIXER) % S7);
 | |
|       cw += 1;
 | |
|       }
 | |
|     printf("/* %03d */", c1->landparam);
 | |
|     for(int i=0; i<S7; i++) printf(" %d,", connections[i]);
 | |
|     printf("\n");
 | |
|     }
 | |
|   printf("qty = %d\n", qty);
 | |
|   for(int i=0; i<qty; i++) colors.push_back(hrand(0x1000000));
 | |
|   for(cell *c1: clgen.lst) {
 | |
|     c1->landparam = colors[c1->landparam % qty];
 | |
|     }
 | |
|   }
 | |
| 
 | |
| int readArgs() {
 | |
|   using namespace arg;
 | |
|            
 | |
|   if(0) ;
 | |
|   else if(argis("-quartic")) {
 | |
|     PHASE(3);
 | |
|     start_game();
 | |
|     generate_quartic(0);
 | |
|     }
 | |
|   else if(argis("-quartic2")) {
 | |
|     PHASE(3);
 | |
|     start_game();
 | |
|     generate_quartic(1);
 | |
|     }
 | |
|   else return 1;
 | |
|   return 0;
 | |
|   }
 | |
| 
 | |
| auto hook = addHook(hooks_args, 100, readArgs);
 | |
|  
 | |
| // Bolza:: genus 2 => Euler characteristic -2
 | |
| // octagon: -2/6
 | |
| // ~> 6 octagons
 | |
| 
 | 
