diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 597902ccf..32d4f26e8 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -4645,7 +4645,7 @@ int MoveThing(DBloodActor* actor) pSprite->cstat &= ~257; if ((pSprite->owner >= 0) && !cl_bloodvanillaexplosions && !VanillaMode()) enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy - lhit = actor->hit().hit = ClipMove(&pSprite->x, &pSprite->y, &pSprite->z, &nSector, actor->xvel() >> 12, actor->yvel() >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0); + lhit = actor->hit().hit = ClipMove(&pSprite->pos, &nSector, actor->xvel() >> 12, actor->yvel() >> 12, pSprite->clipdist << 2, (pSprite->z - top) / 4, (bottom - pSprite->z) / 4, CLIPMASK0); enginecompatibility_mode = bakCompat; // restore pSprite->cstat = bakCstat; assert(nSector >= 0); @@ -4868,7 +4868,7 @@ void MoveDude(DBloodActor* actor) { short bakCstat = pSprite->cstat; pSprite->cstat &= ~257; - actor->hit().hit = ClipMove(&pSprite->x, &pSprite->y, &pSprite->z, &nSector, actor->xvel() >> 12, actor->yvel() >> 12, wd, tz, bz, CLIPMASK0); + actor->hit().hit = ClipMove(&pSprite->pos, &nSector, actor->xvel() >> 12, actor->yvel() >> 12, wd, tz, bz, CLIPMASK0); if (nSector == -1) { nSector = pSprite->sectnum; @@ -5379,9 +5379,7 @@ int MoveMissile(DBloodActor* actor) const bool isFlameSprite = (pSprite->type == kMissileFlameSpray || pSprite->type == kMissileFlameHound); // do not use accurate clipmove for flame based sprites (changes damage too much) while (1) { - int x = pSprite->x; - int y = pSprite->y; - int z = pSprite->z; + vec3_t pos = pSprite->pos; int nSector2 = pSprite->sectnum; clipmoveboxtracenum = 1; const short bakSpriteCstat = pSprite->cstat; @@ -5390,7 +5388,7 @@ int MoveMissile(DBloodActor* actor) enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy pSprite->cstat &= ~257; // remove self collisions for accurate clipmove } - Collision clipmoveresult = ClipMove(&x, &y, &z, &nSector2, vx, vy, pSprite->clipdist << 2, (z - top) / 4, (bottom - z) / 4, CLIPMASK0); + Collision clipmoveresult = ClipMove(&pos, &nSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0); enginecompatibility_mode = bakCompat; // restore pSprite->cstat = bakSpriteCstat; clipmoveboxtracenum = 3; @@ -5412,8 +5410,8 @@ int MoveMissile(DBloodActor* actor) else { int32_t fz, cz; - getzsofslope(wall[clipmoveresult.index].nextsector, x, y, &cz, &fz); - if (z <= cz || z >= fz) cliptype = 0; + getzsofslope(wall[clipmoveresult.index].nextsector, pos.x, pos.y, &cz, &fz); + if (pos.z <= cz || pos.z >= fz) cliptype = 0; else cliptype = 4; } } @@ -5440,15 +5438,15 @@ int MoveMissile(DBloodActor* actor) if (cliptype >= 0 && cliptype != 3) { int nAngle = getangle(actor->xvel(), actor->yvel()); - x -= MulScale(Cos(nAngle), 16, 30); - y -= MulScale(Sin(nAngle), 16, 30); + pos.x -= MulScale(Cos(nAngle), 16, 30); + pos.y -= MulScale(Sin(nAngle), 16, 30); int nVel = approxDist(actor->xvel(), actor->yvel()); vz -= scale(0x100, actor->zvel(), nVel); - updatesector(x, y, &nSector); + updatesector(pos.x, pos.y, &nSector); nSector2 = nSector; } int ceilZ, ceilHit, floorZ, floorHit; - GetZRangeAtXYZ(x, y, z, nSector2, &ceilZ, &ceilHit, &floorZ, &floorHit, pSprite->clipdist << 2, CLIPMASK0); + GetZRangeAtXYZ(pos.x, pos.y, pos.z, nSector2, &ceilZ, &ceilHit, &floorZ, &floorHit, pSprite->clipdist << 2, CLIPMASK0); GetActorExtents(actor, &top, &bottom); top += vz; bottom += vz; @@ -5464,10 +5462,9 @@ int MoveMissile(DBloodActor* actor) vz += ClipLow(ceilZ - top, 0); cliptype = 1; } - pSprite->x = x; - pSprite->y = y; - pSprite->z = z + vz; - updatesector(x, y, &nSector); + pSprite->pos = pos; + pSprite->z += vz; + updatesector(pos.x, pos.y, &nSector); if (nSector >= 0 && nSector != pSprite->sectnum) { assert(nSector >= 0 && nSector < kMaxSectors); diff --git a/source/games/blood/src/gameutil.cpp b/source/games/blood/src/gameutil.cpp index 1475de6f1..a5c706cf5 100644 --- a/source/games/blood/src/gameutil.cpp +++ b/source/games/blood/src/gameutil.cpp @@ -730,16 +730,14 @@ int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3) return approxDist(t1-x1, t2-y1); } -unsigned int ClipMove(int *x, int *y, int *z, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask) +unsigned int ClipMove(vec3_t *pos, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask) { - int bakX = *x; - int bakY = *y; - int bakZ = *z; + auto opos = *pos; short bakSect = *nSector; - unsigned int nRes = clipmove_old((int32_t*)x, (int32_t*)y, (int32_t*)z, &bakSect, xv<<14, yv<<14, wd, cd, fd, nMask); + unsigned int nRes = clipmove(pos, &bakSect, xv<<14, yv<<14, wd, cd, fd, nMask); if (bakSect == -1) { - *x = bakX; *y = bakY; *z = bakZ; + *pos = opos; } else { diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h index ce08ba8f0..95d43be39 100644 --- a/source/games/blood/src/gameutil.h +++ b/source/games/blood/src/gameutil.h @@ -89,7 +89,7 @@ int VectorScan(spritetype *pSprite, int nOffset, int nZOffset, int dx, int dy, i void GetZRange(spritetype *pSprite, int *ceilZ, int *ceilHit, int *floorZ, int *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0); void GetZRangeAtXYZ(int x, int y, int z, int nSector, int *ceilZ, int *ceilHit, int *floorZ, int *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(int *x, int *y, int *z, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask); +unsigned int ClipMove(vec3_t* pos, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask); int GetClosestSectors(int nSector, int x, int y, int nDist, short *pSectors, char *pSectBit); int GetClosestSpriteSectors(int nSector, int x, int y, int nDist, uint8_t *pSectBit, short *pWalls = nullptr, bool newSectCheckMethod = false); int picWidth(short nPic, short repeat); diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 6d5fe6040..2c4fd7ecc 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -1592,7 +1592,7 @@ void debrisMove(int listIndex) short oldcstat = pSprite->cstat; pSprite->cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN); - moveHit = gSpriteHit[nXSprite].hit = ClipMove((int*)&pSprite->x, (int*)&pSprite->y, (int*)&pSprite->z, &nSector, xvel[nSprite] >> 12, + moveHit = gSpriteHit[nXSprite].hit = ClipMove(&pSprite->pos, &nSector, xvel[nSprite] >> 12, yvel[nSprite] >> 12, clipDist, ceilDist, floorDist, CLIPMASK0); pSprite->cstat = oldcstat; diff --git a/source/games/blood/src/prediction.cpp b/source/games/blood/src/prediction.cpp index 69403dd43..6fe4ce1fa 100644 --- a/source/games/blood/src/prediction.cpp +++ b/source/games/blood/src/prediction.cpp @@ -383,7 +383,7 @@ static void fakeMoveDude(spritetype *pSprite) { short bakCstat = pSprite->cstat; pSprite->cstat &= ~257; - predict.at75.hit = ClipMove(&predict.x, &predict.y, &predict.z, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0); + predict.at75.hit = ClipMove(&predict.pos, &nSector, predict.xvel >> 12, predict.yvel >> 12, wd, tz, bz, CLIPMASK0); if (nSector == -1) nSector = predict.sectnum; diff --git a/source/games/blood/src/view.h b/source/games/blood/src/view.h index aefecfdb4..ac6e9b3c0 100644 --- a/source/games/blood/src/view.h +++ b/source/games/blood/src/view.h @@ -51,9 +51,13 @@ struct VIEW { int at44; int at48; // posture double spin; // spin - int x; // x - int y; // y - int z; // z + union { + struct + { + int32_t x, y, z; + }; + vec3_t pos; + }; int xvel; //xvel int yvel; //yvel int zvel; //zvel