mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-11-20 23:54:49 +00:00
exporting/importing quotient lists
This commit is contained in:
@@ -203,12 +203,7 @@ string statstring() {
|
||||
|
||||
set<buckethash_t> seen_outputs;
|
||||
|
||||
struct qdata {
|
||||
string name;
|
||||
vector<int> connections;
|
||||
};
|
||||
|
||||
vector<qdata> all_found;
|
||||
auto& all_found = arb::current.quotients;
|
||||
|
||||
void create() {
|
||||
clear_all();
|
||||
@@ -357,7 +352,7 @@ void recurse() {
|
||||
println(hlog, "[", isize(all_found), "] ", bqo);
|
||||
auto ss = statstring();
|
||||
if(ss == "ERROR") return;
|
||||
all_found.push_back(qdata{ss + format(" %016lX", (long) vhash), bqo});
|
||||
all_found.push_back(arb::quotient_data{ss + format(" %016lX", (long) vhash), bqo});
|
||||
if(!(cgflags & qCLOSED)) return;
|
||||
}
|
||||
indenter ind(2);
|
||||
@@ -487,6 +482,43 @@ bool aq_drawcell(cell *c, const shiftmatrix& V) {
|
||||
return false;
|
||||
}
|
||||
|
||||
string export_filename = "tessellations/exported.tes";
|
||||
|
||||
EX bool export_tes(string fname) {
|
||||
fhstream f(fname, "wt");
|
||||
if(!f.f) return false;
|
||||
auto& ac = arb::current_or_slided();
|
||||
println(f, "## ", ac.name, " (exported)");
|
||||
println(f, (cgflags & qAFFINE) ? "a2." : hyperbolic ? "h2." : euclid ? "e2." : "s2.");
|
||||
auto& shs = ac.shapes;
|
||||
for(int i=0; i<isize(shs); i++) {
|
||||
print(f, "tile(");
|
||||
for(int j=0; j<shs[i].cycle_length; j++)
|
||||
print(f, format("%.15f,%.15f,", shs[i].edges[j], shs[i].angles[j]));
|
||||
print(f, "*", shs[i].size() / shs[i].cycle_length);
|
||||
if(shs[i].symmetric_value) print(f, ",|", shs[i].symmetric_value);
|
||||
println(f, ")");
|
||||
}
|
||||
for(int i=0; i<isize(shs); i++) {
|
||||
for(int j=0; j<shs[i].cycle_length; j++) {
|
||||
auto& co = shs[i].connections[j];
|
||||
println(f, "c(", i, ",", j, ",", co.sid, ",", co.eid, ",", co.mirror, ")");
|
||||
}
|
||||
}
|
||||
for(auto& af: all_found) {
|
||||
println(f, "#/ ", af.name);
|
||||
print(f, "quotient(");
|
||||
int ct = 0;
|
||||
for(auto v: af.connections) {
|
||||
if(ct++) print(f, ",");
|
||||
print(f, v &~ quotientspace::symmask);
|
||||
if(v & quotientspace::symmask) print(f, "^");
|
||||
}
|
||||
println(f, ")");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void show_auto_dialog() {
|
||||
cmode = sm::SIDE | sm::DIALOG_STRICT_X;
|
||||
if(running) cmode |= sm::NO_EXIT;
|
||||
@@ -512,13 +544,19 @@ void show_auto_dialog() {
|
||||
}
|
||||
running = false;
|
||||
});
|
||||
dialog::addSelItem(XLAT("quotients found"), its(isize(all_found)), 'n');
|
||||
dialog::addSelItem(XLAT("export the quotients found"), its(isize(all_found)), 'E');
|
||||
dialog::add_action([] {
|
||||
dialog::openFileDialog(export_filename, XLAT("export to file:"), ".tes",
|
||||
[] () {
|
||||
return export_tes(export_filename);
|
||||
});
|
||||
});
|
||||
if(running) dialog::addBreak(100);
|
||||
else dialog::addBack();
|
||||
dialog::display();
|
||||
}
|
||||
|
||||
EX void enable_quotient_data(const struct qdata& q) {
|
||||
EX void enable_quotient_data(const struct arb::quotient_data& q) {
|
||||
stop_game();
|
||||
cgflags |= qANYQ | qCLOSED;
|
||||
quotient_data = q.connections;
|
||||
@@ -563,6 +601,7 @@ auto aqhook =
|
||||
arg::add3("-aq-test", [] { try { default_list(); create(); } catch(aq_overflow&) { println(hlog, "AQ overflow"); } })
|
||||
+ arg::add3("-aq-auto", [] { displaying = false; running = true; arg::shift(); auto_create(arg::argi()); })
|
||||
+ arg::add3("-aq-enable", [] { arg::shift(); enable_by_id(arg::argi()); })
|
||||
+ arg::add3("-aq-export", [] { arg::shift(); export_tes(arg::args()); })
|
||||
+ arg::add3("-d:aq", [] { arg::launch_dialog(show_dialog); })
|
||||
+ addHook(hooks_configfile, 100, [] {
|
||||
param_i(aq_max, "aq_max")
|
||||
|
||||
@@ -117,6 +117,11 @@ struct intslider {
|
||||
int max;
|
||||
};
|
||||
|
||||
struct quotient_data {
|
||||
string name;
|
||||
vector<int> connections;
|
||||
};
|
||||
|
||||
struct arbi_tiling {
|
||||
|
||||
int order;
|
||||
@@ -162,6 +167,8 @@ struct arbi_tiling {
|
||||
eGeometryClass get_class() { return get_geometry().kind; }
|
||||
|
||||
ld scale();
|
||||
|
||||
vector<quotient_data> quotients;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -961,6 +968,7 @@ EX void set_defaults(arb::arbi_tiling& c, bool keep_sliders, string fname) {
|
||||
c.sliders.clear();
|
||||
c.intsliders.clear();
|
||||
}
|
||||
c.quotients.clear();
|
||||
}
|
||||
|
||||
EX void load(const string& fname, bool load_as_slided IS(false), bool keep_sliders IS(false)) {
|
||||
@@ -986,6 +994,7 @@ EX void load(const string& fname, bool load_as_slided IS(false), bool keep_slide
|
||||
c.shapes[ai].flags |= f;
|
||||
ep.force_eat(")");
|
||||
};
|
||||
string quotname = "unnamed";
|
||||
while(true) {
|
||||
|
||||
ep.extra_params["distunit"] = distunit;
|
||||
@@ -995,6 +1004,7 @@ EX void load(const string& fname, bool load_as_slided IS(false), bool keep_slide
|
||||
if(ep.next() == 0) break;
|
||||
if(ep.eat("#")) {
|
||||
bool doubled = ep.eat("#");
|
||||
bool is_quotname = ep.eat("/");
|
||||
while(ep.eat(" ")) ;
|
||||
string s = "";
|
||||
while(ep.next() >= 32) s += ep.next(), ep.at++;
|
||||
@@ -1005,6 +1015,7 @@ EX void load(const string& fname, bool load_as_slided IS(false), bool keep_slide
|
||||
c.comment += "\n";
|
||||
}
|
||||
}
|
||||
if(is_quotname) quotname = s;
|
||||
}
|
||||
else if(ep.eat("c2(")) {
|
||||
ld curv = ep.rparse(0);
|
||||
@@ -1236,6 +1247,17 @@ EX void load(const string& fname, bool load_as_slided IS(false), bool keep_slide
|
||||
ep.force_eat(")");
|
||||
throw connection_debug_request(i);
|
||||
}
|
||||
else if(ep.eat("quotient(")) {
|
||||
c.quotients.emplace_back(quotient_data{quotname, {}});
|
||||
auto& con = c.quotients.back().connections;
|
||||
con.push_back(ep.iparse(0));
|
||||
while(true) {
|
||||
if(ep.eat("^")) con.back() ^= quotientspace::symmask;
|
||||
else if(ep.eat(",")) con.push_back(ep.iparse(0));
|
||||
else if(ep.eat(")")) break;
|
||||
else throw hr_parse_exception("expecing ), ^ or comma, " + ep.where());
|
||||
}
|
||||
}
|
||||
else if(ep.eat("stretch_shear(")) {
|
||||
ld stretch = ep.rparse(0);
|
||||
ep.force_eat(",");
|
||||
|
||||
Reference in New Issue
Block a user