From 481c52f175bf3a8e6b1563a4b210b49d197ea98c Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Sat, 25 Mar 2023 14:08:02 +1100 Subject: [PATCH] - Exhumed: Move some player code out of exhumed.cpp and into player.cpp where it should be. --- source/games/exhumed/src/exhumed.cpp | 177 -------------------------- source/games/exhumed/src/player.cpp | 181 ++++++++++++++++++++++++++- 2 files changed, 180 insertions(+), 178 deletions(-) diff --git a/source/games/exhumed/src/exhumed.cpp b/source/games/exhumed/src/exhumed.cpp index 52a9bd3d7..2512c0e22 100644 --- a/source/games/exhumed/src/exhumed.cpp +++ b/source/games/exhumed/src/exhumed.cpp @@ -282,70 +282,6 @@ void DoGameOverScene(bool finallevel) // //--------------------------------------------------------------------------- -static void updatePlayerTarget(Player* const pPlayer) -{ - const auto pRa = &Ra[pPlayer->nPlayer]; - const auto pPlayerActor = pPlayer->pActor; - const auto nAngVect = (-pPlayerActor->spr.Angles.Yaw).ToVector(); - - DExhumedActor* bestTarget = nullptr; - double bestclose = 20; - double bestside = 30000; - - ExhumedSpriteIterator it; - while (const auto itActor = it.Next()) - { - const bool validstatnum = (itActor->spr.statnum > 0) && (itActor->spr.statnum < 150); - const bool validsprcstat = itActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL; - - if (validstatnum && validsprcstat && itActor != pPlayerActor) - { - const DVector2 delta = itActor->spr.pos.XY() - pPlayerActor->spr.pos.XY(); - const double fwd = abs((nAngVect.X * delta.Y) + (delta.X * nAngVect.Y)); - const double side = abs((nAngVect.X * delta.X) - (delta.Y * nAngVect.Y)); - - if (!side) - continue; - - const double close = fwd * 32 / side; - if (side < 1000 / 16. && side < bestside && close < 10) - { - bestTarget = itActor; - bestclose = close; - bestside = side; - } - else if (side < 30000 / 16.) - { - const double t = bestclose - close; - if (t > 3 || (side < bestside && abs(t) < 5)) - { - bestTarget = itActor; - bestclose = close; - bestside = side; - } - } - } - } - - if (bestTarget) - { - if (pPlayer->nPlayer == nLocalPlayer) nCreepyTimer = kCreepyCount; - - if (!cansee(pPlayerActor->spr.pos, pPlayerActor->sector(), bestTarget->spr.pos.plusZ(-GetActorHeight(bestTarget)), bestTarget->sector())) - { - bestTarget = nullptr; - } - } - - pPlayer->pTarget = pRa->pTarget = bestTarget; -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - static void GameMove(void) { UpdateInterpolations(); @@ -412,115 +348,6 @@ static void GameMove(void) // //--------------------------------------------------------------------------- -static void updatePlayerVelocity(Player* const pPlayer) -{ - const auto pInput = &pPlayer->input; - - if (pPlayer->nHealth > 0) - { - const auto inputvect = DVector2(pInput->fvel, pInput->svel).Rotated(pPlayer->pActor->spr.Angles.Yaw) * 0.375; - - for (int i = 0; i < 4; i++) - { - pPlayer->vel += inputvect; - pPlayer->vel *= 0.953125; - } - } - else - { - pInput->fvel = pInput->svel = pInput->avel = pInput->horz = 0; - pPlayer->vel.Zero(); - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -static void updatePlayerInventory(Player* const pPlayer) -{ - if (const auto invDir = !!(pPlayer->input.actions & SB_INVNEXT) - !!(pPlayer->input.actions & SB_INVPREV)) - { - int nItem = pPlayer->nItem; - - int i; - for (i = 6; i > 0; i--) - { - nItem += invDir; - if (nItem < 0) nItem = 5; - else if (nItem == 6) nItem = 0; - - if (pPlayer->items[nItem] != 0) - break; - } - - if (i > 0) pPlayer->nItem = nItem; - } - - if ((pPlayer->input.actions & SB_INVUSE) && pPlayer->nItem != -1) - { - pPlayer->input.setItemUsed(pPlayer->nItem); - } - - for (int i = 0; i < 6; i++) - { - if (pPlayer->input.isItemUsed(i)) - { - pPlayer->input.clearItemUsed(i); - if (pPlayer->items[i] > 0 && nItemMagic[i] <= pPlayer->nMagic) - { - pPlayer->nCurrentItem = i; - break; - } - } - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -static void updatePlayerWeapon(Player* const pPlayer) -{ - const auto currWeap = pPlayer->nCurrentWeapon; - auto weap2 = pPlayer->input.getNewWeapon(); - - if (const auto weapDir = (weap2 == WeaponSel_Next) - (weap2 == WeaponSel_Prev)) - { - auto wrapFwd = weapDir > 0 && currWeap == 6; - auto wrapBck = weapDir < 0 && currWeap == 0; - auto newWeap = wrapFwd ? 0 : wrapBck ? 6 : (currWeap + weapDir); - auto hasWeap = pPlayer->nPlayerWeapons & (1 << newWeap); - - while (newWeap && (!hasWeap || (hasWeap && !pPlayer->nAmmo[newWeap]))) - { - newWeap += weapDir; - if (newWeap > 6) newWeap = 0; - hasWeap = pPlayer->nPlayerWeapons & (1 << newWeap); - } - - pPlayer->input.setNewWeapon(newWeap + 1); - } - else if (weap2 == WeaponSel_Alt) - { - // todo - } - - // make weapon selection persist until it gets used up. - if (weap2 <= 0 || weap2 > 7) - pPlayer->input.setNewWeapon(pPlayer->input.getNewWeapon()); -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void GameInterface::Ticker() { if (paused) @@ -537,10 +364,6 @@ void GameInterface::Ticker() const auto pPlayer = &PlayerList[i]; pPlayer->Angles.resetCameraAngles(); pPlayer->input = playercmds[i].ucmd; - updatePlayerVelocity(pPlayer); - updatePlayerInventory(pPlayer); - updatePlayerWeapon(pPlayer); - updatePlayerTarget(pPlayer); } GameMove(); diff --git a/source/games/exhumed/src/player.cpp b/source/games/exhumed/src/player.cpp index ab59e8440..22b35a9e2 100644 --- a/source/games/exhumed/src/player.cpp +++ b/source/games/exhumed/src/player.cpp @@ -752,6 +752,181 @@ void AIPlayer::Damage(RunListEvent* ev) // //--------------------------------------------------------------------------- +void updatePlayerTarget(Player* const pPlayer) +{ + const auto pRa = &Ra[pPlayer->nPlayer]; + const auto pPlayerActor = pPlayer->pActor; + const auto nAngVect = (-pPlayerActor->spr.Angles.Yaw).ToVector(); + + DExhumedActor* bestTarget = nullptr; + double bestclose = 20; + double bestside = 30000; + + ExhumedSpriteIterator it; + while (const auto itActor = it.Next()) + { + const bool validstatnum = (itActor->spr.statnum > 0) && (itActor->spr.statnum < 150); + const bool validsprcstat = itActor->spr.cstat & CSTAT_SPRITE_BLOCK_ALL; + + if (validstatnum && validsprcstat && itActor != pPlayerActor) + { + const DVector2 delta = itActor->spr.pos.XY() - pPlayerActor->spr.pos.XY(); + const double fwd = abs((nAngVect.X * delta.Y) + (delta.X * nAngVect.Y)); + const double side = abs((nAngVect.X * delta.X) - (delta.Y * nAngVect.Y)); + + if (!side) + continue; + + const double close = fwd * 32 / side; + if (side < 1000 / 16. && side < bestside && close < 10) + { + bestTarget = itActor; + bestclose = close; + bestside = side; + } + else if (side < 30000 / 16.) + { + const double t = bestclose - close; + if (t > 3 || (side < bestside && abs(t) < 5)) + { + bestTarget = itActor; + bestclose = close; + bestside = side; + } + } + } + } + + if (bestTarget) + { + if (pPlayer->nPlayer == nLocalPlayer) nCreepyTimer = kCreepyCount; + + if (!cansee(pPlayerActor->spr.pos, pPlayerActor->sector(), bestTarget->spr.pos.plusZ(-GetActorHeight(bestTarget)), bestTarget->sector())) + { + bestTarget = nullptr; + } + } + + pPlayer->pTarget = pRa->pTarget = bestTarget; +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +static void updatePlayerVelocity(Player* const pPlayer) +{ + const auto pInput = &pPlayer->input; + + if (pPlayer->nHealth > 0) + { + const auto inputvect = DVector2(pInput->fvel, pInput->svel).Rotated(pPlayer->pActor->spr.Angles.Yaw) * 0.375; + + for (int i = 0; i < 4; i++) + { + pPlayer->vel += inputvect; + pPlayer->vel *= 0.953125; + } + } + else + { + pInput->fvel = pInput->svel = pInput->avel = pInput->horz = 0; + pPlayer->vel.Zero(); + } + + pPlayer->pActor->vel.XY() = pPlayer->vel; +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +static void updatePlayerInventory(Player* const pPlayer) +{ + if (const auto invDir = !!(pPlayer->input.actions & SB_INVNEXT) - !!(pPlayer->input.actions & SB_INVPREV)) + { + int nItem = pPlayer->nItem; + + int i; + for (i = 6; i > 0; i--) + { + nItem += invDir; + if (nItem < 0) nItem = 5; + else if (nItem == 6) nItem = 0; + + if (pPlayer->items[nItem] != 0) + break; + } + + if (i > 0) pPlayer->nItem = nItem; + } + + if ((pPlayer->input.actions & SB_INVUSE) && pPlayer->nItem != -1) + { + pPlayer->input.setItemUsed(pPlayer->nItem); + } + + for (int i = 0; i < 6; i++) + { + if (pPlayer->input.isItemUsed(i)) + { + pPlayer->input.clearItemUsed(i); + if (pPlayer->items[i] > 0 && nItemMagic[i] <= pPlayer->nMagic) + { + pPlayer->nCurrentItem = i; + break; + } + } + } +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +static void updatePlayerWeapon(Player* const pPlayer) +{ + const auto currWeap = pPlayer->nCurrentWeapon; + auto weap2 = pPlayer->input.getNewWeapon(); + + if (const auto weapDir = (weap2 == WeaponSel_Next) - (weap2 == WeaponSel_Prev)) + { + auto wrapFwd = weapDir > 0 && currWeap == 6; + auto wrapBck = weapDir < 0 && currWeap == 0; + auto newWeap = wrapFwd ? 0 : wrapBck ? 6 : (currWeap + weapDir); + auto hasWeap = pPlayer->nPlayerWeapons & (1 << newWeap); + + while (newWeap && (!hasWeap || (hasWeap && !pPlayer->nAmmo[newWeap]))) + { + newWeap += weapDir; + if (newWeap > 6) newWeap = 0; + hasWeap = pPlayer->nPlayerWeapons & (1 << newWeap); + } + + pPlayer->input.setNewWeapon(newWeap + 1); + } + else if (weap2 == WeaponSel_Alt) + { + // todo + } + + // make weapon selection persist until it gets used up. + if (weap2 <= 0 || weap2 > 7) + pPlayer->input.setNewWeapon(pPlayer->input.getNewWeapon()); +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + static void doPlayerCounters(Player* const pPlayer) { const auto pPlayerActor = pPlayer->pActor; @@ -1529,8 +1704,8 @@ void AIPlayer::Tick(RunListEvent* ev) pPlayer->pDoppleSprite->spr.picnum = pPlayerActor->spr.picnum; pPlayerActor->spr.picnum = seq_GetSeqPicnum(pPlayer->nSeq, PlayerSeq[nHeightTemplate[pPlayer->nAction]].a, pPlayer->nSeqSize); - pPlayerActor->vel.XY() = pPlayer->vel; + updatePlayerVelocity(pPlayer); doPlayerCounters(pPlayer); doPlayerYaw(pPlayer); doPlayerGravity(pPlayerActor); @@ -1542,6 +1717,8 @@ void AIPlayer::Tick(RunListEvent* ev) return; } + updatePlayerTarget(pPlayer); + if (pPlayer->nHealth > 0) { if (!pPlayer->invincibility) @@ -1566,6 +1743,8 @@ void AIPlayer::Tick(RunListEvent* ev) } updatePlayerFloorActor(pPlayer); + updatePlayerInventory(pPlayer); + updatePlayerWeapon(pPlayer); doPlayerItemPickups(pPlayer); if (bTouchFloor && pPlayerActor->sector()->lotag > 0)