- useSlopeChanger

This commit is contained in:
Christoph Oelckers 2021-11-24 01:15:11 +01:00
parent 36d66f14b5
commit b7c4e4b9fa
2 changed files with 19 additions and 24 deletions

View file

@ -3612,7 +3612,7 @@ void useSeqSpawnerGen(DBloodActor* sourceactor, int objType, sectortype* pSector
case 5: case 5:
case 6: case 6:
if (!validSectorIndex(pSprite->sectnum)) pSpawned->z = top; if (!validSectorIndex(pSprite->sectnum)) pSpawned->z = top;
else pSpawned->z = (pXSource->data3 == 5) ? sector[pSpawned->sectnum].floorz : sector[pSpawned->sectnum].ceilingz; else pSpawned->z = (pXSource->data3 == 5) ? spawned->sector()->floorz : spawned->sector()->ceilingz;
break; break;
} }
@ -4726,15 +4726,12 @@ void modernTypeTrigger(int destObjType, sectortype* destSect, walltype* destWall
spritetype* pSource = &pActor->s(); spritetype* pSource = &pActor->s();
XSPRITE* pXSource = &pActor->x(); XSPRITE* pXSource = &pActor->x();
int destObjIndex = -1;
switch (destObjType) { switch (destObjType) {
case OBJ_SECTOR: case OBJ_SECTOR:
if (!destSect || !destSect->hasX()) return; if (!destSect || !destSect->hasX()) return;
destObjIndex = sectnum(destSect);
break; break;
case OBJ_WALL: case OBJ_WALL:
if (!destWall || !destWall->hasX()) return; if (!destWall || !destWall->hasX()) return;
destObjIndex = wallnum(destWall);
break; break;
case OBJ_SPRITE: case OBJ_SPRITE:
{ {
@ -4788,7 +4785,7 @@ void modernTypeTrigger(int destObjType, sectortype* destSect, walltype* destWall
{ {
case OBJ_SPRITE: case OBJ_SPRITE:
case OBJ_SECTOR: case OBJ_SECTOR:
useSlopeChanger(pActor, destObjType, destObjIndex, destactor); useSlopeChanger(pActor, destObjType, destSect, destactor);
break; break;
} }
break; break;
@ -4814,7 +4811,7 @@ void modernTypeTrigger(int destObjType, sectortype* destSect, walltype* destWall
// creates wind on TX ID sector // creates wind on TX ID sector
case kModernWindGenerator: case kModernWindGenerator:
if (destObjType != OBJ_SECTOR || pXSource->data2 < 0) break; if (destObjType != OBJ_SECTOR || pXSource->data2 < 0) break;
useSectorWindGen(pActor, &sector[destObjIndex]); useSectorWindGen(pActor, destSect);
break; break;
// size and pan changer of sprite/wall/sector via TX ID // size and pan changer of sprite/wall/sector via TX ID
case kModernObjSizeChanger: case kModernObjSizeChanger:
@ -4831,7 +4828,7 @@ void modernTypeTrigger(int destObjType, sectortype* destSect, walltype* destWall
// change sector lighting dynamically // change sector lighting dynamically
case kModernSectorFXChanger: case kModernSectorFXChanger:
if (destObjType != OBJ_SECTOR) break; if (destObjType != OBJ_SECTOR) break;
useSectorLightChanger(pActor, &sector[destObjIndex]); useSectorLightChanger(pActor, destSect);
break; break;
// change target of dudes and make it fight // change target of dudes and make it fight
case kModernDudeTargetChanger: case kModernDudeTargetChanger:
@ -6528,7 +6525,7 @@ void sprite2sectorSlope(DBloodActor* actor, sectortype* pSector, char rel, bool
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBloodActor* objActor) void useSlopeChanger(DBloodActor* sourceactor, int objType, sectortype* pSect, DBloodActor* objActor)
{ {
auto pXSource = &sourceactor->x(); auto pXSource = &sourceactor->x();
spritetype* pSource = &sourceactor->s(); spritetype* pSource = &sourceactor->s();
@ -6541,8 +6538,6 @@ void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBlood
if (objType == OBJ_SECTOR) if (objType == OBJ_SECTOR)
{ {
sectortype* pSect = &sector[objIndex];
switch (pXSource->data1) switch (pXSource->data1)
{ {
case 2: case 2:
@ -6560,20 +6555,20 @@ void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBlood
{ {
// force closest floor aligned sprites to inherit slope of the sector's floor // force closest floor aligned sprites to inherit slope of the sector's floor
oslope = pSect->floorheinum; oslope = pSect->floorheinum;
BloodSectIterator it(objIndex); BloodSectIterator it(pSect);
while (auto iactor = it.Next()) while (auto iactor = it.Next())
{ {
auto spr = &iactor->s(); auto spr = &iactor->s();
if (!(spr->cstat & CSTAT_SPRITE_ALIGNMENT_FLOOR)) continue; if (!(spr->cstat & CSTAT_SPRITE_ALIGNMENT_FLOOR)) continue;
else if (getflorzofslope(objIndex, spr->x, spr->y) - kSlopeDist <= spr->z) else if (getflorzofslopeptr(pSect, spr->x, spr->y) - kSlopeDist <= spr->z)
{ {
sprite2sectorSlope(iactor, &sector[objIndex], 0, true); sprite2sectorSlope(iactor, pSect, 0, true);
// set new slope of floor // set new slope of floor
pSect->floorheinum = slope; pSect->floorheinum = slope;
// force sloped sprites to be on floor slope z // force sloped sprites to be on floor slope z
sprite2sectorSlope(iactor, &sector[objIndex], 0, true); sprite2sectorSlope(iactor, pSect, 0, true);
// restore old slope for next sprite // restore old slope for next sprite
pSect->floorheinum = oslope; pSect->floorheinum = oslope;
@ -6600,20 +6595,20 @@ void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBlood
else else
{ {
oslope = pSect->ceilingheinum; oslope = pSect->ceilingheinum;
BloodSectIterator it(objIndex); BloodSectIterator it(pSect);
while (auto iactor = it.Next()) while (auto iactor = it.Next())
{ {
auto spr = &iactor->s(); auto spr = &iactor->s();
if (!(spr->cstat & CSTAT_SPRITE_ALIGNMENT_FLOOR)) continue; if (!(spr->cstat & CSTAT_SPRITE_ALIGNMENT_FLOOR)) continue;
else if (getceilzofslope(objIndex, spr->x, spr->y) + kSlopeDist >= spr->z) else if (getceilzofslopeptr(pSect, spr->x, spr->y) + kSlopeDist >= spr->z)
{ {
sprite2sectorSlope(iactor, &sector[objIndex], 1, true); sprite2sectorSlope(iactor, pSect, 1, true);
// set new slope of ceiling // set new slope of ceiling
pSect->ceilingheinum = slope; pSect->ceilingheinum = slope;
// force sloped sprites to be on ceiling slope z // force sloped sprites to be on ceiling slope z
sprite2sectorSlope(iactor, &sector[objIndex], 1, true); sprite2sectorSlope(iactor, pSect, 1, true);
// restore old slope for next sprite // restore old slope for next sprite
pSect->ceilingheinum = oslope; pSect->ceilingheinum = oslope;
@ -6628,7 +6623,7 @@ void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBlood
} }
// let's give a little impulse to the physics sprites... // let's give a little impulse to the physics sprites...
BloodSectIterator it(objIndex); BloodSectIterator it(pSect);
while (auto iactor = it.Next()) while (auto iactor = it.Next())
{ {
auto spr = &iactor->s(); auto spr = &iactor->s();
@ -6660,11 +6655,11 @@ void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBlood
if (!validSectorIndex(pSpr->sectnum)) break; if (!validSectorIndex(pSpr->sectnum)) break;
switch (pXSource->data4) switch (pXSource->data4)
{ {
case 1: sprite2sectorSlope(objActor, &sector[pSpr->sectnum], 0, flag2); break; case 1: sprite2sectorSlope(objActor, pSpr->sector(), 0, flag2); break;
case 2: sprite2sectorSlope(objActor, &sector[pSpr->sectnum], 1, flag2); break; case 2: sprite2sectorSlope(objActor, pSpr->sector(), 1, flag2); break;
case 3: case 3:
if (getflorzofslope(pSpr->sectnum, pSpr->x, pSpr->y) - kSlopeDist <= pSpr->z) sprite2sectorSlope(objActor, &sector[pSpr->sectnum], 0, flag2); if (getflorzofslope(pSpr->sectnum, pSpr->x, pSpr->y) - kSlopeDist <= pSpr->z) sprite2sectorSlope(objActor, pSpr->sector(), 0, flag2);
if (getceilzofslope(pSpr->sectnum, pSpr->x, pSpr->y) + kSlopeDist >= pSpr->z) sprite2sectorSlope(objActor, &sector[pSpr->sectnum], 1, flag2); if (getceilzofslope(pSpr->sectnum, pSpr->x, pSpr->y) + kSlopeDist >= pSpr->z) sprite2sectorSlope(objActor, pSpr->sector(), 1, flag2);
break; break;
} }
break; break;

View file

@ -312,7 +312,7 @@ bool aiFightDudeIsAffected(DBloodActor* pXDude);
bool aiFightMatesHaveSameTarget(DBloodActor* leaderactor, DBloodActor* targetactor, int allow); bool aiFightMatesHaveSameTarget(DBloodActor* leaderactor, DBloodActor* targetactor, int allow);
void aiFightActivateDudes(int rx); void aiFightActivateDudes(int rx);
// ------------------------------------------------------------------------- // // ------------------------------------------------------------------------- //
void useSlopeChanger(DBloodActor* sourceactor, int objType, int objIndex, DBloodActor* objActor); void useSlopeChanger(DBloodActor* sourceactor, int objType, sectortype* pSect, DBloodActor* objActor);
void damageSprites(DBloodActor* pXSource, DBloodActor* pSprite); void damageSprites(DBloodActor* pXSource, DBloodActor* pSprite);
void useRandomItemGen(DBloodActor* pSource); void useRandomItemGen(DBloodActor* pSource);
void useUniMissileGen(DBloodActor* sourceactor, DBloodActor* actor); void useUniMissileGen(DBloodActor* sourceactor, DBloodActor* actor);