From 040049f83e5e8bd598630fc1e056bad82c29209d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 5 May 2021 21:18:09 +0200 Subject: [PATCH] - more leech stuff. # Conflicts: # source/games/blood/src/ai.cpp --- source/games/blood/src/actor.cpp | 3 +- source/games/blood/src/ai.cpp | 2 +- source/games/blood/src/aiunicult.cpp | 57 ++++++++++++++++++---------- source/games/blood/src/aiunicult.h | 4 +- source/games/blood/src/nnexts.cpp | 4 +- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index e9035330900..d0ebc2a90d8 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2526,7 +2526,6 @@ static void actInitDudes() void actInit(bool bSaveLoad) { - #ifdef NOONE_EXTENSIONS if (!gModernMap) nnExtResetGlobals(); else nnExtInitModernStuff(bSaveLoad); @@ -2947,7 +2946,7 @@ static bool actKillModernDude(DBloodActor* actor, DAMAGE_TYPE damageType) auto pSprite = &actor->s(); auto pXSprite = &actor->x(); GENDUDEEXTRA* pExtra = &actor->genDudeExtra(); - removeDudeStuff(pSprite); + removeDudeStuff(actor); if (pXSprite->txID <= 0 || getNextIncarnation(pXSprite) == nullptr) { if (pExtra->weaponType == kGenDudeWeaponKamikaze && Chance(0x4000) && damageType != kDamageSpirit && damageType != kDamageDrown) diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index cc3f25c01d8..b15b5072e8f 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -1058,7 +1058,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType if (pXSprite->health > (uint32_t)pDudeInfo->fleeHealth) return nDamage; else if (pXSprite->txID <= 0 || getNextIncarnation(pXSprite) == nullptr) { - removeDudeStuff(pSprite); + removeDudeStuff(actor); if (pExtra->weaponType == kGenDudeWeaponKamikaze) doExplosion(pSprite, pXSprite->data1 - kTrapExploder); diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index a22311286ca..1a650f37f85 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -348,7 +348,7 @@ static void ThrowThing(DBloodActor* actor, bool impact) case kThingDroppedLifeLeech: zThrow = 5000; // pickup life leech before throw it again - if (pLeech != NULL) removeLeech(pLeech); + if (actLeech != NULL) removeLeech(actLeech); break; } @@ -719,7 +719,7 @@ static void unicultThinkChase(DBloodActor* actor) { case kMissileLifeLeechRegular: // pickup life leech if it was thrown previously - if (pLeech != NULL) removeLeech(pLeech); + if (actLeech != NULL) removeLeech(actLeech); mdist = 1500; break; case kMissileFlareAlt: @@ -1416,37 +1416,55 @@ DBloodActor* leechIsDropped(DBloodActor* actor) return actor->genDudeExtra().pLifeLeech; } -void removeDudeStuff(spritetype* pSprite) { - int nSprite; - StatIterator it(kStatThing); - while ((nSprite = it.NextIndex()) >= 0) +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +void removeDudeStuff(DBloodActor* actor) +{ + auto pSprite = &actor->s(); + BloodStatIterator it(kStatThing); + while (auto actor2 = it.Next()) { - if (sprite[nSprite].owner != pSprite->index) continue; - switch (sprite[nSprite].type) { + if ( actor2->GetOwner() != actor) continue; + auto pSprite2 = &actor2->s(); + switch (pSprite2->type) { case kThingArmedProxBomb: case kThingArmedRemoteBomb: case kModernThingTNTProx: - sprite[nSprite].type = kSpriteDecoration; - actPostSprite(sprite[nSprite].index, kStatFree); + pSprite2->type = kSpriteDecoration; + actPostSprite(actor2, kStatFree); break; case kModernThingEnemyLifeLeech: - killDudeLeech(&sprite[nSprite]); + killDudeLeech(pSprite2); break; } } it.Reset(kStatDude); - while ((nSprite = it.NextIndex()) >= 0) + while (auto actor2 = it.Next()) { - if (sprite[nSprite].owner != pSprite->index) continue; - actDamageSprite(&bloodActors[sprite[nSprite].owner], &bloodActors[nSprite], kDamageFall, 65535); + if (actor2->GetOwner() != actor) continue; + actDamageSprite(actor2->GetOwner(), actor2, kDamageFall, 65535); } } -void removeLeech(spritetype* pLeech, bool delSprite) { - if (pLeech != NULL) { - spritetype* pEffect = gFX.fxSpawn((FX_ID)52,pLeech->sectnum,pLeech->x,pLeech->y,pLeech->z,pLeech->ang); - if (pEffect != NULL) { +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +void removeLeech(DBloodActor* actLeech, bool delSprite) +{ + if (actLeech != NULL) + { + auto const pLeech = &actLeech->s(); + spritetype* pEffect = gFX.fxSpawn((FX_ID)52, pLeech->sectnum, pLeech->x, pLeech->y, pLeech->z, pLeech->ang); + if (pEffect != NULL) + { pEffect->cstat = CSTAT_SPRITE_ALIGNMENT_FACING; pEffect->pal = 6; int repeat = 64 + Random(50); @@ -1459,7 +1477,8 @@ void removeLeech(spritetype* pLeech, bool delSprite) { if (pLeech->owner >= 0 && pLeech->owner < kMaxSprites) gGenDudeExtra[sprite[pLeech->owner].index].pLifeLeech = nullptr; - if (delSprite) { + if (delSprite) + { pLeech->type = kSpriteDecoration; actPostSprite(pLeech->index, kStatFree); } diff --git a/source/games/blood/src/aiunicult.h b/source/games/blood/src/aiunicult.h index 4c0ad419cd0..85636964aac 100644 --- a/source/games/blood/src/aiunicult.h +++ b/source/games/blood/src/aiunicult.h @@ -197,8 +197,8 @@ extern GENDUDEEXTRA gGenDudeExtra[kMaxSprites]; XSPRITE* getNextIncarnation(XSPRITE* pXSprite); void killDudeLeech(spritetype* pLeech); -void removeLeech(spritetype* pLeech, bool delSprite = true); -void removeDudeStuff(spritetype* pSprite); +void removeLeech(DBloodActor* pLeech, bool delSprite = true); +void removeDudeStuff(DBloodActor* pSprite); DBloodActor* leechIsDropped(DBloodActor* pSprite); bool spriteIsUnderwater(DBloodActor* pSprite, bool oldWay = false); bool playGenDudeSound(DBloodActor* actor, int mode); diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index d50c90b899c..daf0b5c4ebe 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -5913,11 +5913,11 @@ void useTargetChanger(XSPRITE* pXSource, spritetype* pSprite) { aiSetTarget_(pXSprite, pSprite->x, pSprite->y, pSprite->z); aiSetGenIdleState(pSprite, pXSprite); if (pSprite->type == kDudeModernCustom && actLeech) - removeLeech(&actLeech->s()); + removeLeech(actLeech); } else if (pXSource->data4 == 4) { aiSetTarget_(pXSprite, pPlayer->x, pPlayer->y, pPlayer->z); if (pSprite->type == kDudeModernCustom && actLeech) - removeLeech(&actLeech->s()); + removeLeech(actLeech); } }