diff --git a/source/core/gameinput.cpp b/source/core/gameinput.cpp
index 3d535003b..7b863da45 100644
--- a/source/core/gameinput.cpp
+++ b/source/core/gameinput.cpp
@@ -238,7 +238,7 @@ void PlayerAngles::applyYaw(float const avel, ESyncBits* actions, double const s
 	if (!lockedYaw())
 	{
 		// add player's input
-		ZzANGLE += DAngle::fromDeg(avel);
+		ZzANGLE() += DAngle::fromDeg(avel);
 
 		if (*actions & SB_TURNAROUND)
 		{
@@ -261,7 +261,7 @@ void PlayerAngles::applyYaw(float const avel, ESyncBits* actions, double const s
 				add -= YawSpin;
 				YawSpin = nullAngle;
 			}
-			ZzANGLE += add;
+			ZzANGLE() += add;
 		}
 	}
 	else
@@ -334,7 +334,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerAngles& w, P
 {
 	if (arc.BeginObject(keyname))
 	{
-		arc("ang", w.ZzANGLE)
+		arc("ang", w.ZzANGLE())
 			("lookang", w.ZzLOOKANG)
 			("rotscrnang", w.ZzROTSCRNANG)
 			("spin", w.YawSpin)
@@ -347,7 +347,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerAngles& w, P
 
 		if (arc.isReading())
 		{
-			w.ZzOLDANGLE = w.ZzANGLE;
+			w.ZzOLDANGLE = w.ZzANGLE();
 			w.ZzOLDLOOKANG = w.ZzLOOKANG;
 			w.ZzOLDROTSCRNANG = w.ZzROTSCRNANG;
 			w.legacyDisabledYaw = w.legacyDisabledYaw;
diff --git a/source/core/gameinput.h b/source/core/gameinput.h
index bee77e400..aa6d1614d 100644
--- a/source/core/gameinput.h
+++ b/source/core/gameinput.h
@@ -13,6 +13,8 @@ struct PlayerAngles
 	DAngle& ZzHORIZON() { return thisHoriz; }
 	DAngle prevHoriz;
 	DAngle& ZzOLDHORIZON() { return prevHoriz; }
+	DAngle thisAngle;
+	DAngle& ZzANGLE() { return thisAngle; }
 
 	friend FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerAngles& w, PlayerAngles* def);
 
@@ -71,7 +73,7 @@ struct PlayerAngles
 		}
 		else
 		{
-			ZzANGLE += value;
+			ZzANGLE() += value;
 		}
 	}
 
@@ -83,8 +85,8 @@ struct PlayerAngles
 		}
 		else
 		{
-			ZzANGLE = value;
-			if (backup) ZzOLDANGLE = ZzANGLE;
+			ZzANGLE() = value;
+			if (backup) ZzOLDANGLE = ZzANGLE();
 		}
 	}
 
@@ -144,44 +146,44 @@ struct PlayerAngles
 	DAngle horizLERPSUM(double const interpfrac) { return interpolatedvalue(horizOLDSUM(), horizSUM(), interpfrac); }
 	void resetAdjustmentPitch() { legacyAdjustmentPitch = nullAngle; }
 
-	DAngle ZzANGLE, ZzOLDANGLE, ZzLOOKANG, ZzOLDLOOKANG, ZzROTSCRNANG, ZzOLDROTSCRNANG, YawSpin;
+	DAngle ZzOLDANGLE, ZzLOOKANG, ZzOLDLOOKANG, ZzROTSCRNANG, ZzOLDROTSCRNANG, YawSpin;
 	void processLegacyHelperYaw(double const scaleAdjust)
 	{
 		if (targetedYaw())
 		{
-			auto delta = deltaangle(ZzANGLE, legacyTargetYaw);
+			auto delta = deltaangle(ZzANGLE(), legacyTargetYaw);
 
 			if (abs(delta) > DAngleBuildToDeg)
 			{
-				ZzANGLE += delta * scaleAdjust;
+				ZzANGLE() += delta * scaleAdjust;
 			}
 			else
 			{
-				ZzANGLE = legacyTargetYaw;
+				ZzANGLE() = legacyTargetYaw;
 				legacyTargetYaw = nullAngle;
 			}
 		}
 		else if (legacyAdjustmentYaw.Sgn())
 		{
-			ZzANGLE += legacyAdjustmentYaw * scaleAdjust;
+			ZzANGLE() += legacyAdjustmentYaw * scaleAdjust;
 		}
 	}
 	void backupYaw()
 	{
-		ZzOLDANGLE = ZzANGLE;
+		ZzOLDANGLE = ZzANGLE();
 		ZzOLDLOOKANG = ZzLOOKANG;
 		ZzOLDROTSCRNANG = ZzROTSCRNANG;
 	}
 	void restoreYaw()
 	{
-		ZzANGLE = ZzOLDANGLE;
+		ZzANGLE() = ZzOLDANGLE;
 		ZzLOOKANG = ZzOLDLOOKANG;
 		ZzROTSCRNANG = ZzOLDROTSCRNANG;
 	}
 	DAngle angOLDSUM() { return ZzOLDANGLE + ZzOLDLOOKANG; }
-	DAngle angSUM() { return ZzANGLE + ZzLOOKANG; }
+	DAngle angSUM() { return ZzANGLE() + ZzLOOKANG; }
 	DAngle angLERPSUM(double const interpfrac) { return interpolatedvalue(angOLDSUM(), angSUM(), interpfrac); }
-	DAngle angLERPANG(double const interpfrac) { return interpolatedvalue(ZzOLDANGLE, ZzANGLE, interpfrac); }
+	DAngle angLERPANG(double const interpfrac) { return interpolatedvalue(ZzOLDANGLE, ZzANGLE(), interpfrac); }
 	DAngle angLERPLOOKANG(double const interpfrac) { return interpolatedvalue(ZzOLDLOOKANG, ZzLOOKANG, interpfrac); }
 	DAngle angLERPROTSCRN(double const interpfrac) { return interpolatedvalue(ZzOLDROTSCRNANG, ZzROTSCRNANG, interpfrac); }
 	DAngle angRENDERLOOKANG(double const interpfrac) { return !SyncInput() ? ZzLOOKANG : angLERPLOOKANG(interpfrac); }
diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp
index bca2ad5f5..ffe2f5157 100644
--- a/source/games/blood/src/nnexts.cpp
+++ b/source/games/blood/src/nnexts.cpp
@@ -9278,7 +9278,7 @@ void changeSpriteAngle(DBloodActor* pSpr, DAngle nAng)
 	{
 		PLAYER* pPlayer = getPlayerById(pSpr->spr.type);
 		if (pPlayer)
-			pPlayer->Angles.ZzANGLE = nAng;
+			pPlayer->Angles.ZzANGLE() = nAng;
 		else
 		{
 			pSpr->spr.Angles.Yaw = nAng;
diff --git a/source/games/blood/src/osdcmd.cpp b/source/games/blood/src/osdcmd.cpp
index bf686d93e..625006620 100644
--- a/source/games/blood/src/osdcmd.cpp
+++ b/source/games/blood/src/osdcmd.cpp
@@ -40,7 +40,7 @@ void GameInterface::WarpToCoords(double x, double y, double z, DAngle ang)
 
 	if (ang != DAngle::fromDeg(INT_MIN))
 	{
-		pPlayer->Angles.ZzOLDANGLE = pPlayer->Angles.ZzANGLE = ang;
+		pPlayer->Angles.ZzOLDANGLE = pPlayer->Angles.ZzANGLE() = ang;
 	}
 }
 
diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp
index 6a09749fb..aa2e432c2 100644
--- a/source/games/blood/src/player.cpp
+++ b/source/games/blood/src/player.cpp
@@ -813,7 +813,7 @@ void playerStart(int nPlayer, int bNewLevel)
 	GetActorExtents(actor, &top, &bottom);
 	actor->spr.pos.Z -= bottom - actor->spr.pos.Z;
 	actor->spr.pal = 11 + (pPlayer->teamId & 3);
-	actor->spr.Angles.Yaw = pPlayer->Angles.ZzANGLE = pStartZone->angle; // check me out later.
+	actor->spr.Angles.Yaw = pPlayer->Angles.ZzANGLE() = pStartZone->angle; // check me out later.
 	actor->spr.type = kDudePlayer1 + nPlayer;
 	actor->clipdist = pDudeInfo->fClipdist();
 	actor->spr.flags = 15;
@@ -1500,7 +1500,7 @@ int ActionScan(PLAYER* pPlayer, HitInfo* out)
 
 void UpdatePlayerSpriteAngle(PLAYER* pPlayer)
 {
-	pPlayer->actor->spr.Angles.Yaw = pPlayer->Angles.ZzANGLE; // check me out later.
+	pPlayer->actor->spr.Angles.Yaw = pPlayer->Angles.ZzANGLE(); // check me out later.
 }
 
 //---------------------------------------------------------------------------
@@ -1555,7 +1555,7 @@ void ProcessInput(PLAYER* pPlayer)
 		DBloodActor* fragger = pPlayer->fragger;
 		if (fragger)
 		{
-			pPlayer->Angles.addYaw(deltaangle(pPlayer->Angles.ZzANGLE, (fragger->spr.pos.XY() - actor->spr.pos.XY()).Angle()));
+			pPlayer->Angles.addYaw(deltaangle(pPlayer->Angles.ZzANGLE(), (fragger->spr.pos.XY() - actor->spr.pos.XY()).Angle()));
 		}
 		pPlayer->deathTime += 4;
 		if (!bSeqStat)
diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp
index ec7d78d8d..181f11655 100644
--- a/source/games/duke/src/actors.cpp
+++ b/source/games/duke/src/actors.cpp
@@ -362,7 +362,7 @@ void movedummyplayers(void)
 			{
 				act->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
 				act->spr.pos.Z = act->sector()->ceilingz + 27;
-				act->spr.Angles.Yaw = ps[p].Angles.ZzANGLE; // check me out later.
+				act->spr.Angles.Yaw = ps[p].Angles.ZzANGLE(); // check me out later.
 				if (act->temp_data[0] == 8)
 					act->temp_data[0] = 0;
 				else act->temp_data[0]++;
@@ -442,7 +442,7 @@ void moveplayers(void)
 
 				if (p->actorsqu != nullptr)
 				{
-					p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE, (p->actorsqu->spr.pos.XY() - p->GetActor()->spr.pos.XY()).Angle()) * 0.25);
+					p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE(), (p->actorsqu->spr.pos.XY() - p->GetActor()->spr.pos.XY()).Angle()) * 0.25);
 				}
 
 				if (act->spr.extra > 0)
@@ -462,10 +462,10 @@ void moveplayers(void)
 
 					if (p->wackedbyactor != nullptr && p->wackedbyactor->spr.statnum < MAXSTATUS)
 					{
-						p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE, (p->wackedbyactor->spr.pos.XY() - p->GetActor()->spr.pos.XY()).Angle()) * 0.5);
+						p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE(), (p->wackedbyactor->spr.pos.XY() - p->GetActor()->spr.pos.XY()).Angle()) * 0.5);
 					}
 				}
-				act->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+				act->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 			}
 		}
 		else
@@ -499,13 +499,13 @@ void moveplayers(void)
 			if (act->spr.extra < 8)
 			{
 				act->vel.X = 8;
-				act->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+				act->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 				act->spr.extra++;
 				ssp(act, CLIPMASK0);
 			}
 			else
 			{
-				act->spr.Angles.Yaw = DAngle360 - minAngle - p->Angles.ZzANGLE; // check me out later.
+				act->spr.Angles.Yaw = DAngle360 - minAngle - p->Angles.ZzANGLE(); // check me out later.
 				SetActor(act, act->spr.pos);
 			}
 		}
@@ -787,7 +787,7 @@ bool queball(DDukeActor *actor, int pocket, int queball, int stripeball)
 		{
 			//						if(actor->spr.pal == 12)
 			{
-				auto delta = absangle(ps[p].Angles.ZzANGLE, (actor->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
+				auto delta = absangle(ps[p].Angles.ZzANGLE(), (actor->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
 				if (delta < DAngle22_5 / 2 && PlayerInput(p, SB_OPEN))
 					if (ps[p].toggle_key_flag == 1)
 					{
@@ -797,7 +797,7 @@ bool queball(DDukeActor *actor, int pocket, int queball, int stripeball)
 						{
 							if (act2->spr.picnum == queball || act2->spr.picnum == stripeball)
 							{
-								delta = absangle(ps[p].Angles.ZzANGLE, (act2->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
+								delta = absangle(ps[p].Angles.ZzANGLE(), (act2->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
 								if (delta < DAngle22_5 / 2)
 								{
 									double l;
@@ -811,7 +811,7 @@ bool queball(DDukeActor *actor, int pocket, int queball, int stripeball)
 							if (actor->spr.pal == 12)
 								actor->vel.X = 10.25;
 							else actor->vel.X = 8.75;
-							actor->spr.Angles.Yaw = ps[p].Angles.ZzANGLE; // check me out later.
+							actor->spr.Angles.Yaw = ps[p].Angles.ZzANGLE(); // check me out later.
 							ps[p].toggle_key_flag = 2;
 						}
 					}
diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp
index d76b8b23d..d642190c4 100644
--- a/source/games/duke/src/actors_d.cpp
+++ b/source/games/duke/src/actors_d.cpp
@@ -1334,7 +1334,7 @@ void movetransports_d(void)
 								ps[k].GetActor()->spr.extra = 0;
 							}
 
-							ps[p].Angles.ZzANGLE = Owner->spr.Angles.Yaw; // check me out later.
+							ps[p].Angles.ZzANGLE() = Owner->spr.Angles.Yaw; // check me out later.
 
 							if (Owner->GetOwner() != Owner)
 							{
@@ -1663,7 +1663,7 @@ static void greenslime(DDukeActor *actor)
 		}
 		else if (xx < 64 && ps[p].quick_kick == 0)
 		{
-			auto ang = absangle(ps[p].Angles.ZzANGLE, (actor->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
+			auto ang = absangle(ps[p].Angles.ZzANGLE(), (actor->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY()).Angle());
 			if (ang < DAngle22_5)
 				ps[p].quick_kick = 14;
 		}
@@ -1685,7 +1685,7 @@ static void greenslime(DDukeActor *actor)
 
 		SetActor(actor, actor->spr.pos);
 
-		actor->spr.Angles.Yaw = ps[p].Angles.ZzANGLE; // check me out later.
+		actor->spr.Angles.Yaw = ps[p].Angles.ZzANGLE(); // check me out later.
 
 		if ((PlayerInput(p, SB_FIRE) || (ps[p].quick_kick > 0)) && ps[p].GetActor()->spr.extra > 0)
 			if (ps[p].quick_kick > 0 || (ps[p].curr_weapon != HANDREMOTE_WEAPON && ps[p].curr_weapon != HANDBOMB_WEAPON && ps[p].curr_weapon != TRIPBOMB_WEAPON && ps[p].ammo_amount[ps[p].curr_weapon] >= 0))
@@ -1768,7 +1768,7 @@ static void greenslime(DDukeActor *actor)
 
 		double add = (BobVal(actor->temp_data[1]) * 2) * REPEAT_SCALE;
 		actor->spr.scale = DVector2(0.3125 + add, 0.234375 + add);
-		actor->spr.pos.XY() = ps[p].GetActor()->spr.pos.XY() + ps[p].Angles.ZzANGLE.ToVector() * 8;
+		actor->spr.pos.XY() = ps[p].GetActor()->spr.pos.XY() + ps[p].Angles.ZzANGLE().ToVector() * 8;
 		return;
 	}
 
diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp
index b2160ac56..348461074 100644
--- a/source/games/duke/src/actors_r.cpp
+++ b/source/games/duke/src/actors_r.cpp
@@ -1222,7 +1222,7 @@ void movetransports_r(void)
 									ps[k].GetActor()->spr.extra = 0;
 								}
 
-							ps[p].Angles.ZzANGLE = Owner->spr.Angles.Yaw; // check me out later.
+							ps[p].Angles.ZzANGLE() = Owner->spr.Angles.Yaw; // check me out later.
 
 							if (Owner->GetOwner() != Owner)
 							{
@@ -1945,7 +1945,7 @@ void rr_specialstats()
 				{
 					if (act2->spr.picnum == RRTELEPORTDEST)
 					{
-						ps[p].Angles.ZzANGLE = act2->spr.Angles.Yaw; // check me out later.
+						ps[p].Angles.ZzANGLE() = act2->spr.Angles.Yaw; // check me out later.
 						ps[p].GetActor()->spr.pos = act2->spr.pos.plusZ(-36 + gs.playerheight);
 						ps[p].GetActor()->backuppos();
 						ps[p].setbobpos();
diff --git a/source/games/duke/src/ccmds.cpp b/source/games/duke/src/ccmds.cpp
index 2e6ecdf3d..7624fde59 100644
--- a/source/games/duke/src/ccmds.cpp
+++ b/source/games/duke/src/ccmds.cpp
@@ -123,7 +123,7 @@ void GameInterface::WarpToCoords(double x, double y, double z, DAngle ang)
 
 	if (ang != DAngle::fromDeg(INT_MIN))
 	{
-		p->Angles.ZzOLDANGLE = p->Angles.ZzANGLE = ang;
+		p->Angles.ZzOLDANGLE = p->Angles.ZzANGLE() = ang;
 	}
 }
 
diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp
index ab5f80931..ce0d0107e 100644
--- a/source/games/duke/src/game_misc.cpp
+++ b/source/games/duke/src/game_misc.cpp
@@ -274,7 +274,7 @@ void drawoverlays(double interpfrac)
 				else
 				{
 					cposxy = interpolatedvalue(pp->GetActor()->getPrevPosWithOffsetZ(), pp->GetActor()->getPosWithOffsetZ(), interpfrac).XY();
-					cang = !SyncInput() ? pp->Angles.ZzANGLE : interpolatedvalue(pp->Angles.ZzOLDANGLE, pp->Angles.ZzANGLE, interpfrac);
+					cang = !SyncInput() ? pp->Angles.ZzANGLE() : interpolatedvalue(pp->Angles.ZzOLDANGLE, pp->Angles.ZzANGLE(), interpfrac);
 				}
 			}
 			else
diff --git a/source/games/duke/src/gameexec.cpp b/source/games/duke/src/gameexec.cpp
index 3d5469b61..597361d3c 100644
--- a/source/games/duke/src/gameexec.cpp
+++ b/source/games/duke/src/gameexec.cpp
@@ -473,7 +473,7 @@ void DoPlayer(bool bSet, int lVar1, int lLabelID, int lVar2, DDukeActor* sActor,
 
 	case PLAYER_ANG:
 		if (bSet) ps[iPlayer].Angles.setYaw(mapangle(lValue));
-		else SetGameVarID(lVar2, ps[iPlayer].Angles.ZzANGLE.Buildang(), sActor, sPlayer);
+		else SetGameVarID(lVar2, ps[iPlayer].Angles.ZzANGLE().Buildang(), sActor, sPlayer);
 		break;
 
 	case PLAYER_OANG:
@@ -2432,9 +2432,9 @@ int ParseState::parse(void)
 			{
 				DAngle ang;
 				if (g_ac->isPlayer() && ud.multimode > 1)
-					ang = absangle(ps[otherp].Angles.ZzANGLE, (ps[g_p].GetActor()->spr.pos.XY() - ps[otherp].GetActor()->spr.pos.XY()).Angle());
+					ang = absangle(ps[otherp].Angles.ZzANGLE(), (ps[g_p].GetActor()->spr.pos.XY() - ps[otherp].GetActor()->spr.pos.XY()).Angle());
 				else
-					ang = absangle(ps[g_p].Angles.ZzANGLE, (g_ac->spr.pos.XY() - ps[g_p].GetActor()->spr.pos.XY()).Angle());
+					ang = absangle(ps[g_p].Angles.ZzANGLE(), (g_ac->spr.pos.XY() - ps[g_p].GetActor()->spr.pos.XY()).Angle());
 
 				j = ang < DAngle22_5;
 			}
@@ -2455,7 +2455,7 @@ int ParseState::parse(void)
 	case concmd_slapplayer:
 		insptr++;
 		forceplayerangle(g_p);
-		ps[g_p].vel.XY() -= ps[g_p].Angles.ZzANGLE.ToVector() * 8;
+		ps[g_p].vel.XY() -= ps[g_p].Angles.ZzANGLE().ToVector() * 8;
 		return 0;
 	case concmd_wackplayer:
 		insptr++;
@@ -2463,7 +2463,7 @@ int ParseState::parse(void)
 			forceplayerangle(g_p);
 		else
 		{
-			ps[g_p].vel.XY() -= ps[g_p].Angles.ZzANGLE.ToVector() * 64;
+			ps[g_p].vel.XY() -= ps[g_p].Angles.ZzANGLE().ToVector() * 64;
 			ps[g_p].jumping_counter = 767;
 			ps[g_p].jumping_toggle = 1;
 		}
@@ -2833,7 +2833,7 @@ int ParseState::parse(void)
 	case concmd_ifangdiffl:
 		{
 		insptr++;
-		auto ang = absangle(ps[g_p].Angles.ZzANGLE, g_ac->spr.Angles.Yaw); // check me out later.
+		auto ang = absangle(ps[g_p].Angles.ZzANGLE(), g_ac->spr.Angles.Yaw); // check me out later.
 		parseifelse( ang <= mapangle(*insptr));
 		break;
 		}
@@ -3131,7 +3131,7 @@ int ParseState::parse(void)
 		int i;
 		insptr++;
 		i = *(insptr++);	// ID of def
-		SetGameVarID(i, ps[g_p].Angles.ZzANGLE.Buildang(), g_ac, g_p);
+		SetGameVarID(i, ps[g_p].Angles.ZzANGLE().Buildang(), g_ac, g_p);
 		break;
 	}
 	case concmd_setplayerangle:
@@ -3139,7 +3139,7 @@ int ParseState::parse(void)
 		int i;
 		insptr++;
 		i = *(insptr++);	// ID of def
-		ps[g_p].Angles.ZzANGLE = mapangle(GetGameVarID(i, g_ac, g_p).safeValue() & 2047);
+		ps[g_p].Angles.ZzANGLE() = mapangle(GetGameVarID(i, g_ac, g_p).safeValue() & 2047);
 		break;
 	}
 	case concmd_getactorangle:
diff --git a/source/games/duke/src/inlines.h b/source/games/duke/src/inlines.h
index 76e683e2a..11af3ad00 100644
--- a/source/games/duke/src/inlines.h
+++ b/source/games/duke/src/inlines.h
@@ -211,7 +211,7 @@ inline bool playrunning()
 inline void doslopetilting(player_struct* p, double const scaleAdjust = 1)
 {
 	bool const canslopetilt = p->on_ground && p->insector() && p->cursector->lotag != ST_2_UNDERWATER && (p->cursector->floorstat & CSTAT_SECTOR_SLOPE);
-	p->Angles.doViewPitch(p->GetActor()->spr.pos.XY(), p->Angles.ZzANGLE, p->aim_mode == 0, canslopetilt, p->cursector, scaleAdjust);
+	p->Angles.doViewPitch(p->GetActor()->spr.pos.XY(), p->Angles.ZzANGLE(), p->aim_mode == 0, canslopetilt, p->cursector, scaleAdjust);
 }
 
 //---------------------------------------------------------------------------
diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp
index 13d41d821..b6225f698 100644
--- a/source/games/duke/src/input.cpp
+++ b/source/games/duke/src/input.cpp
@@ -284,7 +284,7 @@ void hud_input(int plnum)
 							p->inven_icon = 3;
 
 							auto pactor =
-								CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ().plusZ(30), TILE_APLAYER, -64, DVector2(0, 0), p->Angles.ZzANGLE, 0., 0., nullptr, 10);
+								CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ().plusZ(30), TILE_APLAYER, -64, DVector2(0, 0), p->Angles.ZzANGLE(), 0., 0., nullptr, 10);
 							pactor->temp_data[3] = pactor->temp_data[4] = 0;
 							p->holoduke_on = pactor;
 							pactor->spr.yint = plnum;
@@ -843,13 +843,13 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
 
 		p->Angles.processLegacyHelperYaw(scaleAdjust);
 		p->Angles.processLegacyHelperPitch(scaleAdjust);
-		p->GetActor()->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+		p->GetActor()->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 	}
 
 	if (packet)
 	{
 		*packet = loc;
-		auto velvect = DVector2(loc.fvel, loc.svel).Rotated(p->Angles.ZzANGLE) + p->fric;
+		auto velvect = DVector2(loc.fvel, loc.svel).Rotated(p->Angles.ZzANGLE()) + p->fric;
 		packet->fvel = (float)velvect.X;
 		packet->svel = (float)velvect.Y;
 		loc = {};
diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp
index 5c26bdf7d..ac05225a4 100644
--- a/source/games/duke/src/player.cpp
+++ b/source/games/duke/src/player.cpp
@@ -211,7 +211,7 @@ double hitawall(player_struct* p, walltype** hitw)
 {
 	HitInfo hit{};
 
-	hitscan(p->GetActor()->getPosWithOffsetZ(), p->cursector, DVector3(p->Angles.ZzANGLE.ToVector() * 1024, 0), hit, CLIPMASK0);
+	hitscan(p->GetActor()->getPosWithOffsetZ(), p->cursector, DVector3(p->Angles.ZzANGLE().ToVector() * 1024, 0), hit, CLIPMASK0);
 	if (hitw) *hitw = hit.hitWall;
 
 	return (hit.hitpos.XY() - p->GetActor()->spr.pos.XY()).Length();
diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp
index 70f75b603..5ec4e299f 100644
--- a/source/games/duke/src/player_d.cpp
+++ b/source/games/duke/src/player_d.cpp
@@ -294,7 +294,7 @@ static void shootknee(DDukeActor* actor, int p, DVector3 pos, DAngle ang)
 			if (splash)
 			{
 				splash->spr.pos.XY() = hit.hitpos.XY();
-				splash->spr.Angles.Yaw = ps[p].Angles.ZzANGLE; // check me out later. // Total tweek
+				splash->spr.Angles.Yaw = ps[p].Angles.ZzANGLE(); // check me out later. // Total tweek
 				splash->vel.X = 2;
 				ssp(actor, CLIPMASK0);
 				splash->vel.X = 0;
@@ -1071,7 +1071,7 @@ void shoot_d(DDukeActor* actor, int atwith)
 	if (actor->isPlayer())
 	{
 		spos = ps[p].GetActor()->getPosWithOffsetZ().plusZ(ps[p].pyoff + 4);
-		sang = ps[p].Angles.ZzANGLE;
+		sang = ps[p].Angles.ZzANGLE();
 
 		ps[p].crack_time = CRACK_TIME;
 
@@ -1992,7 +1992,7 @@ static void underwater(int snum, ESyncBits actions, double floorz, double ceilin
 		auto j = spawn(pact, WATERBUBBLE);
 		if (j)
 		{
-			j->spr.pos += (p->Angles.ZzANGLE.ToVector() + DVector2(4 - (global_random & 8), 4 - (global_random & 8))) * 16;
+			j->spr.pos += (p->Angles.ZzANGLE().ToVector() + DVector2(4 - (global_random & 8), 4 - (global_random & 8))) * 16;
 			j->spr.scale = DVector2(0.046875, 0.3125);
 			j->spr.pos.Z = p->GetActor()->getOffsetZ() + 8;
 		}
@@ -2012,7 +2012,7 @@ int operateTripbomb(int snum)
 	double vel = 1024, zvel = 0;
 	setFreeAimVelocity(vel, zvel, p->Angles.horizSUM(), 16.);
 
-	hitscan(p->GetActor()->getPosWithOffsetZ(), p->cursector, DVector3(p->Angles.ZzANGLE.ToVector() * vel, zvel), hit, CLIPMASK1);
+	hitscan(p->GetActor()->getPosWithOffsetZ(), p->cursector, DVector3(p->Angles.ZzANGLE().ToVector() * vel, zvel), hit, CLIPMASK1);
 
 	if (hit.hitSector == nullptr || hit.actor())
 		return 0;
@@ -2209,8 +2209,8 @@ static void operateweapon(int snum, ESyncBits actions)
 				zvel -= 4;
 			}
 
-			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 16, HEAVYHBOMB, -16, DVector2(0.140625, 0.140625),
-				p->Angles.ZzANGLE, vel + p->hbomb_hold_delay * 2, zvel, pact, 1);
+			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 16, HEAVYHBOMB, -16, DVector2(0.140625, 0.140625),
+				p->Angles.ZzANGLE(), vel + p->hbomb_hold_delay * 2, zvel, pact, 1);
 
 			if (isNam())
 			{
diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp
index ba6466620..ff99c653b 100644
--- a/source/games/duke/src/player_r.cpp
+++ b/source/games/duke/src/player_r.cpp
@@ -185,7 +185,7 @@ static void shootmelee(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int a
 			if (splash)
 			{
 				splash->spr.pos.XY() = hit.hitpos.XY();
-				splash->spr.Angles.Yaw = ps[p].Angles.ZzANGLE; // check me out later. // Total tweek
+				splash->spr.Angles.Yaw = ps[p].Angles.ZzANGLE(); // check me out later. // Total tweek
 				splash->vel.X = 2;
 				ssp(actor, 0);
 				splash->vel.X = 0;
@@ -822,7 +822,7 @@ void shoot_r(DDukeActor* actor, int atwith)
 	{
 		p = actor->PlayerIndex();
 		spos = ps[p].GetActor()->getPosWithOffsetZ().plusZ(ps[p].pyoff + 4);
-		sang = ps[p].Angles.ZzANGLE;
+		sang = ps[p].Angles.ZzANGLE();
 
 		if (isRRRA()) ps[p].crack_time = CRACK_TIME;
 	}
@@ -1283,7 +1283,7 @@ int doincrements_r(player_struct* p)
 		{
 			p->noise_radius = 1024;
 			madenoise(screenpeek);
-			p->vel.XY() += p->Angles.ZzANGLE.ToVector();
+			p->vel.XY() += p->Angles.ZzANGLE().ToVector();
 		}
 		p->eat -= 4;
 		if (p->eat < 0)
@@ -1467,7 +1467,7 @@ void checkweapons_r(player_struct* p)
 			auto j = spawn(p->GetActor(), 7220);
 			if (j)
 			{
-				j->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+				j->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 				j->saved_ammo = p->ammo_amount[MOTORCYCLE_WEAPON];
 			}
 			p->OnMotorcycle = 0;
@@ -1486,7 +1486,7 @@ void checkweapons_r(player_struct* p)
 			auto j = spawn(p->GetActor(), 7233);
 			if (j)
 			{
-				j->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+				j->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 				j->saved_ammo = p->ammo_amount[BOAT_WEAPON];
 			}
 			p->OnBoat = 0;
@@ -1764,15 +1764,15 @@ static void onMotorcycle(int snum, ESyncBits &actions)
 			}
 		}
 
-		p->vel.XY() += (p->Angles.ZzANGLE + velAdjustment).ToVector() * currSpeed;
-		p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE, p->Angles.ZzANGLE - DAngle::fromBam(angAdjustment)));
+		p->vel.XY() += (p->Angles.ZzANGLE() + velAdjustment).ToVector() * currSpeed;
+		p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE(), p->Angles.ZzANGLE() - DAngle::fromBam(angAdjustment)));
 	}
 	else if (p->MotoSpeed >= 20 && p->on_ground == 1 && (p->moto_on_mud || p->moto_on_oil))
 	{
 		rng = krand() & 1;
 		velAdjustment = rng == 0 ? -adjust : adjust;
 		currSpeed = MulScale(currSpeed, p->moto_on_oil ? 10 : 5, 7);
-		p->vel.XY() += (p->Angles.ZzANGLE + velAdjustment).ToVector() * currSpeed;
+		p->vel.XY() += (p->Angles.ZzANGLE() + velAdjustment).ToVector() * currSpeed;
 	}
 
 	p->moto_on_mud = p->moto_on_oil = 0;
@@ -2008,8 +2008,8 @@ static void onBoat(int snum, ESyncBits &actions)
 			angAdjustment >>= 6;
 		}
 
-		p->vel.XY() += (p->Angles.ZzANGLE + velAdjustment).ToVector() * currSpeed;
-		p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE, p->Angles.ZzANGLE - DAngle::fromBam(angAdjustment)));
+		p->vel.XY() += (p->Angles.ZzANGLE() + velAdjustment).ToVector() * currSpeed;
+		p->Angles.addYaw(deltaangle(p->Angles.ZzANGLE(), p->Angles.ZzANGLE() - DAngle::fromBam(angAdjustment)));
 	}
 	if (p->NotOnWater && p->MotoSpeed > 50)
 		p->MotoSpeed -= (p->MotoSpeed / 2.);
@@ -2311,7 +2311,7 @@ static void underwater(int snum, ESyncBits actions, double floorz, double ceilin
 		auto j = spawn(pact, WATERBUBBLE);
 		if (j)
 		{
-			j->spr.pos += (p->Angles.ZzANGLE.ToVector() + DVector2(12 - (global_random & 8), 12 - (global_random & 8))) * 16;
+			j->spr.pos += (p->Angles.ZzANGLE().ToVector() + DVector2(12 - (global_random & 8), 12 - (global_random & 8))) * 16;
 			j->spr.scale = DVector2(0.046875, 0.03125);
 			j->spr.pos.Z = p->GetActor()->getOffsetZ() + 8;
 			j->spr.cstat = CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_TRANSLUCENT;
@@ -2329,7 +2329,7 @@ void onMotorcycleMove(int snum, walltype* wal)
 {
 	auto p = &ps[snum];
 	auto pact = p->GetActor();
-	double angleDelta = absangle(p->Angles.ZzANGLE, wal->delta().Angle()).Degrees();
+	double angleDelta = absangle(p->Angles.ZzANGLE(), wal->delta().Angle()).Degrees();
 	double damageAmount = p->MotoSpeed * p->MotoSpeed;
 
 	const double scale = (180. / 2048.);
@@ -2385,7 +2385,7 @@ void onBoatMove(int snum, int psectlotag, walltype* wal)
 {
 	auto p = &ps[snum];
 	auto pact = p->GetActor();
-	double angleDelta = absangle(p->Angles.ZzANGLE, wal->delta().Angle()).Degrees();
+	double angleDelta = absangle(p->Angles.ZzANGLE(), wal->delta().Angle()).Degrees();
 
 	const double scale = (90. / 2048.);
 	p->Angles.addYaw(DAngle::fromDeg(p->MotoSpeed * (krand() & 1 ? -scale : scale)));
@@ -2433,7 +2433,7 @@ void onMotorcycleHit(int snum, DDukeActor* victim)
 			if (numplayers == 1)
 			{
 				Collision coll;
-				DAngle ang = DAngle::fromBuild(p->TiltStatus * 20) + p->Angles.ZzANGLE;
+				DAngle ang = DAngle::fromBuild(p->TiltStatus * 20) + p->Angles.ZzANGLE();
 				movesprite_ex(victim, DVector3(ang.ToVector() * 4, victim->vel.Z), CLIPMASK0, coll);
 			}
 		}
@@ -2467,7 +2467,7 @@ void onBoatHit(int snum, DDukeActor* victim)
 			if (numplayers == 1)
 			{
 				Collision coll;
-				DAngle ang = DAngle::fromBuild(p->TiltStatus * 20) + p->Angles.ZzANGLE;
+				DAngle ang = DAngle::fromBuild(p->TiltStatus * 20) + p->Angles.ZzANGLE();
 				movesprite_ex(victim, DVector3(ang.ToVector() * 2, victim->vel.Z), CLIPMASK0, coll);
 			}
 		}
@@ -2683,8 +2683,8 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 				zvel -= 4;
 			}
 
-			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 16, DYNAMITE, -16, DVector2(0.140625, 0.140625),
-				p->Angles.ZzANGLE, (vel + p->hbomb_hold_delay * 2) * 2, zvel, pact, 1);
+			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 16, DYNAMITE, -16, DVector2(0.140625, 0.140625),
+				p->Angles.ZzANGLE(), (vel + p->hbomb_hold_delay * 2) * 2, zvel, pact, 1);
 
 			if (spawned)
 			{
@@ -2735,7 +2735,7 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 			p->visibility = 0;
 			if (psectlotag != 857)
 			{
-				p->vel.XY() -= p->Angles.ZzANGLE.ToVector();
+				p->vel.XY() -= p->Angles.ZzANGLE().ToVector();
 			}
 		}
 		else if (p->kickback_pic == 2)
@@ -2834,12 +2834,12 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 
 				if (psectlotag != 857)
 				{
-					p->vel.XY() -= p->Angles.ZzANGLE.ToVector() * 2;
+					p->vel.XY() -= p->Angles.ZzANGLE().ToVector() * 2;
 				}
 			}
 			else if (psectlotag != 857)
 			{
-				p->vel.XY() -= p->Angles.ZzANGLE.ToVector();
+				p->vel.XY() -= p->Angles.ZzANGLE().ToVector();
 			}
 		}
 
@@ -2925,7 +2925,7 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 
 				if (psectlotag != 857)
 				{
-					p->vel.XY() -= p->Angles.ZzANGLE.ToVector();
+					p->vel.XY() -= p->Angles.ZzANGLE().ToVector();
 				}
 				checkavailweapon(p);
 
@@ -3065,7 +3065,7 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 		}
 		else if (p->kickback_pic == 12)
 		{
-			p->vel.XY() -= p->Angles.ZzANGLE.ToVector();
+			p->vel.XY() -= p->Angles.ZzANGLE().ToVector();
 			p->Angles.addPitch(DAngle::fromDeg(-8.88));
 			p->recoil += 20;
 		}
@@ -3091,7 +3091,7 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 				zvel -= 4;
 			}
 
-			CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 16, POWDERKEG, -16, DVector2(0.140625, 0.140625), p->Angles.ZzANGLE, vel * 2, zvel, pact, 1);
+			CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 16, POWDERKEG, -16, DVector2(0.140625, 0.140625), p->Angles.ZzANGLE(), vel * 2, zvel, pact, 1);
 		}
 		p->kickback_pic++;
 		if (p->kickback_pic > 20)
@@ -3112,7 +3112,7 @@ static void operateweapon(int snum, ESyncBits actions, sectortype* psectp)
 		}
 		if (p->kickback_pic < 30)
 		{
-			p->vel.XY() += p->Angles.ZzANGLE.ToVector();
+			p->vel.XY() += p->Angles.ZzANGLE().ToVector();
 		}
 		p->kickback_pic++;
 		if (p->kickback_pic > 40)
@@ -3949,7 +3949,7 @@ void OnMotorcycle(player_struct *p, DDukeActor* motosprite)
 		if (motosprite)
 		{
 			p->GetActor()->spr.pos.XY() = motosprite->spr.pos.XY();
-			p->Angles.ZzANGLE = motosprite->spr.Angles.Yaw; // check me out later.
+			p->Angles.ZzANGLE() = motosprite->spr.Angles.Yaw; // check me out later.
 			p->ammo_amount[MOTORCYCLE_WEAPON] = motosprite->saved_ammo;
 			motosprite->Destroy();
 		}
@@ -3999,12 +3999,12 @@ void OffMotorcycle(player_struct *p)
 		p->VBumpTarget = 0;
 		p->VBumpNow = 0;
 		p->TurbCount = 0;
-		p->vel.XY() = p->Angles.ZzANGLE.ToVector() / 2048.;
+		p->vel.XY() = p->Angles.ZzANGLE().ToVector() / 2048.;
 		p->moto_underwater = 0;
 		auto spawned = spawn(p->GetActor(), EMPTYBIKE);
 		if (spawned)
 		{
-			spawned->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+			spawned->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 			spawned->saved_ammo = p->ammo_amount[MOTORCYCLE_WEAPON];
 		}
 	}
@@ -4023,7 +4023,7 @@ void OnBoat(player_struct *p, DDukeActor* boat)
 		if (boat)
 		{
 			p->GetActor()->spr.pos.XY() = boat->spr.pos.XY();
-			p->Angles.ZzANGLE = boat->spr.Angles.Yaw; // check me out later.
+			p->Angles.ZzANGLE() = boat->spr.Angles.Yaw; // check me out later.
 			p->ammo_amount[BOAT_WEAPON] = boat->saved_ammo;
 			boat->Destroy();
 		}
@@ -4060,12 +4060,12 @@ void OffBoat(player_struct *p)
 		p->VBumpTarget = 0;
 		p->VBumpNow = 0;
 		p->TurbCount = 0;
-		p->vel.XY() = p->Angles.ZzANGLE.ToVector() / 2048.;
+		p->vel.XY() = p->Angles.ZzANGLE().ToVector() / 2048.;
 		p->moto_underwater = 0;
 		auto spawned = spawn(p->GetActor(), EMPTYBOAT);
 		if (spawned)
 		{
-			spawned->spr.Angles.Yaw = p->Angles.ZzANGLE; // check me out later.
+			spawned->spr.Angles.Yaw = p->Angles.ZzANGLE(); // check me out later.
 			spawned->saved_ammo = p->ammo_amount[BOAT_WEAPON];
 		}
 	}
diff --git a/source/games/duke/src/player_w.cpp b/source/games/duke/src/player_w.cpp
index 1a3010238..d323b14b5 100644
--- a/source/games/duke/src/player_w.cpp
+++ b/source/games/duke/src/player_w.cpp
@@ -342,8 +342,8 @@ void operateweapon_ww(int snum, ESyncBits actions)
 				zvel -= 4;
 			}
 
-			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 16, HEAVYHBOMB, -16, DVector2(0.140625, 0.140625),
-				p->Angles.ZzANGLE, vel + p->hbomb_hold_delay * 2, zvel, pact, 1);
+			auto spawned = CreateActor(p->cursector, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 16, HEAVYHBOMB, -16, DVector2(0.140625, 0.140625),
+				p->Angles.ZzANGLE(), vel + p->hbomb_hold_delay * 2, zvel, pact, 1);
 
 			if (spawned)
 			{
diff --git a/source/games/duke/src/prediction.cpp b/source/games/duke/src/prediction.cpp
index 500bb7488..0e4557716 100644
--- a/source/games/duke/src/prediction.cpp
+++ b/source/games/duke/src/prediction.cpp
@@ -53,7 +53,7 @@ void resetmys()
 {
 	mypos = omypos = ps[myconnectindex].GetActor()->getPosWithOffsetZ();
 	myxvel = myyvel = myzvel = 0;
-	myang = ps[myconnectindex].Angles.ZzANGLE;
+	myang = ps[myconnectindex].Angles.ZzANGLE();
 	myhoriz = omyhoriz = ps[myconnectindex].Angles.ZzHORIZON();
 	myhorizoff = omyhorizoff = ps[myconnectindex].Angles.ZzHORIZOFF;
 	mycursectnum = sectindex(ps[myconnectindex].cursector);
diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp
index 5d0ac62d9..39921d48a 100644
--- a/source/games/duke/src/premap.cpp
+++ b/source/games/duke/src/premap.cpp
@@ -72,7 +72,7 @@ void pickrandomspot(int snum)
 	p->GetActor()->spr.pos = po[i].opos;
 	p->GetActor()->backuppos();
 	p->setbobpos();
-	p->Angles.ZzOLDANGLE = p->Angles.ZzANGLE = po[i].oa;
+	p->Angles.ZzOLDANGLE = p->Angles.ZzANGLE() = po[i].oa;
 	p->setCursector(po[i].os);
 }
 
@@ -513,7 +513,7 @@ void resetpspritevars(int g, const DVector3& startpos)
 	STATUSBARTYPE tsbar[MAXPLAYERS];
 
 	auto newActor = CreateActor(ps[0].cursector, startpos.plusZ(gs.playerheight),
-		TILE_APLAYER, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE, 0., 0., nullptr, 10);
+		TILE_APLAYER, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE(), 0., 0., nullptr, 10);
 
 	newActor->viewzoffset = -gs.playerheight;
 	newActor->backupz();
@@ -627,7 +627,7 @@ void resetpspritevars(int g, const DVector3& startpos)
 			act->SetOwner(act);
 
 			ps[j].setbobpos();
-			ps[j].Angles.ZzOLDANGLE = ps[j].Angles.ZzANGLE = act->spr.Angles.Yaw; // check me out later.
+			ps[j].Angles.ZzOLDANGLE = ps[j].Angles.ZzANGLE() = act->spr.Angles.Yaw; // check me out later.
 
 			updatesector(act->spr.pos, &ps[j].cursector);
 
@@ -983,7 +983,7 @@ static int LoadTheMap(MapRecord *mi, player_struct*p, int gamemode)
 	STAT_NewLevel(mi->fileName);
 	TITLE_InformName(mi->name);
 	
-	p->Angles.ZzANGLE = mapangle(lbang);
+	p->Angles.ZzANGLE() = mapangle(lbang);
 
 	gotpic.Zero();
 
diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp
index 22332d28a..180eab5f3 100644
--- a/source/games/duke/src/sectors.cpp
+++ b/source/games/duke/src/sectors.cpp
@@ -1296,8 +1296,8 @@ void moveclouds(double interpfrac)
 		cloudclock = myclock + 6;
 
 		// cloudx/y were an array, but all entries were always having the same value so a single pair is enough.
-		cloudx += (float)ps[screenpeek].Angles.ZzANGLE.Cos() * 0.5f;
-		cloudy += (float)ps[screenpeek].Angles.ZzANGLE.Sin() * 0.5f;
+		cloudx += (float)ps[screenpeek].Angles.ZzANGLE().Cos() * 0.5f;
+		cloudy += (float)ps[screenpeek].Angles.ZzANGLE().Sin() * 0.5f;
 		for (int i = 0; i < numclouds; i++)
 		{
 			// no clamping here!
diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp
index 0f1b5a781..37732ba4d 100644
--- a/source/games/duke/src/sectors_d.cpp
+++ b/source/games/duke/src/sectors_d.cpp
@@ -681,7 +681,7 @@ void checkhitwall_d(DDukeActor* spr, walltype* wal, const DVector3& pos, int atw
 					if (wal->twoSided())
 						wal->nextWall()->cstat = 0;
 
-					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE, 0., 0., spr, 3);
+					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE(), 0., 0., spr, 3);
 					if (spawned)
 					{
 						spawned->spr.lotag = SE_128_GLASS_BREAKING;
@@ -875,15 +875,15 @@ void checkplayerhurt_d(player_struct* p, const Collision& coll)
 		p->hurt_delay = 16;
 		SetPlayerPal(p, PalEntry(32, 32, 0, 0));
 
-		p->vel.XY() = -p->Angles.ZzANGLE.ToVector() * 16;
+		p->vel.XY() = -p->Angles.ZzANGLE().ToVector() * 16;
 		S_PlayActorSound(DUKE_LONGTERM_PAIN, p->GetActor());
 
-		fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 2, -1);
+		fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 2, -1);
 		break;
 
 	case BIGFORCE:
 		p->hurt_delay = 26;
-		fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 2, -1);
+		fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 2, -1);
 		break;
 
 	}
diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp
index ff81203c1..12936bd9c 100644
--- a/source/games/duke/src/sectors_r.cpp
+++ b/source/games/duke/src/sectors_r.cpp
@@ -976,7 +976,7 @@ void checkhitwall_r(DDukeActor* spr, walltype* wal, const DVector3& pos, int atw
 					if (wal->twoSided())
 						wal->nextWall()->cstat = 0;
 
-					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE, 0., 0., spr, 3);
+					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE(), 0., 0., spr, 3);
 					if (spawned)
 					{
 						spawned->spr.lotag = SE_128_GLASS_BREAKING;
@@ -997,7 +997,7 @@ void checkhitwall_r(DDukeActor* spr, walltype* wal, const DVector3& pos, int atw
 					if (wal->twoSided())
 						wal->nextWall()->cstat = 0;
 
-					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE, 0., 0., spr, 3);
+					auto spawned = CreateActor(sptr, pos, SECTOREFFECTOR, 0, DVector2(0, 0), ps[0].Angles.ZzANGLE(), 0., 0., spr, 3);
 					if (spawned)
 					{
 						spawned->spr.lotag = SE_128_GLASS_BREAKING;
@@ -1339,7 +1339,7 @@ void checkplayerhurt_r(player_struct* p, const Collision &coll)
 		{
 		case BIGFORCE:
 			p->hurt_delay = 26;
-			fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE.ToVector() * 2, -1);
+			fi.checkhitwall(p->GetActor(), wal, p->GetActor()->getPosWithOffsetZ() + p->Angles.ZzANGLE().ToVector() * 2, -1);
 			break;
 
 		}
diff --git a/source/games/duke/src/sounds.cpp b/source/games/duke/src/sounds.cpp
index 8c7cf3e5c..1a7e96018 100644
--- a/source/games/duke/src/sounds.cpp
+++ b/source/games/duke/src/sounds.cpp
@@ -354,7 +354,7 @@ void S_GetCamera(DVector3* c, DAngle* ca, sectortype** cs)
 			else  c->Zero();
 		}
 		if (cs) *cs = p->cursector;
-		if (ca) *ca = p->Angles.ZzANGLE;
+		if (ca) *ca = p->Angles.ZzANGLE();
 	}
 	else
 	{
diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp
index 2a5718894..436a3ec14 100644
--- a/source/games/duke/src/spawn.cpp
+++ b/source/games/duke/src/spawn.cpp
@@ -427,7 +427,7 @@ void initshell(DDukeActor* actj, DDukeActor* act, bool isshell)
 		if (actj->isPlayer())
 		{
 			snum = actj->PlayerIndex();
-			ang = ps[snum].Angles.ZzANGLE - mapangle((krand() & 63) + 8);  //Fine tune
+			ang = ps[snum].Angles.ZzANGLE() - mapangle((krand() & 63) + 8);  //Fine tune
 
 			act->temp_data[0] = krand() & 1;
 			act->spr.pos.Z = 3 + ps[snum].GetActor()->getOffsetZ() + ps[snum].pyoff + (ps[snum].Angles.horizSUM().Tan() * 8.) + (!isshell ? 3 : 0);
diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp
index e8a28244f..1fab93387 100644
--- a/source/games/duke/src/vmexports.cpp
+++ b/source/games/duke/src/vmexports.cpp
@@ -863,7 +863,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, settargetangle, dukeplayer_settargeta
 
 double dukeplayer_angle(player_struct* self)
 {
-	return self->Angles.ZzANGLE.Degrees();
+	return self->Angles.ZzANGLE().Degrees();
 }
 
 DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, angle, dukeplayer_angle)
diff --git a/source/games/exhumed/src/osdcmds.cpp b/source/games/exhumed/src/osdcmds.cpp
index 3b3f85786..2452882eb 100644
--- a/source/games/exhumed/src/osdcmds.cpp
+++ b/source/games/exhumed/src/osdcmds.cpp
@@ -48,7 +48,7 @@ void GameInterface::WarpToCoords(double x, double y, double z, DAngle ang)
 
     if (ang != DAngle::fromDeg(INT_MIN))
     {
-        nPlayer->Angles.ZzOLDANGLE = nPlayer->Angles.ZzANGLE = ang;
+        nPlayer->Angles.ZzOLDANGLE = nPlayer->Angles.ZzANGLE() = ang;
     }
 }
 
diff --git a/source/games/exhumed/src/player.cpp b/source/games/exhumed/src/player.cpp
index 6666791b6..7ea27be01 100644
--- a/source/games/exhumed/src/player.cpp
+++ b/source/games/exhumed/src/player.cpp
@@ -296,8 +296,8 @@ void RestartPlayer(int nPlayer)
 
 		pActor->spr.pos = nNStartSprite->spr.pos;
 		ChangeActorSect(pActor, nNStartSprite->sector());
-		plr->Angles.ZzANGLE = nNStartSprite->spr.Angles.Yaw; // check me out later.
-		pActor->spr.Angles.Yaw = plr->Angles.ZzANGLE; // check me out later.
+		plr->Angles.ZzANGLE() = nNStartSprite->spr.Angles.Yaw; // check me out later.
+		pActor->spr.Angles.Yaw = plr->Angles.ZzANGLE(); // check me out later.
 
 		floorsprt = insertActor(pActor->sector(), 0);
 
@@ -310,8 +310,8 @@ void RestartPlayer(int nPlayer)
 	{
         pActor->spr.pos.XY() = plr->sPlayerSave.pos.XY();
 		pActor->spr.pos.Z = plr->sPlayerSave.pSector->floorz;
-		plr->Angles.ZzANGLE = plr->sPlayerSave.nAngle;
-		pActor->spr.Angles.Yaw = plr->Angles.ZzANGLE; // check me out later.
+		plr->Angles.ZzANGLE() = plr->sPlayerSave.nAngle;
+		pActor->spr.Angles.Yaw = plr->Angles.ZzANGLE(); // check me out later.
 
 		floorsprt = nullptr;
 	}
@@ -668,7 +668,7 @@ static void pickupMessage(int no)
 
 void UpdatePlayerSpriteAngle(Player* pPlayer)
 {
-    inita = pPlayer->Angles.ZzANGLE;
+    inita = pPlayer->Angles.ZzANGLE();
     if (pPlayer->pActor) pPlayer->pActor->spr.Angles.Yaw = inita;
 }
 
diff --git a/source/games/exhumed/src/sequence.cpp b/source/games/exhumed/src/sequence.cpp
index ee374d29f..b9dda1f84 100644
--- a/source/games/exhumed/src/sequence.cpp
+++ b/source/games/exhumed/src/sequence.cpp
@@ -414,7 +414,7 @@ void seq_DrawPilotLightSeq(double xOffset, double yOffset)
             double x = ChunkXpos[nFrameBase] + (160 + xOffset);
             double y = ChunkYpos[nFrameBase] + (100 + yOffset);
 
-            hud_drawsprite(x, y, 65536, fmod(-2 * PlayerList[nLocalPlayer].Angles.ZzANGLE.Buildfang(), kAngleMask + 1), nTile, 0, 0, 1);
+            hud_drawsprite(x, y, 65536, fmod(-2 * PlayerList[nLocalPlayer].Angles.ZzANGLE().Buildfang(), kAngleMask + 1), nTile, 0, 0, 1);
             nFrameBase++;
         }
     }
diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp
index cce09d860..d0e70085b 100644
--- a/source/games/sw/src/draw.cpp
+++ b/source/games/sw/src/draw.cpp
@@ -1263,7 +1263,7 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly)
         if (pp->sop_control && (!cl_sointerpolation || (CommEnabled && !pp->sop_remote)))
         {
             tpos = pp->actor->getPosWithOffsetZ();
-            tang = pp->Angles.ZzANGLE;
+            tang = pp->Angles.ZzANGLE();
         }
         tsect = pp->cursector;
         updatesectorz(tpos, &tsect);
diff --git a/source/games/sw/src/game.cpp b/source/games/sw/src/game.cpp
index 37216e941..e8655df52 100644
--- a/source/games/sw/src/game.cpp
+++ b/source/games/sw/src/game.cpp
@@ -414,7 +414,7 @@ void InitLevel(MapRecord *maprec)
     SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name);
     STAT_NewLevel(currentLevel->fileName);
     TITLE_InformName(currentLevel->name);
-    Player[0].Angles.ZzANGLE = DAngle::fromBuild(ang);
+    Player[0].Angles.ZzANGLE() = DAngle::fromBuild(ang);
 
     auto vissect = &sector[0]; // hack alert!
     if (vissect->extra != -1)
diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h
index eb4450e85..82d8b552e 100644
--- a/source/games/sw/src/game.h
+++ b/source/games/sw/src/game.h
@@ -1955,7 +1955,7 @@ inline bool SectorIsUnderwaterArea(sectortype* sect)
 
 inline bool PlayerFacingRange(PLAYER* pp, DSWActor* a, DAngle range)
 {
-    return absangle((a->spr.pos.XY() - pp->actor->spr.pos.XY()).Angle(), pp->Angles.ZzANGLE) < range;
+    return absangle((a->spr.pos.XY() - pp->actor->spr.pos.XY()).Angle(), pp->Angles.ZzANGLE()) < range;
 }
 
 inline bool FacingRange(DSWActor* a1, DSWActor* a2, DAngle range)
diff --git a/source/games/sw/src/input.cpp b/source/games/sw/src/input.cpp
index ebb163af9..1b343bee1 100644
--- a/source/games/sw/src/input.cpp
+++ b/source/games/sw/src/input.cpp
@@ -207,7 +207,7 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
     if (packet)
     {
         *packet = loc;
-        auto velvect = DVector2(loc.fvel, loc.svel).Rotated(pp->Angles.ZzANGLE);
+        auto velvect = DVector2(loc.fvel, loc.svel).Rotated(pp->Angles.ZzANGLE());
         packet->fvel = (float)velvect.X;
         packet->svel = (float)velvect.Y;
         loc = {};
diff --git a/source/games/sw/src/jsector.cpp b/source/games/sw/src/jsector.cpp
index 3e27920b4..71d309964 100644
--- a/source/games/sw/src/jsector.cpp
+++ b/source/games/sw/src/jsector.cpp
@@ -612,7 +612,7 @@ void JS_DrawCameras(PLAYER* pp, const DVector3& campos, double smoothratio)
 
                             if (TEST_BOOL11(camactor) && numplayers > 1)
                             {
-                                drawroomstotile(cp->actor->getPosWithOffsetZ(), cp->Angles.ZzANGLE, cp->Angles.ZzHORIZON(), cp->cursector, mirror[cnt].campic, smoothratio);
+                                drawroomstotile(cp->actor->getPosWithOffsetZ(), cp->Angles.ZzANGLE(), cp->Angles.ZzHORIZON(), cp->cursector, mirror[cnt].campic, smoothratio);
                             }
                             else
                             {
diff --git a/source/games/sw/src/jweapon.cpp b/source/games/sw/src/jweapon.cpp
index 622184b1f..0280eefc3 100644
--- a/source/games/sw/src/jweapon.cpp
+++ b/source/games/sw/src/jweapon.cpp
@@ -1260,7 +1260,7 @@ int PlayerInitChemBomb(PLAYER* pp)
 
     // Spawn a shot
     // Inserting and setting up variables
-    auto actorNew = SpawnActor(STAT_MISSILE, CHEMBOMB, s_ChemBomb, pp->cursector, pos, pp->Angles.ZzANGLE, CHEMBOMB_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, CHEMBOMB, s_ChemBomb, pp->cursector, pos, pp->Angles.ZzANGLE(), CHEMBOMB_VELOCITY);
 
     // don't throw it as far if crawling
     if (pp->Flags & (PF_CRAWLING))
@@ -1632,7 +1632,7 @@ int PlayerInitCaltrops(PLAYER* pp)
 
     auto pos = pp->actor->getPosWithOffsetZ().plusZ(pp->bob_z + 8);
 
-    auto actorNew = SpawnActor(STAT_DEAD_ACTOR, CALTROPS, s_Caltrops, pp->cursector, pos, pp->Angles.ZzANGLE, (CHEMBOMB_VELOCITY + RandomRangeF(CHEMBOMB_VELOCITY)) / 2);
+    auto actorNew = SpawnActor(STAT_DEAD_ACTOR, CALTROPS, s_Caltrops, pp->cursector, pos, pp->Angles.ZzANGLE(), (CHEMBOMB_VELOCITY + RandomRangeF(CHEMBOMB_VELOCITY)) / 2);
 
     // don't throw it as far if crawling
     if (pp->Flags & (PF_CRAWLING))
diff --git a/source/games/sw/src/mclip.cpp b/source/games/sw/src/mclip.cpp
index 3e73ebe9b..fe995f00a 100644
--- a/source/games/sw/src/mclip.cpp
+++ b/source/games/sw/src/mclip.cpp
@@ -59,7 +59,7 @@ Collision MultiClipMove(PLAYER* pp, double zz, double floordist)
     {
         // move the box to position instead of using offset- this prevents small rounding errors
         // allowing you to move through wall
-        DAngle ang = (pp->Angles.ZzANGLE + sop->clipbox_ang[i]);
+        DAngle ang = (pp->Angles.ZzANGLE() + sop->clipbox_ang[i]);
         DVector3 spos(pp->actor->getPosWithOffsetZ(), zz);
 
         DVector2 vect = ang.ToVector() * sop->clipbox_vdist[i];
diff --git a/source/games/sw/src/ninja.cpp b/source/games/sw/src/ninja.cpp
index d7b1656ce..bd63efc27 100644
--- a/source/games/sw/src/ninja.cpp
+++ b/source/games/sw/src/ninja.cpp
@@ -2393,7 +2393,7 @@ void InitPlayerSprite(PLAYER* pp, const DVector3& spawnpos)
 
     COVER_SetReverb(0); // Turn off any echoing that may have been going before
     pp->Reverb = 0;
-    auto actor = SpawnActor(STAT_PLAYER0 + pnum, NINJA_RUN_R0, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->Angles.ZzANGLE);
+    auto actor = SpawnActor(STAT_PLAYER0 + pnum, NINJA_RUN_R0, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->Angles.ZzANGLE());
     actor->viewzoffset = -PLAYER_HEIGHTF;
 
     // if too close to the floor - stand up
@@ -2477,7 +2477,7 @@ void SpawnPlayerUnderSprite(PLAYER* pp)
     int pnum = int(pp - Player);
 
     pp->PlayerUnderActor = SpawnActor(STAT_PLAYER_UNDER0 + pnum,
-                                                 NINJA_RUN_R0, nullptr, pp->cursector, pp->actor->getPosWithOffsetZ(), pp->Angles.ZzANGLE);
+                                                 NINJA_RUN_R0, nullptr, pp->cursector, pp->actor->getPosWithOffsetZ(), pp->Angles.ZzANGLE());
 
     DSWActor* actor = pp->PlayerUnderActor;
 
diff --git a/source/games/sw/src/osdcmds.cpp b/source/games/sw/src/osdcmds.cpp
index 58de22c4e..3d293d93d 100644
--- a/source/games/sw/src/osdcmds.cpp
+++ b/source/games/sw/src/osdcmds.cpp
@@ -66,7 +66,7 @@ void GameInterface::WarpToCoords(double x, double y, double z, DAngle ang)
 
     if (ang != DAngle::fromDeg(INT_MIN))
     {
-		Player->Angles.ZzOLDANGLE = Player->Angles.ZzANGLE = ang;
+		Player->Angles.ZzOLDANGLE = Player->Angles.ZzANGLE() = ang;
     }
 }
 
diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp
index 60d60a2f2..5c7ec8fa6 100644
--- a/source/games/sw/src/player.cpp
+++ b/source/games/sw/src/player.cpp
@@ -1311,7 +1311,7 @@ void DoPlayerTeleportPause(PLAYER* pp)
 
 void DoPlayerTeleportToSprite(PLAYER* pp, DVector3& pos, DAngle ang)
 {
-    pp->Angles.ZzANGLE = pp->Angles.ZzOLDANGLE = ang;
+    pp->Angles.ZzANGLE() = pp->Angles.ZzOLDANGLE = ang;
     pp->actor->spr.pos = pos;
     pp->actor->backuppos();
 
@@ -1510,14 +1510,14 @@ void UpdatePlayerSpriteAngle(PLAYER* pp)
 {
     DSWActor* plActor = pp->actor;
     plActor->backupang();
-    plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+    plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
 
     plActor = pp->PlayerUnderActor;
 
     if (!Prediction && plActor)
     {
         plActor->backupang();
-        plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+        plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
     }
 }
 
@@ -1557,11 +1557,11 @@ void DoPlayerTurnVehicle(PLAYER* pp, float avel, double zz, double floordist)
 
     if (avel != 0)
     {
-        auto sum = pp->Angles.ZzANGLE + DAngle::fromDeg(avel);
+        auto sum = pp->Angles.ZzANGLE() + DAngle::fromDeg(avel);
         if (MultiClipTurn(pp, sum, zz, floordist))
         {
-            pp->Angles.ZzANGLE = sum;
-            pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+            pp->Angles.ZzANGLE() = sum;
+            pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
         }
     }
 }
@@ -1591,11 +1591,11 @@ void DoPlayerTurnVehicleRect(PLAYER* pp, DVector2* pos, DVector2* opos)
 
     if (avel != 0)
     {
-        auto sum = pp->Angles.ZzANGLE + DAngle::fromDeg(avel);
+        auto sum = pp->Angles.ZzANGLE() + DAngle::fromDeg(avel);
         if (RectClipTurn(pp, sum, pos, opos))
         {
-            pp->Angles.ZzANGLE = sum;
-            pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+            pp->Angles.ZzANGLE() = sum;
+            pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
         }
     }
 }
@@ -1625,7 +1625,7 @@ void DoPlayerTurnTurret(PLAYER* pp, float avel)
 
     if (fabs(avel) >= FLT_EPSILON)
     {
-        new_ang = pp->Angles.ZzANGLE + DAngle::fromDeg(avel);
+        new_ang = pp->Angles.ZzANGLE() + DAngle::fromDeg(avel);
 
         if (sop->limit_ang_center >= nullAngle)
         {
@@ -1640,11 +1640,11 @@ void DoPlayerTurnTurret(PLAYER* pp, float avel)
             }
         }
 
-        pp->Angles.ZzANGLE = new_ang;
-        pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+        pp->Angles.ZzANGLE() = new_ang;
+        pp->actor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
     }
 
-    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE, pp->sop->pmid);
+    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE(), pp->sop->pmid);
 }
 
 //---------------------------------------------------------------------------
@@ -1677,7 +1677,7 @@ void SlipSlope(PLAYER* pp)
 void DoPlayerHorizon(PLAYER* pp, float const horz, double const scaleAdjust)
 {
     bool const canslopetilt = !(pp->Flags & (PF_FLYING|PF_SWIMMING|PF_DIVING|PF_CLIMBING|PF_JUMPING|PF_FALLING)) && pp->cursector && (pp->cursector->floorstat & CSTAT_SECTOR_SLOPE);
-    pp->Angles.doViewPitch(pp->actor->spr.pos.XY(), pp->Angles.ZzANGLE, pp->input.actions & SB_AIMMODE, canslopetilt, pp->cursector, scaleAdjust, (pp->Flags & PF_CLIMBING));
+    pp->Angles.doViewPitch(pp->actor->spr.pos.XY(), pp->Angles.ZzANGLE(), pp->input.actions & SB_AIMMODE, canslopetilt, pp->cursector, scaleAdjust, (pp->Flags & PF_CLIMBING));
     pp->Angles.applyPitch(horz, &pp->input.actions, scaleAdjust);
 }
 
@@ -1850,7 +1850,7 @@ void UpdatePlayerSprite(PLAYER* pp)
     if (pp->Flags & (PF_DEAD))
     {
         ChangeActorSect(pp->actor, pp->cursector);
-        actor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+        actor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
         UpdatePlayerUnderSprite(pp);
         return;
     }
@@ -1896,7 +1896,7 @@ void UpdatePlayerSprite(PLAYER* pp)
 
     UpdatePlayerUnderSprite(pp);
 
-    actor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+    actor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
 }
 
 //---------------------------------------------------------------------------
@@ -2353,7 +2353,7 @@ void DoTankTreads(PLAYER* pp)
         return;
 
     int vel = int(pp->vect.Length() * 1024);
-	double dot =  pp->vect.dot(pp->Angles.ZzANGLE.ToVector());
+	double dot =  pp->vect.dot(pp->Angles.ZzANGLE().ToVector());
     if (dot < 0)
         reverse = true;
 
@@ -2551,7 +2551,7 @@ void DriveCrush(PLAYER* pp, DVector2* quad)
                 continue;
 
             damage = -(actor->user.Health + 100);
-            PlayerDamageSlide(actor->user.PlayerP, damage, pp->Angles.ZzANGLE);
+            PlayerDamageSlide(actor->user.PlayerP, damage, pp->Angles.ZzANGLE());
             PlayerUpdateHealth(actor->user.PlayerP, damage);
             PlayerCheckDeath(actor->user.PlayerP, pp->actor);
         }
@@ -2671,7 +2671,7 @@ void DoPlayerMoveVehicle(PLAYER* pp)
     }
 
     auto save_sect = pp->cursector;
-    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE, { MAXSO, MAXSO });
+    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE(), { MAXSO, MAXSO });
     pp->setcursector(pp->sop->op_main_sector); // for speed
 
     double floordist = abs(zz - pp->sop->floor_loz);
@@ -2699,7 +2699,7 @@ void DoPlayerMoveVehicle(PLAYER* pp)
                 DVector3 hitpos((pos[0] + pos[1]) * 0.5, pp->cursector->floorz - 10);
 
                 hitscan(hitpos, pp->cursector,
-                    DVector3(pp->Angles.ZzANGLE.ToVector() * 16, 0),
+                    DVector3(pp->Angles.ZzANGLE().ToVector() * 16, 0),
                     hit, CLIPMASK_PLAYER);
 
                 if ((hit.hitpos.XY() - hitpos.XY()).LengthSquared() < 50 * 50)
@@ -2772,7 +2772,7 @@ void DoPlayerMoveVehicle(PLAYER* pp)
         }
     }
 
-    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE, pp->actor->spr.pos.XY());
+    OperateSectorObject(pp->sop, pp->Angles.ZzANGLE(), pp->actor->spr.pos.XY());
     pp->cursector = save_sect; // for speed
 
     if (!SyncInput())
@@ -3265,7 +3265,7 @@ void DoPlayerClimb(PLAYER* pp)
         pp->vect.X = pp->vect.Y = 0;
 
     double climbVel = pp->vect.Length();
-    double dot = pp->vect.dot(pp->Angles.ZzANGLE.ToVector());
+    double dot = pp->vect.dot(pp->Angles.ZzANGLE().ToVector());
     if (dot < 0)
         climbVel = -climbVel;
 
@@ -3406,7 +3406,7 @@ void DoPlayerClimb(PLAYER* pp)
         HitInfo near;
 
         // constantly look for new ladder sector because of warping at any time
-        neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE, near, 50., NT_Lotag | NT_Hitag | NT_NoSpriteCheck);
+        neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE(), near, 50., NT_Lotag | NT_Hitag | NT_NoSpriteCheck);
 
         if (near.hitWall)
         {
@@ -3446,7 +3446,7 @@ int DoPlayerWadeSuperJump(PLAYER* pp)
 
     //for (i = 0; i < SIZ(angs); i++)
     {
-        FAFhitscan(DVector3(pp->actor->spr.pos.XY(), zh), pp->cursector, DVector3(pp->Angles.ZzANGLE.ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
+        FAFhitscan(DVector3(pp->actor->spr.pos.XY(), zh), pp->cursector, DVector3(pp->Angles.ZzANGLE().ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
 
         if (hit.hitWall != nullptr && hit.hitSector != nullptr)
         {
@@ -3759,9 +3759,9 @@ bool PlayerOnLadder(PLAYER* pp)
     if (Prediction)
         return false;
 
-    neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE, near, 64. + 48., NT_Lotag | NT_Hitag);
+    neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE(), near, 64. + 48., NT_Lotag | NT_Hitag);
 
-    double dir = pp->vect.dot(pp->Angles.ZzANGLE.ToVector());
+    double dir = pp->vect.dot(pp->Angles.ZzANGLE().ToVector());
 
     if (dir < 0)
         return false;
@@ -3771,12 +3771,12 @@ bool PlayerOnLadder(PLAYER* pp)
 
     for (i = 0; i < SIZ(angles); i++)
     {
-        neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE + angles[i], near, 37.5, NT_Lotag | NT_Hitag | NT_NoSpriteCheck);
+        neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE() + angles[i], near, 37.5, NT_Lotag | NT_Hitag | NT_NoSpriteCheck);
 
         if (near.hitWall == nullptr || near.hitpos.X < 6.25 || near.hitWall->lotag != TAG_WALL_CLIMB)
             return false;
 
-        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3((pp->Angles.ZzANGLE + angles[i]).ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
+        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3((pp->Angles.ZzANGLE() + angles[i]).ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
 
         if (hit.actor() != nullptr)
         {
@@ -5122,7 +5122,7 @@ void DoPlayerBeginOperate(PLAYER* pp)
     pp->sop = pp->sop_control = sop;
     sop->controller = pp->actor;
 
-    pp->Angles.ZzOLDANGLE = pp->Angles.ZzANGLE = sop->ang;
+    pp->Angles.ZzOLDANGLE = pp->Angles.ZzANGLE() = sop->ang;
     pp->actor->spr.pos.XY() = sop->pmid.XY();
     updatesector(pp->actor->getPosWithOffsetZ(), &pp->cursector);
     calcSlope(pp->cursector, pp->actor->getPosWithOffsetZ(), &cz, &fz);
@@ -5212,7 +5212,7 @@ void DoPlayerBeginRemoteOperate(PLAYER* pp, SECTOR_OBJECT* sop)
 
     auto save_sect = pp->cursector;
 
-    pp->Angles.ZzOLDANGLE = pp->Angles.ZzANGLE = sop->ang;
+    pp->Angles.ZzOLDANGLE = pp->Angles.ZzANGLE() = sop->ang;
     pp->actor->spr.pos.XY() = sop->pmid.XY();
     updatesector(pp->actor->getPosWithOffsetZ(), &pp->cursector);
     calcSlope(pp->cursector, pp->actor->getPosWithOffsetZ(), &cz, &fz);
@@ -5334,9 +5334,9 @@ void DoPlayerStopOperate(PLAYER* pp)
     {
         DSWActor* rsp = pp->remoteActor;
         if (TEST_BOOL1(rsp))
-            pp->Angles.ZzANGLE = pp->Angles.ZzOLDANGLE = rsp->spr.Angles.Yaw; // check me out later.
+            pp->Angles.ZzANGLE() = pp->Angles.ZzOLDANGLE = rsp->spr.Angles.Yaw; // check me out later.
         else
-            pp->Angles.ZzANGLE = pp->Angles.ZzOLDANGLE = (pp->sop_remote->pmid.XY() - pp->actor->spr.pos.XY()).Angle();
+            pp->Angles.ZzANGLE() = pp->Angles.ZzOLDANGLE = (pp->sop_remote->pmid.XY() - pp->actor->spr.pos.XY()).Angle();
     }
 
     if (pp->sop_control)
@@ -5968,7 +5968,7 @@ void DoPlayerDeathFollowKiller(PLAYER* pp)
     {
         if (FAFcansee(ActorVectOfTop(killer), killer->sector(), pp->actor->getPosWithOffsetZ(), pp->cursector))
         {
-            pp->Angles.addYaw(deltaangle(pp->Angles.ZzANGLE, (killer->spr.pos.XY() - pp->actor->spr.pos.XY()).Angle()) * (1. / 16.));
+            pp->Angles.addYaw(deltaangle(pp->Angles.ZzANGLE(), (killer->spr.pos.XY() - pp->actor->spr.pos.XY()).Angle()) * (1. / 16.));
         }
     }
 }
@@ -6004,7 +6004,7 @@ void DoPlayerDeathCheckKeys(PLAYER* pp)
         plActor->spr.picnum = plActor->user.State->Pic;
         plActor->spr.picnum = plActor->user.State->Pic;
         plActor->spr.cstat &= ~(CSTAT_SPRITE_YCENTER);
-        plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+        plActor->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
 
         DoSpawnTeleporterEffect(plActor);
         PlaySound(DIGI_TELEPORT, pp, v3df_none);
@@ -7047,7 +7047,7 @@ void InitAllPlayers(void)
     // Initialize all [MAX_SW_PLAYERS] arrays here!
     for (pp = Player; pp < &Player[MAX_SW_PLAYERS]; pp++)
     {
-        pp->Angles.ZzANGLE = pp->Angles.ZzOLDANGLE = pfirst->Angles.ZzANGLE;
+        pp->Angles.ZzANGLE() = pp->Angles.ZzOLDANGLE = pfirst->Angles.ZzANGLE();
         pp->Angles.ZzHORIZON() = pp->Angles.ZzOLDHORIZON() = pfirst->Angles.ZzHORIZON();
         pp->cursector = pfirst->cursector;
         // set like this so that player can trigger something on start of the level
@@ -7203,7 +7203,7 @@ void PlayerSpawnPosition(PLAYER* pp)
 
     ASSERT(spawn_sprite != nullptr);
 
-    pp->Angles.ZzANGLE = pp->Angles.ZzOLDANGLE = spawn_sprite->spr.Angles.Yaw; // check me out later.
+    pp->Angles.ZzANGLE() = pp->Angles.ZzOLDANGLE = spawn_sprite->spr.Angles.Yaw; // check me out later.
     pp->setcursector(spawn_sprite->sector());
 
     if (pp->actor)
@@ -7266,7 +7266,7 @@ void InitMultiPlayerInfo(const DVector3& spawnpos)
                 continue;
         }
 
-        auto start0 = SpawnActor(MultiStatList[stat], ST1, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->Angles.ZzANGLE);
+        auto start0 = SpawnActor(MultiStatList[stat], ST1, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->Angles.ZzANGLE());
         start0->viewzoffset = -PLAYER_HEIGHTF;
 
         // if too close to the floor - stand up
@@ -7559,7 +7559,7 @@ DEFINE_ACTION_FUNCTION(_SWPlayer, MaxUserHealth)
 DEFINE_ACTION_FUNCTION(_SWPlayer, GetBuildAngle)
 {
     PARAM_SELF_STRUCT_PROLOGUE(PLAYER);
-    ACTION_RETURN_INT(self->Angles.ZzANGLE.Buildang());
+    ACTION_RETURN_INT(self->Angles.ZzANGLE().Buildang());
 }
 
 DEFINE_ACTION_FUNCTION(_SW, WeaponMaxAmmo)
diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp
index 05de16c4e..108222518 100644
--- a/source/games/sw/src/sector.cpp
+++ b/source/games/sw/src/sector.cpp
@@ -2140,7 +2140,7 @@ bool NearThings(PLAYER* pp)
         return false;
     }
 
-    neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE, near, 64., NT_Lotag | NT_Hitag);
+    neartag(pp->actor->getPosWithOffsetZ(), pp->cursector, pp->Angles.ZzANGLE(), near, 64., NT_Lotag | NT_Hitag);
 
 
     // hit a sprite? Check to see if it has sound info in it!
@@ -2173,7 +2173,7 @@ bool NearThings(PLAYER* pp)
     {
         HitInfo hit{};
 
-        FAFhitscan(pp->actor->getPosWithOffsetZ().plusZ(-30), pp->cursector, DVector3(pp->Angles.ZzANGLE.ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
+        FAFhitscan(pp->actor->getPosWithOffsetZ().plusZ(-30), pp->cursector, DVector3(pp->Angles.ZzANGLE().ToVector() * 1024, 0), hit, CLIPMASK_MISSILE);
 
         if (hit.hitSector == nullptr)
             return false;
@@ -2221,7 +2221,7 @@ void NearTagList(NEAR_TAG_INFO* ntip, PLAYER* pp, double z, double dist, int typ
     HitInfo near;
 
 
-    neartag(DVector3(pp->actor->spr.pos.XY(), z), pp->cursector, pp->Angles.ZzANGLE, near, dist, type);
+    neartag(DVector3(pp->actor->spr.pos.XY(), z), pp->cursector, pp->Angles.ZzANGLE(), near, dist, type);
 
     if (near.hitSector != nullptr)
     {
diff --git a/source/games/sw/src/sounds.cpp b/source/games/sw/src/sounds.cpp
index e03dddb8c..bbd2c04d8 100644
--- a/source/games/sw/src/sounds.cpp
+++ b/source/games/sw/src/sounds.cpp
@@ -603,7 +603,7 @@ void GameInterface::UpdateSounds(void)
         else
             tang = (pp->sop_remote->pmid.XY() - pp->actor->spr.pos.XY()).Angle();
     }
-    else tang = pp->Angles.ZzANGLE;
+    else tang = pp->Angles.ZzANGLE();
 
     listener.angle = float(-tang.Radians());
     listener.velocity.Zero();
diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp
index 02ffdc413..cbbddc3c0 100644
--- a/source/games/sw/src/track.cpp
+++ b/source/games/sw/src/track.cpp
@@ -1480,7 +1480,7 @@ void MovePlayer(PLAYER* pp, SECTOR_OBJECT* sop, const DVector2& move)
     {
         pp->Flags |= (PF_PLAYER_RIDING);
 
-        pp->RevolveAng = pp->Angles.ZzANGLE;
+        pp->RevolveAng = pp->Angles.ZzANGLE();
         pp->Revolve.XY() = pp->actor->spr.pos.XY();
 
         // set the delta angle to 0 when moving
@@ -1502,7 +1502,7 @@ void MovePlayer(PLAYER* pp, SECTOR_OBJECT* sop, const DVector2& move)
         // save the current information so when Player stops
         // moving then you
         // know where he was last
-        pp->RevolveAng = pp->Angles.ZzANGLE;
+        pp->RevolveAng = pp->Angles.ZzANGLE();
         pp->Revolve.XY() = pp->actor->spr.pos.XY();
 
         // set the delta angle to 0 when moving
@@ -1516,7 +1516,7 @@ void MovePlayer(PLAYER* pp, SECTOR_OBJECT* sop, const DVector2& move)
         pp->Revolve += move;
 
         // Last known angle is now adjusted by the delta angle
-        pp->RevolveAng = deltaangle(pp->RevolveDeltaAng, pp->Angles.ZzANGLE);
+        pp->RevolveAng = deltaangle(pp->RevolveDeltaAng, pp->Angles.ZzANGLE());
     }
 
     // increment Players delta angle
@@ -1529,7 +1529,7 @@ void MovePlayer(PLAYER* pp, SECTOR_OBJECT* sop, const DVector2& move)
 
     // New angle is formed by taking last known angle and
     // adjusting by the delta angle
-    pp->Angles.addYaw(deltaangle(pp->RevolveAng + pp->RevolveDeltaAng, pp->Angles.ZzANGLE));
+    pp->Angles.addYaw(deltaangle(pp->RevolveAng + pp->RevolveDeltaAng, pp->Angles.ZzANGLE()));
 
     UpdatePlayerSprite(pp);
 }
diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp
index 83f7d8f6a..849c35960 100644
--- a/source/games/sw/src/weapon.cpp
+++ b/source/games/sw/src/weapon.cpp
@@ -11584,7 +11584,7 @@ void InitSpellRing(PLAYER* pp)
 
     DAngle ang_diff = DAngle360 / max_missiles;
 
-    DAngle ang_start = pp->Angles.ZzANGLE - DAngle180;
+    DAngle ang_start = pp->Angles.ZzANGLE() - DAngle180;
 
     if (!SW_SHAREWARE)
         PlaySound(DIGI_RFWIZ, pp, v3df_none);
@@ -11971,7 +11971,7 @@ void InitSpellNapalm(PLAYER* pp)
     for (i = 0; i < SIZ(mp); i++)
     {
         auto actor = SpawnActor(STAT_MISSILE, FIREBALL1, s_Napalm, pp->cursector,
-                                pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE, NAPALM_VELOCITY*2);
+                                pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE(), NAPALM_VELOCITY*2);
 
         actor->spr.hitag = LUMINOUS; //Always full brightness
 
@@ -12106,7 +12106,7 @@ int InitSpellMirv(PLAYER* pp)
     if (!pp->insector())
         return 0;
 
-    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Mirv, pp->cursector, pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE, MIRV_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Mirv, pp->cursector, pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE(), MIRV_VELOCITY);
 
     PlaySound(DIGI_MIRVWIZ, actorNew, v3df_follow);
 
@@ -12201,7 +12201,7 @@ int InitSwordAttack(PLAYER* pp)
             bubble = SpawnBubble(pp->actor);
             if (bubble != nullptr)
             {
-                bubble->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+                bubble->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
 
 				auto random_amt = RandomAngle(DAngle22_5 / 4) - DAngle22_5 / 8;
 
@@ -12248,9 +12248,9 @@ int InitSwordAttack(PLAYER* pp)
         HitInfo hit{};
 
         double dax = 1024., daz = 0;
-        DAngle daang = pp->Angles.ZzANGLE;
+        DAngle daang = pp->Angles.ZzANGLE();
         setFreeAimVelocity(dax, daz, pp->Angles.ZzHORIZON(), 1000. - (RandomRangeF(24000 / 256.) - 12000 / 256.));
-        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3(pp->Angles.ZzANGLE.ToVector() * dax, daz), hit, CLIPMASK_MISSILE);
+        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3(pp->Angles.ZzANGLE().ToVector() * dax, daz), hit, CLIPMASK_MISSILE);
 
         if (hit.hitSector == nullptr)
             return 0;
@@ -12326,7 +12326,7 @@ int InitSwordAttack(PLAYER* pp)
 
                 if (hit.hitWall->lotag == TAG_WALL_BREAK)
                 {
-                    HitBreakWall(hit.hitWall, hit.hitpos, pp->Angles.ZzANGLE, plActor->user.ID);
+                    HitBreakWall(hit.hitWall, hit.hitpos, pp->Angles.ZzANGLE(), plActor->user.ID);
                 }
                 // hit non breakable wall - do sound and puff
                 else
@@ -12369,7 +12369,7 @@ int InitFistAttack(PLAYER* pp)
             bubble = SpawnBubble(pp->actor);
             if (bubble != nullptr)
             {
-                bubble->spr.Angles.Yaw = pp->Angles.ZzANGLE; // check me out later.
+                bubble->spr.Angles.Yaw = pp->Angles.ZzANGLE(); // check me out later.
 
                 auto random_amt = RandomAngle(DAngle22_5 / 4) - DAngle22_5 / 8;
 
@@ -12426,9 +12426,9 @@ int InitFistAttack(PLAYER* pp)
     {
         HitInfo hit{};
         double dax = 1024., daz = 0;
-        auto daang = pp->Angles.ZzANGLE;
+        auto daang = pp->Angles.ZzANGLE();
         setFreeAimVelocity(dax, daz, pp->Angles.ZzHORIZON(), 1000. - (RandomRangeF(24000 / 256.) - 12000 / 256.));
-        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3(pp->Angles.ZzANGLE.ToVector() * dax, daz), hit, CLIPMASK_MISSILE);
+        FAFhitscan(pp->actor->getPosWithOffsetZ(), pp->cursector, DVector3(pp->Angles.ZzANGLE().ToVector() * dax, daz), hit, CLIPMASK_MISSILE);
 
         if (hit.hitSector == nullptr)
             return 0;
@@ -12517,7 +12517,7 @@ int InitFistAttack(PLAYER* pp)
 
                 if (hit.hitWall->lotag == TAG_WALL_BREAK)
                 {
-                    HitBreakWall(hit.hitWall, hit.hitpos, pp->Angles.ZzANGLE, plActor->user.ID);
+                    HitBreakWall(hit.hitWall, hit.hitpos, pp->Angles.ZzANGLE(), plActor->user.ID);
                 }
                 // hit non breakable wall - do sound and puff
                 else
@@ -12980,7 +12980,7 @@ int InitStar(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, STAR1, s_Star, pp->cursector, pos, pp->Angles.ZzANGLE, STAR_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, STAR1, s_Star, pp->cursector, pos, pp->Angles.ZzANGLE(), STAR_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.scale = DVector2(STAR_REPEAT, STAR_REPEAT);
@@ -13080,7 +13080,7 @@ void InitHeartAttack(PLAYER* pp)
         return;
 
     auto actorNew = SpawnActor(STAT_MISSILE_SKIP4, BLOOD_WORM, s_BloodWorm, pp->cursector,
-                            pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE, BLOOD_WORM_VELOCITY*2);
+                            pp->actor->getPosWithOffsetZ().plusZ(12), pp->Angles.ZzANGLE(), BLOOD_WORM_VELOCITY*2);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
 
@@ -13231,7 +13231,7 @@ int InitShotgun(PLAYER* pp)
     if (WeaponAutoAimHitscan(pp->actor, &daz, &daang, false) == nullptr)
     {
         setFreeAimVelocity(dax, daz, pp->Angles.ZzHORIZON(), 1000.);
-        daang = pp->Angles.ZzANGLE;
+        daang = pp->Angles.ZzANGLE();
     }
 
     double ndaz;
@@ -13383,7 +13383,7 @@ int InitLaser(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, s_Laser, pp->cursector, pos, pp->Angles.ZzANGLE, 18.75);
+    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, s_Laser, pp->cursector, pos, pp->Angles.ZzANGLE(), 18.75);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(pp->actor, actorNew);
@@ -13481,7 +13481,7 @@ int InitRail(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R1, &s_Rail[0][0], pp->cursector, pos, pp->Angles.ZzANGLE, 75);
+    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R1, &s_Rail[0][0], pp->cursector, pos, pp->Angles.ZzANGLE(), 75);
 
 
     SetOwner(pp->actor, actorNew);
@@ -13646,7 +13646,7 @@ int InitRocket(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE, ROCKET_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE(), ROCKET_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.scale = DVector2(1.40626, 1.40625);
@@ -13753,7 +13753,7 @@ int InitBunnyRocket(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R4, &s_BunnyRocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE, ROCKET_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R4, &s_BunnyRocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE(), ROCKET_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.scale = DVector2(1, 1);
@@ -13855,7 +13855,7 @@ int InitNuke(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE, 700/16.);
+    auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursector, pos, pp->Angles.ZzANGLE(), 700/16.);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.scale = DVector2(2, 2);
@@ -13912,7 +13912,7 @@ int InitNuke(PLAYER* pp)
 	UpdateChangeXY(actorNew);
     actorNew->user.change.Z = zvel;
 
-    PlayerDamageSlide(pp, -40, pp->Angles.ZzANGLE + DAngle180); // Recoil slide
+    PlayerDamageSlide(pp, -40, pp->Angles.ZzANGLE() + DAngle180); // Recoil slide
 
     return 0;
 }
@@ -14031,7 +14031,7 @@ int InitMicro(PLAYER* pp)
         else
         {
             picked = nullptr;
-            angle = pp->Angles.ZzANGLE;
+            angle = pp->Angles.ZzANGLE();
         }
 
         auto pos = pp->actor->getPosWithOffsetZ().plusZ(pp->bob_z + 4 + RandomRange(20));
@@ -15226,7 +15226,7 @@ int InitTracerUzi(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, 0, s_Tracer, pp->cursector, pp->actor->getPosWithOffsetZ().plusZ(nz), pp->Angles.ZzANGLE, TRACER_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, 0, s_Tracer, pp->cursector, pp->actor->getPosWithOffsetZ().plusZ(nz), pp->Angles.ZzANGLE(), TRACER_VELOCITY);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
     SetOwner(pp->actor, actorNew);
@@ -15524,7 +15524,7 @@ int InitUzi(PLAYER* pp)
     }
     else
     {
-        daang = pp->Angles.ZzANGLE + mapangle(RandomRange(24) - 12);
+        daang = pp->Angles.ZzANGLE() + mapangle(RandomRange(24) - 12);
         setFreeAimVelocity(dax, daz, pp->Angles.ZzHORIZON(), 1000. - (RandomRangeF(24000/256.) - 12000/256.));
     }
 
@@ -16667,7 +16667,7 @@ int InitGrenade(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, GRENADE, &s_Grenade[0][0], pp->cursector, pos, pp->Angles.ZzANGLE, GRENADE_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, GRENADE, &s_Grenade[0][0], pp->cursector, pos, pp->Angles.ZzANGLE(), GRENADE_VELOCITY);
 
     // don't throw it as far if crawling
     if (pp->Flags & (PF_CRAWLING))
@@ -16805,7 +16805,7 @@ int InitMine(PLAYER* pp)
     // Spawn a shot
     // Inserting and setting up variables
 
-    auto actorNew = SpawnActor(STAT_MISSILE, MINE, s_Mine, pp->cursector, pos, pp->Angles.ZzANGLE, MINE_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, MINE, s_Mine, pp->cursector, pos, pp->Angles.ZzANGLE(), MINE_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
     actorNew->spr.scale = DVector2(0.5, 0.5);
@@ -16828,7 +16828,7 @@ int InitMine(PLAYER* pp)
 
 	UpdateChange(actorNew, 0.5);
 
-	double dot = pp->vect.dot(pp->Angles.ZzANGLE.ToVector());
+	double dot = pp->vect.dot(pp->Angles.ZzANGLE().ToVector());
 
     // don't adjust for strafing
 	// not really sure what to do here as the original formula was very likely to overflow, creating a Q0.32 value.
@@ -16933,7 +16933,7 @@ int InitFireball(PLAYER* pp)
 
     auto pos = pp->actor->getPosWithOffsetZ().plusZ(pp->bob_z + 15);
 
-    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Fireball, pp->cursector, pos, pp->Angles.ZzANGLE, FIREBALL_VELOCITY);
+    auto actorNew = SpawnActor(STAT_MISSILE, FIREBALL1, s_Fireball, pp->cursector, pos, pp->Angles.ZzANGLE(), FIREBALL_VELOCITY);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
     actorNew->spr.scale = DVector2(0.625, 0.625);
diff --git a/source/games/sw/src/zombie.cpp b/source/games/sw/src/zombie.cpp
index 2efda4ec6..c07397bb5 100644
--- a/source/games/sw/src/zombie.cpp
+++ b/source/games/sw/src/zombie.cpp
@@ -787,7 +787,7 @@ void SpawnZombie(PLAYER* pp, DSWActor* weaponActor)
     if (ownerActor == nullptr)
         return;
 
-    auto actorNew = SpawnActor(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], pp->cursector, pp->actor->getPosWithOffsetZ(), pp->Angles.ZzANGLE, 0);
+    auto actorNew = SpawnActor(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], pp->cursector, pp->actor->getPosWithOffsetZ(), pp->Angles.ZzANGLE(), 0);
     SetOwner(actorNew, ownerActor);
     actorNew->spr.pal = actorNew->user.spal = ownerActor->user.spal;
     actorNew->spr.Angles.Yaw = RandomAngle();