- modernTypeOperateSprite

This commit is contained in:
Christoph Oelckers 2021-09-03 01:33:57 +02:00
parent fe3da5eaab
commit a4f7fabbfa
5 changed files with 48 additions and 33 deletions

View file

@ -7461,4 +7461,12 @@ void aiSetTarget_(XSPRITE* pXSprite, int x, int y, int z)
aiSetTarget(&bloodActors[pXSprite->reference], x, y, z); aiSetTarget(&bloodActors[pXSprite->reference], x, y, z);
} }
char SetSpriteState(DBloodActor* actor, int nState)
{
return SetSpriteState(actor->GetIndex(), &actor->x(), nState);
}
END_BLD_NS END_BLD_NS

View file

@ -5426,9 +5426,11 @@ void useDudeSpawn(DBloodActor* pSource, DBloodActor* pSprite)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite, EVENT event) { bool modernTypeOperateSprite(DBloodActor* actor, EVENT event)
{
auto pSprite = &actor->s();
auto pXSprite = &actor->x();
auto actor = &bloodActors[pSprite->index];
if (event.cmd >= kCmdLock && event.cmd <= kCmdToggleLock) if (event.cmd >= kCmdLock && event.cmd <= kCmdToggleLock)
{ {
switch (event.cmd) switch (event.cmd)
@ -5478,11 +5480,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd) switch (event.cmd)
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->state) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
if (!pXSprite->state) SetSpriteState(nSprite, pXSprite, 1); if (!pXSprite->state) SetSpriteState(actor, 1);
if (!IsDudeSprite(pSprite) || IsPlayerSprite(pSprite) || pXSprite->health <= 0) break; if (!actor->IsDudeActor() || actor->IsPlayerActor() || pXSprite->health <= 0) break;
else if (pXSprite->aiState->stateType >= kAiStatePatrolBase && pXSprite->aiState->stateType < kAiStatePatrolMax) else if (pXSprite->aiState->stateType >= kAiStatePatrolBase && pXSprite->aiState->stateType < kAiStatePatrolMax)
break; break;
@ -5519,7 +5521,7 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
// let's allow only specific commands here to avoid this. // let's allow only specific commands here to avoid this.
if (pSprite->inittype < kDudeBase || pSprite->inittype >= kDudeMax) return false; if (pSprite->inittype < kDudeBase || pSprite->inittype >= kDudeMax) return false;
else if (event.cmd != kCmdToggle && event.cmd != kCmdOff && event.cmd != kCmdSpriteImpact) return true; else if (event.cmd != kCmdToggle && event.cmd != kCmdOff && event.cmd != kCmdSpriteImpact) return true;
DudeToGibCallback1(nSprite, actor); // set proper gib type just in case DATAs was changed from the outside. DudeToGibCallback1(0, actor); // set proper gib type just in case DATAs was changed from the outside.
return false; return false;
case kModernCondition: case kModernCondition:
@ -5560,11 +5562,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd) switch (event.cmd)
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
if (pXSprite->txID > 0) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->txID > 0) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
@ -5580,25 +5582,28 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
if (pXSprite->busyTime > 0) if (pXSprite->busyTime > 0)
evPostActor(actor, pXSprite->busyTime, kCmdRepeat); evPostActor(actor, pXSprite->busyTime, kCmdRepeat);
break; break;
default: default:
if (pXSprite->state == 0) evPostActor(actor, 0, kCmdOn); if (pXSprite->state == 0) evPostActor(actor, 0, kCmdOn);
else evPostActor(actor, 0, kCmdOff); else evPostActor(actor, 0, kCmdOff);
break; break;
} }
return true; return true;
case kMarkerWarpDest: case kMarkerWarpDest:
if (pXSprite->txID <= 0) { if (pXSprite->txID <= 0) {
PLAYER* pPlayer = getPlayerById(pXSprite->data1); PLAYER* pPlayer = getPlayerById(pXSprite->data1);
if (pPlayer != NULL && SetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1) == 1) if (pPlayer != NULL && SetSpriteState(actor, pXSprite->state ^ 1) == 1)
useTeleportTarget(&bloodActors[nSprite], pPlayer->actor()); useTeleportTarget(actor, pPlayer->actor());
return true; return true;
} }
[[fallthrough]]; [[fallthrough]];
case kModernObjPropertiesChanger: case kModernObjPropertiesChanger:
if (pXSprite->txID <= 0) { if (pXSprite->txID <= 0)
if (SetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1) == 1) {
usePropertiesChanger(&bloodActors[nSprite], -1, -1, nullptr); if (SetSpriteState(actor, pXSprite->state ^ 1) == 1)
usePropertiesChanger(actor, -1, -1, nullptr);
return true; return true;
} }
[[fallthrough]]; [[fallthrough]];
@ -5615,11 +5620,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd) switch (event.cmd)
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
if (pSprite->type == kModernSeqSpawner) seqSpawnerOffSameTx(pXSprite); if (pSprite->type == kModernSeqSpawner) seqSpawnerOffSameTx(pXSprite);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
@ -5642,11 +5647,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
{ {
case kCmdOff: case kCmdOff:
windGenStopWindOnSectors(actor); windGenStopWindOnSectors(actor);
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
if (pXSprite->txID > 0) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->txID > 0) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
@ -5671,11 +5676,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->data4 == 3) aiFightActivateDudes(pXSprite->txID); if (pXSprite->data4 == 3) aiFightActivateDudes(pXSprite->txID);
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
if (pXSprite->txID <= 0 || !aiFightGetDudesForBattle(actor)) if (pXSprite->txID <= 0 || !aiFightGetDudesForBattle(actor))
@ -5698,18 +5703,20 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
} }
pXSprite->dropMsg = uint8_t(pXSprite->data4); pXSprite->dropMsg = uint8_t(pXSprite->data4);
return true; return true;
case kModernObjDataAccumulator: case kModernObjDataAccumulator:
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
// force OFF after *all* TX objects reach the goal value // force OFF after *all* TX objects reach the goal value
if (pSprite->flags == kModernTypeFlag0 && incDecGoalValueIsReached(pXSprite)) { if (pSprite->flags == kModernTypeFlag0 && incDecGoalValueIsReached(pXSprite))
{
evPostActor(actor, 0, kCmdOff); evPostActor(actor, 0, kCmdOff);
break; break;
} }
@ -5728,11 +5735,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd) switch (event.cmd)
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
useRandomItemGen(pSprite, pXSprite); useRandomItemGen(pSprite, pXSprite);
@ -5762,7 +5769,7 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
pXSprite->Proximity = 1; pXSprite->Proximity = 1;
break; break;
default: default:
actExplodeSprite(&bloodActors[pSprite->index]); actExplodeSprite(actor);
break; break;
} }
} }
@ -5870,14 +5877,15 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
} }
} }
return true; return true;
case kGenModernSound: case kGenModernSound:
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
if (pXSprite->txID) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->txID) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
@ -5896,11 +5904,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd) switch (event.cmd)
{ {
case kCmdOff: case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0); if (pXSprite->state == 1) SetSpriteState(actor, 0);
break; break;
case kCmdOn: case kCmdOn:
evKillActor(actor); // queue overflow protect evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1); if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]]; [[fallthrough]];
case kCmdRepeat: case kCmdRepeat:
if (pXSprite->txID) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (pXSprite->txID) modernTypeSendCommand(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);

View file

@ -341,7 +341,7 @@ void trPlayerCtrlStopScene(PLAYER* pPlayer);
// ------------------------------------------------------------------------- // // ------------------------------------------------------------------------- //
void modernTypeTrigger(int type, int nDest, DBloodActor* actor, const EVENT& event); void modernTypeTrigger(int type, int nDest, DBloodActor* actor, const EVENT& event);
bool modernTypeOperateSector(int nSector, sectortype* pSector, XSECTOR* pXSector, const EVENT& event); bool modernTypeOperateSector(int nSector, sectortype* pSector, XSECTOR* pXSector, const EVENT& event);
bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite, EVENT event); bool modernTypeOperateSprite(DBloodActor*, EVENT event);
bool modernTypeOperateWall(int nWall, walltype* pWall, XWALL* pXWall, EVENT event); bool modernTypeOperateWall(int nWall, walltype* pWall, XWALL* pXWall, EVENT event);
void modernTypeSendCommand(DBloodActor* nSprite, int channel, COMMAND_ID command); void modernTypeSendCommand(DBloodActor* nSprite, int channel, COMMAND_ID command);
// ------------------------------------------------------------------------- // // ------------------------------------------------------------------------- //

View file

@ -78,8 +78,6 @@ char SetSpriteState(int nSprite, XSPRITE* pXSprite, int nState)
return 1; return 1;
} }
char SetWallState(int nWall, XWALL *pXWall, int nState) char SetWallState(int nWall, XWALL *pXWall, int nState)
{ {
if ((pXWall->busy&0xffff) == 0 && pXWall->state == nState) if ((pXWall->busy&0xffff) == 0 && pXWall->state == nState)
@ -285,7 +283,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
spritetype *pSprite = &sprite[nSprite]; spritetype *pSprite = &sprite[nSprite];
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(nSprite, pSprite, pXSprite, event)) if (gModernMap && modernTypeOperateSprite(actor, event))
return; return;
#endif #endif

View file

@ -64,6 +64,7 @@ void trProcessBusy(void);
void trInit(void); void trInit(void);
void trTextOver(int nId); void trTextOver(int nId);
char SetSpriteState(int nSprite, XSPRITE* pXSprite, int nState); char SetSpriteState(int nSprite, XSPRITE* pXSprite, int nState);
char SetSpriteState(DBloodActor* actor, int nState);
char SetWallState(int nWall, XWALL* pXWall, int nState); char SetWallState(int nWall, XWALL* pXWall, int nState);
char SetSectorState(int nSector, XSECTOR* pXSector, int nState); char SetSectorState(int nSector, XSECTOR* pXSector, int nState);
void TeleFrag(int nKiller, int nSector); void TeleFrag(int nKiller, int nSector);