1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-27 14:37:16 +00:00

rogueviz:: fifteen:: triangle markers

This commit is contained in:
Zeno Rogue 2021-06-25 13:46:08 +02:00
parent 6a0e18d22d
commit 5cedf8863a

View File

@ -22,11 +22,18 @@ struct celldata {
map<cell*, celldata> fif; map<cell*, celldata> fif;
vector<int> triangle_markers;
vector<cell*> seq;
vector<ld> turns;
eWall empty = waChasm; eWall empty = waChasm;
enum ePenMove { pmJump, pmRotate, pmAdd, pmMirrorFlip }; enum ePenMove { pmJump, pmRotate, pmAdd, pmMirrorFlip };
ePenMove pen; ePenMove pen;
bool show_triangles = false;
bool show_dots = true;
void init_fifteen(int q = 20) { void init_fifteen(int q = 20) {
println(hlog, "init_fifteen"); println(hlog, "init_fifteen");
auto ac = currentmap->allcells(); auto ac = currentmap->allcells();
@ -37,8 +44,33 @@ void init_fifteen(int q = 20) {
println(hlog, "ok"); println(hlog, "ok");
} }
void compute_triangle_markers() {
triangle_markers.resize(isize(fif));
seq.resize(isize(fif));
for(auto& p: fif) {
cell *c = p.first;
forCellIdEx(c1, i, c) if(fif.count(c1) && fif[c1].target == p.second.target + 1) {
triangle_markers[p.second.target] = (i - p.second.targetdir) * (p.second.targetmirror ? -1 : 1);
}
if(p.second.current == 0)
seq.back() = c;
else {
seq[p.second.current-1] = c;
}
}
println(hlog, triangle_markers);
for(int i=0; i<isize(fif); i++) {
turns.push_back(triangle_markers[i+1] == 0 ? 90*degree : 0);
}
}
string dotted(int i) { string dotted(int i) {
string s = its(i); string s = its(i);
if(!show_dots) return s;
bool confusing = true; bool confusing = true;
for(char c: s) if(!among(c, '0', '6', '8', '9') && !(nonorientable && c == '3')) for(char c: s) if(!among(c, '0', '6', '8', '9') && !(nonorientable && c == '3'))
confusing = false; confusing = false;
@ -108,6 +140,12 @@ bool draw_fifteen(cell *c, const shiftmatrix& V) {
cdir = 0; cdir = 0;
} }
write_in_space(V * ddspin(c,cdir,0) * (cmir ? MirrorX: Id), 72, 1, dotted(cur), 0xFF, 0, 8); write_in_space(V * ddspin(c,cdir,0) * (cmir ? MirrorX: Id), 72, 1, dotted(cur), 0xFF, 0, 8);
if(show_triangles) {
cellwalker cw(c, cdir);
cw += triangle_markers[cur] - 1;
poly_outline = 0xFF;
queuepoly(V * ddspin(c, cw.spin, 0) * xpush(hdist0(tC0(currentmap->adj(c, cw.spin))) * .45 - cgi.zhexf * .3), cgi.shTinyArrow, 0xFF);
}
} }
return false; return false;
@ -241,6 +279,8 @@ void edit_fifteen() {
fif.erase(c); fif.erase(c);
} }
} }
compute_triangle_markers();
} }
else if(doexiton(sym, uni)) popScreen(); else if(doexiton(sym, uni)) popScreen();
@ -250,7 +290,7 @@ void edit_fifteen() {
void launch() { void launch() {
/* setup */ /* setup */
stop_game(); stop_game();
specialland = firstland = laCanvas; enable_canvas();
canvas_default_wall = waChasm; canvas_default_wall = waChasm;
start_game(); start_game();
init_fifteen(); init_fifteen();
@ -283,6 +323,7 @@ void load_fifteen(fhstream& f) {
cd.currentdir = mapstream::fixspin(mapstream::relspin[at], cd.currentdir, c->type, f.vernum); cd.currentdir = mapstream::fixspin(mapstream::relspin[at], cd.currentdir, c->type, f.vernum);
println(hlog, "assigned ", cd.current, " to ", c); println(hlog, "assigned ", cd.current, " to ", c);
} }
compute_triangle_markers();
enable(); enable();
} }
@ -334,9 +375,47 @@ int rugArgs() {
auto fifteen_hook = auto fifteen_hook =
addHook(hooks_args, 100, rugArgs) addHook(hooks_args, 100, rugArgs)
#if CAP_SHOT
+ arg::add3("-fifteen-animate", [] {
rogueviz::rv_hook(anims::hooks_record_anim, 100, [] (int i, int nof) {
double at = (i * (isize(seq)-1) * 1.) / nof;
int ati = at;
double atf = at - ati;
hyperpoint h0 = unshift(ggmatrix(seq[ati]) * C0);
hyperpoint h1 = unshift(ggmatrix(seq[ati+1]) * C0);
atf = atf*atf*(3-2*atf);
hyperpoint h2 = lerp(h0, h1, atf);
println(hlog, "h0=", h0, " h1=", h1, " h2=", h2);
if(invalid_point(h2) || h2[2] < .5) return;
h2 = normalize(h2);
static ld last_angle = 0;
static int last_i = 0;
View = gpushxto0(h2) * View;
if(ati != last_i && last_angle) {
View = spin(-(turns[last_i] - last_angle)) * View;
last_angle = 0;
}
if(true) {
ld angle = lerp(0, turns[ati], atf);
ld x = -(angle - last_angle);
View = spin(x) * View;
last_angle = angle;
last_i = ati;
}
anims::moved();
}); })
#endif
+ addHook(mapstream::hooks_loadmap, 100, [] (fhstream& f, int id) { + addHook(mapstream::hooks_loadmap, 100, [] (fhstream& f, int id) {
if(id == 15) load_fifteen(f); if(id == 15) load_fifteen(f);
}) })
+ addHook(hooks_configfile, 100, [] {
param_b(show_dots, "fifteen_dots");
param_b(show_triangles, "fifteen_tris");
})
+ addHook(tour::ss::hooks_extra_slideshows, 120, [] (tour::ss::slideshow_callback cb) { + addHook(tour::ss::hooks_extra_slideshows, 120, [] (tour::ss::slideshow_callback cb) {
using namespace rogueviz::pres; using namespace rogueviz::pres;