1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-23 21:07:17 +00:00

parially done mirrors; field pattern in weirdhyperbolic; fake other patterns in weirdhyperbolic

This commit is contained in:
Zeno Rogue 2017-10-29 10:52:02 +01:00
parent ce3c066b0f
commit 345bd94c0d
14 changed files with 195 additions and 126 deletions

View File

@ -915,8 +915,8 @@ void buildBigStuff(cell *c, cell *from) {
else if(c->land == laPrairie && c->LHU.fi.walldist == 0) { else if(c->land == laPrairie && c->LHU.fi.walldist == 0) {
for(int bd=0; bd<7; bd++) { for(int bd=0; bd<7; bd++) {
int fval2 = createStep(c->master, bd)->fieldval; int fval2 = createStep(c->master, bd)->fieldval;
int wd = fp43.gmul(fval2, fp43.inverses[c->fval-1]); int wd = currfp.gmul(fval2, currfp.inverses[c->fval-1]);
if(fp43.distwall[wd] == 0) { if(currfp.distwall[wd] == 0) {
buildBarrier(c, bd); buildBarrier(c, bd);
break; break;
} }

View File

@ -487,7 +487,7 @@ struct hrmap_quotient : hrmap {
hrmap_quotient() { hrmap_quotient() {
if(quotient == 2) { if(quotient == 2) {
connections = fp43.connections; connections = currfp.connections;
} }
else { else {
heptspin hs; hs.h = base.origin; hs.spin = 0; heptspin hs; hs.h = base.origin; hs.spin = 0;
@ -715,7 +715,7 @@ void initcells() {
allmaps.push_back(currentmap); allmaps.push_back(currentmap);
if(S7 <= 7 && S6 <= 6) windmap::create(); windmap::create();
// origin->emeraldval = // origin->emeraldval =
} }
@ -824,8 +824,8 @@ bool ishex1(cell *c) {
int emeraldval(cell *c) { int emeraldval(cell *c) {
if(euclid) return eupattern(c); if(euclid) return eupattern(c);
if(sphere || weirdhyperbolic) return 0; if(sphere) return 0;
if(c->type == 7) if(ctof(c))
return c->master->emeraldval >> 3; return c->master->emeraldval >> 3;
else { else {
return emerald_hexagon( return emerald_hexagon(
@ -1045,8 +1045,8 @@ int fiftyval049(cell *c) {
// zebraval // zebraval
int zebra40(cell *c) { int zebra40(cell *c) {
if(c->type != 6) return (c->master->zebraval/10); if(ctof(c)) return (c->master->zebraval/10);
else if(sphere || S7>7 || S6>6) return 0; else if(sphere) return 0;
else if(euclid) return eupattern(c); else if(euclid) return eupattern(c);
else { else {
int ii[3], z; int ii[3], z;
@ -1403,7 +1403,7 @@ cell *heptatdir(cell *c, int d) {
namespace fieldpattern { namespace fieldpattern {
pair<int, bool> fieldval(cell *c) { pair<int, bool> fieldval(cell *c) {
if(c->type == 7) return make_pair(c->master->fieldval, false); if(ctof(c)) return make_pair(c->master->fieldval, false);
else return make_pair(btspin(c->master->fieldval, c->spin(0)), true); else return make_pair(btspin(c->master->fieldval, c->spin(0)), true);
} }
@ -1423,10 +1423,10 @@ int fieldval_uniq(cell *c) {
if(i<0) i += torusconfig::qty; if(i<0) i += torusconfig::qty;
return i; return i;
} }
if(ctof(c)) return c->master->fieldval/7; if(ctof(c)) return c->master->fieldval/S7;
else { else {
int z = 0; int z = 0;
for(int u=0; u<6; u+=2) for(int u=0; u<S6; u+=2)
z = max(z, btspin(createMov(c, u)->master->fieldval, c->spin(u))); z = max(z, btspin(createMov(c, u)->master->fieldval, c->spin(u)));
return -1-z; return -1-z;
} }
@ -1436,28 +1436,32 @@ int fieldval_uniq_rand(cell *c, int randval) {
if(sphere || torus || euclid) if(sphere || torus || euclid)
// we do not care in these cases // we do not care in these cases
return fieldval_uniq(c); return fieldval_uniq(c);
if(c->type != 6) return fp43.gmul(c->master->fieldval, randval)/7; if(ctof(c)) return currfp.gmul(c->master->fieldval, randval)/7;
else { else {
int z = 0; int z = 0;
for(int u=0; u<6; u+=2) for(int u=0; u<6; u+=2)
z = max(z, btspin(fp43.gmul(createMov(c, u)->master->fieldval, randval), c->spin(u))); z = max(z, btspin(currfp.gmul(createMov(c, u)->master->fieldval, randval), c->spin(u)));
return -1-z; return -1-z;
} }
} }
int subpathid = fp43.matcode[fp43.strtomatrix("RRRPRRRRRPRRRP")]; int subpathid = currfp.matcode[currfp.strtomatrix("RRRPRRRRRPRRRP")];
int subpathorder = fp43.order(fp43.matrices[subpathid]); int subpathorder = currfp.order(currfp.matrices[subpathid]);
pair<int, int> subval(cell *c, int _subpathid = subpathid, int _subpathorder = subpathorder) { pair<int, int> subval(cell *c, int _subpathid = subpathid, int _subpathorder = subpathorder) {
if(c->type == 6) if(!ctof(c)) {
return min(min(subval(createMov(c, 0)),subval(createMov(c, 2))), subval(createMov(c, 4))); auto m = subval(createMov(c, 0));
for(int u=2; u<S6; u+=2)
m = min(m, subval(createMov(c, u)));
return m;
}
else { else {
pair<int, int> pbest, pcur; pair<int, int> pbest, pcur;
pcur.first = c->master->fieldval; pcur.first = c->master->fieldval;
pcur.second = 0; pcur.second = 0;
pbest = pcur; pbest = pcur;
for(int i=0; i<_subpathorder; i++) { for(int i=0; i<_subpathorder; i++) {
pcur.first = fp43.gmul(pcur.first, _subpathid); pcur.first = currfp.gmul(pcur.first, _subpathid);
pcur.second++; pcur.second++;
if(pcur < pbest) pbest = pcur; if(pcur < pbest) pbest = pcur;
} }
@ -1485,7 +1489,7 @@ int celldistance(cell *c1, cell *c2) {
} }
if(quotient == 2) if(quotient == 2)
return fp43.getdist(fieldpattern::fieldval(c1), fieldpattern::fieldval(c2)); return currfp.getdist(fieldpattern::fieldval(c1), fieldpattern::fieldval(c2));
int d1 = celldist(c1), d2 = celldist(c2); int d1 = celldist(c1), d2 = celldist(c2);

View File

@ -1866,14 +1866,16 @@ eLand land_sph[LAND_SPH] = {
laWildWest, laPalace, laBull, laPrairie, laCA laWildWest, laPalace, laBull, laPrairie, laCA
}; };
#define LAND_OCT 25 #define LAND_OCT 33
eLand land_oct[LAND_OCT] = { eLand land_oct[LAND_OCT] = {
laIce, laDesert, laCaves, laJungle, laAlchemist, laIce, laDesert, laCaves, laJungle, laAlchemist,
laGraveyard, laRlyeh, laHell, laCocytus, laMotion, laGraveyard, laRlyeh, laHell, laCocytus, laMotion,
laDryForest, laDeadCaves, laRedRock, laMinefield, laLivefjord, laDryForest, laDeadCaves, laRedRock, laMinefield, laLivefjord,
laStorms, laOvergrown, laRose, laKraken, laBurial, laStorms, laOvergrown, laRose, laKraken, laBurial,
laTrollheim, laBull, laHunting, laTrollheim, laBull, laHunting,
laCaribbean, laCamelot laCaribbean, laCamelot, laPalace, laMirrorOld,
laVolcano, laBlizzard, laTerracotta,
laWineyard, laPower, laEmerald
}; };

View File

@ -1124,20 +1124,20 @@ namespace mirror {
} }
return; return;
} }
for(int i=0; i<6; i++) { for(int i=0; i<S6; i++) {
cwstep(cw); cwstep(cw);
if(cw.c->type == 6) { if(!ctof(cw.c)) {
cwspin(cw, 2); cwspin(cw, 2);
cwstep(cw); cwstep(cw);
cwspin(cw, 4-i); cwspin(cw, S6-2-i);
createMirror(cw, cpid); createMirror(cw, cpid);
cwspin(cw, 6-4+i); cwspin(cw, 2+i);
cwstep(cw); cwstep(cw);
cwspin(cw, 2); cwspin(cw, S6-4);
cwstep(cw); cwstep(cw);
cwspin(cw, 2-i); cwspin(cw, 2-i);
createMirror(cw, cpid); createMirror(cw, cpid);
cwspin(cw, 6-2+i); cwspin(cw, S6-2+i);
cwstep(cw); cwstep(cw);
cwspin(cw, 2); cwspin(cw, 2);
} }
@ -2066,6 +2066,7 @@ void livecaves() {
else if(w == waGargoyle) c->aitmp--; else if(w == waGargoyle) c->aitmp--;
else if(w == waGargoyleFloor) c->aitmp--; else if(w == waGargoyleFloor) c->aitmp--;
else if(w == waGargoyleBridge) c->aitmp--; else if(w == waGargoyleBridge) c->aitmp--;
else if(w == waStone) ;
else if(w == waDeadTroll) c->aitmp -= 5; else if(w == waDeadTroll) c->aitmp -= 5;
else if(w == waDeadTroll2) c->aitmp -= 3; else if(w == waDeadTroll2) c->aitmp -= 3;
else if(w == waPetrified || w == waPetrifiedBridge) c->aitmp -= 2; else if(w == waPetrified || w == waPetrifiedBridge) c->aitmp -= 2;
@ -2703,9 +2704,9 @@ namespace prairie {
} }
else { else {
if(!from) { if(!from) {
for(int i=0; i<size(fp43.matrices); i++) for(int i=0; i<size(currfp.matrices); i++)
if(fp43.distflower[i] == 0) if(currfp.distflower[i] == 0)
c->fval = fp43.inverses[i]+1; c->fval = currfp.inverses[i]+1;
} }
else if(from && from->land == laPrairie && from->fval) else if(from && from->land == laPrairie && from->fval)
c->fval = from->fval; c->fval = from->fval;
@ -2729,15 +2730,15 @@ namespace prairie {
} }
} }
pair<int,bool> fv = fieldpattern::fieldval(c); pair<int,bool> fv = fieldpattern::fieldval(c);
fv = fp43.gmul(fv, fp43.inverses[c->fval-1]); fv = currfp.gmul(fv, fp43.inverses[c->fval-1]);
rd = fp43.getdist(fv, fp43.distriver); rd = currfp.getdist(fv, fp43.distriver);
int rl = fp43.getdist(fv, fp43.distriverleft); int rl = currfp.getdist(fv, fp43.distriverleft);
int rr = fp43.getdist(fv, fp43.distriverright); int rr = currfp.getdist(fv, fp43.distriverright);
c->LHU.fi.flowerdist = fp43.getdist(fv, fp43.distflower); c->LHU.fi.flowerdist = currfp.getdist(fv, fp43.distflower);
c->LHU.fi.walldist = fp43.getdist(fv, fp43.distwall); c->LHU.fi.walldist = currfp.getdist(fv, fp43.distwall);
c->LHU.fi.walldist2 = fp43.getdist(fv, fp43.distwall2); c->LHU.fi.walldist2 = currfp.getdist(fv, fp43.distwall2);
c->LHU.fi.rval = 0; c->LHU.fi.rval = 0;
if(rd <= 7 && rl < rr) if(rd <= 7 && rl < rr)
@ -2751,7 +2752,7 @@ namespace prairie {
if(c->LHU.fi.walldist == 0) c->wall = waBarrier; if(c->LHU.fi.walldist == 0) c->wall = waBarrier;
if(0) if(c->type == 7) for(int i=0; i<7; i++) { if(0) if(c->type == 7) for(int i=0; i<7; i++) {
eItem m = fp43.markers[fieldpattern::btspin(c->master->fieldval,i)]; eItem m = currfp.markers[fieldpattern::btspin(c->master->fieldval,i)];
if(m) { if(m) {
if(c->item) c->item = itBuggy2; if(c->item) c->item = itBuggy2;
else c->item = m, c->mondir = i; else c->item = m, c->mondir = i;
@ -3054,12 +3055,15 @@ namespace windmap {
if(N == 18920) precomp = windcodes18920; if(N == 18920) precomp = windcodes18920;
if(N == 5676) precomp = windcodes5676; if(N == 5676) precomp = windcodes5676;
if(precomp && size(fp43.matrices)) { if(precomp && size(currfp.matrices)) {
int randval = hrand(size(fp43.matrices)); int randval = hrand(size(currfp.matrices));
for(int i=0; i<N; i++) for(int i=0; i<N; i++)
windcodes[i] = precomp[getid[fieldpattern::fieldval_uniq_rand(samples[i], randval)]-1]; windcodes[i] = precomp[getid[fieldpattern::fieldval_uniq_rand(samples[i], randval)]-1];
return; return;
} }
int tries = 0;
tryagain:
for(int i=0; i<N; i++) windcodes[i] = hrand(256); for(int i=0; i<N; i++) windcodes[i] = hrand(256);
@ -3069,7 +3073,7 @@ namespace windmap {
random_shuffle(tocheck.begin(), tocheck.end()); random_shuffle(tocheck.begin(), tocheck.end());
for(int a=0; a<size(tocheck); a++) { for(int a=0; a<size(tocheck); a++) {
if(a >= 200*N) break; if(a >= 200*N) { printf("does not converge\n"); break; }
int bestval = 1000000000, best = 0; int bestval = 1000000000, best = 0;
int i = tocheck[a]; int i = tocheck[a];
for(int k=0; k<256; k++) { for(int k=0; k<256; k++) {
@ -3089,7 +3093,19 @@ namespace windmap {
inqueue[i] = false; inqueue[i] = false;
windcodes[i] = best; windcodes[i] = best;
} }
if(false) {
int ingroup[4];
for(int u=0; u<4; u++) ingroup[u] = 0;
for(int i=0; i<N; i++) ingroup[windcodes[i] >> 6]++;
for(int u=0; u<4; u++) if(!ingroup[u]) {
tries++;
if(tries < 5) goto tryagain;
}
if(tries >= 5) {
addMessage("Failed to generate an interesting wind/lava pattern.");
}
if(true) {
printf("tocheck size = %d\n", size(tocheck)); printf("tocheck size = %d\n", size(tocheck));
printf("if(N == %d) {\n", N); printf("if(N == %d) {\n", N);
printf(" windcodes = {"); printf(" windcodes = {");
@ -3101,7 +3117,6 @@ namespace windmap {
} }
int at(cell *c) { int at(cell *c) {
if(weirdhyperbolic) return ((size_t)c) % 255;
return windmap::windcodes[windmap::getId(c)]; return windmap::windcodes[windmap::getId(c)];
} }

View File

@ -68,7 +68,6 @@ movedir vectodir(const hyperpoint& P) {
binv = dirdist[i]; binv = dirdist[i];
res.d = i; res.d = i;
res.subdir = dirdist[(i+1)%cwt.c->type] < dirdist[(i+cwt.c->type-1)%cwt.c->type] ? 1 : -1; res.subdir = dirdist[(i+1)%cwt.c->type] < dirdist[(i+cwt.c->type-1)%cwt.c->type] ? 1 : -1;
if(sphere) res.subdir = -res.subdir;
} }
} }
@ -117,8 +116,6 @@ void calcMousedest() {
if(cwt.mirrored) if(cwt.mirrored)
mousedest.d = fixdir(-mousedest.d, cwt.c), mousedest.d = fixdir(-mousedest.d, cwt.c),
mousedest.subdir = -mousedest.subdir; mousedest.subdir = -mousedest.subdir;
if(sphere) mousedest.subdir = -mousedest.subdir;
} }
if(vid.revcontrol == true) { mouseh[0] = -mouseh[0]; mouseh[1] = -mouseh[1]; } if(vid.revcontrol == true) { mouseh[0] = -mouseh[0]; mouseh[1] = -mouseh[1]; }

View File

@ -34,7 +34,7 @@ bool operator < (const matrix& A, const matrix& B) {
} }
int btspin(int id, int d) { int btspin(int id, int d) {
return 7*(id/7) + (id + d) % 7; return S7*(id/S7) + (id + d) % S7;
} }
struct fpattern { struct fpattern {
@ -153,8 +153,8 @@ struct fpattern {
vector<int> connections; vector<int> connections;
vector<int> inverses; vector<int> inverses;
vector<int> rrf; // rrf[i] equals gmul(i, 6) vector<int> rrf; // rrf[i] equals gmul(i, S7-1)
vector<int> rpf; // rpf[i] equals gmul(i, 7) vector<int> rpf; // rpf[i] equals gmul(i, S7)
matrix mpow(matrix M, int N) { matrix mpow(matrix M, int N) {
while((N&1) == 0) N >>= 1, M = mmul(M, M); while((N&1) == 0) N >>= 1, M = mmul(M, M);
@ -184,7 +184,7 @@ struct fpattern {
string decodepath(int i) { string decodepath(int i) {
string s; string s;
while(i) { while(i) {
if(i % 7) i--, s += 'R'; if(i % S7) i--, s += 'R';
else i = connections[i], s += 'P'; else i = connections[i], s += 'P';
} }
return s; return s;
@ -242,7 +242,10 @@ struct fpattern {
R[0][1] = sn; R[1][0] = sub(0, sn); R[0][1] = sn; R[1][0] = sub(0, sn);
matrix Z = R; matrix Z = R;
for(int i=0; i<6; i++) Z = mmul(Z, R); for(int i=1; i<S7; i++) {
if(Z == Id) goto nextcs;
Z = mmul(Z, R);
}
if(Z != Id) continue; if(Z != Id) continue;
if(R[0][0] == 1) continue; if(R[0][0] == 1) continue;
@ -257,10 +260,16 @@ struct fpattern {
P[2][0] = sh; P[2][0] = sh;
P[2][2] = ch; P[2][2] = ch;
matrix Z = mmul(P, R); matrix Z1 = mmul(P, R);
Z = mmul(Z, mmul(Z, Z)); matrix Z = Z1;
for(int i=1; i<S3; i++) {
if(Z == Id) goto nextch;
Z = mmul(Z, Z1);
}
if(Z == Id) return 0; if(Z == Id) return 0;
nextch: ;
} }
nextcs: ;
} }
} }
@ -277,7 +286,7 @@ struct fpattern {
matcode.clear(); matrices.clear(); matcode.clear(); matrices.clear();
add(Id); add(Id);
if(matrices.size() != 7) { printf("Error: rotation crash\n"); exit(1); } if(size(matrices) != S7) { printf("Error: rotation crash #1 (%d)\n", size(matrices)); exit(1); }
connections.clear(); connections.clear();
@ -289,7 +298,7 @@ struct fpattern {
add(PM); add(PM);
if(matrices.size() % 7) { printf("Error: rotation crash\n"); exit(1); } if(size(matrices) % S7) { printf("Error: rotation crash (%d)\n", size(matrices)); exit(1); }
if(!matcode.count(PM)) { printf("Error: not marked\n"); exit(1); } if(!matcode.count(PM)) { printf("Error: not marked\n"); exit(1); }
@ -301,12 +310,12 @@ struct fpattern {
DEBB(DF_FIELD, (debugfile, "Number of heptagons: %d\n", N)); DEBB(DF_FIELD, (debugfile, "Number of heptagons: %d\n", N));
rrf.resize(N); rrf[0] = 6; rrf.resize(N); rrf[0] = S7-1;
for(int i=0; i<N; i++) for(int i=0; i<N; i++)
rrf[btspin(i,1)] = btspin(rrf[i], 1), rrf[btspin(i,1)] = btspin(rrf[i], 1),
rrf[connections[i]] = connections[rrf[i]]; rrf[connections[i]] = connections[rrf[i]];
rpf.resize(N); rpf[0] = 7; rpf.resize(N); rpf[0] = S7;
for(int i=0; i<N; i++) for(int i=0; i<N; i++)
rpf[btspin(i,1)] = btspin(rpf[i], 1), rpf[btspin(i,1)] = btspin(rpf[i], 1),
rpf[connections[i]] = connections[rpf[i]]; rpf[connections[i]] = connections[rpf[i]];
@ -323,7 +332,7 @@ struct fpattern {
if(0) for(int i=0; i<size(matrices); i++) { if(0) for(int i=0; i<size(matrices); i++) {
printf("%5d/%4d", connections[i], inverses[i]); printf("%5d/%4d", connections[i], inverses[i]);
if(i%7 == 6) printf("\n"); if(i%S7 == S7-1) printf("\n");
} }
DEBB(DF_FIELD, (debugfile, "Built.\n")); DEBB(DF_FIELD, (debugfile, "Built.\n"));
@ -371,7 +380,7 @@ struct fpattern {
if(dists[at] <= i) continue; if(dists[at] <= i) continue;
maxd = i; maxd = i;
dists[at] = i; dists[at] = i;
for(int q=0; q<7; q++) { for(int q=0; q<S7; q++) {
dists[at] = i; dists[at] = i;
if(purehepta) if(purehepta)
indist[i+1].push_back(connections[at]); indist[i+1].push_back(connections[at]);
@ -409,17 +418,17 @@ struct fpattern {
otherpole = 0; otherpole = 0;
for(int i=0; i<N; i+=7) { for(int i=0; i<N; i+=S7) {
int mp = 0; int mp = 0;
for(int q=0; q<7; q++) if(disthep[connections[i+q]] < disthep[i]) mp++; for(int q=0; q<S7; q++) if(disthep[connections[i+q]] < disthep[i]) mp++;
if(mp == 7) { if(mp == S7) {
bool eq = true; bool eq = true;
for(int q=0; q<7; q++) if(disthep[connections[i+q]] != disthep[connections[i]]) eq = false; for(int q=0; q<S7; q++) if(disthep[connections[i+q]] != disthep[connections[i]]) eq = false;
if(eq) { if(eq) {
// for(int q=0; q<7; q++) printf("%3d", disthep[connections[i+q]]); // for(int q=0; q<S7; q++) printf("%3d", disthep[connections[i+q]]);
// printf(" (%2d) at %d\n", disthep[i], i); // printf(" (%2d) at %d\n", disthep[i], i);
if(disthep[i] > disthep[otherpole]) otherpole = i; if(disthep[i] > disthep[otherpole]) otherpole = i;
// for(int r=0; r<7; r++) { // for(int r=0; r<S7; r++) {
// printf("Matrix: "); for(int a=0; a<3; a++) for(int b=0; b<3; b++) // printf("Matrix: "); for(int a=0; a<3; a++) for(int b=0; b<3; b++)
// printf("%4d", matrices[i+r][a][b]); printf("\n"); // printf("%4d", matrices[i+r][a][b]); printf("\n");
// } // }
@ -679,6 +688,26 @@ void info() {
printf("cases found = %d (%d hard)\n", cases, hard); printf("cases found = %d (%d hard)\n", cases, hard);
} }
fpattern& getcurrfp() {
if(S7 == 8 && S3 == 3) {
static fpattern fp(17);
return fp;
}
if(S7 == 5 && S3 == 4) {
static fpattern fp(11);
return fp;
}
if(S7 == 6 && S3 == 4) {
static fpattern fp(13);
return fp;
}
if(S7 == 7 && S3 == 4) {
static fpattern fp(13);
return fp;
}
return fp43;
}
} }
using fieldpattern::fp43; #define currfp fieldpattern::getcurrfp()

View File

@ -3605,9 +3605,10 @@ int determinizeBullPush(cellwalker bull) {
int dirs[2], positive; int dirs[2], positive;
cwstep(bull); cwstep(bull);
cell *c2 = bull.c; cell *c2 = bull.c;
if(c2->type == 6) return 1; // irrelevant if(!(c2->type & 1)) return 1; // irrelevant
cwspin(bull, 3); dirs[0] = positive = bull.spin; int d = c2->type / 2;
cwspin(bull, -6); dirs[1] = bull.spin; cwspin(bull, d); dirs[0] = positive = bull.spin;
cwspin(bull, -2*d); dirs[1] = bull.spin;
determinizeBull(c2, dirs, nc); determinizeBull(c2, dirs, nc);
if(dirs[0] == positive) return -1; if(dirs[0] == positive) return -1;
return 1; return 1;
@ -3660,11 +3661,11 @@ template<class T>
cell *determinePush(cellwalker who, cell *c2, int subdir, T valid) { cell *determinePush(cellwalker who, cell *c2, int subdir, T valid) {
cellwalker push = who; cellwalker push = who;
cwstep(push); cwstep(push);
int pd = push.c->type == 8 ? 4 : 3; int pd = push.c->type/2;
cwspin(push, pd * -subdir); cwspin(push, pd * -subdir);
cwstep(push); cwstep(push);
if(valid(push.c)) return push.c; if(valid(push.c)) return push.c;
if(c2->type == 7) { if(c2->type&1) {
cwstep(push); cwstep(push);
cwspin(push, 1 * -subdir); cwspin(push, 1 * -subdir);
cwstep(push); cwstep(push);

View File

@ -2176,6 +2176,10 @@ void drawTowerFloor(const transmatrix& V, cell *c, int col, cellfunction *cf = c
void drawZebraFloor(const transmatrix& V, cell *c, int col) { void drawZebraFloor(const transmatrix& V, cell *c, int col) {
if(euclid) { qfloor(c, V, shTower[10], col); return; } if(euclid) { qfloor(c, V, shTower[10], col); return; }
if(weirdhyperbolic) {
int ct6 = ctof(c);
qfloor(c, V, PLAINFLOOR, col); return;
}
int i = zebra40(c); int i = zebra40(c);
i &= ~3; i &= ~3;
@ -5309,7 +5313,7 @@ auto graphcm = addHook(clearmemory, 0, [] () {
void resetGeometry() { void resetGeometry() {
precalc(); precalc();
fp43.analyze(); currfp.analyze();
#if CAP_GL #if CAP_GL
resetGL(); resetGL();
#endif #endif

View File

@ -4,13 +4,13 @@
// heptagon here refers to underlying heptagonal tesselation // heptagon here refers to underlying heptagonal tesselation
// (which you can see by changing the conditions in graph.cpp) // (which you can see by changing the conditions in graph.cpp)
#define MIRR(x) x.mirrored
// automaton state // automaton state
enum hstate { hsOrigin, hsA, hsB, hsError, hsA0, hsA1, hsB0, hsB1, hsC }; enum hstate { hsOrigin, hsA, hsB, hsError, hsA0, hsA1, hsB0, hsB1, hsC };
#define MODFIXER 23520 #define MODFIXER 23520
#define MIRR(x) x.mirrored
int fixrot(int a) { return (a+MODFIXER)% S7; } int fixrot(int a) { return (a+MODFIXER)% S7; }
int fix42(int a) { return (a+MODFIXER)% S42; } int fix42(int a) { return (a+MODFIXER)% S42; }
@ -133,15 +133,13 @@ heptagon *buildHeptagon(heptagon *parent, int d, hstate s, int pard = 0, int fix
if(parent->c7) { if(parent->c7) {
h->c7 = newCell(S7, h); h->c7 = newCell(S7, h);
h->rval0 = h->rval1 = 0; h->cdata = NULL; h->rval0 = h->rval1 = 0; h->cdata = NULL;
if(!weirdhyperbolic) { h->emeraldval = emerald_heptagon(parent->emeraldval, d);
h->emeraldval = emerald_heptagon(parent->emeraldval, d); h->zebraval = zebra_heptagon(parent->zebraval, d);
h->zebraval = zebra_heptagon(parent->zebraval, d); h->fieldval = currfp.connections[fieldpattern::btspin(parent->fieldval, d)];
h->fieldval = fp43.connections[fieldpattern::btspin(parent->fieldval, d)]; if(parent->s == hsOrigin)
if(parent->s == hsOrigin) h->fiftyval = firstfiftyval(d);
h->fiftyval = fiftytable[0][d]; else
else h->fiftyval = nextfiftyval(parent->fiftyval, parent->move[0]->fiftyval, d);
h->fiftyval = nextfiftyval(parent->fiftyval, parent->move[0]->fiftyval, d);
}
} }
else { else {
h->c7 = NULL; h->c7 = NULL;

View File

@ -236,7 +236,7 @@ else if(args()[0] == '-' && args()[1] == x && args()[2] == '0') { showstartmenu
} }
else if(argis("-qs")) { else if(argis("-qs")) {
autocheat = true; autocheat = true;
shift(); fp43.qpaths.push_back(args()); shift(); currfp.qpaths.push_back(args());
} }
else if(argis("-fix")) { else if(argis("-fix")) {
fixseed = true; autocheat = true; fixseed = true; autocheat = true;
@ -255,7 +255,7 @@ else if(args()[0] == '-' && args()[1] == x && args()[2] == '0') { showstartmenu
&p, &quotientspace::rvadd, &quotientspace::rvdir &p, &quotientspace::rvadd, &quotientspace::rvdir
); );
autocheat = true; autocheat = true;
fp43.init(p); currfp.init(p);
} }
else if(argis("-tpar")) { else if(argis("-tpar")) {
shift(); sscanf(args(), "%d,%d,%d", shift(); sscanf(args(), "%d,%d,%d",
@ -266,14 +266,14 @@ else if(args()[0] == '-' && args()[1] == x && args()[2] == '0') { showstartmenu
} }
else if(argis("-cs")) { else if(argis("-cs")) {
shift(); shift();
fieldpattern::matrix M = fp43.strtomatrix(args()); fieldpattern::matrix M = currfp.strtomatrix(args());
fieldpattern::subpathid = fp43.matcode[M]; fieldpattern::subpathid = currfp.matcode[M];
fieldpattern::subpathorder = fp43.order(M); fieldpattern::subpathorder = currfp.order(M);
autocheat = true; autocheat = true;
} }
else if(argis("-csp")) { else if(argis("-csp")) {
autocheat = true; autocheat = true;
fp43.findsubpath(); currfp.findsubpath();
} }
else if(argis("-fi")) { else if(argis("-fi")) {
fieldpattern::info(); fieldpattern::info();

View File

@ -313,7 +313,8 @@ void giantLandSwitch(cell *c, int d, cell *from) {
} }
else { else {
int v = emeraldval(c); int v = emeraldval(c);
if((v&3) >= 2) if(v == 0) c->wall = waStone;
else if((v&3) >= 2)
c->wall = waCavewall; c->wall = waCavewall;
else c->wall = waCavefloor; else c->wall = waCavefloor;
} }
@ -373,19 +374,22 @@ void giantLandSwitch(cell *c, int d, cell *from) {
if(y0 == 3 || y0 == 4) v=24; else v=0; if(y0 == 3 || y0 == 4) v=24; else v=0;
} }
else v = emeraldval(c); else v = emeraldval(c);
v &= ~3; if(v == 0) c->wall = waStone;
if((v == 24 || v == 32 || v == 56)) else {
c->wall = waEternalFire; v &= ~3;
else if(hrand(100) < 10) { if((v == 24 || v == 32 || v == 56))
c->wall = waGlass; c->wall = waEternalFire;
eItem protectedItems[18] = { else if(hrand(100) < 10) {
itPower, itPower, itPower, itPower, itPower, itPower, c->wall = waGlass;
itOrbLightning, itOrbLightning, itOrbThorns, itOrbThorns, eItem protectedItems[18] = {
itOrbInvis, itOrbInvis, itPower, itPower, itPower, itPower, itPower, itPower,
itOrbShield, itOrbTeleport, itOrbPsi, itOrbLightning, itOrbLightning, itOrbThorns, itOrbThorns,
itOrbDragon, itOrbIllusion, itOrbTime itOrbInvis, itOrbInvis,
}; itOrbShield, itOrbTeleport, itOrbPsi,
c->item = protectedItems[hrand(18)]; itOrbDragon, itOrbIllusion, itOrbTime
};
c->item = protectedItems[hrand(18)];
}
} }
} }
// seal entrances to the Land of Power. // seal entrances to the Land of Power.
@ -411,7 +415,7 @@ void giantLandSwitch(cell *c, int d, cell *from) {
itOrbFlash, itOrbSpeed, itOrbFire, itOrbWinter, itOrbAether, itOrbLife}; itOrbFlash, itOrbSpeed, itOrbFire, itOrbWinter, itOrbAether, itOrbLife};
c->item = powerorbs[hrand(6)]; c->item = powerorbs[hrand(6)];
} }
else if(c->type == 6 && hrand(5000) < 10) else if(!ctof(c) && hrand(5000) < 10)
c->wall = hrand(2) ? waMirror : waCloud; c->wall = hrand(2) ? waMirror : waCloud;
else if(hrand(1000) < 10 + (items[itPower] ? 10:0) + (items[itPower] + yendor::hardness())) else if(hrand(1000) < 10 + (items[itPower] ? 10:0) + (items[itPower] + yendor::hardness()))
c->monst = eMonster(moWitch + hrand(NUMWITCH)); c->monst = eMonster(moWitch + hrand(NUMWITCH));
@ -449,16 +453,19 @@ void giantLandSwitch(cell *c, int d, cell *from) {
} }
else { else {
int v = emeraldval(c); int v = emeraldval(c);
int w = v / 4; if(v == 0) c->wall = waStone;
if(randomPatternsMode) c->wall = RANDPAT ? waVinePlant : waNone; else {
else if(w == 9 || w == 10 || w == 7 || w == 8) { int w = v / 4;
c->wall = waVinePlant; if(randomPatternsMode) c->wall = RANDPAT ? waVinePlant : waNone;
else if(w == 9 || w == 10 || w == 7 || w == 8) {
c->wall = waVinePlant;
}
else if(v == 24 || v == 58 || v == 26 || v == 56)
c->wall = waVineHalfA;
else if(v == 25 || v == 59 || v == 27 || v == 57)
c->wall = waVineHalfB;
else c->wall = waNone;
} }
else if(v == 24 || v == 58 || v == 26 || v == 56)
c->wall = waVineHalfA;
else if(v == 25 || v == 59 || v == 27 || v == 57)
c->wall = waVineHalfB;
else c->wall = waNone;
} }
} }
if(d == 7 && c->wall == waVinePlant && hrand(100) < (randomPatternsMode ? 2 : 10) && !peace::on) if(d == 7 && c->wall == waVinePlant && hrand(100) < (randomPatternsMode ? 2 : 10) && !peace::on)
@ -1841,11 +1848,11 @@ void giantLandSwitch(cell *c, int d, cell *from) {
ONEMPTY { ONEMPTY {
if(purehepta && c->land == laCrossroads5 && hrand(100) < 60) if(purehepta && c->land == laCrossroads5 && hrand(100) < 60)
c->wall = waBarrier; c->wall = waBarrier;
else if(c->type == 6 && !inv::on && items[itShard] >= 10 && hrand(8000) < 120*orbcrossfun(items[itShard])) else if(!ctof(c) && !inv::on && items[itShard] >= 10 && hrand(8000) < 120*orbcrossfun(items[itShard]))
c->wall = hrand(2) ? waMirror : waCloud; c->wall = hrand(2) ? waMirror : waCloud;
else if(c->type == 6 && hyperstonesUnlocked() && hrand(8000) < 100) else if(!ctof(c) && hyperstonesUnlocked() && hrand(8000) < 100)
c->wall = hrand(2) ? waMirror : waCloud; c->wall = hrand(2) ? waMirror : waCloud;
else if(c->type == 6 && tactic::on && isCrossroads(tactic::lasttactic) && hrand(8000) < 120) else if(!ctof(c) && tactic::on && isCrossroads(tactic::lasttactic) && hrand(8000) < 120)
c->wall = hrand(2) ? waMirror : waCloud; c->wall = hrand(2) ? waMirror : waCloud;
else if(c->land == laCrossroads4 && hrand(24000) < 10 && tactic::on) else if(c->land == laCrossroads4 && hrand(24000) < 10 && tactic::on)
c->wall = waRose; c->wall = waRose;

View File

@ -1752,22 +1752,22 @@ namespace mapeditor {
int generateCanvas(cell *c) { int generateCanvas(cell *c) {
if(whichCanvas == 'C') { if(whichCanvas == 'C') {
using namespace fieldpattern; using namespace fieldpattern;
int z = fp43.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
if(z < fp43.circrad) return 0x00C000; if(z < currfp.circrad) return 0x00C000;
int z2 = fp43.getdist(fieldval(c), make_pair(fp43.otherpole,false)); int z2 = currfp.getdist(fieldval(c), make_pair(fp43.otherpole,false));
if(z2 < fp43.disthep[fp43.otherpole] - fp43.circrad) if(z2 < currfp.disthep[fp43.otherpole] - fp43.circrad)
return 0x3000; return 0x3000;
return 0x6000; return 0x6000;
} }
if(whichCanvas == 'D') { if(whichCanvas == 'D') {
using namespace fieldpattern; using namespace fieldpattern;
int z = fp43.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
return 255 * (fp43.maxdist+1-z) / fp43.maxdist; return 255 * (currfp.maxdist+1-z) / fp43.maxdist;
} }
if(whichCanvas == 'N') { if(whichCanvas == 'N') {
using namespace fieldpattern; using namespace fieldpattern;
int z = fp43.getdist(fieldval(c), make_pair(0,false)); int z = currfp.getdist(fieldval(c), make_pair(0,false));
int z2 = fp43.getdist(fieldval(c), make_pair(fp43.otherpole,false)); int z2 = currfp.getdist(fieldval(c), make_pair(fp43.otherpole,false));
if(z < z2) return 0x00C000; if(z < z2) return 0x00C000;
if(z > z2) return 0xC00000; if(z > z2) return 0xC00000;
return 0xCCCC00; return 0xCCCC00;

View File

@ -650,7 +650,7 @@ void showPickGeometry() {
if(tq & qTORUS) worldsize = torusconfig::qty; if(tq & qTORUS) worldsize = torusconfig::qty;
if(tq & qZEBRA) worldsize = targettrunc ? 12 : 40; if(tq & qZEBRA) worldsize = targettrunc ? 12 : 40;
if(tq & qFIELD) { if(tq & qFIELD) {
worldsize = size(fp43.matrices) / ts; worldsize = size(currfp.matrices) / ts;
if(!targettrunc) worldsize = (10*worldsize) / 3; if(!targettrunc) worldsize = (10*worldsize) / 3;
} }

View File

@ -7,6 +7,8 @@
// rules for the emeraldvalues of heptagons. // rules for the emeraldvalues of heptagons.
int emerald_heptagon(int parent, int dir) { int emerald_heptagon(int parent, int dir) {
if(S7 == 8 && dir > 3) dir--;
// no emeraldgen here // no emeraldgen here
if(parent == 0) return 0; if(parent == 0) return 0;
@ -357,6 +359,7 @@ int emerald_heptagon(int parent, int dir) {
#undef RULE #undef RULE
if(weirdhyperbolic) return 0;
printf("HEPTAGONAL RULE MISSING for (%d,%d)\n", parent,dir); printf("HEPTAGONAL RULE MISSING for (%d,%d)\n", parent,dir);
exit(1); exit(1);
} }
@ -408,7 +411,8 @@ int emerald_hexagon(int a, int b, int c) {
if(a==34 && b == 35 && c== 41) return 59; if(a==34 && b == 35 && c== 41) return 59;
if(a==34 && b == 40 && c== 35) return 58; if(a==34 && b == 40 && c== 35) return 58;
if(a==34 && b == 41 && c== 35) return 25; if(a==34 && b == 41 && c== 35) return 25;
printf("HEXAGONAL RULE MISSING for (%d,%d,%d)\n", a,b,c); if(!weirdhyperbolic)
printf("HEXAGONAL RULE MISSING for (%d,%d,%d)\n", a,b,c);
return 0; return 0;
// exit(1); // exit(1);
} }
@ -1005,9 +1009,16 @@ RULE50(0x1df, 0x0c6, 0x1ae, 0x0ff, 0x0df, 0x1b7, 0x0f7, 0x1a6)
#undef RULE50 #undef RULE50
int firstfiftyval(int d) {
if(S7 == 8 && d > 3) d--;
return fiftytable[0][d];
}
int nextfiftyval(int par, int gpar, int d) { int nextfiftyval(int par, int gpar, int d) {
if(S7 == 8 && d > 3) d--;
for(int i=0; i<7; i++) if(fiftytable[par][i] == gpar) for(int i=0; i<7; i++) if(fiftytable[par][i] == gpar)
return fiftytable[par][(i+d)%7]; return fiftytable[par][(i+d)%7];
if(weirdhyperbolic) return 0;
printf("fifty pattern error!\n"); printf("fifty pattern error!\n");
exit(1); exit(1);
} }
@ -1052,6 +1063,7 @@ int zebratable6[28][3] = {
// rules for the emeraldvalues of heptagons. // rules for the emeraldvalues of heptagons.
int zebra_heptagon(int parent, int dir) { int zebra_heptagon(int parent, int dir) {
if(S7 == 8 && dir > 3) dir--;
return zebratable[parent/10-4][(70+dir-(parent%10))%7]; return zebratable[parent/10-4][(70+dir-(parent%10))%7];
} }