mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-20 15:24:07 +00:00
rulegen:: improved get_side
This commit is contained in:
parent
b307ab2762
commit
85acd05ee7
31
rulegen.cpp
31
rulegen.cpp
@ -743,15 +743,25 @@ EX set<tcell*> single_live_branch_close_to_root;
|
|||||||
|
|
||||||
/** is what on the left side, or the right side, of to_what? */
|
/** is what on the left side, or the right side, of to_what? */
|
||||||
|
|
||||||
int get_side(tcell *what, tcell *to_what) {
|
int get_side(twalker what) {
|
||||||
twalker w(what, -1);
|
twalker w = what;
|
||||||
twalker tw(to_what, -1);
|
twalker tw = what + wstep;
|
||||||
auto adv = [] (twalker& cw) {
|
auto adv = [] (twalker& cw) {
|
||||||
int d = get_parent_dir(cw.at);
|
int d = get_parent_dir(cw.at);
|
||||||
|
ufind(cw);
|
||||||
|
if(cw.at->move(d)->dist >= cw.at->dist) {
|
||||||
|
println(hlog, "/CSV/ get_parent_dir error at ", cw, " and ", cw.at->move(d), ": ", cw.at->dist, "::", cw.at->move(d)->dist);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
cw.spin = d;
|
cw.spin = d;
|
||||||
cw += wstep;
|
cw += wstep;
|
||||||
};
|
};
|
||||||
|
int steps = 0;
|
||||||
while(w.at != tw.at) {
|
while(w.at != tw.at) {
|
||||||
|
steps++; if(steps > 1000000) {
|
||||||
|
debuglist = {what, w, tw};
|
||||||
|
throw rulegen_failure("get_side freeze");
|
||||||
|
}
|
||||||
ufind(w); ufind(tw);
|
ufind(w); ufind(tw);
|
||||||
if(w.at->dist > tw.at->dist)
|
if(w.at->dist > tw.at->dist)
|
||||||
adv(w);
|
adv(w);
|
||||||
@ -770,7 +780,7 @@ int get_side(tcell *what, tcell *to_what) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// failed to solve this in the simple way (ended at the root) -- go around the tree
|
// failed to solve this in the simple way (ended at the root) -- go around the tree
|
||||||
twalker wl(what, get_parent_dir(what));
|
twalker wl = what;
|
||||||
twalker wr = wl;
|
twalker wr = wl;
|
||||||
auto go = [&] (twalker& cw, int delta) {
|
auto go = [&] (twalker& cw, int delta) {
|
||||||
int d = get_parent_dir(cw.at);
|
int d = get_parent_dir(cw.at);
|
||||||
@ -778,11 +788,18 @@ int get_side(tcell *what, tcell *to_what) {
|
|||||||
cw += wstep;
|
cw += wstep;
|
||||||
cw+=delta;
|
cw+=delta;
|
||||||
};
|
};
|
||||||
|
auto to_what = what + wstep;
|
||||||
|
auto ws = what; go(ws, 0); if(ws == to_what) return 0;
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
|
steps++; if(steps > 1000000) {
|
||||||
|
debuglist = {what, to_what, w, tw};
|
||||||
|
throw rulegen_failure("get_side freeze II");
|
||||||
|
}
|
||||||
go(wl, -1);
|
go(wl, -1);
|
||||||
go(wr, +1);
|
go(wr, +1);
|
||||||
if(wl.at == to_what) return +1;
|
if(wl == to_what) return +1;
|
||||||
if(wr.at == to_what) return -1;
|
if(wr == to_what) return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,7 +833,7 @@ code_t id_at_spin(twalker cw) {
|
|||||||
else if(y == 0) x = C_EQUAL;
|
else if(y == 0) x = C_EQUAL;
|
||||||
else if(y == -1) x = C_UNCLE;
|
else if(y == -1) x = C_UNCLE;
|
||||||
else throw rulegen_failure("distance problem y=" + its(y) + lalign(0, " cs=", cs, " cs2=", cs2, " peek=", cs.peek(), " dist=", cs.at->dist, " dist2=", cs2.at->dist));
|
else throw rulegen_failure("distance problem y=" + its(y) + lalign(0, " cs=", cs, " cs2=", cs2, " peek=", cs.peek(), " dist=", cs.at->dist, " dist2=", cs2.at->dist));
|
||||||
auto gs = get_side(cs.at, cs.peek());
|
auto gs = get_side(cs);
|
||||||
if(gs == 0 && x == C_UNCLE) x = C_PARENT;
|
if(gs == 0 && x == C_UNCLE) x = C_PARENT;
|
||||||
if(gs > 0) x++;
|
if(gs > 0) x++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user