diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 17f10a20e..98fe7711b 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -1742,7 +1742,7 @@ static void G_PrintCoords(int32_t snum) printext256(250L,y+18L,31,-1,tempbuf,0); Bsprintf(tempbuf,"OG= %d",g_player[snum].ps->on_ground); printext256(250L,y+27L,31,-1,tempbuf,0); - Bsprintf(tempbuf,"SECTL= %d",sector[g_player[snum].ps->cursectnum].lotag); + Bsprintf(tempbuf,"SECT= %d (LO=%d)",g_player[snum].ps->cursectnum,sector[g_player[snum].ps->cursectnum].lotag); printext256(250L,y+36L,31,-1,tempbuf,0); Bsprintf(tempbuf,"SEED= %d",randomseed); printext256(250L,y+45L,31,-1,tempbuf,0); @@ -3383,6 +3383,8 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) { tmpvr = i; tmpyx = (65536*ydim*8)/(xdim*5); + + setaspect(mulscale16(tmpvr,viewingrange), yxaspect); } if (g_screenCapture) @@ -9646,6 +9648,7 @@ int32_t app_main(int32_t argc,const char **argv) ); Bstrcpy(tempbuf, APPNAME); wm_setapptitle(tempbuf); +//initprintf("sizeof(mapstate_t)=%d\n", (int32_t)sizeof(mapstate_t)); initprintf(HEAD2 " %s\n", s_buildRev); initprintf("Compiled %s\n", __DATE__" "__TIME__); diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 80df1e922..d37f7465b 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -4529,6 +4529,7 @@ void P_ProcessInput(int32_t snum) int32_t fz, cz, hz, lz, truefdist, x, y, psectlotag; uint8_t *kb = &p->kickback_pic; int16_t tempsect; + int32_t jetpackdz = 0; if (g_player[snum].playerquitflag == 0) return; @@ -4928,6 +4929,7 @@ void P_ProcessInput(int32_t snum) if (p->jetpack_on < 11) { p->jetpack_on++; + jetpackdz -= (p->jetpack_on<<7); p->pos.z -= (p->jetpack_on<<7); //Goin up } else if (p->jetpack_on == 11 && !A_CheckSoundPlaying(p->i,DUKE_JETPACK_IDLE)) @@ -4943,6 +4945,7 @@ void P_ProcessInput(int32_t snum) VM_OnEvent(EVENT_SOARUP,p->i,snum, -1); if (aGameVars[g_iReturnVarID].val.lValue == 0) { + jetpackdz -= j; p->pos.z -= j; p->crack_time = 777; } @@ -4955,6 +4958,7 @@ void P_ProcessInput(int32_t snum) VM_OnEvent(EVENT_SOARDOWN,p->i,snum, -1); if (aGameVars[g_iReturnVarID].val.lValue == 0) { + jetpackdz += j; p->pos.z += j; p->crack_time = 777; } @@ -5372,13 +5376,32 @@ HORIZONLY: // this updatesectorz conflicts with Duke3d's way of teleporting through water, // so make it a bit conditional... OTOH, this way we have an ugly z jump when // changing from above water to underwater - if (p->cursectnum < 0 || !(sector[p->cursectnum].lotag==1 && p->on_ground && yax_getbunch(p->cursectnum, YAX_FLOOR)>=0)) + if (p->cursectnum >= 0 && !(sector[p->cursectnum].lotag==1 && + p->on_ground && yax_getbunch(p->cursectnum, YAX_FLOOR)>=0)) { + int32_t tmpdz = 0; + // Do updatesectorz only if ceiling/floor bunchnum is >= 0. Otherwise, unwanted - // side-effects like dying when jumping into a lotag==1 sector can occur. - // The p->jetpack on is there because vel.z 'freezes' when using it - if (p->jetpack_on || (p->vel.z && p->cursectnum>=0 && yax_getbunch(p->cursectnum, (p->vel.z>0))>=0)) + // side-effects like dying when jumping into a lotag==1 sector or on other + // occasions can occur. + // The 'if' is divided in two disjunct cases (jetpack off or on), because we can't + // trust p->vel.z when we're flying. In this case, jetpackdz gives the z delta for + // this tic. + // The (!shrunk || ...) part is so that we don't 'squish' when taking off shrunk. + if (p->jetpack_on) + { + if (!shrunk || p->jetpack_on==11) + tmpdz = jetpackdz; + } + else if (p->jetpack_on && p->vel.z) + { + tmpdz = p->vel.z; + } + + if (tmpdz && yax_getbunch(p->cursectnum, (tmpdz>0))>=0) + { updatesectorz(p->pos.x,p->pos.y,p->pos.z,&p->cursectnum); + } } #endif if ((j = clipmove((vec3_t *)p,&p->cursectnum, p->vel.x,p->vel.y,164L,(4L<<8),i,CLIPMASK0))) @@ -5410,7 +5433,7 @@ HORIZONLY: setsprite(p->i,(vec3_t *)&p->pos.x); p->pos.z -= PHEIGHT; - if (psectlotag < 3) + if (p->cursectnum >= 0 && psectlotag < 3) { // p->cursectnum = s->sectnum;