mirror of
https://github.com/ZDoom/Raze.git
synced 2025-02-21 19:11:06 +00:00
- modernTypeOperateSprite
This commit is contained in:
parent
fe3da5eaab
commit
a4f7fabbfa
5 changed files with 48 additions and 33 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
// ------------------------------------------------------------------------- //
|
// ------------------------------------------------------------------------- //
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue