mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-11-21 08:04:48 +00:00
arbiquotient:: draw state while searching
This commit is contained in:
@@ -30,7 +30,8 @@ struct aqdata {
|
|||||||
cellwalker parent;
|
cellwalker parent;
|
||||||
int size;
|
int size;
|
||||||
int id;
|
int id;
|
||||||
aqdata(cell *c) : where(c), parent(c) { id = next_id++; size = 1; closed = false; }
|
bool unified_to_start;
|
||||||
|
aqdata(cell *c) : where(c), parent(c) { id = next_id++; size = 1; closed = false; unified_to_start = false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* the stack of known unifications */
|
/* the stack of known unifications */
|
||||||
@@ -364,12 +365,14 @@ void recurse() {
|
|||||||
for(auto li: active) if(li != cw0.at) {
|
for(auto li: active) if(li != cw0.at) {
|
||||||
|
|
||||||
auto tryout = [&] (cellwalker cw1) {
|
auto tryout = [&] (cellwalker cw1) {
|
||||||
|
aq.at(cw1.at).unified_to_start = true;
|
||||||
unifications.emplace_back(cw0, cw1);
|
unifications.emplace_back(cw0, cw1);
|
||||||
bool b = apply_uni();
|
bool b = apply_uni();
|
||||||
if(b) recurse();
|
if(b) recurse();
|
||||||
else unifications.clear();
|
else unifications.clear();
|
||||||
auto backup_iterator = backup.begin();
|
auto backup_iterator = backup.begin();
|
||||||
for(auto p: allaq) p->parent = *(backup_iterator++);
|
for(auto p: allaq) p->parent = *(backup_iterator++);
|
||||||
|
aq.at(cw1.at).unified_to_start = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto oshvid = shvid(li);
|
auto oshvid = shvid(li);
|
||||||
@@ -468,6 +471,25 @@ struct hrmap_autoquotient : hrmap {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool aq_drawcell(cell *c, const shiftmatrix& V) {
|
||||||
|
auto p = at_or_null(aq, c);
|
||||||
|
if(!p) return false;
|
||||||
|
if(c == currentmap->gamestart()) {
|
||||||
|
queuepoly(V * ddspin(c, 0), cgi.shAsymmetric, 0xFFFF00FF);
|
||||||
|
}
|
||||||
|
if(p->unified_to_start) {
|
||||||
|
auto cw = cellwalker(c);
|
||||||
|
auto cw1 = ufind(cw);
|
||||||
|
auto cw2 = cw_add_diff(cw, currentmap->gamestart(), cw1);
|
||||||
|
queuepoly(V * ddspin(c, cw2.spin) * (cw2.mirrored?Mirror:Id), cgi.shAsymmetric, 0x0000FFFF);
|
||||||
|
}
|
||||||
|
if(p->parent.at == c)
|
||||||
|
queuepoly(V, cgi.shDisk, 0xFFFFFFF);
|
||||||
|
else
|
||||||
|
queuepoly(V, cgi.shDisk, 0x202020FF);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void show_auto_dialog() {
|
void show_auto_dialog() {
|
||||||
cmode = sm::SIDE | sm::DIALOG_STRICT_X;
|
cmode = sm::SIDE | sm::DIALOG_STRICT_X;
|
||||||
gamescreen();
|
gamescreen();
|
||||||
@@ -482,12 +504,13 @@ void show_auto_dialog() {
|
|||||||
add_edit(dedup_mirror);
|
add_edit(dedup_mirror);
|
||||||
dialog::addBoolItem(XLAT("running"), running, 'r');
|
dialog::addBoolItem(XLAT("running"), running, 'r');
|
||||||
dialog::add_action([] {
|
dialog::add_action([] {
|
||||||
println(hlog, "action");
|
|
||||||
if(!running) {
|
if(!running) {
|
||||||
|
int p = addHook(hooks_drawcell, 100, aq_drawcell);
|
||||||
running = true;
|
running = true;
|
||||||
displaying = true;
|
displaying = true;
|
||||||
all_found.clear();
|
all_found.clear();
|
||||||
auto_create(aq_max);
|
auto_create(aq_max);
|
||||||
|
delHook(hooks_drawcell, p);
|
||||||
}
|
}
|
||||||
running = false;
|
running = false;
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user