1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-11-11 19:23:01 +00:00

shot:: generate the list of all viewpoints

This commit is contained in:
Zeno Rogue
2025-10-10 09:32:05 +02:00
parent 300b8ed78f
commit 11e74a204b

View File

@@ -1081,6 +1081,8 @@ EX void menu() {
dialog::add_action([] { centering = eCentering::edge; fullcenter(); });
dialog::addBoolItem(XLAT("vertex"), centering == eCentering::vertex, 'V');
dialog::add_action([] { centering = eCentering::vertex; fullcenter(); });
dialog::addItem(XLAT("exhaustive list of viewpoints"), 'L');
dialog::add_action(generate_viewpoints);
};
});
}
@@ -1116,6 +1118,73 @@ EX void menu() {
dialog::display();
}
EX vector<cellwalker> viewpoints;
EX set<size_t> ids_seen;
EX size_t get_id(cell *c) {
if(is_highly_symmetric(geometry)) return shvid(c);
if(closed_manifold) return (size_t) c;
return shvid(c);
}
EX int num_directions(cell *c) {
vector<int> nid;
for(int i=0; i<c->type; i++) nid.push_back(get_id(c->cmove(i)));
for(int a=1; a<c->type; a++) {
bool ok = true;
for(int b=a; b<c->type; b++) if(nid[b] != nid[b-a]) ok = false;
if(ok) return a;
}
return c->type;
}
int viewpoint_id;
EX void generate_viewpoints() {
vector<cellwalker> vqueue;
viewpoints.clear();
vqueue.clear();
ids_seen.clear();
auto enqueue = [&] (cellwalker cw) {
auto id = get_id(cw.at);
println(hlog, cw, " has id ", int(id));
if(ids_seen.count(id)) return;
ids_seen.insert(id);
vqueue.push_back(cw);
};
enqueue(cwt);
for(int i=0; i<isize(vqueue); i++) {
cellwalker cw = vqueue[i];
int num = num_directions(cw.at);
println(hlog, cw, " has ", num);
for(int j=0; j<num; j++) {
cellwalker cw1 = cw + j;
viewpoints.push_back(cw1);
println(hlog, "enqueueing ", cw1+wstep);
enqueue(cw1+wstep);
}
}
if(viewpoints.empty()) {
addMessage("No viewpoints found.");
return;
}
viewpoint_id = 0;
println(hlog, "viewpoints = ", viewpoints);
dialog::editNumber(viewpoint_id, 0, isize(viewpoints) * 3, 1, 1, XLAT("viewpoints"),
XLAT("You can pick the viewpoint."));
dialog::get_di().reaction = [] {
auto bak = cwt;
auto v = viewpoint_id;
if(gmod(v, 3) == 0) centering = eCentering::face;
if(gmod(v, 3) == 1) centering = eCentering::edge;
if(gmod(v, 3) == 2) centering = eCentering::vertex;
cwt = viewpoints[gmod(v/3, isize(viewpoints))];
fullcenter();
cwt = bak;
};
}
EX }
#endif