mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-26 00:47:00 +00:00
configurable field patterns
This commit is contained in:
parent
64a37d3ba2
commit
d007580967
12
cell.cpp
12
cell.cpp
@ -442,9 +442,9 @@ struct hrmap_quotient : hrmap {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TOT = connections.size() / 7;
|
int TOT = connections.size() / S7;
|
||||||
printf("heptagons = %d\n", TOT);
|
printf("heptagons = %d\n", TOT);
|
||||||
printf("all cells = %d\n", TOT*10/3);
|
printf("all cells = %d\n", TOT*(S7+S3)/S3);
|
||||||
if(!TOT) exit(1);
|
if(!TOT) exit(1);
|
||||||
allh.resize(TOT);
|
allh.resize(TOT);
|
||||||
for(int i=0; i<TOT; i++) allh[i] = new heptagon;
|
for(int i=0; i<TOT; i++) allh[i] = new heptagon;
|
||||||
@ -461,14 +461,14 @@ struct hrmap_quotient : hrmap {
|
|||||||
h->emeraldval = 0;
|
h->emeraldval = 0;
|
||||||
h->zebraval = 0;
|
h->zebraval = 0;
|
||||||
h->fiftyval = 0;
|
h->fiftyval = 0;
|
||||||
h->fieldval = 7*i;
|
h->fieldval = S7*i;
|
||||||
h->rval0 = h->rval1 = 0; h->cdata = NULL;
|
h->rval0 = h->rval1 = 0; h->cdata = NULL;
|
||||||
h->distance = 0;
|
h->distance = 0;
|
||||||
h->c7 = newCell(S7, h);
|
h->c7 = newCell(S7, h);
|
||||||
}
|
}
|
||||||
for(int j=0; j<7; j++) {
|
for(int j=0; j<S7; j++) {
|
||||||
h->move[rv(j)] = allh[connections[i*7+j]/7];
|
h->move[rv(j)] = allh[connections[i*S7+j]/S7];
|
||||||
h->setspin(rv(j), rv(connections[i*7+j]%7));
|
h->setspin(rv(j), rv(connections[i*S7+j]%S7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ struct geometryinfo {
|
|||||||
int vertex;
|
int vertex;
|
||||||
int quotientstyle;
|
int quotientstyle;
|
||||||
int cclass; // 0-hyperbolic, 1-Euclidean, 2-spherical
|
int cclass; // 0-hyperbolic, 1-Euclidean, 2-spherical
|
||||||
int distlimit[2]; // truncated, non-truncated
|
array<int,2> distlimit; // truncated, non-truncated
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int qZEBRA = 1;
|
static const int qZEBRA = 1;
|
||||||
|
@ -695,7 +695,12 @@ void info() {
|
|||||||
printf("cases found = %d (%d hard)\n", cases, hard);
|
printf("cases found = %d (%d hard)\n", cases, hard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fpattern current_quotient_field(0);
|
||||||
|
bool quotient_field_changed;
|
||||||
|
|
||||||
fpattern& getcurrfp() {
|
fpattern& getcurrfp() {
|
||||||
|
if(quotient == 2 && quotient_field_changed)
|
||||||
|
return current_quotient_field;
|
||||||
if(S7 == 8 && S3 == 3) {
|
if(S7 == 8 && S3 == 3) {
|
||||||
static fpattern fp(17);
|
static fpattern fp(17);
|
||||||
return fp;
|
return fp;
|
||||||
|
116
geom-exp.cpp
116
geom-exp.cpp
@ -29,13 +29,125 @@ string euchelp =
|
|||||||
|
|
||||||
int ewhichscreen = 2;
|
int ewhichscreen = 2;
|
||||||
|
|
||||||
void showQuotientConfig() {}
|
// extra information for field quotient extra configuration
|
||||||
|
|
||||||
|
struct primeinfo {
|
||||||
|
int p;
|
||||||
|
int cells;
|
||||||
|
bool squared;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fgeomextra {
|
||||||
|
eGeometry base;
|
||||||
|
vector<primeinfo> primes;
|
||||||
|
int current_prime_id;
|
||||||
|
fgeomextra(eGeometry b, int i) : base(b), current_prime_id(i) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
vector<fgeomextra> fgeomextras = {
|
||||||
|
fgeomextra(gNormal, 3),
|
||||||
|
fgeomextra(gOctagon, 1),
|
||||||
|
fgeomextra(g45, 0),
|
||||||
|
fgeomextra(g46, 3),
|
||||||
|
fgeomextra(g47, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
int current_extra = 0;
|
||||||
|
|
||||||
|
void nextPrime(fgeomextra& ex) {
|
||||||
|
dynamicval<eGeometry> g(geometry, ex.base);
|
||||||
|
int nextprime;
|
||||||
|
if(size(ex.primes))
|
||||||
|
nextprime = ex.primes.back().p + 1;
|
||||||
|
else
|
||||||
|
nextprime = 2;
|
||||||
|
while(true) {
|
||||||
|
fieldpattern::fpattern fp(0);
|
||||||
|
fp.Prime = nextprime;
|
||||||
|
if(fp.solve() == 0) {
|
||||||
|
fp.build();
|
||||||
|
ex.primes.emplace_back(primeinfo{nextprime, size(fp.matrices) / S7, fp.wsquare});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nextprime++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void nextPrimes(fgeomextra& ex) {
|
||||||
|
while(size(ex.primes) < 4)
|
||||||
|
nextPrime(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableFieldChange() {
|
||||||
|
fgeomextra& gxcur = fgeomextras[current_extra];
|
||||||
|
fieldpattern::quotient_field_changed = true;
|
||||||
|
nextPrimes(gxcur);
|
||||||
|
dynamicval<eGeometry> g(geometry, gQuotient2);
|
||||||
|
ginf[geometry].sides = ginf[gxcur.base].sides;
|
||||||
|
ginf[geometry].vertex = ginf[gxcur.base].vertex;
|
||||||
|
ginf[geometry].distlimit = ginf[gxcur.base].distlimit;
|
||||||
|
fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void showQuotientConfig() {
|
||||||
|
gamescreen(2);
|
||||||
|
dialog::init(XLAT("advanced configuration"));
|
||||||
|
fgeomextra& gxcur = fgeomextras[current_extra];
|
||||||
|
for(int i=0; i<size(fgeomextras); i++) {
|
||||||
|
auto& g = fgeomextras[i];
|
||||||
|
dialog::addBoolItem(XLAT(ginf[g.base].name), g.base == gxcur.base, 'a'+i);
|
||||||
|
}
|
||||||
|
nextPrimes(gxcur);
|
||||||
|
for(int i=0; i<size(gxcur.primes); i++) {
|
||||||
|
auto& p = gxcur.primes[i];
|
||||||
|
dialog::addBoolItem(XLAT("order %1%2 (non-truncated cells: %3)", its(p.p), p.squared ? "²" : "", its(p.cells)), i == gxcur.current_prime_id, 'A'+i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(size(gxcur.primes) < 6) {
|
||||||
|
dialog::addBreak(100);
|
||||||
|
dialog::addHelp(
|
||||||
|
"This geometry is obtained by applying the same 'generators' which "
|
||||||
|
"lead to creating the given basic hyperbolic geometry, "
|
||||||
|
"but using a fixed finite field instead of the field of reals. "
|
||||||
|
"It can be also interpreted as a quotient of the given basic geometry. "
|
||||||
|
"Warning: field patterns based on large primes might generate for a long time."
|
||||||
|
);
|
||||||
|
dialog::addBreak(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog::addItem("find the next prime", 'p');
|
||||||
|
dialog::addItem("activate", 'x');
|
||||||
|
dialog::addItem("default", 'c');
|
||||||
|
|
||||||
|
keyhandler = [&gxcur] (int sym, int uni) {
|
||||||
|
if(uni >= 'a' && uni < 'a' + size(fgeomextras))
|
||||||
|
current_extra = uni - 'a';
|
||||||
|
else if(uni >= 'A' && uni < 'A' + size(gxcur.primes))
|
||||||
|
gxcur.current_prime_id = uni - 'A';
|
||||||
|
else if(uni == 'p')
|
||||||
|
nextPrime(gxcur);
|
||||||
|
else if(uni == 'x' || uni == '\n') {
|
||||||
|
targetgeometry = gxcur.base; restartGame('g');
|
||||||
|
enableFieldChange();
|
||||||
|
targetgeometry = gQuotient2; restartGame('g');
|
||||||
|
}
|
||||||
|
else if(uni == 'c') {
|
||||||
|
targetgeometry = gEuclid; restartGame('g');
|
||||||
|
fieldpattern::quotient_field_changed = false;
|
||||||
|
targetgeometry = gQuotient2; restartGame('g');
|
||||||
|
}
|
||||||
|
else if(doexiton(sym, uni))
|
||||||
|
popScreen();
|
||||||
|
};
|
||||||
|
|
||||||
|
dialog::display();
|
||||||
|
}
|
||||||
|
|
||||||
void showTorusConfig() {
|
void showTorusConfig() {
|
||||||
cmode = sm::SIDE | sm::TORUSCONFIG;
|
cmode = sm::SIDE | sm::TORUSCONFIG;
|
||||||
gamescreen(2);
|
gamescreen(2);
|
||||||
|
|
||||||
dialog::init(XLAT("advanced concfiguration"));
|
dialog::init(XLAT("advanced configuration"));
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("number of cells (n)"), its(torusconfig::newqty), 'n');
|
dialog::addSelItem(XLAT("number of cells (n)"), its(torusconfig::newqty), 'n');
|
||||||
dialog::addSelItem(XLAT("cell bottom-right from 0 (d)"), its(torusconfig::newdy), 'd');
|
dialog::addSelItem(XLAT("cell bottom-right from 0 (d)"), its(torusconfig::newdy), 'd');
|
||||||
|
@ -217,6 +217,7 @@ int main() {
|
|||||||
allchars.insert("δ");
|
allchars.insert("δ");
|
||||||
allchars.insert("∞");
|
allchars.insert("∞");
|
||||||
allchars.insert("½");
|
allchars.insert("½");
|
||||||
|
allchars.insert("²");
|
||||||
|
|
||||||
langPL(); langCZ(); langRU();
|
langPL(); langCZ(); langRU();
|
||||||
langTR(); langDE(); langPT();
|
langTR(); langDE(); langPT();
|
||||||
|
Loading…
Reference in New Issue
Block a user