- the big 'pXSprite = &actor->x()' replacement.

This commit is contained in:
Christoph Oelckers 2021-12-23 14:21:33 +01:00
parent 8d8e0550df
commit a291364606
5 changed files with 412 additions and 472 deletions

View file

@ -424,8 +424,7 @@ void evSend(EventObject& eob, int rxId, COMMAND_ID command)
continue; continue;
if (actor->hasX()) if (actor->hasX())
{ {
XSPRITE* pXSprite = &actor->x(); if (actor->xspr.rxID == rxId)
if (pXSprite->rxID == rxId)
trMessageSprite(actor, event); trMessageSprite(actor, event);
} }
} }
@ -441,8 +440,7 @@ void evSend(EventObject& eob, int rxId, COMMAND_ID command)
continue; continue;
if (actor->hasX()) if (actor->hasX())
{ {
XSPRITE* pXSprite = &actor->x(); if (actor->xspr.rxID == rxId)
if (pXSprite->rxID == rxId)
trMessageSprite(actor, event); trMessageSprite(actor, event);
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -680,7 +680,6 @@ void playerStart(int nPlayer, int bNewLevel)
auto actor = actSpawnSprite(pStartZone->sector, pStartZone->x, pStartZone->y, pStartZone->z, 6, 1); auto actor = actSpawnSprite(pStartZone->sector, pStartZone->x, pStartZone->y, pStartZone->z, 6, 1);
assert(actor->hasX()); assert(actor->hasX());
XSPRITE *pXSprite = &actor->x();
pPlayer->actor = actor; pPlayer->actor = actor;
DUDEINFO *pDudeInfo = &dudeInfo[kDudePlayer1 + nPlayer - kDudeBase]; DUDEINFO *pDudeInfo = &dudeInfo[kDudePlayer1 + nPlayer - kDudeBase];
pPlayer->pDudeInfo = pDudeInfo; pPlayer->pDudeInfo = pDudeInfo;
@ -698,7 +697,7 @@ void playerStart(int nPlayer, int bNewLevel)
actor->spr.type = kDudePlayer1+nPlayer; actor->spr.type = kDudePlayer1+nPlayer;
actor->spr.clipdist = pDudeInfo->clipdist; actor->spr.clipdist = pDudeInfo->clipdist;
actor->spr.flags = 15; actor->spr.flags = 15;
pXSprite->burnTime = 0; actor->xspr.burnTime = 0;
actor->SetBurnSource(nullptr); actor->SetBurnSource(nullptr);
pPlayer->actor->xspr.health = pDudeInfo->startHealth<<4; pPlayer->actor->xspr.health = pDudeInfo->startHealth<<4;
pPlayer->actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE; pPlayer->actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE;
@ -1175,9 +1174,8 @@ void PickUp(PLAYER *pPlayer, DBloodActor* actor)
int customMsg = -1; int customMsg = -1;
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
if (gModernMap && actor->hasX()) { // allow custom INI message instead "Picked up" if (gModernMap && actor->hasX()) { // allow custom INI message instead "Picked up"
XSPRITE* pXSprite = &actor->x(); if (actor->xspr.txID != 3 && actor->xspr.lockMsg > 0)
if (pXSprite != NULL && pXSprite->txID != 3 && pXSprite->lockMsg > 0) customMsg = actor->xspr.lockMsg;
customMsg = pXSprite->lockMsg;
} }
#endif #endif

View file

@ -50,26 +50,25 @@ unsigned int GetWaveValue(unsigned int nPhase, int nType)
bool SetSpriteState(DBloodActor* actor, int nState) bool SetSpriteState(DBloodActor* actor, int nState)
{ {
auto pXSprite = &actor->x(); if ((actor->xspr.busy & 0xffff) == 0 && actor->xspr.state == nState)
if ((pXSprite->busy & 0xffff) == 0 && pXSprite->state == nState)
return 0; return 0;
pXSprite->busy = IntToFixed(nState); actor->xspr.busy = IntToFixed(nState);
pXSprite->state = nState; actor->xspr.state = nState;
evKillActor(actor); evKillActor(actor);
if ((actor->spr.flags & kHitagRespawn) != 0 && actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax) if ((actor->spr.flags & kHitagRespawn) != 0 && actor->spr.inittype >= kDudeBase && actor->spr.inittype < kDudeMax)
{ {
pXSprite->respawnPending = 3; actor->xspr.respawnPending = 3;
evPostActor(actor, gGameOptions.nMonsterRespawnTime, kCallbackRespawn); evPostActor(actor, gGameOptions.nMonsterRespawnTime, kCallbackRespawn);
return 1; return 1;
} }
if (pXSprite->restState != nState && pXSprite->waitTime > 0) if (actor->xspr.restState != nState && actor->xspr.waitTime > 0)
evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff); evPostActor(actor, (actor->xspr.waitTime * 120) / 10, actor->xspr.restState ? kCmdOn : kCmdOff);
if (pXSprite->txID) if (actor->xspr.txID)
{ {
if (pXSprite->command != kCmdLink && pXSprite->triggerOn && pXSprite->state) if (actor->xspr.command != kCmdLink && actor->xspr.triggerOn && actor->xspr.state)
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); evSendActor(actor, actor->xspr.txID, (COMMAND_ID)actor->xspr.command);
if (pXSprite->command != kCmdLink && pXSprite->triggerOff && !pXSprite->state) if (actor->xspr.command != kCmdLink && actor->xspr.triggerOff && !actor->xspr.state)
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); evSendActor(actor, actor->xspr.txID, (COMMAND_ID)actor->xspr.command);
} }
return 1; return 1;
} }
@ -181,18 +180,17 @@ unsigned int GetSourceBusy(EVENT& a1)
void LifeLeechOperate(DBloodActor* actor, EVENT event) void LifeLeechOperate(DBloodActor* actor, EVENT event)
{ {
auto pXSprite = &actor->x();
switch (event.cmd) { switch (event.cmd) {
case kCmdSpritePush: case kCmdSpritePush:
{ {
int nPlayer = pXSprite->data4; int nPlayer = actor->xspr.data4;
if (nPlayer >= 0 && nPlayer < kMaxPlayers && playeringame[nPlayer]) if (nPlayer >= 0 && nPlayer < kMaxPlayers && playeringame[nPlayer])
{ {
PLAYER *pPlayer = &gPlayer[nPlayer]; PLAYER *pPlayer = &gPlayer[nPlayer];
if (pPlayer->actor->xspr.health > 0) if (pPlayer->actor->xspr.health > 0)
{ {
evKillActor(actor); evKillActor(actor);
pPlayer->ammoCount[8] = ClipHigh(pPlayer->ammoCount[8]+pXSprite->data3, gAmmoInfo[8].max); pPlayer->ammoCount[8] = ClipHigh(pPlayer->ammoCount[8]+actor->xspr.data3, gAmmoInfo[8].max);
pPlayer->hasWeapon[9] = 1; pPlayer->hasWeapon[9] = 1;
if (pPlayer->curWeapon != kWeapLifeLeech) if (pPlayer->curWeapon != kWeapLifeLeech)
{ {
@ -210,7 +208,7 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event)
auto target = actor->GetTarget(); auto target = actor->GetTarget();
if (target) if (target)
{ {
if (!pXSprite->stateTimer) if (!actor->xspr.stateTimer)
{ {
if (target->spr.statnum == kStatDude && !(target->spr.flags&32) && target->hasX()) if (target->spr.statnum == kStatDude && !(target->spr.flags&32) && target->hasX())
{ {
@ -234,9 +232,9 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event)
int dy = bsin(actor->spr.ang); int dy = bsin(actor->spr.ang);
int tz = target->spr.pos.Z - (target->spr.yrepeat * pDudeInfo->aimHeight) * 4; int tz = target->spr.pos.Z - (target->spr.yrepeat * pDudeInfo->aimHeight) * 4;
int dz = DivScale(tz - top - 256, nDist, 10); int dz = DivScale(tz - top - 256, nDist, 10);
int nMissileType = kMissileLifeLeechAltNormal + (pXSprite->data3 ? 1 : 0); int nMissileType = kMissileLifeLeechAltNormal + (actor->xspr.data3 ? 1 : 0);
int t2; int t2;
if (!pXSprite->data3) if (!actor->xspr.data3)
t2 = 120 / 10; t2 = 120 / 10;
else else
t2 = (3*120) / 10; t2 = (3*120) / 10;
@ -244,9 +242,9 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event)
if (missile) if (missile)
{ {
missile->SetOwner(actor); missile->SetOwner(actor);
pXSprite->stateTimer = 1; actor->xspr.stateTimer = 1;
evPostActor(actor, t2, kCallbackLeechStateTimer); evPostActor(actor, t2, kCallbackLeechStateTimer);
pXSprite->data3 = ClipLow(pXSprite->data3-1, 0); actor->xspr.data3 = ClipLow(actor->xspr.data3-1, 0);
if (!VanillaMode()) // disable collisions so lifeleech doesn't do that weird bobbing if (!VanillaMode()) // disable collisions so lifeleech doesn't do that weird bobbing
missile->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; missile->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
} }
@ -265,8 +263,6 @@ void ActivateGenerator(DBloodActor*);
void OperateSprite(DBloodActor* actor, EVENT event) void OperateSprite(DBloodActor* actor, EVENT event)
{ {
auto pXSprite = &actor->x();
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
if (gModernMap && modernTypeOperateSprite(actor, event)) if (gModernMap && modernTypeOperateSprite(actor, event))
return; return;
@ -274,13 +270,13 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdLock: case kCmdLock:
pXSprite->locked = 1; actor->xspr.locked = 1;
return; return;
case kCmdUnlock: case kCmdUnlock:
pXSprite->locked = 0; actor->xspr.locked = 0;
return; return;
case kCmdToggleLock: case kCmdToggleLock:
pXSprite->locked = pXSprite->locked ^ 1; actor->xspr.locked = actor->xspr.locked ^ 1;
return; return;
} }
@ -291,12 +287,12 @@ void OperateSprite(DBloodActor* actor, EVENT event)
SetSpriteState(actor, 0); SetSpriteState(actor, 0);
break; break;
case kCmdSpriteProximity: case kCmdSpriteProximity:
if (pXSprite->state) break; if (actor->xspr.state) break;
[[fallthrough]]; [[fallthrough]];
case kCmdOn: case kCmdOn:
case kCmdSpritePush: case kCmdSpritePush:
case kCmdSpriteTouch: case kCmdSpriteTouch:
if (!pXSprite->state) SetSpriteState(actor, 1); if (!actor->xspr.state) SetSpriteState(actor, 1);
aiActivateDude(actor); aiActivateDude(actor);
break; break;
} }
@ -307,7 +303,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (actor->spr.type) { switch (actor->spr.type) {
case kTrapMachinegun: case kTrapMachinegun:
if (pXSprite->health <= 0) break; if (actor->xspr.health <= 0) break;
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
@ -316,8 +312,8 @@ void OperateSprite(DBloodActor* actor, EVENT event)
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
seqSpawn(38, actor, nMGunOpenClient); seqSpawn(38, actor, nMGunOpenClient);
if (pXSprite->data1 > 0) if (actor->xspr.data1 > 0)
pXSprite->data2 = pXSprite->data1; actor->xspr.data2 = actor->xspr.data1;
break; break;
} }
break; break;
@ -336,17 +332,17 @@ void OperateSprite(DBloodActor* actor, EVENT event)
case kTrapZapSwitchable: case kTrapZapSwitchable:
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
pXSprite->state = 0; actor->xspr.state = 0;
actor->spr.cstat |= CSTAT_SPRITE_INVISIBLE; actor->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK; actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK;
break; break;
case kCmdOn: case kCmdOn:
pXSprite->state = 1; actor->xspr.state = 1;
actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE; actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE;
actor->spr.cstat |= CSTAT_SPRITE_BLOCK; actor->spr.cstat |= CSTAT_SPRITE_BLOCK;
break; break;
case kCmdToggle: case kCmdToggle:
pXSprite->state ^= 1; actor->xspr.state ^= 1;
actor->spr.cstat ^= CSTAT_SPRITE_INVISIBLE; actor->spr.cstat ^= CSTAT_SPRITE_INVISIBLE;
actor->spr.cstat ^= CSTAT_SPRITE_BLOCK; actor->spr.cstat ^= CSTAT_SPRITE_BLOCK;
break; break;
@ -376,8 +372,8 @@ void OperateSprite(DBloodActor* actor, EVENT event)
seqSpawn(37, actor, -1); seqSpawn(37, actor, -1);
break; break;
default: default:
SetSpriteState(actor, pXSprite->state ^ 1); SetSpriteState(actor, actor->xspr.state ^ 1);
if (pXSprite->state) seqSpawn(37, actor, -1); if (actor->xspr.state) seqSpawn(37, actor, -1);
break; break;
} }
break; break;
@ -385,16 +381,16 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
sfxPlay3DSound(actor, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, actor->xspr.data2, 0, 0);
break; break;
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
sfxPlay3DSound(actor, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, actor->xspr.data1, 0, 0);
break; break;
default: default:
if (!SetSpriteState(actor, pXSprite->state ^ 1)) break; if (!SetSpriteState(actor, actor->xspr.state ^ 1)) break;
if (pXSprite->state) sfxPlay3DSound(actor, pXSprite->data1, 0, 0); if (actor->xspr.state) sfxPlay3DSound(actor, actor->xspr.data1, 0, 0);
else sfxPlay3DSound(actor, pXSprite->data2, 0, 0); else sfxPlay3DSound(actor, actor->xspr.data2, 0, 0);
break; break;
} }
break; break;
@ -402,58 +398,58 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
sfxPlay3DSound(actor, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, actor->xspr.data2, 0, 0);
break; break;
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
sfxPlay3DSound(actor, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, actor->xspr.data1, 0, 0);
break; break;
default: default:
if (!SetSpriteState(actor, pXSprite->restState ^ 1)) break; if (!SetSpriteState(actor, actor->xspr.restState ^ 1)) break;
if (pXSprite->state) sfxPlay3DSound(actor, pXSprite->data1, 0, 0); if (actor->xspr.state) sfxPlay3DSound(actor, actor->xspr.data1, 0, 0);
else sfxPlay3DSound(actor, pXSprite->data2, 0, 0); else sfxPlay3DSound(actor, actor->xspr.data2, 0, 0);
break; break;
} }
break; break;
case kSwitchCombo: case kSwitchCombo:
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
pXSprite->data1--; actor->xspr.data1--;
if (pXSprite->data1 < 0) if (actor->xspr.data1 < 0)
pXSprite->data1 += pXSprite->data3; actor->xspr.data1 += actor->xspr.data3;
break; break;
default: default:
pXSprite->data1++; actor->xspr.data1++;
if (pXSprite->data1 >= pXSprite->data3) if (actor->xspr.data1 >= actor->xspr.data3)
pXSprite->data1 -= pXSprite->data3; actor->xspr.data1 -= actor->xspr.data3;
break; break;
} }
sfxPlay3DSound(actor, pXSprite->data4, -1, 0); sfxPlay3DSound(actor, actor->xspr.data4, -1, 0);
if (pXSprite->command == kCmdLink && pXSprite->txID > 0) if (actor->xspr.command == kCmdLink && actor->xspr.txID > 0)
evSendActor(actor, pXSprite->txID, kCmdLink); evSendActor(actor, actor->xspr.txID, kCmdLink);
if (pXSprite->data1 == pXSprite->data2) if (actor->xspr.data1 == actor->xspr.data2)
SetSpriteState(actor, 1); SetSpriteState(actor, 1);
else else
SetSpriteState(actor, 0); SetSpriteState(actor, 0);
break; break;
case kMarkerDudeSpawn: case kMarkerDudeSpawn:
if (gGameOptions.nMonsterSettings && pXSprite->data1 >= kDudeBase && pXSprite->data1 < kDudeMax) if (gGameOptions.nMonsterSettings && actor->xspr.data1 >= kDudeBase && actor->xspr.data1 < kDudeMax)
{ {
auto spawned = actSpawnDude(actor, pXSprite->data1, -1, 0); auto spawned = actSpawnDude(actor, actor->xspr.data1, -1, 0);
if (spawned) { if (spawned) {
XSPRITE *pXSpawn = &spawned->x(); XSPRITE *pXSpawn = &spawned->x();
gKillMgr.AddNewKill(1); gKillMgr.AddNewKill(1);
switch (pXSprite->data1) { switch (actor->xspr.data1) {
case kDudeBurningInnocent: case kDudeBurningInnocent:
case kDudeBurningCultist: case kDudeBurningCultist:
case kDudeBurningZombieButcher: case kDudeBurningZombieButcher:
case kDudeBurningTinyCaleb: case kDudeBurningTinyCaleb:
case kDudeBurningBeast: { case kDudeBurningBeast: {
pXSpawn->health = getDudeInfo(pXSprite->data1)->startHealth << 4; pXSpawn->health = getDudeInfo(actor->xspr.data1)->startHealth << 4;
pXSpawn->burnTime = 10; pXSpawn->burnTime = 10;
spawned->SetTarget(nullptr); spawned->SetTarget(nullptr);
aiActivateDude(spawned); aiActivateDude(spawned);
@ -466,8 +462,8 @@ void OperateSprite(DBloodActor* actor, EVENT event)
} }
break; break;
case kMarkerEarthQuake: case kMarkerEarthQuake:
pXSprite->triggerOn = 0; actor->xspr.triggerOn = 0;
pXSprite->isTriggered = 1; actor->xspr.isTriggered = 1;
SetSpriteState(actor, 1); SetSpriteState(actor, 1);
for (int p = connecthead; p >= 0; p = connectpoint2[p]) { for (int p = connecthead; p >= 0; p = connectpoint2[p]) {
auto vec = actor->spr.pos - gPlayer[p].actor->spr.pos; auto vec = actor->spr.pos - gPlayer[p].actor->spr.pos;
@ -475,7 +471,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
int dy = (vec.Y)>>4; int dy = (vec.Y)>>4;
int dz = (vec.Z)>>8; int dz = (vec.Z)>>8;
int nDist = dx*dx+dy*dy+dz*dz+0x40000; int nDist = dx*dx+dy*dy+dz*dz+0x40000;
gPlayer[p].quakeEffect = DivScale(pXSprite->data1, nDist, 16); gPlayer[p].quakeEffect = DivScale(actor->xspr.data1, nDist, 16);
} }
break; break;
case kThingTNTBarrel: case kThingTNTBarrel:
@ -510,14 +506,14 @@ void OperateSprite(DBloodActor* actor, EVENT event)
if (actor->spr.statnum != kStatRespawn) { if (actor->spr.statnum != kStatRespawn) {
switch (event.cmd) { switch (event.cmd) {
case kCmdSpriteProximity: case kCmdSpriteProximity:
if (pXSprite->state) break; if (actor->xspr.state) break;
sfxPlay3DSound(actor, 452, 0, 0); sfxPlay3DSound(actor, 452, 0, 0);
evPostActor(actor, 30, kCmdOff); evPostActor(actor, 30, kCmdOff);
pXSprite->state = 1; actor->xspr.state = 1;
[[fallthrough]]; [[fallthrough]];
case kCmdOn: case kCmdOn:
sfxPlay3DSound(actor, 451, 0, 0); sfxPlay3DSound(actor, 451, 0, 0);
pXSprite->Proximity = 1; actor->xspr.Proximity = 1;
break; break;
default: default:
actExplodeSprite(actor); actExplodeSprite(actor);
@ -543,14 +539,14 @@ void OperateSprite(DBloodActor* actor, EVENT event)
break; break;
case kCmdRepeat: case kCmdRepeat:
if (actor->spr.type != kGenTrigger) ActivateGenerator(actor); if (actor->spr.type != kGenTrigger) ActivateGenerator(actor);
if (pXSprite->txID) evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command); if (actor->xspr.txID) evSendActor(actor, actor->xspr.txID, (COMMAND_ID)actor->xspr.command);
if (pXSprite->busyTime > 0) { if (actor->xspr.busyTime > 0) {
int nRand = Random2(pXSprite->data1); int nRand = Random2(actor->xspr.data1);
evPostActor(actor, 120*(nRand+pXSprite->busyTime) / 10, kCmdRepeat); evPostActor(actor, 120*(nRand+actor->xspr.busyTime) / 10, kCmdRepeat);
} }
break; break;
default: default:
if (!pXSprite->state) { if (!actor->xspr.state) {
SetSpriteState(actor, 1); SetSpriteState(actor, 1);
evPostActor(actor, 0, kCmdRepeat); evPostActor(actor, 0, kCmdRepeat);
} }
@ -564,7 +560,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
break; break;
gMe->restTime = 0; gMe->restTime = 0;
} }
sndStartSample(pXSprite->data1, -1, 1, 0, CHANF_FORCE); sndStartSample(actor->xspr.data1, -1, 1, 0, CHANF_FORCE);
break; break;
case kThingObjectGib: case kThingObjectGib:
case kThingObjectExplode: case kThingObjectExplode:
@ -581,7 +577,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
actActivateGibObject(actor); actActivateGibObject(actor);
break; break;
default: default:
if (!SetSpriteState(actor, pXSprite->state ^ 1)) break; if (!SetSpriteState(actor, actor->xspr.state ^ 1)) break;
actActivateGibObject(actor); actActivateGibObject(actor);
break; break;
} }
@ -595,7 +591,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
SetSpriteState(actor, 1); SetSpriteState(actor, 1);
break; break;
default: default:
SetSpriteState(actor, pXSprite->state ^ 1); SetSpriteState(actor, actor->xspr.state ^ 1);
break; break;
} }
break; break;
@ -703,16 +699,15 @@ void SectorStartSound(sectortype* pSector, int nState)
{ {
if (actor->spr.statnum == kStatDecoration && actor->spr.type == kSoundSector && actor->hasX()) if (actor->spr.statnum == kStatDecoration && actor->spr.type == kSoundSector && actor->hasX())
{ {
XSPRITE *pXSprite = &actor->x();
if (nState) if (nState)
{ {
if (pXSprite->data3) if (actor->xspr.data3)
sfxPlay3DSound(actor, pXSprite->data3, 0, 0); sfxPlay3DSound(actor, actor->xspr.data3, 0, 0);
} }
else else
{ {
if (pXSprite->data1) if (actor->xspr.data1)
sfxPlay3DSound(actor, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, actor->xspr.data1, 0, 0);
} }
} }
} }
@ -725,16 +720,15 @@ void SectorEndSound(sectortype* pSector, int nState)
{ {
if (actor->spr.statnum == kStatDecoration && actor->spr.type == kSoundSector && actor->hasX()) if (actor->spr.statnum == kStatDecoration && actor->spr.type == kSoundSector && actor->hasX())
{ {
XSPRITE *pXSprite = &actor->x();
if (nState) if (nState)
{ {
if (pXSprite->data2) if (actor->xspr.data2)
sfxPlay3DSound(actor, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, actor->xspr.data2, 0, 0);
} }
else else
{ {
if (pXSprite->data4) if (actor->xspr.data4)
sfxPlay3DSound(actor, pXSprite->data4, 0, 0); sfxPlay3DSound(actor, actor->xspr.data4, 0, 0);
} }
} }
} }
@ -1101,14 +1095,13 @@ int VDoorBusy(sectortype* pSector, unsigned int a2)
if (actor && a2 > pXSector->busy) if (actor && a2 > pXSector->busy)
{ {
assert(actor->hasX()); assert(actor->hasX());
XSPRITE *pXSprite = &actor->x();
if (pXSector->onCeilZ > pXSector->offCeilZ || pXSector->onFloorZ < pXSector->offFloorZ) if (pXSector->onCeilZ > pXSector->offCeilZ || pXSector->onFloorZ < pXSector->offFloorZ)
{ {
if (pXSector->interruptable) if (pXSector->interruptable)
{ {
if (pXSector->Crush) if (pXSector->Crush)
{ {
if (pXSprite->health <= 0) if (actor->xspr.health <= 0)
return 2; return 2;
int nDamage; int nDamage;
if (pXSector->data == 0) if (pXSector->data == 0)
@ -1119,7 +1112,7 @@ int VDoorBusy(sectortype* pSector, unsigned int a2)
} }
a2 = ClipRange(a2-(vbp/2)*4, 0, 65536); a2 = ClipRange(a2-(vbp/2)*4, 0, 65536);
} }
else if (pXSector->Crush && pXSprite->health > 0) else if (pXSector->Crush && actor->xspr.health > 0)
{ {
int nDamage; int nDamage;
if (pXSector->data == 0) if (pXSector->data == 0)
@ -1134,14 +1127,13 @@ int VDoorBusy(sectortype* pSector, unsigned int a2)
else if (actor && a2 < pXSector->busy) else if (actor && a2 < pXSector->busy)
{ {
assert(actor->hasX()); assert(actor->hasX());
XSPRITE* pXSprite = &actor->x();
if (pXSector->offCeilZ > pXSector->onCeilZ || pXSector->offFloorZ < pXSector->onFloorZ) if (pXSector->offCeilZ > pXSector->onCeilZ || pXSector->offFloorZ < pXSector->onFloorZ)
{ {
if (pXSector->interruptable) if (pXSector->interruptable)
{ {
if (pXSector->Crush) if (pXSector->Crush)
{ {
if (pXSprite->health <= 0) if (actor->xspr.health <= 0)
return 2; return 2;
int nDamage; int nDamage;
if (pXSector->data == 0) if (pXSector->data == 0)
@ -1152,7 +1144,7 @@ int VDoorBusy(sectortype* pSector, unsigned int a2)
} }
a2 = ClipRange(a2+(vbp/2)*4, 0, 65536); a2 = ClipRange(a2+(vbp/2)*4, 0, 65536);
} }
else if (pXSector->Crush && pXSprite->health > 0) else if (pXSector->Crush && actor->xspr.health > 0)
{ {
int nDamage; int nDamage;
if (pXSector->data == 0) if (pXSector->data == 0)
@ -1417,7 +1409,6 @@ void OperateTeleport(sectortype* pSector)
void OperatePath(sectortype* pSector, EVENT event) void OperatePath(sectortype* pSector, EVENT event)
{ {
DBloodActor* actor; DBloodActor* actor;
XSPRITE *pXSprite;
assert(pSector); assert(pSector);
auto pXSector = &pSector->xs(); auto pXSector = &pSector->xs();
if (!pXSector->marker0) return; if (!pXSector->marker0) return;
@ -1430,8 +1421,7 @@ void OperatePath(sectortype* pSector, EVENT event)
{ {
if (actor->spr.type == kMarkerPath) if (actor->spr.type == kMarkerPath)
{ {
pXSprite = &actor->x(); if (actor->xspr.data1 == nId)
if (pXSprite->data1 == nId)
break; break;
} }
} }
@ -1564,7 +1554,6 @@ void OperateSector(sectortype* pSector, EVENT event)
void InitPath(sectortype* pSector, XSECTOR *pXSector) void InitPath(sectortype* pSector, XSECTOR *pXSector)
{ {
DBloodActor* actor = nullptr; DBloodActor* actor = nullptr;
XSPRITE *pXSprite;
assert(pSector); assert(pSector);
int nId = pXSector->data; int nId = pXSector->data;
@ -1573,8 +1562,7 @@ void InitPath(sectortype* pSector, XSECTOR *pXSector)
{ {
if (actor->spr.type == kMarkerPath && actor->hasX()) if (actor->spr.type == kMarkerPath && actor->hasX())
{ {
pXSprite = &actor->x(); if (actor->xspr.data1 == nId)
if (pXSprite->data1 == nId)
break; break;
} }
} }
@ -1621,7 +1609,6 @@ void LinkSector(sectortype* pSector, EVENT event)
void LinkSprite(DBloodActor* actor, EVENT event) void LinkSprite(DBloodActor* actor, EVENT event)
{ {
auto pXSprite = &actor->x();
int nBusy = GetSourceBusy(event); int nBusy = GetSourceBusy(event);
switch (actor->spr.type) { switch (actor->spr.type) {
@ -1631,8 +1618,8 @@ void LinkSprite(DBloodActor* actor, EVENT event)
{ {
auto actor2 = event.getActor(); auto actor2 = event.getActor();
pXSprite->data1 = actor2 && actor2->hasX()? actor2->xspr.data1 : 0; actor->xspr.data1 = actor2 && actor2->hasX()? actor2->xspr.data1 : 0;
if (pXSprite->data1 == pXSprite->data2) if (actor->xspr.data1 == actor->xspr.data2)
SetSpriteState(actor, 1); SetSpriteState(actor, 1);
else else
SetSpriteState(actor, 0); SetSpriteState(actor, 0);
@ -1641,8 +1628,8 @@ void LinkSprite(DBloodActor* actor, EVENT event)
break; break;
default: default:
{ {
pXSprite->busy = nBusy; actor->xspr.busy = nBusy;
if ((pXSprite->busy & 0xffff) == 0) if ((actor->xspr.busy & 0xffff) == 0)
SetSpriteState(actor, FixedToInt(nBusy)); SetSpriteState(actor, FixedToInt(nBusy));
} }
break; break;
@ -1700,15 +1687,13 @@ void trTriggerWall(walltype* pWall, int command)
void trTriggerSprite(DBloodActor* actor, int command) void trTriggerSprite(DBloodActor* actor, int command)
{ {
auto pXSprite = &actor->x(); if (!actor->xspr.locked && !actor->xspr.isTriggered) {
if (!pXSprite->locked && !pXSprite->isTriggered) { if (actor->xspr.triggerOnce)
actor->xspr.isTriggered = 1;
if (pXSprite->triggerOnce) if (actor->xspr.Decoupled && actor->xspr.txID > 0)
pXSprite->isTriggered = 1; evSendActor(actor, actor->xspr.txID, (COMMAND_ID)actor->xspr.command);
if (pXSprite->Decoupled && pXSprite->txID > 0)
evSendActor(actor, pXSprite->txID, (COMMAND_ID)pXSprite->command);
else { else {
EVENT event; EVENT event;
@ -1767,10 +1752,9 @@ void trMessageWall(walltype* pWall, EVENT& event)
void trMessageSprite(DBloodActor* actor, EVENT event) void trMessageSprite(DBloodActor* actor, EVENT event)
{ {
auto pXSprite = &actor->x();
if (actor->spr.statnum != kStatFree) { if (actor->spr.statnum != kStatFree) {
if (!pXSprite->locked || event.cmd == kCmdUnlock || event.cmd == kCmdToggleLock) if (!actor->xspr.locked || event.cmd == kCmdUnlock || event.cmd == kCmdToggleLock)
{ {
switch (event.cmd) switch (event.cmd)
{ {
@ -2036,31 +2020,30 @@ void trInit(TArray<DBloodActor*>& actors)
{ {
if (actor->spr.statnum < kStatFree && actor->hasX()) if (actor->spr.statnum < kStatFree && actor->hasX())
{ {
auto pXSprite = &actor->x(); if (actor->xspr.state)
if (pXSprite->state) actor->xspr.busy = 65536;
pXSprite->busy = 65536;
switch (actor->spr.type) { switch (actor->spr.type) {
case kSwitchPadlock: case kSwitchPadlock:
pXSprite->triggerOnce = 1; actor->xspr.triggerOnce = 1;
break; break;
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
case kModernRandom: case kModernRandom:
case kModernRandom2: case kModernRandom2:
if (!gModernMap || pXSprite->state == pXSprite->restState) break; if (!gModernMap || actor->xspr.state == actor->xspr.restState) break;
evPostActor(actor, (120 * pXSprite->busyTime) / 10, kCmdRepeat); evPostActor(actor, (120 * actor->xspr.busyTime) / 10, kCmdRepeat);
if (pXSprite->waitTime > 0) if (actor->xspr.waitTime > 0)
evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff); evPostActor(actor, (actor->xspr.waitTime * 120) / 10, actor->xspr.restState ? kCmdOn : kCmdOff);
break; break;
case kModernSeqSpawner: case kModernSeqSpawner:
case kModernObjDataAccumulator: case kModernObjDataAccumulator:
case kModernDudeTargetChanger: case kModernDudeTargetChanger:
case kModernEffectSpawner: case kModernEffectSpawner:
case kModernWindGenerator: case kModernWindGenerator:
if (pXSprite->state == pXSprite->restState) break; if (actor->xspr.state == actor->xspr.restState) break;
evPostActor(actor, 0, kCmdRepeat); evPostActor(actor, 0, kCmdRepeat);
if (pXSprite->waitTime > 0) if (actor->xspr.waitTime > 0)
evPostActor(actor, (pXSprite->waitTime * 120) / 10, pXSprite->restState ? kCmdOn : kCmdOff); evPostActor(actor, (actor->xspr.waitTime * 120) / 10, actor->xspr.restState ? kCmdOn : kCmdOff);
break; break;
#endif #endif
case kGenTrigger: case kGenTrigger:
@ -2075,15 +2058,15 @@ void trInit(TArray<DBloodActor*>& actors)
InitGenerator(actor); InitGenerator(actor);
break; break;
case kThingArmedProxBomb: case kThingArmedProxBomb:
pXSprite->Proximity = 1; actor->xspr.Proximity = 1;
break; break;
case kThingFallingRock: case kThingFallingRock:
if (pXSprite->state) actor->spr.flags |= 7; if (actor->xspr.state) actor->spr.flags |= 7;
else actor->spr.flags &= ~7; else actor->spr.flags &= ~7;
break; break;
} }
if (pXSprite->Vector) actor->spr.cstat |= CSTAT_SPRITE_BLOCK_HITSCAN; if (actor->xspr.Vector) actor->spr.cstat |= CSTAT_SPRITE_BLOCK_HITSCAN;
if (pXSprite->Push) actor->spr.cstat |= CSTAT_SPRITE_BLOOD_BIT1; if (actor->xspr.Push) actor->spr.cstat |= CSTAT_SPRITE_BLOOD_BIT1;
} }
} }
@ -2112,21 +2095,19 @@ void trTextOver(int nId)
void InitGenerator(DBloodActor* actor) void InitGenerator(DBloodActor* actor)
{ {
assert(actor->hasX()); assert(actor->hasX());
XSPRITE *pXSprite = &actor->x();
switch (actor->spr.type) { switch (actor->spr.type) {
case kGenTrigger: case kGenTrigger:
actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK; actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK;
actor->spr.cstat |= CSTAT_SPRITE_INVISIBLE; actor->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
break; break;
} }
if (pXSprite->state != pXSprite->restState && pXSprite->busyTime > 0) if (actor->xspr.state != actor->xspr.restState && actor->xspr.busyTime > 0)
evPostActor(actor, (120*(pXSprite->busyTime+Random2(pXSprite->data1)))/10, kCmdRepeat); evPostActor(actor, (120*(actor->xspr.busyTime+Random2(actor->xspr.data1)))/10, kCmdRepeat);
} }
void ActivateGenerator(DBloodActor* actor) void ActivateGenerator(DBloodActor* actor)
{ {
assert(actor->hasX()); assert(actor->hasX());
XSPRITE *pXSprite = &actor->x();
switch (actor->spr.type) { switch (actor->spr.type) {
case kGenDripWater: case kGenDripWater:
case kGenDripBlood: { case kGenDripBlood: {
@ -2136,10 +2117,10 @@ void ActivateGenerator(DBloodActor* actor)
break; break;
} }
case kGenSound: case kGenSound:
sfxPlay3DSound(actor, pXSprite->data2, -1, 0); sfxPlay3DSound(actor, actor->xspr.data2, -1, 0);
break; break;
case kGenMissileFireball: case kGenMissileFireball:
switch (pXSprite->data2) { switch (actor->xspr.data2) {
case 0: case 0:
FireballTrapSeqCallback(3, actor); FireballTrapSeqCallback(3, actor);
break; break;
@ -2174,13 +2155,12 @@ void FireballTrapSeqCallback(int, DBloodActor* actor)
void MGunFireSeqCallback(int, DBloodActor* actor) void MGunFireSeqCallback(int, DBloodActor* actor)
{ {
XSPRITE* pXSprite = &actor->x(); if (actor->xspr.data2 > 0 || actor->xspr.data1 == 0)
if (pXSprite->data2 > 0 || pXSprite->data1 == 0)
{ {
if (pXSprite->data2 > 0) if (actor->xspr.data2 > 0)
{ {
pXSprite->data2--; actor->xspr.data2--;
if (pXSprite->data2 == 0) if (actor->xspr.data2 == 0)
evPostActor(actor, 1, kCmdOff); evPostActor(actor, 1, kCmdOff);
} }
int dx = bcos(actor->spr.ang)+Random2(1000); int dx = bcos(actor->spr.ang)+Random2(1000);

View file

@ -67,11 +67,10 @@ void warpInit(TArray<DBloodActor*>& actors)
{ {
if (!actor->exists()) continue; if (!actor->exists()) continue;
if (actor->hasX()) { if (actor->hasX()) {
XSPRITE *pXSprite = &actor->x();
switch (actor->spr.type) { switch (actor->spr.type) {
case kMarkerSPStart: case kMarkerSPStart:
if (gGameOptions.nGameType < 2 && pXSprite->data1 >= 0 && pXSprite->data1 < kMaxPlayers) { if (gGameOptions.nGameType < 2 && actor->xspr.data1 >= 0 && actor->xspr.data1 < kMaxPlayers) {
ZONE *pZone = &gStartZone[pXSprite->data1]; ZONE *pZone = &gStartZone[actor->xspr.data1];
pZone->x = actor->spr.pos.X; pZone->x = actor->spr.pos.X;
pZone->y = actor->spr.pos.Y; pZone->y = actor->spr.pos.Y;
pZone->z = actor->spr.pos.Z; pZone->z = actor->spr.pos.Z;
@ -81,10 +80,10 @@ void warpInit(TArray<DBloodActor*>& actors)
DeleteSprite(actor); DeleteSprite(actor);
break; break;
case kMarkerMPStart: case kMarkerMPStart:
if (pXSprite->data1 >= 0 && pXSprite->data2 < kMaxPlayers) { if (actor->xspr.data1 >= 0 && actor->xspr.data2 < kMaxPlayers) {
if (gGameOptions.nGameType >= 2) { if (gGameOptions.nGameType >= 2) {
// default if BB or teams without data2 specified // default if BB or teams without data2 specified
ZONE* pZone = &gStartZone[pXSprite->data1]; ZONE* pZone = &gStartZone[actor->xspr.data1];
pZone->x = actor->spr.pos.X; pZone->x = actor->spr.pos.X;
pZone->y = actor->spr.pos.Y; pZone->y = actor->spr.pos.Y;
pZone->z = actor->spr.pos.Z; pZone->z = actor->spr.pos.Z;
@ -94,7 +93,7 @@ void warpInit(TArray<DBloodActor*>& actors)
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
// fill player spawn position according team of player in TEAMS mode. // fill player spawn position according team of player in TEAMS mode.
if (gModernMap && gGameOptions.nGameType == 3) { if (gModernMap && gGameOptions.nGameType == 3) {
if (pXSprite->data2 == 1) { if (actor->xspr.data2 == 1) {
pZone = &gStartZoneTeam1[team1]; pZone = &gStartZoneTeam1[team1];
pZone->x = actor->spr.pos.X; pZone->x = actor->spr.pos.X;
pZone->y = actor->spr.pos.Y; pZone->y = actor->spr.pos.Y;
@ -103,7 +102,7 @@ void warpInit(TArray<DBloodActor*>& actors)
pZone->ang = actor->spr.ang; pZone->ang = actor->spr.ang;
team1++; team1++;
} else if (pXSprite->data2 == 2) { } else if (actor->xspr.data2 == 2) {
pZone = &gStartZoneTeam2[team2]; pZone = &gStartZoneTeam2[team2];
pZone->x = actor->spr.pos.X; pZone->x = actor->spr.pos.X;
pZone->y = actor->spr.pos.Y; pZone->y = actor->spr.pos.Y;
@ -165,8 +164,7 @@ void warpInit(TArray<DBloodActor*>& actors)
auto actor = barrier_cast<DBloodActor*>(sect.upperLink); auto actor = barrier_cast<DBloodActor*>(sect.upperLink);
if (actor && actor->hasX()) if (actor && actor->hasX())
{ {
XSPRITE *pXSprite = &actor->x(); int nLink = actor->xspr.data1;
int nLink = pXSprite->data1;
for(auto& sect: sector) for(auto& sect: sector)
{ {
auto actor2 = barrier_cast<DBloodActor*>(sect.lowerLink); auto actor2 = barrier_cast<DBloodActor*>(sect.lowerLink);