From 7bb41d07b355a31745dc8792d79f31d9d4b0f949 Mon Sep 17 00:00:00 2001 From: RndName Date: Fri, 7 Jan 2022 09:59:14 +0100 Subject: [PATCH] Revert "Remove front line minimum distance." This reverts commit dbe9691d --- changelog.md | 1 - game/theater/frontline.py | 24 +++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index 4b325dbe9..f99dac917 100644 --- a/changelog.md +++ b/changelog.md @@ -18,7 +18,6 @@ Saves from 5.0.0 are compatible with 5.1.0 * **[Mission Generation]** Fixed mission scripting error when using a dedicated server. * **[Mission Generation]** Fixed an issue where empty convoys lead to an index error when a point capture made a pending transfer of units not completable anymore. * **[Mission Generation]** Corrected Viggen FR22 & FR24 preset channels for the DCS 2.7.9 update -* **[Mission Generation]** Fixed an issue which prevented the mission generation if two controlpoints are really close to each other (e.g. Marianas campaigns) * **[Mission Generation]** Fixed the SA-5 Generator to use the P-19 FlatFace SR as a Fallback radar if the faction does not have access to the TinShield SR. * **[UI]** Enable / Disable the settings, save and stats actions if no game is loaded to prevent an error as these functions can only be used on a valid game. diff --git a/game/theater/frontline.py b/game/theater/frontline.py index 1d3ea9b64..98aa88f69 100644 --- a/game/theater/frontline.py +++ b/game/theater/frontline.py @@ -14,6 +14,9 @@ from ..utils import Heading, pairwise +FRONTLINE_MIN_CP_DISTANCE = 5000 + + @dataclass class FrontLineSegment: """ @@ -169,8 +172,23 @@ def _position_distance(self) -> float: """ total_strength = self.blue_cp.base.strength + self.red_cp.base.strength if self.blue_cp.base.strength == 0: - return 0 + return self._adjust_for_min_dist(0) if self.red_cp.base.strength == 0: - return self.attack_distance + return self._adjust_for_min_dist(self.attack_distance) strength_pct = self.blue_cp.base.strength / total_strength - return strength_pct * self.attack_distance + return self._adjust_for_min_dist(strength_pct * self.attack_distance) + + def _adjust_for_min_dist(self, distance: float) -> float: + """ + Ensures the frontline conflict is never located within the minimum distance + constant of either end control point. + """ + if (distance > self.attack_distance / 2) and ( + distance + FRONTLINE_MIN_CP_DISTANCE > self.attack_distance + ): + distance = self.attack_distance - FRONTLINE_MIN_CP_DISTANCE + elif (distance < self.attack_distance / 2) and ( + distance < FRONTLINE_MIN_CP_DISTANCE + ): + distance = FRONTLINE_MIN_CP_DISTANCE + return distance