1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-01-04 14:30:35 +00:00

editor launched in case of polygon error

This commit is contained in:
Zeno Rogue 2020-04-26 11:02:03 +02:00
parent 38d668ee7c
commit e4a38d8aa9

View File

@ -49,18 +49,63 @@ EX arbi_tiling current;
EX short& id_of(heptagon *h) { return h->zebraval; } EX short& id_of(heptagon *h) { return h->zebraval; }
struct hr_polygon_error : hr_exception {
vector<transmatrix> v;
eGeometryClass c;
int id;
hr_polygon_error(const vector<transmatrix>& _v, int _id) : v(_v), c(cgclass), id(_id) {}
~hr_polygon_error() noexcept(true) {}
};
void start_debugger(hr_polygon_error& err) {
stop_game();
if(err.c != cgclass) {
if(err.c == gcEuclid) set_geometry(gEuclid);
if(err.c == gcHyperbolic) set_geometry(gNormal);
if(err.c == gcSphere) set_geometry(gSphere);
}
if(specialland != laCanvas) {
canvas_default_wall = waInvisibleFloor;
patterns::whichCanvas = 'g';
patterns::canvasback = 0xFFFFFF;
firstland = specialland = laCanvas;
}
start_game();
drawthemap();
mapeditor::drawing_tool = true;
pushScreen(mapeditor::showDrawEditor);
mapeditor::initdraw(cwt.at);
int n = isize(err.v);
mapeditor::dtcolor = 0xFF0000FF;
mapeditor::dtwidth = 0.02;
for(int i=0; i<n-1; i++)
mapeditor::dt_add_line(tC0(err.v[i]), tC0(err.v[i+1]), 0);
mapeditor::dtcolor = 0xFFFFFFFF;
for(int i=0; i<n; i++)
mapeditor::dt_add_text(tC0(err.v[i]), 0.5, its(i));
}
void shape::build_from_angles_edges() { void shape::build_from_angles_edges() {
transmatrix at = Id; transmatrix at = Id;
vertices.clear(); vertices.clear();
int n = isize(angles); int n = isize(angles);
hyperpoint ctr = Hypc; hyperpoint ctr = Hypc;
vector<transmatrix> matrices;
for(int i=0; i<n; i++) { for(int i=0; i<n; i++) {
matrices.push_back(at);
println(hlog, "at = ", at); println(hlog, "at = ", at);
vertices.push_back(tC0(at)); vertices.push_back(tC0(at));
ctr += tC0(at); ctr += tC0(at);
at = at * xpush(edges[i]) * spin(angles[i]); at = at * xpush(edges[i]) * spin(angles[i]);
} }
if(!eqmatrix(at, Id)) throw hr_parse_exception("polygon error"); matrices.push_back(at);
if(!eqmatrix(at, Id)) throw hr_polygon_error(matrices, id);
if(sqhypot_d(3, ctr) < 1e-2) { if(sqhypot_d(3, ctr) < 1e-2) {
// this may happen for some spherical tilings // this may happen for some spherical tilings
// try to move towards the center // try to move towards the center
@ -482,6 +527,33 @@ struct hrmap_arbi : hrmap {
EX hrmap *new_map() { return new hrmap_arbi; } EX hrmap *new_map() { return new hrmap_arbi; }
void run(string fname) {
stop_game();
eGeometry g = geometry;
arbi_tiling t = current;
auto v = variation;
set_geometry(gArbitrary);
try {
load(fname);
ginf[gArbitrary].tiling_name = current.name;
}
catch(hr_polygon_error& poly) {
set_geometry(g);
set_variation(v);
current = t;
start_debugger(poly);
addMessage("polygon error, debugger started");
}
catch(hr_parse_exception& ex) {
println(hlog, "failed: ", ex.s);
set_geometry(g);
current = t;
start_game();
addMessage("failed: " + ex.s);
}
start_game();
}
#if CAP_COMMANDLINE #if CAP_COMMANDLINE
int readArgs() { int readArgs() {
using namespace arg; using namespace arg;
@ -489,17 +561,8 @@ int readArgs() {
if(0) ; if(0) ;
else if(argis("-arbi")) { else if(argis("-arbi")) {
PHASEFROM(2); PHASEFROM(2);
stop_game();
shift(); shift();
set_geometry(gArbitrary); run(args());
try {
load(args());
}
catch(hr_parse_exception& ex) {
println(hlog, "failed: ", ex.s);
exit(3);
}
ginf[gArbitrary].tiling_name = current.name;
} }
else return 1; else return 1;
return 0; return 0;
@ -510,7 +573,7 @@ auto hook = addHook(hooks_args, 100, readArgs);
EX bool in() { return geometry == gArbitrary; } EX bool in() { return geometry == gArbitrary; }
EX string tes = "tessellations/marjorie-rice.tes"; EX string tes = "tessellations/sample/marjorie-rice.tes";
EX bool linespattern(cell *c) { EX bool linespattern(cell *c) {
return current.shapes[id_of(c->master)].flags & arcm::sfLINE; return current.shapes[id_of(c->master)].flags & arcm::sfLINE;
@ -523,19 +586,7 @@ EX bool pseudohept(cell *c) {
EX void choose() { EX void choose() {
dialog::openFileDialog(tes, XLAT("open a tiling"), ".tes", dialog::openFileDialog(tes, XLAT("open a tiling"), ".tes",
[] () { [] () {
stop_game(); run(tes);
set_geometry(gArbitrary);
try {
load(tes);
ginf[gArbitrary].tiling_name = current.name;
}
catch(hr_parse_exception& ex) {
println(hlog, "failed: ", ex.s);
set_geometry(gNormal);
start_game();
addMessage("failed: " + ex.s);
}
start_game();
return true; return true;
}); });
} }