From eb478ba5805db89824af30172330369ea5ff9d37 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 6 May 2021 08:39:33 +0200 Subject: [PATCH] - getNextIncarnation Event queue handling not refactored yet. --- source/games/blood/src/actor.cpp | 2 +- source/games/blood/src/ai.cpp | 2 +- source/games/blood/src/aiunicult.cpp | 28 +++++++++++++++++++--------- source/games/blood/src/aiunicult.h | 2 +- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index d0ebc2a90d8..2303948bb12 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2947,7 +2947,7 @@ static bool actKillModernDude(DBloodActor* actor, DAMAGE_TYPE damageType) auto pXSprite = &actor->x(); GENDUDEEXTRA* pExtra = &actor->genDudeExtra(); removeDudeStuff(actor); - if (pXSprite->txID <= 0 || getNextIncarnation(pXSprite) == nullptr) + if (pXSprite->txID <= 0 || getNextIncarnation(actor) == 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 b15b5072e8f..667ee67f0f1 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -1056,7 +1056,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType if (nDmgType == kDamageBurn) { if (pXSprite->health > (uint32_t)pDudeInfo->fleeHealth) return nDamage; - else if (pXSprite->txID <= 0 || getNextIncarnation(pXSprite) == nullptr) + else if (pXSprite->txID <= 0 || getNextIncarnation(actor) == nullptr) { removeDudeStuff(actor); diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index a829e68bc26..3cc4288c72e 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -1506,17 +1506,26 @@ void killDudeLeech(DBloodActor* actLeech) // //--------------------------------------------------------------------------- -XSPRITE* getNextIncarnation(XSPRITE* pXSprite) { - for (int i = bucketHead[pXSprite->txID]; i < bucketHead[pXSprite->txID + 1]; i++) { - if (rxBucket[i].type != 3 || rxBucket[i].index == pXSprite->reference) +DBloodActor* getNextIncarnation(DBloodActor* actor) +{ + XSPRITE* pXSprite = &actor->x(); + for (int i = bucketHead[pXSprite->txID]; i < bucketHead[pXSprite->txID + 1]; i++) + { + if (rxBucket[i].type != OBJ_SPRITE || rxBucket[i].index == pXSprite->reference) continue; - + if (sprite[rxBucket[i].index].statnum == kStatInactive) - return &xsprite[sprite[rxBucket[i].index].extra]; - } + return &bloodActors[sprite[rxBucket[i].index].index]; + } return NULL; } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + bool dudeIsMelee(XSPRITE* pXSprite) { return gGenDudeExtra[sprite[pXSprite->reference].index].isMelee; } @@ -1967,14 +1976,15 @@ void genDudeTransform(spritetype* pSprite) { XSPRITE* pXSprite = &xsprite[pSprite->extra]; auto actor = &bloodActors[pXSprite->reference]; - XSPRITE* pXIncarnation = getNextIncarnation(pXSprite); - if (pXIncarnation == NULL) { + auto actIncarnation = getNextIncarnation(actor); + if (actIncarnation == NULL) { if (pXSprite->sysData1 == kGenDudeTransformStatus) pXSprite->sysData1 = 0; trTriggerSprite(pSprite->index, pXSprite, kCmdOff); return; } - spritetype* pIncarnation = &sprite[pXIncarnation->reference]; + auto pXIncarnation = &actIncarnation->x(); + spritetype* pIncarnation = &actIncarnation->s(); pXSprite->key = pXSprite->dropMsg = pXSprite->locked = 0; // save incarnation's going on and off options diff --git a/source/games/blood/src/aiunicult.h b/source/games/blood/src/aiunicult.h index 2657ef215db..f47a4e1e740 100644 --- a/source/games/blood/src/aiunicult.h +++ b/source/games/blood/src/aiunicult.h @@ -195,7 +195,7 @@ struct GENDUDEEXTRA extern GENDUDEEXTRA gGenDudeExtra[kMaxSprites]; -XSPRITE* getNextIncarnation(XSPRITE* pXSprite); +DBloodActor* getNextIncarnation(DBloodActor* actor); void killDudeLeech(DBloodActor* pLeech); void removeLeech(DBloodActor* pLeech, bool delSprite = true); void removeDudeStuff(DBloodActor* pSprite);