From d8fac3245900a82485ee3a6516cce2eb432b8cc3 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@users.noreply.github.com>
Date: Wed, 5 Oct 2022 19:18:12 +0200
Subject: [PATCH] - more simple SetScale replacements.

---
 source/games/blood/src/animatesprite.cpp   | 16 ++++----
 source/games/duke/src/actors_d.cpp         |  3 +-
 source/games/duke/src/animatesprites_d.cpp |  3 +-
 source/games/duke/src/animatesprites_r.cpp |  6 +--
 source/games/duke/src/spawn.cpp            |  5 +--
 source/games/duke/src/spawn_d.cpp          | 11 ++----
 source/games/duke/src/spawn_r.cpp          | 44 ++++++++--------------
 source/games/exhumed/src/fish.cpp          |  3 +-
 source/games/exhumed/src/move.cpp          |  3 +-
 source/games/exhumed/src/player.cpp        |  3 +-
 source/games/exhumed/src/ra.cpp            |  3 +-
 source/games/exhumed/src/rex.cpp           |  3 +-
 source/games/sw/src/break.cpp              |  2 +-
 source/games/sw/src/bunny.cpp              |  2 +-
 source/games/sw/src/jweapon.cpp            | 12 ++----
 source/games/sw/src/player.cpp             |  9 ++---
 source/games/sw/src/ripper.cpp             |  5 +--
 source/games/sw/src/ripper2.cpp            |  2 +-
 source/games/sw/src/sprite.cpp             |  3 +-
 source/games/sw/src/weapon.cpp             | 44 ++++++++--------------
 20 files changed, 65 insertions(+), 117 deletions(-)

diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp
index e156ba71a..9dd87356d 100644
--- a/source/games/blood/src/animatesprite.cpp
+++ b/source/games/blood/src/animatesprite.cpp
@@ -56,8 +56,7 @@ tspritetype* viewInsertTSprite(tspriteArray& tsprites, sectortype* pSector, int
 	tspritetype* pTSprite = tsprites.newTSprite();
 	memset(pTSprite, 0, sizeof(tspritetype));
 	pTSprite->cstat = CSTAT_SPRITE_YCENTER;
-	pTSprite->xrepeat = 64;
-	pTSprite->yrepeat = 64;
+	pTSprite->SetScale(1, 1);
 	pTSprite->ownerActor = nullptr;
 	pTSprite->type = -int(tsprites.Size() - 1);
 	pTSprite->statnum = nStatnum;
@@ -181,7 +180,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 		if (nViewEffect == kViewEffectFlag)
 			pNSprite->xrepeat = pNSprite->yrepeat = 24;
 		else
-			pNSprite->xrepeat = pNSprite->yrepeat = 64;
+			pNSprite->SetScale(1, 1);
 		pNSprite->picnum = 3558;
 		return pNSprite;
 	}
@@ -207,7 +206,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 
 		pNSprite->shade = -128;
 		pNSprite->pal = 0;
-		pNSprite->xrepeat = pNSprite->yrepeat = 64;
+		pNSprite->SetScale(1, 1);
 		pNSprite->picnum = 2605;
 		return pNSprite;
 	}
@@ -220,7 +219,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 		pNSprite->shade = 26;
 		pNSprite->pal = 0;
 		pNSprite->cstat |= CSTAT_SPRITE_TRANSLUCENT;
-		pNSprite->xrepeat = pNSprite->yrepeat = 64;
+		pNSprite->SetScale(1, 1);
 		pNSprite->picnum = 2089;
 		break;
 	}
@@ -421,7 +420,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 		pNSprite->picnum = 624;
 		pNSprite->shade = int(pTSprite->pos.Z - pSector->ceilingz) - 64;
 		pNSprite->pal = 2;
-		pNSprite->xrepeat = pNSprite->yrepeat = 64;
+		pNSprite->SetScale(1, 1);
 		pNSprite->cstat |= CSTAT_SPRITE_ONE_SIDE | CSTAT_SPRITE_ALIGNMENT_FLOOR | CSTAT_SPRITE_YFLIP | CSTAT_SPRITE_TRANSLUCENT;
 		pNSprite->angle = pTSprite->angle;
 		pNSprite->ownerActor = pTSprite->ownerActor;
@@ -706,15 +705,14 @@ void viewProcessSprites(tspriteArray& tsprites, const DVector3& cPos, DAngle cA,
 		pTSprite->shade = ClipRange(nShade, -128, 127);
 		if ((pTSprite->flags & kHitagRespawn) && pTSprite->ownerActor->spr.intowner == 3 && owneractor->hasX())    // Where does this 3 come from? Nothing sets it.
 		{
-			pTSprite->xrepeat = 48;
-			pTSprite->yrepeat = 48;
+			pTSprite->SetScale(0.75, 0.75);
 			pTSprite->shade = -128;
 			pTSprite->picnum = 2272 + 2 * owneractor->xspr.respawnPending;
 			pTSprite->cstat &= ~(CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP);
 			if (((IsItemSprite(pTSprite) || IsAmmoSprite(pTSprite)) && gGameOptions.nItemSettings == 2)
 				|| (IsWeaponSprite(pTSprite) && gGameOptions.nWeaponSettings == 3))
 			{
-				pTSprite->xrepeat = pTSprite->yrepeat = 48;
+				pTSprite->SetScale(0.75, 0.75);
 			}
 			else
 			{
diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp
index d5e51d0ba..5c2ea94de 100644
--- a/source/games/duke/src/actors_d.cpp
+++ b/source/games/duke/src/actors_d.cpp
@@ -2281,8 +2281,7 @@ static void greenslime(DDukeActor *actor)
 		if (actor->spr.yrepeat > 16) actor->spr.yrepeat -= krand() & 7;
 		else
 		{
-			actor->spr.xrepeat = 40;
-			actor->spr.yrepeat = 16;
+			actor->spr.SetScale(0.625, 0.25);
 			actor->temp_actor = nullptr;
 			actor->temp_data[0] = 0;
 		}
diff --git a/source/games/duke/src/animatesprites_d.cpp b/source/games/duke/src/animatesprites_d.cpp
index d5fe65e8f..12c207af7 100644
--- a/source/games/duke/src/animatesprites_d.cpp
+++ b/source/games/duke/src/animatesprites_d.cpp
@@ -356,8 +356,7 @@ void animatesprites_d(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi
 				}
 				else
 				{
-					newtspr->xrepeat = 16;
-					newtspr->yrepeat = 16;
+					newtspr->SetScale(0.25, 0.25);
 				}
 				newtspr->pal = 0;
 			}
diff --git a/source/games/duke/src/animatesprites_r.cpp b/source/games/duke/src/animatesprites_r.cpp
index edc4c15de..2a1b24f11 100644
--- a/source/games/duke/src/animatesprites_r.cpp
+++ b/source/games/duke/src/animatesprites_r.cpp
@@ -396,13 +396,11 @@ void animatesprites_r(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi
 				}
 				else if (ps[p].OnMotorcycle || ps[p].OnBoat)
 				{
-					newtspr->xrepeat = 0;
-					newtspr->yrepeat = 0;
+					newtspr->SetScale(0, 0);
 				}
 				else
 				{
-					newtspr->xrepeat = 16;
-					newtspr->yrepeat = 16;
+					newtspr->SetScale(0.25, 0.25);
 				}
 				newtspr->pal = 0;
 			}
diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp
index 9b45a6680..05776747a 100644
--- a/source/games/duke/src/spawn.cpp
+++ b/source/games/duke/src/spawn.cpp
@@ -299,8 +299,7 @@ void spawntransporter(DDukeActor *actj, DDukeActor* act, bool beam)
 		}
 		else
 		{
-			act->spr.xrepeat = 48;
-			act->spr.yrepeat = 64;
+			act->spr.SetScale(0.75, 1);
 			if (actj->spr.statnum == 10 || badguy(actj))
 				act->spr.pos.Z -= 32;
 		}
@@ -624,7 +623,7 @@ void spawneffector(DDukeActor* actor, TArray<DDukeActor*>* actors)
 		case SE_27_DEMO_CAM:
 			if (ud.recstat == 1)
 			{
-				actor->spr.xrepeat = actor->spr.yrepeat = 64;
+				actor->spr.SetScale(1, 1);
 				actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE;
 			}
 			break;
diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp
index 6ac887e23..4528503f2 100644
--- a/source/games/duke/src/spawn_d.cpp
+++ b/source/games/duke/src/spawn_d.cpp
@@ -108,8 +108,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 		case FIREFLYFLYINGEFFECT:
 			act->SetOwner(actj);
 			ChangeActorStat(act, STAT_MISC);
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			return act;
 		case LAVAPOOLBUBBLE:
 			if (actj->spr.xrepeat < 30)
@@ -118,8 +117,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			ChangeActorStat(act, STAT_MISC);
 			act->spr.pos.X += krandf(32) - 16;
 			act->spr.pos.Y += krandf(32) - 16;
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			return act;
 		case WHISPYSMOKE:
 			ChangeActorStat(act, STAT_MISC);
@@ -610,8 +608,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 
 		if (act->spr.picnum == EXPLOSION2 || act->spr.picnum == EXPLOSION2BOT)
 		{
-			act->spr.xrepeat = 48;
-			act->spr.yrepeat = 48;
+			act->spr.SetScale(0.75, 0.75);
 			act->spr.shade = -127;
 			act->spr.cstat |= CSTAT_SPRITE_YCENTER;
 		}
@@ -874,7 +871,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			if (act->spr.picnum == RAT)
 			{
 				act->spr.angle = randomAngle();
-				act->spr.xrepeat = act->spr.yrepeat = 48;
+				act->spr.SetScale(0.75, 0.75);
 				act->spr.cstat = 0;
 			}
 			else
diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp
index bd9db6d9c..8d9315f5e 100644
--- a/source/games/duke/src/spawn_r.cpp
+++ b/source/games/duke/src/spawn_r.cpp
@@ -67,16 +67,14 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 		break;
 	case RRTILE8450:
 		if (!isRRRA()) goto default_case;
-		act->spr.xrepeat = 64;
-		act->spr.yrepeat = 64;
+		act->spr.SetScale(1, 1);
 		act->spr.extra = act->spr.lotag;
 		act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
 		ChangeActorStat(act, 116);
 		break;
 	case PIG + 11:
 		if (!isRRRA()) goto default_case;
-		act->spr.xrepeat = 16;
-		act->spr.yrepeat = 16;
+		act->spr.SetScale(0.25, 0.25);
 		act->clipdist = 0;
 		act->spr.extra = 0;
 		act->spr.cstat = 0;
@@ -474,8 +472,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 		break;
 	case RRTILE296:
 	case RRTILE297:
-		act->spr.xrepeat = 64;
-		act->spr.yrepeat = 64;
+		act->spr.SetScale(1, 1);
 		act->clipdist = 16;
 		ChangeActorStat(act, 108);
 		break;
@@ -621,15 +618,13 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 
 		if (act->spr.picnum == EXPLOSION2)
 		{
-			act->spr.xrepeat = 48;
-			act->spr.yrepeat = 48;
+			act->spr.SetScale(0.75, 0.75);
 			act->spr.shade = -127;
 			act->spr.cstat |= CSTAT_SPRITE_YCENTER;
 		}
 		else if (act->spr.picnum == EXPLOSION3)
 		{
-			act->spr.xrepeat = 128;
-			act->spr.yrepeat = 128;
+			act->spr.SetScale(2, 2);
 			act->spr.shade = -127;
 			act->spr.cstat |= CSTAT_SPRITE_YCENTER;
 		}
@@ -878,16 +873,14 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			break;
 		case MINION:
 		case MINIONSTAYPUT:
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			act->setClipDistFromTile();
 			if (isRRRA() && ufospawnsminion)
 				act->spr.pal = 8;
 			break;
 		case DOGRUN:
 		case PIG:
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			act->setClipDistFromTile();
 			break;
 		case RABBIT:
@@ -896,8 +889,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			act->setClipDistFromTile();
 			break;
 		case MAMACLOUD:
-			act->spr.xrepeat = 64;
-			act->spr.yrepeat = 64;
+			act->spr.SetScale(1, 1);
 			act->spr.cstat = CSTAT_SPRITE_TRANSLUCENT;
 			act->spr.cstat |= CSTAT_SPRITE_TRANS_FLIP;
 			act->spr.pos.X += krandf(128) - 64;
@@ -962,13 +954,11 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			act->setClipDistFromTile();
 			break;
 		case MINIONBOAT:
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			act->setClipDistFromTile();
 			break;
 		case HULKBOAT:
-			act->spr.xrepeat = 48;
-			act->spr.yrepeat = 48;
+			act->spr.SetScale(0.75, 0.75);
 			act->setClipDistFromTile();
 			break;
 		case CHEERBOAT:
@@ -990,8 +980,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			break;
 		case ROCK:
 		case ROCK2:
-			act->spr.xrepeat = 64;
-			act->spr.yrepeat = 64;
+			act->spr.SetScale(1, 1);
 			act->setClipDistFromTile();
 			break;
 
@@ -1006,8 +995,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			act->spr.extra = 50;
 			break;
 		case SBMOVE:
-			act->spr.xrepeat = 48;
-			act->spr.yrepeat = 48;
+			act->spr.SetScale(0.75, 0.75);
 			act->setClipDistFromTile();
 			break;
 
@@ -1030,7 +1018,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			if (act->spr.picnum == RAT)
 			{
 				act->spr.angle = randomAngle();
-				act->spr.xrepeat = act->spr.yrepeat = 48;
+				act->spr.SetScale(0.75, 0.75);
 				act->spr.cstat = 0;
 			}
 			else
@@ -1205,8 +1193,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 		switch (act->spr.picnum)
 		{
 		case FIRSTGUNSPRITE:
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			break;
 		case SHOTGUNAMMO:
 			act->spr.xrepeat = 18;
@@ -1237,8 +1224,7 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
 			break;
 		case BOATAMMO:
 			if (!isRRRA()) goto default_case;
-			act->spr.xrepeat = 16;
-			act->spr.yrepeat = 16;
+			act->spr.SetScale(0.25, 0.25);
 			break;
 		case COWPIE:
 			act->spr.xrepeat = 8;
diff --git a/source/games/exhumed/src/fish.cpp b/source/games/exhumed/src/fish.cpp
index 8d161aafa..4993d4aab 100644
--- a/source/games/exhumed/src/fish.cpp
+++ b/source/games/exhumed/src/fish.cpp
@@ -58,8 +58,7 @@ void BuildFishLimb(DExhumedActor* pActor, int anim)
     pChunkActor->spr.pal = 0;
     pChunkActor->vel.X = ((RandomSize(5) - 16) << 4);
     pChunkActor->vel.Y = ((RandomSize(5) - 16) << 4);
-    pChunkActor->spr.xrepeat = 64;
-    pChunkActor->spr.yrepeat = 64;
+    pChunkActor->spr.SetScale(1, 1);
     pChunkActor->spr.xoffset = 0;
     pChunkActor->spr.yoffset = 0;
     pChunkActor->vel.Z = ((-(RandomByte() + 512)) * 2) / 256.;
diff --git a/source/games/exhumed/src/move.cpp b/source/games/exhumed/src/move.cpp
index eb91f5a1f..36ba9faa6 100644
--- a/source/games/exhumed/src/move.cpp
+++ b/source/games/exhumed/src/move.cpp
@@ -1216,8 +1216,7 @@ DExhumedActor* BuildCreatureChunk(DExhumedActor* pSrc, int nPic, bool bSpecial)
         pActor->vel.Z *= 2;
     }
 
-    pActor->spr.xrepeat = 64;
-    pActor->spr.yrepeat = 64;
+    pActor->spr.SetScale(1, 1);
     pActor->spr.xoffset = 0;
     pActor->spr.yoffset = 0;
     pActor->spr.picnum = nPic;
diff --git a/source/games/exhumed/src/player.cpp b/source/games/exhumed/src/player.cpp
index 4732600bf..81be725f7 100644
--- a/source/games/exhumed/src/player.cpp
+++ b/source/games/exhumed/src/player.cpp
@@ -299,8 +299,7 @@ void RestartPlayer(int nPlayer)
 		floorsprt = insertActor(pActor->sector(), 0);
 
 		floorsprt->spr.pos = pActor->spr.pos;
-		floorsprt->spr.yrepeat = 64;
-		floorsprt->spr.xrepeat = 64;
+		floorsprt->spr.SetScale(1, 1);
 		floorsprt->spr.cstat = CSTAT_SPRITE_ALIGNMENT_FLOOR;
 		floorsprt->spr.picnum = nPlayer + kTile3571;
 	}
diff --git a/source/games/exhumed/src/ra.cpp b/source/games/exhumed/src/ra.cpp
index d10abfafc..b3bf41214 100644
--- a/source/games/exhumed/src/ra.cpp
+++ b/source/games/exhumed/src/ra.cpp
@@ -122,8 +122,7 @@ void BuildRa(int nPlayer)
     pActor->spr.hitag = 0;
     pActor->spr.intowner = runlist_AddRunRec(pActor->spr.lotag - 1, nPlayer, 0x210000);
     pActor->spr.pal = 1;
-    pActor->spr.xrepeat = 64;
-    pActor->spr.yrepeat = 64;
+    pActor->spr.SetScale(1, 1);
     pActor->spr.pos = pPlayerActor->spr.pos;
 
 //	GrabTimeSlot(3);
diff --git a/source/games/exhumed/src/rex.cpp b/source/games/exhumed/src/rex.cpp
index 72c099ade..743a9f0e9 100644
--- a/source/games/exhumed/src/rex.cpp
+++ b/source/games/exhumed/src/rex.cpp
@@ -60,8 +60,7 @@ void BuildRex(DExhumedActor* pActor, const DVector3& pos, sectortype* pSector, D
     pActor->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
     pActor->clipdist = 20;
     pActor->spr.shade = -12;
-    pActor->spr.xrepeat = 64;
-    pActor->spr.yrepeat = 64;
+    pActor->spr.SetScale(1, 1);
     pActor->spr.picnum = 1;
     pActor->spr.pal = pActor->sector()->ceilingpal;
     pActor->spr.xoffset = 0;
diff --git a/source/games/sw/src/break.cpp b/source/games/sw/src/break.cpp
index 18c281794..2bdfaf59a 100644
--- a/source/games/sw/src/break.cpp
+++ b/source/games/sw/src/break.cpp
@@ -604,7 +604,7 @@ int AutoBreakWall(walltype* wallp, const DVector3& hit_pos, DAngle ang, int type
         breakActor->spr.extra = 0;
         breakActor->spr.angle = ang;
         breakActor->spr.picnum = ST1;
-        breakActor->spr.xrepeat = breakActor->spr.yrepeat = 64;
+        breakActor->spr.SetScale(1, 1);
         SetActorZ(breakActor, hit_pos);
         SpawnShrap(breakActor, nullptr, -1, break_info);
         KillActor(breakActor);
diff --git a/source/games/sw/src/bunny.cpp b/source/games/sw/src/bunny.cpp
index 32ad59e5d..9790efe10 100644
--- a/source/games/sw/src/bunny.cpp
+++ b/source/games/sw/src/bunny.cpp
@@ -1237,7 +1237,7 @@ DSWActor* BunnyHatch2(DSWActor* actor)
     if (TEST_BOOL3(actor))
     {
         PickJumpMaxSpeed(actorNew, -600-RandomRange(600));
-        actorNew->spr.xrepeat = actorNew->spr.yrepeat = 64;
+        actorNew->spr.SetScale(1, 1);
         actorNew->vel.X = 9.375 + RandomRangeF(62.5);
         actorNew->user.Health = 1; // Easy to pop. Like shootn' skeet.
 		actorNew->spr.angle += RandomAngle(22.5) - RandomAngle(22.5);
diff --git a/source/games/sw/src/jweapon.cpp b/source/games/sw/src/jweapon.cpp
index c98c936f1..cab69c88c 100644
--- a/source/games/sw/src/jweapon.cpp
+++ b/source/games/sw/src/jweapon.cpp
@@ -1593,8 +1593,7 @@ void SpawnFlashBombOnActor(DSWActor* actor)
     if (actor != nullptr)
         actor->user.flameActor = actorNew;
 
-    actorNew->spr.xrepeat = 16;
-    actorNew->spr.yrepeat = 16;
+    actorNew->spr.SetScale(0.25, 0.25);
 
     if (actor->user.flameActor != nullptr)
     {
@@ -1645,8 +1644,7 @@ int PlayerInitCaltrops(PLAYER* pp)
     actorNew->user.Flags |= (SPR_XFLIP_TOGGLE);
 
     SetOwner(pp->actor, actorNew);
-    actorNew->spr.yrepeat = 64;
-    actorNew->spr.xrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.shade = -15;
     actorNew->user.WeaponNum = plActor->user.WeaponNum;
     actorNew->user.Radius = 200;
@@ -1696,8 +1694,7 @@ int InitCaltrops(DSWActor* actor)
     actorNew->user.Flags |= (SPR_XFLIP_TOGGLE);
 
     SetOwner(actor, actorNew);
-    actorNew->spr.yrepeat = 64;
-    actorNew->spr.xrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.shade = -15;
     // !FRANK - clipbox must be <= weapon otherwise can clip thru walls
     actorNew->copy_clipdist(actor);
@@ -1736,8 +1733,7 @@ int InitPhosphorus(DSWActor* actor)
     // actorNew->spr.cstat |= (CSTAT_SPRITE_TRANSLUCENT|CSTAT_SPRITE_YCENTER);
     actorNew->spr.shade = -128;
 
-    actorNew->spr.yrepeat = 64;
-    actorNew->spr.xrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.shade = -15;
     // !FRANK - clipbox must be <= weapon otherwise can clip thru walls
     if (actor->clipdist > 0)
diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp
index 314276440..c3e62c230 100644
--- a/source/games/sw/src/player.cpp
+++ b/source/games/sw/src/player.cpp
@@ -5950,8 +5950,7 @@ void DoPlayerBeginDie(PLAYER* pp)
         plActor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
         NewStateGroup(pp->actor, sg_PlayerHeadFly);
         plActor->user.ID = NINJA_Head_R0;
-        plActor->spr.xrepeat = 48;
-        plActor->spr.yrepeat = 48;
+        plActor->spr.SetScale(0.75, 0.75);
         // Blood fountains
         InitBloodSpray(pp->actor,true,105);
         break;
@@ -5965,8 +5964,7 @@ void DoPlayerBeginDie(PLAYER* pp)
         plActor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
         NewStateGroup(pp->actor, sg_PlayerHeadFly);
         plActor->user.ID = NINJA_Head_R0;
-        plActor->spr.xrepeat = 48;
-        plActor->spr.yrepeat = 48;
+        plActor->spr.SetScale(0.75, 0.75);
         // Blood fountains
         InitBloodSpray(pp->actor,true,-1);
         InitBloodSpray(pp->actor,true,-1);
@@ -5983,8 +5981,7 @@ void DoPlayerBeginDie(PLAYER* pp)
         plActor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
         NewStateGroup(pp->actor, sg_PlayerHeadFly);
         plActor->user.ID = NINJA_Head_R0;
-        plActor->spr.xrepeat = 48;
-        plActor->spr.yrepeat = 48;
+        plActor->spr.SetScale(0.75, 0.75);
         // Blood fountains
         InitBloodSpray(pp->actor,true,105);
         break;
diff --git a/source/games/sw/src/ripper.cpp b/source/games/sw/src/ripper.cpp
index aaba2ecd4..10ca141cb 100644
--- a/source/games/sw/src/ripper.cpp
+++ b/source/games/sw/src/ripper.cpp
@@ -835,8 +835,7 @@ int SetupRipper(DSWActor* actor)
     DoActorSetSpeed(actor, FAST_SPEED);
     actor->user.StateEnd = s_RipperDie;
     actor->user.Rot = sg_RipperRun;
-    actor->spr.xrepeat = 64;
-    actor->spr.yrepeat = 64;
+    actor->spr.SetScale(1, 1);
 
     if (actor->spr.pal == PALETTE_BROWN_RIPPER)
     {
@@ -1235,7 +1234,7 @@ void RipperHatch(DSWActor* actor)
         auto actorNew = insertActor(actor->sector(), STAT_DEFAULT);
         ClearOwner(actorNew);
         actorNew->spr.pos = actor->spr.pos;
-        actorNew->spr.xrepeat = actorNew->spr.yrepeat = 64;
+        actorNew->spr.SetScale(1, 1);
         actorNew->spr.angle = RandomAngle();
         actorNew->spr.pal = 0;
         SetupRipper(actorNew);
diff --git a/source/games/sw/src/ripper2.cpp b/source/games/sw/src/ripper2.cpp
index 48412506b..d417eff06 100644
--- a/source/games/sw/src/ripper2.cpp
+++ b/source/games/sw/src/ripper2.cpp
@@ -1242,7 +1242,7 @@ void Ripper2Hatch(DSWActor* actor)
         ClearOwner(actorNew);
         actorNew->spr.pos = actor->spr.pos;
 
-        actorNew->spr.xrepeat = actorNew->spr.yrepeat = 64;
+        actorNew->spr.SetScale(1, 1);
         actorNew->spr.angle = RandomAngle();
         actorNew->spr.pal = 0;
         actorNew->spr.shade = -10;
diff --git a/source/games/sw/src/sprite.cpp b/source/games/sw/src/sprite.cpp
index 814480eac..d23c8b207 100644
--- a/source/games/sw/src/sprite.cpp
+++ b/source/games/sw/src/sprite.cpp
@@ -927,8 +927,7 @@ DSWActor* SpawnActor(int stat, int id, STATE* state, sectortype* sect, const DVe
         PicAnimOff(spawnedActor->spr.picnum);
     }
 
-    spawnedActor->spr.xrepeat = 64;
-    spawnedActor->spr.yrepeat = 64;
+    spawnedActor->spr.SetScale(1, 1);
     spawnedActor->spr.angle = init_ang;
     spawnedActor->vel.X = vel;
 
diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp
index e7c44f317..1d86b61cd 100644
--- a/source/games/sw/src/weapon.cpp
+++ b/source/games/sw/src/weapon.cpp
@@ -9402,8 +9402,7 @@ int DoLaser(DSWActor* actor)
             auto actorNew = SpawnActor(STAT_MISSILE, PUFF, s_LaserPuff, actor->sector(), actor->spr.pos, actor->spr.angle, 0);
 
             actorNew->spr.shade = -40;
-            actorNew->spr.xrepeat = 16;
-            actorNew->spr.yrepeat = 16;
+            actorNew->spr.SetScale(0.25, 0.25);
             actorNew->spr.pal = actorNew->user.spal = PALETTE_RED_LIGHTING;
 
             actorNew->spr.cstat |= (CSTAT_SPRITE_YCENTER);
@@ -10056,8 +10055,7 @@ void SpawnFireballFlames(DSWActor* actor, DSWActor* enemyActor)
     if (enemyActor != nullptr)
         enemyActor->user.flameActor = actorNew;
 
-    actorNew->spr.xrepeat = 16;
-    actorNew->spr.yrepeat = 16;
+    actorNew->spr.SetScale(0.25, 0.25);
     if (enemyActor != nullptr)
     {
         // large flame for trees and such
@@ -10120,8 +10118,7 @@ int SpawnBreakFlames(DSWActor* actor)
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
 
-    actorNew->spr.xrepeat = 16;
-    actorNew->spr.yrepeat = 16;
+    actorNew->spr.SetScale(0.25, 0.25);
     actorNew->user.Counter = 48; // max flame size
 
     actorNew->spr.shade = -40;
@@ -10230,8 +10227,7 @@ void SpawnGoroFireballExp(DSWActor* actor)
     auto actorNew = SpawnActor(STAT_MISSILE, 0, s_FireballExp, actor->sector(), actor->spr.pos, actor->spr.angle, 0);
 
     actorNew->spr.hitag = LUMINOUS; //Always full brightness
-    actorNew->spr.xrepeat = 16;
-    actorNew->spr.yrepeat = 16;
+    actorNew->spr.SetScale(0.25, 0.25);
     SetOwner(GetOwner(actor), actorNew);
     actorNew->spr.shade = -40;
     actorNew->spr.pal = actorNew->user.spal = actor->user.spal;
@@ -10929,14 +10925,12 @@ void SpawnMeteorExp(DSWActor* actor)
     if (actor->spr.yrepeat < 64)
     {
         // small
-        expActor->spr.xrepeat = 64;
-        expActor->spr.yrepeat = 64;
+        expActor->spr.SetScale(1, 1);
     }
     else
     {
         // large - boss
-        expActor->spr.xrepeat = 80;
-        expActor->spr.yrepeat = 80;
+        expActor->spr.SetScale(1.25, 1.25);
     }
 
     expActor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
@@ -11209,8 +11203,7 @@ int DoNapalm(DSWActor* actor)
         SetOwner(actor, expActor);
         expActor->spr.shade = -40;
         expActor->spr.cstat = actor->spr.cstat;
-        expActor->spr.xrepeat = 48;
-        expActor->spr.yrepeat = 64;
+        expActor->spr.SetScale(0.75, 1);
         expActor->spr.cstat |= (CSTAT_SPRITE_YCENTER);
         if (RANDOM_P2(1024) < 512)
             expActor->spr.cstat |= (CSTAT_SPRITE_XFLIP);
@@ -11969,8 +11962,7 @@ int InitSerpRing(DSWActor* actor)
         actorNew->vel.X = 31.25;
         SetOwner(actor, actorNew);
         actorNew->spr.shade = -20;
-        actorNew->spr.xrepeat = 64;
-        actorNew->spr.yrepeat = 64;
+        actorNew->spr.SetScale(1, 1);
         actorNew->spr.yint = 2*RINGMOVETICS;
         actorNew->vel.Z = 3;
         actorNew->spr.pal = 0;
@@ -12698,8 +12690,7 @@ int InitSumoSkull(DSWActor* actor)
     actorNew->vel.X = 31.25;
     SetOwner(actor, actorNew);
     actorNew->spr.shade = -20;
-    actorNew->spr.xrepeat = 64;
-    actorNew->spr.yrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.pal = 0;
 
     // randomize the head turning angle
@@ -13834,8 +13825,7 @@ int InitBunnyRocket(PLAYER* pp)
     auto actorNew = SpawnActor(STAT_MISSILE, BOLT_THINMAN_R4, &s_BunnyRocket[0][0], pp->cursector, pos, pp->angle.ang, ROCKET_VELOCITY);
 
     SetOwner(pp->actor, actorNew);
-    actorNew->spr.yrepeat = 64;
-    actorNew->spr.xrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.shade = -15;
     zvel = pp->horizon.horiz.Tan() * ((HORIZ_MULT + 35) * 0.5);
 
@@ -14543,8 +14533,7 @@ int InitSerpSpell(DSWActor* actor)
         actorNew->spr.shade = -40;
         PlaySound(DIGI_SERPMAGICLAUNCH, actor, v3df_none);
         actorNew->user.spal = actorNew->spr.pal = 27; // Bright Green
-        actorNew->spr.xrepeat = 64;
-        actorNew->spr.yrepeat = 64;
+        actorNew->spr.SetScale(1, 1);
         actorNew->clipdist = 2;
         actorNew->vel.Z = 0;
         actorNew->spr.cstat |= (CSTAT_SPRITE_YCENTER);
@@ -14920,8 +14909,7 @@ int InitEnemyStar(DSWActor* actor)
                                  ActorVectOfMiddle(actor), actor->user.targetActor->spr.angle, NINJA_STAR_VELOCITY);
 
     SetOwner(actor, actorNew);
-    actorNew->spr.yrepeat = 16;
-    actorNew->spr.xrepeat = 16;
+    actorNew->spr.SetScale(0.25, 0.25);
     actorNew->spr.shade = -25;
     actorNew->vel.Z = 0;
     actorNew->spr.angle = actor->spr.angle;
@@ -17644,8 +17632,7 @@ int SpawnVehicleSmoke(DSWActor* actor)
 
     actorNew->user.WaitTics = 1*120;
     actorNew->spr.shade = -40;
-    actorNew->spr.xrepeat = 64;
-    actorNew->spr.yrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.cstat |= (CSTAT_SPRITE_YCENTER);
     actorNew->spr.cstat &= ~(CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
 
@@ -17674,8 +17661,7 @@ int SpawnSmokePuff(DSWActor* actor)
 
     actorNew->user.WaitTics = 1*120;
     actorNew->spr.shade = -40;
-    actorNew->spr.xrepeat = 64;
-    actorNew->spr.yrepeat = 64;
+    actorNew->spr.SetScale(1, 1);
     actorNew->spr.cstat |= (CSTAT_SPRITE_YCENTER);
     actorNew->spr.cstat &= ~(CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
 
@@ -17934,7 +17920,7 @@ void QueueHole(sectortype* hit_sect, walltype* hit_wall, const DVector3& pos)
 
     HoleQueueHead = (HoleQueueHead+1) & (MAX_HOLE_QUEUE-1);
 
-    spawnedActor->spr.xrepeat = spawnedActor->spr.yrepeat = 16;
+    spawnedActor->spr.SetScale(0.25, 0.25);
     spawnedActor->spr.cstat = 0;
     spawnedActor->spr.pal = 0;
     spawnedActor->spr.shade = 0;