mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
notknot:: solv portal
This commit is contained in:
parent
8f56ff56b9
commit
d16aa1b160
@ -329,6 +329,40 @@ struct hrmap_notknot : hrmap {
|
|||||||
|
|
||||||
return ac[0]->master;
|
return ac[0]->master;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
heptagon *create_solv_knot() {
|
||||||
|
dynamicval<eGeometry> g(geometry, base);
|
||||||
|
dynamicval<hrmap*> m(currentmap, euc);
|
||||||
|
auto ac = currentmap->allcells();
|
||||||
|
for(cell *c: ac) c->master->zebraval = 0;
|
||||||
|
|
||||||
|
//ac[1]->master->zebraval = 1;
|
||||||
|
|
||||||
|
auto hept = [&] (int x, int y, int z) {
|
||||||
|
asonov::coord co(x, y, z);
|
||||||
|
return asonov::get_at(co);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto h = hept(0, 0, 0);
|
||||||
|
|
||||||
|
h->zebraval |= 16;
|
||||||
|
|
||||||
|
int top = asonov::period_xy;
|
||||||
|
top += 2 - margin;
|
||||||
|
|
||||||
|
for(int x=1; x<top-1; x++)
|
||||||
|
for(int y=1; y<top-1; y++)
|
||||||
|
if(x==1 || y==1 || x==top-2 || y==top-2)
|
||||||
|
hept(x, y, 0)->zebraval |= 9;
|
||||||
|
|
||||||
|
hept(0, 0, (asonov::period_z+1)/2)->c7->wall = waFloorA;
|
||||||
|
|
||||||
|
hept(2, 2, 0)->zebraval |= 128;
|
||||||
|
|
||||||
|
// if(top > 4) hept(3, 3, 1)->zebraval |= 9;
|
||||||
|
|
||||||
|
return ac[0]->master;
|
||||||
|
}
|
||||||
|
|
||||||
heptagon *interpret_basemap() {
|
heptagon *interpret_basemap() {
|
||||||
dynamicval<eGeometry> g(geometry, base);
|
dynamicval<eGeometry> g(geometry, base);
|
||||||
@ -390,6 +424,8 @@ struct hrmap_notknot : hrmap {
|
|||||||
return create_trifoil_knot();
|
return create_trifoil_knot();
|
||||||
else if(base == gNil)
|
else if(base == gNil)
|
||||||
return create_nil_knot();
|
return create_nil_knot();
|
||||||
|
else if(base == gArnoldCat)
|
||||||
|
return create_solv_knot();
|
||||||
throw hr_exception();
|
throw hr_exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -600,6 +636,56 @@ struct hrmap_notknot : hrmap {
|
|||||||
next_dir: ;
|
next_dir: ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(base_map == "" && base == gArnoldCat) {
|
||||||
|
if(u->where->zebraval & 16)
|
||||||
|
for(int dir: {0,4,5}) {
|
||||||
|
auto ux = u;
|
||||||
|
int steps = dir ? asonov::period_xy : asonov::period_z;
|
||||||
|
if(dir) steps *= 2;
|
||||||
|
for(int iter=0; iter<steps; iter++) {
|
||||||
|
ux = gen_adj(ux, dir);
|
||||||
|
if(ux->state != 0) goto next_dir_cat;
|
||||||
|
}
|
||||||
|
println(hlog, "succeeded in direction ", dir);
|
||||||
|
add_to_unify(u, ux);
|
||||||
|
next_dir_cat: ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(u->where->zebraval & 128) {
|
||||||
|
for(int a=0; a<2; a++) {
|
||||||
|
vector<int> myloop;
|
||||||
|
myloop.push_back(0);
|
||||||
|
|
||||||
|
auto add_shift = [&] (int x, int y, int lev) {
|
||||||
|
if(a) swap(x, y);
|
||||||
|
while(lev>0) lev--, tie(x,y) = make_pair(x*2-y, y-x);
|
||||||
|
while(lev<0) lev++, tie(x,y) = make_pair(x+y, x+2*y);
|
||||||
|
while(x>0) x--, myloop.push_back(4);
|
||||||
|
while(y>0) y--, myloop.push_back(5);
|
||||||
|
while(x<0) x++, myloop.push_back(10);
|
||||||
|
while(y<0) y++, myloop.push_back(11);
|
||||||
|
};
|
||||||
|
|
||||||
|
auto p = asonov::period_xy;
|
||||||
|
|
||||||
|
add_shift(p-2, 0, 1);
|
||||||
|
myloop.push_back(6);
|
||||||
|
myloop.push_back(6);
|
||||||
|
add_shift(2, 0, -1);
|
||||||
|
myloop.push_back(0);
|
||||||
|
myloop.push_back(0);
|
||||||
|
add_shift(-2, 0, 1);
|
||||||
|
myloop.push_back(6);
|
||||||
|
myloop.push_back(6);
|
||||||
|
add_shift(2-p, 0, -1);
|
||||||
|
myloop.push_back(0);
|
||||||
|
|
||||||
|
if(!make_loop(u, 1, myloop))
|
||||||
|
throw hr_exception("fail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(base == gCubeTiling) {
|
if(base == gCubeTiling) {
|
||||||
special = true;
|
special = true;
|
||||||
@ -787,7 +873,9 @@ struct hrmap_notknot : hrmap {
|
|||||||
for(int l1=0; l1<u->where->type; l1++) {
|
for(int l1=0; l1<u->where->type; l1++) {
|
||||||
auto ukl = gen_adj(uk, l1);
|
auto ukl = gen_adj(uk, l1);
|
||||||
auto ulk = gen_adj(ul, k1);
|
auto ulk = gen_adj(ul, k1);
|
||||||
if(ukl->where == ulk->where && ukl->state != 0)
|
if(ukl->where == ulk->where && ukl->state != 0 &&
|
||||||
|
eqmatrix(adj(u, k) * adj(uk, l1), adj(u, l) * adj(ul, k1))
|
||||||
|
)
|
||||||
funion(ukl, ulk);
|
funion(ukl, ulk);
|
||||||
if(base == gCell600 && isNeighbor(ukl->where->c7, ulk->where->c7) && ukl->state != 0 && ulk->state != 0)
|
if(base == gCell600 && isNeighbor(ukl->where->c7, ulk->where->c7) && ukl->state != 0 && ulk->state != 0)
|
||||||
funion(ukl, ulk);
|
funion(ukl, ulk);
|
||||||
@ -803,6 +891,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* flat areas */
|
/* flat areas */
|
||||||
|
if(!asonov::in())
|
||||||
for(int k=0; k<u->where->type; k++)
|
for(int k=0; k<u->where->type; k++)
|
||||||
for(int l=0; l<u->where->type; l++) {
|
for(int l=0; l<u->where->type; l++) {
|
||||||
auto uk = gen_adj(u, k);
|
auto uk = gen_adj(u, k);
|
||||||
|
Loading…
Reference in New Issue
Block a user