fixes for selectable departure; generate statics for used units; raised RTB alt

This commit is contained in:
Vasyl Horbachenko 2018-11-05 03:17:06 +02:00
parent 355cd3e0e4
commit 9d0997624b
17 changed files with 57 additions and 26 deletions

View File

@ -235,7 +235,6 @@ SAM_BAN = [
Units that will always be spawned in the air Units that will always be spawned in the air
""" """
TAKEOFF_BAN = [ TAKEOFF_BAN = [
AV8BNA, # AI takeoff currently bugged attempting VTOL with no regards for the total weight
] ]
""" """

View File

@ -61,7 +61,8 @@ class BaseAttackEvent(Event):
op = BaseAttackOperation(game=self.game, op = BaseAttackOperation(game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
op.setup(cas=assigned_units_from(cas), op.setup(cas=assigned_units_from(cas),
@ -79,7 +80,8 @@ class BaseAttackEvent(Event):
op = BaseAttackOperation(game=self.game, op = BaseAttackOperation(game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
defenders = self.to_cp.base.scramble_sweep(self.game.settings.multiplier) defenders = self.to_cp.base.scramble_sweep(self.game.settings.multiplier)

View File

@ -68,6 +68,7 @@ class FrontlineAttackEvent(Event):
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.from_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
defenders = self.to_cp.base.assemble_attack() defenders = self.to_cp.base.assemble_attack()

View File

@ -64,6 +64,7 @@ class FrontlinePatrolEvent(Event):
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.from_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
defenders = self.to_cp.base.assemble_attack() defenders = self.to_cp.base.assemble_attack()

View File

@ -44,7 +44,8 @@ class InfantryTransportEvent(Event):
game=self.game, game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp to_cp=self.to_cp
) )

View File

@ -56,7 +56,8 @@ class InsurgentAttackEvent(Event):
op = InsurgentAttackOperation(game=self.game, op = InsurgentAttackOperation(game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
op.setup(target=self.targets, op.setup(target=self.targets,
strikegroup=flights[CAS]) strikegroup=flights[CAS])

View File

@ -76,7 +76,8 @@ class InterceptEvent(Event):
op = InterceptOperation(game=self.game, op = InterceptOperation(game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
op.setup(location=self.location, op.setup(location=self.location,
@ -98,7 +99,8 @@ class InterceptEvent(Event):
op = InterceptOperation(game=self.game, op = InterceptOperation(game=self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp) to_cp=self.to_cp)
op.setup(escort=flights[CAP], op.setup(escort=flights[CAP],

View File

@ -84,7 +84,8 @@ class NavalInterceptEvent(Event):
self.game, self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp to_cp=self.to_cp
) )
@ -106,7 +107,8 @@ class NavalInterceptEvent(Event):
self.game, self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp to_cp=self.to_cp
) )

View File

@ -49,7 +49,8 @@ class StrikeEvent(Event):
self.game, self.game,
attacker_name=self.attacker_name, attacker_name=self.attacker_name,
defender_name=self.defender_name, defender_name=self.defender_name,
from_cp=self.departure_cp, from_cp=self.from_cp,
departure_cp=self.departure_cp,
to_cp=self.to_cp to_cp=self.to_cp
) )

View File

@ -39,11 +39,13 @@ class Operation:
attacker_name: str, attacker_name: str,
defender_name: str, defender_name: str,
from_cp: ControlPoint, from_cp: ControlPoint,
departure_cp: ControlPoint,
to_cp: ControlPoint = None): to_cp: ControlPoint = None):
self.game = game self.game = game
self.attacker_name = attacker_name self.attacker_name = attacker_name
self.defender_name = defender_name self.defender_name = defender_name
self.from_cp = from_cp self.from_cp = from_cp
self.departure_cp = departure_cp
self.to_cp = to_cp self.to_cp = to_cp
self.is_quick = False self.is_quick = False
@ -89,7 +91,7 @@ class Operation:
self.attackers_starting_position = None self.attackers_starting_position = None
self.defenders_starting_position = None self.defenders_starting_position = None
else: else:
self.attackers_starting_position = self.from_cp.at self.attackers_starting_position = self.departure_cp.at
self.defenders_starting_position = self.to_cp.at self.defenders_starting_position = self.to_cp.at
def prepare_carriers(self, for_units: db.UnitsDict): def prepare_carriers(self, for_units: db.UnitsDict):
@ -101,12 +103,10 @@ class Operation:
country=self.game.player, country=self.game.player,
at=global_cp.at) at=global_cp.at)
if global_cp == self.from_cp and not self.is_quick: if global_cp == self.departure_cp and not self.is_quick:
self.attackers_starting_position = ship self.attackers_starting_position = ship
def generate(self): def generate(self):
self.visualgen.generate()
# air support # air support
self.airsupportgen.generate(self.is_awacs_enabled) self.airsupportgen.generate(self.is_awacs_enabled)
for i, tanker_type in enumerate(self.airsupportgen.generated_tankers): for i, tanker_type in enumerate(self.airsupportgen.generated_tankers):
@ -143,12 +143,17 @@ class Operation:
else: else:
self.envgen.load(self.environment_settings) self.envgen.load(self.environment_settings)
# options
self.forcedoptionsgen.generate() self.forcedoptionsgen.generate()
# main frequencies # main frequencies
self.briefinggen.append_frequency("Flight", "251 MHz AM") self.briefinggen.append_frequency("Flight", "251 MHz AM")
if self.conflict.from_cp.is_global or self.conflict.to_cp.is_global: if self.departure_cp.is_global or self.conflict.to_cp.is_global:
self.briefinggen.append_frequency("Carrier", "20X/ICLS CHAN1") self.briefinggen.append_frequency("Carrier", "20X/ICLS CHAN1")
# briefing # briefing
self.briefinggen.generate() self.briefinggen.generate()
# visuals
self.visualgen.generate()

View File

@ -30,7 +30,7 @@ ATTACK_CIRCLE_ALT = 5000
ATTACK_CIRCLE_DURATION = 15 ATTACK_CIRCLE_DURATION = 15
CAS_ALTITUDE = 1000 CAS_ALTITUDE = 1000
RTB_ALTITUDE = 1000 RTB_ALTITUDE = 3000
HELI_ALT = 900 HELI_ALT = 900
TRANSPORT_LANDING_ALT = 1000 TRANSPORT_LANDING_ALT = 1000

View File

@ -49,12 +49,14 @@ class AirSupportConflictGenerator:
) )
tanker_group.points[0].tasks.append(ActivateBeaconCommand(channel=97 + i, unit_id=tanker_group.id, aa=False)) tanker_group.points[0].tasks.append(ActivateBeaconCommand(channel=97 + i, unit_id=tanker_group.id, aa=False))
tanker_group.tasks.append(SetInvisibleCommand(True))
tanker_group.tasks.append(SetImmortalCommand(True))
if is_awacs_enabled: if is_awacs_enabled:
awacs_unit = db.find_unittype(AWACS, self.conflict.attackers_side.name)[0] awacs_unit = db.find_unittype(AWACS, self.conflict.attackers_side.name)[0]
self.mission.awacs_flight( awacs_flight = self.mission.awacs_flight(
country=self.mission.country(self.game.player), country=self.mission.country(self.game.player),
name=namegen.next_awacs_name(self.mission.country(self.game.player),), name=namegen.next_awacs_name(self.mission.country(self.game.player)),
plane_type=awacs_unit, plane_type=awacs_unit,
altitude=AWACS_ALT, altitude=AWACS_ALT,
airport=None, airport=None,
@ -62,3 +64,6 @@ class AirSupportConflictGenerator:
frequency=133, frequency=133,
start_type=StartType.Warm, start_type=StartType.Warm,
) )
awacs_flight.tasks.append(SetInvisibleCommand(True))
awacs_flight.tasks.append(SetImmortalCommand(True))

View File

@ -277,7 +277,7 @@ class Conflict:
) )
@classmethod @classmethod
def intercept_position(cls, from_cp: ControlPoint, to_cp:ControlPoint) -> Point: def intercept_position(cls, from_cp: ControlPoint, to_cp: ControlPoint) -> Point:
raw_distance = from_cp.position.distance_to_point(to_cp.position) * 1.5 raw_distance = from_cp.position.distance_to_point(to_cp.position) * 1.5
distance = max(min(raw_distance, INTERCEPT_MAX_DISTANCE), INTERCEPT_MIN_DISTANCE) distance = max(min(raw_distance, INTERCEPT_MAX_DISTANCE), INTERCEPT_MIN_DISTANCE)
heading = _heading_sum(from_cp.position.heading_between_point(to_cp.position), random.choice([-1, 1]) * random.randint(60, 100)) heading = _heading_sum(from_cp.position.heading_between_point(to_cp.position), random.choice([-1, 1]) * random.randint(60, 100))
@ -285,6 +285,7 @@ class Conflict:
@classmethod @classmethod
def intercept_conflict(cls, attacker: Country, defender: Country, position: Point, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater): def intercept_conflict(cls, attacker: Country, defender: Country, position: Point, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater):
heading = from_cp.position.heading_between_point(position)
return cls( return cls(
position=position.point_from_heading(position.heading_between_point(to_cp.position), INTERCEPT_CONFLICT_DISTANCE), position=position.point_from_heading(position.heading_between_point(to_cp.position), INTERCEPT_CONFLICT_DISTANCE),
theater=theater, theater=theater,

View File

@ -54,14 +54,12 @@ 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 = player_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
result_radius = min(minimum_radius, radius) radius = min(minimum_radius, radius)
"""
activation_trigger_zone = self.mission.triggers.add_triggerzone(self.conflict.position, radius, name="Activation zone") activation_trigger_zone = self.mission.triggers.add_triggerzone(self.conflict.position, radius, name="Activation zone")
activation_trigger = TriggerOnce(Event.NoEvent, "Activation trigger") activation_trigger = TriggerOnce(Event.NoEvent, "Activation trigger")

View File

@ -124,6 +124,17 @@ class VisualGenerator:
position=pos) position=pos)
break break
def _generate_stub_planes(self):
mission_units = set()
for coalition_name, coalition in self.mission.coalition.items():
for country in coalition.countries.values():
for group in country.plane_group + country.helicopter_group + country.vehicle_group:
for unit in group.units:
mission_units.add(db.unit_type_of(unit))
for unit_type in mission_units:
self.mission.static_group(self.mission.country("USA"), "a", unit_type, Point(0, 0))
def generate_target_smokes(self, target): def generate_target_smokes(self, target):
spread = target.size * DESTINATION_SMOKE_DISTANCE_FACTOR spread = target.size * DESTINATION_SMOKE_DISTANCE_FACTOR
for _ in range(0, int(target.size * DESTINATION_SMOKE_AMOUNT_FACTOR * (1.1 - target.base.strength))): for _ in range(0, int(target.size * DESTINATION_SMOKE_AMOUNT_FACTOR * (1.1 - target.base.strength))):
@ -159,3 +170,4 @@ class VisualGenerator:
def generate(self): def generate(self):
self._generate_frontline_smokes() self._generate_frontline_smokes()
self._generate_stub_planes()

View File

@ -195,7 +195,7 @@ class EventMenu(Menu):
return return
if isinstance(self.event, FrontlineAttackEvent) or isinstance(self.event, FrontlinePatrolEvent): if isinstance(self.event, FrontlineAttackEvent) or isinstance(self.event, FrontlinePatrolEvent):
if self.base.total_armor == 0: if self.event.from_cp.base.total_armor == 0:
self.error_label["text"] = "No ground vehicles available to attack!" self.error_label["text"] = "No ground vehicles available to attack!"
return return

View File

@ -164,7 +164,8 @@ class OverviewCanvas:
InsurgentAttackEvent: "insurgent_attack", InsurgentAttackEvent: "insurgent_attack",
InterceptEvent: "air_intercept", InterceptEvent: "air_intercept",
NavalInterceptEvent: "naval_intercept", NavalInterceptEvent: "naval_intercept",
StrikeEvent: "strike"}.items(): StrikeEvent: "strike",
UnitsDeliveryEvent: "delivery"}.items():
self.event_icons[category] = pygame.image.load(os.path.join("resources", "ui", "events", image + ".png")) self.event_icons[category] = pygame.image.load(os.path.join("resources", "ui", "events", image + ".png"))
@ -473,7 +474,7 @@ class OverviewCanvas:
return rect return rect
def _events_priority_key(event: Event) -> int: def _events_priority_key(event: Event) -> int:
priority_list = [InfantryTransportEvent, StrikeEvent, BaseAttackEvent] priority_list = [InfantryTransportEvent, StrikeEvent, BaseAttackEvent, UnitsDeliveryEvent]
if type(event) not in priority_list: if type(event) not in priority_list:
return 0 return 0
else: else:
@ -481,7 +482,6 @@ class OverviewCanvas:
events = self.game.events events = self.game.events
events.sort(key=_events_priority_key, reverse=True) events.sort(key=_events_priority_key, reverse=True)
print(events)
label_to_draw = None label_to_draw = None
for event in self.game.events: for event in self.game.events: