mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Compare commits
5 Commits
6.1.0
...
develop_2_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f65637f6b | ||
|
|
cceb3da693 | ||
|
|
a357bf3c08 | ||
|
|
3f251c38d8 | ||
|
|
01702f046e |
@@ -21,7 +21,7 @@ class Settings:
|
|||||||
self.night_disabled = False
|
self.night_disabled = False
|
||||||
self.external_views_allowed = True
|
self.external_views_allowed = True
|
||||||
self.supercarrier = False
|
self.supercarrier = False
|
||||||
self.multiplier = 1
|
self.multiplier = 1.0
|
||||||
self.generate_marks = True
|
self.generate_marks = True
|
||||||
self.sams = True # Legacy parameter do not use
|
self.sams = True # Legacy parameter do not use
|
||||||
self.cold_start = False # 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)
|
position = middle_point.point_from_heading(attack_heading, strength_delta * attack_distance / 2 - FRONTLINE_MIN_CP_DISTANCE)
|
||||||
return position, _opposite_heading(attack_heading)
|
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
|
@classmethod
|
||||||
def frontline_vector(cls, from_cp: ControlPoint, to_cp: ControlPoint, theater: ConflictTheater) -> Tuple[Point, int, int]:
|
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):
|
if not isinstance(location, FrontLine):
|
||||||
raise InvalidObjectiveLocation(flight.flight_type, location)
|
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],
|
location.control_points[0], location.control_points[1],
|
||||||
self.game.theater
|
self.game.theater
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ class WaypointBuilder:
|
|||||||
waypoint.description = description
|
waypoint.description = description
|
||||||
waypoint.pretty_name = description
|
waypoint.pretty_name = description
|
||||||
waypoint.name = target.name
|
waypoint.name = target.name
|
||||||
|
waypoint.alt_type = "RADIO"
|
||||||
# The target waypoints are only for the player's benefit. AI tasks for
|
# 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
|
# the target are set on the ingress point so they begin their attack
|
||||||
# *before* reaching the target.
|
# *before* reaching the target.
|
||||||
@@ -209,6 +210,7 @@ class WaypointBuilder:
|
|||||||
waypoint.description = name
|
waypoint.description = name
|
||||||
waypoint.pretty_name = name
|
waypoint.pretty_name = name
|
||||||
waypoint.name = name
|
waypoint.name = name
|
||||||
|
waypoint.alt_type = "RADIO"
|
||||||
# The target waypoints are only for the player's benefit. AI tasks for
|
# 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
|
# the target are set on the ingress point so they begin their attack
|
||||||
# *before* reaching the target.
|
# *before* reaching the target.
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
from dcs.action import MarkToAll
|
from dcs.action import MarkToAll
|
||||||
from dcs.condition import TimeAfter
|
from dcs.condition import TimeAfter
|
||||||
from dcs.mission import Mission
|
from dcs.mission import Mission
|
||||||
@@ -5,7 +7,7 @@ from dcs.task import Option
|
|||||||
from dcs.translation import String
|
from dcs.translation import String
|
||||||
from dcs.triggers import Event, TriggerOnce
|
from dcs.triggers import Event, TriggerOnce
|
||||||
from dcs.unit import Skill
|
from dcs.unit import Skill
|
||||||
|
from dcs.unitgroup import FlyingGroup
|
||||||
from .conflictgen import Conflict
|
from .conflictgen import Conflict
|
||||||
|
|
||||||
PUSH_TRIGGER_SIZE = 3000
|
PUSH_TRIGGER_SIZE = 3000
|
||||||
@@ -73,8 +75,9 @@ class TriggersGenerator:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
for country in coalition.countries.values():
|
for country in coalition.countries.values():
|
||||||
for plane_group in country.plane_group:
|
flying_groups = country.plane_group + country.helicopter_group # type: FlyingGroup
|
||||||
for plane_unit in plane_group.units:
|
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:
|
if plane_unit.skill != Skill.Client and plane_unit.skill != Skill.Player:
|
||||||
plane_unit.skill = Skill(skill_level[0])
|
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")]]
|
timePeriod = db.TIME_PERIODS[list(db.TIME_PERIODS.keys())[self.field("timePeriod")]]
|
||||||
midGame = self.field("midGame")
|
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_carrier = self.field("no_carrier")
|
||||||
no_lha = self.field("no_lha")
|
no_lha = self.field("no_lha")
|
||||||
supercarrier = self.field("supercarrier")
|
supercarrier = self.field("supercarrier")
|
||||||
@@ -324,6 +326,44 @@ class BudgetInputs(QtWidgets.QGridLayout):
|
|||||||
self.addWidget(self.starting_money, 1, 1)
|
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):
|
class MiscOptions(QtWidgets.QWizardPage):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(MiscOptions, self).__init__(parent)
|
super(MiscOptions, self).__init__(parent)
|
||||||
@@ -334,14 +374,12 @@ class MiscOptions(QtWidgets.QWizardPage):
|
|||||||
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||||
|
|
||||||
midGame = QtWidgets.QCheckBox()
|
midGame = QtWidgets.QCheckBox()
|
||||||
multiplier = QtWidgets.QSpinBox()
|
multiplier_inputs = ForceMultiplierInputs()
|
||||||
multiplier.setEnabled(False)
|
self.registerField('multiplier', multiplier_inputs.multiplier)
|
||||||
multiplier.setMinimum(1)
|
|
||||||
multiplier.setMaximum(5)
|
|
||||||
|
|
||||||
miscSettingsGroup = QtWidgets.QGroupBox("Misc Settings")
|
miscSettingsGroup = QtWidgets.QGroupBox("Misc Settings")
|
||||||
self.registerField('midGame', midGame)
|
self.registerField('midGame', midGame)
|
||||||
self.registerField('multiplier', multiplier)
|
|
||||||
|
|
||||||
# Campaign settings
|
# Campaign settings
|
||||||
generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings")
|
generatorSettingsGroup = QtWidgets.QGroupBox("Generator Settings")
|
||||||
@@ -359,8 +397,7 @@ class MiscOptions(QtWidgets.QWizardPage):
|
|||||||
layout = QtWidgets.QGridLayout()
|
layout = QtWidgets.QGridLayout()
|
||||||
layout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0)
|
layout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0)
|
||||||
layout.addWidget(midGame, 1, 1)
|
layout.addWidget(midGame, 1, 1)
|
||||||
layout.addWidget(QtWidgets.QLabel("Ennemy forces multiplier [Disabled for Now]"), 2, 0)
|
layout.addLayout(multiplier_inputs, 2, 0)
|
||||||
layout.addWidget(multiplier, 2, 1)
|
|
||||||
miscSettingsGroup.setLayout(layout)
|
miscSettingsGroup.setLayout(layout)
|
||||||
|
|
||||||
generatorLayout = QtWidgets.QGridLayout()
|
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