From b6d04ffec00c0dfc133e3deea6eb3f610324b176 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@users.noreply.github.com>
Date: Thu, 23 Dec 2021 17:04:54 +0100
Subject: [PATCH] - Exhumed: pActor->s() in object.cpp

---
 source/games/exhumed/src/object.cpp | 206 +++++++++++++---------------
 1 file changed, 94 insertions(+), 112 deletions(-)

diff --git a/source/games/exhumed/src/object.cpp b/source/games/exhumed/src/object.cpp
index 3eaf71f4b..bd1fda2ae 100644
--- a/source/games/exhumed/src/object.cpp
+++ b/source/games/exhumed/src/object.cpp
@@ -392,11 +392,10 @@ DExhumedActor* BuildWallSprite(sectortype* pSector)
     auto wal = pSector->firstWall();
 
     auto pActor = insertActor(pSector, 401);
-    auto pSprite = &pActor->s();
 
-	pSprite->pos.vec2 = wal->center();
-    pSprite->pos.Z = (pSector->floorz + pSector->ceilingz) / 2;
-    pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
+	pActor->spr.pos.vec2 = wal->center();
+    pActor->spr.pos.Z = (pSector->floorz + pSector->ceilingz) / 2;
+    pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
 
     return pActor;
  }
@@ -598,8 +597,7 @@ int CheckSectorSprites(sectortype* pSector, int nVal)
         ExhumedSectIterator it(pSector);
         while (auto pActor= it.Next())
         {
-            auto pSprite = &pActor->s();
-            if ((pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL) && (nZDiff < GetActorHeight(pActor)))
+            if ((pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL) && (nZDiff < GetActorHeight(pActor)))
             {
                 if (nVal != 1) {
                     return 1;
@@ -609,12 +607,12 @@ int CheckSectorSprites(sectortype* pSector, int nVal)
 
                 runlist_DamageEnemy(pActor, nullptr, 5);
 
-                if (pSprite->statnum == 100 && PlayerList[GetPlayerFromActor(pActor)].nHealth <= 0)
+                if (pActor->spr.statnum == 100 && PlayerList[GetPlayerFromActor(pActor)].nHealth <= 0)
                 {
                     PlayFXAtXYZ(StaticSound[kSoundJonFDie],
-                        pSprite->pos.X,
-                        pSprite->pos.Y,
-                        pSprite->pos.Z,
+                        pActor->spr.pos.X,
+                        pActor->spr.pos.Y,
+                        pActor->spr.pos.Z,
                         CHANF_NONE, 0x4000);
                 }
             }
@@ -645,11 +643,10 @@ void MoveSectorSprites(sectortype* pSector, int z)
     ExhumedSectIterator it(pSector);
     while (auto pActor = it.Next())
     {
-        auto pSprite = &pActor->s();
-        int z = pSprite->pos.Z;
-        if ((pSprite->statnum != 200 && z >= minz && z <= maxz) || pSprite->statnum >= 900)
+        int z = pActor->spr.pos.Z;
+        if ((pActor->spr.statnum != 200 && z >= minz && z <= maxz) || pActor->spr.statnum >= 900)
         {
-            pSprite->pos.Z = newz;
+            pActor->spr.pos.Z = newz;
         }
     }
 }
@@ -1023,14 +1020,13 @@ int BuildSlide(int nChannel, walltype* pStartWall, walltype* pWall1, walltype* p
 
 
     auto pActor = insertActor(pSector, 899);
-    auto pSprite = &pActor->s();
 
     SlideData[nSlide].pActor = pActor;
-    pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
-    pSprite->pos.X = pStartWall->pos.X;
-    pSprite->pos.Y = pStartWall->pos.Y;
-    pSprite->pos.Z = pSector->floorz;
-    pSprite->backuppos();
+    pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
+    pActor->spr.pos.X = pStartWall->pos.X;
+    pActor->spr.pos.Y = pStartWall->pos.Y;
+    pActor->spr.pos.Z = pSector->floorz;
+    pActor->spr.backuppos();
 
     SlideData[nSlide].nRunC = 0;
 
@@ -1203,7 +1199,6 @@ void AISlide::Tick(RunListEvent* ev)
 
 int BuildTrap(DExhumedActor* pActor, int edx, int ebx, int ecx)
 {
-    auto pSprite = &pActor->s();
     int var_14 = edx;
     int var_18 = ebx;
     int var_10 = ecx;
@@ -1213,15 +1208,15 @@ int BuildTrap(DExhumedActor* pActor, int edx, int ebx, int ecx)
 
     ChangeActorStat(pActor, 0);
 
-    pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
-    pSprite->xvel = 0;
-    pSprite->yvel = 0;
-    pSprite->zvel = 0;
-    pSprite->extra = -1;
+    pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
+    pActor->spr.xvel = 0;
+    pActor->spr.yvel = 0;
+    pActor->spr.zvel = 0;
+    pActor->spr.extra = -1;
 
-    pSprite->lotag = runlist_HeadRun() + 1;
-    pSprite->hitag = runlist_AddRunRec(NewRun, nTrap, 0x1F0000);
-    pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, nTrap, 0x1F0000);
+    pActor->spr.lotag = runlist_HeadRun() + 1;
+    pActor->spr.hitag = runlist_AddRunRec(NewRun, nTrap, 0x1F0000);
+    pActor->spr.owner = runlist_AddRunRec(pActor->spr.lotag - 1, nTrap, 0x1F0000);
 
     //	GrabTimeSlot(3);
 
@@ -1241,7 +1236,7 @@ int BuildTrap(DExhumedActor* pActor, int edx, int ebx, int ecx)
         return nTrap;
     }
 
-    auto pSector = pSprite->sector();
+    auto pSector = pActor->spr.sector();
 
     for(auto& wal : wallsofsector(pSector))
     {
@@ -1260,7 +1255,7 @@ int BuildTrap(DExhumedActor* pActor, int edx, int ebx, int ecx)
             }
         }
     }
-    pSprite->backuppos();
+    pActor->spr.backuppos();
     return nTrap;
 }
 
@@ -1284,7 +1279,6 @@ void AITrap::Tick(RunListEvent* ev)
     int nTrap = RunData[ev->nRun].nObjIndex;
     DExhumedActor* pActor = sTrap[nTrap].pActor;
     if (!pActor) return;
-    auto pSprite = &pActor->s();
 
     if (sTrap[nTrap].nState >= 0)
     {
@@ -1321,7 +1315,7 @@ void AITrap::Tick(RunListEvent* ev)
                 return;
             }
 
-            auto pBullet = BuildBullet(pActor, nType, 0, pSprite->ang, nullptr, 1);
+            auto pBullet = BuildBullet(pActor, nType, 0, pActor->spr.ang, nullptr, 1);
             if (pBullet)
             {
                 if (nType == 15)
@@ -1364,13 +1358,12 @@ int BuildFireBall(DExhumedActor* nSprite, int a, int b)
 
 DExhumedActor* BuildSpark(DExhumedActor* pActor, int nVal)
 {
-    auto pSprite = &pActor->s();
-    auto pSpark = insertActor(pSprite->sector(), 0);
+    auto pSpark = insertActor(pActor->spr.sector(), 0);
 
     auto spr = &pSpark->s();
 
-    spr->pos.X = pSprite->pos.X;
-    spr->pos.Y = pSprite->pos.Y;
+    spr->pos.X = pActor->spr.pos.X;
+    spr->pos.Y = pActor->spr.pos.Y;
     spr->cstat = 0;
     spr->shade = -127;
     spr->pal = 1;
@@ -1391,13 +1384,13 @@ DExhumedActor* BuildSpark(DExhumedActor* pActor, int nVal)
         }
         else
         {
-            spr->xrepeat = pSprite->xrepeat + 15;
-            spr->yrepeat = pSprite->xrepeat + 15;
+            spr->xrepeat = pActor->spr.xrepeat + 15;
+            spr->yrepeat = pActor->spr.xrepeat + 15;
         }
     }
     else
     {
-        int nAngle = (pSprite->ang + 256) - RandomSize(9);
+        int nAngle = (pActor->spr.ang + 256) - RandomSize(9);
 
         if (nVal)
         {
@@ -1414,7 +1407,7 @@ DExhumedActor* BuildSpark(DExhumedActor* pActor, int nVal)
         spr->picnum = kTile985 + nVal;
     }
 
-    spr->pos.Z = pSprite->pos.Z;
+    spr->pos.Z = pActor->spr.pos.Z;
     spr->lotag = runlist_HeadRun() + 1;
     spr->clipdist = 1;
     spr->hitag = 0;
@@ -1433,48 +1426,47 @@ void AISpark::Tick(RunListEvent* ev)
 {
     auto pActor = ev->pObjActor;
     if (!pActor) return;
-    auto pSprite = &pActor->s();
 
-    pSprite->shade += 3;
-    pSprite->xrepeat -= 2;
+    pActor->spr.shade += 3;
+    pActor->spr.xrepeat -= 2;
 
-    if (pSprite->xrepeat >= 4 && pSprite->shade <= 100)
+    if (pActor->spr.xrepeat >= 4 && pActor->spr.shade <= 100)
     {
-        pSprite->yrepeat -= 2;
+        pActor->spr.yrepeat -= 2;
 
         // calling BuildSpark() with 2nd parameter as '1' will set kTile986
-        if (pSprite->picnum == kTile986 && (pSprite->xrepeat & 2))
+        if (pActor->spr.picnum == kTile986 && (pActor->spr.xrepeat & 2))
         {
             BuildSpark(pActor, 2);
         }
 
-        if (pSprite->picnum >= kTile3000) {
+        if (pActor->spr.picnum >= kTile3000) {
             return;
         }
 
-        pSprite->zvel += 128;
+        pActor->spr.zvel += 128;
 
-        auto nMov = movesprite(pActor, pSprite->xvel << 12, pSprite->yvel << 12, pSprite->zvel, 2560, -2560, CLIPMASK1);
+        auto nMov = movesprite(pActor, pActor->spr.xvel << 12, pActor->spr.yvel << 12, pActor->spr.zvel, 2560, -2560, CLIPMASK1);
         if (!nMov.type && !nMov.exbits) {
             return;
         }
 
-        if (pSprite->zvel <= 0) {
+        if (pActor->spr.zvel <= 0) {
             return;
         }
     }
 
-    pSprite->xvel = 0;
-    pSprite->yvel = 0;
-    pSprite->zvel = 0;
+    pActor->spr.xvel = 0;
+    pActor->spr.yvel = 0;
+    pActor->spr.zvel = 0;
 
-    if (pSprite->picnum > kTile3000) {
+    if (pActor->spr.picnum > kTile3000) {
         nSmokeSparks--;
     }
 
-    runlist_DoSubRunRec(pSprite->owner);
-    runlist_FreeRun(pSprite->lotag - 1);
-    runlist_SubRunRec(pSprite->hitag);
+    runlist_DoSubRunRec(pActor->spr.owner);
+    runlist_FreeRun(pActor->spr.lotag - 1);
+    runlist_SubRunRec(pActor->spr.hitag);
     DeleteActor(pActor);
 }
 
@@ -1650,9 +1642,7 @@ void KillCreatures()
 
 void ExplodeEnergyBlock(DExhumedActor* pActor)
 {
-    auto pSprite = &pActor->s();
-
-	auto pSector = pSprite->sector();
+	auto pSector = pActor->spr.sector();
 
 	for(auto& wal : wallsofsector(pSector))
     {
@@ -1678,24 +1668,24 @@ void ExplodeEnergyBlock(DExhumedActor* pActor)
 
     pSector->floorshade = 50;
     pSector->extra = -1;
-    pSector->floorz = pSprite->pos.Z;
+    pSector->floorz = pActor->spr.pos.Z;
 
-    pSprite->pos.Z = (pSprite->pos.Z + pSector->floorz) / 2;
+    pActor->spr.pos.Z = (pActor->spr.pos.Z + pSector->floorz) / 2;
 
     BuildSpark(pActor, 3);
 
-    pSprite->cstat = 0;
-    pSprite->xrepeat = 100;
+    pActor->spr.cstat = 0;
+    pActor->spr.xrepeat = 100;
 
     PlayFX2(StaticSound[kSound78], pActor);
 
-    pSprite->xrepeat = 0;
+    pActor->spr.xrepeat = 0;
 
     nEnergyTowers--;
 
     for (int i = 0; i < 20; i++)
     {
-        pSprite->ang = RandomSize(11);
+        pActor->spr.ang = RandomSize(11);
         BuildSpark(pActor, 1); // shoot out blue orbs
     }
 
@@ -1876,14 +1866,13 @@ DExhumedActor* BuildObject(DExhumedActor* pActor, int nOjectType, int nHitag)
 // in-game destructable wall mounted screen
 void ExplodeScreen(DExhumedActor* pActor)
 {
-    auto pSprite = &pActor->s();
-    pSprite->pos.Z -= GetActorHeight(pActor) / 2;
+    pActor->spr.pos.Z -= GetActorHeight(pActor) / 2;
 
     for (int i = 0; i < 30; i++) {
         BuildSpark(pActor, 0); // shoot out blue orbs
     }
 
-    pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
+    pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
     PlayFX2(StaticSound[kSound78], pActor);
 }
 
@@ -1891,11 +1880,10 @@ void AIObject::Tick(RunListEvent* ev)
 {
     auto pActor = ev->pObjActor;
     if (!pActor) return;
-    auto pSprite = &pActor->s();
-    int nStat = pSprite->statnum;
+    int nStat = pActor->spr.statnum;
     int bx = pActor->nIndex;
 
-    if (nStat == 97 || (!(pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL))) {
+    if (nStat == 97 || (!(pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL))) {
         return;
     }
 
@@ -1911,7 +1899,7 @@ void AIObject::Tick(RunListEvent* ev)
             pActor->nFrame = 0;
         }
 
-        pSprite->picnum = seq_GetSeqPicnum2(bx, pActor->nFrame);
+        pActor->spr.picnum = seq_GetSeqPicnum2(bx, pActor->nFrame);
     }
 
     if (pActor->nHealth >= 0) {
@@ -1925,22 +1913,22 @@ void AIObject::Tick(RunListEvent* ev)
     FUNCOBJECT_GOTO:
         if (nStat != kStatExplodeTarget)
         {
-            auto nMov = movesprite(pActor, pSprite->xvel << 6, pSprite->yvel << 6, pSprite->zvel, 0, 0, CLIPMASK0);
+            auto nMov = movesprite(pActor, pActor->spr.xvel << 6, pActor->spr.yvel << 6, pActor->spr.zvel, 0, 0, CLIPMASK0);
 
-            if (pSprite->statnum == kStatExplodeTrigger) {
-                pSprite->pal = 1;
+            if (pActor->spr.statnum == kStatExplodeTrigger) {
+                pActor->spr.pal = 1;
             }
 
             if (nMov.exbits & kHitAux2)
             {
-                pSprite->xvel -= pSprite->xvel >> 3;
-                pSprite->yvel -= pSprite->yvel >> 3;
+                pActor->spr.xvel -= pActor->spr.xvel >> 3;
+                pActor->spr.yvel -= pActor->spr.yvel >> 3;
             }
 
             if (nMov.type == kHitSprite)
             {
-                pSprite->yvel = 0;
-                pSprite->xvel = 0;
+                pActor->spr.yvel = 0;
+                pActor->spr.xvel = 0;
             }
         }
 
@@ -1951,7 +1939,7 @@ void AIObject::Tick(RunListEvent* ev)
         int var_18;
 
         // red branch
-        if ((nStat == kStatExplodeTarget) || (pSprite->pos.Z < pSprite->sector()->floorz))
+        if ((nStat == kStatExplodeTarget) || (pActor->spr.pos.Z < pActor->spr.sector()->floorz))
         {
             var_18 = 36;
         }
@@ -1960,8 +1948,8 @@ void AIObject::Tick(RunListEvent* ev)
             var_18 = 34;
         }
 
-        AddFlash(pSprite->sector(), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.Z, 128);
-        BuildAnim(nullptr, var_18, 0, pSprite->pos.X, pSprite->pos.Y, pSprite->sector()->floorz, pSprite->sector(), 240, 4);
+        AddFlash(pActor->spr.sector(), pActor->spr.pos.X, pActor->spr.pos.Y, pActor->spr.pos.Z, 128);
+        BuildAnim(nullptr, var_18, 0, pActor->spr.pos.X, pActor->spr.pos.Y, pActor->spr.sector()->floorz, pActor->spr.sector(), 240, 4);
 
         //				int edi = nSprite | 0x4000;
 
@@ -1982,7 +1970,7 @@ void AIObject::Tick(RunListEvent* ev)
 
         if (!(currentLevel->gameflags & LEVEL_EX_MULTI) || nStat != kStatExplodeTrigger)
         {
-            runlist_SubRunRec(pSprite->owner);
+            runlist_SubRunRec(pActor->spr.owner);
             runlist_SubRunRec(pActor->nRun);
 
             DeleteActor(pActor);
@@ -1994,9 +1982,9 @@ void AIObject::Tick(RunListEvent* ev)
             pActor->nHealth = 120;
 
             auto pTargSpr = &pActor->pTarget->s();
-            pSprite->pos.X = pTargSpr->pos.X;
-            pSprite->pos.Y = pTargSpr->pos.Y;
-            pSprite->pos.Z = pTargSpr->pos.Z;
+            pActor->spr.pos.X = pTargSpr->pos.X;
+            pActor->spr.pos.Y = pTargSpr->pos.Y;
+            pActor->spr.pos.Z = pTargSpr->pos.Z;
 
             ChangeActorSect(pActor, pTargSpr->sector());
             return;
@@ -2008,8 +1996,7 @@ void AIObject::Damage(RunListEvent* ev)
 {
     auto pActor = ev->pObjActor;
     if (!pActor) return;
-    auto pSprite = &pActor->s();
-    int nStat = pSprite->statnum;
+    int nStat = pActor->spr.statnum;
 
     if (nStat >= 150 || pActor->nHealth <= 0) {
         return;
@@ -2054,10 +2041,9 @@ void AIObject::RadialDamage(RunListEvent* ev)
     auto pActor = ev->pObjActor;
     if (!pActor) return;
 
-    auto pSprite = &pActor->s();
-    int nStat = pSprite->statnum;
+    int nStat = pActor->spr.statnum;
 
-    if (pActor->nHealth > 0 && pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL
+    if (pActor->nHealth > 0 && pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL
         && (nStat != kStatExplodeTarget
             || ev->pRadialActor->spr.statnum == 201
             || (nRadialBullet != 3 && nRadialBullet > -1)
@@ -2068,28 +2054,28 @@ void AIObject::RadialDamage(RunListEvent* ev)
             return;
         }
 
-        if (pSprite->statnum != kStatAnubisDrum) {
+        if (pActor->spr.statnum != kStatAnubisDrum) {
             pActor->nHealth -= nDamage;
         }
 
-        if (pSprite->statnum == kStatExplodeTarget)
+        if (pActor->spr.statnum == kStatExplodeTarget)
         {
-            pSprite->xvel = 0;
-            pSprite->yvel = 0;
-            pSprite->zvel = 0;
+            pActor->spr.xvel = 0;
+            pActor->spr.yvel = 0;
+            pActor->spr.zvel = 0;
         }
-        else if (pSprite->statnum != kStatAnubisDrum)
+        else if (pActor->spr.statnum != kStatAnubisDrum)
         {
-            pSprite->xvel >>= 1;
-            pSprite->yvel >>= 1;
-            pSprite->zvel >>= 1;
+            pActor->spr.xvel >>= 1;
+            pActor->spr.yvel >>= 1;
+            pActor->spr.zvel >>= 1;
         }
 
         if (pActor->nHealth > 0) {
             return;
         }
 
-        if (pSprite->statnum == kStatExplodeTarget)
+        if (pActor->spr.statnum == kStatExplodeTarget)
         {
             pActor->nHealth = -1;
             int ax = pActor->nIndex2;
@@ -2100,7 +2086,7 @@ void AIObject::RadialDamage(RunListEvent* ev)
 
             ObjectList[ax]->nHealth = -1;
         }
-        else if (pSprite->statnum == kStatDestructibleSprite)
+        else if (pActor->spr.statnum == kStatDestructibleSprite)
         {
             pActor->nHealth = 0;
 
@@ -2115,11 +2101,10 @@ void AIObject::RadialDamage(RunListEvent* ev)
 
 void BuildDrip(DExhumedActor* pActor)
 {
-    auto pSprite = &pActor->s();
     auto nDrips = sDrip.Reserve(1);
     sDrip[nDrips].pActor = pActor;
     sDrip[nDrips].nCount = RandomSize(8) + 90;
-    pSprite->cstat = CSTAT_SPRITE_INVISIBLE;
+    pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
 }
 
 void DoDrips()
@@ -2131,11 +2116,9 @@ void DoDrips()
         {
             DExhumedActor* pActor = sDrip[i].pActor;
             if (!pActor) continue;
-            auto pSprite = &pActor->s();
-
             int nSeqOffset = SeqOffsets[kSeqDrips];
 
-            if (!(pSprite->sector()->Flag & kSectLava)) {
+            if (!(pActor->spr.sector()->Flag & kSectLava)) {
                 nSeqOffset++;
             }
 
@@ -2249,11 +2232,10 @@ int FindTrail(int nVal)
 // ok ?
 void ProcessTrailSprite(DExhumedActor* pActor, int nLotag, int nHitag)
 {
-    auto pSprite = &pActor->s();
     auto nPoint = sTrailPoint.Reserve(1);
 
-    sTrailPoint[nPoint].x = pSprite->pos.X;
-    sTrailPoint[nPoint].y = pSprite->pos.Y;
+    sTrailPoint[nPoint].x = pActor->spr.pos.X;
+    sTrailPoint[nPoint].y = pActor->spr.pos.Y;
 
     int nTrail = FindTrail(nHitag);