mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-02-04 13:19:20 +00:00
rv::pentaroll:: improved
This commit is contained in:
parent
5b280f4198
commit
02940f0276
@ -10,8 +10,52 @@
|
|||||||
|
|
||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
|
namespace pentaroll {
|
||||||
|
|
||||||
bool animated;
|
bool animated;
|
||||||
|
|
||||||
|
void create_pentaroll() {
|
||||||
|
start_game();
|
||||||
|
/* get the list of all close cells */
|
||||||
|
cell *c0 = currentmap->gamestart();
|
||||||
|
celllister cl(c0, 4, 1000, nullptr);
|
||||||
|
|
||||||
|
/* construct the relative matrices for them */
|
||||||
|
map<cell*, transmatrix> rel;
|
||||||
|
rel[c0] = Id;
|
||||||
|
for(cell *c: cl.lst)
|
||||||
|
for(int i=0; i<c->type; i++)
|
||||||
|
if(rel.count(c->move(i)))
|
||||||
|
rel[c] = rel[c->move(i)] * currentmap->iadj(c, i);
|
||||||
|
|
||||||
|
/* the construction */
|
||||||
|
for(cell *c: cl.lst) {
|
||||||
|
int common = 0;
|
||||||
|
for(auto& v: cgi.vertices_only)
|
||||||
|
for(auto& w: cgi.vertices_only)
|
||||||
|
if(hdist(v, rel[c] * w) < 1e-6)
|
||||||
|
common++;
|
||||||
|
|
||||||
|
setdist(c, 7, nullptr);
|
||||||
|
|
||||||
|
if(c == c0) c->wall = waPalace;
|
||||||
|
else if(common > 0) c->wall = waNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
c0->wall = waNone;
|
||||||
|
for(int i=1; i<=cgi.face; i++) {
|
||||||
|
int i0 = i;
|
||||||
|
if(cgi.face == 4 && i0 >= 3) i0++;
|
||||||
|
cellwalker cw(c0, i0);
|
||||||
|
cw.peek()->wall = waPlatform;
|
||||||
|
if(cgi.face == 5) {
|
||||||
|
cellwalker cw1 = reg3::strafe(cw, (i==1?cgi.face:i-1));
|
||||||
|
cw1.peek()->wall = waWaxWall;
|
||||||
|
cw1.peek()->landparam = hrand(0x1000000) | 0x808080;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int args() {
|
int args() {
|
||||||
using namespace arg;
|
using namespace arg;
|
||||||
|
|
||||||
@ -19,57 +63,25 @@ int args() {
|
|||||||
|
|
||||||
else if(argis("-pentaroll")) {
|
else if(argis("-pentaroll")) {
|
||||||
PHASEFROM(3);
|
PHASEFROM(3);
|
||||||
start_game();
|
|
||||||
|
|
||||||
/* 1 = animated, 0 = not animated */
|
/* 1 = animated, 0 = not animated */
|
||||||
shift(); animated = argi();
|
shift(); animated = argi();
|
||||||
|
|
||||||
/* get the list of all close cells */
|
|
||||||
cell *c0 = currentmap->gamestart();
|
|
||||||
celllister cl(c0, 4, 1000, nullptr);
|
|
||||||
|
|
||||||
/* construct the relative matrices for them */
|
|
||||||
map<cell*, transmatrix> rel;
|
|
||||||
rel[c0] = Id;
|
|
||||||
for(cell *c: cl.lst)
|
|
||||||
for(int i=0; i<c->type; i++)
|
|
||||||
if(rel.count(c->move(i)))
|
|
||||||
rel[c] = rel[c->move(i)] * currentmap->iadj(c, i);
|
|
||||||
|
|
||||||
/* the construction */
|
|
||||||
for(cell *c: cl.lst) {
|
|
||||||
int common = 0;
|
|
||||||
for(auto& v: cgi.vertices_only)
|
|
||||||
for(auto& w: cgi.vertices_only)
|
|
||||||
if(hdist(v, rel[c] * w) < 1e-6)
|
|
||||||
common++;
|
|
||||||
|
|
||||||
setdist(c, 7, nullptr);
|
|
||||||
|
|
||||||
if(c == c0) c->wall = waPalace;
|
|
||||||
else if(common > 0) c->wall = waNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
c0->wall = waNone;
|
|
||||||
for(int i=1; i<=cgi.face; i++) {
|
|
||||||
int i0 = i;
|
|
||||||
if(cgi.face == 4 && i0 >= 3) i0++;
|
|
||||||
cellwalker cw(c0, i0);
|
|
||||||
cw.peek()->wall = waPlatform;
|
|
||||||
if(cgi.face == 5) {
|
|
||||||
cellwalker cw1 = reg3::strafe(cw, (i==1?cgi.face:i-1));
|
|
||||||
cw1.peek()->wall = waWaxWall;
|
|
||||||
cw1.peek()->landparam = hrand(0x1000000) | 0x808080;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else return 1;
|
else return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* currently not configurable */
|
||||||
|
|
||||||
|
/* if <1, stay closer to the center */
|
||||||
|
ld how_far = 1;
|
||||||
|
ld orig_distance = 1;
|
||||||
|
ld far_distance = 1;
|
||||||
|
|
||||||
auto hooks =
|
auto hooks =
|
||||||
addHook(hooks_args, 100, args)
|
addHook(hooks_args, 100, args)
|
||||||
|
+ addHook(hooks_clearmemory, 40, [] () { animated = false; })
|
||||||
+ addHook(anims::hooks_anim, 100, [] {
|
+ addHook(anims::hooks_anim, 100, [] {
|
||||||
|
|
||||||
if(!animated) return;
|
if(!animated) return;
|
||||||
@ -79,9 +91,31 @@ auto hooks =
|
|||||||
|
|
||||||
int tb = int(t) % cgi.face;
|
int tb = int(t) % cgi.face;
|
||||||
|
|
||||||
hyperpoint h1 = normalize(cgi.vertices_only[tb]);
|
hyperpoint m;
|
||||||
hyperpoint h2 = normalize(cgi.vertices_only[(tb+1) % cgi.face]);
|
for(int i=0; i<cgi.face; i++) m += cgi.vertices_only[i];
|
||||||
hyperpoint h3 = normalize(cgi.vertices_only[(tb+2) % cgi.face]);
|
m /= cgi.face;
|
||||||
|
|
||||||
|
auto normm = [&] (hyperpoint h) {
|
||||||
|
return normalize(lerp(m, h, how_far));
|
||||||
|
};
|
||||||
|
|
||||||
|
hyperpoint h1 = normm(cgi.vertices_only[tb]);
|
||||||
|
hyperpoint h2 = normm(cgi.vertices_only[(tb+1) % cgi.face]);
|
||||||
|
hyperpoint h3 = normm(cgi.vertices_only[(tb+2) % cgi.face]);
|
||||||
|
|
||||||
|
hyperpoint a = gpushxto0(h2) * h1;
|
||||||
|
hyperpoint b = gpushxto0(h2) * h3;
|
||||||
|
b = spintox(a) * b;
|
||||||
|
a = spintox(a) * a;
|
||||||
|
b[3] = 0;
|
||||||
|
println(hlog, "a = ", a);
|
||||||
|
println(hlog, "b = ", b);
|
||||||
|
|
||||||
|
b /= hypot_d(3, b);
|
||||||
|
ld angle = acos(b[0]);
|
||||||
|
|
||||||
|
println(hlog, "b = ", b);
|
||||||
|
println(hlog, "angle = ", angle / degree, " deg");
|
||||||
|
|
||||||
ld tf = t - floor(t);
|
ld tf = t - floor(t);
|
||||||
|
|
||||||
@ -100,13 +134,15 @@ auto hooks =
|
|||||||
|
|
||||||
/* we move the camera backward */
|
/* we move the camera backward */
|
||||||
|
|
||||||
View = zpush(1) * View;
|
View = zpush(lerp(orig_distance, far_distance, frac(ticks * 1. / anims::period))) * View;
|
||||||
|
|
||||||
/* we also need to rotate the view to make it smooth */
|
/* we also need to rotate the view to make it smooth */
|
||||||
|
|
||||||
View = spin(-(cgi.face == 4 ? 117 : 90) * degree * int(t)) * View;
|
View = spin((angle-M_PI) * int(t)) * View;
|
||||||
|
|
||||||
anims::moved();
|
anims::moved();
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user