2d3d:: fixed the placement of monsters (including PC view) on rock levels etc.

This commit is contained in:
Zeno Rogue 2019-05-10 01:03:53 +02:00
parent 563303acca
commit 13f3f49db9
2 changed files with 19 additions and 12 deletions

View File

@ -4470,11 +4470,12 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
transmatrix Vd0, Vboat0;
const transmatrix *Vdp =
(!wmspatial) ? &V :
sl ? &(Vd0= mscale(V, geom3::SLEV[sl])) :
highwall(c) ? &(Vd0= mscale(V, (1+geom3::WALL)/2)) :
WDIM == 3 ? &V:
!wmspatial ? &V :
sl ? &(Vd0= mscale(V, geom3::SLEV[sl] - geom3::FLOOR)) :
(highwall(c) && GDIM == 2) ? &(Vd0= mscale(V, (1+geom3::WALL)/2)) :
#if CAP_SHAPES
(chasmg==1) ? &(Vd0 = mscale(V, geom3::LAKE)) :
(chasmg==1) ? &(Vd0 = mscale(V, geom3::LAKE - geom3::FLOOR)) :
#endif
&V;
@ -5502,9 +5503,12 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
#endif
error |= drawMonster(V, ctype, c, moncol);
#if CAP_SHAPES
if(Vboat != &V && Vboat != &Vboat0 && q != isize(ptds))
pushdown(c, q, V, -geom3::factor_to_lev(zlevel(tC0((*Vboat)))),
if(Vboat != &V && Vboat != &Vboat0 && q != isize(ptds)) {
if(WDIM == 2)
pushdown(c, q, V, geom3::SLEV[sl] - geom3::FLOOR, false, false);
else pushdown(c, q, V, -geom3::factor_to_lev(zlevel(tC0((*Vboat)))),
!isMultitile(c->monst), false);
}
#endif
}

View File

@ -1094,11 +1094,11 @@ void centerpc(ld aspd) {
if(shmup::on && vid.sspeed > -5 && DIM == 3) {
int id = subscreens::in ? subscreens::current_player : 0;
viewctr = shmup::pc[id]->base->master;
transmatrix& T = shmup::pc[id]->at;
if(WDIM == 2)
View = inverse(master_relative(shmup::pc[id]->base) * T);
else
View = inverse(T);
transmatrix T = shmup::pc[id]->at;
if(WDIM == 2) T = master_relative(shmup::pc[id]->base) * T;
int sl = snakelevel(cwt.at);
if(sl) T = T * zpush(geom3::SLEV[sl] - geom3::FLOOR);
View = inverse(T);
if(vid.yshift) View = cpush(2, wall_radar(viewctr.at->c7, T)) * View;
if(WDIM == 2) View = cspin(0, 1, M_PI) * cspin(2, 1, M_PI/2 + shmup::playerturny[id]) * spin(-M_PI/2) * View;
@ -1121,7 +1121,10 @@ void centerpc(ld aspd) {
ors::unrotate(cwtV); ors::unrotate(View);
hyperpoint H = inverse(actual_view_transform) * tC0(cwtV);
transmatrix T = cwtV;
int sl = snakelevel(cwt.at);
if(sl) T = T * zpush(geom3::SLEV[sl] - geom3::FLOOR);
hyperpoint H = inverse(actual_view_transform) * tC0(T);
ld R = zero_d(DIM, H) ? 0 : hdist0(H);
if(R < 1e-9) {
// either already centered or direction unknown