- several simple functions.

Also two fixes involving trTriggerSprite.
This commit is contained in:
Christoph Oelckers 2021-09-05 08:17:05 +02:00
parent 0ae664e9ca
commit 9349e7bcb1
4 changed files with 46 additions and 50 deletions

View file

@ -466,7 +466,7 @@ void nnExtTriggerObject(int objType, int objIndex, DBloodActor* objActor, int co
break;
case OBJ_SPRITE:
if (!objActor || !objActor->hasX()) break;
trTriggerSprite(objActor->GetIndex(), &objActor->x(), command);
trTriggerSprite(objActor, command);
break;
}
@ -3076,7 +3076,7 @@ void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor)
clampSprite(actor, 0x01);
if (pSource->flags & kModernTypeFlag1) // force telefrag
TeleFrag(pSprite->index, pSource->sectnum);
TeleFrag(actor, pSource->sectnum);
if (pSprite->flags & kPhysGravity)
pSprite->flags |= kPhysFalling;

View file

@ -908,7 +908,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
if ((pPlayer->hasFlag & 1) == 0 && pXItem->state) {
pPlayer->hasFlag |= 1;
pPlayer->ctfFlagState[0] = itemactor;
trTriggerSprite(pItem->index, pXItem, kCmdOff);
trTriggerSprite(itemactor, kCmdOff);
sprintf(buffer, "%s stole Blue Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8007, 255, 2, 0);
viewSetMessage(buffer);
@ -920,7 +920,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
if ((pPlayer->hasFlag & 1) != 0 && !pXItem->state) {
pPlayer->hasFlag &= ~1;
pPlayer->ctfFlagState[0] = nullptr;
trTriggerSprite(pItem->index, pXItem, kCmdOn);
trTriggerSprite(itemactor, kCmdOn);
sprintf(buffer, "%s returned Blue Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8003, 255, 2, 0);
viewSetMessage(buffer);
@ -945,7 +945,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
if ((pPlayer->hasFlag & 2) == 0 && pXItem->state) {
pPlayer->hasFlag |= 2;
pPlayer->ctfFlagState[1] = itemactor;
trTriggerSprite(pItem->index, pXItem, kCmdOff);
trTriggerSprite(itemactor, kCmdOff);
sprintf(buffer, "%s stole Red Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8006, 255, 2, 0);
viewSetMessage(buffer);
@ -957,7 +957,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
{
pPlayer->hasFlag &= ~2;
pPlayer->ctfFlagState[1] = nullptr;
trTriggerSprite(pItem->index, pXItem, kCmdOn);
trTriggerSprite(itemactor, kCmdOn);
sprintf(buffer, "%s returned Red Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8002, 255, 2, 0);
viewSetMessage(buffer);
@ -987,7 +987,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
pPlayer->ctfFlagState[0] = nullptr;
spritetype* pOwner = &itemactor->GetOwner()->s();
XSPRITE* pXOwner = &itemactor->GetOwner()->x();
trTriggerSprite(pOwner->index, pXOwner, kCmdOn);
trTriggerSprite(itemactor->GetOwner(), kCmdOn);
sprintf(buffer, "%s returned Blue Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8003, 255, 2, 0);
viewSetMessage(buffer);
@ -1013,7 +1013,7 @@ char PickupItem(PLAYER *pPlayer, DBloodActor* itemactor)
pPlayer->ctfFlagState[1] = nullptr;
spritetype* pOwner = &itemactor->GetOwner()->s();
XSPRITE* pXOwner = &itemactor->GetOwner()->x();
trTriggerSprite(pOwner->index, pXOwner, kCmdOn);
trTriggerSprite(itemactor->GetOwner(), kCmdOn);
sprintf(buffer, "%s returned Red Flag", PlayerName(pPlayer->nPlayer));
sndStartSample(8002, 255, 2, 0);
viewSetMessage(buffer);
@ -1187,9 +1187,8 @@ void PickUp(PLAYER *pPlayer, DBloodActor* actor)
if (!pickedUp) return;
else if (actor->hasX())
{
XSPRITE *pXSprite = &actor->x();
if (pXSprite->Pickup)
trTriggerSprite(pSprite->index, pXSprite, kCmdSpritePickup);
if (actor->x().Pickup)
trTriggerSprite(actor, kCmdSpritePickup);
}
if (!actCheckRespawn(actor))
@ -1564,7 +1563,7 @@ void ProcessInput(PLAYER *pPlayer)
if (pXSprite->locked && pPlayer == gMe && pXSprite->lockMsg)
trTextOver(pXSprite->lockMsg);
if (!key || pPlayer->hasKey[key])
trTriggerSprite(act->GetIndex(), pXSprite, kCmdSpritePush);
trTriggerSprite(act, kCmdSpritePush);
else if (pPlayer == gMe)
{
viewSetMessage(GStrings("TXTB_KEY"));
@ -2064,7 +2063,7 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
gPlayer[p].fragger = nullptr;
}
FragPlayer(pPlayer, source);
trTriggerSprite(pSprite->index, pXSprite, kCmdOff);
trTriggerSprite(pActor, kCmdOff);
#ifdef NOONE_EXTENSIONS
// allow drop items and keys in multiplayer

View file

@ -191,10 +191,10 @@ unsigned int GetSourceBusy(EVENT a1)
return 0;
}
void LifeLeechOperate(spritetype *pSprite, XSPRITE *pXSprite, EVENT event)
void LifeLeechOperate(DBloodActor* actor, EVENT event)
{
auto actor = &bloodActors[pSprite->index];
auto pSprite = &actor->s();
auto pXSprite = &actor->x();
switch (event.cmd) {
case kCmdSpritePush:
{
@ -275,11 +275,11 @@ void LifeLeechOperate(spritetype *pSprite, XSPRITE *pXSprite, EVENT event)
void ActivateGenerator(int);
void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
void OperateSprite(DBloodActor* actor, EVENT event)
{
auto actor = &bloodActors[nSprite];
spritetype *pSprite = &sprite[nSprite];
auto pSprite = &actor->s();
auto pXSprite = &actor->x();
#ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(actor, event))
return;
@ -540,7 +540,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
}
break;
case kThingDroppedLifeLeech:
LifeLeechOperate(pSprite, pXSprite, event);
LifeLeechOperate(actor, event);
break;
case kGenTrigger:
case kGenDripWater:
@ -556,7 +556,7 @@ void OperateSprite(int nSprite, XSPRITE *pXSprite, EVENT event)
SetSpriteState(actor, 0);
break;
case kCmdRepeat:
if (pSprite->type != kGenTrigger) ActivateGenerator(nSprite);
if (pSprite->type != kGenTrigger) ActivateGenerator(pSprite->index);
if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
if (pXSprite->busyTime > 0) {
int nRand = Random2(pXSprite->data1);
@ -984,10 +984,10 @@ void ZTranslateSector(int nSector, XSECTOR *pXSector, int a3, int a4)
}
}
int GetHighestSprite(int nSector, int nStatus, int *a3)
DBloodActor* GetHighestSprite(int nSector, int nStatus, int *z)
{
*a3 = sector[nSector].floorz;
int v8 = -1;
*z = sector[nSector].floorz;
DBloodActor* found = nullptr;
BloodSectIterator it(nSector);
while (auto actor = it.Next())
@ -997,14 +997,14 @@ int GetHighestSprite(int nSector, int nStatus, int *a3)
{
int top, bottom;
GetSpriteExtents(pSprite, &top, &bottom);
if (top-pSprite->z > *a3)
if (top-pSprite->z > *z)
{
*a3 = top-pSprite->z;
v8 = pSprite->index;
*z = top-pSprite->z;
found = actor;
}
}
}
return v8;
return found;
}
int GetCrushedSpriteExtents(unsigned int nSector, int *pzTop, int *pzBot)
@ -1022,7 +1022,7 @@ int GetCrushedSpriteExtents(unsigned int nSector, int *pzTop, int *pzBot)
if (pSprite->statnum == kStatDude || pSprite->statnum == kStatThing)
{
int top, bottom;
GetSpriteExtents(pSprite, &top, &bottom);
GetActorExtents(actor, &top, &bottom);
if (vbp > top)
{
vbp = top;
@ -1055,7 +1055,7 @@ int VCrushBusy(unsigned int nSector, unsigned int a2)
if (dz2 != 0)
v10 += MulScale(dz2, GetWaveValue(a2, nWave), 16);
int v18;
if (GetHighestSprite(nSector, 6, &v18) >= 0 && vc >= v18)
if (GetHighestSprite(nSector, 6, &v18) && vc >= v18)
return 1;
viewInterpolateSector(nSector, &sector[nSector]);
if (dz1 != 0)
@ -1413,9 +1413,8 @@ bool SectorContainsDudes(int nSector)
return 0;
}
void TeleFrag(int nKiller, int nSector)
void TeleFrag(DBloodActor* killer, int nSector)
{
auto killer = &bloodActors[nKiller];
BloodSectIterator it(nSector);
while (auto victim = it.Next())
{
@ -1451,7 +1450,7 @@ void OperateTeleport(unsigned int nSector, XSECTOR *pXSector)
if (bPlayer || !SectorContainsDudes(pDest->sectnum))
{
if (!(gGameOptions.uNetGameFlags&2))
TeleFrag(pXSector->data, pDest->sectnum);
TeleFrag(&bloodActors[pXSector->data], pDest->sectnum);
pSprite->x = pDest->x;
pSprite->y = pDest->y;
pSprite->z += sector[pDest->sectnum].floorz-sector[nSector].floorz;
@ -1499,7 +1498,7 @@ void OperatePath(unsigned int nSector, XSECTOR *pXSector, EVENT event)
// trigger marker after it gets reached
#ifdef NOONE_EXTENSIONS
if (gModernMap && pXSprite2->state != 1)
trTriggerSprite(pSprite2->index, pXSprite2, kCmdOn);
trTriggerSprite(pXSector->marker0, kCmdOn);
#endif
if (actor == nullptr) {
@ -1683,9 +1682,10 @@ void LinkSector(int nSector, XSECTOR *pXSector, EVENT event)
}
}
void LinkSprite(int nSprite, XSPRITE *pXSprite, EVENT event) {
auto actor = &bloodActors[nSprite];
spritetype *pSprite = &sprite[nSprite];
void LinkSprite(DBloodActor* actor, EVENT event)
{
spritetype *pSprite = &actor->s();
auto pXSprite = &actor->x();
int nBusy = GetSourceBusy(event);
switch (pSprite->type) {
@ -1759,29 +1759,27 @@ void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command) {
}
}
void trTriggerSprite(unsigned int nSprite, XSPRITE *pXSprite, int command) {
void trTriggerSprite(DBloodActor* actor, int command)
{
auto pXSprite = &actor->x();
if (!pXSprite->locked && !pXSprite->isTriggered) {
if (pXSprite->triggerOnce)
pXSprite->isTriggered = 1;
if (pXSprite->Decoupled && pXSprite->txID > 0)
evSendActor(&bloodActors[nSprite], pXSprite->txID, (COMMAND_ID)pXSprite->command);
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
else {
EVENT event;
event.cmd = command;
OperateSprite(nSprite, pXSprite, event);
OperateSprite(actor, event);
}
}
}
void trTriggerSprite(DBloodActor* actor, int command) {
trTriggerSprite(actor->s().index, &actor->x(), command);
}
void trMessageSector(unsigned int nSector, EVENT event) {
assert(nSector < (unsigned int)numsectors);
assert(sector[nSector].extra > 0 && sector[nSector].extra < kMaxXSectors);
@ -1834,7 +1832,7 @@ void trMessageSprite(unsigned int nSprite, EVENT event) {
if (!pXSprite->locked || event.cmd == kCmdUnlock || event.cmd == kCmdToggleLock) {
switch (event.cmd) {
case kCmdLink:
LinkSprite(nSprite, pXSprite, event);
LinkSprite(actor, event);
break;
#ifdef NOONE_EXTENSIONS
case kCmdModernUse:
@ -1842,7 +1840,7 @@ void trMessageSprite(unsigned int nSprite, EVENT event) {
break;
#endif
default:
OperateSprite(nSprite, pXSprite, event);
OperateSprite(actor, event);
break;
}
}

View file

@ -57,7 +57,6 @@ void trTriggerSector(unsigned int nSector, XSECTOR *pXSector, int command);
void trMessageSector(unsigned int nSector, EVENT event);
void trTriggerWall(unsigned int nWall, XWALL *pXWall, int command);
void trMessageWall(unsigned int nWall, EVENT event);
void trTriggerSprite(unsigned int nSprite, XSPRITE *pXSprite, int command);
void trTriggerSprite(DBloodActor* actor, int command);
void trMessageSprite(unsigned int nSprite, EVENT event);
void trProcessBusy(void);
@ -66,7 +65,7 @@ void trTextOver(int nId);
bool SetSpriteState(DBloodActor* actor, int nState);
bool SetWallState(int nWall, XWALL* pXWall, int nState);
bool SetSectorState(int nSector, XSECTOR* pXSector, int nState);
void TeleFrag(int nKiller, int nSector);
void TeleFrag(DBloodActor* killer, int nSector);
void SectorStartSound(int nSector, int nState);
void SectorEndSound(int nSector, int nState);