mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Compare commits
5 Commits
11.1.0
...
develop_2_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f65637f6b | ||
|
|
cceb3da693 | ||
|
|
a357bf3c08 | ||
|
|
3f251c38d8 | ||
|
|
01702f046e |
@@ -21,7 +21,7 @@ class Settings:
|
||||
self.night_disabled = False
|
||||
self.external_views_allowed = True
|
||||
self.supercarrier = False
|
||||
self.multiplier = 1
|
||||
self.multiplier = 1.0
|
||||
self.generate_marks = True
|
||||
self.sams = True # Legacy parameter do not use
|
||||
self.cold_start = False # Legacy parameter do not use
|
||||
|
||||
@@ -144,6 +144,16 @@ class Conflict:
|
||||
position = middle_point.point_from_heading(attack_heading, strength_delta * attack_distance / 2 - FRONTLINE_MIN_CP_DISTANCE)
|
||||
return position, _opposite_heading(attack_heading)
|
||||
|
||||
@classmethod
|
||||
def flight_frontline_vector(cls, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater) -> Tuple[Point, int, int]:
|
||||
"""Returns the frontline vector without regard for exclusion zones, used in CAS flight plan"""
|
||||
frontline = cls.frontline_position(theater, from_cp, to_cp)
|
||||
center_position, heading = frontline
|
||||
left_position = center_position.point_from_heading(_heading_sum(heading, -90), int(FRONTLINE_LENGTH/2))
|
||||
right_position = center_position.point_from_heading(_heading_sum(heading, 90), int(FRONTLINE_LENGTH/2))
|
||||
|
||||
return left_position, _heading_sum(heading, 90), int(right_position.distance_to_point(left_position))
|
||||
|
||||
|
||||
@classmethod
|
||||
def frontline_vector(cls, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater) -> Tuple[Point, int, int]:
|
||||
|
||||
@@ -803,7 +803,7 @@ class FlightPlanBuilder:
|
||||
if not isinstance(location, FrontLine):
|
||||
raise InvalidObjectiveLocation(flight.flight_type, location)
|
||||
|
||||
ingress, heading, distance = Conflict.frontline_vector(
|
||||
ingress, heading, distance = Conflict.flight_frontline_vector(
|
||||
location.control_points[0], location.control_points[1],
|
||||
self.game.theater
|
||||
)
|
||||
|
||||
@@ -183,6 +183,7 @@ class WaypointBuilder:
|
||||
waypoint.description = description
|
||||
waypoint.pretty_name = description
|
||||
waypoint.name = target.name
|
||||
waypoint.alt_type = "RADIO"
|
||||
# The target waypoints are only for the player's benefit. AI tasks for
|
||||
# the target are set on the ingress point so they begin their attack
|
||||
# *before* reaching the target.
|
||||
@@ -209,6 +210,7 @@ class WaypointBuilder:
|
||||
waypoint.description = name
|
||||
waypoint.pretty_name = name
|
||||
waypoint.name = name
|
||||
waypoint.alt_type = "RADIO"
|
||||
# The target waypoints are only for the player's benefit. AI tasks for
|
||||
# the target are set on the ingress point so they begin their attack
|
||||
# *before* reaching the target.
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dcs.action import MarkToAll
|
||||
from dcs.condition import TimeAfter
|
||||
from dcs.mission import Mission
|
||||
@@ -5,7 +7,7 @@ from dcs.task import Option
|
||||
from dcs.translation import String
|
||||
from dcs.triggers import Event, TriggerOnce
|
||||
from dcs.unit import Skill
|
||||
|
||||
from dcs.unitgroup import FlyingGroup
|
||||
from .conflictgen import Conflict
|
||||
|
||||
PUSH_TRIGGER_SIZE = 3000
|
||||
@@ -73,8 +75,9 @@ class TriggersGenerator:
|
||||
continue
|
||||
|
||||
for country in coalition.countries.values():
|
||||
for plane_group in country.plane_group:
|
||||
for plane_unit in plane_group.units:
|
||||
flying_groups = country.plane_group + country.helicopter_group # type: FlyingGroup
|
||||
for flying_group in flying_groups:
|
||||
for plane_unit in flying_group.units:
|
||||
if plane_unit.skill != Skill.Client and plane_unit.skill != Skill.Player:
|
||||
plane_unit.skill = Skill(skill_level[0])
|
||||
|
||||
|
||||
@@ -62,7 +62,9 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
|
||||
timePeriod = db.TIME_PERIODS[list(db.TIME_PERIODS.keys())[self.field("timePeriod")]]
|
||||
midGame = self.field("midGame")
|
||||
multiplier = self.field("multiplier")
|
||||
# QSlider forces integers, so we use 1 to 50 and divide by 10 to give
|
||||
# 0.1 to 5.0.
|
||||
multiplier = self.field("multiplier") / 10
|
||||
no_carrier = self.field("no_carrier")
|
||||
no_lha = self.field("no_lha")
|
||||
supercarrier = self.field("supercarrier")
|
||||
@@ -324,6 +326,44 @@ class BudgetInputs(QtWidgets.QGridLayout):
|
||||
self.addWidget(self.starting_money, 1, 1)
|
||||
|
||||
|
||||
class ForceMultiplierSpinner(QtWidgets.QSpinBox):
|
||||
def __init__(self, minimum: Optional[int] = None,
|
||||
maximum: Optional[int] = None,
|
||||
initial: Optional[int] = None) -> None:
|
||||
super().__init__()
|
||||
|
||||
if minimum is not None:
|
||||
self.setMinimum(minimum)
|
||||
if maximum is not None:
|
||||
self.setMaximum(maximum)
|
||||
if initial is not None:
|
||||
self.setValue(initial)
|
||||
|
||||
def textFromValue(self, val: int) -> str:
|
||||
return f"X {val / 10:.1f}"
|
||||
|
||||
|
||||
class ForceMultiplierInputs(QtWidgets.QGridLayout):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.addWidget(QtWidgets.QLabel("Enemy forces multiplier"), 0, 0)
|
||||
|
||||
minimum = 1
|
||||
maximum = 50
|
||||
initial = 10
|
||||
|
||||
slider = QtWidgets.QSlider(Qt.Horizontal)
|
||||
slider.setMinimum(minimum)
|
||||
slider.setMaximum(maximum)
|
||||
slider.setValue(initial)
|
||||
self.multiplier = ForceMultiplierSpinner(minimum, maximum, initial)
|
||||
slider.valueChanged.connect(lambda x: self.multiplier.setValue(x))
|
||||
self.multiplier.valueChanged.connect(lambda x: slider.setValue(x))
|
||||
|
||||
self.addWidget(slider, 1, 0)
|
||||
self.addWidget(self.multiplier, 1, 1)
|
||||
|
||||
|
||||
class MiscOptions(QtWidgets.QWizardPage):
|
||||
def __init__(self, parent=None):
|
||||
super(MiscOptions, self).__init__(parent)
|
||||
@@ -334,14 +374,12 @@ class MiscOptions(QtWidgets.QWizardPage):
|
||||
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||
|
||||
midGame = QtWidgets.QCheckBox()
|
||||
multiplier = QtWidgets.QSpinBox()
|
||||
multiplier.setEnabled(False)
|
||||
multiplier.setMinimum(1)
|
||||
multiplier.setMaximum(5)
|
||||
multiplier_inputs = ForceMultiplierInputs()
|
||||
self.registerField('multiplier', multiplier_inputs.multiplier)
|
||||
|
||||
|
||||
miscSettingsGroup = QtWidgets.QGroupBox("Misc Settings")
|
||||
self.registerField('midGame', midGame)
|
||||
self.registerField('multiplier', multiplier)
|
||||
|
||||
# Campaign settings
|
||||
generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings")
|
||||
@@ -359,8 +397,7 @@ class MiscOptions(QtWidgets.QWizardPage):
|
||||
layout = QtWidgets.QGridLayout()
|
||||
layout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0)
|
||||
layout.addWidget(midGame, 1, 1)
|
||||
layout.addWidget(QtWidgets.QLabel("Ennemy forces multiplier [Disabled for Now]"), 2, 0)
|
||||
layout.addWidget(multiplier, 2, 1)
|
||||
layout.addLayout(multiplier_inputs, 2, 0)
|
||||
miscSettingsGroup.setLayout(layout)
|
||||
|
||||
generatorLayout = QtWidgets.QGridLayout()
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1010 B |
BIN
resources/ui/units/aircrafts/P-47D-30bl1_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/P-47D-30bl1_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1010 B |
BIN
resources/ui/units/aircrafts/P-47D-40_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/P-47D-40_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1010 B |
Reference in New Issue
Block a user