From 39109de22f473741e3b6463b4f41830a79b016c6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 3 Sep 2022 11:54:01 +0200 Subject: [PATCH] - consolidation of Blood rotation code. 24x the same pattern merged into a subfunction. --- source/games/blood/src/actor.h | 1 + source/games/blood/src/aibat.cpp | 44 +++++-------- source/games/blood/src/aibeast.cpp | 44 +++++-------- source/games/blood/src/aiboneel.cpp | 45 +++++-------- source/games/blood/src/aicaleb.cpp | 45 +++++-------- source/games/blood/src/aigarg.cpp | 94 +++++++++++----------------- source/games/blood/src/aighost.cpp | 76 ++++++++-------------- source/games/blood/src/aigilbst.cpp | 45 +++++-------- source/games/blood/src/aiunicult.cpp | 19 +++--- source/games/blood/src/bloodactor.h | 14 +++++ 10 files changed, 159 insertions(+), 268 deletions(-) diff --git a/source/games/blood/src/actor.h b/source/games/blood/src/actor.h index 5065d2025..80389db46 100644 --- a/source/games/blood/src/actor.h +++ b/source/games/blood/src/actor.h @@ -241,4 +241,5 @@ void actBuildMissile(DBloodActor* spawned, DBloodActor* actor); extern const int16_t DudeDifficulty[]; + END_BLD_NS diff --git a/source/games/blood/src/aibat.cpp b/source/games/blood/src/aibat.cpp index b83f37da0..f0ec693d0 100644 --- a/source/games/blood/src/aibat.cpp +++ b/source/games/blood/src/aibat.cpp @@ -319,18 +319,13 @@ static void batMoveForward(DBloodActor* actor) int nDist = approxDist(dvec); if ((unsigned int)Random(64) < 32 && nDist <= 0x200) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.5); + }); } static void batMoveSwoop(DBloodActor* actor) @@ -350,15 +345,10 @@ static void batMoveSwoop(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x600) && nDist <= 0x200) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel) * 0.5; + }); actor->set_int_bvel_z(0x44444); } @@ -379,15 +369,9 @@ static void batMoveFly(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x4000) && nDist <= 0x200) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel) * 0.5; + }); actor->set_int_bvel_z(-0x2d555); } diff --git a/source/games/blood/src/aibeast.cpp b/source/games/blood/src/aibeast.cpp index e272f51c7..3902f1c06 100644 --- a/source/games/blood/src/aibeast.cpp +++ b/source/games/blood/src/aibeast.cpp @@ -422,18 +422,12 @@ static void sub_628A0(DBloodActor* actor) int nDist = approxDist(dvec); if (Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 2; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.25); + }); } static void sub_62AE0(DBloodActor* actor) @@ -458,15 +452,10 @@ static void sub_62AE0(DBloodActor* actor) int dz = z2 - z; if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel); + }); + actor->set_int_bvel_z(-dz); } @@ -492,15 +481,10 @@ static void sub_62D7C(DBloodActor* actor) int dz = (z2 - z) << 3; if (Chance(0x4000) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + }); + actor->set_int_bvel_z(dz); } diff --git a/source/games/blood/src/aiboneel.cpp b/source/games/blood/src/aiboneel.cpp index 6149a8bb9..61decba4d 100644 --- a/source/games/blood/src/aiboneel.cpp +++ b/source/games/blood/src/aiboneel.cpp @@ -331,18 +331,13 @@ static void eelMoveForward(DBloodActor* actor) int nDist = approxDist(dvec); if (nDist <= 0x399) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.5); + }); + } static void eelMoveSwoop(DBloodActor* actor) @@ -359,15 +354,10 @@ static void eelMoveSwoop(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x8000) && nDist <= 0x399) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + }); + actor->set_int_bvel_z(0x22222); } @@ -385,15 +375,10 @@ static void eelMoveAscend(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x4000) && nDist <= 0x399) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + }); + actor->set_int_bvel_z(-0x8000); } diff --git a/source/games/blood/src/aicaleb.cpp b/source/games/blood/src/aicaleb.cpp index 73b365ad7..5c2535e1d 100644 --- a/source/games/blood/src/aicaleb.cpp +++ b/source/games/blood/src/aicaleb.cpp @@ -290,18 +290,13 @@ static void sub_65D04(DBloodActor* actor) int nDist = approxDist(dvec); if (Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 2; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.25); + }); + } static void sub_65F44(DBloodActor* actor) @@ -327,15 +322,10 @@ static void sub_65F44(DBloodActor* actor) int dz = z2 - z; if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel); + }); + actor->set_int_bvel_z(-dz); } @@ -362,15 +352,10 @@ static void sub_661E0(DBloodActor* actor) int dz = (z2 - z) << 3; if (Chance(0x4000) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + }); + actor->set_int_bvel_z(dz); } diff --git a/source/games/blood/src/aigarg.cpp b/source/games/blood/src/aigarg.cpp index 395ab31bf..4e0b9a159 100644 --- a/source/games/blood/src/aigarg.cpp +++ b/source/games/blood/src/aigarg.cpp @@ -532,18 +532,13 @@ static void gargMoveForward(DBloodActor* actor) int nDist = approxDist(dvec); if ((unsigned int)Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.5); + }); + } static void gargMoveSlow(DBloodActor* actor) @@ -566,16 +561,11 @@ static void gargMoveSlow(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 = nAccel >> 1; - t2 >>= 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + t2 *= 0.5; + }); + switch (actor->spr.type) { case kDudeGargoyleFlesh: actor->set_int_bvel_z(0x44444); @@ -606,23 +596,19 @@ static void gargMoveSwoop(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); - switch (actor->spr.type) { - case kDudeGargoyleFlesh: - actor->set_int_bvel_z(t1); - break; - case kDudeGargoyleStone: - actor->set_int_bvel_z(t1); - break; - } + + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + switch (actor->spr.type) { + case kDudeGargoyleFlesh: + actor->vel.Z = t1; + break; + case kDudeGargoyleStone: + actor->vel.Z = t1; + break; + } + }); + } static void gargMoveFly(DBloodActor* actor) @@ -645,23 +631,19 @@ static void gargMoveFly(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x4000) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); - switch (actor->spr.type) { - case kDudeGargoyleFlesh: - actor->set_int_bvel_z(-t1); - break; - case kDudeGargoyleStone: - actor->set_int_bvel_z(-t1); - break; - } + + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + switch (actor->spr.type) { + case kDudeGargoyleFlesh: + actor->vel.Z = -t1; + break; + case kDudeGargoyleStone: + actor->vel.Z = -t1; + break; + } + }); + } END_BLD_NS diff --git a/source/games/blood/src/aighost.cpp b/source/games/blood/src/aighost.cpp index 3c71ea000..c4821b427 100644 --- a/source/games/blood/src/aighost.cpp +++ b/source/games/blood/src/aighost.cpp @@ -428,18 +428,12 @@ static void ghostMoveForward(DBloodActor* actor) int nDist = approxDist(dvec); if ((unsigned int)Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.5); + }); } static void ghostMoveSlow(DBloodActor* actor) @@ -462,16 +456,10 @@ static void ghostMoveSlow(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 = nAccel >> 1; - t2 >>= 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + t2 *= 0.5; + }); switch (actor->spr.type) { case kDudePhantasm: actor->set_int_bvel_z(0x44444); @@ -499,20 +487,14 @@ static void ghostMoveSwoop(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); - switch (actor->spr.type) { - case kDudePhantasm: - actor->set_int_bvel_z(t1); - break; - } + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + switch (actor->spr.type) { + case kDudePhantasm: + actor->vel.Z = t1; + break; + } + }); } static void ghostMoveFly(DBloodActor* actor) @@ -535,20 +517,14 @@ static void ghostMoveFly(DBloodActor* actor) int nDist = approxDist(dvec); if (Chance(0x4000) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); - switch (actor->spr.type) { - case kDudePhantasm: - actor->set_int_bvel_z(-t1); - break; - } + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + switch (actor->spr.type) { + case kDudePhantasm: + actor->vel.Z = -t1; + break; + } + }); } END_BLD_NS diff --git a/source/games/blood/src/aigilbst.cpp b/source/games/blood/src/aigilbst.cpp index 71f2e5b4c..bc07a0fc0 100644 --- a/source/games/blood/src/aigilbst.cpp +++ b/source/games/blood/src/aigilbst.cpp @@ -277,18 +277,13 @@ static void sub_6CB00(DBloodActor* actor) int nDist = approxDist(dvec); if (Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 2; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.25); + }); + } static void sub_6CD74(DBloodActor* actor) @@ -313,15 +308,10 @@ static void sub_6CD74(DBloodActor* actor) int dz = z2 - z; if (Chance(0x600) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel); + }); + actor->set_int_bvel_z(-dz); } @@ -347,15 +337,10 @@ static void sub_6D03C(DBloodActor* actor) int dz = (z2 - z) << 3; if (Chance(0x4000) && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + t1 += FixedToFloat(nAccel * 0.5); + }); + actor->set_int_bvel_z(dz); } diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 7a66bf042..0c960a0a8 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -1126,18 +1126,13 @@ void aiGenDudeMoveForward(DBloodActor* actor) int nDist = approxDist(dvec); if ((unsigned int)Random(64) < 32 && nDist <= 0x400) return; - int nCos = Cos(actor->int_ang()); - int nSin = Sin(actor->int_ang()); - int vx = actor->int_vel().X; - int vy = actor->int_vel().Y; - int t1 = DMulScale(vx, nCos, vy, nSin, 30); - int t2 = DMulScale(vx, nSin, -vy, nCos, 30); - if (actor->GetTarget() == nullptr) - t1 += nAccel; - else - t1 += nAccel >> 1; - actor->set_int_bvel_x(DMulScale(t1, nCos, t2, nSin, 30)); - actor->set_int_bvel_y(DMulScale(t1, nSin, -t2, nCos, 30)); + AdjustVelocity(actor, ADJUSTER{ + if (actor->GetTarget() == nullptr) + t1 += FixedToFloat(nAccel); + else + t1 += FixedToFloat(nAccel * 0.5); + }); + } else { diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index 52412e604..1b93614ed 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -174,5 +174,19 @@ inline bool IsTargetTeammate(DBloodActor* pSource, DBloodActor* pTarget) return IsTargetTeammate(pSourcePlayer, pTarget); } +template +void AdjustVelocity(DBloodActor *actor, T adjuster) +{ + double nCos = actor->spr.angle.Cos(); + double nSin = actor->spr.angle.Sin(); + double t1 = actor->vel.X * nCos + actor->vel.Y * nSin; + double t2 = actor->vel.X * nSin - actor->vel.Y * nCos; + adjuster(actor, t1, t2); + actor->vel.X = t1 * nCos + t2 * nSin; + actor->vel.Y = t1 * nSin - t2 * nCos; +} + +// just so we don't have to type this out several dozen times +#define ADJUSTER [=](DBloodActor* actor, double& t1, double& t2) END_BLD_NS