diff --git a/source/games/exhumed/src/exhumed.cpp b/source/games/exhumed/src/exhumed.cpp index 9a9bc1f26..a7c06073e 100644 --- a/source/games/exhumed/src/exhumed.cpp +++ b/source/games/exhumed/src/exhumed.cpp @@ -153,7 +153,7 @@ short bInDemo = false; short bSlipMode = false; short bDoFlashes = true; -short besttarget; +DExhumedActor* bestTarget; short scan_char = 0; @@ -429,11 +429,11 @@ void GameInterface::Ticker() sPlayerInput[nLocalPlayer].xVel = lPlayerXVel; sPlayerInput[nLocalPlayer].yVel = lPlayerYVel; sPlayerInput[nLocalPlayer].buttons = lLocalCodes; - sPlayerInput[nLocalPlayer].nTarget = besttarget; + sPlayerInput[nLocalPlayer].pTarget = bestTarget; sPlayerInput[nLocalPlayer].nAngle = localInput.avel; sPlayerInput[nLocalPlayer].pan = localInput.horz; - Ra[nLocalPlayer].pTarget = &exhumedActors[besttarget]; + Ra[nLocalPlayer].pTarget = bestTarget; lLocalCodes = 0; @@ -521,8 +521,8 @@ void DeleteActor(DExhumedActor* actor) deletesprite(actor->GetSpriteIndex()); actor->s().ox = 0x80000000; - if (actor->GetSpriteIndex() == besttarget) { - besttarget = -1; + if (actor == bestTarget) { + bestTarget = nullptr; } } @@ -625,7 +625,7 @@ void SerializeState(FSerializer& arc) InitEnergyTile(); } - arc ("besttarget", besttarget) + arc ("besttarget", bestTarget) ("creaturestotal", nCreaturesTotal) ("creatureskilled", nCreaturesKilled) ("freeze", nFreeze) diff --git a/source/games/exhumed/src/exhumed.h b/source/games/exhumed/src/exhumed.h index 92d907a67..aa9a850a1 100644 --- a/source/games/exhumed/src/exhumed.h +++ b/source/games/exhumed/src/exhumed.h @@ -66,7 +66,6 @@ void TintPalette(int a, int b, int c); void EraseScreen(int eax); -void mychangespritesect(int nSprite, int nSector); void DeleteActor(DExhumedActor* actor); void GrabPalette(); diff --git a/source/games/exhumed/src/gun.cpp b/source/games/exhumed/src/gun.cpp index 117134248..9f5329b95 100644 --- a/source/games/exhumed/src/gun.cpp +++ b/source/games/exhumed/src/gun.cpp @@ -824,27 +824,22 @@ loc_flag: int h = PlayerList[nLocalPlayer].horizon.horiz.asq16() >> 14; nHeight -= h; - int target = 0; - bool gottarg = false; - if (sPlayerInput[nPlayer].nTarget >= 0 && Autoaim(nPlayer)) + DExhumedActor* target = nullptr; + if (sPlayerInput[nPlayer].pTarget != nullptr && Autoaim(nPlayer)) { - int t = sPlayerInput[nPlayer].nTarget; - if (t >= 0 && t < MAXSPRITES) + auto t = sPlayerInput[nPlayer].pTarget; + // only autoaim if target is in front of the player. + auto pTargetSprite = &t->s(); + assert(pTargetSprite->sectnum < kMaxSectors); + int angletotarget = bvectangbam(pTargetSprite->x - pPlayerSprite->x, pTargetSprite->y - pPlayerSprite->y).asbuild(); + int anglediff = (pPlayerSprite->ang - angletotarget) & 2047; + if (anglediff < 512 || anglediff > 1536) { - // only autoaim if target is in front of the player. - auto pTargetSprite = &sprite[t]; - assert(pTargetSprite->sectnum < kMaxSectors); - int angletotarget = bvectangbam(pTargetSprite->x - pPlayerSprite->x, pTargetSprite->y - pPlayerSprite->y).asbuild(); - int anglediff = (pPlayerSprite->ang - angletotarget) & 2047; - if (anglediff < 512 || anglediff > 1536) - { - target = t; - gottarg = true; - } + target = t; } } - BuildBullet(pPlayerActor, nAmmoType, nHeight, nAngle,gottarg? &exhumedActors[target] : nullptr, var_1C); + BuildBullet(pPlayerActor, nAmmoType, nHeight, nAngle, target, var_1C); break; } diff --git a/source/games/exhumed/src/input.h b/source/games/exhumed/src/input.h index f0fa8eb7a..8b865c51c 100644 --- a/source/games/exhumed/src/input.h +++ b/source/games/exhumed/src/input.h @@ -33,10 +33,10 @@ enum { // 32 bytes struct PlayerInput { + DExhumedActor* pTarget; int xVel; int yVel; uint16_t buttons; - short nTarget; float nAngle; float pan; int8_t nItem; diff --git a/source/games/exhumed/src/ra.cpp b/source/games/exhumed/src/ra.cpp index d79745be6..fb0b547ec 100644 --- a/source/games/exhumed/src/ra.cpp +++ b/source/games/exhumed/src/ra.cpp @@ -177,7 +177,7 @@ void AIRa::Tick(RunListEvent* ev) bool bVal = false; - Ra[nPlayer].pTarget = sPlayerInput[nPlayer].nTarget <= -1? nullptr : &exhumedActors[sPlayerInput[nPlayer].nTarget] ; + Ra[nPlayer].pTarget = sPlayerInput[nPlayer].pTarget; pSprite->picnum = seq_GetSeqPicnum2(nSeq, Ra[nPlayer].nFrame); if (Ra[nPlayer].nAction) diff --git a/source/games/exhumed/src/snake.cpp b/source/games/exhumed/src/snake.cpp index 7e2cfce0c..3cd2db940 100644 --- a/source/games/exhumed/src/snake.cpp +++ b/source/games/exhumed/src/snake.cpp @@ -178,9 +178,9 @@ void BuildSnake(short nPlayer, short zVal) if (hitactor && hitactor->s().statnum >= 90 && hitactor->s().statnum <= 199) { pTarget = hitactor; } - else if (sPlayerInput[nPlayer].nTarget >= 0) + else if (sPlayerInput[nPlayer].pTarget != nullptr) { - pTarget = &exhumedActors[sPlayerInput[nPlayer].nTarget]; + pTarget = sPlayerInput[nPlayer].pTarget; } short nSnake = GrabSnake(); diff --git a/source/games/exhumed/src/view.cpp b/source/games/exhumed/src/view.cpp index 90984c4d4..1fd0efdb1 100644 --- a/source/games/exhumed/src/view.cpp +++ b/source/games/exhumed/src/view.cpp @@ -94,7 +94,7 @@ static void analyzesprites(spritetype* tsprite, int& spritesortcnt, int x, int y spritetype *pPlayerSprite = &sprite[nPlayerSprite]; - besttarget = -1; + bestTarget = nullptr; short nSector = pPlayerSprite->sectnum; @@ -107,7 +107,8 @@ static void analyzesprites(spritetype* tsprite, int& spritesortcnt, int x, int y for (nTSprite = spritesortcnt-1, pTSprite = &tsprite[nTSprite]; nTSprite >= 0; nTSprite--, pTSprite--) { int nSprite = pTSprite->owner; - spritetype *pSprite = &sprite[nSprite]; + auto pActor = &exhumedActors[nSprite]; + spritetype *pSprite = &pActor->s(); if (pTSprite->sectnum >= 0) { @@ -151,7 +152,7 @@ static void analyzesprites(spritetype* tsprite, int& spritesortcnt, int x, int y edx = (abs(edx) * 32) / ebx; if (ebx < 1000 && ebx < var_2C && edx < 10) { - besttarget = nSprite; + bestTarget = pActor; var_38 = edx; var_2C = ebx; } @@ -162,21 +163,21 @@ static void analyzesprites(spritetype* tsprite, int& spritesortcnt, int x, int y { var_38 = edx; var_2C = ebx; - besttarget = nSprite; + bestTarget = pActor; } } } } } - if (besttarget != -1) + if (bestTarget != nullptr) { - spritetype *pTarget = &sprite[besttarget]; + spritetype *pTarget = &bestTarget->s(); nCreepyTimer = kCreepyCount; - if (!cansee(x, y, z, nSector, pTarget->x, pTarget->y, pTarget->z - GetSpriteHeight(besttarget), pTarget->sectnum)) + if (!cansee(x, y, z, nSector, pTarget->x, pTarget->y, pTarget->z - GetActorHeight(bestTarget), pTarget->sectnum)) { - besttarget = -1; + bestTarget = nullptr; } } diff --git a/source/games/exhumed/src/view.h b/source/games/exhumed/src/view.h index 255169453..934ad8db7 100644 --- a/source/games/exhumed/src/view.h +++ b/source/games/exhumed/src/view.h @@ -22,7 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_PS_NS extern short bSubTitles; -extern short besttarget; +extern DExhumedActor* bestTarget; extern bool bCamera; void DrawStatusBar();