diff --git a/game/event/frontlineattack.py b/game/event/frontlineattack.py index e3a6d05b..6efb896d 100644 --- a/game/event/frontlineattack.py +++ b/game/event/frontlineattack.py @@ -30,7 +30,7 @@ class FrontlineAttackEvent(Event): def is_successfull(self, debriefing: Debriefing): alive_attackers = sum([v for k, v in debriefing.alive_units[self.attacker_name].items() if db.unit_task(k) == PinpointStrike]) alive_defenders = sum([v for k, v in debriefing.alive_units[self.defender_name].items() if db.unit_task(k) == PinpointStrike]) - attackers_success = (float(alive_attackers) / alive_defenders) > self.SUCCESS_FACTOR + attackers_success = (float(alive_attackers) / alive_defenders + 0.01) > self.SUCCESS_FACTOR if self.from_cp.captured: return attackers_success else: diff --git a/game/event/frontlinepatrol.py b/game/event/frontlinepatrol.py index df22d210..1643691a 100644 --- a/game/event/frontlinepatrol.py +++ b/game/event/frontlinepatrol.py @@ -42,7 +42,7 @@ class FrontlinePatrolEvent(Event): def is_successfull(self, debriefing: Debriefing): alive_attackers = sum([v for k, v in debriefing.alive_units[self.attacker_name].items() if db.unit_task(k) == PinpointStrike]) alive_defenders = sum([v for k, v in debriefing.alive_units[self.defender_name].items() if db.unit_task(k) == PinpointStrike]) - attackers_success = (float(alive_attackers) / alive_defenders) >= self.SUCCESS_FACTOR + attackers_success = (float(alive_attackers) / alive_defenders + 0.01) >= self.SUCCESS_FACTOR if self.from_cp.captured: return attackers_success else: diff --git a/game/event/insurgentattack.py b/game/event/insurgentattack.py index dbc068f7..a530507e 100644 --- a/game/event/insurgentattack.py +++ b/game/event/insurgentattack.py @@ -9,14 +9,27 @@ from game.event.frontlineattack import FrontlineAttackEvent from game.operation.insurgentattack import InsurgentAttackOperation -class InsurgentAttackEvent(FrontlineAttackEvent): - def __str__(self): - return "Destroy insurgents at {}".format(self.to_cp) +class InsurgentAttackEvent(Event): + SUCCESS_FACTOR = 0.7 + TARGET_VARIETY = 2 + TARGET_AMOUNT_FACTOR = 0.5 @property def threat_description(self): return "" + def __str__(self): + return "Destroy insurgents at {}".format(self.to_cp) + + def is_successfull(self, debriefing: Debriefing): + killed_units = sum([v for k, v in debriefing.destroyed_units[self.attacker_name].items() if db.unit_task(k) == PinpointStrike]) + all_units = sum(self.targets.values()) + attackers_success = (float(killed_units) / all_units + 0.01) > self.SUCCESS_FACTOR + if self.from_cp.captured: + return attackers_success + else: + return not attackers_success + def player_defending(self, strikegroup: db.PlaneDict, clients: db.PlaneDict): suitable_unittypes = db.find_unittype(Reconnaissance, self.attacker_name) random.shuffle(suitable_unittypes) diff --git a/game/game.py b/game/game.py index 9c0d02f3..3ec99636 100644 --- a/game/game.py +++ b/game/game.py @@ -50,7 +50,7 @@ Events: EVENT_PROBABILITIES = { BaseAttackEvent: [100, 10], FrontlineAttackEvent: [100, 0], - FrontlinePatrolEvent: [1000, 0], + FrontlinePatrolEvent: [100, 0], InterceptEvent: [25, 10], InsurgentAttackEvent: [0, 10], NavalInterceptEvent: [25, 10], @@ -217,13 +217,15 @@ class Game: else: print("finish_event: event not in the events!") - def is_player_attack(self, event: Event): - return event.attacker_name == self.player + def is_player_attack(self, event): + if isinstance(event, Event): + return event.attacker_name == self.player + else: + return event.name == self.player def pass_turn(self, no_action=False, ignored_cps: typing.Collection[ControlPoint]=None): for event in self.events: - if isinstance(event, UnitsDeliveryEvent): - event.skip() + event.skip() if not no_action: self._budget_player() diff --git a/game/operation/operation.py b/game/operation/operation.py index 677f3a91..8a6cedd7 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -81,7 +81,13 @@ class Operation: self.awacsgen.generate(self.is_awacs_enabled) self.extra_aagen.generate() - self.triggersgen.generate(self.is_quick, self.trigger_radius) + + if self.game.is_player_attack(self.conflict.attackers_side): + cp = self.conflict.from_cp + else: + cp = self.conflict.to_cp + + self.triggersgen.generate(cp, self.is_quick, self.trigger_radius) if self.environment_settings is None: self.environment_settings = self.envgen.generate() diff --git a/gen/armor.py b/gen/armor.py index 586f4601..d0b0f9fd 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -63,7 +63,7 @@ class ArmorConflictGenerator: if defenders: def_pos = position.point_from_heading(self.conflict.heading + 90, 4000) - def_dest = position.point_from_heading(self.conflict.heading + 90, 25000) + def_dest = position.point_from_heading(self.conflict.heading - 90, 25000) for type, count in defenders.items(): self._generate_group( side=self.conflict.defenders_side, diff --git a/gen/triggergen.py b/gen/triggergen.py index 7c79f553..3c564b6c 100644 --- a/gen/triggergen.py +++ b/gen/triggergen.py @@ -38,7 +38,7 @@ class TriggersGenerator: self.conflict = conflict self.game = game - def _gen_activation_trigger(self, radius: int, player_coalition: str, enemy_coalition: str): + def _gen_activation_trigger(self, radius: int, player_cp: ControlPoint, player_coalition: str, enemy_coalition: str): activate_by_trigger = [] for coalition_name, coalition in self.mission.coalition.items(): for country in coalition.countries.values(): @@ -51,7 +51,7 @@ class TriggersGenerator: vehicle_group.late_activation = True activate_by_trigger.append(vehicle_group) - conflict_distance = self.conflict.from_cp.position.distance_to_point(self.conflict.position) + conflict_distance = player_cp.position.distance_to_point(self.conflict.position) minimum_radius = max(conflict_distance - TRIGGER_MIN_DISTANCE_FROM_START, TRIGGER_RADIUS_MINIMUM) if minimum_radius < 0: minimum_radius = 0 @@ -67,7 +67,7 @@ class TriggersGenerator: self.mission.triggerrules.triggers.append(activation_trigger) - def _gen_push_trigger(self, player_coalition: str): + def _gen_push_trigger(self, player_cp: ControlPoint, player_coalition: str): push_by_trigger = [] for coalition_name, coalition in self.mission.coalition.items(): for country in coalition.countries.values(): @@ -76,7 +76,7 @@ class TriggersGenerator: if plane_group.task == AWACS.name or plane_group.task == Refueling.name: continue - regroup_heading = self.conflict.to_cp.position.heading_between_point(self.conflict.from_cp.position) + regroup_heading = self.conflict.to_cp.position.heading_between_point(player_cp.position) pos1 = plane_group.position.point_from_heading(regroup_heading, REGROUP_ZONE_DISTANCE) pos2 = plane_group.position.point_from_heading(regroup_heading, REGROUP_ZONE_DISTANCE+5000) @@ -99,7 +99,7 @@ class TriggersGenerator: plane_group.add_trigger_action(SwitchWaypoint(to_waypoint=4)) push_by_trigger.append(plane_group) - push_trigger_zone = self.mission.triggers.add_triggerzone(self.conflict.from_cp.position, PUSH_TRIGGER_SIZE, name="Push zone") + push_trigger_zone = self.mission.triggers.add_triggerzone(player_cp.position, PUSH_TRIGGER_SIZE, name="Push zone") push_trigger = TriggerOnce(Event.NoEvent, "Push trigger") for group in push_by_trigger: @@ -136,7 +136,7 @@ class TriggersGenerator: for vehicle_group in country.vehicle_group: vehicle_group.set_skill(Skill(skill_level)) - def generate(self, is_quick: bool, activation_trigger_radius: int): + def generate(self, player_cp: ControlPoint, is_quick: bool, activation_trigger_radius: int): player_coalition = self.game.player == "USA" and "blue" or "red" enemy_coalition = player_coalition == "blue" and "red" or "blue" @@ -148,6 +148,6 @@ class TriggersGenerator: if not is_quick: # TODO: waypoint parts of this should not be post-hacked but added in airgen - self._gen_activation_trigger(activation_trigger_radius, player_coalition, enemy_coalition) - self._gen_push_trigger(player_coalition) + self._gen_activation_trigger(activation_trigger_radius, player_cp, player_coalition, enemy_coalition) + self._gen_push_trigger(player_cp, player_coalition) diff --git a/start.bat b/start.bat index dfd9b9e8..bf73def9 100644 --- a/start.bat +++ b/start.bat @@ -1 +1 @@ -py.exe __init__.py %UserProfile% > logs.txt 2>&1 +py.exe __init__.py "%UserProfile%" > logs.txt 2>&1 diff --git a/theater/persiangulf.py b/theater/persiangulf.py index bdac7a97..c3cc2e92 100644 --- a/theater/persiangulf.py +++ b/theater/persiangulf.py @@ -19,27 +19,27 @@ class PersianGulfTheater(ConflictTheater): "night": (0, 5), } - al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_LOW) - al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_LOW) - al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, IMPORTANCE_LOW) - sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.1) + al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_HIGH) + al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) + al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + sir_abu_nuayr = ControlPoint.from_airport(persiangulf.Sir_Abu_Nuayr, [0, 330], SIZE_SMALL, 1.3) - dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, 1.3) - sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.2) - fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, 1.3) - khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, 1.3) + dubai = ControlPoint.from_airport(persiangulf.Dubai_Intl, COAST_DL_E, SIZE_LARGE, IMPORTANCE_HIGH) + sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.3) + fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, IMPORTANCE_HIGH) + khasab = ControlPoint.from_airport(persiangulf.Khasab, LAND, SIZE_SMALL, IMPORTANCE_HIGH) - sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, 1.2, has_frontline=False) - abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, 1.0, has_frontline=False) - tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], SIZE_REGULAR, 1.1, has_frontline=False) - tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, IMPORTANCE_HIGH, has_frontline=False) + sirri = ControlPoint.from_airport(persiangulf.Sirri_Island, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_LOW, has_frontline=False) + abu_musa = ControlPoint.from_airport(persiangulf.Abu_Musa_Island_Airport, LAND, SIZE_SMALL, IMPORTANCE_MEDIUM, has_frontline=False) + tunb_island = ControlPoint.from_airport(persiangulf.Tunb_Island_AFB, [0, 270, 330], IMPORTANCE_LOW, 1.1, has_frontline=False) + tunb_kochak = ControlPoint.from_airport(persiangulf.Tunb_Kochak, [135, 180], SIZE_SMALL, 1.2, has_frontline=False) - bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, IMPORTANCE_HIGH) + bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, 1.1) qeshm = ControlPoint.from_airport(persiangulf.Qeshm_Island, [270, 315, 0, 45, 90, 135, 180], SIZE_SMALL, 1.1, has_frontline=False) - havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_HIGH) - bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, IMPORTANCE_HIGH) - lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_HIGH) + havadarya = ControlPoint.from_airport(persiangulf.Havadarya, COAST_DL_W, SIZE_REGULAR, IMPORTANCE_LOW) + bandar_abbas = ControlPoint.from_airport(persiangulf.Bandar_Abbas_Intl, LAND, SIZE_BIG, 1.3) + lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_LOW) west_carrier = ControlPoint.carrier("East carrier", Point(-100531.972946, 60939.275818)) @@ -61,7 +61,7 @@ class PersianGulfTheater(ConflictTheater): self.add_controlpoint(self.tunb_island, connected_to=[self.khasab, self.qeshm, self.tunb_kochak]) self.add_controlpoint(self.bandar_lengeh, connected_to=[self.tunb_island, self.lar, self.qeshm]) - self.add_controlpoint(self.qeshm, connected_to=[self.bandar_lengeh, self.havadarya, self.tunb_island]) + self.add_controlpoint(self.qeshm, connected_to=[self.bandar_lengeh, self.havadarya, self.tunb_island, self.lar]) self.add_controlpoint(self.havadarya, connected_to=[self.lar, self.qeshm, self.bandar_abbas]) self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya]) self.add_controlpoint(self.lar, connected_to=[self.bandar_lengeh, self.qeshm, self.havadarya]) @@ -69,7 +69,7 @@ class PersianGulfTheater(ConflictTheater): self.add_controlpoint(self.west_carrier) self.west_carrier.captured = True - self.al_dhafra.captured = True + self.lar.captured = True """ Mid game: