mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
update to ground objects parser; waypoints in briefings & general briefings update; minor fixes
This commit is contained in:
parent
03fc17fae6
commit
edf9efddf9
@ -49,13 +49,13 @@ Events:
|
||||
* InfantryTransportEvent - helicopter infantry transport
|
||||
"""
|
||||
EVENT_PROBABILITIES = {
|
||||
BaseAttackEvent: [100, 10],
|
||||
BaseAttackEvent: [100, 15],
|
||||
FrontlineAttackEvent: [100, 0],
|
||||
FrontlinePatrolEvent: [100, 0],
|
||||
StrikeEvent: [100, 0],
|
||||
InterceptEvent: [25, 10],
|
||||
InterceptEvent: [25, 15],
|
||||
InsurgentAttackEvent: [0, 10],
|
||||
NavalInterceptEvent: [25, 10],
|
||||
NavalInterceptEvent: [25, 15],
|
||||
InfantryTransportEvent: [25, 0],
|
||||
}
|
||||
|
||||
|
||||
@ -59,5 +59,11 @@ class BaseAttackOperation(Operation):
|
||||
|
||||
self.briefinggen.title = "Base attack"
|
||||
self.briefinggen.description = "The goal of an attacker is to lower defender presence by destroying their armor and aircraft. Base will be considered captured if attackers on the ground overrun the defenders. Be advised that your flight will not attack anything until you explicitly tell them so by comms menu."
|
||||
|
||||
if self.game.player == self.attacker_name:
|
||||
self.briefinggen.append_waypoint("TARGET")
|
||||
else:
|
||||
pass
|
||||
|
||||
super(BaseAttackOperation, self).generate()
|
||||
|
||||
|
||||
@ -51,4 +51,6 @@ class FrontlineAttackOperation(Operation):
|
||||
|
||||
self.briefinggen.title = "Frontline CAS"
|
||||
self.briefinggen.description = "Provide CAS for the ground forces attacking enemy lines. Operation will be considered successful if total number of enemy units will be lower than your own by a factor of 1.5 (i.e. with 12 units from both sides, enemy forces need to be reduced to at least 8), meaning that you (and, probably, your wingmans) should concentrate on destroying the enemy units. Target base strength will be lowered as a result. Be advised that your flight will not attack anything until you explicitly tell them so by comms menu."
|
||||
self.briefinggen.append_waypoint("CAS AREA IP")
|
||||
self.briefinggen.append_waypoint("CAS AREA EGRESS")
|
||||
super(FrontlineAttackOperation, self).generate()
|
||||
|
||||
@ -51,4 +51,6 @@ class FrontlinePatrolOperation(Operation):
|
||||
|
||||
self.briefinggen.title = "Frontline CAP"
|
||||
self.briefinggen.description = "Providing CAP support for ground units attacking enemy lines. Enemy will scramble its CAS and your task is to intercept it. Operation will be considered successful if total number of friendly units will be lower than enemy by at least a factor of 0.8 (i.e. with 12 units from both sides, there should be at least 8 friendly units alive), lowering targets strength as a result."
|
||||
self.briefinggen.append_waypoint("CAP AREA IP")
|
||||
self.briefinggen.append_waypoint("CAP AREA EGRESS")
|
||||
super(FrontlinePatrolOperation, self).generate()
|
||||
|
||||
@ -36,6 +36,7 @@ class InfantryTransportOperation(Operation):
|
||||
|
||||
self.briefinggen.title = "Infantry transport"
|
||||
self.briefinggen.description = "Helicopter operation to transport infantry troops from the base to the front line. Lowers target strength"
|
||||
self.briefinggen.append_waypoint("DROP POINT")
|
||||
|
||||
# TODO: horrible, horrible hack
|
||||
# this will disable vehicle activation triggers,
|
||||
|
||||
@ -28,10 +28,11 @@ class InsurgentAttackOperation(Operation):
|
||||
conflict=conflict)
|
||||
|
||||
def generate(self):
|
||||
self.airgen.generate_defense(*assigned_units_split(self.strikegroup), at=self.defenders_starting_position)
|
||||
self.airgen.generate_defenders_cas(*assigned_units_split(self.strikegroup), at=self.defenders_starting_position)
|
||||
self.armorgen.generate(self.target, {})
|
||||
|
||||
self.briefinggen.title = "Destroy insurgents"
|
||||
self.briefinggen.description = "Destroy vehicles of insurgents in close proximity of the friendly base. Be advised that your flight will not attack anything until you explicitly tell them so by comms menu."
|
||||
self.briefinggen.append_waypoint("TARGET")
|
||||
|
||||
super(InsurgentAttackOperation, self).generate()
|
||||
|
||||
@ -56,7 +56,14 @@ class InterceptOperation(Operation):
|
||||
self.airgen.generate_interception(*assigned_units_split(self.interceptors), at=self.attackers_starting_position)
|
||||
|
||||
self.briefinggen.title = "Air Intercept"
|
||||
self.briefinggen.description = "Intercept enemy supply transport aircraft. Escort will also be present if there are available planes on the base. Operation will be considered successful if most of the targets are destroyed, lowering targets strength as a result"
|
||||
|
||||
if self.game.player == self.attacker_name:
|
||||
self.briefinggen.description = "Intercept enemy supply transport aircraft. Escort will also be present if there are available planes on the base. Operation will be considered successful if most of the targets are destroyed, lowering targets strength as a result"
|
||||
self.briefinggen.append_waypoint("TARGET")
|
||||
for unit_type, count in self.transport.items():
|
||||
self.briefinggen.append_target("{} ({})".format(db.unit_type_name(unit_type), count))
|
||||
else:
|
||||
self.briefinggen.description = "Escort friendly supply transport aircraft. Operation will be considered failed if most of the targets are destroyed, lowering CP strength as a result"
|
||||
|
||||
super(InterceptOperation, self).generate()
|
||||
|
||||
|
||||
@ -48,7 +48,13 @@ class NavalInterceptionOperation(Operation):
|
||||
)
|
||||
|
||||
self.briefinggen.title = "Naval Intercept"
|
||||
self.briefinggen.description = "Destroy supply transport ships. Lowers target strength. Be advised that your flight will not attack anything until you explicitly tell them so by comms menu."
|
||||
if self.game.player == self.attacker_name:
|
||||
self.briefinggen.description = "Destroy supply transport ships. Lowers target strength. Be advised that your flight will not attack anything until you explicitly tell them so by comms menu."
|
||||
for unit_type, count in self.targets:
|
||||
self.briefinggen.append_target("{} ({})".format(db.unit_type_name(unit_type), count))
|
||||
else:
|
||||
self.briefinggen.description = "Protect supply transport ships."
|
||||
self.briefinggen.append_waypoint("TARGET")
|
||||
|
||||
super(NavalInterceptionOperation, self).generate()
|
||||
|
||||
|
||||
@ -111,8 +111,6 @@ class Operation:
|
||||
else:
|
||||
self.envgen.load(self.environment_settings)
|
||||
|
||||
# @TODO: ADD WAYPOINT INFORMATION!
|
||||
|
||||
# main frequencies
|
||||
self.briefinggen.append_frequency("Flight", "251 MHz AM")
|
||||
if self.conflict.from_cp.is_global or self.conflict.to_cp.is_global:
|
||||
|
||||
@ -47,7 +47,8 @@ class StrikeOperation(Operation):
|
||||
category_counters[object.category] = category_counters.get(object.category, 0) + 1
|
||||
markpoint_name = "{}{}".format(object.name_abbrev, category_counters[object.category])
|
||||
targets.append((markpoint_name, object.position))
|
||||
self.briefinggen.append_target(str(object), markpoint_name)
|
||||
self.briefinggen.append_target(str(object))
|
||||
self.briefinggen.append_waypoint("TARGET {} (TP {})".format(str(object), markpoint_name))
|
||||
|
||||
targets.sort(key=lambda x: self.from_cp.position.distance_to_point(x[1]))
|
||||
|
||||
|
||||
@ -449,10 +449,7 @@ class AircraftConflictGenerator:
|
||||
at=at and at or self._group_point(self.conflict.air_attackers_location))
|
||||
|
||||
group.task = CAP.name
|
||||
|
||||
heading = group.position.heading_between_point(self.conflict.position)
|
||||
initial_wayp = group.add_waypoint(group.position.point_from_heading(heading, WORKAROUND_WAYP_DIST), INTERCEPTION_ALT, INTERCEPTION_AIRSPEED)
|
||||
initial_wayp.tasks.append(EngageTargets(max_distance=INTERCEPT_MAX_DISTANCE))
|
||||
group.points[0].tasks.append(EngageTargets(max_distance=INTERCEPT_MAX_DISTANCE))
|
||||
|
||||
wayp = group.add_waypoint(self.conflict.position, WARM_START_ALTITUDE, INTERCEPTION_AIRSPEED)
|
||||
wayp.tasks.append(EngageTargets(max_distance=INTERCEPT_MAX_DISTANCE))
|
||||
|
||||
@ -12,6 +12,7 @@ class BriefingGenerator:
|
||||
title = "" # type: str
|
||||
description = "" # type: str
|
||||
targets = None # type: typing.List[typing.Tuple[str, str]]
|
||||
waypoints = None # type: typing.List[str]
|
||||
|
||||
def __init__(self, mission: Mission, conflict: Conflict, game):
|
||||
self.m = mission
|
||||
@ -20,6 +21,7 @@ class BriefingGenerator:
|
||||
|
||||
self.freqs = []
|
||||
self.targets = []
|
||||
self.waypoints = []
|
||||
|
||||
def append_frequency(self, name: str, frequency: str):
|
||||
self.freqs.append((name, frequency))
|
||||
@ -27,7 +29,14 @@ class BriefingGenerator:
|
||||
def append_target(self, description: str, markpoint: str = None):
|
||||
self.targets.append((description, markpoint))
|
||||
|
||||
def append_waypoint(self, description: str):
|
||||
self.waypoints.append(description)
|
||||
|
||||
def generate(self):
|
||||
self.waypoints.insert(0, "INITIAL")
|
||||
self.waypoints.append("RTB")
|
||||
self.waypoints.append("RTB Landing")
|
||||
|
||||
description = ""
|
||||
|
||||
if self.title:
|
||||
@ -43,7 +52,12 @@ class BriefingGenerator:
|
||||
|
||||
if self.targets:
|
||||
description += "\n\nTARGETS:"
|
||||
for name, tp in self.targets:
|
||||
description += "\n{} {}".format(name, "(TP {})".format(tp) if tp else "")
|
||||
for i, (name, tp) in enumerate(self.targets):
|
||||
description += "\n#{} {} {}".format(i+1, name, "(TP {})".format(tp) if tp else "")
|
||||
|
||||
if self.waypoints:
|
||||
description += "\n\nWAYPOINTS:"
|
||||
for i, descr in enumerate(self.waypoints):
|
||||
description += "\n#{}: {}".format(i+1, descr)
|
||||
|
||||
self.m.set_description_text(description)
|
||||
|
||||
Binary file not shown.
@ -3,20 +3,41 @@ import typing
|
||||
|
||||
from dcs.mission import Mission
|
||||
from dcs.mapping import Point
|
||||
from dcs.terrain import *
|
||||
from dcs.unitgroup import VehicleGroup, StaticGroup
|
||||
from dcs.unit import *
|
||||
from dcs.statics import warehouse_map, fortification_map
|
||||
|
||||
from game import db
|
||||
from gen.groundobjectsgen import TheaterGroundObject
|
||||
from theater.caucasus import CaucasusTheater
|
||||
from theater.persiangulf import PersianGulfTheater
|
||||
from theater.nevada import NevadaTheater
|
||||
|
||||
m = Mission()
|
||||
m.load_file("./cau_groundobjects.miz")
|
||||
m.load_file("resources/tools/cau_groundobjects.miz")
|
||||
|
||||
if isinstance(m.terrain, Caucasus):
|
||||
theater = CaucasusTheater(load_ground_objects=False)
|
||||
elif isinstance(m.terrain, PersianGulf):
|
||||
theater = PersianGulfTheater(load_ground_objects=False)
|
||||
elif isinstance(m.terrain, Nevada):
|
||||
theater = NevadaTheater(load_ground_objects=False)
|
||||
else:
|
||||
assert False
|
||||
|
||||
|
||||
def parse_name(name: str) -> int:
|
||||
first_part = name.split()[0].split("|")
|
||||
return int(first_part[0]) if len(first_part) == 1 else int(first_part[1])
|
||||
def closest_cp(location: Point) -> (int, float):
|
||||
global theater
|
||||
min_distance, min_cp = None, None
|
||||
|
||||
for cp in theater.controlpoints:
|
||||
if not min_distance or location.distance_to_point(cp.position) < min_distance:
|
||||
min_distance = location.distance_to_point(cp.position)
|
||||
min_cp = cp.id
|
||||
|
||||
assert min_cp is not None
|
||||
return min_cp
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
@ -27,11 +48,6 @@ if __name__ == "__main__":
|
||||
theater_object = TheaterGroundObject()
|
||||
theater_object.object_id = len(theater_objects) + 1
|
||||
|
||||
try:
|
||||
theater_object.cp_id = parse_name(str(unit.name))
|
||||
except Exception as e:
|
||||
theater_object.cp_id = parse_name(str(group.name))
|
||||
|
||||
theater_object.position = unit.position
|
||||
theater_object.heading = unit.heading
|
||||
|
||||
@ -40,15 +56,7 @@ if __name__ == "__main__":
|
||||
else:
|
||||
theater_object.dcs_identifier = unit.type
|
||||
|
||||
airport_distance = m.terrain.airport_by_id(theater_object.cp_id).position.distance_to_point(theater_object.position)
|
||||
if airport_distance > 150000:
|
||||
print("Object {} {} is placed {}m from airport {}!".format(theater_object.dcs_identifier,
|
||||
group.name,
|
||||
airport_distance,
|
||||
m.terrain.airport_by_id(theater_object.cp_id)))
|
||||
|
||||
assert theater_object.dcs_identifier
|
||||
assert theater_object.cp_id
|
||||
assert theater_object.object_id
|
||||
|
||||
theater_objects.append(theater_object)
|
||||
@ -61,11 +69,15 @@ if __name__ == "__main__":
|
||||
continue
|
||||
elif object_a.group_id:
|
||||
object_b.group_id = object_a.group_id
|
||||
object_b.cp_id = object_a.cp_id
|
||||
elif object_b.group_id:
|
||||
object_a.group_id = object_b.group_id
|
||||
object_a.cp_id = object_b.cp_id
|
||||
else:
|
||||
object_a.group_id = group_ids
|
||||
object_b.group_id = group_ids
|
||||
object_a.cp_id = closest_cp(object_a.position)
|
||||
object_b.cp_id = object_a.cp_id
|
||||
group_ids += 1
|
||||
|
||||
assert object_a.cp_id == object_b.cp_id, "Object {} and {} are placed in group with different airports!".format(object_a.string_identifier, object_b.string_identifier)
|
||||
@ -73,15 +85,23 @@ if __name__ == "__main__":
|
||||
for a in theater_objects:
|
||||
if not a.group_id:
|
||||
a.group_id = group_ids
|
||||
a.cp_id = closest_cp(a.position)
|
||||
group_ids += 1
|
||||
|
||||
print("Total {} objects".format(len(theater_objects)))
|
||||
with open("../cau_groundobjects.p", "wb") as f:
|
||||
with open("resources/cau_groundobjects.p", "wb") as f:
|
||||
result = {}
|
||||
for theater_object in theater_objects:
|
||||
assert theater_object.cp_id
|
||||
assert theater_object.group_id
|
||||
assert theater_object.object_id
|
||||
|
||||
if theater_object.cp_id not in result:
|
||||
result[theater_object.cp_id] = []
|
||||
result[theater_object.cp_id].append(theater_object)
|
||||
|
||||
print("Total {} objects".format(len(theater_objects)))
|
||||
for cp_id, objects in result.items():
|
||||
print("{}: total {} objects".format(m.terrain.airport_by_id(cp_id), len(objects)))
|
||||
|
||||
pickle.dump(result, f)
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
from .controlpoint import *
|
||||
from .conflicttheater import *
|
||||
from .base import *
|
||||
from .base import *
|
||||
|
||||
@ -44,7 +44,7 @@ class CaucasusTheater(ConflictTheater):
|
||||
|
||||
carrier_1 = ControlPoint.carrier("Carrier", mapping.Point(-305810.6875, 406399.1875))
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, load_ground_objects=True):
|
||||
super(CaucasusTheater, self).__init__()
|
||||
|
||||
self.add_controlpoint(self.soganlug, connected_to=[self.kutaisi, self.beslan])
|
||||
@ -73,8 +73,9 @@ class CaucasusTheater(ConflictTheater):
|
||||
self.carrier_1.captured = True
|
||||
self.soganlug.captured = True
|
||||
|
||||
with open("resources/cau_groundobjects.p", "rb") as f:
|
||||
self.set_groundobject(pickle.load(f))
|
||||
if load_ground_objects:
|
||||
with open("resources/cau_groundobjects.p", "rb") as f:
|
||||
self.set_groundobject(pickle.load(f))
|
||||
|
||||
def add_controlpoint(self, point: ControlPoint, connected_to: typing.Collection[ControlPoint] = []):
|
||||
point.name = " ".join(re.split(r"[ -]", point.name)[:1])
|
||||
|
||||
@ -32,7 +32,7 @@ class NevadaTheater(ConflictTheater):
|
||||
jean = ControlPoint.from_airport(nevada.Jean_Airport, LAND, SIZE_REGULAR, 1.2)
|
||||
laughlin = ControlPoint.from_airport(nevada.Laughlin_Airport, LAND, SIZE_LARGE, IMPORTANCE_HIGH)
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, load_ground_objects=True):
|
||||
super(NevadaTheater, self).__init__()
|
||||
|
||||
self.add_controlpoint(self.mina, connected_to=[self.tonopah])
|
||||
|
||||
@ -45,7 +45,7 @@ class PersianGulfTheater(ConflictTheater):
|
||||
|
||||
west_carrier = ControlPoint.carrier("East carrier", Point(-100531.972946, 60939.275818))
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, load_ground_objects=True):
|
||||
super(PersianGulfTheater, self).__init__()
|
||||
|
||||
self.add_controlpoint(self.shiraz, connected_to=[self.lar, self.kerman])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user