mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-04 05:09:18 +00:00
rewritten the Euclidean geometry
This commit is contained in:
parent
aed8df0d04
commit
1cba452f07
@ -439,7 +439,7 @@ void connectHeptagons(heptspin hi, heptspin hs);
|
|||||||
transmatrix adjcell_matrix(heptagon *h, int d);
|
transmatrix adjcell_matrix(heptagon *h, int d);
|
||||||
|
|
||||||
struct hrmap_archimedean : hrmap {
|
struct hrmap_archimedean : hrmap {
|
||||||
map<int, struct cdata> eucdata;
|
map<gp::loc, struct cdata> eucdata;
|
||||||
heptagon *origin;
|
heptagon *origin;
|
||||||
heptagon *getOrigin() { return origin; }
|
heptagon *getOrigin() { return origin; }
|
||||||
|
|
||||||
@ -559,8 +559,11 @@ struct hrmap_archimedean : hrmap {
|
|||||||
U = U * inverse(T);
|
U = U * inverse(T);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(euclid)
|
if(euclid) {
|
||||||
alt = encodeId(pair_to_vec(int(T[0][LDIM]), int(T[1][LDIM])));
|
/* hash the rough coordinates as heptagon* alt */
|
||||||
|
size_t s = size_t(T[0][LDIM]+.261) * 124101 + size_t(T[1][LDIM]+.261) * 82143;
|
||||||
|
alt = (heptagon*) s;
|
||||||
|
}
|
||||||
|
|
||||||
DEBB(DF_GEOM, ("look for: ", alt, " / ", T * C0));
|
DEBB(DF_GEOM, ("look for: ", alt, " / ", T * C0));
|
||||||
|
|
||||||
@ -1361,7 +1364,7 @@ EX int valence() {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EX map<int, cdata>& get_cdata() { return ((arcm::hrmap_archimedean*) (currentmap))->eucdata; }
|
EX map<gp::loc, cdata>& get_cdata() { return ((arcm::hrmap_archimedean*) (currentmap))->eucdata; }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
33
bigstuff.cpp
33
bigstuff.cpp
@ -51,7 +51,7 @@ EX int celldistAltRelative(cell *c) {
|
|||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
if(euclid && WDIM == 3) return euclid3::dist_relative(c);
|
if(euclid && WDIM == 3) return euclid3::dist_relative(c);
|
||||||
#endif
|
#endif
|
||||||
if(euwrap) return celldistAlt(c) - roundTableRadius(c);
|
if(euclid && quotient) return celldistAlt(c) - roundTableRadius(c);
|
||||||
if(sphere || quotient) {
|
if(sphere || quotient) {
|
||||||
return celldist(c) - 3;
|
return celldist(c) - 3;
|
||||||
}
|
}
|
||||||
@ -88,15 +88,14 @@ EX int euclidAlt(short x, short y) {
|
|||||||
|
|
||||||
EX int cylinder_alt(cell *c) {
|
EX int cylinder_alt(cell *c) {
|
||||||
if(specialland == laPrincessQuest)
|
if(specialland == laPrincessQuest)
|
||||||
return celldistance(c, vec_to_cellwalker(pair_to_vec(EPX, EPY)).at);
|
return celldistance(c, at_euc2_coordinates({EPX, EPY}));
|
||||||
if(specialland == laCamelot)
|
if(specialland == laCamelot)
|
||||||
return celldistance(c, vec_to_cellwalker(pair_to_vec(21, 10)).at);
|
return celldistance(c, at_euc2_coordinates({21, 10}));
|
||||||
|
|
||||||
using namespace torusconfig;
|
|
||||||
int maxmul = 0;
|
int maxmul = 0;
|
||||||
for(int d = 0; d < SG6; d++)
|
for(int d = 0; d < SG6; d++)
|
||||||
maxmul = max(maxmul, dcross(sdxy(), gp::eudir(d)));
|
maxmul = max(maxmul, dcross(sdxy(), gp::eudir(d)));
|
||||||
return 5-abs(gdiv(dcross(sdxy(), cell_to_pair(c)), maxmul));
|
return 5-abs(gdiv(dcross(sdxy(), euc2_coordinates(c)), maxmul));
|
||||||
}
|
}
|
||||||
|
|
||||||
const int NOCOMPASS = 1000000;
|
const int NOCOMPASS = 1000000;
|
||||||
@ -876,7 +875,7 @@ EX void setLandSphere(cell *c) {
|
|||||||
int y = getHemisphere(c, 2);
|
int y = getHemisphere(c, 2);
|
||||||
elementalXY(c, x, y, (c->type != 6 || GOLDBERG));
|
elementalXY(c, x, y, (c->type != 6 || GOLDBERG));
|
||||||
}
|
}
|
||||||
if(!euwrap)
|
if(!(euclid && quotient))
|
||||||
if(specialland == laCrossroads || specialland == laCrossroads2 || specialland == laCrossroads3 || specialland == laTerracotta) {
|
if(specialland == laCrossroads || specialland == laCrossroads2 || specialland == laCrossroads3 || specialland == laTerracotta) {
|
||||||
int x = getHemisphere(c, 1);
|
int x = getHemisphere(c, 1);
|
||||||
if(x == 0 && specialland == laTerracotta)
|
if(x == 0 && specialland == laTerracotta)
|
||||||
@ -1093,17 +1092,17 @@ EX void setLandEuclid(cell *c) {
|
|||||||
setland(c, specialland);
|
setland(c, specialland);
|
||||||
if(specialland == laCrossroads4 || chaosmode) {
|
if(specialland == laCrossroads4 || chaosmode) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
c->land = getEuclidLand(y);
|
c->land = getEuclidLand(y);
|
||||||
}
|
}
|
||||||
if(specialland == laCrossroads) {
|
if(specialland == laCrossroads) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
setland(c, getEuclidLand(y+2*x));
|
setland(c, getEuclidLand(y+2*x));
|
||||||
}
|
}
|
||||||
if(specialland == laTerracotta) {
|
if(specialland == laTerracotta) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
if(((y+2*x) & 15) == 1) {
|
if(((y+2*x) & 15) == 1) {
|
||||||
setland(c, laMercuryRiver);
|
setland(c, laMercuryRiver);
|
||||||
c->wall = waMercury;
|
c->wall = waMercury;
|
||||||
@ -1116,9 +1115,9 @@ EX void setLandEuclid(cell *c) {
|
|||||||
if(specialland == laPrincessQuest) setland(c, laPalace);
|
if(specialland == laPrincessQuest) setland(c, laPalace);
|
||||||
if(specialland == laOcean) {
|
if(specialland == laOcean) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
y += 10;
|
y += 10;
|
||||||
if(euwrap) y = -celldistAlt(c);
|
if(euclid && quotient) y = -celldistAlt(c);
|
||||||
if(y == 0)
|
if(y == 0)
|
||||||
{ setland(c, laBarrier); if(ishept(c)) c->land = laRlyeh; }
|
{ setland(c, laBarrier); if(ishept(c)) c->land = laRlyeh; }
|
||||||
else if(y<0) setland(c, laRlyeh);
|
else if(y<0) setland(c, laRlyeh);
|
||||||
@ -1126,7 +1125,7 @@ EX void setLandEuclid(cell *c) {
|
|||||||
}
|
}
|
||||||
if(specialland == laWestWall) {
|
if(specialland == laWestWall) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
x = -5 - x;
|
x = -5 - x;
|
||||||
if(x == 0)
|
if(x == 0)
|
||||||
{setland(c, laBarrier); if(ishept(c)) setland(c, laMotion); }
|
{setland(c, laBarrier); if(ishept(c)) setland(c, laMotion); }
|
||||||
@ -1135,9 +1134,9 @@ EX void setLandEuclid(cell *c) {
|
|||||||
}
|
}
|
||||||
if(specialland == laIvoryTower || specialland == laDungeon) {
|
if(specialland == laIvoryTower || specialland == laDungeon) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c); y = -5 - y;
|
tie(x,y) = euc2_coordinates(c); y = -5 - y;
|
||||||
if(specialland == laDungeon) y = -10 - y;
|
if(specialland == laDungeon) y = -10 - y;
|
||||||
if(euwrap) y = -celldistAlt(c);
|
if(euclid && quotient) y = -celldistAlt(c);
|
||||||
if(y == 0)
|
if(y == 0)
|
||||||
{setland(c, laBarrier); if(ishept(c)) setland(c, laAlchemist); }
|
{setland(c, laBarrier); if(ishept(c)) setland(c, laAlchemist); }
|
||||||
else if(y<0) setland(c, laAlchemist);
|
else if(y<0) setland(c, laAlchemist);
|
||||||
@ -1147,7 +1146,7 @@ EX void setLandEuclid(cell *c) {
|
|||||||
}
|
}
|
||||||
if(specialland == laElementalWall) {
|
if(specialland == laElementalWall) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int x0 = euclid4 ? x : x + (y>>1);
|
int x0 = euclid4 ? x : x + (y>>1);
|
||||||
int y0 = y;
|
int y0 = y;
|
||||||
|
|
||||||
@ -1176,7 +1175,7 @@ EX void setLandEuclid(cell *c) {
|
|||||||
}
|
}
|
||||||
if(specialland == laCrossroads3) {
|
if(specialland == laCrossroads3) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int y0 = euclid4 ? 2 * y - x : y;
|
int y0 = euclid4 ? 2 * y - x : y;
|
||||||
int x0 = euclid4 ? 2 * x + y : x + y/2;
|
int x0 = euclid4 ? 2 * x + y : x + y/2;
|
||||||
|
|
||||||
@ -1195,7 +1194,7 @@ EX void setLandEuclid(cell *c) {
|
|||||||
}
|
}
|
||||||
if(specialland == laWarpCoast) {
|
if(specialland == laWarpCoast) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
|
|
||||||
int zz = a4 ? x : 2*x+y + 10;
|
int zz = a4 ? x : 2*x+y + 10;
|
||||||
zz = gmod(zz, 30);
|
zz = gmod(zz, 30);
|
||||||
|
72
cell.cpp
72
cell.cpp
@ -175,17 +175,6 @@ EX cell *createMov(cell *c, int d) {
|
|||||||
printf("ERROR createmov\n");
|
printf("ERROR createmov\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(masterless && !c->move(d)) {
|
|
||||||
int id = decodeId(c->master);
|
|
||||||
for(int dx=-1; dx<=1; dx++)
|
|
||||||
for(int dy=-1; dy<=1; dy++)
|
|
||||||
euclideanAtCreate(id + pair_to_vec(dx, dy));
|
|
||||||
if(!c->move(d)) {
|
|
||||||
println(hlog, "id = ", id, " vec_to_pair(id) = ", vec_to_pair(id), ": failed to create move ", d, " in Euclidean\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(c->move(d)) return c->move(d);
|
if(c->move(d)) return c->move(d);
|
||||||
else if(hybri)
|
else if(hybri)
|
||||||
hybrid::find_cell_connection(c, d);
|
hybrid::find_cell_connection(c, d);
|
||||||
@ -282,14 +271,10 @@ EX void initcells() {
|
|||||||
#if CAP_ARCM
|
#if CAP_ARCM
|
||||||
else if(archimedean) currentmap = arcm::new_map();
|
else if(archimedean) currentmap = arcm::new_map();
|
||||||
#endif
|
#endif
|
||||||
#if MAXMDIM >= 4
|
else if(euclid && !penrose) currentmap = euclid3::new_map();
|
||||||
else if(euclid && WDIM == 3) currentmap = euclid3::new_map();
|
|
||||||
#endif
|
|
||||||
#if CAP_BT
|
#if CAP_BT
|
||||||
else if(penrose) currentmap = kite::new_map();
|
else if(penrose) currentmap = kite::new_map();
|
||||||
#endif
|
#endif
|
||||||
else if(fulltorus) currentmap = new_torus_map();
|
|
||||||
else if(euclid) currentmap = new_euclidean_map();
|
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
else if(WDIM == 3 && !binarytiling) currentmap = reg3::new_map();
|
else if(WDIM == 3 && !binarytiling) currentmap = reg3::new_map();
|
||||||
#endif
|
#endif
|
||||||
@ -412,7 +397,7 @@ EX void verifycell(cell *c) {
|
|||||||
for(int i=0; i<t; i++) {
|
for(int i=0; i<t; i++) {
|
||||||
cell *c2 = c->move(i);
|
cell *c2 = c->move(i);
|
||||||
if(c2) {
|
if(c2) {
|
||||||
if(!masterless && BITRUNCATED && c == c->master->c7) verifycell(c2);
|
if(BITRUNCATED && c == c->master->c7) verifycell(c2);
|
||||||
if(c2->move(c->c.spin(i)) && c2->move(c->c.spin(i)) != c) {
|
if(c2->move(c->c.spin(i)) && c2->move(c->c.spin(i)) != c) {
|
||||||
printf("cell error %p:%d [%d] %p:%d [%d]\n", c, i, c->type, c2, c->c.spin(i), c2->type);
|
printf("cell error %p:%d [%d] %p:%d [%d]\n", c, i, c->type, c2, c->c.spin(i), c2->type);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -442,11 +427,6 @@ EX int eudist(int sx, int sy) {
|
|||||||
return max(max(z0,z1), z2);
|
return max(max(z0,z1), z2);
|
||||||
}
|
}
|
||||||
|
|
||||||
EX int eudist(int vec) {
|
|
||||||
auto p = vec_to_pair(vec);
|
|
||||||
return eudist(p.first, p.second);
|
|
||||||
}
|
|
||||||
|
|
||||||
EX int compdist(int dx[]) {
|
EX int compdist(int dx[]) {
|
||||||
int mi = dx[0];
|
int mi = dx[0];
|
||||||
for(int u=0; u<S3; u++) mi = min(mi, dx[u]);
|
for(int u=0; u<S3; u++) mi = min(mi, dx[u]);
|
||||||
@ -473,13 +453,7 @@ EX int celldist(cell *c) {
|
|||||||
hybrid::in_underlying_map([&] { d = celldist(w.first) + abs(w.second); });
|
hybrid::in_underlying_map([&] { d = celldist(w.first) + abs(w.second); });
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
if(fulltorus && WDIM == 2)
|
|
||||||
return get_torus_dist(decodeId(c->master));
|
|
||||||
if(nil && !quotient) return DISTANCE_UNKNOWN;
|
if(nil && !quotient) return DISTANCE_UNKNOWN;
|
||||||
if(euwrap && WDIM == 2)
|
|
||||||
return torusconfig::cyldist(decodeId(c->master), 0);
|
|
||||||
if(masterless)
|
|
||||||
return eudist(decodeId(c->master));
|
|
||||||
if(euclid && (penrose || archimedean)) return celldistance(currentmap->gamestart(), c);
|
if(euclid && (penrose || archimedean)) return celldistance(currentmap->gamestart(), c);
|
||||||
if(sphere || binarytiling || WDIM == 3 || cryst || solnih || penrose) return celldistance(currentmap->gamestart(), c);
|
if(sphere || binarytiling || WDIM == 3 || cryst || solnih || penrose) return celldistance(currentmap->gamestart(), c);
|
||||||
#if CAP_IRR
|
#if CAP_IRR
|
||||||
@ -511,13 +485,6 @@ EX int celldistAlt(cell *c) {
|
|||||||
hybrid::in_underlying_map([&] { d += celldistAlt(w.first); });
|
hybrid::in_underlying_map([&] { d += celldistAlt(w.first); });
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
if(masterless) {
|
|
||||||
if(fulltorus) return celldist(c);
|
|
||||||
if(euwrap) return cylinder_alt(c);
|
|
||||||
int x, y;
|
|
||||||
tie(x,y) = vec_to_pair(decodeId(c->master));
|
|
||||||
return euclidAlt(x, y);
|
|
||||||
}
|
|
||||||
#if CAP_BT
|
#if CAP_BT
|
||||||
if(binarytiling || solnih) return c->master->distance + (specialland == laCamelot && !tactic::on? 30 : 0);
|
if(binarytiling || solnih) return c->master->distance + (specialland == laCamelot && !tactic::on? 30 : 0);
|
||||||
#endif
|
#endif
|
||||||
@ -836,21 +803,15 @@ cdata *getHeptagonCdata(heptagon *h) {
|
|||||||
return h->cdata = new cdata(mydata);
|
return h->cdata = new cdata(mydata);
|
||||||
}
|
}
|
||||||
|
|
||||||
cdata *getEuclidCdata(int h) {
|
cdata *getEuclidCdata(gp::loc h) {
|
||||||
|
|
||||||
if(euwrap) { // fix cylinder?
|
|
||||||
static cdata xx;
|
|
||||||
return &xx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
|
tie(x,y) = h;
|
||||||
auto& data = archimedean ? arcm::get_cdata() : get_cdata();
|
auto& data = archimedean ? arcm::get_cdata() : get_cdata();
|
||||||
|
|
||||||
// hrmap_euclidean* euc = dynamic_cast<hrmap_euclidean*> (currentmap);
|
// hrmap_euclidean* euc = dynamic_cast<hrmap_euclidean*> (currentmap);
|
||||||
if(data.count(h)) return &(data[h]);
|
if(data.count(h)) return &(data[h]);
|
||||||
|
|
||||||
tie(x,y) = vec_to_pair(h);
|
|
||||||
|
|
||||||
if(x == 0 && y == 0) {
|
if(x == 0 && y == 0) {
|
||||||
cdata xx;
|
cdata xx;
|
||||||
for(int i=0; i<4; i++) xx.val[i] = 0;
|
for(int i=0; i<4; i++) xx.val[i] = 0;
|
||||||
@ -867,8 +828,8 @@ cdata *getEuclidCdata(int h) {
|
|||||||
int x2 = x - (k<2 ? ord : 0);
|
int x2 = x - (k<2 ? ord : 0);
|
||||||
int y2 = y + (k>0 ? ord : 0);
|
int y2 = y + (k>0 ? ord : 0);
|
||||||
|
|
||||||
cdata *d1 = getEuclidCdata(pair_to_vec(x1,y1));
|
cdata *d1 = getEuclidCdata({x1,y1});
|
||||||
cdata *d2 = getEuclidCdata(pair_to_vec(x2,y2));
|
cdata *d2 = getEuclidCdata({x2,y2});
|
||||||
cdata xx;
|
cdata xx;
|
||||||
double disp = pow(2, bid/2.) * 6;
|
double disp = pow(2, bid/2.) * 6;
|
||||||
|
|
||||||
@ -898,9 +859,9 @@ int ld_to_int(ld x) {
|
|||||||
return int(x + 1000000.5) - 1000000;
|
return int(x + 1000000.5) - 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX int pseudocoords(cell *c) {
|
EX gp::loc pseudocoords(cell *c) {
|
||||||
transmatrix T = arcm::archimedean_gmatrix[c->master].second;
|
transmatrix T = arcm::archimedean_gmatrix[c->master].second;
|
||||||
return pair_to_vec(ld_to_int(T[0][LDIM]), ld_to_int((spin(60*degree) * T)[0][LDIM]));
|
return {ld_to_int(T[0][LDIM]), ld_to_int((spin(60*degree) * T)[0][LDIM])};
|
||||||
}
|
}
|
||||||
|
|
||||||
EX cdata *arcmCdata(cell *c) {
|
EX cdata *arcmCdata(cell *c) {
|
||||||
@ -911,7 +872,7 @@ EX cdata *arcmCdata(cell *c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX int getCdata(cell *c, int j) {
|
EX int getCdata(cell *c, int j) {
|
||||||
if(masterless) return getEuclidCdata(decodeId(c->master))->val[j];
|
if(euclid) return getEuclidCdata(euc2_coordinates(c))->val[j];
|
||||||
else if(archimedean && euclid)
|
else if(archimedean && euclid)
|
||||||
return getEuclidCdata(pseudocoords(c))->val[j];
|
return getEuclidCdata(pseudocoords(c))->val[j];
|
||||||
else if(archimedean && hyperbolic)
|
else if(archimedean && hyperbolic)
|
||||||
@ -928,7 +889,7 @@ EX int getCdata(cell *c, int j) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX int getBits(cell *c) {
|
EX int getBits(cell *c) {
|
||||||
if(masterless) return getEuclidCdata(decodeId(c->master))->bits;
|
if(euclid) return getEuclidCdata(euc2_coordinates(c))->bits;
|
||||||
else if(archimedean && euclid)
|
else if(archimedean && euclid)
|
||||||
return getEuclidCdata(pseudocoords(c))->bits;
|
return getEuclidCdata(pseudocoords(c))->bits;
|
||||||
else if(archimedean && (hyperbolic || sl2))
|
else if(archimedean && (hyperbolic || sl2))
|
||||||
@ -1034,15 +995,6 @@ EX int celldistance(cell *c1, cell *c2) {
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((masterless) && (euclid6 || (euclid4 && PURE))) {
|
|
||||||
if(!euwrap)
|
|
||||||
return eudist(decodeId(c1->master) - decodeId(c2->master)); // fix cylinder
|
|
||||||
else if(euwrap && torusconfig::torus_mode == 0)
|
|
||||||
return get_torus_dist(torusconfig::vec_to_id(decodeId(c1->master)-decodeId(c2->master)));
|
|
||||||
else if(euwrap && !fulltorus)
|
|
||||||
return torusconfig::cyldist(decodeId(c1->master), decodeId(c2->master));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CAP_FIELD
|
#if CAP_FIELD
|
||||||
if(geometry == gFieldQuotient && !GOLDBERG)
|
if(geometry == gFieldQuotient && !GOLDBERG)
|
||||||
return currfp.getdist(fieldpattern::fieldval(c1), fieldpattern::fieldval(c2));
|
return currfp.getdist(fieldpattern::fieldval(c1), fieldpattern::fieldval(c2));
|
||||||
@ -1074,7 +1026,7 @@ EX int celldistance(cell *c1, cell *c2) {
|
|||||||
if(cryst) return crystal::precise_distance(c1, c2);
|
if(cryst) return crystal::precise_distance(c1, c2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(masterless || archimedean || quotient || solnih || (penrose && euclid) || experimental || sl2 || nil) {
|
if(archimedean || quotient || solnih || (penrose && euclid) || experimental || sl2 || nil) {
|
||||||
|
|
||||||
if(saved_distances.count(make_pair(c1,c2)))
|
if(saved_distances.count(make_pair(c1,c2)))
|
||||||
return saved_distances[make_pair(c1,c2)];
|
return saved_distances[make_pair(c1,c2)];
|
||||||
@ -1100,7 +1052,7 @@ EX int celldistance(cell *c1, cell *c2) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
if(euclid && WDIM == 3)
|
if(euclid && !penrose && !archimedean)
|
||||||
return euclid3::celldistance(c1, c2);
|
return euclid3::celldistance(c1, c2);
|
||||||
|
|
||||||
if(hyperbolic && WDIM == 3) return reg3::celldistance(c1, c2);
|
if(hyperbolic && WDIM == 3) return reg3::celldistance(c1, c2);
|
||||||
|
@ -1684,7 +1684,7 @@ void celldrawer::bookkeeping() {
|
|||||||
transmatrix& gm = gmatrix[c];
|
transmatrix& gm = gmatrix[c];
|
||||||
orig =
|
orig =
|
||||||
gm[LDIM][LDIM] == 0 ? true :
|
gm[LDIM][LDIM] == 0 ? true :
|
||||||
euwrap ? hdist0(tC0(gm)) >= hdist0(tC0(V)) :
|
euclid ? hdist0(tC0(gm)) >= hdist0(tC0(V)) :
|
||||||
(nil||sol) ? sqhypot_d(3, tC0(gm)) >= sqhypot_d(3, tC0(V)) :
|
(nil||sol) ? sqhypot_d(3, tC0(gm)) >= sqhypot_d(3, tC0(V)) :
|
||||||
sphereflipped() ? fabs(gm[LDIM][LDIM]-1) <= fabs(V[LDIM][LDIM]-1) :
|
sphereflipped() ? fabs(gm[LDIM][LDIM]-1) <= fabs(V[LDIM][LDIM]-1) :
|
||||||
fabs(gm[LDIM][LDIM]-1) >= fabs(V[LDIM][LDIM]-1) - 1e-8;
|
fabs(gm[LDIM][LDIM]-1) >= fabs(V[LDIM][LDIM]-1) - 1e-8;
|
||||||
@ -1776,20 +1776,9 @@ void celldrawer::draw_cellstat() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cmode & sm::TORUSCONFIG) {
|
if(cmode & sm::TORUSCONFIG) {
|
||||||
using namespace torusconfig;
|
auto p = coord_display(V, c);
|
||||||
string label;
|
if(p.second != "")
|
||||||
bool small;
|
queuestr(V, p.first ? .2 : .6, p.second, p.first ? 0xFFFFFFD0 : 0xFFFF0040, 1);
|
||||||
if(tmflags() & TF_SINGLE) {
|
|
||||||
int cd = torus_cx * dx + torus_cy * newdy;
|
|
||||||
cd %= newqty; if(cd<0) cd += newqty;
|
|
||||||
label = its(cd);
|
|
||||||
small = cd;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
small = true;
|
|
||||||
label = its(torus_cx) + "," + its(torus_cy);
|
|
||||||
}
|
|
||||||
queuestr(V, small ? .2 : .6, label, small ? 0xFFFFFFD0 : 0xFFFF0040, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_EDIT
|
#if CAP_EDIT
|
||||||
@ -2507,7 +2496,7 @@ void celldrawer::set_towerfloor(const cellfunction& cf) {
|
|||||||
}
|
}
|
||||||
int j = -1;
|
int j = -1;
|
||||||
|
|
||||||
if(masterless) j = 10;
|
if(euclid) j = 10;
|
||||||
else if(cf(c) > 1) {
|
else if(cf(c) > 1) {
|
||||||
int i = towerval(c, cf);
|
int i = towerval(c, cf);
|
||||||
if(i == 4) j = 0;
|
if(i == 4) j = 0;
|
||||||
@ -2532,7 +2521,7 @@ void celldrawer::set_towerfloor(const cellfunction& cf) {
|
|||||||
|
|
||||||
void celldrawer::set_zebrafloor() {
|
void celldrawer::set_zebrafloor() {
|
||||||
|
|
||||||
if(masterless) { set_floor(cgi.shTower[10]); return; }
|
if(euclid) { set_floor(cgi.shTower[10]); return; }
|
||||||
if(weirdhyperbolic) {
|
if(weirdhyperbolic) {
|
||||||
set_floor(cgi.shFloor); return;
|
set_floor(cgi.shFloor); return;
|
||||||
}
|
}
|
||||||
@ -2589,7 +2578,7 @@ void celldrawer::set_reptile_floor(const transmatrix& V, color_t col, bool nodet
|
|||||||
if(euclid6) j = 0;
|
if(euclid6) j = 0;
|
||||||
|
|
||||||
transmatrix D = applyPatterndir(c, si);
|
transmatrix D = applyPatterndir(c, si);
|
||||||
|
if(euclid6 && GOLDBERG) D = ddspin(c, si.dir);
|
||||||
if(wmescher && (stdhyperbolic || euclid6))
|
if(wmescher && (stdhyperbolic || euclid6))
|
||||||
set_floor(D, cgi.shReptile[j][0]);
|
set_floor(D, cgi.shReptile[j][0]);
|
||||||
else set_maywarp_floor();
|
else set_maywarp_floor();
|
||||||
@ -2631,7 +2620,7 @@ void celldrawer::set_reptile_floor(const transmatrix& V, color_t col, bool nodet
|
|||||||
}
|
}
|
||||||
|
|
||||||
void celldrawer::set_emeraldfloor() {
|
void celldrawer::set_emeraldfloor() {
|
||||||
if(!masterless && BITRUNCATED && GDIM == 2) {
|
if(!euclid && BITRUNCATED && GDIM == 2) {
|
||||||
auto si = patterns::getpatterninfo(c, patterns::PAT_EMERALD, patterns::SPF_SYM0123);
|
auto si = patterns::getpatterninfo(c, patterns::PAT_EMERALD, patterns::SPF_SYM0123);
|
||||||
|
|
||||||
int j = -1;
|
int j = -1;
|
||||||
|
@ -532,7 +532,7 @@ EX geometryinfo1 giSL2 = { gcSL2, 3, 3, 4, {1,1,-1,-1} };
|
|||||||
/** list of available geometries */
|
/** list of available geometries */
|
||||||
vector<geometryinfo> ginf = {
|
vector<geometryinfo> ginf = {
|
||||||
{"{7,3}", "none", "{7,3} (standard HyperRogue map)", "HR", 7, 3, 0, giHyperb2, 0, {{7, 5}}, eVariation::bitruncated},
|
{"{7,3}", "none", "{7,3} (standard HyperRogue map)", "HR", 7, 3, 0, giHyperb2, 0, {{7, 5}}, eVariation::bitruncated},
|
||||||
{"{6,3}", "none", "{6,3} (euclidean Hex grid)", "euclid", 6, 3, 0, giEuclid2, 0, {{7, FORBIDDEN}}, eVariation::bitruncated},
|
{"{6,3}", "none", "{6,3} (euclidean Hex grid)", "euclid", 6, 3, 0, giEuclid2, 0, {{7, 7}}, eVariation::bitruncated},
|
||||||
{"{5,3}", "none", "{5,3} (dodecahedron)", "sphere", 5, 3, qsSMALLB, giSphere2, 0, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated},
|
{"{5,3}", "none", "{5,3} (dodecahedron)", "sphere", 5, 3, qsSMALLB, giSphere2, 0, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated},
|
||||||
{"{5,3}", "elliptic", "elliptic geometry in {5,3}", "elliptic", 5, 3, qsNONORE, giSphere2, 0, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated},
|
{"{5,3}", "elliptic", "elliptic geometry in {5,3}", "elliptic", 5, 3, qsNONORE, giSphere2, 0, {{SEE_ALL, SEE_ALL}}, eVariation::bitruncated},
|
||||||
{"{7,3}", "Zebra", "Zebra quotient", "Zebra", 7, 3, qsZEBRA, giHyperb2, 0x00400, {{7, 5}}, eVariation::bitruncated},
|
{"{7,3}", "Zebra", "Zebra quotient", "Zebra", 7, 3, qsZEBRA, giHyperb2, 0x00400, {{7, 5}}, eVariation::bitruncated},
|
||||||
|
@ -280,7 +280,6 @@ static const flagtype qHUGE_BOUNDED = 262144;
|
|||||||
|
|
||||||
// note: dnext assumes that x&7 equals 7
|
// note: dnext assumes that x&7 equals 7
|
||||||
static const int SEE_ALL = 50;
|
static const int SEE_ALL = 50;
|
||||||
static const int FORBIDDEN = -1;
|
|
||||||
|
|
||||||
extern eGeometry geometry;
|
extern eGeometry geometry;
|
||||||
extern eVariation variation;
|
extern eVariation variation;
|
||||||
|
18
complex.cpp
18
complex.cpp
@ -15,9 +15,9 @@ EX namespace whirlwind {
|
|||||||
EX int fzebra3(cell *c) {
|
EX int fzebra3(cell *c) {
|
||||||
if(archimedean) return 0;
|
if(archimedean) return 0;
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
if(fulltorus) return 0;
|
if(bounded) return 0;
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
return 1+((((signed short)(y)+int(50000))/3)%3);
|
return 1+((((signed short)(y)+int(50000))/3)%3);
|
||||||
}
|
}
|
||||||
if(S7 == 5) return getHemisphere(c, 0) > 0 ? 1 : 2;
|
if(S7 == 5) return getHemisphere(c, 0) > 0 ? 1 : 2;
|
||||||
@ -571,7 +571,7 @@ struct info {
|
|||||||
|
|
||||||
EX int dist(cell *c) {
|
EX int dist(cell *c) {
|
||||||
if(c->land != laPalace && c->land != laDungeon) return OUT_OF_PALACE;
|
if(c->land != laPalace && c->land != laDungeon) return OUT_OF_PALACE;
|
||||||
else if(quotient || sphere || fulltorus) return OUT_OF_PRISON;
|
else if(quotient || sphere) return OUT_OF_PRISON;
|
||||||
else if(euclid) return celldistAlt(c);
|
else if(euclid) return celldistAlt(c);
|
||||||
else if(!c->master->alt) return OUT_OF_PRISON;
|
else if(!c->master->alt) return OUT_OF_PRISON;
|
||||||
else return celldistAlt(c);
|
else return celldistAlt(c);
|
||||||
@ -866,12 +866,12 @@ EX namespace clearing {
|
|||||||
if(quotient) return;
|
if(quotient) return;
|
||||||
|
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
if(euwrap) return; // fix cylinder
|
if(quotient) return; // fix cylinder
|
||||||
if(pseudohept(c)) return;
|
if(pseudohept(c)) return;
|
||||||
c->monst = moMutant;
|
c->monst = moMutant;
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
|
|
||||||
int xco = x * 2 + y + 1;
|
int xco = x * 2 + y + 1;
|
||||||
c->stuntime = (8-xco/2) & 15;
|
c->stuntime = (8-xco/2) & 15;
|
||||||
@ -2978,12 +2978,12 @@ EX namespace prairie {
|
|||||||
if(chaosmode) {
|
if(chaosmode) {
|
||||||
c->LHU.fi.rval = 0;
|
c->LHU.fi.rval = 0;
|
||||||
}
|
}
|
||||||
else if(euwrap) { // fix cylinder
|
else if(quotient) { // fix cylinder
|
||||||
c->LHU.fi.rval = 0;
|
c->LHU.fi.rval = 0;
|
||||||
}
|
}
|
||||||
else if(euclid) {
|
else if(euclid) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
c->LHU.fi.rval = (y&15);
|
c->LHU.fi.rval = (y&15);
|
||||||
}
|
}
|
||||||
else if(sphere) {
|
else if(sphere) {
|
||||||
@ -3759,9 +3759,9 @@ EX namespace dungeon {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
if(euwrap) return;
|
if(quotient) return;
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x, y) = cell_to_pair(c);
|
tie(x, y) = euc2_coordinates(c);
|
||||||
string tab6[] = {
|
string tab6[] = {
|
||||||
".####...",
|
".####...",
|
||||||
"L...L...",
|
"L...L...",
|
||||||
|
12
crystal.cpp
12
crystal.cpp
@ -638,21 +638,13 @@ EX color_t colorize(cell *c, char whichCanvas) {
|
|||||||
co = told(reg3::decode_coord(c->master->fieldval)), dim = 4;
|
co = told(reg3::decode_coord(c->master->fieldval)), dim = 4;
|
||||||
for(int a=0; a<4; a++) if(co[a] > 4) co[a] -= 8;
|
for(int a=0; a<4; a++) if(co[a] > 4) co[a] -= 8;
|
||||||
}
|
}
|
||||||
else if(euclid && WDIM == 3) {
|
#endif
|
||||||
|
else if(euclid) {
|
||||||
auto tab = euclid3::getcoord(euclid3::get_ispacemap()[c->master]);
|
auto tab = euclid3::getcoord(euclid3::get_ispacemap()[c->master]);
|
||||||
for(int a=0; a<3; a++) co[a] = tab[a];
|
for(int a=0; a<3; a++) co[a] = tab[a];
|
||||||
if(PURE) for(int a=0; a<3; a++) co[a] *= 2;
|
if(PURE) for(int a=0; a<3; a++) co[a] *= 2;
|
||||||
dim = 3;
|
dim = 3;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
else if(masterless && !quotient) {
|
|
||||||
dim = 2;
|
|
||||||
tie(co[0], co[1]) = vec_to_pair(decodeId(c->master));
|
|
||||||
if(PURE) {
|
|
||||||
co[0] *= 2;
|
|
||||||
co[1] *= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
color_t res = 0;
|
color_t res = 0;
|
||||||
coord ico = roundcoord(co);
|
coord ico = roundcoord(co);
|
||||||
|
980
euclid.cpp
980
euclid.cpp
File diff suppressed because it is too large
Load Diff
@ -179,7 +179,7 @@ void generate_matrices_scale(ld scale, int noft) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
generate_matrices(hex_matrices, ohex, msh(geometry, S6, cgi.hexvdist, cgi.hexhexdist, cgi.hcrossf, (S3-3)*M_PI/S3, scale));
|
generate_matrices(hex_matrices, ohex, msh(geometry, S6, cgi.hexvdist, cgi.hexhexdist, cgi.hcrossf, (S3-3)*M_PI/S3, scale));
|
||||||
generate_matrices(hept_matrices, ohept, msh(geometry, S7, cgi.rhexf, cgi.hcrossf, cgi.hcrossf, euclid6?0:euclid4?0:M_PI/S7, scale));
|
generate_matrices(hept_matrices, ohept, msh(geometry, S7, cgi.rhexf, cgi.hcrossf, cgi.hcrossf, M_PI/S7, scale));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,7 +333,7 @@ void geometry_information::generate_floorshapes_for(int id, cell *c, int siid, i
|
|||||||
|
|
||||||
for(int k=0; k<SIDEPARS; k++) sizeto(fsh.side[k], id);
|
for(int k=0; k<SIDEPARS; k++) sizeto(fsh.side[k], id);
|
||||||
|
|
||||||
int td = ((PURE || euclid) && !(S7&1)) ? S42+S6 : 0;
|
int td = (PURE && !(S7&1)) ? S42+S6 : 0;
|
||||||
if(&fsh == &shBigHepta) td += S6;
|
if(&fsh == &shBigHepta) td += S6;
|
||||||
|
|
||||||
int b = 0;
|
int b = 0;
|
||||||
@ -846,7 +846,7 @@ EX struct dqi_poly *draw_shapevec(cell *c, const transmatrix& V, const vector<hp
|
|||||||
return &queuepolyat(V, shv[arcm::id_of(c->master)], col, prio);
|
return &queuepolyat(V, shv[arcm::id_of(c->master)], col, prio);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if((euclid || GOLDBERG) && ishex1(c) && !penrose)
|
else if(GOLDBERG && ishex1(c))
|
||||||
return &queuepolyat(V * pispin, shv[0], col, prio);
|
return &queuepolyat(V * pispin, shv[0], col, prio);
|
||||||
else if(!(S7&1) && PURE && !penrose && !a4) {
|
else if(!(S7&1) && PURE && !penrose && !a4) {
|
||||||
auto si = patterns::getpatterninfo(c, patterns::PAT_COLORING, 0);
|
auto si = patterns::getpatterninfo(c, patterns::PAT_COLORING, 0);
|
||||||
@ -888,6 +888,7 @@ EX void viewmat() {
|
|||||||
for(int i=0; i<cwt.at->type; i++) {
|
for(int i=0; i<cwt.at->type; i++) {
|
||||||
hyperpoint ci = V * get_corner_position(cwt.at, i);
|
hyperpoint ci = V * get_corner_position(cwt.at, i);
|
||||||
hyperpoint ci1 = V * get_corner_position(cwt.at, (i+1) % cwt.at->type);
|
hyperpoint ci1 = V * get_corner_position(cwt.at, (i+1) % cwt.at->type);
|
||||||
|
|
||||||
hyperpoint cn = V * nearcorner(cwt.at, i);
|
hyperpoint cn = V * nearcorner(cwt.at, i);
|
||||||
hyperpoint cf0 = V * farcorner(cwt.at, i, 0);
|
hyperpoint cf0 = V * farcorner(cwt.at, i, 0);
|
||||||
hyperpoint cf1 = V * farcorner(cwt.at, i, 1);
|
hyperpoint cf1 = V * farcorner(cwt.at, i, 1);
|
||||||
@ -895,7 +896,7 @@ EX void viewmat() {
|
|||||||
if(vid.grid)
|
if(vid.grid)
|
||||||
queuestr(cn, 20, its(i), 0x00FF00, 1);
|
queuestr(cn, 20, its(i), 0x00FF00, 1);
|
||||||
else
|
else
|
||||||
queuestr(gmatrix[cwt.at->move(i)] * C0, 20, its(i), 0x00FFFF, 1);
|
queuestr(V * currentmap->adj(cwt.at, i) * C0, 20, its(i), 0x00FFFF, 1);
|
||||||
queueline(V * C0, ci, 0xFFFFFFFF, 3);
|
queueline(V * C0, ci, 0xFFFFFFFF, 3);
|
||||||
queueline(ci, ci1, 0xFFFF00FF, 3);
|
queueline(ci, ci1, 0xFFFF00FF, 3);
|
||||||
queueline(ci, cn, 0xFF00FFFF, 3);
|
queueline(ci, cn, 0xFF00FFFF, 3);
|
||||||
|
226
geom-exp.cpp
226
geom-exp.cpp
@ -109,180 +109,6 @@ void showQuotientConfig() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool torus_bitrunc;
|
|
||||||
|
|
||||||
void prepare_torusconfig() {
|
|
||||||
torusconfig::newdy = torusconfig::dy;
|
|
||||||
torusconfig::newqty = torusconfig::qty;
|
|
||||||
torusconfig::newsdx = torusconfig::sdx;
|
|
||||||
torusconfig::newsdy = torusconfig::sdy;
|
|
||||||
torusconfig::newmode = torusconfig::torus_mode;
|
|
||||||
torus_bitrunc = PURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void showTorusConfig() {
|
|
||||||
cmode = sm::SIDE | sm::MAYDARK;
|
|
||||||
if(euclid) cmode |= sm::TORUSCONFIG;
|
|
||||||
gamescreen(2);
|
|
||||||
|
|
||||||
dialog::init(XLAT("advanced configuration"));
|
|
||||||
|
|
||||||
auto& mode = torusconfig::tmodes[torusconfig::newmode];
|
|
||||||
|
|
||||||
for(int i=0; i<isize(torusconfig::tmodes); i++) {
|
|
||||||
char let = "0123456789!@#" [i];
|
|
||||||
dialog::addBoolItem(torusconfig::tmodes[i].name, torusconfig::newmode == i, let);
|
|
||||||
dialog::add_action([i] () { torusconfig::newmode = torusconfig::eTorusMode(i); });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool single = (mode.flags & torusconfig::TF_SINGLE);
|
|
||||||
bool square = (mode.flags & torusconfig::TF_SQUARE);
|
|
||||||
bool simple = (mode.flags & torusconfig::TF_SIMPLE);
|
|
||||||
bool cyl = (mode.flags & torusconfig::TF_CYL);
|
|
||||||
bool klein = (mode.flags & torusconfig::TF_KLEIN);
|
|
||||||
|
|
||||||
if(single) {
|
|
||||||
dialog::addSelItem(XLAT("number of cells (n)"), its(torusconfig::newqty), 'n');
|
|
||||||
if(mode.flags & torusconfig::TF_HEX)
|
|
||||||
dialog::addSelItem(XLAT("cell bottom-right from 0 (d)"), its(torusconfig::newdy), 'd');
|
|
||||||
else
|
|
||||||
dialog::addSelItem(XLAT("cell below 0 (d)"), its(torusconfig::newdy), 'd');
|
|
||||||
}
|
|
||||||
else if(cyl) {
|
|
||||||
dialog::addSelItem(XLAT("period (x)"), its(torusconfig::newsdx), 'x');
|
|
||||||
dialog::addSelItem(XLAT("period (y)"), its(torusconfig::newsdy), 'y');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(torusconfig::newsdx < 1) torusconfig::newsdx = 1;
|
|
||||||
if(torusconfig::newsdy < 1) torusconfig::newsdy = 1;
|
|
||||||
dialog::addSelItem(XLAT("width (x)"), its(torusconfig::newsdx), 'x');
|
|
||||||
dialog::addSelItem(XLAT("height (y)"), its(torusconfig::newsdy), 'y');
|
|
||||||
}
|
|
||||||
|
|
||||||
if(square) dialog::addBoolItem(XLAT("bitruncated"), torus_bitrunc, 't');
|
|
||||||
else dialog::addInfo("", 100);
|
|
||||||
|
|
||||||
int valid = 2;
|
|
||||||
|
|
||||||
int adx = torusconfig::newsdx, ady = torusconfig::newsdy;
|
|
||||||
if(single) {
|
|
||||||
if(square) {
|
|
||||||
dialog::addInfo("this mode has bad patterns", 0x808080), valid = 1;
|
|
||||||
if(torus_bitrunc && valid == 1 && (torusconfig::newqty%2 || torusconfig::newdy % 2 == 0))
|
|
||||||
dialog::addInfo("incompatible with bitruncating", 0x808080), valid = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(torusconfig::newqty % 3)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "n", "3"), 0x808080), valid = 1;
|
|
||||||
if((torusconfig::newdy + 999999) % 3 != 2)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "d+1", "3"), 0x808080), valid = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(cyl) {
|
|
||||||
if(torusconfig::sdx == 0 && torusconfig::sdy == 0)
|
|
||||||
dialog::addInfo(XLAT("period cannot be 0"), 0x800000), valid = 0;
|
|
||||||
else if(square) {
|
|
||||||
if(torusconfig::newsdy & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "y", "2"), 0x808080), valid = 1;
|
|
||||||
if(torusconfig::newsdx & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "x", "2"), 0x808080), valid = 1;
|
|
||||||
if(torus_bitrunc && valid == 1)
|
|
||||||
dialog::addInfo("incompatible with bitruncating", 0x808080), valid = 0;
|
|
||||||
if(klein && !torusconfig::mobius_symmetric(square, adx, ady))
|
|
||||||
dialog::addInfo("Möbius band requires a symmetric period", 0x800000), valid = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(torusconfig::newsdy % 3)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "y", "3"), 0x808080), valid = 1;
|
|
||||||
if(torusconfig::newsdx % 3)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "x", "3"), 0x808080), valid = 1;
|
|
||||||
if(klein && !torusconfig::mobius_symmetric(square, adx, ady))
|
|
||||||
dialog::addInfo("Möbius band requires a symmetric period", 0x800000), valid = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(square) {
|
|
||||||
if(torusconfig::newsdx & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "x", "2"), 0x808080), valid = 1;
|
|
||||||
if(torusconfig::newsdy & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "y", "2"), 0x808080), valid = 1;
|
|
||||||
if(torus_bitrunc && valid == 1)
|
|
||||||
dialog::addInfo("incompatible with bitruncating", 0x808080), valid = 0;
|
|
||||||
}
|
|
||||||
else if(simple) {
|
|
||||||
if(torusconfig::newsdx % 3)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "x", "3"), 0x808080), valid = 1;
|
|
||||||
if(torusconfig::newsdy % 3)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "y", "3"), 0x808080), valid = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(torusconfig::newsdx & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "x", "3"), 0x808080), valid = 1;
|
|
||||||
if(torusconfig::newsdy & 1)
|
|
||||||
dialog::addInfo(XLAT("best if %1 is divisible by %2", "y", "2"), 0x808080), valid = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(cyl) {
|
|
||||||
if(!(square && klein)) {
|
|
||||||
dialog::addBoolItem(XLAT("set y=-2x for Crossroads"), ady == -2 * adx, 'C');
|
|
||||||
dialog::add_action([] () { torusconfig::newsdy = -2 * torusconfig::newsdx; });
|
|
||||||
}
|
|
||||||
dialog::addBoolItem(XLAT("set y=0 for Crossroads IV and Chaos Mode"), ady == 0, 'D');
|
|
||||||
dialog::add_action([] () { torusconfig::newsdy = 0; });
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("scale factor"), fts(vid.scale), 'z');
|
|
||||||
|
|
||||||
#if CAP_RUG
|
|
||||||
if(GDIM == 2) dialog::addBoolItem(XLAT("hypersian rug mode"), (rug::rugged), 'u');
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dialog::addItem("activate", 'a');
|
|
||||||
dialog::addItem("default", 'c');
|
|
||||||
|
|
||||||
keyhandler = [=] (int sym, int uni) {
|
|
||||||
dialog::handleNavigation(sym, uni);
|
|
||||||
if(uni == 'n' && single)
|
|
||||||
dialog::editNumber(torusconfig::newqty, 0, 1000, 3, torusconfig::def_qty, XLAT("number of cells (n)"), "");
|
|
||||||
else if(uni == 'd' && single)
|
|
||||||
dialog::editNumber(torusconfig::newdy, -1000, 1000, 3, -torusconfig::def_dy, XLAT("cell below 0 (d)"), "");
|
|
||||||
else if(uni == 'x' && !single)
|
|
||||||
dialog::editNumber(torusconfig::newsdx, 0, 1000, square ? 2 : 3, 12, XLAT("width (x)"), "");
|
|
||||||
else if(uni == 'y' && !single)
|
|
||||||
dialog::editNumber(torusconfig::newsdy, 0, 1000, square ? 2 : simple ? 3 : 2, 12, XLAT("height (y)"), "");
|
|
||||||
else if(uni == 't')
|
|
||||||
torus_bitrunc = !torus_bitrunc;
|
|
||||||
else if((uni == 'a' || uni == '\n') && valid) dialog::do_if_confirmed([square] {
|
|
||||||
set_geometry(gNormal);
|
|
||||||
torusconfig::torus_mode = torusconfig::newmode;
|
|
||||||
torusconfig::qty = torusconfig::newqty;
|
|
||||||
torusconfig::dy = torusconfig::newdy;
|
|
||||||
torusconfig::sdx = torusconfig::newsdx;
|
|
||||||
torusconfig::sdy = torusconfig::newsdy;
|
|
||||||
torusconfig::activate();
|
|
||||||
set_geometry(gTorus);
|
|
||||||
set_variation((torus_bitrunc || !square) ? eVariation::bitruncated : eVariation::pure);
|
|
||||||
start_game();
|
|
||||||
});
|
|
||||||
else if(uni == 'c') dialog::do_if_confirmed([] {
|
|
||||||
set_geometry(gEuclid);
|
|
||||||
torusconfig::torus_mode = torusconfig::tmSingle;
|
|
||||||
torusconfig::qty = torusconfig::def_qty;
|
|
||||||
torusconfig::dy = torusconfig::def_dy;
|
|
||||||
set_geometry(gTorus);
|
|
||||||
start_game();
|
|
||||||
});
|
|
||||||
else if(uni == 'z') editScale();
|
|
||||||
#if CAP_RUG
|
|
||||||
else if(uni == 'u' && GDIM == 2) rug::select();
|
|
||||||
#endif
|
|
||||||
else if(doexiton(sym, uni))
|
|
||||||
popScreen();
|
|
||||||
};
|
|
||||||
|
|
||||||
dialog::display();
|
|
||||||
}
|
|
||||||
|
|
||||||
EX string bitruncnames[5] = {" (b)", " (n)", " (g)", " (i)", " (d)"};
|
EX string bitruncnames[5] = {" (b)", " (n)", " (g)", " (i)", " (d)"};
|
||||||
|
|
||||||
void validity_info() {
|
void validity_info() {
|
||||||
@ -449,8 +275,6 @@ void set_or_configure_geometry(eGeometry g) {
|
|||||||
else if(g == gArchimedean)
|
else if(g == gArchimedean)
|
||||||
pushScreen(arcm::show);
|
pushScreen(arcm::show);
|
||||||
#endif
|
#endif
|
||||||
else if(g == gTorus)
|
|
||||||
pushScreen(showTorusConfig);
|
|
||||||
else {
|
else {
|
||||||
if(among(g, gProduct, gRotSpace)) {
|
if(among(g, gProduct, gRotSpace)) {
|
||||||
if(WDIM == 3 || euclid) {
|
if(WDIM == 3 || euclid) {
|
||||||
@ -623,11 +447,7 @@ EX void select_quotient_screen() {
|
|||||||
"no quotient",
|
"no quotient",
|
||||||
g == geometry, key++);
|
g == geometry, key++);
|
||||||
dialog::add_action([g] {
|
dialog::add_action([g] {
|
||||||
if(g == gTorus) {
|
if(g == gFieldQuotient)
|
||||||
prepare_torusconfig();
|
|
||||||
pushScreen(showTorusConfig);
|
|
||||||
}
|
|
||||||
else if(g == gFieldQuotient)
|
|
||||||
pushScreen(showQuotientConfig);
|
pushScreen(showQuotientConfig);
|
||||||
else {
|
else {
|
||||||
dual::may_split_or_do([g] { set_geometry(g); });
|
dual::may_split_or_do([g] { set_geometry(g); });
|
||||||
@ -642,7 +462,7 @@ EX void select_quotient_screen() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX void select_quotient() {
|
EX void select_quotient() {
|
||||||
if(euclid && WDIM == 3) {
|
if(euclid && !penrose && !archimedean) {
|
||||||
euclid3::prepare_torus3();
|
euclid3::prepare_torus3();
|
||||||
pushScreen(euclid3::show_torus3);
|
pushScreen(euclid3::show_torus3);
|
||||||
}
|
}
|
||||||
@ -668,10 +488,6 @@ EX void select_quotient() {
|
|||||||
println(hlog, "csteps = ", cgi.steps);
|
println(hlog, "csteps = ", cgi.steps);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if(euclid && !archimedean) {
|
|
||||||
prepare_torusconfig();
|
|
||||||
pushScreen(showTorusConfig);
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
vector<eGeometry> choices;
|
vector<eGeometry> choices;
|
||||||
for(int i=0; i<isize(ginf); i++) if(same_tiling(eGeometry(i))) choices.push_back(eGeometry(i));
|
for(int i=0; i<isize(ginf); i++) if(same_tiling(eGeometry(i))) choices.push_back(eGeometry(i));
|
||||||
@ -773,6 +589,7 @@ EX void showEuclideanMenu() {
|
|||||||
denom /= g;
|
denom /= g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
if(fulltorus) {
|
if(fulltorus) {
|
||||||
using namespace torusconfig;
|
using namespace torusconfig;
|
||||||
auto& mode = tmodes[torus_mode];
|
auto& mode = tmodes[torus_mode];
|
||||||
@ -780,8 +597,10 @@ EX void showEuclideanMenu() {
|
|||||||
worldsize = qty;
|
worldsize = qty;
|
||||||
else
|
else
|
||||||
worldsize = sdx * sdy;
|
worldsize = sdx * sdy;
|
||||||
|
worldsize = 0;
|
||||||
}
|
}
|
||||||
else worldsize = denom ? nom / denom : 0;
|
else TODO */
|
||||||
|
worldsize = denom ? nom / denom : 0;
|
||||||
|
|
||||||
if(euler < 0 && !bounded)
|
if(euler < 0 && !bounded)
|
||||||
worldsize = -worldsize;
|
worldsize = -worldsize;
|
||||||
@ -853,8 +672,6 @@ EX void showEuclideanMenu() {
|
|||||||
else if(hybri) {
|
else if(hybri) {
|
||||||
dialog::addSelItem(XLAT("number of levels"), its(cgi.steps / cgi.single_step), 0);
|
dialog::addSelItem(XLAT("number of levels"), its(cgi.steps / cgi.single_step), 0);
|
||||||
}
|
}
|
||||||
else if(ts == 6 && tv == 3)
|
|
||||||
dialog::addSelItem(XLAT("variations"), XLAT("does not matter"), 'v');
|
|
||||||
else if(binarytiling) {
|
else if(binarytiling) {
|
||||||
dialog::addSelItem(XLAT("width"), fts(vid.binary_width), 'v');
|
dialog::addSelItem(XLAT("width"), fts(vid.binary_width), 'v');
|
||||||
dialog::add_action([] {
|
dialog::add_action([] {
|
||||||
@ -1001,7 +818,7 @@ EX void showEuclideanMenu() {
|
|||||||
WDIM == 3 && bounded ? its(isize(currentmap->allcells())) :
|
WDIM == 3 && bounded ? its(isize(currentmap->allcells())) :
|
||||||
WDIM == 3 && euclid ? "∞" :
|
WDIM == 3 && euclid ? "∞" :
|
||||||
worldsize < 0 ? (nom%denom ? its(nom)+"/"+its(denom) : its(-worldsize)) + " exp(∞)":
|
worldsize < 0 ? (nom%denom ? its(nom)+"/"+its(denom) : its(-worldsize)) + " exp(∞)":
|
||||||
(euwrap && !fulltorus) ? "∞" :
|
(euclid && quotient && !bounded) ? "∞" :
|
||||||
worldsize == 0 ? "∞²" :
|
worldsize == 0 ? "∞²" :
|
||||||
its(worldsize),
|
its(worldsize),
|
||||||
'3');
|
'3');
|
||||||
@ -1085,31 +902,6 @@ int read_geom_args() {
|
|||||||
else if(argis("-mineadj")) {
|
else if(argis("-mineadj")) {
|
||||||
shift(); mine_adjacency_rule = argi();
|
shift(); mine_adjacency_rule = argi();
|
||||||
}
|
}
|
||||||
else if(argis("-tpar")) {
|
|
||||||
torusconfig::torus_mode = torusconfig::tmSingle;
|
|
||||||
shift(); sscanf(argcs(), "%d,%d,%d",
|
|
||||||
&torusconfig::qty,
|
|
||||||
&torusconfig::dx,
|
|
||||||
&torusconfig::dy
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if(argis("-tparx")) {
|
|
||||||
shift();
|
|
||||||
int tmode;
|
|
||||||
sscanf(argcs(), "%d,%d,%d", &tmode,
|
|
||||||
&torusconfig::sdx,
|
|
||||||
&torusconfig::sdy
|
|
||||||
);
|
|
||||||
if(tmode < 0 || tmode >= isize(torusconfig::tmodes)) {
|
|
||||||
println(hlog, "bad tmode");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
torusconfig::torus_mode = torusconfig::eTorusMode(tmode);
|
|
||||||
if(torusconfig::tmflags() & torusconfig::TF_SINGLE)
|
|
||||||
torusconfig::qty = torusconfig::sdx,
|
|
||||||
torusconfig::dy = torusconfig::sdy;
|
|
||||||
torusconfig::activate();
|
|
||||||
}
|
|
||||||
TOGGLE('7', PURE, set_variation(PURE ? eVariation::bitruncated : eVariation::pure))
|
TOGGLE('7', PURE, set_variation(PURE ? eVariation::bitruncated : eVariation::pure))
|
||||||
else if(argis("-geo")) {
|
else if(argis("-geo")) {
|
||||||
PHASEFROM(2);
|
PHASEFROM(2);
|
||||||
@ -1143,10 +935,6 @@ int read_geom_args() {
|
|||||||
else if(argis("-d:quotient"))
|
else if(argis("-d:quotient"))
|
||||||
launch_dialog(showQuotientConfig);
|
launch_dialog(showQuotientConfig);
|
||||||
#endif
|
#endif
|
||||||
else if(argis("-d:torus")) {
|
|
||||||
launch_dialog(showTorusConfig);
|
|
||||||
prepare_torusconfig();
|
|
||||||
}
|
|
||||||
else if(argis("-d:geom"))
|
else if(argis("-d:geom"))
|
||||||
launch_dialog(showEuclideanMenu);
|
launch_dialog(showEuclideanMenu);
|
||||||
else return 1;
|
else return 1;
|
||||||
|
45
geometry.cpp
45
geometry.cpp
@ -426,45 +426,6 @@ void geometry_information::prepare_basics() {
|
|||||||
if(archimedean && !prod)
|
if(archimedean && !prod)
|
||||||
ginf[gArchimedean].cclass = gcHyperbolic;
|
ginf[gArchimedean].cclass = gcHyperbolic;
|
||||||
|
|
||||||
if(euclid) {
|
|
||||||
// dynamicval<eGeometry> g(geometry, gNormal);
|
|
||||||
// for(int i=0; i<S84; i++) spinmatrix[i] = spin(i * M_PI / S42);
|
|
||||||
if(a4 && !BITRUNCATED) {
|
|
||||||
crossf = .5;
|
|
||||||
hexf = .5;
|
|
||||||
hcrossf = crossf * sqrt(2) / 2;
|
|
||||||
hexhexdist = crossf;
|
|
||||||
hexvdist = hexf;
|
|
||||||
hepvdist = hexf;
|
|
||||||
rhexf = crossf * sqrt(2) / 2;
|
|
||||||
tessf = crossf;
|
|
||||||
}
|
|
||||||
else if(a4 && BITRUNCATED) {
|
|
||||||
ld s2 = sqrt(2);
|
|
||||||
ld xx = 1 - s2 / 2;
|
|
||||||
crossf = .5;
|
|
||||||
tessf = crossf * s2;
|
|
||||||
hexf = .5 * xx * s2;
|
|
||||||
hcrossf = crossf;
|
|
||||||
hexhexdist = crossf * s2;
|
|
||||||
hexvdist = crossf * hypot(1-xx, xx);
|
|
||||||
hepvdist = crossf;
|
|
||||||
rhexf = hexf;
|
|
||||||
tessf = crossf;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
crossf = .5;
|
|
||||||
tessf = crossf * sqrt(3);
|
|
||||||
hexf = tessf/3;
|
|
||||||
hcrossf = crossf;
|
|
||||||
hexhexdist = crossf;
|
|
||||||
hexvdist = hexf;
|
|
||||||
hepvdist = crossf;
|
|
||||||
rhexf = hexf;
|
|
||||||
}
|
|
||||||
goto finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hybri) {
|
if(hybri) {
|
||||||
auto t = this;
|
auto t = this;
|
||||||
ld d = prod ? 1 : 2;
|
ld d = prod ? 1 : 2;
|
||||||
@ -489,11 +450,11 @@ void geometry_information::prepare_basics() {
|
|||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
tessf = edge_of_triangle_with_angles(S3 >= OINF ? 0 : 2*M_PI/S3, M_PI/S7, M_PI/S7);
|
tessf = euclid ? 1 : edge_of_triangle_with_angles(S3 >= OINF ? 0 : 2*M_PI/S3, M_PI/S7, M_PI/S7);
|
||||||
|
|
||||||
if(elliptic && S7 == 4) tessf = M_PI/2;
|
if(elliptic && S7 == 4) tessf = M_PI/2;
|
||||||
|
|
||||||
hcrossf = edge_of_triangle_with_angles(M_PI/2, M_PI/S7, M_PI/S3);
|
hcrossf = euclid ? (S3 == 3 ? sqrt(3)/3 : sqrt(2)/2) : edge_of_triangle_with_angles(M_PI/2, M_PI/S7, M_PI/S3);
|
||||||
|
|
||||||
crossf = BITRUNCATED ? hcrossf : tessf;
|
crossf = BITRUNCATED ? hcrossf : tessf;
|
||||||
|
|
||||||
@ -510,7 +471,7 @@ void geometry_information::prepare_basics() {
|
|||||||
|
|
||||||
rhexf = BITRUNCATED ? hexf : hcrossf;
|
rhexf = BITRUNCATED ? hexf : hcrossf;
|
||||||
|
|
||||||
if(!euclid && BITRUNCATED && !(S7&1))
|
if(BITRUNCATED && !(S7&1))
|
||||||
hexshift = ALPHA/2 + ALPHA * ((S7-1)/2) + M_PI;
|
hexshift = ALPHA/2 + ALPHA * ((S7-1)/2) + M_PI;
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
|
@ -44,12 +44,12 @@ EX transmatrix master_relative(cell *c, bool get_inverse IS(false)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if(BITRUNCATED && !euclid) {
|
else if(BITRUNCATED) {
|
||||||
for(int d=0; d<S7; d++) if(c->master->c7->move(d) == c)
|
for(int d=0; d<S7; d++) if(c->master->c7->move(d) == c)
|
||||||
return (get_inverse?cgi.invhexmove:cgi.hexmove)[d];
|
return (get_inverse?cgi.invhexmove:cgi.hexmove)[d];
|
||||||
return Id;
|
return Id;
|
||||||
}
|
}
|
||||||
else if(WDIM == 3 || euclid)
|
else if(WDIM == 3)
|
||||||
return Id;
|
return Id;
|
||||||
else
|
else
|
||||||
return pispin * Id;
|
return pispin * Id;
|
||||||
@ -161,16 +161,8 @@ transmatrix hrmap_standard::relative_matrix(heptagon *h2, heptagon *h1, const hy
|
|||||||
|
|
||||||
EX transmatrix &ggmatrix(cell *c) {
|
EX transmatrix &ggmatrix(cell *c) {
|
||||||
transmatrix& t = gmatrix[c];
|
transmatrix& t = gmatrix[c];
|
||||||
if(t[LDIM][LDIM] == 0) {
|
if(t[LDIM][LDIM] == 0)
|
||||||
if(euwrap && centerover && masterless)
|
t = actual_view_transform * View * calc_relative_matrix(c, centerover, C0);
|
||||||
t = calc_relative_matrix(c, centerover, C0);
|
|
||||||
else if(masterless && WDIM == 2) {
|
|
||||||
if(!centerover) centerover = cwt.at;
|
|
||||||
t = actual_view_transform * View * eumove(cell_to_vec(c) - cellwalker_to_vec(cellwalker(centerover)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
t = actual_view_transform * View * calc_relative_matrix(c, centerover, C0);
|
|
||||||
}
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,8 +309,8 @@ EX bool no_easy_spin() {
|
|||||||
|
|
||||||
ld hrmap_standard::spin_angle(cell *c, int d) {
|
ld hrmap_standard::spin_angle(cell *c, int d) {
|
||||||
ld hexshift = 0;
|
ld hexshift = 0;
|
||||||
if(ctof(c) && (S7 % 2 == 0) && BITRUNCATED && !euclid) hexshift = cgi.hexshift + 2*M_PI/S7;
|
if(c == c->master->c7 && (S7 % 2 == 0) && BITRUNCATED) hexshift = cgi.hexshift + 2*M_PI/S7;
|
||||||
else if(cgi.hexshift && ctof(c)) hexshift = cgi.hexshift;
|
else if(cgi.hexshift && c == c->master->c7) hexshift = cgi.hexshift;
|
||||||
if(IRREGULAR) {
|
if(IRREGULAR) {
|
||||||
auto id = irr::cellindex[c];
|
auto id = irr::cellindex[c];
|
||||||
auto& vs = irr::cells[id];
|
auto& vs = irr::cells[id];
|
||||||
@ -326,8 +318,6 @@ ld hrmap_standard::spin_angle(cell *c, int d) {
|
|||||||
auto& p = vs.jpoints[vs.neid[d]];
|
auto& p = vs.jpoints[vs.neid[d]];
|
||||||
return -atan2(p[1], p[0]) - hexshift;
|
return -atan2(p[1], p[0]) - hexshift;
|
||||||
}
|
}
|
||||||
else if(masterless)
|
|
||||||
return - d * 2 * M_PI / c->type - hexshift;
|
|
||||||
else
|
else
|
||||||
return M_PI - d * 2 * M_PI / c->type - hexshift;
|
return M_PI - d * 2 * M_PI / c->type - hexshift;
|
||||||
}
|
}
|
||||||
|
@ -2668,7 +2668,7 @@ EX bool drawMonster(const transmatrix& Vparam, int ct, cell *c, color_t col, col
|
|||||||
// golems, knights, and hyperbugs don't face the player (mondir-controlled)
|
// golems, knights, and hyperbugs don't face the player (mondir-controlled)
|
||||||
// also whatever in the lineview mode, and whatever in the quotient geometry
|
// also whatever in the lineview mode, and whatever in the quotient geometry
|
||||||
|
|
||||||
else if((hasFacing(c) && c->mondir != NODIR) || history::on || quotient || euwrap || dont_face_pc) {
|
else if((hasFacing(c) && c->mondir != NODIR) || history::on || quotient || dont_face_pc) {
|
||||||
if(c->monst == moKrakenH) Vs = Vb, nospins = nospinb;
|
if(c->monst == moKrakenH) Vs = Vb, nospins = nospinb;
|
||||||
if(!nospins && c->mondir < c->type) Vs = Vs * ddspin(c, c->mondir, M_PI);
|
if(!nospins && c->mondir < c->type) Vs = Vs * ddspin(c, c->mondir, M_PI);
|
||||||
if(c->monst == moPair) Vs = Vs * xpush(-.12);
|
if(c->monst == moPair) Vs = Vs * xpush(-.12);
|
||||||
@ -3010,6 +3010,7 @@ EX transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) {
|
|||||||
if(NONSTDVAR || binarytiling) return Id;
|
if(NONSTDVAR || binarytiling) return Id;
|
||||||
transmatrix V = ddspin(c, si.dir, M_PI);
|
transmatrix V = ddspin(c, si.dir, M_PI);
|
||||||
if(si.reflect) V = V * Mirror;
|
if(si.reflect) V = V * Mirror;
|
||||||
|
if(euclid) return V;
|
||||||
return V * iddspin(c, 0, M_PI);
|
return V * iddspin(c, 0, M_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3059,7 +3060,7 @@ EX color_t reptilecolor(cell *c) {
|
|||||||
else {
|
else {
|
||||||
i = zebra40(c);
|
i = zebra40(c);
|
||||||
|
|
||||||
if(!masterless) {
|
if(!euclid) {
|
||||||
if(i >= 4 && i < 16) i = 0;
|
if(i >= 4 && i < 16) i = 0;
|
||||||
else if(i >= 16 && i < 28) i = 1;
|
else if(i >= 16 && i < 28) i = 1;
|
||||||
else if(i >= 28 && i < 40) i = 2;
|
else if(i >= 28 && i < 40) i = 2;
|
||||||
@ -3167,7 +3168,7 @@ EX bool is_nice_dual(cell *c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX bool use_swapped_duals() {
|
EX bool use_swapped_duals() {
|
||||||
return (masterless && !a4) || GOLDBERG;
|
return (euclid && !a4) || GOLDBERG;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_SHAPES
|
#if CAP_SHAPES
|
||||||
@ -4530,7 +4531,7 @@ EX void drawmovestar(double dx, double dy) {
|
|||||||
ld R = sqrt(H[0] * H[0] + H[1] * H[1]);
|
ld R = sqrt(H[0] * H[0] + H[1] * H[1]);
|
||||||
transmatrix Centered = Id;
|
transmatrix Centered = Id;
|
||||||
|
|
||||||
if(masterless)
|
if(euclid)
|
||||||
Centered = eupush(H);
|
Centered = eupush(H);
|
||||||
else if(R > 1e-9) Centered = rgpushxto0(H);
|
else if(R > 1e-9) Centered = rgpushxto0(H);
|
||||||
|
|
||||||
|
19
help.cpp
19
help.cpp
@ -808,13 +808,18 @@ EX void describeMouseover() {
|
|||||||
if(randomPatternsMode)
|
if(randomPatternsMode)
|
||||||
out += " " + describeRPM(c->land);
|
out += " " + describeRPM(c->land);
|
||||||
|
|
||||||
if(masterless && cheater) {
|
if(euclid && cheater && WDIM == 2 && !archimedean && !penrose) {
|
||||||
out += " ("+its(cell_to_vec(c))+")";
|
auto co = euc2_coordinates(c);
|
||||||
if(!fulltorus || torusconfig::torus_mode != torusconfig::tmSingle) {
|
out += " (" + its(co.first);
|
||||||
int x, y;
|
for(int i=1; i<WDIM; i++) out += "," + its(co.second);
|
||||||
tie(x,y) = cell_to_pair(c);
|
out += ")";
|
||||||
out += " ("+its(short(x))+","+its(short(y))+")";
|
}
|
||||||
}
|
|
||||||
|
if(euclid && cheater && WDIM == 3) {
|
||||||
|
auto co = euclid3::getcoord(euclid3::get_ispacemap()[c->master]);
|
||||||
|
out += " (" + its(co[0]);
|
||||||
|
for(int i=1; i<WDIM; i++) out += "," + its(co[i]);
|
||||||
|
out += ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_CRYSTAL
|
#if CAP_CRYSTAL
|
||||||
|
11
hyper.h
11
hyper.h
@ -146,18 +146,12 @@ void addMessage(string s, char spamtype = 0);
|
|||||||
#define nonorientable (cgflags & qNONORIENTABLE)
|
#define nonorientable (cgflags & qNONORIENTABLE)
|
||||||
#define elliptic (cgflags & qELLIPTIC)
|
#define elliptic (cgflags & qELLIPTIC)
|
||||||
#define quotient (cgflags & qANYQ)
|
#define quotient (cgflags & qANYQ)
|
||||||
#define euwrap (quotient && euclid)
|
|
||||||
#define fulltorus (bounded && euclid)
|
|
||||||
#define smallbounded (cgflags & qSMALL)
|
#define smallbounded (cgflags & qSMALL)
|
||||||
#define bounded (cgflags & qBOUNDED)
|
#define bounded (cgflags & qBOUNDED)
|
||||||
|
|
||||||
// Dry Forest burning, heat transfer, etc. are performed on the whole universe
|
// Dry Forest burning, heat transfer, etc. are performed on the whole universe
|
||||||
#define doall (bounded)
|
#define doall (bounded)
|
||||||
|
|
||||||
// These geometries are generated without the heptagon structure.
|
|
||||||
// 'master' holds the coordinates
|
|
||||||
#define masterless among(geometry, gEuclid, gEuclidSquare, gTorus)
|
|
||||||
|
|
||||||
#define sphere_narcm (sphere && !archimedean)
|
#define sphere_narcm (sphere && !archimedean)
|
||||||
|
|
||||||
#define a4 (S3 == 4)
|
#define a4 (S3 == 4)
|
||||||
@ -171,8 +165,8 @@ void addMessage(string s, char spamtype = 0);
|
|||||||
#define stdeuc (geometry == gNormal || geometry == gEuclid || geometry == gEuclidSquare)
|
#define stdeuc (geometry == gNormal || geometry == gEuclid || geometry == gEuclidSquare)
|
||||||
#define smallsphere (sphere_narcm && S7 < 5)
|
#define smallsphere (sphere_narcm && S7 < 5)
|
||||||
#define bigsphere (sphere_narcm && S7 == 5)
|
#define bigsphere (sphere_narcm && S7 == 5)
|
||||||
#define euclid4 (masterless && a4)
|
#define euclid4 (euclid && WDIM == 2 && a4)
|
||||||
#define euclid6 (masterless && !a4)
|
#define euclid6 (euclid && WDIM == 2 && !a4)
|
||||||
|
|
||||||
#define S6 (S3*2)
|
#define S6 (S3*2)
|
||||||
#define MAX_S3 4
|
#define MAX_S3 4
|
||||||
@ -778,7 +772,6 @@ template <class T> void texture_order(const T& f) {
|
|||||||
|
|
||||||
static const color_t NOCOLOR = 0;
|
static const color_t NOCOLOR = 0;
|
||||||
|
|
||||||
typedef pair<cell**, bool> euc_pointer;
|
|
||||||
static const int max_vec = (1<<14);
|
static const int max_vec = (1<<14);
|
||||||
extern bool needConfirmationEvenIfSaved();
|
extern bool needConfirmationEvenIfSaved();
|
||||||
|
|
||||||
|
68
hypgraph.cpp
68
hypgraph.cpp
@ -878,8 +878,6 @@ EX void applymodel(hyperpoint H, hyperpoint& ret) {
|
|||||||
EX transmatrix sphereflip; // on the sphere, flip
|
EX transmatrix sphereflip; // on the sphere, flip
|
||||||
EX bool playerfound; // has player been found in the last drawing?
|
EX bool playerfound; // has player been found in the last drawing?
|
||||||
|
|
||||||
double q3 = sqrt(double(3));
|
|
||||||
|
|
||||||
EX bool outofmap(hyperpoint h) {
|
EX bool outofmap(hyperpoint h) {
|
||||||
if(GDIM == 3)
|
if(GDIM == 3)
|
||||||
return false;
|
return false;
|
||||||
@ -1138,7 +1136,7 @@ vector<tuple<heptspin, hstate, transmatrix, ld> > drawn_cells;
|
|||||||
|
|
||||||
bool in_multi = false;
|
bool in_multi = false;
|
||||||
|
|
||||||
bool drawcell_subs(cell *c, transmatrix V) {
|
EX bool drawcell_subs(cell *c, transmatrix V) {
|
||||||
|
|
||||||
#if CAP_GP
|
#if CAP_GP
|
||||||
if(GOLDBERG) {
|
if(GOLDBERG) {
|
||||||
@ -1163,8 +1161,10 @@ bool drawcell_subs(cell *c, transmatrix V) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(do_draw(c, V))
|
if(do_draw(c, V)) {
|
||||||
|
draw = true;
|
||||||
drawcell(c, V);
|
drawcell(c, V);
|
||||||
|
}
|
||||||
|
|
||||||
if(BITRUNCATED) forCellIdEx(c1, d, c) {
|
if(BITRUNCATED) forCellIdEx(c1, d, c) {
|
||||||
if(c->c.spin(d) == 0) {
|
if(c->c.spin(d) == 0) {
|
||||||
@ -1236,62 +1236,6 @@ void hrmap_standard::draw() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mindx=-7, mindy=-7, maxdx=7, maxdy=7;
|
|
||||||
|
|
||||||
EX transmatrix eumove(ld x, ld y) {
|
|
||||||
transmatrix Mat = Id;
|
|
||||||
Mat[LDIM][LDIM] = 1;
|
|
||||||
|
|
||||||
if(a4) {
|
|
||||||
Mat[0][LDIM] += x * cgi.crossf;
|
|
||||||
Mat[1][LDIM] += y * cgi.crossf;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Mat[0][LDIM] += (x + y * .5) * cgi.crossf;
|
|
||||||
// Mat[LDIM][0] += (x + y * .5) * cgi.crossf;
|
|
||||||
Mat[1][LDIM] += y * q3 /2 * cgi.crossf;
|
|
||||||
// Mat[LDIM][1] += y * q3 /2 * cgi.crossf;
|
|
||||||
}
|
|
||||||
|
|
||||||
ld v = a4 ? 1 : q3;
|
|
||||||
|
|
||||||
while(Mat[0][LDIM] <= -16384 * cgi.crossf) Mat[0][LDIM] += 32768 * cgi.crossf;
|
|
||||||
while(Mat[0][LDIM] >= 16384 * cgi.crossf) Mat[0][LDIM] -= 32768 * cgi.crossf;
|
|
||||||
while(Mat[1][LDIM] <= -16384 * v * cgi.crossf) Mat[1][LDIM] += 32768 * v * cgi.crossf;
|
|
||||||
while(Mat[1][LDIM] >= 16384 * v * cgi.crossf) Mat[1][LDIM] -= 32768 * v * cgi.crossf;
|
|
||||||
return Mat;
|
|
||||||
}
|
|
||||||
|
|
||||||
EX transmatrix eumove(int vec) {
|
|
||||||
int x, y;
|
|
||||||
tie(x,y) = vec_to_pair(vec);
|
|
||||||
return eumove(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
EX transmatrix eumovedir(int d) {
|
|
||||||
if(a4) {
|
|
||||||
d = d & 3;
|
|
||||||
switch(d) {
|
|
||||||
case 0: return eumove(1,0);
|
|
||||||
case 1: return eumove(0,1);
|
|
||||||
case 2: return eumove(-1,0);
|
|
||||||
case 3: return eumove(0,-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
d = gmod(d, S6);
|
|
||||||
switch(d) {
|
|
||||||
case 0: return eumove(1,0);
|
|
||||||
case 1: return eumove(0,1);
|
|
||||||
case 2: return eumove(-1,1);
|
|
||||||
case 3: return eumove(-1,0);
|
|
||||||
case 4: return eumove(0,-1);
|
|
||||||
case 5: return eumove(1,-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return eumove(0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
EX void spinEdge(ld aspd) {
|
EX void spinEdge(ld aspd) {
|
||||||
ld downspin = 0;
|
ld downspin = 0;
|
||||||
if(dual::state == 2 && dual::currently_loaded != dual::main_side) {
|
if(dual::state == 2 && dual::currently_loaded != dual::main_side) {
|
||||||
@ -1957,7 +1901,7 @@ EX namespace dq {
|
|||||||
|
|
||||||
EX bool do_draw(cell *c) {
|
EX bool do_draw(cell *c) {
|
||||||
// do not display out of range cells, unless on torus
|
// do not display out of range cells, unless on torus
|
||||||
if(c->pathdist == PINFD && geometry != gTorus && vid.use_smart_range == 0)
|
if(c->pathdist == PINFD && !(euclid && quotient) && vid.use_smart_range == 0)
|
||||||
return false;
|
return false;
|
||||||
// do not display not fully generated cells, unless changing range allowed
|
// do not display not fully generated cells, unless changing range allowed
|
||||||
if(c->mpdist > 7 && !allowChangeRange()) return false;
|
if(c->mpdist > 7 && !allowChangeRange()) return false;
|
||||||
@ -2036,7 +1980,7 @@ EX bool do_draw(cell *c, const transmatrix& T) {
|
|||||||
if(imag(z) < -models::spiral_cone_rad/2-1e-5 || imag(z) >= models::spiral_cone_rad/2-1e-5) return false;
|
if(imag(z) < -models::spiral_cone_rad/2-1e-5 || imag(z) >= models::spiral_cone_rad/2-1e-5) return false;
|
||||||
}
|
}
|
||||||
if(cells_drawn > vid.cells_drawn_limit) return false;
|
if(cells_drawn > vid.cells_drawn_limit) return false;
|
||||||
bool usr = vid.use_smart_range || quotient || euwrap;
|
bool usr = vid.use_smart_range || quotient;
|
||||||
if(usr && cells_drawn >= 50 && !in_smart_range(T) && !(WDIM == 2 && GDIM == 3 && hdist0(tC0(T)) < 2.5)) return false;
|
if(usr && cells_drawn >= 50 && !in_smart_range(T) && !(WDIM == 2 && GDIM == 3 && hdist0(tC0(T)) < 2.5)) return false;
|
||||||
if(vid.use_smart_range == 2 && !limited_generation(c)) return false;
|
if(vid.use_smart_range == 2 && !limited_generation(c)) return false;
|
||||||
return true;
|
return true;
|
||||||
|
32
landgen.cpp
32
landgen.cpp
@ -271,7 +271,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(PIU(hyperbolic_not37 || fulltorus || S7 < 5 || archimedean || WDIM == 3)) {
|
else if(PIU(hyperbolic_not37 || (euclid&&bounded) || S7 < 5 || archimedean || WDIM == 3)) {
|
||||||
if(fargen) {
|
if(fargen) {
|
||||||
int i = hrand(100);
|
int i = hrand(100);
|
||||||
if(i < 10)
|
if(i < 10)
|
||||||
@ -491,7 +491,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
if(d==8) {
|
if(d==8) {
|
||||||
if(randomPatternsMode)
|
if(randomPatternsMode)
|
||||||
c->wall = RANDPAT3(0) ? waCavewall : waCavefloor;
|
c->wall = RANDPAT3(0) ? waCavewall : waCavefloor;
|
||||||
else if(fulltorus) {
|
else if(euclid && bounded) {
|
||||||
c->wall = waCavefloor;
|
c->wall = waCavefloor;
|
||||||
}
|
}
|
||||||
else if(nil) {
|
else if(nil) {
|
||||||
@ -509,7 +509,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
#endif
|
#endif
|
||||||
else if(euclid) {
|
else if(euclid) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
if(((y-2)&7) < 4) c->wall = waCavewall;
|
if(((y-2)&7) < 4) c->wall = waCavewall;
|
||||||
else c->wall = waCavefloor;
|
else c->wall = waCavefloor;
|
||||||
}
|
}
|
||||||
@ -595,12 +595,12 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
else if(archimedean && arcm::current.have_line)
|
else if(archimedean && arcm::current.have_line)
|
||||||
v = arcm::linespattern(c) ? 24 : 16;
|
v = arcm::linespattern(c) ? 24 : 16;
|
||||||
#endif
|
#endif
|
||||||
else if(fulltorus || hyperbolic_not37 || quotient || archimedean) {
|
else if((euclid&&bounded) || hyperbolic_not37 || quotient || archimedean) {
|
||||||
v = hrand(100) < 25 ? 24 : 16;
|
v = hrand(100) < 25 ? 24 : 16;
|
||||||
}
|
}
|
||||||
else if(euclid) {
|
else if(euclid) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int y0 = gmod(y, 6);
|
int y0 = gmod(y, 6);
|
||||||
if(y0 == 3 || y0 == 4) v=24; else v=0;
|
if(y0 == 3 || y0 == 4) v=24; else v=0;
|
||||||
}
|
}
|
||||||
@ -656,14 +656,14 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
|
|
||||||
case laZebra:
|
case laZebra:
|
||||||
if(d==8) {
|
if(d==8) {
|
||||||
if(fulltorus) ;
|
if(euclid && bounded) ;
|
||||||
#if CAP_ARCM
|
#if CAP_ARCM
|
||||||
else if(archimedean && arcm::current.have_line)
|
else if(archimedean && arcm::current.have_line)
|
||||||
c->wall = arcm::linespattern(c) ? waTrapdoor : waNone;
|
c->wall = arcm::linespattern(c) ? waTrapdoor : waNone;
|
||||||
#endif
|
#endif
|
||||||
else if(euclid && !archimedean) {
|
else if(euclid && !archimedean) {
|
||||||
int x,y;
|
int x,y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
if(y&1) c->wall = waTrapdoor;
|
if(y&1) c->wall = waTrapdoor;
|
||||||
else c->wall = waNone;
|
else c->wall = waNone;
|
||||||
}
|
}
|
||||||
@ -684,7 +684,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
|
|
||||||
case laWineyard:
|
case laWineyard:
|
||||||
if(d==8) {
|
if(d==8) {
|
||||||
if(fulltorus) ;
|
if(euclid && bounded) ;
|
||||||
#if CAP_ARCM
|
#if CAP_ARCM
|
||||||
else if(archimedean && arcm::current.have_line)
|
else if(archimedean && arcm::current.have_line)
|
||||||
c->wall = arcm::linespattern(c) ? waVinePlant : waNone;
|
c->wall = arcm::linespattern(c) ? waVinePlant : waNone;
|
||||||
@ -699,7 +699,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
}
|
}
|
||||||
else if(euclid && !archimedean) {
|
else if(euclid && !archimedean) {
|
||||||
int x,y;
|
int x,y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int dy = gmod(y, 3);
|
int dy = gmod(y, 3);
|
||||||
if(dy == 1) c->wall = waVinePlant;
|
if(dy == 1) c->wall = waVinePlant;
|
||||||
}
|
}
|
||||||
@ -1221,7 +1221,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
if(quotient && zebra40(c) == 5) {
|
if(quotient && zebra40(c) == 5) {
|
||||||
c->wall = waChasm;
|
c->wall = waChasm;
|
||||||
}
|
}
|
||||||
if(fulltorus) {
|
if(euclid && bounded) {
|
||||||
int i = hrand(100);
|
int i = hrand(100);
|
||||||
if(i == 0) c->item = itTreat;
|
if(i == 0) c->item = itTreat;
|
||||||
else if(i < 5) c->wall = waChasm;
|
else if(i < 5) c->wall = waChasm;
|
||||||
@ -1285,14 +1285,12 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
bool randstorm = PIU(hyperbolic_not37 || NONSTDVAR || (quotient && geometry != gZebraQuotient));
|
bool randstorm = PIU(hyperbolic_not37 || NONSTDVAR || (quotient && geometry != gZebraQuotient));
|
||||||
if(fargen) {
|
if(fargen) {
|
||||||
|
|
||||||
if(fulltorus) {
|
if(euclid && bounded) {
|
||||||
int pid = decodeId(c->master);
|
/* todo */
|
||||||
if(pid == torusconfig::qty/3) c->wall = waCharged;
|
|
||||||
if(pid == torusconfig::qty*2/3) c->wall = waGrounded;
|
|
||||||
}
|
}
|
||||||
else if(euclid) {
|
else if(euclid) {
|
||||||
int x,y;
|
int x,y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
if((x+1)%3 == 0 && y%3 == 0) {
|
if((x+1)%3 == 0 && y%3 == 0) {
|
||||||
if(hrand(100) < 50)
|
if(hrand(100) < 50)
|
||||||
c->wall = hrand(2) ? waCharged : waGrounded;
|
c->wall = hrand(2) ? waCharged : waGrounded;
|
||||||
@ -1301,7 +1299,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
bool sand = false;
|
bool sand = false;
|
||||||
for(int i=0; i<c->type; i++) {
|
for(int i=0; i<c->type; i++) {
|
||||||
createMov(c, i);
|
createMov(c, i);
|
||||||
tie(x,y) = cell_to_pair(c->move(i));
|
tie(x,y) = euc2_coordinates(c->move(i));
|
||||||
if((x+1)%3 == 0 && (y)%3 == 0) sand = true;
|
if((x+1)%3 == 0 && (y)%3 == 0) sand = true;
|
||||||
}
|
}
|
||||||
if(sand && hrand(100) < 20)
|
if(sand && hrand(100) < 20)
|
||||||
@ -2655,7 +2653,7 @@ EX void setdist(cell *c, int d, cell *from) {
|
|||||||
else if(euclid && WDIM == 3) euclid3::set_land(c);
|
else if(euclid && WDIM == 3) euclid3::set_land(c);
|
||||||
#endif
|
#endif
|
||||||
else if(hybri) setLandHybrid(c);
|
else if(hybri) setLandHybrid(c);
|
||||||
else if(sphere || fulltorus) setLandSphere(c);
|
else if(sphere || (euclid && bounded)) setLandSphere(c);
|
||||||
else if(euclid) setLandEuclid(c);
|
else if(euclid) setLandEuclid(c);
|
||||||
else if(quotient) { setland(c, specialland); setLandQuotient(c); }
|
else if(quotient) { setland(c, specialland); setLandQuotient(c); }
|
||||||
else if(sol) setLandSol(c);
|
else if(sol) setLandSol(c);
|
||||||
|
12
landlock.cpp
12
landlock.cpp
@ -1051,14 +1051,14 @@ EX land_validity_t& land_validity(eLand l) {
|
|||||||
|
|
||||||
if(l == laReptile) {
|
if(l == laReptile) {
|
||||||
if(old_daily_id <= 64) {
|
if(old_daily_id <= 64) {
|
||||||
if(l == laReptile && (a38 || a4 || sphere || !BITRUNCATED || (quotient && !euwrap && geometry != gZebraQuotient)))
|
if(l == laReptile && (a38 || a4 || sphere || !BITRUNCATED || (quotient && !euclid && geometry != gZebraQuotient)))
|
||||||
return bad_graphics;
|
return bad_graphics;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bool reptile_good = false;
|
bool reptile_good = false;
|
||||||
if(hyperbolic_37 && BITRUNCATED) reptile_good = true;
|
if(hyperbolic_37 && BITRUNCATED) reptile_good = true;
|
||||||
if(euclid6) reptile_good = true;
|
if(euclid6) reptile_good = true;
|
||||||
if(quotient && geometry != gZebraQuotient && !euwrap)
|
if(quotient && geometry != gZebraQuotient && !euclid)
|
||||||
reptile_good = false;
|
reptile_good = false;
|
||||||
if(!reptile_good)
|
if(!reptile_good)
|
||||||
return bad_graphics;
|
return bad_graphics;
|
||||||
@ -1105,7 +1105,7 @@ EX land_validity_t& land_validity(eLand l) {
|
|||||||
return great_walls_missing;
|
return great_walls_missing;
|
||||||
|
|
||||||
// highlight Crossroads on Euclidean
|
// highlight Crossroads on Euclidean
|
||||||
if(euclid && !euwrap && (l == laCrossroads || l == laCrossroads4) && !penrose)
|
if(euclid && !quotient && (l == laCrossroads || l == laCrossroads4) && !penrose)
|
||||||
return full_game;
|
return full_game;
|
||||||
|
|
||||||
if(sol && among(l, laCrossroads, laCrossroads4))
|
if(sol && among(l, laCrossroads, laCrossroads4))
|
||||||
@ -1114,10 +1114,10 @@ EX land_validity_t& land_validity(eLand l) {
|
|||||||
if(sol && l == laCamelot)
|
if(sol && l == laCamelot)
|
||||||
return not_implemented;
|
return not_implemented;
|
||||||
|
|
||||||
if(euclid && euwrap && !fulltorus && l == laCrossroads && torusconfig::sdy == -2 * torusconfig::sdx)
|
if(euclid && quotient && !bounded && l == laCrossroads && sdxy().second == -2 * sdxy().first)
|
||||||
return full_game;
|
return full_game;
|
||||||
|
|
||||||
if(euclid && euwrap && !fulltorus && l == laCrossroads4 && torusconfig::sdy == 0)
|
if(euclid && quotient && !bounded && l == laCrossroads4 && sdxy().second == 0)
|
||||||
return full_game;
|
return full_game;
|
||||||
|
|
||||||
// highlight Zebra-based lands on Zebra Quotient!
|
// highlight Zebra-based lands on Zebra Quotient!
|
||||||
@ -1154,7 +1154,7 @@ EX land_validity_t& land_validity(eLand l) {
|
|||||||
return pattern_not_implemented_exclude;
|
return pattern_not_implemented_exclude;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(l == laStorms && fulltorus)
|
if(l == laStorms && euclid && bounded)
|
||||||
return interesting;
|
return interesting;
|
||||||
|
|
||||||
if(l == laMagnetic)
|
if(l == laMagnetic)
|
||||||
|
@ -130,14 +130,6 @@ namespace mapstream {
|
|||||||
f.write(gp::param.second);
|
f.write(gp::param.second);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(geometry == gTorus) {
|
|
||||||
f.write(torusconfig::qty);
|
|
||||||
f.write(torusconfig::dx);
|
|
||||||
f.write(torusconfig::dy);
|
|
||||||
f.write(torusconfig::sdx);
|
|
||||||
f.write(torusconfig::sdy);
|
|
||||||
f.write(torusconfig::torus_mode);
|
|
||||||
}
|
|
||||||
#if CAP_FIELD
|
#if CAP_FIELD
|
||||||
if(geometry == gFieldQuotient) {
|
if(geometry == gFieldQuotient) {
|
||||||
using namespace fieldpattern;
|
using namespace fieldpattern;
|
||||||
@ -187,17 +179,6 @@ namespace mapstream {
|
|||||||
f.read(gp::param.second);
|
f.read(gp::param.second);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(geometry == gTorus) {
|
|
||||||
f.read(torusconfig::qty);
|
|
||||||
f.read(torusconfig::dx);
|
|
||||||
f.read(torusconfig::dy);
|
|
||||||
if(f.vernum >= 10504) {
|
|
||||||
f.read(torusconfig::sdx);
|
|
||||||
f.read(torusconfig::sdy);
|
|
||||||
f.read(torusconfig::torus_mode);
|
|
||||||
}
|
|
||||||
torusconfig::activate();
|
|
||||||
}
|
|
||||||
#if CAP_CRYSTAL
|
#if CAP_CRYSTAL
|
||||||
if(cryst && f.vernum >= 10504) {
|
if(cryst && f.vernum >= 10504) {
|
||||||
int sides;
|
int sides;
|
||||||
|
12
models.cpp
12
models.cpp
@ -187,7 +187,7 @@ EX namespace models {
|
|||||||
spiral_multiplier = cld(cos_spiral, sin_spiral) * cld(spiral_cone_rad * mul / 2., 0);
|
spiral_multiplier = cld(cos_spiral, sin_spiral) * cld(spiral_cone_rad * mul / 2., 0);
|
||||||
}
|
}
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
hyperpoint h = tC0(eumove(spiral_x, spiral_y));
|
hyperpoint h = eumove(as_coord({spiral_x, spiral_y})) * C0;
|
||||||
spiral_multiplier = cld(0, 2 * M_PI) / cld(h[0], h[1]);
|
spiral_multiplier = cld(0, 2 * M_PI) / cld(h[0], h[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,13 +262,13 @@ EX namespace models {
|
|||||||
for(int y=0; y<=200; y++)
|
for(int y=0; y<=200; y++)
|
||||||
for(int x=-200; x<=200; x++) {
|
for(int x=-200; x<=200; x++) {
|
||||||
if(y == 0 && x <= 0) continue;
|
if(y == 0 && x <= 0) continue;
|
||||||
auto zero = vec_to_cellwalker(euclid_getvec(x, y));
|
auto zero = euclid3::canonicalize(as_coord({x, y}));
|
||||||
if(zero.at == currentmap->gamestart() && !zero.mirrored)
|
if(zero == 0)
|
||||||
torus_zeros.emplace_back(x, y);
|
torus_zeros.emplace_back(x, y);
|
||||||
}
|
}
|
||||||
sort(torus_zeros.begin(), torus_zeros.end(), [] (const pair<int,int> p1, const pair<int, int> p2) {
|
sort(torus_zeros.begin(), torus_zeros.end(), [] (const pair<int,int> p1, const pair<int, int> p2) {
|
||||||
ld d1 = hdist0(tC0(eumove(p1.first, p1.second)));
|
ld d1 = hdist0(tC0(eumove(as_coord(p1))));
|
||||||
ld d2 = hdist0(tC0(eumove(p2.first, p2.second)));
|
ld d2 = hdist0(tC0(eumove(as_coord(p2))));
|
||||||
if(d1 < d2 - 1e-6) return true;
|
if(d1 < d2 - 1e-6) return true;
|
||||||
if(d1 > d2 + 1e-6) return false;
|
if(d1 > d2 + 1e-6) return false;
|
||||||
return p1 < p2;
|
return p1 < p2;
|
||||||
@ -635,7 +635,7 @@ EX namespace models {
|
|||||||
dialog::add_action([](){
|
dialog::add_action([](){
|
||||||
dialog::editNumber(spiral_y, -20, 20, 1, 10, XLAT("spiral period: y"), "");
|
dialog::editNumber(spiral_y, -20, 20, 1, 10, XLAT("spiral period: y"), "");
|
||||||
});
|
});
|
||||||
if(euwrap) {
|
if(euclid && quotient) {
|
||||||
dialog::addSelItem(XLAT("match the period"), its(spiral_id), 'n');
|
dialog::addSelItem(XLAT("match the period"), its(spiral_id), 'n');
|
||||||
dialog::add_action(match_torus_period);
|
dialog::add_action(match_torus_period);
|
||||||
}
|
}
|
||||||
|
82
pattern2.cpp
82
pattern2.cpp
@ -36,46 +36,43 @@ int gp_threecolor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int eupattern(cell *c) {
|
int eupattern(cell *c) {
|
||||||
int v = cell_to_vec(c);
|
int x, y;
|
||||||
if(a4) {
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int x, y;
|
if(a4)
|
||||||
tie(x,y) = vec_to_pair(v);
|
|
||||||
return ((x&1) + 2*(y&1)) % 3;
|
return ((x&1) + 2*(y&1)) % 3;
|
||||||
}
|
else
|
||||||
else {
|
return gmod(y-x, 3);
|
||||||
return gmod(v*2, 3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int eupattern4(cell *c) {
|
int eupattern4(cell *c) {
|
||||||
int v = cell_to_vec(c);
|
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = vec_to_pair(v);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
return (x&1) + ((y&1)) * 2;
|
return (x&1) + ((y&1)) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX bool ishept(cell *c) {
|
EX bool ishept(cell *c) {
|
||||||
// EUCLIDEAN
|
// EUCLIDEAN
|
||||||
if(euclid) return eupattern(c) == 0;
|
if(euclid && PURE) return eupattern(c) == 0;
|
||||||
else return c->type == S7 + (hybri ? 2 : 0);
|
else if(hybri) { cell *c1 = hybrid::get_where(c).first; return c1 == c1->master->c7; }
|
||||||
|
else return c == c->master->c7;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX bool ishex1(cell *c) {
|
EX bool ishex1(cell *c) {
|
||||||
// EUCLIDEAN
|
// EUCLIDEAN
|
||||||
if(euclid) return eupattern(c) == 1;
|
if(euclid && PURE) return eupattern(c) == 1;
|
||||||
#if CAP_GP
|
#if CAP_GP
|
||||||
else if(GOLDBERG) return c->master->c7 != c && !pseudohept(c->move(0));
|
else if(GOLDBERG) return c->master->c7 != c && !pseudohept(c->move(0));
|
||||||
#endif
|
#endif
|
||||||
else return c->type != S6;
|
else return c->master->c7 != c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ishex2(cell *c) {
|
bool ishex2(cell *c) {
|
||||||
// EUCLIDEAN
|
// EUCLIDEAN
|
||||||
if(euclid) return eupattern(c) == 1;
|
if(euclid && PURE) return eupattern(c) == 1;
|
||||||
#if CAP_GP
|
#if CAP_GP
|
||||||
else if(GOLDBERG) return c->master->c7 != c && gp::pseudohept_val(c) == 1;
|
else if(GOLDBERG) return c->master->c7 != c && gp::pseudohept_val(c) == 1;
|
||||||
#endif
|
#endif
|
||||||
else return c->type != S6;
|
else return c->master->c7 != c;
|
||||||
}
|
}
|
||||||
|
|
||||||
int chessvalue(cell *c) {
|
int chessvalue(cell *c) {
|
||||||
@ -111,12 +108,8 @@ unsigned bitmajority(unsigned a, unsigned b, unsigned c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int eufifty(cell *c) {
|
int eufifty(cell *c) {
|
||||||
if(fulltorus) {
|
|
||||||
if(c->land == laWildWest) return cell_to_vec(c) % 37;
|
|
||||||
else return cell_to_vec(c) % 27;
|
|
||||||
}
|
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
int ix = x + 99999 + y;
|
int ix = x + 99999 + y;
|
||||||
int iy = y + 99999;
|
int iy = y + 99999;
|
||||||
if(c->land == laWildWest)
|
if(c->land == laWildWest)
|
||||||
@ -290,7 +283,7 @@ int dir_bitrunc457(cell *c) {
|
|||||||
int val46(cell *c);
|
int val46(cell *c);
|
||||||
|
|
||||||
EX int zebra40(cell *c) {
|
EX int zebra40(cell *c) {
|
||||||
if(euclid) return eupattern(c);
|
if(euclid) return pattern_threecolor(c);
|
||||||
else if(IRREGULAR) return c->master->zebraval/10;
|
else if(IRREGULAR) return c->master->zebraval/10;
|
||||||
else if(a46) {
|
else if(a46) {
|
||||||
int v = val46(c);
|
int v = val46(c);
|
||||||
@ -322,7 +315,6 @@ EX int zebra40(cell *c) {
|
|||||||
return 24;
|
return 24;
|
||||||
}
|
}
|
||||||
else if(sphere) return 0;
|
else if(sphere) return 0;
|
||||||
else if(euclid) return eupattern(c);
|
|
||||||
else if(S3 == 4 && S7 == 6) {
|
else if(S3 == 4 && S7 == 6) {
|
||||||
return 8 + ((c->master->zebraval / 10 + c->c.spin(0))%2) * 2;
|
return 8 + ((c->master->zebraval / 10 + c->c.spin(0))%2) * 2;
|
||||||
}
|
}
|
||||||
@ -348,7 +340,7 @@ EX int zebra40(cell *c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX int zebra3(cell *c) {
|
EX int zebra3(cell *c) {
|
||||||
if(masterless) return 0;
|
if(euclid) return 0;
|
||||||
else if(ctof(c)) return (c->master->zebraval/10)/4;
|
else if(ctof(c)) return (c->master->zebraval/10)/4;
|
||||||
else if(euclid || sphere || S7>7 || S6>6) return 0;
|
else if(euclid || sphere || S7>7 || S6>6) return 0;
|
||||||
else {
|
else {
|
||||||
@ -391,12 +383,10 @@ EX int fieldval_uniq(cell *c) {
|
|||||||
if(ctof(c)) return c->master->fieldval;
|
if(ctof(c)) return c->master->fieldval;
|
||||||
else return createMov(c, 0)->master->fieldval + 256 * createMov(c,2)->master->fieldval + (1<<16) * createMov(c,4)->master->fieldval;
|
else return createMov(c, 0)->master->fieldval + 256 * createMov(c,2)->master->fieldval + (1<<16) * createMov(c,4)->master->fieldval;
|
||||||
}
|
}
|
||||||
else if(fulltorus) {
|
|
||||||
return decodeId(c->master);
|
|
||||||
}
|
|
||||||
else if(euclid) {
|
else if(euclid) {
|
||||||
auto p = cell_to_pair(c);
|
auto p = euc2_coordinates(c);
|
||||||
return gmod(p.first * torusconfig::dx + p.second * torusconfig::dy, torusconfig::qty);
|
if(bounded) return p.first + (p.second << 16);
|
||||||
|
return gmod(p.first - 22 * p.second, 3*127);
|
||||||
}
|
}
|
||||||
else if(binarytiling || archimedean || nil || S3 >= OINF || (cgflags & qIDEAL)) return 0;
|
else if(binarytiling || archimedean || nil || S3 >= OINF || (cgflags & qIDEAL)) return 0;
|
||||||
else if(&currfp == &fp_invalid) return 0;
|
else if(&currfp == &fp_invalid) return 0;
|
||||||
@ -483,7 +473,7 @@ EX int getHemisphere(heptagon *h, int which) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX int getHemisphere(cell *c, int which) {
|
EX int getHemisphere(cell *c, int which) {
|
||||||
if(euwrap) return 0;
|
if(euclid && quotient) return 0;
|
||||||
if(hybri) { auto d = hybrid::get_where(c); return PIU(getHemisphere(d.first, which)); }
|
if(hybri) { auto d = hybrid::get_where(c); return PIU(getHemisphere(d.first, which)); }
|
||||||
if(WDIM == 3 && !hybri) {
|
if(WDIM == 3 && !hybri) {
|
||||||
hyperpoint p = tC0(calc_relative_matrix(c, currentmap->gamestart(), C0));
|
hyperpoint p = tC0(calc_relative_matrix(c, currentmap->gamestart(), C0));
|
||||||
@ -969,8 +959,19 @@ EX namespace patterns {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(euclid6 && (sub & SPF_CHANGEROT))
|
if(euclid6 && (sub & SPF_CHANGEROT)) {
|
||||||
si.dir = (zebra40(c)*4) % 6;
|
if(GOLDBERG) {
|
||||||
|
auto li = gp::get_local_info(c);
|
||||||
|
if(li.first_dir >= 0)
|
||||||
|
si.dir = gmod(zebra40(c)*4 - li.total_dir - li.last_dir, 6);
|
||||||
|
else
|
||||||
|
si.dir = gmod(zebra40(c)*4, 6);
|
||||||
|
}
|
||||||
|
else if(c == c->master->c7)
|
||||||
|
si.dir = (zebra40(c)*4) % 6;
|
||||||
|
else
|
||||||
|
si.dir = (zebra40(c)*4 + 9 - c->c.spin(0)) % 6;
|
||||||
|
}
|
||||||
if(sub & SPF_ROT) si.id = 1;
|
if(sub & SPF_ROT) si.id = 1;
|
||||||
if(euclid6 && !(sub & SPF_EXTRASYM)) {
|
if(euclid6 && !(sub & SPF_EXTRASYM)) {
|
||||||
si.symmetries = 6;
|
si.symmetries = 6;
|
||||||
@ -1286,6 +1287,12 @@ EX int pattern_threecolor(cell *c) {
|
|||||||
patterns::val38(c, si, !BITRUNCATED ? 0 : patterns::SPF_ROT, patterns::PAT_COLORING);
|
patterns::val38(c, si, !BITRUNCATED ? 0 : patterns::SPF_ROT, patterns::PAT_COLORING);
|
||||||
return si.id >> 2;
|
return si.id >> 2;
|
||||||
}
|
}
|
||||||
|
if(euclid6 && gp_threecolor() == 2) {
|
||||||
|
auto li = gp::get_local_info(c);
|
||||||
|
int rel = gmod(li.relative.first - li.relative.second, 3);
|
||||||
|
if(rel && (li.last_dir&1)) rel = 3 - rel;
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
#if CAP_GP
|
#if CAP_GP
|
||||||
if(a4 && GOLDBERG) {
|
if(a4 && GOLDBERG) {
|
||||||
patterns::patterninfo si;
|
patterns::patterninfo si;
|
||||||
@ -1312,7 +1319,8 @@ EX int pattern_threecolor(cell *c) {
|
|||||||
}
|
}
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
if(a4 && PURE) return eupattern4(c);
|
if(a4 && PURE) return eupattern4(c);
|
||||||
return eupattern(c) % 3;
|
if(euclid6 && !BITRUNCATED) return eupattern(c) % 3;
|
||||||
|
return c == c->master->c7 ? 0 : (c->c.spin(0)&1) ? 1 : 2;
|
||||||
}
|
}
|
||||||
if(S3 >= OINF) return c->master->distance % 3;
|
if(S3 >= OINF) return c->master->distance % 3;
|
||||||
if(S7 == 4 && S3 == 3) {
|
if(S7 == 4 && S3 == 3) {
|
||||||
@ -1498,7 +1506,7 @@ EX namespace patterns {
|
|||||||
|
|
||||||
int sevenval(cell *c) {
|
int sevenval(cell *c) {
|
||||||
if(!euclid) return 0;
|
if(!euclid) return 0;
|
||||||
auto p = vec_to_pair(cell_to_vec(c));
|
auto p = euc2_coordinates(c);
|
||||||
return gmod(p.first - p.second * 2, 7);
|
return gmod(p.first - p.second * 2, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1525,7 +1533,7 @@ EX namespace patterns {
|
|||||||
ep.extra_params["chess"] = chessvalue(c);
|
ep.extra_params["chess"] = chessvalue(c);
|
||||||
ep.extra_params["ph"] = pseudohept(c);
|
ep.extra_params["ph"] = pseudohept(c);
|
||||||
ep.extra_params["kph"] = kraken_pseudohept(c);
|
ep.extra_params["kph"] = kraken_pseudohept(c);
|
||||||
if(!masterless) {
|
if(true) {
|
||||||
ep.extra_params["md"] = c->master->distance;
|
ep.extra_params["md"] = c->master->distance;
|
||||||
ep.extra_params["me"] = c->master->emeraldval;
|
ep.extra_params["me"] = c->master->emeraldval;
|
||||||
ep.extra_params["mf"] = c->master->fieldval;
|
ep.extra_params["mf"] = c->master->fieldval;
|
||||||
@ -1539,7 +1547,7 @@ EX namespace patterns {
|
|||||||
}
|
}
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
int x, y;
|
int x, y;
|
||||||
tie(x,y) = cell_to_pair(c);
|
tie(x,y) = euc2_coordinates(c);
|
||||||
ep.extra_params["ex"] = x;
|
ep.extra_params["ex"] = x;
|
||||||
ep.extra_params["ey"] = y;
|
ep.extra_params["ey"] = y;
|
||||||
if(S7 == 6) ep.extra_params["ez"] = -x-y;
|
if(S7 == 6) ep.extra_params["ez"] = -x-y;
|
||||||
@ -2429,12 +2437,14 @@ EX namespace linepatterns {
|
|||||||
case patZebraTriangles:
|
case patZebraTriangles:
|
||||||
if(euclid) {
|
if(euclid) {
|
||||||
if(patterns::sevenval(c)) break;
|
if(patterns::sevenval(c)) break;
|
||||||
|
/* todo
|
||||||
gridline(V, C0, tC0(eumove(-1, +3)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(-1, +3)), col, 3 + vid.linequality);
|
||||||
gridline(V, C0, tC0(eumove(-3, +2)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(-3, +2)), col, 3 + vid.linequality);
|
||||||
gridline(V, C0, tC0(eumove(-2, -1)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(-2, -1)), col, 3 + vid.linequality);
|
||||||
gridline(V, C0, tC0(eumove(+1, -3)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(+1, -3)), col, 3 + vid.linequality);
|
||||||
gridline(V, C0, tC0(eumove(+3, -2)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(+3, -2)), col, 3 + vid.linequality);
|
||||||
gridline(V, C0, tC0(eumove(+2, +1)), col, 3 + vid.linequality);
|
gridline(V, C0, tC0(eumove(+2, +1)), col, 3 + vid.linequality);
|
||||||
|
*/
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(zebra40(c) / 4 == 10) {
|
if(zebra40(c) / 4 == 10) {
|
||||||
|
88
rug.cpp
88
rug.cpp
@ -252,8 +252,8 @@ EX rugpoint *addRugpoint(hyperpoint h, double dist) {
|
|||||||
m->y1 = (1 - onscreen[1] * vid.scale) / 2;
|
m->y1 = (1 - onscreen[1] * vid.scale) / 2;
|
||||||
m->valid = false;
|
m->valid = false;
|
||||||
|
|
||||||
if(euwrap && !bounded) {
|
if(euclid && quotient && !bounded) {
|
||||||
hyperpoint h1 = eumove(torusconfig::sdx, torusconfig::sdy) * C0;
|
hyperpoint h1 = eumove(first_period()) * C0;
|
||||||
h1 /= sqhypot_d(2, h1);
|
h1 /= sqhypot_d(2, h1);
|
||||||
if(nonorientable) h1 /= 2;
|
if(nonorientable) h1 /= 2;
|
||||||
m->valid = good_shape = true;
|
m->valid = good_shape = true;
|
||||||
@ -428,71 +428,18 @@ void calcparam_rug() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EX void buildTorusRug() {
|
EX void buildTorusRug() {
|
||||||
using namespace torusconfig;
|
|
||||||
|
|
||||||
|
/* todo
|
||||||
calcparam_rug();
|
calcparam_rug();
|
||||||
models::configure();
|
models::configure();
|
||||||
|
|
||||||
struct toruspoint {
|
|
||||||
int x,y;
|
|
||||||
toruspoint() { x=y=getqty(); }
|
|
||||||
toruspoint(int _x, int _y) : x(_x), y(_y) {}
|
|
||||||
int d2() {
|
|
||||||
return x*x+(euclid6?x*y:0)+y*y;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
vector<toruspoint> zeropoints;
|
|
||||||
vector<toruspoint> tps(qty);
|
vector<toruspoint> tps(qty);
|
||||||
|
|
||||||
auto& mode = tmodes[torus_mode];
|
pair<gp::loc, gp::loc> periods;
|
||||||
bool single = mode.flags & TF_SINGLE;
|
|
||||||
bool klein = mode.flags & TF_KLEIN;
|
|
||||||
|
|
||||||
pair<toruspoint, toruspoint> solution;
|
// todo take the periods
|
||||||
|
|
||||||
if(single) {
|
ld factor = sqrt(ld(dsquare(periods.second)) / dsquare(periods.first));
|
||||||
for(int ax=-qty; ax<qty; ax++)
|
|
||||||
for(int ay=-qty; ay<qty; ay++) {
|
|
||||||
int v = (ax*dx + ay*dy) % qty;
|
|
||||||
if(v<0) v += qty;
|
|
||||||
toruspoint tp(ax, ay);
|
|
||||||
if(tps[v].d2() > tp.d2()) tps[v] = tp;
|
|
||||||
if(v == 0)
|
|
||||||
zeropoints.emplace_back(ax, ay);
|
|
||||||
}
|
|
||||||
|
|
||||||
ld bestsol = 1e12;
|
|
||||||
|
|
||||||
for(auto p1: zeropoints)
|
|
||||||
for(auto p2: zeropoints) {
|
|
||||||
int det = p1.x * p2.y - p2.x * p1.y;
|
|
||||||
if(det < 0) continue;
|
|
||||||
if(det != qty && det != -qty) continue;
|
|
||||||
ld quality = ld(p1.d2()) * p2.d2();
|
|
||||||
if(quality < bestsol * 3)
|
|
||||||
if(quality < bestsol)
|
|
||||||
bestsol = quality, solution.first = p1, solution.second = p2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(solution.first.d2() > solution.second.d2())
|
|
||||||
swap(solution.first, solution.second);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(klein)
|
|
||||||
solution.first = toruspoint(2*sdx, 0);
|
|
||||||
else
|
|
||||||
solution.first = toruspoint(sdx, 0);
|
|
||||||
if(mode.flags & TF_WEIRD)
|
|
||||||
solution.second = toruspoint(sdy/2, sdy);
|
|
||||||
else
|
|
||||||
solution.second = toruspoint(0, sdy);
|
|
||||||
|
|
||||||
if(solution.first.d2() > solution.second.d2())
|
|
||||||
swap(solution.first, solution.second);
|
|
||||||
}
|
|
||||||
|
|
||||||
ld factor = sqrt(ld(solution.second.d2()) / solution.first.d2());
|
|
||||||
|
|
||||||
ld xfactor = 0, yfactor = 0;
|
ld xfactor = 0, yfactor = 0;
|
||||||
|
|
||||||
@ -504,16 +451,10 @@ EX void buildTorusRug() {
|
|||||||
// 7,-17
|
// 7,-17
|
||||||
|
|
||||||
transmatrix z1 = matrix3(
|
transmatrix z1 = matrix3(
|
||||||
solution.first.x, solution.second.x, 0,
|
periods.first.first, periods.second.first, 0,
|
||||||
solution.first.y, solution.second.y, 0,
|
periods.first.second, periods.second.second, 0,
|
||||||
0, 0, 1);
|
0, 0, 1);
|
||||||
// transmatrix z1 = {{{22,7,0}, {1,-17,0}, {0,0,1}}};
|
// transmatrix z1 = {{{22,7,0}, {1,-17,0}, {0,0,1}}};
|
||||||
/* transmatrix z1(
|
|
||||||
point3(solution.first.x, solution.second.x, 0),
|
|
||||||
point3(solution.first.y, solution.second.y, 0),
|
|
||||||
point3(0, 0, 1),
|
|
||||||
point31(0, 0, 0)
|
|
||||||
); */
|
|
||||||
transmatrix z2 = inverse(z1);
|
transmatrix z2 = inverse(z1);
|
||||||
|
|
||||||
if(gwhere == gSphere) {
|
if(gwhere == gSphere) {
|
||||||
@ -630,6 +571,7 @@ EX void buildTorusRug() {
|
|||||||
|
|
||||||
if(rug_perspective)
|
if(rug_perspective)
|
||||||
push_all_points(2, -model_distance);
|
push_all_points(2, -model_distance);
|
||||||
|
*/
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -670,7 +612,7 @@ EX void buildRug() {
|
|||||||
|
|
||||||
need_mouseh = true;
|
need_mouseh = true;
|
||||||
good_shape = false;
|
good_shape = false;
|
||||||
if(fulltorus) {
|
if(euclid && bounded) {
|
||||||
good_shape = true;
|
good_shape = true;
|
||||||
buildTorusRug();
|
buildTorusRug();
|
||||||
return;
|
return;
|
||||||
@ -687,13 +629,13 @@ EX void buildRug() {
|
|||||||
cell *c = p.first;
|
cell *c = p.first;
|
||||||
rugpoint *v = p.second;
|
rugpoint *v = p.second;
|
||||||
|
|
||||||
if(archimedean || euwrap) {
|
if(archimedean || (euclid && quotient)) {
|
||||||
rugpoint *p[MAX_EDGE+1];
|
rugpoint *p[MAX_EDGE+1];
|
||||||
for(int j=0; j<c->type; j++) p[j] = findOrAddRugpoint(ggmatrix(c) * get_corner_position(c, j), v->dist);
|
for(int j=0; j<c->type; j++) p[j] = findOrAddRugpoint(ggmatrix(c) * get_corner_position(c, j), v->dist);
|
||||||
for(int j=0; j<c->type; j++) addTriangle(v, p[j], p[(j+1) % c->type]);
|
for(int j=0; j<c->type; j++) addTriangle(v, p[j], p[(j+1) % c->type]);
|
||||||
|
|
||||||
if(euwrap && nonorientable) {
|
if((euclid && quotient) && nonorientable) {
|
||||||
transmatrix T = ggmatrix(c) * eumove(torusconfig::sdx, torusconfig::sdy);
|
transmatrix T = ggmatrix(c) * eumove(first_period());
|
||||||
rugpoint *Tv = addRugpoint(T * C0, 0);
|
rugpoint *Tv = addRugpoint(T * C0, 0);
|
||||||
for(int j=0; j<c->type; j++) p[j] = findOrAddRugpoint(T * get_corner_position(c, j), v->dist);
|
for(int j=0; j<c->type; j++) p[j] = findOrAddRugpoint(T * get_corner_position(c, j), v->dist);
|
||||||
for(int j=0; j<c->type; j++) addTriangle(Tv, p[j], p[(j+1) % c->type]);
|
for(int j=0; j<c->type; j++) addTriangle(Tv, p[j], p[(j+1) % c->type]);
|
||||||
@ -902,7 +844,7 @@ int divides = 0;
|
|||||||
bool stop = false;
|
bool stop = false;
|
||||||
|
|
||||||
EX bool subdivide_further() {
|
EX bool subdivide_further() {
|
||||||
if(fulltorus) return false;
|
if(euclid && bounded) return false;
|
||||||
if(GDIM == 3) return false;
|
if(GDIM == 3) return false;
|
||||||
return isize(points) * 4 < vertex_limit;
|
return isize(points) * 4 < vertex_limit;
|
||||||
}
|
}
|
||||||
@ -1081,7 +1023,7 @@ EX void addNewPoints() {
|
|||||||
if(anticusp_factor && detect_cusps())
|
if(anticusp_factor && detect_cusps())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(euwrap || qvalid == isize(points)) {
|
if((euclid && quotient) || qvalid == isize(points)) {
|
||||||
subdivide();
|
subdivide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ EX void initgame() {
|
|||||||
if(gamegen_failure) return;
|
if(gamegen_failure) return;
|
||||||
|
|
||||||
if(euclid && specialland == laPrincessQuest) {
|
if(euclid && specialland == laPrincessQuest) {
|
||||||
cell *c = *euclideanAtCreate(pair_to_vec(EPX, EPY)).first;
|
cell *c = at_euc2_coordinates({EPX, EPY});
|
||||||
princess::generating = true;
|
princess::generating = true;
|
||||||
c->land = laPalace;
|
c->land = laPalace;
|
||||||
setdist(c, 7 - getDistLimit() - genrange_bonus, NULL);
|
setdist(c, 7 - getDistLimit() - genrange_bonus, NULL);
|
||||||
@ -1230,7 +1230,7 @@ EX void set_geometry(eGeometry target) {
|
|||||||
EX void set_variation(eVariation target) {
|
EX void set_variation(eVariation target) {
|
||||||
if(variation != target) {
|
if(variation != target) {
|
||||||
stop_game();
|
stop_game();
|
||||||
if(euclid6 || binarytiling || sol || penrose || WDIM == 3) if(!prod) geometry = gNormal;
|
if(binarytiling || sol || penrose || WDIM == 3) if(!prod) geometry = gNormal;
|
||||||
auto& cd = ginf[gCrystal];
|
auto& cd = ginf[gCrystal];
|
||||||
if(target == eVariation::bitruncated && cryst && cd.sides == 8 && cd.vertex == 4) {
|
if(target == eVariation::bitruncated && cryst && cd.sides == 8 && cd.vertex == 4) {
|
||||||
cd.vertex = 3;
|
cd.vertex = 3;
|
||||||
|
14
yendor.cpp
14
yendor.cpp
@ -1139,18 +1139,8 @@ modecode_t modecode() {
|
|||||||
typedef long long ll;
|
typedef long long ll;
|
||||||
|
|
||||||
// 32 bits [29..61) for geometry specifics
|
// 32 bits [29..61) for geometry specifics
|
||||||
if(euwrap) {
|
if(euclid && quotient) {
|
||||||
mct += ll(torusconfig::torus_mode) << 29;
|
/* todo */
|
||||||
auto& mode = torusconfig::tmodes[torusconfig::torus_mode];
|
|
||||||
bool single = (mode.flags & torusconfig::TF_SINGLE);
|
|
||||||
if(single) {
|
|
||||||
mct += ll(torusconfig::qty) << 37;
|
|
||||||
mct += ll(torusconfig::dy) << 45;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mct += ll(torusconfig::sdx) << 37;
|
|
||||||
mct += ll(torusconfig::sdy) << 45;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_FIELD
|
#if CAP_FIELD
|
||||||
|
Loading…
Reference in New Issue
Block a user