Rename confusing front line methods/members.

This commit is contained in:
Dan Albert 2022-09-11 14:01:28 -07:00 committed by Raffson
parent 900948f7c2
commit 46ddd884a2
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
3 changed files with 32 additions and 32 deletions

View File

@ -54,7 +54,7 @@ class FrontLineConflictDescription:
def frontline_position( def frontline_position(
cls, frontline: FrontLine, theater: ConflictTheater, settings: Settings cls, frontline: FrontLine, theater: ConflictTheater, settings: Settings
) -> Tuple[Point, Heading]: ) -> Tuple[Point, Heading]:
attack_heading = frontline.attack_heading attack_heading = frontline.blue_forward_heading
position = cls.find_ground_position( position = cls.find_ground_position(
frontline.position, frontline.position,
settings.max_frontline_length * 1000, settings.max_frontline_length * 1000,

View File

@ -23,10 +23,12 @@ class FrontLineJs(BaseModel):
@staticmethod @staticmethod
def for_front_line(front_line: FrontLine) -> FrontLineJs: def for_front_line(front_line: FrontLine) -> FrontLineJs:
a = front_line.position.point_from_heading( a = front_line.position.point_from_heading(
front_line.attack_heading.right.degrees, nautical_miles(2).meters front_line.blue_forward_heading.right.degrees,
nautical_miles(2).meters,
) )
b = front_line.position.point_from_heading( b = front_line.position.point_from_heading(
front_line.attack_heading.left.degrees, nautical_miles(2).meters front_line.blue_forward_heading.left.degrees,
nautical_miles(2).meters,
) )
return FrontLineJs(id=front_line.id, extents=[a.latlng(), b.latlng()]) return FrontLineJs(id=front_line.id, extents=[a.latlng(), b.latlng()])

View File

@ -28,12 +28,12 @@ class FrontLineSegment:
point_b: Point point_b: Point
@property @property
def attack_heading(self) -> Heading: def blue_forward_heading(self) -> Heading:
"""The heading of the frontline segment from player to enemy control point""" """The heading toward the start of the next red segment or red base."""
return Heading.from_degrees(self.point_a.heading_between_point(self.point_b)) return Heading.from_degrees(self.point_a.heading_between_point(self.point_b))
@property @property
def attack_distance(self) -> float: def length(self) -> float:
"""Length of the segment""" """Length of the segment"""
return self.point_a.distance_to_point(self.point_b) return self.point_a.distance_to_point(self.point_b)
@ -81,7 +81,7 @@ class FrontLine(MissionTarget):
return hash(id(self)) return hash(id(self))
def _compute_position(self) -> Point: def _compute_position(self) -> Point:
return self.point_from_a(self._position_distance) return self.point_along_route_from_blue(self._blue_route_progress)
def update_position(self) -> None: def update_position(self) -> None:
self.position = self._compute_position() self.position = self._compute_position()
@ -122,54 +122,52 @@ class FrontLine(MissionTarget):
return self.blue_cp, self.red_cp return self.blue_cp, self.red_cp
@property @property
def attack_distance(self) -> float: def route_length(self) -> float:
"""The total distance of all segments""" """The total distance of all segments"""
return sum(i.attack_distance for i in self.segments) return sum(i.length for i in self.segments)
@property @property
def attack_heading(self) -> Heading: def blue_forward_heading(self) -> Heading:
"""The heading of the active attack segment from player to enemy control point""" """The heading toward the start of the next red segment or red base."""
return self.active_segment.attack_heading return self.active_segment.blue_forward_heading
@property @property
def active_segment(self) -> FrontLineSegment: def active_segment(self) -> FrontLineSegment:
"""The FrontLine segment where there can be an active conflict""" """The FrontLine segment where there can be an active conflict"""
if self._position_distance <= self.segments[0].attack_distance: if self._blue_route_progress <= self.segments[0].length:
return self.segments[0] return self.segments[0]
remaining_dist = self._position_distance distance_to_segment = self._blue_route_progress
for segment in self.segments: for segment in self.segments:
if remaining_dist <= segment.attack_distance: if distance_to_segment <= segment.length:
return segment return segment
else: else:
remaining_dist -= segment.attack_distance distance_to_segment -= segment.length
logging.error( logging.error(
"Frontline attack distance is greater than the sum of its segments" "Frontline attack distance is greater than the sum of its segments"
) )
return self.segments[0] return self.segments[0]
def point_from_a(self, distance: float) -> Point: def point_along_route_from_blue(self, distance: float) -> Point:
""" """Returns a point {distance} away from control_point_a along the route."""
Returns a point {distance} away from control_point_a along the frontline segments. if distance < self.segments[0].length:
"""
if distance < self.segments[0].attack_distance:
return self.blue_cp.position.point_from_heading( return self.blue_cp.position.point_from_heading(
self.segments[0].attack_heading.degrees, distance self.segments[0].blue_forward_heading.degrees, distance
) )
remaining_dist = distance remaining_dist = distance
for segment in self.segments: for segment in self.segments:
if remaining_dist < segment.attack_distance: if remaining_dist < segment.length:
return segment.point_a.point_from_heading( return segment.point_a.point_from_heading(
segment.attack_heading.degrees, remaining_dist segment.blue_forward_heading.degrees, remaining_dist
) )
else: else:
remaining_dist -= segment.attack_distance remaining_dist -= segment.length
raise RuntimeError( raise RuntimeError(
f"Could not find front line point {distance} from {self.blue_cp}" f"Could not find front line point {distance} from {self.blue_cp}"
) )
@property @property
def _position_distance(self) -> float: def _blue_route_progress(self) -> float:
""" """
The distance from point "a" where the conflict should occur The distance from point "a" where the conflict should occur
according to the current strength of each control point according to the current strength of each control point
@ -178,20 +176,20 @@ class FrontLine(MissionTarget):
if self.blue_cp.base.strength == 0: if self.blue_cp.base.strength == 0:
return self._adjust_for_min_dist(0) return self._adjust_for_min_dist(0)
if self.red_cp.base.strength == 0: if self.red_cp.base.strength == 0:
return self._adjust_for_min_dist(self.attack_distance) return self._adjust_for_min_dist(self.route_length)
strength_pct = self.blue_cp.base.strength / total_strength strength_pct = self.blue_cp.base.strength / total_strength
return self._adjust_for_min_dist(strength_pct * self.attack_distance) return self._adjust_for_min_dist(strength_pct * self.route_length)
def _adjust_for_min_dist(self, distance: float) -> float: def _adjust_for_min_dist(self, distance: float) -> float:
""" """
Ensures the frontline conflict is never located within the minimum distance Ensures the frontline conflict is never located within the minimum distance
constant of either end control point. constant of either end control point.
""" """
if (distance > self.attack_distance / 2) and ( if (distance > self.route_length / 2) and (
distance + FRONTLINE_MIN_CP_DISTANCE > self.attack_distance distance + FRONTLINE_MIN_CP_DISTANCE > self.route_length
): ):
distance = self.attack_distance - FRONTLINE_MIN_CP_DISTANCE distance = self.route_length - FRONTLINE_MIN_CP_DISTANCE
elif (distance < self.attack_distance / 2) and ( elif (distance < self.route_length / 2) and (
distance < FRONTLINE_MIN_CP_DISTANCE distance < FRONTLINE_MIN_CP_DISTANCE
): ):
distance = FRONTLINE_MIN_CP_DISTANCE distance = FRONTLINE_MIN_CP_DISTANCE