- Exhumed: pActor->s() in move.cpp

This commit is contained in:
Christoph Oelckers 2021-12-23 17:04:24 +01:00
parent ca88e241e1
commit 23f274120c

View file

@ -239,9 +239,8 @@ void clipwall()
int BelowNear(DExhumedActor* pActor, int x, int y, int walldist) int BelowNear(DExhumedActor* pActor, int x, int y, int walldist)
{ {
auto pSprite = &pActor->s(); auto pSector = pActor->spr.sector();
auto pSector = pSprite->sector(); int z = pActor->spr.pos.Z;
int z = pSprite->pos.Z;
int z2; int z2;
@ -293,11 +292,11 @@ int BelowNear(DExhumedActor* pActor, int x, int y, int walldist)
} }
if (z2 < pSprite->pos.Z) if (z2 < pActor->spr.pos.Z)
{ {
pSprite->pos.Z = z2; pActor->spr.pos.Z = z2;
overridesect = pSector; overridesect = pSector;
pSprite->zvel = 0; pActor->spr.zvel = 0;
bTouchFloor = true; bTouchFloor = true;
@ -311,17 +310,16 @@ int BelowNear(DExhumedActor* pActor, int x, int y, int walldist)
Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdist) Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdist)
{ {
spritetype* pSprite = &pActor->s(); auto pSector = pActor->spr.sector();
auto pSector = pSprite->sector();
assert(pSector); assert(pSector);
overridesect = pSector; overridesect = pSector;
auto pSect2 = pSector; auto pSect2 = pSector;
// backup cstat // backup cstat
auto cstat = pSprite->cstat; auto cstat = pActor->spr.cstat;
pSprite->cstat &= ~CSTAT_SPRITE_BLOCK; pActor->spr.cstat &= ~CSTAT_SPRITE_BLOCK;
Collision nRet; Collision nRet;
nRet.setNone(); nRet.setNone();
@ -332,7 +330,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
z >>= 1; z >>= 1;
} }
int spriteZ = pSprite->pos.Z; int spriteZ = pActor->spr.pos.Z;
int floorZ = pSector->floorz; int floorZ = pSector->floorz;
int ebp = spriteZ + z; int ebp = spriteZ + z;
@ -343,14 +341,14 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
// loc_151E7: // loc_151E7:
while (ebp > pSprite->sector()->floorz && pSprite->sector()->pBelow != nullptr) while (ebp > pActor->spr.sector()->floorz && pActor->spr.sector()->pBelow != nullptr)
{ {
ChangeActorSect(pActor, pSprite->sector()->pBelow); ChangeActorSect(pActor, pActor->spr.sector()->pBelow);
} }
if (pSect2 != pSector) if (pSect2 != pSector)
{ {
pSprite->pos.Z = ebp; pActor->spr.pos.Z = ebp;
if (pSect2->Flag & kSectUnderwater) if (pSect2->Flag & kSectUnderwater)
{ {
@ -358,29 +356,29 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
D3PlayFX(StaticSound[kSound2], pActor); D3PlayFX(StaticSound[kSound2], pActor);
} }
if (pSprite->statnum <= 107) { if (pActor->spr.statnum <= 107) {
pSprite->hitag = 0; pActor->spr.hitag = 0;
} }
} }
} }
else else
{ {
while ((ebp < pSprite->sector()->ceilingz) && (pSprite->sector()->pAbove != nullptr)) while ((ebp < pActor->spr.sector()->ceilingz) && (pActor->spr.sector()->pAbove != nullptr))
{ {
ChangeActorSect(pActor, pSprite->sector()->pAbove); ChangeActorSect(pActor, pActor->spr.sector()->pAbove);
} }
} }
// This function will keep the player from falling off cliffs when you're too close to the edge. // This function will keep the player from falling off cliffs when you're too close to the edge.
// This function finds the highest and lowest z coordinates that your clipping BOX can get to. // This function finds the highest and lowest z coordinates that your clipping BOX can get to.
vec3_t pos = pSprite->pos; vec3_t pos = pActor->spr.pos;
pos.Z -= 256; pos.Z -= 256;
getzrange(pos, pSprite->sector(), &sprceiling, hiHit, &sprfloor, loHit, 128, CLIPMASK0); getzrange(pos, pActor->spr.sector(), &sprceiling, hiHit, &sprfloor, loHit, 128, CLIPMASK0);
int mySprfloor = sprfloor; int mySprfloor = sprfloor;
if (loHit.type != kHitSprite) { if (loHit.type != kHitSprite) {
mySprfloor += pSprite->sector()->Depth; mySprfloor += pActor->spr.sector()->Depth;
} }
if (ebp > mySprfloor) if (ebp > mySprfloor)
@ -394,7 +392,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
// Path A // Path A
auto pFloorSprite = &loHit.actor()->s(); auto pFloorSprite = &loHit.actor()->s();
if (pSprite->statnum == 100 && pFloorSprite->statnum != 0 && pFloorSprite->statnum < 100) if (pActor->spr.statnum == 100 && pFloorSprite->statnum != 0 && pFloorSprite->statnum < 100)
{ {
int nDamage = (z >> 9); int nDamage = (z >> 9);
if (nDamage) if (nDamage)
@ -402,7 +400,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
runlist_DamageEnemy(loHit.actor(), pActor, nDamage << 1); runlist_DamageEnemy(loHit.actor(), pActor, nDamage << 1);
} }
pSprite->zvel = -z; pActor->spr.zvel = -z;
} }
else else
{ {
@ -415,24 +413,24 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
nRet = loHit; nRet = loHit;
} }
pSprite->zvel = 0; pActor->spr.zvel = 0;
} }
} }
else else
{ {
// Path B // Path B
if (pSprite->sector()->pBelow == nullptr) if (pActor->spr.sector()->pBelow == nullptr)
{ {
nRet.exbits |= kHitAux2; nRet.exbits |= kHitAux2;
int nSectDamage = pSprite->sector()->Damage; int nSectDamage = pActor->spr.sector()->Damage;
if (nSectDamage != 0) if (nSectDamage != 0)
{ {
if (pSprite->hitag < 15) if (pActor->spr.hitag < 15)
{ {
IgniteSprite(pActor); IgniteSprite(pActor);
pSprite->hitag = 20; pActor->spr.hitag = 20;
} }
nSectDamage >>= 2; nSectDamage >>= 2;
nSectDamage = nSectDamage - (nSectDamage>>2); nSectDamage = nSectDamage - (nSectDamage>>2);
@ -441,18 +439,18 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
} }
pSprite->zvel = 0; pActor->spr.zvel = 0;
} }
} }
} }
// loc_1543B: // loc_1543B:
ebp = mySprfloor; ebp = mySprfloor;
pSprite->pos.Z = mySprfloor; pActor->spr.pos.Z = mySprfloor;
} }
else else
{ {
if ((ebp - height) < sprceiling && (hiHit.type == kHitSprite || pSprite->sector()->pAbove == nullptr)) if ((ebp - height) < sprceiling && (hiHit.type == kHitSprite || pActor->spr.sector()->pAbove == nullptr))
{ {
ebp = sprceiling + height; ebp = sprceiling + height;
nRet.exbits |= kHitAux1; nRet.exbits |= kHitAux1;
@ -467,12 +465,12 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
} }
} }
pSprite->cstat = cstat; // restore cstat pActor->spr.cstat = cstat; // restore cstat
pSprite->pos.Z = ebp; pActor->spr.pos.Z = ebp;
if (pSprite->statnum == 100) if (pActor->spr.statnum == 100)
{ {
nRet.exbits |= BelowNear(pActor, pSprite->pos.X, pSprite->pos.Y, clipdist + (clipdist / 2)); nRet.exbits |= BelowNear(pActor, pActor->spr.pos.X, pActor->spr.pos.Y, clipdist + (clipdist / 2));
} }
return nRet; return nRet;
@ -491,18 +489,17 @@ DExhumedActor* insertActor(sectortype* s, int st)
Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist, int flordist, unsigned int clipmask) Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist, int flordist, unsigned int clipmask)
{ {
spritetype *pSprite = &pActor->s();
bTouchFloor = false; bTouchFloor = false;
int x = pSprite->pos.X; int x = pActor->spr.pos.X;
int y = pSprite->pos.Y; int y = pActor->spr.pos.Y;
int z = pSprite->pos.Z; int z = pActor->spr.pos.Z;
int nSpriteHeight = GetActorHeight(pActor); int nSpriteHeight = GetActorHeight(pActor);
int nClipDist = (int8_t)pSprite->clipdist << 2; int nClipDist = (int8_t)pActor->spr.clipdist << 2;
auto pSector = pSprite->sector(); auto pSector = pActor->spr.sector();
assert(pSector); assert(pSector);
int floorZ = pSector->floorz; int floorZ = pSector->floorz;
@ -515,16 +512,16 @@ Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist
Collision nRet = movespritez(pActor, dz, nSpriteHeight, flordist, nClipDist); Collision nRet = movespritez(pActor, dz, nSpriteHeight, flordist, nClipDist);
pSector = pSprite->sector(); // modified in movespritez so re-grab this variable pSector = pActor->spr.sector(); // modified in movespritez so re-grab this variable
if (pSprite->statnum == 100) if (pActor->spr.statnum == 100)
{ {
int nPlayer = GetPlayerFromActor(pActor); int nPlayer = GetPlayerFromActor(pActor);
int varA = 0; int varA = 0;
int varB = 0; int varB = 0;
CheckSectorFloor(overridesect, pSprite->pos.Z, &varB, &varA); CheckSectorFloor(overridesect, pActor->spr.pos.Z, &varB, &varA);
if (varB || varA) if (varB || varA)
{ {
@ -537,18 +534,18 @@ Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist
} }
else else
{ {
CheckSectorFloor(overridesect, pSprite->pos.Z, &dx, &dy); CheckSectorFloor(overridesect, pActor->spr.pos.Z, &dx, &dy);
} }
Collision coll; Collision coll;
clipmove(pSprite->pos, &pSector, dx, dy, nClipDist, nSpriteHeight, flordist, clipmask, coll); clipmove(pActor->spr.pos, &pSector, dx, dy, nClipDist, nSpriteHeight, flordist, clipmask, coll);
if (coll.type != kHitNone) // originally this or'ed the two values which can create unpredictable bad values in some edge cases. if (coll.type != kHitNone) // originally this or'ed the two values which can create unpredictable bad values in some edge cases.
{ {
coll.exbits = nRet.exbits; coll.exbits = nRet.exbits;
nRet = coll; nRet = coll;
} }
if ((pSector != pSprite->sector()) && pSector != nullptr) if ((pSector != pActor->spr.sector()) && pSector != nullptr)
{ {
if (nRet.exbits & kHitAux2) { if (nRet.exbits & kHitAux2) {
dz = 0; dz = 0;
@ -556,16 +553,16 @@ Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist
if ((pSector->floorz - z) < (dz + flordist)) if ((pSector->floorz - z) < (dz + flordist))
{ {
pSprite->pos.X = x; pActor->spr.pos.X = x;
pSprite->pos.Y = y; pActor->spr.pos.Y = y;
} }
else else
{ {
ChangeActorSect(pActor, pSector); ChangeActorSect(pActor, pSector);
if (pSprite->pal < 5 && !pSprite->hitag) if (pActor->spr.pal < 5 && !pActor->spr.hitag)
{ {
pSprite->pal = pSprite->sector()->ceilingpal; pActor->spr.pal = pActor->spr.sector()->ceilingpal;
} }
} }
} }
@ -575,67 +572,63 @@ Collision movesprite(DExhumedActor* pActor, int dx, int dy, int dz, int ceildist
void Gravity(DExhumedActor* pActor) void Gravity(DExhumedActor* pActor)
{ {
auto pSprite = &pActor->s(); if (pActor->spr.sector()->Flag & kSectUnderwater)
if (pSprite->sector()->Flag & kSectUnderwater)
{ {
if (pSprite->statnum != 100) if (pActor->spr.statnum != 100)
{ {
if (pSprite->zvel <= 1024) if (pActor->spr.zvel <= 1024)
{ {
if (pSprite->zvel < 2048) { if (pActor->spr.zvel < 2048) {
pSprite->zvel += 512; pActor->spr.zvel += 512;
} }
} }
else else
{ {
pSprite->zvel -= 64; pActor->spr.zvel -= 64;
} }
} }
else else
{ {
if (pSprite->zvel > 0) if (pActor->spr.zvel > 0)
{ {
pSprite->zvel -= 64; pActor->spr.zvel -= 64;
if (pSprite->zvel < 0) { if (pActor->spr.zvel < 0) {
pSprite->zvel = 0; pActor->spr.zvel = 0;
} }
} }
else if (pSprite->zvel < 0) else if (pActor->spr.zvel < 0)
{ {
pSprite->zvel += 64; pActor->spr.zvel += 64;
if (pSprite->zvel > 0) { if (pActor->spr.zvel > 0) {
pSprite->zvel = 0; pActor->spr.zvel = 0;
} }
} }
} }
} }
else else
{ {
pSprite->zvel += 512; pActor->spr.zvel += 512;
if (pSprite->zvel > 16384) { if (pActor->spr.zvel > 16384) {
pSprite->zvel = 16384; pActor->spr.zvel = 16384;
} }
} }
} }
Collision MoveCreature(DExhumedActor* pActor) Collision MoveCreature(DExhumedActor* pActor)
{ {
auto pSprite = &pActor->s(); return movesprite(pActor, pActor->spr.xvel << 8, pActor->spr.yvel << 8, pActor->spr.zvel, 15360, -5120, CLIPMASK0);
return movesprite(pActor, pSprite->xvel << 8, pSprite->yvel << 8, pSprite->zvel, 15360, -5120, CLIPMASK0);
} }
Collision MoveCreatureWithCaution(DExhumedActor* pActor) Collision MoveCreatureWithCaution(DExhumedActor* pActor)
{ {
auto pSprite = &pActor->s(); int x = pActor->spr.pos.X;
int x = pSprite->pos.X; int y = pActor->spr.pos.Y;
int y = pSprite->pos.Y; int z = pActor->spr.pos.Z;
int z = pSprite->pos.Z; auto pSectorPre = pActor->spr.sector();
auto pSectorPre = pSprite->sector();
auto ecx = MoveCreature(pActor); auto ecx = MoveCreature(pActor);
auto pSector =pSprite->sector(); auto pSector =pActor->spr.sector();
if (pSector != pSectorPre) if (pSector != pSectorPre)
{ {
@ -646,15 +639,15 @@ Collision MoveCreatureWithCaution(DExhumedActor* pActor)
if (zDiff > 15360 || (pSector->Flag & kSectUnderwater) || (pSector->pBelow != nullptr && pSector->pBelow->Flag) || pSector->Damage) if (zDiff > 15360 || (pSector->Flag & kSectUnderwater) || (pSector->pBelow != nullptr && pSector->pBelow->Flag) || pSector->Damage)
{ {
pSprite->pos.X = x; pActor->spr.pos.X = x;
pSprite->pos.Y = y; pActor->spr.pos.Y = y;
pSprite->pos.Z = z; pActor->spr.pos.Z = z;
ChangeActorSect(pActor, pSectorPre); ChangeActorSect(pActor, pSectorPre);
pSprite->ang = (pSprite->ang + 256) & kAngleMask; pActor->spr.ang = (pActor->spr.ang + 256) & kAngleMask;
pSprite->xvel = bcos(pSprite->ang, -2); pActor->spr.xvel = bcos(pActor->spr.ang, -2);
pSprite->yvel = bsin(pSprite->ang, -2); pActor->spr.yvel = bsin(pActor->spr.ang, -2);
Collision c; Collision c;
c.setNone(); c.setNone();
return c; return c;
@ -703,17 +696,16 @@ int PlotCourseToSprite(DExhumedActor* pActor1, DExhumedActor* pActor2)
DExhumedActor* FindPlayer(DExhumedActor* pActor, int nDistance, bool dontengage) DExhumedActor* FindPlayer(DExhumedActor* pActor, int nDistance, bool dontengage)
{ {
auto pSprite = &pActor->s();
int var_18 = !dontengage; int var_18 = !dontengage;
if (nDistance < 0) if (nDistance < 0)
nDistance = 100; nDistance = 100;
int x = pSprite->pos.X; int x = pActor->spr.pos.X;
int y = pSprite->pos.Y; int y = pActor->spr.pos.Y;
auto pSector =pSprite->sector(); auto pSector =pActor->spr.sector();
int z = pSprite->pos.Z - GetActorHeight(pActor); int z = pActor->spr.pos.Z - GetActorHeight(pActor);
nDistance <<= 8; nDistance <<= 8;
@ -833,14 +825,13 @@ void CreatePushBlock(sectortype* pSector)
sBlockInfo[nBlock].y = yAvg; sBlockInfo[nBlock].y = yAvg;
auto pActor = insertActor(pSector, 0); auto pActor = insertActor(pSector, 0);
auto pSprite = &pActor->s();
sBlockInfo[nBlock].pActor = pActor; sBlockInfo[nBlock].pActor = pActor;
pSprite->pos.X = xAvg; pActor->spr.pos.X = xAvg;
pSprite->pos.Y = yAvg; pActor->spr.pos.Y = yAvg;
pSprite->pos.Z = pSector->floorz - 256; pActor->spr.pos.Z = pSector->floorz - 256;
pSprite->cstat = CSTAT_SPRITE_INVISIBLE; pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
int var_28 = 0; int var_28 = 0;
@ -865,7 +856,7 @@ void CreatePushBlock(sectortype* pSector)
sBlockInfo[nBlock].field_8 = var_28; sBlockInfo[nBlock].field_8 = var_28;
pSprite->clipdist = (var_28 & 0xFF) << 2; pActor->spr.clipdist = (var_28 & 0xFF) << 2;
pSector->extra = nBlock; pSector->extra = nBlock;
} }
@ -1024,22 +1015,21 @@ void MoveSector(sectortype* pSector, int nAngle, int *nXVel, int *nYVel)
it.Reset(pNextSector); it.Reset(pNextSector);
while (auto pActor = it.Next()) while (auto pActor = it.Next())
{ {
auto pSprite = &pActor->s(); if (pActor->spr.statnum >= 99)
if (pSprite->statnum >= 99)
{ {
pos = pSprite->pos; pos = pActor->spr.pos;
pSectorB = pNextSector; pSectorB = pNextSector;
Collision scratch; Collision scratch;
clipmove(pos, &pSectorB, clipmove(pos, &pSectorB,
-xvect - (bcos(nAngle) * (4 * pSprite->clipdist)), -xvect - (bcos(nAngle) * (4 * pActor->spr.clipdist)),
-yvect - (bsin(nAngle) * (4 * pSprite->clipdist)), -yvect - (bsin(nAngle) * (4 * pActor->spr.clipdist)),
4 * pSprite->clipdist, 0, 0, CLIPMASK0, scratch); 4 * pActor->spr.clipdist, 0, 0, CLIPMASK0, scratch);
if (pSectorB != pNextSector && (pSectorB == pSector || pNextSector == pSector)) if (pSectorB != pNextSector && (pSectorB == pSector || pNextSector == pSector))
{ {
if (pSectorB != pSector || nFloorZ >= pSprite->pos.Z) if (pSectorB != pSector || nFloorZ >= pActor->spr.pos.Z)
{ {
if (pSectorB) { if (pSectorB) {
ChangeActorSect(pActor, pSectorB); ChangeActorSect(pActor, pSectorB);
@ -1048,8 +1038,8 @@ void MoveSector(sectortype* pSector, int nAngle, int *nXVel, int *nYVel)
else else
{ {
movesprite(pActor, movesprite(pActor,
(xvect << 14) + bcos(nAngle) * pSprite->clipdist, (xvect << 14) + bcos(nAngle) * pActor->spr.clipdist,
(yvect << 14) + bsin(nAngle) * pSprite->clipdist, (yvect << 14) + bsin(nAngle) * pActor->spr.clipdist,
0, 0, 0, CLIPMASK0); 0, 0, 0, CLIPMASK0);
} }
} }
@ -1074,12 +1064,11 @@ void MoveSector(sectortype* pSector, int nAngle, int *nXVel, int *nYVel)
ExhumedSectIterator it(pSector); ExhumedSectIterator it(pSector);
while (auto pActor = it.Next()) while (auto pActor = it.Next())
{ {
auto pSprite = &pActor->s(); if (pActor->spr.statnum >= 99 && nZVal == pActor->spr.pos.Z && !(pActor->spr.cstat & CSTAT_SPRITE_INVISIBLE))
if (pSprite->statnum >= 99 && nZVal == pSprite->pos.Z && !(pSprite->cstat & CSTAT_SPRITE_INVISIBLE))
{ {
pSectorB = pSector; pSectorB = pSector;
Collision scratch; Collision scratch;
clipmove(pSprite->pos, &pSectorB, xvect, yvect, 4 * pSprite->clipdist, 5120, -5120, CLIPMASK0, scratch); clipmove(pActor->spr.pos, &pSectorB, xvect, yvect, 4 * pActor->spr.clipdist, 5120, -5120, CLIPMASK0, scratch);
} }
} }
} }
@ -1101,19 +1090,17 @@ void MoveSector(sectortype* pSector, int nAngle, int *nXVel, int *nYVel)
TODO: Might need to be done elsewhere too? TODO: Might need to be done elsewhere too?
*/ */
auto pActor = PlayerList[nLocalPlayer].Actor(); auto pActor = PlayerList[nLocalPlayer].Actor();
auto pSprite = &pActor->s(); initx = pActor->spr.pos.X;
initx = pSprite->pos.X; inity = pActor->spr.pos.Y;
inity = pSprite->pos.Y; initz = pActor->spr.pos.Z;
initz = pSprite->pos.Z; inita = pActor->spr.ang;
inita = pSprite->ang; initsectp = pActor->spr.sector();
initsectp = pSprite->sector();
} }
void SetQuake(DExhumedActor* pActor, int nVal) void SetQuake(DExhumedActor* pActor, int nVal)
{ {
auto pSprite = &pActor->s(); int x = pActor->spr.pos.X;
int x = pSprite->pos.X; int y = pActor->spr.pos.Y;
int y = pSprite->pos.Y;
nVal *= 256; nVal *= 256;
@ -1161,8 +1148,7 @@ void SetQuake(DExhumedActor* pActor, int nVal)
Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int ecx, int push1) Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int ecx, int push1)
{ {
auto pSprite = &pActor->s(); int nClipType = pActor->spr.statnum != 107;
int nClipType = pSprite->statnum != 107;
/* bjd - need to handle cliptype to clipmask change that occured in later build engine version */ /* bjd - need to handle cliptype to clipmask change that occured in later build engine version */
if (nClipType == 1) { if (nClipType == 1) {
@ -1176,8 +1162,8 @@ Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int
if (pActor2 == nullptr) if (pActor2 == nullptr)
{ {
pSprite->zvel = 0; pActor->spr.zvel = 0;
nAngle = pSprite->ang; nAngle = pActor->spr.ang;
} }
else else
{ {
@ -1185,10 +1171,10 @@ Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int
int nHeight = tileHeight(pSprite2->picnum) * pSprite2->yrepeat * 2; int nHeight = tileHeight(pSprite2->picnum) * pSprite2->yrepeat * 2;
int nMyAngle = GetMyAngle(pSprite2->pos.X - pSprite->pos.X, pSprite2->pos.Y - pSprite->pos.Y); int nMyAngle = GetMyAngle(pSprite2->pos.X - pActor->spr.pos.X, pSprite2->pos.Y - pActor->spr.pos.Y);
uint32_t xDiff = abs(pSprite2->pos.X - pSprite->pos.X); uint32_t xDiff = abs(pSprite2->pos.X - pActor->spr.pos.X);
uint32_t yDiff = abs(pSprite2->pos.Y - pSprite->pos.Y); uint32_t yDiff = abs(pSprite2->pos.Y - pActor->spr.pos.Y);
uint32_t sqrtNum = xDiff * xDiff + yDiff * yDiff; uint32_t sqrtNum = xDiff * xDiff + yDiff * yDiff;
@ -1200,9 +1186,9 @@ Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int
int nSqrt = ksqrt(sqrtNum); int nSqrt = ksqrt(sqrtNum);
int var_18 = GetMyAngle(nSqrt, ((pSprite2->pos.Z - nHeight) - pSprite->pos.Z) >> 8); int var_18 = GetMyAngle(nSqrt, ((pSprite2->pos.Z - nHeight) - pActor->spr.pos.Z) >> 8);
int nAngDelta = AngleDelta(pSprite->ang, nMyAngle, 1024); int nAngDelta = AngleDelta(pActor->spr.ang, nMyAngle, 1024);
int nAngDelta2 = abs(nAngDelta); int nAngDelta2 = abs(nAngDelta);
if (nAngDelta2 > 63) if (nAngDelta2 > 63)
@ -1226,15 +1212,15 @@ Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int
nAngDelta = -push1; nAngDelta = -push1;
} }
nAngle = (nAngDelta + pSprite->ang) & kAngleMask; nAngle = (nAngDelta + pActor->spr.ang) & kAngleMask;
int nAngDeltaD = AngleDelta(pSprite->zvel, var_18, 24); int nAngDeltaD = AngleDelta(pActor->spr.zvel, var_18, 24);
pSprite->zvel = (pSprite->zvel + nAngDeltaD) & kAngleMask; pActor->spr.zvel = (pActor->spr.zvel + nAngDeltaD) & kAngleMask;
} }
pSprite->ang = nAngle; pActor->spr.ang = nAngle;
int eax = abs(bcos(pSprite->zvel)); int eax = abs(bcos(pActor->spr.zvel));
int x = ((bcos(nAngle) * ebx) >> 14) * eax; int x = ((bcos(nAngle) * ebx) >> 14) * eax;
int y = ((bsin(nAngle) * ebx) >> 14) * eax; int y = ((bsin(nAngle) * ebx) >> 14) * eax;
@ -1250,7 +1236,7 @@ Collision AngleChase(DExhumedActor* pActor, DExhumedActor* pActor2, int ebx, int
sqrtNum = INT_MAX; sqrtNum = INT_MAX;
} }
int z = bsin(pSprite->zvel) * ksqrt(sqrtNum); int z = bsin(pActor->spr.zvel) * ksqrt(sqrtNum);
return movesprite(pActor, x >> 2, y >> 2, (z >> 13) + bsin(ecx, -5), 0, 0, nClipType); return movesprite(pActor, x >> 2, y >> 2, (z >> 13) + bsin(ecx, -5), 0, 0, nClipType);
} }
@ -1266,18 +1252,16 @@ int GetWallNormal(walltype* pWall)
void WheresMyMouth(int nPlayer, vec3_t* pos, sectortype **sectnum) void WheresMyMouth(int nPlayer, vec3_t* pos, sectortype **sectnum)
{ {
auto pActor = PlayerList[nPlayer].Actor(); auto pActor = PlayerList[nPlayer].Actor();
auto pSprite = &pActor->s();
int height = GetActorHeight(pActor) >> 1; int height = GetActorHeight(pActor) >> 1;
*sectnum = pSprite->sector(); *sectnum = pActor->spr.sector();
*pos = pSprite->pos; *pos = pActor->spr.pos;
pos->Z -= height; pos->Z -= height;
Collision scratch; Collision scratch;
clipmove(*pos, sectnum, clipmove(*pos, sectnum,
bcos(pSprite->ang, 7), bcos(pActor->spr.ang, 7),
bsin(pSprite->ang, 7), bsin(pActor->spr.ang, 7),
5120, 1280, 1280, CLIPMASK1, scratch); 5120, 1280, 1280, CLIPMASK1, scratch);
} }
@ -1296,23 +1280,20 @@ void InitChunks()
DExhumedActor* GrabBodyGunSprite() DExhumedActor* GrabBodyGunSprite()
{ {
DExhumedActor* pActor = nBodyGunSprite[nCurBodyGunNum]; DExhumedActor* pActor = nBodyGunSprite[nCurBodyGunNum];
spritetype* pSprite;
if (pActor == nullptr) if (pActor == nullptr)
{ {
pActor = insertActor(0, 899); pActor = insertActor(0, 899);
pSprite = &pActor->s();
nBodyGunSprite[nCurBodyGunNum] = pActor; nBodyGunSprite[nCurBodyGunNum] = pActor;
pSprite->lotag = -1; pActor->spr.lotag = -1;
pSprite->owner = -1; pActor->spr.owner = -1;
} }
else else
{ {
pSprite = &pActor->s();
DestroyAnim(pActor); DestroyAnim(pActor);
pSprite->lotag = -1; pActor->spr.lotag = -1;
pSprite->owner = -1; pActor->spr.owner = -1;
} }
nCurBodyGunNum++; nCurBodyGunNum++;
@ -1320,7 +1301,7 @@ DExhumedActor* GrabBodyGunSprite()
nCurBodyGunNum = 0; nCurBodyGunNum = 0;
} }
pSprite->cstat = 0; pActor->spr.cstat = 0;
return pActor; return pActor;
} }
@ -1328,7 +1309,6 @@ DExhumedActor* GrabBodyGunSprite()
DExhumedActor* GrabBody() DExhumedActor* GrabBody()
{ {
DExhumedActor* pActor = nullptr; DExhumedActor* pActor = nullptr;
spritetype* pSprite = nullptr;
do do
{ {
pActor = nBodySprite[nCurBodyNum]; pActor = nBodySprite[nCurBodyNum];
@ -1336,25 +1316,22 @@ DExhumedActor* GrabBody()
if (pActor == nullptr) if (pActor == nullptr)
{ {
pActor = insertActor(0, 899); pActor = insertActor(0, 899);
pSprite = &pActor->s();
nBodySprite[nCurBodyNum] = pActor; nBodySprite[nCurBodyNum] = pActor;
pSprite->cstat = CSTAT_SPRITE_INVISIBLE; pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
} }
else
pSprite = &pActor->s();
nCurBodyNum++; nCurBodyNum++;
if (nCurBodyNum >= 50) { if (nCurBodyNum >= 50) {
nCurBodyNum = 0; nCurBodyNum = 0;
} }
} while (pSprite->cstat & CSTAT_SPRITE_BLOCK_ALL); } while (pActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL);
if (nBodyTotal < 50) { if (nBodyTotal < 50) {
nBodyTotal++; nBodyTotal++;
} }
pSprite->cstat = 0; pActor->spr.cstat = 0;
return pActor; return pActor;
} }
@ -1394,43 +1371,42 @@ DExhumedActor* BuildCreatureChunk(DExhumedActor* pSrc, int nPic, bool bSpecial)
if (pActor == nullptr) { if (pActor == nullptr) {
return nullptr; return nullptr;
} }
auto pSprite = &pActor->s();
auto pSrcSpr = &pSrc->s(); auto pSrcSpr = &pSrc->s();
pSprite->pos.X = pSrcSpr->pos.X; pActor->spr.pos.X = pSrcSpr->pos.X;
pSprite->pos.Y = pSrcSpr->pos.Y; pActor->spr.pos.Y = pSrcSpr->pos.Y;
pSprite->pos.Z = pSrcSpr->pos.Z; pActor->spr.pos.Z = pSrcSpr->pos.Z;
ChangeActorSect(pActor, pSrcSpr->sector()); ChangeActorSect(pActor, pSrcSpr->sector());
pSprite->cstat = CSTAT_SPRITE_YCENTER; pActor->spr.cstat = CSTAT_SPRITE_YCENTER;
pSprite->shade = -12; pActor->spr.shade = -12;
pSprite->pal = 0; pActor->spr.pal = 0;
pSprite->xvel = (RandomSize(5) - 16) << 7; pActor->spr.xvel = (RandomSize(5) - 16) << 7;
pSprite->yvel = (RandomSize(5) - 16) << 7; pActor->spr.yvel = (RandomSize(5) - 16) << 7;
pSprite->zvel = (-(RandomSize(8) + 512)) << 3; pActor->spr.zvel = (-(RandomSize(8) + 512)) << 3;
if (bSpecial) if (bSpecial)
{ {
pSprite->xvel *= 4; pActor->spr.xvel *= 4;
pSprite->yvel *= 4; pActor->spr.yvel *= 4;
pSprite->zvel *= 2; pActor->spr.zvel *= 2;
} }
pSprite->xrepeat = 64; pActor->spr.xrepeat = 64;
pSprite->yrepeat = 64; pActor->spr.yrepeat = 64;
pSprite->xoffset = 0; pActor->spr.xoffset = 0;
pSprite->yoffset = 0; pActor->spr.yoffset = 0;
pSprite->picnum = nPic; pActor->spr.picnum = nPic;
pSprite->lotag = runlist_HeadRun() + 1; pActor->spr.lotag = runlist_HeadRun() + 1;
pSprite->clipdist = 40; pActor->spr.clipdist = 40;
// GrabTimeSlot(3); // GrabTimeSlot(3);
pSprite->extra = -1; pActor->spr.extra = -1;
pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, pActor, 0xD0000); pActor->spr.owner = runlist_AddRunRec(pActor->spr.lotag - 1, pActor, 0xD0000);
pSprite->hitag = runlist_AddRunRec(NewRun, pActor, 0xD0000); pActor->spr.hitag = runlist_AddRunRec(NewRun, pActor, 0xD0000);
return pActor; return pActor;
} }
@ -1439,24 +1415,23 @@ void AICreatureChunk::Tick(RunListEvent* ev)
{ {
auto pActor = ev->pObjActor; auto pActor = ev->pObjActor;
if (!pActor) return; if (!pActor) return;
auto pSprite = &pActor->s();
Gravity(pActor); Gravity(pActor);
auto pSector = pSprite->sector(); auto pSector = pActor->spr.sector();
pSprite->pal = pSector->ceilingpal; pActor->spr.pal = pSector->ceilingpal;
auto nVal = movesprite(pActor, pSprite->xvel << 10, pSprite->yvel << 10, pSprite->zvel, 2560, -2560, CLIPMASK1); auto nVal = movesprite(pActor, pActor->spr.xvel << 10, pActor->spr.yvel << 10, pActor->spr.zvel, 2560, -2560, CLIPMASK1);
if (pSprite->pos.Z >= pSector->floorz) if (pActor->spr.pos.Z >= pSector->floorz)
{ {
// re-grab this variable as it may have changed in movesprite(). Note the check above is against the value *before* movesprite so don't change it. // re-grab this variable as it may have changed in movesprite(). Note the check above is against the value *before* movesprite so don't change it.
pSector = pSprite->sector(); pSector = pActor->spr.sector();
pSprite->xvel = 0; pActor->spr.xvel = 0;
pSprite->yvel = 0; pActor->spr.yvel = 0;
pSprite->zvel = 0; pActor->spr.zvel = 0;
pSprite->pos.Z = pSector->floorz; pActor->spr.pos.Z = pSector->floorz;
} }
else else
{ {
@ -1467,15 +1442,15 @@ void AICreatureChunk::Tick(RunListEvent* ev)
if (nVal.exbits & kHitAux2) if (nVal.exbits & kHitAux2)
{ {
pSprite->cstat = CSTAT_SPRITE_INVISIBLE; pActor->spr.cstat = CSTAT_SPRITE_INVISIBLE;
} }
else else
{ {
if (nVal.exbits & kHitAux1) if (nVal.exbits & kHitAux1)
{ {
pSprite->xvel >>= 1; pActor->spr.xvel >>= 1;
pSprite->yvel >>= 1; pActor->spr.yvel >>= 1;
pSprite->zvel = -pSprite->zvel; pActor->spr.zvel = -pActor->spr.zvel;
return; return;
} }
else if (nVal.type == kHitSprite) else if (nVal.type == kHitSprite)
@ -1492,22 +1467,22 @@ void AICreatureChunk::Tick(RunListEvent* ev)
} }
// loc_16E0C // loc_16E0C
int nSqrt = lsqrt(((pSprite->yvel >> 10) * (pSprite->yvel >> 10) int nSqrt = lsqrt(((pActor->spr.yvel >> 10) * (pActor->spr.yvel >> 10)
+ (pSprite->xvel >> 10) * (pSprite->xvel >> 10)) >> 8); + (pActor->spr.xvel >> 10) * (pActor->spr.xvel >> 10)) >> 8);
pSprite->xvel = bcos(nAngle) * (nSqrt >> 1); pActor->spr.xvel = bcos(nAngle) * (nSqrt >> 1);
pSprite->yvel = bsin(nAngle) * (nSqrt >> 1); pActor->spr.yvel = bsin(nAngle) * (nSqrt >> 1);
return; return;
} }
} }
runlist_DoSubRunRec(pSprite->owner); runlist_DoSubRunRec(pActor->spr.owner);
runlist_FreeRun(pSprite->lotag - 1); runlist_FreeRun(pActor->spr.lotag - 1);
runlist_SubRunRec(pSprite->hitag); runlist_SubRunRec(pActor->spr.hitag);
ChangeActorStat(pActor, 0); ChangeActorStat(pActor, 0);
pSprite->hitag = 0; pActor->spr.hitag = 0;
pSprite->lotag = 0; pActor->spr.lotag = 0;
} }
DExhumedActor* UpdateEnemy(DExhumedActor** ppEnemy) DExhumedActor* UpdateEnemy(DExhumedActor** ppEnemy)