From 34b7bfc10ba8968692b1695d79d306cd6c0342ec Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 2 Dec 2020 23:39:38 +0100 Subject: [PATCH] - handled the actDrop* functions. --- source/games/blood/src/actor.cpp | 246 ++++++++++++++++----------- source/games/blood/src/actor.h | 9 +- source/games/blood/src/aiunicult.cpp | 4 +- source/games/blood/src/bloodactor.h | 10 ++ source/games/blood/src/fx.cpp | 2 +- source/games/blood/src/player.cpp | 2 +- 6 files changed, 162 insertions(+), 111 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index bd8fe64de..664675b4b 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2766,123 +2766,157 @@ static void actNapalmMove(DBloodActor* actor) // //--------------------------------------------------------------------------- -spritetype *actSpawnFloor(spritetype *pSprite) +static DBloodActor *actSpawnFloor(DBloodActor *actor) { - short nSector = pSprite->sectnum; - int x = pSprite->x; - int y = pSprite->y; - updatesector(x, y, &nSector); - int zFloor = getflorzofslope(nSector, x, y); - spritetype *pSprite2 = actSpawnSprite(nSector, x, y, zFloor, 3, 0); - if (pSprite2) - pSprite2->cstat &= ~257; - return pSprite2; + auto pSprite = &actor->s(); + short sector = pSprite->sectnum; + int x = pSprite->x; + int y = pSprite->y; + updatesector(x, y, §or); + int zFloor = getflorzofslope(sector, x, y); + auto *spawned = actSpawnSprite(sector, x, y, zFloor, 3, 0); + if (spawned) spawned->s().cstat &= ~257; + return spawned; } -spritetype *actDropAmmo(spritetype *pSprite, int nType) +static DBloodActor *actDropAmmo(DBloodActor *actor, int nType) { - spritetype *pSprite2 = NULL; - if (pSprite && pSprite->statnum < kMaxStatus && nType >= kItemAmmoBase && nType < kItemAmmoMax) - { - pSprite2 = actSpawnFloor(pSprite); - const AMMOITEMDATA *pAmmo = &gAmmoItemData[nType - kItemAmmoBase]; - pSprite2->type = nType; - pSprite2->picnum = pAmmo->picnum; - pSprite2->shade = pAmmo->shade; - pSprite2->xrepeat = pAmmo->xrepeat; - pSprite2->yrepeat = pAmmo->yrepeat; - } - return pSprite2; + if (!actor) return nullptr; + auto pSprite = &actor->s(); + if (pSprite->statnum < kMaxStatus && nType >= kItemAmmoBase && nType < kItemAmmoMax) + { + auto act2 = actSpawnFloor(actor); + const AMMOITEMDATA *pAmmo = &gAmmoItemData[nType - kItemAmmoBase]; + auto pSprite2 = &act2->s(); + pSprite2->type = nType; + pSprite2->picnum = pAmmo->picnum; + pSprite2->shade = pAmmo->shade; + pSprite2->xrepeat = pAmmo->xrepeat; + pSprite2->yrepeat = pAmmo->yrepeat; + return act2; + } + return nullptr; } -spritetype *actDropWeapon(spritetype *pSprite, int nType) +static DBloodActor *actDropWeapon(DBloodActor *actor, int nType) { - spritetype *pSprite2 = NULL; - if (pSprite && pSprite->statnum < kMaxStatus && nType >= kItemWeaponBase && nType < kItemWeaponMax) - { - pSprite2 = actSpawnFloor(pSprite); - const WEAPONITEMDATA *pWeapon = &gWeaponItemData[nType - kItemWeaponBase]; - pSprite2->type = nType; - pSprite2->picnum = pWeapon->picnum; - pSprite2->shade = pWeapon->shade; - pSprite2->xrepeat = pWeapon->xrepeat; - pSprite2->yrepeat = pWeapon->yrepeat; - } - return pSprite2; + if (!actor) return nullptr; + auto pSprite = &actor->s(); + if (pSprite->statnum < kMaxStatus && nType >= kItemWeaponBase && nType < kItemWeaponMax) + { + auto act2 = actSpawnFloor(actor); + const WEAPONITEMDATA *pWeapon = &gWeaponItemData[nType - kItemWeaponBase]; + auto pSprite2 = &act2->s(); + pSprite2->type = nType; + pSprite2->picnum = pWeapon->picnum; + pSprite2->shade = pWeapon->shade; + pSprite2->xrepeat = pWeapon->xrepeat; + pSprite2->yrepeat = pWeapon->yrepeat; + return act2; + } + return nullptr; } -spritetype *actDropItem(spritetype *pSprite, int nType) +static DBloodActor* actDropItem(DBloodActor* actor, int nType) { - spritetype *pSprite2 = NULL; - if (pSprite && pSprite->statnum < kMaxStatus && nType >= kItemBase && nType < kItemMax) - { - pSprite2 = actSpawnFloor(pSprite); - const ITEMDATA *pItem = &gItemData[nType - kItemBase]; - pSprite2->type = nType; - pSprite2->picnum = pItem->picnum; - pSprite2->shade = pItem->shade; - pSprite2->xrepeat = pItem->xrepeat; - pSprite2->yrepeat = pItem->yrepeat; - } - return pSprite2; + if (!actor) return nullptr; + auto pSprite = &actor->s(); + if (pSprite->statnum < kMaxStatus && nType >= kItemBase && nType < kItemMax) + { + auto act2 = actSpawnFloor(actor); + const ITEMDATA *pItem = &gItemData[nType - kItemBase]; + auto pSprite2 = &act2->s(); + pSprite2->type = nType; + pSprite2->picnum = pItem->picnum; + pSprite2->shade = pItem->shade; + pSprite2->xrepeat = pItem->xrepeat; + pSprite2->yrepeat = pItem->yrepeat; + return act2; + } + return nullptr; } -spritetype *actDropKey(spritetype *pSprite, int nType) +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +static DBloodActor *actDropKey(DBloodActor *actor, int nType) { - spritetype *pSprite2 = NULL; - if (pSprite && pSprite->statnum < kMaxStatus && nType >= kItemKeyBase && nType < kItemKeyMax) - { - pSprite2 = actDropItem(pSprite, nType); - if (pSprite2 && gGameOptions.nGameType == 1) - { - if (pSprite2->extra == -1) - dbInsertXSprite(pSprite2->index); - xsprite[pSprite2->extra].respawn = 3; - gSpriteHit[pSprite2->extra].florhit = 0; - gSpriteHit[pSprite2->extra].ceilhit = 0; - } - } - return pSprite2; + if (!actor) return nullptr; + auto pSprite = &actor->s(); + if (pSprite->statnum < kMaxStatus && nType >= kItemKeyBase && nType < kItemKeyMax) + { + auto act2 = actDropItem(actor, nType); + if (act2 && gGameOptions.nGameType == 1) + { + act2->addX(); + auto pSprite2 = &act2->s(); + act2->x().respawn = 3; + act2->hit().florhit = 0; + act2->hit().ceilhit = 0; + } + return act2; + } + return nullptr; } -spritetype *actDropFlag(spritetype *pSprite, int nType) +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +static DBloodActor*actDropFlag(DBloodActor* actor, int nType) { - spritetype *pSprite2 = NULL; - if (pSprite && pSprite->statnum < kMaxStatus && (nType == 147 || nType == 148)) - { - pSprite2 = actDropItem(pSprite, nType); - if (pSprite2 && gGameOptions.nGameType == 3) - { - evPost(pSprite2->index, 3, 1800, kCallbackReturnFlag); - } - } - return pSprite2; + if (!actor) return nullptr; + auto pSprite = &actor->s(); + if (pSprite->statnum < kMaxStatus && (nType == 147 || nType == 148)) + { + auto act2 = actDropItem(actor, nType); + if (act2 && gGameOptions.nGameType == 3) + { + evPost(act2->s().index, 3, 1800, kCallbackReturnFlag); + } + return act2; + } + return nullptr; } -spritetype *actDropObject(spritetype *pSprite, int nType) { - spritetype *pSprite2 = NULL; - - if (nType >= kItemKeyBase && nType < kItemKeyMax) pSprite2 = actDropKey(pSprite, nType); - else if (nType == kItemFlagA || nType == kItemFlagB) pSprite2 = actDropFlag(pSprite, nType); - else if (nType >= kItemBase && nType < kItemMax) pSprite2 = actDropItem(pSprite, nType); - else if (nType >= kItemAmmoBase && nType < kItemAmmoMax) pSprite2 = actDropAmmo(pSprite, nType); - else if (nType >= kItemWeaponBase && nType < kItemWeaponMax) pSprite2 = actDropWeapon(pSprite, nType); - - if (pSprite2) { - if (pSprite2->picnum == -1) - { - DeleteSprite(pSprite2 - sprite); - return nullptr; - } - int top, bottom; - GetSpriteExtents(pSprite2, &top, &bottom); - if (bottom >= pSprite2->z) - pSprite2->z -= bottom - pSprite2->z; - } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- - return pSprite2; +static DBloodActor* actDropObject(DBloodActor* pSprite, int nType) +{ + DBloodActor *act2 = nullptr; + + if (nType >= kItemKeyBase && nType < kItemKeyMax) act2 = actDropKey(pSprite, nType); + else if (nType == kItemFlagA || nType == kItemFlagB) act2 = actDropFlag(pSprite, nType); + else if (nType >= kItemBase && nType < kItemMax) act2 = actDropItem(pSprite, nType); + else if (nType >= kItemAmmoBase && nType < kItemAmmoMax) act2 = actDropAmmo(pSprite, nType); + else if (nType >= kItemWeaponBase && nType < kItemWeaponMax) act2 = actDropWeapon(pSprite, nType); + + if (act2) + { + int top, bottom; + GetActorExtents(act2, &top, &bottom); + if (bottom >= act2->s().z) + act2->s().z -= bottom - act2->s().z; + } + + return act2; } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + bool actHealDude(XSPRITE *pXDude, int a2, int a3) { assert(pXDude != NULL); @@ -5287,7 +5321,7 @@ void actExplodeSprite(spritetype *pSprite) break; case kThingTNTBarrel: { - spritetype *pSprite2 = actSpawnSprite(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, 0, 1); + spritetype *pSprite2 = actSpawnSprite_(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, 0, 1); pSprite2->owner = pSprite->owner; if (actCheckRespawn(pSprite)) { @@ -6063,7 +6097,7 @@ void actProcessSprites(void) gFX.fxProcess(); } -spritetype * actSpawnSprite(int nSector, int x, int y, int z, int nStat, char a6) +spritetype * actSpawnSprite_(int nSector, int x, int y, int z, int nStat, char a6) { int nSprite = InsertSprite(nSector, nStat); if (nSprite >= 0) @@ -6092,6 +6126,12 @@ spritetype * actSpawnSprite(int nSector, int x, int y, int z, int nStat, char a6 return pSprite; } +DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool a6) +{ + auto spr = actSpawnSprite_(nSector, x, y, z, nStat, a6); + return &bloodActors[spr->index]; +} + spritetype * actSpawnSprite(spritetype *pSource, int nStat); spritetype *actSpawnDude(spritetype *pSource, short nType, int a3, int a4) @@ -6188,7 +6228,7 @@ spritetype * actSpawnSprite(spritetype *pSource, int nStat) spritetype * actSpawnThing(int nSector, int x, int y, int z, int nThingType) { assert(nThingType >= kThingBase && nThingType < kThingMax); - spritetype *pSprite = actSpawnSprite(nSector, x, y, z, 4, 1); + spritetype *pSprite = actSpawnSprite_(nSector, x, y, z, 4, 1); int nType = nThingType-kThingBase; int nThing = pSprite->index; int nXThing = pSprite->extra; @@ -6329,7 +6369,7 @@ spritetype* actFireMissile(spritetype *pSprite, int a2, int a3, int a4, int a5, y = gHitInfo.hity-MulScale(pMissileInfo->clipDist<<1, Sin(pSprite->ang), 28); } } - spritetype *pMissile = actSpawnSprite(pSprite->sectnum, x, y, z, 5, 1); + spritetype *pMissile = actSpawnSprite_(pSprite->sectnum, x, y, z, 5, 1); int nMissile = pMissile->index; show2dsprite.Set(nMissile); pMissile->type = nType; @@ -6995,5 +7035,11 @@ void SerializeActor(FSerializer& arc) } } +spritetype* actDropObject(spritetype* pSprite, int nType) +{ + auto act = actDropObject(&bloodActors[pSprite->index], nType); + return act ? &act->s() : nullptr; +} + END_BLD_NS diff --git a/source/games/blood/src/actor.h b/source/games/blood/src/actor.h index ce68ba4d7..e385027db 100644 --- a/source/games/blood/src/actor.h +++ b/source/games/blood/src/actor.h @@ -214,12 +214,6 @@ void actInit(bool bSaveLoad); int actWallBounceVector(int *x, int *y, int nWall, int a4); int actFloorBounceVector(int *x, int *y, int *z, int nSector, int a5); void actRadiusDamage(DBloodActor* source, int x, int y, int z, int nSector, int nDist, int a7, int a8, DAMAGE_TYPE a9, int a10, int a11); -spritetype *actSpawnFloor(spritetype *pSprite); -spritetype *actDropAmmo(spritetype *pSprite, int nType); -spritetype *actDropWeapon(spritetype *pSprite, int nType); -spritetype *actDropItem(spritetype *pSprite, int nType); -spritetype *actDropKey(spritetype *pSprite, int nType); -spritetype *actDropFlag(spritetype *pSprite, int nType); spritetype *actDropObject(spritetype *pSprite, int nType); bool actHealDude(XSPRITE *pXDude, int a2, int a3); void actKillDude(int a1, spritetype *pSprite, DAMAGE_TYPE a3, int a4); @@ -238,7 +232,8 @@ void actExplodeSprite(spritetype *pSprite); void actActivateGibObject(DBloodActor *actor); bool IsUnderWater(spritetype *pSprite); void actProcessSprites(void); -spritetype * actSpawnSprite(int nSector, int x, int y, int z, int nStat, char a6); +spritetype * actSpawnSprite_(int nSector, int x, int y, int z, int nStat, char a6); +DBloodActor* actSpawnSprite(int nSector, int x, int y, int z, int nStat, bool a6); spritetype *actSpawnDude(spritetype *pSource, short nType, int a3, int a4); spritetype * actSpawnSprite(spritetype *pSource, int nStat); spritetype * actSpawnThing(int nSector, int x, int y, int z, int nThingType); diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 638a15e82..31315d457 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -306,7 +306,7 @@ static void ThrowThing(DBloodActor* actor, bool impact) } spritetype* pThing = NULL; - if ((pThing = actFireThing(pSprite, 0, 0, (dz / 128) - zThrow, curWeapon, DivScale(dist / 540, 120, 23))) == NULL) return; + if ((pThing = actFireThing_(pSprite, 0, 0, (dz / 128) - zThrow, curWeapon, DivScale(dist / 540, 120, 23))) == NULL) return; else if (pThinkInfo->picnum < 0 && pThing->type != kModernThingThrowableRock) pThing->picnum = 0; pThing->owner = pSprite->index; @@ -1592,7 +1592,7 @@ void dudeLeechOperate(spritetype* pSprite, XSPRITE* pXSprite, EVENT event) } bool doExplosion(spritetype* pSprite, int nType) { - spritetype* pExplosion = actSpawnSprite(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, kStatExplosion, true); + spritetype* pExplosion = actSpawnSprite_(pSprite->sectnum, pSprite->x, pSprite->y, pSprite->z, kStatExplosion, true); if (pExplosion->extra < 0 || pExplosion->extra >= kMaxXSprites) return false; diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index 10cdc9c93..d54d212d4 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -22,6 +22,10 @@ public: dudeSlope = 0; } bool hasX() { return sprite[index].extra > 0; } + void addX() + { + if (s().extra == -1) dbInsertXSprite(s().index); + } spritetype& s() { return sprite[index]; } XSPRITE& x() { return xsprite[sprite[index].extra]; } // calling this does not validate the xsprite! SPRITEHIT& hit() { return gSpriteHit[sprite[index].extra]; } @@ -131,4 +135,10 @@ inline void actBurnSprite(DBloodActor* pSource, DBloodActor* pTarget, int nTime) pXSprite->burnSource = pSource->s().index; } +inline void GetActorExtents(DBloodActor* actor, int* top, int* bottom) +{ + GetSpriteExtents(&actor->s(), top, bottom); +} + + END_BLD_NS diff --git a/source/games/blood/src/fx.cpp b/source/games/blood/src/fx.cpp index 78a05a3a5..e0fdc7a5d 100644 --- a/source/games/blood/src/fx.cpp +++ b/source/games/blood/src/fx.cpp @@ -164,7 +164,7 @@ spritetype * CFX::fxSpawn(FX_ID nFx, int nSector, int x, int y, int z, unsigned return NULL; destroy(nSprite); } - spritetype *pSprite = actSpawnSprite(nSector, x, y, z, 1, 0); + spritetype *pSprite = actSpawnSprite_(nSector, x, y, z, 1, 0); pSprite->type = nFx; pSprite->picnum = pFX->picnum; pSprite->cstat |= pFX->cstat; diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index 82dd2c16d..a42428bd3 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -660,7 +660,7 @@ void playerStart(int nPlayer, int bNewLevel) pStartZone = &gStartZone[Random(8)]; } - spritetype *pSprite = actSpawnSprite(pStartZone->sectnum, pStartZone->x, pStartZone->y, pStartZone->z, 6, 1); + spritetype *pSprite = actSpawnSprite_(pStartZone->sectnum, pStartZone->x, pStartZone->y, pStartZone->z, 6, 1); assert(pSprite->extra > 0 && pSprite->extra < kMaxXSprites); XSPRITE *pXSprite = &xsprite[pSprite->extra]; pPlayer->pSprite = pSprite;