From 3c09f41b436e86296542892c754d815bd7cad8ae Mon Sep 17 00:00:00 2001
From: Mitchell Richters <mjr4077au@gmail.com>
Date: Sat, 28 Aug 2021 11:53:26 +1000
Subject: [PATCH] - Blood: Use more precision for flicker, quake and tilt
 effects.

---
 source/games/blood/src/common_game.h |  5 +++
 source/games/blood/src/view.cpp      | 54 +++++++++-------------------
 2 files changed, 22 insertions(+), 37 deletions(-)

diff --git a/source/games/blood/src/common_game.h b/source/games/blood/src/common_game.h
index 30768ba05..4e5684c34 100644
--- a/source/games/blood/src/common_game.h
+++ b/source/games/blood/src/common_game.h
@@ -561,6 +561,11 @@ inline int QRandom2(int a1)
     return MulScale(qrand(), a1, 14)-a1;
 }
 
+inline double QRandom2F(double a1)
+{
+    return MulScaleF(qrand(), a1, 14)-a1;
+}
+
 template<class T>
 inline void SetBitString(T *pArray, int nIndex)
 {
diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp
index 23c6e3952..61036221b 100644
--- a/source/games/blood/src/view.cpp
+++ b/source/games/blood/src/view.cpp
@@ -359,43 +359,23 @@ void viewUpdateDelirium(void)
 
 void viewUpdateShake(int& cX, int& cY, int& cZ, binangle& cA, fixedhoriz& cH, double& pshakeX, double& pshakeY)
 {
-    int shakeHoriz = 0;
-    int shakeAngle = 0;
-    int shakeX = 0;
-    int shakeY = 0;
-    int shakeZ = 0;
-    int shakeBobX = 0;
-    int shakeBobY = 0;
-    if (gView->flickerEffect)
+    auto doEffect = [&](const int& effectType)
     {
-        int nValue = ClipHigh(gView->flickerEffect * 8, 2000);
-        shakeHoriz += QRandom2(nValue >> 8);
-        shakeAngle += QRandom2(nValue >> 8);
-        shakeX += QRandom2(nValue >> 4);
-        shakeY += QRandom2(nValue >> 4);
-        shakeZ += QRandom2(nValue);
-        shakeBobX += QRandom2(nValue);
-        shakeBobY += QRandom2(nValue);
-    }
-    if (gView->quakeEffect)
-    {
-        int nValue = ClipHigh(gView->quakeEffect * 8, 2000);
-        shakeHoriz += QRandom2(nValue >> 8);
-        shakeAngle += QRandom2(nValue >> 8);
-        shakeX += QRandom2(nValue >> 4);
-        shakeY += QRandom2(nValue >> 4);
-        shakeZ += QRandom2(nValue);
-        shakeBobX += QRandom2(nValue);
-        shakeBobY += QRandom2(nValue);
-    }
-    cH += buildhoriz(shakeHoriz);
-    cA += buildang(shakeAngle);
-    cX += shakeX;
-    cY += shakeY;
-    cZ += shakeZ;
-    pshakeX += shakeBobX;
-    pshakeY += shakeBobY;
+        if (effectType)
+        {
+            int nValue = ClipHigh(effectType * 8, 2000);
+            cH += buildfhoriz(QRandom2F(nValue * (1. / 256.)));
+            cA += buildfang(QRandom2F(nValue * (1. / 256.)));
+            cX += QRandom2(nValue >> 4);
+            cY += QRandom2(nValue >> 4);
+            cZ += QRandom2(nValue);
+            pshakeX += QRandom2F(nValue);
+            pshakeY += QRandom2F(nValue);
+        }
+    };
 
+    doEffect(gView->flickerEffect);
+    doEffect(gView->quakeEffect);
 }
 
 
@@ -483,7 +463,7 @@ void SetupView(int &cX, int& cY, int& cZ, binangle& cA, fixedhoriz& cH, int& nSe
     }
 
     viewUpdateShake(cX, cY, cZ, cA, cH, shakeX, shakeY);
-    cH += buildhoriz(MulScale(0x40000000 - Cos(gView->tiltEffect << 2), 30, 30));
+    cH += q16horiz(xs_CRoundToInt(MulScaleF(double(0x40000000) - bcosf(gView->tiltEffect << 2, 16), 30, 14)));
     if (gViewPos == 0)
     {
         if (cl_viewhbob)
@@ -495,7 +475,7 @@ void SetupView(int &cX, int& cY, int& cZ, binangle& cA, fixedhoriz& cH, int& nSe
         {
             cZ += bobHeight;
         }
-        cZ += xs_CRoundToInt(cH.asq16() / 6553.6);
+        cZ += xs_CRoundToInt(cH.asq16() * (1. / 6553.6));
         cameradist = -1;
         cameraclock = PlayClock + MulScale(4, (int)gInterpolate, 16);
     }