diff --git a/classes.cpp b/classes.cpp index 380cd9b4..4d694b1d 100644 --- a/classes.cpp +++ b/classes.cpp @@ -550,12 +550,12 @@ vector ginf = { {"{8,3}", "Bolza2", "Bolza Surface x2", "Bolza2", 8, 3, qsDOCKS, giHyperb2, 0x18400, {{6, 4}}, eVariation::bitruncated}, {"{7,3}", "minimal", "minimal quotient", "minimal", 7, 3, qsSMALLN, giHyperb2, 0x18600, {{7, 5}}, eVariation::bitruncated}, {"binary","none", "variant of the binary tiling", "binary", 7, 3, qBINARY, giHyperb2, 0x48400, {{7, 5}}, eVariation::pure}, - {"Arch", "none", "Archimedean", "A", 7, 3, 0, giHyperb2, 0, {{7, 5}}, eVariation::pure}, + {"Arch", "none", "Archimedean", "A", 7, 3, qARCHI, giHyperb2, 0, {{7, 5}}, eVariation::pure}, {"{7,3}", "Macbeath", "Macbeath Surface", "Macbeath", 7, 3, qsSMALL, giHyperb2, 0x20000, {{7, 5}}, eVariation::bitruncated}, {"{5,4}", "Bring", "Bring's Surface", "Bring", 5, 4, qsSMALL, giHyperb2, 0x20200, {{6, 4}}, eVariation::bitruncated}, {"{12,3}","M3", "Schmutz's M(3)", "M3", 12, 3, qsSMALL, giHyperb2, 0x20400, {{4, 2}}, eVariation::bitruncated}, {"{12,3}","M4", "Schmutz's M(4)", "M4", 12, 3, qsSMALL, giHyperb2, 0x20600, {{4, 2}}, eVariation::bitruncated}, - {"{6,4}", "Crystal", "dimensional crystal", "Crystal", 6, 4, qANYQ, giHyperb2, 0x28000, {{5, 3}}, eVariation::pure}, + {"{6,4}", "Crystal", "dimensional crystal", "Crystal", 6, 4, qANYQ|qCRYSTAL, giHyperb2, 0x28000, {{5, 3}}, eVariation::pure}, {"{3,4}", "none", "{3,4} (octahedron)", "4x3", 3, 4, qsSMALLB, giSphere2, 0x28200, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated}, {"bin{4,4}", "none", "{4,4} on horospheres", "bin44", 9, 3, qBINARY, giHyperb3, 0x30000, {{7, 3}}, eVariation::pure}, {"{4,3,4}","none", "{4,3,4} cube tiling", "434", 6, 4, 0, giEuclid3, 0x30200, {{7, 5}}, eVariation::pure}, @@ -584,8 +584,8 @@ vector ginf = { {"kd2", "none", "kite-and-dart", "kd2", 4, 3, qPENROSE, giEuclid2, 0x48000, {{7, 7}}, eVariation::pure}, {"kd3", "none", "kite-and-dart on horospheres", "kd3", 12, 3, qsBP, giHyperb3, 0x48200, {{7, 3}}, eVariation::pure}, {"nil", "none", "Nil geometry", "nil", 6, 3, 0, giNil, 0x48600, {{7, 5}}, eVariation::pure}, - {"product","none", "product space", "product", 7, 3, 0, giProduct, 0x48400, {{7, 3}}, eVariation::pure}, - {"psl2", "psl2", "PSL(2,R)", "psl2", 7, 3, qEXPERIMENTAL, giSL2, 0x49000, {{6, 4}}, eVariation::pure}, + {"product","none", "product space", "product", 7, 3, qHYBRID, giProduct, 0x48400, {{7, 3}}, eVariation::pure}, + {"twisted","none", "space of isometries", "twisted", 7, 3, qHYBRID, giSL2, 0x49000, {{6, 4}}, eVariation::pure}, }; // bits: 9, 10, 15, 16, (reserved for later) 17, 18 diff --git a/classes.h b/classes.h index 60c19e3f..19693c27 100644 --- a/classes.h +++ b/classes.h @@ -238,8 +238,8 @@ struct geometryinfo1 { }; struct geometryinfo { - const char* tiling_name; - const char* quotient_name; + std::string tiling_name; + std::string quotient_name; const char* menu_displayed_name; const char* shortname; int sides; @@ -265,6 +265,11 @@ static const flagtype qELLIPTIC = 128; static const flagtype qBINARY = 256; static const flagtype qPENROSE = 512; +static const flagtype qREGULAR = 1024; /* not set! */ +static const flagtype qARCHI = 2048; +static const flagtype qHYBRID = 4096; +static const flagtype qCRYSTAL = 8192; + static const flagtype qEXPERIMENTAL = 32768; // note: dnext assumes that x&7 equals 7 diff --git a/expansion.cpp b/expansion.cpp index d823ffb2..b3a624f5 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -857,7 +857,7 @@ int expansion_hook = addHook(hooks_handleKey, 0, expansion_handleKey); #if !ISMINI void compute_coefficients() { - printf("%s %s\n", gp::operation_name().c_str(), ginf[geometry].tiling_name); + println(hlog, gp::operation_name(), " ", ginf[geometry].tiling_name); start_game(); printf(" sizes:"); diff --git a/geom-exp.cpp b/geom-exp.cpp index 1e9dc333..820f683a 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -417,7 +417,10 @@ void ge_select_tiling(const vector& lst) { if(archimedean && !CAP_ARCM) continue; if(cryst && !CAP_CRYSTAL) continue; if(geometry == gFieldQuotient && !CAP_FIELD) continue; - dialog::addBoolItem(XLAT((geometry == gProduct && !on) ? XLAT("current geometry x E") : ginf[i].menu_displayed_name), on, letter++); + dialog::addBoolItem(XLAT( + (geometry == gProduct && !on) ? XLAT("current geometry x E") : + (geometry == gSL2 && !on) ? XLAT("isometries of current geometry") : + ginf[i].menu_displayed_name), on, letter++); dialog::lastItem().value += validclasses[land_validity(specialland).quality_level]; dialog::add_action(dual::mayboth([i] { eGeometry targetgeometry = eGeometry(i); @@ -830,7 +833,7 @@ EX void showEuclideanMenu() { break; case gcSL2: - dialog::addSelItem(XLAT("Curvature"), XLAT("~SL2(R)~"), 0); + dialog::addSelItem(XLAT("Curvature"), XLAT("~SL(2,R)~"), 0); break; case gcProduct: diff --git a/graph.cpp b/graph.cpp index 5a54f4c7..402ec4dd 100644 --- a/graph.cpp +++ b/graph.cpp @@ -808,8 +808,8 @@ color_t kind_outline(eItem it) { EX transmatrix face_the_player(const transmatrix V) { if(GDIM == 2) return V; - if(sl2) return V * zpush(cos(ptick(750)) * cgi.plevel / 16); if(prod) return mscale(V, cos(ptick(750)) * cgi.plevel / 16); + if(hybri) return V * zpush(cos(ptick(750)) * cgi.plevel / 16); transmatrix dummy; /* used only in prod anyways */ if(nonisotropic) return spin_towards(V, dummy, C0, 2, 0); return rgpushxto0(tC0(V)); @@ -4564,7 +4564,7 @@ void radar_grid(cell *c, const transmatrix& V) { int wall_offset(cell *c) { if(prod) return product::cwall_offset; - if(sl2) return hybrid::wall_offset(c); + if(hybri) return hybrid::wall_offset(c); if(penrose && kite::getshape(c->master) == kite::pKite) return 10; return 0; } diff --git a/hyper.h b/hyper.h index 404cd7cc..d430979f 100644 --- a/hyper.h +++ b/hyper.h @@ -110,8 +110,8 @@ void addMessage(string s, char spamtype = 0); #define stdhyperbolic (S7 == 7 && S3 == 3 && STDVAR && !binarytiling && !archimedean) #define binarytiling (ginf[geometry].flags & qBINARY) -#define archimedean (geometry == gArchimedean) -#define cryst (geometry == gCrystal) +#define archimedean (ginf[geometry].flags & qARCHI) +#define cryst (ginf[geometry].flags & qCRYSTAL) #define penrose (ginf[geometry].flags & qPENROSE) /** convenience flag for geometries with major aspects missing */ @@ -127,7 +127,7 @@ void addMessage(string s, char spamtype = 0); #define nil (cgclass == gcNil) #define sl2 (cgclass == gcSL2) #define prod (cgclass == gcProduct) -#define hybri (prod || sl2) +#define hybri (ginf[geometry].flags & qHYBRID) #define hyperbolic (cgclass == gcHyperbolic) #define nonisotropic (sol || nil || sl2) #define translatable (euclid || nonisotropic) diff --git a/hypgraph.cpp b/hypgraph.cpp index 4d360fa0..86fa919b 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -1379,7 +1379,7 @@ EX void optimizeview() { if(subscreens::split(optimizeview)) return; if(dual::split(optimizeview)) return; - if(sl2) { + if(hybri && !prod) { cell *c = viewcenter(); cell *cbest = NULL; ld best = hdist0(tC0(gmatrix[c])); diff --git a/landgen.cpp b/landgen.cpp index 9d4481dd..92d07cb2 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -527,7 +527,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { if(hrand_monster(8000) < 50 + 10 * (items[itEmerald] + yendor::hardness())) { static eMonster emeraldmonsters[4] = { moHedge, moLancer, moFlailer, moMiner }; c->monst = emeraldmonsters[hrand(4)]; - if(c->monst == moHedge && (S3 != 3 || sl2)) + if(c->monst == moHedge && (S3 != 3 || (hybri && !prod))) c->monst = moFlailer; } if(sphere && c->type != 6 && c->master->fiftyval == 5) { diff --git a/nonisotropic.cpp b/nonisotropic.cpp index c5fa8292..fa2cbc00 100644 --- a/nonisotropic.cpp +++ b/nonisotropic.cpp @@ -576,12 +576,20 @@ EX namespace hybrid { underlying_cgip = cgip; geometry = g; ginf[g] = ginf[underlying]; - if(g == gSL2) ginf[g].g = giSL2; + if(g == gSL2) { + ginf[g].g = giSL2; + ginf[g].tiling_name = "Iso(" + ginf[g].tiling_name + ")"; + string& qn = ginf[g].quotient_name; + if(qn == "none") qn = "PSL(2,R)"; + else qn = qn + "/PSL(2,R)"; + } else { ginf[g].cclass = g == gSL2 ? gcSL2 : gcProduct; ginf[g].g.gameplay_dimension++; ginf[g].g.graphical_dimension++; + ginf[g].tiling_name += "xZ"; } + ginf[g].flags |= qHYBRID; } hrmap *pmap; @@ -616,7 +624,7 @@ EX namespace hybrid { } cell *getCell(cell *u, int h) { - if(sl2) h = gmod(h, cgi.steps); + if(cgi.steps) h = gmod(h, cgi.steps); cell*& c = at[make_pair(u, h)]; if(!c) { c = newCell(u->type+2, u->master); where[c] = {u, h}; } return c; @@ -655,7 +663,7 @@ EX namespace hybrid { auto cu = m->where[c].first; auto cu1 = m->in_underlying([&] { return cu->cmove(d); }); int d1 = cu->c.spin(d); - int s = sl2 ? d*cgi.steps / cu->type - d1*cgi.steps / cu1->type + cgi.steps/2 : 0; + int s = cgi.steps ? d*cgi.steps / cu->type - d1*cgi.steps / cu1->type + cgi.steps/2 : 0; cell *c1 = get_at(cu1, m->where[c].second + s); c->c.connect(d, c1, d1, cu->c.mirror(d)); } @@ -1268,8 +1276,8 @@ EX namespace nisot { EX hrmap *new_map() { if(sol) return new solv::hrmap_sol; if(nil) return new nilv::hrmap_nil; - if(sl2) return new slr::hrmap_psl2; if(geometry == gProduct) return new product::hrmap_product; + if(hybri) return new slr::hrmap_psl2; return NULL; } diff --git a/pattern2.cpp b/pattern2.cpp index c11df658..f6e20394 100644 --- a/pattern2.cpp +++ b/pattern2.cpp @@ -1374,7 +1374,7 @@ EX bool pseudohept(cell *c) { #if CAP_IRR if(IRREGULAR) return irr::pseudohept(c); #endif - if(hybri) { auto d = hybrid::get_where(c); return (sl2 ? true : (d.second & 1)) && PIU(pseudohept(d.first)); } + if(hybri) { auto d = hybrid::get_where(c); return ((!prod) || (d.second & 1)) && PIU(pseudohept(d.first)); } #if CAP_BT if(nil) return c->master->zebraval & c->master->emeraldval & c->master->fieldval & 1; if(sol) return (c->master->emeraldval % 3 == 2) && (c->master->zebraval % 3 == 2) && (c->master->distance % 2); diff --git a/polygons.cpp b/polygons.cpp index 77fc6a86..b6ff6523 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -803,7 +803,7 @@ void geometry_information::reserve_wall3d(int i) { void geometry_information::create_wall3d() { if(WDIM == 2) return; - reserve_wall3d(penrose ? 22 : prod ? 0 : sl2 ? 0 : S7); + reserve_wall3d(penrose ? 22 : hybri ? 0 : S7); if(GDIM == 3 && binarytiling && geometry == gBinary3) { hyperpoint h00 = point3(-1,-1,-1); hyperpoint h01 = point3(-1,0,-1); @@ -958,7 +958,7 @@ void geometry_information::create_wall3d() { } } - if(GDIM == 3 && !euclid && !binarytiling && !nil && !prod && !sl2) { + if(GDIM == 3 && !euclid && !binarytiling && !nonisotropic && !hybri && !penrose) { reg3::generate(); int facesize = isize(reg3::cellshape) / S7; for(int w=0; w