- handle a few pSprite assignments which are not &actor->s().

This commit is contained in:
Christoph Oelckers 2021-12-23 00:30:56 +01:00
parent 91214b5350
commit d8134c3fe8
2 changed files with 52 additions and 53 deletions

View file

@ -2598,7 +2598,6 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
break;
case OBJ_SPRITE:
{
spritetype* pSprite = &targetactor->s();
XSPRITE* pXSprite = &targetactor->x();
bool thing2debris = false;
int old = -1;
@ -2606,25 +2605,25 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
// data3 = set sprite hitag
if (valueIsBetween(pXSource->data3, -1, 32767))
{
old = pSprite->flags;
old = targetactor->spr.flags;
// set new hitag
if ((pSource->flags & kModernTypeFlag1)) pSprite->flags = pSource->flags |= pXSource->data3; // relative
else pSprite->flags = pXSource->data3; // absolute
if ((pSource->flags & kModernTypeFlag1)) targetactor->spr.flags = pSource->flags |= pXSource->data3; // relative
else targetactor->spr.flags = pXSource->data3; // absolute
// and handle exceptions
if ((old & kHitagFree) && !(pSprite->flags & kHitagFree)) pSprite->flags |= kHitagFree;
if ((old & kHitagRespawn) && !(pSprite->flags & kHitagRespawn)) pSprite->flags |= kHitagRespawn;
if ((old & kHitagFree) && !(targetactor->spr.flags & kHitagFree)) targetactor->spr.flags |= kHitagFree;
if ((old & kHitagRespawn) && !(targetactor->spr.flags & kHitagRespawn)) targetactor->spr.flags |= kHitagRespawn;
// prepare things for different (debris) physics.
if (pSprite->statnum == kStatThing && debrisGetFreeIndex() >= 0) thing2debris = true;
if (targetactor->spr.statnum == kStatThing && debrisGetFreeIndex() >= 0) thing2debris = true;
}
// data2 = sprite physics settings
if (valueIsBetween(pXSource->data2, -1, 32767) || thing2debris)
{
switch (pSprite->statnum)
switch (targetactor->spr.statnum)
{
case kStatDude: // dudes already treating in game
case kStatFree:
@ -2639,13 +2638,13 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
if (thing2debris)
{
// converting thing to debris
if ((pSprite->flags & kPhysMove) != 0) flags |= kPhysMove;
if ((targetactor->spr.flags & kPhysMove) != 0) flags |= kPhysMove;
else flags &= ~kPhysMove;
if ((pSprite->flags & kPhysGravity) != 0) flags |= (kPhysGravity | kPhysFalling);
if ((targetactor->spr.flags & kPhysGravity) != 0) flags |= (kPhysGravity | kPhysFalling);
else flags &= ~(kPhysGravity | kPhysFalling);
pSprite->flags &= ~(kPhysMove | kPhysGravity | kPhysFalling);
targetactor->spr.flags &= ~(kPhysMove | kPhysGravity | kPhysFalling);
targetactor->xvel = targetactor->yvel = targetactor->zvel = 0;
pXSprite->restState = pXSprite->state;
@ -2774,14 +2773,14 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
pXSprite->physAttr = flags; // update physics attributes
// allow things to became debris, so they use different physics...
if (pSprite->statnum == kStatThing) ChangeActorStat(targetactor, 0);
if (targetactor->spr.statnum == kStatThing) ChangeActorStat(targetactor, 0);
// set random goal ang for swimming so they start turning
if ((flags & kPhysDebrisSwim) && !targetactor->xvel && !targetactor->yvel && !targetactor->zvel)
pXSprite->goalAng = (pSprite->ang + Random3(kAng45)) & 2047;
pXSprite->goalAng = (targetactor->spr.ang + Random3(kAng45)) & 2047;
if (pXSprite->physAttr & kPhysDebrisVector)
pSprite->cstat |= CSTAT_SPRITE_BLOCK_HITSCAN;
targetactor->spr.cstat |= CSTAT_SPRITE_BLOCK_HITSCAN;
gPhysSpritesList[nIndex] = targetactor;
if (nIndex >= gPhysSpritesCount) gPhysSpritesCount++;
@ -2796,7 +2795,7 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
pXSprite->physAttr = flags;
targetactor->xvel = targetactor->yvel = targetactor->zvel = 0;
if (pSprite->lotag >= kThingBase && pSprite->lotag < kThingMax)
if (targetactor->spr.lotag >= kThingBase && targetactor->spr.lotag < kThingMax)
ChangeActorStat(targetactor, kStatThing); // if it was a thing - restore statnum
}
break;
@ -2806,27 +2805,27 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
// data4 = sprite cstat
if (valueIsBetween(pXSource->data4, -1, 65535))
{
auto old = pSprite->cstat;
auto old = targetactor->spr.cstat;
// set new cstat
if ((pSource->flags & kModernTypeFlag1)) pSprite->cstat |= ESpriteFlags::FromInt(pXSource->data4); // relative
else pSprite->cstat = ESpriteFlags::FromInt(pXSource->data4 & 0xffff); // absolute
if ((pSource->flags & kModernTypeFlag1)) targetactor->spr.cstat |= ESpriteFlags::FromInt(pXSource->data4); // relative
else targetactor->spr.cstat = ESpriteFlags::FromInt(pXSource->data4 & 0xffff); // absolute
// and handle exceptions
if ((old & CSTAT_SPRITE_BLOOD_BIT1)) pSprite->cstat |= CSTAT_SPRITE_BLOOD_BIT1; //kSpritePushable
if ((old & CSTAT_SPRITE_YCENTER)) pSprite->cstat |= CSTAT_SPRITE_YCENTER;
if ((old & CSTAT_SPRITE_BLOOD_BIT1)) targetactor->spr.cstat |= CSTAT_SPRITE_BLOOD_BIT1; //kSpritePushable
if ((old & CSTAT_SPRITE_YCENTER)) targetactor->spr.cstat |= CSTAT_SPRITE_YCENTER;
pSprite->cstat |= (old & CSTAT_SPRITE_MOVE_MASK);
targetactor->spr.cstat |= (old & CSTAT_SPRITE_MOVE_MASK);
#if 0
// looks very broken.
if (old & 0x6000)
{
if (!(pSprite->cstat & 0x6000))
pSprite->cstat |= 0x6000; // kSpriteMoveMask
if (!(targetactor->spr.cstat & 0x6000))
targetactor->spr.cstat |= 0x6000; // kSpriteMoveMask
if ((old & 0x0) && !(pSprite->cstat & 0x0)) pSprite->cstat |= 0x0; // kSpriteMoveNone
else if ((old & 0x2000) && !(pSprite->cstat & 0x2000)) pSprite->cstat |= 0x2000; // kSpriteMoveForward, kSpriteMoveFloor
else if ((old & 0x4000) && !(pSprite->cstat & 0x4000)) pSprite->cstat |= 0x4000; // kSpriteMoveReverse, kSpriteMoveCeiling
if ((old & 0x0) && !(targetactor->spr.cstat & 0x0)) targetactor->spr.cstat |= 0x0; // kSpriteMoveNone
else if ((old & 0x2000) && !(targetactor->spr.cstat & 0x2000)) targetactor->spr.cstat |= 0x2000; // kSpriteMoveForward, kSpriteMoveFloor
else if ((old & 0x4000) && !(targetactor->spr.cstat & 0x4000)) targetactor->spr.cstat |= 0x4000; // kSpriteMoveReverse, kSpriteMoveCeiling
}
#endif
}
@ -3573,21 +3572,20 @@ void useSeqSpawnerGen(DBloodActor* sourceactor, int objType, sectortype* pSector
}
case OBJ_SPRITE:
{
auto pSprite = &iactor->s();
if (pXSource->data2 <= 0) seqKill(iactor);
else if (pSprite->insector())
else if (iactor->spr.insector())
{
if (pXSource->data3 > 0)
{
auto spawned = InsertSprite(pSprite->sector(), kStatDecoration);
auto spawned = InsertSprite(iactor->spr.sector(), kStatDecoration);
auto pSpawned = &spawned->s();
int top, bottom; GetActorExtents(spawned, &top, &bottom);
pSpawned->pos.X = pSprite->pos.X;
pSpawned->pos.Y = pSprite->pos.Y;
pSpawned->pos.X = iactor->spr.pos.X;
pSpawned->pos.Y = iactor->spr.pos.Y;
switch (pXSource->data3)
{
default:
pSpawned->pos.Z = pSprite->pos.Z;
pSpawned->pos.Z = iactor->spr.pos.Z;
break;
case 2:
pSpawned->pos.Z = bottom;
@ -3596,11 +3594,11 @@ void useSeqSpawnerGen(DBloodActor* sourceactor, int objType, sectortype* pSector
pSpawned->pos.Z = top;
break;
case 4:
pSpawned->pos.Z = pSprite->pos.Z + tileHeight(pSprite->picnum) / 2 + tileTopOffset(pSprite->picnum);
pSpawned->pos.Z = iactor->spr.pos.Z + tileHeight(iactor->spr.picnum) / 2 + tileTopOffset(iactor->spr.picnum);
break;
case 5:
case 6:
if (!pSprite->insector()) pSpawned->pos.Z = top;
if (!iactor->spr.insector()) pSpawned->pos.Z = top;
else pSpawned->pos.Z = (pXSource->data3 == 5) ? spawned->sector()->floorz : spawned->sector()->ceilingz;
break;
}
@ -7127,7 +7125,8 @@ void playerQavSceneDraw(PLAYER* pPlayer, int a2, double a3, double a4, int a5)
if (pPlayer == NULL || pPlayer->sceneQav == -1) return;
QAVSCENE* pQavScene = &gPlayerCtrl[pPlayer->nPlayer].qavScene;
spritetype* pSprite = &pQavScene->initiator->s();
auto actor = pQavScene->initiator;
spritetype* pSprite = &actor->s();
if (pQavScene->qavResrc != NULL)
{

View file

@ -1232,8 +1232,8 @@ int RDoorBusy(sectortype* pSector, unsigned int a2)
else
nWave = pXSector->busyWaveB;
if (!pXSector->marker0) return 0;
spritetype* pSprite = &pXSector->marker0->s();
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.X, pSprite->pos.Y, 0, pSprite->pos.X, pSprite->pos.Y, pSprite->ang, pSector->type == kSectorRotate);
spritetype* pSprite1 = &pXSector->marker0->s();
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite1->pos.X, pSprite1->pos.Y, pSprite1->pos.X, pSprite1->pos.Y, 0, pSprite1->pos.X, pSprite1->pos.Y, pSprite1->ang, pSector->type == kSectorRotate);
ZTranslateSector(pSector, pXSector, a2, nWave);
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
@ -1252,19 +1252,19 @@ int StepRotateBusy(sectortype* pSector, unsigned int a2)
assert(pSector && pSector->hasX());
XSECTOR* pXSector = &pSector->xs();
if (!pXSector->marker0) return 0;
spritetype* pSprite = &pXSector->marker0->s();
spritetype* pSprite1 = &pXSector->marker0->s();
int vbp;
if (pXSector->busy < a2)
{
vbp = pXSector->data+pSprite->ang;
vbp = pXSector->data+pSprite1->ang;
int nWave = pXSector->busyWaveA;
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.X, pSprite->pos.Y, pXSector->data, pSprite->pos.X, pSprite->pos.Y, vbp, 1);
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite1->pos.X, pSprite1->pos.Y, pSprite1->pos.X, pSprite1->pos.Y, pXSector->data, pSprite1->pos.X, pSprite1->pos.Y, vbp, 1);
}
else
{
vbp = pXSector->data-pSprite->ang;
vbp = pXSector->data-pSprite1->ang;
int nWave = pXSector->busyWaveB;
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite->pos.X, pSprite->pos.Y, pSprite->pos.X, pSprite->pos.Y, vbp, pSprite->pos.X, pSprite->pos.Y, pXSector->data, 1);
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite1->pos.X, pSprite1->pos.Y, pSprite1->pos.X, pSprite1->pos.Y, vbp, pSprite1->pos.X, pSprite1->pos.Y, pXSector->data, 1);
}
pXSector->busy = a2;
if (pXSector->command == kCmdLink && pXSector->txID)
@ -1300,15 +1300,16 @@ int PathBusy(sectortype* pSector, unsigned int a2)
assert(pSector && pSector->hasX());
XSECTOR* pXSector = &pSector->xs();
if (!pXSector->basePath || !pXSector->marker0 || !pXSector->marker1) return 0;
spritetype* pSprite = &pXSector->basePath->s();
spritetype* pSprite1 = &pXSector->marker0->s();
spritetype* pSprite2 = &pXSector->marker1->s();
auto basepath = pXSector->basePath;
auto marker0 = pXSector->marker0;
auto marker1 = pXSector->marker1;
if (!basepath || !marker0 || !marker1) return 0;
XSPRITE *pXSprite1 = &pXSector->marker0->x();
XSPRITE *pXSprite2 = &pXSector->marker1->x();
int nWave = pXSprite1->wave;
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), pSprite->pos.X, pSprite->pos.Y, pSprite1->pos.X, pSprite1->pos.Y, pSprite1->ang, pSprite2->pos.X, pSprite2->pos.Y, pSprite2->ang, 1);
TranslateSector(pSector, GetWaveValue(pXSector->busy, nWave), GetWaveValue(a2, nWave), basepath->spr.pos.X, basepath->spr.pos.Y, marker0->spr.pos.X, marker0->spr.pos.Y, marker0->spr.ang, marker1->spr.pos.X, marker1->spr.pos.Y, marker1->spr.ang, 1);
ZTranslateSector(pSector, pXSector, a2, nWave);
pXSector->busy = a2;
if ((a2&0xffff) == 0)
@ -1318,7 +1319,7 @@ int PathBusy(sectortype* pSector, unsigned int a2)
pXSector->busy = 0;
if (pXSprite1->data4)
PathSound(pSector, pXSprite1->data4);
pXSector->marker0 = pXSector->marker1;
pXSector->marker0 = marker1;
pXSector->data = pXSprite2->data1;
return 3;
}
@ -1375,10 +1376,9 @@ void TeleFrag(DBloodActor* killer, sectortype* pSector)
BloodSectIterator it(pSector);
while (auto victim = it.Next())
{
spritetype *pSprite = &victim->s();
if (pSprite->statnum == kStatDude)
if (victim->spr.statnum == kStatDude)
actDamageSprite(killer, victim, kDamageExplode, 4000);
else if (pSprite->statnum == kStatThing)
else if (victim->spr.statnum == kStatThing)
actDamageSprite(killer, victim, kDamageExplode, 4000);
}
}
@ -1439,7 +1439,7 @@ void OperatePath(sectortype* pSector, EVENT event)
assert(pSector);
auto pXSector = &pSector->xs();
if (!pXSector->marker0) return;
spritetype* pSprite2 = &pXSector->marker0->s();
spritetype* pSprite1 = &pXSector->marker0->s();
XSPRITE *pXSprite2 = &pXSector->marker0->x();
int nId = pXSprite2->data2;
@ -1469,7 +1469,7 @@ void OperatePath(sectortype* pSector, EVENT event)
}
pXSector->marker1 = actor;
pXSector->offFloorZ = pSprite2->pos.Z;
pXSector->offFloorZ = pSprite1->pos.Z;
pXSector->onFloorZ = pSprite->pos.Z;
switch (event.cmd) {
case kCmdOn: