- split up evSend

# Conflicts:
#	source/games/blood/src/nnexts.cpp
This commit is contained in:
Christoph Oelckers 2021-08-27 10:46:57 +02:00
parent efc791ee00
commit f430c28f88
5 changed files with 75 additions and 51 deletions

View file

@ -601,6 +601,26 @@ void evKillSector(int sec)
evKill_(sec, OBJ_SECTOR);
}
// these have no target.
void evSendGame(int rxId, COMMAND_ID command)
{
evSend(0, 0, rxId, command);
}
void evSendActor(DBloodActor* actor, int rxId, COMMAND_ID command)
{
evSend(actor->s().index, OBJ_SPRITE, rxId, command);
}
void evSendSector(int index, int rxId, COMMAND_ID command)
{
evSend(index, OBJ_SECTOR, rxId, command);
}
void evSendWall(int index, int rxId, COMMAND_ID command)
{
evSend(index, OBJ_WALL, rxId, command);
}
//---------------------------------------------------------------------------
//

View file

@ -4165,17 +4165,18 @@ char modernTypeSetSpriteState(int nSprite, XSPRITE* pXSprite, int nState) {
}
void modernTypeSendCommand(int nSprite, int destChannel, COMMAND_ID command) {
auto actor = &bloodActors[nSprite];
switch (command) {
case kCmdLink:
evSend(nSprite, 3, destChannel, kCmdModernUse); // just send command to change properties
evSendActor(actor, destChannel, kCmdModernUse); // just send command to change properties
return;
case kCmdUnlock:
evSend(nSprite, 3, destChannel, command); // send normal command first
evSend(nSprite, 3, destChannel, kCmdModernUse); // then send command to change properties
evSendActor(actor, destChannel, command); // send normal command first
evSendActor(actor, destChannel, kCmdModernUse); // then send command to change properties
return;
default:
evSend(nSprite, 3, destChannel, kCmdModernUse); // send first command to change properties
evSend(nSprite, 3, destChannel, command); // then send normal command
evSendActor(actor, destChannel, kCmdModernUse); // send first command to change properties
evSendActor(actor, destChannel, command); // then send normal command
return;
}
}
@ -4863,12 +4864,12 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
case kMarkerDudeSpawn:
if (!gGameOptions.nMonsterSettings) return true;
else if (!(pSprite->flags & kModernTypeFlag4)) useDudeSpawn(pXSprite, pSprite);
else if (pXSprite->txID) evSend(nSprite, OBJ_SPRITE, pXSprite->txID, kCmdModernUse);
else if (pXSprite->txID) evSendActor(actor, pXSprite->txID, kCmdModernUse);
return true;
case kModernCustomDudeSpawn:
if (!gGameOptions.nMonsterSettings) return true;
else if (!(pSprite->flags & kModernTypeFlag4)) useCustomDudeSpawn(actor, actor);
else if (pXSprite->txID) evSend(nSprite, OBJ_SPRITE, pXSprite->txID, kCmdModernUse);
else if (pXSprite->txID) evSendActor(actor, pXSprite->txID, kCmdModernUse);
return true;
case kModernRandomTX: // random Event Switch takes random data field and uses it as TX ID
case kModernSequentialTX: // sequential Switch takes values from data fields starting from data1 and uses it as TX ID
@ -5265,19 +5266,19 @@ bool txIsRanged(XSPRITE* pXSource) {
}
void seqTxSendCmdAll(XSPRITE* pXSource, int nIndex, COMMAND_ID cmd, bool modernSend) {
auto actor = &bloodActors[nIndex];
bool ranged = txIsRanged(pXSource);
if (ranged) {
for (pXSource->txID = pXSource->data1; pXSource->txID <= pXSource->data4; pXSource->txID++) {
if (pXSource->txID <= 0 || pXSource->txID >= kChannelUserMax) continue;
else if (!modernSend) evSend(nIndex, 3, pXSource->txID, cmd);
else if (!modernSend) evSendActor(actor, pXSource->txID, cmd);
else modernTypeSendCommand(nIndex, pXSource->txID, cmd);
}
} else {
for (int i = 0; i <= 3; i++) {
pXSource->txID = GetDataVal(&sprite[pXSource->reference], i);
if (pXSource->txID <= 0 || pXSource->txID >= kChannelUserMax) continue;
else if (!modernSend) evSend(nIndex, 3, pXSource->txID, cmd);
else if (!modernSend) evSendActor(actor, pXSource->txID, cmd);
else modernTypeSendCommand(nIndex, pXSource->txID, cmd);
}
}
@ -5307,7 +5308,7 @@ void useRandomTx(XSPRITE* pXSource, COMMAND_ID cmd, bool setState) {
pXSource->txID = (tx > 0 && tx < kChannelUserMax) ? tx : 0;
if (setState)
SetSpriteState(pSource->index, pXSource, pXSource->state ^ 1);
//evSend(pSource->index, OBJ_SPRITE, pXSource->txID, (COMMAND_ID)pXSource->command);
//evSendActor(pSource->index, pXSource->txID, (COMMAND_ID)pXSource->command);
}
void useSequentialTx(XSPRITE* pXSource, COMMAND_ID cmd, bool setState) {
@ -5363,7 +5364,7 @@ void useSequentialTx(XSPRITE* pXSource, COMMAND_ID cmd, bool setState) {
pXSource->txID = (tx > 0 && tx < kChannelUserMax) ? tx : 0;
if (setState)
SetSpriteState(pSource->index, pXSource, pXSource->state ^ 1);
//evSend(pSource->index, OBJ_SPRITE, pXSource->txID, (COMMAND_ID)pXSource->command);
//evSendActor(pSource->index, pXSource->txID, (COMMAND_ID)pXSource->command);
}
@ -5435,7 +5436,7 @@ int useCondition(spritetype* pSource, XSPRITE* pXSource, EVENT event) {
// send command to rx bucket
if (pXSource->txID)
evSend(pSource->index, OBJ_SPRITE, pXSource->txID, (COMMAND_ID)pXSource->command);
evSendActor(&bloodActors[pSource->index], pXSource->txID, (COMMAND_ID)pXSource->command);
if (pSource->flags) {
@ -7521,7 +7522,9 @@ void aiPatrolThink(DBloodActor* actor) {
return;
}
spritetype* pMarker = &sprite[nMarker]; XSPRITE* pXMarker = &xsprite[pMarker->extra];
auto markeractor = &bloodActors[nMarker];
spritetype* pMarker = &markeractor->s();
XSPRITE* pXMarker = &markeractor->x();
const DUDEINFO_EXTRA* pExtra = &gDudeInfoExtra[pSprite->type - kDudeBase];
bool isFinal = ((!pXSprite->unused2 && pXMarker->data2 == -1) || (pXSprite->unused2 && pXMarker->data1 == -1));
bool reached = false;
@ -7564,7 +7567,7 @@ void aiPatrolThink(DBloodActor* actor) {
// send command
if (pXMarker->txID) {
evSend(nMarker, OBJ_SPRITE, pXMarker->txID, (COMMAND_ID)pXMarker->command);
evSendActor(markeractor, pXMarker->txID, (COMMAND_ID)pXMarker->command);
// copy dude flags for current dude
} else if (pXMarker->command == kCmdDudeFlagsSet) {
@ -7639,7 +7642,7 @@ void aiPatrolThink(DBloodActor* actor) {
// send command
if (pXMarker->txID) {
evSend(nMarker, OBJ_SPRITE, pXMarker->txID, (COMMAND_ID)pXMarker->command);
evSendActor(markeractor, pXMarker->txID, (COMMAND_ID)pXMarker->command);
// copy dude flags for current dude
} else if (pXMarker->command == kCmdDudeFlagsSet) {
@ -7677,11 +7680,11 @@ void aiPatrolThink(DBloodActor* actor) {
// send command at arrival
if (pXMarker->triggerOn)
evSend(nMarker, OBJ_SPRITE, pXMarker->txID, (COMMAND_ID)pXMarker->command);
evSendActor(markeractor, pXMarker->txID, (COMMAND_ID)pXMarker->command);
// send command at departure
if (pXMarker->triggerOff)
evSend(nMarker, OBJ_SPRITE, pXMarker->txID, (COMMAND_ID)pXMarker->command);
evSendActor(markeractor, pXMarker->txID, (COMMAND_ID)pXMarker->command);
// copy dude flags for current dude
} else if (pXMarker->command == kCmdDudeFlagsSet) {

View file

@ -933,7 +933,7 @@ char PickupItem(PLAYER *pPlayer, spritetype *pItem) {
pPlayer->used2[1] = -1;
team_score[pPlayer->teamId] += 10;
team_ticker[pPlayer->teamId] += 240;
evSend(0, 0, 81, kCmdOn);
evSendGame(81, kCmdOn);
sprintf(buffer, "%s captured Red Flag!", PlayerName(pPlayer->nPlayer));
sndStartSample(8001, 255, 2, 0);
viewSetMessage(buffer);
@ -970,7 +970,7 @@ char PickupItem(PLAYER *pPlayer, spritetype *pItem) {
pPlayer->used2[0] = -1;
team_score[pPlayer->teamId] += 10;
team_ticker[pPlayer->teamId] += 240;
evSend(0, 0, 80, kCmdOn);
evSendGame(80, kCmdOn);
sprintf(buffer, "%s captured Blue Flag!", PlayerName(pPlayer->nPlayer));
sndStartSample(8000, 255, 2, 0);
viewSetMessage(buffer);
@ -1866,16 +1866,16 @@ void FragPlayer(PLAYER *pPlayer, int nSprite)
if (nTeam1 == 0)
{
if (nTeam1 != nTeam2)
evSend(0, 0, 15, kCmdToggle);
evSendGame(15, kCmdToggle);
else
evSend(0, 0, 16, kCmdToggle);
evSendGame(16, kCmdToggle);
}
else
{
if (nTeam1 == nTeam2)
evSend(0, 0, 16, kCmdToggle);
evSendGame(16, kCmdToggle);
else
evSend(0, 0, 15, kCmdToggle);
evSendGame(15, kCmdToggle);
}
}
}

View file

@ -54,25 +54,26 @@ unsigned int GetWaveValue(unsigned int nPhase, int nType)
char SetSpriteState(int nSprite, XSPRITE* pXSprite, int nState)
{
auto actor = &bloodActors[nSprite];
if ((pXSprite->busy & 0xffff) == 0 && pXSprite->state == nState)
return 0;
pXSprite->busy = IntToFixed(nState);
pXSprite->state = nState;
evKillActor(&bloodActors[nSprite]);
evKillActor(actor);
if ((sprite[nSprite].flags & kHitagRespawn) != 0 && sprite[nSprite].inittype >= kDudeBase && sprite[nSprite].inittype < kDudeMax)
{
pXSprite->respawnPending = 3;
evPostActor(&bloodActors[nSprite], gGameOptions.nMonsterRespawnTime, kCallbackRespawn);
evPostActor(actor, gGameOptions.nMonsterRespawnTime, kCallbackRespawn);
return 1;
}
if (pXSprite->restState != nState && pXSprite->waitTime > 0)
evPostActor(&bloodActors[nSprite], (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff);
evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff);
if (pXSprite->txID)
{
if (pXSprite->command != kCmdLink && pXSprite->triggerOn && pXSprite->state)
evSend(nSprite, 3, pXSprite->txID, (COMMAND_ID)pXSprite->command);
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
if (pXSprite->command != kCmdLink && pXSprite->triggerOff && !pXSprite->state)
evSend(nSprite, 3, pXSprite->txID, (COMMAND_ID)pXSprite->command);
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
}
return 1;
}
@ -91,9 +92,9 @@ char SetWallState(int nWall, XWALL *pXWall, int nState)
if (pXWall->txID)
{
if (pXWall->command != kCmdLink && pXWall->triggerOn && pXWall->state)
evSend(nWall, 0, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
if (pXWall->command != kCmdLink && pXWall->triggerOff && !pXWall->state)
evSend(nWall, 0, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
}
return 1;
}
@ -108,7 +109,7 @@ char SetSectorState(int nSector, XSECTOR *pXSector, int nState)
if (nState == 1)
{
if (pXSector->command != kCmdLink && pXSector->triggerOn && pXSector->txID)
evSend(nSector, 6, pXSector->txID, (COMMAND_ID)pXSector->command);
evSendSector(nSector,pXSector->txID, (COMMAND_ID)pXSector->command);
if (pXSector->stopOn)
{
pXSector->stopOn = 0;
@ -120,7 +121,7 @@ char SetSectorState(int nSector, XSECTOR *pXSector, int nState)
else
{
if (pXSector->command != kCmdLink && pXSector->triggerOff && pXSector->txID)
evSend(nSector, 6, pXSector->txID, (COMMAND_ID)pXSector->command);
evSendSector(nSector,pXSector->txID, (COMMAND_ID)pXSector->command);
if (pXSector->stopOff)
{
pXSector->stopOn = 0;
@ -450,7 +451,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
sfxPlay3DSound(pSprite, pXSprite->data4, -1, 0);
if (pXSprite->command == kCmdLink && pXSprite->txID > 0)
evSend(nSprite, 3, pXSprite->txID, kCmdLink);
evSendActor(actor, pXSprite->txID, kCmdLink);
if (pXSprite->data1 == pXSprite->data2)
SetSpriteState(nSprite, pXSprite, 1);
@ -562,7 +563,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
break;
case kCmdRepeat:
if (pSprite->type != kGenTrigger) ActivateGenerator(nSprite);
if (pXSprite->txID) evSend(nSprite, 3, pXSprite->txID, (COMMAND_ID)pXSprite->command);
if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
if (pXSprite->busyTime > 0) {
int nRand = Random2(pXSprite->data1);
evPostActor(actor, 120*(nRand+pXSprite->busyTime) / 10, kCmdRepeat);
@ -1077,7 +1078,7 @@ int VCrushBusy(unsigned int nSector, unsigned int a2)
sector[nSector].floorz = v10;
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1130,7 +1131,7 @@ int VSpriteBusy(unsigned int nSector, unsigned int a2)
}
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1230,7 +1231,7 @@ int VDoorBusy(unsigned int nSector, unsigned int a2)
ZTranslateSector(nSector, pXSector, a2, nWave);
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1258,7 +1259,7 @@ int HDoorBusy(unsigned int nSector, unsigned int a2)
ZTranslateSector(nSector, pXSector, a2, nWave);
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1285,7 +1286,7 @@ int RDoorBusy(unsigned int nSector, unsigned int a2)
ZTranslateSector(nSector, pXSector, a2, nWave);
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1318,7 +1319,7 @@ int StepRotateBusy(unsigned int nSector, unsigned int a2)
}
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1338,7 +1339,7 @@ int GenSectorBusy(unsigned int nSector, unsigned int a2)
XSECTOR *pXSector = &xsector[nXSector];
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
evSend(nSector, 6, pXSector->txID, kCmdLink);
evSendSector(nSector,pXSector->txID, kCmdLink);
if ((a2&0xffff) == 0)
{
SetSectorState(nSector, pXSector, FixedToInt(a2));
@ -1736,7 +1737,7 @@ void trTriggerSector(unsigned int nSector, XSECTOR *pXSector, int command) {
pXSector->isTriggered = 1;
if (pXSector->decoupled && pXSector->txID > 0)
evSend(nSector, 6, pXSector->txID, (COMMAND_ID)pXSector->command);
evSendSector(nSector,pXSector->txID, (COMMAND_ID)pXSector->command);
else {
EVENT event;
@ -1755,7 +1756,7 @@ void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command) {
pXWall->isTriggered = 1;
if (pXWall->decoupled && pXWall->txID > 0)
evSend(nWall, 0, pXWall->txID, (COMMAND_ID)pXWall->command);
evSendWall(nWall, pXWall->txID, (COMMAND_ID)pXWall->command);
else {
EVENT event;
@ -1773,7 +1774,7 @@ void trTriggerSprite(unsigned int nSprite, XSPRITE *pXSprite, int command) {
pXSprite->isTriggered = 1;
if (pXSprite->Decoupled && pXSprite->txID > 0)
evSend(nSprite, 3, pXSprite->txID, (COMMAND_ID)pXSprite->command);
evSendActor(&bloodActors[nSprite], pXSprite->txID, (COMMAND_ID)pXSprite->command);
else {
EVENT event;
@ -2170,17 +2171,17 @@ void trInit(void)
}
}
evSend(0, 0, kChannelLevelStart, kCmdOn);
evSendGame(kChannelLevelStart, kCmdOn);
switch (gGameOptions.nGameType) {
case 1:
evSend(0, 0, kChannelLevelStartCoop, kCmdOn);
evSendGame(kChannelLevelStartCoop, kCmdOn);
break;
case 2:
evSend(0, 0, kChannelLevelStartMatch, kCmdOn);
evSendGame(kChannelLevelStartMatch, kCmdOn);
break;
case 3:
evSend(0, 0, kChannelLevelStartMatch, kCmdOn);
evSend(0, 0, kChannelLevelStartTeamsOnly, kCmdOn);
evSendGame(kChannelLevelStartMatch, kCmdOn);
evSendGame(kChannelLevelStartTeamsOnly, kCmdOn);
break;
}
}

View file

@ -1192,7 +1192,7 @@ void DropRemote(int, PLAYER *pPlayer)
void FireRemote(int, PLAYER *pPlayer)
{
evSend(0, 0, 90+(pPlayer->pSprite->type-kDudePlayer1), kCmdOn);
evSendGame(90+(pPlayer->pSprite->type-kDudePlayer1), kCmdOn);
}
enum { kMaxShotgunBarrels = 4 };