From 9349e7bcb138e8398c35069be98007aeea975f20 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 5 Sep 2021 08:17:05 +0200 Subject: [PATCH] - several simple functions. Also two fixes involving trTriggerSprite. --- source/games/blood/src/nnexts.cpp | 4 +- source/games/blood/src/player.cpp | 21 +++++---- source/games/blood/src/triggers.cpp | 68 ++++++++++++++--------------- source/games/blood/src/triggers.h | 3 +- 4 files changed, 46 insertions(+), 50 deletions(-) diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 02ec134fa..b9e073144 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -466,7 +466,7 @@ void nnExtTriggerObject(int objType, int objIndex, DBloodActor* objActor, int co break; case OBJ_SPRITE: if (!objActor || !objActor->hasX()) break; - trTriggerSprite(objActor->GetIndex(), &objActor->x(), command); + trTriggerSprite(objActor, command); break; } @@ -3076,7 +3076,7 @@ void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor) clampSprite(actor, 0x01); if (pSource->flags & kModernTypeFlag1) // force telefrag - TeleFrag(pSprite->index, pSource->sectnum); + TeleFrag(actor, pSource->sectnum); if (pSprite->flags & kPhysGravity) pSprite->flags |= kPhysFalling; diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index a512553b1..a8a61326e 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -908,7 +908,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) if ((pPlayer->hasFlag & 1) == 0 && pXItem->state) { pPlayer->hasFlag |= 1; pPlayer->ctfFlagState[0] = itemactor; - trTriggerSprite(pItem->index, pXItem, kCmdOff); + trTriggerSprite(itemactor, kCmdOff); sprintf(buffer, "%s stole Blue Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8007, 255, 2, 0); viewSetMessage(buffer); @@ -920,7 +920,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) if ((pPlayer->hasFlag & 1) != 0 && !pXItem->state) { pPlayer->hasFlag &= ~1; pPlayer->ctfFlagState[0] = nullptr; - trTriggerSprite(pItem->index, pXItem, kCmdOn); + trTriggerSprite(itemactor, kCmdOn); sprintf(buffer, "%s returned Blue Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8003, 255, 2, 0); viewSetMessage(buffer); @@ -945,7 +945,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) if ((pPlayer->hasFlag & 2) == 0 && pXItem->state) { pPlayer->hasFlag |= 2; pPlayer->ctfFlagState[1] = itemactor; - trTriggerSprite(pItem->index, pXItem, kCmdOff); + trTriggerSprite(itemactor, kCmdOff); sprintf(buffer, "%s stole Red Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8006, 255, 2, 0); viewSetMessage(buffer); @@ -957,7 +957,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) { pPlayer->hasFlag &= ~2; pPlayer->ctfFlagState[1] = nullptr; - trTriggerSprite(pItem->index, pXItem, kCmdOn); + trTriggerSprite(itemactor, kCmdOn); sprintf(buffer, "%s returned Red Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8002, 255, 2, 0); viewSetMessage(buffer); @@ -987,7 +987,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) pPlayer->ctfFlagState[0] = nullptr; spritetype* pOwner = &itemactor->GetOwner()->s(); XSPRITE* pXOwner = &itemactor->GetOwner()->x(); - trTriggerSprite(pOwner->index, pXOwner, kCmdOn); + trTriggerSprite(itemactor->GetOwner(), kCmdOn); sprintf(buffer, "%s returned Blue Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8003, 255, 2, 0); viewSetMessage(buffer); @@ -1013,7 +1013,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor) pPlayer->ctfFlagState[1] = nullptr; spritetype* pOwner = &itemactor->GetOwner()->s(); XSPRITE* pXOwner = &itemactor->GetOwner()->x(); - trTriggerSprite(pOwner->index, pXOwner, kCmdOn); + trTriggerSprite(itemactor->GetOwner(), kCmdOn); sprintf(buffer, "%s returned Red Flag", PlayerName(pPlayer->nPlayer)); sndStartSample(8002, 255, 2, 0); viewSetMessage(buffer); @@ -1187,9 +1187,8 @@ void PickUp(PLAYER *pPlayer, DBloodActor* actor) if (!pickedUp) return; else if (actor->hasX()) { - XSPRITE *pXSprite = &actor->x(); - if (pXSprite->Pickup) - trTriggerSprite(pSprite->index, pXSprite, kCmdSpritePickup); + if (actor->x().Pickup) + trTriggerSprite(actor, kCmdSpritePickup); } if (!actCheckRespawn(actor)) @@ -1564,7 +1563,7 @@ void ProcessInput(PLAYER *pPlayer) if (pXSprite->locked && pPlayer == gMe && pXSprite->lockMsg) trTextOver(pXSprite->lockMsg); if (!key || pPlayer->hasKey[key]) - trTriggerSprite(act->GetIndex(), pXSprite, kCmdSpritePush); + trTriggerSprite(act, kCmdSpritePush); else if (pPlayer == gMe) { viewSetMessage(GStrings("TXTB_KEY")); @@ -2064,7 +2063,7 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage gPlayer[p].fragger = nullptr; } FragPlayer(pPlayer, source); - trTriggerSprite(pSprite->index, pXSprite, kCmdOff); + trTriggerSprite(pActor, kCmdOff); #ifdef NOONE_EXTENSIONS // allow drop items and keys in multiplayer diff --git a/source/games/blood/src/triggers.cpp b/source/games/blood/src/triggers.cpp index 70129adf8..9eddcc8a1 100644 --- a/source/games/blood/src/triggers.cpp +++ b/source/games/blood/src/triggers.cpp @@ -191,10 +191,10 @@ unsigned int GetSourceBusy(EVENT a1) return 0; } -void LifeLeechOperate(spritetype *pSprite, XSPRITE *pXSprite, EVENT event) +void LifeLeechOperate(DBloodActor* actor, EVENT event) { - auto actor = &bloodActors[pSprite->index]; - + auto pSprite = &actor->s(); + auto pXSprite = &actor->x(); switch (event.cmd) { case kCmdSpritePush: { @@ -275,11 +275,11 @@ void LifeLeechOperate(spritetype *pSprite, XSPRITE *pXSprite, EVENT event) void ActivateGenerator(int); -void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event) +void OperateSprite(DBloodActor* actor, EVENT event) { - auto actor = &bloodActors[nSprite]; - spritetype *pSprite = &sprite[nSprite]; - + auto pSprite = &actor->s(); + auto pXSprite = &actor->x(); + #ifdef NOONE_EXTENSIONS if (gModernMap && modernTypeOperateSprite(actor, event)) return; @@ -540,7 +540,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event) } break; case kThingDroppedLifeLeech: - LifeLeechOperate(pSprite, pXSprite, event); + LifeLeechOperate(actor, event); break; case kGenTrigger: case kGenDripWater: @@ -556,7 +556,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event) SetSpriteState(actor, 0); break; case kCmdRepeat: - if (pSprite->type != kGenTrigger) ActivateGenerator(nSprite); + if (pSprite->type != kGenTrigger) ActivateGenerator(pSprite->index); if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->busyTime > 0) { int nRand = Random2(pXSprite->data1); @@ -984,10 +984,10 @@ void ZTranslateSector(int nSector, XSECTOR *pXSector, int a3, int a4) } } -int GetHighestSprite(int nSector, int nStatus, int *a3) +DBloodActor* GetHighestSprite(int nSector, int nStatus, int *z) { - *a3 = sector[nSector].floorz; - int v8 = -1; + *z = sector[nSector].floorz; + DBloodActor* found = nullptr; BloodSectIterator it(nSector); while (auto actor = it.Next()) @@ -997,14 +997,14 @@ int GetHighestSprite(int nSector, int nStatus, int *a3) { int top, bottom; GetSpriteExtents(pSprite, &top, &bottom); - if (top-pSprite->z > *a3) + if (top-pSprite->z > *z) { - *a3 = top-pSprite->z; - v8 = pSprite->index; + *z = top-pSprite->z; + found = actor; } } } - return v8; + return found; } int GetCrushedSpriteExtents(unsigned int nSector, int *pzTop, int *pzBot) @@ -1022,7 +1022,7 @@ int GetCrushedSpriteExtents(unsigned int nSector, int *pzTop, int *pzBot) if (pSprite->statnum == kStatDude || pSprite->statnum == kStatThing) { int top, bottom; - GetSpriteExtents(pSprite, &top, &bottom); + GetActorExtents(actor, &top, &bottom); if (vbp > top) { vbp = top; @@ -1055,7 +1055,7 @@ int VCrushBusy(unsigned int nSector, unsigned int a2) if (dz2 != 0) v10 += MulScale(dz2, GetWaveValue(a2, nWave), 16); int v18; - if (GetHighestSprite(nSector, 6, &v18) >= 0 && vc >= v18) + if (GetHighestSprite(nSector, 6, &v18) && vc >= v18) return 1; viewInterpolateSector(nSector, §or[nSector]); if (dz1 != 0) @@ -1413,9 +1413,8 @@ bool SectorContainsDudes(int nSector) return 0; } -void TeleFrag(int nKiller, int nSector) +void TeleFrag(DBloodActor* killer, int nSector) { - auto killer = &bloodActors[nKiller]; BloodSectIterator it(nSector); while (auto victim = it.Next()) { @@ -1451,7 +1450,7 @@ void OperateTeleport(unsigned int nSector, XSECTOR *pXSector) if (bPlayer || !SectorContainsDudes(pDest->sectnum)) { if (!(gGameOptions.uNetGameFlags&2)) - TeleFrag(pXSector->data, pDest->sectnum); + TeleFrag(&bloodActors[pXSector->data], pDest->sectnum); pSprite->x = pDest->x; pSprite->y = pDest->y; pSprite->z += sector[pDest->sectnum].floorz-sector[nSector].floorz; @@ -1499,7 +1498,7 @@ void OperatePath(unsigned int nSector, XSECTOR *pXSector, EVENT event) // trigger marker after it gets reached #ifdef NOONE_EXTENSIONS if (gModernMap && pXSprite2->state != 1) - trTriggerSprite(pSprite2->index, pXSprite2, kCmdOn); + trTriggerSprite(pXSector->marker0, kCmdOn); #endif if (actor == nullptr) { @@ -1683,9 +1682,10 @@ void LinkSector(int nSector, XSECTOR *pXSector, EVENT event) } } -void LinkSprite(int nSprite, XSPRITE *pXSprite, EVENT event) { - auto actor = &bloodActors[nSprite]; - spritetype *pSprite = &sprite[nSprite]; +void LinkSprite(DBloodActor* actor, EVENT event) +{ + spritetype *pSprite = &actor->s(); + auto pXSprite = &actor->x(); int nBusy = GetSourceBusy(event); switch (pSprite->type) { @@ -1759,29 +1759,27 @@ void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command) { } } -void trTriggerSprite(unsigned int nSprite, XSPRITE *pXSprite, int command) { +void trTriggerSprite(DBloodActor* actor, int command) +{ + auto pXSprite = &actor->x(); + if (!pXSprite->locked && !pXSprite->isTriggered) { if (pXSprite->triggerOnce) pXSprite->isTriggered = 1; if (pXSprite->Decoupled && pXSprite->txID > 0) - evSendActor(&bloodActors[nSprite], pXSprite->txID, (COMMAND_ID)pXSprite->command); + evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); else { EVENT event; event.cmd = command; - OperateSprite(nSprite, pXSprite, event); + OperateSprite(actor, event); } } } -void trTriggerSprite(DBloodActor* actor, int command) { - trTriggerSprite(actor->s().index, &actor->x(), command); -} - - void trMessageSector(unsigned int nSector, EVENT event) { assert(nSector < (unsigned int)numsectors); assert(sector[nSector].extra > 0 && sector[nSector].extra < kMaxXSectors); @@ -1834,7 +1832,7 @@ void trMessageSprite(unsigned int nSprite, EVENT event) { if (!pXSprite->locked || event.cmd == kCmdUnlock || event.cmd == kCmdToggleLock) { switch (event.cmd) { case kCmdLink: - LinkSprite(nSprite, pXSprite, event); + LinkSprite(actor, event); break; #ifdef NOONE_EXTENSIONS case kCmdModernUse: @@ -1842,7 +1840,7 @@ void trMessageSprite(unsigned int nSprite, EVENT event) { break; #endif default: - OperateSprite(nSprite, pXSprite, event); + OperateSprite(actor, event); break; } } diff --git a/source/games/blood/src/triggers.h b/source/games/blood/src/triggers.h index b199a3acc..d82efccc9 100644 --- a/source/games/blood/src/triggers.h +++ b/source/games/blood/src/triggers.h @@ -57,7 +57,6 @@ void trTriggerSector(unsigned int nSector, XSECTOR *pXSector, int command); void trMessageSector(unsigned int nSector, EVENT event); void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command); void trMessageWall(unsigned int nWall, EVENT event); -void trTriggerSprite(unsigned int nSprite, XSPRITE *pXSprite, int command); void trTriggerSprite(DBloodActor* actor, int command); void trMessageSprite(unsigned int nSprite, EVENT event); void trProcessBusy(void); @@ -66,7 +65,7 @@ void trTextOver(int nId); bool SetSpriteState(DBloodActor* actor, int nState); bool SetWallState(int nWall, XWALL* pXWall, int nState); bool SetSectorState(int nSector, XSECTOR* pXSector, int nState); -void TeleFrag(int nKiller, int nSector); +void TeleFrag(DBloodActor* killer, int nSector); void SectorStartSound(int nSector, int nState); void SectorEndSound(int nSector, int nState);