mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-24 01:00:25 +00:00
simple patterns for weird hyperbolic
This commit is contained in:
parent
f2af1d63f6
commit
3c600d7d6b
35
cell.cpp
35
cell.cpp
@ -729,10 +729,14 @@ bool ishex1(cell *c) {
|
||||
else return c->type != S6;
|
||||
}
|
||||
|
||||
int val46(cell *c) {
|
||||
return ctof(c) ? c->master->emeraldval :
|
||||
((c->master->emeraldval & 1) ^ ((c->master->emeraldval & 2)>>1) ^ (c->spin(0)&1)) ? 8 : 4;
|
||||
}
|
||||
|
||||
int emeraldval(cell *c) {
|
||||
if(euclid) return eupattern(c);
|
||||
if(a46) return ctof(c) ? ((c->master->emeraldval & 2) ? 1 : 0) :
|
||||
((c->master->emeraldval & 1) ^ ((c->master->emeraldval & 2)>>1) ^ (c->spin(0)&1)) ? 8 : 4;
|
||||
if(a46) return val46(c);
|
||||
if(sphere) return 0;
|
||||
if(ctof(c))
|
||||
return c->master->emeraldval >> 3;
|
||||
@ -849,10 +853,16 @@ int eufifty(cell *c) {
|
||||
}
|
||||
}
|
||||
|
||||
int val38(cell *c) {
|
||||
if(ctof(c)) return c->master->fiftyval;
|
||||
else return 4 ^ c->master->fiftyval ^ (c->spin(0) & 1);
|
||||
}
|
||||
|
||||
int fiftyval(cell *c) {
|
||||
if(a38) return val38(c);
|
||||
if(euclid) return eufifty(c) * 32;
|
||||
if(sphere || S7>7 || S6>6) return 0;
|
||||
if(c->type == 7)
|
||||
if(ctof(c))
|
||||
return c->master->fiftyval;
|
||||
else {
|
||||
return bitmajority(
|
||||
@ -953,9 +963,28 @@ int fiftyval049(cell *c) {
|
||||
|
||||
// zebraval
|
||||
|
||||
int dir_truncated457(cell *c) {
|
||||
int wset = 0;
|
||||
for(int i=0; i<4; i++)
|
||||
if(zebra40(createMov(c, i*2))&2) wset |= (1<<i);
|
||||
if(wset == 0) return -8;
|
||||
if(wset == 15) return -10;
|
||||
if(wset == 3) return 1;
|
||||
if(wset == 6) return 3;
|
||||
if(wset == 12) return 5;
|
||||
if(wset == 9) return 7;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int zebra40(cell *c) {
|
||||
if(euclid) return eupattern(c);
|
||||
else if(a46) return val46(c);
|
||||
else if(ctof(c)) return (c->master->zebraval/10);
|
||||
else if(a4) {
|
||||
int ws = dir_truncated457(c);
|
||||
if(ws < 0) return -ws;
|
||||
return 16 + (ws/2);
|
||||
}
|
||||
else if(sphere) return 0;
|
||||
else if(euclid) return eupattern(c);
|
||||
else if(S3 == 4 && S7 == 6) {
|
||||
|
@ -79,7 +79,9 @@ heptagon *buildHeptagon(heptagon *parent, int d, hstate s, int pard = 0, int fix
|
||||
h->emeraldval = emerald_heptagon(parent->emeraldval, d);
|
||||
h->zebraval = zebra_heptagon(parent->zebraval, d);
|
||||
h->fieldval = currfp.connections[fieldpattern::btspin(parent->fieldval, d)];
|
||||
if(parent->s == hsOrigin)
|
||||
if(a38)
|
||||
h->fiftyval = (parent->fiftyval ^ d ^ 1) & 1;
|
||||
else if(parent->s == hsOrigin)
|
||||
h->fiftyval = firstfiftyval(d);
|
||||
else
|
||||
h->fiftyval = nextfiftyval(parent->fiftyval, parent->move[0]->fiftyval, d);
|
||||
@ -206,7 +208,7 @@ heptagon *createStep(heptagon *h, int d) {
|
||||
else if(S3 == 4) {
|
||||
if(d == 1) {
|
||||
heptspin hs;
|
||||
hs.h = h;
|
||||
hs.h = h;
|
||||
hs.spin = 0;
|
||||
hs.mirrored = false;
|
||||
hs = hsstep(hs, -1);
|
||||
|
1
init.cpp
1
init.cpp
@ -345,6 +345,7 @@ void addMessage(string s, char spamtype = 0);
|
||||
#define S3 ginf[geometry].vertex
|
||||
#define weirdhyperbolic (S7 > 7 || S3 > 3)
|
||||
#define weirdhyperbolic (S7 > 7 || S3 > 3)
|
||||
#define stdhyperbolic (S7 == 7 && S3 == 3)
|
||||
|
||||
#define a4 (S3 == 4)
|
||||
#define a45 (S3 == 4 && S7 == 5)
|
||||
|
121
mapeditor.cpp
121
mapeditor.cpp
@ -352,12 +352,41 @@ namespace mapeditor {
|
||||
if(!c2) return 0;
|
||||
return neighborId(c, c2);
|
||||
}
|
||||
|
||||
int patterndir46(cell *c, int bits) {
|
||||
if(ctof(c)) {
|
||||
int b = c->master->emeraldval & bits;
|
||||
return (b&1) ^ (b & 2 ? 1 : 0);
|
||||
}
|
||||
else
|
||||
return ((c->mov[0]->master->emeraldval + c->spin(0)) & 1) ? 2 : 0;
|
||||
}
|
||||
|
||||
int patterndir38(cell *c) {
|
||||
if(ctof(c)) return c->master->fiftyval;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int patterndir457(cell *c) {
|
||||
if(!ctof(c)) {
|
||||
int d = dir_truncated457(c);
|
||||
if(d >= 0) return d;
|
||||
return 0;
|
||||
}
|
||||
for(int i=0; i<c->type; i++)
|
||||
if((zebra40(createStep(c->master, i + S7/2)->c7)&2) == (zebra40(createStep(c->master, i + 1 + S7/2)->c7)&2))
|
||||
return i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int patterndir(cell *c, char w) {
|
||||
switch(w) {
|
||||
case 'z': {
|
||||
int t = zebra40(c);
|
||||
|
||||
if(a46) return patterndir46(c, 3);
|
||||
if(a4) return patterndir457(c);
|
||||
if(a38) return patterndir38(c);
|
||||
int t = zebra40(c);
|
||||
|
||||
if(euclid) return (t*4) % 6;
|
||||
|
||||
int t4 = t>>2, tcdir = 0;
|
||||
@ -378,13 +407,10 @@ namespace mapeditor {
|
||||
}
|
||||
|
||||
case 'f': {
|
||||
if(a46) return patterndir46(c, 1);
|
||||
if(a38) return patterndir38(c);
|
||||
if(a4) return patterndir457(c);
|
||||
int t = emeraldval(c);
|
||||
if(a46) {
|
||||
if(ctof(c))
|
||||
return (c->master->emeraldval & 1) ^ (c->master->emeraldval & 2 ? 1 : 0);
|
||||
else
|
||||
return ((c->mov[0]->master->emeraldval + c->spin(0)) & 1) ? 2 : 0;
|
||||
}
|
||||
if(euclid) return 0;
|
||||
int tcdir = 0, tbest = (t&3);
|
||||
for(int i=0; i<c->type; i++) {
|
||||
@ -399,6 +425,9 @@ namespace mapeditor {
|
||||
}
|
||||
|
||||
case 'p': {
|
||||
if(a46) return patterndir46(c, 2);
|
||||
if(a4) return patterndir457(c);
|
||||
if(a38) return patterndir38(c);
|
||||
int tcdir = -1, tbest = -1;
|
||||
int pa = polara50(c);
|
||||
int pb = polarb50(c);
|
||||
@ -417,12 +446,9 @@ namespace mapeditor {
|
||||
|
||||
case 0: {
|
||||
if(euclid) return 0;
|
||||
if(a46) {
|
||||
if(ctof(c))
|
||||
return c->master->emeraldval;
|
||||
else
|
||||
return ((c->mov[0]->master->emeraldval + c->spin(0)) & 1) ? 2 : 0;
|
||||
}
|
||||
if(a46) return patterndir46(c, 1);
|
||||
if(a4) return patterndir457(c);
|
||||
if(a38) return patterndir38(c);
|
||||
int u = nopattern(c);
|
||||
|
||||
if(u == 6) {
|
||||
@ -764,25 +790,43 @@ namespace mapeditor {
|
||||
}
|
||||
dialog::init();
|
||||
|
||||
if(a46)
|
||||
dialog::addBoolItem("two colors", (whichPattern == 'f'), 'f');
|
||||
else
|
||||
dialog::addBoolItem(XLAT(euclid ? "three colors" : "Emerald Pattern"), (whichPattern == 'f'), 'f');
|
||||
if(!a4)
|
||||
if(a46) {
|
||||
dialog::addBoolItem(XLAT("two colors"), (whichPattern == 'f'), 'f');
|
||||
dialog::addBoolItem(XLAT("two colors rotated"), (whichPattern == 'z'), 'z');
|
||||
}
|
||||
else if(a4) {
|
||||
dialog::addBoolItem(XLAT("Zebra Pattern"), (whichPattern == 'z'), 'z');
|
||||
}
|
||||
else if(a38) {
|
||||
dialog::addBoolItem(XLAT("Zebra Pattern"), (whichPattern == 'z'), 'z');
|
||||
dialog::addBoolItem(XLAT("broken Emerald Pattern"), (whichPattern == 'f'), 'f');
|
||||
dialog::addBoolItem(XLAT("rotated pattern"), (whichPattern == 'p'), 'p');
|
||||
}
|
||||
else if(euclid) {
|
||||
dialog::addBoolItem(XLAT("three colors"), (whichPattern == 'f'), 'f');
|
||||
dialog::addBoolItem(XLAT("Palace Pattern"), (whichPattern == 'p'), 'p');
|
||||
if(!a4)
|
||||
dialog::addBoolItem(XLAT(euclid ? "three colors rotated" : "Zebra Pattern"), (whichPattern == 'z'), 'z');
|
||||
dialog::addBoolItem(XLAT("field pattern"), (whichPattern == 'F'), 'F');
|
||||
dialog::addBoolItem(XLAT("three colors rotated"), (whichPattern == 'z'), 'z');
|
||||
}
|
||||
else {
|
||||
if(!stdhyperbolic)
|
||||
dialog::addInfo("patterns do not work correctly in this geometry!");
|
||||
|
||||
if(whichPattern == 'f') symRotation = true;
|
||||
dialog::addBoolItem(XLAT("Emerald Pattern"), (whichPattern == 'f'), 'f');
|
||||
dialog::addBoolItem(XLAT("Palace Pattern"), (whichPattern == 'p'), 'p');
|
||||
dialog::addBoolItem(XLAT("Zebra Pattern"), (whichPattern == 'z'), 'z');
|
||||
}
|
||||
if(euclid)
|
||||
dialog::addBoolItem(XLAT("torus pattern"), (whichPattern == 'F'), 'F');
|
||||
else if(!sphere)
|
||||
dialog::addBoolItem(XLAT("field pattern"), (whichPattern == 'F'), 'F');
|
||||
|
||||
if(whichPattern == 'f' && stdhyperbolic) symRotation = true;
|
||||
if(whichPattern == 'F') ;
|
||||
else if(!euclid) {
|
||||
dialog::addBoolItem(XLAT("rotational symmetry"), (symRotation), '0');
|
||||
dialog::addBoolItem(XLAT("symmetry 0-1"), (sym01), '1');
|
||||
if(!a46 || !nontruncated)
|
||||
dialog::addBoolItem(XLAT("symmetry 0-2"), (sym02), '2');
|
||||
if(!a46)
|
||||
dialog::addBoolItem(XLAT("symmetry 0-3"), (sym03), '3');
|
||||
dialog::addBoolItem(XLAT("symmetry 0-2"), (sym02), '2');
|
||||
dialog::addBoolItem(XLAT("symmetry 0-3"), (sym03), '3');
|
||||
}
|
||||
else
|
||||
dialog::addBoolItem(XLAT("edit all three colors"), (symRotation), '0');
|
||||
@ -936,12 +980,17 @@ namespace mapeditor {
|
||||
if(euclid) return (symRotation && (i<3)) ? 0 : i;
|
||||
i = subpatternEmerald(i);
|
||||
if(symRotation) {
|
||||
if(i >= 8 && i < 12) i -= 4;
|
||||
if(i >= 12 && i < 16) i -= 8;
|
||||
if(i >= 20 && i < 24) i -= 4;
|
||||
if(i >= 24 && i < 28) i -= 8;
|
||||
if(i >= 32 && i < 36) i -= 4;
|
||||
if(i >= 36 && i < 40) i -= 8;
|
||||
if(a4 && !a46) {
|
||||
if(i >= 4 && i < 7) i -= 4;
|
||||
}
|
||||
else {
|
||||
if(i >= 8 && i < 12) i -= 4;
|
||||
if(i >= 12 && i < 16) i -= 8;
|
||||
if(i >= 20 && i < 24) i -= 4;
|
||||
if(i >= 24 && i < 28) i -= 8;
|
||||
if(i >= 32 && i < 36) i -= 4;
|
||||
if(i >= 36 && i < 40) i -= 8;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
@ -960,6 +1009,8 @@ namespace mapeditor {
|
||||
case 'f':
|
||||
return subpatternEmerald(emeraldval(c)); // 44 to 99
|
||||
case 'p': {
|
||||
if(a46) return subpatternEmerald(val46(c));
|
||||
if(a38) return val38(c);
|
||||
int i = fiftyval049(c);
|
||||
i *= 4;
|
||||
if(polara50(c)) i|=1;
|
||||
@ -978,11 +1029,13 @@ namespace mapeditor {
|
||||
|
||||
int realpattern(cell *c) {
|
||||
switch(whichPattern) {
|
||||
case 'z':
|
||||
case 'z':
|
||||
return zebra40(c); // 4 to 43
|
||||
case 'f':
|
||||
return emeraldval(c); // 44 to 99
|
||||
case 'p': {
|
||||
if(a46) return val46(c);
|
||||
if(a38) return val38(c);
|
||||
int i = fiftyval049(c);
|
||||
i *= 4;
|
||||
if(polara50(c)) i|=1;
|
||||
|
Loading…
Reference in New Issue
Block a user