- 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);
}
char SetSpriteState(DBloodActor* actor, int nState)
{
return SetSpriteState(actor->GetIndex(), &actor->x(), nState);
}
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)
{
switch (event.cmd)
@ -5478,11 +5480,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd)
{
case kCmdOff:
if (pXSprite->state) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state) SetSpriteState(actor, 0);
break;
case kCmdOn:
if (!pXSprite->state) SetSpriteState(nSprite, pXSprite, 1);
if (!IsDudeSprite(pSprite) || IsPlayerSprite(pSprite) || pXSprite->health <= 0) break;
if (!pXSprite->state) SetSpriteState(actor, 1);
if (!actor->IsDudeActor() || actor->IsPlayerActor() || pXSprite->health <= 0) break;
else if (pXSprite->aiState->stateType >= kAiStatePatrolBase && pXSprite->aiState->stateType < kAiStatePatrolMax)
break;
@ -5519,7 +5521,7 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
// let's allow only specific commands here to avoid this.
if (pSprite->inittype < kDudeBase || pSprite->inittype >= kDudeMax) return false;
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;
case kModernCondition:
@ -5560,11 +5562,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd)
{
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
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)
evPostActor(actor, pXSprite->busyTime, kCmdRepeat);
break;
default:
if (pXSprite->state == 0) evPostActor(actor, 0, kCmdOn);
else evPostActor(actor, 0, kCmdOff);
break;
}
return true;
case kMarkerWarpDest:
if (pXSprite->txID <= 0) {
PLAYER* pPlayer = getPlayerById(pXSprite->data1);
if (pPlayer != NULL && SetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1) == 1)
useTeleportTarget(&bloodActors[nSprite], pPlayer->actor());
if (pPlayer != NULL && SetSpriteState(actor, pXSprite->state ^ 1) == 1)
useTeleportTarget(actor, pPlayer->actor());
return true;
}
[[fallthrough]];
case kModernObjPropertiesChanger:
if (pXSprite->txID <= 0) {
if (SetSpriteState(nSprite, pXSprite, pXSprite->state ^ 1) == 1)
usePropertiesChanger(&bloodActors[nSprite], -1, -1, nullptr);
if (pXSprite->txID <= 0)
{
if (SetSpriteState(actor, pXSprite->state ^ 1) == 1)
usePropertiesChanger(actor, -1, -1, nullptr);
return true;
}
[[fallthrough]];
@ -5615,11 +5620,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd)
{
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
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);
[[fallthrough]];
case kCmdRepeat:
@ -5642,11 +5647,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
{
case kCmdOff:
windGenStopWindOnSectors(actor);
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
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:
if (pXSprite->data4 == 3) aiFightActivateDudes(pXSprite->txID);
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
if (pXSprite->txID <= 0 || !aiFightGetDudesForBattle(actor))
@ -5698,18 +5703,20 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
}
pXSprite->dropMsg = uint8_t(pXSprite->data4);
return true;
case kModernObjDataAccumulator:
switch (event.cmd) {
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
// 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);
break;
}
@ -5728,11 +5735,11 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
switch (event.cmd)
{
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
useRandomItemGen(pSprite, pXSprite);
@ -5762,7 +5769,7 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
pXSprite->Proximity = 1;
break;
default:
actExplodeSprite(&bloodActors[pSprite->index]);
actExplodeSprite(actor);
break;
}
}
@ -5870,14 +5877,15 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
}
}
return true;
case kGenModernSound:
switch (event.cmd) {
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
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)
{
case kCmdOff:
if (pXSprite->state == 1) SetSpriteState(nSprite, pXSprite, 0);
if (pXSprite->state == 1) SetSpriteState(actor, 0);
break;
case kCmdOn:
evKillActor(actor); // queue overflow protect
if (pXSprite->state == 0) SetSpriteState(nSprite, pXSprite, 1);
if (pXSprite->state == 0) SetSpriteState(actor, 1);
[[fallthrough]];
case kCmdRepeat:
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);
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);
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;
}
char SetWallState(int nWall, XWALL *pXWall, int 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];
#ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(nSprite, pSprite, pXSprite, event))
if (gModernMap && modernTypeOperateSprite(actor, event))
return;
#endif

View file

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