mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-20 07:14:07 +00:00
notknot:: fixed the coloring
This commit is contained in:
parent
cf5477f4ae
commit
22e7612b7e
@ -128,7 +128,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
/* used for painting walls in a single color */
|
/* used for painting walls in a single color */
|
||||||
ucover *wall_merge;
|
ucover *wall_merge;
|
||||||
color_t wallcolor, wallcolor2;
|
color_t wallcolor, wallcolor2;
|
||||||
/* 0 = live, 1 = wall, 2 = merged, 3 = overflow */
|
/* 0 = live, 1 = wall, 2 = merged, 4 = overflow */
|
||||||
int state;
|
int state;
|
||||||
/* index in the table `all` */
|
/* index in the table `all` */
|
||||||
int index;
|
int index;
|
||||||
@ -252,7 +252,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
if(!uf || !ut) println(hlog, "null unified");
|
if(!uf || !ut) println(hlog, "null unified");
|
||||||
/* we always keep the one with the lower index */
|
/* we always keep the one with the lower index */
|
||||||
if(uf->index < ut->index) swap(uf, ut);
|
if(uf->index < ut->index) swap(uf, ut);
|
||||||
uf->state = 2; uf->merged_into = ut;
|
uf->state |= 2; uf->merged_into = ut;
|
||||||
if(uf->where != ut->where)
|
if(uf->where != ut->where)
|
||||||
println(hlog, "where confusion");
|
println(hlog, "where confusion");
|
||||||
for(int d=0; d<6; d++) {
|
for(int d=0; d<6; d++) {
|
||||||
@ -281,7 +281,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
if(i >= isize(all)) break;
|
if(i >= isize(all)) break;
|
||||||
auto u = all[i++];
|
auto u = all[i++];
|
||||||
if(u->state != 0) continue;
|
if(u->state != 0) continue;
|
||||||
if(i > terminate_at) { u->state = 3; continue; }
|
if(i > terminate_at) { u->state |= 4; continue; }
|
||||||
|
|
||||||
for(int k=0; k<6; k++) gen_adj(u, k);
|
for(int k=0; k<6; k++) gen_adj(u, k);
|
||||||
|
|
||||||
@ -294,17 +294,45 @@ struct hrmap_notknot : hrmap {
|
|||||||
if(ul->state != 0) continue;
|
if(ul->state != 0) continue;
|
||||||
auto ukl = gen_adj(uk, l);
|
auto ukl = gen_adj(uk, l);
|
||||||
auto ulk = gen_adj(ul, k);
|
auto ulk = gen_adj(ul, k);
|
||||||
if(ukl->state != 0) {
|
if(ukl->state != 0) continue;
|
||||||
funion(ukl, ulk);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(ulk->state != 0) continue;
|
if(ulk->state != 0) continue;
|
||||||
if(ukl == ulk) continue; /* okay */
|
if(ukl == ulk) continue; /* okay */
|
||||||
if(!ukl || !ulk) println(hlog, "null returned");
|
if(!ukl || !ulk) println(hlog, "null returned");
|
||||||
unify.emplace_back(ukl, ulk);
|
unify.emplace_back(ukl, ulk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make the walls single-colored */
|
/* try to make it finite */
|
||||||
|
auto ux = u;
|
||||||
|
for(int iter=0; iter<3; iter++)
|
||||||
|
for(int w: {0, 0, 1, 1, 3, 3, 4, 4}) {
|
||||||
|
ux = gen_adj(ux, w);
|
||||||
|
if(ux->state != 0) goto nxt;
|
||||||
|
}
|
||||||
|
unify.emplace_back(u, ux);
|
||||||
|
|
||||||
|
nxt: ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make the walls single-colored */
|
||||||
|
|
||||||
|
for(int i=0; i<isize(all); i++) {
|
||||||
|
auto u = all[i];
|
||||||
|
if(u->state != 0) continue;
|
||||||
|
|
||||||
|
/* convex corners */
|
||||||
|
for(int k=0; k<6; k++)
|
||||||
|
for(int l=0; l<6; l++) {
|
||||||
|
auto uk = gen_adj(u, k);
|
||||||
|
if(uk->state != 0) continue;
|
||||||
|
auto ul = gen_adj(u, l);
|
||||||
|
if(ul->state != 0) continue;
|
||||||
|
auto ukl = gen_adj(uk, l);
|
||||||
|
auto ulk = gen_adj(ul, k);
|
||||||
|
if(ukl->state != 0)
|
||||||
|
funion(ukl, ulk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* flat areas */
|
||||||
for(int k=0; k<6; k++)
|
for(int k=0; k<6; k++)
|
||||||
for(int l=0; l<6; l++) {
|
for(int l=0; l<6; l++) {
|
||||||
auto uk = gen_adj(u, k);
|
auto uk = gen_adj(u, k);
|
||||||
@ -316,6 +344,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
funion(ul, ukl);
|
funion(ul, ukl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* concave corners */
|
||||||
for(int k=0; k<6; k++)
|
for(int k=0; k<6; k++)
|
||||||
for(int l=0; l<6; l++) {
|
for(int l=0; l<6; l++) {
|
||||||
auto uk = gen_adj(u, k);
|
auto uk = gen_adj(u, k);
|
||||||
@ -324,19 +353,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
if(ul->state != 1) continue;
|
if(ul->state != 1) continue;
|
||||||
if(abs(k-l) != 3)
|
if(abs(k-l) != 3)
|
||||||
funion(ul, uk);
|
funion(ul, uk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* try to make it finite */
|
|
||||||
|
|
||||||
auto ux = u;
|
|
||||||
for(int iter=0; iter<3; iter++)
|
|
||||||
for(int w: {0, 0, 1, 1, 3, 3, 4, 4}) {
|
|
||||||
ux = gen_adj(ux, w);
|
|
||||||
if(ux->state != 0) goto nxt;
|
|
||||||
}
|
|
||||||
unify.emplace_back(u, ux);
|
|
||||||
|
|
||||||
nxt: ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* statistics */
|
/* statistics */
|
||||||
@ -360,7 +377,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
/* create the result map */
|
/* create the result map */
|
||||||
for(int i=0; i<isize(all); i++) {
|
for(int i=0; i<isize(all); i++) {
|
||||||
auto u = all[i];
|
auto u = all[i];
|
||||||
if(u->state == 2) continue;
|
if(u->state & 2) continue;
|
||||||
if(u->state == 0) wheres.insert(all[i]->where);
|
if(u->state == 0) wheres.insert(all[i]->where);
|
||||||
u->result = tailored_alloc<heptagon> (S7);
|
u->result = tailored_alloc<heptagon> (S7);
|
||||||
u->result->c7 = newCell(S7, u->result);
|
u->result->c7 = newCell(S7, u->result);
|
||||||
@ -370,7 +387,7 @@ struct hrmap_notknot : hrmap {
|
|||||||
|
|
||||||
for(int i=0; i<isize(all); i++) {
|
for(int i=0; i<isize(all); i++) {
|
||||||
auto u = all[i];
|
auto u = all[i];
|
||||||
if(u->state == 2) continue;
|
if(u->state & 2) continue;
|
||||||
|
|
||||||
for(int d=0; d<S7; d++) {
|
for(int d=0; d<S7; d++) {
|
||||||
cmov(u->where, d);
|
cmov(u->where, d);
|
||||||
@ -391,23 +408,47 @@ struct hrmap_notknot : hrmap {
|
|||||||
|
|
||||||
for(int k=0; k<23; k++) hrand(5);
|
for(int k=0; k<23; k++) hrand(5);
|
||||||
|
|
||||||
|
int colors_used = 0;
|
||||||
|
|
||||||
for(int i=0; i<isize(all); i++)
|
for(int i=0; i<isize(all); i++)
|
||||||
if(true) // if(all[i]->state == 1)
|
all[i]->wallcolor = 0;
|
||||||
|
|
||||||
|
for(int i=0; i<isize(all); i++)
|
||||||
|
if(all[i]->state == 1)
|
||||||
|
ufind(all[i])->wallcolor++;
|
||||||
|
|
||||||
|
map<int, int> sizes;
|
||||||
|
|
||||||
|
for(int i=0; i<isize(all); i++)
|
||||||
|
if((all[i]->state & 1) && ufind(all[i]) == all[i] && all[i]->wallcolor)
|
||||||
|
colors_used++,
|
||||||
|
sizes[all[i]->wallcolor]++;
|
||||||
|
|
||||||
|
for(auto p: sizes)
|
||||||
|
println(hlog, "size = ", p.first, " times ", p.second);
|
||||||
|
|
||||||
|
println(hlog, "colors_used = ", colors_used);
|
||||||
|
|
||||||
|
for(int i=0; i<isize(all); i++)
|
||||||
|
if((all[i]->state & 1) && ufind(all[i]) == all[i]) {
|
||||||
all[i]->wallcolor = hrand(0x1000000) | 0x404040,
|
all[i]->wallcolor = hrand(0x1000000) | 0x404040,
|
||||||
all[i]->wallcolor2 = hrand(0x1000000) | 0x404040;
|
all[i]->wallcolor2 = hrand(0x1000000) | 0x404040;
|
||||||
|
}
|
||||||
|
|
||||||
for(int i=0; i<isize(all); i++) {
|
for(int i=0; i<isize(all); i++) {
|
||||||
auto u = all[i];
|
auto u = all[i];
|
||||||
if(!u->result) continue;
|
if(!u->result) continue;
|
||||||
cell *c = u->result->c7;
|
cell *c = u->result->c7;
|
||||||
setdist(c, 7, c);
|
setdist(c, 7, c);
|
||||||
c->land = laCanvas;
|
c->land = laCanvas;
|
||||||
if(u->state == 1) {
|
if(u->state & 1) {
|
||||||
c->wall = waWaxWall;
|
c->wall = waWaxWall;
|
||||||
c->landparam = hrand(100) < 10 ? ufind(u)->wallcolor2 : ufind(u)->wallcolor;
|
c->landparam = hrand(100) < 10 ? ufind(u)->wallcolor2 : ufind(u)->wallcolor;
|
||||||
if(!(c->landparam & 0x404040)) println(hlog, "color found ", c->landparam);
|
if(!(ufind(u)->state & 1)) println(hlog, "connected to state ", ufind(u)->state);
|
||||||
|
if(ufind(u) == u) c->landparam = 0xFFFFFF;
|
||||||
|
// if(!(c->landparam & 0x404040)) println(hlog, "color found ", c->landparam);
|
||||||
}
|
}
|
||||||
else if(u->state == 3)
|
else if(u->state & 4)
|
||||||
c->wall = waBigTree;
|
c->wall = waBigTree;
|
||||||
else
|
else
|
||||||
c->wall = waNone;
|
c->wall = waNone;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user