diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp
index bab23660c..2d1c98b53 100644
--- a/source/games/duke/src/actors.cpp
+++ b/source/games/duke/src/actors.cpp
@@ -384,7 +384,7 @@ void movedummyplayers(void)
 
 void moveplayers(void)
 {
-	int otherx;
+	double other;
 
 	DukeStatIterator iti(STAT_PLAYER);
 	while (auto act = iti.Next())
@@ -404,14 +404,14 @@ void moveplayers(void)
 			else
 			{
 				if (ud.multimode > 1)
-					otherp = findotherplayer(pn, &otherx);
+					otherp = findotherplayer(pn, &other);
 				else
 				{
 					otherp = pn;
-					otherx = 0;
+					other = 0;
 				}
 
-				execute(act, pn, otherx);
+				execute(act, pn, other * worldtoint);
 
 				if (ud.multimode > 1)
 				{
@@ -420,7 +420,7 @@ void moveplayers(void)
 					{
 						if (act->spr.yrepeat > 32 && psp->spr.yrepeat < 32)
 						{
-							if (otherx < 1400 && p->knee_incs == 0)
+							if (other < 1400/16. && p->knee_incs == 0)
 							{
 								p->knee_incs = 1;
 								p->weapon_pos = -1;
@@ -501,7 +501,7 @@ void moveplayers(void)
 			}
 			else
 			{
-				act->set_int_ang(2047 - (p->angle.ang.Buildang()));
+				act->spr.angle = DAngle360 - minAngle - p->angle.ang;
 				SetActor(act, act->spr.pos);
 			}
 		}
@@ -3066,7 +3066,7 @@ void handle_se30(DDukeActor *actor, int JIBS6)
 				DukeSectIterator it(Owner->sector());
 				while (auto a2 = it.Next())
 				{
-					if (a2->spr.statnum == 1 && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS)
+					if (a2->spr.statnum == STAT_ACTOR && badguy(a2) && a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS)
 					{
 						//					if(a2->spr.sector != actor->spr.sector)
 						{
@@ -4127,7 +4127,7 @@ void handle_se20(DDukeActor* actor)
 		DukeSectIterator it(actor->sector());
 		while (auto a2 = it.Next())
 		{
-			if (a2->spr.statnum != 3 && a2->vel.Z == 0)
+			if (a2->spr.statnum != STAT_EFFECTOR && a2->vel.Z == 0)
 			{
 				actor->spr.pos += vec;
 				if (a2->sector()->floorstat & CSTAT_SECTOR_SLOPE)
diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h
index c32fdfbc6..dfbc16cbe 100644
--- a/source/games/duke/src/funct.h
+++ b/source/games/duke/src/funct.h
@@ -130,7 +130,7 @@ void playerAimDown(int snum, ESyncBits actions);
 void tracers(int x1, int y1, int z1, int x2, int y2, int z2, int n);
 DDukeActor* aim(DDukeActor* s, int aang);
 void checkweapons(player_struct* const p);
-int findotherplayer(int p, int* d);
+int findotherplayer(int p, double* d);
 void quickkill(player_struct* p);
 int setpal(player_struct* p);
 int madenoise(int playerNum);
@@ -140,11 +140,13 @@ void shootbloodsplat(DDukeActor* i, int p, int sx, int sy, int sz, int sa, int a
 void breakwall(int newpn, DDukeActor* spr, walltype* dawallnum);
 int callsound(sectortype* sectnum,DDukeActor* snum, bool endstate = false);
 int hitasprite(DDukeActor* snum,DDukeActor **hitSprite);
-int findplayer(const DDukeActor* s, int* dist);
-inline int findplayer(const DDukeActor* s, double* dist)
+int findplayer(const DDukeActor* s, double* dist);
+
+inline int findplayer(const DDukeActor* s, int* dist)
 {
-	int dd, p = findplayer(s, &dd);
-	*dist = dd * inttoworld;
+	double dd;
+	int p = findplayer(s, &dd);
+	*dist = dd * worldtoint;
 	return p;
 }
 void operatejaildoors(int hitag);
diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp
index 482c69943..77668dca3 100644
--- a/source/games/duke/src/sectors.cpp
+++ b/source/games/duke/src/sectors.cpp
@@ -219,24 +219,24 @@ bool isanearoperator(int lotag)
 //
 //---------------------------------------------------------------------------
 
-int findplayer(const DDukeActor* actor, int* d)
+int findplayer(const DDukeActor* actor, double* d)
 {
 	int j, closest_player;
-	int x, closest;
-	const auto s = actor->int_pos();
+	int x;
+	const auto s = actor->spr.pos;
 
 	if (ud.multimode < 2)
 	{
-		if (d) *d = abs(ps[myconnectindex].player_int_opos().X - s.X) + abs(ps[myconnectindex].player_int_opos().Y - s.Y) + ((abs(ps[myconnectindex].player_int_opos().Z - s.Z + (28 << 8))) >> 4);
+		if (d) *d = abs(ps[myconnectindex].opos.X - s.X) + abs(ps[myconnectindex].opos.Y - s.Y) + abs(ps[myconnectindex].opos.Z - s.Z + 28);
 		return myconnectindex;
 	}
 
-	closest = 0x7fffffff;
+	double closest = 0x7fffffff;
 	closest_player = 0;
 
 	for (j = connecthead; j >= 0; j = connectpoint2[j])
 	{
-		x = abs(ps[j].player_int_opos().X - s.X) + abs(ps[j].player_int_opos().Y - s.Y) + ((abs(ps[j].player_int_opos().Z - s.Z + (28 << 8))) >> 4);
+		x = abs(ps[j].opos.X - s.X) + abs(ps[j].opos.Y - s.Y) + abs(ps[j].opos.Z - s.Z + 28);
 		if (x < closest && ps[j].GetActor()->spr.extra > 0)
 		{
 			closest_player = j;
@@ -254,18 +254,18 @@ int findplayer(const DDukeActor* actor, int* d)
 //
 //---------------------------------------------------------------------------
 
-int findotherplayer(int p, int* d)
+int findotherplayer(int p, double* d)
 {
 	int j, closest_player;
-	int x, closest;
+	int x;
 
-	closest = 0x7fffffff;
+	double closest = 0x7fffffff;
 	closest_player = p;
 
 	for (j = connecthead; j >= 0; j = connectpoint2[j])
 		if (p != j && ps[j].GetActor()->spr.extra > 0)
 		{
-			x = abs(ps[j].player_int_opos().X - ps[p].player_int_pos().X) + abs(ps[j].player_int_opos().Y - ps[p].player_int_pos().Y) + (abs(ps[j].player_int_opos().Z - ps[p].player_int_pos().Z) >> 4);
+			x = abs(ps[j].opos.X - ps[p].pos.X) + abs(ps[j].opos.Y - ps[p].pos.Y) + abs(ps[j].opos.Z - ps[p].pos.Z);
 
 			if (x < closest)
 			{