From afa5f22b3135c4424bf29d70653c2c097baf9fc7 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <c.oelckers@zdoom.fake>
Date: Sun, 20 Mar 2016 21:51:09 +0100
Subject: [PATCH] - added two floating point special variables, because the two
 existing ones are integers and unusable for storing doubles.

---
 src/actor.h                   |  5 +++++
 src/fragglescript/t_func.cpp  | 10 +++++-----
 src/g_hexen/a_clericflame.cpp | 10 +++++-----
 src/p_mobj.cpp                |  8 ++++----
 src/r_defs.h                  |  5 +++++
 5 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/src/actor.h b/src/actor.h
index 8d58a5a6ab..c449f5229a 100644
--- a/src/actor.h
+++ b/src/actor.h
@@ -1136,6 +1136,7 @@ public:
 	}
 
 	double			projectilepassheight;	// height for clipping projectile movement against this actor
+	
 	SDWORD			tics;				// state tic counter
 	FState			*state;
 	VMFunction		*Damage;			// For missiles and monster railgun
@@ -1153,6 +1154,9 @@ public:
 
 	int				special1;		// Special info
 	int				special2;		// Special info
+	double			specialf1;		// With floats we cannot use the int versions for storing position or angle data without reverting to fixed point (which we do not want.)
+	double			specialf2;
+
 	int				weaponspecial;	// Special info for weapons.
 	int 			health;
 	BYTE			movedir;		// 0-7
@@ -1290,6 +1294,7 @@ public:
 	void AddToHash ();
 	void RemoveFromHash ();
 
+
 private:
 	static AActor *TIDHash[128];
 	static inline int TIDHASH (int key) { return key & 127; }
diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp
index 3ac381041f..0e9216d808 100644
--- a/src/fragglescript/t_func.cpp
+++ b/src/fragglescript/t_func.cpp
@@ -1459,9 +1459,9 @@ void FParser::SF_SetCamera(void)
 		
 		angle = t_argc < 2 ? newcamera->Angles.Yaw : floatvalue(t_argv[1]);
 
-		newcamera->special1 = newcamera->Angles.Yaw.BAMs();
-		newcamera->special2=newcamera->_f_Z();
-		newcamera->_f_SetZ(t_argc < 3 ? (newcamera->_f_Z() + (41 << FRACBITS)) : (intvalue(t_argv[2]) << FRACBITS));
+		newcamera->specialf1 = newcamera->Angles.Yaw.Degrees;
+		newcamera->specialf2 = newcamera->Z();
+		newcamera->SetZ(t_argc < 3 ? newcamera->Z() + 41 : floatvalue(t_argv[2]));
 		newcamera->Angles.Yaw = angle;
 		if (t_argc < 4) newcamera->Angles.Pitch = 0.;
 		else newcamera->Angles.Pitch = clamp(floatvalue(t_argv[3]), -50., 50.) * (20. / 32.);
@@ -1485,8 +1485,8 @@ void FParser::SF_ClearCamera(void)
 	if (cam)
 	{
 		player->camera=player->mo;
-		cam->Angles.Yaw = ANGLE2DBL(cam->special1);
-		cam->_f_SetZ(cam->special2);
+		cam->Angles.Yaw = cam->specialf1;
+		cam->SetZ(cam->specialf2);
 	}
 
 }
diff --git a/src/g_hexen/a_clericflame.cpp b/src/g_hexen/a_clericflame.cpp
index c99b1fc830..10aff1ca04 100644
--- a/src/g_hexen/a_clericflame.cpp
+++ b/src/g_hexen/a_clericflame.cpp
@@ -134,8 +134,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile)
 				mo->Angles.Yaw = an;
 				mo->target = self->target;
 				mo->VelFromAngle(FLAMESPEED);
-				mo->special1 = FLOAT2FIXED(mo->Vel.X);
-				mo->special2 = FLOAT2FIXED(mo->Vel.Y);
+				mo->specialf1 = mo->Vel.X;
+				mo->specialf2 = mo->Vel.Y;
 				mo->tics -= pr_missile()&3;
 			}
 			mo = Spawn ("CircleFlame", BlockingMobj->Vec3Offset(
@@ -146,8 +146,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameMissile)
 				mo->Angles.Yaw = an + 180.;
 				mo->target = self->target;
 				mo->VelFromAngle(-FLAMESPEED);
-				mo->special1 = FLOAT2FIXED(mo->Vel.X);
-				mo->special2 = FLOAT2FIXED(mo->Vel.Y);
+				mo->specialf1 = mo->Vel.X;
+				mo->specialf2 = mo->Vel.Y;
 				mo->tics -= pr_missile()&3;
 			}
 		}
@@ -168,7 +168,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_CFlameRotate)
 
 	DAngle an = self->Angles.Yaw + 90.;
 	self->VelFromAngle(an, FLAMEROTSPEED);
-	self->Vel += DVector2(FIXED2DBL(self->special1), FIXED2DBL(self->special2));
+	self->Vel += DVector2(self->specialf1, self->specialf2);
 
 	self->Angles.Yaw += 6.;
 	return 0;
diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp
index 22d7c87fc0..7d183914e1 100644
--- a/src/p_mobj.cpp
+++ b/src/p_mobj.cpp
@@ -2425,9 +2425,9 @@ void P_ZMovement (AActor *mo, fixed_t oldfloorz)
 	// Hexen yanked all items to the floor, except those being spawned at map start in the air.
 	// Those were kept at their original height.
 	// Do this only if the item was actually spawned by the map above ground to avoid problems.
-	if (mo->special1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB))
+	if (mo->specialf1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB))
 	{
-		mo->_f_SetZ(mo->_f_floorz() + mo->special1);
+		mo->SetZ(mo->floorz + mo->specialf1);
 	}
 
 
@@ -5123,7 +5123,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
 		mobj->_f_AddZ(mthing->z);
 		if ((mobj->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB))
 		{
-			mobj->special1 = mthing->z;
+			mobj->specialf1 = FIXED2DBL(mthing->z);
 		}
 	}
 	else if (z == ONCEILINGZ)
@@ -5140,7 +5140,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
 	else mobj->flags &= ~MF_NOGRAVITY;
 
 	// For Hexen floatbob 'compatibility' we do not really want to alter the floorz.
-	if (mobj->special1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(ib_compatflags & BCOMPATF_FLOATBOB))
+	if (mobj->specialf1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(ib_compatflags & BCOMPATF_FLOATBOB))
 	{
 		P_FindFloorCeiling(mobj, FFCF_SAMESECTOR | FFCF_ONLY3DFLOORS | FFCF_3DRESTRICT);
 	}
diff --git a/src/r_defs.h b/src/r_defs.h
index a66575bb22..4e7e1a5041 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -281,6 +281,11 @@ struct secplane_t
 		return FixedMul (ic, -d - DMulScale16 (a, ac->_f_X(), b, ac->_f_Y()));
 	}
 
+	double ZatPointF(const AActor *ac) const
+	{
+		return FIXED2DBL(ZatPoint(ac));
+	}
+
 	// Returns the value of z at (x,y) if d is equal to dist
 	fixed_t ZatPointDist (fixed_t x, fixed_t y, fixed_t dist) const
 	{