mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
fixed start.bat for usernames w/ spaces; fixed triggers for player defending; minor fixes
This commit is contained in:
parent
e8098e795c
commit
e266698e68
@ -30,7 +30,7 @@ class FrontlineAttackEvent(Event):
|
|||||||
def is_successfull(self, debriefing: Debriefing):
|
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_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])
|
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:
|
if self.from_cp.captured:
|
||||||
return attackers_success
|
return attackers_success
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -42,7 +42,7 @@ class FrontlinePatrolEvent(Event):
|
|||||||
def is_successfull(self, debriefing: Debriefing):
|
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_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])
|
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:
|
if self.from_cp.captured:
|
||||||
return attackers_success
|
return attackers_success
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -9,14 +9,27 @@ from game.event.frontlineattack import FrontlineAttackEvent
|
|||||||
from game.operation.insurgentattack import InsurgentAttackOperation
|
from game.operation.insurgentattack import InsurgentAttackOperation
|
||||||
|
|
||||||
|
|
||||||
class InsurgentAttackEvent(FrontlineAttackEvent):
|
class InsurgentAttackEvent(Event):
|
||||||
def __str__(self):
|
SUCCESS_FACTOR = 0.7
|
||||||
return "Destroy insurgents at {}".format(self.to_cp)
|
TARGET_VARIETY = 2
|
||||||
|
TARGET_AMOUNT_FACTOR = 0.5
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def threat_description(self):
|
def threat_description(self):
|
||||||
return ""
|
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):
|
def player_defending(self, strikegroup: db.PlaneDict, clients: db.PlaneDict):
|
||||||
suitable_unittypes = db.find_unittype(Reconnaissance, self.attacker_name)
|
suitable_unittypes = db.find_unittype(Reconnaissance, self.attacker_name)
|
||||||
random.shuffle(suitable_unittypes)
|
random.shuffle(suitable_unittypes)
|
||||||
|
|||||||
12
game/game.py
12
game/game.py
@ -50,7 +50,7 @@ Events:
|
|||||||
EVENT_PROBABILITIES = {
|
EVENT_PROBABILITIES = {
|
||||||
BaseAttackEvent: [100, 10],
|
BaseAttackEvent: [100, 10],
|
||||||
FrontlineAttackEvent: [100, 0],
|
FrontlineAttackEvent: [100, 0],
|
||||||
FrontlinePatrolEvent: [1000, 0],
|
FrontlinePatrolEvent: [100, 0],
|
||||||
InterceptEvent: [25, 10],
|
InterceptEvent: [25, 10],
|
||||||
InsurgentAttackEvent: [0, 10],
|
InsurgentAttackEvent: [0, 10],
|
||||||
NavalInterceptEvent: [25, 10],
|
NavalInterceptEvent: [25, 10],
|
||||||
@ -217,13 +217,15 @@ class Game:
|
|||||||
else:
|
else:
|
||||||
print("finish_event: event not in the events!")
|
print("finish_event: event not in the events!")
|
||||||
|
|
||||||
def is_player_attack(self, event: Event):
|
def is_player_attack(self, event):
|
||||||
return event.attacker_name == self.player
|
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):
|
def pass_turn(self, no_action=False, ignored_cps: typing.Collection[ControlPoint]=None):
|
||||||
for event in self.events:
|
for event in self.events:
|
||||||
if isinstance(event, UnitsDeliveryEvent):
|
event.skip()
|
||||||
event.skip()
|
|
||||||
|
|
||||||
if not no_action:
|
if not no_action:
|
||||||
self._budget_player()
|
self._budget_player()
|
||||||
|
|||||||
@ -81,7 +81,13 @@ class Operation:
|
|||||||
self.awacsgen.generate(self.is_awacs_enabled)
|
self.awacsgen.generate(self.is_awacs_enabled)
|
||||||
|
|
||||||
self.extra_aagen.generate()
|
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:
|
if self.environment_settings is None:
|
||||||
self.environment_settings = self.envgen.generate()
|
self.environment_settings = self.envgen.generate()
|
||||||
|
|||||||
@ -63,7 +63,7 @@ class ArmorConflictGenerator:
|
|||||||
|
|
||||||
if defenders:
|
if defenders:
|
||||||
def_pos = position.point_from_heading(self.conflict.heading + 90, 4000)
|
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():
|
for type, count in defenders.items():
|
||||||
self._generate_group(
|
self._generate_group(
|
||||||
side=self.conflict.defenders_side,
|
side=self.conflict.defenders_side,
|
||||||
|
|||||||
@ -38,7 +38,7 @@ class TriggersGenerator:
|
|||||||
self.conflict = conflict
|
self.conflict = conflict
|
||||||
self.game = game
|
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 = []
|
activate_by_trigger = []
|
||||||
for coalition_name, coalition in self.mission.coalition.items():
|
for coalition_name, coalition in self.mission.coalition.items():
|
||||||
for country in coalition.countries.values():
|
for country in coalition.countries.values():
|
||||||
@ -51,7 +51,7 @@ class TriggersGenerator:
|
|||||||
vehicle_group.late_activation = True
|
vehicle_group.late_activation = True
|
||||||
activate_by_trigger.append(vehicle_group)
|
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)
|
minimum_radius = max(conflict_distance - TRIGGER_MIN_DISTANCE_FROM_START, TRIGGER_RADIUS_MINIMUM)
|
||||||
if minimum_radius < 0:
|
if minimum_radius < 0:
|
||||||
minimum_radius = 0
|
minimum_radius = 0
|
||||||
@ -67,7 +67,7 @@ class TriggersGenerator:
|
|||||||
|
|
||||||
self.mission.triggerrules.triggers.append(activation_trigger)
|
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 = []
|
push_by_trigger = []
|
||||||
for coalition_name, coalition in self.mission.coalition.items():
|
for coalition_name, coalition in self.mission.coalition.items():
|
||||||
for country in coalition.countries.values():
|
for country in coalition.countries.values():
|
||||||
@ -76,7 +76,7 @@ class TriggersGenerator:
|
|||||||
if plane_group.task == AWACS.name or plane_group.task == Refueling.name:
|
if plane_group.task == AWACS.name or plane_group.task == Refueling.name:
|
||||||
continue
|
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)
|
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)
|
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))
|
plane_group.add_trigger_action(SwitchWaypoint(to_waypoint=4))
|
||||||
push_by_trigger.append(plane_group)
|
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")
|
push_trigger = TriggerOnce(Event.NoEvent, "Push trigger")
|
||||||
|
|
||||||
for group in push_by_trigger:
|
for group in push_by_trigger:
|
||||||
@ -136,7 +136,7 @@ class TriggersGenerator:
|
|||||||
for vehicle_group in country.vehicle_group:
|
for vehicle_group in country.vehicle_group:
|
||||||
vehicle_group.set_skill(Skill(skill_level))
|
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"
|
player_coalition = self.game.player == "USA" and "blue" or "red"
|
||||||
enemy_coalition = player_coalition == "blue" and "red" or "blue"
|
enemy_coalition = player_coalition == "blue" and "red" or "blue"
|
||||||
|
|
||||||
@ -148,6 +148,6 @@ class TriggersGenerator:
|
|||||||
|
|
||||||
if not is_quick:
|
if not is_quick:
|
||||||
# TODO: waypoint parts of this should not be post-hacked but added in airgen
|
# 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_activation_trigger(activation_trigger_radius, player_cp, player_coalition, enemy_coalition)
|
||||||
self._gen_push_trigger(player_coalition)
|
self._gen_push_trigger(player_cp, player_coalition)
|
||||||
|
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
py.exe __init__.py %UserProfile% > logs.txt 2>&1
|
py.exe __init__.py "%UserProfile%" > logs.txt 2>&1
|
||||||
|
|||||||
@ -19,27 +19,27 @@ class PersianGulfTheater(ConflictTheater):
|
|||||||
"night": (0, 5),
|
"night": (0, 5),
|
||||||
}
|
}
|
||||||
|
|
||||||
al_dhafra = ControlPoint.from_airport(persiangulf.Al_Dhafra_AB, LAND, SIZE_BIG, IMPORTANCE_LOW)
|
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_LOW)
|
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_LOW)
|
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.1)
|
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)
|
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.2)
|
sharjah = ControlPoint.from_airport(persiangulf.Sharjah_Intl, LAND, SIZE_BIG, 1.3)
|
||||||
fujairah = ControlPoint.from_airport(persiangulf.Fujairah_Intl, COAST_V_W, SIZE_REGULAR, 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, 1.3)
|
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)
|
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, 1.0, 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], SIZE_REGULAR, 1.1, 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, IMPORTANCE_HIGH, 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)
|
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)
|
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, IMPORTANCE_HIGH)
|
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_HIGH)
|
lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_LOW)
|
||||||
|
|
||||||
west_carrier = ControlPoint.carrier("East carrier", Point(-100531.972946, 60939.275818))
|
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.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.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.havadarya, connected_to=[self.lar, self.qeshm, self.bandar_abbas])
|
||||||
self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya])
|
self.add_controlpoint(self.bandar_abbas, connected_to=[self.havadarya])
|
||||||
self.add_controlpoint(self.lar, connected_to=[self.bandar_lengeh, self.qeshm, 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.add_controlpoint(self.west_carrier)
|
||||||
|
|
||||||
self.west_carrier.captured = True
|
self.west_carrier.captured = True
|
||||||
self.al_dhafra.captured = True
|
self.lar.captured = True
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Mid game:
|
Mid game:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user