From 02671dbe2f0d8aa4de2522f07028160ae409c183 Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@users.noreply.github.com>
Date: Mon, 1 Nov 2021 19:16:36 +0100
Subject: [PATCH] - PlayerUnderSprite.

---
 source/games/sw/src/game.cpp   |  3 +--
 source/games/sw/src/game.h     |  5 +++--
 source/games/sw/src/ninja.cpp  | 15 +++++--------
 source/games/sw/src/player.cpp | 41 +++++++++++++++++-----------------
 source/games/sw/src/save.cpp   |  3 +--
 5 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/source/games/sw/src/game.cpp b/source/games/sw/src/game.cpp
index ce36c6643..4b008f636 100644
--- a/source/games/sw/src/game.cpp
+++ b/source/games/sw/src/game.cpp
@@ -473,8 +473,7 @@ void TerminateLevel(void)
         pp->SpriteP = nullptr;
         pp->PlayerSprite = -1;
 
-        pp->UnderSpriteP = nullptr;
-        pp->PlayerUnderSprite = -1;
+        pp->PlayerUnderActor = nullptr;
 
         memset(pp->HasKey, 0, sizeof(pp->HasKey));
 
diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h
index 8b1a02b30..5af1b4c43 100644
--- a/source/games/sw/src/game.h
+++ b/source/games/sw/src/game.h
@@ -834,8 +834,9 @@ struct PLAYERstruct
     binangle RevolveAng;
 
     // under vars are for wading and swimming
-    short PlayerSprite, PlayerUnderSprite;
-    SPRITEp SpriteP, UnderSpriteP;
+    short PlayerSprite;
+    SPRITEp SpriteP;
+    DSWActor* PlayerUnderActor;
 
 
     short pnum; // carry along the player number
diff --git a/source/games/sw/src/ninja.cpp b/source/games/sw/src/ninja.cpp
index 1a8af56f8..b1a39dd02 100644
--- a/source/games/sw/src/ninja.cpp
+++ b/source/games/sw/src/ninja.cpp
@@ -2405,8 +2405,7 @@ void InitPlayerSprite(PLAYERp pp)
 
     NewStateGroup(pp->Actor(), u->ActorActionSet->Run);
 
-    pp->PlayerUnderSprite = -1;
-    pp->UnderSpriteP = nullptr;
+    pp->PlayerUnderActor = nullptr;
 
     DoPlayerZrange(pp);
 
@@ -2440,22 +2439,20 @@ void SpawnPlayerUnderSprite(PLAYERp pp)
      USERp pu = pp->Actor()->u(), u;
 
     SPRITEp sp;
-    int pnum = int(pp - Player), sp_num;
+    int pnum = int(pp - Player);
 
-    sp_num = pp->PlayerUnderSprite = SpawnSprite(STAT_PLAYER_UNDER0 + pnum,
+    pp->PlayerUnderActor = SpawnActor(STAT_PLAYER_UNDER0 + pnum,
                                                  NINJA_RUN_R0, nullptr, pp->cursectnum, pp->posx, pp->posy, pp->posz, pp->angle.ang.asbuild(), 0);
 
-    sp = &sprite[sp_num];
-    u = User[sp_num].Data();
-
-    pp->UnderSpriteP = sp;
+    sp = &pp->PlayerUnderActor->s();
+    u = pp->PlayerUnderActor->u();
 
     SET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
     SET(sp->extra, SPRX_PLAYER_OR_ENEMY);
 
     u->Rot = sg_NinjaRun;
     u->RotNum = pu->RotNum;
-    NewStateGroup_(sp_num, pu->Rot);
+    NewStateGroup(pp->PlayerUnderActor, pu->Rot);
 
     u->Radius = pu->Radius;
     u->PlayerP = pp;
diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp
index 6cbec4913..0deaf522f 100644
--- a/source/games/sw/src/player.cpp
+++ b/source/games/sw/src/player.cpp
@@ -1360,8 +1360,9 @@ void DoSpawnTeleporterEffectPlace(DSWActor* actor)
 
 void DoPlayerWarpTeleporter(PLAYERp pp)
 {
-    USERp u = pp->Actor()->u();
-    SPRITEp sp = &pp->Actor()->s();
+    auto ppActor = pp->Actor();
+    USERp u = ppActor->u();
+    SPRITEp sp = &ppActor->s();
     short pnum;
     SPRITEp sp_warp;
 
@@ -1398,10 +1399,10 @@ void DoPlayerWarpTeleporter(PLAYERp pp)
         //DoPlayerStand(pp);
         pp->DoPlayerAction = DoPlayerTeleportPause;
 
-        NewStateGroup(pp->Actor(), pp->Actor()->u()->ActorActionSet->Stand);
+        NewStateGroup(ppActor, ppActor->u()->ActorActionSet->Stand);
 
         UpdatePlayerSprite(pp);
-        DoSpawnTeleporterEffect(pp->Actor());
+        DoSpawnTeleporterEffect(ppActor);
 
         TRAVERSE_CONNECT(pnum)
         {
@@ -1412,9 +1413,8 @@ void DoPlayerWarpTeleporter(PLAYERp pp)
                 // if someone already standing there
                 if (npp->cursectnum == pp->cursectnum)
                 {
-                    PlayerUpdateHealth(npp, -User[npp->PlayerSprite]->Health);  // Make sure he dies!
+                    PlayerUpdateHealth(npp, -npp->Actor()->u()->Health);  // Make sure he dies!
                     // telefraged by teleporting player
-                    //PlayerCheckDeath(npp, npp->PlayerSprite);
                     PlayerCheckDeath(npp, pp->PlayerSprite);
                 }
             }
@@ -1477,13 +1477,15 @@ void DoPlayerCrawlHeight(PLAYERp pp)
 
 void UpdatePlayerSpriteAngle(PLAYERp pp)
 {
-    sprite[pp->PlayerSprite].backupang();
-    sprite[pp->PlayerSprite].ang = pp->angle.ang.asbuild();
+    auto psp = &pp->Actor()->s();
+    psp->backupang();
+    psp->ang = pp->angle.ang.asbuild();
 
-    if (!Prediction && pp->PlayerUnderSprite >= 0)
+    if (!Prediction && pp->PlayerUnderActor != nullptr)
     {
-        sprite[pp->PlayerUnderSprite].backupang();
-        sprite[pp->PlayerUnderSprite].ang = pp->angle.ang.asbuild();
+        auto usp = &pp->PlayerUnderActor->s();
+        usp->backupang();
+        usp->ang = pp->angle.ang.asbuild();
     }
 }
 
@@ -1749,32 +1751,29 @@ void UpdatePlayerUnderSprite(PLAYERp pp)
     {
 
         // if under sprite exists and not in a dive area - Kill it
-        if (pp->PlayerUnderSprite >= 0)
+        if (pp->PlayerUnderActor != nullptr)
         {
-            KillSprite(pp->PlayerUnderSprite);
-            pp->PlayerUnderSprite = -1;
-            pp->UnderSpriteP = nullptr;
+            KillActor(pp->PlayerUnderActor);
+            pp->PlayerUnderActor = nullptr;
         }
         return;
     }
     else
     {
         // if in a dive area and a under sprite does not exist - create it
-        if (pp->PlayerUnderSprite < 0)
+        if (pp->PlayerUnderActor == nullptr)
         {
             SpawnPlayerUnderSprite(pp);
         }
     }
 
-    sp = pp->UnderSpriteP;
-    u = User[pp->PlayerUnderSprite].Data();
-
-    SpriteNum = pp->PlayerUnderSprite;
+    sp = &pp->PlayerUnderActor->s();
+    u = pp->PlayerUnderActor->u();
 
     sp->x = over_sp->x;
     sp->y = over_sp->y;
     sp->z = over_sp->z;
-    changespritesect(SpriteNum, over_sp->sectnum);
+    ChangeActorSect(pp->PlayerUnderActor, over_sp->sectnum);
 
     SpriteWarpToUnderwater(sp);
 
diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp
index 513ef3543..2f82fadbf 100644
--- a/source/games/sw/src/save.cpp
+++ b/source/games/sw/src/save.cpp
@@ -500,9 +500,8 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYERstruct& w, P
 			("RevolveDeltaAng", w.RevolveDeltaAng)
 			("RevolveAng", w.RevolveAng)
 			("PlayerSprite", w.PlayerSprite)
-			("PlayerUnderSprite", w.PlayerUnderSprite)
+			("PlayerUnderSprite", w.PlayerUnderActor)
 			("SpriteP", w.SpriteP)
-			("UnderSpriteP", w.UnderSpriteP)
 			("pnum", w.pnum)
 			("LadderSector", w.LadderSector)
 			("lx", w.lx)