0
0
Fork 0
mirror of https://github.com/DrBeef/Raze.git synced 2025-03-05 00:41:15 +00:00

- 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
source/games/blood/src

View file

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

View file

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