diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp index c713af5c4..f9e8d8e9f 100644 --- a/source/games/sw/src/sprite.cpp +++ b/source/games/sw/src/sprite.cpp @@ -6243,7 +6243,8 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in ((xchange * numtics) << 11), ((ychange * numtics) << 11), (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); - actor->spr.pos.vec2 = clippos.vec2; + + actor->set_int_xy(clippos.X, clippos.Y); if (dasect == nullptr) { @@ -6297,21 +6298,25 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in // extra processing for Stacks and warping if (FAF_ConnectArea(actor->sector())) - SetActorZ(actor, &actor->spr.pos); + SetActorZ(actor, actor->spr.pos); if ((actor->sector()->extra & SECTFX_WARP_SECTOR)) { DSWActor* sp_warp; - if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + pos = actor->spr.pos; + if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); ActorWarpUpdatePos(actor, dasect); ActorWarpType(actor, sp_warp); } if (actor->sector() != lastsect) { - if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + pos = actor->spr.pos; + if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); ActorWarpUpdatePos(actor, dasect); ActorWarpType(actor, sp_warp); } @@ -6430,7 +6435,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i clipmove(clippos, &dasect, ((xchange * numtics) << 11), ((ychange * numtics) << 11), (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); - actor->spr.pos.vec2 = clippos.vec2; + actor->set_int_xy(clippos.X, clippos.Y); if (dasect == nullptr) { @@ -6483,22 +6488,26 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i } if (FAF_ConnectArea(actor->sector())) - SetActorZ(actor, &actor->spr.pos); + SetActorZ(actor, actor->spr.pos); if ((actor->sector()->extra & SECTFX_WARP_SECTOR)) { DSWActor* sp_warp; - if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + auto pos = actor->spr.pos; + if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); MissileWarpUpdatePos(actor, dasect); MissileWarpType(actor, sp_warp); } if (actor->sector() != lastsect) { - if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + pos = actor->spr.pos; + if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); MissileWarpUpdatePos(actor, dasect); MissileWarpType(actor, sp_warp); } @@ -6575,7 +6584,7 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei clipmove(opos, &dasect, ((xchange * numtics) << 11), ((ychange * numtics) << 11), (((int) actor->spr.clipdist) << 2), ceildist, flordist, cliptype, retval, 1); - actor->spr.pos.vec2 = opos.vec2; + actor->set_int_xy(opos.X, opos.Y); } if (dasect == nullptr) @@ -6619,16 +6628,20 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei { DSWActor* sp_warp; - if ((sp_warp = WarpPlane(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + auto pos = actor->spr.pos; + if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); MissileWarpUpdatePos(actor, dasect); MissileWarpType(actor, sp_warp); } if (actor->sector() != lastsect) { - if ((sp_warp = Warp(&actor->spr.pos.X, &actor->spr.pos.Y, &actor->spr.pos.Z, &dasect))) + pos = actor->spr.pos; + if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect))) { + actor->set_int_pos(pos); MissileWarpUpdatePos(actor, dasect); MissileWarpType(actor, sp_warp); } diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp index db248efba..9cbe920bd 100644 --- a/source/games/sw/src/track.cpp +++ b/source/games/sw/src/track.cpp @@ -1729,16 +1729,18 @@ PlayerPart: if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_DONT_SPIN)) continue; + auto pos = actor->spr.pos; if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_REVERSE_SPIN)) { - rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, -delta_ang, &actor->spr.pos.vec2); + rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, -delta_ang, &pos.vec2); actor->spr.ang = NORM_ANGLE(actor->spr.ang - delta_ang); } else { - rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &actor->spr.pos.vec2); + rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &pos.vec2); actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang); } + actor->set_int_pos(pos); } else @@ -1746,14 +1748,16 @@ PlayerPart: if (!(sop->flags & SOBJ_DONT_ROTATE)) { // NOT part of a sector - independant of any sector - rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &actor->spr.pos.vec2); + auto pos = actor->spr.pos; + rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &pos.vec2); actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang); + actor->set_int_pos(pos); } // Does not necessarily move with the sector so must accout for // moving across sectors if (sop->pmid.X < MAXSO) // special case for operating SO's - SetActorZ(sop->so_actors[i], &actor->spr.pos); + SetActorZ(sop->so_actors[i], actor->spr.pos); } actor->user.oangdiff += getincangle(oldang, actor->spr.ang);