diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp
index 97f526574..d247b6c6a 100644
--- a/source/games/duke/src/actors.cpp
+++ b/source/games/duke/src/actors.cpp
@@ -978,6 +978,91 @@ void hitradius(DDukeActor* actor, int  r, int  hp1, int  hp2, int  hp3, int  hp4
 	}
 }
 
+//---------------------------------------------------------------------------
+//
+// 
+//
+//---------------------------------------------------------------------------
+
+
+int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result)
+{
+	int bg = badguy(actor);
+
+	if (actor->spr.statnum == STAT_MISC || (bg && actor->spr.scale.X < 0.0625))
+	{
+		actor->spr.pos += change;
+		if (bg)
+			SetActor(actor, actor->spr.pos);
+		return result.setNone();
+	}
+
+	auto dasectp = actor->sector();
+
+	auto ppos = actor->spr.pos;
+
+	auto tex = TexMan.GetGameTexture(actor->spr.spritetexture());
+	ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5;
+
+	if (bg)
+	{
+		if (actor->spr.scale.X > 0.9375)
+			clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result);
+		else
+		{
+			// todo: move this mess to the actor definitions once we have them all available.
+			double clipdist = actor->FloatVar(NAME_moveclipdist);
+			if (clipdist == 0)
+			{
+				if ((actor->flags1 & SFLAG_BADGUY) && !isRR())
+					clipdist = actor->clipdist;
+				else
+					clipdist = 12;
+			}
+
+			clipmove(ppos, &dasectp, change * 0.5, clipdist, 4., 4., cliptype, result);
+		}
+
+		// conditional code from hell...
+		if (dasectp == nullptr || (dasectp != nullptr &&
+			((actor->actorstayput != nullptr && actor->actorstayput != dasectp) ||
+				((actor->flags3 & SFLAG3_ST3CONFINED) && actor->spr.pal == 0 && dasectp->lotag != ST_3_BOSS2) ||
+				((actor->flags3 & SFLAG3_DONTENTERWATER) && dasectp->lotag == ST_1_ABOVE_WATER) ||
+				((actor->flags3 & SFLAG3_DONTENTERWATERONGROUND) && actor->vel.Z == 0 && dasectp->lotag == ST_1_ABOVE_WATER))
+			)
+			)
+		{
+			if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER && (actor->flags3 & SFLAG3_RANDOMANGLEONWATER))
+				actor->spr.Angles.Yaw = randomAngle();
+			else if ((actor->counter & 3) == 1 && !(actor->flags3 & SFLAG3_NORANDOMANGLEWHENBLOCKED))
+				actor->spr.Angles.Yaw = randomAngle();
+			SetActor(actor, actor->spr.pos);
+			if (dasectp == nullptr) dasectp = &sector[0];
+			return result.setSector(dasectp);
+		}
+		if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle90 + DAngle45;
+	}
+	else
+	{
+		if (actor->spr.statnum == STAT_PROJECTILE)
+			clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result);
+		else
+			clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result);
+	}
+	actor->spr.pos.XY() = ppos.XY();
+
+	if (dasectp != nullptr && dasectp != actor->sector())
+		ChangeActorSect(actor, dasectp);
+
+	double daz = actor->spr.pos.Z + change.Z * 0.5;
+	if (daz > actor->ceilingz && daz <= actor->floorz)
+		actor->spr.pos.Z = daz;
+	else if (result.type == kHitNone)
+		return result.setSector(dasectp);
+
+	return result.type;
+}
+
 //---------------------------------------------------------------------------
 //
 // Rotating sector
diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp
index ce389bd4f..e1485c8a8 100644
--- a/source/games/duke/src/actors_d.cpp
+++ b/source/games/duke/src/actors_d.cpp
@@ -141,90 +141,6 @@ int ifsquished(DDukeActor* actor, int p)
 	return false;
 }
 
-//---------------------------------------------------------------------------
-//
-// 
-//
-//---------------------------------------------------------------------------
-
-
-int movesprite_ex_d(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision &result)
-{
-	int bg = badguy(actor);
-
-	if (actor->spr.statnum == STAT_MISC || (bg && actor->spr.scale.X < 0.0625))
-	{
-		actor->spr.pos += change;
-		if (bg)
-			SetActor(actor, actor->spr.pos);
-		return result.setNone();
-	}
-
-	auto dasectp = actor->sector();
-
-	auto ppos = actor->spr.pos;
-
-	auto tex = TexMan.GetGameTexture(actor->spr.spritetexture());
-	ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5;
-
-	if (bg)
-	{
-		if (actor->spr.scale.X > 0.9375 )
-			clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result);
-		else 
-		{
-			// todo: move this mess to the actor definitions once we have them all available.
-			double clipdist = actor->FloatVar(NAME_moveclipdist);
-			if (clipdist == 0)
-			{
-				if ((actor->flags1 & SFLAG_BADGUY) && !isRR())
-					clipdist = actor->clipdist;
-				else
-					clipdist = 12;
-			}
-
-			clipmove(ppos, &dasectp, change * 0.5, clipdist, 4., 4., cliptype, result);
-		}
-
-		// conditional code from hell...
-		if (dasectp == nullptr || (dasectp != nullptr &&
-			((actor->actorstayput != nullptr && actor->actorstayput != dasectp) ||
-			 ((actor->flags3 & SFLAG3_ST3CONFINED) && actor->spr.pal == 0 && dasectp->lotag != ST_3_BOSS2) ||
-			 ((actor->flags3 & SFLAG3_DONTENTERWATER) && dasectp->lotag == ST_1_ABOVE_WATER) ||
-			 ((actor->flags3 & SFLAG3_DONTENTERWATERONGROUND) && actor->vel.Z == 0 && dasectp->lotag == ST_1_ABOVE_WATER))
-			)
-		 )
-		{
-			if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER && (actor->flags3 & SFLAG3_RANDOMANGLEONWATER))
-				actor->spr.Angles.Yaw = randomAngle();
-			else if ((actor->counter&3) == 1 && !(actor->flags3 & SFLAG3_NORANDOMANGLEWHENBLOCKED))
-				actor->spr.Angles.Yaw = randomAngle();
-			SetActor(actor,actor->spr.pos);
-			if (dasectp == nullptr) dasectp = &sector[0];
-			return result.setSector(dasectp);
-		}
-		if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle90 + DAngle45;
-	}
-	else
-	{
-		if (actor->spr.statnum == STAT_PROJECTILE)
-			clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result);
-		else
-			clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result);
-	}
-	actor->spr.pos.XY() = ppos.XY();
-
-	if (dasectp != nullptr && dasectp != actor->sector())
-		ChangeActorSect(actor, dasectp);
-
-	double daz = actor->spr.pos.Z + change.Z * 0.5;
-	if (daz > actor->ceilingz && daz <= actor->floorz)
-		actor->spr.pos.Z = daz;
-	else if (result.type == kHitNone)
-		return result.setSector(dasectp);
-
-	return result.type;
-}
 //---------------------------------------------------------------------------
 //
 //
diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp
index a6dbd630d..9720006ce 100644
--- a/source/games/duke/src/actors_r.cpp
+++ b/source/games/duke/src/actors_r.cpp
@@ -140,72 +140,6 @@ void addweapon_r(player_struct* p, int weapon, bool wswitch)
 	}
 }
 
-//---------------------------------------------------------------------------
-//
-// 
-//
-//---------------------------------------------------------------------------
-
-int movesprite_ex_r(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision &result)
-{
-	int bg = badguy(actor);
-
-	if (actor->spr.statnum == 5 || (bg && actor->spr.scale.X < 0.0625))
-	{
-		actor->spr.pos += change;
-		if (bg)
-			SetActor(actor, actor->spr.pos);
-		return result.setNone();
-	}
-
-	auto dasectp = actor->sector();
-
-	auto ppos = actor->spr.pos;
-	auto tex = TexMan.GetGameTexture(actor->spr.spritetexture());
-	ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5;
-
-	if (bg)
-	{
-		if (actor->spr.scale.X > 0.9375 )
-			clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result);
-		else
-		{
-			clipmove(ppos, &dasectp, change * 0.5, 12., 4., 4., cliptype, result);
-		}
-
-		if (dasectp == nullptr || (dasectp != nullptr && actor->actorstayput != nullptr && actor->actorstayput != dasectp))
-		{
-			if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER)
-				actor->spr.Angles.Yaw = randomAngle();
-			else if ((actor->counter & 3) == 1)
-				actor->spr.Angles.Yaw = randomAngle();
-			SetActor(actor, actor->spr.pos);
-			if (dasectp == nullptr) dasectp = &sector[0];
-			return result.setSector(dasectp);
-		}
-		if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle45 + DAngle90;
-	}
-	else
-	{
-		if (actor->spr.statnum == STAT_PROJECTILE)
-			clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result);
-		else
-			clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result);
-	}
-	actor->spr.pos.XY() = ppos.XY();
-
-	if (dasectp)
-		if ((dasectp != actor->sector()))
-			ChangeActorSect(actor, dasectp);
-	double daz = actor->spr.pos.Z + change.Z * 0.5;
-	if (daz > actor->ceilingz && daz <= actor->floorz)
-		actor->spr.pos.Z = daz;
-	else if (result.type == kHitNone)
-		return result.setSector(dasectp);
-
-	return result.type;
-}
-
 //---------------------------------------------------------------------------
 //
 //
diff --git a/source/games/duke/src/dukeactor.h b/source/games/duke/src/dukeactor.h
index d6a916512..d8228c304 100644
--- a/source/games/duke/src/dukeactor.h
+++ b/source/games/duke/src/dukeactor.h
@@ -33,16 +33,4 @@ inline int bossguy(const DDukeActor* pSprite)
 	return !!(pSprite->flags1 & SFLAG_BOSS);
 }
 
-// old interface versions of already changed functions
-
-int movesprite_ex_d(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result);
-int movesprite_ex_r(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result);
-
-inline int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result)
-{
-	auto f = isRR() ? movesprite_ex_r : movesprite_ex_d;
-	return f(actor, change, cliptype, result);
-}
-
-
 END_DUKE_NS
diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h
index fe9668e4a..0c7679e9d 100644
--- a/source/games/duke/src/funct.h
+++ b/source/games/duke/src/funct.h
@@ -41,6 +41,7 @@ void clearcameras(player_struct* p);
 void RANDOMSCRAP(DDukeActor* i);
 void detonate(DDukeActor* i, PClassActor* explosion);
 void hitradius(DDukeActor* i, int  r, int  hp1, int  hp2, int  hp3, int  hp4);
+int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result);
 void lotsofstuff(DDukeActor* s, int n, PClassActor* spawntype);
 void watersplash2(DDukeActor* i);
 bool money(DDukeActor* i, int BLOODPOOL);