From e415d932830448525fdeebdfd570588e48705479 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 6 May 2021 09:09:58 +0200 Subject: [PATCH] - doexplosion --- source/games/blood/src/actor.cpp | 2 +- source/games/blood/src/ai.cpp | 2 +- source/games/blood/src/aiunicult.cpp | 29 ++++++++++++++++++---------- source/games/blood/src/aiunicult.h | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 2303948bb..591da5681 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2951,7 +2951,7 @@ static bool actKillModernDude(DBloodActor* actor, DAMAGE_TYPE damageType) { if (pExtra->weaponType == kGenDudeWeaponKamikaze && Chance(0x4000) && damageType != kDamageSpirit && damageType != kDamageDrown) { - doExplosion(pSprite, pXSprite->data1 - kTrapExploder); + doExplosion(actor, pXSprite->data1 - kTrapExploder); if (Chance(0x9000)) damageType = kDamageExplode; } diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index 4b9dd6b1f..2dc37f563 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -1061,7 +1061,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType removeDudeStuff(actor); if (pExtra->weaponType == kGenDudeWeaponKamikaze) - doExplosion(pSprite, pXSprite->data1 - kTrapExploder); + doExplosion(actor, pXSprite->data1 - kTrapExploder); if (spriteIsUnderwater(actor)) { diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 15c2bb010..19cdd90c0 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -714,7 +714,7 @@ static void unicultThinkChase(DBloodActor* actor) else if (weaponType == kGenDudeWeaponMissile) { // special handling for flame, explosive and life leech missiles - int state = checkAttackState(&bloodActors[pXSprite->reference]); + int state = checkAttackState(actor); switch (curWeapon) { case kMissileLifeLeechRegular: @@ -763,7 +763,7 @@ static void unicultThinkChase(DBloodActor* actor) if (CheckProximity(pSprite, pTarget->x, pTarget->y, pTarget->z, pTarget->sectnum, pExpl->radius >> 1)) { actor->xvel() = actor->yvel() = actor->zvel() = 0; - if (doExplosion(pSprite, nType) && pXSprite->health > 0) + if (doExplosion(actor, nType) && pXSprite->health > 0) actDamageSprite(actor, actor, kDamageExplode, 65535); } return; @@ -1889,11 +1889,20 @@ void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT event) } } -bool doExplosion(spritetype* pSprite, int nType) +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +bool doExplosion(DBloodActor* actor, int nType) { - auto actor = actSpawnSprite(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, kStatExplosion, true); - spritetype* pExplosion = &actor->s(); - if (pExplosion->extra < 0 || pExplosion->extra >= kMaxXSprites) + auto const pSprite = &actor->s(); + + auto actExplosion = actSpawnSprite(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, kStatExplosion, true); + auto const pExplosion = &actExplosion->s(); + auto const pXExplosion = &actExplosion->x(); + if (pExplosion->extra < 0 || pExplosion->extra >= kMaxXSprites) return false; int nSeq = 4; int nSnd = 304; const EXPLOSION* pExpl = &explodeInfo[nType]; @@ -1905,9 +1914,9 @@ bool doExplosion(spritetype* pSprite, int nType) pExplosion->yrepeat = pExplosion->xrepeat = pExpl->repeat; - xsprite[pExplosion->extra].data1 = pExpl->ticks; - xsprite[pExplosion->extra].data2 = pExpl->quakeEffect; - xsprite[pExplosion->extra].data3 = pExpl->flashEffect; + pXExplosion->data1 = pExpl->ticks; + pXExplosion->data2 = pExpl->quakeEffect; + pXExplosion->data3 = pExpl->flashEffect; if (nType == 0) { nSeq = 3; nSnd = 303; } else if (nType == 2) { nSeq = 4; nSnd = 305; } @@ -1917,7 +1926,7 @@ bool doExplosion(spritetype* pSprite, int nType) else if (nType == 7) { nSeq = 4; nSnd = 303; } seqSpawn(nSeq, 3, pExplosion->extra, -1); - sfxPlay3DSound(pExplosion, nSnd, -1, 0); + sfxPlay3DSound(actExplosion, nSnd, -1, 0); return true; } diff --git a/source/games/blood/src/aiunicult.h b/source/games/blood/src/aiunicult.h index a54167a1b..2997d74c5 100644 --- a/source/games/blood/src/aiunicult.h +++ b/source/games/blood/src/aiunicult.h @@ -206,7 +206,7 @@ void aiGenDudeMoveForward(DBloodActor* actor); void aiGenDudeChooseDirection(DBloodActor* actor, int a3, int aXvel = -1, int aYvel = -1); void aiGenDudeNewState(DBloodActor* actor, AISTATE* pAIState); int checkAttackState(DBloodActor* actor); -bool doExplosion(spritetype* pSprite, int nType); +bool doExplosion(DBloodActor* pSprite, int nType); spritetype* genDudeSpawn(XSPRITE* pXSource, spritetype* pSprite, int nDist); void genDudeTransform(spritetype* pSprite); void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT a3);