- the rest of triggers.cpp.

This commit is contained in:
Christoph Oelckers 2021-09-05 08:27:34 +02:00
parent 9349e7bcb1
commit d2bc254e03
4 changed files with 46 additions and 47 deletions

View file

@ -298,6 +298,11 @@ class BloodLinearSpriteIterator
int index = 0; int index = 0;
public: public:
void Reset()
{
index = 0;
}
DBloodActor* Next() DBloodActor* Next()
{ {
while (index < MAXSPRITES) while (index < MAXSPRITES)

View file

@ -424,7 +424,7 @@ void evSend(DBloodActor* actor, int nIndex, int nType, int rxId, COMMAND_ID comm
{ {
XSPRITE* pXSprite = &actor->x(); XSPRITE* pXSprite = &actor->x();
if (pXSprite->rxID == rxId) if (pXSprite->rxID == rxId)
trMessageSprite(actor->s().index, event); trMessageSprite(actor, event);
} }
} }
return; return;
@ -442,7 +442,7 @@ void evSend(DBloodActor* actor, int nIndex, int nType, int rxId, COMMAND_ID comm
{ {
XSPRITE* pXSprite = &actor->x(); XSPRITE* pXSprite = &actor->x();
if (pXSprite->rxID == rxId) if (pXSprite->rxID == rxId)
trMessageSprite(actor->s().index, event); trMessageSprite(actor, event);
} }
} }
return; return;
@ -459,14 +459,14 @@ void evSend(DBloodActor* actor, int nIndex, int nType, int rxId, COMMAND_ID comm
if (playerRXRngIsFine(rxId)) if (playerRXRngIsFine(rxId))
{ {
if ((pPlayer = getPlayerById((rxId - kChannelPlayer7) + kMaxPlayers)) != nullptr) if ((pPlayer = getPlayerById((rxId - kChannelPlayer7) + kMaxPlayers)) != nullptr)
trMessageSprite(pPlayer->nSprite, event); trMessageSprite(pPlayer->actor(), event);
} }
else if (rxId == kChannelAllPlayers) else if (rxId == kChannelAllPlayers)
{ {
for (int i = 0; i < kMaxPlayers; i++) for (int i = 0; i < kMaxPlayers; i++)
{ {
if ((pPlayer = getPlayerById(i)) != nullptr) if ((pPlayer = getPlayerById(i)) != nullptr)
trMessageSprite(pPlayer->nSprite, event); trMessageSprite(pPlayer->actor(), event);
} }
return; return;
} }
@ -493,7 +493,7 @@ void evSend(DBloodActor* actor, int nIndex, int nType, int rxId, COMMAND_ID comm
{ {
XSPRITE* pXSprite = &actor->x(); XSPRITE* pXSprite = &actor->x();
if (actor->x().rxID > 0) if (actor->x().rxID > 0)
trMessageSprite(actor->s().index, event); trMessageSprite(actor, event);
} }
break; break;
} }
@ -650,7 +650,7 @@ void evProcess(unsigned int time)
trMessageWall(event.index_, event); trMessageWall(event.index_, event);
break; break;
case SS_SPRITE: case SS_SPRITE:
trMessageSprite(event.actor->s().index, event); trMessageSprite(event.actor, event);
break; break;
} }
} }

View file

@ -273,7 +273,7 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event)
actPostSprite(actor, kStatFree); actPostSprite(actor, kStatFree);
} }
void ActivateGenerator(int); void ActivateGenerator(DBloodActor*);
void OperateSprite(DBloodActor* actor, EVENT event) void OperateSprite(DBloodActor* actor, EVENT event)
{ {
@ -556,7 +556,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
SetSpriteState(actor, 0); SetSpriteState(actor, 0);
break; break;
case kCmdRepeat: case kCmdRepeat:
if (pSprite->type != kGenTrigger) ActivateGenerator(pSprite->index); if (pSprite->type != kGenTrigger) ActivateGenerator(actor);
if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
if (pXSprite->busyTime > 0) { if (pXSprite->busyTime > 0) {
int nRand = Random2(pXSprite->data1); int nRand = Random2(pXSprite->data1);
@ -1823,8 +1823,8 @@ void trMessageWall(unsigned int nWall, EVENT event) {
} }
} }
void trMessageSprite(unsigned int nSprite, EVENT event) { void trMessageSprite(DBloodActor* actor, EVENT event)
auto actor = &bloodActors[nSprite]; {
auto pSprite = &actor->s(); auto pSprite = &actor->s();
auto pXSprite = &actor->x(); auto pXSprite = &actor->x();
if (pSprite->statnum != kStatFree) { if (pSprite->statnum != kStatFree) {
@ -1993,7 +1993,7 @@ void trProcessBusy(void)
AlignSlopes(); AlignSlopes();
} }
void InitGenerator(int); void InitGenerator(DBloodActor*);
void trInit(void) void trInit(void)
{ {
@ -2099,16 +2099,17 @@ void trInit(void)
} }
} }
} }
for (int i = 0; i < kMaxSprites; i++)
it.Reset();
while (auto actor = it.Next())
{ {
int nXSprite = sprite[i].extra; auto pSprite = &actor->s();
if (sprite[i].statnum < kStatFree && nXSprite > 0) if (pSprite->statnum < kStatFree && actor->hasX())
{ {
assert(nXSprite < kMaxXSprites); auto pXSprite = &actor->x();
XSPRITE *pXSprite = &xsprite[nXSprite];
if (pXSprite->state) if (pXSprite->state)
pXSprite->busy = 65536; pXSprite->busy = 65536;
switch (sprite[i].type) { switch (pSprite->type) {
case kSwitchPadlock: case kSwitchPadlock:
pXSprite->triggerOnce = 1; pXSprite->triggerOnce = 1;
break; break;
@ -2117,9 +2118,9 @@ void trInit(void)
case kModernRandom2: case kModernRandom2:
if (!gModernMap || pXSprite->state == pXSprite->restState) break; if (!gModernMap || pXSprite->state == pXSprite->restState) break;
evPostActor(&bloodActors[i], (120 * pXSprite->busyTime) / 10, kCmdRepeat); evPostActor(actor, (120 * pXSprite->busyTime) / 10, kCmdRepeat);
if (pXSprite->waitTime > 0) if (pXSprite->waitTime > 0)
evPostActor(&bloodActors[i], (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff); evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff);
break; break;
case kModernSeqSpawner: case kModernSeqSpawner:
case kModernObjDataAccumulator: case kModernObjDataAccumulator:
@ -2127,9 +2128,9 @@ void trInit(void)
case kModernEffectSpawner: case kModernEffectSpawner:
case kModernWindGenerator: case kModernWindGenerator:
if (pXSprite->state == pXSprite->restState) break; if (pXSprite->state == pXSprite->restState) break;
evPostActor(&bloodActors[i], 0, kCmdRepeat); evPostActor(actor, 0, kCmdRepeat);
if (pXSprite->waitTime > 0) if (pXSprite->waitTime > 0)
evPostActor(&bloodActors[i], (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff); evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff);
break; break;
#endif #endif
case kGenTrigger: case kGenTrigger:
@ -2141,18 +2142,18 @@ void trInit(void)
case kGenBubbleMulti: case kGenBubbleMulti:
case kGenMissileEctoSkull: case kGenMissileEctoSkull:
case kGenSound: case kGenSound:
InitGenerator(i); InitGenerator(actor);
break; break;
case kThingArmedProxBomb: case kThingArmedProxBomb:
pXSprite->Proximity = 1; pXSprite->Proximity = 1;
break; break;
case kThingFallingRock: case kThingFallingRock:
if (pXSprite->state) sprite[i].flags |= 7; if (pXSprite->state) pSprite->flags |= 7;
else sprite[i].flags &= ~7; else pSprite->flags &= ~7;
break; break;
} }
if (pXSprite->Vector) sprite[i].cstat |= CSTAT_SPRITE_BLOCK_HITSCAN; if (pXSprite->Vector) pSprite->cstat |= CSTAT_SPRITE_BLOCK_HITSCAN;
if (pXSprite->Push) sprite[i].cstat |= 4096; if (pXSprite->Push) pSprite->cstat |= 4096;
} }
} }
@ -2178,38 +2179,31 @@ void trTextOver(int nId)
viewSetMessage(pzMessage, VanillaMode() ? 0 : 8, MESSAGE_PRIORITY_INI); // 8: gold viewSetMessage(pzMessage, VanillaMode() ? 0 : 8, MESSAGE_PRIORITY_INI); // 8: gold
} }
void InitGenerator(int nSprite) void InitGenerator(DBloodActor* actor)
{ {
assert(nSprite < kMaxSprites); spritetype *pSprite = &actor->s();
spritetype *pSprite = &sprite[nSprite]; assert(actor->hasX());
assert(pSprite->statnum != kMaxStatus); XSPRITE *pXSprite = &actor->x();
int nXSprite = pSprite->extra; switch (pSprite->type) {
assert(nXSprite > 0);
XSPRITE *pXSprite = &xsprite[nXSprite];
switch (sprite[nSprite].type) {
case kGenTrigger: case kGenTrigger:
pSprite->cstat &= ~CSTAT_SPRITE_BLOCK; pSprite->cstat &= ~CSTAT_SPRITE_BLOCK;
pSprite->cstat |= CSTAT_SPRITE_INVISIBLE; pSprite->cstat |= CSTAT_SPRITE_INVISIBLE;
break; break;
} }
if (pXSprite->state != pXSprite->restState && pXSprite->busyTime > 0) if (pXSprite->state != pXSprite->restState && pXSprite->busyTime > 0)
evPostActor(&bloodActors[nSprite], (120*(pXSprite->busyTime+Random2(pXSprite->data1)))/10, kCmdRepeat); evPostActor(actor, (120*(pXSprite->busyTime+Random2(pXSprite->data1)))/10, kCmdRepeat);
} }
void ActivateGenerator(int nSprite) void ActivateGenerator(DBloodActor* actor)
{ {
assert(nSprite < kMaxSprites); spritetype *pSprite = &actor->s();
auto actor = &bloodActors[nSprite]; assert(actor->hasX());
spritetype *pSprite = &sprite[nSprite]; XSPRITE *pXSprite = &actor->x();
assert(pSprite->statnum != kMaxStatus);
int nXSprite = pSprite->extra;
assert(nXSprite > 0);
XSPRITE *pXSprite = &xsprite[nXSprite];
switch (pSprite->type) { switch (pSprite->type) {
case kGenDripWater: case kGenDripWater:
case kGenDripBlood: { case kGenDripBlood: {
int top, bottom; int top, bottom;
GetSpriteExtents(pSprite, &top, &bottom); GetActorExtents(actor, &top, &bottom);
actSpawnThing(pSprite->sectnum, pSprite->x, pSprite->y, bottom, (pSprite->type == kGenDripWater) ? kThingDripWater : kThingDripBlood); actSpawnThing(pSprite->sectnum, pSprite->x, pSprite->y, bottom, (pSprite->type == kGenDripWater) ? kThingDripWater : kThingDripBlood);
break; break;
} }
@ -2219,7 +2213,7 @@ void ActivateGenerator(int nSprite)
case kGenMissileFireball: case kGenMissileFireball:
switch (pXSprite->data2) { switch (pXSprite->data2) {
case 0: case 0:
FireballTrapSeqCallback(3, &bloodActors[nSprite]); FireballTrapSeqCallback(3, actor);
break; break;
case 1: case 1:
seqSpawn(35, actor, nFireballTrapClient); seqSpawn(35, actor, nFireballTrapClient);
@ -2234,7 +2228,7 @@ void ActivateGenerator(int nSprite)
case kGenBubble: case kGenBubble:
case kGenBubbleMulti: { case kGenBubbleMulti: {
int top, bottom; int top, bottom;
GetSpriteExtents(pSprite, &top, &bottom); GetActorExtents(actor, &top, &bottom);
gFX.fxSpawnActor((pSprite->type == kGenBubble) ? FX_23 : FX_26, pSprite->sectnum, pSprite->x, pSprite->y, top, 0); gFX.fxSpawnActor((pSprite->type == kGenBubble) ? FX_23 : FX_26, pSprite->sectnum, pSprite->x, pSprite->y, top, 0);
break; break;
} }

View file

@ -58,7 +58,7 @@ void trMessageSector(unsigned int nSector, EVENT event);
void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command); void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command);
void trMessageWall(unsigned int nWall, EVENT event); void trMessageWall(unsigned int nWall, EVENT event);
void trTriggerSprite(DBloodActor* actor, int command); void trTriggerSprite(DBloodActor* actor, int command);
void trMessageSprite(unsigned int nSprite, EVENT event); void trMessageSprite(DBloodActor* actor, EVENT event);
void trProcessBusy(void); void trProcessBusy(void);
void trInit(void); void trInit(void);
void trTextOver(int nId); void trTextOver(int nId);