From e73725a40e5b900e0b98e8aebafd0e5695d6c22b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 15 Oct 2021 21:20:28 +0200 Subject: [PATCH] - converted FuncGrenade into a class. --- source/games/exhumed/src/aistuff.h | 7 + source/games/exhumed/src/grenade.cpp | 245 +++++++++++++-------------- 2 files changed, 125 insertions(+), 127 deletions(-) diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index d24493131e2..03ca132a3b5 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -472,6 +472,13 @@ class AIFishLimb : public ExhumedAI void Draw(RunListEvent* ev) override; }; +struct AIGrenade : public ExhumedAI +{ + void Tick(RunListEvent* ev) override; + void Draw(RunListEvent* ev) override; + void RadialDamage(RunListEvent* ev) override; +}; + void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun); diff --git a/source/games/exhumed/src/grenade.cpp b/source/games/exhumed/src/grenade.cpp index 20aeb44dca7..c669f5164d6 100644 --- a/source/games/exhumed/src/grenade.cpp +++ b/source/games/exhumed/src/grenade.cpp @@ -276,173 +276,164 @@ void ExplodeGrenade(short nGrenade) DestroyGrenade(nGrenade); } -void FuncGrenade(int nObject, int nMessage, int, int nRun) +void AIGrenade::Draw(RunListEvent* ev) { - short nGrenade = RunData[nRun].nVal; + short nGrenade = RunData[ev->nRun].nVal; + assert(nGrenade >= 0 && nGrenade < kMaxGrenades); + short nSeq = GrenadeList[nGrenade].field_C ? SeqOffsets[kSeqGrenBoom] : SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A; + seq_PlotSequence(ev->nIndex, nSeq, GrenadeList[nGrenade].field_2 >> 8, 1); +} + + +void AIGrenade::Tick(RunListEvent* ev) +{ + short nGrenade = RunData[ev->nRun].nVal; assert(nGrenade >= 0 && nGrenade < kMaxGrenades); short nGrenadeSprite = GrenadeList[nGrenade].nSprite; - auto pGrenadeSprite = &sprite[nGrenadeSprite]; - short nSeq; + auto pGrenadeSprite = &sprite[nGrenadeSprite]; + short nSeq = GrenadeList[nGrenade].field_C ? SeqOffsets[kSeqGrenBoom] : SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A; - if (GrenadeList[nGrenade].field_C) - { - nSeq = SeqOffsets[kSeqGrenBoom]; - } - else - { - nSeq = SeqOffsets[kSeqGrenRoll] + GrenadeList[nGrenade].field_A; - } + seq_MoveSequence(nGrenadeSprite, nSeq, GrenadeList[nGrenade].field_2 >> 8); + pGrenadeSprite->picnum = seq_GetSeqPicnum2(nSeq, GrenadeList[nGrenade].field_2 >> 8); - switch (nMessage) + GrenadeList[nGrenade].field_E--; + if (!GrenadeList[nGrenade].field_E) { - case 0x90000: - { - seq_PlotSequence(nObject, nSeq, GrenadeList[nGrenade].field_2 >> 8, 1); - break; - } + short nPlayer = nGrenadePlayer[nGrenade]; - default: + if (GrenadeList[nGrenade].field_10 < 0) { - Printf("unknown msg %d for grenade\n", nMessage); - return; - } + PlayerList[nPlayer].field_3A = 0; + PlayerList[nPlayer].field_3FOUR = 0; - case 0x20000: - { - seq_MoveSequence(nGrenadeSprite, nSeq, GrenadeList[nGrenade].field_2 >> 8); - pGrenadeSprite->picnum = seq_GetSeqPicnum2(nSeq, GrenadeList[nGrenade].field_2 >> 8); - - GrenadeList[nGrenade].field_E--; - if (!GrenadeList[nGrenade].field_E) + if (PlayerList[nPlayer].nAmmo[kWeaponGrenade]) { - short nPlayer = nGrenadePlayer[nGrenade]; - - if (GrenadeList[nGrenade].field_10 < 0) - { - PlayerList[nPlayer].field_3A = 0; - PlayerList[nPlayer].field_3FOUR = 0; - - if (PlayerList[nPlayer].nAmmo[kWeaponGrenade]) - { - PlayerList[nPlayer].bIsFiring = false; - } - else - { - SelectNewWeapon(nPlayer); - - PlayerList[nPlayer].nCurrentWeapon = PlayerList[nPlayer].field_38; - PlayerList[nPlayer].field_38 = -1; - } - } - - ExplodeGrenade(nGrenade); - return; + PlayerList[nPlayer].bIsFiring = false; } else { - if (GrenadeList[nGrenade].field_10 < 0) { - return; - } + SelectNewWeapon(nPlayer); + + PlayerList[nPlayer].nCurrentWeapon = PlayerList[nPlayer].field_38; + PlayerList[nPlayer].field_38 = -1; + } + } + + ExplodeGrenade(nGrenade); + return; + } + else + { + if (GrenadeList[nGrenade].field_10 < 0) { + return; + } - int ebp = (GrenadeList[nGrenade].field_2 + GrenadeList[nGrenade].field_0) >> 8; + int ebp = (GrenadeList[nGrenade].field_2 + GrenadeList[nGrenade].field_0) >> 8; - GrenadeList[nGrenade].field_2 += GrenadeList[nGrenade].field_0; + GrenadeList[nGrenade].field_2 += GrenadeList[nGrenade].field_0; - if (ebp < 0) + if (ebp < 0) + { + GrenadeList[nGrenade].field_2 += SeqSize[nSeq] << 8; + } + else + { + if (ebp >= SeqSize[nSeq]) + { + if (GrenadeList[nGrenade].field_C) { - GrenadeList[nGrenade].field_2 += SeqSize[nSeq] << 8; + DestroyGrenade(nGrenade); + return; } else { - if (ebp >= SeqSize[nSeq]) - { - if (GrenadeList[nGrenade].field_C) - { - DestroyGrenade(nGrenade); - return; - } - else - { - GrenadeList[nGrenade].field_2 = GrenadeList[nGrenade].field_C; - } - } + GrenadeList[nGrenade].field_2 = GrenadeList[nGrenade].field_C; } + } + } - if (GrenadeList[nGrenade].field_C) { - return; - } + if (GrenadeList[nGrenade].field_C) { + return; + } - int zVel = pGrenadeSprite->zvel; + int zVel = pGrenadeSprite->zvel; - Gravity(nGrenadeSprite); - int nMov = movesprite(nGrenadeSprite, GrenadeList[nGrenade].x, GrenadeList[nGrenade].y, pGrenadeSprite->zvel, pGrenadeSprite->clipdist >> 1, pGrenadeSprite->clipdist >> 1, CLIPMASK1); + Gravity(nGrenadeSprite); + int nMov = movesprite(nGrenadeSprite, GrenadeList[nGrenade].x, GrenadeList[nGrenade].y, pGrenadeSprite->zvel, pGrenadeSprite->clipdist >> 1, pGrenadeSprite->clipdist >> 1, CLIPMASK1); - if (!nMov) - return; + if (!nMov) + return; - if (nMov & 0x20000) + if (nMov & 0x20000) + { + if (zVel) + { + if (SectDamage[pGrenadeSprite->sectnum] > 0) { - if (zVel) - { - if (SectDamage[pGrenadeSprite->sectnum] > 0) - { - ExplodeGrenade(nGrenade); - return; - } - - GrenadeList[nGrenade].field_0 = (uint8_t)totalmoves; // limit to 8bits? - - D3PlayFX(StaticSound[kSound3], nGrenadeSprite); - - pGrenadeSprite->zvel = -(zVel >> 1); - - if (pGrenadeSprite->zvel > -1280) - { - D3PlayFX(StaticSound[kSound5], nGrenadeSprite); - GrenadeList[nGrenade].field_0 = 0; - GrenadeList[nGrenade].field_2 = 0; - pGrenadeSprite->zvel = 0; - GrenadeList[nGrenade].field_A = 1; - } - } - - GrenadeList[nGrenade].field_0 = 255 - (RandomByte() * 2); - GrenadeList[nGrenade].x -= (GrenadeList[nGrenade].x >> 4); - GrenadeList[nGrenade].y -= (GrenadeList[nGrenade].y >> 4); + ExplodeGrenade(nGrenade); + return; } - // loc_2CF60: - if ((nMov & 0xC000) >= 0x8000) + GrenadeList[nGrenade].field_0 = (uint8_t)totalmoves; // limit to 8bits? + + D3PlayFX(StaticSound[kSound3], nGrenadeSprite); + + pGrenadeSprite->zvel = -(zVel >> 1); + + if (pGrenadeSprite->zvel > -1280) { - if ((nMov & 0xC000) <= 0x8000) - { - BounceGrenade(nGrenade, GetWallNormal(nMov & 0x3FFF)); - } - else if ((nMov & 0xC000) == 0xC000) - { - BounceGrenade(nGrenade, sprite[nMov & 0x3FFF].ang); - } + D3PlayFX(StaticSound[kSound5], nGrenadeSprite); + GrenadeList[nGrenade].field_0 = 0; + GrenadeList[nGrenade].field_2 = 0; + pGrenadeSprite->zvel = 0; + GrenadeList[nGrenade].field_A = 1; } - - GrenadeList[nGrenade].field_2 = 0; - return; } - break; + GrenadeList[nGrenade].field_0 = 255 - (RandomByte() * 2); + GrenadeList[nGrenade].x -= (GrenadeList[nGrenade].x >> 4); + GrenadeList[nGrenade].y -= (GrenadeList[nGrenade].y >> 4); } - case 0xA0000: + // loc_2CF60: + if ((nMov & 0xC000) >= 0x8000) { - if (nGrenadeSprite != nRadialSpr && !GrenadeList[nGrenade].field_C) + if ((nMov & 0xC000) <= 0x8000) { - if (runlist_CheckRadialDamage(nGrenadeSprite) > 280) - { - GrenadeList[nGrenade].field_E = RandomSize(4) + 1; - } + BounceGrenade(nGrenade, GetWallNormal(nMov & 0x3FFF)); } - break; + else if ((nMov & 0xC000) == 0xC000) + { + BounceGrenade(nGrenade, sprite[nMov & 0x3FFF].ang); + } + } + + GrenadeList[nGrenade].field_2 = 0; + } +} + +void AIGrenade::RadialDamage(RunListEvent* ev) +{ + short nGrenade = RunData[ev->nRun].nVal; + assert(nGrenade >= 0 && nGrenade < kMaxGrenades); + + short nGrenadeSprite = GrenadeList[nGrenade].nSprite; + auto pGrenadeSprite = &sprite[nGrenadeSprite]; + + if (nGrenadeSprite != nRadialSpr && !GrenadeList[nGrenade].field_C) + { + if (runlist_CheckRadialDamage(nGrenadeSprite) > 280) + { + GrenadeList[nGrenade].field_E = RandomSize(4) + 1; } } } + +void FuncGrenade(int nObject, int nMessage, int nDamage, int nRun) +{ + AIGrenade ai; + runlist_DispatchEvent(&ai, nObject, nMessage, nDamage, nRun); +} + END_PS_NS