diff --git a/source/games/sw/src/actor.cpp b/source/games/sw/src/actor.cpp
index c649d62a3..d54a49933 100644
--- a/source/games/sw/src/actor.cpp
+++ b/source/games/sw/src/actor.cpp
@@ -211,7 +211,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
         }
         actor->user.ActorActionFunc = nullptr;
         // Get angle to player
-        actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y) + 1024);
+        actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y) + 1024);
         break;
 
     case UZI_SMOKE+1: // Shotgun
@@ -234,7 +234,7 @@ int DoActorDie(DSWActor* actor, DSWActor* weapActor, int meansofdeath)
         DoActorBeginJump(actor);
         actor->user.ActorActionFunc = nullptr;
         // Get angle to player
-        actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y) + 1024);
+        actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y) + 1024);
         break;
 
     default:
@@ -397,7 +397,7 @@ int DoActorDebris(DSWActor* actor)
         KillActor(actor);
         return 0;
     case ZILLA_RUN_R0:
-        getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.hiz, &actor->user.loz);
+        getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.hiz, &actor->user.loz);
         actor->user.lo_sectp = actor->sector();
         actor->user.hi_sectp = actor->sector();
         actor->user.lowActor = nullptr;
@@ -476,7 +476,7 @@ int DoGenerateSewerDebris(DSWActor* actor)
     {
         actor->user.Tics = actor->user.WaitTics;
 
-        auto spawned = SpawnActor(STAT_DEAD_ACTOR, 0, Debris[RANDOM_P2(4<<8)>>8], actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 200);
+        auto spawned = SpawnActor(STAT_DEAD_ACTOR, 0, Debris[RANDOM_P2(4<<8)>>8], actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 200);
 
         SetOwner(actor, spawned);
     }
@@ -565,7 +565,7 @@ void KeepActorOnFloor(DSWActor* actor)
     {
         int ceilz, florz;
         Collision ctrash, ftrash;
-        FAFgetzrangepoint(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(),
+        FAFgetzrangepoint(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(),
                           &ceilz, &ctrash, &florz, &ftrash);
 
         actor->set_int_z(actor->user.oz = florz);
@@ -664,7 +664,7 @@ int DoActorJump(DSWActor* actor)
 
     // if player gets to close the ceiling while jumping
     int minh = actor->user.hiz + (tileHeight(actor->spr.picnum) << 8);
-    if (actor->spr.pos.Z < minh)
+    if (actor->int_pos().Z < minh)
     {
         // put player at the ceiling
         actor->set_int_z(minh);
@@ -718,7 +718,7 @@ int DoActorFall(DSWActor* actor)
     actor->add_int_z(actor->user.jump_speed * ACTORMOVETICS);
 
     // Stick like glue when you hit the ground
-    if (actor->spr.pos.Z > actor->user.loz)
+    if (actor->int_pos().Z > actor->user.loz)
     {
         DoActorStopFall(actor);
     }
@@ -830,7 +830,7 @@ int DoJump(DSWActor* actor)
 
     // if player gets to close the ceiling while jumping
     int minh = actor->user.hiz + (tileHeight(actor->spr.picnum) << 8);
-    if (actor->spr.pos.Z < minh)
+    if (actor->int_pos().Z < minh)
     {
         // put player at the ceiling
         actor->set_int_z(minh);
@@ -867,7 +867,7 @@ int DoFall(DSWActor* actor)
     actor->add_int_z(actor->user.jump_speed * ACTORMOVETICS);
 
     // Stick like glue when you hit the ground
-    if (actor->spr.pos.Z > actor->user.loz - actor->user.floor_dist)
+    if (actor->int_pos().Z > actor->user.loz - actor->user.floor_dist)
     {
         actor->set_int_z(actor->user.loz - actor->user.floor_dist);
         actor->user.Flags &= ~(SPR_FALLING);
diff --git a/source/games/sw/src/ai.cpp b/source/games/sw/src/ai.cpp
index d48cfa4e3..8400b7e8d 100644
--- a/source/games/sw/src/ai.cpp
+++ b/source/games/sw/src/ai.cpp
@@ -219,7 +219,7 @@ bool CanSeePlayer(DSWActor* actor)
     // if actor can still see the player
     int look_height = ActorZOfTop(actor);
 
-    if (actor->user.targetActor && FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, look_height, actor->sector(), actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, ActorUpperZ(actor->user.targetActor), actor->user.targetActor->sector()))
+    if (actor->user.targetActor && FAFcansee(actor->int_pos().X, actor->int_pos().Y, look_height, actor->sector(), actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, ActorUpperZ(actor->user.targetActor), actor->user.targetActor->sector()))
         return true;
     else
         return false;
@@ -233,28 +233,28 @@ int CanHitPlayer(DSWActor* actor)
     // if actor can still see the player
     int zhs, zhh;
 
-    zhs = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1);
+    zhs = actor->int_pos().Z - (ActorSizeZ(actor) >> 1);
 
 
     auto targ = actor->user.targetActor;
 
     // get angle to target
-    ang = getangle(targ->spr.pos.X - actor->spr.pos.X, targ->spr.pos.Y - actor->spr.pos.Y);
+    ang = getangle(targ->int_pos().X - actor->int_pos().X, targ->int_pos().Y - actor->int_pos().Y);
 
     // get x,yvect
     xvect = bcos(ang);
     yvect = bsin(ang);
 
     // get zvect
-    zhh = targ->spr.pos.Z - (ActorSizeZ(targ) >> 1);
-    if (targ->spr.pos.X - actor->spr.pos.X != 0)
-        zvect = xvect * ((zhh - zhs) / (targ->spr.pos.X - actor->spr.pos.X));
-    else if (targ->spr.pos.Y - actor->spr.pos.Y != 0)
-        zvect = yvect * ((zhh - zhs) / (targ->spr.pos.Y - actor->spr.pos.Y));
+    zhh = targ->int_pos().Z - (ActorSizeZ(targ) >> 1);
+    if (targ->int_pos().X - actor->int_pos().X != 0)
+        zvect = xvect * ((zhh - zhs) / (targ->int_pos().X - actor->int_pos().X));
+    else if (targ->int_pos().Y - actor->int_pos().Y != 0)
+        zvect = yvect * ((zhh - zhs) / (targ->int_pos().Y - actor->int_pos().Y));
     else
         return false;
 
-    FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, zhs, actor->sector(),
+    FAFhitscan(actor->int_pos().X, actor->int_pos().Y, zhs, actor->sector(),
                xvect,
                yvect,
                zvect,
@@ -324,7 +324,7 @@ int DoActorPickClosePlayer(DSWActor* actor)
             //    continue;
         }
 
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
 
         if (dist < near_dist)
         {
@@ -350,10 +350,10 @@ int DoActorPickClosePlayer(DSWActor* actor)
                 continue;
         }
 
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
 
         DSWActor* plActor = pp->actor;
-        if (dist < near_dist && FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, look_height, actor->sector(), plActor->spr.pos.X, plActor->spr.pos.Y, ActorUpperZ(plActor), plActor->sector()))
+        if (dist < near_dist && FAFcansee(actor->int_pos().X, actor->int_pos().Y, look_height, actor->sector(), plActor->int_pos().X, plActor->int_pos().Y, ActorUpperZ(plActor), plActor->sector()))
         {
             near_dist = dist;
             actor->user.targetActor = pp->actor;
@@ -377,9 +377,9 @@ TARGETACTOR:
             if ((itActor->user.Flags & (SPR_SUICIDE | SPR_DEAD)))
                 continue;
 
-            DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y, dist, a, b, c);
 
-            if (dist < near_dist && FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, look_height, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorUpperZ(itActor), itActor->sector()))
+            if (dist < near_dist && FAFcansee(actor->int_pos().X, actor->int_pos().Y, look_height, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ActorUpperZ(itActor), itActor->sector()))
             {
                 near_dist = dist;
                 actor->user.targetActor = itActor;
@@ -433,12 +433,12 @@ int DoActorOperate(DSWActor* actor)
     if ((actor->user.WaitTics -= ACTORMOVETICS) > 0)
         return false;
 
-    z[0] = actor->spr.pos.Z - ActorSizeZ(actor) + Z(5);
-    z[1] = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1);
+    z[0] = actor->int_pos().Z - ActorSizeZ(actor) + Z(5);
+    z[1] = actor->int_pos().Z - (ActorSizeZ(actor) >> 1);
 
     for (i = 0; i < SIZ(z); i++)
     {
-        neartag({ actor->spr.pos.X, actor->spr.pos.Y, z[i] }, actor->sector(), actor->spr.ang, near, 1024, NTAG_SEARCH_LO_HI);
+        neartag({ actor->int_pos().X, actor->int_pos().Y, z[i] }, actor->sector(), actor->spr.ang, near, 1024, NTAG_SEARCH_LO_HI);
     }
 
     if (near.hitSector != nullptr && near.hitpos.X < 1024)
@@ -518,7 +518,7 @@ ANIMATOR* DoActorActionDecide(DSWActor* actor)
         DoActorOperate(actor);
 
         // if far enough away and cannot see the player
-        dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
         if (dist > 30000 && !ICanSee)
         {
@@ -609,7 +609,7 @@ ANIMATOR* DoActorActionDecide(DSWActor* actor)
             DoActorPickClosePlayer(actor);
 
         // if close by
-        dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
         if (dist < 15000 || ICanSee)
         {
             if ((Facing(actor, actor->user.targetActor) && dist < 10000) || ICanSee)
@@ -816,7 +816,7 @@ int DoActorCantMoveCloser(DSWActor* actor)
 
     if (actor->user.track >= 0)
     {
-        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y);
+        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y);
 
         DoActorSetSpeed(actor, MID_SPEED);
         actor->user.Flags |= (SPR_FIND_PLAYER);
@@ -867,7 +867,7 @@ int DoActorMoveCloser(DSWActor* actor)
         else
         {
             // turn to face player
-            actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+            actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
         }
     }
 
@@ -922,7 +922,7 @@ int FindTrackToPlayer(DSWActor* actor)
         BIT(TT_SCAN)
     };
 
-    zdiff = ActorUpperZ(actor->user.targetActor) - (actor->spr.pos.Z - ActorSizeZ(actor) + Z(8));
+    zdiff = ActorUpperZ(actor->user.targetActor) - (actor->int_pos().Z - ActorSizeZ(actor) + Z(8));
 
     if (abs(zdiff) <= Z(20))
     {
@@ -1048,7 +1048,7 @@ int InitActorRunAway(DSWActor* actor)
 
     if (actor->user.track >= 0)
     {
-        actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y));
+        actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y));
         DoActorSetSpeed(actor, FAST_SPEED);
         actor->user.Flags |= (SPR_RUN_AWAY);
     }
@@ -1128,7 +1128,7 @@ int InitActorAttack(DSWActor* actor)
     //NewStateGroup(actor, actor->user.ActorActionSet->Stand);
 
     // face player when attacking
-    actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
     // If it's your own kind, lay off!
     if (actor->user.ID == actor->user.targetActor->user.ID && !actor->user.targetActor->user.PlayerP)
@@ -1169,7 +1169,7 @@ int DoActorAttack(DSWActor* actor)
 
     DoActorNoise(ChooseAction(actor->user.Personality->Broadcast),actor);
 
-    DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+    DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
 
     auto pActor = GetPlayerSpriteNum(actor);
     if ((actor->user.ActorActionSet->CloseAttack[0] && dist < CloseRangeDist(actor, actor->user.targetActor)) ||
@@ -1208,7 +1208,7 @@ int InitActorEvade(DSWActor* actor)
 
     if (actor->user.track >= 0)
     {
-        actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y));
+        actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y));
         DoActorSetSpeed(actor, FAST_SPEED);
         // NOT doing a RUN_AWAY
         actor->user.Flags &= ~(SPR_RUN_AWAY);
@@ -1228,7 +1228,7 @@ int InitActorWanderAround(DSWActor* actor)
 
     if (actor->user.track >= 0)
     {
-        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y);
+        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y);
         DoActorSetSpeed(actor, NORM_SPEED);
     }
 
@@ -1244,7 +1244,7 @@ int InitActorFindPlayer(DSWActor* actor)
 
     if (actor->user.track >= 0)
     {
-        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y);
+        actor->spr.ang = getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y);
         DoActorSetSpeed(actor, MID_SPEED);
         actor->user.Flags |= (SPR_FIND_PLAYER);
 
@@ -1273,7 +1273,7 @@ int InitActorDuck(DSWActor* actor)
     actor->user.ActorActionFunc = DoActorDuck;
     NewStateGroup(actor, actor->user.ActorActionSet->Duck);
 
-    dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist > 8000)
     {
@@ -1338,9 +1338,9 @@ Collision move_scan(DSWActor* actor, int ang, int dist, int *stopx, int *stopy,
     // moves out a bit but keeps the sprites original postion/sector.
 
     // save off position info
-    x = actor->spr.pos.X;
-    y = actor->spr.pos.Y;
-    z = actor->spr.pos.Z;
+    x = actor->int_pos().X;
+    y = actor->int_pos().Y;
+    z = actor->int_pos().Z;
     sang = actor->spr.ang;
     loz = actor->user.loz;
     hiz = actor->user.hiz;
@@ -1361,9 +1361,9 @@ Collision move_scan(DSWActor* actor, int ang, int dist, int *stopx, int *stopy,
     // should I look down with a FAFgetzrange to see where I am?
 
     // remember where it stopped
-    *stopx = actor->spr.pos.X;
-    *stopy = actor->spr.pos.Y;
-    *stopz = actor->spr.pos.Z;
+    *stopx = actor->int_pos().X;
+    *stopy = actor->int_pos().Y;
+    *stopz = actor->int_pos().Z;
 
     // reset position information
     actor->set_int_pos({ x, y, z });
@@ -1419,7 +1419,7 @@ int FindNewAngle(DSWActor* actor, int dir, int DistToMove)
         DistToMove = (DistToMove >> 2) + (DistToMove >> 3);
 
     // Find angle to from the player
-    oang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    oang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
     // choose a random angle array
     switch (dir)
@@ -1468,13 +1468,13 @@ int FindNewAngle(DSWActor* actor, int dir, int DistToMove)
         if (ret.type == kHitNone)
         {
             // cleanly moved in new direction without hitting something
-            actor->user.TargetDist = Distance(actor->spr.pos.X, actor->spr.pos.Y, stopx, stopy);
+            actor->user.TargetDist = Distance(actor->int_pos().X, actor->int_pos().Y, stopx, stopy);
             return new_ang;
         }
         else
         {
             // hit something
-            dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, stopx, stopy);
+            dist = Distance(actor->int_pos().X, actor->int_pos().Y, stopx, stopy);
 
             if (dist > save_dist)
             {
@@ -1563,7 +1563,7 @@ int InitActorReposition(DSWActor* actor)
     actor->user.Dist = 0;
 
     rnum = RANDOM_P2(8<<8)>>8;
-    dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist < PlayerDist[rnum] || (actor->user.Flags & SPR_RUN_AWAY))
     {
diff --git a/source/games/sw/src/bunny.cpp b/source/games/sw/src/bunny.cpp
index 73e38ae2c..87a103e8d 100644
--- a/source/games/sw/src/bunny.cpp
+++ b/source/games/sw/src/bunny.cpp
@@ -832,7 +832,7 @@ int DoBunnyBeginJumpAttack(DSWActor* actor)
     DSWActor* target = actor->user.targetActor;
     int tang;
 
-    tang = getangle(target->spr.pos.X - actor->spr.pos.X, target->spr.pos.Y - actor->spr.pos.Y);
+    tang = getangle(target->int_pos().X - actor->int_pos().X, target->int_pos().Y - actor->int_pos().Y);
 
     Collision coll = move_sprite(actor, bcos(tang, -7), bsin(tang, -7),
         0L, actor->user.ceiling_dist, actor->user.floor_dist, CLIPMASK_ACTOR, ACTORMOVETICS);
@@ -904,11 +904,11 @@ void DoPickCloseBunny(DSWActor* actor)
 
         if (itActor->user.ID != BUNNY_RUN_R0) continue;
 
-        DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+        DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
         if (dist > near_dist) continue;
 
-        ICanSee = FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, look_height, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorUpperZ(itActor), itActor->sector());
+        ICanSee = FAFcansee(actor->int_pos().X, actor->int_pos().Y, look_height, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ActorUpperZ(itActor), itActor->sector());
 
         if (ICanSee && dist < near_dist && itActor->user.ID == BUNNY_RUN_R0)
         {
@@ -1003,7 +1003,7 @@ int DoBunnyQuickJump(DSWActor* actor)
                         if (pp == Player+myconnectindex)
                         {
                             choose_snd = StdRandomRange(2<<8)>>8;
-                            if (FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfTop(actor),actor->sector(),pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector) && Facing(actor, actor->user.targetActor))
+                            if (FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfTop(actor),actor->sector(),pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector) && Facing(actor, actor->user.targetActor))
                                 PlayerSound(fagsnds[choose_snd], v3df_doppler|v3df_follow|v3df_dontpan,pp);
                         }
                     }
@@ -1018,13 +1018,13 @@ int DoBunnyQuickJump(DSWActor* actor)
                         if (pp == Player+myconnectindex)
                         {
                             choose_snd = StdRandomRange(3<<8)>>8;
-                            if (FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfTop(actor),actor->sector(),pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector) && Facing(actor, actor->user.targetActor))
+                            if (FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfTop(actor),actor->sector(),pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector) && Facing(actor, actor->user.targetActor))
                                 PlayerSound(straightsnds[choose_snd], v3df_doppler|v3df_follow|v3df_dontpan,pp);
                         }
                     }
                 }
 
-                actor->set_int_xy(hitActor->spr.pos.X, hitActor->spr.pos.Y);
+                actor->set_int_xy(hitActor->int_pos().X, hitActor->int_pos().Y);
                 actor->spr.ang = hitActor->spr.ang;
                 actor->spr.ang = NORM_ANGLE(actor->spr.ang + 1024);
                 HelpMissileLateral(actor, 2000);
@@ -1084,7 +1084,7 @@ int DoBunnyRipHeart(DSWActor* actor)
     actor->user.WaitTics = 6 * 120;
 
     // player face bunny
-    target->spr.ang = getangle(actor->spr.pos.X - target->spr.pos.X, actor->spr.pos.Y - target->spr.pos.Y);
+    target->spr.ang = getangle(actor->int_pos().X - target->int_pos().X, actor->int_pos().Y - target->int_pos().Y);
     return 0;
 }
 
@@ -1112,7 +1112,7 @@ void BunnyHatch(DSWActor* actor)
     for (int i = 0; i < MAX_BUNNYS; i++)
     {
         auto actorNew = insertActor(actor->sector(), STAT_DEFAULT);
-        actorNew->set_int_pos(actor->spr.pos);
+        actorNew->set_int_pos(actor->int_pos());
         actorNew->spr.xrepeat = 30;  // Baby size
         actorNew->spr.yrepeat = 24;
         actorNew->spr.ang = rip_ang[i];
@@ -1168,7 +1168,7 @@ DSWActor* BunnyHatch2(DSWActor* actor)
 {
 
     auto actorNew = insertActor(actor->sector(), STAT_DEFAULT);
-    actorNew->set_int_pos(actor->spr.pos);
+    actorNew->set_int_pos(actor->int_pos());
     actorNew->spr.xrepeat = 30;  // Baby size
     actorNew->spr.yrepeat = 24;
     actorNew->spr.ang = RANDOM_P2(2048);
diff --git a/source/games/sw/src/coolg.cpp b/source/games/sw/src/coolg.cpp
index 2335d991d..9d660bbe9 100644
--- a/source/games/sw/src/coolg.cpp
+++ b/source/games/sw/src/coolg.cpp
@@ -505,7 +505,7 @@ void CoolgCommon(DSWActor* actor)
     actor->user.floor_dist = Z(16);
     actor->user.ceiling_dist = Z(20);
 
-    actor->user.pos.Z = actor->spr.pos.Z;
+    actor->user.pos.Z = actor->int_pos().Z;
 
     actor->spr.xrepeat = 42;
     actor->spr.yrepeat = 42;
@@ -541,7 +541,7 @@ int NewCoolg(DSWActor* actor)
 {
     ANIMATOR DoActorDecide;
 
-    auto actorNew = SpawnActor(STAT_ENEMY, COOLG_RUN_R0, &s_CoolgBirth[0], actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 50);
+    auto actorNew = SpawnActor(STAT_ENEMY, COOLG_RUN_R0, &s_CoolgBirth[0], actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 50);
 
     ChangeState(actorNew, &s_CoolgBirth[0]);
     actorNew->user.StateEnd = s_CoolgDie;
@@ -665,7 +665,7 @@ int DoCoolgMatchPlayerZ(DSWActor* actor)
     actor->set_int_z(actor->user.pos.Z + MulScale(COOLG_BOB_AMT, bsin(actor->user.Counter), 14));
 
     bound = actor->user.hiz + actor->user.ceiling_dist + COOLG_BOB_AMT;
-    if (actor->spr.pos.Z < bound)
+    if (actor->int_pos().Z < bound)
     {
         // bumped something
         actor->set_int_z(actor->user.pos.Z = bound + COOLG_BOB_AMT);
@@ -773,7 +773,7 @@ int DoCoolgDeath(DSWActor* actor)
     DoFindGroundPoint(actor);
 
     // on the ground
-    if (actor->spr.pos.Z >= actor->user.loz)
+    if (actor->int_pos().Z >= actor->user.loz)
     {
         actor->user.Flags &= ~(SPR_FALLING|SPR_SLIDING);
         actor->spr.cstat &= ~(CSTAT_SPRITE_YFLIP); // If upside down, reset it
diff --git a/source/games/sw/src/coolie.cpp b/source/games/sw/src/coolie.cpp
index f4b29e8c7..07c5dba90 100644
--- a/source/games/sw/src/coolie.cpp
+++ b/source/games/sw/src/coolie.cpp
@@ -453,10 +453,10 @@ void EnemyDefaults(DSWActor* actor, ACTOR_ACTION_SET* action, PERSONALITY* perso
         }
     }
 
-    if (depth && labs(actor->spr.pos.Z - actor->user.loz) < Z(8))
+    if (depth && labs(actor->int_pos().Z - actor->user.loz) < Z(8))
     {
         actor->add_int_z(Z(depth));
-        actor->user.loz = actor->spr.pos.Z;
+        actor->user.loz = actor->int_pos().Z;
         actor->backupz();
     }
 
@@ -569,7 +569,7 @@ int DoCoolieMove(DSWActor* actor)
         return 0;
     }
 
-    if (Distance(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y) < 1200)
+    if (Distance(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y) < 1200)
     {
         UpdateSinglePlayKills(actor);
         DoActorDie(actor, actor, 0);
diff --git a/source/games/sw/src/copysect.cpp b/source/games/sw/src/copysect.cpp
index b33ef332e..a287807ff 100644
--- a/source/games/sw/src/copysect.cpp
+++ b/source/games/sw/src/copysect.cpp
@@ -169,8 +169,8 @@ void CopySectorMatch(int match)
                         SectorMidPoint(dActor->sector(), &dx, &dy, &trash);
 
                         // get offset
-                        src_xoff = sx - itActor->spr.pos.X;
-                        src_yoff = sy - itActor->spr.pos.Y;
+                        src_xoff = sx - itActor->int_pos().X;
+                        src_yoff = sy - itActor->int_pos().Y;
 
                         // move sprite to dest sector
                         itActor->set_int_xy(dx - src_xoff, dy - src_yoff);
diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp
index e5da7a567..8f64f1784 100644
--- a/source/games/sw/src/draw.cpp
+++ b/source/games/sw/src/draw.cpp
@@ -456,13 +456,13 @@ void WarpCopySprite(tspriteArray& tsprites)
                     tspritetype* newTSpr = renderAddTsprite(tsprites, itActor2);
                     newTSpr->statnum = 0;
 
-                    xoff = itActor->spr.pos.X - newTSpr->pos.X;
-                    yoff = itActor->spr.pos.Y - newTSpr->pos.Y;
-                    zoff = itActor->spr.pos.Z - newTSpr->pos.Z;
+                    xoff = itActor->int_pos().X - newTSpr->pos.X;
+                    yoff = itActor->int_pos().Y - newTSpr->pos.Y;
+                    zoff = itActor->int_pos().Z - newTSpr->pos.Z;
 
-                    newTSpr->pos.X = itActor1->spr.pos.X - xoff;
-                    newTSpr->pos.Y = itActor1->spr.pos.Y - yoff;
-                    newTSpr->pos.Z = itActor1->spr.pos.Z - zoff;
+                    newTSpr->pos.X = itActor1->int_pos().X - xoff;
+                    newTSpr->pos.Y = itActor1->int_pos().Y - yoff;
+                    newTSpr->pos.Z = itActor1->int_pos().Z - zoff;
                     newTSpr->sectp = itActor1->sector();
                 }
 
@@ -478,8 +478,8 @@ void WarpCopySprite(tspriteArray& tsprites)
                     tspritetype* newTSpr = renderAddTsprite(tsprites, itActor2);
                     newTSpr->statnum = 0;
 
-                    auto off = itActor1->spr.pos - newTSpr->pos;
-                    newTSpr->pos = itActor->spr.pos - off;
+                    auto off = itActor1->int_pos() - newTSpr->pos;
+                    newTSpr->pos = itActor->int_pos() - off;
                     newTSpr->sectp = itActor->sector();
                 }
             }
@@ -639,8 +639,8 @@ void analyzesprites(tspriteArray& tsprites, int viewx, int viewy, int viewz, int
             // workaround for mines and floor decals beneath the floor
             if (tsp->picnum == BETTY_R0 || tsp->picnum == FLOORBLOOD1)
             {
-                int32_t const floorz = getflorzofslopeptr(tActor->sector(), tActor->spr.pos.X, tActor->spr.pos.Y);
-                if (tActor->spr.pos.Z > floorz)
+                int32_t const floorz = getflorzofslopeptr(tActor->sector(), tActor->int_pos().X, tActor->int_pos().Y);
+                if (tActor->int_pos().Z > floorz)
                     tsp->pos.Z = floorz;
             }
 
@@ -1066,9 +1066,9 @@ void PrintSpriteInfo(PLAYER* pp)
         }
 
         {
-            Printf("POSX:%d, ", actor->spr.pos.X);
-            Printf("POSY:%d, ", actor->spr.pos.Y);
-            Printf("POSZ:%d,", actor->spr.pos.Z);
+            Printf("POSX:%d, ", actor->int_pos().X);
+            Printf("POSY:%d, ", actor->int_pos().Y);
+            Printf("POSZ:%d,", actor->int_pos().Z);
             Printf("ANG:%d\n", actor->spr.ang);
         }
     }
@@ -1096,12 +1096,12 @@ void CameraView(PLAYER* pp, int *tx, int *ty, int *tz, sectortype** tsect, binan
         SWStatIterator it(STAT_DEMO_CAMERA);
         while (auto actor = it.Next())
         {
-            ang = bvectangbam(*tx - actor->spr.pos.X, *ty - actor->spr.pos.Y);
+            ang = bvectangbam(*tx - actor->int_pos().X, *ty - actor->int_pos().Y);
             ang_test = getincangle(ang.asbuild(), actor->spr.ang) < actor->spr.lotag;
 
             FAFcansee_test =
-                (FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), *tx, *ty, *tz, pp->cursector) ||
-                 FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), *tx, *ty, *tz + ActorSizeZ(pp->actor), pp->cursector));
+                (FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), *tx, *ty, *tz, pp->cursector) ||
+                 FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), *tx, *ty, *tz + ActorSizeZ(pp->actor), pp->cursector));
 
             player_in_camera = ang_test && FAFcansee_test;
 
@@ -1134,15 +1134,15 @@ void CameraView(PLAYER* pp, int *tx, int *ty, int *tz, sectortype** tsect, binan
                     xvect = ang.bcos(-3);
                     yvect = ang.bsin(-3);
 
-                    zdiff = actor->spr.pos.Z - *tz;
-                    if (labs(actor->spr.pos.X - *tx) > 1000)
-                        zvect = Scale(xvect, zdiff, actor->spr.pos.X - *tx);
-                    else if (labs(actor->spr.pos.Y - *ty) > 1000)
-                        zvect = Scale(yvect, zdiff, actor->spr.pos.Y - *ty);
-                    else if (actor->spr.pos.X - *tx != 0)
-                        zvect = Scale(xvect, zdiff, actor->spr.pos.X - *tx);
-                    else if (actor->spr.pos.Y - *ty != 0)
-                        zvect = Scale(yvect, zdiff, actor->spr.pos.Y - *ty);
+                    zdiff = actor->int_pos().Z - *tz;
+                    if (labs(actor->int_pos().X - *tx) > 1000)
+                        zvect = Scale(xvect, zdiff, actor->int_pos().X - *tx);
+                    else if (labs(actor->int_pos().Y - *ty) > 1000)
+                        zvect = Scale(yvect, zdiff, actor->int_pos().Y - *ty);
+                    else if (actor->int_pos().X - *tx != 0)
+                        zvect = Scale(xvect, zdiff, actor->int_pos().X - *tx);
+                    else if (actor->int_pos().Y - *ty != 0)
+                        zvect = Scale(yvect, zdiff, actor->int_pos().Y - *ty);
                     else
                         zvect = 0;
 
@@ -1150,9 +1150,9 @@ void CameraView(PLAYER* pp, int *tx, int *ty, int *tz, sectortype** tsect, binan
                     *thoriz = q16horiz(clamp(-(zvect << 8), gi->playerHorizMin(), gi->playerHorizMax()));
 
                     *tang = ang;
-                    *tx = actor->spr.pos.X;
-                    *ty = actor->spr.pos.Y;
-                    *tz = actor->spr.pos.Z;
+                    *tx = actor->int_pos().X;
+                    *ty = actor->int_pos().Y;
+                    *tz = actor->int_pos().Z;
                     *tsect = actor->sector();
 
                     found_camera = true;
@@ -1626,8 +1626,8 @@ bool GameInterface::DrawAutomapPlayer(int mx, int my, int cposx, int cposy, int
                 if (actor == peekActor)
                     col = GPalette.BaseColors[31];
 
-                sprx = actor->spr.pos.X;
-                spry = actor->spr.pos.Y;
+                sprx = actor->int_pos().X;
+                spry = actor->int_pos().Y;
 
                 k = actor->spr.statnum;
                 if ((k >= 1) && (k <= 8) && (k != 2))   // Interpolate moving
diff --git a/source/games/sw/src/eel.cpp b/source/games/sw/src/eel.cpp
index cb0cdb3f3..70f900c1c 100644
--- a/source/games/sw/src/eel.cpp
+++ b/source/games/sw/src/eel.cpp
@@ -364,7 +364,7 @@ void EelCommon(DSWActor* actor)
     actor->user.floor_dist = Z(16);
     actor->user.ceiling_dist = Z(20);
 
-    actor->user.pos.Z = actor->spr.pos.Z;
+    actor->user.pos.Z = actor->int_pos().Z;
 
     actor->spr.xrepeat = 35;
     actor->spr.yrepeat = 27;
@@ -462,7 +462,7 @@ int DoEelMatchPlayerZ(DSWActor* actor)
     // lower bound
     if (actor->user.lowActor && actor->user.targetActor == actor->user.highActor) // this doesn't look right...
     {
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.lowActor->spr.pos.X, actor->user.lowActor->spr.pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.lowActor->int_pos().X, actor->user.lowActor->int_pos().Y, dist, a, b, c);
         if (dist <= 300)
             bound = actor->user.pos.Z;
         else
@@ -479,7 +479,7 @@ int DoEelMatchPlayerZ(DSWActor* actor)
     // upper bound
     if (actor->user.highActor && actor->user.targetActor == actor->user.highActor)
     {
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.highActor->spr.pos.X, actor->user.highActor->spr.pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.highActor->int_pos().X, actor->user.highActor->int_pos().Y, dist, a, b, c);
         if (dist <= 300)
             bound = actor->user.pos.Z;
         else
@@ -500,7 +500,7 @@ int DoEelMatchPlayerZ(DSWActor* actor)
     actor->set_int_z(actor->user.pos.Z + MulScale(EEL_BOB_AMT, bsin(actor->user.Counter), 14));
 
     bound = actor->user.hiz + actor->user.ceiling_dist + EEL_BOB_AMT;
-    if (actor->spr.pos.Z < bound)
+    if (actor->int_pos().Z < bound)
     {
         // bumped something
         actor->set_int_z(actor->user.pos.Z = bound + EEL_BOB_AMT);
@@ -534,7 +534,7 @@ int DoEelDeath(DSWActor* actor)
     DoFindGroundPoint(actor);
 
     // on the ground
-    if (actor->spr.pos.Z >= actor->user.loz)
+    if (actor->int_pos().Z >= actor->user.loz)
     {
         actor->user.Flags &= ~(SPR_FALLING|SPR_SLIDING);
         if (RandomRange(1000) > 500)
diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h
index 606a452a6..4597f49b8 100644
--- a/source/games/sw/src/game.h
+++ b/source/games/sw/src/game.h
@@ -1954,12 +1954,12 @@ inline bool SectorIsUnderwaterArea(sectortype* sect)
 
 inline bool PlayerFacingRange(PLAYER* pp, DSWActor* a, int range)
 {
-    return (abs(getincangle(getangle(a->spr.pos.X - (pp)->pos.X, a->spr.pos.Y - (pp)->pos.Y), (pp)->angle.ang.asbuild())) < (range));
+    return (abs(getincangle(getangle(a->int_pos().X - (pp)->pos.X, a->int_pos().Y - (pp)->pos.Y), (pp)->angle.ang.asbuild())) < (range));
 }
 
 inline bool FacingRange(DSWActor* a1, DSWActor* a2, int range)
 {
-    return (abs(getincangle(getangle(a1->spr.pos.X - a2->spr.pos.X, a1->spr.pos.Y - a2->spr.pos.Y), a2->spr.ang)) < (range));
+    return (abs(getincangle(getangle(a1->int_pos().X - a2->int_pos().X, a1->int_pos().Y - a2->int_pos().Y), a2->spr.ang)) < (range));
 }
 inline void SET_BOOL1(DSWActor* sp) { sp->spr.extra |= SPRX_BOOL1; }
 inline void SET_BOOL2(DSWActor* sp) { sp->spr.extra |= SPRX_BOOL2; }
@@ -2067,7 +2067,7 @@ inline int ActorSizeY(DSWActor* sp)
 
 inline bool Facing(DSWActor* actor1, DSWActor* actor2)
 {
-    return (abs(getincangle(getangle(actor1->spr.pos.X - actor2->spr.pos.X, actor1->spr.pos.Y - actor2->spr.pos.Y), actor2->spr.ang)) < 512);
+    return (abs(getincangle(getangle(actor1->int_pos().X - actor2->int_pos().X, actor1->int_pos().Y - actor2->int_pos().Y), actor2->spr.ang)) < 512);
 }
 
 // Given a z height and sprite return the correct y repeat value
diff --git a/source/games/sw/src/hornet.cpp b/source/games/sw/src/hornet.cpp
index 7ba5a4b0b..c2f123ff2 100644
--- a/source/games/sw/src/hornet.cpp
+++ b/source/games/sw/src/hornet.cpp
@@ -312,7 +312,7 @@ int SetupHornet(DSWActor* actor)
     actor->user.floor_dist = Z(16);
     actor->user.ceiling_dist = Z(16);
 
-    actor->user.pos.Z = actor->spr.pos.Z;
+    actor->user.pos.Z = actor->int_pos().Z;
 
     actor->spr.xrepeat = 37;
     actor->spr.yrepeat = 32;
@@ -396,7 +396,7 @@ int DoHornetMatchPlayerZ(DSWActor* actor)
     actor->set_int_z(actor->user.pos.Z + MulScale(HORNET_BOB_AMT, bsin(actor->user.Counter), 14));
 
     bound = actor->user.hiz + actor->user.ceiling_dist + HORNET_BOB_AMT;
-    if (actor->spr.pos.Z < bound)
+    if (actor->int_pos().Z < bound)
     {
         // bumped something
         actor->set_int_z(actor->user.pos.Z = bound + HORNET_BOB_AMT);
@@ -513,7 +513,7 @@ int DoHornetDeath(DSWActor* actor)
     actor->user.coll = move_sprite(actor, nx, ny, 0L, actor->user.ceiling_dist, actor->user.floor_dist, 1, ACTORMOVETICS);
 
     // on the ground
-    if (actor->spr.pos.Z >= actor->user.loz)
+    if (actor->int_pos().Z >= actor->user.loz)
     {
         actor->user.Flags &= ~(SPR_FALLING|SPR_SLIDING);
         actor->spr.cstat &= ~(CSTAT_SPRITE_YFLIP); // If upside down, reset it
@@ -541,7 +541,7 @@ int DoCheckSwarm(DSWActor* actor)
     if (actor->user.targetActor->user.PlayerP)
     {
         pp = actor->user.targetActor->user.PlayerP;
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y, pdist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y, pdist, a, b, c);
     }
     else
         return 0;
@@ -554,7 +554,7 @@ int DoCheckSwarm(DSWActor* actor)
 
         if (itActor->spr.hitag != TAG_SWARMSPOT || itActor->spr.lotag != 2) continue;
 
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y, dist, a, b, c);
 
         if (dist < pdist && actor->user.ID == itActor->user.ID) // Only flock to your own kind
         {
diff --git a/source/games/sw/src/interpso.cpp b/source/games/sw/src/interpso.cpp
index 1f10df614..0faa88f65 100644
--- a/source/games/sw/src/interpso.cpp
+++ b/source/games/sw/src/interpso.cpp
@@ -110,15 +110,15 @@ static double getvalue(so_interp::interp_data& element)
         return SectorObject[index].pmid.Z;
     case soi_sprx:
 		if (element.actorofang)
-			return element.actorofang->spr.pos.X;
+			return element.actorofang->int_pos().X;
         break;
     case soi_spry:
 		if (element.actorofang)
-			return element.actorofang->spr.pos.Y;
+			return element.actorofang->int_pos().Y;
         break;
     case soi_sprz:
 		if (element.actorofang)
-			return element.actorofang->spr.pos.Z;
+			return element.actorofang->int_pos().Z;
         break;
     default:
 		break;
diff --git a/source/games/sw/src/jsector.cpp b/source/games/sw/src/jsector.cpp
index 7b4c19ec5..c5cab7976 100644
--- a/source/games/sw/src/jsector.cpp
+++ b/source/games/sw/src/jsector.cpp
@@ -429,8 +429,8 @@ JS_ProcessEchoSpot()
     {
         dist = 0x7fffffff;
 
-        j = abs(actor->spr.pos.X - pp->pos.X);
-        j += abs(actor->spr.pos.Y - pp->pos.Y);
+        j = abs(actor->int_pos().X - pp->pos.X);
+        j += abs(actor->int_pos().Y - pp->pos.Y);
         if (j < dist)
             dist = j;
 
@@ -509,8 +509,8 @@ void JS_DrawCameras(PLAYER* pp, int tx, int ty, int tz, double smoothratio)
                 {
                     DSWActor* camactor = mirror[cnt].camspriteActor;
 
-                    j = abs(camactor->spr.pos.X - tx);
-                    j += abs(camactor->spr.pos.Y - ty);
+                    j = abs(camactor->int_pos().X - tx);
+                    j += abs(camactor->int_pos().Y - ty);
                     if (j < dist)
                         dist = j;
                 }
@@ -534,20 +534,20 @@ void JS_DrawCameras(PLAYER* pp, int tx, int ty, int tz, double smoothratio)
                 tdy = abs(midy - ty);
 
                 if (midx >= tx)
-                    dx = camactor->spr.pos.X - tdx;
+                    dx = camactor->int_pos().X - tdx;
                 else
-                    dx = camactor->spr.pos.X + tdx;
+                    dx = camactor->int_pos().X + tdx;
 
                 if (midy >= ty)
-                    dy = camactor->spr.pos.Y - tdy;
+                    dy = camactor->int_pos().Y - tdy;
                 else
-                    dy = camactor->spr.pos.Y + tdy;
+                    dy = camactor->int_pos().Y + tdy;
 
-                tdz = abs(tz - camactor->spr.pos.Z);
-                if (tz >= camactor->spr.pos.Z)
-                    dz = camactor->spr.pos.Z + tdz;
+                tdz = abs(tz - camactor->int_pos().Z);
+                if (tz >= camactor->int_pos().Z)
+                    dz = camactor->int_pos().Z + tdz;
                 else
-                    dz = camactor->spr.pos.Z - tdz;
+                    dz = camactor->int_pos().Z - tdz;
 
 
                 // Is it a TV cam or a teleporter that shows destination?
@@ -630,7 +630,7 @@ void JS_DrawCameras(PLAYER* pp, int tx, int ty, int tz, double smoothratio)
                             }
                             else
                             {
-                                drawroomstotile(camactor->spr.pos.X, camactor->spr.pos.Y, camactor->spr.pos.Z, buildang(SP_TAG5(camactor)), camhoriz, camactor->sector(), mirror[cnt].campic, smoothratio);
+                                drawroomstotile(camactor->int_pos().X, camactor->int_pos().Y, camactor->int_pos().Z, buildang(SP_TAG5(camactor)), camhoriz, camactor->sector(), mirror[cnt].campic, smoothratio);
                             }
                         }
                     }
diff --git a/source/games/sw/src/jweapon.cpp b/source/games/sw/src/jweapon.cpp
index ab331f94c..c9e62e76d 100644
--- a/source/games/sw/src/jweapon.cpp
+++ b/source/games/sw/src/jweapon.cpp
@@ -262,7 +262,7 @@ int DoWallBloodDrip(DSWActor* actor)
     if (actor->user.pos.Z != actor->user.pos.Y)
     {
         // if you are between the ceiling and floor fall fast
-        if (actor->spr.pos.Z > actor->user.pos.Y && actor->spr.pos.Z < actor->user.pos.Z)
+        if (actor->int_pos().Z > actor->user.pos.Y && actor->int_pos().Z < actor->user.pos.Z)
         {
             actor->spr.zvel += 300;
             actor->add_int_z(actor->spr.zvel);
@@ -279,7 +279,7 @@ int DoWallBloodDrip(DSWActor* actor)
         actor->add_int_z(actor->spr.zvel);
     }
 
-    if (actor->spr.pos.Z >= actor->user.loz)
+    if (actor->int_pos().Z >= actor->user.loz)
     {
         actor->set_int_z(actor->user.loz);
         SpawnFloorSplash(actor);
@@ -293,7 +293,7 @@ int DoWallBloodDrip(DSWActor* actor)
 void SpawnMidSplash(DSWActor* actor)
 {
     auto actorNew = SpawnActor(STAT_MISSILE, GOREDrip, s_GoreSplash, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
 
     actorNew->spr.shade = -12;
     actorNew->spr.xrepeat = 70-RandomRange(20);
@@ -316,7 +316,7 @@ void SpawnMidSplash(DSWActor* actor)
 void SpawnFloorSplash(DSWActor* actor)
 {
     auto actorNew = SpawnActor(STAT_MISSILE, GOREDrip, s_GoreFloorSplash, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     actorNew->spr.shade = -12;
     actorNew->spr.xrepeat = 70-RandomRange(20);
@@ -359,9 +359,9 @@ int DoBloodSpray(DSWActor* actor)
         // special stuff for blood worm
         actor->add_int_z((actor->user.change.Z >> 1));
 
-        getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &cz, &fz);
+        getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &cz, &fz);
         // pretend like we hit a sector
-        if (actor->spr.pos.Z >= fz)
+        if (actor->int_pos().Z >= fz)
         {
             actor->set_int_z(fz);
             SpawnFloorSplash(actor);
@@ -420,7 +420,7 @@ int DoBloodSpray(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -445,7 +445,7 @@ int DoBloodSpray(DSWActor* actor)
 
                 actor->spr.xvel = actor->spr.yvel = actor->user.change.X = actor->user.change.Y = 0;
                 actor->spr.xrepeat = actor->spr.yrepeat = 70 - RandomRange(25);
-                actor->set_int_xy(bldActor->spr.pos.X, bldActor->spr.pos.Y);
+                actor->set_int_xy(bldActor->int_pos().X, bldActor->int_pos().Y);
 
                 // !FRANK! bit of a hack
                 // yvel is the hit_wall
@@ -453,7 +453,7 @@ int DoBloodSpray(DSWActor* actor)
                 {
                     // sy & sz are the ceiling and floor of the sector you are sliding down
                     if (bldActor->tempwall->twoSided())
-                        getzsofslopeptr(bldActor->tempwall->nextSector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.pos.Y, &actor->user.pos.Z);
+                        getzsofslopeptr(bldActor->tempwall->nextSector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.pos.Y, &actor->user.pos.Z);
                     else
                         actor->user.pos.Y = actor->user.pos.Z; // ceiling and floor are equal - white wall
                 }
@@ -468,7 +468,7 @@ int DoBloodSpray(DSWActor* actor)
         case kHitSector:
         {
             // hit floor
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
             {
                 if (actor->user.Flags & (SPR_UNDERWATER))
                     actor->user.Flags |= (SPR_BOUNCE);  // no bouncing
@@ -516,7 +516,7 @@ int DoBloodSpray(DSWActor* actor)
     {
 
         auto actorNew = SpawnActor(STAT_MISSILE, GOREDrip, s_BloodSpray, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 100);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 100);
 
         SetOwner(actor, actorNew);
         actorNew->spr.shade = -12;
@@ -615,7 +615,7 @@ int DoPhosphorus(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -643,7 +643,7 @@ int DoPhosphorus(DSWActor* actor)
                 else
                 {
                     // hit a sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         if (!(actor->user.Flags & SPR_BOUNCE))
@@ -672,7 +672,7 @@ int DoPhosphorus(DSWActor* actor)
             else
             {
                 // hit floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     if (actor->user.Flags & (SPR_UNDERWATER))
                         actor->user.Flags |= (SPR_BOUNCE);  // no bouncing
@@ -718,7 +718,7 @@ int DoPhosphorus(DSWActor* actor)
     {
 
         auto actorNew = SpawnActor(STAT_SKIP4, PUFF, s_PhosphorExp, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 100);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 100);
 
         actorNew->spr.hitag = LUMINOUS;           // Always full brightness
         SetOwner(actor, actorNew);
@@ -818,7 +818,7 @@ int DoChemBomb(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -849,7 +849,7 @@ int DoChemBomb(DSWActor* actor)
                 else
                 {
                     // hit a sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         if (!(actor->user.Flags & SPR_BOUNCE))
@@ -888,7 +888,7 @@ int DoChemBomb(DSWActor* actor)
             else
             {
                 // hit floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     if (actor->user.Flags & (SPR_UNDERWATER))
                         actor->user.Flags |= (SPR_BOUNCE);  // no bouncing
@@ -941,7 +941,7 @@ int DoChemBomb(DSWActor* actor)
     if (!(actor->user.Flags & (SPR_BOUNCE | SPR_UNDERWATER)) && !(actor->spr.cstat & CSTAT_SPRITE_INVISIBLE))
     {
         auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_Puff, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 100);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 100);
 
         SetOwner(actor, actorNew);
         actorNew->spr.shade = -40;
@@ -1034,7 +1034,7 @@ int DoCaltrops(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -1064,7 +1064,7 @@ int DoCaltrops(DSWActor* actor)
                 else
                 {
                     // hit a sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         if (!(actor->user.Flags & SPR_BOUNCE))
@@ -1094,7 +1094,7 @@ int DoCaltrops(DSWActor* actor)
             else
             {
                 // hit floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     if (actor->user.Flags & (SPR_UNDERWATER))
                         actor->user.Flags |= (SPR_BOUNCE);  // no bouncing
@@ -1170,7 +1170,7 @@ int SpawnRadiationCloud(DSWActor* actor)
         return -1;
 
     auto actorNew = SpawnActor(STAT_MISSILE, RADIATION_CLOUD, s_RadiationCloud, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
 
     SetOwner(GetOwner(actor), actorNew);
     actorNew->user.WaitTics = 1 * 120;
@@ -1306,9 +1306,9 @@ int InitSpriteChemBomb(DSWActor* actor)
 
     PlaySound(DIGI_THROW, actor, v3df_dontpan | v3df_doppler);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -1348,9 +1348,9 @@ int InitChemBomb(DSWActor* actor)
 {
     int nx, ny, nz;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -1425,14 +1425,14 @@ int PlayerInitFlashBomb(PLAYER* pp)
             if (itActor == pp->actor)
                 break;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if (dist > 16384)           // Flash radius
                 continue;
 
             if (!(actor->spr.cstat & CSTAT_SPRITE_BLOCK))
                 continue;
 
-            if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - ActorSizeZ(actor), actor->sector()))
+            if (!FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - ActorSizeZ(actor), actor->sector()))
                 continue;
 
             damage = GetDamage(itActor, pp->actor, DMG_FLASHBOMB);
@@ -1484,14 +1484,14 @@ int InitFlashBomb(DSWActor* actor)
         SWStatIterator it(StatDamageList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if (dist > 16384)           // Flash radius
                 continue;
 
             if (!(actor->spr.cstat & CSTAT_SPRITE_BLOCK))
                 continue;
 
-            if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - ActorSizeZ(actor), actor->sector()))
+            if (!FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - ActorSizeZ(actor), actor->sector()))
                 continue;
 
             damage = GetDamage(itActor, actor, DMG_FLASHBOMB);
@@ -1569,7 +1569,7 @@ void SpawnFlashBombOnActor(DSWActor* actor)
     }
 
     auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL_FLAMES, s_FireballFlames, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     if (actor->user.flameActor != nullptr)
         actor->user.flameActor = actorNew;
@@ -1676,9 +1676,9 @@ int InitCaltrops(DSWActor* actor)
 
     PlaySound(DIGI_THROW, actor, v3df_dontpan | v3df_doppler);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -1718,9 +1718,9 @@ int InitPhosphorus(DSWActor* actor)
 
     PlaySound(DIGI_FIREBALL1, actor, v3df_follow);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     daang = NORM_ANGLE(RandomRange(2048));
 
@@ -1797,8 +1797,8 @@ int InitBloodSpray(DSWActor* actor, bool dogib, short velocity)
         else
             ang = NORM_ANGLE(ang+1024+256 - RandomRange(256));
 
-        nx = actor->spr.pos.X;
-        ny = actor->spr.pos.Y;
+        nx = actor->int_pos().X;
+        ny = actor->int_pos().Y;
         nz = ActorZOfTop(actor)-20;
 
         // Spawn a shot
@@ -1880,7 +1880,7 @@ DSWActor* DoFlagRangeTest(DSWActor* actor, int range)
         SWStatIterator it(StatDamageList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if (dist > range)
                 continue;
 
@@ -1893,10 +1893,10 @@ DSWActor* DoFlagRangeTest(DSWActor* actor, int range)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector()))
+            if (!FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector()))
                 continue;
 
-            dist = FindDistance3D(actor->spr.pos - itActor->spr.pos);
+            dist = FindDistance3D(actor->int_pos() - itActor->int_pos());
             if (dist > range)
                 continue;
 
@@ -1918,7 +1918,7 @@ int DoCarryFlag(DSWActor* actor)
     // if no Owner then die
     if (attached != nullptr)
     {
-        vec3_t pos = { attached->spr.pos.X, attached->spr.pos.Y, ActorZOfMiddle(attached) };
+        vec3_t pos = { attached->int_pos().X, attached->int_pos().Y, ActorZOfMiddle(attached) };
         SetActorZ(actor, &pos);
         actor->spr.ang = NORM_ANGLE(attached->spr.ang + 1536);
     }
@@ -2067,10 +2067,10 @@ int DoCarryFlagNoDet(DSWActor* actor)
     // if no Owner then die
     if (attached != nullptr)
     {
-        vec3_t pos = { attached->spr.pos.X, attached->spr.pos.Y, ActorZOfMiddle(attached) };
+        vec3_t pos = { attached->int_pos().X, attached->int_pos().Y, ActorZOfMiddle(attached) };
         SetActorZ(actor, &pos);
         actor->spr.ang = NORM_ANGLE(attached->spr.ang + 1536);
-        actor->set_int_z(attached->spr.pos.Z - (ActorSizeZ(attached) >> 1));
+        actor->set_int_z(attached->int_pos().Z - (ActorSizeZ(attached) >> 1));
     }
 
     if (!attached->hasU() || attached->user.Health <= 0)
@@ -2143,7 +2143,7 @@ int DoFlag(DSWActor* actor)
             // attach weapon to sprite
             actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
             SetAttach(hitActor, actor);
-            actor->user.pos.Z = hitActor->spr.pos.Z - (ActorSizeZ(hitActor) >> 1);
+            actor->user.pos.Z = hitActor->int_pos().Z - (ActorSizeZ(hitActor) >> 1);
         }
     }
 
@@ -2160,8 +2160,8 @@ int SpawnShell(DSWActor* actor, int ShellNum)
     extern STATE s_ShotgunShellShrap[];
 
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
     nz = ActorZOfMiddle(actor);
 
     switch (ShellNum)
diff --git a/source/games/sw/src/lava.cpp b/source/games/sw/src/lava.cpp
index e7196da9f..c00bec281 100644
--- a/source/games/sw/src/lava.cpp
+++ b/source/games/sw/src/lava.cpp
@@ -472,7 +472,7 @@ int SetupLava(DSWActor* actor)
     actor->spr.clipdist = (512) >> 2;
     actor->user.Flags |= (SPR_XFLIP_TOGGLE|SPR_ELECTRO_TOLERANT);
 
-    actor->user.loz = actor->spr.pos.Z;
+    actor->user.loz = actor->int_pos().Z;
 
     return 0;
 }
diff --git a/source/games/sw/src/miscactr.cpp b/source/games/sw/src/miscactr.cpp
index cefa6c5b7..7b4937ae2 100644
--- a/source/games/sw/src/miscactr.cpp
+++ b/source/games/sw/src/miscactr.cpp
@@ -146,7 +146,7 @@ int DoToiletGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (actor->user.FlagOwner != 1)
     {
@@ -199,7 +199,7 @@ int NullToiletGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
@@ -366,7 +366,7 @@ int DoWashGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (RandomRange(1000) > 980 && actor->user.ShellNum <= 0)
     {
@@ -428,7 +428,7 @@ int NullWashGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
@@ -1154,7 +1154,7 @@ int DoCarGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (actor->user.FlagOwner == 1)
     {
@@ -1198,7 +1198,7 @@ int NullCarGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
@@ -1354,7 +1354,7 @@ int DoMechanicGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (actor->user.FlagOwner == 1)
     {
@@ -1398,7 +1398,7 @@ int NullMechanicGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
@@ -1555,7 +1555,7 @@ int DoSailorGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (actor->user.FlagOwner == 1)
     {
@@ -1604,7 +1604,7 @@ int NullSailorGirl(DSWActor* actor)
     static short alreadythrew = 0;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
@@ -1748,7 +1748,7 @@ int DoPruneGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,ActorZOfMiddle(actor->user.targetActor),actor->user.targetActor->sector());
 
     if (actor->user.FlagOwner == 1)
     {
@@ -1808,7 +1808,7 @@ int NullPruneGirl(DSWActor* actor)
     bool ICanSee = false;
 
     DoActorPickClosePlayer(actor);
-    ICanSee = FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->spr.pos.X,actor->user.targetActor->spr.pos.Y,actor->user.targetActor->spr.pos.Z,actor->user.targetActor->sector());
+    ICanSee = FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),actor->user.targetActor->int_pos().X,actor->user.targetActor->int_pos().Y,actor->user.targetActor->int_pos().Z,actor->user.targetActor->sector());
 
     if (!(actor->user.Flags & SPR_CLIMBING))
         KeepActorOnFloor(actor);
diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp
index 06c663045..db0ebd75c 100644
--- a/source/games/sw/src/player.cpp
+++ b/source/games/sw/src/player.cpp
@@ -1163,7 +1163,7 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets
 
             // Only look at closest ones
             //if ((dist = Distance(actor->spr.x, actor->spr.y, itActor->spr.x, itActor->spr.y)) > PICK_DIST)
-            if ((dist = FindDistance3D(actor->spr.pos - itActor->spr.pos)) > PICK_DIST)
+            if ((dist = FindDistance3D(actor->int_pos() - itActor->int_pos())) > PICK_DIST)
                 continue;
 
             if (skip_targets != 2) // Used for spriteinfo mode
@@ -1174,7 +1174,7 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets
             }
 
             // Get the angle to the player
-            angle2 = NORM_ANGLE(getangle(itActor->spr.pos.X - actor->spr.pos.X, itActor->spr.pos.Y - actor->spr.pos.Y));
+            angle2 = NORM_ANGLE(getangle(itActor->int_pos().X - actor->int_pos().X, itActor->int_pos().Y - actor->int_pos().Y));
 
             // Get the angle difference
             // delta_ang = labs(pp->angle.ang.asbuild() - angle2);
@@ -1195,9 +1195,9 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets
             ezhl = ActorZOfBottom(itActor) - (ActorSizeZ(itActor) >> 2);
 
             // If you can't see 'em you can't shoot 'em
-            if (!FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, zh, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ezh, itActor->sector()) &&
-                !FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, zh, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ezhm, itActor->sector()) &&
-                !FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, zh, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ezhl, itActor->sector())
+            if (!FAFcansee(actor->int_pos().X, actor->int_pos().Y, zh, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ezh, itActor->sector()) &&
+                !FAFcansee(actor->int_pos().X, actor->int_pos().Y, zh, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ezhm, itActor->sector()) &&
+                !FAFcansee(actor->int_pos().X, actor->int_pos().Y, zh, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ezhl, itActor->sector())
                 )
                 continue;
 
@@ -1300,14 +1300,14 @@ void DoSpawnTeleporterEffect(DSWActor* actor)
     nx = MOVEx(512, actor->spr.ang);
     ny = MOVEy(512, actor->spr.ang);
 
-    nx += actor->spr.pos.X;
-    ny += actor->spr.pos.Y;
+    nx += actor->int_pos().X;
+    ny += actor->int_pos().Y;
 
     auto effectActor = SpawnActor(STAT_MISSILE, 0, s_TeleportEffect, actor->sector(),
                          nx, ny, ActorZOfTop(actor) + Z(16),
                          actor->spr.ang, 0);
 
-    SetActorZ(effectActor, effectActor->spr.pos);
+    SetActorZ(effectActor, effectActor->int_pos());
 
     effectActor->spr.shade = -40;
     effectActor->spr.xrepeat = effectActor->spr.yrepeat = 42;
@@ -1322,10 +1322,10 @@ void DoSpawnTeleporterEffectPlace(DSWActor* actor)
     extern STATE s_TeleportEffect[];
 
     auto effectActor = SpawnActor(STAT_MISSILE, 0, s_TeleportEffect, actor->sector(),
-                         actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor) + Z(16),
+                         actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor) + Z(16),
                          actor->spr.ang, 0);
 
-    SetActorZ(effectActor, effectActor->spr.pos);
+    SetActorZ(effectActor, effectActor->int_pos());
 
     effectActor->spr.shade = -40;
     effectActor->spr.xrepeat = effectActor->spr.yrepeat = 42;
@@ -1363,7 +1363,7 @@ void DoPlayerWarpTeleporter(PLAYER* pp)
         break;
     default:
     {
-        auto pos = act_warp->spr.pos;
+        auto pos = act_warp->int_pos();
         DoPlayerTeleportToSprite(pp, &pos, act_warp->spr.ang);
         act_warp->set_int_pos(pos);
 
@@ -1716,7 +1716,7 @@ void UpdatePlayerUnderSprite(PLAYER* pp)
 
     DSWActor* act_under = pp->PlayerUnderActor;
 
-    act_under->set_int_pos(act_over->spr.pos);
+    act_under->set_int_pos(act_over->int_pos());
     ChangeActorSect(act_under, act_over->sector());
 
     SpriteWarpToUnderwater(act_under);
@@ -1871,7 +1871,7 @@ void DoPlayerZrange(PLAYER* pp)
         if (fsp->spr.statnum == STAT_ENEMY && floorColl.actor()->user.ID == ZOMBIE_RUN_R0)
         {
             pp->lo_sectp = fsp->sector();
-            pp->loz = fsp->spr.pos.Z;
+            pp->loz = fsp->int_pos().Z;
             pp->lowActor = nullptr;
         }
     }
@@ -2376,7 +2376,7 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
     SWSectIterator it(sop->op_main_sector);
     while (auto actor = it.Next())
     {
-        if (testpointinquad(actor->spr.pos.X, actor->spr.pos.Y, x, y))
+        if (testpointinquad(actor->int_pos().X, actor->int_pos().Y, x, y))
         {
             if ((actor->spr.extra & SPRX_BREAKABLE) && HitBreakSprite(actor, 0))
                 continue;
@@ -2399,7 +2399,7 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
             if (actor->spr.statnum > STAT_DONT_DRAW)
                 continue;
 
-            if (actor->spr.pos.Z < sop->crush_z)
+            if (actor->int_pos().Z < sop->crush_z)
                 continue;
 
             SpriteQueueDelete(actor);
@@ -2411,10 +2411,10 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
     SWStatIterator it2(STAT_ENEMY);
     while (auto actor = it.Next())
     {
-        if (testpointinquad(actor->spr.pos.X, actor->spr.pos.Y, x, y))
+        if (testpointinquad(actor->int_pos().X, actor->int_pos().Y, x, y))
         {
             //if (actor->spr.z < pp->posz)
-            if (actor->spr.pos.Z < sop->crush_z)
+            if (actor->int_pos().Z < sop->crush_z)
                 continue;
 
             int32_t const vel = FindDistance2D(pp->vect.X>>8, pp->vect.Y>>8);
@@ -2438,9 +2438,9 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
     it2.Reset(STAT_DEAD_ACTOR);
     while (auto actor = it.Next())
     {
-        if (testpointinquad(actor->spr.pos.X, actor->spr.pos.Y, x, y))
+        if (testpointinquad(actor->int_pos().X, actor->int_pos().Y, x, y))
         {
-            if (actor->spr.pos.Z < sop->crush_z)
+            if (actor->int_pos().Z < sop->crush_z)
                 continue;
 
             SpriteQueueDelete(actor);
@@ -2460,12 +2460,12 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
         if (actor->user.PlayerP == pp)
             continue;
 
-        if (testpointinquad(actor->spr.pos.X, actor->spr.pos.Y, x, y))
+        if (testpointinquad(actor->int_pos().X, actor->int_pos().Y, x, y))
         {
             int damage;
 
             //if (actor->spr.z < pp->posz)
-            if (actor->spr.pos.Z < sop->crush_z)
+            if (actor->int_pos().Z < sop->crush_z)
                 continue;
 
             damage = -(actor->user.Health + 100);
@@ -2483,7 +2483,7 @@ void DriveCrush(PLAYER* pp, int *x, int *y)
         while (auto actor = it.Next())
         {
             // give some extra buffer
-            if (actor->spr.pos.Z < sop->crush_z + Z(40))
+            if (actor->int_pos().Z < sop->crush_z + Z(40))
                 continue;
 
             if ((actor->spr.extra & SPRX_PLAYER_OR_ENEMY))
@@ -3197,7 +3197,7 @@ void DoPlayerClimb(PLAYER* pp)
             }
 
             // sprite
-            auto pos = plActor->spr.pos;
+            auto pos = plActor->int_pos();
             if (pos.X != plActor->user.pos.X)
             {
                 if (pos.X < plActor->user.pos.X)
@@ -3350,8 +3350,8 @@ void DoPlayerClimb(PLAYER* pp)
             // set players "view" distance from the ladder - needs to be farther than
             // the sprite
 
-            pp->LadderPosition.X = lActor->spr.pos.X + nx * 5;
-            pp->LadderPosition.Y = lActor->spr.pos.Y + ny * 5;
+            pp->LadderPosition.X = lActor->int_pos().X + nx * 5;
+            pp->LadderPosition.Y = lActor->int_pos().Y + ny * 5;
 
             pp->angle.settarget(buildang(lActor->spr.ang + 1024));
         }
@@ -3644,7 +3644,7 @@ DSWActor* FindNearSprite(DSWActor* actor, short stat)
     SWStatIterator it(stat);
     while (auto itActor = it.Next())
     {
-        dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+        dist = Distance(actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y);
 
         if (dist < near_dist)
         {
@@ -3732,8 +3732,8 @@ bool PlayerOnLadder(PLAYER* pp)
     // set players "view" distance from the ladder - needs to be farther than
     // the sprite
 
-    pp->LadderPosition.X = lActor->spr.pos.X + nx * 5;
-    pp->LadderPosition.Y = lActor->spr.pos.Y + ny * 5;
+    pp->LadderPosition.X = lActor->int_pos().X + nx * 5;
+    pp->LadderPosition.Y = lActor->int_pos().Y + ny * 5;
 
     pp->angle.settarget(buildang(lActor->spr.ang + 1024));
 
@@ -4037,12 +4037,12 @@ void DoPlayerWarpToUnderwater(PLAYER* pp)
     PRODUCTION_ASSERT(Found == true);
 
     // get the offset from the sprite
-    plActor->user.pos.X = over_act->spr.pos.X - pp->pos.X;
-    plActor->user.pos.Y = over_act->spr.pos.Y - pp->pos.Y;
+    plActor->user.pos.X = over_act->int_pos().X - pp->pos.X;
+    plActor->user.pos.Y = over_act->int_pos().Y - pp->pos.Y;
 
     // update to the new x y position
-    pp->pos.X = under_act->spr.pos.X - plActor->user.pos.X;
-    pp->pos.Y = under_act->spr.pos.Y - plActor->user.pos.Y;
+    pp->pos.X = under_act->int_pos().X - plActor->user.pos.X;
+    pp->pos.Y = under_act->int_pos().Y - plActor->user.pos.Y;
 
     auto over  = over_act->sector();
     auto under = under_act->sector();
@@ -4107,12 +4107,12 @@ void DoPlayerWarpToSurface(PLAYER* pp)
     PRODUCTION_ASSERT(Found == true);
 
     // get the offset from the under sprite
-    plActor->user.pos.X = under_act->spr.pos.X - pp->pos.X;
-    plActor->user.pos.Y = under_act->spr.pos.Y - pp->pos.Y;
+    plActor->user.pos.X = under_act->int_pos().X - pp->pos.X;
+    plActor->user.pos.Y = under_act->int_pos().Y - pp->pos.Y;
 
     // update to the new x y position
-    pp->pos.X = over_act->spr.pos.X - plActor->user.pos.X;
-    pp->pos.Y = over_act->spr.pos.Y - plActor->user.pos.Y;
+    pp->pos.X = over_act->int_pos().X - plActor->user.pos.X;
+    pp->pos.Y = over_act->int_pos().Y - plActor->user.pos.Y;
 
     auto over = over_act->sector();
     auto under = under_act->sector();
@@ -5090,8 +5090,8 @@ void PlayerRemoteReset(PLAYER* pp, sectortype* sect)
     pp->lastcursector = pp->cursector;
 
     auto rsp = pp->remoteActor;
-    pp->pos.X = rsp->spr.pos.X;
-    pp->pos.Y = rsp->spr.pos.Y;
+    pp->pos.X = rsp->int_pos().X;
+    pp->pos.Y = rsp->int_pos().Y;
     pp->pos.Z = sect->floorz - PLAYER_HEIGHT;
 
     pp->vect.X = pp->vect.Y = pp->ovect.X = pp->ovect.Y = pp->slide_vect.X = pp->slide_vect.Y = 0;
@@ -5718,9 +5718,9 @@ void DoPlayerDeathFollowKiller(PLAYER* pp)
     DSWActor* killer = pp->KillerActor;
     if (killer)
     {
-        if (FAFcansee(killer->spr.pos.X, killer->spr.pos.Y, ActorZOfTop(killer), killer->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector))
+        if (FAFcansee(killer->int_pos().X, killer->int_pos().Y, ActorZOfTop(killer), killer->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector))
         {
-            pp->angle.addadjustment(getincanglebam(pp->angle.ang, bvectangbam(killer->spr.pos.X - pp->pos.X, killer->spr.pos.Y - pp->pos.Y)) >> 4);
+            pp->angle.addadjustment(getincanglebam(pp->angle.ang, bvectangbam(killer->int_pos().X - pp->pos.X, killer->int_pos().Y - pp->pos.Y)) >> 4);
         }
     }
 }
@@ -5837,13 +5837,13 @@ void DoPlayerDeathCheckKick(PLAYER* pp)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, plActor->spr.pos.X, plActor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, plActor->int_pos().X, plActor->int_pos().Y, dist, a, b, c);
 
             if (unsigned(dist) < itActor->user.Radius + 100)
             {
                 pp->KillerActor = itActor;
 
-                plActor->user.slide_ang = getangle(plActor->spr.pos.X - itActor->spr.pos.X, plActor->spr.pos.Y - itActor->spr.pos.Y);
+                plActor->user.slide_ang = getangle(plActor->int_pos().X - itActor->int_pos().X, plActor->int_pos().Y - itActor->int_pos().Y);
                 plActor->user.slide_ang = NORM_ANGLE(plActor->user.slide_ang + (RANDOM_P2(128<<5)>>5) - 64);
 
                 plActor->user.slide_vel = itActor->spr.xvel<<1;
@@ -5914,8 +5914,8 @@ void DoPlayerDeathMoveHead(PLAYER* pp)
         }
     }
 
-    pp->pos.X = plActor->spr.pos.X;
-    pp->pos.Y = plActor->spr.pos.Y;
+    pp->pos.X = plActor->int_pos().X;
+    pp->pos.Y = plActor->int_pos().Y;
     pp->setcursector(plActor->sector());
 
     // try to stay in valid area - death sometimes throws you out of the map
@@ -6786,7 +6786,7 @@ int SearchSpawnPosition(PLAYER* pp)
 
             if (opp != pp)  // don't test for yourself
             {
-                if (FindDistance3D(spawn_sprite->spr.pos - opp->pos) < 1000)
+                if (FindDistance3D(spawn_sprite->int_pos() - opp->pos) < 1000)
                 {
                     blocked = true;
                     break;
@@ -6864,7 +6864,7 @@ void PlayerSpawnPosition(PLAYER* pp)
 
     ASSERT(spawn_sprite != nullptr);
 
-    pp->pos = pp->opos = spawn_sprite->spr.pos;
+    pp->pos = pp->opos = spawn_sprite->int_pos();
     pp->angle.ang = pp->angle.oang = buildang(spawn_sprite->spr.ang);
     pp->setcursector(spawn_sprite->sector());
 
diff --git a/source/games/sw/src/quake.cpp b/source/games/sw/src/quake.cpp
index 2f403d30e..586b87223 100644
--- a/source/games/sw/src/quake.cpp
+++ b/source/games/sw/src/quake.cpp
@@ -172,7 +172,7 @@ void QuakeViewChange(PLAYER* pp, int *z_diff, int *x_diff, int *y_diff, short *a
     SWStatIterator it(STAT_QUAKE_ON);
 	while ((actor = it.Next()))
 	{
-        dist = FindDistance3D(pp->pos - actor->spr.pos);
+        dist = FindDistance3D(pp->pos - actor->int_pos());
 
         // shake whole level
         if (QUAKE_TestDontTaper(actor))
@@ -248,13 +248,13 @@ bool SetQuake(PLAYER* pp, short tics, short amt)
 
 int SetExpQuake(DSWActor* actor)
 {
-    SpawnQuake(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z,  40, 4, 20000); // !JIM! was 8, 40000
+    SpawnQuake(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z,  40, 4, 20000); // !JIM! was 8, 40000
     return 0;
 }
 
 int SetGunQuake(DSWActor* actor)
 {
-    SpawnQuake(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z,  40, 8, 40000);
+    SpawnQuake(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z,  40, 8, 40000);
     return 0;
 }
 
@@ -266,19 +266,19 @@ int SetPlayerQuake(PLAYER* pp)
 
 int SetNuclearQuake(DSWActor* actor)
 {
-    SpawnQuake(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 400, 8, 64000);
+    SpawnQuake(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 400, 8, 64000);
     return 0;
 }
 
 int SetSumoQuake(DSWActor* actor)
 {
-    SpawnQuake(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z,  120, 4, 20000);
+    SpawnQuake(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z,  120, 4, 20000);
     return 0;
 }
 
 int SetSumoFartQuake(DSWActor* actor)
 {
-    SpawnQuake(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z,  60, 4, 4000);
+    SpawnQuake(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z,  60, 4, 4000);
     return 0;
 }
 
diff --git a/source/games/sw/src/ripper.cpp b/source/games/sw/src/ripper.cpp
index 20e718483..f5f0e813a 100644
--- a/source/games/sw/src/ripper.cpp
+++ b/source/games/sw/src/ripper.cpp
@@ -929,7 +929,7 @@ int InitRipperHang(DSWActor* actor)
     {
         tang = NORM_ANGLE(actor->spr.ang + dang);
 
-        FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - ActorSizeZ(actor), actor->sector(),  // Start position
+        FAFhitscan(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - ActorSizeZ(actor), actor->sector(),  // Start position
                    bcos(tang),   // X vector of 3D ang
                    bsin(tang),   // Y vector of 3D ang
                    0,            // Z vector of 3D ang
@@ -938,7 +938,7 @@ int InitRipperHang(DSWActor* actor)
         if (hit.hitSector == nullptr)
             continue;
 
-        dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, hit.hitpos.X, hit.hitpos.Y);
+        dist = Distance(actor->int_pos().X, actor->int_pos().Y, hit.hitpos.X, hit.hitpos.Y);
 
         if (hit.hitWall == nullptr || dist < 2000 || dist > 7000)
         {
@@ -1045,7 +1045,7 @@ int DoRipperBeginJumpAttack(DSWActor* actor)
     DSWActor* target = actor->user.targetActor;
     short tang;
 
-    tang = getangle(target->spr.pos.X - actor->spr.pos.X, target->spr.pos.Y - actor->spr.pos.Y);
+    tang = getangle(target->int_pos().X - actor->int_pos().X, target->int_pos().Y - actor->int_pos().Y);
 
 	Collision coll = move_sprite(actor, bcos(tang, -7), bsin(tang, -7),
 							   0L, actor->user.ceiling_dist, actor->user.floor_dist, CLIPMASK_ACTOR, ACTORMOVETICS);
@@ -1149,7 +1149,7 @@ int DoRipperRipHeart(DSWActor* actor)
     actor->user.WaitTics = 6 * 120;
 
     // player face ripper
-    target->spr.ang = getangle(actor->spr.pos.X - target->spr.pos.X, actor->spr.pos.Y - target->spr.pos.Y);
+    target->spr.ang = getangle(actor->int_pos().X - target->int_pos().X, actor->int_pos().Y - target->int_pos().Y);
     return 0;
 }
 
@@ -1174,7 +1174,7 @@ void RipperHatch(DSWActor* actor)
     {
         auto actorNew = insertActor(actor->sector(), STAT_DEFAULT);
         ClearOwner(actorNew);
-        actorNew->set_int_pos(actor->spr.pos);
+        actorNew->set_int_pos(actor->int_pos());
         actorNew->spr.xrepeat = actorNew->spr.yrepeat = 64;
         actorNew->spr.ang = rip_ang[i];
         actorNew->spr.pal = 0;
diff --git a/source/games/sw/src/ripper2.cpp b/source/games/sw/src/ripper2.cpp
index 85cfc4da2..edad2a05a 100644
--- a/source/games/sw/src/ripper2.cpp
+++ b/source/games/sw/src/ripper2.cpp
@@ -938,7 +938,7 @@ int InitRipper2Hang(DSWActor* actor)
     {
         tang = NORM_ANGLE(actor->spr.ang + dang);
 
-        FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - ActorSizeZ(actor), actor->sector(),  // Start position
+        FAFhitscan(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - ActorSizeZ(actor), actor->sector(),  // Start position
                    bcos(tang),   // X vector of 3D ang
                    bsin(tang),   // Y vector of 3D ang
                    0,            // Z vector of 3D ang
@@ -947,7 +947,7 @@ int InitRipper2Hang(DSWActor* actor)
         if (hit.hitSector == nullptr)
             continue;
 
-        dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, hit.hitpos.X, hit.hitpos.Y);
+        dist = Distance(actor->int_pos().X, actor->int_pos().Y, hit.hitpos.X, hit.hitpos.Y);
 
         if (hit.hitWall == nullptr || dist < 2000 || dist > 7000)
         {
@@ -1012,7 +1012,7 @@ int DoRipper2MoveHang(DSWActor* actor)
             short w, nw;
 
             // Don't keep clinging and going ever higher!
-            if (abs(actor->spr.pos.Z - actor->user.targetActor->spr.pos.Z) > (4000<<4))
+            if (abs(actor->int_pos().Z - actor->user.targetActor->int_pos().Z) > (4000<<4))
                 return 0;
 
             NewStateGroup(actor, actor->user.ActorActionSet->Special[1]);
@@ -1065,7 +1065,7 @@ int DoRipper2BeginJumpAttack(DSWActor* actor)
     DSWActor* target = actor->user.targetActor;
     short tang;
 
-    tang = getangle(target->spr.pos.X - actor->spr.pos.X, target->spr.pos.Y - actor->spr.pos.Y);
+    tang = getangle(target->int_pos().X - actor->int_pos().X, target->int_pos().Y - actor->int_pos().Y);
 
     // Always jump at player if mad.
 
@@ -1171,7 +1171,7 @@ int DoRipper2RipHeart(DSWActor* actor)
     actor->user.WaitTics = 6 * 120;
 
     // player face ripper2
-    target->spr.ang = getangle(actor->spr.pos.X - target->spr.pos.X, actor->spr.pos.Y - target->spr.pos.Y);
+    target->spr.ang = getangle(actor->int_pos().X - target->int_pos().X, actor->int_pos().Y - target->int_pos().Y);
     return 0;
 }
 
@@ -1199,7 +1199,7 @@ void Ripper2Hatch(DSWActor* actor)
     {
         auto actorNew = insertActor(actor->sector(), STAT_DEFAULT);
         ClearOwner(actorNew);
-        actorNew->set_int_pos(actor->spr.pos);
+        actorNew->set_int_pos(actor->int_pos());
 
         actorNew->spr.xrepeat = actorNew->spr.yrepeat = 64;
         actorNew->spr.ang = rip_ang[i];
diff --git a/source/games/sw/src/rooms.cpp b/source/games/sw/src/rooms.cpp
index 73690824e..20640e2dd 100644
--- a/source/games/sw/src/rooms.cpp
+++ b/source/games/sw/src/rooms.cpp
@@ -672,8 +672,8 @@ bool FindCeilingView(int match, int* x, int* y, int z, sectortype** sect)
     {
         if (actor->spr.hitag == VIEW_THRU_CEILING && actor->spr.lotag == match)
         {
-            xoff = *x - actor->spr.pos.X;
-            yoff = *y - actor->spr.pos.Y;
+            xoff = *x - actor->int_pos().X;
+            yoff = *y - actor->int_pos().Y;
             break;
         }
     }
@@ -688,8 +688,8 @@ bool FindCeilingView(int match, int* x, int* y, int z, sectortype** sect)
             {
                 sectortype* upper,* lower;
 
-                *x = actor->spr.pos.X + xoff;
-                *y = actor->spr.pos.Y + yoff;
+                *x = actor->int_pos().X + xoff;
+                *y = actor->int_pos().Y + yoff;
 
                 // get new sector
                 GetUpperLowerSector(match, *x, *y, &upper, &lower);
@@ -729,8 +729,8 @@ bool FindFloorView(int match, int* x, int* y, int z, sectortype** sect)
     {
         if (actor->spr.hitag == VIEW_THRU_FLOOR && actor->spr.lotag == match)
         {
-            xoff = *x - actor->spr.pos.X;
-            yoff = *y - actor->spr.pos.Y;
+            xoff = *x - actor->int_pos().X;
+            yoff = *y - actor->int_pos().Y;
             break;
         }
     }
@@ -746,8 +746,8 @@ bool FindFloorView(int match, int* x, int* y, int z, sectortype** sect)
             {
                 sectortype* upper,* lower;
 
-                *x = actor->spr.pos.X + xoff;
-                *y = actor->spr.pos.Y + yoff;
+                *x = actor->int_pos().X + xoff;
+                *y = actor->int_pos().Y + yoff;
 
                 // get new sector
                 GetUpperLowerSector(match, *x, *y, &upper, &lower);
@@ -867,9 +867,9 @@ void CollectPortals()
             SWSectIterator it(sec);
             while (auto actor = it.Next())
             {
-                int tx = actor->spr.pos.X;
-                int ty = actor->spr.pos.Y;
-                int tz = actor->spr.pos.Z;
+                int tx = actor->int_pos().X;
+                int ty = actor->int_pos().Y;
+                int tz = actor->int_pos().Z;
                 auto tsect = &sector[sec];
 
                 int match = FindViewSectorInScene(tsect, VIEW_LEVEL1);
@@ -881,7 +881,7 @@ void CollectPortals()
                         // got something!
                         fp.othersector = sectnum(tsect);
                         fp.offset = { tx, ty, tz };
-                        fp.offset -= actor->spr.pos;
+                        fp.offset -= actor->int_pos();
                         goto nextfg;
                     }
                 }
@@ -897,9 +897,9 @@ void CollectPortals()
             SWSectIterator it(sec);
             while (auto actor = it.Next())
             {
-                int tx = actor->spr.pos.X;
-                int ty = actor->spr.pos.Y;
-                int tz = actor->spr.pos.Z;
+                int tx = actor->int_pos().X;
+                int ty = actor->int_pos().Y;
+                int tz = actor->int_pos().Z;
                 auto tsect = &sector[sec];
 
                 int match = FindViewSectorInScene(tsect, VIEW_LEVEL2);
@@ -911,7 +911,7 @@ void CollectPortals()
                         // got something!
                         fp.othersector = sectnum(tsect);
                         fp.offset = { tx, ty, tz };
-                        fp.offset -= actor->spr.pos;
+                        fp.offset -= actor->int_pos();
                         goto nextcg;
                     }
                 }
diff --git a/source/games/sw/src/rotator.cpp b/source/games/sw/src/rotator.cpp
index 4727a8e56..516d40c79 100644
--- a/source/games/sw/src/rotator.cpp
+++ b/source/games/sw/src/rotator.cpp
@@ -326,7 +326,7 @@ int DoRotator(DSWActor* actor)
     {
         if (itActor->spr.lotag == actor->spr.lotag)
         {
-            dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+            dist = Distance(actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y);
             if (dist < closest)
             {
                 closest = dist;
@@ -343,7 +343,7 @@ int DoRotator(DSWActor* actor)
     for(auto& wal : wallsofsector(actor->sector()))
     {
         vec2_t const orig = { r->origX[ndx], r->origY[ndx] };
-        rotatepoint(pivot->spr.pos.vec2, orig, r->pos, &nxy);
+        rotatepoint(pivot->int_pos().vec2, orig, r->pos, &nxy);
 
         dragpoint(&wal, nxy.X, nxy.Y);
         ndx++;
diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp
index 8f82d2fb7..07c2dd56a 100644
--- a/source/games/sw/src/sector.cpp
+++ b/source/games/sw/src/sector.cpp
@@ -124,7 +124,7 @@ void WallSetupDontMove(void)
             {
                 for(auto& wal : wall)
                 {
-                    if (wal.wall_int_pos().X < jActor->spr.pos.X && wal.wall_int_pos().X > iActor->spr.pos.X && wal.wall_int_pos().Y < jActor->spr.pos.Y && wal.wall_int_pos().Y > iActor->spr.pos.Y)
+                    if (wal.wall_int_pos().X < jActor->int_pos().X && wal.wall_int_pos().X > iActor->int_pos().X && wal.wall_int_pos().Y < jActor->int_pos().Y && wal.wall_int_pos().Y > iActor->int_pos().Y)
                     {
                         wal.extra |= WALLFX_DONT_MOVE;
                     }
@@ -841,7 +841,7 @@ void SectorExp(DSWActor* actor, sectortype* sectp, short orig_ang, int zh)
     
     // setup vars needed by SectorExp
     ChangeActorSect(actor, sectp);
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.hiz, &actor->user.loz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.hiz, &actor->user.loz);
 
     // spawn explosion
     auto exp = SpawnSectorExp(actor);
@@ -929,7 +929,7 @@ void DoSpawnSpotsForKill(short match)
             change_actor_stat(actor, STAT_NO_STATE);
             actor->user.ActorActionFunc = DoSpawnSpot;
             actor->user.WaitTics = SP_TAG5(actor) * 15;
-            SetActorZ(actor, actor->spr.pos);
+            SetActorZ(actor, actor->int_pos());
             // setting for Killed
             actor->user.LastDamage = 1;
         }
@@ -1133,7 +1133,7 @@ void WeaponExplodeSectorInRange(DSWActor* wActor)
     while (auto actor = it.Next())
     {
         // test to see if explosion is close to crack sprite
-        dist = FindDistance3D(wActor->spr.pos - actor->spr.pos);
+        dist = FindDistance3D(wActor->int_pos() - actor->int_pos());
 
         if (actor->spr.clipdist == 0)
             continue;
@@ -1143,7 +1143,7 @@ void WeaponExplodeSectorInRange(DSWActor* wActor)
         if ((unsigned int)dist > (wActor->user.Radius/2) + radius)
             continue;
 
-        if (!FAFcansee(wActor->spr.pos.X,wActor->spr.pos.Y,wActor->spr.pos.Z,wActor->sector(),actor->spr.pos.X,actor->spr.pos.Y,actor->spr.pos.Z,actor->sector()))
+        if (!FAFcansee(wActor->int_pos().X,wActor->int_pos().Y,wActor->int_pos().Z,wActor->sector(),actor->int_pos().X,actor->int_pos().Y,actor->int_pos().Z,actor->sector()))
             continue;
 
 
@@ -1200,8 +1200,8 @@ void DoDeleteSpriteMatch(short match)
             if (actor->spr.lotag == match)
             {
                 found = actor;
-                del_x = actor->spr.pos.X;
-                del_y = actor->spr.pos.Y;
+                del_x = actor->int_pos().X;
+                del_y = actor->int_pos().Y;
                 break;
             }
         }
@@ -1214,7 +1214,7 @@ void DoDeleteSpriteMatch(short match)
             it.Reset(StatList[stat]);
             while (auto actor = it.Next())
             {
-                if (del_x == actor->spr.pos.X && del_y == actor->spr.pos.Y)
+                if (del_x == actor->int_pos().X && del_y == actor->int_pos().Y)
                 {
                     // special case lighting delete of Fade On/off after fades
                     if (StatList[stat] == STAT_LIGHTING)
@@ -1380,7 +1380,7 @@ int OperateSprite(DSWActor* actor, short player_is_operating)
     {
         pp = GlobPlayerP;
 
-        if (!FAFcansee(pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - (ActorSizeZ(actor) >> 1), actor->sector()))
+        if (!FAFcansee(pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - (ActorSizeZ(actor) >> 1), actor->sector()))
             return false;
     }
 
@@ -1837,7 +1837,7 @@ void OperateTripTrigger(PLAYER* pp)
         {
             if (actor->user.Flags & (SPR_WAIT_FOR_TRIGGER))
             {
-                if (Distance(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y) < dist)
+                if (Distance(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y) < dist)
                 {
                     actor->user.targetActor = pp->actor;
                     actor->user.Flags &= ~(SPR_WAIT_FOR_TRIGGER);
@@ -2128,7 +2128,7 @@ int DoPlayerGrabStar(PLAYER* pp)
         auto actor = StarQueue[i];
         if (actor != nullptr)
         {
-            if (FindDistance3D(actor->spr.pos.X - pp->pos.X, actor->spr.pos.Y - pp->pos.Y, actor->spr.pos.Z - pp->pos.Z + Z(12)) < 500)
+            if (FindDistance3D(actor->int_pos().X - pp->pos.X, actor->int_pos().Y - pp->pos.Y, actor->int_pos().Z - pp->pos.Z + Z(12)) < 500)
             {
                 break;
             }
@@ -2205,8 +2205,8 @@ void PlayerOperateEnv(PLAYER* pp)
                 int z[3];
                 DSWActor* plActor = pp->actor;
 
-                z[0] = plActor->spr.pos.Z - ActorSizeZ(plActor) - Z(10);
-                z[1] = plActor->spr.pos.Z;
+                z[0] = plActor->int_pos().Z - ActorSizeZ(plActor) - Z(10);
+                z[1] = plActor->int_pos().Z;
                 z[2] = (z[0] + z[1]) >> 1;
 
                 for (unsigned i = 0; i < SIZ(z); i++)
diff --git a/source/games/sw/src/serp.cpp b/source/games/sw/src/serp.cpp
index a5c74d259..217c1b992 100644
--- a/source/games/sw/src/serp.cpp
+++ b/source/games/sw/src/serp.cpp
@@ -730,7 +730,7 @@ int SetupSerp(DSWActor* actor)
     actor->spr.clipdist = (512) >> 2;
     actor->user.Flags |= (SPR_XFLIP_TOGGLE|SPR_ELECTRO_TOLERANT);
 
-    actor->user.loz = actor->spr.pos.Z;
+    actor->user.loz = actor->int_pos().Z;
 
     // amount to move up for clipmove
     actor->user.zclip = Z(80);
diff --git a/source/games/sw/src/skull.cpp b/source/games/sw/src/skull.cpp
index db807b7c2..16e0900b1 100644
--- a/source/games/sw/src/skull.cpp
+++ b/source/games/sw/src/skull.cpp
@@ -236,14 +236,14 @@ int SetupSkull(DSWActor* actor)
     {
         actor->set_int_z(actor->user.loz + Z(tileTopOffset(actor->spr.picnum)));
 
-        actor->user.loz = actor->spr.pos.Z;
+        actor->user.loz = actor->int_pos().Z;
         // leave 8 pixels above the ground
         actor->add_int_z(ActorSizeToTop(actor) - Z(3));
     }
     else
     {
         actor->user.Counter = RANDOM_P2(2048);
-        actor->user.pos.Z = actor->spr.pos.Z;
+        actor->user.pos.Z = actor->int_pos().Z;
     }
 
 
@@ -363,7 +363,7 @@ int DoSkullJump(DSWActor* actor)
 
             int dist,a,b,c;
 
-            DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
 
             if (dist < 1000 &&
                 SpriteOverlapZ(actor, actor->user.targetActor, Z(32)))
@@ -373,7 +373,7 @@ int DoSkullJump(DSWActor* actor)
                 return 0;
             }
 
-            if ((actor->spr.pos.Z > actor->user.loz - Z(36)))
+            if ((actor->int_pos().Z > actor->user.loz - Z(36)))
             {
                 actor->set_int_z(actor->user.loz - Z(36));
                 UpdateSinglePlayKills(actor);
@@ -425,7 +425,7 @@ int DoSkullWait(DSWActor* actor)
 {
     int a,b,c,dist;
 
-    DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+    DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
 
     DoActorPickClosePlayer(actor);
 
@@ -439,7 +439,7 @@ int DoSkullWait(DSWActor* actor)
     }
 
     // below the floor type
-    if (actor->spr.pos.Z > actor->user.loz)
+    if (actor->int_pos().Z > actor->user.loz)
     {
         // look for closest player every once in a while
         if (dist < 3500)
@@ -459,7 +459,7 @@ int DoSkullWait(DSWActor* actor)
 
         if (dist < 8000)
         {
-            actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+            actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
             actor->spr.xvel = 128 + (RANDOM_P2(256<<8)>>8);
             actor->user.jump_speed = -700;
             NewStateGroup(actor, sg_SkullJump);
@@ -621,14 +621,14 @@ int SetupBetty(DSWActor* actor)
     {
         actor->set_int_z(actor->user.loz + Z(tileTopOffset(actor->spr.picnum)));
 
-        actor->user.loz = actor->spr.pos.Z;
+        actor->user.loz = actor->int_pos().Z;
         // leave 8 pixels above the ground
         actor->add_int_z(ActorSizeToTop(actor) - Z(3));
     }
     else
     {
         actor->user.Counter = RANDOM_P2(2048);
-        actor->user.pos.Z = actor->spr.pos.Z;
+        actor->user.pos.Z = actor->int_pos().Z;
     }
 
 
@@ -741,7 +741,7 @@ int DoBettyJump(DSWActor* actor)
         {
             int dist,a,b,c;
 
-            DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
 
             if (dist < 1000 &&
                 SpriteOverlapZ(actor, actor->user.targetActor, Z(32)))
@@ -751,7 +751,7 @@ int DoBettyJump(DSWActor* actor)
                 return 0;
             }
 
-            if ((actor->spr.pos.Z > actor->user.loz - Z(36)))
+            if ((actor->int_pos().Z > actor->user.loz - Z(36)))
             {
                 actor->set_int_z(actor->user.loz - Z(36));
                 UpdateSinglePlayKills(actor);
@@ -800,7 +800,7 @@ int DoBettyWait(DSWActor* actor)
 {
     int a,b,c,dist;
 
-    DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+    DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
 
     DoActorPickClosePlayer(actor);
 
@@ -811,7 +811,7 @@ int DoBettyWait(DSWActor* actor)
     }
 
     // below the floor type
-    if (actor->spr.pos.Z > actor->user.loz)
+    if (actor->int_pos().Z > actor->user.loz)
     {
         // look for closest player every once in a while
         if (dist < 3500)
@@ -831,7 +831,7 @@ int DoBettyWait(DSWActor* actor)
 
         if (dist < 8000)
         {
-            actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+            actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
             actor->spr.xvel = 128 + (RANDOM_P2(256<<8)>>8);
             actor->user.jump_speed = -700;
             NewStateGroup(actor, sg_BettyJump);
diff --git a/source/games/sw/src/sounds.cpp b/source/games/sw/src/sounds.cpp
index 0e506e147..23fe01a2d 100644
--- a/source/games/sw/src/sounds.cpp
+++ b/source/games/sw/src/sounds.cpp
@@ -375,12 +375,12 @@ static void UpdateAmbients()
     for (auto& amb : ambients)
     {
         auto spot = amb->spot;
-        auto sdist = SoundDist(spot->spr.pos.X, spot->spr.pos.Y, spot->spr.pos.Z, voc[amb->vocIndex].voc_distance);
+        auto sdist = SoundDist(spot->int_pos().X, spot->int_pos().Y, spot->int_pos().Z, voc[amb->vocIndex].voc_distance);
 
         if (sdist < 255 && amb->vocIndex == DIGI_WHIPME)
         {
             PLAYER* pp = Player + screenpeek;
-            if (!FAFcansee(spot->spr.pos.X, spot->spr.pos.Y, spot->spr.pos.Z, spot->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector))
+            if (!FAFcansee(spot->int_pos().X, spot->int_pos().Y, spot->int_pos().Z, spot->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector))
             {
                 sdist = 255;
             }
@@ -644,7 +644,7 @@ int _PlaySound(int num, DSWActor* actor, PLAYER* pp, vec3_t* ppos, int flags, in
     {
         if (actor && !ppos)
         {
-            pos = actor->spr.pos;
+            pos = actor->int_pos();
             actor = nullptr;
         }
         else if (pp && !ppos)
diff --git a/source/games/sw/src/spike.cpp b/source/games/sw/src/spike.cpp
index 53f7cf8d1..256d3af3d 100644
--- a/source/games/sw/src/spike.cpp
+++ b/source/games/sw/src/spike.cpp
@@ -51,15 +51,15 @@ void ReverseSpike(DSWActor* actor)
     // moving toward to OFF pos
     if (actor->user.z_tgt == actor->user.oz)
     {
-        if (actor->spr.pos.Z == actor->user.oz)
+        if (actor->int_pos().Z == actor->user.oz)
             actor->user.z_tgt = actor->user.pos.Z;
         else if (actor->user.pos.Z == actor->user.oz)
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
     }
     else if (actor->user.z_tgt == actor->user.pos.Z)
     {
-        if (actor->spr.pos.Z == actor->user.oz)
-            actor->user.z_tgt = actor->spr.pos.Z;
+        if (actor->int_pos().Z == actor->user.oz)
+            actor->user.z_tgt = actor->int_pos().Z;
         else if (actor->user.pos.Z == actor->user.oz)
             actor->user.z_tgt = actor->user.pos.Z;
     }
@@ -102,7 +102,7 @@ void SetSpikeActive(DSWActor* actor)
     actor->user.Tics = 0;
 
     // moving to the ON position
-    if (actor->user.z_tgt == actor->spr.pos.Z)
+    if (actor->user.z_tgt == actor->int_pos().Z)
         VatorSwitch(SP_TAG2(actor), true);
     else
     // moving to the OFF position
@@ -232,16 +232,16 @@ void SpikeAlign(DSWActor* actor)
     if ((int8_t)SP_TAG7(actor) < 0)
     {
         if (actor->spr.cstat & (CSTAT_SPRITE_YFLIP))
-            alignceilslope(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->user.zclip);
+            alignceilslope(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->user.zclip);
         else
-            alignflorslope(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->user.zclip);
+            alignflorslope(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->user.zclip);
     }
     else
     {
         if (actor->spr.cstat & (CSTAT_SPRITE_YFLIP))
-            SOBJ_AlignCeilingToPoint(&SectorObject[SP_TAG7(actor)], actor->spr.pos.X, actor->spr.pos.Y, actor->user.zclip);
+            SOBJ_AlignCeilingToPoint(&SectorObject[SP_TAG7(actor)], actor->int_pos().X, actor->int_pos().Y, actor->user.zclip);
         else
-            SOBJ_AlignFloorToPoint(&SectorObject[SP_TAG7(actor)], actor->spr.pos.X, actor->spr.pos.Y, actor->user.zclip);
+            SOBJ_AlignFloorToPoint(&SectorObject[SP_TAG7(actor)], actor->int_pos().X, actor->int_pos().Y, actor->user.zclip);
     }
 }
 
@@ -258,7 +258,7 @@ void MoveSpritesWithSpike(sectortype* sect)
         if ((actor->spr.extra & SPRX_STAY_PUT_VATOR))
             continue;
 
-        getzsofslopeptr(sect, actor->spr.pos.X, actor->spr.pos.Y, &cz, &fz);
+        getzsofslopeptr(sect, actor->int_pos().X, actor->int_pos().Y, &cz, &fz);
         actor->set_int_z(fz);
     }
 }
@@ -282,7 +282,7 @@ int DoSpike(DSWActor* actor)
     if (*lptr == actor->user.z_tgt)
     {
         // in the ON position
-        if (actor->user.z_tgt == actor->spr.pos.Z)
+        if (actor->user.z_tgt == actor->int_pos().Z)
         {
             // change target
             actor->user.z_tgt = actor->user.pos.Z;
@@ -302,7 +302,7 @@ int DoSpike(DSWActor* actor)
             // change target
             actor->user.jump_speed = actor->user.vel_tgt;
             actor->user.vel_rate = (short)abs(actor->user.vel_rate);
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
 
             SetSpikeInactive(actor);
 
@@ -387,7 +387,7 @@ int DoSpikeAuto(DSWActor* actor)
     if (*lptr == actor->user.z_tgt)
     {
         // in the UP position
-        if (actor->user.z_tgt == actor->spr.pos.Z)
+        if (actor->user.z_tgt == actor->int_pos().Z)
         {
             // change target
             actor->user.z_tgt = actor->user.pos.Z;
@@ -404,7 +404,7 @@ int DoSpikeAuto(DSWActor* actor)
             // change target
             actor->user.jump_speed = actor->user.vel_tgt;
             actor->user.vel_rate = (short)abs(actor->user.vel_rate);
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
             actor->user.Tics = actor->user.WaitTics;
 
             if (SP_TAG6(actor) && TEST_BOOL5(actor))
diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp
index f9e8d8e9f..9cb5bebde 100644
--- a/source/games/sw/src/sprite.cpp
+++ b/source/games/sw/src/sprite.cpp
@@ -958,7 +958,7 @@ bool ActorTestSpawn(DSWActor* actor)
             default: c = "?"; break;
             }
             Printf("WARNING: skill-masked %s at %d,%d,%d not being killed because it "
-                        "activates something\n", c, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z);
+                        "activates something\n", c, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z);
             return true;
         }
         //always spawn girls in addons
@@ -1439,8 +1439,8 @@ void PreMapCombineFloors(void)
             continue;
         }
 
-        dx = BoundList[base_offset].offset->spr.pos.X - BoundList[i].offset->spr.pos.X;
-        dy = BoundList[base_offset].offset->spr.pos.Y - BoundList[i].offset->spr.pos.Y;
+        dx = BoundList[base_offset].offset->int_pos().X - BoundList[i].offset->int_pos().X;
+        dy = BoundList[base_offset].offset->int_pos().Y - BoundList[i].offset->int_pos().Y;
 
         BFSSectorSearch search(BoundList[i].offset->sector());
         while (auto dasect = search.GetNext())
@@ -1511,8 +1511,8 @@ void SpriteSetupPost(void)
             if (jActor->hasU())
                 continue;
 
-            getzsofslopeptr(jActor->sector(), jActor->spr.pos.X, jActor->spr.pos.Y, &cz, &fz);
-            if (labs(jActor->spr.pos.Z - fz) > Z(4))
+            getzsofslopeptr(jActor->sector(), jActor->int_pos().X, jActor->int_pos().Y, &cz, &fz);
+            if (labs(jActor->int_pos().Z - fz) > Z(4))
                 continue;
 
             SpawnUser(jActor, 0, nullptr);
@@ -1560,8 +1560,8 @@ void SpriteSetup(void)
     while (auto actor = it.Next())
     {
         // not used yetv
-        getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &cz, &fz);
-        if (actor->spr.pos.Z > ((cz + fz) >> 1))
+        getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &cz, &fz);
+        if (actor->int_pos().Z > ((cz + fz) >> 1))
         {
             // closer to a floor
             actor->spr.cstat |= (CSTAT_SPRITE_CLOSE_FLOOR);
@@ -1856,7 +1856,7 @@ void SpriteSetup(void)
 
                 case SECT_WALL_PAN_SPEED:
                 {
-                    vec3_t hit_pos = { actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(8) };
+                    vec3_t hit_pos = { actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(8) };
                     HitInfo hit{};
 
                     hitscan(hit_pos, actor->sector(),    // Start position
@@ -1885,7 +1885,7 @@ void SpriteSetup(void)
 
                 case WALL_DONT_STICK:
                 {
-                    vec3_t hit_pos = { actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(8) };
+                    vec3_t hit_pos = { actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(8) };
                     HitInfo hit{};
 
                     hitscan(hit_pos, actor->sector(),    // Start position
@@ -2045,11 +2045,11 @@ void SpriteSetup(void)
                     {
                         // start off
                         actor->user.pos.Z = sectp->floorz;
-                        actor->user.z_tgt = actor->spr.pos.Z;
+                        actor->user.z_tgt = actor->int_pos().Z;
                         if (start_on)
                         {
                             int amt;
-                            amt = actor->spr.pos.Z - sectp->floorz;
+                            amt = actor->int_pos().Z - sectp->floorz;
 
                             // start in the on position
                             sectp->addfloorz(amt);
@@ -2065,11 +2065,11 @@ void SpriteSetup(void)
                     {
                         // start off
                         actor->user.pos.Z = sectp->ceilingz;
-                        actor->user.z_tgt = actor->spr.pos.Z;
+                        actor->user.z_tgt = actor->int_pos().Z;
                         if (start_on)
                         {
                             int amt;
-                            amt = actor->spr.pos.Z - sectp->ceilingz;
+                            amt = actor->int_pos().Z - sectp->ceilingz;
 
                             // starting in the on position
                             sectp->addceilingz(amt);
@@ -2243,7 +2243,7 @@ void SpriteSetup(void)
                         break;
                     }
 
-                    getzrangepoint(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), &ceilingz, &trash, &floorz, &trash);
+                    getzrangepoint(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), &ceilingz, &trash, &floorz, &trash);
 
                     if (floor_vator)
                     {
@@ -2251,11 +2251,11 @@ void SpriteSetup(void)
 
                         // start off
                         actor->user.pos.Z = actor->user.zclip;
-                        actor->user.z_tgt = actor->spr.pos.Z;
+                        actor->user.z_tgt = actor->int_pos().Z;
                         if (start_on)
                         {
                             // start in the on position
-                            actor->user.zclip = actor->spr.pos.Z;
+                            actor->user.zclip = actor->int_pos().Z;
                             actor->user.z_tgt = actor->user.pos.Z;
                             SpikeAlign(actor);
                         }
@@ -2269,11 +2269,11 @@ void SpriteSetup(void)
 
                         // start off
                         actor->user.pos.Z = actor->user.zclip;
-                        actor->user.z_tgt = actor->spr.pos.Z;
+                        actor->user.z_tgt = actor->int_pos().Z;
                         if (start_on)
                         {
                             // starting in the on position
-                            actor->user.zclip = actor->spr.pos.Z;
+                            actor->user.zclip = actor->int_pos().Z;
                             actor->user.z_tgt = actor->user.pos.Z;
                             SpikeAlign(actor);
                         }
@@ -2486,7 +2486,7 @@ void SpriteSetup(void)
 
                     actorNew->spr.cstat = 0;
                     actorNew->spr.extra = 0;
-                    actorNew->set_int_pos(actor->spr.pos);
+                    actorNew->set_int_pos(actor->int_pos());
                     actorNew->spr.ang = NORM_ANGLE(actor->spr.ang + 1024);
                     actorNew->spr.picnum = actor->spr.picnum;
 
@@ -2576,7 +2576,7 @@ void SpriteSetup(void)
                     {
                         if (itActor->spr.hitag == actor->spr.hitag && itActor->spr.lotag == actor->spr.lotag)
                         {
-                            I_Error("Two VIEW_THRU_ tags with same match found on level\n1: x %d, y %d \n2: x %d, y %d", actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+                            I_Error("Two VIEW_THRU_ tags with same match found on level\n1: x %d, y %d \n2: x %d, y %d", actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y);
                         }
                     }
                     change_actor_stat(actor, STAT_FAF);
@@ -3514,7 +3514,7 @@ int ActorCoughItem(DSWActor* actor)
         actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
         actorNew->spr.cstat = 0;
         actorNew->spr.extra = 0;
-        actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor) });
+        actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor) });
         actorNew->spr.ang = 0;
         actorNew->spr.extra = 0;
 
@@ -3553,7 +3553,7 @@ int ActorCoughItem(DSWActor* actor)
         actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
         actorNew->spr.cstat = 0;
         actorNew->spr.extra = 0;
-        actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor) });
+        actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor) });
         actorNew->spr.ang = 0;
         actorNew->spr.extra = 0;
 
@@ -3579,7 +3579,7 @@ int ActorCoughItem(DSWActor* actor)
         actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
         actorNew->spr.cstat = 0;
         actorNew->spr.extra = 0;
-        actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor) });
+        actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor) });
         actorNew->spr.ang = 0;
         actorNew->spr.extra = 0;
 
@@ -3608,7 +3608,7 @@ int ActorCoughItem(DSWActor* actor)
             actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
             actorNew->spr.cstat = 0;
             actorNew->spr.extra = 0;
-            actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor) });
+            actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor) });
             actorNew->spr.ang = 0;
             actorNew->spr.extra = 0;
 
@@ -3668,7 +3668,7 @@ int ActorCoughItem(DSWActor* actor)
         actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
         actorNew->spr.cstat = 0;
         actorNew->spr.extra = 0;
-        actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor) });
+        actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor) });
         actorNew->spr.ang = 0;
         actorNew->spr.extra = 0;
 
@@ -3724,7 +3724,7 @@ int ActorCoughItem(DSWActor* actor)
         actorNew = insertActor(actor->sector(), STAT_SPAWN_ITEMS);
         actorNew->spr.cstat = 0;
         actorNew->spr.extra = 0;
-        actorNew->set_int_pos({ actor->spr.pos.X, actor->spr.pos.Y, ActorLowerZ(actor) + Z(10) });
+        actorNew->set_int_pos({ actor->int_pos().X, actor->int_pos().Y, ActorLowerZ(actor) + Z(10) });
         actorNew->spr.ang = actor->spr.ang;
 
         // vel
@@ -3804,7 +3804,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_REPAIR_KIT))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_REPAIR_KIT, s_RepairKit, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_REPAIR_KIT, s_RepairKit, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3815,7 +3815,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_STAR))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_STAR, s_IconStar, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_STAR, s_IconStar, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3826,7 +3826,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_LG_MINE))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_MINE, s_IconLgMine, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_MINE, s_IconLgMine, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3837,7 +3837,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_MICRO_GUN))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_MICRO_GUN, s_IconMicroGun, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_MICRO_GUN, s_IconMicroGun, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3848,7 +3848,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_MICRO_BATTERY))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_MICRO_BATTERY, s_IconMicroBattery, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_MICRO_BATTERY, s_IconMicroBattery, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3859,7 +3859,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_GRENADE_LAUNCHER))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_GRENADE_LAUNCHER, s_IconGrenadeLauncher, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_GRENADE_LAUNCHER, s_IconGrenadeLauncher, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3870,7 +3870,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_LG_GRENADE))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_GRENADE, s_IconLgGrenade, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_GRENADE, s_IconLgGrenade, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3881,7 +3881,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_RAIL_GUN))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_RAIL_GUN, s_IconRailGun, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_RAIL_GUN, s_IconRailGun, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3892,7 +3892,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_RAIL_AMMO))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_RAIL_AMMO, s_IconRailAmmo, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_RAIL_AMMO, s_IconRailAmmo, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3903,7 +3903,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_ROCKET))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_ROCKET, s_IconRocket, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_ROCKET, s_IconRocket, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3914,7 +3914,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_SHOTGUN))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_SHOTGUN, s_IconShotgun, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_SHOTGUN, s_IconShotgun, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3925,7 +3925,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_LG_SHOTSHELL))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_SHOTSHELL, s_IconLgShotshell, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_SHOTSHELL, s_IconLgShotshell, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3936,7 +3936,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_GUARD_HEAD))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_GUARD_HEAD, s_IconGuardHead, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_GUARD_HEAD, s_IconGuardHead, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3947,7 +3947,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_FIREBALL_LG_AMMO))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_FIREBALL_LG_AMMO, s_IconFireballLgAmmo, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_FIREBALL_LG_AMMO, s_IconFireballLgAmmo, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3958,7 +3958,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_HEART))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART, s_IconHeart, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART, s_IconHeart, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3969,7 +3969,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_HEART_LG_AMMO))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART_LG_AMMO, s_IconHeartLgAmmo, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART_LG_AMMO, s_IconHeartLgAmmo, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3981,7 +3981,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_ARMOR))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_ARMOR, s_IconArmor, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_ARMOR, s_IconArmor, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -3998,7 +3998,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_MEDKIT))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_MEDKIT, s_IconMedkit, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_MEDKIT, s_IconMedkit, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4009,7 +4009,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_SM_MEDKIT))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_SM_MEDKIT, s_IconSmMedkit, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_SM_MEDKIT, s_IconSmMedkit, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4020,7 +4020,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_CHEMBOMB))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_CHEMBOMB, s_IconChemBomb, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_CHEMBOMB, s_IconChemBomb, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4031,7 +4031,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_FLASHBOMB))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_FLASHBOMB, s_IconFlashBomb, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_FLASHBOMB, s_IconFlashBomb, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4042,7 +4042,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_NUKE))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_NUKE, s_IconNuke, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_NUKE, s_IconNuke, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4053,7 +4053,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_CALTROPS))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_CALTROPS, s_IconCaltrops, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_CALTROPS, s_IconCaltrops, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4064,7 +4064,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_BOOSTER))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_BOOSTER, s_IconBooster, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_BOOSTER, s_IconBooster, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4075,7 +4075,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_HEAT_CARD))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEAT_CARD, s_IconHeatCard, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEAT_CARD, s_IconHeatCard, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4086,7 +4086,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_CLOAK))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_CLOAK, s_IconCloak, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_CLOAK, s_IconCloak, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4097,7 +4097,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_NIGHT_VISION))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_NIGHT_VISION, s_IconNightVision, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_NIGHT_VISION, s_IconNightVision, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4109,7 +4109,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_LG_UZI_AMMO))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_UZI_AMMO, s_IconLgUziAmmo, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_LG_UZI_AMMO, s_IconLgUziAmmo, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4120,7 +4120,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_GUARD_HEAD))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_GUARD_HEAD, s_IconGuardHead, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_GUARD_HEAD, s_IconGuardHead, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4131,7 +4131,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_HEART))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART, s_IconHeart, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_HEART, s_IconHeart, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4143,7 +4143,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_UZIFLOOR))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_UZIFLOOR, s_IconUziFloor, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_UZIFLOOR, s_IconUziFloor, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4157,7 +4157,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, ICON_UZI))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, ICON_UZI, s_IconUzi, itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, ICON_UZI, s_IconUzi, itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
             spawnedActor->user.Flags2 |= SPR2_NEVER_RESPAWN;
             IconDefault(spawnedActor);
 
@@ -4203,7 +4203,7 @@ int SpawnItemsMatch(short match)
             if (!ItemSpotClear(itActor, STAT_ITEM, s_Key[num]->Pic))
                 break;
 
-            spawnedActor = SpawnActor(STAT_ITEM, s_Key[num]->Pic, s_Key[num], itActor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, itActor->spr.pos.Z, itActor->spr.ang, 0);
+            spawnedActor = SpawnActor(STAT_ITEM, s_Key[num]->Pic, s_Key[num], itActor->sector(), itActor->int_pos().X, itActor->int_pos().Y, itActor->int_pos().Z, itActor->spr.ang, 0);
 
             spawnedActor->spr.picnum = spawnedActor->user.ID = s_Key[num]->Pic;
 
@@ -4258,7 +4258,7 @@ bool SpriteOverlap(DSWActor* actor_a, DSWActor* actor_b)
     int spa_tos, spa_bos, spb_tos, spb_bos, overlap_z;
 
     if (!actor_a->hasU() || !actor_b->hasU()) return false;
-    if ((unsigned)Distance(actor_a->spr.pos.X, actor_a->spr.pos.Y, actor_b->spr.pos.X, actor_b->spr.pos.Y) > actor_a->user.Radius + actor_b->user.Radius)
+    if ((unsigned)Distance(actor_a->int_pos().X, actor_a->int_pos().Y, actor_b->int_pos().X, actor_b->int_pos().Y) > actor_a->user.Radius + actor_b->user.Radius)
     {
         return false;
     }
@@ -4345,7 +4345,7 @@ void getzrangepoint(int x, int y, int z, sectortype* sect,
         if ((cstat & (CSTAT_SPRITE_ALIGNMENT_MASK | CSTAT_SPRITE_BLOCK)) != (CSTAT_SPRITE_ALIGNMENT_FLOOR|CSTAT_SPRITE_BLOCK))
             continue;                   // Only check blocking floor sprites
 
-        daz = itActor->spr.pos.Z;
+        daz = itActor->int_pos().Z;
 
         // Only check if sprite's 2-sided or your on the 1-sided side
         if (((cstat & CSTAT_SPRITE_ONE_SIDE) != 0) && ((z > daz) == ((cstat & CSTAT_SPRITE_YFLIP) == 0)))
@@ -4369,8 +4369,8 @@ void getzrangepoint(int x, int y, int z, sectortype* sect,
         dax = ((xspan >> 1) + xoff) * itActor->spr.xrepeat;
         yspan = tileHeight(tilenum);
         day = ((yspan >> 1) + yoff) * itActor->spr.yrepeat;
-        x1 = itActor->spr.pos.X + DMulScale(sinang, dax, cosang, day, 16) - x;
-        y1 = itActor->spr.pos.Y + DMulScale(sinang, day, -cosang, dax, 16) - y;
+        x1 = itActor->int_pos().X + DMulScale(sinang, dax, cosang, day, 16) - x;
+        y1 = itActor->int_pos().Y + DMulScale(sinang, day, -cosang, dax, 16) - y;
         l = xspan * itActor->spr.xrepeat;
         x2 = x1 - MulScale(sinang, l, 16);
         y2 = y1 + MulScale(cosang, l, 16);
@@ -4444,7 +4444,7 @@ void DoActorZrange(DSWActor* actor)
 
     auto save_cstat = actor->spr.cstat & CSTAT_SPRITE_BLOCK;
     actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
-    vec3_t pos = actor->spr.pos;
+    vec3_t pos = actor->int_pos();
     pos.Z -= (ActorSizeZ(actor) >> 1);
     FAFgetzrange(pos, actor->sector(), &actor->user.hiz, &ceilhit, &actor->user.loz, &florhit, (((int) actor->spr.clipdist) << 2) - GETZRANGE_CLIP_ADJ, CLIPMASK_ACTOR);
     actor->spr.cstat |= save_cstat;
@@ -4573,14 +4573,14 @@ bool DropAhead(DSWActor* actor, int  min_height)
     // dax = actor->spr.x + MOVEx(128, actor->spr.ang);
     // day = actor->spr.y + MOVEy(128, actor->spr.ang);
 
-    dax = actor->spr.pos.X + MOVEx(256, actor->spr.ang);
-    day = actor->spr.pos.Y + MOVEy(256, actor->spr.ang);
+    dax = actor->int_pos().X + MOVEx(256, actor->spr.ang);
+    day = actor->int_pos().Y + MOVEy(256, actor->spr.ang);
 
     auto newsector = actor->sector();
     updatesector(dax, day, &newsector);
 
     // look straight down for a drop
-    if (ActorDrop(actor, dax, day, actor->spr.pos.Z, newsector, min_height))
+    if (ActorDrop(actor, dax, day, actor->int_pos().Z, newsector, min_height))
         return true;
 
     return false;
@@ -4614,9 +4614,9 @@ int move_actor(DSWActor* actor, int xchange, int ychange, int zchange)
     }
 
     // save off x,y values
-    x = actor->spr.pos.X;
-    y = actor->spr.pos.Y;
-    z = actor->spr.pos.Z;
+    x = actor->int_pos().X;
+    y = actor->int_pos().Y;
+    z = actor->int_pos().Z;
     loz = actor->user.loz;
     hiz = actor->user.hiz;
     lowActor = actor->user.lowActor;
@@ -4633,7 +4633,7 @@ int move_actor(DSWActor* actor, int xchange, int ychange, int zchange)
     // try and determine whether you moved > lo_step in the z direction
     if (!(actor->user.Flags & (SPR_NO_SCAREDZ | SPR_JUMPING | SPR_CLIMBING | SPR_FALLING | SPR_DEAD | SPR_SWIMMING)))
     {
-        if (labs(actor->spr.pos.Z - globloz) > actor->user.lo_step)
+        if (labs(actor->int_pos().Z - globloz) > actor->user.lo_step)
         {
             // cancel move
             actor->set_int_pos({ x, y, z });
@@ -4649,7 +4649,7 @@ int move_actor(DSWActor* actor, int xchange, int ychange, int zchange)
             return false;
         }
 
-        if (ActorDrop(actor, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), actor->user.lo_step))
+        if (ActorDrop(actor, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), actor->user.lo_step))
         {
             // cancel move
             actor->set_int_pos({ x, y, z });
@@ -4671,7 +4671,7 @@ int move_actor(DSWActor* actor, int xchange, int ychange, int zchange)
     if (actor->user.coll.type == kHitNone)
     {
         // Keep track of how far sprite has moved
-        dist = Distance(x, y, actor->spr.pos.X, actor->spr.pos.Y);
+        dist = Distance(x, y, actor->int_pos().X, actor->int_pos().Y);
         actor->user.TargetDist -= dist;
         actor->user.Dist += dist;
         actor->user.DistCheck += dist;
@@ -4723,7 +4723,7 @@ int DoGrating(DSWActor* actor)
         actor->clearUser();
     }
 
-    SetActorZ(actor, actor->spr.pos);
+    SetActorZ(actor, actor->int_pos());
 
     return 0;
 }
@@ -4797,7 +4797,7 @@ int KillGet(DSWActor* actor)
             break;
 
         auto actorNew = SpawnActor(STAT_ITEM, Red_COIN, s_RedCoin, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 0, 0);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 0, 0);
 
         actorNew->spr.shade = -20;
         actorNew->user.WaitTics = actor->user.WaitTics - 12;
@@ -4840,7 +4840,7 @@ int KillGetAmmo(DSWActor* actor)
             break;
 
         auto actorNew = SpawnActor(STAT_ITEM, Red_COIN, s_RedCoin, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 0, 0);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 0, 0);
 
         actorNew->spr.shade = -20;
         actorNew->user.WaitTics = actor->user.WaitTics - 12;
@@ -4891,7 +4891,7 @@ int KillGetWeapon(DSWActor* actor)
             break;
 
         auto actorNew = SpawnActor(STAT_ITEM, Red_COIN, s_RedCoin, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 0, 0);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 0, 0);
 
         actorNew->spr.shade = -20;
         actorNew->user.WaitTics = actor->user.WaitTics - 12;
@@ -4906,7 +4906,7 @@ int DoSpawnItemTeleporterEffect(DSWActor* actor)
     extern STATE s_TeleportEffect[];
 
     auto effect = SpawnActor(STAT_MISSILE, 0, s_TeleportEffect, actor->sector(),
-                         actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(12),
+                         actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(12),
                          actor->spr.ang, 0);
 
     effect->spr.shade = -40;
@@ -5021,7 +5021,7 @@ int DoGet(DSWActor* actor)
         if (pp->Flags & (PF_DEAD))
             continue;
 
-        DISTANCE(pp->pos.X, pp->pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a,b,c);
+        DISTANCE(pp->pos.X, pp->pos.Y, actor->int_pos().X, actor->int_pos().Y, dist, a,b,c);
         if ((unsigned)dist > (plActor->user.Radius + actor->user.Radius))
         {
             continue;
@@ -5034,7 +5034,7 @@ int DoGet(DSWActor* actor)
 
         auto cstat_bak = actor->spr.cstat;
         actor->spr.cstat |= (CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
-        can_see = FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(),
+        can_see = FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(),
                             pp->pos.X, pp->pos.Y, pp->pos.Z, pp->cursector);
         actor->spr.cstat = cstat_bak;
 
@@ -5824,10 +5824,10 @@ KeyMain:
             DSWActor* actorNew;
             if (actor->spr.hitag == TAG_NORESPAWN_FLAG)
                 actorNew = SpawnActor(STAT_ITEM, ICON_FLAG, s_CarryFlagNoDet, actor->sector(),
-                                  actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 0, 0);
+                                  actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 0, 0);
             else
                 actorNew = SpawnActor(STAT_ITEM, ICON_FLAG, s_CarryFlag, actor->sector(),
-                                  actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, 0, 0);
+                                  actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, 0, 0);
 
             actorNew->spr.shade = -20;
 
@@ -5901,7 +5901,7 @@ void AdjustActiveRange(PLAYER* pp, DSWActor* actor, int dist)
 
     // if actor can still see the player
     look_height = ActorZOfTop(actor);
-    if (FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, look_height, actor->sector(), plActor->spr.pos.X, plActor->spr.pos.Y, ActorUpperZ(plActor), plActor->sector()))
+    if (FAFcansee(actor->int_pos().X, actor->int_pos().Y, look_height, actor->sector(), plActor->int_pos().X, plActor->int_pos().Y, ActorUpperZ(plActor), plActor->sector()))
     {
         // Player is visible
         // adjust update range of this sprite
@@ -6056,7 +6056,7 @@ void SpriteControl(void)
                 pp = &Player[pnum];
 
                 // Only update the ones closest
-                DISTANCE(pp->pos.X, pp->pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+                DISTANCE(pp->pos.X, pp->pos.Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
 
                 AdjustActiveRange(pp, actor, dist);
 
@@ -6218,7 +6218,7 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
 
     ASSERT(actor->hasU());
 
-    vec3_t clippos = actor->spr.pos;
+    vec3_t clippos = actor->int_pos();
 
     // Can't modify sprite sectors
     // directly becuase of linked lists
@@ -6263,7 +6263,7 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
     // I subtracted 8 from the clipdist because actors kept going up on
     // ledges they were not supposed to go up on.  Did the same for the
     // player. Seems to work ok!
-    vec3_t pos = actor->spr.pos;
+    vec3_t pos = actor->int_pos();
     pos.Z -= zh + 1;
     FAFgetzrange(pos, actor->sector(),
                  &globhiz, &globhihit, &globloz, &globlohit,
@@ -6275,7 +6275,7 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
     // Takes info from global variables
     DoActorGlobZ(actor);
 
-    clippos.Z = actor->spr.pos.Z + ((zchange * numtics) >> 3);
+    clippos.Z = actor->int_pos().Z + ((zchange * numtics) >> 3);
 
     // test for hitting ceiling or floor
     if ((clippos.Z - zh <= globhiz) || (clippos.Z - zh > globloz))
@@ -6298,12 +6298,12 @@ 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->int_pos());
 
     if ((actor->sector()->extra & SECTFX_WARP_SECTOR))
     {
         DSWActor* sp_warp;
-        pos = actor->spr.pos;
+        pos = actor->int_pos();
         if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
         {
             actor->set_int_pos(pos);
@@ -6313,7 +6313,7 @@ Collision move_sprite(DSWActor* actor, int xchange, int ychange, int zchange, in
 
         if (actor->sector() != lastsect)
         {
-            pos = actor->spr.pos;
+            pos = actor->int_pos();
             if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
             {
                 actor->set_int_pos(pos);
@@ -6397,7 +6397,7 @@ int MissileZrange(DSWActor* actor)
     auto tempshort = actor->spr.cstat;
     actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
 
-    FAFgetzrangepoint(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - 1, actor->sector(),
+    FAFgetzrangepoint(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - 1, actor->sector(),
                       &globhiz, &globhihit, &globloz, &globlohit);
 
     actor->spr.cstat = tempshort;
@@ -6414,7 +6414,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
 
     ASSERT(actor->hasU());
 
-    vec3_t clippos = actor->spr.pos;
+    vec3_t clippos = actor->int_pos();
 
     // Can't modify sprite sectors
     // directly becuase of linked lists
@@ -6452,7 +6452,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
     auto tempshort = actor->spr.cstat;
     actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
 
-    FAFgetzrangepoint(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - 1, actor->sector(),
+    FAFgetzrangepoint(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - 1, actor->sector(),
                       &globhiz, &globhihit, &globloz, &globlohit);
 
     actor->spr.cstat = tempshort;
@@ -6463,7 +6463,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
     // missiles don't need the water to be down
     MissileWaterAdjust(actor);
 
-    clippos.Z = actor->spr.pos.Z + ((zchange * numtics) >> 3);
+    clippos.Z = actor->int_pos().Z + ((zchange * numtics) >> 3);
 
     // NOTE: this does not tell you when you hit a floor sprite
     // this case is currently treated like it hit a sector
@@ -6488,13 +6488,13 @@ 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->int_pos());
 
     if ((actor->sector()->extra & SECTFX_WARP_SECTOR))
     {
         DSWActor* sp_warp;
 
-        auto pos = actor->spr.pos;
+        auto pos = actor->int_pos();
         if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
         {
             actor->set_int_pos(pos);
@@ -6504,7 +6504,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
 
         if (actor->sector() != lastsect)
         {
-            pos = actor->spr.pos;
+            pos = actor->int_pos();
             if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
             {
                 actor->set_int_pos(pos);
@@ -6516,7 +6516,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
 
     if (retval.type != kHitNone && (actor->sector()->ceilingstat & CSTAT_SECTOR_SKY))
     {
-        if (actor->spr.pos.Z < actor->sector()->ceilingz)
+        if (actor->int_pos().Z < actor->sector()->ceilingz)
         {
             retval.setVoid();
         }
@@ -6524,7 +6524,7 @@ Collision move_missile(DSWActor* actor, int xchange, int ychange, int zchange, i
 
     if (retval.type != kHitNone && (actor->sector()->floorstat & CSTAT_SECTOR_SKY))
     {
-        if (actor->spr.pos.Z > actor->sector()->floorz)
+        if (actor->int_pos().Z > actor->sector()->floorz)
         {
             retval.setVoid();
         }
@@ -6547,15 +6547,15 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
     auto dasect = actor->sector();
     auto lastsect = dasect;
 
-    vec3_t opos = actor->spr.pos;
-    daz = actor->spr.pos.Z;
+    vec3_t opos = actor->int_pos();
+    daz = actor->int_pos().Z;
 
     // climbing a wall
     if (actor->user.z_tgt)
     {
-        if (labs(actor->user.z_tgt - actor->spr.pos.Z) > Z(40))
+        if (labs(actor->user.z_tgt - actor->int_pos().Z) > Z(40))
         {
-            if (actor->user.z_tgt > actor->spr.pos.Z)
+            if (actor->user.z_tgt > actor->int_pos().Z)
             {
                 actor->add_int_z(Z(30));
                 return retval;
@@ -6572,14 +6572,14 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
 
     actor->add_int_pos({ xchange / 2, ychange / 2, 0 });
 
-    updatesector(actor->spr.pos.X, actor->spr.pos.Y, &dasect);
+    updatesector(actor->int_pos().X, actor->int_pos().Y, &dasect);
 
     if (dasect == nullptr)
     {
         // back up and try again
         dasect = actor->sector();
         lastsect = dasect;
-        opos = actor->spr.pos;
+        opos = actor->int_pos();
         opos.Z = daz;
         clipmove(opos, &dasect,
                           ((xchange * numtics) << 11), ((ychange * numtics) << 11),
@@ -6605,13 +6605,13 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
     if ((dasect != actor->sector()) && (dasect != nullptr))
     {
         int new_loz,new_hiz;
-        getzsofslopeptr(dasect, actor->spr.pos.X, actor->spr.pos.Y, &new_hiz, &new_loz);
+        getzsofslopeptr(dasect, actor->int_pos().X, actor->int_pos().Y, &new_hiz, &new_loz);
 
         actor->set_int_z(new_loz);
         ChangeActorSect(actor, dasect);
     }
 
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.hiz, &actor->user.loz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.hiz, &actor->user.loz);
 
     actor->user.hi_sectp = actor->user.lo_sectp = actor->sector();
     actor->user.highActor = nullptr; actor->user.lowActor = nullptr;
@@ -6628,7 +6628,7 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
     {
         DSWActor* sp_warp;
 
-        auto pos = actor->spr.pos;
+        auto pos = actor->int_pos();
         if ((sp_warp = WarpPlane(&pos.X, &pos.Y, &pos.Z, &dasect)))
         {
             actor->set_int_pos(pos);
@@ -6638,7 +6638,7 @@ Collision move_ground_missile(DSWActor* actor, int xchange, int ychange, int cei
 
         if (actor->sector() != lastsect)
         {
-            pos = actor->spr.pos;
+            pos = actor->int_pos();
             if ((sp_warp = Warp(&pos.X, &pos.Y, &pos.Z, &dasect)))
             {
                 actor->set_int_pos(pos);
diff --git a/source/games/sw/src/sumo.cpp b/source/games/sw/src/sumo.cpp
index 36a8b7412..61074ab84 100644
--- a/source/games/sw/src/sumo.cpp
+++ b/source/games/sw/src/sumo.cpp
@@ -765,7 +765,7 @@ void BossHealthMeter(void)
         DSWActor* actor = BossSpriteNum[i];
         if (actor != nullptr && !bosswasseen[i])
         {
-            if (cansee(actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor), actor->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z - Z(40), pp->cursector))
+            if (cansee(actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor), actor->sector(), pp->pos.X, pp->pos.Y, pp->pos.Z - Z(40), pp->cursector))
             {
                 if (i == 0 && !bosswasseen[0])
                 {
diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp
index 9cbe920bd..23196aa1d 100644
--- a/source/games/sw/src/track.cpp
+++ b/source/games/sw/src/track.cpp
@@ -67,8 +67,8 @@ short TrackTowardPlayer(DSWActor* actor, TRACK* t, TRACK_POINT* start_point)
         end_point = t->TrackPoint;
     }
 
-    end_dist = Distance(end_point->x, end_point->y, actor->spr.pos.X, actor->spr.pos.Y);
-    start_dist = Distance(start_point->x, start_point->y, actor->spr.pos.X, actor->spr.pos.Y);
+    end_dist = Distance(end_point->x, end_point->y, actor->int_pos().X, actor->int_pos().Y);
+    start_dist = Distance(start_point->x, start_point->y, actor->int_pos().X, actor->int_pos().Y);
 
     if (end_dist < start_dist)
     {
@@ -94,8 +94,8 @@ short TrackStartCloserThanEnd(DSWActor* actor, TRACK* t, TRACK_POINT* start_poin
         end_point = t->TrackPoint;
     }
 
-    end_dist = Distance(end_point->x, end_point->y, actor->spr.pos.X, actor->spr.pos.Y);
-    start_dist = Distance(start_point->x, start_point->y, actor->spr.pos.X, actor->spr.pos.Y);
+    end_dist = Distance(end_point->x, end_point->y, actor->int_pos().X, actor->int_pos().Y);
+    start_dist = Distance(start_point->x, start_point->y, actor->int_pos().X, actor->int_pos().Y);
 
     if (start_dist < end_dist)
     {
@@ -196,13 +196,13 @@ short ActorFindTrack(DSWActor* actor, int8_t player_dir, int track_type, int* tr
         {
             tp = t->TrackPoint + end_point[i];
 
-            dist = Distance(tp->x, tp->y, actor->spr.pos.X, actor->spr.pos.Y);
+            dist = Distance(tp->x, tp->y, actor->int_pos().X, actor->int_pos().Y);
 
             if (dist < 15000 && dist < near_dist)
             {
                 // make sure track start is on approximate z level - skip if
                 // not
-                if (labs(actor->spr.pos.Z - tp->z) > zdiff)
+                if (labs(actor->int_pos().Z - tp->z) > zdiff)
                 {
                     continue;
                 }
@@ -249,7 +249,7 @@ short ActorFindTrack(DSWActor* actor, int8_t player_dir, int track_type, int* tr
         updatesector(near_tp->x, near_tp->y, &track_sect);
 
         // if can see the point, return the track number
-        if (track_sect && FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(16), actor->sector(), near_tp->x, near_tp->y, track_sect->floorz - Z(32), track_sect))
+        if (track_sect && FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(16), actor->sector(), near_tp->x, near_tp->y, track_sect->floorz - Z(32), track_sect))
         {
             return short(near_track - &Track[0]);
         }
@@ -285,9 +285,9 @@ void TrackAddPoint(TRACK* t, TRACK_POINT* tp, DSWActor* actor)
 {
     TRACK_POINT* tpoint = (tp + t->NumPoints);
 
-    tpoint->x = actor->spr.pos.X;
-    tpoint->y = actor->spr.pos.Y;
-    tpoint->z = actor->spr.pos.Z;
+    tpoint->x = actor->int_pos().X;
+    tpoint->y = actor->int_pos().Y;
+    tpoint->z = actor->int_pos().Z;
     tpoint->ang = actor->spr.ang;
     tpoint->tag_low = actor->spr.lotag;
     tpoint->tag_high = actor->spr.hitag;
@@ -303,7 +303,7 @@ DSWActor* TrackClonePoint(DSWActor* actor)
 
     actorNew->spr.cstat = 0;
     actorNew->spr.extra = 0;
-    actorNew->set_int_pos(actor->spr.pos);
+    actorNew->set_int_pos(actor->int_pos());
     actorNew->spr.ang = actor->spr.ang;
     actorNew->spr.lotag = actor->spr.lotag;
     actorNew->spr.hitag = actor->spr.hitag;
@@ -573,7 +573,7 @@ void TrackSetup(void)
             int i;
             it.Reset(STAT_TRACK + ndx);
             auto itActor = it.Next();
-            Printf("WARNING: Did not find first point of Track Number %d, x %d, y %d\n", ndx, itActor->spr.pos.X, itActor->spr.pos.Y);
+            Printf("WARNING: Did not find first point of Track Number %d, x %d, y %d\n", ndx, itActor->int_pos().X, itActor->int_pos().Y);
             it.Reset(STAT_TRACK + ndx);
             while (auto actor = it.Next())
             {
@@ -598,7 +598,7 @@ void TrackSetup(void)
             it.Reset(STAT_TRACK + ndx);
             while (auto actor = it.Next())
             {
-                dist = Distance((tp + t->NumPoints - 1)->x, (tp + t->NumPoints - 1)->y, actor->spr.pos.X, actor->spr.pos.Y);
+                dist = Distance((tp + t->NumPoints - 1)->x, (tp + t->NumPoints - 1)->y, actor->int_pos().X, actor->int_pos().Y);
 
                 if (dist < low_dist)
                 {
@@ -683,8 +683,8 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
         I_Error("SOP bound sprite with hitag %d not found", 500 + (int(sop - SectorObject) * 5));
     }
 
-    xlow = BoundActor->spr.pos.X;
-    ylow = BoundActor->spr.pos.Y;
+    xlow = BoundActor->int_pos().X;
+    ylow = BoundActor->int_pos().Y;
 
     KillActor(BoundActor);
 
@@ -693,8 +693,8 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
     {
         I_Error("SOP bound sprite with hitag %d not found", 501 + (int(sop - SectorObject) * 5));
     }
-    xhigh = BoundActor->spr.pos.X;
-    yhigh = BoundActor->spr.pos.Y;
+    xhigh = BoundActor->int_pos().X;
+    yhigh = BoundActor->int_pos().Y;
 
     KillActor(BoundActor);
 
@@ -707,9 +707,9 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
     BoundActor = FindBoundSprite(SECT_SO_CENTER);
     if (BoundActor)
     {
-        sop->pmid.X = BoundActor->spr.pos.X;
-        sop->pmid.Y = BoundActor->spr.pos.Y;
-        sop->pmid.Z = BoundActor->spr.pos.Z;
+        sop->pmid.X = BoundActor->int_pos().X;
+        sop->pmid.Y = BoundActor->int_pos().Y;
+        sop->pmid.Z = BoundActor->int_pos().Z;
         KillActor(BoundActor);
     }
 
@@ -817,7 +817,7 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
         SWStatIterator it(StatList[i]);
         while (auto itActor = it.Next())
         {
-            if (itActor->spr.pos.X > xlow && itActor->spr.pos.X < xhigh && itActor->spr.pos.Y > ylow && itActor->spr.pos.Y < yhigh)
+            if (itActor->int_pos().X > xlow && itActor->int_pos().X < xhigh && itActor->int_pos().Y > ylow && itActor->int_pos().Y < yhigh)
             {
                 // some delete sprites ride others don't
                 if (itActor->spr.statnum == STAT_DELETE_SPRITE)
@@ -846,12 +846,12 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
                         short ang2;
                         sop->clipdist = 0;
                         sop->clipbox_dist[sop->clipbox_num] = itActor->spr.lotag;
-                        sop->clipbox_xoff[sop->clipbox_num] = sop->pmid.X - itActor->spr.pos.X;
-                        sop->clipbox_yoff[sop->clipbox_num] = sop->pmid.Y - itActor->spr.pos.Y;
+                        sop->clipbox_xoff[sop->clipbox_num] = sop->pmid.X - itActor->int_pos().X;
+                        sop->clipbox_yoff[sop->clipbox_num] = sop->pmid.Y - itActor->int_pos().Y;
 
-                        sop->clipbox_vdist[sop->clipbox_num] = ksqrt(SQ(sop->pmid.X - itActor->spr.pos.X) + SQ(sop->pmid.Y - itActor->spr.pos.Y));
+                        sop->clipbox_vdist[sop->clipbox_num] = ksqrt(SQ(sop->pmid.X - itActor->int_pos().X) + SQ(sop->pmid.Y - itActor->int_pos().Y));
 
-                        ang2 = getangle(itActor->spr.pos.X - sop->pmid.X, itActor->spr.pos.Y - sop->pmid.Y);
+                        ang2 = getangle(itActor->int_pos().X - sop->pmid.X, itActor->int_pos().Y - sop->pmid.Y);
                         sop->clipbox_ang[sop->clipbox_num] = getincangle(ang2, sop->ang);
 
                         sop->clipbox_num++;
@@ -872,9 +872,9 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
                 }
 
 
-                itActor->user.pos.X = sop->pmid.X - itActor->spr.pos.X;
-                itActor->user.pos.Y = sop->pmid.Y - itActor->spr.pos.Y;
-                itActor->user.pos.Z = sop->mid_sector->floorz - itActor->spr.pos.Z;
+                itActor->user.pos.X = sop->pmid.X - itActor->int_pos().X;
+                itActor->user.pos.Y = sop->pmid.Y - itActor->int_pos().Y;
+                itActor->user.pos.Z = sop->mid_sector->floorz - itActor->int_pos().Z;
 
                 itActor->user.Flags |= (SPR_SO_ATTACHED);
 
@@ -905,7 +905,7 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop)
                         if (sop->sectp[j] == itActor->sector())
                         {
                             itActor->user.Flags |= (SPR_ON_SO_SECTOR);
-                            itActor->user.pos.Z = itActor->sector()->floorz - itActor->spr.pos.Z;
+                            itActor->user.pos.Z = itActor->sector()->floorz - itActor->int_pos().Z;
                             break;
                         }
                     }
@@ -928,8 +928,8 @@ cont:
         {
             auto actor = sop->so_actors[i];
 
-            if (actor->spr.pos.Z > zmid)
-                zmid = actor->spr.pos.Z;
+            if (actor->int_pos().Z > zmid)
+                zmid = actor->int_pos().Z;
         }
 
         ASSERT(zmid != -9999999);
@@ -939,7 +939,7 @@ cont:
 		for (i = 0; sop->so_actors[i] != nullptr; i++)
 		{
             auto actor = sop->so_actors[i];
-            actor->user.pos.Z = sop->pmid.Z - actor->spr.pos.Z;
+            actor->user.pos.Z = sop->pmid.Z - actor->int_pos().Z;
         }
     }
 }
@@ -1201,7 +1201,7 @@ void SetupSectorObject(sectortype* sectp, short tag)
 
                     if (TEST_BOOL4(actor))
                     {
-                        sop->crush_z = actor->spr.pos.Z;
+                        sop->crush_z = actor->int_pos().Z;
                         sop->flags |= (SOBJ_RECT_CLIP);
                     }
 
@@ -1475,7 +1475,7 @@ void PlaceActorsOnTracks(void)
         {
             tpoint = Track[actor->user.track].TrackPoint;
 
-            dist = Distance((tpoint + j)->x, (tpoint + j)->y, actor->spr.pos.X, actor->spr.pos.Y);
+            dist = Distance((tpoint + j)->x, (tpoint + j)->y, actor->int_pos().X, actor->int_pos().Y);
 
             if (dist < low_dist)
             {
@@ -1488,12 +1488,12 @@ void PlaceActorsOnTracks(void)
 
         if (Track[actor->user.track].NumPoints == 0)
         {
-            Printf("WARNING: Sprite %d (%d, %d) placed on track %d with no points!\n", actor->GetIndex(), actor->spr.pos.X, actor->spr.pos.Y, actor->user.track);
+            Printf("WARNING: Sprite %d (%d, %d) placed on track %d with no points!\n", actor->GetIndex(), actor->int_pos().X, actor->int_pos().Y, actor->user.track);
             continue;
         }
 
         // check angle in the "forward" direction
-        actor->spr.ang = getangle((tpoint + actor->user.point)->x - actor->spr.pos.X, (tpoint + actor->user.point)->y - actor->spr.pos.Y);
+        actor->spr.ang = getangle((tpoint + actor->user.point)->x - actor->int_pos().X, (tpoint + actor->user.point)->y - actor->int_pos().Y);
     }
 }
 
@@ -1729,15 +1729,15 @@ PlayerPart:
             if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_DONT_SPIN))
                 continue;
 
-            auto pos = actor->spr.pos;
+            auto pos = actor->int_pos();
             if ((actor->sector()->firstWall()->extra & WALLFX_LOOP_REVERSE_SPIN))
             {
-                rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, -delta_ang, &pos.vec2);
+                rotatepoint(sop->pmid.vec2, actor->int_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, &pos.vec2);
+                rotatepoint(sop->pmid.vec2, actor->int_pos().vec2, delta_ang, &pos.vec2);
                 actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang);
             }
             actor->set_int_pos(pos);
@@ -1748,8 +1748,8 @@ PlayerPart:
             if (!(sop->flags & SOBJ_DONT_ROTATE))
             {
                 // NOT part of a sector - independant of any sector
-                auto pos = actor->spr.pos;
-                rotatepoint(sop->pmid.vec2, actor->spr.pos.vec2, delta_ang, &pos.vec2);
+                auto pos = actor->int_pos();
+                rotatepoint(sop->pmid.vec2, actor->int_pos().vec2, delta_ang, &pos.vec2);
                 actor->spr.ang = NORM_ANGLE(actor->spr.ang + delta_ang);
                 actor->set_int_pos(pos);
             }
@@ -1757,7 +1757,7 @@ PlayerPart:
             // 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->int_pos());
         }
 
         actor->user.oangdiff += getincangle(oldang, actor->spr.ang);
@@ -1928,7 +1928,7 @@ void UpdateSectorObjectSprites(SECTOR_OBJECT* sop)
         DSWActor* actor = sop->so_actors[i];
         if (!actor) continue;
 
-        SetActorZ(actor, actor->spr.pos);
+        SetActorZ(actor, actor->int_pos());
     }
 }
 
@@ -2758,8 +2758,8 @@ void DoAutoTurretObject(SECTOR_OBJECT* sop)
 
 			if (sActor->spr.statnum == STAT_SO_SHOOT_POINT)
             {
-                if (!FAFcansee(sActor->spr.pos.X, sActor->spr.pos.Y, sActor->spr.pos.Z-Z(4), sActor->sector(),
-                               actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, ActorUpperZ(actor->user.targetActor), actor->user.targetActor->sector()))
+                if (!FAFcansee(sActor->int_pos().X, sActor->int_pos().Y, sActor->int_pos().Z-Z(4), sActor->sector(),
+                               actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, ActorUpperZ(actor->user.targetActor), actor->user.targetActor->sector()))
                 {
                     return;
                 }
@@ -2793,7 +2793,7 @@ void DoAutoTurretObject(SECTOR_OBJECT* sop)
             }
         }
 
-        sop->ang_tgt = getangle(actor->user.targetActor->spr.pos.X - sop->pmid.X,  actor->user.targetActor->spr.pos.Y - sop->pmid.Y);
+        sop->ang_tgt = getangle(actor->user.targetActor->int_pos().X - sop->pmid.X,  actor->user.targetActor->int_pos().Y - sop->pmid.Y);
 
         // get delta to target angle
         delta_ang = getincangle(sop->ang, sop->ang_tgt);
@@ -2833,7 +2833,7 @@ void DoActorHitTrackEndPoint(DSWActor* actor)
 
         if (actor->user.track >= 0)
         {
-            actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y));
+            actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y));
         }
         else
         {
@@ -2849,7 +2849,7 @@ void DoActorHitTrackEndPoint(DSWActor* actor)
 
         if (actor->user.track >= 0)
         {
-            actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->spr.pos.X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->spr.pos.Y));
+            actor->spr.ang = NORM_ANGLE(getangle((Track[actor->user.track].TrackPoint + actor->user.point)->x - actor->int_pos().X, (Track[actor->user.track].TrackPoint + actor->user.point)->y - actor->int_pos().Y));
         }
         else
         {
@@ -3005,7 +3005,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
             {
                 actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
 
-                FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(24), actor->sector(),      // Start position
+                FAFhitscan(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(24), actor->sector(),      // Start position
                            bcos(actor->spr.ang),    // X vector of 3D ang
                            bsin(actor->spr.ang),    // Y vector of 3D ang
                            0,                // Z vector of 3D ang
@@ -3024,7 +3024,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
                 if (!hit.hitWall->twoSided())
                     return false;
 
-                zdiff = labs(actor->spr.pos.Z - hit.hitWall->nextSector()->floorz) >> 8;
+                zdiff = labs(actor->int_pos().Z - hit.hitWall->nextSector()->floorz) >> 8;
 
                 actor->user.jump_speed = PickJumpSpeed(actor, zdiff);
             }
@@ -3103,12 +3103,12 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
 
         actor->spr.ang = tpoint->ang;
 
-        z[0] = actor->spr.pos.Z - ActorSizeZ(actor) + Z(5);
-        z[1] = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1);
+        z[0] = actor->int_pos().Z - ActorSizeZ(actor) + Z(5);
+        z[1] = actor->int_pos().Z - (ActorSizeZ(actor) >> 1);
 
         for (i = 0; i < (int)SIZ(z); i++)
         {
-            neartag({ actor->spr.pos.X, actor->spr.pos.Y, z[i] }, actor->sector(), actor->spr.ang, near, 1024, NTAG_SEARCH_LO_HI);
+            neartag({ actor->int_pos().X, actor->int_pos().Y, z[i] }, actor->sector(), actor->spr.ang, near, 1024, NTAG_SEARCH_LO_HI);
 
             if (near.actor() != nullptr && near.hitpos.X < 1024)
             {
@@ -3316,7 +3316,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
             nx = MOVEx(100, lActor->spr.ang);
             ny = MOVEy(100, lActor->spr.ang);
 
-            actor->set_int_xy(lActor->spr.pos.X + nx, lActor->spr.pos.Y + ny);
+            actor->set_int_xy(lActor->int_pos().X + nx, lActor->int_pos().Y + ny);
 
             actor->spr.ang = NORM_ANGLE(lActor->spr.ang + 1024);
 
@@ -3324,7 +3324,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
             // Get the z height to climb
             //
 
-            neartag({ actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor) - (ActorSizeZ(actor) >> 1) }, actor->sector(), actor->spr.ang, near, 600, NTAG_SEARCH_LO_HI);
+            neartag({ actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor) - (ActorSizeZ(actor) >> 1) }, actor->sector(), actor->spr.ang, near, 600, NTAG_SEARCH_LO_HI);
 
             if (near.hitWall == nullptr)
             {
@@ -3356,7 +3356,7 @@ bool ActorTrackDecide(TRACK_POINT* tpoint, DSWActor* actor)
             bos_z = ActorZOfBottom(actor);
             if (bos_z > actor->user.loz)
             {
-                actor->user.pos.Y = (bos_z - actor->spr.pos.Z);
+                actor->user.pos.Y = (bos_z - actor->int_pos().Z);
                 actor->add_int_z(-actor->user.pos.Y);
             }
 
@@ -3412,7 +3412,7 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
             {
                 pp = &Player[pnum];
 
-                if (Distance(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y) < actor->user.Dist)
+                if (Distance(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y) < actor->user.Dist)
                 {
                     actor->user.targetActor = pp->actor;
                     actor->user.Flags &= ~(SPR_WAIT_FOR_PLAYER);
@@ -3443,10 +3443,10 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
 
     if (!(actor->user.Flags & (SPR_CLIMBING | SPR_DONT_UPDATE_ANG)))
     {
-        actor->spr.ang = getangle(tpoint->x - actor->spr.pos.X, tpoint->y - actor->spr.pos.Y);
+        actor->spr.ang = getangle(tpoint->x - actor->int_pos().X, tpoint->y - actor->int_pos().Y);
     }
 
-    if ((dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, tpoint->x, tpoint->y)) < 200) // 64
+    if ((dist = Distance(actor->int_pos().X, actor->int_pos().Y, tpoint->x, tpoint->y)) < 200) // 64
     {
         if (!ActorTrackDecide(tpoint, actor))
             return true;
@@ -3458,7 +3458,7 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
         if (!(actor->user.Flags & (SPR_CLIMBING | SPR_DONT_UPDATE_ANG)))
         {
             // calculate a new angle to the target
-            actor->spr.ang = getangle(tpoint->x - actor->spr.pos.X, tpoint->y - actor->spr.pos.Y);
+            actor->spr.ang = getangle(tpoint->x - actor->int_pos().X, tpoint->y - actor->int_pos().Y);
         }
 
         if (actor->user.Flags & (SPR_ZDIFF_MODE))
@@ -3469,11 +3469,11 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
             dz = tpoint->z;
 
             // find the distance to the target (player)
-            dist = DIST(dx, dy, actor->spr.pos.X, actor->spr.pos.Y);
+            dist = DIST(dx, dy, actor->int_pos().X, actor->int_pos().Y);
 
             // (velocity * difference between the target and the object) /
             // distance
-            actor->spr.zvel = -((actor->spr.xvel * (actor->spr.pos.Z - dz)) / dist);
+            actor->spr.zvel = -((actor->spr.xvel * (actor->int_pos().Z - dz)) / dist);
         }
     }
     else
@@ -3512,7 +3512,7 @@ int ActorFollowTrack(DSWActor* actor, short locktics)
 
                 actor->spr.zvel = 0;
 
-                actor->spr.ang = getangle(tpoint->x - actor->spr.pos.X, tpoint->y - actor->spr.pos.Y);
+                actor->spr.ang = getangle(tpoint->x - actor->int_pos().X, tpoint->y - actor->int_pos().Y);
 
                 ActorLeaveTrack(actor);
                 actor->spr.cstat &= ~(CSTAT_SPRITE_YCENTER);
diff --git a/source/games/sw/src/vator.cpp b/source/games/sw/src/vator.cpp
index ea7397ffe..8b2e0eff1 100644
--- a/source/games/sw/src/vator.cpp
+++ b/source/games/sw/src/vator.cpp
@@ -56,15 +56,15 @@ void ReverseVator(DSWActor* actor)
     // moving toward to OFF pos
     if (actor->user.z_tgt == actor->user.oz)
     {
-        if (actor->spr.pos.Z == actor->user.oz)
+        if (actor->int_pos().Z == actor->user.oz)
             actor->user.z_tgt = actor->user.pos.Z;
         else if (actor->user.pos.Z == actor->user.oz)
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
     }
     else if (actor->user.z_tgt == actor->user.pos.Z)
     {
-        if (actor->spr.pos.Z == actor->user.oz)
-            actor->user.z_tgt = actor->spr.pos.Z;
+        if (actor->int_pos().Z == actor->user.oz)
+            actor->user.z_tgt = actor->int_pos().Z;
         else if (actor->user.pos.Z == actor->user.oz)
             actor->user.z_tgt = actor->user.pos.Z;
     }
@@ -107,7 +107,7 @@ void SetVatorActive(DSWActor* actor)
     actor->user.Tics = 0;
 
     // moving to the ON position
-    if (actor->user.z_tgt == actor->spr.pos.Z)
+    if (actor->user.z_tgt == actor->int_pos().Z)
         VatorSwitch(SP_TAG2(actor), true);
     else
     // moving to the OFF position
@@ -390,7 +390,7 @@ int DoVator(DSWActor* actor)
     if (*lptr == actor->user.z_tgt)
     {
         // in the ON position
-        if (actor->user.z_tgt == actor->spr.pos.Z)
+        if (actor->user.z_tgt == actor->int_pos().Z)
         {
             // change target
             actor->user.z_tgt = actor->user.pos.Z;
@@ -411,7 +411,7 @@ int DoVator(DSWActor* actor)
             // change target
             actor->user.jump_speed = actor->user.vel_tgt;
             actor->user.vel_rate = short(abs(actor->user.vel_rate));
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
 
             RESET_BOOL8(actor);
             SetVatorInactive(actor);
@@ -541,7 +541,7 @@ int DoVatorAuto(DSWActor* actor)
     if (*lptr == actor->user.z_tgt)
     {
         // in the UP position
-        if (actor->user.z_tgt == actor->spr.pos.Z)
+        if (actor->user.z_tgt == actor->int_pos().Z)
         {
             // change target
             actor->user.z_tgt = actor->user.pos.Z;
@@ -558,7 +558,7 @@ int DoVatorAuto(DSWActor* actor)
             // change target
             actor->user.jump_speed = actor->user.vel_tgt;
             actor->user.vel_rate = short(abs(actor->user.vel_rate));
-            actor->user.z_tgt = actor->spr.pos.Z;
+            actor->user.z_tgt = actor->int_pos().Z;
             actor->user.Tics = actor->user.WaitTics;
 
             if (SP_TAG6(actor) && TEST_BOOL5(actor))
diff --git a/source/games/sw/src/vis.cpp b/source/games/sw/src/vis.cpp
index d069c903a..49b440599 100644
--- a/source/games/sw/src/vis.cpp
+++ b/source/games/sw/src/vis.cpp
@@ -96,16 +96,16 @@ void VisViewChange(PLAYER* pp, int *vis)
         auto own = GetOwner(actor);
         if (own != nullptr)
         {
-            x = own->spr.pos.X;
-            y = own->spr.pos.Y;
-            z = own->spr.pos.Z;
+            x = own->int_pos().X;
+            y = own->int_pos().Y;
+            z = own->int_pos().Z;
             sectp = own->sector();
         }
         else
         {
-            x = actor->spr.pos.X;
-            y = actor->spr.pos.Y;
-            z = actor->spr.pos.Z;
+            x = actor->int_pos().X;
+            y = actor->int_pos().Y;
+            z = actor->int_pos().Z;
             sectp = actor->sector();
         }
 
@@ -148,7 +148,7 @@ void SpawnVis(DSWActor* parentActor, sectortype* sect, int x, int y, int z, int
         ASSERT(parentActor->hasU());
         parentActor->user.Flags2 |= (SPR2_CHILDREN);
 
-        actorNew->set_int_pos(parentActor->spr.pos);
+        actorNew->set_int_pos(parentActor->int_pos());
 
         parentActor->user.Flags2 |= (SPR2_VIS_SHADING);
     }
diff --git a/source/games/sw/src/wallmove.cpp b/source/games/sw/src/wallmove.cpp
index f2fb6bb21..b4e923f70 100644
--- a/source/games/sw/src/wallmove.cpp
+++ b/source/games/sw/src/wallmove.cpp
@@ -100,7 +100,7 @@ int DoWallMove(DSWActor* actor)
 
     for(auto& wal : wall)
     {
-        if (wal.wall_int_pos().X == actor->spr.pos.X && wal.wall_int_pos().Y == actor->spr.pos.Y)
+        if (wal.wall_int_pos().X == actor->int_pos().X && wal.wall_int_pos().Y == actor->int_pos().Y)
         {
             found = true;
 
@@ -115,7 +115,7 @@ int DoWallMove(DSWActor* actor)
             }
             else
             {
-                wal.movexy(actor->spr.pos.X + nx, actor->spr.pos.Y + ny);
+                wal.movexy(actor->int_pos().X + nx, actor->int_pos().Y + ny);
             }
 
             if (shade1)
@@ -166,7 +166,7 @@ bool CanSeeWallMove(DSWActor* caller, int match)
         {
             found = true;
 
-            if (cansee(caller->spr.pos.X, caller->spr.pos.Y, caller->spr.pos.Z, caller->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector()))
+            if (cansee(caller->int_pos().X, caller->int_pos().Y, caller->int_pos().Z, caller->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector()))
             {
                 return true;
             }
diff --git a/source/games/sw/src/warp.cpp b/source/games/sw/src/warp.cpp
index bb97ee19c..3a65dcc9d 100644
--- a/source/games/sw/src/warp.cpp
+++ b/source/games/sw/src/warp.cpp
@@ -87,7 +87,7 @@ DSWActor* WarpPlane(int32_t* x, int32_t* y, int32_t* z, sectortype** sect)
 
     if (sp_ceiling)
     {
-        if (*z <= sp_ceiling->spr.pos.Z)
+        if (*z <= sp_ceiling->int_pos().Z)
         {
             return WarpToArea(sp_ceiling, x, y, z, sect);
         }
@@ -95,7 +95,7 @@ DSWActor* WarpPlane(int32_t* x, int32_t* y, int32_t* z, sectortype** sect)
 
     if (sp_floor)
     {
-        if (*z >= sp_floor->spr.pos.Z)
+        if (*z >= sp_floor->int_pos().Z)
         {
             return WarpToArea(sp_floor, x, y, z, sect);
         }
@@ -114,9 +114,9 @@ DSWActor* WarpToArea(DSWActor* sp_from, int32_t* x, int32_t* y, int32_t* z, sect
     short match_rand[16];
     int z_adj = 0;
 
-    xoff = *x - sp_from->spr.pos.X;
-    yoff = *y - sp_from->spr.pos.Y;
-    zoff = *z - sp_from->spr.pos.Z;
+    xoff = *x - sp_from->int_pos().X;
+    yoff = *y - sp_from->int_pos().Y;
+    zoff = *z - sp_from->int_pos().Z;
     match = sp_from->spr.lotag;
 
 #if 0
@@ -176,9 +176,9 @@ DSWActor* WarpToArea(DSWActor* sp_from, int32_t* x, int32_t* y, int32_t* z, sect
                     return nullptr;
 
                 // determine new x,y,z position
-                *x = actor->spr.pos.X + xoff;
-                *y = actor->spr.pos.Y + yoff;
-                *z = actor->spr.pos.Z + zoff;
+                *x = actor->int_pos().X + xoff;
+                *y = actor->int_pos().Y + yoff;
+                *z = actor->int_pos().Z + zoff;
 
                 // make sure you warp outside of warp plane
                 *z += z_adj;
diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp
index 3d4888bad..ed35fb81d 100644
--- a/source/games/sw/src/weapon.cpp
+++ b/source/games/sw/src/weapon.cpp
@@ -3660,7 +3660,7 @@ AutoShrap:
         for (i = 0; i < p->num; i++)
         {
             auto actor = SpawnActor(STAT_SKIP4, p->id, p->state, parentActor->sector(),
-                                    parentActor->spr.pos.X, parentActor->spr.pos.Y, hz[p->zlevel], shrap_ang, 512);
+                                    parentActor->int_pos().X, parentActor->int_pos().Y, hz[p->zlevel], shrap_ang, 512);
 
             if (p->random_disperse)
             {
@@ -4003,24 +4003,24 @@ int SpawnBlood(DSWActor* actor, DSWActor* weapActor, short hit_ang, int hit_x, i
             {
                 p = HariKariBlood;
                 hit_ang = actor->spr.ang;
-                hit_x = actor->spr.pos.X;
-                hit_y = actor->spr.pos.Y;
+                hit_x = actor->int_pos().X;
+                hit_y = actor->int_pos().Y;
                 hit_z = ActorZOfTop(weapActor) + (ActorSizeZ(weapActor) >> 4);
             }
             else
             {
                 p = ExtraBlood;
                 hit_ang = NORM_ANGLE(weapActor->spr.ang + 1024);
-                hit_x = actor->spr.pos.X;
-                hit_y = actor->spr.pos.Y;
+                hit_x = actor->int_pos().X;
+                hit_y = actor->int_pos().Y;
                 hit_z = ActorZOfTop(weapActor) + (ActorSizeZ(weapActor) >> 2);
             }
             break;
         case SERP_RUN_R0:
             p = ExtraBlood;
             hit_ang = NORM_ANGLE(weapActor->spr.ang + 1024);
-            hit_x = actor->spr.pos.X;
-            hit_y = actor->spr.pos.Y;
+            hit_x = actor->int_pos().X;
+            hit_y = actor->int_pos().Y;
             hit_z = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
             break;
         case BLADE1:
@@ -4029,30 +4029,30 @@ int SpawnBlood(DSWActor* actor, DSWActor* weapActor, short hit_ang, int hit_x, i
         case 5011:
             p = SmallBlood;
             hit_ang = NORM_ANGLE(AngToSprite(actor, weapActor) + 1024);
-            hit_x = actor->spr.pos.X;
-            hit_y = actor->spr.pos.Y;
-            hit_z = weapActor->spr.pos.Z - (ActorSizeZ(weapActor) >> 1);
+            hit_x = actor->int_pos().X;
+            hit_y = actor->int_pos().Y;
+            hit_z = weapActor->int_pos().Z - (ActorSizeZ(weapActor) >> 1);
             break;
         case STAR1:
         case CROSSBOLT:
             p = SomeBlood;
             hit_ang = NORM_ANGLE(weapActor->spr.ang + 1024);
-            hit_x = actor->spr.pos.X;
-            hit_y = actor->spr.pos.Y;
-            hit_z = weapActor->spr.pos.Z;
+            hit_x = actor->int_pos().X;
+            hit_y = actor->int_pos().Y;
+            hit_z = weapActor->int_pos().Z;
             break;
         case PLASMA_FOUNTAIN:
             p = PlasmaFountainBlood;
             hit_ang = weapActor->spr.ang;
-            hit_x = actor->spr.pos.X;
-            hit_y = actor->spr.pos.Y;
+            hit_x = actor->int_pos().X;
+            hit_y = actor->int_pos().Y;
             hit_z = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
             break;
         default:
             p = SomeBlood;
             hit_ang = NORM_ANGLE(weapActor->spr.ang + 1024);
-            hit_x = actor->spr.pos.X;
-            hit_y = actor->spr.pos.Y;
+            hit_x = actor->int_pos().X;
+            hit_y = actor->int_pos().Y;
             hit_z = ActorZOfTop(weapActor) + (ActorSizeZ(weapActor) >> 2);
             break;
         }
@@ -4251,7 +4251,7 @@ bool WeaponMoveHit(DSWActor* actor)
         ASSERT(sectp->extra != -1);
 
         // hit floor - closer to floor than ceiling
-        if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+        if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
         {
             // hit a floor sprite
             if (actor->user.lowActor)
@@ -4299,7 +4299,7 @@ bool WeaponMoveHit(DSWActor* actor)
 
         if ((sectp->ceilingstat & CSTAT_SECTOR_SKY) && sectp->ceilingpicnum != FAF_MIRROR_PIC)
         {
-            if (labs(actor->spr.pos.Z - sectp->ceilingz) < ActorSizeZ(actor))
+            if (labs(actor->int_pos().Z - sectp->ceilingz) < ActorSizeZ(actor))
             {
                 SetSuicide(actor);
                 return true;
@@ -4402,7 +4402,7 @@ bool WeaponMoveHit(DSWActor* actor)
 
         if (wph->lotag == TAG_WALL_BREAK)
         {
-            HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+            HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
             actor->user.coll.setNone();
             return true;
         }
@@ -4411,7 +4411,7 @@ bool WeaponMoveHit(DSWActor* actor)
         // on walls, so look with hitscan
 
         HitInfo hit{};
-        hitscan(actor->spr.pos, actor->sector(), { bcos(actor->spr.ang), bsin(actor->spr.ang), actor->spr.zvel }, hit, CLIPMASK_MISSILE);
+        hitscan(actor->int_pos(), actor->sector(), { bcos(actor->spr.ang), bsin(actor->spr.ang), actor->spr.zvel }, hit, CLIPMASK_MISSILE);
 
         if (!hit.hitSector)
         {
@@ -4474,7 +4474,7 @@ int DoFireballFlames(DSWActor* actor)
     DSWActor* attach = actor->user.attachActor;
     if (attach != nullptr)
     {
-        actor->set_int_pos({ attach->spr.pos.X, attach->spr.pos.Y, ActorZOfMiddle(attach) });
+        actor->set_int_pos({ attach->int_pos().X, attach->int_pos().Y, ActorZOfMiddle(attach) });
 
         if ((attach->spr.extra & SPRX_BURNABLE))
         {
@@ -4502,7 +4502,7 @@ int DoFireballFlames(DSWActor* actor)
         {
             if (actor->sector()->hasU() && FixedToInt(actor->sector()->depth_fixed) > 0)
             {
-                if (labs(actor->sector()->floorz - actor->spr.pos.Z) <= Z(4))
+                if (labs(actor->sector()->floorz - actor->int_pos().Z) <= Z(4))
                 {
                     KillActor(actor);
                     return 0;
@@ -4575,7 +4575,7 @@ int DoBreakFlames(DSWActor* actor)
     {
         if (actor->sector()->hasU() && FixedToInt(actor->sector()->depth_fixed) > 0)
         {
-            if (labs(actor->sector()->floorz - actor->spr.pos.Z) <= Z(4))
+            if (labs(actor->sector()->floorz - actor->int_pos().Z) <= Z(4))
             {
                 KillActor(actor);
                 return 0;
@@ -5046,7 +5046,7 @@ int ActorHealth(DSWActor* actor, short amt)
                     PlaySound(DIGI_NINJACHOKE, actor, v3df_follow);
                     InitPlasmaFountain(nullptr, actor);
                     InitBloodSpray(actor,false,105);
-                    actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y) + 1024);
+                    actor->spr.ang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y) + 1024);
                     actor->spr.cstat &= ~(CSTAT_SPRITE_YFLIP);
                     if (sw_ninjahack)
                         NewStateGroup(actor, sg_NinjaHariKari);
@@ -5274,7 +5274,7 @@ int GetDamage(DSWActor* actor, DSWActor* weapActor, int DamageNdx)
         int damage_per_pixel, damage_force, damage_amt;
 
 
-        DISTANCE(weapActor->spr.pos.X,weapActor->spr.pos.Y,actor->spr.pos.X,actor->spr.pos.Y,dist,a,b,c);
+        DISTANCE(weapActor->int_pos().X,weapActor->int_pos().Y,actor->int_pos().X,actor->int_pos().Y,dist,a,b,c);
 
         // take off the box around the player or else you'll never get
         // the max_damage;
@@ -5356,7 +5356,7 @@ int PlayerCheckDeath(PLAYER* pp, DSWActor* weapActor)
 
         // for death direction
         //actor->user.slide_ang = weapActor->spr.ang;
-        actor->user.slide_ang = getangle(actor->spr.pos.X - weapActor->spr.pos.X, actor->spr.pos.Y - weapActor->spr.pos.Y);
+        actor->user.slide_ang = getangle(actor->int_pos().X - weapActor->int_pos().X, actor->int_pos().Y - weapActor->int_pos().Y);
         // for death velocity
         actor->user.slide_vel = actor->user.LastDamage * 5;
 
@@ -7011,7 +7011,7 @@ int DoDamageTest(DSWActor* actor)
         SWStatIterator it(StatDamageList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if ((unsigned)dist > actor->user.Radius + itActor->user.Radius)
                 continue;
 
@@ -7025,7 +7025,7 @@ int DoDamageTest(DSWActor* actor)
             // For speed's sake, try limiting check only to radius weapons!
             if (actor->user.Radius > 200)
             {
-                if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y, ActorUpperZ(actor), itActor->sector(),actor->spr.pos.X,actor->spr.pos.Y,actor->spr.pos.Z,actor->sector()))
+                if (!FAFcansee(itActor->int_pos().X,itActor->int_pos().Y, ActorUpperZ(actor), itActor->sector(),actor->int_pos().X,actor->int_pos().Y,actor->int_pos().Z,actor->sector()))
                     continue;
             }
 
@@ -7082,7 +7082,7 @@ int DoFlamesDamageTest(DSWActor* actor)
                 continue;
             }
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
 
             if ((unsigned)dist > actor->user.Radius + itActor->user.Radius)
                 continue;
@@ -7098,7 +7098,7 @@ int DoFlamesDamageTest(DSWActor* actor)
 
             if (actor->user.Radius > 200) // Note: No weaps have bigger radius than 200 cept explosion stuff
             {
-                if (FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,ActorZOfMiddle(actor),itActor->sector(),actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector()))
+                if (FAFcansee(itActor->int_pos().X,itActor->int_pos().Y,ActorZOfMiddle(actor),itActor->sector(),actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector()))
                 {
                     DoDamage(itActor, actor);
                 }
@@ -7219,7 +7219,7 @@ int DoExpDamageTest(DSWActor* actor)
         SWStatIterator it(StatDamageList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
 
             if ((unsigned)dist > actor->user.Radius + itActor->user.Radius)
                 continue;
@@ -7233,7 +7233,7 @@ int DoExpDamageTest(DSWActor* actor)
             }
             else
             {
-                if ((unsigned)FindDistance3D(itActor->spr.pos.X - actor->spr.pos.X, itActor->spr.pos.Y - actor->spr.pos.Y, itActor->spr.pos.Z - actor->spr.pos.Z) > actor->user.Radius + itActor->user.Radius)
+                if ((unsigned)FindDistance3D(itActor->int_pos().X - actor->int_pos().X, itActor->int_pos().Y - actor->int_pos().Y, itActor->int_pos().Z - actor->int_pos().Z) > actor->user.Radius + itActor->user.Radius)
                     continue;
 
                 // added hitscan block because mines no long clip against actors/players
@@ -7242,8 +7242,8 @@ int DoExpDamageTest(DSWActor* actor)
 
                 // Second parameter MUST have blocking bits set or cansee won't work
                 // added second check for FAF water - hitscans were hitting ceiling
-                if (!FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorUpperZ(actor), itActor->sector()) &&
-                    !FAFcansee(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), itActor->spr.pos.X, itActor->spr.pos.Y, ActorLowerZ(actor), itActor->sector()))
+                if (!FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ActorUpperZ(actor), itActor->sector()) &&
+                    !FAFcansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), itActor->int_pos().X, itActor->int_pos().Y, ActorLowerZ(actor), itActor->sector()))
                     continue;
 
                 DoDamage(itActor, actor);
@@ -7254,7 +7254,7 @@ int DoExpDamageTest(DSWActor* actor)
     if (actor->user.ID == MUSHROOM_CLOUD) return 0;   // Central Nuke doesn't break stuff
     // Only secondaries do that
 
-    TraverseBreakableWalls(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.Radius);
+    TraverseBreakableWalls(actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.Radius);
 
     break_count = 0;
     max_stat = SIZ(StatBreakList);
@@ -7264,15 +7264,15 @@ int DoExpDamageTest(DSWActor* actor)
         SWStatIterator it(StatBreakList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if ((unsigned)dist > actor->user.Radius)
                 continue;
 
-            dist = FindDistance3D(itActor->spr.pos.X - actor->spr.pos.X, itActor->spr.pos.Y - actor->spr.pos.Y, ActorZOfMiddle(itActor) - actor->spr.pos.Z);
+            dist = FindDistance3D(itActor->int_pos().X - actor->int_pos().X, itActor->int_pos().Y - actor->int_pos().Y, ActorZOfMiddle(itActor) - actor->int_pos().Z);
             if ((unsigned)dist > actor->user.Radius)
                 continue;
 
-            if (!FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector()))
+            if (!FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, ActorZOfMiddle(itActor), itActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector()))
                 continue;
 
             if ((itActor->spr.extra & SPRX_BREAKABLE))
@@ -7292,7 +7292,7 @@ int DoExpDamageTest(DSWActor* actor)
     SWStatIterator it(STAT_WALL_MOVE);
     while (auto itActor = it.Next())
     {
-        DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+        DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
         if ((unsigned)dist > actor->user.Radius/4)
             continue;
 
@@ -7338,7 +7338,7 @@ int DoMineExpMine(DSWActor* actor)
     SWStatIterator it(STAT_MINE_STUCK);
     while (auto itActor = it.Next())
     {
-        DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+        DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
         if ((unsigned)dist > actor->user.Radius + itActor->user.Radius)
             continue;
 
@@ -7349,7 +7349,7 @@ int DoMineExpMine(DSWActor* actor)
             continue;
 
         // Explosions are spherical, not planes, so let's check that way, well cylindrical at least.
-        zdist = abs(itActor->spr.pos.Z - actor->spr.pos.Z)>>4;
+        zdist = abs(itActor->int_pos().Z - actor->int_pos().Z)>>4;
         if (SpriteOverlap(actor, itActor) || (unsigned)zdist < actor->user.Radius + itActor->user.Radius)
         {
             DoDamage(itActor, actor);
@@ -7387,7 +7387,7 @@ int DoStar(DSWActor* actor)
         DoActorZrange(actor);
         MissileWaterAdjust(actor);
 
-        if (actor->spr.pos.Z > actor->user.loz)
+        if (actor->int_pos().Z > actor->user.loz)
         {
             KillActor(actor);
             return true;
@@ -7425,7 +7425,7 @@ int DoStar(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -7470,7 +7470,7 @@ int DoStar(DSWActor* actor)
             bool did_hit_wall;
             auto hit_sect = actor->user.coll.hitSector;
 
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
             {
                 if (hit_sect->hasU() && FixedToInt(hit_sect->depth_fixed) > 0)
                 {
@@ -7500,7 +7500,7 @@ int DoStar(DSWActor* actor)
             actor->user.change.X = MulScale(actor->user.change.X, 64000 + (RandomRange(64000) - 32000), 16);
             actor->user.change.Y = MulScale(actor->user.change.Y, 64000 + (RandomRange(64000) - 32000), 16);
 
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 actor->user.change.Z = MulScale(actor->user.change.Z, 50000, 16); // floor
             else
                 actor->user.change.Z = MulScale(actor->user.change.Z, 40000, 16); // ceiling
@@ -7542,7 +7542,7 @@ int DoStar(DSWActor* actor)
             // 32000 to 96000
             actor->user.change.X = MulScale(actor->user.change.X, 64000 + (RandomRange(64000) - 32000), 16);
             actor->user.change.Y = MulScale(actor->user.change.Y, 64000 + (RandomRange(64000) - 32000), 16);
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 actor->user.change.Z = MulScale(actor->user.change.Z, 50000, 16); // floor
             else
                 actor->user.change.Z = MulScale(actor->user.change.Z, 40000, 16); // ceiling
@@ -7670,7 +7670,7 @@ int MissileSeek(DSWActor* actor, int16_t delay_tics, int16_t aware_range/*, int1
     if (goal != nullptr)
     {
         // move to correct angle
-        ang2tgt = getangle(goal->spr.pos.X - actor->spr.pos.X, goal->spr.pos.Y - actor->spr.pos.Y);
+        ang2tgt = getangle(goal->int_pos().X - actor->int_pos().X, goal->int_pos().Y - actor->int_pos().Y);
 
         delta_ang = getincangle(ang2tgt, actor->spr.ang);
 
@@ -7686,7 +7686,7 @@ int MissileSeek(DSWActor* actor, int16_t delay_tics, int16_t aware_range/*, int1
 
         zh = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
 
-        delta_ang = (zh - actor->spr.pos.Z)>>1;
+        delta_ang = (zh - actor->int_pos().Z)>>1;
 
         if (labs(delta_ang) > Z(16))
         {
@@ -7736,7 +7736,7 @@ int ComboMissileSeek(DSWActor* actor, int16_t delay_tics, int16_t aware_range/*,
         int oz;
 
         // move to correct angle
-        ang2tgt = getangle(goal->spr.pos.X - actor->spr.pos.X, goal->spr.pos.Y - actor->spr.pos.Y);
+        ang2tgt = getangle(goal->int_pos().X - actor->int_pos().X, goal->int_pos().Y - actor->int_pos().Y);
 
         delta_ang = getincangle(ang2tgt, actor->spr.ang);
 
@@ -7755,11 +7755,11 @@ int ComboMissileSeek(DSWActor* actor, int16_t delay_tics, int16_t aware_range/*,
 
         zh = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
 
-        dist = ksqrt(SQ(actor->spr.pos.X - goal->spr.pos.X) + SQ(actor->spr.pos.Y - goal->spr.pos.Y) + (SQ(actor->spr.pos.Z - zh)>>8));
+        dist = ksqrt(SQ(actor->int_pos().X - goal->int_pos().X) + SQ(actor->int_pos().Y - goal->int_pos().Y) + (SQ(actor->int_pos().Z - zh)>>8));
 
         oz = actor->user.change.Z;
 
-        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->spr.pos.Z, dist);
+        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->int_pos().Z, dist);
         actor->user.change.Z = (actor->user.change.Z + oz*15)/16;
     }
     return 0;
@@ -7820,15 +7820,15 @@ int VectorMissileSeek(DSWActor* actor, int16_t delay_tics, int16_t turn_speed, i
 
         zh = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
 
-        dist = ksqrt(SQ(actor->spr.pos.X - goal->spr.pos.X) + SQ(actor->spr.pos.Y - goal->spr.pos.Y) + (SQ(actor->spr.pos.Z - zh)>>8));
+        dist = ksqrt(SQ(actor->int_pos().X - goal->int_pos().X) + SQ(actor->int_pos().Y - goal->int_pos().Y) + (SQ(actor->int_pos().Z - zh)>>8));
 
         ox = actor->user.change.X;
         oy = actor->user.change.Y;
         oz = actor->user.change.Z;
 
-        actor->user.change.X = Scale(actor->spr.xvel, goal->spr.pos.X - actor->spr.pos.X, dist);
-        actor->user.change.Y = Scale(actor->spr.xvel, goal->spr.pos.Y - actor->spr.pos.Y, dist);
-        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->spr.pos.Z, dist);
+        actor->user.change.X = Scale(actor->spr.xvel, goal->int_pos().X - actor->int_pos().X, dist);
+        actor->user.change.Y = Scale(actor->spr.xvel, goal->int_pos().Y - actor->int_pos().Y, dist);
+        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->int_pos().Z, dist);
 
         // the large turn_speed is the slower the turn
 
@@ -7878,15 +7878,15 @@ int VectorWormSeek(DSWActor* actor, int16_t delay_tics, int16_t aware_range1, in
 
         zh = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
 
-        dist = ksqrt(SQ(actor->spr.pos.X - goal->spr.pos.X) + SQ(actor->spr.pos.Y - goal->spr.pos.Y) + (SQ(actor->spr.pos.Z - zh)>>8));
+        dist = ksqrt(SQ(actor->int_pos().X - goal->int_pos().X) + SQ(actor->int_pos().Y - goal->int_pos().Y) + (SQ(actor->int_pos().Z - zh)>>8));
 
         ox = actor->user.change.X;
         oy = actor->user.change.Y;
         oz = actor->user.change.Z;
 
-        actor->user.change.X = Scale(actor->spr.xvel, goal->spr.pos.X - actor->spr.pos.X, dist);
-        actor->user.change.Y = Scale(actor->spr.xvel, goal->spr.pos.Y - actor->spr.pos.Y, dist);
-        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->spr.pos.Z, dist);
+        actor->user.change.X = Scale(actor->spr.xvel, goal->int_pos().X - actor->int_pos().X, dist);
+        actor->user.change.Y = Scale(actor->spr.xvel, goal->int_pos().Y - actor->int_pos().Y, dist);
+        actor->user.change.Z = Scale(actor->spr.xvel, zh - actor->int_pos().Z, dist);
 
         actor->user.change.X = (actor->user.change.X + ox*7)/8;
         actor->user.change.Y = (actor->user.change.Y + oy*7)/8;
@@ -7920,7 +7920,7 @@ int DoBlurExtend(DSWActor* actor, int16_t interval, int16_t blur_num)
 int InitPlasmaFountain(DSWActor* wActor, DSWActor* sActor)
 {
     auto actorNew = SpawnActor(STAT_MISSILE, PLASMA_FOUNTAIN, s_PlasmaFountain, sActor->sector(),
-                            sActor->spr.pos.X, sActor->spr.pos.Y, ActorZOfBottom(sActor), sActor->spr.ang, 0);
+                            sActor->int_pos().X, sActor->int_pos().Y, ActorZOfBottom(sActor), sActor->spr.ang, 0);
 
     actorNew->spr.shade = -40;
     if (wActor)
@@ -7948,7 +7948,7 @@ int DoPlasmaFountain(DSWActor* actor)
         if (!attachActor) return 0;
 
         // move with sprite
-        SetActorZ(actor, attachActor->spr.pos);
+        SetActorZ(actor, attachActor->int_pos());
         actor->spr.ang = attachActor->spr.ang;
 
         actor->user.Counter++;
@@ -7982,9 +7982,9 @@ int DoPlasma(DSWActor* actor)
     int32_t dax, day, daz;
     int ox,oy,oz;
 
-    ox = actor->spr.pos.X;
-    oy = actor->spr.pos.Y;
-    oz = actor->spr.pos.Z;
+    ox = actor->int_pos().X;
+    oy = actor->int_pos().Y;
+    oz = actor->int_pos().Z;
 
     DoBlurExtend(actor, 0, 4);
 
@@ -8126,10 +8126,10 @@ bool SlopeBounce(DSWActor* actor, bool *hit_wall)
 
     auto hit_sector = actor->user.coll.hitSector;
 
-    getzsofslopeptr(hit_sector, actor->spr.pos.X, actor->spr.pos.Y, &hiz, &loz);
+    getzsofslopeptr(hit_sector, actor->int_pos().X, actor->int_pos().Y, &hiz, &loz);
 
     // detect the ceiling and the hit_wall
-    if (actor->spr.pos.Z < ((hiz+loz) >> 1))
+    if (actor->int_pos().Z < ((hiz+loz) >> 1))
     {
         if (!(hit_sector->ceilingstat & CSTAT_SECTOR_SLOPE))
             slope = 0;
@@ -8265,7 +8265,7 @@ int DoGrenade(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -8296,7 +8296,7 @@ int DoGrenade(DSWActor* actor)
                 else
                 {
                     // hit a sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         if (!(actor->user.Flags & SPR_BOUNCE))
@@ -8332,7 +8332,7 @@ int DoGrenade(DSWActor* actor)
             else
             {
                 // hit floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     if (actor->user.Flags & (SPR_UNDERWATER))
                         actor->user.Flags |= (SPR_BOUNCE); // no bouncing underwater
@@ -8389,7 +8389,7 @@ int DoGrenade(DSWActor* actor)
     if (!(actor->user.Flags & (SPR_BOUNCE|SPR_UNDERWATER)))
     {
         auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_Puff, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 100);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 100);
 
         SetOwner(actor, actorNew);
         actorNew->spr.shade = -40;
@@ -8467,7 +8467,7 @@ int DoVulcanBoulder(DSWActor* actor)
 
             if (wph->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(wph, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(wph, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -8495,7 +8495,7 @@ int DoVulcanBoulder(DSWActor* actor)
                 else
                 {
                     // hit a sloped sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         actor->user.change.X = MulScale(actor->user.change.X, 30000, 16);
@@ -8520,7 +8520,7 @@ int DoVulcanBoulder(DSWActor* actor)
             else
             {
                 // hit unsloped floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     actor->user.coll.setNone();
                     actor->user.Counter = 0;
@@ -8572,7 +8572,7 @@ int DoMineRangeTest(DSWActor* actor, int range)
         SWStatIterator it(StatDamageList[stat]);
         while (auto itActor = it.Next())
         {
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, tx, ty, tmin);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, tx, ty, tmin);
             if (dist > range)
                 continue;
 
@@ -8588,11 +8588,11 @@ int DoMineRangeTest(DSWActor* actor, int range)
             if (itActor->user.ID == GIRLNINJA_RUN_R0 && !ownerisplayer)
                 continue;
 
-            dist = FindDistance3D(actor->spr.pos - itActor->spr.pos);
+            dist = FindDistance3D(actor->int_pos() - itActor->int_pos());
             if (dist > range)
                 continue;
 
-            if (!FAFcansee(itActor->spr.pos.X,itActor->spr.pos.Y,ActorUpperZ(actor),itActor->sector(),actor->spr.pos.X,actor->spr.pos.Y,actor->spr.pos.Z,actor->sector()))
+            if (!FAFcansee(itActor->int_pos().X,itActor->int_pos().Y,ActorUpperZ(actor),itActor->sector(),actor->int_pos().X,actor->int_pos().Y,actor->int_pos().Z,actor->sector()))
                 continue;
 
             return true;
@@ -8620,9 +8620,9 @@ int DoMineStuck(DSWActor* actor)
             actor->user.WaitTics = SEC(1)/2;
         }
 
-        vec3_t pos = { attachActor->spr.pos.X, attachActor->spr.pos.Y, attachActor->spr.pos.Z - actor->user.pos.Z };
+        vec3_t pos = { attachActor->int_pos().X, attachActor->int_pos().Y, attachActor->int_pos().Z - actor->user.pos.Z };
         SetActorZ(actor, &pos);
-        actor->set_int_z(attachActor->spr.pos.Z - (ActorSizeZ(attachActor) >> 1));
+        actor->set_int_z(attachActor->int_pos().Z - (ActorSizeZ(attachActor) >> 1));
     }
 
     // not activated yet
@@ -8807,7 +8807,7 @@ int DoMine(DSWActor* actor)
 
             SetMineStuck(actor);
             // Set the Z position
-            actor->set_int_z(hitActor->spr.pos.Z - (ActorSizeZ(hitActor) >> 1));
+            actor->set_int_z(hitActor->int_pos().Z - (ActorSizeZ(hitActor) >> 1));
 
             // If it's not alive, don't stick it
             if (hitActor->hasU() && hitActor->user.Health <= 0) return false;    // JBF: added null check
@@ -8819,7 +8819,7 @@ int DoMine(DSWActor* actor)
 
                 // attach weapon to sprite
                 SetAttach(hitActor, actor);
-                actor->user.pos.Z = hitActor->spr.pos.Z - actor->spr.pos.Z;
+                actor->user.pos.Z = hitActor->int_pos().Z - actor->int_pos().Z;
 
                 auto own = GetOwner(actor);
                 if (own && own->hasU())
@@ -8848,7 +8848,7 @@ int DoMine(DSWActor* actor)
                 else if ((hitActor->spr.cstat & CSTAT_SPRITE_ALIGNMENT_FLOOR))
                 {
                     // hit floor
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                         actor->user.Flags2 |= (SPR2_ATTACH_FLOOR);
                     else
                         actor->user.Flags2 |= (SPR2_ATTACH_CEILING);
@@ -8870,7 +8870,7 @@ int DoMine(DSWActor* actor)
 
             if (hit_wall->lotag == TAG_WALL_BREAK)
             {
-                HitBreakWall(hit_wall, actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->user.ID);
+                HitBreakWall(hit_wall, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->user.ID);
                 actor->user.coll.setNone();
                 break;
             }
@@ -8900,7 +8900,7 @@ int DoMine(DSWActor* actor)
             SetMineStuck(actor);
 
             // hit floor
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 actor->user.Flags2 |= (SPR2_ATTACH_FLOOR);
             else
                 actor->user.Flags2 |= (SPR2_ATTACH_CEILING);
@@ -9033,7 +9033,7 @@ int DoEMPBurst(DSWActor* actor)
     DSWActor* attachActor = actor->user.attachActor;
     if (attachActor != nullptr)
     {
-        vec3_t pos = { attachActor->spr.pos.X, attachActor->spr.pos.Y, attachActor->spr.pos.Z - actor->user.pos.Z };
+        vec3_t pos = { attachActor->int_pos().X, attachActor->int_pos().Y, attachActor->int_pos().Z - actor->user.pos.Z };
         SetActorZ(actor, &pos);
         actor->spr.ang = NORM_ANGLE(attachActor->spr.ang+1024);
     }
@@ -9143,7 +9143,7 @@ int DoLaser(DSWActor* actor)
         if (spawn_count < 256)
         {
             auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_LaserPuff, actor->sector(),
-                              actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                              actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
             actorNew->spr.shade = -40;
             actorNew->spr.xrepeat = 16;
@@ -9230,7 +9230,7 @@ int DoRail(DSWActor* actor)
         if (spawn_count < 128)
         {
             auto actorNew = SpawnActor(STAT_MISSILE, PUFF, &s_RailPuff[0][0], actor->sector(),
-                              actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 20);
+                              actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 20);
 
             actorNew->spr.xvel += (RandomRange(140)-RandomRange(140));
             actorNew->spr.yvel += (RandomRange(140)-RandomRange(140));
@@ -9282,12 +9282,12 @@ int DoRailStart(DSWActor* actor)
 int DoRocket(DSWActor* actor)
 {
     int dist,a,b,c;
-    auto pos = actor->spr.pos;
+    auto pos = actor->int_pos();
 
 
     if ((actor->user.FlagOwner -= ACTORMOVETICS)<=0 && actor->user.spal == 20)
     {
-        DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a, b, c);
+        DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a, b, c);
         actor->user.FlagOwner = dist>>6;
         // Special warn sound attached to each seeker spawned
         PlaySound(DIGI_MINEBEEP, actor, v3df_follow);
@@ -9378,7 +9378,7 @@ int DoMicroMini(DSWActor* actor)
 int SpawnExtraMicroMini(DSWActor* actor)
 {
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Micro[0][0], actor->sector(),
-                    actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, actor->spr.xvel);
+                    actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, actor->spr.xvel);
 
     SetOwner(GetOwner(actor), actorNew);
     actorNew->spr.yrepeat = actorNew->spr.xrepeat = actor->spr.xrepeat;
@@ -9418,7 +9418,7 @@ int DoMicro(DSWActor* actor)
     if (!actor->user.Counter)
     {
         auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_Puff, actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 100);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 100);
 
         SetOwner(GetOwner(actor), actorNew);
         actorNew->spr.shade = -40;
@@ -9441,7 +9441,7 @@ int DoMicro(DSWActor* actor)
         // last smoke
         if ((actor->user.WaitTics -= MISSILEMOVETICS) <= 0)
         {
-            SetActorZ(actorNew, actorNew->spr.pos);
+            SetActorZ(actorNew, actorNew->int_pos());
             NewStateGroup(actor, &sg_MicroMini[0]);
             actor->spr.xrepeat = actor->spr.yrepeat = 10;
             actor->spr.cstat &= ~(CSTAT_SPRITE_INVISIBLE);
@@ -9479,10 +9479,10 @@ int DoUziBullet(DSWActor* actor)
         day = MOVEy((actor->spr.xvel >> 1), actor->spr.ang);
         daz = actor->spr.zvel >> 1;
 
-        sx = actor->spr.pos.X;
-        sy = actor->spr.pos.Y;
+        sx = actor->int_pos().X;
+        sy = actor->int_pos().Y;
         actor->user.coll = move_missile(actor, dax, day, daz, actor->user.ceiling_dist, actor->user.floor_dist, CLIPMASK_MISSILE, MISSILEMOVETICS);
-        actor->user.Dist += Distance(sx, sy, actor->spr.pos.X, actor->spr.pos.Y);
+        actor->user.Dist += Distance(sx, sy, actor->int_pos().X, actor->int_pos().Y);
 
         MissileHitDiveArea(actor);
 
@@ -9493,7 +9493,7 @@ int DoUziBullet(DSWActor* actor)
         {
             WeaponMoveHit(actor);
 
-            auto actorNew = SpawnActor(STAT_MISSILE, UZI_SMOKE, s_UziSmoke, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+            auto actorNew = SpawnActor(STAT_MISSILE, UZI_SMOKE, s_UziSmoke, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
             actorNew->spr.shade = -40;
             actorNew->spr.xrepeat = UZI_SMOKE_REPEAT;
             actorNew->spr.yrepeat = UZI_SMOKE_REPEAT;
@@ -9504,7 +9504,7 @@ int DoUziBullet(DSWActor* actor)
 
             if (!(actor->user.Flags & SPR_UNDERWATER))
             {
-                actorNew = SpawnActor(STAT_MISSILE, UZI_SPARK, s_UziSpark, actorNew->sector(), actorNew->spr.pos.X, actorNew->spr.pos.Y, actorNew->spr.pos.Z, 0, 0);
+                actorNew = SpawnActor(STAT_MISSILE, UZI_SPARK, s_UziSpark, actorNew->sector(), actorNew->int_pos().X, actorNew->int_pos().Y, actorNew->int_pos().Z, 0, 0);
                 actorNew->spr.shade = -40;
                 actorNew->spr.xrepeat = UZI_SPARK_REPEAT;
                 actorNew->spr.yrepeat = UZI_SPARK_REPEAT;
@@ -9673,9 +9673,9 @@ int SpawnCoolieExp(DSWActor* actor)
 
     actor->user.Counter = RandomRange(120);  // This is the wait til birth time!
 
-    zh = actor->spr.pos.Z - ActorSizeZ(actor) + (ActorSizeZ(actor) >> 2);
-    nx = actor->spr.pos.X + MOVEx(64, actor->spr.ang+1024);
-    ny = actor->spr.pos.Y + MOVEy(64, actor->spr.ang+1024);
+    zh = actor->int_pos().Z - ActorSizeZ(actor) + (ActorSizeZ(actor) >> 2);
+    nx = actor->int_pos().X + MOVEx(64, actor->spr.ang+1024);
+    ny = actor->int_pos().Y + MOVEy(64, actor->spr.ang+1024);
 
     PlaySound(DIGI_COOLIEEXPLODE, actor, v3df_none);
 
@@ -9745,7 +9745,7 @@ void SpawnFireballFlames(DSWActor* actor, DSWActor* enemyActor)
     }
 
     auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL_FLAMES, s_FireballFlames, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
 
@@ -9806,7 +9806,7 @@ void SpawnFireballFlames(DSWActor* actor, DSWActor* enemyActor)
 
 int SpawnBreakFlames(DSWActor* actor)
 {
-    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL_FLAMES+1, s_BreakFlames, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL_FLAMES+1, s_BreakFlames, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
 
@@ -9837,7 +9837,7 @@ int SpawnBreakFlames(DSWActor* actor)
 void SpawnBreakStaticFlames(DSWActor* actor)
 {
     auto actorNew = SpawnActor(STAT_STATIC_FIRE, FIREBALL_FLAMES, nullptr, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     if (RandomRange(1000) > 500)
         actorNew->spr.picnum = 3143;
@@ -9855,7 +9855,7 @@ void SpawnBreakStaticFlames(DSWActor* actor)
 
     actorNew->user.Radius = 200;
     actorNew->user.floor_dist = actorNew->user.ceiling_dist = 0;
-    actorNew->set_int_z(getflorzofslopeptr(actorNew->sector(), actorNew->spr.pos.X, actorNew->spr.pos.Y));
+    actorNew->set_int_z(getflorzofslopeptr(actorNew->sector(), actorNew->int_pos().X, actorNew->int_pos().Y));
 
     PlaySound(DIGI_FIRE1,actorNew,v3df_dontpan|v3df_doppler);
 }
@@ -9871,7 +9871,7 @@ void SpawnFireballExp(DSWActor* actor)
     PlaySound(DIGI_SMALLEXP, actor, v3df_none);
 
     auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL_EXP, s_FireballExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
     actorNew->spr.xrepeat = 52;
     actorNew->spr.yrepeat = 52;
@@ -9903,7 +9903,7 @@ void SpawnGoroFireballExp(DSWActor* actor)
     PlaySound(DIGI_MEDIUMEXP, actor, v3df_none);
 
     auto actorNew = SpawnActor(STAT_MISSILE, 0, s_FireballExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
     actorNew->spr.xrepeat = 16;
@@ -9932,7 +9932,7 @@ void SpawnBoltExp(DSWActor* actor)
     PlaySound(DIGI_BOLTEXPLODE, actor, v3df_none);
 
     auto expActor = SpawnActor(STAT_MISSILE, BOLT_EXP, s_BoltExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -9950,7 +9950,7 @@ void SpawnBoltExp(DSWActor* actor)
     DoExpDamageTest(expActor);
 
     SetExpQuake(actor); // !JIM! made rocket launcher shake things
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 }
 
 int SpawnBunnyExp(DSWActor* actor)
@@ -9981,7 +9981,7 @@ void SpawnTankShellExp(DSWActor* actor)
     PlaySound(DIGI_BOLTEXPLODE, actor, v3df_none);
 
     auto expActor = SpawnActor(STAT_MISSILE, TANK_SHELL_EXP, s_TankShellExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -9996,7 +9996,7 @@ void SpawnTankShellExp(DSWActor* actor)
 
     SpawnExpZadjust(actor, expActor, Z(40), Z(40));
     DoExpDamageTest(expActor);
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 }
 
 
@@ -10005,7 +10005,7 @@ void SpawnNuclearSecondaryExp(DSWActor* actor, short ang)
     ASSERT(actor->hasU());
 
     auto expActor = SpawnActor(STAT_MISSILE, GRENADE_EXP, s_GrenadeExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 512);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 512);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -10026,7 +10026,7 @@ void SpawnNuclearSecondaryExp(DSWActor* actor, short ang)
     expActor->user.coll = move_missile(expActor, expActor->user.change.X, expActor->user.change.Y, 0,
                            expActor->user.ceiling_dist, expActor->user.floor_dist, CLIPMASK_MISSILE, MISSILEMOVETICS);
 
-    if (FindDistance3D(expActor->spr.pos - actor->spr.pos) < 1024)
+    if (FindDistance3D(expActor->int_pos() - actor->int_pos()) < 1024)
     {
         KillActor(expActor);
         return;
@@ -10064,7 +10064,7 @@ void SpawnNuclearExp(DSWActor* actor)
 
     // Spawn big mushroom cloud
     auto expActor = SpawnActor(STAT_MISSILE, MUSHROOM_CLOUD, s_NukeMushroom, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(own, expActor);
@@ -10081,7 +10081,7 @@ void SpawnNuclearExp(DSWActor* actor)
 
     // Do central explosion
     expActor = SpawnActor(STAT_MISSILE, MUSHROOM_CLOUD, s_GrenadeExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     SetOwner(own, expActor);
     expActor->spr.shade = -128;
@@ -10124,10 +10124,10 @@ void SpawnTracerExp(DSWActor* actor)
 
     if (actor->user.ID == BOLT_THINMAN_R1)
         expActor = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R1, s_TracerExp, actor->sector(),
-                                actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     else
         expActor = SpawnActor(STAT_MISSILE, TRACER_EXP, s_TracerExp, actor->sector(),
-                                actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -10156,7 +10156,7 @@ void SpawnMicroExp(DSWActor* actor)
         return ;
 
     auto expActor = SpawnActor(STAT_MISSILE, MICRO_EXP, s_MicroExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -10177,7 +10177,7 @@ void SpawnMicroExp(DSWActor* actor)
     //
 
     SpawnExpZadjust(actor, expActor, Z(20), Z(20));
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 }
 
 void AddSpriteToSectorObject(DSWActor* actor, SECTOR_OBJECT* sop)
@@ -10203,9 +10203,9 @@ void AddSpriteToSectorObject(DSWActor* actor, SECTOR_OBJECT* sop)
 
     actor->user.Flags |= (SPR_ON_SO_SECTOR|SPR_SO_ATTACHED);
 
-    actor->user.pos.X = sop->pmid.X - actor->spr.pos.X;
-    actor->user.pos.Y = sop->pmid.Y - actor->spr.pos.Y;
-    actor->user.pos.Z = sop->mid_sector->floorz - actor->spr.pos.Z;
+    actor->user.pos.X = sop->pmid.X - actor->int_pos().X;
+    actor->user.pos.Y = sop->pmid.Y - actor->int_pos().Y;
+    actor->user.pos.Z = sop->mid_sector->floorz - actor->int_pos().Z;
 
     actor->user.sang = actor->spr.ang;
 }
@@ -10215,7 +10215,7 @@ void SpawnBigGunFlames(DSWActor* actor, DSWActor* Operator, SECTOR_OBJECT* sop,
     unsigned sn;
 
     auto expActor = SpawnActor(STAT_MISSILE, MICRO_EXP, s_BigGunFlame, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(Operator, expActor);
@@ -10276,7 +10276,7 @@ void SpawnGrenadeSecondaryExp(DSWActor* actor, int ang)
 
     ASSERT(actor->hasU());
     auto expActor = SpawnActor(STAT_MISSILE, GRENADE_EXP, s_GrenadeSmallExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 1024);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 1024);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -10297,7 +10297,7 @@ void SpawnGrenadeSecondaryExp(DSWActor* actor, int ang)
     expActor->user.coll = move_missile(expActor, expActor->user.change.X, expActor->user.change.Y, 0,
                            expActor->user.ceiling_dist, expActor->user.floor_dist, CLIPMASK_MISSILE, MISSILEMOVETICS);
 
-    if (FindDistance3D(expActor->spr.pos - actor->spr.pos) < 1024)
+    if (FindDistance3D(expActor->int_pos() - actor->int_pos()) < 1024)
     {
         KillActor(expActor);
         return;
@@ -10333,9 +10333,9 @@ void SpawnGrenadeExp(DSWActor* actor)
         }
     }
 
-    dx = actor->spr.pos.X;
-    dy = actor->spr.pos.Y;
-    dz = actor->spr.pos.Z;
+    dx = actor->int_pos().X;
+    dy = actor->int_pos().Y;
+    dz = actor->int_pos().Z;
 
     if (actor->user.ID == ZILLA_RUN_R0)
     {
@@ -10368,7 +10368,7 @@ void SpawnGrenadeExp(DSWActor* actor)
     DoExpDamageTest(expActor);
 
     SetExpQuake(expActor);
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 0);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 0);
 }
 
 void SpawnExpZadjust(DSWActor* actor, DSWActor* expActor, int upper_zsize, int lower_zsize)
@@ -10379,8 +10379,8 @@ void SpawnExpZadjust(DSWActor* actor, DSWActor* expActor, int upper_zsize, int l
 
     if (actor->hasU())
     {
-        tos_z = expActor->spr.pos.Z - upper_zsize;
-        bos_z = expActor->spr.pos.Z + lower_zsize;
+        tos_z = expActor->int_pos().Z - upper_zsize;
+        bos_z = expActor->int_pos().Z + lower_zsize;
 
         if (tos_z <= actor->user.hiz + Z(4))
         {
@@ -10396,10 +10396,10 @@ void SpawnExpZadjust(DSWActor* actor, DSWActor* expActor, int upper_zsize, int l
     {
         int cz,fz;
 
-        getzsofslopeptr(expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, &cz, &fz);
+        getzsofslopeptr(expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, &cz, &fz);
 
-        tos_z = expActor->spr.pos.Z - upper_zsize;
-        bos_z = expActor->spr.pos.Z + lower_zsize;
+        tos_z = expActor->int_pos().Z - upper_zsize;
+        bos_z = expActor->int_pos().Z + lower_zsize;
 
         if (tos_z <= cz + Z(4))
         {
@@ -10426,7 +10426,7 @@ void SpawnMineExp(DSWActor* actor)
     PlaySound(DIGI_MINEBLOW, actor, v3df_none);
 
     auto expActor = SpawnActor(STAT_MISSILE, MINE_EXP, s_MineExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(GetOwner(actor), expActor);
@@ -10443,7 +10443,7 @@ void SpawnMineExp(DSWActor* actor)
     //
 
     SpawnExpZadjust(actor, expActor, Z(100), Z(20));
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 
     SetExpQuake(expActor);
 }
@@ -10472,7 +10472,7 @@ DSWActor* SpawnSectorExp(DSWActor* actor)
     PlaySound(DIGI_30MMEXPLODE, actor, v3df_none);
 
     auto expActor = SpawnActor(STAT_MISSILE, GRENADE_EXP, s_SectorExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     expActor->spr.shade = -40;
@@ -10484,7 +10484,7 @@ DSWActor* SpawnSectorExp(DSWActor* actor)
 
     DoExpDamageTest(expActor);
     SetExpQuake(expActor);
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 
     return expActor;
 }
@@ -10495,7 +10495,7 @@ DSWActor* SpawnLargeExp(DSWActor* actor)
     PlaySound(DIGI_30MMEXPLODE, actor, v3df_none);
 
     auto expActor = SpawnActor(STAT_MISSILE, GRENADE_EXP, s_SectorExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     expActor->spr.shade = -40;
@@ -10510,7 +10510,7 @@ DSWActor* SpawnLargeExp(DSWActor* actor)
     // Should not cause other sectors to explode
     DoExpDamageTest(expActor);
     SetExpQuake(expActor);
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 
     return expActor;
 }
@@ -10526,13 +10526,13 @@ void SpawnMeteorExp(DSWActor* actor)
     if (actor->user.spal == 25)    // Serp ball
     {
         expActor = SpawnActor(STAT_MISSILE, METEOR_EXP, s_TeleportEffect2, actor->sector(),
-                                actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     }
     else
     {
         PlaySound(DIGI_MEDIUMEXP, actor, v3df_none);
         expActor = SpawnActor(STAT_MISSILE, METEOR_EXP, s_MeteorExp, actor->sector(),
-                                actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     }
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
@@ -10561,7 +10561,7 @@ void SpawnLittleExp(DSWActor* actor)
 
     PlaySound(DIGI_HEADSHOTHIT, actor, v3df_none);
     auto expActor = SpawnActor(STAT_MISSILE, BOLT_EXP, s_SectorExp, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     expActor->spr.shade = -127;
@@ -10570,7 +10570,7 @@ void SpawnLittleExp(DSWActor* actor)
     expActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
     expActor->user.Radius = DamageData[DMG_BASIC_EXP].radius;
     DoExpDamageTest(expActor);
-    SpawnVis(nullptr, expActor->sector(), expActor->spr.pos.X, expActor->spr.pos.Y, expActor->spr.pos.Z, 16);
+    SpawnVis(nullptr, expActor->sector(), expActor->int_pos().X, expActor->int_pos().Y, expActor->int_pos().Z, 16);
 }
 
 int DoFireball(DSWActor* actor)
@@ -10638,7 +10638,7 @@ int DoFindGround(DSWActor* actor)
 
     auto save_cstat = actor->spr.cstat;
     actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
-    FAFgetzrange(actor->spr.pos, actor->sector(), &actor->user.hiz, &ceilhit, &actor->user.loz, &florhit, (((int) actor->spr.clipdist) << 2) - GETZRANGE_CLIP_ADJ, CLIPMASK_PLAYER);
+    FAFgetzrange(actor->int_pos(), actor->sector(), &actor->user.hiz, &ceilhit, &actor->user.loz, &florhit, (((int) actor->spr.clipdist) << 2) - GETZRANGE_CLIP_ADJ, CLIPMASK_PLAYER);
     actor->spr.cstat = save_cstat;
 
     switch (florhit.type)
@@ -10690,7 +10690,7 @@ int DoFindGroundPoint(DSWActor* actor)
 
     auto save_cstat = actor->spr.cstat;
     actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
-    FAFgetzrangepoint(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->sector(), &actor->user.hiz, &ceilhit, &actor->user.loz, &florhit);
+    FAFgetzrangepoint(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), &actor->user.hiz, &ceilhit, &actor->user.loz, &florhit);
     actor->spr.cstat = save_cstat;
 
     switch (florhit.type)
@@ -10750,9 +10750,9 @@ int DoNapalm(DSWActor* actor)
         }
     }
 
-    ox = actor->spr.pos.X;
-    oy = actor->spr.pos.Y;
-    oz = actor->spr.pos.Z;
+    ox = actor->int_pos().X;
+    oy = actor->int_pos().Y;
+    oz = actor->int_pos().Z;
 
     actor->user.coll = move_missile(actor, actor->user.change.X, actor->user.change.Y, actor->user.change.Z, actor->user.ceiling_dist, actor->user.floor_dist, CLIPMASK_MISSILE, MISSILEMOVETICS);
 
@@ -10790,7 +10790,7 @@ int DoNapalm(DSWActor* actor)
         PlaySound(DIGI_NAPPUFF, actor, v3df_none);
 
         auto expActor = SpawnActor(STAT_MISSILE, NAP_EXP, s_NapExp, actor->sector(),
-                                actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
         expActor->spr.hitag = LUMINOUS; //Always full brightness
         SetOwner(actor, expActor);
@@ -10883,14 +10883,14 @@ int DoBloodWorm(DSWActor* actor)
     xvect = bcos(ang);
     yvect = bsin(ang);
 
-    bx = actor->spr.pos.X;
-    by = actor->spr.pos.Y;
+    bx = actor->int_pos().X;
+    by = actor->int_pos().Y;
 
     amt = RANDOM_P2(2048) - 1024;
     actor->add_int_pos({ MulScale(amt,xvect, 15), MulScale(amt,yvect, 15), 0 });
 
     auto sect = actor->sector();
-    updatesectorz(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, &sect);
+    updatesectorz(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, &sect);
     if (sect)
     {
         GlobalSkipZrange = true;
@@ -10913,9 +10913,9 @@ int DoSerpMeteor(DSWActor* actor)
 {
     int ox, oy, oz;
 
-    ox = actor->spr.pos.X;
-    oy = actor->spr.pos.Y;
-    oz = actor->spr.pos.Z;
+    ox = actor->int_pos().X;
+    oy = actor->int_pos().Y;
+    oz = actor->int_pos().Z;
 
     actor->spr.xrepeat += MISSILEMOVETICS * 2;
     if (actor->spr.xrepeat > 80)
@@ -11002,7 +11002,7 @@ int DoMirv(DSWActor* actor)
         for (i = 0; i < 2; i++)
         {
             auto actorNew = SpawnActor(STAT_MISSILE, MIRV_METEOR, &sg_MirvMeteor[0][0], actor->sector(),
-                              actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, NORM_ANGLE(actor->spr.ang + angs[i]), 800);
+                              actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, NORM_ANGLE(actor->spr.ang + angs[i]), 800);
 
             actorNew->user.RotNum = 5;
             NewStateGroup(actorNew, &sg_MirvMeteor[0]);
@@ -11155,7 +11155,7 @@ int DoRing(DSWActor* actor)
     else
         z = ActorZOfMiddle(own) + Z(30);
 
-    actor->set_int_pos({ own->spr.pos.X, own->spr.pos.Y, z });
+    actor->set_int_pos({ own->int_pos().X, own->int_pos().Y, z });
 
     // go out until its time to come back in
     if (actor->user.Counter2 == false)
@@ -11187,19 +11187,19 @@ int DoRing(DSWActor* actor)
     actor->add_int_pos({ MulScale(actor->user.Dist, bcos(actor->spr.ang), 14), MulScale(actor->user.Dist, bsin(actor->spr.ang), 14),
         pp ? (actor->user.Dist * (-pp->horizon.horiz.asq16() >> 9)) >> 9 : 0 });
 
-    SetActor(actor, actor->spr.pos);
+    SetActor(actor, actor->int_pos());
 
     ASSERT(actor->insector());
 
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &cz, &fz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &cz, &fz);
 
     // bound the sprite by the sectors ceiling and floor
-    if (actor->spr.pos.Z > fz)
+    if (actor->int_pos().Z > fz)
     {
         actor->set_int_z(fz);
     }
 
-    if (actor->spr.pos.Z < cz + ActorSizeZ(actor))
+    if (actor->int_pos().Z < cz + ActorSizeZ(actor))
     {
         actor->set_int_z(cz + ActorSizeZ(actor));
     }
@@ -11284,12 +11284,12 @@ int DoSerpRing(DSWActor* actor)
         return 0;
     }
 
-    int z = actor->spr.pos.Z + actor->spr.zvel;
-    if (z > own->spr.pos.Z - actor->user.pos.Z)
-        z = own->spr.pos.Z - actor->user.pos.Z;
+    int z = actor->int_pos().Z + actor->spr.zvel;
+    if (z > own->int_pos().Z - actor->user.pos.Z)
+        z = own->int_pos().Z - actor->user.pos.Z;
 
     // move the center with the player
-    actor->set_int_pos({ own->spr.pos.X, own->spr.pos.Y, z });
+    actor->set_int_pos({ own->int_pos().X, own->int_pos().Y, z });
 
 
     // go out until its time to come back in
@@ -11313,19 +11313,19 @@ int DoSerpRing(DSWActor* actor)
     // put it out there
     actor->add_int_pos({ MulScale(actor->user.Dist, bcos(actor->user.slide_ang), 14), MulScale(actor->user.Dist, bsin(actor->user.slide_ang), 14), 0 });
 
-    SetActor(actor, actor->spr.pos);
+    SetActor(actor, actor->int_pos());
 
     ASSERT(actor->insector());
 
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &cz, &fz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &cz, &fz);
 
     // bound the sprite by the sectors ceiling and floor
-    if (actor->spr.pos.Z > fz)
+    if (actor->int_pos().Z > fz)
     {
         actor->set_int_z(fz);
     }
 
-    if (actor->spr.pos.Z < cz + ActorSizeZ(actor))
+    if (actor->int_pos().Z < cz + ActorSizeZ(actor))
     {
         actor->set_int_z(cz + ActorSizeZ(actor));
     }
@@ -11338,20 +11338,20 @@ int DoSerpRing(DSWActor* actor)
             !(tActor->user.PlayerP->Flags & PF_DEAD))
         {
             actor->user.targetActor = own->user.targetActor;
-            DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y, dist, a,b,c);
+            DISTANCE(actor->int_pos().X, actor->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y, dist, a,b,c);
 
             // if ((dist ok and random ok) OR very few skulls left)
             if ((dist < 18000 && (RANDOM_P2(2048<<5)>>5) < 16) || own->user.Counter < 4)
             {
                 auto sect = actor->sector();
-                updatesector(actor->spr.pos.X, actor->spr.pos.Y, &sect);
+                updatesector(actor->int_pos().X, actor->int_pos().Y, &sect);
 
                 // if (valid sector and can see target)
                 if (sect != nullptr && CanSeePlayer(actor))
                 {
                     extern STATE* sg_SkullJump[];
                     actor->user.ID = SKULL_R0;
-                    actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+                    actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
                     actor->spr.xvel = dist>>5;
                     actor->spr.xvel += (actor->spr.xvel >> 1);
                     actor->spr.xvel += (RANDOM_P2(128<<8)>>8);
@@ -11379,10 +11379,10 @@ int InitLavaThrow(DSWActor* actor)
     short w;
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+    actor->spr.ang = nang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
     nz = ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2);
 
     // Spawn a shot
@@ -11415,10 +11415,10 @@ int InitLavaThrow(DSWActor* actor)
     MissileSetPos(actorNew, DoLavaBoulder, 1200);
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
     return 0;
 }
@@ -11431,9 +11431,9 @@ void InitVulcanBoulder(DSWActor* actor)
     short delta;
     short vel;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - Z(40);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - Z(40);
 
     if (SP_TAG7(actor))
     {
@@ -11512,7 +11512,7 @@ int InitSerpRing(DSWActor* actor)
 
     for (missiles = 0, ang = ang_start; missiles < max_missiles; ang += ang_diff, missiles++)
     {
-        auto actorNew = SpawnActor(STAT_SKIP4, SKULL_SERP, &s_SkullRing[0][0], actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, ang, 0);
+        auto actorNew = SpawnActor(STAT_SKIP4, SKULL_SERP, &s_SkullRing[0][0], actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, ang, 0);
 
         actorNew->spr.xvel = 500;
         SetOwner(actor, actorNew);
@@ -11655,7 +11655,7 @@ int InitEnemyNapalm(DSWActor* actor)
     for (i = 0; i < SIZ(mp); i++)
     {
         auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Napalm, actor->sector(),
-                        actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2), actor->spr.ang, NAPALM_VELOCITY);
+                        actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2), actor->spr.ang, NAPALM_VELOCITY);
 
         actorNew->spr.hitag = LUMINOUS; //Always full brightness
         if (i==0) // Only attach sound to first projectile
@@ -11691,10 +11691,10 @@ int InitEnemyNapalm(DSWActor* actor)
         }
 
         // find the distance to the target (player)
-        dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
         if (dist != 0)
-            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
         actorNew->user.change.X = MOVEx(actorNew->spr.xvel, actorNew->spr.ang);
         actorNew->user.change.Y = MOVEy(actorNew->spr.xvel, actorNew->spr.ang);
@@ -11757,7 +11757,7 @@ int InitEnemyMirv(DSWActor* actor)
     PlaySound(DIGI_MIRVFIRE, actor, v3df_none);
 
     auto actorNew = SpawnActor(STAT_MISSILE, MIRV_METEOR, s_Mirv, actor->sector(),
-                    actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2), actor->spr.ang, MIRV_VELOCITY);
+                    actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor) + (ActorSizeZ(actor) >> 2), actor->spr.ang, MIRV_VELOCITY);
 
     PlaySound(DIGI_MIRVWIZ, actorNew, v3df_follow);
 
@@ -11781,10 +11781,10 @@ int InitEnemyMirv(DSWActor* actor)
     MissileSetPos(actorNew, DoMirv, 600);
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
     return 0;
 }
 
@@ -11842,7 +11842,7 @@ int InitSwordAttack(PLAYER* pp)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            dist = Distance(pp->pos.X, pp->pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+            dist = Distance(pp->pos.X, pp->pos.Y, itActor->int_pos().X, itActor->int_pos().Y);
 
             reach = 1000; // !JIM! was 800
             face = 200;
@@ -11851,7 +11851,7 @@ int InitSwordAttack(PLAYER* pp)
             {
                 if (SpriteOverlapZ(pp->actor, itActor, Z(20)))
                 {
-                    if (FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->sector(), plActor->spr.pos.X, plActor->spr.pos.Y, ActorZOfMiddle(plActor), plActor->sector()))
+                    if (FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, ActorZOfMiddle(itActor), itActor->sector(), plActor->int_pos().X, plActor->int_pos().Y, ActorZOfMiddle(plActor), plActor->sector()))
                         DoDamage(itActor, pp->actor);
                 }
             }
@@ -12010,7 +12010,7 @@ int InitFistAttack(PLAYER* pp)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            dist = Distance(pp->pos.X, pp->pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+            dist = Distance(pp->pos.X, pp->pos.Y, itActor->int_pos().X, itActor->int_pos().Y);
 
             if (pp->InventoryActive[2]) // Shadow Bombs give you demon fist
             {
@@ -12027,7 +12027,7 @@ int InitFistAttack(PLAYER* pp)
             {
                 if (SpriteOverlapZ(pp->actor, itActor, Z(20)) || face == 190)
                 {
-                    if (FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->sector(), plActor->spr.pos.X, plActor->spr.pos.Y, ActorZOfMiddle(plActor), plActor->sector()))
+                    if (FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, ActorZOfMiddle(itActor), itActor->sector(), plActor->int_pos().X, plActor->int_pos().Y, ActorZOfMiddle(plActor), plActor->sector()))
                         DoDamage(itActor, plActor);
                     if (face == 190)
                     {
@@ -12179,7 +12179,7 @@ int InitSumoNapalm(DSWActor* actor)
         for (size_t i = 0; i < countof(mp); i++)
         {
             auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Napalm, actor->sector(),
-                actor->spr.pos.X, actor->spr.pos.Y, ActorZOfTop(actor), ang, NAPALM_VELOCITY);
+                actor->int_pos().X, actor->int_pos().Y, ActorZOfTop(actor), ang, NAPALM_VELOCITY);
 
             actorNew->spr.hitag = LUMINOUS; //Always full brightness
             if (i == 0) // Only attach sound to first projectile
@@ -12211,10 +12211,10 @@ int InitSumoNapalm(DSWActor* actor)
             }
 
             // find the distance to the target (player)
-            dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+            dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
             if (dist != 0)
-                actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+                actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
             actorNew->user.change.X = MOVEx(actorNew->spr.xvel, actorNew->spr.ang);
             actorNew->user.change.Y = MOVEy(actorNew->spr.xvel, actorNew->spr.ang);
@@ -12242,7 +12242,7 @@ int InitSumoSkull(DSWActor* actor)
 
     PlaySound(DIGI_SERPSUMMONHEADS, actor, v3df_none);
 
-    auto actorNew = SpawnActor(STAT_ENEMY, SKULL_R0, &s_SkullWait[0][0], actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
+    auto actorNew = SpawnActor(STAT_ENEMY, SKULL_R0, &s_SkullWait[0][0], actor->sector(), actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
 
     actorNew->spr.xvel = 500;
     SetOwner(actor, actorNew);
@@ -12264,7 +12264,7 @@ int InitSumoSkull(DSWActor* actor)
     actorNew->user.Attrib = &SkullAttrib;
     DoActorSetSpeed(actor, NORM_SPEED);
     actorNew->user.Counter = RANDOM_P2(2048);
-    actorNew->user.pos.Z = actorNew->spr.pos.Z;
+    actorNew->user.pos.Z = actorNew->int_pos().Z;
     actorNew->user.Health = 100;
 
     // defaults do change the statnum
@@ -12299,13 +12299,13 @@ int InitSumoStompAttack(DSWActor* actor)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, itActor->spr.pos.X, itActor->spr.pos.Y);
+            dist = Distance(actor->int_pos().X, actor->int_pos().Y, itActor->int_pos().X, itActor->int_pos().Y);
 
             reach = 16384;
 
             if (dist < CloseRangeDist(itActor, actor, reach))
             {
-                if (FAFcansee(itActor->spr.pos.X, itActor->spr.pos.Y, ActorZOfMiddle(itActor), itActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->sector()))
+                if (FAFcansee(itActor->int_pos().X, itActor->int_pos().Y, ActorZOfMiddle(itActor), itActor->sector(), actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->sector()))
                     DoDamage(itActor, actor);
             }
         }
@@ -12323,7 +12323,7 @@ int InitMiniSumoClap(DSWActor* actor)
     auto targetActor = actor->user.targetActor;
     if (!targetActor) return 0;
 
-    dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, targetActor->spr.pos.X, targetActor->spr.pos.Y);
+    dist = Distance(actor->int_pos().X, actor->int_pos().Y, targetActor->int_pos().X, targetActor->int_pos().Y);
 
     reach = 10000;
 
@@ -12331,7 +12331,7 @@ int InitMiniSumoClap(DSWActor* actor)
     {
         if (SpriteOverlapZ(actor, targetActor, Z(20)))
         {
-            if (FAFcansee(targetActor->spr.pos.X, targetActor->spr.pos.Y, ActorZOfMiddle(targetActor), targetActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->sector()))
+            if (FAFcansee(targetActor->int_pos().X, targetActor->int_pos().Y, ActorZOfMiddle(targetActor), targetActor->sector(), actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->sector()))
             {
                 PlaySound(DIGI_CGTHIGHBONE, actor, v3df_follow | v3df_dontpan);
                 DoDamage(targetActor, actor);
@@ -12340,7 +12340,7 @@ int InitMiniSumoClap(DSWActor* actor)
     }
     else if (dist < CloseRangeDist(targetActor, actor, reach))
     {
-        if (FAFcansee(targetActor->spr.pos.X, targetActor->spr.pos.Y, ActorZOfMiddle(targetActor), targetActor->sector(), actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->sector()))
+        if (FAFcansee(targetActor->int_pos().X, targetActor->int_pos().Y, ActorZOfMiddle(targetActor), targetActor->sector(), actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->sector()))
         {
             PlaySound(DIGI_30MMEXPLODE, actor, v3df_none);
             SpawnFireballFlames(actor, targetActor);
@@ -12370,15 +12370,15 @@ int WeaponAutoAim(DSWActor* actor, DSWActor* mislActor, short ang, bool test)
         hitActor->user.Flags |= (SPR_TARGETED);
         hitActor->user.Flags |= (SPR_ATTACKED);
 
-        mislActor->spr.ang = NORM_ANGLE(getangle(hitActor->spr.pos.X - mislActor->spr.pos.X, hitActor->spr.pos.Y - mislActor->spr.pos.Y));
-        dist = FindDistance2D(mislActor->spr.pos.vec2 - hitActor->spr.pos.vec2);
+        mislActor->spr.ang = NORM_ANGLE(getangle(hitActor->int_pos().X - mislActor->int_pos().X, hitActor->int_pos().Y - mislActor->int_pos().Y));
+        dist = FindDistance2D(mislActor->int_pos().vec2 - hitActor->int_pos().vec2);
 
         if (dist != 0)
         {
             int tos, diff, siz;
 
             tos = ActorZOfTop(hitActor);
-            diff = mislActor->spr.pos.Z - tos;
+            diff = mislActor->int_pos().Z - tos;
             siz = ActorSizeZ(hitActor);
 
             // hit_sprite is below
@@ -12391,7 +12391,7 @@ int WeaponAutoAim(DSWActor* actor, DSWActor* mislActor, short ang, bool test)
             else
                 zh = tos + (siz >> 2);
 
-            mislActor->spr.zvel = (mislActor->spr.xvel * (zh - mislActor->spr.pos.Z)) / dist;
+            mislActor->spr.zvel = (mislActor->spr.xvel * (zh - mislActor->int_pos().Z)) / dist;
         }
         return 0;
     }
@@ -12406,7 +12406,7 @@ int WeaponAutoAimZvel(DSWActor* actor, DSWActor* missileActor, int *zvel, short
 
 #if 0
     //formula for leading a player
-    dist = Distance(actor->spr.pos.X, actor->spr.pos.Y, hp->pos.X, hp->pos.Y);
+    dist = Distance(actor->int_pos().X, actor->int_pos().Y, hp->pos.X, hp->pos.Y);
     time_to_target = dist/missileActor->spr.xvel;
     lead_dist = time_to_target*hp->vel;
 #endif
@@ -12426,15 +12426,15 @@ int WeaponAutoAimZvel(DSWActor* actor, DSWActor* missileActor, int *zvel, short
         hitActor->user.Flags |= (SPR_TARGETED);
         hitActor->user.Flags |= (SPR_ATTACKED);
 
-        missileActor->spr.ang = NORM_ANGLE(getangle(hitActor->spr.pos.X - missileActor->spr.pos.X, hitActor->spr.pos.Y - missileActor->spr.pos.Y));
-        dist = FindDistance2D(missileActor->spr.pos.vec2 - hitActor->spr.pos.vec2);
+        missileActor->spr.ang = NORM_ANGLE(getangle(hitActor->int_pos().X - missileActor->int_pos().X, hitActor->int_pos().Y - missileActor->int_pos().Y));
+        dist = FindDistance2D(missileActor->int_pos().vec2 - hitActor->int_pos().vec2);
 
         if (dist != 0)
         {
             int tos, diff, siz;
 
             tos = ActorZOfTop(hitActor);
-            diff = missileActor->spr.pos.Z - tos;
+            diff = missileActor->int_pos().Z - tos;
             siz = ActorSizeZ(hitActor);
 
             // hit_sprite is below
@@ -12447,7 +12447,7 @@ int WeaponAutoAimZvel(DSWActor* actor, DSWActor* missileActor, int *zvel, short
                 else
                     zh = tos + (siz >> 2);
 
-            *zvel = (missileActor->spr.xvel * (zh - missileActor->spr.pos.Z)) / dist;
+            *zvel = (missileActor->spr.xvel * (zh - missileActor->int_pos().Z)) / dist;
         }
         return 0;
     }
@@ -12470,10 +12470,10 @@ DSWActor* AimHitscanToTarget(DSWActor* actor, int *z, short *ang, int z_ratio)
     hitActor->user.Flags |= (SPR_TARGETED);
     hitActor->user.Flags |= (SPR_ATTACKED);
 
-    *ang = getangle(hitActor->spr.pos.X - actor->spr.pos.X, hitActor->spr.pos.Y - actor->spr.pos.Y);
+    *ang = getangle(hitActor->int_pos().X - actor->int_pos().X, hitActor->int_pos().Y - actor->int_pos().Y);
 
     // find the distance to the target
-    dist = ksqrt(SQ(actor->spr.pos.X - hitActor->spr.pos.X) + SQ(actor->spr.pos.Y - hitActor->spr.pos.Y));
+    dist = ksqrt(SQ(actor->int_pos().X - hitActor->int_pos().X) + SQ(actor->int_pos().Y - hitActor->int_pos().Y));
 
     if (dist != 0)
     {
@@ -12482,10 +12482,10 @@ DSWActor* AimHitscanToTarget(DSWActor* actor, int *z, short *ang, int z_ratio)
         xvect = bcos(*ang);
         yvect = bsin(*ang);
 
-        if (hitActor->spr.pos.X - actor->spr.pos.X != 0)
-            *z = Scale(xvect,zh - *z,hitActor->spr.pos.X - actor->spr.pos.X);
-        else if (hitActor->spr.pos.Y - actor->spr.pos.Y != 0)
-            *z = Scale(yvect,zh - *z,hitActor->spr.pos.Y - actor->spr.pos.Y);
+        if (hitActor->int_pos().X - actor->int_pos().X != 0)
+            *z = Scale(xvect,zh - *z,hitActor->int_pos().X - actor->int_pos().X);
+        else if (hitActor->int_pos().Y - actor->int_pos().Y != 0)
+            *z = Scale(yvect,zh - *z,hitActor->int_pos().Y - actor->int_pos().Y);
         else
             *z = 0;
 
@@ -12524,10 +12524,10 @@ DSWActor* WeaponAutoAimHitscan(DSWActor* actor, int *z, short *ang, bool test)
         picked->user.Flags |= (SPR_TARGETED);
         picked->user.Flags |= (SPR_ATTACKED);
 
-        *ang = NORM_ANGLE(getangle(picked->spr.pos.X - actor->spr.pos.X, picked->spr.pos.Y - actor->spr.pos.Y));
+        *ang = NORM_ANGLE(getangle(picked->int_pos().X - actor->int_pos().X, picked->int_pos().Y - actor->int_pos().Y));
 
         // find the distance to the target
-        dist = ksqrt(SQ(actor->spr.pos.X - picked->spr.pos.X) + SQ(actor->spr.pos.Y - picked->spr.pos.Y));
+        dist = ksqrt(SQ(actor->int_pos().X - picked->int_pos().X) + SQ(actor->int_pos().Y - picked->int_pos().Y));
 
         if (dist != 0)
         {
@@ -12536,10 +12536,10 @@ DSWActor* WeaponAutoAimHitscan(DSWActor* actor, int *z, short *ang, bool test)
             xvect = bcos(*ang);
             yvect = bsin(*ang);
 
-            if (picked->spr.pos.X - actor->spr.pos.X != 0)
-                *z = Scale(xvect,zh - *z,picked->spr.pos.X - actor->spr.pos.X);
-            else if (picked->spr.pos.Y - actor->spr.pos.Y != 0)
-                *z = Scale(yvect,zh - *z,picked->spr.pos.Y - actor->spr.pos.Y);
+            if (picked->int_pos().X - actor->int_pos().X != 0)
+                *z = Scale(xvect,zh - *z,picked->int_pos().X - actor->int_pos().X);
+            else if (picked->int_pos().Y - actor->int_pos().Y != 0)
+                *z = Scale(yvect,zh - *z,picked->int_pos().Y - actor->int_pos().Y);
             else
                 *z = 0;
         }
@@ -12557,25 +12557,25 @@ void WeaponHitscanShootFeet(DSWActor* actor, DSWActor* hitActor, int *zvect)
     int z;
     short ang;
 
-    ang = NORM_ANGLE(getangle(hitActor->spr.pos.X - actor->spr.pos.X, hitActor->spr.pos.Y - actor->spr.pos.Y));
+    ang = NORM_ANGLE(getangle(hitActor->int_pos().X - actor->int_pos().X, hitActor->int_pos().Y - actor->int_pos().Y));
 
     // find the distance to the target
-    dist = ksqrt(SQ(actor->spr.pos.X - hitActor->spr.pos.X) + SQ(actor->spr.pos.Y - hitActor->spr.pos.Y));
+    dist = ksqrt(SQ(actor->int_pos().X - hitActor->int_pos().X) + SQ(actor->int_pos().Y - hitActor->int_pos().Y));
 
     if (dist != 0)
     {
         zh = ActorZOfBottom(hitActor) + Z(20);
-        z = actor->spr.pos.Z;
+        z = actor->int_pos().Z;
 
         xvect = bcos(ang);
         yvect = bsin(ang);
 
-        if (hitActor->spr.pos.X - actor->spr.pos.X != 0)
-            //*z = xvect * ((zh - *z)/(hitActor->spr.pos.X - actor->spr.pos.X));
-            *zvect = Scale(xvect,zh - z, hitActor->spr.pos.X - actor->spr.pos.X);
-        else if (hitActor->spr.pos.Y - actor->spr.pos.Y != 0)
-            //*z = yvect * ((zh - *z)/(hitActor->spr.pos.Y - actor->spr.pos.Y));
-            *zvect = Scale(yvect,zh - z, hitActor->spr.pos.Y - actor->spr.pos.Y);
+        if (hitActor->int_pos().X - actor->int_pos().X != 0)
+            //*z = xvect * ((zh - *z)/(hitActor->int_pos().X - actor->int_pos().X));
+            *zvect = Scale(xvect,zh - z, hitActor->int_pos().X - actor->int_pos().X);
+        else if (hitActor->int_pos().Y - actor->int_pos().Y != 0)
+            //*z = yvect * ((zh - *z)/(hitActor->int_pos().Y - actor->int_pos().Y));
+            *zvect = Scale(yvect,zh - z, hitActor->int_pos().Y - actor->int_pos().Y);
         else
             *zvect = 0;
     }
@@ -13178,8 +13178,8 @@ int InitZillaRail(DSWActor* actor)
     // Make sprite shade brighter
     actor->user.Vis = 128;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
 
     nz = ActorZOfTop(actor);
 
@@ -13562,11 +13562,11 @@ int InitEnemyNuke(DSWActor* actor)
     // Make sprite shade brighter
     actor->user.Vis = 128;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
 
     // Spawn a shot
-    nz = actor->spr.pos.Z + Z(40);
+    nz = actor->int_pos().Z + Z(40);
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], actor->sector(),
                     nx, ny, nz, actor->spr.ang, 700);
 
@@ -13654,7 +13654,7 @@ int InitMicro(PLAYER* pp)
         {
             picked = ts->actor;
 
-            ang = getangle(picked->spr.pos.X - nx, picked->spr.pos.Y - ny);
+            ang = getangle(picked->int_pos().X - nx, picked->int_pos().Y - ny);
 
             ts++;
         }
@@ -13726,12 +13726,12 @@ int InitMicro(PLAYER* pp)
 
         if (picked)
         {
-            dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, picked->spr.pos.X, picked->spr.pos.Y);
+            dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, picked->int_pos().X, picked->int_pos().Y);
             if (dist != 0)
             {
                 int zh;
                 zh = ActorZOfTop(picked) + (ActorSizeZ(picked) >> 2);
-                actorNew->spr.zvel = (actorNew->spr.xvel * (zh - actorNew->spr.pos.Z)) / dist;
+                actorNew->spr.zvel = (actorNew->spr.xvel * (zh - actorNew->int_pos().Z)) / dist;
             }
 
             actorNew->user.WpnGoalActor = ts->actor;
@@ -13767,10 +13767,10 @@ int InitRipperSlash(DSWActor* actor)
             if (itActor == actor)
                 break;
 
-            if ((unsigned)FindDistance3D(actor->spr.pos - itActor->spr.pos) > itActor->user.Radius + actor->user.Radius)
+            if ((unsigned)FindDistance3D(actor->int_pos() - itActor->int_pos()) > itActor->user.Radius + actor->user.Radius)
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 600) && FacingRange(itActor, actor,150))
             {
@@ -13798,7 +13798,7 @@ int InitBunnySlash(DSWActor* actor)
             if (itActor == actor)
                 break;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 600) && FacingRange(itActor, actor,150))
             {
@@ -13827,7 +13827,7 @@ int InitSerpSlash(DSWActor* actor)
             if (itActor == actor)
                 break;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 800) && FacingRange(itActor, actor,150))
             {
@@ -13846,8 +13846,8 @@ bool WallSpriteInsideSprite(DSWActor* wactor, DSWActor* actor)
     int dax, day;
     int xsiz, mid_dist;
 
-    x1 = wactor->spr.pos.X;
-    y1 = wactor->spr.pos.Y;
+    x1 = wactor->int_pos().X;
+    y1 = wactor->int_pos().Y;
 
     xoff = (int) tileLeftOffset(wactor->spr.picnum) + (int) wactor->spr.xoffset;
 
@@ -13870,7 +13870,7 @@ bool WallSpriteInsideSprite(DSWActor* wactor, DSWActor* actor)
     y1 -= MulScale(day, mid_dist, 16);
     y2 = y1 + MulScale(day, xsiz, 16);
 
-    return !!clipinsideboxline(actor->spr.pos.X, actor->spr.pos.Y, x1, y1, x2, y2, ((int) actor->spr.clipdist) << 2);
+    return !!clipinsideboxline(actor->int_pos().X, actor->int_pos().Y, x1, y1, x2, y2, ((int) actor->spr.clipdist) << 2);
 }
 
 
@@ -13891,12 +13891,12 @@ int DoBladeDamage(DSWActor* actor)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist > 2000)
                 continue;
 
-            dist = FindDistance3D(actor->spr.pos - itActor->spr.pos);
+            dist = FindDistance3D(actor->int_pos() - itActor->int_pos());
 
             if (dist > 2000)
                 continue;
@@ -13928,12 +13928,12 @@ int DoStaticFlamesDamage(DSWActor* actor)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist > 2000)
                 continue;
 
-            dist = FindDistance3D(actor->spr.pos - itActor->spr.pos);
+            dist = FindDistance3D(actor->int_pos() - itActor->int_pos());
 
             if (dist > 2000)
                 continue;
@@ -13942,7 +13942,7 @@ int DoStaticFlamesDamage(DSWActor* actor)
                 DoDamage(itActor, actor);
             else if (actor->user.Radius > 200)
             {
-                if (FAFcansee(actor->spr.pos.X,actor->spr.pos.Y,ActorZOfMiddle(actor),actor->sector(),itActor->spr.pos.X,itActor->spr.pos.Y,ActorZOfMiddle(itActor),itActor->sector()))
+                if (FAFcansee(actor->int_pos().X,actor->int_pos().Y,ActorZOfMiddle(actor),actor->sector(),itActor->int_pos().X,itActor->int_pos().Y,ActorZOfMiddle(itActor),itActor->sector()))
                     DoDamage(itActor, actor);
             }
         }
@@ -13971,7 +13971,7 @@ int InitCoolgBash(DSWActor* actor)
             if (!(itActor->spr.extra & SPRX_PLAYER_OR_ENEMY))
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 600) && FacingRange(itActor, actor,150))
             {
@@ -13999,7 +13999,7 @@ int InitSkelSlash(DSWActor* actor)
             if (itActor == actor)
                 break;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 600) && FacingRange(itActor, actor,150))
             {
@@ -14027,7 +14027,7 @@ int InitGoroChop(DSWActor* actor)
             if (itActor == actor)
                 break;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 700) && FacingRange(itActor, actor,150))
             {
@@ -14064,10 +14064,10 @@ int InitSerpSpell(DSWActor* actor)
 
     for (i = 0; i < 2; i++)
     {
-        actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+        actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
         auto actorNew = SpawnActor(STAT_MISSILE, SERP_METEOR, &sg_SerpMeteor[0][0], actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 1500);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 1500);
 
         actorNew->set_int_z(ActorZOfTop(actor));
 
@@ -14097,9 +14097,9 @@ int InitSerpSpell(DSWActor* actor)
         actorNew->spr.ang = NORM_ANGLE(actorNew->spr.ang - lat_ang[i]);
 
         // find the distance to the target (player)
-        dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
         if (dist != 0)
-            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
         actorNew->spr.ang = NORM_ANGLE(actorNew->spr.ang + delta_ang[i]);
 
@@ -14123,7 +14123,7 @@ int SpawnDemonFist(DSWActor* actor)
         return -1;
 
     auto expActor = SpawnActor(STAT_MISSILE, 0, s_TeleportEffect, actor->sector(),
-                            actor->spr.pos.X, actor->spr.pos.Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
+                            actor->int_pos().X, actor->int_pos().Y, ActorZOfMiddle(actor), actor->spr.ang, 0);
 
     expActor->spr.hitag = LUMINOUS; //Always full brightness
     expActor->spr.shade = -40;
@@ -14162,10 +14162,10 @@ int InitSerpMonstSpell(DSWActor* actor)
 
     for (i = 0; i < 1; i++)
     {
-        actor->spr.ang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+        actor->spr.ang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
         auto actorNew = SpawnActor(STAT_MISSILE, SERP_METEOR, &sg_SerpMeteor[0][0], actor->sector(),
-                          actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 500);
+                          actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 500);
 
         actorNew->user.spal = actorNew->spr.pal = 25; // Bright Red
         actorNew->set_int_z(ActorZOfTop(actor));
@@ -14195,9 +14195,9 @@ int InitSerpMonstSpell(DSWActor* actor)
         actorNew->spr.ang = NORM_ANGLE(actorNew->spr.ang - lat_ang[i]);
 
         // find the distance to the target (player)
-        dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
         if (dist != 0)
-            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+            actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
         actorNew->spr.ang = NORM_ANGLE(actorNew->spr.ang + delta_ang[i]);
 
@@ -14231,11 +14231,11 @@ int InitEnemyRocket(DSWActor* actor)
     PlaySound(DIGI_NINJARIOTATTACK, actor, v3df_none);
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+    actor->spr.ang = nang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1)-Z(8);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - (ActorSizeZ(actor) >> 1)-Z(8);
 
     // Spawn a shot
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R2, &s_Rocket[0][0], actor->sector(),
@@ -14274,10 +14274,10 @@ int InitEnemyRocket(DSWActor* actor)
     MissileSetPos(actorNew, DoBoltThinMan, 400);
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
     return 0;
 }
@@ -14306,15 +14306,15 @@ int InitEnemyRail(DSWActor* actor)
     PlaySound(DIGI_RAILFIRE, actor, v3df_dontpan|v3df_doppler);
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+    actor->spr.ang = nang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
     // add a bit of randomness
     if (RANDOM_P2(1024) < 512)
         actor->spr.ang = NORM_ANGLE(actor->spr.ang + RANDOM_P2(128) - 64);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1)-Z(8);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - (ActorSizeZ(actor) >> 1)-Z(8);
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -14355,10 +14355,10 @@ int InitEnemyRail(DSWActor* actor)
     }
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
     return 0;
 }
@@ -14382,13 +14382,13 @@ int InitZillaRocket(DSWActor* actor)
     PlaySound(DIGI_NINJARIOTATTACK, actor, v3df_none);
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y);
+    actor->spr.ang = nang = getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y);
 
     for (i = 0; i < (int)SIZ(mp); i++)
     {
-        nx = actor->spr.pos.X;
-        ny = actor->spr.pos.Y;
-        nz = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1)-Z(8);
+        nx = actor->int_pos().X;
+        ny = actor->int_pos().Y;
+        nz = actor->int_pos().Z - (ActorSizeZ(actor) >> 1)-Z(8);
 
         // Spawn a shot
         auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R2, &s_Rocket[0][0], actor->sector(),
@@ -14430,10 +14430,10 @@ int InitZillaRocket(DSWActor* actor)
         MissileSetPos(actorNew, DoBoltThinMan, mp[i].dist_out);
 
         // find the distance to the target (player)
-        dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+        dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
         if (dist != 0)
-            actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+            actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
     }
 
     return 0;
@@ -14444,10 +14444,10 @@ int InitEnemyStar(DSWActor* actor)
     int nx, ny, nz, dist, nang;
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
     nz = ActorZOfMiddle(actor);
 
     // Spawn a shot
@@ -14469,10 +14469,10 @@ int InitEnemyStar(DSWActor* actor)
     MissileSetPos(actorNew, DoStar, 400);
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
     PlaySound(DIGI_STAR, actor, v3df_none);
     return 0;
@@ -14483,10 +14483,10 @@ int InitEnemyCrossbow(DSWActor* actor)
     int nx, ny, nz, dist, nang;
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
     nz = ActorZOfMiddle(actor)-Z(14);
 
     // Spawn a shot
@@ -14513,10 +14513,10 @@ int InitEnemyCrossbow(DSWActor* actor)
     MissileSetPos(actorNew, DoStar, 400);
 
     // find the distance to the target (player)
-    dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
-        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->spr.pos.Z)) / dist;
+        actorNew->user.change.Z = actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - actorNew->int_pos().Z)) / dist;
 
     PlaySound(DIGI_STAR, actor, v3df_none);
 
@@ -14531,11 +14531,11 @@ int InitSkelSpell(DSWActor* actor)
     PlaySound(DIGI_SPELEC, actor, v3df_none);
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - (ActorSizeZ(actor) >> 1);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - (ActorSizeZ(actor) >> 1);
 
     // Spawn a shot
     auto actorNew = SpawnActor(STAT_MISSILE, ELECTRO_ENEMY, s_Electro, actor->sector(),
@@ -14551,7 +14551,7 @@ int InitSkelSpell(DSWActor* actor)
     actorNew->spr.cstat |= (CSTAT_SPRITE_YCENTER);
 
     // find the distance to the target (player)
-    dist = Distance(nx, ny, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(nx, ny, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
         actorNew->spr.zvel = (actorNew->spr.xvel * (ActorUpperZ(actor->user.targetActor) - nz)) / dist;
@@ -14571,12 +14571,12 @@ int InitCoolgFire(DSWActor* actor)
     int nx, ny, nz, dist, nang;
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->spr.pos.X - actor->spr.pos.X, actor->user.targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = nang = NORM_ANGLE(getangle(actor->user.targetActor->int_pos().X - actor->int_pos().X, actor->user.targetActor->int_pos().Y - actor->int_pos().Y));
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
 
-    nz = actor->spr.pos.Z - Z(16);
+    nz = actor->int_pos().Z - Z(16);
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -14604,7 +14604,7 @@ int InitCoolgFire(DSWActor* actor)
     PlaySound(DIGI_MAGIC1, actorNew, v3df_follow|v3df_doppler);
 
     // find the distance to the target (player)
-    dist = Distance(nx, ny, actor->user.targetActor->spr.pos.X, actor->user.targetActor->spr.pos.Y);
+    dist = Distance(nx, ny, actor->user.targetActor->int_pos().X, actor->user.targetActor->int_pos().Y);
 
     if (dist != 0)
         // (velocity * difference between the target and the throwing star) /
@@ -14628,7 +14628,7 @@ int DoCoolgDrip(DSWActor* actor)
     actor->user.Counter += 220;
     actor->add_int_z(actor->user.Counter);
 
-    if (actor->spr.pos.Z > actor->user.loz - actor->user.floor_dist)
+    if (actor->int_pos().Z > actor->user.loz - actor->user.floor_dist)
     {
         actor->set_int_z(actor->user.loz - actor->user.floor_dist);
         actor->spr.yrepeat = actor->spr.xrepeat = 32;
@@ -14644,9 +14644,9 @@ int InitCoolgDrip(DSWActor* actor)
     int nx, ny, nz;
     short w;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     auto actorNew = SpawnActor(STAT_MISSILE, COOLG_DRIP, s_CoolgDrip, actor->sector(),
                     nx, ny, nz, actor->spr.ang, 0);
@@ -14683,9 +14683,9 @@ int GenerateDrips(DSWActor* actor)
             return 1;
         }
 
-        nx = actor->spr.pos.X;
-        ny = actor->spr.pos.Y;
-        nz = actor->spr.pos.Z;
+        nx = actor->int_pos().X;
+        ny = actor->int_pos().Y;
+        nz = actor->int_pos().Z;
 
         auto actorNew = SpawnActor(STAT_SHRAP, COOLG_DRIP, s_CoolgDrip, actor->sector(),
                         nx, ny, nz, actor->spr.ang, 0);
@@ -14722,10 +14722,10 @@ int InitEelFire(DSWActor* actor)
             if (itActor != actor->user.targetActor)
                 continue;
 
-            if ((unsigned)FindDistance3D(actor->spr.pos - itActor->spr.pos) > itActor->user.Radius + actor->user.Radius)
+            if ((unsigned)FindDistance3D(actor->int_pos() - itActor->int_pos()) > itActor->user.Radius + actor->user.Radius)
                 continue;
 
-            DISTANCE(itActor->spr.pos.X, itActor->spr.pos.Y, actor->spr.pos.X, actor->spr.pos.Y, dist, a, b, c);
+            DISTANCE(itActor->int_pos().X, itActor->int_pos().Y, actor->int_pos().X, actor->int_pos().Y, dist, a, b, c);
 
             if (dist < CloseRangeDist(actor, itActor, 600) && FacingRange(itActor, actor,150))
             {
@@ -14747,9 +14747,9 @@ void InitFireballTrap(DSWActor* actor)
 
     PlaySound(DIGI_FIREBALL1, actor, v3df_none);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - ActorSizeZ(actor);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - ActorSizeZ(actor);
 
     // Spawn a shot
     auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL, s_Fireball, actor->sector(), nx, ny, nz,
@@ -14777,9 +14777,9 @@ void InitBoltTrap(DSWActor* actor)
 
     PlaySound(DIGI_RIOTFIRE, actor, v3df_none);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - ActorSizeZ(actor);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - ActorSizeZ(actor);
 
     // Spawn a shot
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], actor->sector(), nx, ny, nz,
@@ -14806,8 +14806,8 @@ void InitSpearTrap(DSWActor* actor)
 {
     int nx, ny, nz;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
     nz = ActorZOfMiddle(actor);
 
     // Spawn a shot
@@ -14923,9 +14923,9 @@ int InitTracerTurret(DSWActor* actor, DSWActor* Operator, fixed_t q16horiz)
 {
     int nx, ny, nz;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z + -MulScale(q16horiz, 72, 16);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z + -MulScale(q16horiz, 72, 16);
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -14970,9 +14970,9 @@ int InitTracerAutoTurret(DSWActor* actor, int xchange, int ychange, int zchange)
 {
     int nx, ny, nz;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -15131,7 +15131,7 @@ bool HitscanSpriteAdjust(DSWActor* actor, walltype* hit_wall)
     auto sect = actor->sector();
 
     Collision coll;
-    auto pos = actor->spr.pos;
+    auto pos = actor->int_pos();
     clipmove(pos, &sect, xvect, yvect, 4, 4 << 8, 4 << 8, CLIPMASK_MISSILE, coll);
     actor->set_int_pos(pos);
 
@@ -15353,7 +15353,7 @@ int InitTankShell(DSWActor* actor, PLAYER* pp)
         PlaySound(DIGI_CANNON, pp, v3df_dontpan|v3df_doppler);
 
     auto actorNew = SpawnActor(STAT_MISSILE, 0, s_TankShell, actor->sector(),
-                    actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, TANK_SHELL_VELOCITY);
+                    actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, TANK_SHELL_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.yrepeat = 8;
@@ -15399,8 +15399,8 @@ int InitTurretMicro(DSWActor* actor, PLAYER* pp)
     if (SW_SHAREWARE) return false; // JBF: verify
 
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
 
     const int MAX_TURRET_MICRO = 10;
 
@@ -15415,7 +15415,7 @@ int InitTurretMicro(DSWActor* actor, PLAYER* pp)
         {
             picked = ts->actor;
 
-            ang = getangle(picked->spr.pos.X - nx, picked->spr.pos.Y - ny);
+            ang = getangle(picked->int_pos().X - nx, picked->int_pos().Y - ny);
 
             ts++;
         }
@@ -15425,7 +15425,7 @@ int InitTurretMicro(DSWActor* actor, PLAYER* pp)
             ang = actor->spr.ang;
         }
 
-        nz = actor->spr.pos.Z;
+        nz = actor->int_pos().Z;
         nz += Z(RandomRange(20)) - Z(10);
 
         // Spawn a shot
@@ -15461,12 +15461,12 @@ int InitTurretMicro(DSWActor* actor, PLAYER* pp)
 
         if (picked)
         {
-            dist = Distance(actorNew->spr.pos.X, actorNew->spr.pos.Y, picked->spr.pos.X, picked->spr.pos.Y);
+            dist = Distance(actorNew->int_pos().X, actorNew->int_pos().Y, picked->int_pos().X, picked->int_pos().Y);
             if (dist != 0)
             {
                 int zh;
                 zh = ActorZOfTop(picked) + (ActorSizeZ(picked) >> 2);
-                actorNew->spr.zvel = (actorNew->spr.xvel * (zh - actorNew->spr.pos.Z)) / dist;
+                actorNew->spr.zvel = (actorNew->spr.xvel * (zh - actorNew->int_pos().Z)) / dist;
             }
 
             actorNew->user.WpnGoalActor = ts->actor;
@@ -15492,7 +15492,7 @@ int InitTurretRocket(DSWActor* actor, PLAYER* pp)
     if (SW_SHAREWARE) return false; // JBF: verify
 
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], actor->sector(),
-                    actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, ROCKET_VELOCITY);
+                    actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, ROCKET_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.yrepeat = 40;
@@ -15529,7 +15529,7 @@ int InitTurretFireball(DSWActor* actor, PLAYER* pp)
     if (SW_SHAREWARE) return false; // JBF: verify
 
     auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL, s_Fireball, actor->sector(),
-                    actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, FIREBALL_VELOCITY);
+                    actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, FIREBALL_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.yrepeat = 40;
@@ -15571,9 +15571,9 @@ int InitTurretRail(DSWActor* actor, PLAYER* pp)
     if (!pp->insector())
         return 0;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -15620,9 +15620,9 @@ int InitTurretLaser(DSWActor* actor, PLAYER* pp)
     if (!pp->insector())
         return 0;
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z;
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -15669,9 +15669,9 @@ int InitSobjMachineGun(DSWActor* actor, PLAYER* pp)
 
     PlaySound(DIGI_BOATFIRE, pp, v3df_dontpan|v3df_doppler);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    daz = nz = actor->spr.pos.Z;
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    daz = nz = actor->int_pos().Z;
 
     if (RANDOM_P2(1024) < 200)
         InitTracerTurret(actor, pp->actor, pp->horizon.horiz.asq16());
@@ -16021,9 +16021,9 @@ int InitTurretMgun(SECTOR_OBJECT* sop)
         if (!actor) continue;
         if (actor->spr.statnum == STAT_SO_SHOOT_POINT)
         {
-            nx = actor->spr.pos.X;
-            ny = actor->spr.pos.Y;
-            daz = nz = actor->spr.pos.Z;
+            nx = actor->int_pos().X;
+            ny = actor->int_pos().Y;
+            daz = nz = actor->int_pos().Z;
 
             // if its not operated by a player
             if (sop->Animator)
@@ -16178,7 +16178,7 @@ int InitEnemyUzi(DSWActor* actor)
     // Make sprite shade brighter
     actor->user.Vis = 128;
 
-    SetActorZ(actor, actor->spr.pos);
+    SetActorZ(actor, actor->int_pos());
 
     if (actor->user.ID == ZILLA_RUN_R0)
     {
@@ -16190,7 +16190,7 @@ int InitEnemyUzi(DSWActor* actor)
         zh = ActorSizeZ(actor);
         zh -= (zh >> 2);
     }
-    daz = actor->spr.pos.Z - zh;
+    daz = actor->int_pos().Z - zh;
 
     if (AimHitscanToTarget(actor, &daz, &daang, 200) != nullptr)
     {
@@ -16212,7 +16212,7 @@ int InitEnemyUzi(DSWActor* actor)
         daang = NORM_ANGLE(actor->spr.ang + (RANDOM_P2(128)) - 64);
     }
 
-    FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - zh, actor->sector(),      // Start position
+    FAFhitscan(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - zh, actor->sector(),      // Start position
                bcos(daang),      // X vector of 3D ang
                bsin(daang),      // Y vector of 3D ang
                daz,              // Z vector of 3D ang
@@ -16418,9 +16418,9 @@ int InitSpriteGrenade(DSWActor* actor)
 
     PlaySound(DIGI_30MMFIRE, actor, v3df_dontpan|v3df_doppler);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - Z(40);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - Z(40);
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -16534,9 +16534,9 @@ int InitEnemyMine(DSWActor* actor)
 
     PlaySound(DIGI_MINETHROW, actor, v3df_dontpan|v3df_doppler);
 
-    nx = actor->spr.pos.X;
-    ny = actor->spr.pos.Y;
-    nz = actor->spr.pos.Z - Z(40);
+    nx = actor->int_pos().X;
+    ny = actor->int_pos().Y;
+    nz = actor->int_pos().Z - Z(40);
 
     // Spawn a shot
     // Inserting and setting up variables
@@ -16683,10 +16683,10 @@ int InitEnemyFireball(DSWActor* actor)
     PlaySound(DIGI_FIREBALL1, actor, v3df_none);
 
     // get angle to player and also face player when attacking
-    actor->spr.ang = NORM_ANGLE(getangle(targetActor->spr.pos.X - actor->spr.pos.X, targetActor->spr.pos.Y - actor->spr.pos.Y));
+    actor->spr.ang = NORM_ANGLE(getangle(targetActor->int_pos().X - actor->int_pos().X, targetActor->int_pos().Y - actor->int_pos().Y));
 
     size_z = Z(ActorSizeY(actor));
-    nz = actor->spr.pos.Z - size_z + (size_z >> 2) + (size_z >> 3) + Z(4);
+    nz = actor->int_pos().Z - size_z + (size_z >> 2) + (size_z >> 3) + Z(4);
 
     xchange = MOVEx(GORO_FIREBALL_VELOCITY, actor->spr.ang);
     ychange = MOVEy(GORO_FIREBALL_VELOCITY, actor->spr.ang);
@@ -16695,7 +16695,7 @@ int InitEnemyFireball(DSWActor* actor)
     for (i = 0; i < 2; i++)
     {
         auto actorNew = SpawnActor(STAT_MISSILE, GORO_FIREBALL, s_Fireball, actor->sector(),
-                        actor->spr.pos.X, actor->spr.pos.Y, nz, actor->spr.ang, GORO_FIREBALL_VELOCITY);
+                        actor->int_pos().X, actor->int_pos().Y, nz, actor->spr.ang, GORO_FIREBALL_VELOCITY);
 
         actorNew->spr.hitag = LUMINOUS; //Always full brightness
         actorNew->spr.xrepeat = 20;
@@ -16718,15 +16718,15 @@ int InitEnemyFireball(DSWActor* actor)
         if (i == 0)
         {
             // find the distance to the target (player)
-            dist = ksqrt(SQ(actorNew->spr.pos.X - targetActor->spr.pos.X) + SQ(actorNew->spr.pos.Y - targetActor->spr.pos.Y));
+            dist = ksqrt(SQ(actorNew->int_pos().X - targetActor->int_pos().X) + SQ(actorNew->int_pos().Y - targetActor->int_pos().Y));
 
             // Determine target Z value
-            targ_z = targetActor->spr.pos.Z - (Z(ActorSizeY(actor)) >> 1);
+            targ_z = targetActor->int_pos().Z - (Z(ActorSizeY(actor)) >> 1);
 
             // (velocity * difference between the target and the throwing star) /
             // distance
             if (dist != 0)
-                actorNew->user.change.Z = actorNew->spr.zvel = (GORO_FIREBALL_VELOCITY * (targ_z - actorNew->spr.pos.Z)) / dist;
+                actorNew->user.change.Z = actorNew->spr.zvel = (GORO_FIREBALL_VELOCITY * (targ_z - actorNew->int_pos().Z)) / dist;
 
             // back up first one
             lastvel = actorNew->spr.zvel;
@@ -16791,12 +16791,12 @@ bool WarpToUnderwater(sectortype** psectu, int *x, int *y, int *z)
     ASSERT(Found);
 
     // get the offset from the sprite
-    sx = overActor->spr.pos.X - *x;
-    sy = overActor->spr.pos.Y - *y;
+    sx = overActor->int_pos().X - *x;
+    sy = overActor->int_pos().Y - *y;
 
     // update to the new x y position
-    *x = underActor->spr.pos.X - sx;
-    *y = underActor->spr.pos.Y - sy;
+    *x = underActor->int_pos().X - sx;
+    *y = underActor->int_pos().Y - sy;
 
     auto over = overActor->sector();
     auto under = underActor->sector();
@@ -16860,12 +16860,12 @@ bool WarpToSurface(sectortype** psectu, int *x, int *y, int *z)
     ASSERT(Found);
 
     // get the offset from the under sprite
-    sx = underActor->spr.pos.X - *x;
-    sy = underActor->spr.pos.Y - *y;
+    sx = underActor->int_pos().X - *x;
+    sy = underActor->int_pos().Y - *y;
 
     // update to the new x y position
-    *x = overActor->spr.pos.X - sx;
-    *y = overActor->spr.pos.Y - sy;
+    *x = overActor->int_pos().X - sx;
+    *y = overActor->int_pos().Y - sy;
 
     auto over = overActor->sector();
     auto under = underActor->sector();
@@ -16926,16 +16926,16 @@ bool SpriteWarpToUnderwater(DSWActor* actor)
     ASSERT(Found);
 
     // get the offset from the sprite
-    sx = overActor->spr.pos.X - actor->spr.pos.X;
-    sy = overActor->spr.pos.Y - actor->spr.pos.Y;
+    sx = overActor->int_pos().X - actor->int_pos().X;
+    sy = overActor->int_pos().Y - actor->int_pos().Y;
 
     // update to the new x y position
-    actor->set_int_xy(underActor->spr.pos.X - sx, underActor->spr.pos.Y - sy);
+    actor->set_int_xy(underActor->int_pos().X - sx, underActor->int_pos().Y - sy);
 
     auto over = overActor->sector();
     auto under = underActor->sector();
 
-    if (GetOverlapSector(actor->spr.pos.X, actor->spr.pos.Y, &over, &under) == 2)
+    if (GetOverlapSector(actor->int_pos().X, actor->int_pos().Y, &over, &under) == 2)
     {
         ChangeActorSect(actor, under);
     }
@@ -16999,16 +16999,16 @@ bool SpriteWarpToSurface(DSWActor* actor)
     if (!Found) return false;
 
     // get the offset from the under sprite
-    sx = underActor->spr.pos.X - actor->spr.pos.X;
-    sy = underActor->spr.pos.Y - actor->spr.pos.Y;
+    sx = underActor->int_pos().X - actor->int_pos().X;
+    sy = underActor->int_pos().Y - actor->int_pos().Y;
 
     // update to the new x y position
-    actor->set_int_xy(overActor->spr.pos.X - sx, overActor->spr.pos.Y - sy);
+    actor->set_int_xy(overActor->int_pos().X - sx, overActor->int_pos().Y - sy);
 
     auto over = overActor->sector();
     auto under = underActor->sector();
 
-    if (GetOverlapSector(actor->spr.pos.X, actor->spr.pos.Y, &over, &under))
+    if (GetOverlapSector(actor->int_pos().X, actor->int_pos().Y, &over, &under))
     {
         ChangeActorSect(actor, over);
     }
@@ -17045,7 +17045,7 @@ int SpawnSplash(DSWActor* actor)
     DoActorZrange(actor);
     MissileWaterAdjust(actor);
 
-    auto actorNew = SpawnActor(STAT_MISSILE, SPLASH, s_Splash, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->user.loz, actor->spr.ang, 0);
+    auto actorNew = SpawnActor(STAT_MISSILE, SPLASH, s_Splash, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->user.loz, actor->spr.ang, 0);
 
     if (sectu && (sectp->extra & SECTFX_LIQUID_MASK) == SECTFX_LIQUID_LAVA)
         actorNew->user.spal = actorNew->spr.pal = PALETTE_RED_LIGHTING;
@@ -17099,11 +17099,11 @@ bool MissileHitDiveArea(DSWActor* actor)
         if (SpriteInDiveArea(actor))
         {
             // make sure you are close to the floor
-            if (actor->spr.pos.Z < ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z < ((actor->user.hiz + actor->user.loz) >> 1))
                 return false;
 
             // Check added by Jim because of sprite bridge over water
-            if (actor->spr.pos.Z < (hit_sect->floorz-Z(20)))
+            if (actor->int_pos().Z < (hit_sect->floorz-Z(20)))
                 return false;
 
             actor->user.Flags |= (SPR_UNDERWATER);
@@ -17116,7 +17116,7 @@ bool MissileHitDiveArea(DSWActor* actor)
         else if (SpriteInUnderwaterArea(actor))
         {
             // make sure you are close to the ceiling
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 return false;
 
             actor->user.Flags &= ~(SPR_UNDERWATER);
@@ -17137,7 +17137,7 @@ DSWActor* SpawnBubble(DSWActor* actor)
     if (Prediction)
         return nullptr;
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BUBBLE, s_Bubble, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+    auto actorNew = SpawnActor(STAT_MISSILE, BUBBLE, s_Bubble, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     actorNew->spr.xrepeat = 8 + (RANDOM_P2(8 << 8) >> 8);
     actorNew->spr.yrepeat = actorNew->spr.xrepeat;
@@ -17174,7 +17174,7 @@ int SpawnVehicleSmoke(DSWActor* actor)
         return false;
 
     auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_VehicleSmoke, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
 
     actorNew->user.WaitTics = 1*120;
     actorNew->spr.shade = -40;
@@ -17200,7 +17200,7 @@ int SpawnVehicleSmoke(DSWActor* actor)
 int SpawnSmokePuff(DSWActor* actor)
 {
     auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_WaterSmoke, actor->sector(),
-                      actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
+                      actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - RANDOM_P2(Z(8)), actor->spr.ang, 0);
 
     actorNew->user.WaitTics = 1*120;
     actorNew->spr.shade = -40;
@@ -17245,7 +17245,7 @@ int DoBubble(DSWActor* actor)
     actor->spr.xrepeat = actor->user.pos.X + (RANDOM_P2(8 << 8) >> 8) - 4;
     actor->spr.yrepeat = actor->user.pos.Y + (RANDOM_P2(8 << 8) >> 8) - 4;
 
-    if (actor->spr.pos.Z < actor->sector()->ceilingz)
+    if (actor->int_pos().Z < actor->sector()->ceilingz)
     {
         if (SectorIsUnderwaterArea(actor->user.hi_sectp))
         {
@@ -17398,7 +17398,7 @@ int QueueStar(DSWActor* actor)
     {
         // move old star to new stars place
         auto osp = StarQueue[StarQueueHead];
-        osp->set_int_pos(actor->spr.pos);
+        osp->set_int_pos(actor->int_pos());
         ChangeActorSect(osp, actor->sector());
         KillActor(actor);
         actor = osp;
@@ -17452,7 +17452,7 @@ void QueueHole(sectortype* hit_sect, walltype* hit_wall, int hit_x, int hit_y, i
     auto sect = spawnedActor->sector();
 
     Collision coll;
-    auto pos = spawnedActor->spr.pos;
+    auto pos = spawnedActor->int_pos();
     clipmove(pos, &sect, nx, ny, 0, 0, 0, CLIPMASK_MISSILE, coll, 1);
     spawnedActor->set_int_pos(pos);
 
@@ -17494,7 +17494,7 @@ int QueueFloorBlood(DSWActor* actor)
         KillActor(FloorBloodQueue[FloorBloodQueueHead]);
 
     FloorBloodQueue[FloorBloodQueueHead] = spawnedActor =
-                                               SpawnActor(STAT_SKIP4, FLOORBLOOD1, s_FloorBlood1, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                               SpawnActor(STAT_SKIP4, FLOORBLOOD1, s_FloorBlood1, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     FloorBloodQueueHead = (FloorBloodQueueHead+1) & (MAX_FLOORBLOOD_QUEUE-1);
 
@@ -17511,7 +17511,7 @@ int QueueFloorBlood(DSWActor* actor)
     spawnedActor->spr.extra = 0;
     spawnedActor->spr.clipdist = 0;
     spawnedActor->spr.xoffset = spawnedActor->spr.yoffset = 0;
-    spawnedActor->set_int_pos(actor->spr.pos);
+    spawnedActor->set_int_pos(actor->int_pos());
     spawnedActor->add_int_z(Z(1));
     spawnedActor->spr.ang = RANDOM_P2(2048); // Just make it any old angle
     spawnedActor->spr.shade -= 5;  // Brighten it up just a bit
@@ -17588,13 +17588,13 @@ int QueueFootPrint(DSWActor* actor)
 
     if (rnd_num > 683)
         FloorBloodQueue[FloorBloodQueueHead] = spawnedActor =
-                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT1, s_FootPrint1, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT1, s_FootPrint1, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     else if (rnd_num > 342)
         FloorBloodQueue[FloorBloodQueueHead] = spawnedActor =
-                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT2, s_FootPrint2, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT2, s_FootPrint2, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     else
         FloorBloodQueue[FloorBloodQueueHead] = spawnedActor =
-                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT3, s_FootPrint3, actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                                   SpawnActor(STAT_WALLBLOOD_QUEUE, FOOTPRINT3, s_FootPrint3, actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
 
     FloorBloodQueueHead = (FloorBloodQueueHead+1) & (MAX_FLOORBLOOD_QUEUE-1);
 
@@ -17612,7 +17612,7 @@ int QueueFootPrint(DSWActor* actor)
     spawnedActor->spr.extra = 0;
     spawnedActor->spr.clipdist = 0;
     spawnedActor->spr.xoffset = spawnedActor->spr.yoffset = 0;
-    spawnedActor->set_int_pos(actor->spr.pos);
+    spawnedActor->set_int_pos(actor->int_pos());
     spawnedActor->spr.ang = actor->spr.ang;
     spawnedActor->user.Flags &= ~(SPR_SHADOW);
     switch (FootMode)
@@ -17684,7 +17684,7 @@ DSWActor* QueueWallBlood(DSWActor* actor, short ang)
     daz -= (Z(128)<<2);
     dang = (ang+(RANDOM_P2(128<<5) >> 5)) - (64);
 
-    FAFhitscan(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z - Z(30), actor->sector(),    // Start position
+    FAFhitscan(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z - Z(30), actor->sector(),    // Start position
                bcos(dang),      // X vector of 3D ang
                bsin(dang),      // Y vector of 3D ang
                daz,              // Z vector of 3D ang
@@ -17694,7 +17694,7 @@ DSWActor* QueueWallBlood(DSWActor* actor, short ang)
         return nullptr;
 
     const int WALLBLOOD_DIST_MAX = 2500;
-    if (Distance(hit.hitpos.X, hit.hitpos.Y, actor->spr.pos.X, actor->spr.pos.Y) > WALLBLOOD_DIST_MAX)
+    if (Distance(hit.hitpos.X, hit.hitpos.Y, actor->int_pos().X, actor->int_pos().Y) > WALLBLOOD_DIST_MAX)
         return nullptr;
 
     // hit a sprite?
@@ -17765,7 +17765,7 @@ DSWActor* QueueWallBlood(DSWActor* actor, short ang)
     auto sect = spawnedActor->sector();
 
     Collision coll;
-    auto pos = spawnedActor->spr.pos;
+    auto pos = spawnedActor->int_pos();
     clipmove(pos, &sect, nx, ny, 0, 0, 0, CLIPMASK_MISSILE, coll, 1);
     spawnedActor->set_int_pos(pos);
 
@@ -17814,7 +17814,7 @@ int DoFloorBlood(DSWActor* actor)
         {
             pp = &Player[pnum];
 
-            DISTANCE(actor->spr.pos.X, actor->spr.pos.Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
+            DISTANCE(actor->int_pos().X, actor->int_pos().Y, pp->pos.X, pp->pos.Y, dist, a, b, c);
 
             if (dist < near_dist)
             {
@@ -17885,7 +17885,7 @@ void QueueGeneric(DSWActor* actor, short pic)
     {
         // move old sprite to new sprite's place
         auto osp = GenericQueue[GenericQueueHead];
-        osp->set_int_pos(actor->spr.pos);
+        osp->set_int_pos(actor->int_pos());
         ChangeActorSect(osp, actor->sector());
         KillActor(actor);
         actor = GenericQueue[GenericQueueHead];
@@ -18012,7 +18012,7 @@ int DoShrapVelocity(DSWActor* actor)
                 else
                 {
                     // hit a sector
-                    if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                    if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                     {
                         // hit a floor
                         if (!(actor->user.Flags & SPR_BOUNCE))
@@ -18041,7 +18041,7 @@ int DoShrapVelocity(DSWActor* actor)
             else
             {
                 // hit floor
-                if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+                if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
                 {
                     actor->set_int_z(actor->user.loz);
                     if (actor->user.Flags & (SPR_UNDERWATER))
@@ -18314,7 +18314,7 @@ int DoItemFly(DSWActor* actor)
         case kHitSector:
         {
             // hit floor
-            if (actor->spr.pos.Z > ((actor->user.hiz + actor->user.loz) >> 1))
+            if (actor->int_pos().Z > ((actor->user.hiz + actor->user.loz) >> 1))
             {
                 actor->set_int_z(actor->user.loz);
                 actor->user.Counter = 0;
@@ -18360,12 +18360,12 @@ void QueueLoWangs(DSWActor* actor)
     {
         LoWangsQueue[LoWangsQueueHead] = spawnedActor =
                                              SpawnActor(STAT_GENERIC_QUEUE, actor->spr.picnum, s_DeadLoWang, actor->sector(),
-                                                         actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+                                                         actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     }
     else
     {
         // move old sprite to new sprite's place
-        SetActorZ(LoWangsQueue[LoWangsQueueHead], actor->spr.pos);
+        SetActorZ(LoWangsQueue[LoWangsQueueHead], actor->int_pos());
         spawnedActor = LoWangsQueue[LoWangsQueueHead];
         ASSERT(spawnedActor->spr.statnum != MAXSTATUS);
     }
diff --git a/source/games/sw/src/weapon.h b/source/games/sw/src/weapon.h
index 4e27358a0..631c6592b 100644
--- a/source/games/sw/src/weapon.h
+++ b/source/games/sw/src/weapon.h
@@ -34,12 +34,12 @@ BEGIN_SW_NS
 
 inline int AngToSprite(DSWActor* actor, DSWActor* other)
 {
-    return (getangle(actor->spr.pos.X - other->spr.pos.X, actor->spr.pos.Y - other->spr.pos.Y));
+    return (getangle(actor->int_pos().X - other->int_pos().X, actor->int_pos().Y - other->int_pos().Y));
 }
 
 inline int AngToPlayer(PLAYER* player, DSWActor* other)
 {
-    return (getangle(player->pos.X - other->spr.pos.X, player->pos.Y - other->spr.pos.Y));
+    return (getangle(player->pos.X - other->int_pos().X, player->pos.Y - other->int_pos().Y));
 }
 
 
diff --git a/source/games/sw/src/zilla.cpp b/source/games/sw/src/zilla.cpp
index 04a5b9a05..bf7af445a 100644
--- a/source/games/sw/src/zilla.cpp
+++ b/source/games/sw/src/zilla.cpp
@@ -636,14 +636,14 @@ int NullZilla(DSWActor* actor)
 #if 0
     if (actor->user.State == s_ZillaDie)
     {
-        getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.y, &actor->user.hiz, &actor->user.loz);
+        getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->spr.y, &actor->user.hiz, &actor->user.loz);
         actor->user.lo_sectp = actor->sector();
         actor->user.hi_sectp = actor->sector();
         actor->spr.z = actor->user.loz;
     }
 #endif
 
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.hiz, &actor->user.loz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.hiz, &actor->user.loz);
     actor->user.lo_sectp = actor->sector();
     actor->user.hi_sectp = actor->sector();
     actor->user.lowActor = nullptr;
@@ -712,7 +712,7 @@ int DoZillaDeathMelt(DSWActor* actor)
     }
 
     //KeepActorOnFloor(actor);
-    getzsofslopeptr(actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, &actor->user.hiz, &actor->user.loz);
+    getzsofslopeptr(actor->sector(), actor->int_pos().X, actor->int_pos().Y, &actor->user.hiz, &actor->user.loz);
     actor->user.lo_sectp = actor->sector();
     actor->user.hi_sectp = actor->sector();
     actor->user.lowActor = nullptr;
diff --git a/source/games/sw/src/zombie.cpp b/source/games/sw/src/zombie.cpp
index 845585d95..1791082e1 100644
--- a/source/games/sw/src/zombie.cpp
+++ b/source/games/sw/src/zombie.cpp
@@ -816,13 +816,13 @@ void SpawnZombie2(DSWActor* actor)
     if (FAF_ConnectArea(actor->sector()))
     {
         auto newsect = actor->sector();
-        updatesectorz(actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z + Z(10), &newsect);
+        updatesectorz(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z + Z(10), &newsect);
         if (SectorIsUnderwaterArea(newsect))
             return;
     }
 
 
-    auto actorNew = SpawnActor(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], actor->sector(), actor->spr.pos.X, actor->spr.pos.Y, actor->spr.pos.Z, actor->spr.ang, 0);
+    auto actorNew = SpawnActor(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], actor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->spr.ang, 0);
     actorNew->user.Counter3 = 0;
     SetOwner(ownerActor, actorNew);
     actorNew->spr.pal = actorNew->user.spal = ownerActor->user.spal;