diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h
index dc4a0254c..f6950cf11 100644
--- a/source/games/duke/src/funct.h
+++ b/source/games/duke/src/funct.h
@@ -202,11 +202,11 @@ void initshell(DDukeActor* actj, DDukeActor* acti, bool isshell);
 void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors);
 int startrts(int lumpNum, int localPlayer);
 
-void pickrandomspot(int pn);
+void pickrandomspot(DDukePlayer* const p);
 void premapcontroller(DDukeActor* ac);
 void resetinventory(DDukePlayer* pn);
 void resetweapons(DDukePlayer* pn);
-void resetprestat(int snum, int g);
+void resetprestat(DDukePlayer* const p, int g);
 void prelevel_common(int g);
 void cacheit();
 
diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp
index 6d405a7c0..65e119937 100644
--- a/source/games/duke/src/player.cpp
+++ b/source/games/duke/src/player.cpp
@@ -1501,7 +1501,7 @@ void playerreset(DDukePlayer* p, DDukeActor* g_ac)
 	{
 		// I am not convinced this is even remotely smart to be executed from here..
 		const auto pact = p->GetActor();
-		pickrandomspot(p->pnum);
+		pickrandomspot(p);
 		g_ac->spr.pos = pact->getPosWithOffsetZ();
 		pact->backuppos();
 		p->setbobpos();
diff --git a/source/games/duke/src/prediction.cpp b/source/games/duke/src/prediction.cpp
index 03826d401..ea929ae4a 100644
--- a/source/games/duke/src/prediction.cpp
+++ b/source/games/duke/src/prediction.cpp
@@ -51,16 +51,18 @@ short myangbak[MOVEFIFOSIZ];
 
 void resetmys()
 {
-	mypos = omypos = getPlayer(myconnectindex)->GetActor()->getPosWithOffsetZ();
+	const auto p = getPlayer(myconnectindex);
+	const auto pact = p->GetActor();
+	mypos = omypos = pact->getPosWithOffsetZ();
 	myxvel = myyvel = myzvel = 0;
-	myang = getPlayer(myconnectindex)->GetActor()->spr.Angles.Yaw;
-	myhoriz = omyhoriz = getPlayer(myconnectindex)->GetActor()->spr.Angles.Pitch;
-	myhorizoff = omyhorizoff = getPlayer(myconnectindex)->Angles.ViewAngles.Pitch;
-	mycursectnum = sectindex(getPlayer(myconnectindex)->cursector);
-	myjumpingcounter = getPlayer(myconnectindex)->jumping_counter;
-	myjumpingtoggle = getPlayer(myconnectindex)->jumping_toggle;
-	myonground = getPlayer(myconnectindex)->on_ground;
-	myhardlanding = getPlayer(myconnectindex)->hard_landing;
+	myang = pact->spr.Angles.Yaw;
+	myhoriz = omyhoriz = pact->spr.Angles.Pitch;
+	myhorizoff = omyhorizoff = p->Angles.ViewAngles.Pitch;
+	mycursectnum = sectindex(p->cursector);
+	myjumpingcounter = p->jumping_counter;
+	myjumpingtoggle = p->jumping_toggle;
+	myonground = p->on_ground;
+	myhardlanding = p->hard_landing;
 }
 
 #if 0 // todo: fix this when networking works again
diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp
index c31d774ef..0d9ea2db9 100644
--- a/source/games/duke/src/premap.cpp
+++ b/source/games/duke/src/premap.cpp
@@ -58,21 +58,15 @@ void premapcontroller(DDukeActor* ac)
 //
 //---------------------------------------------------------------------------
 
-void pickrandomspot(int snum)
+void pickrandomspot(DDukePlayer* const p)
 {
-	DDukePlayer* p;
-	int i;
+	const auto pact = p->GetActor();
+	const int i = (ud.multimode > 1 && ud.coop != 1) ? (krand() % numplayersprites) : p->pnum;
 
-	p = getPlayer(snum);
-
-	if( ud.multimode > 1 && ud.coop != 1)
-		i = krand()%numplayersprites;
-	else i = snum;
-
-	p->GetActor()->spr.pos = po[i].opos;
-	p->GetActor()->backuppos();
+	pact->spr.pos = po[i].opos;
+	pact->backuppos();
 	p->setbobpos();
-	p->GetActor()->PrevAngles.Yaw = p->GetActor()->spr.Angles.Yaw = po[i].oa;
+	pact->PrevAngles.Yaw = pact->spr.Angles.Yaw = po[i].oa;
 	p->setCursector(po[i].os);
 }
 
@@ -369,12 +363,8 @@ void resetinventory(DDukePlayer* p)
 //
 //---------------------------------------------------------------------------
 
-void resetprestat(int snum,int g)
+void resetprestat(DDukePlayer* const p, int g)
 {
-	DDukePlayer* p;
-
-	p = getPlayer(snum);
-
 	spriteqloc = 0;
 	for(auto& p : spriteq) p = nullptr;
 
@@ -651,7 +641,8 @@ void prelevel_common(int g)
 	// RRRA E2L1 fog handling.
 	ud.fogactive = 0;
 
-	resetprestat(0, g);
+	const auto firstp = getPlayer(0);
+	resetprestat(firstp, g);
 	numclouds = 0;
 
 	memset(geosectorwarp, -1, sizeof(geosectorwarp));
@@ -676,8 +667,8 @@ void prelevel_common(int g)
 			if (tilesurface(sectp->ceilingtexture) == TSURF_SCROLLSKY && numclouds < 127)
 				clouds[numclouds++] = sectp;
 
-			if (getPlayer(0)->one_parallax_sectnum == nullptr)
-				getPlayer(0)->one_parallax_sectnum = sectp;
+			if (firstp->one_parallax_sectnum == nullptr)
+				firstp->one_parallax_sectnum = sectp;
 		}
 
 		if (sectp->lotag == 32767) //Found a secret room
@@ -688,7 +679,7 @@ void prelevel_common(int g)
 
 		if (sectp->lotag == -1)
 		{
-			getPlayer(0)->Exit = sectp->walls[0].pos;
+			firstp->Exit = sectp->walls[0].pos;
 			continue;
 		}
 	}
@@ -1117,8 +1108,9 @@ static void clearfrags(void)
 {
 	for (int i = 0; i < ud.multimode; i++)
 	{
-		getPlayer(i)->frag = getPlayer(i)->fraggedself = 0;
-		memset(getPlayer(i)->frags, 0, sizeof(getPlayer(i)->frags));
+		const auto p = getPlayer(i);
+		p->frag = p->fraggedself = 0;
+		memset(p->frags, 0, sizeof(p->frags));
 	}
 }
 
@@ -1147,9 +1139,7 @@ void enterlevel(MapRecord *mi, int gamemode)
 	FX_StopAllSounds();
 	S_SetReverb(0);
 
-	auto p = getPlayer(0);
-
-	LoadTheMap(mi, p, gamemode);
+	LoadTheMap(mi, getPlayer(0), gamemode);
 
 	// Try this first so that it can disable the CD player if no tracks are found.
 	if (isRR())
@@ -1162,23 +1152,23 @@ void enterlevel(MapRecord *mi, int gamemode)
 
 	for (int i = connecthead; i >= 0; i = connectpoint2[i])
 	{
+		const auto p = getPlayer(i);
 		bool clearweapon = !!(currentLevel->flags & LEVEL_CLEARWEAPONS);
-		auto pn = getPlayer(i)->GetActor()->sector()->floortexture;
-		if (tileflags(pn) & TFLAG_CLEARINVENTORY)
+		if (tileflags(p->GetActor()->sector()->floortexture) & TFLAG_CLEARINVENTORY)
 		{
-			resetinventory(getPlayer(i));
+			resetinventory(p);
 			clearweapon = true;
 		}
 		if (clearweapon)
 		{
-			resetweapons(getPlayer(i));
-			getPlayer(i)->gotweapon[PISTOL_WEAPON] = false;
-			getPlayer(i)->ammo_amount[PISTOL_WEAPON] = 0;
-			getPlayer(i)->curr_weapon = KNEE_WEAPON;
-			getPlayer(i)->kickback_pic = 0;
-			getPlayer(i)->okickback_pic = getPlayer(i)->kickback_pic = 0;
+			resetweapons(p);
+			p->gotweapon[PISTOL_WEAPON] = false;
+			p->ammo_amount[PISTOL_WEAPON] = 0;
+			p->curr_weapon = KNEE_WEAPON;
+			p->kickback_pic = 0;
+			p->okickback_pic = p->kickback_pic = 0;
 		}
-		if (currentLevel->flags & LEVEL_CLEARINVENTORY) resetinventory(getPlayer(i));
+		if (currentLevel->flags & LEVEL_CLEARINVENTORY) resetinventory(p);
 	}
 	resetmys();
 
@@ -1206,8 +1196,9 @@ void GameInterface::NewGame(MapRecord* map, int skill, bool)
 {
 	for (int i = 0; i != -1; i = connectpoint2[i])
 	{
-		resetweapons(getPlayer(i));
-		resetinventory(getPlayer(i));
+		const auto p = getPlayer(i);
+		resetweapons(p);
+		resetinventory(p);
 	}
 
 	getPlayer(0)->last_extra = gs.max_player_health;