diff --git a/source/games/blood/src/gameutil.cpp b/source/games/blood/src/gameutil.cpp index 732d5afc2..525652ad7 100644 --- a/source/games/blood/src/gameutil.cpp +++ b/source/games/blood/src/gameutil.cpp @@ -525,43 +525,42 @@ void GetZRange(DBloodActor* actor, double* ceilZ, Collision* ceilColl, double* f // //--------------------------------------------------------------------------- -void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int* ceilZ, Collision* ceilColl, int* floorZ, Collision* floorColl, int nDist, unsigned int nMask, unsigned int nClipParallax) +void GetZRangeAtXYZ(const DVector3& pos, sectortype* pSector, double* ceilZ, Collision* ceilColl, double* floorZ, Collision* floorColl, int nDist, unsigned int nMask, unsigned int nClipParallax) { Collision scratch; - int32_t nTemp1; - vec3_t lpos = { x, y, z }; - getzrange(lpos, pSector, (int32_t*)ceilZ, *ceilColl, (int32_t*)floorZ, *floorColl, nDist, nMask); + double nTemp1; + getzrange(pos, pSector, ceilZ, *ceilColl, floorZ, *floorColl, nDist, nMask); if (floorColl->type == kHitSector) { auto pHitSect = floorColl->hitSector; if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pHitSect->floorstat & CSTAT_SECTOR_SKY)) - *floorZ = 0x7fffffff; + *floorZ = 0x800000; if (pHitSect->hasX()) { XSECTOR* pXSector = &pHitSect->xs(); - *floorZ += pXSector->Depth << 10; + *floorZ += pXSector->Depth << 2; } auto actor = barrier_cast(pHitSect->upperLink); if (actor) { auto link = actor->GetOwner(); - vec3_t newpos = lpos + link->int_pos() - actor->int_pos(); - getzrange(newpos, link->sector(), &nTemp1, scratch, (int32_t*)floorZ, *floorColl, nDist, nMask); - *floorZ -= link->int_pos().Z - actor->int_pos().Z; + auto newpos = pos + link->spr.pos - actor->spr.pos; + getzrange(newpos, link->sector(), &nTemp1, scratch, floorZ, *floorColl, nDist, nMask); + *floorZ -= link->spr.pos.Z - actor->spr.pos.Z; } } if (ceilColl->type == kHitSector) { auto pHitSect = ceilColl->hitSector; if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pHitSect->ceilingstat & CSTAT_SECTOR_SKY)) - *ceilZ = 0x80000000; + *ceilZ = -0x800000; auto actor = barrier_cast(pHitSect->lowerLink); if (actor) { auto link = actor->GetOwner(); - vec3_t newpos = lpos + link->int_pos() - actor->int_pos(); - getzrange(newpos, link->sector(), (int32_t*)ceilZ, *ceilColl, &nTemp1, scratch, nDist, nMask); - *ceilZ -= link->int_pos().Z - actor->int_pos().Z; + auto newpos = pos + link->spr.pos - actor->spr.pos; + getzrange(newpos, link->sector(), ceilZ, *ceilColl, &nTemp1, scratch, nDist, nMask); + *ceilZ -= link->spr.pos.Z - actor->spr.pos.Z; } } } diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h index 4c39cb328..702bba4c5 100644 --- a/source/games/blood/src/gameutil.h +++ b/source/games/blood/src/gameutil.h @@ -54,15 +54,8 @@ int VectorScan(DBloodActor* pSprite, double nOffset, double nZOffset, const DVec void GetZRange(DBloodActor* pSprite, double* ceilZ, Collision* ceilHit, double* 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); -void GetZRangeAtXYZ(const DVector3& pos, sectortype* pSector, double* ceilZ, Collision* ceilHit, double* floorZ, Collision* floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0) -{ - vec3_t ipos = { int(pos.X * worldtoint), int(pos.Y * worldtoint), int(pos.Z * zworldtoint)}; - int cz, fz; - GetZRangeAtXYZ(ipos.X, ipos.Y, ipos.Z, pSector, &cz, ceilHit, &fz, floorHit, nDist, nMask); - *ceilZ = cz * zinttoworld; - *floorZ = fz * zinttoworld; -} +void GetZRangeAtXYZ(const DVector3& pos, sectortype* pSector, double* ceilZ, Collision* ceilHit, double* 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); void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3); inline void ClipMove(DVector3& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3)