diff --git a/game/commander/tasks/packageplanningtask.py b/game/commander/tasks/packageplanningtask.py index 09ecca33..f277674d 100644 --- a/game/commander/tasks/packageplanningtask.py +++ b/game/commander/tasks/packageplanningtask.py @@ -129,7 +129,13 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]): if range_type is RangeType.Detection: target_range = target.max_detection_range() elif range_type is RangeType.Threat: - target_range = target.max_threat_range() + settings = state.context.coalition.game.settings + margin = 100 - ( + settings.ownfor_autoplanner_aggressiveness + if state.context.coalition.player + else settings.opfor_autoplanner_aggressiveness + ) + target_range = target.max_threat_range() * (margin / 100) else: raise ValueError(f"Unknown RangeType: {range_type}") if not target_range: @@ -173,15 +179,7 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]): if not ignore_iads: for iads_threat in self.iter_iads_threats(state): - # Only consider blue faction flights threatened. - # Red might still plan missions into hostile territory, - # depending on the aggressiveness setting. - if ( - state.context.coalition.player - or random.randint(1, 100) - > state.context.coalition.game.settings.opfor_autoplanner_aggressiveness - ): - threatened = True + threatened = True if iads_threat not in state.threatening_air_defenses: state.threatening_air_defenses.append(iads_threat) return not threatened diff --git a/game/settings/settings.py b/game/settings/settings.py index 9365c37c..57f29354 100644 --- a/game/settings/settings.py +++ b/game/settings/settings.py @@ -259,6 +259,19 @@ class Settings: "the auto-planner to plan an OCA strike against it." ), ) + ownfor_autoplanner_aggressiveness: int = bounded_int_option( + "OWNFOR auto-planner aggressiveness (%)", + page=CAMPAIGN_DOCTRINE_PAGE, + section=GENERAL_SECTION, + default=20, + min=0, + max=100, + detail=( + "Ratio of the threat-radius that will be ignored by the OWNFOR " + "AI-autoplanner. 0% means the entire threat-radius is considered, " + "while 100% would have the autoplanner completely ignore OPFOR air defences." + ), + ) opfor_autoplanner_aggressiveness: int = bounded_int_option( "OPFOR auto-planner aggressiveness (%)", page=CAMPAIGN_DOCTRINE_PAGE, @@ -267,9 +280,9 @@ class Settings: min=0, max=100, detail=( - "Chance (larger number -> higher chance) that the OPFOR AI " - "auto-planner will take risks and plan flights against targets " - "within threatened airspace." + "Ratio of the threat-radius that will be ignored by the OPFOR " + "AI-autoplanner. 0% means the entire threat-radius is considered, " + "while 100% would have the autoplanner completely ignore OWNFOR air defences." ), ) heli_combat_alt_agl: int = bounded_int_option(