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:
parent
6a0e18d22d
commit
5cedf8863a
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user