diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index 920753bfe..66b443774 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -1284,9 +1284,9 @@ enum ShrapType struct TARGET_SORT { DSWActor* actor; - int16_t dang; - int dist; - int weight; + DAngle dangle; + double dst; + double weight; }; enum { MAX_TARGET_SORT = 16 }; @@ -1732,8 +1732,12 @@ inline Collision move_sprite(DSWActor* actor, const DVector3& change, double cei Collision move_missile(DSWActor* actor, const DVector3& change, double ceildist, double flordist, uint32_t cliptype, int numtics); +DSWActor* DoPickTarget(DSWActor*, DAngle max_delta_ang, int skip_targets); -DSWActor* DoPickTarget(DSWActor*, uint32_t max_delta_ang, int skip_targets); +DSWActor* DoPickTarget(DSWActor* a, uint32_t max_delta_ang, int skip_targets) +{ + return DoPickTarget(a, DAngle::fromBuild(max_delta_ang), skip_targets); +} void change_actor_stat(DSWActor* actor, int stat, bool quick = false); void SetOwner(DSWActor*, DSWActor*, bool flag = true); diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 400e4589f..176c94128 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1116,26 +1116,25 @@ static int CompareTarget(void const * a, void const * b) auto tgt2 = (TARGET_SORT const *)b; // will return a number less than 0 if tgt1 < tgt2 - return tgt2->weight - tgt1->weight; + return Sgn(tgt2->weight - tgt1->weight); } bool FAFcansee(int32_t xs, int32_t ys, int32_t zs, int16_t sects, int32_t xe, int32_t ye, int32_t ze, int16_t secte); -DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets) +DSWActor* DoPickTarget(DSWActor* actor, DAngle max_delta_ang, int skip_targets) { - const int PICK_DIST = 40000; + const int PICK_DIST = 2500; + - short angle2, delta_ang; - int dist; int16_t* shp; unsigned ndx; TARGET_SORT* ts; - int ang_weight, dist_weight; + double ang_weight, dist_weight; // !JIM! Watch out for max_delta_ang of zero! - if (max_delta_ang == 0) max_delta_ang = 1; + if (max_delta_ang == nullAngle) max_delta_ang = minAngle; TargetSortCount = 0; TargetSort[0].actor = nullptr; @@ -1160,8 +1159,8 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets } // Only look at closest ones - //if ((dist = Distance(actor->spr.x, actor->spr.y, itActor->spr.x, itActor->spr.y)) > PICK_DIST) - if ((dist = FindDistance3D(actor->int_pos() - itActor->int_pos())) > PICK_DIST) + double dist = (actor->spr.pos - itActor->spr.pos).Length(); + if (dist > PICK_DIST) continue; if (skip_targets != 2) // Used for spriteinfo mode @@ -1172,15 +1171,15 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets } // Get the angle to the player - angle2 = NORM_ANGLE(getangle(itActor->int_pos().X - actor->int_pos().X, itActor->int_pos().Y - actor->int_pos().Y)); + DAngle angle2 = VecToAngle(itActor->spr.pos - actor->spr.pos); // Get the angle difference // delta_ang = abs(pp->angle.ang.Buildang() - angle2); - delta_ang = short(abs(getincangle(angle2, actor->int_ang()))); + DAngle delta_ang = absangle(angle2, actor->spr.angle); // If delta_ang not in the range skip this one - if (delta_ang > (int)max_delta_ang) + if (delta_ang > max_delta_ang) continue; DVector3 apos = actor->spr.pos; @@ -1207,7 +1206,7 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets { for (ndx = 0; ndx < SIZ(TargetSort); ndx++) { - if (dist < TargetSort[ndx].dist) + if (dist < TargetSort[ndx].dst) break; } @@ -1221,12 +1220,12 @@ DSWActor* DoPickTarget(DSWActor* actor, uint32_t max_delta_ang, int skip_targets ts = &TargetSort[ndx]; ts->actor = itActor; - ts->dang = delta_ang; - ts->dist = dist; + ts->dangle = delta_ang; + ts->dst = dist; // gives a value between 0 and 65535 - ang_weight = IntToFixed(max_delta_ang - ts->dang)/max_delta_ang; + ang_weight = (max_delta_ang.Degrees() - ts->dangle.Degrees()) / max_delta_ang.Degrees(); // gives a value between 0 and 65535 - dist_weight = IntToFixed((PICK_DIST / 2) - ((ts->dist) >> 1)) / (PICK_DIST / 2); + dist_weight = ((PICK_DIST - ts->dst) / PICK_DIST); //weighted average ts->weight = (ang_weight + dist_weight*4)/5;