From 64391c52f9e79516c1870fd566fc564a12eb4193 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@users.noreply.github.com>
Date: Tue, 16 Aug 2022 23:46:18 +0200
Subject: [PATCH] - large batch of set_int_pos, minus Exhumed

---
 source/core/maptypes.h                   |  1 +
 source/games/blood/src/actor.cpp         |  8 ++------
 source/games/blood/src/animatesprite.cpp |  6 +++---
 source/games/blood/src/gameutil.h        |  7 +++++++
 source/games/blood/src/nnexts.cpp        |  6 ++----
 source/games/duke/src/actors_d.cpp       | 13 ++++---------
 source/games/sw/src/draw.cpp             | 13 ++-----------
 source/games/sw/src/player.cpp           |  2 +-
 8 files changed, 22 insertions(+), 34 deletions(-)

diff --git a/source/core/maptypes.h b/source/core/maptypes.h
index b0be0da19..02ffcb2c6 100644
--- a/source/core/maptypes.h
+++ b/source/core/maptypes.h
@@ -429,6 +429,7 @@ struct walltype
 	walltype* point2Wall() const;
 	vec2_t delta() const { return point2Wall()->wall_int_pos() - wall_int_pos(); }
 	vec2_t center() const { return(point2Wall()->wall_int_pos() + wall_int_pos()) / 2; }
+	DVector2 fcenter() const { return(point2Wall()->pos + pos) / 2; }
 	int deltax() const { return point2Wall()->wall_int_pos().X - wall_int_pos().X; }
 	int deltay() const { return point2Wall()->wall_int_pos().Y - wall_int_pos().Y; }
 	bool twoSided() const { return nextsector >= 0; }
diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp
index b71cd53f5..0f1a065ab 100644
--- a/source/games/blood/src/actor.cpp
+++ b/source/games/blood/src/actor.cpp
@@ -4541,9 +4541,7 @@ static Collision MoveThing(DBloodActor* actor)
 		actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
 		if ((actor->GetOwner()) && !cl_bloodvanillaexplosions && !VanillaMode())
 			enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy
-		auto pos = actor->int_pos();
-		ClipMove(pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, actor->spr.clipdist << 2, (actor->int_pos().Z - top) / 4, (bottom - actor->int_pos().Z) / 4, CLIPMASK0, lhit);
-		actor->set_int_pos(pos);
+		ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, actor->spr.clipdist << 2, (actor->int_pos().Z - top) / 4, (bottom - actor->int_pos().Z) / 4, CLIPMASK0, lhit);
 		actor->hit.hit = lhit;
 		enginecompatibility_mode = bakCompat; // restore
 		actor->spr.cstat = bakCstat;
@@ -4763,9 +4761,7 @@ void MoveDude(DBloodActor* actor)
 		{
 			auto bakCstat = actor->spr.cstat;
 			actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
-			auto pos = actor->int_pos();
-			ClipMove(pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit);
-			actor->set_int_pos(pos);
+			ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit);
 			if (pSector == nullptr)
 			{
 				pSector = actor->sector();
diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp
index 8266a2594..f1d439ea2 100644
--- a/source/games/blood/src/animatesprite.cpp
+++ b/source/games/blood/src/animatesprite.cpp
@@ -444,7 +444,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 			break;
 
 		sectortype* pSector = pTSprite->sectp;
-		pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pSector->int_ceilingz() });
+		pNSprite->pos = { pTSprite->pos.X, pTSprite->pos.Y, pSector->ceilingz };
 
 		pNSprite->picnum = 624;
 		pNSprite->shade = ((pTSprite->int_pos().Z - pSector->int_ceilingz()) >> 8) - 64;
@@ -462,7 +462,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 			break;
 
 		sectortype* pSector = pTSprite->sectp;
-		pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pSector->int_floorz() });
+		pNSprite->pos = { pTSprite->pos.X, pTSprite->pos.Y, pSector->floorz };
 		pNSprite->picnum = 624;
 		uint8_t nShade = (pSector->int_floorz() - pTSprite->int_pos().Z) >> 8;
 		pNSprite->shade = nShade - 32;
@@ -499,7 +499,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF
 		if (!pNSprite)
 			break;
 
-		pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pTSprite->int_pos().Z - (32 << 8) - (weaponIcon.zOffset << 8) });
+		pNSprite->pos = pTSprite->pos.plusZ(-32 - weaponIcon.zOffset);
 		pNSprite->picnum = nTile;
 		pNSprite->shade = pTSprite->shade;
 		pNSprite->xrepeat = 32;
diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h
index 5b63e289c..d615ceb89 100644
--- a/source/games/blood/src/gameutil.h
+++ b/source/games/blood/src/gameutil.h
@@ -47,6 +47,13 @@ void GetZRange(DBloodActor* pSprite, int* ceilZ, Collision* ceilHit, int* floorZ
 void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int* ceilZ, Collision* ceilHit, int* floorZ, Collision* floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0);
 int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3);
 void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3);
+inline void ClipMove(DVector3& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3)
+{
+	// this uses floats only partially.
+	vec3_t ipos = { int(pos.X * worldtoint), int(pos.Y * worldtoint), int(pos.Z * zworldtoint)};
+	ClipMove(ipos, pSector, xv, yv, wd, cd, fd, nMask, hit, tracecount);
+	pos = { ipos.X * inttoworld, ipos.Y * inttoworld, ipos.Z * zinttoworld };
+}
 BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray<walltype*>* pWalls, bool newSectCheckMethod = false);
 int picWidth(int nPic, int repeat);
 int picHeight(int nPic, int repeat);
diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp
index 2a122ddd3..9268af00c 100644
--- a/source/games/blood/src/nnexts.cpp
+++ b/source/games/blood/src/nnexts.cpp
@@ -977,7 +977,7 @@ static DBloodActor* randomDropPickupObject(DBloodActor* sourceactor, int prevIte
 			if (spawned)
 			{
 				sourceactor->xspr.dropMsg = uint8_t(spawned->spr.type); // store dropped item type in dropMsg
-				spawned->set_int_pos(sourceactor->int_pos());
+				spawned->spr.pos = sourceactor->spr.pos;
 
 				if ((sourceactor->spr.flags & kModernTypeFlag1) && (sourceactor->xspr.txID > 0 || (sourceactor->xspr.txID != 3 && sourceactor->xspr.lockMsg > 0)))
 				{
@@ -1676,10 +1676,8 @@ void debrisMove(int listIndex)
 		auto oldcstat = actor->spr.cstat;
 		actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
 
-		auto pos = actor->int_pos();
-		ClipMove(pos, &pSector, actor->vel.X >> 12,
+		ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12,
 			actor->vel.Y >> 12, clipDist, ceilDist, floorDist, CLIPMASK0, moveHit);
-		actor->set_int_pos(pos);
 		actor->hit.hit = moveHit;
 
 		actor->spr.cstat = oldcstat;
diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp
index 7798becdc..c23e1f901 100644
--- a/source/games/duke/src/actors_d.cpp
+++ b/source/games/duke/src/actors_d.cpp
@@ -2957,16 +2957,11 @@ static void fireflyflyingeffect(DDukeActor *actor)
 	else
 		actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE;
 
-	double dx = Owner->int_pos().X - ps[p].GetActor()->int_pos().X;
-	double dy = Owner->int_pos().Y - ps[p].GetActor()->int_pos().Y;
-	double dist = sqrt(dx * dx + dy * dy);
-	if (dist != 0.0) 
-	{
-		dx /= dist;
-		dy /= dist;
-	}
+	auto dvec = Owner->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY();
+	double dist = dvec.Length();
 
-	actor->set_int_pos({ (int)(Owner->int_pos().X - (dx * -10.0)), (int)(Owner->int_pos().Y - (dy * -10.0)), Owner->int_pos().Z + 2048 });
+	if (dist != 0.0) dvec /= dist;
+	actor->spr.pos = Owner->spr.pos + DVector3(dvec.X * -0.625, dvec.Y * -0.625, 8);
 
 	if (Owner->spr.extra <= 0) 
 	{
diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp
index 9037f5625..7b6f5bd07 100644
--- a/source/games/sw/src/draw.cpp
+++ b/source/games/sw/src/draw.cpp
@@ -427,7 +427,6 @@ void DoMotionBlur(tspriteArray& tsprites, tspritetype const * const tsp)
 void WarpCopySprite(tspriteArray& tsprites)
 {
     int spnum;
-    int xoff,yoff,zoff;
     int match;
 
     // look for the first one
@@ -456,15 +455,7 @@ void WarpCopySprite(tspriteArray& tsprites)
 
                     tspritetype* newTSpr = renderAddTsprite(tsprites, itActor2);
                     newTSpr->statnum = 0;
-
-                    xoff = itActor->int_pos().X - newTSpr->int_pos().X;
-                    yoff = itActor->int_pos().Y - newTSpr->int_pos().Y;
-                    zoff = itActor->int_pos().Z - newTSpr->int_pos().Z;
-
-                    newTSpr->set_int_pos({
-                        itActor1->int_pos().X - xoff,
-                        itActor1->int_pos().Y - yoff,
-                        itActor1->int_pos().Z - zoff });
+					newTSpr->pos += itActor1->spr.pos - itActor->spr.pos;
                     newTSpr->sectp = itActor1->sector();
                 }
 
@@ -481,7 +472,7 @@ void WarpCopySprite(tspriteArray& tsprites)
                     newTSpr->statnum = 0;
 
                     auto off = itActor1->int_pos() - newTSpr->int_pos();
-                    newTSpr->set_int_pos(itActor->int_pos() - off);
+                    newTSpr->pos += itActor->spr.pos - itActor1->spr.pos;
                     newTSpr->sectp = itActor->sector();
                 }
             }
diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp
index eede56cfa..5a78f961b 100644
--- a/source/games/sw/src/player.cpp
+++ b/source/games/sw/src/player.cpp
@@ -1716,7 +1716,7 @@ void UpdatePlayerUnderSprite(PLAYER* pp)
 
     DSWActor* act_under = pp->PlayerUnderActor;
 
-    act_under->set_int_pos(act_over->int_pos());
+    act_under->spr.pos = act_over->spr.pos;
     ChangeActorSect(act_under, act_over->sector());
 
     SpriteWarpToUnderwater(act_under);