From 6a4812ce48649b65155dcd27685efdbc5bfee605 Mon Sep 17 00:00:00 2001
From: Mitchell Richters <mjr4077au@gmail.com>
Date: Thu, 1 Sep 2022 23:04:03 +1000
Subject: [PATCH] - Duke: Floatify `CSTAT_SPRITE_ALIGNMENT_WALL` automap draw
 code.

---
 source/games/duke/src/game_misc.cpp | 36 ++++++++++-------------------
 1 file changed, 12 insertions(+), 24 deletions(-)

diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp
index 75de66d8d..29e8f7b62 100644
--- a/source/games/duke/src/game_misc.cpp
+++ b/source/games/duke/src/game_misc.cpp
@@ -387,7 +387,7 @@ ReservedSpace GameInterface::GetReservedScreenSpace(int viewsize)
 
 bool GameInterface::DrawAutomapPlayer(int mx, int my, int cposx, int cposy, const double czoom, const DAngle cang, double const smoothratio)
 {
-	DVector2 v1, v2, v3, v4;
+	DVector2 b1, b2, b3, b4, v1, v2, v3, v4;
 	DAngle an;
 	int i, j, k, l, x1, y1, x2, y2, x3, y3, x4, y4, ox, oy, xoff, yoff;
 	int dax, day, cosang, sinang, xspan, yspan, sprx, spry;
@@ -419,6 +419,8 @@ bool GameInterface::DrawAutomapPlayer(int mx, int my, int cposx, int cposy, cons
 			spry = act->int_pos().Y;
 
 			auto xydim = DVector2(twod->GetWidth() * 0.5, twod->GetHeight() * 0.5);
+			auto sp = DVector2(sprx, spry) * inttoworld;
+			auto cp = DVector2(cposx, cposy) * inttoworld;
 
 			if ((act->spr.cstat & CSTAT_SPRITE_BLOCK_ALL) != 0) switch (act->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK)
 			{
@@ -435,36 +437,22 @@ bool GameInterface::DrawAutomapPlayer(int mx, int my, int cposx, int cposy, cons
 			case CSTAT_SPRITE_ALIGNMENT_WALL:
 				if (actorflag(act, SFLAG2_SHOWWALLSPRITEONMAP))
 				{
-					x1 = sprx;
-					y1 = spry;
 					tilenum = act->spr.picnum;
 					xoff = tileLeftOffset(tilenum) + act->spr.xoffset;
 					if ((act->spr.cstat & CSTAT_SPRITE_XFLIP) > 0) xoff = -xoff;
-					k = act->int_ang();
-					l = act->spr.xrepeat;
-					dax = bsin(k) * l;
-					day = -bcos(k) * l;
-					l = tileWidth(tilenum);
-					k = (l >> 1) + xoff;
-					x1 -= MulScale(dax, k, 16);
-					x2 = x1 + MulScale(dax, l, 16);
-					y1 -= MulScale(day, k, 16);
-					y2 = y1 + MulScale(day, l, 16);
 
-					ox = x1 - cposx;
-					oy = y1 - cposy;
-					x1 = DMulScale(ox, xvect, -oy, yvect, 16);
-					y1 = DMulScale(oy, xvect, ox, yvect, 16);
+					xspan = tileWidth(tilenum);
 
-					ox = x2 - cposx;
-					oy = y2 - cposy;
-					x2 = DMulScale(ox, xvect, -oy, yvect, 16);
-					y2 = DMulScale(oy, xvect, ox, yvect, 16);
+					an = -cang;
+					b1 = act->spr.angle.ToVector().Rotated90CW() * act->spr.xrepeat * (1. / 64.);
+					b2 = sp * inttoworld - b1 * ((xspan * 0.5) + xoff);
+					b3 = b2 + b1 * xspan;
 
-					drawlinergb(x1 + xdim, y1 + ydim,
-						x2 + xdim, y2 + ydim, col);
+					v1 = OutAutomapVector(b2 - cp, an.Sin(), an.Cos(), czoom / 1024., xydim);
+					v2 = OutAutomapVector(b3 - cp, an.Sin(), an.Cos(), czoom / 1024., xydim);
+
+					drawlinergb(v1.X, v1.Y, v2.X, v2.Y, col);
 				}
-
 				break;
 
 			case CSTAT_SPRITE_ALIGNMENT_FLOOR: