- use refactored Collision struct and clipmove in Blood, too.

This commit is contained in:
Christoph Oelckers 2021-11-26 14:03:21 +01:00
parent 4788c7ba5e
commit 8ce34c7772
13 changed files with 96 additions and 202 deletions

View file

@ -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))

View file

@ -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,

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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)

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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)

View file

@ -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;

View file

@ -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];
}
}