diff --git a/source/games/duke/src/ccmds.cpp b/source/games/duke/src/ccmds.cpp index f92c3d7dc..3ad09309a 100644 --- a/source/games/duke/src/ccmds.cpp +++ b/source/games/duke/src/ccmds.cpp @@ -115,9 +115,8 @@ void GameInterface::WarpToCoords(int x, int y, int z, int ang, int horz) { player_struct* p = &ps[myconnectindex]; - p->__int_opos.X = p->__int_pos.X = x; - p->__int_opos.Y = p->__int_pos.Y = y; - p->__int_opos.Z = p->__int_pos.Z = z; + p->__int_pos = { x, y, z }; + p->backupxyz(); if (ang != INT_MIN) { diff --git a/source/games/duke/src/gameexec.cpp b/source/games/duke/src/gameexec.cpp index 4ca494806..2c09e4887 100644 --- a/source/games/duke/src/gameexec.cpp +++ b/source/games/duke/src/gameexec.cpp @@ -2047,9 +2047,7 @@ int ParseState::parse(void) if(!isRR() && ps[g_p].newOwner != nullptr) { ps[g_p].newOwner = nullptr; - ps[g_p].__int_pos.X = ps[g_p].player_int_opos().X; - ps[g_p].__int_pos.Y = ps[g_p].player_int_opos().Y; - ps[g_p].__int_pos.Z = ps[g_p].player_int_opos().Z; + ps[g_p].restorexyz(); ps[g_p].angle.restore(); updatesector(ps[g_p].player_int_pos().X,ps[g_p].player_int_pos().Y,&ps[g_p].cursector); @@ -2226,7 +2224,9 @@ int ParseState::parse(void) { // I am not convinced this is even remotely smart to be executed from here.. pickrandomspot(g_p); - g_ac->set_int_pos({ ps[g_p].bobpos.X = ps[g_p].__int_opos.X = ps[g_p].player_int_pos().X, ps[g_p].bobpos.Y = ps[g_p].__int_opos.Y = ps[g_p].player_int_pos().Y, ps[g_p].__int_opos.Z = ps[g_p].__int_pos.Z }); + g_ac->set_int_pos(ps[g_p].player_int_pos()); + ps[g_p].backupxyz(); + ps[g_p].setbobpos(); g_ac->backuppos(); updatesector(ps[g_p].player_int_pos().X, ps[g_p].player_int_pos().Y, &ps[g_p].cursector); SetActor(ps[g_p].GetActor(), vec3_t( ps[g_p].player_int_pos().X, ps[g_p].player_int_pos().Y, ps[g_p].player_int_pos().Z + gs.int_playerheight )); diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp index 4beec1e81..ea57cd6cc 100644 --- a/source/games/duke/src/player.cpp +++ b/source/games/duke/src/player.cpp @@ -215,10 +215,10 @@ int hitawall(struct player_struct* p, walltype** hitw) { HitInfo hit{}; - hitscan(p->__int_pos, p->cursector, { p->angle.ang.bcos(), p->angle.ang.bsin(), 0 }, hit, CLIPMASK0); + hitscan(p->player_int_pos(), p->cursector, { p->angle.ang.bcos(), p->angle.ang.bsin(), 0 }, hit, CLIPMASK0); if (hitw) *hitw = hit.hitWall; - return (FindDistance2D(hit.hitpos.vec2 - p->__int_pos.vec2)); + return (FindDistance2D(hit.hitpos.vec2 - p->player_int_pos().vec2)); } @@ -252,7 +252,7 @@ DDukeActor* aim(DDukeActor* actor, int aang) int zvel = -plr->horizon.sum().asq16() >> 5; HitInfo hit{}; - hitscan(plr->__int_pos.withZOffset(1024), actor->sector(), { bcos(actor->spr.ang), bsin(actor->spr.ang), zvel }, hit, CLIPMASK1); + hitscan(plr->player_int_pos().withZOffset(1024), actor->sector(), { bcos(actor->spr.ang), bsin(actor->spr.ang), zvel }, hit, CLIPMASK1); if (hit.actor() != nullptr) { @@ -769,16 +769,14 @@ void player_struct::backuppos(bool noclipping) { if (!noclipping) { - __int_opos.X = player_int_pos().X; - __int_opos.Y = player_int_pos().Y; + backupxy(); } else { - __int_pos.X = player_int_opos().X; - __int_pos.Y = player_int_opos().Y; + restorexy(); } - __int_opos.Z = player_int_pos().Z; + backupz(); bobpos.X = player_int_pos().X; bobpos.Y = player_int_pos().Y; opyoff = pyoff; diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 86f3173a0..b3da1ed2e 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -184,7 +184,7 @@ static void shootflamethrowerflame(DDukeActor* actor, int p, int sx, int sy, int zvel = -MulScale(ps[p].horizon.sum().asq16(), 81, 16); if (ps[p].GetActor()->spr.xvel != 0) vel = (int)((((512 - (1024 - - abs(abs(getangle(sx - ps[p].player_int_opos().X, sy - ps[p].__int_opos.Y) - sa) - 1024))) + - abs(abs(getangle(sx - ps[p].player_int_opos().X, sy - ps[p].player_int_opos().Y) - sa) - 1024))) * 0.001953125f) * ps[p].GetActor()->spr.xvel) + 400); if (actor->sector()->lotag == 2 && (krand() % 5) == 0) spawned = spawn(actor, WATERBUBBLE); @@ -2736,7 +2736,7 @@ void processinput_d(int snum) p->spritebridge = 0; shrunk = (pact->spr.yrepeat < 32); - getzrange(p->__int_pos, psectp, &cz, chz, &fz, clz, 163, CLIPMASK0); + getzrange(p->player_int_pos(), psectp, &cz, chz, &fz, clz, 163, CLIPMASK0); j = getflorzofslopeptr(psectp, p->player_int_pos().X, p->player_int_pos().Y); diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 5eb86a2f3..5eb89e768 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -3401,12 +3401,12 @@ void processinput_r(int snum) int tempfz; if (pact->spr.clipdist == 64) { - getzrange(p->__int_pos, psectp, &cz, chz, &fz, clz, 163L, CLIPMASK0); + getzrange(p->player_int_pos(), psectp, &cz, chz, &fz, clz, 163L, CLIPMASK0); tempfz = getflorzofslopeptr(psectp, p->player_int_pos().X, p->player_int_pos().Y); } else { - getzrange(p->__int_pos, psectp, &cz, chz, &fz, clz, 4L, CLIPMASK0); + getzrange(p->player_int_pos(), psectp, &cz, chz, &fz, clz, 4L, CLIPMASK0); tempfz = getflorzofslopeptr(psectp, p->player_int_pos().X, p->player_int_pos().Y); } diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp index c044e3f8d..1c837452b 100644 --- a/source/games/duke/src/premap.cpp +++ b/source/games/duke/src/premap.cpp @@ -95,9 +95,9 @@ void pickrandomspot(int snum) i = krand()%numplayersprites; else i = snum; - p->bobpos.X = p->__int_opos.X = p->__int_pos.X = po[i].opos.X; - p->bobpos.Y = p->__int_opos.Y = p->__int_pos.Y = po[i].opos.Y; - p->__int_opos.Z = p->__int_pos.Z = po[i].opos.Z; + p->__int_pos = po[i].opos; + p->backupxyz(); + p->setbobpos(); p->angle.oang = p->angle.ang = buildang(po[i].oa); p->setCursector(po[i].os); } @@ -615,9 +615,7 @@ void resetpspritevars(int g) firsty = ps[0].player_int_pos().Y; } - po[numplayersprites].opos.X = act->int_pos().X; - po[numplayersprites].opos.Y = act->int_pos().Y; - po[numplayersprites].opos.Z = act->int_pos().Z; + po[numplayersprites].opos = act->int_pos(); po[numplayersprites].oa = act->spr.ang; po[numplayersprites].os = act->sector(); @@ -659,9 +657,9 @@ void resetpspritevars(int g) ps[j].frag_ps = j; act->SetOwner(act); - ps[j].bobpos.X = ps[j].__int_opos.X = ps[j].__int_pos.X = act->int_pos().X; - ps[j].bobpos.Y = ps[j].__int_opos.Y = ps[j].__int_pos.Y = act->int_pos().Y; - ps[j].__int_opos.Z = ps[j].__int_pos.Z = act->int_pos().Z; + ps[j].getposfromactor(act); + ps[j].backupxyz(); + ps[j].setbobpos(); act->backuppos(); ps[j].angle.oang = ps[j].angle.ang = buildang(act->spr.ang); @@ -1005,7 +1003,9 @@ static int LoadTheMap(MapRecord *mi, struct player_struct *p, int gamemode) currentLevel = mi; int sect; SpawnSpriteDef sprites; - loadMap(mi->fileName, isShareware(), &p->__int_pos, &lbang, §, sprites); + vec3_t pos; + loadMap(mi->fileName, isShareware(), &pos, &lbang, §, sprites); + p->__int_pos = pos; p->cursector = §or[sect]; SECRET_SetMapName(mi->DisplayName(), mi->name); diff --git a/source/games/duke/src/savegame.cpp b/source/games/duke/src/savegame.cpp index c5e57e2a8..979a0883d 100644 --- a/source/games/duke/src/savegame.cpp +++ b/source/games/duke/src/savegame.cpp @@ -277,9 +277,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, player_struct& w, .EndObject(); w.invdisptime = 0; - w.__int_opos.X = w.player_int_pos().X; - w.__int_opos.Y = w.player_int_pos().Y; - w.__int_opos.Z = w.player_int_pos().Z; + w.backupxyz(); w.opyoff = w.pyoff; w.backupweapon(); w.sync.actions &= SB_CENTERVIEW|SB_CROUCH; // these are the only bits we need to preserve. diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index e6e564a07..4c313c757 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -482,7 +482,7 @@ bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act) return 1; } - vec3_t v = { sx, sy, ps[snum].__int_pos.Z }; + vec3_t v = { sx, sy, ps[snum].player_int_pos().Z }; switch (picnum) { default: @@ -1441,9 +1441,7 @@ void checkhitsprite_d(DDukeActor* targ, DDukeActor* proj) if (ps[p].newOwner != nullptr) { ps[p].newOwner = nullptr; - ps[p].__int_pos.X = ps[p].player_int_opos().X; - ps[p].__int_pos.Y = ps[p].player_int_opos().Y; - ps[p].__int_pos.Z = ps[p].player_int_opos().Z; + ps[p].restorexyz(); ps[p].angle.restore(); updatesector(ps[p].player_int_pos().X, ps[p].player_int_pos().Y, &ps[p].cursector); @@ -1479,9 +1477,7 @@ void clearcameras(int i, player_struct* p) { if (i < 0) { - p->__int_pos.X = p->player_int_opos().X; - p->__int_pos.Y = p->player_int_opos().Y; - p->__int_pos.Z = p->player_int_opos().Z; + p->restorexyz(); p->newOwner = nullptr; updatesector(p->player_int_pos().X, p->player_int_pos().Y, &p->cursector); @@ -1593,10 +1589,10 @@ void checksectors_d(int snum) return; } if (p->newOwner != nullptr) - neartag({ p->player_int_opos().X, p->player_int_opos().Y, p->__int_opos.Z }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280L, 1); + neartag({ p->player_int_opos().X, p->player_int_opos().Y, p->player_int_opos().Z }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280L, 1); else { - neartag(p->__int_pos, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); + neartag(p->player_int_pos(), p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); if (near.actor() == nullptr && near.hitWall == nullptr && near.hitSector == nullptr) neartag({ p->player_int_pos().X, p->player_int_pos().Y, p->player_int_pos().Z + (8 << 8) }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); if (near.actor() == nullptr && near.hitWall == nullptr && near.hitSector == nullptr) diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index dd9613f3e..f0381b69c 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -681,7 +681,7 @@ bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act) setnextmap(false); } - vec3_t v = { sx, sy, ps[snum].__int_pos.Z }; + vec3_t v = { sx, sy, ps[snum].player_int_pos().Z }; switch (picnum) { default: @@ -2373,9 +2373,7 @@ void checkhitsprite_r(DDukeActor* targ, DDukeActor* proj) if (ps[p].newOwner != nullptr) { ps[p].newOwner = nullptr; - ps[p].__int_pos.X = ps[p].player_int_opos().X; - ps[p].__int_pos.Y = ps[p].player_int_opos().Y; - ps[p].__int_pos.Z = ps[p].player_int_opos().Z; + ps[p].restorexyz(); updatesector(ps[p].player_int_pos().X, ps[p].player_int_pos().Y, &ps[p].cursector); @@ -2526,14 +2524,14 @@ void checksectors_r(int snum) } return; } - neartag(p->__int_pos, p->GetActor()->sector(), p->angle.oang.asbuild(), near , 1280, 3); + neartag(p->player_int_pos(), p->GetActor()->sector(), p->angle.oang.asbuild(), near , 1280, 3); } if (p->newOwner != nullptr) - neartag({ p->player_int_opos().X, p->player_int_opos().Y, p->__int_opos.Z }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280L, 1); + neartag({ p->player_int_opos().X, p->player_int_opos().Y, p->player_int_opos().Z }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280L, 1); else { - neartag(p->__int_pos, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); + neartag(p->player_int_pos(), p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); if (near.actor() == nullptr && near.hitWall == nullptr && near.hitSector == nullptr) neartag({ p->player_int_pos().X, p->player_int_pos().Y, p->player_int_pos().Z + (8 << 8) }, p->GetActor()->sector(), p->angle.oang.asbuild(), near, 1280, 1); if (near.actor() == nullptr && near.hitWall == nullptr && near.hitSector == nullptr) diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index 6c7825296..ebf6541c7 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -374,6 +374,12 @@ struct player_struct __int_opos.Y = __int_pos.Y; } + void restorexy() + { + __int_pos.X = __int_opos.X; + __int_pos.Y = __int_opos.Y; + } + void backupz() { __int_opos.Z = __int_pos.Z;