mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Compare commits
9 Commits
zhexu14-pa
...
develop-7.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7614017828 | ||
|
|
61879aeafa | ||
|
|
f5b9052257 | ||
|
|
b27d2be0d1 | ||
|
|
e1a1eca5da | ||
|
|
c695db0f98 | ||
|
|
ff20f16109 | ||
|
|
8af3dc6965 | ||
|
|
e6cf253e45 |
@@ -16,6 +16,7 @@ Saves from 6.x are not compatible with 7.0.
|
|||||||
* **[Mission Generation]** Wind speeds no longer follow a uniform distribution. Median wind speeds are now much lower and the standard deviation has been reduced considerably at altitude but increased somewhat at MSL.
|
* **[Mission Generation]** Wind speeds no longer follow a uniform distribution. Median wind speeds are now much lower and the standard deviation has been reduced considerably at altitude but increased somewhat at MSL.
|
||||||
* **[Mission Generation]** Improved task generation for SEAD flights carrying TALDs.
|
* **[Mission Generation]** Improved task generation for SEAD flights carrying TALDs.
|
||||||
* **[Mission Generation]** Added task timeout for SEAD flights with TALDs to prevent AI from overflying the target.
|
* **[Mission Generation]** Added task timeout for SEAD flights with TALDs to prevent AI from overflying the target.
|
||||||
|
* **[Mission Generation]** Game state will automatically be checkpointed before fast-forwarding the mission, and restored on mission abort. This means that it's now possible to abort a mission and make changes without needing to manually re-load your game.
|
||||||
* **[Modding]** Updated Community A-4E-C mod version support to 2.1.0 release.
|
* **[Modding]** Updated Community A-4E-C mod version support to 2.1.0 release.
|
||||||
* **[Modding]** Add support for VSN F-4B and F-4C mod.
|
* **[Modding]** Add support for VSN F-4B and F-4C mod.
|
||||||
* **[Modding]** Added support for AI C-47 mod.
|
* **[Modding]** Added support for AI C-47 mod.
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
project = "DCS Liberation"
|
project = "DCS Liberation"
|
||||||
copyright = "2023, DCS Liberation Team"
|
copyright = "2023, DCS Liberation Team"
|
||||||
author = "DCS Liberation Team"
|
author = "DCS Liberation Team"
|
||||||
release = "7.0.0"
|
release = "7.0.1"
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
# -- General configuration ---------------------------------------------------
|
||||||
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class SaveGameBundle:
|
|||||||
MANUAL_SAVE_NAME = "player.liberation"
|
MANUAL_SAVE_NAME = "player.liberation"
|
||||||
LAST_TURN_SAVE_NAME = "last_turn.liberation"
|
LAST_TURN_SAVE_NAME = "last_turn.liberation"
|
||||||
START_OF_TURN_SAVE_NAME = "start_of_turn.liberation"
|
START_OF_TURN_SAVE_NAME = "start_of_turn.liberation"
|
||||||
|
PRE_SIM_CHECKPOINT_SAVE_NAME = "pre_sim_checkpoint.liberation"
|
||||||
|
|
||||||
def __init__(self, bundle_path: Path) -> None:
|
def __init__(self, bundle_path: Path) -> None:
|
||||||
self.bundle_path = bundle_path
|
self.bundle_path = bundle_path
|
||||||
@@ -58,6 +59,19 @@ class SaveGameBundle:
|
|||||||
game, self.START_OF_TURN_SAVE_NAME, copy_from=self
|
game, self.START_OF_TURN_SAVE_NAME, copy_from=self
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def save_pre_sim_checkpoint(self, game: Game) -> None:
|
||||||
|
"""Writes the save file for the state before beginning simulation.
|
||||||
|
|
||||||
|
This save is the state of the game after the player presses "TAKE OFF", but
|
||||||
|
before the fast-forward simulation begins. It is not practical to rewind, but
|
||||||
|
players commonly will want to cancel and continue planning after pressing that
|
||||||
|
button, so we make a checkpoint that we can reload on abort.
|
||||||
|
"""
|
||||||
|
with logged_duration("Saving pre-sim checkpoint"):
|
||||||
|
self._update_bundle_member(
|
||||||
|
game, self.PRE_SIM_CHECKPOINT_SAVE_NAME, copy_from=self
|
||||||
|
)
|
||||||
|
|
||||||
def load_player(self) -> Game:
|
def load_player(self) -> Game:
|
||||||
"""Loads the save manually created by the player via save/save-as."""
|
"""Loads the save manually created by the player via save/save-as."""
|
||||||
return self._load_from(self.MANUAL_SAVE_NAME)
|
return self._load_from(self.MANUAL_SAVE_NAME)
|
||||||
@@ -70,6 +84,10 @@ class SaveGameBundle:
|
|||||||
"""Loads the save automatically created at the end of the last turn."""
|
"""Loads the save automatically created at the end of the last turn."""
|
||||||
return self._load_from(self.LAST_TURN_SAVE_NAME)
|
return self._load_from(self.LAST_TURN_SAVE_NAME)
|
||||||
|
|
||||||
|
def load_pre_sim_checkpoint(self) -> Game:
|
||||||
|
"""Loads the save automatically created before the simulation began."""
|
||||||
|
return self._load_from(self.PRE_SIM_CHECKPOINT_SAVE_NAME)
|
||||||
|
|
||||||
def _load_from(self, name: str) -> Game:
|
def _load_from(self, name: str) -> Game:
|
||||||
with ZipFile(self.bundle_path) as zip_bundle:
|
with ZipFile(self.bundle_path) as zip_bundle:
|
||||||
with zip_bundle.open(name, "r") as save:
|
with zip_bundle.open(name, "r") as save:
|
||||||
|
|||||||
@@ -51,6 +51,10 @@ class SaveManager:
|
|||||||
with self._save_bundle_context() as bundle:
|
with self._save_bundle_context() as bundle:
|
||||||
bundle.save_start_of_turn(self.game)
|
bundle.save_start_of_turn(self.game)
|
||||||
|
|
||||||
|
def save_pre_sim_checkpoint(self) -> None:
|
||||||
|
with self._save_bundle_context() as bundle:
|
||||||
|
bundle.save_pre_sim_checkpoint(self.game)
|
||||||
|
|
||||||
def set_loaded_from(self, bundle: SaveGameBundle) -> None:
|
def set_loaded_from(self, bundle: SaveGameBundle) -> None:
|
||||||
"""Reconfigures this save manager based on the loaded game.
|
"""Reconfigures this save manager based on the loaded game.
|
||||||
|
|
||||||
@@ -81,6 +85,9 @@ class SaveManager:
|
|||||||
self.last_saved_bundle = previous_saved_bundle
|
self.last_saved_bundle = previous_saved_bundle
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def load_pre_sim_checkpoint(self) -> Game:
|
||||||
|
return self.default_save_bundle.load_pre_sim_checkpoint()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load_last_turn(bundle_path: Path) -> Game:
|
def load_last_turn(bundle_path: Path) -> Game:
|
||||||
return SaveGameBundle(bundle_path).load_last_turn()
|
return SaveGameBundle(bundle_path).load_last_turn()
|
||||||
|
|||||||
@@ -324,6 +324,17 @@ class Settings:
|
|||||||
"modifications."
|
"modifications."
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
reload_pre_sim_checkpoint_on_abort: bool = boolean_option(
|
||||||
|
"Reset mission to pre-take off conditions on abort",
|
||||||
|
page=MISSION_GENERATOR_PAGE,
|
||||||
|
section=GAMEPLAY_SECTION,
|
||||||
|
default=True,
|
||||||
|
detail=(
|
||||||
|
"If enabled, the game will automatically reload a pre-take off save when "
|
||||||
|
"aborting take off. If this is disabled, you will need to manually re-load "
|
||||||
|
"your game after aborting take off."
|
||||||
|
),
|
||||||
|
)
|
||||||
player_mission_interrupts_sim_at: Optional[StartType] = choices_option(
|
player_mission_interrupts_sim_at: Optional[StartType] = choices_option(
|
||||||
"Player missions interrupt fast forward",
|
"Player missions interrupt fast forward",
|
||||||
page=MISSION_GENERATOR_PAGE,
|
page=MISSION_GENERATOR_PAGE,
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ from game.ato.flightstate import (
|
|||||||
Uninitialized,
|
Uninitialized,
|
||||||
)
|
)
|
||||||
from .combat import CombatInitiator, FrozenCombat
|
from .combat import CombatInitiator, FrozenCombat
|
||||||
|
from .gameupdateevents import GameUpdateEvents
|
||||||
from .simulationresults import SimulationResults
|
from .simulationresults import SimulationResults
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
from game.ato import Flight
|
from game.ato import Flight
|
||||||
from .gameupdateevents import GameUpdateEvents
|
|
||||||
|
|
||||||
|
|
||||||
class AircraftSimulation:
|
class AircraftSimulation:
|
||||||
@@ -72,6 +72,7 @@ class AircraftSimulation:
|
|||||||
def reset(self) -> None:
|
def reset(self) -> None:
|
||||||
for flight in self.iter_flights():
|
for flight in self.iter_flights():
|
||||||
flight.set_state(Uninitialized(flight, self.game.settings))
|
flight.set_state(Uninitialized(flight, self.game.settings))
|
||||||
|
self.combats = []
|
||||||
|
|
||||||
def iter_flights(self) -> Iterator[Flight]:
|
def iter_flights(self) -> Iterator[Flight]:
|
||||||
packages = itertools.chain(
|
packages = itertools.chain(
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class GameLoop:
|
|||||||
def start(self) -> None:
|
def start(self) -> None:
|
||||||
if self.started:
|
if self.started:
|
||||||
raise RuntimeError("Cannot start game loop because it has already started")
|
raise RuntimeError("Cannot start game loop because it has already started")
|
||||||
|
self.game.save_manager.save_pre_sim_checkpoint()
|
||||||
self.started = True
|
self.started = True
|
||||||
self.sim.begin_simulation()
|
self.sim.begin_simulation()
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
MAJOR_VERSION = 7
|
MAJOR_VERSION = 7
|
||||||
MINOR_VERSION = 0
|
MINOR_VERSION = 0
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 1
|
||||||
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))
|
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import List, Optional
|
from typing import List, Optional, Callable
|
||||||
|
|
||||||
from PySide6.QtWidgets import (
|
from PySide6.QtWidgets import (
|
||||||
QDialog,
|
QDialog,
|
||||||
@@ -33,11 +33,16 @@ from qt_ui.windows.QWaitingForMissionResultWindow import QWaitingForMissionResul
|
|||||||
|
|
||||||
class QTopPanel(QFrame):
|
class QTopPanel(QFrame):
|
||||||
def __init__(
|
def __init__(
|
||||||
self, game_model: GameModel, sim_controller: SimController, ui_flags: UiFlags
|
self,
|
||||||
|
game_model: GameModel,
|
||||||
|
sim_controller: SimController,
|
||||||
|
ui_flags: UiFlags,
|
||||||
|
reset_to_pre_sim_checkpoint: Callable[[], None],
|
||||||
) -> None:
|
) -> None:
|
||||||
super(QTopPanel, self).__init__()
|
super(QTopPanel, self).__init__()
|
||||||
self.game_model = game_model
|
self.game_model = game_model
|
||||||
self.sim_controller = sim_controller
|
self.sim_controller = sim_controller
|
||||||
|
self.reset_to_pre_sim_checkpoint = reset_to_pre_sim_checkpoint
|
||||||
self.dialog: Optional[QDialog] = None
|
self.dialog: Optional[QDialog] = None
|
||||||
|
|
||||||
self.setMaximumHeight(70)
|
self.setMaximumHeight(70)
|
||||||
@@ -293,7 +298,9 @@ class QTopPanel(QFrame):
|
|||||||
persistence.mission_path_for("liberation_nextturn.miz")
|
persistence.mission_path_for("liberation_nextturn.miz")
|
||||||
)
|
)
|
||||||
|
|
||||||
waiting = QWaitingForMissionResultWindow(self.game, self.sim_controller, self)
|
waiting = QWaitingForMissionResultWindow(
|
||||||
|
self.game, self.sim_controller, self.reset_to_pre_sim_checkpoint, self
|
||||||
|
)
|
||||||
waiting.exec_()
|
waiting.exec_()
|
||||||
|
|
||||||
def budget_update(self, game: Game):
|
def budget_update(self, game: Game):
|
||||||
|
|||||||
@@ -133,7 +133,14 @@ class QLiberationWindow(QMainWindow):
|
|||||||
|
|
||||||
vbox = QVBoxLayout()
|
vbox = QVBoxLayout()
|
||||||
vbox.setContentsMargins(0, 0, 0, 0)
|
vbox.setContentsMargins(0, 0, 0, 0)
|
||||||
vbox.addWidget(QTopPanel(self.game_model, self.sim_controller, ui_flags))
|
vbox.addWidget(
|
||||||
|
QTopPanel(
|
||||||
|
self.game_model,
|
||||||
|
self.sim_controller,
|
||||||
|
ui_flags,
|
||||||
|
self.reset_to_pre_sim_checkpoint,
|
||||||
|
)
|
||||||
|
)
|
||||||
vbox.addWidget(hbox)
|
vbox.addWidget(hbox)
|
||||||
|
|
||||||
central_widget = QWidget()
|
central_widget = QWidget()
|
||||||
@@ -340,6 +347,23 @@ class QLiberationWindow(QMainWindow):
|
|||||||
except Exception:
|
except Exception:
|
||||||
logging.exception("Error loading save game %s", file[0])
|
logging.exception("Error loading save game %s", file[0])
|
||||||
|
|
||||||
|
def reset_to_pre_sim_checkpoint(self) -> None:
|
||||||
|
"""Loads the game that was saved before pressing the take-off button.
|
||||||
|
|
||||||
|
A checkpoint will be saved when the player presses take-off to save their state
|
||||||
|
before the mission simulation begins. If the mission is aborted, we usually want
|
||||||
|
to reset to the pre-simulation state to allow players to effectively "rewind",
|
||||||
|
since they probably aborted so that they could make changes. Implementing rewind
|
||||||
|
for real is impractical, but checkpoints are easy.
|
||||||
|
"""
|
||||||
|
if self.game is None:
|
||||||
|
raise RuntimeError(
|
||||||
|
"Cannot reset to pre-sim checkpoint when no game is loaded"
|
||||||
|
)
|
||||||
|
GameUpdateSignal.get_instance().game_loaded.emit(
|
||||||
|
self.game.save_manager.load_pre_sim_checkpoint()
|
||||||
|
)
|
||||||
|
|
||||||
def saveGame(self):
|
def saveGame(self):
|
||||||
logging.info("Saving game")
|
logging.info("Saving game")
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional, Callable
|
||||||
|
|
||||||
from PySide6 import QtCore
|
from PySide6 import QtCore
|
||||||
from PySide6.QtCore import QObject, Signal
|
from PySide6.QtCore import QObject, Signal
|
||||||
@@ -52,12 +52,14 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
self,
|
self,
|
||||||
game: Game,
|
game: Game,
|
||||||
sim_controller: SimController,
|
sim_controller: SimController,
|
||||||
|
reset_to_pre_sim_checkpoint: Callable[[], None],
|
||||||
parent: Optional[QWidget] = None,
|
parent: Optional[QWidget] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
super(QWaitingForMissionResultWindow, self).__init__(parent=parent)
|
super(QWaitingForMissionResultWindow, self).__init__(parent=parent)
|
||||||
self.setWindowModality(QtCore.Qt.WindowModal)
|
self.setWindowModality(QtCore.Qt.WindowModal)
|
||||||
self.game = game
|
self.game = game
|
||||||
self.sim_controller = sim_controller
|
self.sim_controller = sim_controller
|
||||||
|
self.reset_to_pre_sim_checkpoint = reset_to_pre_sim_checkpoint
|
||||||
self.setWindowTitle("Waiting for mission completion.")
|
self.setWindowTitle("Waiting for mission completion.")
|
||||||
self.setWindowIcon(QIcon("./resources/icon.png"))
|
self.setWindowIcon(QIcon("./resources/icon.png"))
|
||||||
self.setMinimumHeight(570)
|
self.setMinimumHeight(570)
|
||||||
@@ -111,7 +113,7 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
self.manually_submit.clicked.connect(self.submit_manually)
|
self.manually_submit.clicked.connect(self.submit_manually)
|
||||||
self.actions_layout.addWidget(self.manually_submit)
|
self.actions_layout.addWidget(self.manually_submit)
|
||||||
self.cancel = QPushButton("Abort mission")
|
self.cancel = QPushButton("Abort mission")
|
||||||
self.cancel.clicked.connect(self.close)
|
self.cancel.clicked.connect(self.reject)
|
||||||
self.actions_layout.addWidget(self.cancel)
|
self.actions_layout.addWidget(self.cancel)
|
||||||
self.gridLayout.addWidget(self.actions, 2, 0)
|
self.gridLayout.addWidget(self.actions, 2, 0)
|
||||||
|
|
||||||
@@ -122,7 +124,7 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
self.manually_submit2.clicked.connect(self.submit_manually)
|
self.manually_submit2.clicked.connect(self.submit_manually)
|
||||||
self.actions2_layout.addWidget(self.manually_submit2)
|
self.actions2_layout.addWidget(self.manually_submit2)
|
||||||
self.cancel2 = QPushButton("Abort mission")
|
self.cancel2 = QPushButton("Abort mission")
|
||||||
self.cancel2.clicked.connect(self.close)
|
self.cancel2.clicked.connect(self.reject)
|
||||||
self.actions2_layout.addWidget(self.cancel2)
|
self.actions2_layout.addWidget(self.cancel2)
|
||||||
self.proceed = QPushButton("Accept results")
|
self.proceed = QPushButton("Accept results")
|
||||||
self.proceed.setProperty("style", "btn-success")
|
self.proceed.setProperty("style", "btn-success")
|
||||||
@@ -133,6 +135,11 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
self.layout.addLayout(self.gridLayout, 1, 0)
|
self.layout.addLayout(self.gridLayout, 1, 0)
|
||||||
self.setLayout(self.layout)
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
def reject(self) -> None:
|
||||||
|
if self.game.settings.reload_pre_sim_checkpoint_on_abort:
|
||||||
|
self.reset_to_pre_sim_checkpoint()
|
||||||
|
super().reject()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def add_update_row(description: str, count: int, layout: QGridLayout) -> None:
|
def add_update_row(description: str, count: int, layout: QGridLayout) -> None:
|
||||||
row = layout.rowCount()
|
row = layout.rowCount()
|
||||||
@@ -217,7 +224,7 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
|
|
||||||
GameUpdateSignal.get_instance().sendDebriefing(self.debriefing)
|
GameUpdateSignal.get_instance().sendDebriefing(self.debriefing)
|
||||||
GameUpdateSignal.get_instance().updateGame(self.game)
|
GameUpdateSignal.get_instance().updateGame(self.game)
|
||||||
self.close()
|
self.accept()
|
||||||
|
|
||||||
def closeEvent(self, evt):
|
def closeEvent(self, evt):
|
||||||
super(QWaitingForMissionResultWindow, self).closeEvent(evt)
|
super(QWaitingForMissionResultWindow, self).closeEvent(evt)
|
||||||
|
|||||||
@@ -12,89 +12,61 @@ recommended_enemy_faction: Germany 1944
|
|||||||
recommended_start_date: 1944-07-04
|
recommended_start_date: 1944-07-04
|
||||||
miz: caen_to_evreux.miz
|
miz: caen_to_evreux.miz
|
||||||
performance: 1
|
performance: 1
|
||||||
version: "10.0"
|
version: "10.7"
|
||||||
squadrons:
|
squadrons:
|
||||||
# Evreux
|
# Evreux
|
||||||
26:
|
26:
|
||||||
- primary: BARCAP
|
- primary: Escort
|
||||||
aircraft:
|
|
||||||
- Bf 109 K-4 Kurfürst
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
|
||||||
- Fw 190 A-8 Anton
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
aircraft:
|
||||||
- Fw 190 D-9 Dora
|
- Fw 190 D-9 Dora
|
||||||
|
size: 12
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Ju 88 A-4
|
- Ju 88 A-4
|
||||||
- primary: AEW&C
|
size: 12
|
||||||
- primary: Refueling
|
|
||||||
- primary: Transport
|
|
||||||
# Conches
|
# Conches
|
||||||
40:
|
40:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- Bf 109 K-4 Kurfürst
|
- Bf 109 K-4 Kurfürst
|
||||||
- primary: BARCAP
|
size: 4
|
||||||
aircraft:
|
|
||||||
- Fw 190 A-8 Anton
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
|
||||||
- Fw 190 D-9 Dora
|
|
||||||
- primary: SEAD
|
|
||||||
secondary: any
|
|
||||||
- primary: DEAD
|
|
||||||
secondary: any
|
|
||||||
# Carpiquet
|
# Carpiquet
|
||||||
19:
|
19:
|
||||||
- primary: BARCAP
|
- primary: CAS
|
||||||
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- Thunderbolt Mk.II (Late)
|
- Thunderbolt Mk.II (Late)
|
||||||
- P-47D-40 Thunderbolt
|
- P-47D-40 Thunderbolt
|
||||||
|
size: 12
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
aircraft:
|
secondary: any
|
||||||
- Mustang Mk.IV (Late)
|
|
||||||
- P-51D-30-NA Mustang
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
aircraft:
|
||||||
- Spitfire LF Mk IX
|
- Spitfire LF Mk IX
|
||||||
- primary: BARCAP
|
size: 12
|
||||||
aircraft:
|
- primary: BAI
|
||||||
- Spitfire LF Mk IX (Clipped Wings)
|
|
||||||
- primary: Strike
|
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- MosquitoFBMkVI
|
- MosquitoFBMkVI
|
||||||
- primary: SEAD
|
size: 12
|
||||||
secondary: any
|
- primary: OCA/Runway
|
||||||
- primary: DEAD
|
secondary: air-to-ground
|
||||||
secondary: any
|
aircraft:
|
||||||
|
- Boston Mk.III
|
||||||
|
- A-20G Havoc
|
||||||
|
size: 10
|
||||||
# Ford_AF
|
# Ford_AF
|
||||||
31:
|
31:
|
||||||
- primary: BARCAP
|
- primary: Escort
|
||||||
aircraft:
|
secondary: air-to-air
|
||||||
- Thunderbolt Mk.II (Mid)
|
|
||||||
- P-47D-30 Thunderbolt (Late)
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
|
||||||
- Thunderbolt Mk.II (Early)
|
|
||||||
- P-47D-30 Thunderbolt (Early)
|
|
||||||
- primary: BARCAP
|
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mustang Mk.IV (Early)
|
- Mustang Mk.IV (Early)
|
||||||
- P-51D-25-NA Mustang
|
- P-51D-25-NA Mustang
|
||||||
- primary: Strike
|
size: 10
|
||||||
secondary: air-to-ground
|
|
||||||
aircraft:
|
|
||||||
- Boston Mk.III
|
|
||||||
- A-20G Havoc
|
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Fortress Mk.III
|
- Fortress Mk.III
|
||||||
- B-17G Flying Fortress
|
- B-17G Flying Fortress
|
||||||
- primary: AEW&C
|
size: 10
|
||||||
- primary: Refueling
|
|
||||||
- primary: Transport
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ recommended_enemy_faction: Syria 2011
|
|||||||
description: <p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.<br/><br/>This scenario is designed to be performance and helicopter friendly.</p>
|
description: <p>In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.<br/><br/>This scenario is designed to be performance and helicopter friendly.</p>
|
||||||
miz: golan_heights_lite.miz
|
miz: golan_heights_lite.miz
|
||||||
performance: 1
|
performance: 1
|
||||||
version: "10.5"
|
version: "10.7"
|
||||||
advanced_iads: true # Campaign has connection_nodes / power_sources / command_centers
|
advanced_iads: true # Campaign has connection_nodes / power_sources / command_centers
|
||||||
iads_config:
|
iads_config:
|
||||||
- LHA-1 Tarawa # A Naval Group without connections but still participating as EWR
|
- LHA-1 Tarawa # A Naval Group without connections but still participating as EWR
|
||||||
@@ -102,28 +102,31 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-3A
|
- E-3A
|
||||||
|
size: 1
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
- primary: Transport
|
size: 1
|
||||||
aircraft:
|
- primary: Escort
|
||||||
- C-130
|
secondary: air-to-air
|
||||||
- primary: BARCAP
|
|
||||||
secondary: any
|
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15C Eagle
|
- F-15C Eagle
|
||||||
|
size: 10
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-4E Phantom II
|
- F-4E Phantom II
|
||||||
|
size: 10
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15E Strike Eagle
|
- F-15E Strike Eagle
|
||||||
|
size: 10
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
size: 10
|
||||||
# Golan South
|
# Golan South
|
||||||
Golan South:
|
Golan South:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
@@ -132,65 +135,67 @@ squadrons:
|
|||||||
female_pilot_percentage: 15
|
female_pilot_percentage: 15
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-1W SuperCobra
|
- AH-1W SuperCobra
|
||||||
- primary: CAS
|
size: 4
|
||||||
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
nickname: Defenders of Golan
|
nickname: Defenders of Golan
|
||||||
female_pilot_percentage: 25
|
female_pilot_percentage: 25
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-64D Apache Longbow
|
- AH-64D Apache Longbow
|
||||||
- primary: Transport
|
size: 6
|
||||||
|
- primary: Air Assault
|
||||||
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- UH-1H Iroquois
|
- UH-1H Iroquois
|
||||||
|
size: 2
|
||||||
# Golan North
|
# Golan North
|
||||||
Golan North:
|
Golan North:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
aircraft:
|
|
||||||
- SA 342M Gazelle
|
|
||||||
- primary: Transport
|
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- SA 342M Gazelle
|
||||||
|
size: 4
|
||||||
|
- primary: Air Assault
|
||||||
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-8MTV2 Hip
|
- Mi-8MTV2 Hip
|
||||||
|
size: 2
|
||||||
# Marj Ruhayyil
|
# Marj Ruhayyil
|
||||||
23:
|
23:
|
||||||
- primary: BARCAP
|
- primary: BAI
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- MiG-21bis Fishbed-N
|
- MiG-21bis Fishbed-N
|
||||||
- primary: BARCAP
|
size: 12
|
||||||
|
- primary: Escort
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- MiG-23MLD Flogger-K
|
- MiG-21bis Fishbed-N
|
||||||
- primary: SEAD
|
size: 12
|
||||||
secondary: air-to-ground
|
|
||||||
aircraft:
|
|
||||||
- Su-17M4 Fitter-K
|
|
||||||
- primary: Strike
|
|
||||||
secondary: air-to-ground
|
|
||||||
aircraft:
|
|
||||||
- Su-17M4 Fitter-K
|
|
||||||
# Damascus
|
# Damascus
|
||||||
7:
|
7:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- MiG-29S Fulcrum-C
|
- MiG-23MLD Flogger-K
|
||||||
- primary: BARCAP
|
size: 12
|
||||||
secondary: any
|
- primary: TARCAP
|
||||||
aircraft:
|
|
||||||
- MiG-21bis Fishbed-N
|
|
||||||
- primary: BARCAP
|
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- MiG-25PD Foxbat-E
|
- MiG-25PD Foxbat-E
|
||||||
|
size: 12
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-24M Fencer-D
|
- Su-24M Fencer-D
|
||||||
|
size: 12
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-17M4 Fitter-K
|
- Su-17M4 Fitter-K
|
||||||
|
size: 12
|
||||||
@@ -38,16 +38,20 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
- primary: Anti-ship
|
- primary: Anti-ship
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35
|
- VS-35
|
||||||
|
size: 8
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- HSM-40
|
- HSM-40
|
||||||
|
size: 2
|
||||||
# BLUFOR LHA
|
# BLUFOR LHA
|
||||||
Naval-3:
|
Naval-3:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -58,6 +62,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-169 (UH-1H)
|
- HMLA-169 (UH-1H)
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -109,6 +114,7 @@ squadrons:
|
|||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
# Rio Gallegos
|
# Rio Gallegos
|
||||||
7:
|
7:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
|
|||||||
@@ -198,16 +198,20 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
- primary: Anti-ship
|
- primary: Anti-ship
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35
|
- VS-35
|
||||||
|
size: 8
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- HSM-40
|
- HSM-40
|
||||||
|
size: 2
|
||||||
#BLUFOR LHA
|
#BLUFOR LHA
|
||||||
Naval-3:
|
Naval-3:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -218,6 +222,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-269 (UH-1H)
|
- HMLA-269 (UH-1H)
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -257,6 +262,7 @@ squadrons:
|
|||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VMGR-352
|
- VMGR-352
|
||||||
|
size: 2
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -322,6 +328,7 @@ squadrons:
|
|||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
# Bassel Al-Assad
|
# Bassel Al-Assad
|
||||||
21:
|
21:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
@@ -335,12 +342,15 @@ squadrons:
|
|||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
|
size: 2
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
|
size: 2
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -389,3 +399,4 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-8MTV2 Hip
|
- Mi-8MTV2 Hip
|
||||||
|
size: 4
|
||||||
|
|||||||
@@ -27,16 +27,20 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
- primary: Anti-ship
|
- primary: Anti-ship
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35
|
- VS-35
|
||||||
|
size: 8
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- HSM-40
|
- HSM-40
|
||||||
|
size: 2
|
||||||
# BLUFOR LHA
|
# BLUFOR LHA
|
||||||
Naval-2:
|
Naval-2:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -47,6 +51,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-269 (UH-1H)
|
- HMLA-269 (UH-1H)
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -118,12 +123,15 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78MD
|
- IL-78MD
|
||||||
|
size: 2
|
||||||
# OPFOR First FOB
|
# OPFOR First FOB
|
||||||
FOB Gecitkale:
|
FOB Gecitkale:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
@@ -136,6 +144,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-8MTV2 Hip
|
- Mi-8MTV2 Hip
|
||||||
|
size: 2
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
|
|||||||
@@ -27,16 +27,20 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
- primary: Anti-ship
|
- primary: Anti-ship
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35
|
- VS-35
|
||||||
|
size: 8
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- HSM-40
|
- HSM-40
|
||||||
|
size: 2
|
||||||
# BLUFOR LHA
|
# BLUFOR LHA
|
||||||
Naval-2:
|
Naval-2:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -47,6 +51,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-169 (UH-1H)
|
- HMLA-169 (UH-1H)
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -92,6 +97,7 @@ squadrons:
|
|||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
|
size: 2
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -105,6 +111,7 @@ squadrons:
|
|||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
# Andersen AFB
|
# Andersen AFB
|
||||||
6:
|
6:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
@@ -122,6 +129,7 @@ squadrons:
|
|||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
|
size: 2
|
||||||
# Antonio B. Won Pat Intl
|
# Antonio B. Won Pat Intl
|
||||||
4:
|
4:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ squadrons:
|
|||||||
aircraft:
|
aircraft:
|
||||||
- 101st Combat Aviation Brigade
|
- 101st Combat Aviation Brigade
|
||||||
#US Army UH-60
|
#US Army UH-60
|
||||||
|
size: 6
|
||||||
# Havadarya
|
# Havadarya
|
||||||
9:
|
9:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
@@ -62,9 +63,11 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
# BLUFOR LHA
|
# BLUFOR LHA
|
||||||
BLUFOR LHA:
|
BLUFOR LHA:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -75,6 +78,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-169 (UH-1H)
|
- HMLA-169 (UH-1H)
|
||||||
|
size: 4
|
||||||
# BLUFOR Start FOB
|
# BLUFOR Start FOB
|
||||||
FOB Anguran:
|
FOB Anguran:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
@@ -87,6 +91,7 @@ squadrons:
|
|||||||
aircraft:
|
aircraft:
|
||||||
- Wolfpack, 1-82 ARB
|
- Wolfpack, 1-82 ARB
|
||||||
#US Army Apache AH-64D
|
#US Army Apache AH-64D
|
||||||
|
size: 2
|
||||||
# OPFOR L1F1
|
# OPFOR L1F1
|
||||||
FOB Tang-e Dalan:
|
FOB Tang-e Dalan:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
@@ -140,9 +145,11 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -159,6 +166,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
|
size: 4
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -228,12 +236,15 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78MD
|
- IL-78MD
|
||||||
|
size: 2
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -249,4 +260,4 @@ squadrons:
|
|||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
|
|||||||
@@ -28,16 +28,20 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- VAW-125
|
- VAW-125
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35 (Tanker)
|
- VS-35 (Tanker)
|
||||||
|
size: 4
|
||||||
- primary: Anti-ship
|
- primary: Anti-ship
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- VS-35
|
- VS-35
|
||||||
|
size: 8
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- HSM-40
|
- HSM-40
|
||||||
|
size: 2
|
||||||
# BLUFOR LHA
|
# BLUFOR LHA
|
||||||
Naval-2:
|
Naval-2:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
@@ -48,6 +52,7 @@ squadrons:
|
|||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- HMLA-169 (UH-1H)
|
- HMLA-169 (UH-1H)
|
||||||
|
size: 4
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
@@ -72,12 +77,15 @@ squadrons:
|
|||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
|
size: 2
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
|
size: 2
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78MD
|
- IL-78MD
|
||||||
|
size: 2
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ squadrons:
|
|||||||
aircraft:
|
aircraft:
|
||||||
- 960th AAC Squadron
|
- 960th AAC Squadron
|
||||||
#USAF E-3A
|
#USAF E-3A
|
||||||
|
size: 2
|
||||||
# King Hussein Air College, BLUFOR start
|
# King Hussein Air College, BLUFOR start
|
||||||
19:
|
19:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
@@ -46,6 +47,7 @@ squadrons:
|
|||||||
aircraft:
|
aircraft:
|
||||||
- 101st Combat Aviation Brigade
|
- 101st Combat Aviation Brigade
|
||||||
#US Army UH-60
|
#US Army UH-60
|
||||||
|
size: 4
|
||||||
# FOB Tha'lah, BLUFOR 1st FOB north
|
# FOB Tha'lah, BLUFOR 1st FOB north
|
||||||
FOB Tha'lah:
|
FOB Tha'lah:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ local unitPayloads = {
|
|||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
["CLSID"] = "{M261_M282}",
|
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
||||||
["num"] = 4,
|
["num"] = 4,
|
||||||
},
|
},
|
||||||
[3] = {
|
[3] = {
|
||||||
@@ -17,7 +17,7 @@ local unitPayloads = {
|
|||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{M261_M282}",
|
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -30,19 +30,19 @@ local unitPayloads = {
|
|||||||
["name"] = "Liberation BAI",
|
["name"] = "Liberation BAI",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{M299_4xAGM_114L}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{M299_4xAGM_114L}",
|
||||||
["num"] = 4,
|
["num"] = 4,
|
||||||
},
|
},
|
||||||
[3] = {
|
[3] = {
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{M299_4xAGM_114L}",
|
||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{M299_4xAGM_114L}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -54,21 +54,21 @@ local unitPayloads = {
|
|||||||
["name"] = "Liberation OCA/Aircraft",
|
["name"] = "Liberation OCA/Aircraft",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{M261_M229}",
|
|
||||||
["num"] = 4,
|
|
||||||
},
|
|
||||||
[2] = {
|
|
||||||
["CLSID"] = "{M261_M229}",
|
|
||||||
["num"] = 1,
|
|
||||||
},
|
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[4] = {
|
[2] = {
|
||||||
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
|
||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{M261_M229}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{M261_M229}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 31,
|
[1] = 31,
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ liveries_overrides:
|
|||||||
J-11A Flanker-L:
|
J-11A Flanker-L:
|
||||||
- USN Aggressor VFC-13 'Ferris' (Fictional)
|
- USN Aggressor VFC-13 'Ferris' (Fictional)
|
||||||
JF-17 Thunder:
|
JF-17 Thunder:
|
||||||
- 'Chips' Camo for Blue Side (Fictional)
|
- "'Chips' Camo for Blue Side (Fictional)"
|
||||||
Ka-50 Hokum:
|
Ka-50 Hokum:
|
||||||
- georgia camo
|
- georgia camo
|
||||||
Ka-50 Hokum (Blackshark 3):
|
Ka-50 Hokum (Blackshark 3):
|
||||||
|
|||||||
@@ -56,6 +56,16 @@ def test_save_start_of_turn(game: Game, tmp_bundle: SaveGameBundle) -> None:
|
|||||||
assert zip_file.namelist() == [SaveGameBundle.START_OF_TURN_SAVE_NAME]
|
assert zip_file.namelist() == [SaveGameBundle.START_OF_TURN_SAVE_NAME]
|
||||||
|
|
||||||
|
|
||||||
|
def test_save_pre_sim_checkpoint(game: Game, tmp_bundle: SaveGameBundle) -> None:
|
||||||
|
with ZipFile(tmp_bundle.bundle_path, "r") as zip_file:
|
||||||
|
with pytest.raises(KeyError):
|
||||||
|
zip_file.read(SaveGameBundle.PRE_SIM_CHECKPOINT_SAVE_NAME)
|
||||||
|
tmp_bundle.save_pre_sim_checkpoint(game)
|
||||||
|
|
||||||
|
with ZipFile(tmp_bundle.bundle_path, "r") as zip_file:
|
||||||
|
assert zip_file.namelist() == [SaveGameBundle.PRE_SIM_CHECKPOINT_SAVE_NAME]
|
||||||
|
|
||||||
|
|
||||||
def test_failed_save_leaves_original_intact(
|
def test_failed_save_leaves_original_intact(
|
||||||
game: Game, tmp_bundle: SaveGameBundle
|
game: Game, tmp_bundle: SaveGameBundle
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user