mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Compare commits
7 Commits
2.5.1
...
develop_2_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bdf9d3423 | ||
|
|
0cd359f36b | ||
|
|
39bd6e3c10 | ||
|
|
ed89c49fd4 | ||
|
|
4000b42df2 | ||
|
|
f73a68aeca | ||
|
|
7f8dae003f |
@@ -1,2 +0,0 @@
|
|||||||
# Black
|
|
||||||
a47bef1f1336fd264d0b175f4421758339a30acb
|
|
||||||
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -28,8 +28,7 @@ We will usually need more information for debugging. Include as much of the foll
|
|||||||
|
|
||||||
- DCS Liberation save file (the `.liberation` file you save from the DCS Liberation window). By default these are located in your DCS saved games directory (`%USERPROFILE%/Saved Games/DCS`).
|
- DCS Liberation save file (the `.liberation` file you save from the DCS Liberation window). By default these are located in your DCS saved games directory (`%USERPROFILE%/Saved Games/DCS`).
|
||||||
- The generated mission file (the `.miz` file that you load in DCS to play the turn). By default these are located in your missions directory (`%USERPROFILE%/Saved Games/DCS/Missions`).
|
- The generated mission file (the `.miz` file that you load in DCS to play the turn). By default these are located in your missions directory (`%USERPROFILE%/Saved Games/DCS/Missions`).
|
||||||
- A tacview track file, especially when demonstrating an issue with AI behavior. By default these are located in your Tacview tracks directory (`%USERPROFILE%/Documents/Tacview`).
|
- A tacview track file, especially when demonstrating an issue with AI behavior. By default these are locaed in your Tacview tracks directory (`%USERPROFILE%/Documents/Tacview`).
|
||||||
- The state.json file from the finished mission when the problem is related to results processing. By default these are located in your Liberation install directory.
|
|
||||||
|
|
||||||
**Version information (please complete the following information):**
|
**Version information (please complete the following information):**
|
||||||
- DCS Liberation [e.g. 2.3.1]:
|
- DCS Liberation [e.g. 2.3.1]:
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -11,7 +11,6 @@ a.py
|
|||||||
resources/tools/a.miz
|
resources/tools/a.miz
|
||||||
# User-specific stuff
|
# User-specific stuff
|
||||||
.idea/
|
.idea/
|
||||||
.env
|
|
||||||
|
|
||||||
/kneeboards
|
/kneeboards
|
||||||
/liberation_preferences.json
|
/liberation_preferences.json
|
||||||
|
|||||||
45
changelog.md
45
changelog.md
@@ -1,51 +1,9 @@
|
|||||||
# 2.5.1
|
# 2.4.4
|
||||||
|
|
||||||
## Features/Improvements
|
|
||||||
|
|
||||||
* **[UI]** Engagement ranges are now displayed by default.
|
|
||||||
* **[UI]** Engagement range display generalized to work for all patrolling flight plans (BARCAP, TARCAP, and CAS).
|
|
||||||
* **[Flight Planner]** Front lines no longer project threat zones to avoid pushing BARCAPs back so much. TARCAPs will be forcibly planned but strike packages will not route around front lines even if it is reasonable to do so.
|
|
||||||
|
|
||||||
## Fixes
|
## Fixes
|
||||||
|
|
||||||
* **[Campaigns]** EWRs associated with a base will now only be generated near the base.
|
|
||||||
* **[Flight Planner]** Fixed error when generating AEW&C flight plans in campaigns with no front lines.
|
|
||||||
|
|
||||||
# 2.5.0
|
|
||||||
|
|
||||||
Saves from 2.4 are not compatible with 2.5.
|
|
||||||
|
|
||||||
## Features/Improvements
|
|
||||||
|
|
||||||
* **[Engine]** DCS 2.7 Support
|
|
||||||
* **[UI]** Improved FOB menu, added a custom banner, and do not display aircraft recruitment menu
|
|
||||||
* **[Flight Planner]** Added AEW&C missions. (by siKruger)
|
|
||||||
* **[Kneeboard]** Added dark kneeboard option (by GvonH)
|
|
||||||
* **[Campaigns]** Multiple EWR sites may now be generated, and EWR sites may be generated outside bases (by SnappyComebacks)
|
|
||||||
* **[Mission Generation]** Cloudy and rainy (but not thunderstorm) weather will use the cloud presets from DCS 2.7.
|
|
||||||
* **[Plugins]** Added LotATC export plugin (by drsoran)
|
|
||||||
* **[Plugins]** Added Splash Damage Plugin (by Wheelijoe)
|
|
||||||
* **[Loadouts]** Replaced Litening with ATFLIR for all default F/A-18C loadouts.
|
|
||||||
|
|
||||||
## Fixes
|
|
||||||
|
|
||||||
* **[Flight Planner]** Front lines now project threat zones, so TARCAP/escorts will not be pruned for flights near the front. Packages may also route around the front line when practical.
|
|
||||||
* **[Flight Planner]** Fixed error when planning BAI at SAMs with dead subgroups.
|
|
||||||
* **[Flight Planner]** Mig-19 was not allowed for CAS roles fixed
|
|
||||||
* **[Flight Planner]** Increased size of navigation planning area to avoid plannign failures with distant waypoints.
|
|
||||||
* **[Flight Planner]** Fixed UI refresh when unchecking the "default loadout" box in the loadout editor.
|
|
||||||
* **[Objective names]** Fixed typos in objective name : ARMADILLLO -> ARMADILLO (by SnappyComebacks)
|
|
||||||
* **[Payloads]** F-86 Sabre was missing a custom payload
|
|
||||||
* **[Payloads]** Added GAR-8 period restrictions (by Mustang-25)
|
|
||||||
* **[Campaign]** Date now progresses.
|
|
||||||
* **[Campaign]** Added game over message when a coalition runs out of functioning airbases.
|
|
||||||
* **[Mission Generation]** Fixed "invalid face handle" error in kneeboard generation that occurred on some machines.
|
* **[Mission Generation]** Fixed "invalid face handle" error in kneeboard generation that occurred on some machines.
|
||||||
|
|
||||||
## Regressions
|
|
||||||
|
|
||||||
* **[Mod Support]** Stopped support for 2.5.5 Rafale Mode, and removed factions that were using it
|
|
||||||
* **[Mod Support]** Su-57 mod support might be out of date
|
|
||||||
|
|
||||||
# 2.4.3
|
# 2.4.3
|
||||||
|
|
||||||
## Features/Improvements
|
## Features/Improvements
|
||||||
@@ -56,6 +14,7 @@ Saves from 2.4 are not compatible with 2.5.
|
|||||||
|
|
||||||
* **[Mods]** Updated C-130J mod data to version 6.4
|
* **[Mods]** Updated C-130J mod data to version 6.4
|
||||||
* **[Mods]** Updated F-22A mod to latest version
|
* **[Mods]** Updated F-22A mod to latest version
|
||||||
|
* **[Payload]** Mirage-2000C : Added Eclair counter measures pod to all default loadouts
|
||||||
|
|
||||||
# 2.4.2
|
# 2.4.2
|
||||||
|
|
||||||
|
|||||||
@@ -2,21 +2,20 @@ from dcs.vehicles import AirDefence
|
|||||||
|
|
||||||
AAA_UNITS = [
|
AAA_UNITS = [
|
||||||
AirDefence.SPAAA_Gepard,
|
AirDefence.SPAAA_Gepard,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
AirDefence.AAA_ZU_23_Emplacement,
|
AirDefence.AAA_ZU_23_Emplacement,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent,
|
AirDefence.AAA_ZU_23_Insurgent_Closed,
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
|
||||||
AirDefence.AAA_ZU_23_Insurgent,
|
AirDefence.AAA_ZU_23_Insurgent,
|
||||||
AirDefence.AAA_8_8cm_Flak_18,
|
AirDefence.AAA_8_8cm_Flak_18,
|
||||||
AirDefence.AAA_Flak_38_20mm,
|
AirDefence.AAA_Flak_38,
|
||||||
AirDefence.AAA_8_8cm_Flak_36,
|
AirDefence.AAA_8_8cm_Flak_36,
|
||||||
AirDefence.AAA_8_8cm_Flak_37,
|
AirDefence.AAA_8_8cm_Flak_37,
|
||||||
AirDefence.AAA_Flak_Vierling_38_Quad_20mm,
|
AirDefence.AAA_Flak_Vierling_38,
|
||||||
AirDefence.AAA_SP_Kdo_G_40,
|
AirDefence.AAA_Kdo_G_40,
|
||||||
AirDefence.AAA_8_8cm_Flak_41,
|
AirDefence.AAA_8_8cm_Flak_41,
|
||||||
AirDefence.AAA_40mm_Bofors,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
AirDefence.AAA_S_60_57mm,
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from dcs.ships import (
|
from dcs.ships import (
|
||||||
Battlecruiser_1144_2_Pyotr_Velikiy,
|
CGN_1144_2_Pyotr_Velikiy,
|
||||||
Cruiser_1164_Moskva,
|
CG_1164_Moskva,
|
||||||
CVN_70_Carl_Vinson,
|
CVN_70_Carl_Vinson,
|
||||||
CVN_71_Theodore_Roosevelt,
|
CVN_71_Theodore_Roosevelt,
|
||||||
CVN_72_Abraham_Lincoln,
|
CVN_72_Abraham_Lincoln,
|
||||||
@@ -8,63 +8,63 @@ from dcs.ships import (
|
|||||||
CVN_74_John_C__Stennis,
|
CVN_74_John_C__Stennis,
|
||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
CV_1143_5_Admiral_Kuznetsov_2017,
|
CV_1143_5_Admiral_Kuznetsov_2017,
|
||||||
Frigate_11540_Neustrashimy,
|
FFG_11540_Neustrashimy,
|
||||||
Corvette_1124_4_Grisha,
|
FFL_1124_4_Grisha,
|
||||||
Frigate_1135M_Rezky,
|
FF_1135M_Rezky,
|
||||||
Corvette_1241_1_Molniya,
|
FSG_1241_1MP_Molniya,
|
||||||
LHA_1_Tarawa,
|
LHA_1_Tarawa,
|
||||||
FFG_Oliver_Hazzard_Perry,
|
Oliver_Hazzard_Perry_class,
|
||||||
CG_Ticonderoga,
|
Ticonderoga_class,
|
||||||
Type_052B_Destroyer,
|
Type_052B_Destroyer,
|
||||||
Type_052C_Destroyer,
|
Type_052C_Destroyer,
|
||||||
Type_054A_Frigate,
|
Type_054A_Frigate,
|
||||||
DDG_Arleigh_Burke_IIa,
|
USS_Arleigh_Burke_IIa,
|
||||||
)
|
)
|
||||||
from dcs.vehicles import AirDefence
|
from dcs.vehicles import AirDefence
|
||||||
|
|
||||||
UNITS_WITH_RADAR = [
|
UNITS_WITH_RADAR = [
|
||||||
# Radars
|
# Radars
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_C2,
|
AirDefence.SAM_SA_11_Buk_CC_9S470M1,
|
||||||
AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137,
|
AirDefence.SAM_Patriot_AMG_AN_MRC_137,
|
||||||
AirDefence.SAM_Patriot_ECS,
|
AirDefence.SAM_Patriot_ECS_AN_MSQ_104,
|
||||||
AirDefence.SPAAA_Gepard,
|
AirDefence.SPAAA_Gepard,
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
AirDefence.EWR_1L13,
|
AirDefence.EWR_1L13,
|
||||||
AirDefence.SAM_SA_6_Kub_Long_Track_STR,
|
AirDefence.SAM_SA_6_Kub_STR_9S91,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR,
|
AirDefence.SAM_SA_10_S_300PS_TR_30N6,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR,
|
AirDefence.SAM_SA_10_S_300PS_SR_5N66M,
|
||||||
AirDefence.EWR_55G6,
|
AirDefence.EWR_55G6,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR,
|
AirDefence.SAM_SA_10_S_300PS_SR_64H6E,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR,
|
AirDefence.SAM_SA_11_Buk_SR_9S18M1,
|
||||||
AirDefence.MCC_SR_Sborka_Dog_Ear_SR,
|
AirDefence.CP_9S80M1_Sborka,
|
||||||
AirDefence.SAM_Hawk_TR__AN_MPQ_46,
|
AirDefence.SAM_Hawk_TR_AN_MPQ_46,
|
||||||
AirDefence.SAM_Hawk_SR__AN_MPQ_50,
|
AirDefence.SAM_Hawk_SR_AN_MPQ_50,
|
||||||
AirDefence.SAM_Patriot_STR,
|
AirDefence.SAM_Patriot_STR_AN_MPQ_53,
|
||||||
AirDefence.SAM_Hawk_CWAR_AN_MPQ_55,
|
AirDefence.SAM_Hawk_CWAR_AN_MPQ_55,
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3,
|
AirDefence.SAM_SR_P_19,
|
||||||
AirDefence.SAM_Roland_EWR,
|
AirDefence.SAM_Roland_EWR,
|
||||||
AirDefence.SAM_SA_3_S_125_Low_Blow_TR,
|
AirDefence.SAM_SA_3_S_125_TR_SNR,
|
||||||
AirDefence.SAM_SA_2_S_75_Fan_Song_TR,
|
AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song,
|
||||||
AirDefence.HQ_7_Self_Propelled_STR,
|
AirDefence.HQ_7_Self_Propelled_STR,
|
||||||
# Ships
|
# Ships
|
||||||
CVN_70_Carl_Vinson,
|
CVN_70_Carl_Vinson,
|
||||||
FFG_Oliver_Hazzard_Perry,
|
Oliver_Hazzard_Perry_class,
|
||||||
CG_Ticonderoga,
|
Ticonderoga_class,
|
||||||
Corvette_1124_4_Grisha,
|
FFL_1124_4_Grisha,
|
||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
Corvette_1241_1_Molniya,
|
FSG_1241_1MP_Molniya,
|
||||||
Cruiser_1164_Moskva,
|
CG_1164_Moskva,
|
||||||
Frigate_11540_Neustrashimy,
|
FFG_11540_Neustrashimy,
|
||||||
Battlecruiser_1144_2_Pyotr_Velikiy,
|
CGN_1144_2_Pyotr_Velikiy,
|
||||||
Frigate_1135M_Rezky,
|
FF_1135M_Rezky,
|
||||||
CV_1143_5_Admiral_Kuznetsov_2017,
|
CV_1143_5_Admiral_Kuznetsov_2017,
|
||||||
CVN_74_John_C__Stennis,
|
CVN_74_John_C__Stennis,
|
||||||
CVN_71_Theodore_Roosevelt,
|
CVN_71_Theodore_Roosevelt,
|
||||||
CVN_72_Abraham_Lincoln,
|
CVN_72_Abraham_Lincoln,
|
||||||
CVN_73_George_Washington,
|
CVN_73_George_Washington,
|
||||||
DDG_Arleigh_Burke_IIa,
|
USS_Arleigh_Burke_IIa,
|
||||||
LHA_1_Tarawa,
|
LHA_1_Tarawa,
|
||||||
Type_052B_Destroyer,
|
Type_052B_Destroyer,
|
||||||
Type_054A_Frigate,
|
Type_054A_Frigate,
|
||||||
|
|||||||
1073
game/data/weapons.py
1073
game/data/weapons.py
File diff suppressed because it is too large
Load Diff
538
game/db.py
538
game/db.py
@@ -51,6 +51,7 @@ from dcs.planes import (
|
|||||||
F_117A,
|
F_117A,
|
||||||
F_14A_135_GR,
|
F_14A_135_GR,
|
||||||
F_14B,
|
F_14B,
|
||||||
|
F_111F,
|
||||||
F_15C,
|
F_15C,
|
||||||
F_15E,
|
F_15E,
|
||||||
F_16A,
|
F_16A,
|
||||||
@@ -115,8 +116,8 @@ from dcs.planes import (
|
|||||||
I_16,
|
I_16,
|
||||||
)
|
)
|
||||||
from dcs.ships import (
|
from dcs.ships import (
|
||||||
Boat_Armed_Hi_speed,
|
Armed_speedboat,
|
||||||
Bulker_Yakushev,
|
Bulk_cargo_ship_Yakushev,
|
||||||
CVN_71_Theodore_Roosevelt,
|
CVN_71_Theodore_Roosevelt,
|
||||||
CVN_72_Abraham_Lincoln,
|
CVN_72_Abraham_Lincoln,
|
||||||
CVN_73_George_Washington,
|
CVN_73_George_Washington,
|
||||||
@@ -124,7 +125,7 @@ from dcs.ships import (
|
|||||||
CVN_75_Harry_S__Truman,
|
CVN_75_Harry_S__Truman,
|
||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
CV_1143_5_Admiral_Kuznetsov_2017,
|
CV_1143_5_Admiral_Kuznetsov_2017,
|
||||||
Cargo_Ivanov,
|
Dry_cargo_ship_Ivanov,
|
||||||
LHA_1_Tarawa,
|
LHA_1_Tarawa,
|
||||||
Tanker_Elnya_160,
|
Tanker_Elnya_160,
|
||||||
ship_map,
|
ship_map,
|
||||||
@@ -173,6 +174,7 @@ from pydcs_extensions.a4ec.a4ec import A_4E_C
|
|||||||
from pydcs_extensions.f22a.f22a import F_22A
|
from pydcs_extensions.f22a.f22a import F_22A
|
||||||
from pydcs_extensions.hercules.hercules import Hercules
|
from pydcs_extensions.hercules.hercules import Hercules
|
||||||
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
||||||
|
from pydcs_extensions.rafale.rafale import Rafale_A_S, Rafale_M, Rafale_B
|
||||||
from pydcs_extensions.su57.su57 import Su_57
|
from pydcs_extensions.su57.su57 import Su_57
|
||||||
|
|
||||||
UNITINFOTEXT_PATH = Path("./resources/units/unit_info_text.json")
|
UNITINFOTEXT_PATH = Path("./resources/units/unit_info_text.json")
|
||||||
@@ -180,6 +182,9 @@ UNITINFOTEXT_PATH = Path("./resources/units/unit_info_text.json")
|
|||||||
plane_map["A-4E-C"] = A_4E_C
|
plane_map["A-4E-C"] = A_4E_C
|
||||||
plane_map["F-22A"] = F_22A
|
plane_map["F-22A"] = F_22A
|
||||||
plane_map["MB-339PAN"] = MB_339PAN
|
plane_map["MB-339PAN"] = MB_339PAN
|
||||||
|
plane_map["Rafale_M"] = Rafale_M
|
||||||
|
plane_map["Rafale_A_S"] = Rafale_A_S
|
||||||
|
plane_map["Rafale_B"] = Rafale_B
|
||||||
plane_map["Su-57"] = Su_57
|
plane_map["Su-57"] = Su_57
|
||||||
plane_map["Hercules"] = Hercules
|
plane_map["Hercules"] = Hercules
|
||||||
|
|
||||||
@@ -355,7 +360,7 @@ x_map = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
from this example `Identifier` should be used (which may or may not include category of the unit and dot + underscore characters).
|
from this example `Identifier` should be used (which may or may not include category of the unit and dot + underscore characters).
|
||||||
For example, player accessible Hornet is called `FA_18C_hornet`, and MANPAD Igla is called `AirDefence.MANPADS_SA_18_Igla_S_Grouse`
|
For example, player accessible Hornet is called `FA_18C_hornet`, and MANPAD Igla is called `AirDefence.SAM_SA_18_Igla_S_MANPADS`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# This should probably be much higher, but the AI doesn't rollover their budget
|
# This should probably be much higher, but the AI doesn't rollover their budget
|
||||||
@@ -448,6 +453,7 @@ PRICES = {
|
|||||||
Tu_160: 50,
|
Tu_160: 50,
|
||||||
Tu_22M3: 40,
|
Tu_22M3: 40,
|
||||||
Tu_95MS: 35,
|
Tu_95MS: 35,
|
||||||
|
F_111F: 21,
|
||||||
# special
|
# special
|
||||||
IL_76MD: 30,
|
IL_76MD: 30,
|
||||||
An_26B: 25,
|
An_26B: 25,
|
||||||
@@ -475,11 +481,15 @@ PRICES = {
|
|||||||
MQ_9_Reaper: 12,
|
MQ_9_Reaper: 12,
|
||||||
RQ_1A_Predator: 6,
|
RQ_1A_Predator: 6,
|
||||||
WingLoong_I: 6,
|
WingLoong_I: 6,
|
||||||
|
# Modded
|
||||||
|
Rafale_M: 26,
|
||||||
|
Rafale_A_S: 26,
|
||||||
|
Rafale_B: 26,
|
||||||
# armor
|
# armor
|
||||||
Armor.APC_MTLB: 4,
|
Armor.APC_MTLB: 4,
|
||||||
Artillery.Grad_MRL_FDDM__FC: 4,
|
Armor.FDDM_Grad: 4,
|
||||||
Armor.IFV_BRDM_2: 6,
|
Armor.ARV_BRDM_2: 6,
|
||||||
Armor.APC_BTR_RD: 6,
|
Armor.ARV_BTR_RD: 6,
|
||||||
Armor.APC_BTR_80: 8,
|
Armor.APC_BTR_80: 8,
|
||||||
Armor.APC_BTR_82A: 10,
|
Armor.APC_BTR_82A: 10,
|
||||||
Armor.MBT_T_55: 18,
|
Armor.MBT_T_55: 18,
|
||||||
@@ -493,149 +503,147 @@ PRICES = {
|
|||||||
Armor.IFV_BMP_3: 18,
|
Armor.IFV_BMP_3: 18,
|
||||||
Armor.ZBD_04A: 12,
|
Armor.ZBD_04A: 12,
|
||||||
Armor.ZTZ_96B: 30,
|
Armor.ZTZ_96B: 30,
|
||||||
Armor.APC_Cobra__Scout: 4,
|
Armor.APC_Cobra: 4,
|
||||||
Armor.APC_M113: 6,
|
Armor.APC_M113: 6,
|
||||||
Armor.APC_HMMWV__Scout: 2,
|
Armor.APC_M1043_HMMWV_Armament: 2,
|
||||||
Armor.ATGM_HMMWV: 8,
|
Armor.ATGM_M1045_HMMWV_TOW: 8,
|
||||||
Armor.IFV_M2A2_Bradley: 12,
|
Armor.IFV_M2A2_Bradley: 12,
|
||||||
Armor.IFV_M1126_Stryker_ICV: 10,
|
Armor.APC_M1126_Stryker_ICV: 10,
|
||||||
Armor.SPG_Stryker_MGS: 14,
|
Armor.SPG_M1128_Stryker_MGS: 14,
|
||||||
Armor.ATGM_Stryker: 12,
|
Armor.ATGM_M1134_Stryker: 12,
|
||||||
Armor.MBT_M60A3_Patton: 16,
|
Armor.MBT_M60A3_Patton: 16,
|
||||||
Armor.MBT_M1A2_Abrams: 25,
|
Armor.MBT_M1A2_Abrams: 25,
|
||||||
Armor.MBT_Leclerc: 25,
|
Armor.MBT_Leclerc: 25,
|
||||||
Armor.MBT_Leopard_1A3: 20,
|
Armor.MBT_Leopard_1A3: 20,
|
||||||
Armor.MBT_Leopard_2: 25,
|
Armor.MBT_Leopard_2: 25,
|
||||||
Armor.MBT_Merkava_IV: 25,
|
Armor.MBT_Merkava_Mk__4: 25,
|
||||||
Armor.APC_TPz_Fuchs: 5,
|
Armor.TPz_Fuchs: 5,
|
||||||
Armor.MBT_Challenger_II: 25,
|
Armor.MBT_Challenger_II: 25,
|
||||||
Armor.IFV_Marder: 10,
|
Armor.IFV_Marder: 10,
|
||||||
Armor.IFV_Warrior: 10,
|
Armor.IFV_MCV_80: 10,
|
||||||
Armor.IFV_LAV_25: 7,
|
Armor.IFV_LAV_25: 7,
|
||||||
Artillery.MLRS_M270_227mm: 55,
|
Artillery.MLRS_M270: 55,
|
||||||
Artillery.SPH_M109_Paladin_155mm: 25,
|
Artillery.SPH_M109_Paladin: 25,
|
||||||
Artillery.SPH_2S9_Nona_120mm_M: 12,
|
Artillery.SPH_2S9_Nona: 12,
|
||||||
Artillery.SPH_2S1_Gvozdika_122mm: 18,
|
Artillery.SPH_2S1_Gvozdika: 18,
|
||||||
Artillery.SPH_2S3_Akatsia_152mm: 24,
|
Artillery.SPH_2S3_Akatsia: 24,
|
||||||
Artillery.SPH_2S19_Msta_152mm: 30,
|
Artillery.SPH_2S19_Msta: 30,
|
||||||
Artillery.MLRS_BM_21_Grad_122mm: 15,
|
Artillery.MLRS_BM_21_Grad: 15,
|
||||||
Artillery.MLRS_BM_27_Uragan_220mm: 50,
|
Artillery.MLRS_9K57_Uragan_BM_27: 50,
|
||||||
Artillery.MLRS_9A52_Smerch_HE_300mm: 40,
|
Artillery.MLRS_9A52_Smerch: 40,
|
||||||
Artillery.Mortar_2B11_120mm: 4,
|
Artillery._2B11_mortar: 4,
|
||||||
Artillery.SPH_Dana_vz77_152mm: 26,
|
Artillery.SpGH_Dana: 26,
|
||||||
Artillery.PLZ_05: 25,
|
Unarmed.Transport_UAZ_469: 3,
|
||||||
Unarmed.LUV_UAZ_469_Jeep: 3,
|
Unarmed.Transport_Ural_375: 3,
|
||||||
Unarmed.Truck_Ural_375: 3,
|
|
||||||
Infantry.Infantry_M4: 1,
|
Infantry.Infantry_M4: 1,
|
||||||
Infantry.Infantry_AK_74: 1,
|
Infantry.Soldier_AK: 1,
|
||||||
Unarmed.Truck_M818_6x6: 3,
|
Unarmed.Transport_M818: 3,
|
||||||
# WW2
|
# WW2
|
||||||
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24,
|
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24,
|
||||||
Armor.MT_PzIV_H: 16,
|
Armor.MT_Pz_Kpfw_IV_Ausf_H: 16,
|
||||||
Armor.HT_Pz_Kpfw_VI_Tiger_I: 24,
|
Armor.HT_Pz_Kpfw_VI_Tiger_I: 24,
|
||||||
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II: 26,
|
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II: 26,
|
||||||
Armor.SPG_Jagdpanther_G1: 18,
|
Armor.TD_Jagdpanther_G1: 18,
|
||||||
Armor.SPG_Jagdpanzer_IV: 11,
|
Armor.TD_Jagdpanzer_IV: 11,
|
||||||
Armor.SPG_Sd_Kfz_184_Elefant: 18,
|
Armor.Sd_Kfz_184_Elefant: 18,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack: 4,
|
Armor.APC_Sd_Kfz_251: 4,
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma: 8,
|
Armor.AC_Sd_Kfz_234_2_Puma: 8,
|
||||||
Armor.MT_M4_Sherman: 12,
|
Armor.MT_M4_Sherman: 12,
|
||||||
Armor.MT_M4A4_Sherman_Firefly: 16,
|
Armor.MT_M4A4_Sherman_Firefly: 16,
|
||||||
Armor.CT_Cromwell_IV: 12,
|
Armor.CT_Cromwell_IV: 12,
|
||||||
Unarmed.Carrier_M30_Cargo: 2,
|
Armor.M30_Cargo_Carrier: 2,
|
||||||
Armor.APC_M2A1_Halftrack: 4,
|
Armor.APC_M2A1: 4,
|
||||||
Armor.CT_Centaur_IV: 10,
|
Armor.CT_Centaur_IV: 10,
|
||||||
Armor.HIT_Churchill_VII: 16,
|
Armor.HIT_Churchill_VII: 16,
|
||||||
Armor.Car_M8_Greyhound_Armored: 8,
|
Armor.LAC_M8_Greyhound: 8,
|
||||||
Armor.SPG_M10_GMC: 14,
|
Armor.TD_M10_GMC: 14,
|
||||||
Armor.SPG_StuG_III_Ausf__G: 12,
|
Armor.StuG_III_Ausf__G: 12,
|
||||||
Armor.SPG_StuG_IV: 14,
|
Armor.StuG_IV: 14,
|
||||||
Artillery.SPG_M12_GMC_155mm: 10,
|
Artillery.M12_GMC: 10,
|
||||||
Artillery.SPG_Sturmpanzer_IV_Brummbar: 10,
|
Artillery.Sturmpanzer_IV_Brummbär: 10,
|
||||||
Armor.Car_Daimler_Armored: 8,
|
Armor.Daimler_Armoured_Car: 8,
|
||||||
Armor.LT_Mk_VII_Tetrarch: 8,
|
Armor.LT_Mk_VII_Tetrarch: 8,
|
||||||
Unarmed.Tractor_M4_Hi_Speed: 2,
|
Armor.M4_Tractor: 2,
|
||||||
# ship
|
# ship
|
||||||
CV_1143_5_Admiral_Kuznetsov: 100,
|
CV_1143_5_Admiral_Kuznetsov: 100,
|
||||||
CVN_74_John_C__Stennis: 100,
|
CVN_74_John_C__Stennis: 100,
|
||||||
LHA_1_Tarawa: 50,
|
LHA_1_Tarawa: 50,
|
||||||
Bulker_Yakushev: 10,
|
Bulk_cargo_ship_Yakushev: 10,
|
||||||
Boat_Armed_Hi_speed: 10,
|
Armed_speedboat: 10,
|
||||||
Cargo_Ivanov: 10,
|
Dry_cargo_ship_Ivanov: 10,
|
||||||
Tanker_Elnya_160: 10,
|
Tanker_Elnya_160: 10,
|
||||||
# Air Defence units
|
# Air Defence units
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison: 30,
|
AirDefence.SAM_SA_19_Tunguska_2S6: 30,
|
||||||
AirDefence.SAM_SA_6_Kub_Gainful_TEL: 20,
|
AirDefence.SAM_SA_6_Kub_LN_2P25: 20,
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN: 6,
|
AirDefence.SAM_SA_3_S_125_LN_5P73: 6,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL: 30,
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1: 30,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_C2: 25,
|
AirDefence.SAM_SA_11_Buk_CC_9S470M1: 25,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR: 28,
|
AirDefence.SAM_SA_11_Buk_SR_9S18M1: 28,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL: 28,
|
AirDefence.SAM_SA_8_Osa_9A33: 28,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet: 40,
|
AirDefence.SAM_SA_15_Tor_9A331: 40,
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL: 16,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 16,
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL: 12,
|
AirDefence.SAM_SA_9_Strela_1_9P31: 12,
|
||||||
AirDefence.SAM_SA_8_Osa_LD_9T217: 22,
|
AirDefence.SAM_SA_8_Osa_LD_9T217: 22,
|
||||||
AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137: 35,
|
AirDefence.SAM_Patriot_AMG_AN_MRC_137: 35,
|
||||||
AirDefence.SAM_Patriot_ECS: 30,
|
AirDefence.SAM_Patriot_ECS_AN_MSQ_104: 30,
|
||||||
AirDefence.SPAAA_Gepard: 24,
|
AirDefence.SPAAA_Gepard: 24,
|
||||||
AirDefence.SAM_Hawk_Generator__PCP: 14,
|
AirDefence.SAM_Hawk_PCP: 14,
|
||||||
AirDefence.SPAAA_Vulcan_M163: 10,
|
AirDefence.AAA_Vulcan_M163: 10,
|
||||||
AirDefence.SAM_Hawk_LN_M192: 8,
|
AirDefence.SAM_Hawk_LN_M192: 8,
|
||||||
AirDefence.SAM_Chaparral_M48: 16,
|
AirDefence.SAM_Chaparral_M48: 16,
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6: 18,
|
AirDefence.SAM_Linebacker_M6: 18,
|
||||||
AirDefence.SAM_Patriot_LN: 15,
|
AirDefence.SAM_Patriot_LN_M901: 15,
|
||||||
AirDefence.SAM_Avenger__Stinger: 20,
|
AirDefence.SAM_Avenger_M1097: 20,
|
||||||
AirDefence.SAM_Patriot_EPP_III: 15,
|
AirDefence.SAM_Patriot_EPP_III: 15,
|
||||||
AirDefence.SAM_Patriot_C2_ICC: 18,
|
AirDefence.SAM_Patriot_ICC: 18,
|
||||||
AirDefence.SAM_Roland_ADS: 12,
|
AirDefence.SAM_Roland_ADS: 12,
|
||||||
AirDefence.MANPADS_Stinger: 6,
|
AirDefence.Stinger_MANPADS: 6,
|
||||||
AirDefence.MANPADS_Stinger_C2_Desert: 4,
|
AirDefence.SAM_Stinger_comm_dsr: 4,
|
||||||
AirDefence.MANPADS_Stinger_C2: 4,
|
AirDefence.SAM_Stinger_comm: 4,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish: 10,
|
AirDefence.SPAAA_ZSU_23_4_Shilka: 10,
|
||||||
AirDefence.SPAAA_ZSU_57_2: 12,
|
AirDefence.AAA_ZSU_57_2: 12,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement: 6,
|
AirDefence.AAA_ZU_23_Closed: 6,
|
||||||
AirDefence.AAA_ZU_23_Emplacement: 6,
|
AirDefence.AAA_ZU_23_Emplacement: 6,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 7,
|
AirDefence.AAA_ZU_23_on_Ural_375: 7,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 6,
|
AirDefence.AAA_ZU_23_Insurgent_Closed: 6,
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 7,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375: 7,
|
||||||
AirDefence.AAA_ZU_23_Insurgent: 6,
|
AirDefence.AAA_ZU_23_Insurgent: 6,
|
||||||
AirDefence.MANPADS_SA_18_Igla_Grouse: 10,
|
AirDefence.SAM_SA_18_Igla_MANPADS: 10,
|
||||||
AirDefence.MANPADS_SA_18_Igla_Grouse_C2: 8,
|
AirDefence.SAM_SA_18_Igla_comm: 8,
|
||||||
AirDefence.MANPADS_SA_18_Igla_S_Grouse: 12,
|
AirDefence.SAM_SA_18_Igla_S_MANPADS: 12,
|
||||||
AirDefence.MANPADS_SA_18_Igla_S_Grouse_C2: 8,
|
AirDefence.SAM_SA_18_Igla_S_comm: 8,
|
||||||
AirDefence.EWR_1L13: 30,
|
AirDefence.EWR_1L13: 30,
|
||||||
AirDefence.SAM_SA_6_Kub_Long_Track_STR: 22,
|
AirDefence.SAM_SA_6_Kub_STR_9S91: 22,
|
||||||
AirDefence.EWR_55G6: 30,
|
AirDefence.EWR_55G6: 30,
|
||||||
AirDefence.MCC_SR_Sborka_Dog_Ear_SR: 10,
|
AirDefence.CP_9S80M1_Sborka: 10,
|
||||||
AirDefence.SAM_Hawk_TR__AN_MPQ_46: 14,
|
AirDefence.SAM_Hawk_TR_AN_MPQ_46: 14,
|
||||||
AirDefence.SAM_Hawk_SR__AN_MPQ_50: 18,
|
AirDefence.SAM_Hawk_SR_AN_MPQ_50: 18,
|
||||||
AirDefence.SAM_Patriot_STR: 22,
|
AirDefence.SAM_Patriot_STR_AN_MPQ_53: 22,
|
||||||
AirDefence.SAM_Hawk_CWAR_AN_MPQ_55: 20,
|
AirDefence.SAM_Hawk_CWAR_AN_MPQ_55: 20,
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: 14,
|
AirDefence.SAM_SR_P_19: 14,
|
||||||
AirDefence.SAM_Roland_EWR: 16,
|
AirDefence.SAM_Roland_EWR: 16,
|
||||||
AirDefence.SAM_SA_3_S_125_Low_Blow_TR: 14,
|
AirDefence.SAM_SA_3_S_125_TR_SNR: 14,
|
||||||
AirDefence.SAM_SA_2_S_75_Guideline_LN: 8,
|
AirDefence.SAM_SA_2_LN_SM_90: 8,
|
||||||
AirDefence.SAM_SA_2_S_75_Fan_Song_TR: 12,
|
AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song: 12,
|
||||||
AirDefence.SAM_Rapier_LN: 6,
|
AirDefence.Rapier_FSA_Launcher: 6,
|
||||||
AirDefence.SAM_Rapier_Tracker: 6,
|
AirDefence.Rapier_FSA_Optical_Tracker: 6,
|
||||||
AirDefence.SAM_Rapier_Blindfire_TR: 8,
|
AirDefence.Rapier_FSA_Blindfire_Tracker: 8,
|
||||||
AirDefence.HQ_7_Self_Propelled_LN: 20,
|
AirDefence.HQ_7_Self_Propelled_LN: 20,
|
||||||
AirDefence.HQ_7_Self_Propelled_STR: 24,
|
AirDefence.HQ_7_Self_Propelled_STR: 24,
|
||||||
AirDefence.AAA_8_8cm_Flak_18: 6,
|
AirDefence.AAA_8_8cm_Flak_18: 6,
|
||||||
AirDefence.AAA_Flak_38_20mm: 6,
|
AirDefence.AAA_Flak_38: 6,
|
||||||
AirDefence.AAA_8_8cm_Flak_36: 8,
|
AirDefence.AAA_8_8cm_Flak_36: 8,
|
||||||
AirDefence.AAA_8_8cm_Flak_37: 9,
|
AirDefence.AAA_8_8cm_Flak_37: 9,
|
||||||
AirDefence.AAA_Flak_Vierling_38_Quad_20mm: 5,
|
AirDefence.AAA_Flak_Vierling_38: 5,
|
||||||
AirDefence.AAA_SP_Kdo_G_40: 8,
|
AirDefence.AAA_Kdo_G_40: 8,
|
||||||
AirDefence.SL_Flakscheinwerfer_37: 4,
|
AirDefence.Flak_Searchlight_37: 4,
|
||||||
AirDefence.PU_Maschinensatz_33: 10,
|
AirDefence.Maschinensatz_33: 10,
|
||||||
AirDefence.AAA_8_8cm_Flak_41: 10,
|
AirDefence.AAA_8_8cm_Flak_41: 10,
|
||||||
AirDefence.EWR_FuMG_401_Freya_LZ: 25,
|
AirDefence.EWR_FuMG_401_Freya_LZ: 25,
|
||||||
AirDefence.AAA_40mm_Bofors: 8,
|
AirDefence.AAA_Bofors_40mm: 8,
|
||||||
AirDefence.AAA_S_60_57mm: 8,
|
|
||||||
AirDefence.AAA_M1_37mm: 7,
|
AirDefence.AAA_M1_37mm: 7,
|
||||||
AirDefence.AAA_M45_Quadmount_HB_12_7mm: 4,
|
AirDefence.AAA_M45_Quadmount: 4,
|
||||||
AirDefence.AAA_QF_3_7: 10,
|
AirDefence.AA_gun_QF_3_7: 10,
|
||||||
# FRENCH PACK MOD
|
# FRENCH PACK MOD
|
||||||
frenchpack.AMX_10RCR: 10,
|
frenchpack.AMX_10RCR: 10,
|
||||||
frenchpack.AMX_10RCR_SEPAR: 12,
|
frenchpack.AMX_10RCR_SEPAR: 12,
|
||||||
@@ -666,12 +674,12 @@ PRICES = {
|
|||||||
frenchpack.DIM__TOYOTA_DESERT: 2,
|
frenchpack.DIM__TOYOTA_DESERT: 2,
|
||||||
frenchpack.DIM__KAMIKAZE: 6,
|
frenchpack.DIM__KAMIKAZE: 6,
|
||||||
# SA-10
|
# SA-10
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_C2: 18,
|
AirDefence.SAM_SA_10_S_300PS_CP_54K6: 18,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: 24,
|
AirDefence.SAM_SA_10_S_300PS_TR_30N6: 24,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR: 30,
|
AirDefence.SAM_SA_10_S_300PS_SR_5N66M: 30,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR: 30,
|
AirDefence.SAM_SA_10_S_300PS_SR_64H6E: 30,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: 22,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85C: 22,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_D: 22,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85D: 22,
|
||||||
# High digit sams mod
|
# High digit sams mod
|
||||||
highdigitsams.AAA_SON_9_Fire_Can: 8,
|
highdigitsams.AAA_SON_9_Fire_Can: 8,
|
||||||
highdigitsams.AAA_100mm_KS_19: 10,
|
highdigitsams.AAA_100mm_KS_19: 10,
|
||||||
@@ -764,6 +772,7 @@ UNIT_BY_TASK = {
|
|||||||
SpitfireLFMkIXCW,
|
SpitfireLFMkIXCW,
|
||||||
SpitfireLFMkIX,
|
SpitfireLFMkIX,
|
||||||
A_4E_C,
|
A_4E_C,
|
||||||
|
Rafale_M,
|
||||||
SA342Mistral,
|
SA342Mistral,
|
||||||
],
|
],
|
||||||
CAS: [
|
CAS: [
|
||||||
@@ -777,6 +786,7 @@ UNIT_BY_TASK = {
|
|||||||
A_10C_2,
|
A_10C_2,
|
||||||
A_20G,
|
A_20G,
|
||||||
B_17G,
|
B_17G,
|
||||||
|
F_111F,
|
||||||
B_1B,
|
B_1B,
|
||||||
B_52H,
|
B_52H,
|
||||||
F_117A,
|
F_117A,
|
||||||
@@ -797,6 +807,8 @@ UNIT_BY_TASK = {
|
|||||||
P_47D_30bl1,
|
P_47D_30bl1,
|
||||||
P_47D_40,
|
P_47D_40,
|
||||||
RQ_1A_Predator,
|
RQ_1A_Predator,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_B,
|
||||||
S_3B,
|
S_3B,
|
||||||
SA342L,
|
SA342L,
|
||||||
SA342M,
|
SA342M,
|
||||||
@@ -832,18 +844,18 @@ UNIT_BY_TASK = {
|
|||||||
Armor.APC_MTLB,
|
Armor.APC_MTLB,
|
||||||
Armor.APC_MTLB,
|
Armor.APC_MTLB,
|
||||||
Armor.APC_MTLB,
|
Armor.APC_MTLB,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
Armor.IFV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.IFV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.IFV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.APC_BTR_RD,
|
Armor.ARV_BTR_RD,
|
||||||
Armor.APC_BTR_RD,
|
Armor.ARV_BTR_RD,
|
||||||
Armor.APC_BTR_RD,
|
Armor.ARV_BTR_RD,
|
||||||
Armor.APC_BTR_RD,
|
Armor.ARV_BTR_RD,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
@@ -873,33 +885,33 @@ UNIT_BY_TASK = {
|
|||||||
Armor.MBT_T_80U,
|
Armor.MBT_T_80U,
|
||||||
Armor.MBT_T_90,
|
Armor.MBT_T_90,
|
||||||
Armor.ZTZ_96B,
|
Armor.ZTZ_96B,
|
||||||
Armor.APC_Cobra__Scout,
|
Armor.APC_Cobra,
|
||||||
Armor.APC_Cobra__Scout,
|
Armor.APC_Cobra,
|
||||||
Armor.APC_Cobra__Scout,
|
Armor.APC_Cobra,
|
||||||
Armor.APC_Cobra__Scout,
|
Armor.APC_Cobra,
|
||||||
Armor.APC_M113,
|
Armor.APC_M113,
|
||||||
Armor.APC_M113,
|
Armor.APC_M113,
|
||||||
Armor.APC_M113,
|
Armor.APC_M113,
|
||||||
Armor.APC_M113,
|
Armor.APC_M113,
|
||||||
Armor.APC_TPz_Fuchs,
|
Armor.TPz_Fuchs,
|
||||||
Armor.APC_TPz_Fuchs,
|
Armor.TPz_Fuchs,
|
||||||
Armor.APC_TPz_Fuchs,
|
Armor.TPz_Fuchs,
|
||||||
Armor.APC_TPz_Fuchs,
|
Armor.TPz_Fuchs,
|
||||||
Armor.ATGM_HMMWV,
|
Armor.ATGM_M1045_HMMWV_TOW,
|
||||||
Armor.ATGM_HMMWV,
|
Armor.ATGM_M1045_HMMWV_TOW,
|
||||||
Armor.APC_HMMWV__Scout,
|
Armor.APC_M1043_HMMWV_Armament,
|
||||||
Armor.APC_HMMWV__Scout,
|
Armor.APC_M1043_HMMWV_Armament,
|
||||||
Armor.IFV_M2A2_Bradley,
|
Armor.IFV_M2A2_Bradley,
|
||||||
Armor.IFV_M2A2_Bradley,
|
Armor.IFV_M2A2_Bradley,
|
||||||
Armor.ATGM_Stryker,
|
Armor.ATGM_M1134_Stryker,
|
||||||
Armor.ATGM_Stryker,
|
Armor.ATGM_M1134_Stryker,
|
||||||
Armor.IFV_M1126_Stryker_ICV,
|
Armor.APC_M1126_Stryker_ICV,
|
||||||
Armor.IFV_M1126_Stryker_ICV,
|
Armor.APC_M1126_Stryker_ICV,
|
||||||
Armor.IFV_M1126_Stryker_ICV,
|
Armor.APC_M1126_Stryker_ICV,
|
||||||
Armor.SPG_Stryker_MGS,
|
Armor.SPG_M1128_Stryker_MGS,
|
||||||
Armor.IFV_Warrior,
|
Armor.IFV_MCV_80,
|
||||||
Armor.IFV_Warrior,
|
Armor.IFV_MCV_80,
|
||||||
Armor.IFV_Warrior,
|
Armor.IFV_MCV_80,
|
||||||
Armor.IFV_LAV_25,
|
Armor.IFV_LAV_25,
|
||||||
Armor.IFV_LAV_25,
|
Armor.IFV_LAV_25,
|
||||||
Armor.IFV_Marder,
|
Armor.IFV_Marder,
|
||||||
@@ -915,94 +927,92 @@ UNIT_BY_TASK = {
|
|||||||
Armor.MBT_Leclerc,
|
Armor.MBT_Leclerc,
|
||||||
Armor.MBT_Leopard_2,
|
Armor.MBT_Leopard_2,
|
||||||
Armor.MBT_Challenger_II,
|
Armor.MBT_Challenger_II,
|
||||||
Armor.MBT_Merkava_IV,
|
Armor.MBT_Merkava_Mk__4,
|
||||||
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
||||||
Armor.MT_PzIV_H,
|
Armor.MT_Pz_Kpfw_IV_Ausf_H,
|
||||||
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
||||||
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma,
|
Armor.AC_Sd_Kfz_234_2_Puma,
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma,
|
Armor.AC_Sd_Kfz_234_2_Puma,
|
||||||
Armor.MT_M4_Sherman,
|
Armor.MT_M4_Sherman,
|
||||||
Armor.MT_M4A4_Sherman_Firefly,
|
Armor.MT_M4A4_Sherman_Firefly,
|
||||||
Armor.CT_Cromwell_IV,
|
Armor.CT_Cromwell_IV,
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
||||||
Armor.MT_PzIV_H,
|
Armor.MT_Pz_Kpfw_IV_Ausf_H,
|
||||||
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
||||||
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
||||||
Armor.SPG_Jagdpanther_G1,
|
Armor.TD_Jagdpanther_G1,
|
||||||
Armor.SPG_Jagdpanzer_IV,
|
Armor.TD_Jagdpanzer_IV,
|
||||||
Armor.SPG_Sd_Kfz_184_Elefant,
|
Armor.Sd_Kfz_184_Elefant,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma,
|
Armor.AC_Sd_Kfz_234_2_Puma,
|
||||||
Armor.MT_M4_Sherman,
|
Armor.MT_M4_Sherman,
|
||||||
Armor.MT_M4A4_Sherman_Firefly,
|
Armor.MT_M4A4_Sherman_Firefly,
|
||||||
Armor.CT_Cromwell_IV,
|
Armor.CT_Cromwell_IV,
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.CT_Centaur_IV,
|
Armor.CT_Centaur_IV,
|
||||||
Armor.CT_Centaur_IV,
|
Armor.CT_Centaur_IV,
|
||||||
Armor.HIT_Churchill_VII,
|
Armor.HIT_Churchill_VII,
|
||||||
Armor.Car_M8_Greyhound_Armored,
|
Armor.LAC_M8_Greyhound,
|
||||||
Armor.Car_M8_Greyhound_Armored,
|
Armor.LAC_M8_Greyhound,
|
||||||
Armor.SPG_M10_GMC,
|
Armor.TD_M10_GMC,
|
||||||
Armor.SPG_M10_GMC,
|
Armor.TD_M10_GMC,
|
||||||
Armor.SPG_StuG_III_Ausf__G,
|
Armor.StuG_III_Ausf__G,
|
||||||
Armor.SPG_StuG_IV,
|
Armor.StuG_IV,
|
||||||
Artillery.SPG_M12_GMC_155mm,
|
Artillery.M12_GMC,
|
||||||
Artillery.SPG_Sturmpanzer_IV_Brummbar,
|
Artillery.Sturmpanzer_IV_Brummbär,
|
||||||
Armor.Car_Daimler_Armored,
|
Armor.Daimler_Armoured_Car,
|
||||||
Armor.LT_Mk_VII_Tetrarch,
|
Armor.LT_Mk_VII_Tetrarch,
|
||||||
Artillery.MLRS_M270_227mm,
|
Artillery.MLRS_M270,
|
||||||
Artillery.SPH_M109_Paladin_155mm,
|
Artillery.SPH_M109_Paladin,
|
||||||
Artillery.SPH_2S9_Nona_120mm_M,
|
Artillery.SPH_2S9_Nona,
|
||||||
Artillery.SPH_2S1_Gvozdika_122mm,
|
Artillery.SPH_2S1_Gvozdika,
|
||||||
Artillery.SPH_2S3_Akatsia_152mm,
|
Artillery.SPH_2S3_Akatsia,
|
||||||
Artillery.SPH_2S19_Msta_152mm,
|
Artillery.SPH_2S19_Msta,
|
||||||
Artillery.MLRS_BM_21_Grad_122mm,
|
Artillery.MLRS_BM_21_Grad,
|
||||||
Artillery.MLRS_BM_21_Grad_122mm,
|
Artillery.MLRS_BM_21_Grad,
|
||||||
Artillery.MLRS_BM_27_Uragan_220mm,
|
Artillery.MLRS_9K57_Uragan_BM_27,
|
||||||
Artillery.MLRS_9A52_Smerch_HE_300mm,
|
Artillery.MLRS_9A52_Smerch,
|
||||||
Artillery.SPH_Dana_vz77_152mm,
|
Artillery.SpGH_Dana,
|
||||||
Artillery.PLZ_05,
|
Artillery.M12_GMC,
|
||||||
Artillery.SPG_M12_GMC_155mm,
|
Artillery.Sturmpanzer_IV_Brummbär,
|
||||||
Artillery.SPG_Sturmpanzer_IV_Brummbar,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375,
|
AirDefence.AAA_ZSU_57_2,
|
||||||
AirDefence.SPAAA_ZSU_57_2,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL,
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3,
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
|
||||||
AirDefence.SPAAA_Gepard,
|
AirDefence.SPAAA_Gepard,
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6,
|
AirDefence.SAM_Linebacker_M6,
|
||||||
AirDefence.SAM_Chaparral_M48,
|
AirDefence.SAM_Chaparral_M48,
|
||||||
AirDefence.SAM_Avenger__Stinger,
|
AirDefence.SAM_Avenger_M1097,
|
||||||
AirDefence.SAM_Roland_ADS,
|
AirDefence.SAM_Roland_ADS,
|
||||||
AirDefence.HQ_7_Self_Propelled_LN,
|
AirDefence.HQ_7_Self_Propelled_LN,
|
||||||
AirDefence.AAA_8_8cm_Flak_18,
|
AirDefence.AAA_8_8cm_Flak_18,
|
||||||
AirDefence.AAA_8_8cm_Flak_36,
|
AirDefence.AAA_8_8cm_Flak_36,
|
||||||
AirDefence.AAA_8_8cm_Flak_37,
|
AirDefence.AAA_8_8cm_Flak_37,
|
||||||
AirDefence.AAA_8_8cm_Flak_41,
|
AirDefence.AAA_8_8cm_Flak_41,
|
||||||
AirDefence.AAA_40mm_Bofors,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
AirDefence.AAA_S_60_57mm,
|
|
||||||
AirDefence.AAA_M1_37mm,
|
AirDefence.AAA_M1_37mm,
|
||||||
AirDefence.AAA_QF_3_7,
|
AirDefence.AA_gun_QF_3_7,
|
||||||
frenchpack.DIM__TOYOTA_BLUE,
|
frenchpack.DIM__TOYOTA_BLUE,
|
||||||
frenchpack.DIM__TOYOTA_DESERT,
|
frenchpack.DIM__TOYOTA_DESERT,
|
||||||
frenchpack.DIM__TOYOTA_GREEN,
|
frenchpack.DIM__TOYOTA_GREEN,
|
||||||
@@ -1027,13 +1037,13 @@ UNIT_BY_TASK = {
|
|||||||
],
|
],
|
||||||
AirDefence: [],
|
AirDefence: [],
|
||||||
Reconnaissance: [
|
Reconnaissance: [
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
Unarmed.Truck_Ural_375,
|
Unarmed.Transport_Ural_375,
|
||||||
Unarmed.LUV_UAZ_469_Jeep,
|
Unarmed.Transport_UAZ_469,
|
||||||
],
|
],
|
||||||
Nothing: [
|
Nothing: [
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
],
|
],
|
||||||
Embarking: [],
|
Embarking: [],
|
||||||
Carriage: [
|
Carriage: [
|
||||||
@@ -1042,10 +1052,10 @@ UNIT_BY_TASK = {
|
|||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
],
|
],
|
||||||
CargoTransportation: [
|
CargoTransportation: [
|
||||||
Cargo_Ivanov,
|
Dry_cargo_ship_Ivanov,
|
||||||
Bulker_Yakushev,
|
Bulk_cargo_ship_Yakushev,
|
||||||
Tanker_Elnya_160,
|
Tanker_Elnya_160,
|
||||||
Boat_Armed_Hi_speed,
|
Armed_speedboat,
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1053,41 +1063,41 @@ UNIT_BY_TASK = {
|
|||||||
Units from AirDefense category of UNIT_BY_TASK that will be removed from use if "No SAM" option is checked at the start of the game
|
Units from AirDefense category of UNIT_BY_TASK that will be removed from use if "No SAM" option is checked at the start of the game
|
||||||
"""
|
"""
|
||||||
SAM_BAN = [
|
SAM_BAN = [
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6,
|
AirDefence.SAM_Linebacker_M6,
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL,
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
AirDefence.SAM_SA_6_Kub_Gainful_TEL,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL,
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN,
|
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
AirDefence.SAM_Hawk_Generator__PCP,
|
AirDefence.SAM_Hawk_PCP,
|
||||||
AirDefence.SAM_SA_2_S_75_Guideline_LN,
|
AirDefence.SAM_SA_2_LN_SM_90,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL,
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1,
|
||||||
]
|
]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Used to convert SAM site parts to the corresponding site
|
Used to convert SAM site parts to the corresponding site
|
||||||
"""
|
"""
|
||||||
SAM_CONVERT = {
|
SAM_CONVERT = {
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: AirDefence.SAM_SA_3_S_125_Goa_LN,
|
AirDefence.SAM_SR_P_19: AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
AirDefence.SAM_SA_3_S_125_Low_Blow_TR: AirDefence.SAM_SA_3_S_125_Goa_LN,
|
AirDefence.SAM_SA_3_S_125_TR_SNR: AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN: AirDefence.SAM_SA_3_S_125_Goa_LN,
|
AirDefence.SAM_SA_3_S_125_LN_5P73: AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
AirDefence.SAM_SA_6_Kub_Gainful_TEL: AirDefence.SAM_SA_6_Kub_Gainful_TEL,
|
AirDefence.SAM_SA_6_Kub_LN_2P25: AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
AirDefence.SAM_SA_6_Kub_Long_Track_STR: AirDefence.SAM_SA_6_Kub_Gainful_TEL,
|
AirDefence.SAM_SA_6_Kub_STR_9S91: AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85C: AirDefence.SAM_SA_10_S_300PS_LN_5P85C,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C,
|
AirDefence.SAM_SA_10_S_300PS_SR_5N66M: AirDefence.SAM_SA_10_S_300PS_LN_5P85C,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C,
|
AirDefence.SAM_SA_10_S_300PS_TR_30N6: AirDefence.SAM_SA_10_S_300PS_LN_5P85C,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_C2: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C,
|
AirDefence.SAM_SA_10_S_300PS_CP_54K6: AirDefence.SAM_SA_10_S_300PS_LN_5P85C,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR: AirDefence.SAM_SA_10_S_300_Grumble_C2,
|
AirDefence.SAM_SA_10_S_300PS_SR_64H6E: AirDefence.SAM_SA_10_S_300PS_CP_54K6,
|
||||||
AirDefence.SAM_Hawk_TR__AN_MPQ_46: AirDefence.SAM_Hawk_Generator__PCP,
|
AirDefence.SAM_Hawk_TR_AN_MPQ_46: AirDefence.SAM_Hawk_PCP,
|
||||||
AirDefence.SAM_Hawk_SR__AN_MPQ_50: AirDefence.SAM_Hawk_Generator__PCP,
|
AirDefence.SAM_Hawk_SR_AN_MPQ_50: AirDefence.SAM_Hawk_PCP,
|
||||||
AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_Generator__PCP,
|
AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_PCP,
|
||||||
"except": {
|
"except": {
|
||||||
# this radar is shared between the two S300's. if we attempt to find a SAM site at a base and can't find one
|
# this radar is shared between the two S300's. if we attempt to find a SAM site at a base and can't find one
|
||||||
# model, we can safely assume the other was deployed
|
# model, we can safely assume the other was deployed
|
||||||
# well, perhaps not safely, but we'll make the assumption anyway :p
|
# well, perhaps not safely, but we'll make the assumption anyway :p
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: AirDefence.SAM_SA_10_S_300_Grumble_C2,
|
AirDefence.SAM_SA_10_S_300PS_TR_30N6: AirDefence.SAM_SA_10_S_300PS_CP_54K6,
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: AirDefence.SAM_SA_2_S_75_Guideline_LN,
|
AirDefence.SAM_SR_P_19: AirDefence.SAM_SA_2_LN_SM_90,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1148,7 +1158,6 @@ COMMON_OVERRIDE = {
|
|||||||
Escort: "CAP",
|
Escort: "CAP",
|
||||||
RunwayAttack: "RUNWAY_ATTACK",
|
RunwayAttack: "RUNWAY_ATTACK",
|
||||||
FighterSweep: "CAP",
|
FighterSweep: "CAP",
|
||||||
AWACS: "AEW&C",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -1217,6 +1226,7 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = {
|
|||||||
F_14A_135_GR: COMMON_OVERRIDE,
|
F_14A_135_GR: COMMON_OVERRIDE,
|
||||||
F_14B: COMMON_OVERRIDE,
|
F_14B: COMMON_OVERRIDE,
|
||||||
F_15C: COMMON_OVERRIDE,
|
F_15C: COMMON_OVERRIDE,
|
||||||
|
F_111F: COMMON_OVERRIDE,
|
||||||
F_22A: COMMON_OVERRIDE,
|
F_22A: COMMON_OVERRIDE,
|
||||||
F_16C_50: COMMON_OVERRIDE,
|
F_16C_50: COMMON_OVERRIDE,
|
||||||
JF_17: COMMON_OVERRIDE,
|
JF_17: COMMON_OVERRIDE,
|
||||||
@@ -1269,6 +1279,9 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = {
|
|||||||
A_20G: COMMON_OVERRIDE,
|
A_20G: COMMON_OVERRIDE,
|
||||||
A_4E_C: COMMON_OVERRIDE,
|
A_4E_C: COMMON_OVERRIDE,
|
||||||
MB_339PAN: COMMON_OVERRIDE,
|
MB_339PAN: COMMON_OVERRIDE,
|
||||||
|
Rafale_M: COMMON_OVERRIDE,
|
||||||
|
Rafale_A_S: COMMON_OVERRIDE,
|
||||||
|
Rafale_B: COMMON_OVERRIDE,
|
||||||
OH_58D: COMMON_OVERRIDE,
|
OH_58D: COMMON_OVERRIDE,
|
||||||
F_16A: COMMON_OVERRIDE,
|
F_16A: COMMON_OVERRIDE,
|
||||||
MQ_9_Reaper: COMMON_OVERRIDE,
|
MQ_9_Reaper: COMMON_OVERRIDE,
|
||||||
@@ -1279,7 +1292,6 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = {
|
|||||||
AH_64A: COMMON_OVERRIDE,
|
AH_64A: COMMON_OVERRIDE,
|
||||||
SH_60B: COMMON_OVERRIDE,
|
SH_60B: COMMON_OVERRIDE,
|
||||||
Hercules: COMMON_OVERRIDE,
|
Hercules: COMMON_OVERRIDE,
|
||||||
F_86F_Sabre: COMMON_OVERRIDE,
|
|
||||||
Su_25TM: {
|
Su_25TM: {
|
||||||
SEAD: "Kh-31P*2_Kh-25ML*4_R-73*2_L-081_MPS410",
|
SEAD: "Kh-31P*2_Kh-25ML*4_R-73*2_L-081_MPS410",
|
||||||
},
|
},
|
||||||
@@ -1363,8 +1375,8 @@ CARRIER_CAPABLE = [
|
|||||||
AV8BNA,
|
AV8BNA,
|
||||||
Su_33,
|
Su_33,
|
||||||
A_4E_C,
|
A_4E_C,
|
||||||
|
Rafale_M,
|
||||||
S_3B,
|
S_3B,
|
||||||
E_2C,
|
|
||||||
UH_1H,
|
UH_1H,
|
||||||
Mi_8MT,
|
Mi_8MT,
|
||||||
Ka_50,
|
Ka_50,
|
||||||
@@ -1420,8 +1432,6 @@ def upgrade_to_supercarrier(unit, name: str):
|
|||||||
return CVN_73_George_Washington
|
return CVN_73_George_Washington
|
||||||
elif name == "CVN-75 Harry S. Truman":
|
elif name == "CVN-75 Harry S. Truman":
|
||||||
return CVN_75_Harry_S__Truman
|
return CVN_75_Harry_S__Truman
|
||||||
elif name == "Carrier Strike Group 8":
|
|
||||||
return CVN_75_Harry_S__Truman
|
|
||||||
else:
|
else:
|
||||||
return CVN_71_Theodore_Roosevelt
|
return CVN_71_Theodore_Roosevelt
|
||||||
elif unit == CV_1143_5_Admiral_Kuznetsov:
|
elif unit == CV_1143_5_Admiral_Kuznetsov:
|
||||||
@@ -1447,9 +1457,9 @@ def find_unittype(for_task: Task, country_name: str) -> List[Type[UnitType]]:
|
|||||||
|
|
||||||
|
|
||||||
MANPADS: List[VehicleType] = [
|
MANPADS: List[VehicleType] = [
|
||||||
AirDefence.MANPADS_SA_18_Igla_Grouse,
|
AirDefence.SAM_SA_18_Igla_MANPADS,
|
||||||
AirDefence.MANPADS_SA_18_Igla_S_Grouse,
|
AirDefence.SAM_SA_18_Igla_S_MANPADS,
|
||||||
AirDefence.MANPADS_Stinger,
|
AirDefence.Stinger_MANPADS,
|
||||||
]
|
]
|
||||||
|
|
||||||
INFANTRY: List[VehicleType] = [
|
INFANTRY: List[VehicleType] = [
|
||||||
@@ -1458,28 +1468,28 @@ INFANTRY: List[VehicleType] = [
|
|||||||
Infantry.Paratrooper_AKS,
|
Infantry.Paratrooper_AKS,
|
||||||
Infantry.Paratrooper_AKS,
|
Infantry.Paratrooper_AKS,
|
||||||
Infantry.Paratrooper_AKS,
|
Infantry.Paratrooper_AKS,
|
||||||
Infantry.Infantry_RPG,
|
Infantry.Soldier_RPG,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_M249,
|
Infantry.Soldier_M249,
|
||||||
Artillery.Mortar_2B11_120mm,
|
Artillery._2B11_mortar,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Paratrooper_RPG_16,
|
Infantry.Paratrooper_RPG_16,
|
||||||
Infantry.Infantry_M4_Georgia,
|
Infantry.Georgian_soldier_with_M4,
|
||||||
Infantry.Infantry_M4_Georgia,
|
Infantry.Georgian_soldier_with_M4,
|
||||||
Infantry.Infantry_M4_Georgia,
|
Infantry.Georgian_soldier_with_M4,
|
||||||
Infantry.Infantry_M4_Georgia,
|
Infantry.Georgian_soldier_with_M4,
|
||||||
Infantry.Infantry_AK_74_Rus,
|
Infantry.Infantry_Soldier_Rus,
|
||||||
Infantry.Infantry_AK_74_Rus,
|
Infantry.Infantry_Soldier_Rus,
|
||||||
Infantry.Infantry_AK_74_Rus,
|
Infantry.Infantry_Soldier_Rus,
|
||||||
Infantry.Infantry_AK_74_Rus,
|
Infantry.Infantry_Soldier_Rus,
|
||||||
Infantry.Infantry_SMLE_No_4_Mk_1,
|
Infantry.Infantry_SMLE_No_4_Mk_1,
|
||||||
Infantry.Infantry_SMLE_No_4_Mk_1,
|
Infantry.Infantry_SMLE_No_4_Mk_1,
|
||||||
Infantry.Infantry_SMLE_No_4_Mk_1,
|
Infantry.Infantry_SMLE_No_4_Mk_1,
|
||||||
@@ -1490,9 +1500,9 @@ INFANTRY: List[VehicleType] = [
|
|||||||
Infantry.Infantry_M1_Garand,
|
Infantry.Infantry_M1_Garand,
|
||||||
Infantry.Infantry_M1_Garand,
|
Infantry.Infantry_M1_Garand,
|
||||||
Infantry.Infantry_M1_Garand,
|
Infantry.Infantry_M1_Garand,
|
||||||
Infantry.Insurgent_AK_74,
|
Infantry.Infantry_Soldier_Insurgents,
|
||||||
Infantry.Insurgent_AK_74,
|
Infantry.Infantry_Soldier_Insurgents,
|
||||||
Infantry.Insurgent_AK_74,
|
Infantry.Infantry_Soldier_Insurgents,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -70,9 +70,6 @@ class Faction:
|
|||||||
# Possible Missile site generators for this faction
|
# Possible Missile site generators for this faction
|
||||||
missiles: List[str] = field(default_factory=list)
|
missiles: List[str] = field(default_factory=list)
|
||||||
|
|
||||||
# Possible costal site generators for this faction
|
|
||||||
coastal_defenses: List[str] = field(default_factory=list)
|
|
||||||
|
|
||||||
# Required mods or asset packs
|
# Required mods or asset packs
|
||||||
requirements: Dict[str, str] = field(default_factory=dict)
|
requirements: Dict[str, str] = field(default_factory=dict)
|
||||||
|
|
||||||
@@ -103,9 +100,6 @@ class Faction:
|
|||||||
# How many missiles group should we try to generate per CP on startup for this faction
|
# How many missiles group should we try to generate per CP on startup for this faction
|
||||||
missiles_group_count: int = field(default=1)
|
missiles_group_count: int = field(default=1)
|
||||||
|
|
||||||
# How many coastal group should we try to generate per CP on startup for this faction
|
|
||||||
coastal_group_count: int = field(default=1)
|
|
||||||
|
|
||||||
# Whether this faction has JTAC access
|
# Whether this faction has JTAC access
|
||||||
has_jtac: bool = field(default=False)
|
has_jtac: bool = field(default=False)
|
||||||
|
|
||||||
@@ -168,7 +162,6 @@ class Faction:
|
|||||||
faction.air_defenses.extend(json.get("shorads", []))
|
faction.air_defenses.extend(json.get("shorads", []))
|
||||||
|
|
||||||
faction.missiles = json.get("missiles", [])
|
faction.missiles = json.get("missiles", [])
|
||||||
faction.coastal_defenses = json.get("coastal_defenses", [])
|
|
||||||
faction.requirements = json.get("requirements", {})
|
faction.requirements = json.get("requirements", {})
|
||||||
|
|
||||||
faction.carrier_names = json.get("carrier_names", [])
|
faction.carrier_names = json.get("carrier_names", [])
|
||||||
@@ -186,7 +179,6 @@ class Faction:
|
|||||||
faction.jtac_unit = None
|
faction.jtac_unit = None
|
||||||
faction.navy_group_count = int(json.get("navy_group_count", 1))
|
faction.navy_group_count = int(json.get("navy_group_count", 1))
|
||||||
faction.missiles_group_count = int(json.get("missiles_group_count", 0))
|
faction.missiles_group_count = int(json.get("missiles_group_count", 0))
|
||||||
faction.coastal_group_count = int(json.get("coastal_group_count", 0))
|
|
||||||
|
|
||||||
# Load doctrine
|
# Load doctrine
|
||||||
doctrine = json.get("doctrine", "modern")
|
doctrine = json.get("doctrine", "modern")
|
||||||
|
|||||||
16
game/game.py
16
game/game.py
@@ -96,7 +96,6 @@ class Game:
|
|||||||
self.enemy_name = enemy_name
|
self.enemy_name = enemy_name
|
||||||
self.enemy_country = db.FACTIONS[enemy_name].country
|
self.enemy_country = db.FACTIONS[enemy_name].country
|
||||||
self.turn = 0
|
self.turn = 0
|
||||||
# NB: This is the *start* date. It is never updated.
|
|
||||||
self.date = date(start_date.year, start_date.month, start_date.day)
|
self.date = date(start_date.year, start_date.month, start_date.day)
|
||||||
self.game_stats = GameStats()
|
self.game_stats = GameStats()
|
||||||
self.game_stats.update(self)
|
self.game_stats.update(self)
|
||||||
@@ -153,7 +152,7 @@ class Game:
|
|||||||
|
|
||||||
def generate_conditions(self) -> Conditions:
|
def generate_conditions(self) -> Conditions:
|
||||||
return Conditions.generate(
|
return Conditions.generate(
|
||||||
self.theater, self.current_day, self.current_turn_time_of_day, self.settings
|
self.theater, self.date, self.current_turn_time_of_day, self.settings
|
||||||
)
|
)
|
||||||
|
|
||||||
def sanitize_sides(self):
|
def sanitize_sides(self):
|
||||||
@@ -284,18 +283,11 @@ class Game:
|
|||||||
persistency.autosave(self)
|
persistency.autosave(self)
|
||||||
|
|
||||||
def check_win_loss(self):
|
def check_win_loss(self):
|
||||||
player_airbases = {
|
captured_states = {i.captured for i in self.theater.controlpoints}
|
||||||
cp for cp in self.theater.player_points() if cp.runway_is_operational()
|
if True not in captured_states:
|
||||||
}
|
|
||||||
if not player_airbases:
|
|
||||||
return TurnState.LOSS
|
return TurnState.LOSS
|
||||||
|
if False not in captured_states:
|
||||||
enemy_airbases = {
|
|
||||||
cp for cp in self.theater.enemy_points() if cp.runway_is_operational()
|
|
||||||
}
|
|
||||||
if not enemy_airbases:
|
|
||||||
return TurnState.WIN
|
return TurnState.WIN
|
||||||
|
|
||||||
return TurnState.CONTINUE
|
return TurnState.CONTINUE
|
||||||
|
|
||||||
def initialize_turn(self) -> None:
|
def initialize_turn(self) -> None:
|
||||||
|
|||||||
@@ -21,10 +21,6 @@ from game.threatzones import ThreatZones
|
|||||||
from game.utils import nautical_miles
|
from game.utils import nautical_miles
|
||||||
|
|
||||||
|
|
||||||
class NavMeshError(RuntimeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class NavMeshPoly:
|
class NavMeshPoly:
|
||||||
def __init__(self, ident: int, poly: Polygon, threatened: bool) -> None:
|
def __init__(self, ident: int, poly: Polygon, threatened: bool) -> None:
|
||||||
self.ident = ident
|
self.ident = ident
|
||||||
@@ -129,7 +125,7 @@ class NavMesh:
|
|||||||
path.append(current.world_point)
|
path.append(current.world_point)
|
||||||
previous = came_from[current]
|
previous = came_from[current]
|
||||||
if previous is None:
|
if previous is None:
|
||||||
raise NavMeshError(
|
raise RuntimeError(
|
||||||
f"Could not reconstruct path to {destination} from {origin}"
|
f"Could not reconstruct path to {destination} from {origin}"
|
||||||
)
|
)
|
||||||
current = previous
|
current = previous
|
||||||
@@ -144,12 +140,10 @@ class NavMesh:
|
|||||||
def shortest_path(self, origin: Point, destination: Point) -> List[Point]:
|
def shortest_path(self, origin: Point, destination: Point) -> List[Point]:
|
||||||
origin_poly = self.localize(origin)
|
origin_poly = self.localize(origin)
|
||||||
if origin_poly is None:
|
if origin_poly is None:
|
||||||
raise NavMeshError(f"Origin point {origin} is outside the navmesh")
|
raise ValueError(f"Origin point {origin} is outside the navmesh")
|
||||||
destination_poly = self.localize(destination)
|
destination_poly = self.localize(destination)
|
||||||
if destination_poly is None:
|
if destination_poly is None:
|
||||||
raise NavMeshError(
|
raise ValueError(f"Origin point {destination} is outside the navmesh")
|
||||||
f"Destination point {destination} is outside the navmesh"
|
|
||||||
)
|
|
||||||
|
|
||||||
return self._shortest_path(
|
return self._shortest_path(
|
||||||
NavPoint(self.dcs_to_shapely_point(origin), origin_poly),
|
NavPoint(self.dcs_to_shapely_point(origin), origin_poly),
|
||||||
@@ -209,7 +203,7 @@ class NavMesh:
|
|||||||
# threatened airbases at the map edges have room to retreat from the
|
# threatened airbases at the map edges have room to retreat from the
|
||||||
# threat without running off the navmesh.
|
# threat without running off the navmesh.
|
||||||
return box(*LineString(points).bounds).buffer(
|
return box(*LineString(points).bounds).buffer(
|
||||||
nautical_miles(200).meters, resolution=1
|
nautical_miles(100).meters, resolution=1
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@@ -166,7 +166,6 @@ class Operation:
|
|||||||
airgen: AircraftConflictGenerator,
|
airgen: AircraftConflictGenerator,
|
||||||
):
|
):
|
||||||
"""Generates subscribed MissionInfoGenerator objects (currently kneeboards and briefings)"""
|
"""Generates subscribed MissionInfoGenerator objects (currently kneeboards and briefings)"""
|
||||||
|
|
||||||
gens: List[MissionInfoGenerator] = [
|
gens: List[MissionInfoGenerator] = [
|
||||||
KneeboardGenerator(cls.current_mission, cls.game),
|
KneeboardGenerator(cls.current_mission, cls.game),
|
||||||
BriefingGenerator(cls.current_mission, cls.game),
|
BriefingGenerator(cls.current_mission, cls.game),
|
||||||
@@ -178,8 +177,9 @@ class Operation:
|
|||||||
for tanker in airsupportgen.air_support.tankers:
|
for tanker in airsupportgen.air_support.tankers:
|
||||||
gen.add_tanker(tanker)
|
gen.add_tanker(tanker)
|
||||||
|
|
||||||
for aewc in airsupportgen.air_support.awacs:
|
if cls.player_awacs_enabled:
|
||||||
gen.add_awacs(aewc)
|
for awacs in airsupportgen.air_support.awacs:
|
||||||
|
gen.add_awacs(awacs)
|
||||||
|
|
||||||
for jtac in jtacs:
|
for jtac in jtacs:
|
||||||
gen.add_jtac(jtac)
|
gen.add_jtac(jtac)
|
||||||
@@ -378,9 +378,7 @@ class Operation:
|
|||||||
cls.game,
|
cls.game,
|
||||||
cls.radio_registry,
|
cls.radio_registry,
|
||||||
cls.unit_map,
|
cls.unit_map,
|
||||||
air_support=cls.airsupportgen.air_support,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
cls.airgen.clear_parking_slots()
|
cls.airgen.clear_parking_slots()
|
||||||
|
|
||||||
cls.airgen.generate_flights(
|
cls.airgen.generate_flights(
|
||||||
@@ -446,8 +444,6 @@ class Operation:
|
|||||||
"AWACs": {},
|
"AWACs": {},
|
||||||
"JTACs": {},
|
"JTACs": {},
|
||||||
"TargetPoints": {},
|
"TargetPoints": {},
|
||||||
"RedAA": {},
|
|
||||||
"BlueAA": {},
|
|
||||||
} # type: ignore
|
} # type: ignore
|
||||||
|
|
||||||
for tanker in airsupportgen.air_support.tankers:
|
for tanker in airsupportgen.air_support.tankers:
|
||||||
@@ -505,26 +501,6 @@ class Operation:
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for cp in cls.game.theater.controlpoints:
|
|
||||||
for ground_object in cp.ground_objects:
|
|
||||||
if ground_object.might_have_aa and not ground_object.is_dead:
|
|
||||||
for g in ground_object.groups:
|
|
||||||
threat_range = ground_object.threat_range(g)
|
|
||||||
|
|
||||||
if not threat_range:
|
|
||||||
continue
|
|
||||||
|
|
||||||
faction = "BlueAA" if cp.captured else "RedAA"
|
|
||||||
|
|
||||||
luaData[faction][g.name] = {
|
|
||||||
"name": ground_object.name,
|
|
||||||
"range": threat_range.meters,
|
|
||||||
"position": {
|
|
||||||
"x": ground_object.position.x,
|
|
||||||
"y": ground_object.position.y,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# set a LUA table with data from Liberation that we want to set
|
# set a LUA table with data from Liberation that we want to set
|
||||||
# at the moment it contains Liberation's install path, and an overridable definition for the JTACAutoLase function
|
# at the moment it contains Liberation's install path, and an overridable definition for the JTACAutoLase function
|
||||||
# later, we'll add data about the units and points having been generated, in order to facilitate the configuration of the plugin lua scripts
|
# later, we'll add data about the units and points having been generated, in order to facilitate the configuration of the plugin lua scripts
|
||||||
@@ -617,33 +593,7 @@ class Operation:
|
|||||||
-- list the aircraft carriers generated by Liberation
|
-- list the aircraft carriers generated by Liberation
|
||||||
-- dcsLiberation.Carriers = {}
|
-- dcsLiberation.Carriers = {}
|
||||||
|
|
||||||
-- list the Red AA generated by Liberation
|
-- later, we'll add more data to the table
|
||||||
dcsLiberation.RedAA = {
|
|
||||||
"""
|
|
||||||
for key in luaData["RedAA"]:
|
|
||||||
data = luaData["RedAA"][key]
|
|
||||||
name = data["name"]
|
|
||||||
radius = data["range"]
|
|
||||||
positionX = data["position"]["x"]
|
|
||||||
positionY = data["position"]["y"]
|
|
||||||
lua += f" {{dcsGroupName='{key}', name='{name}', range='{radius}', positionX='{positionX}', positionY='{positionY}' }}, \n"
|
|
||||||
lua += "}"
|
|
||||||
|
|
||||||
lua += """
|
|
||||||
|
|
||||||
-- list the Blue AA generated by Liberation
|
|
||||||
dcsLiberation.BlueAA = {
|
|
||||||
"""
|
|
||||||
for key in luaData["BlueAA"]:
|
|
||||||
data = luaData["BlueAA"][key]
|
|
||||||
name = data["name"]
|
|
||||||
radius = data["range"]
|
|
||||||
positionX = data["position"]["x"]
|
|
||||||
positionY = data["position"]["y"]
|
|
||||||
lua += f" {{dcsGroupName='{key}', name='{name}', range='{radius}', positionX='{positionX}', positionY='{positionY}' }}, \n"
|
|
||||||
lua += "}"
|
|
||||||
|
|
||||||
lua += """
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
from dcs import Point
|
|
||||||
|
|
||||||
|
|
||||||
class PointWithHeading(Point):
|
|
||||||
def __init__(self):
|
|
||||||
super(PointWithHeading, self).__init__(0, 0)
|
|
||||||
self.heading = 0
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_point(point: Point, heading: int):
|
|
||||||
p = PointWithHeading()
|
|
||||||
p.x = point.x
|
|
||||||
p.y = point.y
|
|
||||||
p.heading = heading
|
|
||||||
return p
|
|
||||||
@@ -30,8 +30,6 @@ class Settings:
|
|||||||
automate_front_line_reinforcements: bool = False
|
automate_front_line_reinforcements: bool = False
|
||||||
automate_aircraft_reinforcements: bool = False
|
automate_aircraft_reinforcements: bool = False
|
||||||
restrict_weapons_by_date: bool = False
|
restrict_weapons_by_date: bool = False
|
||||||
disable_legacy_aewc: bool = False
|
|
||||||
generate_dark_kneeboard: bool = False
|
|
||||||
|
|
||||||
# Performance oriented
|
# Performance oriented
|
||||||
perf_red_alert_state: bool = True
|
perf_red_alert_state: bool = True
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import math
|
|||||||
import typing
|
import typing
|
||||||
from typing import Dict, Type
|
from typing import Dict, Type
|
||||||
|
|
||||||
from dcs.task import AWACS, CAP, CAS, Embarking, PinpointStrike, Task
|
from dcs.task import CAP, CAS, Embarking, PinpointStrike, Task
|
||||||
from dcs.unittype import FlyingType, UnitType, VehicleType
|
from dcs.unittype import FlyingType, UnitType, VehicleType
|
||||||
from dcs.vehicles import AirDefence, Armor
|
from dcs.vehicles import AirDefence, Armor
|
||||||
|
|
||||||
@@ -147,12 +147,7 @@ class Base:
|
|||||||
for_task = db.unit_task(unit_type)
|
for_task = db.unit_task(unit_type)
|
||||||
|
|
||||||
target_dict = None
|
target_dict = None
|
||||||
if (
|
if for_task == CAS or for_task == CAP or for_task == Embarking:
|
||||||
for_task == AWACS
|
|
||||||
or for_task == CAS
|
|
||||||
or for_task == CAP
|
|
||||||
or for_task == Embarking
|
|
||||||
):
|
|
||||||
target_dict = self.aircraft
|
target_dict = self.aircraft
|
||||||
elif for_task == PinpointStrike:
|
elif for_task == PinpointStrike:
|
||||||
target_dict = self.armor
|
target_dict = self.armor
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from dcs.planes import F_15C
|
|||||||
from dcs.ships import (
|
from dcs.ships import (
|
||||||
CVN_74_John_C__Stennis,
|
CVN_74_John_C__Stennis,
|
||||||
LHA_1_Tarawa,
|
LHA_1_Tarawa,
|
||||||
DDG_Arleigh_Burke_IIa,
|
USS_Arleigh_Burke_IIa,
|
||||||
)
|
)
|
||||||
from dcs.statics import Fortification
|
from dcs.statics import Fortification
|
||||||
from dcs.terrain import (
|
from dcs.terrain import (
|
||||||
@@ -55,7 +55,6 @@ from .controlpoint import (
|
|||||||
Fob,
|
Fob,
|
||||||
)
|
)
|
||||||
from .landmap import Landmap, load_landmap, poly_contains
|
from .landmap import Landmap, load_landmap, poly_contains
|
||||||
from ..point_with_heading import PointWithHeading
|
|
||||||
from ..utils import Distance, meters, nautical_miles
|
from ..utils import Distance, meters, nautical_miles
|
||||||
|
|
||||||
Numeric = Union[int, float]
|
Numeric = Union[int, float]
|
||||||
@@ -93,33 +92,30 @@ class MizCampaignLoader:
|
|||||||
LHA_UNIT_TYPE = LHA_1_Tarawa.id
|
LHA_UNIT_TYPE = LHA_1_Tarawa.id
|
||||||
FRONT_LINE_UNIT_TYPE = Armor.APC_M113.id
|
FRONT_LINE_UNIT_TYPE = Armor.APC_M113.id
|
||||||
|
|
||||||
FOB_UNIT_TYPE = Unarmed.Truck_SKP_11_Mobile_ATC.id
|
FOB_UNIT_TYPE = Unarmed.CP_SKP_11_ATC_Mobile_Command_Post.id
|
||||||
FARP_HELIPAD = "SINGLE_HELIPAD"
|
|
||||||
|
|
||||||
EWR_UNIT_TYPE = AirDefence.EWR_55G6.id
|
EWR_UNIT_TYPE = AirDefence.EWR_55G6.id
|
||||||
SAM_UNIT_TYPE = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR.id
|
SAM_UNIT_TYPE = AirDefence.SAM_SA_10_S_300PS_SR_64H6E.id
|
||||||
GARRISON_UNIT_TYPE = AirDefence.SAM_SA_19_Tunguska_Grison.id
|
GARRISON_UNIT_TYPE = AirDefence.SAM_SA_19_Tunguska_2S6.id
|
||||||
OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.id
|
OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.id
|
||||||
SHIP_UNIT_TYPE = DDG_Arleigh_Burke_IIa.id
|
SHIP_UNIT_TYPE = USS_Arleigh_Burke_IIa.id
|
||||||
MISSILE_SITE_UNIT_TYPE = MissilesSS.SSM_SS_1C_Scud_B.id
|
MISSILE_SITE_UNIT_TYPE = MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M.id
|
||||||
COASTAL_DEFENSE_UNIT_TYPE = MissilesSS.AShM_SS_N_2_Silkworm.id
|
COASTAL_DEFENSE_UNIT_TYPE = MissilesSS.SS_N_2_Silkworm.id
|
||||||
|
|
||||||
# Multiple options for the required SAMs so campaign designers can more
|
# Multiple options for the required SAMs so campaign designers can more
|
||||||
# accurately see the coverage of their IADS for the expected type.
|
# accurately see the coverage of their IADS for the expected type.
|
||||||
REQUIRED_LONG_RANGE_SAM_UNIT_TYPES = {
|
REQUIRED_LONG_RANGE_SAM_UNIT_TYPES = {
|
||||||
AirDefence.SAM_Patriot_LN.id,
|
AirDefence.SAM_Patriot_LN_M901.id,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_C.id,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85C.id,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_D.id,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85D.id,
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES = {
|
REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES = {
|
||||||
AirDefence.SAM_Hawk_LN_M192.id,
|
AirDefence.SAM_Hawk_LN_M192.id,
|
||||||
AirDefence.SAM_SA_2_S_75_Guideline_LN.id,
|
AirDefence.SAM_SA_2_LN_SM_90.id,
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN.id,
|
AirDefence.SAM_SA_3_S_125_LN_5P73.id,
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRED_EWR_UNIT_TYPE = AirDefence.EWR_1L13.id
|
|
||||||
|
|
||||||
BASE_DEFENSE_RADIUS = nautical_miles(2)
|
BASE_DEFENSE_RADIUS = nautical_miles(2)
|
||||||
|
|
||||||
def __init__(self, miz: Path, theater: ConflictTheater) -> None:
|
def __init__(self, miz: Path, theater: ConflictTheater) -> None:
|
||||||
@@ -249,18 +245,6 @@ class MizCampaignLoader:
|
|||||||
if group.units[0].type in self.REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES:
|
if group.units[0].type in self.REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES:
|
||||||
yield group
|
yield group
|
||||||
|
|
||||||
@property
|
|
||||||
def required_ewrs(self) -> Iterator[VehicleGroup]:
|
|
||||||
for group in self.red.vehicle_group:
|
|
||||||
if group.units[0].type in self.REQUIRED_EWR_UNIT_TYPE:
|
|
||||||
yield group
|
|
||||||
|
|
||||||
@property
|
|
||||||
def helipads(self) -> Iterator[StaticGroup]:
|
|
||||||
for group in self.blue.static_group:
|
|
||||||
if group.units[0].type == self.FARP_HELIPAD:
|
|
||||||
yield group
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def control_points(self) -> Dict[int, ControlPoint]:
|
def control_points(self) -> Dict[int, ControlPoint]:
|
||||||
control_points = {}
|
control_points = {}
|
||||||
@@ -286,7 +270,7 @@ class MizCampaignLoader:
|
|||||||
control_point.captured_invert = group.late_activation
|
control_point.captured_invert = group.late_activation
|
||||||
control_points[control_point.id] = control_point
|
control_points[control_point.id] = control_point
|
||||||
for group in self.lhas(blue):
|
for group in self.lhas(blue):
|
||||||
# TODO: Name the LHA.db
|
# TODO: Name the LHA.
|
||||||
control_point = Lha("lha", group.position, next(self.control_point_id))
|
control_point = Lha("lha", group.position, next(self.control_point_id))
|
||||||
control_point.captured = blue
|
control_point.captured = blue
|
||||||
control_point.captured_invert = group.late_activation
|
control_point.captured_invert = group.late_activation
|
||||||
@@ -345,81 +329,44 @@ class MizCampaignLoader:
|
|||||||
for group in self.garrisons:
|
for group in self.garrisons:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
if distance < self.BASE_DEFENSE_RADIUS:
|
if distance < self.BASE_DEFENSE_RADIUS:
|
||||||
closest.preset_locations.base_garrisons.append(
|
closest.preset_locations.base_garrisons.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
logging.warning(f"Found garrison unit too far from base: {group.name}")
|
logging.warning(f"Found garrison unit too far from base: {group.name}")
|
||||||
|
|
||||||
for group in self.sams:
|
for group in self.sams:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
if distance < self.BASE_DEFENSE_RADIUS:
|
if distance < self.BASE_DEFENSE_RADIUS:
|
||||||
closest.preset_locations.base_air_defense.append(
|
closest.preset_locations.base_air_defense.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
closest.preset_locations.strike_locations.append(
|
closest.preset_locations.strike_locations.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.ewrs:
|
for group in self.ewrs:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
if distance < self.BASE_DEFENSE_RADIUS:
|
closest.preset_locations.ewrs.append(group.position)
|
||||||
closest.preset_locations.base_ewrs.append(
|
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
closest.preset_locations.ewrs.append(
|
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.offshore_strike_targets:
|
for group in self.offshore_strike_targets:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.offshore_strike_locations.append(
|
closest.preset_locations.offshore_strike_locations.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.ships:
|
for group in self.ships:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.ships.append(
|
closest.preset_locations.ships.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.missile_sites:
|
for group in self.missile_sites:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.missile_sites.append(
|
closest.preset_locations.missile_sites.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.coastal_defenses:
|
for group in self.coastal_defenses:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.coastal_defenses.append(
|
closest.preset_locations.coastal_defenses.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.required_long_range_sams:
|
for group in self.required_long_range_sams:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.required_long_range_sams.append(
|
closest.preset_locations.required_long_range_sams.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.required_medium_range_sams:
|
for group in self.required_medium_range_sams:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.required_medium_range_sams.append(
|
closest.preset_locations.required_medium_range_sams.append(group.position)
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.required_ewrs:
|
|
||||||
closest, distance = self.objective_info(group)
|
|
||||||
closest.preset_locations.required_ewrs.append(
|
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
for group in self.helipads:
|
|
||||||
closest, distance = self.objective_info(group)
|
|
||||||
closest.helipads.append(
|
|
||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
|
||||||
)
|
|
||||||
|
|
||||||
def populate_theater(self) -> None:
|
def populate_theater(self) -> None:
|
||||||
for control_point in self.control_points.values():
|
for control_point in self.control_points.values():
|
||||||
@@ -730,8 +677,8 @@ class PersianGulfTheater(ConflictTheater):
|
|||||||
terrain = persiangulf.PersianGulf()
|
terrain = persiangulf.PersianGulf()
|
||||||
overview_image = "persiangulf.gif"
|
overview_image = "persiangulf.gif"
|
||||||
reference_points = (
|
reference_points = (
|
||||||
ReferencePoint(persiangulf.Jiroft.position, Point(1692, 1343)),
|
ReferencePoint(persiangulf.Jiroft_Airport.position, Point(1692, 1343)),
|
||||||
ReferencePoint(persiangulf.Liwa_AFB.position, Point(358, 3238)),
|
ReferencePoint(persiangulf.Liwa_Airbase.position, Point(358, 3238)),
|
||||||
)
|
)
|
||||||
landmap = load_landmap("resources\\gulflandmap.p")
|
landmap = load_landmap("resources\\gulflandmap.p")
|
||||||
daytime_map = {
|
daytime_map = {
|
||||||
@@ -864,7 +811,6 @@ class FrontLine(MissionTarget):
|
|||||||
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
|
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
|
||||||
yield from [
|
yield from [
|
||||||
FlightType.CAS,
|
FlightType.CAS,
|
||||||
FlightType.AEWC,
|
|
||||||
# TODO: FlightType.TROOP_TRANSPORT
|
# TODO: FlightType.TROOP_TRANSPORT
|
||||||
# TODO: FlightType.EVAC
|
# TODO: FlightType.EVAC
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import heapq
|
|||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
|
import re
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
@@ -27,7 +28,6 @@ from gen.ground_forces.combat_stance import CombatStance
|
|||||||
from gen.runways import RunwayAssigner, RunwayData
|
from gen.runways import RunwayAssigner, RunwayData
|
||||||
from .base import Base
|
from .base import Base
|
||||||
from .missiontarget import MissionTarget
|
from .missiontarget import MissionTarget
|
||||||
from game.point_with_heading import PointWithHeading
|
|
||||||
from .theatergroundobject import (
|
from .theatergroundobject import (
|
||||||
BaseDefenseGroundObject,
|
BaseDefenseGroundObject,
|
||||||
EwrGroundObject,
|
EwrGroundObject,
|
||||||
@@ -63,7 +63,6 @@ class LocationType(Enum):
|
|||||||
BaseAirDefense = "base air defense"
|
BaseAirDefense = "base air defense"
|
||||||
Coastal = "coastal defense"
|
Coastal = "coastal defense"
|
||||||
Ewr = "EWR"
|
Ewr = "EWR"
|
||||||
BaseEwr = "Base EWR"
|
|
||||||
Garrison = "garrison"
|
Garrison = "garrison"
|
||||||
MissileSite = "missile site"
|
MissileSite = "missile site"
|
||||||
OffshoreStrikeTarget = "offshore strike target"
|
OffshoreStrikeTarget = "offshore strike target"
|
||||||
@@ -78,44 +77,38 @@ class PresetLocations:
|
|||||||
"""Defines the preset locations loaded from the campaign mission file."""
|
"""Defines the preset locations loaded from the campaign mission file."""
|
||||||
|
|
||||||
#: Locations used for spawning ground defenses for bases.
|
#: Locations used for spawning ground defenses for bases.
|
||||||
base_garrisons: List[PointWithHeading] = field(default_factory=list)
|
base_garrisons: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used for spawning air defenses for bases. Used by SAMs, AAA,
|
#: Locations used for spawning air defenses for bases. Used by SAMs, AAA,
|
||||||
#: and SHORADs.
|
#: and SHORADs.
|
||||||
base_air_defense: List[PointWithHeading] = field(default_factory=list)
|
base_air_defense: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by EWRs.
|
#: Locations used by EWRs.
|
||||||
ewrs: List[PointWithHeading] = field(default_factory=list)
|
ewrs: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by Base EWRs.
|
|
||||||
base_ewrs: List[PointWithHeading] = field(default_factory=list)
|
|
||||||
|
|
||||||
#: Locations used by non-carrier ships. Carriers and LHAs are not random.
|
#: Locations used by non-carrier ships. Carriers and LHAs are not random.
|
||||||
ships: List[PointWithHeading] = field(default_factory=list)
|
ships: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by coastal defenses.
|
#: Locations used by coastal defenses.
|
||||||
coastal_defenses: List[PointWithHeading] = field(default_factory=list)
|
coastal_defenses: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by ground based strike objectives.
|
#: Locations used by ground based strike objectives.
|
||||||
strike_locations: List[PointWithHeading] = field(default_factory=list)
|
strike_locations: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by offshore strike objectives.
|
#: Locations used by offshore strike objectives.
|
||||||
offshore_strike_locations: List[PointWithHeading] = field(default_factory=list)
|
offshore_strike_locations: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations used by missile sites like scuds and V-2s.
|
#: Locations used by missile sites like scuds and V-2s.
|
||||||
missile_sites: List[PointWithHeading] = field(default_factory=list)
|
missile_sites: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations of long range SAMs which should always be spawned.
|
#: Locations of long range SAMs which should always be spawned.
|
||||||
required_long_range_sams: List[PointWithHeading] = field(default_factory=list)
|
required_long_range_sams: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations of medium range SAMs which should always be spawned.
|
#: Locations of medium range SAMs which should always be spawned.
|
||||||
required_medium_range_sams: List[PointWithHeading] = field(default_factory=list)
|
required_medium_range_sams: List[Point] = field(default_factory=list)
|
||||||
|
|
||||||
#: Locations of EWRs which should always be spawned.
|
|
||||||
required_ewrs: List[PointWithHeading] = field(default_factory=list)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _random_from(points: List[PointWithHeading]) -> Optional[PointWithHeading]:
|
def _random_from(points: List[Point]) -> Optional[Point]:
|
||||||
"""Finds, removes, and returns a random position from the given list."""
|
"""Finds, removes, and returns a random position from the given list."""
|
||||||
if not points:
|
if not points:
|
||||||
return None
|
return None
|
||||||
@@ -123,7 +116,7 @@ class PresetLocations:
|
|||||||
points.remove(point)
|
points.remove(point)
|
||||||
return point
|
return point
|
||||||
|
|
||||||
def random_for(self, location_type: LocationType) -> Optional[PointWithHeading]:
|
def random_for(self, location_type: LocationType) -> Optional[Point]:
|
||||||
"""Returns a position suitable for the given location type.
|
"""Returns a position suitable for the given location type.
|
||||||
|
|
||||||
The location, if found, will be claimed by the caller and not available
|
The location, if found, will be claimed by the caller and not available
|
||||||
@@ -135,8 +128,6 @@ class PresetLocations:
|
|||||||
return self._random_from(self.coastal_defenses)
|
return self._random_from(self.coastal_defenses)
|
||||||
if location_type == LocationType.Ewr:
|
if location_type == LocationType.Ewr:
|
||||||
return self._random_from(self.ewrs)
|
return self._random_from(self.ewrs)
|
||||||
if location_type == LocationType.BaseEwr:
|
|
||||||
return self._random_from(self.base_ewrs)
|
|
||||||
if location_type == LocationType.Garrison:
|
if location_type == LocationType.Garrison:
|
||||||
return self._random_from(self.base_garrisons)
|
return self._random_from(self.base_garrisons)
|
||||||
if location_type == LocationType.MissileSite:
|
if location_type == LocationType.MissileSite:
|
||||||
@@ -259,7 +250,6 @@ class ControlPoint(MissionTarget, ABC):
|
|||||||
self.connected_objectives: List[TheaterGroundObject] = []
|
self.connected_objectives: List[TheaterGroundObject] = []
|
||||||
self.base_defenses: List[BaseDefenseGroundObject] = []
|
self.base_defenses: List[BaseDefenseGroundObject] = []
|
||||||
self.preset_locations = PresetLocations()
|
self.preset_locations = PresetLocations()
|
||||||
self.helipads: List[PointWithHeading] = []
|
|
||||||
|
|
||||||
# TODO: Should be Airbase specific.
|
# TODO: Should be Airbase specific.
|
||||||
self.size = size
|
self.size = size
|
||||||
@@ -396,19 +386,18 @@ class ControlPoint(MissionTarget, ABC):
|
|||||||
# TODO: Should be Airbase specific.
|
# TODO: Should be Airbase specific.
|
||||||
def clear_base_defenses(self) -> None:
|
def clear_base_defenses(self) -> None:
|
||||||
for base_defense in self.base_defenses:
|
for base_defense in self.base_defenses:
|
||||||
p = PointWithHeading.from_point(base_defense.position, base_defense.heading)
|
|
||||||
if isinstance(base_defense, EwrGroundObject):
|
if isinstance(base_defense, EwrGroundObject):
|
||||||
self.preset_locations.base_ewrs.append(p)
|
self.preset_locations.ewrs.append(base_defense.position)
|
||||||
elif isinstance(base_defense, SamGroundObject):
|
elif isinstance(base_defense, SamGroundObject):
|
||||||
self.preset_locations.base_air_defense.append(p)
|
self.preset_locations.base_air_defense.append(base_defense.position)
|
||||||
elif isinstance(base_defense, VehicleGroupGroundObject):
|
elif isinstance(base_defense, VehicleGroupGroundObject):
|
||||||
self.preset_locations.base_garrisons.append(p)
|
self.preset_locations.base_garrisons.append(base_defense.position)
|
||||||
else:
|
else:
|
||||||
logging.error(
|
logging.error(
|
||||||
"Could not determine preset location type for "
|
"Could not determine preset location type for "
|
||||||
f"{base_defense}. Assuming garrison type."
|
f"{base_defense}. Assuming garrison type."
|
||||||
)
|
)
|
||||||
self.preset_locations.base_garrisons.append(p)
|
self.preset_locations.base_garrisons.append(base_defense.position)
|
||||||
self.base_defenses = []
|
self.base_defenses = []
|
||||||
|
|
||||||
def capture_equipment(self, game: Game) -> None:
|
def capture_equipment(self, game: Game) -> None:
|
||||||
@@ -644,15 +633,6 @@ class ControlPoint(MissionTarget, ABC):
|
|||||||
def income_per_turn(self) -> int:
|
def income_per_turn(self) -> int:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
|
|
||||||
from gen.flights.flight import FlightType
|
|
||||||
|
|
||||||
if self.is_friendly(for_player):
|
|
||||||
yield from [
|
|
||||||
FlightType.AEWC,
|
|
||||||
]
|
|
||||||
yield from super().mission_types(for_player)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def has_active_frontline(self) -> bool:
|
def has_active_frontline(self) -> bool:
|
||||||
return any(not c.is_friendly(self.captured) for c in self.connected_points)
|
return any(not c.is_friendly(self.captured) for c in self.connected_points)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from dcs.vehicles import AirDefence
|
|||||||
|
|
||||||
from game import Game, db
|
from game import Game, db
|
||||||
from game.factions.faction import Faction
|
from game.factions.faction import Faction
|
||||||
from game.theater import Carrier, Lha, LocationType, PointWithHeading
|
from game.theater import Carrier, Lha, LocationType
|
||||||
from game.theater.theatergroundobject import (
|
from game.theater.theatergroundobject import (
|
||||||
BuildingGroundObject,
|
BuildingGroundObject,
|
||||||
CarrierGroundObject,
|
CarrierGroundObject,
|
||||||
@@ -23,11 +23,9 @@ from game.theater.theatergroundobject import (
|
|||||||
SamGroundObject,
|
SamGroundObject,
|
||||||
ShipGroundObject,
|
ShipGroundObject,
|
||||||
VehicleGroupGroundObject,
|
VehicleGroupGroundObject,
|
||||||
CoastalSiteGroundObject,
|
|
||||||
)
|
)
|
||||||
from game.version import VERSION
|
from game.version import VERSION
|
||||||
from gen import namegen
|
from gen import namegen
|
||||||
from gen.coastal.coastal_group_generator import generate_coastal_group
|
|
||||||
from gen.defenses.armor_group_generator import generate_armor_group
|
from gen.defenses.armor_group_generator import generate_armor_group
|
||||||
from gen.fleet.ship_group_generator import (
|
from gen.fleet.ship_group_generator import (
|
||||||
generate_carrier_group,
|
generate_carrier_group,
|
||||||
@@ -37,8 +35,10 @@ from gen.fleet.ship_group_generator import (
|
|||||||
from gen.locations.preset_location_finder import MizDataLocationFinder
|
from gen.locations.preset_location_finder import MizDataLocationFinder
|
||||||
from gen.missiles.missiles_group_generator import generate_missile_group
|
from gen.missiles.missiles_group_generator import generate_missile_group
|
||||||
from gen.sam.airdefensegroupgenerator import AirDefenseRange
|
from gen.sam.airdefensegroupgenerator import AirDefenseRange
|
||||||
from gen.sam.sam_group_generator import generate_anti_air_group
|
from gen.sam.sam_group_generator import (
|
||||||
from gen.sam.ewr_group_generator import generate_ewr_group
|
generate_anti_air_group,
|
||||||
|
generate_ewr_group,
|
||||||
|
)
|
||||||
from . import (
|
from . import (
|
||||||
ConflictTheater,
|
ConflictTheater,
|
||||||
ControlPoint,
|
ControlPoint,
|
||||||
@@ -148,13 +148,13 @@ class LocationFinder:
|
|||||||
game.theater.terrain.name, control_point.full_name
|
game.theater.terrain.name, control_point.full_name
|
||||||
)
|
)
|
||||||
|
|
||||||
def location_for(self, location_type: LocationType) -> Optional[PointWithHeading]:
|
def location_for(self, location_type: LocationType) -> Optional[Point]:
|
||||||
position = self.control_point.preset_locations.random_for(location_type)
|
position = self.control_point.preset_locations.random_for(location_type)
|
||||||
if position is not None:
|
if position is not None:
|
||||||
return position
|
return position
|
||||||
|
|
||||||
logging.warning(
|
logging.warning(
|
||||||
f"No campaign location for %s Mat %s",
|
f"No campaign location for %s at %s",
|
||||||
location_type.value,
|
location_type.value,
|
||||||
self.control_point,
|
self.control_point,
|
||||||
)
|
)
|
||||||
@@ -178,7 +178,7 @@ class LocationFinder:
|
|||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def random_from_miz_data(self, offshore: bool) -> Optional[PointWithHeading]:
|
def random_from_miz_data(self, offshore: bool) -> Optional[Point]:
|
||||||
if offshore:
|
if offshore:
|
||||||
locations = self.miz_data.offshore_locations
|
locations = self.miz_data.offshore_locations
|
||||||
else:
|
else:
|
||||||
@@ -186,18 +186,11 @@ class LocationFinder:
|
|||||||
if self.miz_data.offshore_locations:
|
if self.miz_data.offshore_locations:
|
||||||
preset = random.choice(locations)
|
preset = random.choice(locations)
|
||||||
locations.remove(preset)
|
locations.remove(preset)
|
||||||
return PointWithHeading.from_point(preset.position, preset.heading)
|
return preset.position
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def random_position(
|
def random_position(self, location_type: LocationType) -> Optional[Point]:
|
||||||
self, location_type: LocationType
|
|
||||||
) -> Optional[PointWithHeading]:
|
|
||||||
# TODO: Flesh out preset locations so we never hit this case.
|
# TODO: Flesh out preset locations so we never hit this case.
|
||||||
|
|
||||||
if location_type == LocationType.Coastal:
|
|
||||||
# No coastal locations generated randomly
|
|
||||||
return None
|
|
||||||
|
|
||||||
logging.warning(
|
logging.warning(
|
||||||
"Falling back to random location for %s at %s",
|
"Falling back to random location for %s at %s",
|
||||||
location_type.value,
|
location_type.value,
|
||||||
@@ -257,7 +250,7 @@ class LocationFinder:
|
|||||||
on_ground: bool,
|
on_ground: bool,
|
||||||
is_base_defense: bool,
|
is_base_defense: bool,
|
||||||
avoid_others: bool,
|
avoid_others: bool,
|
||||||
) -> Optional[PointWithHeading]:
|
) -> Optional[Point]:
|
||||||
"""
|
"""
|
||||||
Find a valid ground object location
|
Find a valid ground object location
|
||||||
:param on_ground: Whether it should be on ground or on sea (True = on
|
:param on_ground: Whether it should be on ground or on sea (True = on
|
||||||
@@ -270,7 +263,7 @@ class LocationFinder:
|
|||||||
near = self.control_point.position
|
near = self.control_point.position
|
||||||
others = self.control_point.ground_objects
|
others = self.control_point.ground_objects
|
||||||
|
|
||||||
def is_valid(point: Optional[PointWithHeading]) -> bool:
|
def is_valid(point: Optional[Point]) -> bool:
|
||||||
if point is None:
|
if point is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -301,9 +294,7 @@ class LocationFinder:
|
|||||||
|
|
||||||
for _ in range(300):
|
for _ in range(300):
|
||||||
# Check if on land or sea
|
# Check if on land or sea
|
||||||
p = PointWithHeading.from_point(
|
p = near.random_point_within(max_range, min_range)
|
||||||
near.random_point_within(max_range, min_range), random.randint(0, 360)
|
|
||||||
)
|
|
||||||
if is_valid(p):
|
if is_valid(p):
|
||||||
return p
|
return p
|
||||||
return None
|
return None
|
||||||
@@ -455,18 +446,14 @@ class BaseDefenseGenerator:
|
|||||||
self.generate_base_defenses()
|
self.generate_base_defenses()
|
||||||
|
|
||||||
def generate_ewr(self) -> None:
|
def generate_ewr(self) -> None:
|
||||||
position = self.location_finder.location_for(LocationType.BaseEwr)
|
position = self.location_finder.location_for(LocationType.Ewr)
|
||||||
if position is None:
|
if position is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
group_id = self.game.next_group_id()
|
group_id = self.game.next_group_id()
|
||||||
|
|
||||||
g = EwrGroundObject(
|
g = EwrGroundObject(
|
||||||
namegen.random_objective_name(),
|
namegen.random_objective_name(), group_id, position, self.control_point
|
||||||
group_id,
|
|
||||||
position,
|
|
||||||
self.control_point,
|
|
||||||
True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
group = generate_ewr_group(self.game, g, self.faction)
|
group = generate_ewr_group(self.game, g, self.faction)
|
||||||
@@ -603,15 +590,11 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
if self.faction.missiles:
|
if self.faction.missiles:
|
||||||
self.generate_missile_sites()
|
self.generate_missile_sites()
|
||||||
|
|
||||||
if self.faction.coastal_defenses:
|
|
||||||
self.generate_coastal_sites()
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def generate_ground_points(self) -> None:
|
def generate_ground_points(self) -> None:
|
||||||
"""Generate ground objects and AA sites for the control point."""
|
"""Generate ground objects and AA sites for the control point."""
|
||||||
skip_sams = self.generate_required_aa()
|
skip_sams = self.generate_required_aa()
|
||||||
skip_ewrs = self.generate_required_ewr()
|
|
||||||
|
|
||||||
if self.control_point.is_global:
|
if self.control_point.is_global:
|
||||||
return
|
return
|
||||||
@@ -628,12 +611,6 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
skip_sams -= 1
|
skip_sams -= 1
|
||||||
else:
|
else:
|
||||||
self.generate_aa_site()
|
self.generate_aa_site()
|
||||||
# 1 in 4 additional objectives are EWR.
|
|
||||||
elif random.randint(0, 3) == 0:
|
|
||||||
if skip_ewrs > 0:
|
|
||||||
skip_ewrs -= 1
|
|
||||||
else:
|
|
||||||
self.generate_ewr_site()
|
|
||||||
else:
|
else:
|
||||||
self.generate_ground_point()
|
self.generate_ground_point()
|
||||||
|
|
||||||
@@ -665,17 +642,6 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
presets.required_medium_range_sams
|
presets.required_medium_range_sams
|
||||||
)
|
)
|
||||||
|
|
||||||
def generate_required_ewr(self) -> int:
|
|
||||||
"""Generates the EWR sites that are required by the campaign.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
The number of EWR sites that were generated.
|
|
||||||
"""
|
|
||||||
presets = self.control_point.preset_locations
|
|
||||||
for position in presets.required_ewrs:
|
|
||||||
self.generate_ewr_at(position)
|
|
||||||
return len(presets.required_ewrs)
|
|
||||||
|
|
||||||
def generate_ground_point(self) -> None:
|
def generate_ground_point(self) -> None:
|
||||||
try:
|
try:
|
||||||
category = random.choice(self.faction.building_set)
|
category = random.choice(self.faction.building_set)
|
||||||
@@ -753,33 +719,6 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
g.groups = groups
|
g.groups = groups
|
||||||
self.control_point.connected_objectives.append(g)
|
self.control_point.connected_objectives.append(g)
|
||||||
|
|
||||||
def generate_ewr_site(self) -> None:
|
|
||||||
position = self.location_finder.location_for(LocationType.Ewr)
|
|
||||||
if position is None:
|
|
||||||
return
|
|
||||||
self.generate_ewr_at(position)
|
|
||||||
|
|
||||||
def generate_ewr_at(self, position: Point) -> None:
|
|
||||||
group_id = self.game.next_group_id()
|
|
||||||
|
|
||||||
g = EwrGroundObject(
|
|
||||||
namegen.random_objective_name(),
|
|
||||||
group_id,
|
|
||||||
position,
|
|
||||||
self.control_point,
|
|
||||||
for_airbase=False,
|
|
||||||
)
|
|
||||||
group = generate_ewr_group(self.game, g, self.faction)
|
|
||||||
if group is None:
|
|
||||||
logging.error(
|
|
||||||
"Could not generate ewr group for %s at %s",
|
|
||||||
g.name,
|
|
||||||
self.control_point,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
g.groups = [group]
|
|
||||||
self.control_point.connected_objectives.append(g)
|
|
||||||
|
|
||||||
def generate_missile_sites(self) -> None:
|
def generate_missile_sites(self) -> None:
|
||||||
for i in range(self.faction.missiles_group_count):
|
for i in range(self.faction.missiles_group_count):
|
||||||
self.generate_missile_site()
|
self.generate_missile_site()
|
||||||
@@ -801,31 +740,6 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
self.control_point.connected_objectives.append(g)
|
self.control_point.connected_objectives.append(g)
|
||||||
return
|
return
|
||||||
|
|
||||||
def generate_coastal_sites(self) -> None:
|
|
||||||
for i in range(self.faction.coastal_group_count):
|
|
||||||
self.generate_coastal_site()
|
|
||||||
|
|
||||||
def generate_coastal_site(self) -> None:
|
|
||||||
position = self.location_finder.location_for(LocationType.Coastal)
|
|
||||||
if position is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
group_id = self.game.next_group_id()
|
|
||||||
|
|
||||||
g = CoastalSiteGroundObject(
|
|
||||||
namegen.random_objective_name(),
|
|
||||||
group_id,
|
|
||||||
position,
|
|
||||||
self.control_point,
|
|
||||||
position.heading,
|
|
||||||
)
|
|
||||||
group = generate_coastal_group(self.game, g, self.faction_name)
|
|
||||||
g.groups = []
|
|
||||||
if group is not None:
|
|
||||||
g.groups.append(group)
|
|
||||||
self.control_point.connected_objectives.append(g)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
class FobGroundObjectGenerator(AirbaseGroundObjectGenerator):
|
class FobGroundObjectGenerator(AirbaseGroundObjectGenerator):
|
||||||
def generate(self) -> bool:
|
def generate(self) -> bool:
|
||||||
|
|||||||
@@ -344,28 +344,6 @@ class MissileSiteGroundObject(TheaterGroundObject):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class CoastalSiteGroundObject(TheaterGroundObject):
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
name: str,
|
|
||||||
group_id: int,
|
|
||||||
position: Point,
|
|
||||||
control_point: ControlPoint,
|
|
||||||
heading,
|
|
||||||
) -> None:
|
|
||||||
super().__init__(
|
|
||||||
name=name,
|
|
||||||
category="aa",
|
|
||||||
group_id=group_id,
|
|
||||||
position=position,
|
|
||||||
heading=heading,
|
|
||||||
control_point=control_point,
|
|
||||||
dcs_identifier="AA",
|
|
||||||
airbase_group=False,
|
|
||||||
sea_object=False,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class BaseDefenseGroundObject(TheaterGroundObject):
|
class BaseDefenseGroundObject(TheaterGroundObject):
|
||||||
"""Base type for all base defenses."""
|
"""Base type for all base defenses."""
|
||||||
|
|
||||||
@@ -442,12 +420,7 @@ class VehicleGroupGroundObject(BaseDefenseGroundObject):
|
|||||||
|
|
||||||
class EwrGroundObject(BaseDefenseGroundObject):
|
class EwrGroundObject(BaseDefenseGroundObject):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self, name: str, group_id: int, position: Point, control_point: ControlPoint
|
||||||
name: str,
|
|
||||||
group_id: int,
|
|
||||||
position: Point,
|
|
||||||
control_point: ControlPoint,
|
|
||||||
for_airbase: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__(
|
super().__init__(
|
||||||
name=name,
|
name=name,
|
||||||
@@ -457,7 +430,7 @@ class EwrGroundObject(BaseDefenseGroundObject):
|
|||||||
heading=0,
|
heading=0,
|
||||||
control_point=control_point,
|
control_point=control_point,
|
||||||
dcs_identifier="EWR",
|
dcs_identifier="EWR",
|
||||||
airbase_group=for_airbase,
|
airbase_group=True,
|
||||||
sea_object=False,
|
sea_object=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ from shapely.ops import nearest_points, unary_union
|
|||||||
|
|
||||||
from game.theater import ControlPoint
|
from game.theater import ControlPoint
|
||||||
from game.utils import Distance, meters, nautical_miles
|
from game.utils import Distance, meters, nautical_miles
|
||||||
from gen import Conflict
|
|
||||||
from gen.flights.closestairfields import ObjectiveDistanceCache
|
from gen.flights.closestairfields import ObjectiveDistanceCache
|
||||||
from gen.flights.flight import Flight
|
from gen.flights.flight import Flight
|
||||||
|
|
||||||
@@ -132,7 +131,7 @@ class ThreatZones:
|
|||||||
zone belongs to the player, it is the zone that will be avoided by
|
zone belongs to the player, it is the zone that will be avoided by
|
||||||
the enemy and vice versa.
|
the enemy and vice versa.
|
||||||
"""
|
"""
|
||||||
air_threats = []
|
airbases = []
|
||||||
air_defenses = []
|
air_defenses = []
|
||||||
for control_point in game.theater.controlpoints:
|
for control_point in game.theater.controlpoints:
|
||||||
if control_point.captured != player:
|
if control_point.captured != player:
|
||||||
@@ -140,7 +139,7 @@ class ThreatZones:
|
|||||||
if control_point.runway_is_operational():
|
if control_point.runway_is_operational():
|
||||||
point = ShapelyPoint(control_point.position.x, control_point.position.y)
|
point = ShapelyPoint(control_point.position.x, control_point.position.y)
|
||||||
cap_threat_range = cls.barcap_threat_range(game, control_point)
|
cap_threat_range = cls.barcap_threat_range(game, control_point)
|
||||||
air_threats.append(point.buffer(cap_threat_range.meters))
|
airbases.append(point.buffer(cap_threat_range.meters))
|
||||||
|
|
||||||
for tgo in control_point.ground_objects:
|
for tgo in control_point.ground_objects:
|
||||||
for group in tgo.groups:
|
for group in tgo.groups:
|
||||||
@@ -153,7 +152,7 @@ class ThreatZones:
|
|||||||
air_defenses.append(threat_zone)
|
air_defenses.append(threat_zone)
|
||||||
|
|
||||||
return cls(
|
return cls(
|
||||||
airbases=unary_union(air_threats), air_defenses=unary_union(air_defenses)
|
airbases=unary_union(airbases), air_defenses=unary_union(air_defenses)
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
|
|
||||||
def _build_version_string() -> str:
|
def _build_version_string() -> str:
|
||||||
components = ["2.5"]
|
components = ["2.4.4"]
|
||||||
build_number_path = Path("resources/buildnumber")
|
build_number_path = Path("resources/buildnumber")
|
||||||
if build_number_path.exists():
|
if build_number_path.exists():
|
||||||
with build_number_path.open("r") as build_number_file:
|
with build_number_path.open("r") as build_number_file:
|
||||||
|
|||||||
@@ -3,12 +3,11 @@ from __future__ import annotations
|
|||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
|
|
||||||
from dcs.cloud_presets import Clouds as PydcsClouds
|
from dcs.weather import Weather as PydcsWeather, Wind
|
||||||
from dcs.weather import CloudPreset, Weather as PydcsWeather, Wind
|
|
||||||
|
|
||||||
from game.settings import Settings
|
from game.settings import Settings
|
||||||
from game.utils import Distance, meters
|
from game.utils import Distance, meters
|
||||||
@@ -37,23 +36,6 @@ class Clouds:
|
|||||||
density: int
|
density: int
|
||||||
thickness: int
|
thickness: int
|
||||||
precipitation: PydcsWeather.Preceptions
|
precipitation: PydcsWeather.Preceptions
|
||||||
preset: Optional[CloudPreset] = field(default=None)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def random_preset(cls, rain: bool) -> Clouds:
|
|
||||||
clouds = (p.value for p in PydcsClouds)
|
|
||||||
if rain:
|
|
||||||
presets = [p for p in clouds if "Rain" in p.name]
|
|
||||||
else:
|
|
||||||
presets = [p for p in clouds if "Rain" not in p.name]
|
|
||||||
preset = random.choice(presets)
|
|
||||||
return Clouds(
|
|
||||||
base=random.randint(preset.min_base, preset.max_base),
|
|
||||||
density=0,
|
|
||||||
thickness=0,
|
|
||||||
precipitation=PydcsWeather.Preceptions.None_,
|
|
||||||
preset=preset,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
@@ -119,11 +101,12 @@ class ClearSkies(Weather):
|
|||||||
|
|
||||||
class Cloudy(Weather):
|
class Cloudy(Weather):
|
||||||
def generate_clouds(self) -> Optional[Clouds]:
|
def generate_clouds(self) -> Optional[Clouds]:
|
||||||
return Clouds.random_preset(rain=False)
|
return Clouds(
|
||||||
|
base=self.random_cloud_base(),
|
||||||
def generate_fog(self) -> Optional[Fog]:
|
density=random.randint(1, 8),
|
||||||
# DCS 2.7 says to not use fog with the cloud presets.
|
thickness=self.random_cloud_thickness(),
|
||||||
return None
|
precipitation=PydcsWeather.Preceptions.None_,
|
||||||
|
)
|
||||||
|
|
||||||
def generate_wind(self) -> WindConditions:
|
def generate_wind(self) -> WindConditions:
|
||||||
return self.random_wind(0, 4)
|
return self.random_wind(0, 4)
|
||||||
@@ -131,11 +114,12 @@ class Cloudy(Weather):
|
|||||||
|
|
||||||
class Raining(Weather):
|
class Raining(Weather):
|
||||||
def generate_clouds(self) -> Optional[Clouds]:
|
def generate_clouds(self) -> Optional[Clouds]:
|
||||||
return Clouds.random_preset(rain=True)
|
return Clouds(
|
||||||
|
base=self.random_cloud_base(),
|
||||||
def generate_fog(self) -> Optional[Fog]:
|
density=random.randint(5, 8),
|
||||||
# DCS 2.7 says to not use fog with the cloud presets.
|
thickness=self.random_cloud_thickness(),
|
||||||
return None
|
precipitation=PydcsWeather.Preceptions.Rain,
|
||||||
|
)
|
||||||
|
|
||||||
def generate_wind(self) -> WindConditions:
|
def generate_wind(self) -> WindConditions:
|
||||||
return self.random_wind(0, 6)
|
return self.random_wind(0, 6)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from typing import Dict, List, Optional, TYPE_CHECKING, Type, Union
|
from typing import Dict, List, Optional, TYPE_CHECKING, Type, Union
|
||||||
@@ -41,7 +41,6 @@ from dcs.planes import (
|
|||||||
)
|
)
|
||||||
from dcs.point import MovingPoint, PointAction
|
from dcs.point import MovingPoint, PointAction
|
||||||
from dcs.task import (
|
from dcs.task import (
|
||||||
AWACS,
|
|
||||||
AntishipStrike,
|
AntishipStrike,
|
||||||
AttackGroup,
|
AttackGroup,
|
||||||
Bombing,
|
Bombing,
|
||||||
@@ -67,8 +66,6 @@ from dcs.task import (
|
|||||||
Targets,
|
Targets,
|
||||||
Task,
|
Task,
|
||||||
WeaponType,
|
WeaponType,
|
||||||
AWACSTaskAction,
|
|
||||||
SetFrequencyCommand,
|
|
||||||
)
|
)
|
||||||
from dcs.terrain.terrain import Airport, NoParkingSlotError
|
from dcs.terrain.terrain import Airport, NoParkingSlotError
|
||||||
from dcs.triggers import Event, TriggerOnce, TriggerRule
|
from dcs.triggers import Event, TriggerOnce, TriggerRule
|
||||||
@@ -90,8 +87,10 @@ from game.theater.controlpoint import (
|
|||||||
from game.theater.theatergroundobject import TheaterGroundObject
|
from game.theater.theatergroundobject import TheaterGroundObject
|
||||||
from game.unitmap import UnitMap
|
from game.unitmap import UnitMap
|
||||||
from game.utils import Distance, meters, nautical_miles
|
from game.utils import Distance, meters, nautical_miles
|
||||||
|
from gen.airsupportgen import AirSupport
|
||||||
from gen.ato import AirTaskingOrder, Package
|
from gen.ato import AirTaskingOrder, Package
|
||||||
from gen.callsigns import create_group_callsign_from_unit
|
from gen.callsigns import create_group_callsign_from_unit
|
||||||
|
from gen.conflictgen import FRONTLINE_LENGTH
|
||||||
from gen.flights.flight import (
|
from gen.flights.flight import (
|
||||||
Flight,
|
Flight,
|
||||||
FlightType,
|
FlightType,
|
||||||
@@ -105,12 +104,9 @@ from .flights.flightplan import (
|
|||||||
LoiterFlightPlan,
|
LoiterFlightPlan,
|
||||||
PatrollingFlightPlan,
|
PatrollingFlightPlan,
|
||||||
SweepFlightPlan,
|
SweepFlightPlan,
|
||||||
AwacsFlightPlan,
|
|
||||||
)
|
)
|
||||||
from .flights.traveltime import GroundSpeed, TotEstimator
|
from .flights.traveltime import GroundSpeed, TotEstimator
|
||||||
from .naming import namegen
|
from .naming import namegen
|
||||||
from .airsupportgen import AirSupport, AwacsInfo
|
|
||||||
from .callsigns import callsign_for_support_unit
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
@@ -138,7 +134,6 @@ TARGET_WAYPOINTS = (
|
|||||||
FlightWaypointType.TARGET_SHIP,
|
FlightWaypointType.TARGET_SHIP,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# TODO: Get radio information for all the special cases.
|
# TODO: Get radio information for all the special cases.
|
||||||
def get_fallback_channel(unit_type: UnitType) -> RadioFrequency:
|
def get_fallback_channel(unit_type: UnitType) -> RadioFrequency:
|
||||||
if unit_type in helicopter_map.values() and unit_type != UH_1H:
|
if unit_type in helicopter_map.values() and unit_type != UH_1H:
|
||||||
@@ -323,7 +318,6 @@ class FlightData:
|
|||||||
intra_flight_channel: RadioFrequency,
|
intra_flight_channel: RadioFrequency,
|
||||||
bingo_fuel: Optional[int],
|
bingo_fuel: Optional[int],
|
||||||
joker_fuel: Optional[int],
|
joker_fuel: Optional[int],
|
||||||
custom_name: Optional[str],
|
|
||||||
) -> None:
|
) -> None:
|
||||||
self.package = package
|
self.package = package
|
||||||
self.country = country
|
self.country = country
|
||||||
@@ -341,7 +335,6 @@ class FlightData:
|
|||||||
self.bingo_fuel = bingo_fuel
|
self.bingo_fuel = bingo_fuel
|
||||||
self.joker_fuel = joker_fuel
|
self.joker_fuel = joker_fuel
|
||||||
self.callsign = create_group_callsign_from_unit(self.units[0])
|
self.callsign = create_group_callsign_from_unit(self.units[0])
|
||||||
self.custom_name = custom_name
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def client_units(self) -> List[FlyingUnit]:
|
def client_units(self) -> List[FlyingUnit]:
|
||||||
@@ -676,7 +669,6 @@ class AircraftConflictGenerator:
|
|||||||
game: Game,
|
game: Game,
|
||||||
radio_registry: RadioRegistry,
|
radio_registry: RadioRegistry,
|
||||||
unit_map: UnitMap,
|
unit_map: UnitMap,
|
||||||
air_support: AirSupport,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
self.m = mission
|
self.m = mission
|
||||||
self.game = game
|
self.game = game
|
||||||
@@ -684,7 +676,6 @@ class AircraftConflictGenerator:
|
|||||||
self.radio_registry = radio_registry
|
self.radio_registry = radio_registry
|
||||||
self.unit_map = unit_map
|
self.unit_map = unit_map
|
||||||
self.flights: List[FlightData] = []
|
self.flights: List[FlightData] = []
|
||||||
self.air_support = air_support
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def use_client(self) -> bool:
|
def use_client(self) -> bool:
|
||||||
@@ -799,9 +790,6 @@ class AircraftConflictGenerator:
|
|||||||
OptReactOnThreat(OptReactOnThreat.Values.EvadeFire)
|
OptReactOnThreat(OptReactOnThreat.Values.EvadeFire)
|
||||||
)
|
)
|
||||||
|
|
||||||
if flight.flight_type == FlightType.AEWC:
|
|
||||||
channel = self.radio_registry.alloc_uhf()
|
|
||||||
else:
|
|
||||||
channel = self.get_intra_flight_channel(unit_type)
|
channel = self.get_intra_flight_channel(unit_type)
|
||||||
group.set_frequency(channel.mhz)
|
group.set_frequency(channel.mhz)
|
||||||
|
|
||||||
@@ -831,7 +819,6 @@ class AircraftConflictGenerator:
|
|||||||
intra_flight_channel=channel,
|
intra_flight_channel=channel,
|
||||||
bingo_fuel=flight.flight_plan.bingo_fuel,
|
bingo_fuel=flight.flight_plan.bingo_fuel,
|
||||||
joker_fuel=flight.flight_plan.joker_fuel,
|
joker_fuel=flight.flight_plan.joker_fuel,
|
||||||
custom_name=flight.custom_name,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -839,20 +826,6 @@ class AircraftConflictGenerator:
|
|||||||
if unit_type in [Su_33, C_101EB, C_101CC]:
|
if unit_type in [Su_33, C_101EB, C_101CC]:
|
||||||
self.set_reduced_fuel(flight, group, unit_type)
|
self.set_reduced_fuel(flight, group, unit_type)
|
||||||
|
|
||||||
if isinstance(flight.flight_plan, AwacsFlightPlan):
|
|
||||||
callsign = callsign_for_support_unit(group)
|
|
||||||
|
|
||||||
self.air_support.awacs.append(
|
|
||||||
AwacsInfo(
|
|
||||||
dcsGroupName=str(group.name),
|
|
||||||
callsign=callsign,
|
|
||||||
freq=channel,
|
|
||||||
depature_location=flight.departure.name,
|
|
||||||
end_time=flight.flight_plan.mission_departure_time,
|
|
||||||
start_time=flight.flight_plan.mission_start_time,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def _generate_at_airport(
|
def _generate_at_airport(
|
||||||
self,
|
self,
|
||||||
name: str,
|
name: str,
|
||||||
@@ -1377,33 +1350,6 @@ class AircraftConflictGenerator:
|
|||||||
restrict_jettison=True,
|
restrict_jettison=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def configure_awacs(
|
|
||||||
self,
|
|
||||||
group: FlyingGroup,
|
|
||||||
package: Package,
|
|
||||||
flight: Flight,
|
|
||||||
dynamic_runways: Dict[str, RunwayData],
|
|
||||||
) -> None:
|
|
||||||
group.task = AWACS.name
|
|
||||||
|
|
||||||
if not isinstance(flight.flight_plan, AwacsFlightPlan):
|
|
||||||
logging.error(
|
|
||||||
f"Cannot configure AEW&C tasks for {flight} because it does not have an AEW&C flight plan."
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
self._setup_group(group, AWACS, package, flight, dynamic_runways)
|
|
||||||
|
|
||||||
# Awacs task action
|
|
||||||
self.configure_behavior(
|
|
||||||
group,
|
|
||||||
react_on_threat=OptReactOnThreat.Values.EvadeFire,
|
|
||||||
roe=OptROE.Values.WeaponHold,
|
|
||||||
restrict_jettison=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
group.points[0].tasks.append(AWACSTaskAction())
|
|
||||||
|
|
||||||
def configure_escort(
|
def configure_escort(
|
||||||
self,
|
self,
|
||||||
group: FlyingGroup,
|
group: FlyingGroup,
|
||||||
@@ -1440,8 +1386,6 @@ class AircraftConflictGenerator:
|
|||||||
self.configure_cap(group, package, flight, dynamic_runways)
|
self.configure_cap(group, package, flight, dynamic_runways)
|
||||||
elif flight_type == FlightType.SWEEP:
|
elif flight_type == FlightType.SWEEP:
|
||||||
self.configure_sweep(group, package, flight, dynamic_runways)
|
self.configure_sweep(group, package, flight, dynamic_runways)
|
||||||
elif flight_type == FlightType.AEWC:
|
|
||||||
self.configure_awacs(group, package, flight, dynamic_runways)
|
|
||||||
elif flight_type in [FlightType.CAS, FlightType.BAI]:
|
elif flight_type in [FlightType.CAS, FlightType.BAI]:
|
||||||
self.configure_cas(group, package, flight, dynamic_runways)
|
self.configure_cas(group, package, flight, dynamic_runways)
|
||||||
elif flight_type == FlightType.DEAD:
|
elif flight_type == FlightType.DEAD:
|
||||||
|
|||||||
239
gen/airfields.py
239
gen/airfields.py
@@ -383,8 +383,8 @@ AIRFIELD_DATA = {
|
|||||||
"31": ("IVZ", MHz(108, 750)),
|
"31": ("IVZ", MHz(108, 750)),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
# PERSIAN GULF MAP
|
# TODO : PERSIAN GULF MAP
|
||||||
"Liwa AFB": AirfieldData(
|
"Liwa Airbase": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMLW",
|
icao="OMLW",
|
||||||
elevation=400,
|
elevation=400,
|
||||||
@@ -394,7 +394,7 @@ AIRFIELD_DATA = {
|
|||||||
vor=("OMLW", MHz(117, 400)),
|
vor=("OMLW", MHz(117, 400)),
|
||||||
atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(119, 300), MHz(250, 950)),
|
atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(119, 300), MHz(250, 950)),
|
||||||
),
|
),
|
||||||
"Al Dhafra AFB": AirfieldData(
|
"Al Dhafra AB": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMAM",
|
icao="OMAM",
|
||||||
elevation=52,
|
elevation=52,
|
||||||
@@ -402,50 +402,50 @@ AIRFIELD_DATA = {
|
|||||||
tacan=TacanChannel(96, TacanBand.X),
|
tacan=TacanChannel(96, TacanBand.X),
|
||||||
tacan_callsign="MA",
|
tacan_callsign="MA",
|
||||||
vor=("MA", MHz(114, 900)),
|
vor=("MA", MHz(114, 900)),
|
||||||
atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(126, 500), MHz(251, 100)),
|
atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(126, 500), MHz(251, 000)),
|
||||||
ils={
|
ils={
|
||||||
"13": ("MMA", MHz(111, 100)),
|
"13": ("MMA", MHz(111, 100)),
|
||||||
"31": ("IMA", MHz(109, 100)),
|
"31": ("IMA", MHz(109, 100)),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
"Al-Bateen": AirfieldData(
|
"Al-Bateen Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMAD",
|
icao="OMAD",
|
||||||
elevation=11,
|
elevation=11,
|
||||||
runway_length=6808,
|
runway_length=6808,
|
||||||
vor=("ALB", MHz(114, 0)),
|
vor=("ALB", MHz(114, 0)),
|
||||||
atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 900), MHz(250, 600)),
|
atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(119, 900), MHz(250, 550)),
|
||||||
),
|
),
|
||||||
"Sas Al Nakheel": AirfieldData(
|
"Sas Al Nakheel Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMNK",
|
icao="OMNK",
|
||||||
elevation=9,
|
elevation=9,
|
||||||
runway_length=5387,
|
runway_length=5387,
|
||||||
vor=("SAS", MHz(128, 930)),
|
vor=("SAS", MHz(128, 930)),
|
||||||
atc=AtcData(MHz(4, 0), MHz(38, 900), MHz(128, 900), MHz(250, 450)),
|
atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(128, 900), MHz(250, 450)),
|
||||||
),
|
),
|
||||||
"Abu Dhabi Intl": AirfieldData(
|
"Abu Dhabi International Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMAA",
|
icao="OMAA",
|
||||||
elevation=91,
|
elevation=91,
|
||||||
runway_length=12817,
|
runway_length=12817,
|
||||||
vor=("ADV", MHz(114, 250)),
|
vor=("ADV", MHz(114, 250)),
|
||||||
atc=AtcData(MHz(4, 50), MHz(39, 0), MHz(119, 200), MHz(250, 550)),
|
atc=AtcData(MHz(4, 000), MHz(38, 900), MHz(119, 200), MHz(250, 500)),
|
||||||
),
|
),
|
||||||
"Al Ain Intl": AirfieldData(
|
"Al Ain International Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMAL",
|
icao="OMAL",
|
||||||
elevation=813,
|
elevation=813,
|
||||||
runway_length=11267,
|
runway_length=11267,
|
||||||
vor=("ALN", MHz(112, 600)),
|
vor=("ALN", MHz(112, 600)),
|
||||||
atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(119, 850), MHz(250, 700)),
|
atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 850), MHz(250, 650)),
|
||||||
),
|
),
|
||||||
"Al Maktoum Intl": AirfieldData(
|
"Al Maktoum Intl": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMDW",
|
icao="OMDW",
|
||||||
elevation=123,
|
elevation=123,
|
||||||
runway_length=11500,
|
runway_length=11500,
|
||||||
atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(118, 600), MHz(251, 200)),
|
atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(118, 650), MHz(251, 100)),
|
||||||
ils={
|
ils={
|
||||||
"30": ("IJWA", MHz(109, 750)),
|
"30": ("IJWA", MHz(109, 750)),
|
||||||
"12": ("IMA", MHz(111, 750)),
|
"12": ("IMA", MHz(111, 750)),
|
||||||
@@ -458,7 +458,7 @@ AIRFIELD_DATA = {
|
|||||||
runway_length=11865,
|
runway_length=11865,
|
||||||
tacan=TacanChannel(99, TacanBand.X),
|
tacan=TacanChannel(99, TacanBand.X),
|
||||||
tacan_callsign="MIN",
|
tacan_callsign="MIN",
|
||||||
atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(118, 550), MHz(250, 100)),
|
atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(121, 800), MHz(250, 100)),
|
||||||
ils={
|
ils={
|
||||||
"27": ("IMNR", MHz(110, 750)),
|
"27": ("IMNR", MHz(110, 750)),
|
||||||
"9": ("IMNW", MHz(110, 700)),
|
"9": ("IMNW", MHz(110, 700)),
|
||||||
@@ -469,7 +469,7 @@ AIRFIELD_DATA = {
|
|||||||
icao="OMDB",
|
icao="OMDB",
|
||||||
elevation=16,
|
elevation=16,
|
||||||
runway_length=11018,
|
runway_length=11018,
|
||||||
atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(118, 750), MHz(251, 150)),
|
atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(118, 750), MHz(251, 50)),
|
||||||
ils={
|
ils={
|
||||||
"30": ("IDBL", MHz(110, 900)),
|
"30": ("IDBL", MHz(110, 900)),
|
||||||
"12": ("IDBR", MHz(110, 100)),
|
"12": ("IDBR", MHz(110, 100)),
|
||||||
@@ -480,7 +480,7 @@ AIRFIELD_DATA = {
|
|||||||
icao="OMSJ",
|
icao="OMSJ",
|
||||||
elevation=98,
|
elevation=98,
|
||||||
runway_length=10535,
|
runway_length=10535,
|
||||||
atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 600), MHz(250, 200)),
|
atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 600), MHz(252, 200)),
|
||||||
ils={
|
ils={
|
||||||
"30": ("ISHW", MHz(111, 950)),
|
"30": ("ISHW", MHz(111, 950)),
|
||||||
"12": ("ISRE", MHz(108, 550)),
|
"12": ("ISRE", MHz(108, 550)),
|
||||||
@@ -492,18 +492,18 @@ AIRFIELD_DATA = {
|
|||||||
elevation=60,
|
elevation=60,
|
||||||
runway_length=9437,
|
runway_length=9437,
|
||||||
vor=("FJV", MHz(113, 800)),
|
vor=("FJV", MHz(113, 800)),
|
||||||
atc=AtcData(MHz(4, 375), MHz(39, 650), MHz(124, 600), MHz(251, 250)),
|
atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(124, 600), MHz(251, 150)),
|
||||||
ils={
|
ils={
|
||||||
"29": ("IFJR", MHz(111, 500)),
|
"29": ("IFJR", MHz(111, 500)),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
"Ras Al Khaimah Intl": AirfieldData(
|
"Ras AL Khaimah": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OMRK",
|
icao="OMRK",
|
||||||
elevation=70,
|
elevation=70,
|
||||||
runway_length=8406,
|
runway_length=8406,
|
||||||
vor=("OMRK", MHz(113, 600)),
|
vor=("OMRK", MHz(113, 600)),
|
||||||
atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(121, 600), MHz(250, 900)),
|
atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(121, 600), MHz(250, 800)),
|
||||||
),
|
),
|
||||||
"Khasab": AirfieldData(
|
"Khasab": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
@@ -516,11 +516,7 @@ AIRFIELD_DATA = {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
"Sir Abu Nuayr": AirfieldData(
|
"Sir Abu Nuayr": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf", icao="OMSN", elevation=25, runway_length=2229
|
||||||
icao="OMSN",
|
|
||||||
elevation=25,
|
|
||||||
runway_length=2229,
|
|
||||||
atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(118, 0), MHz(250, 800)),
|
|
||||||
),
|
),
|
||||||
"Sirri Island": AirfieldData(
|
"Sirri Island": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
@@ -530,7 +526,7 @@ AIRFIELD_DATA = {
|
|||||||
vor=("SIR", MHz(113, 750)),
|
vor=("SIR", MHz(113, 750)),
|
||||||
atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(135, 50), MHz(250, 250)),
|
atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(135, 50), MHz(250, 250)),
|
||||||
),
|
),
|
||||||
"Abu Musa Island": AirfieldData(
|
"Abu Musa Island Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIBA",
|
icao="OIBA",
|
||||||
elevation=16,
|
elevation=16,
|
||||||
@@ -559,13 +555,13 @@ AIRFIELD_DATA = {
|
|||||||
vor=("KHM", MHz(117, 100)),
|
vor=("KHM", MHz(117, 100)),
|
||||||
atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(118, 50), MHz(250, 150)),
|
atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(118, 50), MHz(250, 150)),
|
||||||
),
|
),
|
||||||
"Bandar-e-Jask": AirfieldData(
|
"Bandar-e-Jask airfield": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIZJ",
|
icao="OIZJ",
|
||||||
elevation=26,
|
elevation=26,
|
||||||
runway_length=6842,
|
runway_length=6842,
|
||||||
vor=("KHM", MHz(116, 300)),
|
vor=("KHM", MHz(116, 300)),
|
||||||
atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(118, 150), MHz(250, 500)),
|
atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(118, 50), MHz(250, 150)),
|
||||||
),
|
),
|
||||||
"Bandar Lengeh": AirfieldData(
|
"Bandar Lengeh": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
@@ -573,26 +569,26 @@ AIRFIELD_DATA = {
|
|||||||
elevation=80,
|
elevation=80,
|
||||||
runway_length=7625,
|
runway_length=7625,
|
||||||
vor=("LEN", MHz(114, 800)),
|
vor=("LEN", MHz(114, 800)),
|
||||||
atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(121, 700), MHz(251, 50)),
|
atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 700), MHz(250, 950)),
|
||||||
),
|
),
|
||||||
"Kish Intl": AirfieldData(
|
"Kish International Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIBK",
|
icao="OIBK",
|
||||||
elevation=114,
|
elevation=114,
|
||||||
runway_length=10617,
|
runway_length=10617,
|
||||||
tacan=TacanChannel(112, TacanBand.X),
|
tacan=TacanChannel(112, TacanBand.X),
|
||||||
tacan_callsign="KIH",
|
tacan_callsign="KIH",
|
||||||
atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(121, 650), MHz(250, 650)),
|
atc=AtcData(MHz(4, 50), MHz(39, 000), MHz(121, 650), MHz(250, 600)),
|
||||||
),
|
),
|
||||||
"Lavan Island": AirfieldData(
|
"Lavan Island Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIBV",
|
icao="OIBV",
|
||||||
elevation=75,
|
elevation=75,
|
||||||
runway_length=8234,
|
runway_length=8234,
|
||||||
vor=("LVA", MHz(116, 850)),
|
vor=("LVA", MHz(116, 850)),
|
||||||
atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(128, 550), MHz(250, 750)),
|
atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(128, 550), MHz(250, 700)),
|
||||||
),
|
),
|
||||||
"Lar": AirfieldData(
|
"Lar Airbase": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OISL",
|
icao="OISL",
|
||||||
elevation=2635,
|
elevation=2635,
|
||||||
@@ -607,7 +603,7 @@ AIRFIELD_DATA = {
|
|||||||
runway_length=7300,
|
runway_length=7300,
|
||||||
tacan=TacanChannel(47, TacanBand.X),
|
tacan=TacanChannel(47, TacanBand.X),
|
||||||
tacan_callsign="HDR",
|
tacan_callsign="HDR",
|
||||||
atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(123, 150), MHz(251, 300)),
|
atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(123, 150), MHz(251, 200)),
|
||||||
ils={
|
ils={
|
||||||
"8": ("IBHD", MHz(108, 900)),
|
"8": ("IBHD", MHz(108, 900)),
|
||||||
},
|
},
|
||||||
@@ -620,19 +616,19 @@ AIRFIELD_DATA = {
|
|||||||
tacan=TacanChannel(78, TacanBand.X),
|
tacan=TacanChannel(78, TacanBand.X),
|
||||||
tacan_callsign="BND",
|
tacan_callsign="BND",
|
||||||
vor=("BND", MHz(117, 200)),
|
vor=("BND", MHz(117, 200)),
|
||||||
atc=AtcData(MHz(4, 250), MHz(39, 401), MHz(118, 100), MHz(251, 0)),
|
atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(118, 100), MHz(250, 900)),
|
||||||
ils={
|
ils={
|
||||||
"21": ("IBND", MHz(333, 800)),
|
"21": ("IBND", MHz(333, 800)),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
"Jiroft": AirfieldData(
|
"Jiroft Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIKJ",
|
icao="OIKJ",
|
||||||
elevation=2664,
|
elevation=2664,
|
||||||
runway_length=9160,
|
runway_length=9160,
|
||||||
atc=AtcData(MHz(4, 125), MHz(39, 120), MHz(136, 0), MHz(250, 750)),
|
atc=AtcData(MHz(4, 125), MHz(39, 120), MHz(136, 0), MHz(250, 750)),
|
||||||
),
|
),
|
||||||
"Kerman": AirfieldData(
|
"Kerman Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OIKK",
|
icao="OIKK",
|
||||||
elevation=5746,
|
elevation=5746,
|
||||||
@@ -640,9 +636,9 @@ AIRFIELD_DATA = {
|
|||||||
tacan=TacanChannel(97, TacanBand.X),
|
tacan=TacanChannel(97, TacanBand.X),
|
||||||
tacan_callsign="KER",
|
tacan_callsign="KER",
|
||||||
vor=("KER", MHz(112, 0)),
|
vor=("KER", MHz(112, 0)),
|
||||||
atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 250), MHz(250, 300)),
|
atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(118, 250), MHz(250, 300)),
|
||||||
),
|
),
|
||||||
"Shiraz Intl": AirfieldData(
|
"Shiraz International Airport": AirfieldData(
|
||||||
theater="Persian Gulf",
|
theater="Persian Gulf",
|
||||||
icao="OISS",
|
icao="OISS",
|
||||||
elevation=4878,
|
elevation=4878,
|
||||||
@@ -650,7 +646,7 @@ AIRFIELD_DATA = {
|
|||||||
tacan=TacanChannel(94, TacanBand.X),
|
tacan=TacanChannel(94, TacanBand.X),
|
||||||
tacan_callsign="SYZ1",
|
tacan_callsign="SYZ1",
|
||||||
vor=("SYZ", MHz(112, 0)),
|
vor=("SYZ", MHz(112, 0)),
|
||||||
atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(121, 900), MHz(250, 350)),
|
atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(121, 900), MHz(250, 350)),
|
||||||
),
|
),
|
||||||
# Syria Map
|
# Syria Map
|
||||||
"Adana Sakirpasa": AirfieldData(
|
"Adana Sakirpasa": AirfieldData(
|
||||||
@@ -659,7 +655,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=55,
|
elevation=55,
|
||||||
runway_length=8115,
|
runway_length=8115,
|
||||||
vor=("ADA", MHz(112, 700)),
|
vor=("ADA", MHz(112, 700)),
|
||||||
atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(121, 100), MHz(251, 0)),
|
atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 100), MHz(250, 900)),
|
||||||
ils={
|
ils={
|
||||||
"05": ("IADA", MHz(108, 700)),
|
"05": ("IADA", MHz(108, 700)),
|
||||||
},
|
},
|
||||||
@@ -672,7 +668,7 @@ AIRFIELD_DATA = {
|
|||||||
tacan=TacanChannel(21, TacanBand.X),
|
tacan=TacanChannel(21, TacanBand.X),
|
||||||
tacan_callsign="DAN",
|
tacan_callsign="DAN",
|
||||||
vor=("DAN", MHz(108, 400)),
|
vor=("DAN", MHz(108, 400)),
|
||||||
atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 100), MHz(360, 100)),
|
atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(129, 400), MHz(360, 100)),
|
||||||
ils={
|
ils={
|
||||||
"50": ("IDAN", MHz(109, 300)),
|
"50": ("IDAN", MHz(109, 300)),
|
||||||
"23": ("DANM", MHz(111, 700)),
|
"23": ("DANM", MHz(111, 700)),
|
||||||
@@ -683,7 +679,7 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS71",
|
icao="OS71",
|
||||||
elevation=1614,
|
elevation=1614,
|
||||||
runway_length=4648,
|
runway_length=4648,
|
||||||
atc=AtcData(MHz(4, 175), MHz(39, 250), MHz(120, 600), MHz(250, 800)),
|
atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(120, 600), MHz(250, 700)),
|
||||||
),
|
),
|
||||||
"Hatay": AirfieldData(
|
"Hatay": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -691,7 +687,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=253,
|
elevation=253,
|
||||||
runway_length=9052,
|
runway_length=9052,
|
||||||
vor=("HTY", MHz(112, 500)),
|
vor=("HTY", MHz(112, 500)),
|
||||||
atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(128, 500), MHz(250, 250)),
|
atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(128, 500), MHz(250, 150)),
|
||||||
ils={
|
ils={
|
||||||
"22": ("IHTY", MHz(108, 150)),
|
"22": ("IHTY", MHz(108, 150)),
|
||||||
"04": ("IHAT", MHz(108, 900)),
|
"04": ("IHAT", MHz(108, 900)),
|
||||||
@@ -702,21 +698,25 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS66",
|
icao="OS66",
|
||||||
elevation=1200,
|
elevation=1200,
|
||||||
runway_length=6662,
|
runway_length=6662,
|
||||||
atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(120, 500), MHz(251, 100)),
|
atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(120, 500), MHz(251)),
|
||||||
),
|
),
|
||||||
"Aleppo": AirfieldData(
|
"Aleppo": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OSAP",
|
icao="OSAP",
|
||||||
elevation=1253,
|
elevation=1253,
|
||||||
runway_length=8332,
|
runway_length=8332,
|
||||||
atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(119, 100), MHz(250, 850)),
|
atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(119, 100), MHz(250, 750)),
|
||||||
|
ils={
|
||||||
|
"50": ("IDAN", MHz(109, 300)),
|
||||||
|
"23": ("DANM", MHz(111, 700)),
|
||||||
|
},
|
||||||
),
|
),
|
||||||
"Jirah": AirfieldData(
|
"Jirah": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS62",
|
icao="OS62",
|
||||||
elevation=1170,
|
elevation=1170,
|
||||||
runway_length=9090,
|
runway_length=9090,
|
||||||
atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 100), MHz(250, 300)),
|
atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(118, 100), MHz(250, 200)),
|
||||||
),
|
),
|
||||||
"Taftanaz": AirfieldData(
|
"Taftanaz": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -729,14 +729,14 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS59",
|
icao="OS59",
|
||||||
elevation=1083,
|
elevation=1083,
|
||||||
runway_length=9036,
|
runway_length=9036,
|
||||||
atc=AtcData(MHz(4, 500), MHz(39, 900), MHz(122, 800), MHz(251, 450)),
|
atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(118, 500), MHz(251, 150)),
|
||||||
),
|
),
|
||||||
"Abu al-Dahur": AirfieldData(
|
"Abu al-Dahur": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS57",
|
icao="OS57",
|
||||||
elevation=820,
|
elevation=820,
|
||||||
runway_length=8728,
|
runway_length=8728,
|
||||||
atc=AtcData(MHz(4, 0), MHz(38, 900), MHz(122, 200), MHz(250, 450)),
|
atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(122, 200), MHz(250, 350)),
|
||||||
),
|
),
|
||||||
"Bassel Al-Assad": AirfieldData(
|
"Bassel Al-Assad": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -744,7 +744,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=93,
|
elevation=93,
|
||||||
runway_length=7305,
|
runway_length=7305,
|
||||||
vor=("LTK", MHz(114, 800)),
|
vor=("LTK", MHz(114, 800)),
|
||||||
atc=AtcData(MHz(4, 50), MHz(39, 0), MHz(118, 100), MHz(250, 550)),
|
atc=AtcData(MHz(4), MHz(38, 900), MHz(118, 100), MHz(250, 450)),
|
||||||
ils={
|
ils={
|
||||||
"17": ("IBA", MHz(109, 100)),
|
"17": ("IBA", MHz(109, 100)),
|
||||||
},
|
},
|
||||||
@@ -754,28 +754,28 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS58",
|
icao="OS58",
|
||||||
elevation=983,
|
elevation=983,
|
||||||
runway_length=7957,
|
runway_length=7957,
|
||||||
atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 50), MHz(250, 200)),
|
atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(118, 50), MHz(250, 100)),
|
||||||
),
|
),
|
||||||
"Rene Mouawad": AirfieldData(
|
"Rene Mouawad": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OLKA",
|
icao="OLKA",
|
||||||
elevation=14,
|
elevation=14,
|
||||||
runway_length=8614,
|
runway_length=8614,
|
||||||
atc=AtcData(MHz(4, 375), MHz(39, 650), MHz(121, 0), MHz(251, 200)),
|
atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(129, 500), MHz(251, 100)),
|
||||||
),
|
),
|
||||||
"Al Quasayr": AirfieldData(
|
"Al Quasayr": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS70",
|
icao="OS70",
|
||||||
elevation=1729,
|
elevation=1729,
|
||||||
runway_length=8585,
|
runway_length=8585,
|
||||||
atc=AtcData(MHz(4, 550), MHz(40, 0), MHz(119, 200), MHz(251, 550)),
|
atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(119, 200), MHz(251, 250)),
|
||||||
),
|
),
|
||||||
"Palmyra": AirfieldData(
|
"Palmyra": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OSPR",
|
icao="OSPR",
|
||||||
elevation=1267,
|
elevation=1267,
|
||||||
runway_length=8704,
|
runway_length=8704,
|
||||||
atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 900), MHz(250, 900)),
|
atc=AtcData(MHz(4, 175), MHz(39, 250), MHz(121, 900), MHz(250, 800)),
|
||||||
),
|
),
|
||||||
"Wujah Al Hajar": AirfieldData(
|
"Wujah Al Hajar": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -783,14 +783,14 @@ AIRFIELD_DATA = {
|
|||||||
elevation=619,
|
elevation=619,
|
||||||
runway_length=4717,
|
runway_length=4717,
|
||||||
vor=("CAK", MHz(116, 200)),
|
vor=("CAK", MHz(116, 200)),
|
||||||
atc=AtcData(MHz(4, 575), MHz(40, 50), MHz(121, 500), MHz(251, 600)),
|
atc=AtcData(MHz(4, 425), MHz(39, 750), MHz(121, 500), MHz(251, 300)),
|
||||||
),
|
),
|
||||||
"An Nasiriyah": AirfieldData(
|
"An Nasiriyah": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS64",
|
icao="OS64",
|
||||||
elevation=2746,
|
elevation=2746,
|
||||||
runway_length=8172,
|
runway_length=8172,
|
||||||
atc=AtcData(MHz(4, 600), MHz(40, 100), MHz(122, 300), MHz(251, 650)),
|
atc=AtcData(MHz(4, 450), MHz(39, 800), MHz(122, 300), MHz(251, 350)),
|
||||||
),
|
),
|
||||||
"Rayak": AirfieldData(
|
"Rayak": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -798,7 +798,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=2934,
|
elevation=2934,
|
||||||
runway_length=8699,
|
runway_length=8699,
|
||||||
vor=("HTY", MHz(124, 400)),
|
vor=("HTY", MHz(124, 400)),
|
||||||
atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(124, 400), MHz(251, 150)),
|
atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(124, 400), MHz(251, 50)),
|
||||||
),
|
),
|
||||||
"Beirut-Rafic Hariri": AirfieldData(
|
"Beirut-Rafic Hariri": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -806,7 +806,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=39,
|
elevation=39,
|
||||||
runway_length=9463,
|
runway_length=9463,
|
||||||
vor=("KAD", MHz(112, 600)),
|
vor=("KAD", MHz(112, 600)),
|
||||||
atc=AtcData(MHz(4, 675), MHz(40, 250), MHz(118, 900), MHz(251, 800)),
|
atc=AtcData(MHz(4, 475), MHz(39, 850), MHz(118, 900), MHz(251, 400)),
|
||||||
ils={
|
ils={
|
||||||
"17": ("BIL", MHz(109, 500)),
|
"17": ("BIL", MHz(109, 500)),
|
||||||
},
|
},
|
||||||
@@ -816,32 +816,32 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS61",
|
icao="OS61",
|
||||||
elevation=2066,
|
elevation=2066,
|
||||||
runway_length=8902,
|
runway_length=8902,
|
||||||
atc=AtcData(MHz(4, 750), MHz(40, 400), MHz(120, 300), MHz(251, 950)),
|
atc=AtcData(MHz(4, 550), MHz(40), MHz(120, 300), MHz(251, 550)),
|
||||||
),
|
),
|
||||||
"Marj as Sultan North": AirfieldData(
|
"Marj as Sultan North": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
elevation=2007,
|
elevation=2007,
|
||||||
runway_length=268,
|
runway_length=268,
|
||||||
atc=AtcData(MHz(4, 75), MHz(38, 50), MHz(122, 700), MHz(250, 600)),
|
atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(122, 700), MHz(250, 500)),
|
||||||
),
|
),
|
||||||
"Marj as Sultan South": AirfieldData(
|
"Marj as Sultan South": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
elevation=2007,
|
elevation=2007,
|
||||||
runway_length=166,
|
runway_length=166,
|
||||||
atc=AtcData(MHz(4, 725), MHz(40, 350), MHz(122, 900), MHz(251, 900)),
|
atc=AtcData(MHz(4, 525), MHz(39, 950), MHz(122, 900), MHz(251, 500)),
|
||||||
),
|
),
|
||||||
"Mezzeh": AirfieldData(
|
"Mezzeh": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS67",
|
icao="OS67",
|
||||||
elevation=2355,
|
elevation=2355,
|
||||||
runway_length=7522,
|
runway_length=7522,
|
||||||
atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(120, 700), MHz(250, 750)),
|
atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(120, 700), MHz(250, 650)),
|
||||||
),
|
),
|
||||||
"Qabr as Sitt": AirfieldData(
|
"Qabr as Sitt": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
elevation=2134,
|
elevation=2134,
|
||||||
runway_length=489,
|
runway_length=489,
|
||||||
atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(122, 600), MHz(250, 950)),
|
atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(122, 600), MHz(250, 850)),
|
||||||
),
|
),
|
||||||
"Damascus": AirfieldData(
|
"Damascus": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -849,7 +849,7 @@ AIRFIELD_DATA = {
|
|||||||
elevation=2007,
|
elevation=2007,
|
||||||
runway_length=11423,
|
runway_length=11423,
|
||||||
vor=("DAM", MHz(116)),
|
vor=("DAM", MHz(116)),
|
||||||
atc=AtcData(MHz(4, 700), MHz(40, 300), MHz(118, 500), MHz(251, 850)),
|
atc=AtcData(MHz(4, 500), MHz(39, 900), MHz(118, 500), MHz(251, 450)),
|
||||||
ils={
|
ils={
|
||||||
"24": ("IDA", MHz(109, 900)),
|
"24": ("IDA", MHz(109, 900)),
|
||||||
},
|
},
|
||||||
@@ -859,42 +859,42 @@ AIRFIELD_DATA = {
|
|||||||
icao="OS63",
|
icao="OS63",
|
||||||
elevation=2160,
|
elevation=2160,
|
||||||
runway_length=7576,
|
runway_length=7576,
|
||||||
atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(120, 800), MHz(250, 6550)),
|
atc=AtcData(MHz(4, 50), MHz(39), MHz(120, 800), MHz(250, 550)),
|
||||||
),
|
),
|
||||||
"Kiryat Shmona": AirfieldData(
|
"Kiryat Shmona": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="LLKS",
|
icao="LLKS",
|
||||||
elevation=328,
|
elevation=328,
|
||||||
runway_length=3258,
|
runway_length=3258,
|
||||||
atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(118, 400), MHz(250, 500)),
|
atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(118, 400), MHz(250, 400)),
|
||||||
),
|
),
|
||||||
"Khalkhalah": AirfieldData(
|
"Khalkhalah": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="OS69",
|
icao="OS69",
|
||||||
elevation=2337,
|
elevation=2337,
|
||||||
runway_length=8248,
|
runway_length=8248,
|
||||||
atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(122, 500), MHz(250, 350)),
|
atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 500), MHz(250, 250)),
|
||||||
),
|
),
|
||||||
"Haifa": AirfieldData(
|
"Haifa": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="LLHA",
|
icao="LLHA",
|
||||||
elevation=19,
|
elevation=19,
|
||||||
runway_length=3253,
|
runway_length=3253,
|
||||||
atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(127, 800), MHz(250, 150)),
|
atc=AtcData(MHz(3, 775), MHz(38, 450), MHz(127, 800), MHz(250, 50)),
|
||||||
),
|
),
|
||||||
"Ramat David": AirfieldData(
|
"Ramat David": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="LLRD",
|
icao="LLRD",
|
||||||
elevation=105,
|
elevation=105,
|
||||||
runway_length=7037,
|
runway_length=7037,
|
||||||
atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(118, 600), MHz(251, 50)),
|
atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(118, 600), MHz(250, 950)),
|
||||||
),
|
),
|
||||||
"Megiddo": AirfieldData(
|
"Megiddo": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
icao="LLMG",
|
icao="LLMG",
|
||||||
elevation=180,
|
elevation=180,
|
||||||
runway_length=6098,
|
runway_length=6098,
|
||||||
atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(119, 900), MHz(250, 700)),
|
atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 900), MHz(250, 600)),
|
||||||
),
|
),
|
||||||
"Eyn Shemer": AirfieldData(
|
"Eyn Shemer": AirfieldData(
|
||||||
theater="Syria",
|
theater="Syria",
|
||||||
@@ -908,66 +908,7 @@ AIRFIELD_DATA = {
|
|||||||
icao="OJMF",
|
icao="OJMF",
|
||||||
elevation=2204,
|
elevation=2204,
|
||||||
runway_length=8595,
|
runway_length=8595,
|
||||||
atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(118, 300), MHz(250, 400)),
|
atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 300), MHz(250, 300)),
|
||||||
),
|
|
||||||
"Tha'lah": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="OS60",
|
|
||||||
elevation=2381,
|
|
||||||
runway_length=8025,
|
|
||||||
atc=AtcData(MHz(4, 650), MHz(40, 200), MHz(122, 400), MHz(251, 750)),
|
|
||||||
),
|
|
||||||
"Shayrat": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="OS60",
|
|
||||||
elevation=2637,
|
|
||||||
runway_length=8553,
|
|
||||||
atc=AtcData(MHz(4, 450), MHz(39, 800), MHz(122, 200), MHz(251, 350)),
|
|
||||||
),
|
|
||||||
"Tiyas": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="OS72",
|
|
||||||
elevation=1797,
|
|
||||||
runway_length=9420,
|
|
||||||
atc=AtcData(MHz(4, 525), MHz(39, 950), MHz(120, 500), MHz(251, 500)),
|
|
||||||
),
|
|
||||||
"Rosh Pina": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="LLIB",
|
|
||||||
elevation=865,
|
|
||||||
runway_length=2711,
|
|
||||||
atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(118, 450), MHz(251, 250)),
|
|
||||||
),
|
|
||||||
"Sayqal": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="OS68",
|
|
||||||
elevation=2273,
|
|
||||||
runway_length=8536,
|
|
||||||
atc=AtcData(MHz(4, 425), MHz(39, 750), MHz(120, 400), MHz(251, 300)),
|
|
||||||
),
|
|
||||||
"H4": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="OJHR",
|
|
||||||
elevation=2257,
|
|
||||||
runway_length=7179,
|
|
||||||
atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(120, 400), MHz(250, 100)),
|
|
||||||
),
|
|
||||||
"Naqoura": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="",
|
|
||||||
elevation=378,
|
|
||||||
runway_length=0,
|
|
||||||
atc=AtcData(MHz(4, 625), MHz(40, 150), MHz(122, 000), MHz(251, 700)),
|
|
||||||
),
|
|
||||||
"Gaziantep": AirfieldData(
|
|
||||||
theater="Syria",
|
|
||||||
icao="LTAJ",
|
|
||||||
elevation=2287,
|
|
||||||
runway_length=8871,
|
|
||||||
atc=AtcData(MHz(3, 775), MHz(38, 450), MHz(120, 100), MHz(250, 50)),
|
|
||||||
ils={
|
|
||||||
"28": ("IGNP", MHz(109, 10)),
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
# NTTR
|
# NTTR
|
||||||
"Mina Airport 3Q0": AirfieldData(
|
"Mina Airport 3Q0": AirfieldData(
|
||||||
@@ -1363,73 +1304,55 @@ AIRFIELD_DATA = {
|
|||||||
"Detling": AirfieldData(
|
"Detling": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=623,
|
elevation=623,
|
||||||
runway_length=3482,
|
runway_length=2557,
|
||||||
atc=AtcData(MHz(4, 50), MHz(118, 600), MHz(39, 0), MHz(250, 600)),
|
atc=AtcData(MHz(3, 950), MHz(118, 400), MHz(38, 800), MHz(250, 400)),
|
||||||
),
|
),
|
||||||
"High Halden": AirfieldData(
|
"High Halden": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=104,
|
elevation=104,
|
||||||
runway_length=3296,
|
runway_length=3296,
|
||||||
atc=AtcData(MHz(3, 800), MHz(118, 100), MHz(38, 500), MHz(250, 100)),
|
atc=AtcData(MHz(3, 750), MHz(118, 800), MHz(38, 400), MHz(250, 0)),
|
||||||
),
|
),
|
||||||
"Lympne": AirfieldData(
|
"Lympne": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=351,
|
elevation=351,
|
||||||
runway_length=3054,
|
runway_length=2548,
|
||||||
atc=AtcData(MHz(4, 25), MHz(118, 550), MHz(38, 950), MHz(250, 550)),
|
atc=AtcData(MHz(3, 925), MHz(118, 350), MHz(38, 750), MHz(250, 350)),
|
||||||
),
|
),
|
||||||
"Hawkinge": AirfieldData(
|
"Hawkinge": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=524,
|
elevation=524,
|
||||||
runway_length=3013,
|
runway_length=3013,
|
||||||
atc=AtcData(MHz(4, 0), MHz(118, 500), MHz(38, 900), MHz(250, 500)),
|
atc=AtcData(MHz(3, 900), MHz(118, 300), MHz(38, 700), MHz(250, 300)),
|
||||||
),
|
),
|
||||||
"Manston": AirfieldData(
|
"Manston": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=160,
|
elevation=160,
|
||||||
runway_length=8626,
|
runway_length=8626,
|
||||||
atc=AtcData(MHz(3, 975), MHz(118, 250), MHz(38, 650), MHz(250, 250)),
|
atc=AtcData(MHz(3, 875), MHz(118, 250), MHz(38, 650), MHz(250, 250)),
|
||||||
),
|
),
|
||||||
"Dunkirk Mardyck": AirfieldData(
|
"Dunkirk Mardyck": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=16,
|
elevation=16,
|
||||||
runway_length=1737,
|
runway_length=1737,
|
||||||
atc=AtcData(MHz(3, 950), MHz(118, 450), MHz(38, 850), MHz(250, 450)),
|
atc=AtcData(MHz(3, 850), MHz(118, 200), MHz(38, 600), MHz(250, 200)),
|
||||||
),
|
),
|
||||||
"Saint Omer Longuenesse": AirfieldData(
|
"Saint Omer Longuenesse": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=219,
|
elevation=219,
|
||||||
runway_length=1929,
|
runway_length=1929,
|
||||||
atc=AtcData(MHz(3, 925), MHz(118, 350), MHz(38, 750), MHz(250, 350)),
|
atc=AtcData(MHz(3, 825), MHz(118, 150), MHz(38, 550), MHz(250, 150)),
|
||||||
),
|
),
|
||||||
"Merville Calonne": AirfieldData(
|
"Merville Calonne": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=52,
|
elevation=52,
|
||||||
runway_length=7580,
|
runway_length=7580,
|
||||||
atc=AtcData(MHz(3, 900), MHz(118, 300), MHz(38, 700), MHz(250, 300)),
|
atc=AtcData(MHz(3, 800), MHz(118, 100), MHz(38, 500), MHz(250, 100)),
|
||||||
),
|
),
|
||||||
"Abbeville Drucat": AirfieldData(
|
"Abbeville Drucat": AirfieldData(
|
||||||
theater="Channel",
|
theater="Channel",
|
||||||
elevation=183,
|
elevation=183,
|
||||||
runway_length=4726,
|
runway_length=4726,
|
||||||
atc=AtcData(MHz(3, 875), MHz(118, 250), MHz(38, 650), MHz(250, 250)),
|
|
||||||
),
|
|
||||||
"Eastchurch": AirfieldData(
|
|
||||||
theater="Channel",
|
|
||||||
elevation=30,
|
|
||||||
runway_length=2983,
|
|
||||||
atc=AtcData(MHz(3, 775), MHz(118, 50), MHz(38, 450), MHz(250, 50)),
|
atc=AtcData(MHz(3, 775), MHz(118, 50), MHz(38, 450), MHz(250, 50)),
|
||||||
),
|
),
|
||||||
"Headcorn": AirfieldData(
|
|
||||||
theater="Channel",
|
|
||||||
elevation=114,
|
|
||||||
runway_length=3680,
|
|
||||||
atc=AtcData(MHz(3, 825), MHz(118, 150), MHz(38, 550), MHz(250, 150)),
|
|
||||||
),
|
|
||||||
"Biggin Hill": AirfieldData(
|
|
||||||
theater="Channel",
|
|
||||||
elevation=552,
|
|
||||||
runway_length=3953,
|
|
||||||
atc=AtcData(MHz(3, 850), MHz(118, 200), MHz(38, 600), MHz(250, 200)),
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from datetime import timedelta
|
from typing import List, Type, Tuple
|
||||||
from typing import List, Type, Tuple, Optional
|
|
||||||
|
|
||||||
from dcs.mission import Mission, StartType
|
from dcs.mission import Mission, StartType
|
||||||
from dcs.planes import IL_78M, KC130, KC135MPRS, KC_135
|
from dcs.planes import IL_78M, KC130, KC135MPRS, KC_135
|
||||||
@@ -22,7 +21,6 @@ from .conflictgen import Conflict
|
|||||||
from .radios import RadioFrequency, RadioRegistry
|
from .radios import RadioFrequency, RadioRegistry
|
||||||
from .tacan import TacanBand, TacanChannel, TacanRegistry
|
from .tacan import TacanBand, TacanChannel, TacanRegistry
|
||||||
|
|
||||||
|
|
||||||
TANKER_DISTANCE = 15000
|
TANKER_DISTANCE = 15000
|
||||||
TANKER_ALT = 4572
|
TANKER_ALT = 4572
|
||||||
TANKER_HEADING_OFFSET = 45
|
TANKER_HEADING_OFFSET = 45
|
||||||
@@ -38,9 +36,6 @@ class AwacsInfo:
|
|||||||
dcsGroupName: str
|
dcsGroupName: str
|
||||||
callsign: str
|
callsign: str
|
||||||
freq: RadioFrequency
|
freq: RadioFrequency
|
||||||
depature_location: Optional[str]
|
|
||||||
start_time: Optional[timedelta]
|
|
||||||
end_time: Optional[timedelta]
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -168,7 +163,6 @@ class AirSupportConflictGenerator:
|
|||||||
TankerInfo(str(tanker_group.name), callsign, variant, freq, tacan)
|
TankerInfo(str(tanker_group.name), callsign, variant, freq, tacan)
|
||||||
)
|
)
|
||||||
|
|
||||||
if not self.game.settings.disable_legacy_aewc:
|
|
||||||
possible_awacs = db.find_unittype(AWACS, self.conflict.attackers_side)
|
possible_awacs = db.find_unittype(AWACS, self.conflict.attackers_side)
|
||||||
|
|
||||||
if len(possible_awacs) > 0:
|
if len(possible_awacs) > 0:
|
||||||
@@ -196,12 +190,9 @@ class AirSupportConflictGenerator:
|
|||||||
|
|
||||||
self.air_support.awacs.append(
|
self.air_support.awacs.append(
|
||||||
AwacsInfo(
|
AwacsInfo(
|
||||||
dcsGroupName=str(awacs_flight.name),
|
str(awacs_flight.name),
|
||||||
callsign=callsign_for_support_unit(awacs_flight),
|
callsign_for_support_unit(awacs_flight),
|
||||||
freq=freq,
|
freq,
|
||||||
depature_location=None,
|
|
||||||
start_time=None,
|
|
||||||
end_time=None,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -175,7 +175,6 @@ class Package:
|
|||||||
FlightType.SEAD,
|
FlightType.SEAD,
|
||||||
FlightType.TARCAP,
|
FlightType.TARCAP,
|
||||||
FlightType.BARCAP,
|
FlightType.BARCAP,
|
||||||
FlightType.AEWC,
|
|
||||||
FlightType.SWEEP,
|
FlightType.SWEEP,
|
||||||
FlightType.ESCORT,
|
FlightType.ESCORT,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from .ground_forces.combat_stance import CombatStance
|
|||||||
from .radios import RadioFrequency
|
from .radios import RadioFrequency
|
||||||
from .runways import RunwayData
|
from .runways import RunwayData
|
||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import logging
|
|
||||||
import random
|
|
||||||
from game import db
|
|
||||||
from gen.coastal.silkworm import SilkwormGenerator
|
|
||||||
|
|
||||||
COASTAL_MAP = {
|
|
||||||
"SilkwormGenerator": SilkwormGenerator,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def generate_coastal_group(game, ground_object, faction_name: str):
|
|
||||||
"""
|
|
||||||
This generate a coastal defenses group
|
|
||||||
:return: Nothing, but put the group reference inside the ground object
|
|
||||||
"""
|
|
||||||
faction = db.FACTIONS[faction_name]
|
|
||||||
if len(faction.coastal_defenses) > 0:
|
|
||||||
generators = faction.coastal_defenses
|
|
||||||
if len(generators) > 0:
|
|
||||||
gen = random.choice(generators)
|
|
||||||
if gen in COASTAL_MAP.keys():
|
|
||||||
generator = COASTAL_MAP[gen](game, ground_object, faction)
|
|
||||||
generator.generate()
|
|
||||||
return generator.get_generated_group()
|
|
||||||
else:
|
|
||||||
logging.info(
|
|
||||||
"Unable to generate missile group, generator : "
|
|
||||||
+ str(gen)
|
|
||||||
+ "does not exists"
|
|
||||||
)
|
|
||||||
return None
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
from dcs.vehicles import MissilesSS, Unarmed, AirDefence
|
|
||||||
|
|
||||||
from gen.sam.group_generator import GroupGenerator
|
|
||||||
|
|
||||||
|
|
||||||
class SilkwormGenerator(GroupGenerator):
|
|
||||||
def __init__(self, game, ground_object, faction):
|
|
||||||
super(SilkwormGenerator, self).__init__(game, ground_object)
|
|
||||||
self.faction = faction
|
|
||||||
|
|
||||||
def generate(self):
|
|
||||||
|
|
||||||
positions = self.get_circular_position(5, launcher_distance=120, coverage=180)
|
|
||||||
|
|
||||||
self.add_unit(
|
|
||||||
MissilesSS.AShM_Silkworm_SR,
|
|
||||||
"SR#0",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Launchers
|
|
||||||
for i, p in enumerate(positions):
|
|
||||||
self.add_unit(
|
|
||||||
MissilesSS.AShM_SS_N_2_Silkworm,
|
|
||||||
"Missile#" + str(i),
|
|
||||||
p[0],
|
|
||||||
p[1],
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Commander
|
|
||||||
self.add_unit(
|
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
|
||||||
"KAMAZ#0",
|
|
||||||
self.position.x - 35,
|
|
||||||
self.position.y - 20,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Shorad
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
|
||||||
"SHILKA#0",
|
|
||||||
self.position.x - 55,
|
|
||||||
self.position.y - 38,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Shorad 2
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
|
||||||
"STRELA#0",
|
|
||||||
self.position.x + 200,
|
|
||||||
self.position.y + 15,
|
|
||||||
90,
|
|
||||||
)
|
|
||||||
@@ -17,7 +17,6 @@ class EnvironmentGenerator:
|
|||||||
self.mission.weather.clouds_thickness = clouds.thickness
|
self.mission.weather.clouds_thickness = clouds.thickness
|
||||||
self.mission.weather.clouds_density = clouds.density
|
self.mission.weather.clouds_density = clouds.density
|
||||||
self.mission.weather.clouds_iprecptns = clouds.precipitation
|
self.mission.weather.clouds_iprecptns = clouds.precipitation
|
||||||
self.mission.weather.clouds_preset = clouds.preset
|
|
||||||
|
|
||||||
def set_fog(self, fog: Optional[Fog]) -> None:
|
def set_fog(self, fog: Optional[Fog]) -> None:
|
||||||
if fog is None:
|
if fog is None:
|
||||||
|
|||||||
@@ -2,87 +2,15 @@ import random
|
|||||||
|
|
||||||
from gen.sam.group_generator import ShipGroupGenerator
|
from gen.sam.group_generator import ShipGroupGenerator
|
||||||
|
|
||||||
from dcs.ships import DDG_Arleigh_Burke_IIa, CG_Ticonderoga
|
|
||||||
|
|
||||||
|
|
||||||
class CarrierGroupGenerator(ShipGroupGenerator):
|
class CarrierGroupGenerator(ShipGroupGenerator):
|
||||||
def generate(self):
|
def generate(self):
|
||||||
|
|
||||||
# Carrier Strike Group 8
|
# Add carrier
|
||||||
if self.faction.carrier_names[0] == "Carrier Strike Group 8":
|
|
||||||
carrier_type = random.choice(self.faction.aircraft_carrier)
|
|
||||||
|
|
||||||
self.add_unit(
|
|
||||||
carrier_type,
|
|
||||||
"CVN-75 Harry S. Truman",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add Arleigh Burke escort
|
|
||||||
self.add_unit(
|
|
||||||
DDG_Arleigh_Burke_IIa,
|
|
||||||
"USS Ramage",
|
|
||||||
self.position.x + 6482,
|
|
||||||
self.position.y + 6667,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.add_unit(
|
|
||||||
DDG_Arleigh_Burke_IIa,
|
|
||||||
"USS Mitscher",
|
|
||||||
self.position.x - 7963,
|
|
||||||
self.position.y + 7037,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.add_unit(
|
|
||||||
DDG_Arleigh_Burke_IIa,
|
|
||||||
"USS Forrest Sherman",
|
|
||||||
self.position.x - 7408,
|
|
||||||
self.position.y - 7408,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.add_unit(
|
|
||||||
DDG_Arleigh_Burke_IIa,
|
|
||||||
"USS Lassen",
|
|
||||||
self.position.x + 8704,
|
|
||||||
self.position.y - 6296,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add Ticonderoga escort
|
|
||||||
if self.heading >= 180:
|
|
||||||
self.add_unit(
|
|
||||||
CG_Ticonderoga,
|
|
||||||
"USS Hué City",
|
|
||||||
self.position.x + 2222,
|
|
||||||
self.position.y - 3333,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.add_unit(
|
|
||||||
CG_Ticonderoga,
|
|
||||||
"USS Hué City",
|
|
||||||
self.position.x - 3333,
|
|
||||||
self.position.y + 2222,
|
|
||||||
self.heading,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.get_generated_group().points[0].speed = 20
|
|
||||||
##################################################################################################
|
|
||||||
# Add carrier for normal generation
|
|
||||||
else:
|
|
||||||
if len(self.faction.aircraft_carrier) > 0:
|
if len(self.faction.aircraft_carrier) > 0:
|
||||||
carrier_type = random.choice(self.faction.aircraft_carrier)
|
carrier_type = random.choice(self.faction.aircraft_carrier)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
carrier_type,
|
carrier_type, "Carrier", self.position.x, self.position.y, self.heading
|
||||||
"Carrier",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from game.theater.theatergroundobject import TheaterGroundObject
|
|||||||
|
|
||||||
from gen.sam.group_generator import ShipGroupGenerator
|
from gen.sam.group_generator import ShipGroupGenerator
|
||||||
from dcs.unittype import ShipType
|
from dcs.unittype import ShipType
|
||||||
from dcs.ships import FFG_Oliver_Hazzard_Perry, DDG_Arleigh_Burke_IIa
|
from dcs.ships import Oliver_Hazzard_Perry_class, USS_Arleigh_Burke_IIa
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game.game import Game
|
from game.game import Game
|
||||||
@@ -46,7 +46,7 @@ class OliverHazardPerryGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(OliverHazardPerryGroupGenerator, self).__init__(
|
super(OliverHazardPerryGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, FFG_Oliver_Hazzard_Perry
|
game, ground_object, faction, Oliver_Hazzard_Perry_class
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -55,5 +55,5 @@ class ArleighBurkeGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(ArleighBurkeGroupGenerator, self).__init__(
|
super(ArleighBurkeGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, DDG_Arleigh_Burke_IIa
|
game, ground_object, faction, USS_Arleigh_Burke_IIa
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import random
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from dcs.ships import (
|
from dcs.ships import (
|
||||||
Corvette_1124_4_Grisha,
|
FFL_1124_4_Grisha,
|
||||||
Corvette_1241_1_Molniya,
|
FSG_1241_1MP_Molniya,
|
||||||
Frigate_11540_Neustrashimy,
|
FFG_11540_Neustrashimy,
|
||||||
Frigate_1135M_Rezky,
|
FF_1135M_Rezky,
|
||||||
Cruiser_1164_Moskva,
|
CG_1164_Moskva,
|
||||||
SSK_877V_Kilo,
|
SSK_877,
|
||||||
SSK_641B_Tango,
|
SSK_641B,
|
||||||
)
|
)
|
||||||
|
|
||||||
from gen.fleet.dd_group import DDGroupGenerator
|
from gen.fleet.dd_group import DDGroupGenerator
|
||||||
@@ -37,9 +37,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator):
|
|||||||
include_frigate = True
|
include_frigate = True
|
||||||
|
|
||||||
if include_frigate:
|
if include_frigate:
|
||||||
frigate_type = random.choice(
|
frigate_type = random.choice([FFL_1124_4_Grisha, FSG_1241_1MP_Molniya])
|
||||||
[Corvette_1124_4_Grisha, Corvette_1241_1_Molniya]
|
|
||||||
)
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
frigate_type,
|
frigate_type,
|
||||||
"FF1",
|
"FF1",
|
||||||
@@ -56,7 +54,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if include_dd:
|
if include_dd:
|
||||||
dd_type = random.choice([Frigate_11540_Neustrashimy, Frigate_1135M_Rezky])
|
dd_type = random.choice([FFG_11540_Neustrashimy, FF_1135M_Rezky])
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
dd_type,
|
dd_type,
|
||||||
"DD1",
|
"DD1",
|
||||||
@@ -76,11 +74,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator):
|
|||||||
# Only include the Moskva for now, the Pyotry Velikiy is an unkillable monster.
|
# Only include the Moskva for now, the Pyotry Velikiy is an unkillable monster.
|
||||||
# See https://github.com/Khopa/dcs_liberation/issues/567
|
# See https://github.com/Khopa/dcs_liberation/issues/567
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Cruiser_1164_Moskva,
|
CG_1164_Moskva, "CC1", self.position.x, self.position.y, self.heading
|
||||||
"CC1",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.get_generated_group().points[0].speed = 20
|
self.get_generated_group().points[0].speed = 20
|
||||||
@@ -91,7 +85,7 @@ class GrishaGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(GrishaGroupGenerator, self).__init__(
|
super(GrishaGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, Corvette_1124_4_Grisha
|
game, ground_object, faction, FFL_1124_4_Grisha
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -100,7 +94,7 @@ class MolniyaGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(MolniyaGroupGenerator, self).__init__(
|
super(MolniyaGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, Corvette_1241_1_Molniya
|
game, ground_object, faction, FSG_1241_1MP_Molniya
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -109,7 +103,7 @@ class KiloSubGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(KiloSubGroupGenerator, self).__init__(
|
super(KiloSubGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, SSK_877V_Kilo
|
game, ground_object, faction, SSK_877
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -118,5 +112,5 @@ class TangoSubGroupGenerator(DDGroupGenerator):
|
|||||||
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
self, game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
):
|
):
|
||||||
super(TangoSubGroupGenerator, self).__init__(
|
super(TangoSubGroupGenerator, self).__init__(
|
||||||
game, ground_object, faction, SSK_641B_Tango
|
game, ground_object, faction, SSK_641B
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from dcs.ships import Boat_Schnellboot_type_S130
|
from dcs.ships import Schnellboot_type_S130
|
||||||
|
|
||||||
from gen.sam.group_generator import ShipGroupGenerator
|
from gen.sam.group_generator import ShipGroupGenerator
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ class SchnellbootGroupGenerator(ShipGroupGenerator):
|
|||||||
|
|
||||||
for i in range(random.randint(2, 4)):
|
for i in range(random.randint(2, 4)):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Boat_Schnellboot_type_S130,
|
Schnellboot_type_S130,
|
||||||
"Schnellboot" + str(i),
|
"Schnellboot" + str(i),
|
||||||
self.position.x + i * random.randint(100, 250),
|
self.position.x + i * random.randint(100, 250),
|
||||||
self.position.y + (random.randint(100, 200) - 100),
|
self.position.y + (random.randint(100, 200) - 100),
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ def generate_ship_group(game, ground_object, faction_name: str):
|
|||||||
gen = random.choice(faction.navy_generators)
|
gen = random.choice(faction.navy_generators)
|
||||||
if gen in SHIP_MAP.keys():
|
if gen in SHIP_MAP.keys():
|
||||||
generator = SHIP_MAP[gen](game, ground_object, faction)
|
generator = SHIP_MAP[gen](game, ground_object, faction)
|
||||||
print(generator.position)
|
|
||||||
generator.generate()
|
generator.generate()
|
||||||
return generator.get_generated_group()
|
return generator.get_generated_group()
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from dcs.ships import U_boat_VIIC_U_flak
|
from dcs.ships import Uboat_VIIC_U_flak
|
||||||
|
|
||||||
from gen.sam.group_generator import ShipGroupGenerator
|
from gen.sam.group_generator import ShipGroupGenerator
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ class UBoatGroupGenerator(ShipGroupGenerator):
|
|||||||
|
|
||||||
for i in range(random.randint(1, 4)):
|
for i in range(random.randint(1, 4)):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
U_boat_VIIC_U_flak,
|
Uboat_VIIC_U_flak,
|
||||||
"Uboat" + str(i),
|
"Uboat" + str(i),
|
||||||
self.position.x + i * random.randint(100, 250),
|
self.position.x + i * random.randint(100, 250),
|
||||||
self.position.y + (random.randint(100, 200) - 100),
|
self.position.y + (random.randint(100, 200) - 100),
|
||||||
|
|||||||
@@ -450,32 +450,6 @@ class ObjectiveFinder:
|
|||||||
c for c in self.game.theater.controlpoints if c.is_friendly(self.is_player)
|
c for c in self.game.theater.controlpoints if c.is_friendly(self.is_player)
|
||||||
)
|
)
|
||||||
|
|
||||||
def farthest_friendly_control_point(self) -> Optional[ControlPoint]:
|
|
||||||
"""
|
|
||||||
Iterates over all friendly control points and find the one farthest away from the frontline
|
|
||||||
BUT! prefer Cvs. Everybody likes CVs!
|
|
||||||
"""
|
|
||||||
from_frontline = 0
|
|
||||||
cp = None
|
|
||||||
first_friendly_cp = None
|
|
||||||
|
|
||||||
for c in self.game.theater.controlpoints:
|
|
||||||
if c.is_friendly(self.is_player):
|
|
||||||
if first_friendly_cp is None:
|
|
||||||
first_friendly_cp = c
|
|
||||||
if c.is_carrier:
|
|
||||||
return c
|
|
||||||
if c.has_active_frontline:
|
|
||||||
if c.distance_to(self.front_lines().__next__()) > from_frontline:
|
|
||||||
from_frontline = c.distance_to(self.front_lines().__next__())
|
|
||||||
cp = c
|
|
||||||
|
|
||||||
# If no frontlines on the map, return the first friendly cp
|
|
||||||
if cp is None:
|
|
||||||
return first_friendly_cp
|
|
||||||
else:
|
|
||||||
return cp
|
|
||||||
|
|
||||||
def enemy_control_points(self) -> Iterator[ControlPoint]:
|
def enemy_control_points(self) -> Iterator[ControlPoint]:
|
||||||
"""Iterates over all enemy control points."""
|
"""Iterates over all enemy control points."""
|
||||||
return (
|
return (
|
||||||
@@ -533,7 +507,6 @@ class CoalitionMissionPlanner:
|
|||||||
MAX_OCA_RANGE = nautical_miles(150)
|
MAX_OCA_RANGE = nautical_miles(150)
|
||||||
MAX_SEAD_RANGE = nautical_miles(150)
|
MAX_SEAD_RANGE = nautical_miles(150)
|
||||||
MAX_STRIKE_RANGE = nautical_miles(150)
|
MAX_STRIKE_RANGE = nautical_miles(150)
|
||||||
MAX_AWEC_RANGE = nautical_miles(200)
|
|
||||||
|
|
||||||
def __init__(self, game: Game, is_player: bool) -> None:
|
def __init__(self, game: Game, is_player: bool) -> None:
|
||||||
self.game = game
|
self.game = game
|
||||||
@@ -553,14 +526,6 @@ class CoalitionMissionPlanner:
|
|||||||
ensure that they can be planned again next turn even if all aircraft are
|
ensure that they can be planned again next turn even if all aircraft are
|
||||||
eliminated this turn.
|
eliminated this turn.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Find farthest, friendly CP for AEWC
|
|
||||||
cp = self.objective_finder.farthest_friendly_control_point()
|
|
||||||
if cp is not None:
|
|
||||||
yield ProposedMission(
|
|
||||||
cp, [ProposedFlight(FlightType.AEWC, 1, self.MAX_AWEC_RANGE)]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Find friendly CPs within 100 nmi from an enemy airfield, plan CAP.
|
# Find friendly CPs within 100 nmi from an enemy airfield, plan CAP.
|
||||||
for cp in self.objective_finder.vulnerable_control_points():
|
for cp in self.objective_finder.vulnerable_control_points():
|
||||||
# Plan three rounds of CAP to give ~90 minutes coverage. Spacing
|
# Plan three rounds of CAP to give ~90 minutes coverage. Spacing
|
||||||
@@ -590,23 +555,9 @@ class CoalitionMissionPlanner:
|
|||||||
front_line,
|
front_line,
|
||||||
[
|
[
|
||||||
ProposedFlight(FlightType.CAS, 2, self.MAX_CAS_RANGE),
|
ProposedFlight(FlightType.CAS, 2, self.MAX_CAS_RANGE),
|
||||||
# This is *not* an escort because front lines don't create a threat
|
ProposedFlight(
|
||||||
# zone. Generating threat zones from front lines causes the front
|
FlightType.TARCAP, 2, self.MAX_CAP_RANGE, EscortType.AirToAir
|
||||||
# line to push back BARCAPs as it gets closer to the base. While
|
),
|
||||||
# front lines do have the same problem of potentially pulling
|
|
||||||
# BARCAPs off bases to engage a front line TARCAP, that's probably
|
|
||||||
# the one time where we do want that.
|
|
||||||
#
|
|
||||||
# TODO: Use intercepts and extra TARCAPs to cover bases near fronts.
|
|
||||||
# We don't have intercept missions yet so this isn't something we
|
|
||||||
# can do today, but we should probably return to having the front
|
|
||||||
# line project a threat zone (so that strike missions will route
|
|
||||||
# around it) and instead *not plan* a BARCAP at bases near the
|
|
||||||
# front, since there isn't a place to put a barrier. Instead, the
|
|
||||||
# aircraft that would have been a BARCAP could be used as additional
|
|
||||||
# interceptors and TARCAPs which will defend the base but won't be
|
|
||||||
# trying to avoid front line contacts.
|
|
||||||
ProposedFlight(FlightType.TARCAP, 2, self.MAX_CAP_RANGE),
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ from dcs.helicopters import (
|
|||||||
OH_58D,
|
OH_58D,
|
||||||
SA342L,
|
SA342L,
|
||||||
SA342M,
|
SA342M,
|
||||||
SH_60B,
|
|
||||||
UH_1H,
|
UH_1H,
|
||||||
|
SH_60B,
|
||||||
)
|
)
|
||||||
from dcs.planes import (
|
from dcs.planes import (
|
||||||
AJS37,
|
AJS37,
|
||||||
@@ -22,14 +22,11 @@ from dcs.planes import (
|
|||||||
A_10C,
|
A_10C,
|
||||||
A_10C_2,
|
A_10C_2,
|
||||||
A_20G,
|
A_20G,
|
||||||
A_50,
|
|
||||||
B_17G,
|
B_17G,
|
||||||
B_1B,
|
B_1B,
|
||||||
B_52H,
|
B_52H,
|
||||||
Bf_109K_4,
|
Bf_109K_4,
|
||||||
C_101CC,
|
C_101CC,
|
||||||
E_2C,
|
|
||||||
E_3A,
|
|
||||||
FA_18C_hornet,
|
FA_18C_hornet,
|
||||||
FW_190A8,
|
FW_190A8,
|
||||||
FW_190D9,
|
FW_190D9,
|
||||||
@@ -43,11 +40,9 @@ from dcs.planes import (
|
|||||||
F_4E,
|
F_4E,
|
||||||
F_5E_3,
|
F_5E_3,
|
||||||
F_86F_Sabre,
|
F_86F_Sabre,
|
||||||
I_16,
|
|
||||||
JF_17,
|
JF_17,
|
||||||
J_11A,
|
J_11A,
|
||||||
Ju_88A4,
|
Ju_88A4,
|
||||||
KJ_2000,
|
|
||||||
L_39ZA,
|
L_39ZA,
|
||||||
MQ_9_Reaper,
|
MQ_9_Reaper,
|
||||||
M_2000C,
|
M_2000C,
|
||||||
@@ -59,6 +54,7 @@ from dcs.planes import (
|
|||||||
MiG_27K,
|
MiG_27K,
|
||||||
MiG_29A,
|
MiG_29A,
|
||||||
MiG_29G,
|
MiG_29G,
|
||||||
|
MiG_29K,
|
||||||
MiG_29S,
|
MiG_29S,
|
||||||
MiG_31,
|
MiG_31,
|
||||||
Mirage_2000_5,
|
Mirage_2000_5,
|
||||||
@@ -92,11 +88,13 @@ from dcs.planes import (
|
|||||||
from dcs.unittype import FlyingType
|
from dcs.unittype import FlyingType
|
||||||
|
|
||||||
from gen.flights.flight import FlightType
|
from gen.flights.flight import FlightType
|
||||||
|
|
||||||
from pydcs_extensions.a4ec.a4ec import A_4E_C
|
from pydcs_extensions.a4ec.a4ec import A_4E_C
|
||||||
from pydcs_extensions.f22a.f22a import F_22A
|
from pydcs_extensions.f22a.f22a import F_22A
|
||||||
from pydcs_extensions.hercules.hercules import Hercules
|
|
||||||
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
||||||
|
from pydcs_extensions.rafale.rafale import Rafale_A_S, Rafale_M, Rafale_B
|
||||||
from pydcs_extensions.su57.su57 import Su_57
|
from pydcs_extensions.su57.su57 import Su_57
|
||||||
|
from pydcs_extensions.hercules.hercules import Hercules
|
||||||
|
|
||||||
# All aircraft lists are in priority order. Aircraft higher in the list will be
|
# All aircraft lists are in priority order. Aircraft higher in the list will be
|
||||||
# preferred over those lower in the list.
|
# preferred over those lower in the list.
|
||||||
@@ -113,12 +111,14 @@ CAP_CAPABLE = [
|
|||||||
F_14B,
|
F_14B,
|
||||||
F_14A_135_GR,
|
F_14A_135_GR,
|
||||||
MiG_25PD,
|
MiG_25PD,
|
||||||
|
Rafale_M,
|
||||||
Su_33,
|
Su_33,
|
||||||
Su_30,
|
Su_30,
|
||||||
Su_27,
|
Su_27,
|
||||||
J_11A,
|
J_11A,
|
||||||
F_15C,
|
F_15C,
|
||||||
MiG_29S,
|
MiG_29S,
|
||||||
|
MiG_29K,
|
||||||
MiG_29G,
|
MiG_29G,
|
||||||
MiG_29A,
|
MiG_29A,
|
||||||
F_16C_50,
|
F_16C_50,
|
||||||
@@ -155,8 +155,8 @@ CAP_CAPABLE = [
|
|||||||
# Used for CAS (Close air support) and BAI (Battlefield Interdiction)
|
# Used for CAS (Close air support) and BAI (Battlefield Interdiction)
|
||||||
CAS_CAPABLE = [
|
CAS_CAPABLE = [
|
||||||
A_10C_2,
|
A_10C_2,
|
||||||
B_1B,
|
|
||||||
A_10C,
|
A_10C,
|
||||||
|
B_1B,
|
||||||
F_14B,
|
F_14B,
|
||||||
F_14A_135_GR,
|
F_14A_135_GR,
|
||||||
Su_25TM,
|
Su_25TM,
|
||||||
@@ -165,6 +165,8 @@ CAS_CAPABLE = [
|
|||||||
F_15E,
|
F_15E,
|
||||||
F_16C_50,
|
F_16C_50,
|
||||||
FA_18C_hornet,
|
FA_18C_hornet,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_B,
|
||||||
Tornado_GR4,
|
Tornado_GR4,
|
||||||
Tornado_IDS,
|
Tornado_IDS,
|
||||||
JF_17,
|
JF_17,
|
||||||
@@ -178,7 +180,6 @@ CAS_CAPABLE = [
|
|||||||
S_3B,
|
S_3B,
|
||||||
Su_34,
|
Su_34,
|
||||||
Su_30,
|
Su_30,
|
||||||
MiG_19P,
|
|
||||||
MiG_29S,
|
MiG_29S,
|
||||||
MiG_27K,
|
MiG_27K,
|
||||||
MiG_29A,
|
MiG_29A,
|
||||||
@@ -226,6 +227,8 @@ SEAD_CAPABLE = [
|
|||||||
Tornado_IDS,
|
Tornado_IDS,
|
||||||
Su_25T,
|
Su_25T,
|
||||||
Su_25TM,
|
Su_25TM,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_B,
|
||||||
F_4E,
|
F_4E,
|
||||||
A_4E_C,
|
A_4E_C,
|
||||||
AV8BNA,
|
AV8BNA,
|
||||||
@@ -273,6 +276,8 @@ STRIKE_CAPABLE = [
|
|||||||
Tu_22M3,
|
Tu_22M3,
|
||||||
F_15E,
|
F_15E,
|
||||||
AJS37,
|
AJS37,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_B,
|
||||||
Tornado_GR4,
|
Tornado_GR4,
|
||||||
F_16C_50,
|
F_16C_50,
|
||||||
FA_18C_hornet,
|
FA_18C_hornet,
|
||||||
@@ -291,6 +296,7 @@ STRIKE_CAPABLE = [
|
|||||||
Su_30,
|
Su_30,
|
||||||
Su_27,
|
Su_27,
|
||||||
MiG_29S,
|
MiG_29S,
|
||||||
|
MiG_29K,
|
||||||
MiG_29G,
|
MiG_29G,
|
||||||
MiG_29A,
|
MiG_29A,
|
||||||
JF_17,
|
JF_17,
|
||||||
@@ -327,6 +333,8 @@ ANTISHIP_CAPABLE = [
|
|||||||
AJS37,
|
AJS37,
|
||||||
Tu_22M3,
|
Tu_22M3,
|
||||||
FA_18C_hornet,
|
FA_18C_hornet,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_B,
|
||||||
Su_24M,
|
Su_24M,
|
||||||
Su_17M4,
|
Su_17M4,
|
||||||
JF_17,
|
JF_17,
|
||||||
@@ -361,13 +369,6 @@ TRANSPORT_CAPABLE = [
|
|||||||
|
|
||||||
DRONES = [MQ_9_Reaper, RQ_1A_Predator, WingLoong_I]
|
DRONES = [MQ_9_Reaper, RQ_1A_Predator, WingLoong_I]
|
||||||
|
|
||||||
AEWC_CAPABLE = [
|
|
||||||
E_3A,
|
|
||||||
E_2C,
|
|
||||||
A_50,
|
|
||||||
KJ_2000,
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]:
|
def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]:
|
||||||
cap_missions = (FlightType.BARCAP, FlightType.TARCAP)
|
cap_missions = (FlightType.BARCAP, FlightType.TARCAP)
|
||||||
@@ -391,8 +392,6 @@ def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]:
|
|||||||
return STRIKE_CAPABLE
|
return STRIKE_CAPABLE
|
||||||
elif task == FlightType.ESCORT:
|
elif task == FlightType.ESCORT:
|
||||||
return CAP_CAPABLE
|
return CAP_CAPABLE
|
||||||
elif task == FlightType.AEWC:
|
|
||||||
return AEWC_CAPABLE
|
|
||||||
else:
|
else:
|
||||||
logging.error(f"Unplannable flight type: {task}")
|
logging.error(f"Unplannable flight type: {task}")
|
||||||
return []
|
return []
|
||||||
|
|||||||
@@ -20,15 +20,6 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
|
|
||||||
class FlightType(Enum):
|
class FlightType(Enum):
|
||||||
"""Enumeration of mission types.
|
|
||||||
|
|
||||||
The value of each enumeration is the name that will be shown in the UI.
|
|
||||||
|
|
||||||
These values are persisted to the save game as well since they are a part of
|
|
||||||
each flight and thus a part of the ATO, so changing these values will break
|
|
||||||
save compat.
|
|
||||||
"""
|
|
||||||
|
|
||||||
TARCAP = "TARCAP"
|
TARCAP = "TARCAP"
|
||||||
BARCAP = "BARCAP"
|
BARCAP = "BARCAP"
|
||||||
CAS = "CAS"
|
CAS = "CAS"
|
||||||
@@ -42,7 +33,6 @@ class FlightType(Enum):
|
|||||||
SWEEP = "Fighter sweep"
|
SWEEP = "Fighter sweep"
|
||||||
OCA_RUNWAY = "OCA/Runway"
|
OCA_RUNWAY = "OCA/Runway"
|
||||||
OCA_AIRCRAFT = "OCA/Aircraft"
|
OCA_AIRCRAFT = "OCA/Aircraft"
|
||||||
AEWC = "AEW&C"
|
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.value
|
return self.value
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ from datetime import timedelta
|
|||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from typing import Iterator, List, Optional, Set, TYPE_CHECKING, Tuple
|
from typing import Iterator, List, Optional, Set, TYPE_CHECKING, Tuple
|
||||||
|
|
||||||
from dcs.planes import E_3A, E_2C, A_50, KJ_2000
|
|
||||||
|
|
||||||
from dcs.mapping import Point
|
from dcs.mapping import Point
|
||||||
from dcs.unit import Unit
|
from dcs.unit import Unit
|
||||||
from shapely.geometry import Point as ShapelyPoint
|
from shapely.geometry import Point as ShapelyPoint
|
||||||
@@ -31,7 +29,7 @@ from game.theater import (
|
|||||||
TheaterGroundObject,
|
TheaterGroundObject,
|
||||||
)
|
)
|
||||||
from game.theater.theatergroundobject import EwrGroundObject
|
from game.theater.theatergroundobject import EwrGroundObject
|
||||||
from game.utils import Distance, Speed, feet, meters, nautical_miles
|
from game.utils import Distance, Speed, meters, nautical_miles
|
||||||
from .closestairfields import ObjectiveDistanceCache
|
from .closestairfields import ObjectiveDistanceCache
|
||||||
from .flight import Flight, FlightType, FlightWaypoint, FlightWaypointType
|
from .flight import Flight, FlightType, FlightWaypoint, FlightWaypointType
|
||||||
from .traveltime import GroundSpeed, TravelTime
|
from .traveltime import GroundSpeed, TravelTime
|
||||||
@@ -280,11 +278,11 @@ class LoiterFlightPlan(FlightPlan):
|
|||||||
travel_time = super().travel_time_between_waypoints(a, b)
|
travel_time = super().travel_time_between_waypoints(a, b)
|
||||||
if a != self.hold:
|
if a != self.hold:
|
||||||
return travel_time
|
return travel_time
|
||||||
|
try:
|
||||||
return travel_time + self.hold_duration
|
return travel_time + self.hold_duration
|
||||||
|
except AttributeError:
|
||||||
@property
|
# Save compat for 2.3.
|
||||||
def mission_departure_time(self) -> timedelta:
|
return travel_time + timedelta(minutes=5)
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
@@ -696,45 +694,6 @@ class SweepFlightPlan(LoiterFlightPlan):
|
|||||||
return self.sweep_end_time
|
return self.sweep_end_time
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class AwacsFlightPlan(LoiterFlightPlan):
|
|
||||||
takeoff: FlightWaypoint
|
|
||||||
nav_to: List[FlightWaypoint]
|
|
||||||
nav_from: List[FlightWaypoint]
|
|
||||||
land: FlightWaypoint
|
|
||||||
divert: Optional[FlightWaypoint]
|
|
||||||
|
|
||||||
def iter_waypoints(self) -> Iterator[FlightWaypoint]:
|
|
||||||
yield self.takeoff
|
|
||||||
yield from self.nav_to
|
|
||||||
yield self.hold
|
|
||||||
yield from self.nav_from
|
|
||||||
yield self.land
|
|
||||||
if self.divert is not None:
|
|
||||||
yield self.divert
|
|
||||||
|
|
||||||
@property
|
|
||||||
def mission_start_time(self) -> Optional[timedelta]:
|
|
||||||
return self.takeoff_time()
|
|
||||||
|
|
||||||
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> Optional[timedelta]:
|
|
||||||
if waypoint == self.hold:
|
|
||||||
return self.package.time_over_target
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def tot_waypoint(self) -> Optional[FlightWaypoint]:
|
|
||||||
return self.hold
|
|
||||||
|
|
||||||
@property
|
|
||||||
def push_time(self) -> timedelta:
|
|
||||||
return self.package.time_over_target + self.hold_duration
|
|
||||||
|
|
||||||
@property
|
|
||||||
def mission_departure_time(self) -> timedelta:
|
|
||||||
return self.push_time
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class CustomFlightPlan(FlightPlan):
|
class CustomFlightPlan(FlightPlan):
|
||||||
custom_waypoints: List[FlightWaypoint]
|
custom_waypoints: List[FlightWaypoint]
|
||||||
@@ -800,17 +759,7 @@ class FlightPlanBuilder:
|
|||||||
raise RuntimeError("Flight must be a part of the package")
|
raise RuntimeError("Flight must be a part of the package")
|
||||||
if self.package.waypoints is None:
|
if self.package.waypoints is None:
|
||||||
self.regenerate_package_waypoints()
|
self.regenerate_package_waypoints()
|
||||||
|
|
||||||
from game.navmesh import NavMeshError
|
|
||||||
|
|
||||||
try:
|
|
||||||
flight.flight_plan = self.generate_flight_plan(flight, custom_targets)
|
flight.flight_plan = self.generate_flight_plan(flight, custom_targets)
|
||||||
except NavMeshError as ex:
|
|
||||||
color = "blue" if self.is_player else "red"
|
|
||||||
raise PlanningError(
|
|
||||||
f"Could not plan {color} {flight.flight_type.value} from "
|
|
||||||
f"{flight.departure} to {flight.package.target}"
|
|
||||||
) from ex
|
|
||||||
|
|
||||||
def generate_flight_plan(
|
def generate_flight_plan(
|
||||||
self, flight: Flight, custom_targets: Optional[List[Unit]]
|
self, flight: Flight, custom_targets: Optional[List[Unit]]
|
||||||
@@ -841,8 +790,6 @@ class FlightPlanBuilder:
|
|||||||
return self.generate_sweep(flight)
|
return self.generate_sweep(flight)
|
||||||
elif task == FlightType.TARCAP:
|
elif task == FlightType.TARCAP:
|
||||||
return self.generate_tarcap(flight)
|
return self.generate_tarcap(flight)
|
||||||
elif task == FlightType.AEWC:
|
|
||||||
return self.generate_aewc(flight)
|
|
||||||
raise PlanningError(f"{task} flight plan generation not implemented")
|
raise PlanningError(f"{task} flight plan generation not implemented")
|
||||||
|
|
||||||
def regenerate_package_waypoints(self) -> None:
|
def regenerate_package_waypoints(self) -> None:
|
||||||
@@ -973,47 +920,6 @@ class FlightPlanBuilder:
|
|||||||
flight, location, FlightWaypointType.INGRESS_STRIKE, targets
|
flight, location, FlightWaypointType.INGRESS_STRIKE, targets
|
||||||
)
|
)
|
||||||
|
|
||||||
def generate_aewc(self, flight: Flight) -> AwacsFlightPlan:
|
|
||||||
"""Generate a AWACS flight at a given location.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flight: The flight to generate the flight plan for.
|
|
||||||
"""
|
|
||||||
location = self.package.target
|
|
||||||
|
|
||||||
start = self.aewc_orbit(location)
|
|
||||||
|
|
||||||
# As high as possible to maximize detection and on-station time.
|
|
||||||
if flight.unit_type == E_2C:
|
|
||||||
patrol_alt = feet(30000)
|
|
||||||
elif flight.unit_type == E_3A:
|
|
||||||
patrol_alt = feet(35000)
|
|
||||||
elif flight.unit_type == A_50:
|
|
||||||
patrol_alt = feet(33000)
|
|
||||||
elif flight.unit_type == KJ_2000:
|
|
||||||
patrol_alt = feet(40000)
|
|
||||||
else:
|
|
||||||
patrol_alt = feet(25000)
|
|
||||||
|
|
||||||
builder = WaypointBuilder(flight, self.game, self.is_player)
|
|
||||||
start = builder.orbit(start, patrol_alt)
|
|
||||||
|
|
||||||
return AwacsFlightPlan(
|
|
||||||
package=self.package,
|
|
||||||
flight=flight,
|
|
||||||
takeoff=builder.takeoff(flight.departure),
|
|
||||||
nav_to=builder.nav_path(
|
|
||||||
flight.departure.position, start.position, patrol_alt
|
|
||||||
),
|
|
||||||
nav_from=builder.nav_path(
|
|
||||||
start.position, flight.arrival.position, patrol_alt
|
|
||||||
),
|
|
||||||
land=builder.land(flight.arrival),
|
|
||||||
divert=builder.divert(flight.divert),
|
|
||||||
hold=start,
|
|
||||||
hold_duration=timedelta(hours=4),
|
|
||||||
)
|
|
||||||
|
|
||||||
def generate_bai(self, flight: Flight) -> StrikeFlightPlan:
|
def generate_bai(self, flight: Flight) -> StrikeFlightPlan:
|
||||||
"""Generates a BAI flight plan.
|
"""Generates a BAI flight plan.
|
||||||
|
|
||||||
@@ -1027,7 +933,6 @@ class FlightPlanBuilder:
|
|||||||
|
|
||||||
targets: List[StrikeTarget] = []
|
targets: List[StrikeTarget] = []
|
||||||
for group in location.groups:
|
for group in location.groups:
|
||||||
if group.units:
|
|
||||||
targets.append(StrikeTarget(f"{group.name} at {location.name}", group))
|
targets.append(StrikeTarget(f"{group.name} at {location.name}", group))
|
||||||
|
|
||||||
return self.strike_flightplan(
|
return self.strike_flightplan(
|
||||||
@@ -1197,22 +1102,6 @@ class FlightPlanBuilder:
|
|||||||
start = end.point_from_heading(heading - 180, diameter)
|
start = end.point_from_heading(heading - 180, diameter)
|
||||||
return start, end
|
return start, end
|
||||||
|
|
||||||
def aewc_orbit(self, location: MissionTarget) -> Point:
|
|
||||||
# in threat zone
|
|
||||||
if self.threat_zones.threatened(location.position):
|
|
||||||
# Borderpoint
|
|
||||||
closest_boundary = self.threat_zones.closest_boundary(location.position)
|
|
||||||
|
|
||||||
# Heading + Distance to border point
|
|
||||||
heading = location.position.heading_between_point(closest_boundary)
|
|
||||||
distance = location.position.distance_to_point(closest_boundary)
|
|
||||||
|
|
||||||
return location.position.point_from_heading(heading, distance)
|
|
||||||
|
|
||||||
# this Part is fine. No threat zone, just use our point
|
|
||||||
else:
|
|
||||||
return location.position
|
|
||||||
|
|
||||||
def racetrack_for_frontline(
|
def racetrack_for_frontline(
|
||||||
self, origin: Point, front_line: FrontLine
|
self, origin: Point, front_line: FrontLine
|
||||||
) -> Tuple[Point, Point]:
|
) -> Tuple[Point, Point]:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from typing import (
|
|||||||
|
|
||||||
from dcs.mapping import Point
|
from dcs.mapping import Point
|
||||||
from dcs.unit import Unit
|
from dcs.unit import Unit
|
||||||
from dcs.unitgroup import Group, VehicleGroup
|
from dcs.unitgroup import VehicleGroup
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
@@ -32,7 +32,7 @@ from .flight import Flight, FlightWaypoint, FlightWaypointType
|
|||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class StrikeTarget:
|
class StrikeTarget:
|
||||||
name: str
|
name: str
|
||||||
target: Union[VehicleGroup, TheaterGroundObject, Unit, Group]
|
target: Union[VehicleGroup, TheaterGroundObject, Unit]
|
||||||
|
|
||||||
|
|
||||||
class WaypointBuilder:
|
class WaypointBuilder:
|
||||||
@@ -161,10 +161,8 @@ class WaypointBuilder:
|
|||||||
FlightWaypointType.JOIN,
|
FlightWaypointType.JOIN,
|
||||||
position.x,
|
position.x,
|
||||||
position.y,
|
position.y,
|
||||||
meters(80) if self.is_helo else self.doctrine.ingress_altitude,
|
meters(500) if self.is_helo else self.doctrine.ingress_altitude,
|
||||||
)
|
)
|
||||||
if self.is_helo:
|
|
||||||
waypoint.alt_type = "RADIO"
|
|
||||||
waypoint.pretty_name = "Join"
|
waypoint.pretty_name = "Join"
|
||||||
waypoint.description = "Rendezvous with package"
|
waypoint.description = "Rendezvous with package"
|
||||||
waypoint.name = "JOIN"
|
waypoint.name = "JOIN"
|
||||||
@@ -175,10 +173,8 @@ class WaypointBuilder:
|
|||||||
FlightWaypointType.SPLIT,
|
FlightWaypointType.SPLIT,
|
||||||
position.x,
|
position.x,
|
||||||
position.y,
|
position.y,
|
||||||
meters(80) if self.is_helo else self.doctrine.ingress_altitude,
|
meters(500) if self.is_helo else self.doctrine.ingress_altitude,
|
||||||
)
|
)
|
||||||
if self.is_helo:
|
|
||||||
waypoint.alt_type = "RADIO"
|
|
||||||
waypoint.pretty_name = "Split"
|
waypoint.pretty_name = "Split"
|
||||||
waypoint.description = "Depart from package"
|
waypoint.description = "Depart from package"
|
||||||
waypoint.name = "SPLIT"
|
waypoint.name = "SPLIT"
|
||||||
@@ -194,10 +190,8 @@ class WaypointBuilder:
|
|||||||
ingress_type,
|
ingress_type,
|
||||||
position.x,
|
position.x,
|
||||||
position.y,
|
position.y,
|
||||||
meters(50) if self.is_helo else self.doctrine.ingress_altitude,
|
meters(500) if self.is_helo else self.doctrine.ingress_altitude,
|
||||||
)
|
)
|
||||||
if self.is_helo:
|
|
||||||
waypoint.alt_type = "RADIO"
|
|
||||||
waypoint.pretty_name = "INGRESS on " + objective.name
|
waypoint.pretty_name = "INGRESS on " + objective.name
|
||||||
waypoint.description = "INGRESS on " + objective.name
|
waypoint.description = "INGRESS on " + objective.name
|
||||||
waypoint.name = "INGRESS"
|
waypoint.name = "INGRESS"
|
||||||
@@ -210,10 +204,8 @@ class WaypointBuilder:
|
|||||||
FlightWaypointType.EGRESS,
|
FlightWaypointType.EGRESS,
|
||||||
position.x,
|
position.x,
|
||||||
position.y,
|
position.y,
|
||||||
meters(50) if self.is_helo else self.doctrine.ingress_altitude,
|
meters(500) if self.is_helo else self.doctrine.ingress_altitude,
|
||||||
)
|
)
|
||||||
if self.is_helo:
|
|
||||||
waypoint.alt_type = "RADIO"
|
|
||||||
waypoint.pretty_name = "EGRESS from " + target.name
|
waypoint.pretty_name = "EGRESS from " + target.name
|
||||||
waypoint.description = "EGRESS from " + target.name
|
waypoint.description = "EGRESS from " + target.name
|
||||||
waypoint.name = "EGRESS"
|
waypoint.name = "EGRESS"
|
||||||
@@ -294,7 +286,7 @@ class WaypointBuilder:
|
|||||||
FlightWaypointType.CAS,
|
FlightWaypointType.CAS,
|
||||||
position.x,
|
position.x,
|
||||||
position.y,
|
position.y,
|
||||||
meters(50) if self.is_helo else meters(1000),
|
meters(500) if self.is_helo else meters(1000),
|
||||||
)
|
)
|
||||||
waypoint.alt_type = "RADIO"
|
waypoint.alt_type = "RADIO"
|
||||||
waypoint.description = "Provide CAS"
|
waypoint.description = "Provide CAS"
|
||||||
@@ -349,21 +341,6 @@ class WaypointBuilder:
|
|||||||
self.race_track_end(end, altitude),
|
self.race_track_end(end, altitude),
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def orbit(start: Point, altitude: Distance) -> FlightWaypoint:
|
|
||||||
"""Creates an circular orbit point.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
start: Position of the waypoint.
|
|
||||||
altitude: Altitude of the racetrack.
|
|
||||||
"""
|
|
||||||
|
|
||||||
waypoint = FlightWaypoint(FlightWaypointType.LOITER, start.x, start.y, altitude)
|
|
||||||
waypoint.name = "ORBIT"
|
|
||||||
waypoint.description = "Anchor and hold at this point"
|
|
||||||
waypoint.pretty_name = "Orbit"
|
|
||||||
return waypoint
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def sweep_start(position: Point, altitude: Distance) -> FlightWaypoint:
|
def sweep_start(position: Point, altitude: Distance) -> FlightWaypoint:
|
||||||
"""Creates a sweep start waypoint.
|
"""Creates a sweep start waypoint.
|
||||||
@@ -430,10 +407,8 @@ class WaypointBuilder:
|
|||||||
FlightWaypointType.TARGET_GROUP_LOC,
|
FlightWaypointType.TARGET_GROUP_LOC,
|
||||||
target.position.x,
|
target.position.x,
|
||||||
target.position.y,
|
target.position.y,
|
||||||
meters(50) if self.is_helo else self.doctrine.ingress_altitude,
|
meters(500) if self.is_helo else self.doctrine.ingress_altitude,
|
||||||
)
|
)
|
||||||
if self.is_helo:
|
|
||||||
waypoint.alt_type = "RADIO"
|
|
||||||
waypoint.name = "TARGET"
|
waypoint.name = "TARGET"
|
||||||
waypoint.description = "Escort the package"
|
waypoint.description = "Escort the package"
|
||||||
waypoint.pretty_name = "Target area"
|
waypoint.pretty_name = "Target area"
|
||||||
|
|||||||
@@ -14,16 +14,16 @@ TYPE_TANKS = [
|
|||||||
Armor.MBT_Challenger_II,
|
Armor.MBT_Challenger_II,
|
||||||
Armor.MBT_M1A2_Abrams,
|
Armor.MBT_M1A2_Abrams,
|
||||||
Armor.MBT_M60A3_Patton,
|
Armor.MBT_M60A3_Patton,
|
||||||
Armor.MBT_Merkava_IV,
|
Armor.MBT_Merkava_Mk__4,
|
||||||
Armor.ZTZ_96B,
|
Armor.ZTZ_96B,
|
||||||
# WW2
|
# WW2
|
||||||
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G,
|
||||||
Armor.MT_PzIV_H,
|
Armor.MT_Pz_Kpfw_IV_Ausf_H,
|
||||||
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
Armor.HT_Pz_Kpfw_VI_Tiger_I,
|
||||||
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II,
|
||||||
Armor.MT_M4_Sherman,
|
Armor.MT_M4_Sherman,
|
||||||
Armor.MT_M4A4_Sherman_Firefly,
|
Armor.MT_M4A4_Sherman_Firefly,
|
||||||
Armor.SPG_StuG_IV,
|
Armor.StuG_IV,
|
||||||
Armor.CT_Centaur_IV,
|
Armor.CT_Centaur_IV,
|
||||||
Armor.CT_Cromwell_IV,
|
Armor.CT_Cromwell_IV,
|
||||||
Armor.HIT_Churchill_VII,
|
Armor.HIT_Churchill_VII,
|
||||||
@@ -40,14 +40,14 @@ TYPE_TANKS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
TYPE_ATGM = [
|
TYPE_ATGM = [
|
||||||
Armor.ATGM_HMMWV,
|
Armor.ATGM_M1045_HMMWV_TOW,
|
||||||
Armor.ATGM_Stryker,
|
Armor.ATGM_M1134_Stryker,
|
||||||
Armor.IFV_BMP_2,
|
Armor.IFV_BMP_2,
|
||||||
# WW2 (Tank Destroyers)
|
# WW2 (Tank Destroyers)
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
Armor.SPG_Jagdpanzer_IV,
|
Armor.TD_Jagdpanzer_IV,
|
||||||
Armor.SPG_Jagdpanther_G1,
|
Armor.TD_Jagdpanther_G1,
|
||||||
Armor.SPG_M10_GMC,
|
Armor.TD_M10_GMC,
|
||||||
# Mods
|
# Mods
|
||||||
frenchpack.VBAE_CRAB_MMP,
|
frenchpack.VBAE_CRAB_MMP,
|
||||||
frenchpack.VAB_MEPHISTO,
|
frenchpack.VAB_MEPHISTO,
|
||||||
@@ -59,17 +59,17 @@ TYPE_IFV = [
|
|||||||
Armor.IFV_BMP_2,
|
Armor.IFV_BMP_2,
|
||||||
Armor.IFV_BMP_1,
|
Armor.IFV_BMP_1,
|
||||||
Armor.IFV_Marder,
|
Armor.IFV_Marder,
|
||||||
Armor.IFV_Warrior,
|
Armor.IFV_MCV_80,
|
||||||
Armor.IFV_LAV_25,
|
Armor.IFV_LAV_25,
|
||||||
Armor.SPG_Stryker_MGS,
|
Armor.SPG_M1128_Stryker_MGS,
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma,
|
Armor.AC_Sd_Kfz_234_2_Puma,
|
||||||
Armor.IFV_M2A2_Bradley,
|
Armor.IFV_M2A2_Bradley,
|
||||||
Armor.IFV_BMD_1,
|
Armor.IFV_BMD_1,
|
||||||
Armor.ZBD_04A,
|
Armor.ZBD_04A,
|
||||||
# WW2
|
# WW2
|
||||||
Armor.IFV_Sd_Kfz_234_2_Puma,
|
Armor.AC_Sd_Kfz_234_2_Puma,
|
||||||
Armor.Car_M8_Greyhound_Armored,
|
Armor.LAC_M8_Greyhound,
|
||||||
Armor.Car_Daimler_Armored,
|
Armor.Daimler_Armoured_Car,
|
||||||
# Mods
|
# Mods
|
||||||
frenchpack.ERC_90,
|
frenchpack.ERC_90,
|
||||||
frenchpack.VBAE_CRAB,
|
frenchpack.VBAE_CRAB,
|
||||||
@@ -77,23 +77,23 @@ TYPE_IFV = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
TYPE_APC = [
|
TYPE_APC = [
|
||||||
Armor.APC_HMMWV__Scout,
|
Armor.APC_M1043_HMMWV_Armament,
|
||||||
Armor.IFV_M1126_Stryker_ICV,
|
Armor.APC_M1126_Stryker_ICV,
|
||||||
Armor.APC_M113,
|
Armor.APC_M113,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
Armor.APC_BTR_82A,
|
Armor.APC_BTR_82A,
|
||||||
Armor.APC_MTLB,
|
Armor.APC_MTLB,
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_Cobra__Scout,
|
Armor.APC_Cobra,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
Armor.APC_AAV_7_Amphibious,
|
Armor.APC_AAV_7,
|
||||||
Armor.APC_TPz_Fuchs,
|
Armor.TPz_Fuchs,
|
||||||
Armor.IFV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.APC_BTR_RD,
|
Armor.ARV_BTR_RD,
|
||||||
Artillery.Grad_MRL_FDDM__FC,
|
Armor.FDDM_Grad,
|
||||||
# WW2
|
# WW2
|
||||||
Armor.APC_M2A1_Halftrack,
|
Armor.APC_M2A1,
|
||||||
Armor.APC_Sd_Kfz_251_Halftrack,
|
Armor.APC_Sd_Kfz_251,
|
||||||
# Mods
|
# Mods
|
||||||
frenchpack.VAB__50,
|
frenchpack.VAB__50,
|
||||||
frenchpack.VBL__50,
|
frenchpack.VBL__50,
|
||||||
@@ -101,82 +101,80 @@ TYPE_APC = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
TYPE_ARTILLERY = [
|
TYPE_ARTILLERY = [
|
||||||
Artillery.MLRS_9A52_Smerch_HE_300mm,
|
Artillery.MLRS_9A52_Smerch,
|
||||||
Artillery.SPH_2S1_Gvozdika_122mm,
|
Artillery.SPH_2S1_Gvozdika,
|
||||||
Artillery.SPH_2S3_Akatsia_152mm,
|
Artillery.SPH_2S3_Akatsia,
|
||||||
Artillery.MLRS_BM_21_Grad_122mm,
|
Artillery.MLRS_BM_21_Grad,
|
||||||
Artillery.MLRS_BM_27_Uragan_220mm,
|
Artillery.MLRS_9K57_Uragan_BM_27,
|
||||||
Artillery.SPH_M109_Paladin_155mm,
|
Artillery.SPH_M109_Paladin,
|
||||||
Artillery.MLRS_M270_227mm,
|
Artillery.MLRS_M270,
|
||||||
Artillery.SPH_2S9_Nona_120mm_M,
|
Artillery.SPH_2S9_Nona,
|
||||||
Artillery.SPH_Dana_vz77_152mm,
|
Artillery.SpGH_Dana,
|
||||||
Artillery.PLZ_05,
|
Artillery.SPH_2S19_Msta,
|
||||||
Artillery.SPH_2S19_Msta_152mm,
|
Artillery.MLRS_FDDM,
|
||||||
Artillery.MLRS_9A52_Smerch_CM_300mm,
|
|
||||||
# WW2
|
# WW2
|
||||||
Artillery.SPG_Sturmpanzer_IV_Brummbar,
|
Artillery.Sturmpanzer_IV_Brummbär,
|
||||||
Artillery.SPG_M12_GMC_155mm,
|
Artillery.M12_GMC,
|
||||||
]
|
]
|
||||||
|
|
||||||
TYPE_LOGI = [
|
TYPE_LOGI = [
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
Unarmed.Transport_KAMAZ_43101,
|
||||||
Unarmed.Truck_Ural_375,
|
Unarmed.Transport_Ural_375,
|
||||||
Unarmed.Truck_GAZ_66,
|
Unarmed.Transport_GAZ_66,
|
||||||
Unarmed.Truck_GAZ_3307,
|
Unarmed.Transport_GAZ_3307,
|
||||||
Unarmed.Truck_GAZ_3308,
|
Unarmed.Transport_GAZ_3308,
|
||||||
Unarmed.Truck_Ural_4320_31_Arm_d,
|
Unarmed.Transport_Ural_4320_31_Armored,
|
||||||
Unarmed.Truck_Ural_4320T,
|
Unarmed.Transport_Ural_4320T,
|
||||||
Unarmed.Truck_Opel_Blitz,
|
Unarmed.Blitz_3_6_6700A,
|
||||||
Unarmed.LUV_Kubelwagen_82,
|
Unarmed.Kübelwagen_82,
|
||||||
Unarmed.Carrier_Sd_Kfz_7_Tractor,
|
Unarmed.Sd_Kfz_7,
|
||||||
Unarmed.LUV_Kettenrad,
|
Unarmed.Sd_Kfz_2,
|
||||||
Unarmed.Car_Willys_Jeep,
|
Unarmed.Willys_MB,
|
||||||
Unarmed.LUV_Land_Rover_109,
|
Unarmed.Land_Rover_109_S3,
|
||||||
Unarmed.Truck_Land_Rover_101_FC,
|
Unarmed.Land_Rover_101_FC,
|
||||||
# Mods
|
# Mods
|
||||||
frenchpack.VBL,
|
frenchpack.VBL,
|
||||||
frenchpack.VAB,
|
frenchpack.VAB,
|
||||||
]
|
]
|
||||||
|
|
||||||
TYPE_INFANTRY = [
|
TYPE_INFANTRY = [
|
||||||
Infantry.Insurgent_AK_74,
|
Infantry.Infantry_Soldier_Insurgents,
|
||||||
Infantry.Infantry_AK_74,
|
Infantry.Soldier_AK,
|
||||||
Infantry.Infantry_M1_Garand,
|
Infantry.Infantry_M1_Garand,
|
||||||
Infantry.Infantry_Mauser_98,
|
Infantry.Infantry_Mauser_98,
|
||||||
Infantry.Infantry_SMLE_No_4_Mk_1,
|
Infantry.Infantry_SMLE_No_4_Mk_1,
|
||||||
Infantry.Infantry_M4_Georgia,
|
Infantry.Georgian_soldier_with_M4,
|
||||||
Infantry.Infantry_AK_74_Rus,
|
Infantry.Infantry_Soldier_Rus,
|
||||||
Infantry.Paratrooper_AKS,
|
Infantry.Paratrooper_AKS,
|
||||||
Infantry.Paratrooper_RPG_16,
|
Infantry.Paratrooper_RPG_16,
|
||||||
Infantry.Infantry_M249,
|
Infantry.Soldier_M249,
|
||||||
Infantry.Infantry_M4,
|
Infantry.Infantry_M4,
|
||||||
Infantry.Infantry_RPG,
|
Infantry.Soldier_RPG,
|
||||||
]
|
]
|
||||||
|
|
||||||
TYPE_SHORAD = [
|
TYPE_SHORAD = [
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
|
||||||
AirDefence.SPAAA_ZSU_57_2,
|
AirDefence.AAA_ZSU_57_2,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL,
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
AirDefence.SPAAA_Gepard,
|
AirDefence.SPAAA_Gepard,
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6,
|
AirDefence.SAM_Linebacker_M6,
|
||||||
AirDefence.SAM_Chaparral_M48,
|
AirDefence.SAM_Chaparral_M48,
|
||||||
AirDefence.SAM_Avenger__Stinger,
|
AirDefence.SAM_Avenger_M1097,
|
||||||
AirDefence.SAM_Roland_ADS,
|
AirDefence.SAM_Roland_ADS,
|
||||||
AirDefence.HQ_7_Self_Propelled_LN,
|
AirDefence.HQ_7_Self_Propelled_LN,
|
||||||
AirDefence.AAA_8_8cm_Flak_18,
|
AirDefence.AAA_8_8cm_Flak_18,
|
||||||
AirDefence.AAA_8_8cm_Flak_36,
|
AirDefence.AAA_8_8cm_Flak_36,
|
||||||
AirDefence.AAA_8_8cm_Flak_37,
|
AirDefence.AAA_8_8cm_Flak_37,
|
||||||
AirDefence.AAA_8_8cm_Flak_41,
|
AirDefence.AAA_8_8cm_Flak_41,
|
||||||
AirDefence.AAA_40mm_Bofors,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
AirDefence.AAA_S_60_57mm,
|
|
||||||
AirDefence.AAA_M1_37mm,
|
AirDefence.AAA_M1_37mm,
|
||||||
AirDefence.AAA_QF_3_7,
|
AirDefence.AA_gun_QF_3_7,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -11,10 +11,9 @@ import logging
|
|||||||
import random
|
import random
|
||||||
from typing import Dict, Iterator, Optional, TYPE_CHECKING, Type, List
|
from typing import Dict, Iterator, Optional, TYPE_CHECKING, Type, List
|
||||||
|
|
||||||
from dcs import Mission, Point, unitgroup
|
from dcs import Mission, Point
|
||||||
from dcs.country import Country
|
from dcs.country import Country
|
||||||
from dcs.point import StaticPoint
|
from dcs.statics import fortification_map, warehouse_map
|
||||||
from dcs.statics import fortification_map, warehouse_map, Warehouse
|
|
||||||
from dcs.task import (
|
from dcs.task import (
|
||||||
ActivateBeaconCommand,
|
ActivateBeaconCommand,
|
||||||
ActivateICLSCommand,
|
ActivateICLSCommand,
|
||||||
@@ -22,7 +21,7 @@ from dcs.task import (
|
|||||||
OptAlarmState,
|
OptAlarmState,
|
||||||
FireAtPoint,
|
FireAtPoint,
|
||||||
)
|
)
|
||||||
from dcs.unit import Ship, Unit, Vehicle, SingleHeliPad, Static
|
from dcs.unit import Ship, Unit, Vehicle
|
||||||
from dcs.unitgroup import Group, ShipGroup, StaticGroup, VehicleGroup
|
from dcs.unitgroup import Group, ShipGroup, StaticGroup, VehicleGroup
|
||||||
from dcs.unittype import StaticType, UnitType
|
from dcs.unittype import StaticType, UnitType
|
||||||
from dcs.vehicles import vehicle_map
|
from dcs.vehicles import vehicle_map
|
||||||
@@ -48,6 +47,7 @@ from .tacan import TacanBand, TacanChannel, TacanRegistry
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
|
|
||||||
|
|
||||||
FARP_FRONTLINE_DISTANCE = 10000
|
FARP_FRONTLINE_DISTANCE = 10000
|
||||||
AA_CP_MIN_DISTANCE = 40000
|
AA_CP_MIN_DISTANCE = 40000
|
||||||
|
|
||||||
@@ -402,9 +402,6 @@ class CarrierGenerator(GenericCarrierGenerator):
|
|||||||
|
|
||||||
def tacan_callsign(self) -> str:
|
def tacan_callsign(self) -> str:
|
||||||
# TODO: Assign these properly.
|
# TODO: Assign these properly.
|
||||||
if self.control_point.name == "Carrier Strike Group 8":
|
|
||||||
return "TRU"
|
|
||||||
else:
|
|
||||||
return random.choice(
|
return random.choice(
|
||||||
[
|
[
|
||||||
"STE",
|
"STE",
|
||||||
@@ -477,48 +474,6 @@ class ShipObjectGenerator(GenericGroundObjectGenerator):
|
|||||||
self._register_unit_group(group_def, group)
|
self._register_unit_group(group_def, group)
|
||||||
|
|
||||||
|
|
||||||
class HelipadGenerator:
|
|
||||||
"""
|
|
||||||
Generates helipads for given control point
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
mission: Mission,
|
|
||||||
cp: ControlPoint,
|
|
||||||
game: Game,
|
|
||||||
radio_registry: RadioRegistry,
|
|
||||||
tacan_registry: TacanRegistry,
|
|
||||||
):
|
|
||||||
self.m = mission
|
|
||||||
self.cp = cp
|
|
||||||
self.game = game
|
|
||||||
self.radio_registry = radio_registry
|
|
||||||
self.tacan_registry = tacan_registry
|
|
||||||
|
|
||||||
def generate(self) -> None:
|
|
||||||
|
|
||||||
if self.cp.captured:
|
|
||||||
country_name = self.game.player_country
|
|
||||||
else:
|
|
||||||
country_name = self.game.enemy_country
|
|
||||||
country = self.m.country(country_name)
|
|
||||||
|
|
||||||
for i, helipad in enumerate(self.cp.helipads):
|
|
||||||
name = self.cp.name + "_helipad_" + str(i)
|
|
||||||
logging.info("Generating helipad : " + name)
|
|
||||||
pad = SingleHeliPad(name=self.m.string(name + "_unit"))
|
|
||||||
pad.position = Point(helipad.x, helipad.y)
|
|
||||||
pad.heading = helipad.heading
|
|
||||||
# pad.heliport_frequency = self.radio_registry.alloc_uhf() TODO : alloc radio & callsign
|
|
||||||
sg = unitgroup.StaticGroup(self.m.next_group_id(), self.m.string(name))
|
|
||||||
sg.add_unit(pad)
|
|
||||||
sp = StaticPoint()
|
|
||||||
sp.position = pad.position
|
|
||||||
sg.add_point(sp)
|
|
||||||
country.add_static_group(sg)
|
|
||||||
|
|
||||||
|
|
||||||
class GroundObjectsGenerator:
|
class GroundObjectsGenerator:
|
||||||
"""Creates DCS groups and statics for the theater during mission generation.
|
"""Creates DCS groups and statics for the theater during mission generation.
|
||||||
|
|
||||||
@@ -552,10 +507,6 @@ class GroundObjectsGenerator:
|
|||||||
country_name = self.game.enemy_country
|
country_name = self.game.enemy_country
|
||||||
country = self.m.country(country_name)
|
country = self.m.country(country_name)
|
||||||
|
|
||||||
HelipadGenerator(
|
|
||||||
self.m, cp, self.game, self.radio_registry, self.tacan_registry
|
|
||||||
).generate()
|
|
||||||
|
|
||||||
for ground_object in cp.ground_objects:
|
for ground_object in cp.ground_objects:
|
||||||
if isinstance(ground_object, BuildingGroundObject):
|
if isinstance(ground_object, BuildingGroundObject):
|
||||||
generator = BuildingSiteGenerator(
|
generator = BuildingSiteGenerator(
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ from .flights.flight import FlightWaypoint, FlightWaypointType
|
|||||||
from .radios import RadioFrequency
|
from .radios import RadioFrequency
|
||||||
from .runways import RunwayData
|
from .runways import RunwayData
|
||||||
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
|
|
||||||
@@ -49,16 +48,8 @@ if TYPE_CHECKING:
|
|||||||
class KneeboardPageWriter:
|
class KneeboardPageWriter:
|
||||||
"""Creates kneeboard images."""
|
"""Creates kneeboard images."""
|
||||||
|
|
||||||
def __init__(
|
def __init__(self, page_margin: int = 24, line_spacing: int = 12) -> None:
|
||||||
self, page_margin: int = 24, line_spacing: int = 12, dark_theme: bool = False
|
self.image = Image.new("RGB", (768, 1024), (0xFF, 0xFF, 0xFF))
|
||||||
) -> None:
|
|
||||||
if dark_theme:
|
|
||||||
self.foreground_fill = (215, 200, 200)
|
|
||||||
self.background_fill = (10, 5, 5)
|
|
||||||
else:
|
|
||||||
self.foreground_fill = (15, 15, 15)
|
|
||||||
self.background_fill = (255, 252, 252)
|
|
||||||
self.image = Image.new("RGB", (768, 1024), self.background_fill)
|
|
||||||
# These font sizes create a relatively full page for current sorties. If
|
# These font sizes create a relatively full page for current sorties. If
|
||||||
# we start generating more complicated flight plans, or start including
|
# we start generating more complicated flight plans, or start including
|
||||||
# more information in the comm ladder (the latter of which we should
|
# more information in the comm ladder (the latter of which we should
|
||||||
@@ -96,10 +87,10 @@ class KneeboardPageWriter:
|
|||||||
self.y += height + self.line_spacing
|
self.y += height + self.line_spacing
|
||||||
|
|
||||||
def title(self, title: str) -> None:
|
def title(self, title: str) -> None:
|
||||||
self.text(title, font=self.title_font, fill=self.foreground_fill)
|
self.text(title, font=self.title_font)
|
||||||
|
|
||||||
def heading(self, text: str) -> None:
|
def heading(self, text: str) -> None:
|
||||||
self.text(text, font=self.heading_font, fill=self.foreground_fill)
|
self.text(text, font=self.heading_font)
|
||||||
|
|
||||||
def table(
|
def table(
|
||||||
self, cells: List[List[str]], headers: Optional[List[str]] = None
|
self, cells: List[List[str]], headers: Optional[List[str]] = None
|
||||||
@@ -107,7 +98,7 @@ class KneeboardPageWriter:
|
|||||||
if headers is None:
|
if headers is None:
|
||||||
headers = []
|
headers = []
|
||||||
table = tabulate(cells, headers=headers, numalign="right")
|
table = tabulate(cells, headers=headers, numalign="right")
|
||||||
self.text(table, font=self.table_font, fill=self.foreground_fill)
|
self.text(table, font=self.table_font)
|
||||||
|
|
||||||
def write(self, path: Path) -> None:
|
def write(self, path: Path) -> None:
|
||||||
self.image.save(path)
|
self.image.save(path)
|
||||||
@@ -254,7 +245,6 @@ class BriefingPage(KneeboardPage):
|
|||||||
tankers: List[TankerInfo],
|
tankers: List[TankerInfo],
|
||||||
jtacs: List[JtacInfo],
|
jtacs: List[JtacInfo],
|
||||||
start_time: datetime.datetime,
|
start_time: datetime.datetime,
|
||||||
dark_kneeboard: bool,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
self.flight = flight
|
self.flight = flight
|
||||||
self.comms = list(comms)
|
self.comms = list(comms)
|
||||||
@@ -262,16 +252,11 @@ class BriefingPage(KneeboardPage):
|
|||||||
self.tankers = tankers
|
self.tankers = tankers
|
||||||
self.jtacs = jtacs
|
self.jtacs = jtacs
|
||||||
self.start_time = start_time
|
self.start_time = start_time
|
||||||
self.dark_kneeboard = dark_kneeboard
|
|
||||||
self.comms.append(CommInfo("Flight", self.flight.intra_flight_channel))
|
self.comms.append(CommInfo("Flight", self.flight.intra_flight_channel))
|
||||||
|
|
||||||
def write(self, path: Path) -> None:
|
def write(self, path: Path) -> None:
|
||||||
writer = KneeboardPageWriter(dark_theme=self.dark_kneeboard)
|
writer = KneeboardPageWriter()
|
||||||
if self.flight.custom_name is not None:
|
writer.title(f"{self.flight.callsign} Mission Info")
|
||||||
custom_name_title = ' ("{}")'.format(self.flight.custom_name)
|
|
||||||
else:
|
|
||||||
custom_name_title = ""
|
|
||||||
writer.title(f"{self.flight.callsign} Mission Info{custom_name_title}")
|
|
||||||
|
|
||||||
# TODO: Handle carriers.
|
# TODO: Handle carriers.
|
||||||
writer.heading("Airfield Info")
|
writer.heading("Airfield Info")
|
||||||
@@ -304,34 +289,6 @@ class BriefingPage(KneeboardPage):
|
|||||||
["Bingo", "Joker"],
|
["Bingo", "Joker"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# AEW&C
|
|
||||||
writer.heading("AEW&C")
|
|
||||||
aewc_ladder = []
|
|
||||||
|
|
||||||
for single_aewc in self.awacs:
|
|
||||||
|
|
||||||
if single_aewc.depature_location is None:
|
|
||||||
dep = "-"
|
|
||||||
arr = "-"
|
|
||||||
else:
|
|
||||||
dep = self._format_time(single_aewc.start_time)
|
|
||||||
arr = self._format_time(single_aewc.end_time)
|
|
||||||
|
|
||||||
aewc_ladder.append(
|
|
||||||
[
|
|
||||||
str(single_aewc.callsign),
|
|
||||||
str(single_aewc.freq),
|
|
||||||
str(single_aewc.depature_location),
|
|
||||||
str(dep),
|
|
||||||
str(arr),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
writer.table(
|
|
||||||
aewc_ladder,
|
|
||||||
headers=["Callsign", "FREQ", "Depature", "ETD", "ETA"],
|
|
||||||
)
|
|
||||||
|
|
||||||
# Package Section
|
# Package Section
|
||||||
writer.heading("Comm ladder")
|
writer.heading("Comm ladder")
|
||||||
comm_ladder = []
|
comm_ladder = []
|
||||||
@@ -340,6 +297,10 @@ class BriefingPage(KneeboardPage):
|
|||||||
[comm.name, "", "", "", self.format_frequency(comm.freq)]
|
[comm.name, "", "", "", self.format_frequency(comm.freq)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for a in self.awacs:
|
||||||
|
comm_ladder.append(
|
||||||
|
[a.callsign, "AWACS", "", "", self.format_frequency(a.freq)]
|
||||||
|
)
|
||||||
for tanker in self.tankers:
|
for tanker in self.tankers:
|
||||||
comm_ladder.append(
|
comm_ladder.append(
|
||||||
[
|
[
|
||||||
@@ -408,21 +369,12 @@ class BriefingPage(KneeboardPage):
|
|||||||
channel_name = namer.channel_name(channel.radio_id, channel.channel)
|
channel_name = namer.channel_name(channel.radio_id, channel.channel)
|
||||||
return f"{channel_name} {frequency}"
|
return f"{channel_name} {frequency}"
|
||||||
|
|
||||||
def _format_time(self, time: Optional[datetime.timedelta]) -> str:
|
|
||||||
if time is None:
|
|
||||||
return ""
|
|
||||||
local_time = self.start_time + time
|
|
||||||
return local_time.strftime(f"%H:%M:%S")
|
|
||||||
|
|
||||||
|
|
||||||
class KneeboardGenerator(MissionInfoGenerator):
|
class KneeboardGenerator(MissionInfoGenerator):
|
||||||
"""Creates kneeboard pages for each client flight in the mission."""
|
"""Creates kneeboard pages for each client flight in the mission."""
|
||||||
|
|
||||||
def __init__(self, mission: Mission, game: "Game") -> None:
|
def __init__(self, mission: Mission, game: "Game") -> None:
|
||||||
super().__init__(mission, game)
|
super().__init__(mission, game)
|
||||||
self.dark_kneeboard = self.game.settings.generate_dark_kneeboard and (
|
|
||||||
self.mission.start_time.hour > 19 or self.mission.start_time.hour < 7
|
|
||||||
)
|
|
||||||
|
|
||||||
def generate(self) -> None:
|
def generate(self) -> None:
|
||||||
"""Generates a kneeboard per client flight."""
|
"""Generates a kneeboard per client flight."""
|
||||||
@@ -466,6 +418,5 @@ class KneeboardGenerator(MissionInfoGenerator):
|
|||||||
self.tankers,
|
self.tankers,
|
||||||
self.jtacs,
|
self.jtacs,
|
||||||
self.mission.start_time,
|
self.mission.start_time,
|
||||||
self.dark_kneeboard,
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from gen.locations.preset_locations import PresetLocation
|
|||||||
class PresetControlPointLocations:
|
class PresetControlPointLocations:
|
||||||
"""A repository of preset locations for a given control point"""
|
"""A repository of preset locations for a given control point"""
|
||||||
|
|
||||||
# List of possible ashore locations to generate objects (Represented in miz file by an APC_AAV_7_Amphibious)
|
# List of possible ashore locations to generate objects (Represented in miz file by an APC_AAV_7)
|
||||||
ashore_locations: List[PresetLocation] = field(default_factory=list)
|
ashore_locations: List[PresetLocation] = field(default_factory=list)
|
||||||
|
|
||||||
# List of possible offshore locations to generate ship groups (Represented in miz file by an Oliver Hazard Perry)
|
# List of possible offshore locations to generate ship groups (Represented in miz file by an Oliver Hazard Perry)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class MizDataLocationFinder:
|
|||||||
for ship_group in m.country("USA").ship_group:
|
for ship_group in m.country("USA").ship_group:
|
||||||
if (
|
if (
|
||||||
len(ship_group.units) > 0
|
len(ship_group.units) > 0
|
||||||
and ship_group.units[0].type == ships.FFG_Oliver_Hazzard_Perry.id
|
and ship_group.units[0].type == ships.Oliver_Hazzard_Perry_class.id
|
||||||
):
|
):
|
||||||
offshore_locations.append(
|
offshore_locations.append(
|
||||||
PresetLocation(
|
PresetLocation(
|
||||||
@@ -68,8 +68,7 @@ class MizDataLocationFinder:
|
|||||||
for vehicle_group in m.country("Iran").vehicle_group:
|
for vehicle_group in m.country("Iran").vehicle_group:
|
||||||
if (
|
if (
|
||||||
len(vehicle_group.units) > 0
|
len(vehicle_group.units) > 0
|
||||||
and vehicle_group.units[0].type
|
and vehicle_group.units[0].type == MissilesSS.SS_N_2_Silkworm.id
|
||||||
== MissilesSS.AShM_SS_N_2_Silkworm.id
|
|
||||||
):
|
):
|
||||||
antiship_locations.append(
|
antiship_locations.append(
|
||||||
PresetLocation(
|
PresetLocation(
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ MISSILES_MAP = {"V1GroupGenerator": V1GroupGenerator, "ScudGenerator": ScudGener
|
|||||||
|
|
||||||
def generate_missile_group(game, ground_object, faction_name: str):
|
def generate_missile_group(game, ground_object, faction_name: str):
|
||||||
"""
|
"""
|
||||||
This generate a missiles group
|
This generate a ship group
|
||||||
:return: Nothing, but put the group reference inside the ground object
|
:return: Nothing, but put the group reference inside the ground object
|
||||||
"""
|
"""
|
||||||
faction = db.FACTIONS[faction_name]
|
faction = db.FACTIONS[faction_name]
|
||||||
|
|||||||
@@ -14,21 +14,21 @@ class ScudGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Scuds
|
# Scuds
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_SS_1C_Scud_B,
|
MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M,
|
||||||
"V1#0",
|
"V1#0",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_SS_1C_Scud_B,
|
MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M,
|
||||||
"V1#1",
|
"V1#1",
|
||||||
self.position.x + 50,
|
self.position.x + 50,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_SS_1C_Scud_B,
|
MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M,
|
||||||
"V1#2",
|
"V1#2",
|
||||||
self.position.x + 100,
|
self.position.x + 100,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
@@ -37,7 +37,7 @@ class ScudGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Commander
|
# Commander
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_UAZ_469_Jeep,
|
Unarmed.Transport_UAZ_469,
|
||||||
"Kubel#0",
|
"Kubel#0",
|
||||||
self.position.x - 35,
|
self.position.x - 35,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
@@ -46,7 +46,7 @@ class ScudGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Shorad
|
# Shorad
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
"SHILKA#0",
|
"SHILKA#0",
|
||||||
self.position.x - 55,
|
self.position.x - 55,
|
||||||
self.position.y - 38,
|
self.position.y - 38,
|
||||||
@@ -54,7 +54,7 @@ class ScudGenerator(GroupGenerator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
"STRELA#0",
|
"STRELA#0",
|
||||||
self.position.x + 200,
|
self.position.x + 200,
|
||||||
self.position.y + 15,
|
self.position.y + 15,
|
||||||
|
|||||||
@@ -14,21 +14,21 @@ class V1GroupGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Ramps
|
# Ramps
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_V_1_Launcher,
|
MissilesSS.V_1_ramp,
|
||||||
"V1#0",
|
"V1#0",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_V_1_Launcher,
|
MissilesSS.V_1_ramp,
|
||||||
"V1#1",
|
"V1#1",
|
||||||
self.position.x + 50,
|
self.position.x + 50,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
MissilesSS.SSM_V_1_Launcher,
|
MissilesSS.V_1_ramp,
|
||||||
"V1#2",
|
"V1#2",
|
||||||
self.position.x + 100,
|
self.position.x + 100,
|
||||||
self.position.y + random.randint(1, 8),
|
self.position.y + random.randint(1, 8),
|
||||||
@@ -37,7 +37,7 @@ class V1GroupGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Commander
|
# Commander
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_Kubelwagen_82,
|
Unarmed.Kübelwagen_82,
|
||||||
"Kubel#0",
|
"Kubel#0",
|
||||||
self.position.x - 35,
|
self.position.x - 35,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
@@ -46,7 +46,7 @@ class V1GroupGenerator(GroupGenerator):
|
|||||||
|
|
||||||
# Self defense flak
|
# Self defense flak
|
||||||
flak_unit = random.choice(
|
flak_unit = random.choice(
|
||||||
[AirDefence.AAA_Flak_Vierling_38_Quad_20mm, AirDefence.AAA_Flak_38_20mm]
|
[AirDefence.AAA_Flak_Vierling_38, AirDefence.AAA_Flak_38]
|
||||||
)
|
)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
@@ -58,7 +58,7 @@ class V1GroupGenerator(GroupGenerator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_Opel_Blitz,
|
Unarmed.Blitz_3_6_6700A,
|
||||||
"Blitz#0",
|
"Blitz#0",
|
||||||
self.position.x + 200,
|
self.position.x + 200,
|
||||||
self.position.y + 15,
|
self.position.y + 15,
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ ANIMALS = [
|
|||||||
"MAMBA",
|
"MAMBA",
|
||||||
"DOLPHIN",
|
"DOLPHIN",
|
||||||
"PHEASANT",
|
"PHEASANT",
|
||||||
"ARMADILLO",
|
"ARMADILLLO",
|
||||||
"RACOON",
|
"RACOON",
|
||||||
"ZEBRA",
|
"ZEBRA",
|
||||||
"COW",
|
"COW",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class BoforsGenerator(AirDefenseGroupGenerator):
|
|||||||
for j in range(grid_y):
|
for j in range(grid_y):
|
||||||
index = index + 1
|
index = index + 1
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_40mm_Bofors,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
"AAA#" + str(index),
|
"AAA#" + str(index),
|
||||||
self.position.x + spacing * i,
|
self.position.x + spacing * i,
|
||||||
self.position.y + spacing * j,
|
self.position.y + spacing * j,
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ from gen.sam.airdefensegroupgenerator import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
GFLAK = [
|
GFLAK = [
|
||||||
AirDefence.AAA_Flak_Vierling_38_Quad_20mm,
|
AirDefence.AAA_Flak_Vierling_38,
|
||||||
AirDefence.AAA_8_8cm_Flak_18,
|
AirDefence.AAA_8_8cm_Flak_18,
|
||||||
AirDefence.AAA_8_8cm_Flak_36,
|
AirDefence.AAA_8_8cm_Flak_36,
|
||||||
AirDefence.AAA_8_8cm_Flak_37,
|
AirDefence.AAA_8_8cm_Flak_37,
|
||||||
AirDefence.AAA_8_8cm_Flak_41,
|
AirDefence.AAA_8_8cm_Flak_41,
|
||||||
AirDefence.AAA_Flak_38_20mm,
|
AirDefence.AAA_Flak_38,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
search_pos = self.get_circular_position(random.randint(2, 3), 80)
|
search_pos = self.get_circular_position(random.randint(2, 3), 80)
|
||||||
for index, pos in enumerate(search_pos):
|
for index, pos in enumerate(search_pos):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SL_Flakscheinwerfer_37,
|
AirDefence.Flak_Searchlight_37,
|
||||||
"SearchLight#" + str(index),
|
"SearchLight#" + str(index),
|
||||||
pos[0],
|
pos[0],
|
||||||
pos[1],
|
pos[1],
|
||||||
@@ -62,14 +62,14 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
# Support
|
# Support
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.PU_Maschinensatz_33,
|
AirDefence.Maschinensatz_33,
|
||||||
"MC33#",
|
"MC33#",
|
||||||
self.position.x - 20,
|
self.position.x - 20,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_SP_Kdo_G_40,
|
AirDefence.AAA_Kdo_G_40,
|
||||||
"KDO#",
|
"KDO#",
|
||||||
self.position.x - 25,
|
self.position.x - 25,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
@@ -78,7 +78,7 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
# Commander
|
# Commander
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_Kubelwagen_82,
|
Unarmed.Kübelwagen_82,
|
||||||
"Kubel#",
|
"Kubel#",
|
||||||
self.position.x - 35,
|
self.position.x - 35,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
@@ -89,7 +89,7 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
for i in range(int(max(1, grid_x / 2))):
|
for i in range(int(max(1, grid_x / 2))):
|
||||||
for j in range(int(max(1, grid_x / 2))):
|
for j in range(int(max(1, grid_x / 2))):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_Opel_Blitz,
|
Unarmed.Blitz_3_6_6700A,
|
||||||
"BLITZ#" + str(index),
|
"BLITZ#" + str(index),
|
||||||
self.position.x + 125 + 15 * i + random.randint(1, 5),
|
self.position.x + 125 + 15 * i + random.randint(1, 5),
|
||||||
self.position.y + 15 * j + random.randint(1, 5),
|
self.position.y + 15 * j + random.randint(1, 5),
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class Flak18Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
# Add a commander truck
|
# Add a commander truck
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_Opel_Blitz,
|
Unarmed.Blitz_3_6_6700A,
|
||||||
"Blitz#",
|
"Blitz#",
|
||||||
self.position.x - 35,
|
self.position.x - 35,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
positions = self.get_circular_position(4, launcher_distance=30, coverage=360)
|
positions = self.get_circular_position(4, launcher_distance=30, coverage=360)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_QF_3_7,
|
AirDefence.AA_gun_QF_3_7,
|
||||||
"AA#" + str(i),
|
"AA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
@@ -41,7 +41,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
positions = self.get_circular_position(8, launcher_distance=90, coverage=360)
|
positions = self.get_circular_position(8, launcher_distance=90, coverage=360)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_M45_Quadmount_HB_12_7mm,
|
AirDefence.AAA_M45_Quadmount,
|
||||||
"AA#" + str(12 + i),
|
"AA#" + str(12 + i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
@@ -50,28 +50,28 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
# Add a commander truck
|
# Add a commander truck
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Car_Willys_Jeep,
|
Unarmed.Willys_MB,
|
||||||
"CMD#1",
|
"CMD#1",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
random.randint(0, 360),
|
random.randint(0, 360),
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Carrier_M30_Cargo,
|
Armor.M30_Cargo_Carrier,
|
||||||
"LOG#1",
|
"LOG#1",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y + 20,
|
self.position.y + 20,
|
||||||
random.randint(0, 360),
|
random.randint(0, 360),
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Tractor_M4_Hi_Speed,
|
Armor.M4_Tractor,
|
||||||
"LOG#2",
|
"LOG#2",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
random.randint(0, 360),
|
random.randint(0, 360),
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_Bedford,
|
Unarmed.Bedford_MWD,
|
||||||
"LOG#3",
|
"LOG#3",
|
||||||
self.position.x - 20,
|
self.position.x - 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class ZSU57Generator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_ZSU_57_2,
|
AirDefence.AAA_ZSU_57_2,
|
||||||
"SPAA#" + str(i),
|
"SPAA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator):
|
|||||||
for j in range(grid_y):
|
for j in range(grid_y):
|
||||||
index = index + 1
|
index = index + 1
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent,
|
AirDefence.AAA_ZU_23_Insurgent_Closed,
|
||||||
"AAA#" + str(index),
|
"AAA#" + str(index),
|
||||||
self.position.x + spacing * i,
|
self.position.x + spacing * i,
|
||||||
self.position.y + spacing * j,
|
self.position.y + spacing * j,
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ from gen.sam.group_generator import GroupGenerator
|
|||||||
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||||
"""
|
"""
|
||||||
This generator attempt to mimic an early cold-war era flak AAA site.
|
This generator attempt to mimic an early cold-war era flak AAA site.
|
||||||
The Flak 18 88mm is used as the main long range gun, S-60 is used as a mid range gun and 2 Bofors 40mm guns provide short range protection.
|
The Flak 18 88mm is used as the main long range gun and 2 Bofors 40mm guns provide short range protection.
|
||||||
|
|
||||||
This does not include search lights and telemeter computer (Kdo.G 40) because these are paid units only available in WW2 asset pack
|
This does not include search lights and telemeter computer (Kdo.G 40) because these are paid units only available in WW2 asset pack
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Early Cold War Flak Site"
|
name = "Early Cold War Flak Site"
|
||||||
price = 74
|
price = 58
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
|
|
||||||
@@ -37,41 +37,25 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
|||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Medium range guns
|
# Short range guns
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_S_60_57mm,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
"SHO#1",
|
"SHO#1",
|
||||||
self.position.x - 40,
|
self.position.x - 40,
|
||||||
self.position.y - 40,
|
self.position.y - 40,
|
||||||
self.heading + 180,
|
self.heading + 180,
|
||||||
),
|
),
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_S_60_57mm,
|
AirDefence.AAA_Bofors_40mm,
|
||||||
"SHO#2",
|
"SHO#2",
|
||||||
self.position.x + spacing * 2 + 40,
|
self.position.x + spacing * 2 + 40,
|
||||||
self.position.y + spacing + 40,
|
self.position.y + spacing + 40,
|
||||||
self.heading,
|
self.heading,
|
||||||
),
|
),
|
||||||
|
|
||||||
# Short range guns
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
|
||||||
"SHO#3",
|
|
||||||
self.position.x - 80,
|
|
||||||
self.position.y - 40,
|
|
||||||
self.heading + 180,
|
|
||||||
),
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
|
||||||
"SHO#4",
|
|
||||||
self.position.x + spacing * 2 + 80,
|
|
||||||
self.position.y + spacing + 40,
|
|
||||||
self.heading,
|
|
||||||
),
|
|
||||||
|
|
||||||
# Add a truck
|
# Add a truck
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
Unarmed.Transport_KAMAZ_43101,
|
||||||
"Truck#",
|
"Truck#",
|
||||||
self.position.x - 60,
|
self.position.x - 60,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
@@ -86,7 +70,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
|||||||
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||||
"""
|
"""
|
||||||
This generator attempt to mimic a cold-war era flak AAA site.
|
This generator attempt to mimic a cold-war era flak AAA site.
|
||||||
The Flak 18 88mm is used as the main long range gun, 2 S-60 57mm gun improve mid range firepower, while 2 Zu-23 guns even provide short range protection.
|
The Flak 18 88mm is used as the main long range gun while 2 Zu-23 guns provide short range protection.
|
||||||
The site is also fitted with a P-19 radar for early detection.
|
The site is also fitted with a P-19 radar for early detection.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -110,41 +94,25 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
|||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Medium range guns
|
# Short range guns
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_S_60_57mm,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
"SHO#1",
|
"SHO#1",
|
||||||
self.position.x - 40,
|
self.position.x - 40,
|
||||||
self.position.y - 40,
|
self.position.y - 40,
|
||||||
self.heading + 180,
|
self.heading + 180,
|
||||||
),
|
),
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_S_60_57mm,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
"SHO#2",
|
"SHO#2",
|
||||||
self.position.x + spacing * 2 + 40,
|
self.position.x + spacing * 2 + 40,
|
||||||
self.position.y + spacing + 40,
|
self.position.y + spacing + 40,
|
||||||
self.heading,
|
self.heading,
|
||||||
),
|
),
|
||||||
|
|
||||||
# Short range guns
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
|
||||||
"SHO#3",
|
|
||||||
self.position.x - 80,
|
|
||||||
self.position.y - 40,
|
|
||||||
self.heading + 180,
|
|
||||||
),
|
|
||||||
self.add_unit(
|
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
|
||||||
"SHO#4",
|
|
||||||
self.position.x + spacing * 2 + 80,
|
|
||||||
self.position.y + spacing + 40,
|
|
||||||
self.heading,
|
|
||||||
),
|
|
||||||
|
|
||||||
# Add a P19 Radar for EWR
|
# Add a P19 Radar for EWR
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3,
|
AirDefence.SAM_SR_P_19,
|
||||||
"SR#0",
|
"SR#0",
|
||||||
self.position.x - 60,
|
self.position.x - 60,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
|
|||||||
@@ -1,63 +0,0 @@
|
|||||||
import random
|
|
||||||
from typing import List, Optional, Type
|
|
||||||
|
|
||||||
from dcs.unitgroup import VehicleGroup
|
|
||||||
|
|
||||||
from game import Game
|
|
||||||
from game.factions.faction import Faction
|
|
||||||
from game.theater.theatergroundobject import EwrGroundObject
|
|
||||||
from gen.sam.ewrs import (
|
|
||||||
BigBirdGenerator,
|
|
||||||
BoxSpringGenerator,
|
|
||||||
DogEarGenerator,
|
|
||||||
FlatFaceGenerator,
|
|
||||||
HawkEwrGenerator,
|
|
||||||
PatriotEwrGenerator,
|
|
||||||
RolandEwrGenerator,
|
|
||||||
SnowDriftGenerator,
|
|
||||||
StraightFlushGenerator,
|
|
||||||
TallRackGenerator,
|
|
||||||
)
|
|
||||||
from gen.sam.group_generator import GroupGenerator
|
|
||||||
|
|
||||||
EWR_MAP = {
|
|
||||||
"BoxSpringGenerator": BoxSpringGenerator,
|
|
||||||
"TallRackGenerator": TallRackGenerator,
|
|
||||||
"DogEarGenerator": DogEarGenerator,
|
|
||||||
"RolandEwrGenerator": RolandEwrGenerator,
|
|
||||||
"FlatFaceGenerator": FlatFaceGenerator,
|
|
||||||
"PatriotEwrGenerator": PatriotEwrGenerator,
|
|
||||||
"BigBirdGenerator": BigBirdGenerator,
|
|
||||||
"SnowDriftGenerator": SnowDriftGenerator,
|
|
||||||
"StraightFlushGenerator": StraightFlushGenerator,
|
|
||||||
"HawkEwrGenerator": HawkEwrGenerator,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_faction_possible_ewrs_generator(
|
|
||||||
faction: Faction,
|
|
||||||
) -> List[Type[GroupGenerator]]:
|
|
||||||
"""
|
|
||||||
Return the list of possible EWR generators for the given faction
|
|
||||||
:param faction: Faction name to search units for
|
|
||||||
"""
|
|
||||||
return [EWR_MAP[s] for s in faction.ewrs]
|
|
||||||
|
|
||||||
|
|
||||||
def generate_ewr_group(
|
|
||||||
game: Game, ground_object: EwrGroundObject, faction: Faction
|
|
||||||
) -> Optional[VehicleGroup]:
|
|
||||||
"""Generates an early warning radar group.
|
|
||||||
|
|
||||||
:param game: The Game.
|
|
||||||
:param ground_object: The ground object which will own the EWR group.
|
|
||||||
:param faction: Owner faction.
|
|
||||||
:return: The generated group, or None if one could not be generated.
|
|
||||||
"""
|
|
||||||
generators = get_faction_possible_ewrs_generator(faction)
|
|
||||||
if len(generators) > 0:
|
|
||||||
generator_class = random.choice(generators)
|
|
||||||
generator = generator_class(game, ground_object)
|
|
||||||
generator.generate()
|
|
||||||
return generator.get_generated_group()
|
|
||||||
return None
|
|
||||||
@@ -33,7 +33,7 @@ class DogEarGenerator(EwrGenerator):
|
|||||||
This is the SA-8 search radar, but used as an early warning radar.
|
This is the SA-8 search radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.MCC_SR_Sborka_Dog_Ear_SR
|
unit_type = AirDefence.CP_9S80M1_Sborka
|
||||||
|
|
||||||
|
|
||||||
class RolandEwrGenerator(EwrGenerator):
|
class RolandEwrGenerator(EwrGenerator):
|
||||||
@@ -51,7 +51,7 @@ class FlatFaceGenerator(EwrGenerator):
|
|||||||
This is the SA-3 search radar, but used as an early warning radar.
|
This is the SA-3 search radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_P19_Flat_Face_SR__SA_2_3
|
unit_type = AirDefence.SAM_SR_P_19
|
||||||
|
|
||||||
|
|
||||||
class PatriotEwrGenerator(EwrGenerator):
|
class PatriotEwrGenerator(EwrGenerator):
|
||||||
@@ -60,7 +60,7 @@ class PatriotEwrGenerator(EwrGenerator):
|
|||||||
This is the Patriot search/track radar, but used as an early warning radar.
|
This is the Patriot search/track radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_Patriot_STR
|
unit_type = AirDefence.SAM_Patriot_STR_AN_MPQ_53
|
||||||
|
|
||||||
|
|
||||||
class BigBirdGenerator(EwrGenerator):
|
class BigBirdGenerator(EwrGenerator):
|
||||||
@@ -69,7 +69,7 @@ class BigBirdGenerator(EwrGenerator):
|
|||||||
This is the SA-10 track radar, but used as an early warning radar.
|
This is the SA-10 track radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR
|
unit_type = AirDefence.SAM_SA_10_S_300PS_SR_64H6E
|
||||||
|
|
||||||
|
|
||||||
class SnowDriftGenerator(EwrGenerator):
|
class SnowDriftGenerator(EwrGenerator):
|
||||||
@@ -78,7 +78,7 @@ class SnowDriftGenerator(EwrGenerator):
|
|||||||
This is the SA-11 search radar, but used as an early warning radar.
|
This is the SA-11 search radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR
|
unit_type = AirDefence.SAM_SA_11_Buk_SR_9S18M1
|
||||||
|
|
||||||
|
|
||||||
class StraightFlushGenerator(EwrGenerator):
|
class StraightFlushGenerator(EwrGenerator):
|
||||||
@@ -87,7 +87,7 @@ class StraightFlushGenerator(EwrGenerator):
|
|||||||
This is the SA-6 search/track radar, but used as an early warning radar.
|
This is the SA-6 search/track radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_SA_6_Kub_Long_Track_STR
|
unit_type = AirDefence.SAM_SA_6_Kub_STR_9S91
|
||||||
|
|
||||||
|
|
||||||
class HawkEwrGenerator(EwrGenerator):
|
class HawkEwrGenerator(EwrGenerator):
|
||||||
@@ -96,4 +96,4 @@ class HawkEwrGenerator(EwrGenerator):
|
|||||||
This is the Hawk search radar, but used as an early warning radar.
|
This is the Hawk search radar, but used as an early warning radar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
unit_type = AirDefence.SAM_Hawk_SR__AN_MPQ_50
|
unit_type = AirDefence.SAM_Hawk_SR_AN_MPQ_50
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class FreyaGenerator(AirDefenseGroupGenerator):
|
|||||||
positions = self.get_circular_position(4, launcher_distance=50, coverage=360)
|
positions = self.get_circular_position(4, launcher_distance=50, coverage=360)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_Flak_Vierling_38_Quad_20mm,
|
AirDefence.AAA_Flak_Vierling_38,
|
||||||
"AA#" + str(i),
|
"AA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
@@ -47,37 +47,37 @@ class FreyaGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
# Command/Logi
|
# Command/Logi
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_Kubelwagen_82,
|
Unarmed.Kübelwagen_82,
|
||||||
"Kubel#1",
|
"Kubel#1",
|
||||||
self.position.x - 20,
|
self.position.x - 20,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Carrier_Sd_Kfz_7_Tractor,
|
Unarmed.Sd_Kfz_7,
|
||||||
"Sdkfz#1",
|
"Sdkfz#1",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y + 22,
|
self.position.y + 22,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_Kettenrad,
|
Unarmed.Sd_Kfz_2,
|
||||||
"Sdkfz#2",
|
"Sdkfz#2",
|
||||||
self.position.x - 22,
|
self.position.x - 22,
|
||||||
self.position.y + 20,
|
self.position.y + 20,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
|
|
||||||
# PU_Maschinensatz_33 and Kdo.g 40 Telemeter
|
# Maschinensatz_33 and Kdo.g 40 Telemeter
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.PU_Maschinensatz_33,
|
AirDefence.Maschinensatz_33,
|
||||||
"Energy#1",
|
"Energy#1",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y - 20,
|
self.position.y - 20,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_SP_Kdo_G_40,
|
AirDefence.AAA_Kdo_G_40,
|
||||||
"Telemeter#1",
|
"Telemeter#1",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y - 10,
|
self.position.y - 10,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class AvengerGenerator(AirDefenseGroupGenerator):
|
|||||||
num_launchers = random.randint(2, 3)
|
num_launchers = random.randint(2, 3)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -31,7 +31,7 @@ class AvengerGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Avenger__Stinger,
|
AirDefence.SAM_Avenger_M1097,
|
||||||
"SPAA#" + str(i),
|
"SPAA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class ChaparralGenerator(AirDefenseGroupGenerator):
|
|||||||
num_launchers = random.randint(2, 4)
|
num_launchers = random.randint(2, 4)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class GepardGenerator(AirDefenseGroupGenerator):
|
|||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 80,
|
self.position.x + 80,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from dcs.vehicles import AirDefence
|
|||||||
|
|
||||||
from game import Game
|
from game import Game
|
||||||
from game.factions.faction import Faction
|
from game.factions.faction import Faction
|
||||||
|
from game.theater import TheaterGroundObject
|
||||||
from game.theater.theatergroundobject import SamGroundObject
|
from game.theater.theatergroundobject import SamGroundObject
|
||||||
from gen.sam.aaa_bofors import BoforsGenerator
|
from gen.sam.aaa_bofors import BoforsGenerator
|
||||||
from gen.sam.aaa_flak import FlakGenerator
|
from gen.sam.aaa_flak import FlakGenerator
|
||||||
@@ -22,7 +23,20 @@ from gen.sam.cold_war_flak import (
|
|||||||
ColdWarFlakGenerator,
|
ColdWarFlakGenerator,
|
||||||
EarlyColdWarFlakGenerator,
|
EarlyColdWarFlakGenerator,
|
||||||
)
|
)
|
||||||
|
from gen.sam.ewrs import (
|
||||||
|
BigBirdGenerator,
|
||||||
|
BoxSpringGenerator,
|
||||||
|
DogEarGenerator,
|
||||||
|
FlatFaceGenerator,
|
||||||
|
HawkEwrGenerator,
|
||||||
|
PatriotEwrGenerator,
|
||||||
|
RolandEwrGenerator,
|
||||||
|
SnowDriftGenerator,
|
||||||
|
StraightFlushGenerator,
|
||||||
|
TallRackGenerator,
|
||||||
|
)
|
||||||
from gen.sam.freya_ewr import FreyaGenerator
|
from gen.sam.freya_ewr import FreyaGenerator
|
||||||
|
from gen.sam.group_generator import GroupGenerator
|
||||||
from gen.sam.sam_avenger import AvengerGenerator
|
from gen.sam.sam_avenger import AvengerGenerator
|
||||||
from gen.sam.sam_chaparral import ChaparralGenerator
|
from gen.sam.sam_chaparral import ChaparralGenerator
|
||||||
from gen.sam.sam_gepard import GepardGenerator
|
from gen.sam.sam_gepard import GepardGenerator
|
||||||
@@ -105,39 +119,52 @@ SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = {
|
|||||||
|
|
||||||
|
|
||||||
SAM_PRICES = {
|
SAM_PRICES = {
|
||||||
AirDefence.SAM_Hawk_Generator__PCP: 35,
|
AirDefence.SAM_Hawk_PCP: 35,
|
||||||
AirDefence.AAA_ZU_23_Emplacement: 10,
|
AirDefence.AAA_ZU_23_Emplacement: 10,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement: 10,
|
AirDefence.AAA_ZU_23_Closed: 10,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 10,
|
AirDefence.AAA_ZU_23_on_Ural_375: 10,
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 10,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375: 10,
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 10,
|
AirDefence.AAA_ZU_23_Insurgent_Closed: 10,
|
||||||
AirDefence.AAA_ZU_23_Insurgent: 10,
|
AirDefence.AAA_ZU_23_Insurgent: 10,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish: 10,
|
AirDefence.SPAAA_ZSU_23_4_Shilka: 10,
|
||||||
AirDefence.SPAAA_Vulcan_M163: 15,
|
AirDefence.AAA_Vulcan_M163: 15,
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6: 20,
|
AirDefence.SAM_Linebacker_M6: 20,
|
||||||
AirDefence.SAM_Rapier_LN: 20,
|
AirDefence.Rapier_FSA_Launcher: 20,
|
||||||
AirDefence.SAM_Avenger__Stinger: 22,
|
AirDefence.SAM_Avenger_M1097: 22,
|
||||||
AirDefence.SPAAA_Gepard: 24,
|
AirDefence.SPAAA_Gepard: 24,
|
||||||
AirDefence.SAM_Roland_ADS: 40,
|
AirDefence.SAM_Roland_ADS: 40,
|
||||||
AirDefence.SAM_Patriot_LN: 85,
|
AirDefence.SAM_Patriot_LN_M901: 85,
|
||||||
AirDefence.SAM_Patriot_EPP_III: 85,
|
AirDefence.SAM_Patriot_EPP_III: 85,
|
||||||
AirDefence.SAM_Chaparral_M48: 25,
|
AirDefence.SAM_Chaparral_M48: 25,
|
||||||
AirDefence.AAA_40mm_Bofors: 15,
|
AirDefence.AAA_Bofors_40mm: 15,
|
||||||
AirDefence.AAA_8_8cm_Flak_36: 15,
|
AirDefence.AAA_8_8cm_Flak_36: 15,
|
||||||
AirDefence.SAM_SA_2_S_75_Guideline_LN: 30,
|
AirDefence.SAM_SA_2_LN_SM_90: 30,
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN: 35,
|
AirDefence.SAM_SA_3_S_125_LN_5P73: 35,
|
||||||
AirDefence.SAM_SA_6_Kub_Gainful_TEL: 45,
|
AirDefence.SAM_SA_6_Kub_LN_2P25: 45,
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL: 30,
|
AirDefence.SAM_SA_8_Osa_9A33: 30,
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL: 25,
|
AirDefence.SAM_SA_9_Strela_1_9P31: 25,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: 80,
|
AirDefence.SAM_SA_10_S_300PS_LN_5P85C: 80,
|
||||||
AirDefence.SAM_SA_10_S_300_Grumble_C2: 80,
|
AirDefence.SAM_SA_10_S_300PS_CP_54K6: 80,
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL: 60,
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1: 60,
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL: 30,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 30,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet: 40,
|
AirDefence.SAM_SA_15_Tor_9A331: 40,
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison: 35,
|
AirDefence.SAM_SA_19_Tunguska_2S6: 35,
|
||||||
AirDefence.HQ_7_Self_Propelled_LN: 35,
|
AirDefence.HQ_7_Self_Propelled_LN: 35,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EWR_MAP = {
|
||||||
|
"BoxSpringGenerator": BoxSpringGenerator,
|
||||||
|
"TallRackGenerator": TallRackGenerator,
|
||||||
|
"DogEarGenerator": DogEarGenerator,
|
||||||
|
"RolandEwrGenerator": RolandEwrGenerator,
|
||||||
|
"FlatFaceGenerator": FlatFaceGenerator,
|
||||||
|
"PatriotEwrGenerator": PatriotEwrGenerator,
|
||||||
|
"BigBirdGenerator": BigBirdGenerator,
|
||||||
|
"SnowDriftGenerator": SnowDriftGenerator,
|
||||||
|
"StraightFlushGenerator": StraightFlushGenerator,
|
||||||
|
"HawkEwrGenerator": HawkEwrGenerator,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_faction_possible_sams_generator(
|
def get_faction_possible_sams_generator(
|
||||||
faction: Faction,
|
faction: Faction,
|
||||||
@@ -149,6 +176,14 @@ def get_faction_possible_sams_generator(
|
|||||||
return [SAM_MAP[s] for s in faction.air_defenses]
|
return [SAM_MAP[s] for s in faction.air_defenses]
|
||||||
|
|
||||||
|
|
||||||
|
def get_faction_possible_ewrs_generator(faction: Faction) -> List[Type[GroupGenerator]]:
|
||||||
|
"""
|
||||||
|
Return the list of possible SAM generator for the given faction
|
||||||
|
:param faction: Faction name to search units for
|
||||||
|
"""
|
||||||
|
return [EWR_MAP[s] for s in faction.ewrs]
|
||||||
|
|
||||||
|
|
||||||
def _generate_anti_air_from(
|
def _generate_anti_air_from(
|
||||||
generators: Sequence[Type[AirDefenseGroupGenerator]],
|
generators: Sequence[Type[AirDefenseGroupGenerator]],
|
||||||
game: Game,
|
game: Game,
|
||||||
@@ -201,3 +236,22 @@ def generate_anti_air_group(
|
|||||||
if groups:
|
if groups:
|
||||||
return groups
|
return groups
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def generate_ewr_group(
|
||||||
|
game: Game, ground_object: TheaterGroundObject, faction: Faction
|
||||||
|
) -> Optional[VehicleGroup]:
|
||||||
|
"""Generates an early warning radar group.
|
||||||
|
|
||||||
|
:param game: The Game.
|
||||||
|
:param ground_object: The ground object which will own the EWR group.
|
||||||
|
:param faction: Owner faction.
|
||||||
|
:return: The generated group, or None if one could not be generated.
|
||||||
|
"""
|
||||||
|
generators = get_faction_possible_ewrs_generator(faction)
|
||||||
|
if len(generators) > 0:
|
||||||
|
generator_class = random.choice(generators)
|
||||||
|
generator = generator_class(game, ground_object)
|
||||||
|
generator.generate()
|
||||||
|
return generator.get_generated_group()
|
||||||
|
return None
|
||||||
|
|||||||
@@ -19,21 +19,21 @@ class HawkGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Hawk_SR__AN_MPQ_50,
|
AirDefence.SAM_Hawk_SR_AN_MPQ_50,
|
||||||
"SR",
|
"SR",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Hawk_Generator__PCP,
|
AirDefence.SAM_Hawk_PCP,
|
||||||
"PCP",
|
"PCP",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Hawk_TR__AN_MPQ_46,
|
AirDefence.SAM_Hawk_TR_AN_MPQ_46,
|
||||||
"TR",
|
"TR",
|
||||||
self.position.x + 40,
|
self.position.x + 40,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -44,7 +44,7 @@ class HawkGenerator(AirDefenseGroupGenerator):
|
|||||||
aa_group = self.add_auxiliary_group("AA")
|
aa_group = self.add_auxiliary_group("AA")
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group,
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
"AAA",
|
"AAA",
|
||||||
self.position + Point(20, 30),
|
self.position + Point(20, 30),
|
||||||
self.heading,
|
self.heading,
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ class HQ7Generator(AirDefenseGroupGenerator):
|
|||||||
aa_group = self.add_auxiliary_group("AA")
|
aa_group = self.add_auxiliary_group("AA")
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
"AAA1",
|
"AAA1",
|
||||||
self.position + Point(20, 30),
|
self.position + Point(20, 30),
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group,
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
"AAA2",
|
"AAA2",
|
||||||
self.position - Point(20, 30),
|
self.position - Point(20, 30),
|
||||||
self.heading,
|
self.heading,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator):
|
|||||||
num_launchers = random.randint(2, 4)
|
num_launchers = random.randint(2, 4)
|
||||||
|
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -31,7 +31,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Linebacker___Bradley_M6,
|
AirDefence.SAM_Linebacker_M6,
|
||||||
"M6#" + str(i),
|
"M6#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -20,28 +20,28 @@ class PatriotGenerator(AirDefenseGroupGenerator):
|
|||||||
def generate(self):
|
def generate(self):
|
||||||
# Command Post
|
# Command Post
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Patriot_STR,
|
AirDefence.SAM_Patriot_STR_AN_MPQ_53,
|
||||||
"STR",
|
"STR",
|
||||||
self.position.x + 30,
|
self.position.x + 30,
|
||||||
self.position.y + 30,
|
self.position.y + 30,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137,
|
AirDefence.SAM_Patriot_AMG_AN_MRC_137,
|
||||||
"MRC",
|
"MRC",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Patriot_ECS,
|
AirDefence.SAM_Patriot_ECS_AN_MSQ_104,
|
||||||
"MSQ",
|
"MSQ",
|
||||||
self.position.x + 30,
|
self.position.x + 30,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Patriot_C2_ICC,
|
AirDefence.SAM_Patriot_ICC,
|
||||||
"ICC",
|
"ICC",
|
||||||
self.position.x + 60,
|
self.position.x + 60,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -61,7 +61,7 @@ class PatriotGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Patriot_LN,
|
AirDefence.SAM_Patriot_LN_M901,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
@@ -76,11 +76,7 @@ class PatriotGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, (x, y, heading) in enumerate(positions):
|
for i, (x, y, heading) in enumerate(positions):
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group, AirDefence.AAA_Vulcan_M163, f"SPAAA#{i}", Point(x, y), heading
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
|
||||||
f"SPAAA#{i}",
|
|
||||||
Point(x, y),
|
|
||||||
heading,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class RapierGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Rapier_Blindfire_TR,
|
AirDefence.Rapier_FSA_Blindfire_Tracker,
|
||||||
"BT",
|
"BT",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Rapier_Tracker,
|
AirDefence.Rapier_FSA_Optical_Tracker,
|
||||||
"OT",
|
"OT",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -39,7 +39,7 @@ class RapierGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_Rapier_LN,
|
AirDefence.Rapier_FSA_Launcher,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class RolandGenerator(AirDefenseGroupGenerator):
|
|||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 80,
|
self.position.x + 80,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from dcs.mapping import Point
|
from dcs.mapping import Point
|
||||||
|
from dcs.unittype import VehicleType
|
||||||
from dcs.vehicles import AirDefence
|
from dcs.vehicles import AirDefence
|
||||||
|
|
||||||
from game import Game
|
from game import Game
|
||||||
@@ -17,18 +18,18 @@ class SA10Generator(AirDefenseGroupGenerator):
|
|||||||
This generate a SA-10 group
|
This generate a SA-10 group
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-10/S-300PS Battery - With ZSU-23"
|
name = "SA-10/S-300PS Battery"
|
||||||
price = 550
|
price = 550
|
||||||
|
|
||||||
def __init__(self, game: Game, ground_object: SamGroundObject):
|
def __init__(self, game: Game, ground_object: SamGroundObject):
|
||||||
super().__init__(game, ground_object)
|
super().__init__(game, ground_object)
|
||||||
self.sr1 = AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR
|
self.sr1 = AirDefence.SAM_SA_10_S_300PS_SR_5N66M
|
||||||
self.sr2 = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR
|
self.sr2 = AirDefence.SAM_SA_10_S_300PS_SR_64H6E
|
||||||
self.cp = AirDefence.SAM_SA_10_S_300_Grumble_C2
|
self.cp = AirDefence.SAM_SA_10_S_300PS_CP_54K6
|
||||||
self.tr1 = AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR
|
self.tr1 = AirDefence.SAM_SA_10_S_300PS_TR_30N6
|
||||||
self.tr2 = AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR
|
self.tr2 = AirDefence.SAM_SA_10_S_300PS_TR_30N6
|
||||||
self.ln1 = AirDefence.SAM_SA_10_S_300_Grumble_TEL_C
|
self.ln1 = AirDefence.SAM_SA_10_S_300PS_LN_5P85C
|
||||||
self.ln2 = AirDefence.SAM_SA_10_S_300_Grumble_TEL_D
|
self.ln2 = AirDefence.SAM_SA_10_S_300PS_LN_5P85D
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
# Search Radar
|
# Search Radar
|
||||||
@@ -84,7 +85,7 @@ class SA10Generator(AirDefenseGroupGenerator):
|
|||||||
for i, (x, y, heading) in enumerate(positions):
|
for i, (x, y, heading) in enumerate(positions):
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group,
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
f"AA#{i}",
|
f"AA#{i}",
|
||||||
Point(x, y),
|
Point(x, y),
|
||||||
heading,
|
heading,
|
||||||
@@ -92,10 +93,6 @@ class SA10Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
|
|
||||||
class Tier2SA10Generator(SA10Generator):
|
class Tier2SA10Generator(SA10Generator):
|
||||||
|
|
||||||
name = "SA-10/S-300PS Battery - With SA-15 PD"
|
|
||||||
price = 650
|
|
||||||
|
|
||||||
def generate_defensive_groups(self) -> None:
|
def generate_defensive_groups(self) -> None:
|
||||||
# Create AAA the way the main group does.
|
# Create AAA the way the main group does.
|
||||||
super().generate_defensive_groups()
|
super().generate_defensive_groups()
|
||||||
@@ -109,7 +106,7 @@ class Tier2SA10Generator(SA10Generator):
|
|||||||
for i, (x, y, heading) in enumerate(positions):
|
for i, (x, y, heading) in enumerate(positions):
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
pd_group,
|
pd_group,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
f"PD#{i}",
|
f"PD#{i}",
|
||||||
Point(x, y),
|
Point(x, y),
|
||||||
heading,
|
heading,
|
||||||
@@ -117,10 +114,6 @@ class Tier2SA10Generator(SA10Generator):
|
|||||||
|
|
||||||
|
|
||||||
class Tier3SA10Generator(SA10Generator):
|
class Tier3SA10Generator(SA10Generator):
|
||||||
|
|
||||||
name = "SA-10/S-300PS Battery - With SA-15 PD & SA-19 SHORAD"
|
|
||||||
price = 750
|
|
||||||
|
|
||||||
def generate_defensive_groups(self) -> None:
|
def generate_defensive_groups(self) -> None:
|
||||||
# AAA for defending against close targets.
|
# AAA for defending against close targets.
|
||||||
aa_group = self.add_auxiliary_group("AA")
|
aa_group = self.add_auxiliary_group("AA")
|
||||||
@@ -131,7 +124,7 @@ class Tier3SA10Generator(SA10Generator):
|
|||||||
for i, (x, y, heading) in enumerate(positions):
|
for i, (x, y, heading) in enumerate(positions):
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
aa_group,
|
aa_group,
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
f"AA#{i}",
|
f"AA#{i}",
|
||||||
Point(x, y),
|
Point(x, y),
|
||||||
heading,
|
heading,
|
||||||
@@ -146,7 +139,7 @@ class Tier3SA10Generator(SA10Generator):
|
|||||||
for i, (x, y, heading) in enumerate(positions):
|
for i, (x, y, heading) in enumerate(positions):
|
||||||
self.add_unit_to_group(
|
self.add_unit_to_group(
|
||||||
pd_group,
|
pd_group,
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
f"PD#{i}",
|
f"PD#{i}",
|
||||||
Point(x, y),
|
Point(x, y),
|
||||||
heading,
|
heading,
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class SA11Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR,
|
AirDefence.SAM_SA_11_Buk_SR_9S18M1,
|
||||||
"SR",
|
"SR",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_C2,
|
AirDefence.SAM_SA_11_Buk_CC_9S470M1,
|
||||||
"CC",
|
"CC",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -39,7 +39,7 @@ class SA11Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL,
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class SA13Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_UAZ_469_Jeep,
|
Unarmed.Transport_UAZ_469,
|
||||||
"UAZ",
|
"UAZ",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
Unarmed.Transport_KAMAZ_43101,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 40,
|
self.position.x + 40,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -38,7 +38,7 @@ class SA13Generator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -16,21 +16,21 @@ class SA15Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_15_Tor_Gauntlet,
|
AirDefence.SAM_SA_15_Tor_9A331,
|
||||||
"ADS",
|
"ADS",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_UAZ_469_Jeep,
|
Unarmed.Transport_UAZ_469,
|
||||||
"EWR",
|
"EWR",
|
||||||
self.position.x + 40,
|
self.position.x + 40,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
Unarmed.Transport_KAMAZ_43101,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 80,
|
self.position.x + 80,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ class SA17Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR,
|
AirDefence.SAM_SA_11_Buk_SR_9S18M1,
|
||||||
"SR",
|
"SR",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_11_Buk_Gadfly_C2,
|
AirDefence.SAM_SA_11_Buk_CC_9S470M1,
|
||||||
"CC",
|
"CC",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class SA19Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
if num_launchers == 1:
|
if num_launchers == 1:
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
"LN#0",
|
"LN#0",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -33,7 +33,7 @@ class SA19Generator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_19_Tunguska_Grison,
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -18,14 +18,10 @@ class SA2Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3,
|
AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading
|
||||||
"SR",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_2_S_75_Fan_Song_TR,
|
AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song,
|
||||||
"TR",
|
"TR",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -39,7 +35,7 @@ class SA2Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_2_S_75_Guideline_LN,
|
AirDefence.SAM_SA_2_LN_SM_90,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -18,14 +18,10 @@ class SA3Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_P19_Flat_Face_SR__SA_2_3,
|
AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading
|
||||||
"SR",
|
|
||||||
self.position.x,
|
|
||||||
self.position.y,
|
|
||||||
self.heading,
|
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_3_S_125_Low_Blow_TR,
|
AirDefence.SAM_SA_3_S_125_TR_SNR,
|
||||||
"TR",
|
"TR",
|
||||||
self.position.x + 20,
|
self.position.x + 20,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -39,7 +35,7 @@ class SA3Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_3_S_125_Goa_LN,
|
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class SA6Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_6_Kub_Long_Track_STR,
|
AirDefence.SAM_SA_6_Kub_STR_9S91,
|
||||||
"STR",
|
"STR",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -32,7 +32,7 @@ class SA6Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_6_Kub_Gainful_TEL,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class SA8Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_8_Osa_Gecko_TEL,
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
"OSA",
|
"OSA",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ class SA9Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.LUV_UAZ_469_Jeep,
|
Unarmed.Transport_UAZ_469,
|
||||||
"UAZ",
|
"UAZ",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_KAMAZ_43101,
|
Unarmed.Transport_KAMAZ_43101,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 40,
|
self.position.x + 40,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -38,7 +38,7 @@ class SA9Generator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL,
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
"LN#" + str(i),
|
"LN#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class VulcanGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
"SPAAA",
|
"SPAAA",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
@@ -26,14 +26,14 @@ class VulcanGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
if random.randint(0, 1) == 1:
|
if random.randint(0, 1) == 1:
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_Vulcan_M163,
|
AirDefence.AAA_Vulcan_M163,
|
||||||
"SPAAA2",
|
"SPAAA2",
|
||||||
self.position.x,
|
self.position.x,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
self.heading,
|
self.heading,
|
||||||
)
|
)
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
Unarmed.Truck_M818_6x6,
|
Unarmed.Transport_M818,
|
||||||
"TRUCK",
|
"TRUCK",
|
||||||
self.position.x + 80,
|
self.position.x + 80,
|
||||||
self.position.y,
|
self.position.y,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class ZSU23Generator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
"SPAA#" + str(i),
|
"SPAA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class ZU23Generator(AirDefenseGroupGenerator):
|
|||||||
for j in range(grid_y):
|
for j in range(grid_y):
|
||||||
index = index + 1
|
index = index + 1
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.AAA_ZU_23_Closed_Emplacement,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
"AAA#" + str(index),
|
"AAA#" + str(index),
|
||||||
self.position.x + spacing * i,
|
self.position.x + spacing * i,
|
||||||
self.position.y + spacing * j,
|
self.position.y + spacing * j,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class ZU23UralGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_on_Ural_375,
|
||||||
"SPAA#" + str(i),
|
"SPAA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
|
|||||||
)
|
)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(
|
self.add_unit(
|
||||||
AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375,
|
AirDefence.AAA_ZU_23_Insurgent_on_Ural_375,
|
||||||
"SPAA#" + str(i),
|
"SPAA#" + str(i),
|
||||||
position[0],
|
position[0],
|
||||||
position[1],
|
position[1],
|
||||||
|
|||||||
2
pydcs
2
pydcs
Submodule pydcs updated: cd14f0a049...42de2ec352
@@ -409,27 +409,7 @@ class WeaponsA4EC:
|
|||||||
"name": "Mk-83 *3 (TER)",
|
"name": "Mk-83 *3 (TER)",
|
||||||
"weight": 1388.6,
|
"weight": 1388.6,
|
||||||
}
|
}
|
||||||
_3_LAU_61 = ({"clsid": "{TER,LAU-61*3}", "name": "3*LAU-61", "weight": 98},)
|
_3_LAU_61 = {"clsid": "{TER,LAU-61*3}", "name": "3*LAU-61", "weight": 98}
|
||||||
Fuel_Tank_150_gallons__EMPTY_ = {
|
|
||||||
"clsid": "{DFT-150gal_EMPTY}",
|
|
||||||
"name": "Fuel_Tank_150_gallons__EMPTY",
|
|
||||||
"weight": 61.688512,
|
|
||||||
}
|
|
||||||
Fuel_Tank_300_gallons__EMPTY_ = {
|
|
||||||
"clsid": "{DFT-300gal_EMPTY}",
|
|
||||||
"name": "Fuel_Tank_300_gallons__EMPTY",
|
|
||||||
"weight": 83.007336,
|
|
||||||
}
|
|
||||||
Fuel_Tank_300_gallons__EMPTY__ = {
|
|
||||||
"clsid": "{DFT-300gal_LR_EMPTY}",
|
|
||||||
"name": "Fuel_Tank_300_gallons__EMPTY",
|
|
||||||
"weight": 90.264808,
|
|
||||||
}
|
|
||||||
Fuel_Tank_400_gallons__EMPTY_ = {
|
|
||||||
"clsid": "{DFT-400gal_EMPTY}",
|
|
||||||
"name": "Fuel_Tank_400_gallons__EMPTY",
|
|
||||||
"weight": 108.86208,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class A_4E_C(PlaneType):
|
class A_4E_C(PlaneType):
|
||||||
@@ -851,68 +831,29 @@ class A_4E_C(PlaneType):
|
|||||||
Community_A_4E_II = "Community A-4E II"
|
Community_A_4E_II = "Community A-4E II"
|
||||||
|
|
||||||
class Pylon1:
|
class Pylon1:
|
||||||
LAU_7_with_AIM_9B_Sidewinder_IR_AAM = (
|
LAU_10___4_ZUNI_MK_71 = (1, Weapons.LAU_10___4_ZUNI_MK_71)
|
||||||
1,
|
LAU_3___19_FFAR_M156_WP = (1, Weapons.LAU_3___19_FFAR_M156_WP)
|
||||||
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
|
LAU_3___19_FFAR_Mk1_HE = (1, Weapons.LAU_3___19_FFAR_Mk1_HE)
|
||||||
)
|
LAU_3___19_FFAR_Mk5_HEAT = (1, Weapons.LAU_3___19_FFAR_Mk5_HEAT)
|
||||||
LAU_7_with_AIM_9P_Sidewinder_IR_AAM = (
|
LAU_68___7_FFAR_M156_WP = (1, Weapons.LAU_68___7_FFAR_M156_WP)
|
||||||
1,
|
LAU_68___7_FFAR_Mk1_HE = (1, Weapons.LAU_68___7_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM,
|
LAU_68___7_FFAR_Mk5_HEAT = (1, Weapons.LAU_68___7_FFAR_Mk5_HEAT)
|
||||||
)
|
AGM_45A = (1, Weapons.AGM_45A)
|
||||||
LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
1,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
AGM_45A_Shrike_ARM = (1, Weapons.AGM_45A_Shrike_ARM)
|
|
||||||
# ERRR {AGM12_B}
|
# ERRR {AGM12_B}
|
||||||
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
|
Mk_20 = (1, Weapons.Mk_20)
|
||||||
1,
|
Mk_81 = (1, Weapons.Mk_81)
|
||||||
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
|
|
||||||
)
|
|
||||||
Mk_81___250lb_GP_Bomb_LD = (1, Weapons.Mk_81___250lb_GP_Bomb_LD)
|
|
||||||
Mk_81SE = (1, WeaponsA4EC.Mk_81SE)
|
Mk_81SE = (1, WeaponsA4EC.Mk_81SE)
|
||||||
Mk_82___500lb_GP_Bomb_LD = (1, Weapons.Mk_82___500lb_GP_Bomb_LD)
|
Mk_82 = (1, Weapons.Mk_82)
|
||||||
Mk_82_Snakeye___500lb_GP_Bomb_HD = (
|
Mk_82_SnakeEye = (1, Weapons.Mk_82_SnakeEye)
|
||||||
1,
|
|
||||||
Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD,
|
|
||||||
)
|
|
||||||
Mk_77_mod_1 = (1, WeaponsA4EC.Mk_77_mod_1)
|
Mk_77_mod_1 = (1, WeaponsA4EC.Mk_77_mod_1)
|
||||||
AN_M30A1___100lb_GP_Bomb_LD = (1, Weapons.AN_M30A1___100lb_GP_Bomb_LD)
|
AN_M30A1 = (1, Weapons.AN_M30A1)
|
||||||
AN_M57___250lb_GP_Bomb_LD = (1, Weapons.AN_M57___250lb_GP_Bomb_LD)
|
AN_M57 = (1, Weapons.AN_M57)
|
||||||
AN_M64___500lb_GP_Bomb_LD = (1, Weapons.AN_M64___500lb_GP_Bomb_LD)
|
AN_M64 = (1, Weapons.AN_M64)
|
||||||
AN_M81 = (1, WeaponsA4EC.AN_M81)
|
AN_M81 = (1, WeaponsA4EC.AN_M81)
|
||||||
AN_M88 = (1, WeaponsA4EC.AN_M88)
|
AN_M88 = (1, WeaponsA4EC.AN_M88)
|
||||||
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
1,
|
1,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (1, Weapons.Smokewinder___red)
|
Smokewinder___red = (1, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (1, Weapons.Smokewinder___green)
|
Smokewinder___green = (1, Weapons.Smokewinder___green)
|
||||||
@@ -920,98 +861,47 @@ class A_4E_C(PlaneType):
|
|||||||
Smokewinder___white = (1, Weapons.Smokewinder___white)
|
Smokewinder___white = (1, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (1, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (1, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (1, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (1, Weapons.Smokewinder___orange)
|
||||||
SUU_25_x_8_LUU_2___Target_Marker_Flares = (
|
|
||||||
1,
|
|
||||||
Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares,
|
|
||||||
)
|
|
||||||
|
|
||||||
# ERRR <CLEAN>
|
# ERRR <CLEAN>
|
||||||
|
|
||||||
class Pylon2:
|
class Pylon2:
|
||||||
Fuel_Tank_300_gallons_ = (2, WeaponsA4EC.Fuel_Tank_300_gallons_)
|
Fuel_Tank_300_gallons_ = (2, WeaponsA4EC.Fuel_Tank_300_gallons_)
|
||||||
Fuel_Tank_300_gallons__EMPTY__ = (
|
|
||||||
2,
|
|
||||||
WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY__,
|
|
||||||
)
|
|
||||||
Fuel_Tank_150_gallons = (2, WeaponsA4EC.Fuel_Tank_150_gallons)
|
Fuel_Tank_150_gallons = (2, WeaponsA4EC.Fuel_Tank_150_gallons)
|
||||||
Fuel_Tank_150_gallons__EMPTY_ = (
|
LAU_7_GAR_8_Sidewinder_IR_AAM = (2, Weapons.LAU_7_GAR_8_Sidewinder_IR_AAM)
|
||||||
2,
|
LAU_7_AIM_9P_Sidewinder_IR_AAM = (2, Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM)
|
||||||
WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_,
|
LAU_7_AIM_9P5_Sidewinder_IR_AAM = (2, Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM)
|
||||||
)
|
LAU_10___4_ZUNI_MK_71 = (2, Weapons.LAU_10___4_ZUNI_MK_71)
|
||||||
LAU_7_with_AIM_9B_Sidewinder_IR_AAM = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_7_with_AIM_9P_Sidewinder_IR_AAM = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
|
|
||||||
)
|
|
||||||
LAU_10_2___4_ZUNI_MK_71_ = (2, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71_)
|
LAU_10_2___4_ZUNI_MK_71_ = (2, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71_)
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_3___19_FFAR_M156_WP = (2, Weapons.LAU_3___19_FFAR_M156_WP)
|
||||||
2,
|
LAU_3___19_FFAR_Mk1_HE = (2, Weapons.LAU_3___19_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_3___19_FFAR_Mk5_HEAT = (2, Weapons.LAU_3___19_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_3_2___19_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP_)
|
LAU_3_2___19_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP_)
|
||||||
LAU_3_2___19_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE_)
|
LAU_3_2___19_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE_)
|
||||||
LAU_3_2___19_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT_)
|
LAU_3_2___19_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT_)
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_68___7_FFAR_M156_WP = (2, Weapons.LAU_68___7_FFAR_M156_WP)
|
||||||
2,
|
LAU_68___7_FFAR_Mk1_HE = (2, Weapons.LAU_68___7_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_68___7_FFAR_Mk5_HEAT = (2, Weapons.LAU_68___7_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
2,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_68_2___7_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP_)
|
LAU_68_2___7_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP_)
|
||||||
LAU_68_2___7_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE_)
|
LAU_68_2___7_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE_)
|
||||||
LAU_68_2___7_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT_)
|
LAU_68_2___7_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT_)
|
||||||
AGM_45A_Shrike_ARM = (2, Weapons.AGM_45A_Shrike_ARM)
|
AGM_45A = (2, Weapons.AGM_45A)
|
||||||
# ERRR {AGM12_C}
|
# ERRR {AGM12_C}
|
||||||
# ERRR {AGM12_B}
|
# ERRR {AGM12_B}
|
||||||
AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = (
|
AGM_62 = (2, Weapons.AGM_62)
|
||||||
2,
|
Mk_20 = (2, Weapons.Mk_20)
|
||||||
Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_,
|
Mk_81 = (2, Weapons.Mk_81)
|
||||||
)
|
|
||||||
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
|
|
||||||
2,
|
|
||||||
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
|
|
||||||
)
|
|
||||||
Mk_81___250lb_GP_Bomb_LD = (2, Weapons.Mk_81___250lb_GP_Bomb_LD)
|
|
||||||
Mk_81SE = (2, WeaponsA4EC.Mk_81SE)
|
Mk_81SE = (2, WeaponsA4EC.Mk_81SE)
|
||||||
Mk_82___500lb_GP_Bomb_LD = (2, Weapons.Mk_82___500lb_GP_Bomb_LD)
|
Mk_82 = (2, Weapons.Mk_82)
|
||||||
Mk_82_Snakeye___500lb_GP_Bomb_HD = (
|
Mk_82_SnakeEye = (2, Weapons.Mk_82_SnakeEye)
|
||||||
2,
|
Mk_83 = (2, Weapons.Mk_83)
|
||||||
Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD,
|
Mk_84 = (2, Weapons.Mk_84)
|
||||||
)
|
M117 = (2, Weapons.M117)
|
||||||
Mk_83___1000lb_GP_Bomb_LD = (2, Weapons.Mk_83___1000lb_GP_Bomb_LD)
|
|
||||||
Mk_84___2000lb_GP_Bomb_LD = (2, Weapons.Mk_84___2000lb_GP_Bomb_LD)
|
|
||||||
M117___750lb_GP_Bomb_LD = (2, Weapons.M117___750lb_GP_Bomb_LD)
|
|
||||||
Mk_77_mod_0 = (2, WeaponsA4EC.Mk_77_mod_0)
|
Mk_77_mod_0 = (2, WeaponsA4EC.Mk_77_mod_0)
|
||||||
Mk_77_mod_1 = (2, WeaponsA4EC.Mk_77_mod_1)
|
Mk_77_mod_1 = (2, WeaponsA4EC.Mk_77_mod_1)
|
||||||
AN_M30A1___100lb_GP_Bomb_LD = (2, Weapons.AN_M30A1___100lb_GP_Bomb_LD)
|
AN_M30A1 = (2, Weapons.AN_M30A1)
|
||||||
AN_M57___250lb_GP_Bomb_LD = (2, Weapons.AN_M57___250lb_GP_Bomb_LD)
|
AN_M57 = (2, Weapons.AN_M57)
|
||||||
AN_M64___500lb_GP_Bomb_LD = (2, Weapons.AN_M64___500lb_GP_Bomb_LD)
|
AN_M64 = (2, Weapons.AN_M64)
|
||||||
AN_M65___1000lb_GP_Bomb_LD = (2, Weapons.AN_M65___1000lb_GP_Bomb_LD)
|
AN_M65 = (2, Weapons.AN_M65)
|
||||||
AN_M81 = (2, WeaponsA4EC.AN_M81)
|
AN_M81 = (2, WeaponsA4EC.AN_M81)
|
||||||
AN_M88 = (2, WeaponsA4EC.AN_M88)
|
AN_M88 = (2, WeaponsA4EC.AN_M88)
|
||||||
CBU_1_A = (2, WeaponsA4EC.CBU_1_A)
|
CBU_1_A = (2, WeaponsA4EC.CBU_1_A)
|
||||||
@@ -1036,10 +926,6 @@ class A_4E_C(PlaneType):
|
|||||||
Smokewinder___white = (2, Weapons.Smokewinder___white)
|
Smokewinder___white = (2, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (2, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (2, Weapons.Smokewinder___orange)
|
||||||
SUU_25_x_8_LUU_2___Target_Marker_Flares = (
|
|
||||||
2,
|
|
||||||
Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares,
|
|
||||||
)
|
|
||||||
|
|
||||||
# ERRR <CLEAN>
|
# ERRR <CLEAN>
|
||||||
|
|
||||||
@@ -1047,59 +933,27 @@ class A_4E_C(PlaneType):
|
|||||||
Fuel_Tank_400_gallons = (3, WeaponsA4EC.Fuel_Tank_400_gallons)
|
Fuel_Tank_400_gallons = (3, WeaponsA4EC.Fuel_Tank_400_gallons)
|
||||||
Fuel_Tank_300_gallons = (3, WeaponsA4EC.Fuel_Tank_300_gallons)
|
Fuel_Tank_300_gallons = (3, WeaponsA4EC.Fuel_Tank_300_gallons)
|
||||||
Fuel_Tank_150_gallons = (3, WeaponsA4EC.Fuel_Tank_150_gallons)
|
Fuel_Tank_150_gallons = (3, WeaponsA4EC.Fuel_Tank_150_gallons)
|
||||||
Fuel_Tank_400_gallons__EMPTY_ = (
|
D_704_Refueling_Pod = (3, WeaponsA4EC.D_704_Refueling_Pod)
|
||||||
3,
|
|
||||||
WeaponsA4EC.Fuel_Tank_400_gallons__EMPTY_,
|
|
||||||
)
|
|
||||||
Fuel_Tank_300_gallons__EMPTY_ = (
|
|
||||||
3,
|
|
||||||
WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY_,
|
|
||||||
)
|
|
||||||
Fuel_Tank_150_gallons__EMPTY_ = (
|
|
||||||
3,
|
|
||||||
WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_,
|
|
||||||
)
|
|
||||||
# ERRR {3*LAU-61}
|
# ERRR {3*LAU-61}
|
||||||
BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
|
LAU_68_3___7_2_75__rockets_MK5__HE_ = (
|
||||||
3,
|
3,
|
||||||
Weapons.BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
|
Weapons.LAU_68_3___7_2_75__rockets_MK5__HE_,
|
||||||
)
|
|
||||||
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
|
|
||||||
3,
|
|
||||||
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
|
|
||||||
)
|
)
|
||||||
|
LAU_10___4_ZUNI_MK_71 = (3, Weapons.LAU_10___4_ZUNI_MK_71)
|
||||||
LAU_10_2___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71)
|
LAU_10_2___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71)
|
||||||
LAU_10_3___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_3___4_ZUNI_MK_71)
|
LAU_10_3___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_3___4_ZUNI_MK_71)
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_3___19_FFAR_M156_WP = (3, Weapons.LAU_3___19_FFAR_M156_WP)
|
||||||
3,
|
LAU_3___19_FFAR_Mk1_HE = (3, Weapons.LAU_3___19_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_3___19_FFAR_Mk5_HEAT = (3, Weapons.LAU_3___19_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
3,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
3,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_3_2___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP)
|
LAU_3_2___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP)
|
||||||
LAU_3_2___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE)
|
LAU_3_2___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE)
|
||||||
LAU_3_2___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT)
|
LAU_3_2___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT)
|
||||||
LAU_3_3___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_3___19_FFAR_M156_WP)
|
LAU_3_3___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_3___19_FFAR_M156_WP)
|
||||||
LAU_3_3___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk1_HE)
|
LAU_3_3___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk1_HE)
|
||||||
LAU_3_3___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk5_HEAT)
|
LAU_3_3___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk5_HEAT)
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_68___7_FFAR_M156_WP = (3, Weapons.LAU_68___7_FFAR_M156_WP)
|
||||||
3,
|
LAU_68___7_FFAR_Mk1_HE = (3, Weapons.LAU_68___7_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_68___7_FFAR_Mk5_HEAT = (3, Weapons.LAU_68___7_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
3,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
3,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_68_2___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP)
|
LAU_68_2___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP)
|
||||||
LAU_68_2___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE)
|
LAU_68_2___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE)
|
||||||
LAU_68_2___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT)
|
LAU_68_2___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT)
|
||||||
@@ -1107,30 +961,21 @@ class A_4E_C(PlaneType):
|
|||||||
LAU_68_3___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk1_HE)
|
LAU_68_3___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk1_HE)
|
||||||
LAU_68_3___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk5_HEAT)
|
LAU_68_3___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk5_HEAT)
|
||||||
# ERRR {AGM12_B}
|
# ERRR {AGM12_B}
|
||||||
AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = (
|
AGM_62 = (3, Weapons.AGM_62)
|
||||||
3,
|
Mk_20 = (3, Weapons.Mk_20)
|
||||||
Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_,
|
Mk_81 = (3, Weapons.Mk_81)
|
||||||
)
|
|
||||||
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
|
|
||||||
3,
|
|
||||||
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
|
|
||||||
)
|
|
||||||
Mk_81___250lb_GP_Bomb_LD = (3, Weapons.Mk_81___250lb_GP_Bomb_LD)
|
|
||||||
Mk_81SE = (3, WeaponsA4EC.Mk_81SE)
|
Mk_81SE = (3, WeaponsA4EC.Mk_81SE)
|
||||||
Mk_82___500lb_GP_Bomb_LD = (3, Weapons.Mk_82___500lb_GP_Bomb_LD)
|
Mk_82 = (3, Weapons.Mk_82)
|
||||||
Mk_82_Snakeye___500lb_GP_Bomb_HD = (
|
Mk_82_SnakeEye = (3, Weapons.Mk_82_SnakeEye)
|
||||||
3,
|
Mk_83 = (3, Weapons.Mk_83)
|
||||||
Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD,
|
Mk_84 = (3, Weapons.Mk_84)
|
||||||
)
|
M117 = (3, Weapons.M117)
|
||||||
Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD)
|
|
||||||
Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD)
|
|
||||||
M117___750lb_GP_Bomb_LD = (3, Weapons.M117___750lb_GP_Bomb_LD)
|
|
||||||
Mk_77_mod_0 = (3, WeaponsA4EC.Mk_77_mod_0)
|
Mk_77_mod_0 = (3, WeaponsA4EC.Mk_77_mod_0)
|
||||||
Mk_77_mod_1 = (3, WeaponsA4EC.Mk_77_mod_1)
|
Mk_77_mod_1 = (3, WeaponsA4EC.Mk_77_mod_1)
|
||||||
AN_M30A1___100lb_GP_Bomb_LD = (3, Weapons.AN_M30A1___100lb_GP_Bomb_LD)
|
AN_M30A1 = (3, Weapons.AN_M30A1)
|
||||||
AN_M57___250lb_GP_Bomb_LD = (3, Weapons.AN_M57___250lb_GP_Bomb_LD)
|
AN_M57 = (3, Weapons.AN_M57)
|
||||||
AN_M64___500lb_GP_Bomb_LD = (3, Weapons.AN_M64___500lb_GP_Bomb_LD)
|
AN_M64 = (3, Weapons.AN_M64)
|
||||||
AN_M65___1000lb_GP_Bomb_LD = (3, Weapons.AN_M65___1000lb_GP_Bomb_LD)
|
AN_M65 = (3, Weapons.AN_M65)
|
||||||
AN_M66A2 = (3, WeaponsA4EC.AN_M66A2)
|
AN_M66A2 = (3, WeaponsA4EC.AN_M66A2)
|
||||||
AN_M81 = (3, WeaponsA4EC.AN_M81)
|
AN_M81 = (3, WeaponsA4EC.AN_M81)
|
||||||
AN_M88 = (3, WeaponsA4EC.AN_M88)
|
AN_M88 = (3, WeaponsA4EC.AN_M88)
|
||||||
@@ -1158,98 +1003,47 @@ class A_4E_C(PlaneType):
|
|||||||
Smokewinder___white = (3, Weapons.Smokewinder___white)
|
Smokewinder___white = (3, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (3, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (3, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (3, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (3, Weapons.Smokewinder___orange)
|
||||||
SUU_25_x_8_LUU_2___Target_Marker_Flares = (
|
|
||||||
3,
|
|
||||||
Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares,
|
|
||||||
)
|
|
||||||
|
|
||||||
# ERRR <CLEAN>
|
# ERRR <CLEAN>
|
||||||
|
|
||||||
class Pylon4:
|
class Pylon4:
|
||||||
Fuel_Tank_300_gallons_ = (4, WeaponsA4EC.Fuel_Tank_300_gallons_)
|
Fuel_Tank_300_gallons_ = (4, WeaponsA4EC.Fuel_Tank_300_gallons_)
|
||||||
Fuel_Tank_300_gallons__EMPTY__ = (
|
|
||||||
4,
|
|
||||||
WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY__,
|
|
||||||
)
|
|
||||||
Fuel_Tank_150_gallons = (4, WeaponsA4EC.Fuel_Tank_150_gallons)
|
Fuel_Tank_150_gallons = (4, WeaponsA4EC.Fuel_Tank_150_gallons)
|
||||||
Fuel_Tank_150_gallons__EMPTY_ = (
|
LAU_7_GAR_8_Sidewinder_IR_AAM = (4, Weapons.LAU_7_GAR_8_Sidewinder_IR_AAM)
|
||||||
4,
|
LAU_7_AIM_9P_Sidewinder_IR_AAM = (4, Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM)
|
||||||
WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_,
|
LAU_7_AIM_9P5_Sidewinder_IR_AAM = (4, Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM)
|
||||||
)
|
LAU_10___4_ZUNI_MK_71 = (4, Weapons.LAU_10___4_ZUNI_MK_71)
|
||||||
LAU_7_with_AIM_9B_Sidewinder_IR_AAM = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_7_with_AIM_9P_Sidewinder_IR_AAM = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
|
|
||||||
)
|
|
||||||
LAU_10_2___4_ZUNI_MK_71__ = (4, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71__)
|
LAU_10_2___4_ZUNI_MK_71__ = (4, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71__)
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_3___19_FFAR_M156_WP = (4, Weapons.LAU_3___19_FFAR_M156_WP)
|
||||||
4,
|
LAU_3___19_FFAR_Mk1_HE = (4, Weapons.LAU_3___19_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_3___19_FFAR_Mk5_HEAT = (4, Weapons.LAU_3___19_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_3_2___19_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP__)
|
LAU_3_2___19_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP__)
|
||||||
LAU_3_2___19_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE__)
|
LAU_3_2___19_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE__)
|
||||||
LAU_3_2___19_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT__)
|
LAU_3_2___19_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT__)
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
LAU_68___7_FFAR_M156_WP = (4, Weapons.LAU_68___7_FFAR_M156_WP)
|
||||||
4,
|
LAU_68___7_FFAR_Mk1_HE = (4, Weapons.LAU_68___7_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
LAU_68___7_FFAR_Mk5_HEAT = (4, Weapons.LAU_68___7_FFAR_Mk5_HEAT)
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
4,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_68_2___7_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP__)
|
LAU_68_2___7_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP__)
|
||||||
LAU_68_2___7_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE__)
|
LAU_68_2___7_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE__)
|
||||||
LAU_68_2___7_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT__)
|
LAU_68_2___7_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT__)
|
||||||
AGM_45A_Shrike_ARM = (4, Weapons.AGM_45A_Shrike_ARM)
|
AGM_45A = (4, Weapons.AGM_45A)
|
||||||
# ERRR {AGM12_C}
|
# ERRR {AGM12_C}
|
||||||
# ERRR {AGM12_B}
|
# ERRR {AGM12_B}
|
||||||
AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = (
|
AGM_62 = (4, Weapons.AGM_62)
|
||||||
4,
|
Mk_20 = (4, Weapons.Mk_20)
|
||||||
Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_,
|
Mk_81 = (4, Weapons.Mk_81)
|
||||||
)
|
|
||||||
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
|
|
||||||
4,
|
|
||||||
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
|
|
||||||
)
|
|
||||||
Mk_81___250lb_GP_Bomb_LD = (4, Weapons.Mk_81___250lb_GP_Bomb_LD)
|
|
||||||
Mk_81SE = (4, WeaponsA4EC.Mk_81SE)
|
Mk_81SE = (4, WeaponsA4EC.Mk_81SE)
|
||||||
Mk_82___500lb_GP_Bomb_LD = (4, Weapons.Mk_82___500lb_GP_Bomb_LD)
|
Mk_82 = (4, Weapons.Mk_82)
|
||||||
Mk_82_Snakeye___500lb_GP_Bomb_HD = (
|
Mk_82_SnakeEye = (4, Weapons.Mk_82_SnakeEye)
|
||||||
4,
|
Mk_83 = (4, Weapons.Mk_83)
|
||||||
Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD,
|
Mk_84 = (4, Weapons.Mk_84)
|
||||||
)
|
M117 = (4, Weapons.M117)
|
||||||
Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD)
|
|
||||||
Mk_84___2000lb_GP_Bomb_LD = (4, Weapons.Mk_84___2000lb_GP_Bomb_LD)
|
|
||||||
M117___750lb_GP_Bomb_LD = (4, Weapons.M117___750lb_GP_Bomb_LD)
|
|
||||||
Mk_77_mod_0 = (4, WeaponsA4EC.Mk_77_mod_0)
|
Mk_77_mod_0 = (4, WeaponsA4EC.Mk_77_mod_0)
|
||||||
Mk_77_mod_1 = (4, WeaponsA4EC.Mk_77_mod_1)
|
Mk_77_mod_1 = (4, WeaponsA4EC.Mk_77_mod_1)
|
||||||
AN_M30A1___100lb_GP_Bomb_LD = (4, Weapons.AN_M30A1___100lb_GP_Bomb_LD)
|
AN_M30A1 = (4, Weapons.AN_M30A1)
|
||||||
AN_M57___250lb_GP_Bomb_LD = (4, Weapons.AN_M57___250lb_GP_Bomb_LD)
|
AN_M57 = (4, Weapons.AN_M57)
|
||||||
AN_M64___500lb_GP_Bomb_LD = (4, Weapons.AN_M64___500lb_GP_Bomb_LD)
|
AN_M64 = (4, Weapons.AN_M64)
|
||||||
AN_M65___1000lb_GP_Bomb_LD = (4, Weapons.AN_M65___1000lb_GP_Bomb_LD)
|
AN_M65 = (4, Weapons.AN_M65)
|
||||||
AN_M81 = (4, WeaponsA4EC.AN_M81)
|
AN_M81 = (4, WeaponsA4EC.AN_M81)
|
||||||
AN_M88 = (4, WeaponsA4EC.AN_M88)
|
AN_M88 = (4, WeaponsA4EC.AN_M88)
|
||||||
CBU_1_A = (4, WeaponsA4EC.CBU_1_A)
|
CBU_1_A = (4, WeaponsA4EC.CBU_1_A)
|
||||||
@@ -1274,76 +1068,33 @@ class A_4E_C(PlaneType):
|
|||||||
Smokewinder___white = (4, Weapons.Smokewinder___white)
|
Smokewinder___white = (4, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (4, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (4, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (4, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (4, Weapons.Smokewinder___orange)
|
||||||
SUU_25_x_8_LUU_2___Target_Marker_Flares = (
|
|
||||||
4,
|
|
||||||
Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares,
|
|
||||||
)
|
|
||||||
|
|
||||||
# ERRR <CLEAN>
|
# ERRR <CLEAN>
|
||||||
|
|
||||||
class Pylon5:
|
class Pylon5:
|
||||||
LAU_7_with_AIM_9B_Sidewinder_IR_AAM = (
|
LAU_10___4_ZUNI_MK_71 = (5, Weapons.LAU_10___4_ZUNI_MK_71)
|
||||||
5,
|
LAU_3___19_FFAR_M156_WP = (5, Weapons.LAU_3___19_FFAR_M156_WP)
|
||||||
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
|
LAU_3___19_FFAR_Mk1_HE = (5, Weapons.LAU_3___19_FFAR_Mk1_HE)
|
||||||
)
|
LAU_3___19_FFAR_Mk5_HEAT = (5, Weapons.LAU_3___19_FFAR_Mk5_HEAT)
|
||||||
LAU_7_with_AIM_9P_Sidewinder_IR_AAM = (
|
LAU_68___7_FFAR_M156_WP = (5, Weapons.LAU_68___7_FFAR_M156_WP)
|
||||||
5,
|
LAU_68___7_FFAR_Mk1_HE = (5, Weapons.LAU_68___7_FFAR_Mk1_HE)
|
||||||
Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM,
|
LAU_68___7_FFAR_Mk5_HEAT = (5, Weapons.LAU_68___7_FFAR_Mk5_HEAT)
|
||||||
)
|
AGM_45A = (5, Weapons.AGM_45A)
|
||||||
LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM,
|
|
||||||
)
|
|
||||||
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
|
|
||||||
)
|
|
||||||
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
|
|
||||||
5,
|
|
||||||
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
|
|
||||||
)
|
|
||||||
AGM_45A_Shrike_ARM = (5, Weapons.AGM_45A_Shrike_ARM)
|
|
||||||
# ERRR {AGM12_B}
|
# ERRR {AGM12_B}
|
||||||
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
|
Mk_20 = (5, Weapons.Mk_20)
|
||||||
5,
|
Mk_81 = (5, Weapons.Mk_81)
|
||||||
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
|
|
||||||
)
|
|
||||||
Mk_81___250lb_GP_Bomb_LD = (5, Weapons.Mk_81___250lb_GP_Bomb_LD)
|
|
||||||
Mk_81SE = (5, WeaponsA4EC.Mk_81SE)
|
Mk_81SE = (5, WeaponsA4EC.Mk_81SE)
|
||||||
Mk_82___500lb_GP_Bomb_LD = (5, Weapons.Mk_82___500lb_GP_Bomb_LD)
|
Mk_82 = (5, Weapons.Mk_82)
|
||||||
Mk_82_Snakeye___500lb_GP_Bomb_HD = (
|
Mk_82_SnakeEye = (5, Weapons.Mk_82_SnakeEye)
|
||||||
5,
|
|
||||||
Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD,
|
|
||||||
)
|
|
||||||
Mk_77_mod_1 = (5, WeaponsA4EC.Mk_77_mod_1)
|
Mk_77_mod_1 = (5, WeaponsA4EC.Mk_77_mod_1)
|
||||||
AN_M30A1___100lb_GP_Bomb_LD = (5, Weapons.AN_M30A1___100lb_GP_Bomb_LD)
|
AN_M30A1 = (5, Weapons.AN_M30A1)
|
||||||
AN_M57___250lb_GP_Bomb_LD = (5, Weapons.AN_M57___250lb_GP_Bomb_LD)
|
AN_M57 = (5, Weapons.AN_M57)
|
||||||
AN_M64___500lb_GP_Bomb_LD = (5, Weapons.AN_M64___500lb_GP_Bomb_LD)
|
AN_M64 = (5, Weapons.AN_M64)
|
||||||
AN_M81 = (5, WeaponsA4EC.AN_M81)
|
AN_M81 = (5, WeaponsA4EC.AN_M81)
|
||||||
AN_M88 = (5, WeaponsA4EC.AN_M88)
|
AN_M88 = (5, WeaponsA4EC.AN_M88)
|
||||||
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
5,
|
5,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (5, Weapons.Smokewinder___red)
|
Smokewinder___red = (5, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (5, Weapons.Smokewinder___green)
|
Smokewinder___green = (5, Weapons.Smokewinder___green)
|
||||||
@@ -1351,10 +1102,6 @@ class A_4E_C(PlaneType):
|
|||||||
Smokewinder___white = (5, Weapons.Smokewinder___white)
|
Smokewinder___white = (5, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (5, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (5, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (5, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (5, Weapons.Smokewinder___orange)
|
||||||
SUU_25_x_8_LUU_2___Target_Marker_Flares = (
|
|
||||||
5,
|
|
||||||
Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares,
|
|
||||||
)
|
|
||||||
|
|
||||||
# ERRR <CLEAN>
|
# ERRR <CLEAN>
|
||||||
|
|
||||||
|
|||||||
@@ -1766,15 +1766,15 @@ class F_22A(PlaneType):
|
|||||||
Fuel_tank_610_gal = (2, Weapons.Fuel_tank_610_gal)
|
Fuel_tank_610_gal = (2, Weapons.Fuel_tank_610_gal)
|
||||||
|
|
||||||
class Pylon3:
|
class Pylon3:
|
||||||
AIM_120C = (3, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (3, Weapons.AIM_120C)
|
||||||
AIM_120D = (3, F22AWeapons.AIM_120D)
|
AIM_120D = (3, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon4:
|
class Pylon4:
|
||||||
AIM_120C = (4, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (4, Weapons.AIM_120C)
|
||||||
AIM_120D = (4, F22AWeapons.AIM_120D)
|
AIM_120D = (4, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon5:
|
class Pylon5:
|
||||||
AIM_120C = (5, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (5, Weapons.AIM_120C)
|
||||||
AIM_120D = (5, F22AWeapons.AIM_120D)
|
AIM_120D = (5, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon6:
|
class Pylon6:
|
||||||
@@ -1785,15 +1785,15 @@ class F_22A(PlaneType):
|
|||||||
Smokewinder___yellow = (6, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (6, Weapons.Smokewinder___yellow)
|
||||||
|
|
||||||
class Pylon7:
|
class Pylon7:
|
||||||
AIM_120C = (7, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (7, Weapons.AIM_120C)
|
||||||
AIM_120D = (7, F22AWeapons.AIM_120D)
|
AIM_120D = (7, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon8:
|
class Pylon8:
|
||||||
AIM_120C = (8, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (8, Weapons.AIM_120C)
|
||||||
AIM_120D = (8, F22AWeapons.AIM_120D)
|
AIM_120D = (8, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon9:
|
class Pylon9:
|
||||||
AIM_120C = (9, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM)
|
AIM_120C = (9, Weapons.AIM_120C)
|
||||||
AIM_120D = (9, F22AWeapons.AIM_120D)
|
AIM_120D = (9, F22AWeapons.AIM_120D)
|
||||||
|
|
||||||
class Pylon10:
|
class Pylon10:
|
||||||
|
|||||||
@@ -1056,7 +1056,7 @@ class Hercules(PlaneType):
|
|||||||
class Pylon2:
|
class Pylon2:
|
||||||
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
2,
|
2,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (2, Weapons.Smokewinder___red)
|
Smokewinder___red = (2, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (2, Weapons.Smokewinder___green)
|
Smokewinder___green = (2, Weapons.Smokewinder___green)
|
||||||
@@ -1064,13 +1064,13 @@ class Hercules(PlaneType):
|
|||||||
Smokewinder___white = (2, Weapons.Smokewinder___white)
|
Smokewinder___white = (2, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (2, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (2, Weapons.Smokewinder___orange)
|
||||||
MER_6_Mk_82 = (2, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD)
|
MER_6_Mk_82 = (2, Weapons.MER_6_Mk_82)
|
||||||
Herc_Ext_Fuel_Tank = (2, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
Herc_Ext_Fuel_Tank = (2, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
||||||
|
|
||||||
class Pylon3:
|
class Pylon3:
|
||||||
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
3,
|
3,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (3, Weapons.Smokewinder___red)
|
Smokewinder___red = (3, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (3, Weapons.Smokewinder___green)
|
Smokewinder___green = (3, Weapons.Smokewinder___green)
|
||||||
@@ -1078,13 +1078,13 @@ class Hercules(PlaneType):
|
|||||||
Smokewinder___white = (3, Weapons.Smokewinder___white)
|
Smokewinder___white = (3, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (3, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (3, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (3, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (3, Weapons.Smokewinder___orange)
|
||||||
MER_6_Mk_82 = (3, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD)
|
MER_6_Mk_82 = (3, Weapons.MER_6_Mk_82)
|
||||||
Herc_Ext_Fuel_Tank = (3, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
Herc_Ext_Fuel_Tank = (3, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
||||||
|
|
||||||
class Pylon4:
|
class Pylon4:
|
||||||
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
4,
|
4,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (4, Weapons.Smokewinder___red)
|
Smokewinder___red = (4, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (4, Weapons.Smokewinder___green)
|
Smokewinder___green = (4, Weapons.Smokewinder___green)
|
||||||
@@ -1092,13 +1092,13 @@ class Hercules(PlaneType):
|
|||||||
Smokewinder___white = (4, Weapons.Smokewinder___white)
|
Smokewinder___white = (4, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (4, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (4, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (4, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (4, Weapons.Smokewinder___orange)
|
||||||
MER_6_Mk_82 = (4, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD)
|
MER_6_Mk_82 = (4, Weapons.MER_6_Mk_82)
|
||||||
Herc_Ext_Fuel_Tank = (4, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
Herc_Ext_Fuel_Tank = (4, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
||||||
|
|
||||||
class Pylon5:
|
class Pylon5:
|
||||||
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (
|
||||||
5,
|
5,
|
||||||
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
|
Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_,
|
||||||
)
|
)
|
||||||
Smokewinder___red = (5, Weapons.Smokewinder___red)
|
Smokewinder___red = (5, Weapons.Smokewinder___red)
|
||||||
Smokewinder___green = (5, Weapons.Smokewinder___green)
|
Smokewinder___green = (5, Weapons.Smokewinder___green)
|
||||||
@@ -1106,7 +1106,7 @@ class Hercules(PlaneType):
|
|||||||
Smokewinder___white = (5, Weapons.Smokewinder___white)
|
Smokewinder___white = (5, Weapons.Smokewinder___white)
|
||||||
Smokewinder___yellow = (5, Weapons.Smokewinder___yellow)
|
Smokewinder___yellow = (5, Weapons.Smokewinder___yellow)
|
||||||
Smokewinder___orange = (5, Weapons.Smokewinder___orange)
|
Smokewinder___orange = (5, Weapons.Smokewinder___orange)
|
||||||
MER_6_Mk_82 = (5, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD)
|
MER_6_Mk_82 = (5, Weapons.MER_6_Mk_82)
|
||||||
Herc_Ext_Fuel_Tank = (5, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
Herc_Ext_Fuel_Tank = (5, HerculesWeapons.Herc_Ext_Fuel_Tank)
|
||||||
|
|
||||||
class Pylon6:
|
class Pylon6:
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ from pydcs_extensions.f22a.f22a import F_22A
|
|||||||
from pydcs_extensions.hercules.hercules import Hercules
|
from pydcs_extensions.hercules.hercules import Hercules
|
||||||
from pydcs_extensions.highdigitsams import highdigitsams
|
from pydcs_extensions.highdigitsams import highdigitsams
|
||||||
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
from pydcs_extensions.mb339.mb339 import MB_339PAN
|
||||||
|
from pydcs_extensions.rafale.rafale import Rafale_M, Rafale_A_S, Rafale_B
|
||||||
from pydcs_extensions.su57.su57 import Su_57
|
from pydcs_extensions.su57.su57 import Su_57
|
||||||
import pydcs_extensions.frenchpack.frenchpack as frenchpack
|
import pydcs_extensions.frenchpack.frenchpack as frenchpack
|
||||||
|
|
||||||
MODDED_AIRPLANES = [
|
MODDED_AIRPLANES = [
|
||||||
A_4E_C,
|
A_4E_C,
|
||||||
MB_339PAN,
|
MB_339PAN,
|
||||||
|
Rafale_A_S,
|
||||||
|
Rafale_M,
|
||||||
|
Rafale_B,
|
||||||
Su_57,
|
Su_57,
|
||||||
F_22A,
|
F_22A,
|
||||||
Hercules,
|
Hercules,
|
||||||
|
|||||||
3065
pydcs_extensions/rafale/rafale.py
Normal file
3065
pydcs_extensions/rafale/rafale.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1511,7 +1511,7 @@ class Su_57(PlaneType):
|
|||||||
_15 = "15"
|
_15 = "15"
|
||||||
|
|
||||||
class Pylon1:
|
class Pylon1:
|
||||||
R_73__AA_11_Archer____Infra_Red = (1, Weapons.R_73__AA_11_Archer____Infra_Red)
|
R_73 = (1, Weapons.R_73)
|
||||||
RVV_AE = (1, Su57Weapons.RVV_AE)
|
RVV_AE = (1, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (1, Su57Weapons.RVV_M)
|
RVV_M = (1, Su57Weapons.RVV_M)
|
||||||
Smoke_Generator___red = (1, Weapons.Smoke_Generator___red)
|
Smoke_Generator___red = (1, Weapons.Smoke_Generator___red)
|
||||||
@@ -1522,26 +1522,33 @@ class Su_57(PlaneType):
|
|||||||
Smoke_Generator___orange = (1, Weapons.Smoke_Generator___orange)
|
Smoke_Generator___orange = (1, Weapons.Smoke_Generator___orange)
|
||||||
|
|
||||||
class Pylon2:
|
class Pylon2:
|
||||||
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
|
R_27R = (2, Weapons.R_27R)
|
||||||
2,
|
R_27ER = (2, Weapons.R_27ER)
|
||||||
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
|
R_27T = (2, Weapons.R_27T)
|
||||||
)
|
R_27ET = (2, Weapons.R_27ET)
|
||||||
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
|
R_77 = (2, Weapons.R_77)
|
||||||
2,
|
R_73 = (2, Weapons.R_73)
|
||||||
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
|
Kh_31P = (2, Weapons.Kh_31P)
|
||||||
)
|
Kh_31A = (2, Weapons.Kh_31A)
|
||||||
R_27T = (2, Weapons.R_27T__AA_10_Alamo_B____Infra_Red)
|
Kh_29L = (2, Weapons.Kh_29L)
|
||||||
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
|
Kh_29T = (2, Weapons.Kh_29T)
|
||||||
2,
|
Kh_59M = (2, Weapons.Kh_59M)
|
||||||
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
|
MER_6_FAB_100 = (2, Weapons.MER_6_FAB_100)
|
||||||
)
|
B_8M1___20_S_8KOM = (2, Weapons.B_8M1___20_S_8KOM)
|
||||||
R_77__AA_12_Adder____Active_Rdr = (2, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
B_13L___5_S_13_OF = (2, Weapons.B_13L___5_S_13_OF)
|
||||||
R_73__AA_11_Archer____Infra_Red = (2, Weapons.R_73__AA_11_Archer____Infra_Red)
|
S_25_OFM = (2, Weapons.S_25_OFM)
|
||||||
Kh_31P = (2, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
BetAB_500 = (2, Weapons.BetAB_500)
|
||||||
Kh_31A = (2, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
KMGU_2___96_AO_2_5RT = (2, Weapons.KMGU_2___96_AO_2_5RT)
|
||||||
Kh_29L = (2, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser)
|
KMGU_2___96_PTAB_2_5KO = (2, Weapons.KMGU_2___96_PTAB_2_5KO)
|
||||||
Kh_29T = (2, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided)
|
FAB_250 = (2, Weapons.FAB_250)
|
||||||
Kh_59M = (2, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN)
|
RBK_250_PTAB_2_5M = (2, Weapons.RBK_250_PTAB_2_5M)
|
||||||
|
FAB_500_M62 = (2, Weapons.FAB_500_M62)
|
||||||
|
RBK_500_255_PTAB_10_5 = (2, Weapons.RBK_500_255_PTAB_10_5)
|
||||||
|
KAB_500L = (2, Weapons.KAB_500L)
|
||||||
|
KAB_500kr = (2, Weapons.KAB_500kr)
|
||||||
|
FAB_1500_M54 = (2, Weapons.FAB_1500_M54)
|
||||||
|
KAB_1500L = (2, Weapons.KAB_1500L)
|
||||||
|
MER_6_FAB_250 = (2, Weapons.MER_6_FAB_250)
|
||||||
RVV_BD = (2, Su57Weapons.RVV_BD)
|
RVV_BD = (2, Su57Weapons.RVV_BD)
|
||||||
RVV_AE = (2, Su57Weapons.RVV_AE)
|
RVV_AE = (2, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (2, Su57Weapons.RVV_M)
|
RVV_M = (2, Su57Weapons.RVV_M)
|
||||||
@@ -1558,7 +1565,7 @@ class Su_57(PlaneType):
|
|||||||
Smoke_Generator___orange = (2, Weapons.Smoke_Generator___orange)
|
Smoke_Generator___orange = (2, Weapons.Smoke_Generator___orange)
|
||||||
|
|
||||||
class Pylon3:
|
class Pylon3:
|
||||||
R_73__AA_11_Archer____Infra_Red = (3, Weapons.R_73__AA_11_Archer____Infra_Red)
|
R_73 = (3, Weapons.R_73)
|
||||||
Smoke_Generator___red = (3, Weapons.Smoke_Generator___red)
|
Smoke_Generator___red = (3, Weapons.Smoke_Generator___red)
|
||||||
Smoke_Generator___green = (3, Weapons.Smoke_Generator___green)
|
Smoke_Generator___green = (3, Weapons.Smoke_Generator___green)
|
||||||
Smoke_Generator___blue = (3, Weapons.Smoke_Generator___blue)
|
Smoke_Generator___blue = (3, Weapons.Smoke_Generator___blue)
|
||||||
@@ -1567,29 +1574,33 @@ class Su_57(PlaneType):
|
|||||||
Smoke_Generator___orange = (3, Weapons.Smoke_Generator___orange)
|
Smoke_Generator___orange = (3, Weapons.Smoke_Generator___orange)
|
||||||
|
|
||||||
class Pylon4:
|
class Pylon4:
|
||||||
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
|
R_27R = (4, Weapons.R_27R)
|
||||||
4,
|
R_27ER = (4, Weapons.R_27ER)
|
||||||
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
|
R_27T = (4, Weapons.R_27T)
|
||||||
)
|
R_27ET = (4, Weapons.R_27ET)
|
||||||
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
|
R_77 = (4, Weapons.R_77)
|
||||||
4,
|
R_73 = (4, Weapons.R_73)
|
||||||
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
|
Kh_31P = (4, Weapons.Kh_31P)
|
||||||
)
|
Kh_31A = (4, Weapons.Kh_31A)
|
||||||
R_27T__AA_10_Alamo_B____Infra_Red = (
|
Kh_29L = (4, Weapons.Kh_29L)
|
||||||
4,
|
Kh_29T = (4, Weapons.Kh_29T)
|
||||||
Weapons.R_27T__AA_10_Alamo_B____Infra_Red,
|
Kh_59M = (4, Weapons.Kh_59M)
|
||||||
)
|
MER_6_FAB_100 = (4, Weapons.MER_6_FAB_100)
|
||||||
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
|
B_8M1___20_S_8KOM = (4, Weapons.B_8M1___20_S_8KOM)
|
||||||
4,
|
B_13L___5_S_13_OF = (4, Weapons.B_13L___5_S_13_OF)
|
||||||
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
|
S_25_OFM = (4, Weapons.S_25_OFM)
|
||||||
)
|
BetAB_500 = (4, Weapons.BetAB_500)
|
||||||
R_77__AA_12_Adder____Active_Rdr = (4, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
KMGU_2___96_AO_2_5RT = (4, Weapons.KMGU_2___96_AO_2_5RT)
|
||||||
R_73__AA_11_Archer____Infra_Red = (4, Weapons.R_73__AA_11_Archer____Infra_Red)
|
KMGU_2___96_PTAB_2_5KO = (4, Weapons.KMGU_2___96_PTAB_2_5KO)
|
||||||
Kh_31P = (4, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
FAB_250 = (4, Weapons.FAB_250)
|
||||||
Kh_31A = (4, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
RBK_250_PTAB_2_5M = (4, Weapons.RBK_250_PTAB_2_5M)
|
||||||
Kh_29L = (4, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser)
|
FAB_500_M62 = (4, Weapons.FAB_500_M62)
|
||||||
Kh_29T = (4, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided)
|
RBK_500_255_PTAB_10_5 = (4, Weapons.RBK_500_255_PTAB_10_5)
|
||||||
Kh_59M = (4, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN)
|
KAB_500L = (4, Weapons.KAB_500L)
|
||||||
|
KAB_500kr = (4, Weapons.KAB_500kr)
|
||||||
|
FAB_1500_M54 = (4, Weapons.FAB_1500_M54)
|
||||||
|
KAB_1500L = (4, Weapons.KAB_1500L)
|
||||||
|
MER_6_FAB_250 = (4, Weapons.MER_6_FAB_250)
|
||||||
RVV_BD = (4, Su57Weapons.RVV_BD)
|
RVV_BD = (4, Su57Weapons.RVV_BD)
|
||||||
RVV_AE = (4, Su57Weapons.RVV_AE)
|
RVV_AE = (4, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (4, Su57Weapons.RVV_M)
|
RVV_M = (4, Su57Weapons.RVV_M)
|
||||||
@@ -1599,50 +1610,57 @@ class Su_57(PlaneType):
|
|||||||
Kh_59MK2 = (4, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (4, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon5:
|
class Pylon5:
|
||||||
R_77__AA_12_Adder____Active_Rdr = (5, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
R_77 = (5, Weapons.R_77)
|
||||||
RVV_AE = (5, Su57Weapons.RVV_AE)
|
RVV_AE = (5, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (5, Su57Weapons.RVV_M)
|
RVV_M = (5, Su57Weapons.RVV_M)
|
||||||
Kh_59MK2 = (5, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (5, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon6:
|
class Pylon6:
|
||||||
R_77__AA_12_Adder____Active_Rdr = (6, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
R_77 = (6, Weapons.R_77)
|
||||||
RVV_AE = (6, Su57Weapons.RVV_AE)
|
RVV_AE = (6, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (6, Su57Weapons.RVV_M)
|
RVV_M = (6, Su57Weapons.RVV_M)
|
||||||
Kh_59MK2 = (6, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (6, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon7:
|
class Pylon7:
|
||||||
R_77__AA_12_Adder____Active_Rdr = (7, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
R_77 = (7, Weapons.R_77)
|
||||||
RVV_AE = (7, Su57Weapons.RVV_AE)
|
RVV_AE = (7, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (7, Su57Weapons.RVV_M)
|
RVV_M = (7, Su57Weapons.RVV_M)
|
||||||
Kh_59MK2 = (7, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (7, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon8:
|
class Pylon8:
|
||||||
R_77__AA_12_Adder____Active_Rdr = (8, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
R_77 = (8, Weapons.R_77)
|
||||||
RVV_AE = (8, Su57Weapons.RVV_AE)
|
RVV_AE = (8, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (8, Su57Weapons.RVV_M)
|
RVV_M = (8, Su57Weapons.RVV_M)
|
||||||
Kh_59MK2 = (8, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (8, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon9:
|
class Pylon9:
|
||||||
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
|
R_27R = (9, Weapons.R_27R)
|
||||||
9,
|
R_27ER = (9, Weapons.R_27ER)
|
||||||
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
|
R_27T = (9, Weapons.R_27T)
|
||||||
)
|
R_27ET = (9, Weapons.R_27ET)
|
||||||
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
|
R_77 = (9, Weapons.R_77)
|
||||||
9,
|
R_73 = (9, Weapons.R_73)
|
||||||
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
|
Kh_31P = (9, Weapons.Kh_31P)
|
||||||
)
|
Kh_31A = (9, Weapons.Kh_31A)
|
||||||
R_27T = (9, Weapons.R_27T__AA_10_Alamo_B____Infra_Red)
|
Kh_29L = (9, Weapons.Kh_29L)
|
||||||
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
|
Kh_29T = (9, Weapons.Kh_29T)
|
||||||
9,
|
Kh_59M = (9, Weapons.Kh_59M)
|
||||||
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
|
MER_6_FAB_100 = (9, Weapons.MER_6_FAB_100)
|
||||||
)
|
B_8M1___20_S_8KOM = (9, Weapons.B_8M1___20_S_8KOM)
|
||||||
R_77__AA_12_Adder____Active_Rdr = (9, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
B_13L___5_S_13_OF = (9, Weapons.B_13L___5_S_13_OF)
|
||||||
R_73__AA_11_Archer____Infra_Red = (9, Weapons.R_73__AA_11_Archer____Infra_Red)
|
S_25_OFM = (9, Weapons.S_25_OFM)
|
||||||
Kh_31P = (9, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
BetAB_500 = (9, Weapons.BetAB_500)
|
||||||
Kh_31A = (9, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
KMGU_2___96_AO_2_5RT = (9, Weapons.KMGU_2___96_AO_2_5RT)
|
||||||
Kh_29L = (9, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser)
|
KMGU_2___96_PTAB_2_5KO = (9, Weapons.KMGU_2___96_PTAB_2_5KO)
|
||||||
Kh_29T = (9, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided)
|
FAB_250 = (9, Weapons.FAB_250)
|
||||||
Kh_59M = (9, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN)
|
RBK_250_PTAB_2_5M = (9, Weapons.RBK_250_PTAB_2_5M)
|
||||||
|
FAB_500_M62 = (9, Weapons.FAB_500_M62)
|
||||||
|
RBK_500_255_PTAB_10_5 = (9, Weapons.RBK_500_255_PTAB_10_5)
|
||||||
|
KAB_500L = (9, Weapons.KAB_500L)
|
||||||
|
KAB_500kr = (9, Weapons.KAB_500kr)
|
||||||
|
FAB_1500_M54 = (9, Weapons.FAB_1500_M54)
|
||||||
|
KAB_1500L = (9, Weapons.KAB_1500L)
|
||||||
|
MER_6_FAB_250 = (9, Weapons.MER_6_FAB_250)
|
||||||
RVV_BD = (9, Su57Weapons.RVV_BD)
|
RVV_BD = (9, Su57Weapons.RVV_BD)
|
||||||
RVV_AE = (9, Su57Weapons.RVV_AE)
|
RVV_AE = (9, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (9, Su57Weapons.RVV_M)
|
RVV_M = (9, Su57Weapons.RVV_M)
|
||||||
@@ -1652,7 +1670,7 @@ class Su_57(PlaneType):
|
|||||||
Kh_59MK2 = (9, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (9, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon10:
|
class Pylon10:
|
||||||
R_73__AA_11_Archer____Infra_Red = (10, Weapons.R_73__AA_11_Archer____Infra_Red)
|
R_73 = (10, Weapons.R_73)
|
||||||
Smoke_Generator___red = (10, Weapons.Smoke_Generator___red)
|
Smoke_Generator___red = (10, Weapons.Smoke_Generator___red)
|
||||||
Smoke_Generator___green = (10, Weapons.Smoke_Generator___green)
|
Smoke_Generator___green = (10, Weapons.Smoke_Generator___green)
|
||||||
Smoke_Generator___blue = (10, Weapons.Smoke_Generator___blue)
|
Smoke_Generator___blue = (10, Weapons.Smoke_Generator___blue)
|
||||||
@@ -1661,26 +1679,33 @@ class Su_57(PlaneType):
|
|||||||
Smoke_Generator___orange = (10, Weapons.Smoke_Generator___orange)
|
Smoke_Generator___orange = (10, Weapons.Smoke_Generator___orange)
|
||||||
|
|
||||||
class Pylon11:
|
class Pylon11:
|
||||||
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
|
R_27R = (11, Weapons.R_27R)
|
||||||
11,
|
R_27ER = (11, Weapons.R_27ER)
|
||||||
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
|
R_27T = (11, Weapons.R_27T)
|
||||||
)
|
R_27ET = (11, Weapons.R_27ET)
|
||||||
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
|
R_77 = (11, Weapons.R_77)
|
||||||
11,
|
R_73 = (11, Weapons.R_73)
|
||||||
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
|
Kh_31P = (11, Weapons.Kh_31P)
|
||||||
)
|
Kh_31A = (11, Weapons.Kh_31A)
|
||||||
R_27T = (11, Weapons.R_27T__AA_10_Alamo_B____Infra_Red)
|
Kh_29L = (11, Weapons.Kh_29L)
|
||||||
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
|
Kh_29T = (11, Weapons.Kh_29T)
|
||||||
11,
|
Kh_59M = (11, Weapons.Kh_59M)
|
||||||
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
|
MER_6_FAB_100 = (11, Weapons.MER_6_FAB_100)
|
||||||
)
|
B_8M1___20_S_8KOM = (11, Weapons.B_8M1___20_S_8KOM)
|
||||||
R_77__AA_12_Adder____Active_Rdr = (11, Weapons.R_77__AA_12_Adder____Active_Rdr)
|
B_13L___5_S_13_OF = (11, Weapons.B_13L___5_S_13_OF)
|
||||||
R_73__AA_11_Archer____Infra_Red = (11, Weapons.R_73__AA_11_Archer____Infra_Red)
|
S_25_OFM = (11, Weapons.S_25_OFM)
|
||||||
Kh_31P = (11, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
BetAB_500 = (11, Weapons.BetAB_500)
|
||||||
Kh_31A = (11, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr)
|
KMGU_2___96_AO_2_5RT = (11, Weapons.KMGU_2___96_AO_2_5RT)
|
||||||
Kh_29L = (11, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser)
|
KMGU_2___96_PTAB_2_5KO = (11, Weapons.KMGU_2___96_PTAB_2_5KO)
|
||||||
Kh_29T = (11, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided)
|
FAB_250 = (11, Weapons.FAB_250)
|
||||||
Kh_59M = (11, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN)
|
RBK_250_PTAB_2_5M = (11, Weapons.RBK_250_PTAB_2_5M)
|
||||||
|
FAB_500_M62 = (11, Weapons.FAB_500_M62)
|
||||||
|
RBK_500_255_PTAB_10_5 = (11, Weapons.RBK_500_255_PTAB_10_5)
|
||||||
|
KAB_500L = (11, Weapons.KAB_500L)
|
||||||
|
KAB_500kr = (11, Weapons.KAB_500kr)
|
||||||
|
FAB_1500_M54 = (11, Weapons.FAB_1500_M54)
|
||||||
|
KAB_1500L = (11, Weapons.KAB_1500L)
|
||||||
|
MER_6_FAB_250 = (11, Weapons.MER_6_FAB_250)
|
||||||
# ERRR {R-33}
|
# ERRR {R-33}
|
||||||
RVV_BD = (11, Su57Weapons.RVV_BD)
|
RVV_BD = (11, Su57Weapons.RVV_BD)
|
||||||
RVV_AE = (11, Su57Weapons.RVV_AE)
|
RVV_AE = (11, Su57Weapons.RVV_AE)
|
||||||
@@ -1698,7 +1723,7 @@ class Su_57(PlaneType):
|
|||||||
Kh_59MK2 = (11, Su57Weapons.Kh_59MK2)
|
Kh_59MK2 = (11, Su57Weapons.Kh_59MK2)
|
||||||
|
|
||||||
class Pylon12:
|
class Pylon12:
|
||||||
R_73__AA_11_Archer____Infra_Red = (12, Weapons.R_73__AA_11_Archer____Infra_Red)
|
R_73 = (12, Weapons.R_73)
|
||||||
RVV_AE = (12, Su57Weapons.RVV_AE)
|
RVV_AE = (12, Su57Weapons.RVV_AE)
|
||||||
RVV_M = (12, Su57Weapons.RVV_M)
|
RVV_M = (12, Su57Weapons.RVV_M)
|
||||||
Smoke_Generator___red = (12, Weapons.Smoke_Generator___red)
|
Smoke_Generator___red = (12, Weapons.Smoke_Generator___red)
|
||||||
|
|||||||
@@ -103,9 +103,7 @@ class DisplayOptions:
|
|||||||
waypoint_info = DisplayRule("Waypoint Information", True)
|
waypoint_info = DisplayRule("Waypoint Information", True)
|
||||||
culling = DisplayRule("Display Culling Zones", False)
|
culling = DisplayRule("Display Culling Zones", False)
|
||||||
actual_frontline_pos = DisplayRule("Display Actual Frontline Location", False)
|
actual_frontline_pos = DisplayRule("Display Actual Frontline Location", False)
|
||||||
patrol_engagement_range = DisplayRule(
|
barcap_commit_range = DisplayRule("Display selected BARCAP commit range", False)
|
||||||
"Display selected patrol engagement range", True
|
|
||||||
)
|
|
||||||
flight_paths = FlightPathOptions()
|
flight_paths = FlightPathOptions()
|
||||||
blue_threat_zones = ThreatZoneOptions("Blue")
|
blue_threat_zones = ThreatZoneOptions("Blue")
|
||||||
red_threat_zones = ThreatZoneOptions("Red")
|
red_threat_zones = ThreatZoneOptions("Red")
|
||||||
|
|||||||
@@ -147,16 +147,12 @@ def load_icons():
|
|||||||
"./resources/ui/ground_assets/" + category + "_blue.png"
|
"./resources/ui/ground_assets/" + category + "_blue.png"
|
||||||
)
|
)
|
||||||
ICONS["destroyed"] = QPixmap("./resources/ui/ground_assets/destroyed.png")
|
ICONS["destroyed"] = QPixmap("./resources/ui/ground_assets/destroyed.png")
|
||||||
ICONS["EWR"] = QPixmap("./resources/ui/ground_assets/ewr.png")
|
|
||||||
ICONS["EWR_blue"] = QPixmap("./resources/ui/ground_assets/ewr_blue.png")
|
|
||||||
ICONS["ship"] = QPixmap("./resources/ui/ground_assets/ship.png")
|
ICONS["ship"] = QPixmap("./resources/ui/ground_assets/ship.png")
|
||||||
ICONS["ship_blue"] = QPixmap("./resources/ui/ground_assets/ship_blue.png")
|
ICONS["ship_blue"] = QPixmap("./resources/ui/ground_assets/ship_blue.png")
|
||||||
ICONS["missile"] = QPixmap("./resources/ui/ground_assets/missile.png")
|
ICONS["missile"] = QPixmap("./resources/ui/ground_assets/missile.png")
|
||||||
ICONS["missile_blue"] = QPixmap("./resources/ui/ground_assets/missile_blue.png")
|
ICONS["missile_blue"] = QPixmap("./resources/ui/ground_assets/missile_blue.png")
|
||||||
ICONS["nothreat"] = QPixmap("./resources/ui/ground_assets/nothreat.png")
|
ICONS["nothreat"] = QPixmap("./resources/ui/ground_assets/nothreat.png")
|
||||||
ICONS["nothreat_blue"] = QPixmap("./resources/ui/ground_assets/nothreat_blue.png")
|
ICONS["nothreat_blue"] = QPixmap("./resources/ui/ground_assets/nothreat_blue.png")
|
||||||
ICONS["coastal"] = QPixmap("./resources/ui/ground_assets/coastal.png")
|
|
||||||
ICONS["coastal_blue"] = QPixmap("./resources/ui/ground_assets/coastal_blue.png")
|
|
||||||
|
|
||||||
ICONS["Generator"] = QPixmap(
|
ICONS["Generator"] = QPixmap(
|
||||||
"./resources/ui/misc/" + get_theme_icons() + "/generator.png"
|
"./resources/ui/misc/" + get_theme_icons() + "/generator.png"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from PySide2.QtWidgets import (
|
|||||||
QLabel,
|
QLabel,
|
||||||
QVBoxLayout,
|
QVBoxLayout,
|
||||||
)
|
)
|
||||||
from dcs.weather import CloudPreset, Weather as PydcsWeather
|
from dcs.weather import Weather as PydcsWeather
|
||||||
|
|
||||||
import qt_ui.uiconstants as CONST
|
import qt_ui.uiconstants as CONST
|
||||||
from game.utils import mps
|
from game.utils import mps
|
||||||
@@ -162,7 +162,7 @@ class QWeatherWidget(QGroupBox):
|
|||||||
self.turn = turn
|
self.turn = turn
|
||||||
self.conditions = conditions
|
self.conditions = conditions
|
||||||
|
|
||||||
self.update_forecast()
|
self.updateForecast()
|
||||||
self.updateWinds()
|
self.updateWinds()
|
||||||
|
|
||||||
def updateWinds(self):
|
def updateWinds(self):
|
||||||
@@ -186,76 +186,55 @@ class QWeatherWidget(QGroupBox):
|
|||||||
self.windFL26SpeedLabel.setText(f"{int(windFL26Speed.knots)}kts")
|
self.windFL26SpeedLabel.setText(f"{int(windFL26Speed.knots)}kts")
|
||||||
self.windFL26DirLabel.setText(f"{windFL26Dir}º")
|
self.windFL26DirLabel.setText(f"{windFL26Dir}º")
|
||||||
|
|
||||||
def update_forecast_from_preset(self, preset: CloudPreset) -> None:
|
def updateForecast(self):
|
||||||
self.forecastFog.setText("No fog")
|
|
||||||
if "Rain" in preset.name:
|
|
||||||
self.forecastRain.setText("Rain")
|
|
||||||
self.update_forecast_icons("rain")
|
|
||||||
else:
|
|
||||||
self.forecastRain.setText("No rain")
|
|
||||||
self.update_forecast_icons("partly-cloudy")
|
|
||||||
|
|
||||||
# We get a description like the following for the cloud preset.
|
|
||||||
#
|
|
||||||
# 09 ##Two Layer Broken/Scattered \nMETAR:BKN 7.5/10 SCT 20/22 FEW41
|
|
||||||
#
|
|
||||||
# The second line is probably interesting but doesn't fit into the widget
|
|
||||||
# currently, so for now just extract the first line.
|
|
||||||
self.forecastClouds.setText(preset.description.splitlines()[0].split("##")[1])
|
|
||||||
|
|
||||||
def update_forecast(self):
|
|
||||||
"""Updates the Forecast Text and icon with the current conditions wind info."""
|
"""Updates the Forecast Text and icon with the current conditions wind info."""
|
||||||
if (
|
icon = []
|
||||||
self.conditions.weather.clouds
|
|
||||||
and self.conditions.weather.clouds.preset is not None
|
|
||||||
):
|
|
||||||
self.update_forecast_from_preset(self.conditions.weather.clouds.preset)
|
|
||||||
return
|
|
||||||
|
|
||||||
if self.conditions.weather.clouds is None:
|
if self.conditions.weather.clouds is None:
|
||||||
cloud_density = 0
|
cloudDensity = 0
|
||||||
precipitation = None
|
precipitation = None
|
||||||
else:
|
else:
|
||||||
cloud_density = self.conditions.weather.clouds.density
|
cloudDensity = self.conditions.weather.clouds.density
|
||||||
precipitation = self.conditions.weather.clouds.precipitation
|
precipitation = self.conditions.weather.clouds.precipitation
|
||||||
|
|
||||||
if not cloud_density:
|
fog = self.conditions.weather.fog or None
|
||||||
|
is_night = self.conditions.time_of_day == TimeOfDay.Night
|
||||||
|
time = "night" if is_night else "day"
|
||||||
|
|
||||||
|
if cloudDensity <= 0:
|
||||||
self.forecastClouds.setText("Sunny")
|
self.forecastClouds.setText("Sunny")
|
||||||
weather_type = "clear"
|
icon = [time, "clear"]
|
||||||
elif cloud_density < 3:
|
|
||||||
|
if cloudDensity > 0 and cloudDensity < 3:
|
||||||
self.forecastClouds.setText("Partly Cloudy")
|
self.forecastClouds.setText("Partly Cloudy")
|
||||||
weather_type = "partly-cloudy"
|
icon = [time, "partly-cloudy"]
|
||||||
elif cloud_density < 5:
|
|
||||||
|
if cloudDensity >= 3 and cloudDensity < 5:
|
||||||
self.forecastClouds.setText("Mostly Cloudy")
|
self.forecastClouds.setText("Mostly Cloudy")
|
||||||
weather_type = "partly-cloudy"
|
icon = [time, "partly-cloudy"]
|
||||||
else:
|
|
||||||
|
if cloudDensity >= 5:
|
||||||
self.forecastClouds.setText("Totally Cloudy")
|
self.forecastClouds.setText("Totally Cloudy")
|
||||||
weather_type = "partly-cloudy"
|
icon = [time, "partly-cloudy"]
|
||||||
|
|
||||||
if precipitation == PydcsWeather.Preceptions.Rain:
|
if precipitation == PydcsWeather.Preceptions.Rain:
|
||||||
self.forecastRain.setText("Rain")
|
self.forecastRain.setText("Rain")
|
||||||
weather_type = "rain"
|
icon = [time, "rain"]
|
||||||
|
|
||||||
elif precipitation == PydcsWeather.Preceptions.Thunderstorm:
|
elif precipitation == PydcsWeather.Preceptions.Thunderstorm:
|
||||||
self.forecastRain.setText("Thunderstorm")
|
self.forecastRain.setText("Thunderstorm")
|
||||||
weather_type = "thunderstorm"
|
icon = [time, "thunderstorm"]
|
||||||
else:
|
|
||||||
self.forecastRain.setText("No rain")
|
|
||||||
|
|
||||||
if not self.conditions.weather.fog is not None:
|
else:
|
||||||
|
self.forecastRain.setText("No Rain")
|
||||||
|
|
||||||
|
if not fog:
|
||||||
self.forecastFog.setText("No fog")
|
self.forecastFog.setText("No fog")
|
||||||
else:
|
else:
|
||||||
visibility = round(self.conditions.weather.fog.visibility.nautical_miles, 1)
|
visibility = round(fog.visibility.nautical_miles, 1)
|
||||||
self.forecastFog.setText(f"Fog vis: {visibility}nm")
|
self.forecastFog.setText(f"Fog vis: {visibility}nm")
|
||||||
if cloud_density > 1:
|
icon = [time, ("cloudy" if cloudDensity > 1 else None), "fog"]
|
||||||
weather_type = "cloudy-fog"
|
|
||||||
else:
|
|
||||||
weather_type = "fog"
|
|
||||||
|
|
||||||
self.update_forecast_icons(weather_type)
|
icon_key = "Weather_{}".format("-".join(filter(None.__ne__, icon)))
|
||||||
|
|
||||||
def update_forecast_icons(self, weather_type: str) -> None:
|
|
||||||
time = "night" if self.conditions.time_of_day == TimeOfDay.Night else "day"
|
|
||||||
icon_key = f"Weather_{time}-{weather_type}"
|
|
||||||
icon = CONST.ICONS.get(icon_key) or CONST.ICONS["Weather_night-partly-cloudy"]
|
icon = CONST.ICONS.get(icon_key) or CONST.ICONS["Weather_night-partly-cloudy"]
|
||||||
self.weather_icon.setPixmap(icon)
|
self.weather_icon.setPixmap(icon)
|
||||||
|
|
||||||
|
|||||||
@@ -90,12 +90,6 @@ class QAircraftTypeSelector(QComboBox):
|
|||||||
f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}",
|
f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}",
|
||||||
userData=aircraft,
|
userData=aircraft,
|
||||||
)
|
)
|
||||||
elif mission_type in [FlightType.AEWC]:
|
|
||||||
if aircraft in gen.flights.ai_flight_planner_db.AEWC_CAPABLE:
|
|
||||||
self.addItem(
|
|
||||||
f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}",
|
|
||||||
userData=aircraft,
|
|
||||||
)
|
|
||||||
current_aircraft_index = self.findData(current_aircraft)
|
current_aircraft_index = self.findData(current_aircraft)
|
||||||
if current_aircraft_index != -1:
|
if current_aircraft_index != -1:
|
||||||
self.setCurrentIndex(current_aircraft_index)
|
self.setCurrentIndex(current_aircraft_index)
|
||||||
|
|||||||
@@ -58,8 +58,6 @@ from gen.flights.flightplan import (
|
|||||||
FlightPlan,
|
FlightPlan,
|
||||||
FlightPlanBuilder,
|
FlightPlanBuilder,
|
||||||
InvalidObjectiveLocation,
|
InvalidObjectiveLocation,
|
||||||
PatrollingFlightPlan,
|
|
||||||
TarCapFlightPlan,
|
|
||||||
)
|
)
|
||||||
from gen.flights.traveltime import TotEstimator
|
from gen.flights.traveltime import TotEstimator
|
||||||
from qt_ui.displayoptions import DisplayOptions, ThreatZoneOptions
|
from qt_ui.displayoptions import DisplayOptions, ThreatZoneOptions
|
||||||
@@ -497,7 +495,6 @@ class QLiberationMap(QGraphicsView):
|
|||||||
package = Package(target)
|
package = Package(target)
|
||||||
flight = Flight(
|
flight = Flight(
|
||||||
package,
|
package,
|
||||||
self.game.player_country if player else self.game.enemy_country,
|
|
||||||
F_16C_50,
|
F_16C_50,
|
||||||
2,
|
2,
|
||||||
task,
|
task,
|
||||||
@@ -723,11 +720,13 @@ class QLiberationMap(QGraphicsView):
|
|||||||
)
|
)
|
||||||
prev_pos = tuple(new_pos)
|
prev_pos = tuple(new_pos)
|
||||||
|
|
||||||
if selected and DisplayOptions.patrol_engagement_range:
|
if selected and DisplayOptions.barcap_commit_range:
|
||||||
self.draw_patrol_commit_range(scene, flight)
|
self.draw_barcap_commit_range(scene, flight)
|
||||||
|
|
||||||
def draw_patrol_commit_range(self, scene: QGraphicsScene, flight: Flight) -> None:
|
def draw_barcap_commit_range(self, scene: QGraphicsScene, flight: Flight) -> None:
|
||||||
if not isinstance(flight.flight_plan, PatrollingFlightPlan):
|
if flight.flight_type is not FlightType.BARCAP:
|
||||||
|
return
|
||||||
|
if not isinstance(flight.flight_plan, BarCapFlightPlan):
|
||||||
return
|
return
|
||||||
start = flight.flight_plan.patrol_start
|
start = flight.flight_plan.patrol_start
|
||||||
end = flight.flight_plan.patrol_end
|
end = flight.flight_plan.patrol_end
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ from game import Game
|
|||||||
from game.data.building_data import FORTIFICATION_BUILDINGS
|
from game.data.building_data import FORTIFICATION_BUILDINGS
|
||||||
from game.db import REWARDS
|
from game.db import REWARDS
|
||||||
from game.theater import ControlPoint, TheaterGroundObject
|
from game.theater import ControlPoint, TheaterGroundObject
|
||||||
from game.theater.theatergroundobject import (
|
from game.theater.theatergroundobject import MissileSiteGroundObject
|
||||||
MissileSiteGroundObject,
|
|
||||||
CoastalSiteGroundObject,
|
|
||||||
)
|
|
||||||
from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu
|
from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu
|
||||||
from .QMapObject import QMapObject
|
from .QMapObject import QMapObject
|
||||||
from ...displayoptions import DisplayOptions
|
from ...displayoptions import DisplayOptions
|
||||||
@@ -88,8 +85,6 @@ class QMapGroundObject(QMapObject):
|
|||||||
cat = "ship"
|
cat = "ship"
|
||||||
if isinstance(self.ground_object, MissileSiteGroundObject):
|
if isinstance(self.ground_object, MissileSiteGroundObject):
|
||||||
cat = "missile"
|
cat = "missile"
|
||||||
if isinstance(self.ground_object, CoastalSiteGroundObject):
|
|
||||||
cat = "coastal"
|
|
||||||
|
|
||||||
rect = QRect(
|
rect = QRect(
|
||||||
option.rect.x() + 2,
|
option.rect.x() + 2,
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ class QUnitInfoWindow(QDialog):
|
|||||||
|
|
||||||
header = QLabel(self)
|
header = QLabel(self)
|
||||||
header.setGeometry(0, 0, 720, 360)
|
header.setGeometry(0, 0, 720, 360)
|
||||||
|
|
||||||
pixmap = None
|
pixmap = None
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user