- upper/lower stuff in nnexts.cpp.

This commit is contained in:
Christoph Oelckers 2021-12-23 12:31:07 +01:00
parent 929fd7be99
commit b8bee4dfe5

View file

@ -1272,7 +1272,6 @@ void nnExtProcessSuperSprites()
{ {
DBloodActor* debrisactor = gPhysSpritesList[i]; DBloodActor* debrisactor = gPhysSpritesList[i];
if (debrisactor == nullptr || !debrisactor->hasX()) continue; if (debrisactor == nullptr || !debrisactor->hasX()) continue;
auto const pDebris = &debrisactor->s();
if (debrisactor->spr.statnum == kStatFree || (debrisactor->spr.flags & kHitagFree) != 0) if (debrisactor->spr.statnum == kStatFree || (debrisactor->spr.flags & kHitagFree) != 0)
{ {
@ -2819,38 +2818,40 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
pXSector->Underwater = (pXSource->data1) ? true : false; pXSector->Underwater = (pXSource->data1) ? true : false;
spritetype* pUpper = NULL; XSPRITE* pXUpper = NULL; XSPRITE* pXUpper = NULL;
auto aLower = barrier_cast<DBloodActor*>(pSector->lowerLink); auto aLower = barrier_cast<DBloodActor*>(pSector->lowerLink);
spritetype* pLower = nullptr; DBloodActor* aUpper = nullptr;
XSPRITE* pXLower = nullptr; XSPRITE* pXLower = nullptr;
if (aLower) if (aLower)
{ {
pLower = &aLower->s();
pXLower = &aLower->x(); pXLower = &aLower->x();
// must be sure we found exact same upper link // must be sure we found exact same upper link
for (auto& sec: sector) for (auto& sec: sector)
{ {
auto aUpper = barrier_cast<DBloodActor*>(sec.upperLink); aUpper = barrier_cast<DBloodActor*>(sec.upperLink);
if (aUpper == nullptr || aUpper->xspr.data1 != pXLower->data1) continue; if (aUpper == nullptr || aUpper->xspr.data1 != pXLower->data1)
pUpper = &aUpper->s(); {
aUpper = nullptr;
continue;
}
pXUpper = &aUpper->x(); pXUpper = &aUpper->x();
break; break;
} }
} }
// treat sectors that have links, so warp can detect underwater status properly // treat sectors that have links, so warp can detect underwater status properly
if (pLower) if (aLower)
{ {
if (pXSector->Underwater) if (pXSector->Underwater)
{ {
switch (pLower->type) switch (aLower->spr.type)
{ {
case kMarkerLowStack: case kMarkerLowStack:
case kMarkerLowLink: case kMarkerLowLink:
pXLower->sysData1 = pLower->type; pXLower->sysData1 = aLower->spr.type;
pLower->type = kMarkerLowWater; aLower->spr.type = kMarkerLowWater;
break; break;
default: default:
if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) pXLower->sysData1 = kMarkerLowLink; if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) pXLower->sysData1 = kMarkerLowLink;
@ -2858,21 +2859,21 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
break; break;
} }
} }
else if (pXLower->sysData1 > 0) pLower->type = pXLower->sysData1; else if (pXLower->sysData1 > 0) aLower->spr.type = pXLower->sysData1;
else if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) pLower->type = kMarkerLowLink; else if (pSector->ceilingpicnum < 4080 || pSector->ceilingpicnum > 4095) aLower->spr.type = kMarkerLowLink;
else pLower->type = kMarkerLowStack; else aLower->spr.type = kMarkerLowStack;
} }
if (pUpper) if (aUpper)
{ {
if (pXSector->Underwater) if (pXSector->Underwater)
{ {
switch (pUpper->type) switch (aUpper->spr.type)
{ {
case kMarkerUpStack: case kMarkerUpStack:
case kMarkerUpLink: case kMarkerUpLink:
pXUpper->sysData1 = pUpper->type; pXUpper->sysData1 = aUpper->spr.type;
pUpper->type = kMarkerUpWater; aUpper->spr.type = kMarkerUpWater;
break; break;
default: default:
if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) pXUpper->sysData1 = kMarkerUpLink; if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) pXUpper->sysData1 = kMarkerUpLink;
@ -2880,9 +2881,9 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
break; break;
} }
} }
else if (pXUpper->sysData1 > 0) pUpper->type = pXUpper->sysData1; else if (pXUpper->sysData1 > 0) aUpper->spr.type = pXUpper->sysData1;
else if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) pUpper->type = kMarkerUpLink; else if (pSector->floorpicnum < 4080 || pSector->floorpicnum > 4095) aUpper->spr.type = kMarkerUpLink;
else pUpper->type = kMarkerUpStack; else aUpper->spr.type = kMarkerUpStack;
} }
// search for dudes in this sector and change their underwater status // search for dudes in this sector and change their underwater status
@ -2895,16 +2896,16 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
PLAYER* pPlayer = getPlayerById(iactor->spr.type); PLAYER* pPlayer = getPlayerById(iactor->spr.type);
if (pXSector->Underwater) if (pXSector->Underwater)
{ {
if (pLower) if (aLower)
iactor->xspr.medium = (pLower->type == kMarkerUpGoo) ? kMediumGoo : kMediumWater; iactor->xspr.medium = (aLower->spr.type == kMarkerUpGoo) ? kMediumGoo : kMediumWater;
if (pPlayer) if (pPlayer)
{ {
int waterPal = kMediumWater; int waterPal = kMediumWater;
if (pLower) if (aLower)
{ {
if (pXLower->data2 > 0) waterPal = pXLower->data2; if (pXLower->data2 > 0) waterPal = pXLower->data2;
else if (pLower->type == kMarkerUpGoo) waterPal = kMediumGoo; else if (aLower->spr.type == kMarkerUpGoo) waterPal = kMediumGoo;
} }
pPlayer->nWaterPal = waterPal; pPlayer->nWaterPal = waterPal;
@ -2994,30 +2995,33 @@ void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor)
if (pXSector->Underwater) if (pXSector->Underwater)
{ {
DBloodActor* aUpper = nullptr;
auto aLink = barrier_cast<DBloodActor*>(sourceactor->spr.sector()->lowerLink); auto aLink = barrier_cast<DBloodActor*>(sourceactor->spr.sector()->lowerLink);
spritetype* pLink = nullptr;
if (aLink) if (aLink)
{ {
// must be sure we found exact same upper link // must be sure we found exact same upper link
for(auto& sec: sector) for(auto& sec: sector)
{ {
auto aUpper = barrier_cast<DBloodActor*>(sec.upperLink); aUpper = barrier_cast<DBloodActor*>(sec.upperLink);
if (aUpper == nullptr || aUpper->xspr.data1 != aLink->xspr.data1) continue; if (aUpper == nullptr || aUpper->xspr.data1 != aLink->xspr.data1)
pLink = &aLink->s(); {
aUpper = nullptr;
continue;
}
break; break;
} }
} }
if (pLink) if (aUpper)
actor->xspr.medium = (pLink->type == kMarkerUpGoo) ? kMediumGoo : kMediumWater; actor->xspr.medium = (aLink->spr.type == kMarkerUpGoo) ? kMediumGoo : kMediumWater;
if (pPlayer) if (pPlayer)
{ {
int waterPal = kMediumWater; int waterPal = kMediumWater;
if (pLink) if (aUpper)
{ {
if (aLink->xspr.data2 > 0) waterPal = aLink->xspr.data2; if (aLink->xspr.data2 > 0) waterPal = aLink->xspr.data2;
else if (pLink->type == kMarkerUpGoo) waterPal = kMediumGoo; else if (aLink->spr.type == kMarkerUpGoo) waterPal = kMediumGoo;
} }
pPlayer->nWaterPal = waterPal; pPlayer->nWaterPal = waterPal;
@ -7921,14 +7925,13 @@ void aiPatrolMove(DBloodActor* actor)
case kDudeCultistTommyProne: dudeIdx = kDudeCultistTommy - kDudeBase; break; case kDudeCultistTommyProne: dudeIdx = kDudeCultistTommy - kDudeBase; break;
} }
spritetype* pTarget = &targetactor->s();
XSPRITE* pXTarget = &targetactor->x(); XSPRITE* pXTarget = &targetactor->x();
DUDEINFO* pDudeInfo = &dudeInfo[dudeIdx]; DUDEINFO* pDudeInfo = &dudeInfo[dudeIdx];
const DUDEINFO_EXTRA* pExtra = &gDudeInfoExtra[dudeIdx]; const DUDEINFO_EXTRA* pExtra = &gDudeInfoExtra[dudeIdx];
int dx = (pTarget->pos.X - actor->spr.pos.X); int dx = (targetactor->spr.pos.X - actor->spr.pos.X);
int dy = (pTarget->pos.Y - actor->spr.pos.Y); int dy = (targetactor->spr.pos.Y - actor->spr.pos.Y);
int dz = (pTarget->pos.Z - (actor->spr.pos.Z - pDudeInfo->eyeHeight)) * 6; int dz = (targetactor->spr.pos.Z - (actor->spr.pos.Z - pDudeInfo->eyeHeight)) * 6;
int vel = (pXSprite->unused1 & kDudeFlagCrouch) ? kMaxPatrolCrouchVelocity : kMaxPatrolVelocity; int vel = (pXSprite->unused1 & kDudeFlagCrouch) ? kMaxPatrolCrouchVelocity : kMaxPatrolVelocity;
int goalAng = 341; int goalAng = 341;
@ -7972,7 +7975,6 @@ void aiPatrolMove(DBloodActor* actor)
vel = MulScale(vel, approxDist(dx, dy) << 6, 16); vel = MulScale(vel, approxDist(dx, dy) << 6, 16);
actor->xvel = ClipRange(actor->xvel, -vel, vel); actor->xvel = ClipRange(actor->xvel, -vel, vel);
actor->yvel = ClipRange(actor->yvel, -vel, vel); actor->yvel = ClipRange(actor->yvel, -vel, vel);
return;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -7987,7 +7989,6 @@ void aiPatrolAlarmLite(DBloodActor* actor, DBloodActor* targetactor)
return; return;
XSPRITE* pXSprite = &actor->x(); XSPRITE* pXSprite = &actor->x();
spritetype* pTarget = &targetactor->s();
if (pXSprite->health <= 0) if (pXSprite->health <= 0)
return; return;
@ -8007,12 +8008,12 @@ void aiPatrolAlarmLite(DBloodActor* actor, DBloodActor* targetactor)
if (pXDude->health <= 0) if (pXDude->health <= 0)
continue; continue;
int eaz2 = (getDudeInfo(pTarget->type)->eyeHeight * pTarget->yrepeat) << 2; int eaz2 = (getDudeInfo(targetactor->spr.type)->eyeHeight * targetactor->spr.yrepeat) << 2;
int nDist = approxDist(pDude->pos.X - actor->spr.pos.X, pDude->pos.Y - actor->spr.pos.Y); int nDist = approxDist(pDude->pos.X - actor->spr.pos.X, pDude->pos.Y - actor->spr.pos.Y);
if (nDist >= kPatrolAlarmSeeDist || !cansee(actor->spr.pos.X, actor->spr.pos.Y, zt1, actor->spr.sector(), pDude->pos.X, pDude->pos.Y, pDude->pos.Z - eaz2, pDude->sector())) if (nDist >= kPatrolAlarmSeeDist || !cansee(actor->spr.pos.X, actor->spr.pos.Y, zt1, actor->spr.sector(), pDude->pos.X, pDude->pos.Y, pDude->pos.Z - eaz2, pDude->sector()))
{ {
nDist = approxDist(pDude->pos.X - pTarget->pos.X, pDude->pos.Y - pTarget->pos.Y); nDist = approxDist(pDude->pos.X - targetactor->spr.pos.X, pDude->pos.Y - targetactor->spr.pos.Y);
if (nDist >= kPatrolAlarmSeeDist || !cansee(pTarget->pos.X, pTarget->pos.Y, zt2, pTarget->sector(), pDude->pos.X, pDude->pos.Y, pDude->pos.Z - eaz2, pDude->sector())) if (nDist >= kPatrolAlarmSeeDist || !cansee(targetactor->spr.pos.X, targetactor->spr.pos.Y, zt2, targetactor->spr.sector(), pDude->pos.X, pDude->pos.Y, pDude->pos.Z - eaz2, pDude->sector()))
continue; continue;
} }
@ -8037,7 +8038,6 @@ void aiPatrolAlarmFull(DBloodActor* actor, DBloodActor* targetactor, bool chain)
return; return;
XSPRITE* pXSprite = &actor->x(); XSPRITE* pXSprite = &actor->x();
spritetype* pTarget = &targetactor->s();
if (pXSprite->health <= 0) if (pXSprite->health <= 0)
return; return;
@ -8049,9 +8049,9 @@ void aiPatrolAlarmFull(DBloodActor* actor, DBloodActor* targetactor, bool chain)
int tzt, tzb; int tzt, tzb;
GetActorExtents(targetactor, &tzt, &tzb); GetActorExtents(targetactor, &tzt, &tzb);
int x3 = pTarget->pos.X, y3 = pTarget->pos.Y, z3 = tzt; int x3 = targetactor->spr.pos.X, y3 = targetactor->spr.pos.Y, z3 = tzt;
auto pSect3 = pTarget->sector(); auto pSect3 = targetactor->spr.sector();
BloodStatIterator it(kStatDude); BloodStatIterator it(kStatDude);
while (auto dudeactor = it.Next()) while (auto dudeactor = it.Next())