From 85e4022f7703b0be3906a506660095145552556e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 16 Sep 2022 19:11:26 +0200 Subject: [PATCH] - foatified GibWall --- source/games/blood/src/common_game.h | 22 +++++++++++++++ source/games/blood/src/gib.cpp | 41 ++++++++++++++-------------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/source/games/blood/src/common_game.h b/source/games/blood/src/common_game.h index 58c55daef..e954c6c74 100644 --- a/source/games/blood/src/common_game.h +++ b/source/games/blood/src/common_game.h @@ -542,6 +542,16 @@ inline unsigned int Random(int a1) return MulScale(wrand(), a1, 15); } +inline double RandomX(double a1) +{ + return FixedToFloat<4>(Random(FloatToFixed<4>(a1))); +} + +inline double RandomZ(double a1) +{ + return FixedToFloat<8>(Random(FloatToFixed<8>(a1))); +} + inline DAngle RandomAngle(int base = 2048) { return DAngle::fromBuild(MulScale(wrand(), base, 15)); @@ -557,6 +567,18 @@ inline double Random2F(int a1) return FixedToFloat(MulScale(wrand(), a1, 14) - a1); } +inline double Random2X(double a1) +{ + return FixedToFloat<4>(Random2(FloatToFixed<4>(a1))); +} + +inline double Random2Z(double a1) +{ + return FixedToFloat<8>(Random2(FloatToFixed<8>(a1))); +} + + + inline int Random3(int a1) { return MulScale(wrand() + wrand(), a1, 15) - a1; diff --git a/source/games/blood/src/gib.cpp b/source/games/blood/src/gib.cpp index 02023a867..87d343291 100644 --- a/source/games/blood/src/gib.cpp +++ b/source/games/blood/src/gib.cpp @@ -447,17 +447,18 @@ void GibSprite(DBloodActor* actor, GIBTYPE nGibType, DVector3* pPos, CGibVelocit // //--------------------------------------------------------------------------- -void GibFX(walltype* pWall, GIBFX* pGFX, int a3, int a4, int a5, int a6, CGibVelocity* pVel) +void GibFX(walltype* pWall, GIBFX* pGFX, double ceilZ, const DVector3& spread, CGibVelocity* pVel) { assert(pWall); int nCount = ChanceToCount(pGFX->chance, pGFX->at9); auto pSector = pWall->sectorp(); for (int i = 0; i < nCount; i++) { - int r1 = Random(a6); - int r2 = Random(a5); - int r3 = Random(a4); - auto pGib = gFX.fxSpawnActor(pGFX->fxId, pSector, pWall->wall_int_pos().X + r3, pWall->wall_int_pos().Y + r2, a3 + r1, 0); + DVector3 r; + r.Z = RandomZ(spread.Z) + ceilZ; + r.Y = RandomX(spread.Y) + pWall->pos.Y; + r.X = RandomX(spread.X) + pWall->pos.X; + auto pGib = gFX.fxSpawnActor(pGFX->fxId, pSector, r, 0); if (pGib) { if (pGFX->at1 < 0) @@ -488,30 +489,30 @@ void GibWall(walltype* pWall, GIBTYPE nGibType, CGibVelocity* pVel) { assert(pWall); assert(nGibType >= 0 && nGibType < kGibMax); - int cx, cy, cz, wx, wy, wz; - cx = (pWall->wall_int_pos().X + pWall->point2Wall()->wall_int_pos().X) >> 1; - cy = (pWall->wall_int_pos().Y + pWall->point2Wall()->wall_int_pos().Y) >> 1; + DVector3 center; + center.XY() = pWall->center(); + auto pSector = pWall->sectorp(); - int32_t ceilZ, floorZ; - getzsofslopeptr(pSector, cx, cy, &ceilZ, &floorZ); - int32_t ceilZ2, floorZ2; - getzsofslopeptr(pWall->nextSector(), cx, cy, &ceilZ2, &floorZ2); + double ceilZ, floorZ; + getzsofslopeptr(pSector, center, &ceilZ, &floorZ); + double ceilZ2, floorZ2; + getzsofslopeptr(pWall->nextSector(), center, &ceilZ2, &floorZ2); - ceilZ = ClipLow(ceilZ, ceilZ2); - floorZ = ClipHigh(floorZ, floorZ2); - wz = floorZ - ceilZ; - wx = pWall->point2Wall()->wall_int_pos().X - pWall->wall_int_pos().X; - wy = pWall->point2Wall()->wall_int_pos().Y - pWall->wall_int_pos().Y; - cz = (ceilZ + floorZ) >> 1; + ceilZ = max(ceilZ, ceilZ2); + floorZ = min(floorZ, floorZ2); + DVector3 w; + w.Z = floorZ - ceilZ; + w.XY() = pWall->delta(); + center.Z = (ceilZ + floorZ) * 0.5; GIBLIST* pGib = &gibList[nGibType]; - sfxPlay3DSound(cx, cy, cz, pGib->at10, pSector); + sfxPlay3DSound(center, pGib->at10, pSector); for (int i = 0; i < pGib->Kills; i++) { GIBFX* pGibFX = &pGib->gibFX[i]; assert(pGibFX->chance > 0); - GibFX(pWall, pGibFX, ceilZ, wx, wy, wz, pVel); + GibFX(pWall, pGibFX, ceilZ, w, pVel); } }