mirror of
https://github.com/ZDoom/Raze.git
synced 2025-03-13 20:42:11 +00:00
- use refactored Collision struct and clipmove in Blood, too.
This commit is contained in:
parent
4788c7ba5e
commit
8ce34c7772
13 changed files with 96 additions and 202 deletions
|
@ -2845,8 +2845,8 @@ static DBloodActor* actDropKey(DBloodActor* actor, int nType)
|
|||
{
|
||||
act2->addX();
|
||||
act2->x().respawn = 3;
|
||||
act2->hit.florhit = 0;
|
||||
act2->hit.ceilhit = 0;
|
||||
act2->hit.florhit.setNone();
|
||||
act2->hit.ceilhit.setNone();
|
||||
}
|
||||
return act2;
|
||||
}
|
||||
|
@ -4205,15 +4205,15 @@ static void checkCeilHit(DBloodActor* actor)
|
|||
auto pSprite = &actor->s();
|
||||
auto pXSprite = actor->hasX() ? &actor->x() : nullptr;
|
||||
|
||||
Collision coll(actor->hit.ceilhit);
|
||||
const auto& coll = actor->hit.ceilhit;
|
||||
switch (coll.type)
|
||||
{
|
||||
case kHitWall:
|
||||
break;
|
||||
case kHitSprite:
|
||||
if (coll.actor->hasX())
|
||||
if (coll.actor()->hasX())
|
||||
{
|
||||
auto actor2 = coll.actor;
|
||||
auto actor2 = coll.actor();
|
||||
spritetype* pSprite2 = &actor2->s();
|
||||
XSPRITE* pXSprite2 = &actor2->x();
|
||||
if ((pSprite2->statnum == kStatThing || pSprite2->statnum == kStatDude) && (actor->xvel != 0 || actor->yvel != 0 || actor->zvel != 0))
|
||||
|
@ -4313,15 +4313,15 @@ static void checkHit(DBloodActor* actor)
|
|||
auto pSprite = &actor->s();
|
||||
auto pXSprite = actor->hasX() ? &actor->x() : nullptr;
|
||||
|
||||
Collision coll(actor->hit.hit);
|
||||
const auto& coll = actor->hit.ceilhit;
|
||||
switch (coll.type)
|
||||
{
|
||||
case kHitWall:
|
||||
break;
|
||||
case kHitSprite:
|
||||
if (coll.actor->hasX())
|
||||
if (coll.actor()->hasX())
|
||||
{
|
||||
auto actor2 = coll.actor;
|
||||
auto actor2 = coll.actor();
|
||||
spritetype* pSprite2 = &actor2->s();
|
||||
|
||||
#ifdef NOONE_EXTENSIONS
|
||||
|
@ -4386,18 +4386,18 @@ static void checkFloorHit(DBloodActor* actor)
|
|||
{
|
||||
auto pSprite = &actor->s();
|
||||
|
||||
Collision coll(actor->hit.florhit);
|
||||
const auto& coll = actor->hit.ceilhit;
|
||||
switch (coll.type)
|
||||
{
|
||||
case kHitWall:
|
||||
break;
|
||||
case kHitSector:
|
||||
actTouchFloor(actor, coll.sector());
|
||||
actTouchFloor(actor, coll.hitSector);
|
||||
break;
|
||||
case kHitSprite:
|
||||
if (coll.actor->hasX())
|
||||
if (coll.actor()->hasX())
|
||||
{
|
||||
auto actor2 = coll.actor;
|
||||
auto actor2 = coll.actor();
|
||||
spritetype* pSprite2 = &actor2->s();
|
||||
XSPRITE* pXSprite2 = &actor2->x();
|
||||
|
||||
|
@ -4528,7 +4528,7 @@ static void ProcessTouchObjects(DBloodActor* actor)
|
|||
{
|
||||
if (coll->type == kHitSprite)
|
||||
{
|
||||
actor2 = coll->actor;
|
||||
actor2 = coll->actor();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4541,11 +4541,11 @@ static void ProcessTouchObjects(DBloodActor* actor)
|
|||
}
|
||||
|
||||
// Touch walls
|
||||
Collision coll = actor->hit.hit;
|
||||
const auto& coll = actor->hit.ceilhit;
|
||||
walltype* pHWall = nullptr;
|
||||
if (coll.type == kHitWall)
|
||||
{
|
||||
pHWall = coll.wall();
|
||||
pHWall = coll.hitWall;
|
||||
if (pHWall && pHWall->hasX())
|
||||
{
|
||||
if (pHWall->xw().triggerTouch && !pHWall->xw().isTriggered && (!pHWall->xw().dudeLockout || actor->IsPlayerActor()))
|
||||
|
@ -4616,7 +4616,8 @@ static Collision MoveThing(DBloodActor* actor)
|
|||
pSprite->cstat &= ~257;
|
||||
if ((actor->GetOwner()) && !cl_bloodvanillaexplosions && !VanillaMode())
|
||||
enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy
|
||||
lhit = actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0);
|
||||
ClipMove(pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0, lhit);
|
||||
actor->hit.hit = lhit;
|
||||
enginecompatibility_mode = bakCompat; // restore
|
||||
pSprite->cstat = bakCstat;
|
||||
assert(pSector);
|
||||
|
@ -4629,7 +4630,7 @@ static Collision MoveThing(DBloodActor* actor)
|
|||
Collision &coll = actor->hit.hit;
|
||||
if (coll.type == kHitWall)
|
||||
{
|
||||
actWallBounceVector(&actor->xvel, &actor->yvel, coll.wall(), pThingInfo->elastic);
|
||||
actWallBounceVector(&actor->xvel, &actor->yvel, coll.hitWall, pThingInfo->elastic);
|
||||
switch (pSprite->type)
|
||||
{
|
||||
case kThingZombieHead:
|
||||
|
@ -4733,7 +4734,7 @@ static Collision MoveThing(DBloodActor* actor)
|
|||
}
|
||||
else
|
||||
{
|
||||
actor->hit.florhit = 0;
|
||||
actor->hit.florhit.setNone();
|
||||
|
||||
if (pSprite->flags & 2)
|
||||
pSprite->flags |= 4;
|
||||
|
@ -4766,7 +4767,7 @@ static Collision MoveThing(DBloodActor* actor)
|
|||
}
|
||||
}
|
||||
}
|
||||
else actor->hit.ceilhit = 0;
|
||||
else actor->hit.ceilhit.setNone();
|
||||
|
||||
if (bottom >= floorZ)
|
||||
{
|
||||
|
@ -4776,7 +4777,7 @@ static Collision MoveThing(DBloodActor* actor)
|
|||
|
||||
if (coll.type == kHitSprite)
|
||||
{
|
||||
auto hitActor = coll.actor;
|
||||
auto hitActor = coll.actor();
|
||||
auto hitSpr = &hitActor->s();
|
||||
if ((hitSpr->cstat & 0x30) == 0)
|
||||
{
|
||||
|
@ -4839,7 +4840,7 @@ void MoveDude(DBloodActor* actor)
|
|||
{
|
||||
auto bakCstat = pSprite->cstat;
|
||||
pSprite->cstat &= ~257;
|
||||
actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, wd, tz, bz, CLIPMASK0);
|
||||
ClipMove(pSprite->pos, &pSector, actor->xvel >> 12, actor->yvel >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit);
|
||||
if (pSector == nullptr)
|
||||
{
|
||||
pSector = pSprite->sector();
|
||||
|
@ -4863,34 +4864,34 @@ void MoveDude(DBloodActor* actor)
|
|||
{
|
||||
case kHitSprite:
|
||||
{
|
||||
spritetype* pHitSprite = &coll.actor->s();
|
||||
XSPRITE* pHitXSprite = coll.actor->hasX() ? &coll.actor->x() : nullptr;;
|
||||
spritetype* pHitSprite = &coll.actor()->s();
|
||||
XSPRITE* pHitXSprite = coll.actor()->hasX() ? &coll.actor()->x() : nullptr;;
|
||||
|
||||
auto Owner = coll.actor->GetOwner();
|
||||
auto Owner = coll.actor()->GetOwner();
|
||||
|
||||
if (pHitSprite->statnum == kStatProjectile && !(pHitSprite->flags & 32) && actor != Owner)
|
||||
{
|
||||
auto hitInfo = gHitInfo;
|
||||
gHitInfo.hitActor = actor;
|
||||
actImpactMissile(coll.actor, 3);
|
||||
actImpactMissile(coll.actor(), 3);
|
||||
gHitInfo = hitInfo;
|
||||
}
|
||||
#ifdef NOONE_EXTENSIONS
|
||||
if (!gModernMap && pHitXSprite && pHitXSprite->Touch && !pHitXSprite->state && !pHitXSprite->isTriggered)
|
||||
trTriggerSprite(coll.actor, kCmdSpriteTouch);
|
||||
trTriggerSprite(coll.actor(), kCmdSpriteTouch);
|
||||
#else
|
||||
if (pHitXSprite && pHitXSprite->Touch && !pHitXSprite->state && !pHitXSprite->isTriggered)
|
||||
trTriggerSprite(coll.actor, kCmdSpriteTouch);
|
||||
#endif
|
||||
|
||||
if (pDudeInfo->lockOut && pHitXSprite && pHitXSprite->Push && !pHitXSprite->key && !pHitXSprite->DudeLockout && !pHitXSprite->state && !pHitXSprite->busy && !pPlayer)
|
||||
trTriggerSprite(coll.actor, kCmdSpritePush);
|
||||
trTriggerSprite(coll.actor(), kCmdSpritePush);
|
||||
|
||||
break;
|
||||
}
|
||||
case kHitWall:
|
||||
{
|
||||
walltype* pHitWall = coll.wall();
|
||||
walltype* pHitWall = coll.hitWall;
|
||||
XWALL* pHitXWall = nullptr;
|
||||
if (pHitWall->hasX()) pHitXWall = &pHitWall->xw();
|
||||
|
||||
|
@ -5240,7 +5241,7 @@ void MoveDude(DBloodActor* actor)
|
|||
}
|
||||
else
|
||||
{
|
||||
actor->hit.florhit = 0;
|
||||
actor->hit.florhit.setNone();
|
||||
|
||||
if (pSprite->flags & 2)
|
||||
pSprite->flags |= 4;
|
||||
|
@ -5254,7 +5255,7 @@ void MoveDude(DBloodActor* actor)
|
|||
actor->zvel = MulScale(-actor->zvel, 0x2000, 16);
|
||||
}
|
||||
else
|
||||
actor->hit.ceilhit = 0;
|
||||
actor->hit.ceilhit.setNone();
|
||||
|
||||
GetActorExtents(actor, &top, &bottom);
|
||||
|
||||
|
@ -5263,7 +5264,7 @@ void MoveDude(DBloodActor* actor)
|
|||
{
|
||||
if (floorColl.type == kHitSprite)
|
||||
{
|
||||
auto hitAct = floorColl.actor;
|
||||
auto hitAct = floorColl.actor();
|
||||
if ((hitAct->s().cstat & 0x30) == 0)
|
||||
{
|
||||
actor->xvel += MulScale(4, pSprite->x - hitAct->s().x, 2);
|
||||
|
@ -5347,7 +5348,8 @@ int MoveMissile(DBloodActor* actor)
|
|||
enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy
|
||||
pSprite->cstat &= ~257; // remove self collisions for accurate clipmove
|
||||
}
|
||||
Collision clipmoveresult = ClipMove(&pos, &pSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, 1);
|
||||
Collision clipmoveresult;
|
||||
ClipMove(pos, &pSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, clipmoveresult, 1);
|
||||
enginecompatibility_mode = bakCompat; // restore
|
||||
pSprite->cstat = bakSpriteCstat;
|
||||
auto pSector = pSector2;
|
||||
|
@ -5358,24 +5360,24 @@ int MoveMissile(DBloodActor* actor)
|
|||
}
|
||||
if (clipmoveresult.type == kHitSprite)
|
||||
{
|
||||
gHitInfo.hitActor = clipmoveresult.actor;
|
||||
gHitInfo.hitActor = clipmoveresult.actor();
|
||||
cliptype = 3;
|
||||
}
|
||||
else if (clipmoveresult.type == kHitWall)
|
||||
{
|
||||
gHitInfo.hitWall = clipmoveresult.wall();
|
||||
gHitInfo.hitWall = clipmoveresult.hitWall;
|
||||
if (!gHitInfo.hitWall->twoSided()) cliptype = 0;
|
||||
else
|
||||
{
|
||||
int32_t fz, cz;
|
||||
getzsofslopeptr(clipmoveresult.wall()->nextSector(), pos.x, pos.y, &cz, &fz);
|
||||
getzsofslopeptr(clipmoveresult.hitWall->nextSector(), pos.x, pos.y, &cz, &fz);
|
||||
if (pos.z <= cz || pos.z >= fz) cliptype = 0;
|
||||
else cliptype = 4;
|
||||
}
|
||||
}
|
||||
if (cliptype == 4)
|
||||
{
|
||||
walltype* pWall = clipmoveresult.wall();
|
||||
walltype* pWall = clipmoveresult.hitWall;
|
||||
if (pWall->hasX())
|
||||
{
|
||||
XWALL* pXWall = &pWall->xw();
|
||||
|
@ -5808,7 +5810,7 @@ static void actCheckThings()
|
|||
{
|
||||
pSprite->xrepeat = 32;
|
||||
pSprite->yrepeat = 32;
|
||||
actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, pXSprite->data1);
|
||||
actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, pXSprite->data1);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
@ -5816,7 +5818,7 @@ static void actCheckThings()
|
|||
seqSpawn(24, actor, -1);
|
||||
if (hit.type == kHitSprite)
|
||||
{
|
||||
actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, 12);
|
||||
actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -5828,7 +5830,7 @@ static void actCheckThings()
|
|||
}
|
||||
else if (hit.type == kHitSprite)
|
||||
{
|
||||
actDamageSprite(actor->GetOwner(), hit.actor, kDamageFall, 12);
|
||||
actDamageSprite(actor->GetOwner(), hit.actor(), kDamageFall, 12);
|
||||
evPostActor(actor, 0, kCallbackFXPodBloodSplat);
|
||||
}
|
||||
break;
|
||||
|
@ -6329,8 +6331,8 @@ DBloodActor* actSpawnSprite(sectortype* pSector, int x, int y, int z, int nStat,
|
|||
if (setextra && !actor->hasX())
|
||||
{
|
||||
actor->addX();
|
||||
actor->hit.florhit = 0;
|
||||
actor->hit.ceilhit = 0;
|
||||
actor->hit.florhit.setNone();
|
||||
actor->hit.ceilhit.setNone();
|
||||
if (!VanillaMode()) actor->SetTarget(nullptr);
|
||||
}
|
||||
return actor;
|
||||
|
@ -6356,8 +6358,8 @@ DBloodActor* actSpawnSprite(DBloodActor* source, int nStat)
|
|||
actor->zvel = source->zvel;
|
||||
pSprite->flags = 0;
|
||||
actor->addX();
|
||||
actor->hit.florhit = 0;
|
||||
actor->hit.ceilhit = 0;
|
||||
actor->hit.florhit.setNone();
|
||||
actor->hit.ceilhit.setNone();
|
||||
if (!VanillaMode()) actor->SetTarget(nullptr);
|
||||
return actor;
|
||||
}
|
||||
|
@ -7285,21 +7287,6 @@ void actBurnSprite(DBloodActor* pSource, DBloodActor* pTarget, int nTime)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
FSerializer& Serialize(FSerializer& arc, const char* keyname, Collision& w, Collision* def)
|
||||
{
|
||||
int empty = 0;
|
||||
if (arc.isReading()) w = {};
|
||||
if (arc.BeginObject(keyname))
|
||||
{
|
||||
arc("type", w.type, &empty)
|
||||
("index", w.index, &empty)
|
||||
("legacyval", w.legacyVal, &empty)
|
||||
("actor", w.actor)
|
||||
.EndObject();
|
||||
}
|
||||
return arc;
|
||||
}
|
||||
|
||||
FSerializer& Serialize(FSerializer& arc, const char* keyname, SPRITEHIT& w, SPRITEHIT* def)
|
||||
{
|
||||
if (arc.BeginObject(keyname))
|
||||
|
|
|
@ -24,9 +24,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
class DBloodActor;
|
||||
using HitInfo = THitInfo<DBloodActor>;
|
||||
|
||||
enum DAMAGE_TYPE {
|
||||
kDamageFall = 0,
|
||||
kDamageBurn,
|
||||
|
|
|
@ -142,7 +142,7 @@ bool CanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRange)
|
|||
int nDist = approxDist(x - gHitInfo.hitpos.x, y - gHitInfo.hitpos.y);
|
||||
if (nDist - (pSprite->clipdist << 2) < nRange)
|
||||
{
|
||||
if (gHitInfo.hitActor == nullptr || target == nullptr || target != gHitInfo.hitActor)
|
||||
if (gHitInfo.actor() == nullptr || target == nullptr || target != gHitInfo.actor())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -146,8 +146,8 @@ static bool genDudeAdjustSlope(DBloodActor* actor, int dist, int weaponType, int
|
|||
for (int i = -8191; i < 8192; i += by)
|
||||
{
|
||||
HitScan(actor, pSprite->z, bcos(pSprite->ang), bsin(pSprite->ang), i, clipMask, dist);
|
||||
if (!fStart && actor->GetTarget() == gHitInfo.hitActor) fStart = i;
|
||||
else if (fStart && actor->GetTarget() != gHitInfo.hitActor)
|
||||
if (!fStart && actor->GetTarget() == gHitInfo.actor()) fStart = i;
|
||||
else if (fStart && actor->GetTarget() != gHitInfo.actor())
|
||||
{
|
||||
fEnd = i;
|
||||
break;
|
||||
|
@ -779,7 +779,7 @@ static void unicultThinkChase(DBloodActor* actor)
|
|||
objDist = approxDist(gHitInfo.hitpos.x - pSprite->x, gHitInfo.hitpos.y - pSprite->y);
|
||||
}
|
||||
|
||||
if (actor != gHitInfo.hitActor && targetDist > objDist)
|
||||
if (actor != gHitInfo.actor() && targetDist > objDist)
|
||||
{
|
||||
DBloodActor* hitactor = nullptr;
|
||||
walltype* pHWall = NULL;
|
||||
|
@ -889,7 +889,7 @@ static void unicultThinkChase(DBloodActor* actor)
|
|||
{
|
||||
if (genDudeAdjustSlope(actor, dist, weaponType)) break;
|
||||
VectorScan(actor, 0, 0, bcos(pSprite->ang), bsin(pSprite->ang), actor->dudeSlope, dist, 1);
|
||||
if (actor == gHitInfo.hitActor) break;
|
||||
if (actor == gHitInfo.actor()) break;
|
||||
|
||||
bool immune = nnExtIsImmune(hitactor, gVectorData[curWeapon].dmgType);
|
||||
if (!(pXHSprite != NULL && (!immune || (immune && pHSprite->statnum == kStatThing && pXHSprite->Vector)) && !pXHSprite->locked))
|
||||
|
@ -950,7 +950,7 @@ static void unicultThinkChase(DBloodActor* actor)
|
|||
bool masked = (pHWall->cstat & CSTAT_WALL_MASKED);
|
||||
if (masked) VectorScan(actor, 0, 0, bcos(pSprite->ang), bsin(pSprite->ang), actor->dudeSlope, dist, 1);
|
||||
|
||||
if ((actor != gHitInfo.hitActor) && (pHWall->type != kWallGib || !masked || pXHWall == NULL || !pXHWall->triggerVector || pXHWall->locked))
|
||||
if ((actor != gHitInfo.actor()) && (pHWall->type != kWallGib || !masked || pXHWall == NULL || !pXHWall->triggerVector || pXHWall->locked))
|
||||
{
|
||||
if (spriteIsUnderwater(actor)) aiGenDudeNewState(actor, &genDudeChaseW);
|
||||
else aiGenDudeNewState(actor, &genDudeChaseL);
|
||||
|
|
|
@ -6,87 +6,6 @@ BEGIN_BLD_NS
|
|||
|
||||
class DBloodActor;
|
||||
|
||||
// Wrapper around the insane collision info mess from Build.
|
||||
struct Collision
|
||||
{
|
||||
int type;
|
||||
int index;
|
||||
int legacyVal; // should be removed later, but needed for converting back for unadjusted code.
|
||||
DBloodActor* actor;
|
||||
|
||||
Collision() = default;
|
||||
Collision(int legacyval) { setFromEngine(legacyval); }
|
||||
|
||||
// need forward declarations of these.
|
||||
int actorIndex(DBloodActor*);
|
||||
DBloodActor* Actor(int);
|
||||
|
||||
int setNone()
|
||||
{
|
||||
type = kHitNone;
|
||||
index = -1;
|
||||
legacyVal = 0;
|
||||
actor = nullptr;
|
||||
return kHitNone;
|
||||
}
|
||||
|
||||
int setSector(int num)
|
||||
{
|
||||
type = kHitSector;
|
||||
index = num;
|
||||
legacyVal = type | index;
|
||||
actor = nullptr;
|
||||
return kHitSector;
|
||||
}
|
||||
int setSector(sectortype* num)
|
||||
{
|
||||
type = kHitSector;
|
||||
index = sectnum(num);
|
||||
legacyVal = type | index;
|
||||
actor = nullptr;
|
||||
return kHitSector;
|
||||
}
|
||||
int setWall(int num)
|
||||
{
|
||||
type = kHitWall;
|
||||
index = num;
|
||||
legacyVal = type | index;
|
||||
actor = nullptr;
|
||||
return kHitWall;
|
||||
}
|
||||
int setSprite(DBloodActor* num)
|
||||
{
|
||||
type = kHitSprite;
|
||||
index = -1;
|
||||
legacyVal = type | actorIndex(num);
|
||||
actor = num;
|
||||
return kHitSprite;
|
||||
}
|
||||
|
||||
int setFromEngine(int value)
|
||||
{
|
||||
legacyVal = value;
|
||||
type = value & kHitTypeMask;
|
||||
if (type == 0) { index = -1; actor = nullptr; }
|
||||
else if (type != kHitSprite) { index = value & kHitIndexMask; actor = nullptr; }
|
||||
else { index = -1; actor = Actor(value & kHitIndexMask); }
|
||||
return type;
|
||||
}
|
||||
|
||||
walltype* wall() const
|
||||
{
|
||||
assert(type == kHitWall);
|
||||
return &::wall[index];
|
||||
}
|
||||
|
||||
sectortype* sector() const
|
||||
{
|
||||
assert(type == kHitSector);
|
||||
return &::sector[index];
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
struct SPRITEHIT
|
||||
{
|
||||
Collision hit, ceilhit, florhit;
|
||||
|
@ -390,16 +309,6 @@ inline void ChangeActorSect(DBloodActor* actor, sectortype* stat)
|
|||
ChangeSpriteSect(actor->GetSpriteIndex(), sectnum(stat));
|
||||
}
|
||||
|
||||
inline int Collision::actorIndex(DBloodActor* actor)
|
||||
{
|
||||
return int(actor - bloodActors);
|
||||
}
|
||||
|
||||
inline DBloodActor* Collision::Actor(int a)
|
||||
{
|
||||
return &bloodActors[a];
|
||||
}
|
||||
|
||||
inline void setActorPos(DBloodActor* actor, vec3_t* pos)
|
||||
{
|
||||
setsprite(actor->GetSpriteIndex(), pos);
|
||||
|
|
|
@ -28,6 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "printf.h"
|
||||
#include "v_text.h"
|
||||
#include "seqcb.h"
|
||||
#include "coreactor.h"
|
||||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
|
|
|
@ -358,7 +358,7 @@ int HitScan(DBloodActor *actor, int z, int dx, int dy, int dz, unsigned int nMas
|
|||
|
||||
hitscangoal.x = hitscangoal.y = 0x1ffffff;
|
||||
pSprite->cstat = bakCstat;
|
||||
if (gHitInfo.hitActor != nullptr)
|
||||
if (gHitInfo.actor() != nullptr)
|
||||
return 3;
|
||||
if (gHitInfo.hitWall != nullptr)
|
||||
{
|
||||
|
@ -568,7 +568,7 @@ void GetZRange(DBloodActor *actor, int *ceilZ, Collision *ceilColl, int *floorZ,
|
|||
floorColl->setFromEngine(floorHit);
|
||||
if (floorColl->type == kHitSector)
|
||||
{
|
||||
auto pSector = floorColl->sector();
|
||||
auto pSector = floorColl->hitSector;
|
||||
if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pSector->floorstat & 1))
|
||||
*floorZ = 0x7fffffff;
|
||||
if (pSector->hasX())
|
||||
|
@ -588,7 +588,7 @@ void GetZRange(DBloodActor *actor, int *ceilZ, Collision *ceilColl, int *floorZ,
|
|||
}
|
||||
if (ceilColl->type == kHitSector)
|
||||
{
|
||||
auto pSector = ceilColl->sector();
|
||||
auto pSector = ceilColl->hitSector;
|
||||
if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pSector->ceilingstat & 1))
|
||||
*ceilZ = 0x80000000;
|
||||
auto actor = pSector->lowerLink;
|
||||
|
@ -614,7 +614,7 @@ void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collis
|
|||
floorColl->setFromEngine(floorHit);
|
||||
if (floorColl->type == kHitSector)
|
||||
{
|
||||
auto pSector = floorColl->sector();
|
||||
auto pSector = floorColl->hitSector;
|
||||
if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pSector->floorstat & 1))
|
||||
*floorZ = 0x7fffffff;
|
||||
if (pSector->hasX())
|
||||
|
@ -634,7 +634,7 @@ void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collis
|
|||
}
|
||||
if (ceilColl->type == kHitSector)
|
||||
{
|
||||
auto pSector = ceilColl->sector();
|
||||
auto pSector = ceilColl->hitSector;
|
||||
if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pSector->ceilingstat & 1))
|
||||
*ceilZ = 0x80000000;
|
||||
auto actor = pSector->lowerLink;
|
||||
|
@ -676,20 +676,19 @@ int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3)
|
|||
return approxDist(t1-x1, t2-y1);
|
||||
}
|
||||
|
||||
unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount)
|
||||
void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, Collision& hit, int tracecount)
|
||||
{
|
||||
auto opos = *pos;
|
||||
auto opos = pos;
|
||||
sectortype* bakSect = *pSector;
|
||||
unsigned int nRes = clipmove(pos, &bakSect, xv << 14, yv << 14, wd, cd, fd, nMask, tracecount);
|
||||
clipmove(pos, &bakSect, xv << 14, yv << 14, wd, cd, fd, nMask, hit, tracecount);
|
||||
if (bakSect == nullptr)
|
||||
{
|
||||
*pos = opos;
|
||||
pos = opos;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pSector = bakSect;
|
||||
}
|
||||
return nRes;
|
||||
}
|
||||
|
||||
BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray<walltype*>* pWalls, bool newSectCheckMethod)
|
||||
|
|
|
@ -32,7 +32,6 @@ enum {
|
|||
};
|
||||
|
||||
|
||||
struct Collision;
|
||||
bool FindSector(int nX, int nY, int nZ, sectortype** ppSector);
|
||||
bool FindSector(int nX, int nY, sectortype** ppSector);
|
||||
|
||||
|
@ -47,7 +46,7 @@ int VectorScan(DBloodActor *pSprite, int nOffset, int nZOffset, int dx, int dy,
|
|||
void GetZRange(DBloodActor *pSprite, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0);
|
||||
void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0);
|
||||
int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3);
|
||||
unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3);
|
||||
void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, Collision& hit, int tracecount = 3);
|
||||
BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray<walltype*>* pWalls, bool newSectCheckMethod = false);
|
||||
int picWidth(int nPic, int repeat);
|
||||
int picHeight(int nPic, int repeat);
|
||||
|
|
|
@ -28,6 +28,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
BEGIN_BLD_NS
|
||||
|
||||
class DBloodActor;
|
||||
using HitInfo = THitInfo<DBloodActor>;
|
||||
using Collision = TCollision<DBloodActor>;
|
||||
|
||||
void playlogos();
|
||||
unsigned int qrand(void);
|
||||
|
@ -110,7 +112,6 @@ extern int nPrecacheCount;
|
|||
|
||||
void tilePrecacheTile(int nTile, int nType, int palette);
|
||||
|
||||
struct Collision;
|
||||
int tileGetSurfType(int hit);
|
||||
int tileGetSurfType(Collision& hit);
|
||||
|
||||
|
|
|
@ -1283,7 +1283,7 @@ void nnExtProcessSuperSprites()
|
|||
if (!vector)
|
||||
pSightSpr->cstat &= ~CSTAT_SPRITE_BLOCK_HITSCAN;
|
||||
|
||||
if (gHitInfo.hitActor == gSightSpritesList[i])
|
||||
if (gHitInfo.actor() == gSightSpritesList[i])
|
||||
{
|
||||
trTriggerSprite(gHitInfo.actor(), kCmdSpriteSight);
|
||||
break;
|
||||
|
@ -1357,7 +1357,7 @@ void nnExtProcessSuperSprites()
|
|||
pPlayer = &gPlayer[a];
|
||||
auto pact = pPlayer->actor;
|
||||
|
||||
if (pact->hit.hit.type == kHitSprite && pact->hit.hit.actor == debrisactor)
|
||||
if (pact->hit.hit.type == kHitSprite && pact->hit.hit.actor() == debrisactor)
|
||||
{
|
||||
int nSpeed = approxDist(pact->xvel, pact->yvel);
|
||||
nSpeed = ClipLow(nSpeed - MulScale(nSpeed, mass, 6), 0x9000 - (mass << 3));
|
||||
|
@ -1702,8 +1702,9 @@ void debrisMove(int listIndex)
|
|||
auto oldcstat = pSprite->cstat;
|
||||
pSprite->cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
|
||||
|
||||
moveHit = actor->hit.hit = ClipMove(&pSprite->pos, &pSector, actor->xvel >> 12,
|
||||
actor->yvel >> 12, clipDist, ceilDist, floorDist, CLIPMASK0);
|
||||
ClipMove(pSprite->pos, &pSector, actor->xvel >> 12,
|
||||
actor->yvel >> 12, clipDist, ceilDist, floorDist, CLIPMASK0, moveHit);
|
||||
actor->hit.hit = moveHit;
|
||||
|
||||
pSprite->cstat = oldcstat;
|
||||
if (pSprite->sector() != pSector)
|
||||
|
@ -1722,7 +1723,7 @@ void debrisMove(int listIndex)
|
|||
if (actor->hit.hit.type == kHitWall)
|
||||
{
|
||||
moveHit = actor->hit.hit;
|
||||
actWallBounceVector(&actor->xvel, &actor->yvel, moveHit.wall(), tmpFraction);
|
||||
actWallBounceVector(&actor->xvel, &actor->yvel, moveHit.hitWall, tmpFraction);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1883,10 +1884,10 @@ void debrisMove(int listIndex)
|
|||
else if (floorColl.type == kHitSprite)
|
||||
{
|
||||
|
||||
if ((floorColl.actor->s().cstat & 0x30) == 0)
|
||||
if ((floorColl.actor()->s().cstat & 0x30) == 0)
|
||||
{
|
||||
actor->xvel += MulScale(4, pSprite->x - floorColl.actor->s().x, 2);
|
||||
actor->yvel += MulScale(4, pSprite->y - floorColl.actor->s().y, 2);
|
||||
actor->xvel += MulScale(4, pSprite->x - floorColl.actor()->s().x, 2);
|
||||
actor->yvel += MulScale(4, pSprite->y - floorColl.actor()->s().y, 2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -3348,11 +3349,11 @@ void useSpriteDamager(DBloodActor* sourceactor, int objType, sectortype* targSec
|
|||
continue;
|
||||
else if (enter)
|
||||
damageSprites(sourceactor, iactor);
|
||||
else if (floor && hit.florhit.type == kHitSector && hit.florhit.sector() == targSect)
|
||||
else if (floor && hit.florhit.type == kHitSector && hit.florhit.hitSector == targSect)
|
||||
damageSprites(sourceactor, iactor);
|
||||
else if (ceil && hit.ceilhit.type == kHitSector && hit.ceilhit.sector() == targSect)
|
||||
else if (ceil && hit.ceilhit.type == kHitSector && hit.ceilhit.hitSector == targSect)
|
||||
damageSprites(sourceactor, iactor);
|
||||
else if (wall && hit.hit.type == kHitWall && hit.hit.wall()->sectorp() == targSect)
|
||||
else if (wall && hit.hit.type == kHitWall && hit.hit.hitWall->sectorp() == targSect)
|
||||
damageSprites(sourceactor, iactor);
|
||||
}
|
||||
break;
|
||||
|
@ -4527,15 +4528,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH)
|
|||
return condCmp((kPercFull * pXSpr->health) / ClipLow(var, 1), arg1, arg2, cmpOp);
|
||||
case 55: // touching ceil of sector?
|
||||
if (objActor->hit.ceilhit.type != kHitSector) return false;
|
||||
else if (PUSH) condPush(aCond, objActor->hit.ceilhit.sector());
|
||||
else if (PUSH) condPush(aCond, objActor->hit.ceilhit.hitSector);
|
||||
return true;
|
||||
case 56: // touching floor of sector?
|
||||
if (objActor->hit.florhit.type != kHitSector) return false;
|
||||
else if (PUSH) condPush(aCond, objActor->hit.florhit.sector());
|
||||
else if (PUSH) condPush(aCond, objActor->hit.florhit.hitSector);
|
||||
return true;
|
||||
case 57: // touching walls of sector?
|
||||
if (objActor->hit.hit.type != kHitWall) return false;
|
||||
else if (PUSH) condPush(aCond, objActor->hit.hit.wall());
|
||||
else if (PUSH) condPush(aCond, objActor->hit.hit.hitWall);
|
||||
return true;
|
||||
case 58: // touching another sprite?
|
||||
{
|
||||
|
@ -4544,15 +4545,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH)
|
|||
{
|
||||
case 0:
|
||||
case 1:
|
||||
if (objActor->hit.florhit.type == kHitSprite) actorvar = objActor->hit.florhit.actor;
|
||||
if (objActor->hit.florhit.type == kHitSprite) actorvar = objActor->hit.florhit.actor();
|
||||
if (arg3 || var >= 0) break;
|
||||
[[fallthrough]];
|
||||
case 2:
|
||||
if (objActor->hit.hit.type == kHitSprite) actorvar = objActor->hit.hit.actor;
|
||||
if (objActor->hit.hit.type == kHitSprite) actorvar = objActor->hit.hit.actor();
|
||||
if (arg3 || var >= 0) break;
|
||||
[[fallthrough]];
|
||||
case 3:
|
||||
if (objActor->hit.ceilhit.type == kHitSprite) actorvar = objActor->hit.ceilhit.actor;
|
||||
if (objActor->hit.ceilhit.type == kHitSprite) actorvar = objActor->hit.ceilhit.actor();
|
||||
break;
|
||||
}
|
||||
if (actorvar == nullptr)
|
||||
|
@ -4567,15 +4568,15 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH)
|
|||
{
|
||||
case 0:
|
||||
case 1:
|
||||
if (hit.ceilhit.type == kHitSprite && hit.ceilhit.actor == objActor) actorvar = iactor;
|
||||
if (hit.ceilhit.type == kHitSprite && hit.ceilhit.actor() == objActor) actorvar = iactor;
|
||||
if (arg3 || actorvar) break;
|
||||
[[fallthrough]];
|
||||
case 2:
|
||||
if (hit.hit.type == kHitSprite && hit.hit.actor == objActor) actorvar = iactor;
|
||||
if (hit.hit.type == kHitSprite && hit.hit.actor() == objActor) actorvar = iactor;
|
||||
if (arg3 || actorvar) break;
|
||||
[[fallthrough]];
|
||||
case 3:
|
||||
if (hit.florhit.type == kHitSprite && hit.florhit.actor == objActor) actorvar = iactor;
|
||||
if (hit.florhit.type == kHitSprite && hit.florhit.actor() == objActor) actorvar = iactor;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -7498,7 +7499,7 @@ bool nnExtCanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRang
|
|||
HitScan(actor, z, Cos(nAngle) >> 16, Sin(nAngle) >> 16, 0, CLIPMASK0, nRange);
|
||||
int nDist = approxDist(x - gHitInfo.hitpos.x, y - gHitInfo.hitpos.y);
|
||||
if (target != nullptr && nDist - (pSprite->clipdist << 2) < nRange)
|
||||
return (target == gHitInfo.hitActor);
|
||||
return (target == gHitInfo.actor());
|
||||
|
||||
x += MulScale(nRange, Cos(nAngle), 30);
|
||||
y += MulScale(nRange, Sin(nAngle), 30);
|
||||
|
@ -8034,7 +8035,7 @@ void aiPatrolMove(DBloodActor* actor)
|
|||
|
||||
if (actor->hit.hit.type == kHitSprite)
|
||||
{
|
||||
auto hitactor = actor->hit.hit.actor;
|
||||
auto hitactor = actor->hit.hit.actor();
|
||||
hitactor->x().dodgeDir = -1;
|
||||
pXSprite->dodgeDir = 1;
|
||||
aiMoveDodge(hitactor);
|
||||
|
@ -8184,9 +8185,9 @@ bool spritesTouching(DBloodActor *actor1, DBloodActor* actor2)
|
|||
|
||||
auto hit = &actor1->hit;
|
||||
DBloodActor* hitactor = nullptr;
|
||||
if (hit->hit.type == kHitSprite) hitactor = hit->hit.actor;
|
||||
else if (hit->florhit.type == kHitSprite) hitactor = hit->florhit.actor;
|
||||
else if (hit->ceilhit.type == kHitSprite) hitactor = hit->ceilhit.actor;
|
||||
if (hit->hit.type == kHitSprite) hitactor = hit->hit.actor();
|
||||
else if (hit->florhit.type == kHitSprite) hitactor = hit->florhit.actor();
|
||||
else if (hit->ceilhit.type == kHitSprite) hitactor = hit->ceilhit.actor();
|
||||
else return false;
|
||||
return hitactor->hasX() && hitactor == actor2;
|
||||
}
|
||||
|
|
|
@ -1251,7 +1251,7 @@ int ActionScan(PLAYER *pPlayer, HitInfo* out)
|
|||
{
|
||||
case 3:
|
||||
{
|
||||
if (!gHitInfo.hitActor || !gHitInfo.actor()->hasX()) return -1;
|
||||
if (!gHitInfo.actor() || !gHitInfo.actor()->hasX()) return -1;
|
||||
out->hitActor = gHitInfo.actor();
|
||||
spritetype* pSprite = &gHitInfo.actor()->s();
|
||||
XSPRITE* pXSprite = &gHitInfo.actor()->x();
|
||||
|
@ -2145,7 +2145,7 @@ void playerLandingSound(PLAYER *pPlayer)
|
|||
SPRITEHIT* pHit = &pPlayer->actor->hit;
|
||||
if (pHit->florhit.type != kHitNone)
|
||||
{
|
||||
if (!gGameOptions.bFriendlyFire && pHit->florhit.type == kHitSprite && IsTargetTeammate(pPlayer, &pHit->florhit.actor->s()))
|
||||
if (!gGameOptions.bFriendlyFire && pHit->florhit.type == kHitSprite && IsTargetTeammate(pPlayer, &pHit->florhit.actor()->s()))
|
||||
return;
|
||||
int nSurf = tileGetSurfType(pHit->florhit);
|
||||
if (nSurf)
|
||||
|
|
|
@ -384,7 +384,7 @@ static void fakeMoveDude(spritetype *pSprite)
|
|||
{
|
||||
auto bakCstat = pSprite->cstat;
|
||||
pSprite->cstat &= ~257;
|
||||
predict.at75.hit = ClipMove(&predict.pos, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0);
|
||||
ClipMove(&predict.pos, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0, predict.at75.hit);
|
||||
if (nSector == -1)
|
||||
nSector = predict.sectnum;
|
||||
|
||||
|
|
|
@ -82,11 +82,11 @@ int tileGetSurfType(Collision& hit)
|
|||
default:
|
||||
return 0;
|
||||
case kHitSector:
|
||||
return surfType[hit.sector()->floorpicnum];
|
||||
return surfType[hit.hitSector->floorpicnum];
|
||||
case kHitWall:
|
||||
return surfType[hit.wall()->picnum];
|
||||
return surfType[hit.hitWall->picnum];
|
||||
case kHitSprite:
|
||||
return surfType[hit.actor->s().picnum];
|
||||
return surfType[hit.actor()->s().picnum];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue