mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-21 16:00:27 +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
|
||
|
|