Experience the Battle of Britain on the Channel map !
Note: It is not possible to cross the channel to capture enemy bases yet, but you can consider you won if you manage to destroy all the ennemy targets
", - "miz": "battle_of_britain.miz" + "miz": "battle_of_britain.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/black_sea.json b/resources/campaigns/black_sea.json index 116c7a3b..83cbe20b 100644 --- a/resources/campaigns/black_sea.json +++ b/resources/campaigns/black_sea.json @@ -3,5 +3,6 @@ "theater": "Caucasus", "authors": "Colonel Panic", "description": "A medium sized theater with bases along the coast of the Black Sea.
", - "miz": "black_sea.miz" + "miz": "black_sea.miz", + "performance": 2 } \ No newline at end of file diff --git a/resources/campaigns/black_sea_lite.json b/resources/campaigns/black_sea_lite.json new file mode 100644 index 00000000..08fddc25 --- /dev/null +++ b/resources/campaigns/black_sea_lite.json @@ -0,0 +1,8 @@ +{ + "name": "Caucasus - Black Sea Lite", + "theater": "Caucasus", + "authors": "Starfire", + "description": "A Small sized theater with bases along the coast of the Black Sea, lite version of ColonelPanic's Black Sea campaign scenario.
", + "miz": "black_sea_lite.miz", + "performance": 1 +} \ No newline at end of file diff --git a/resources/campaigns/black_sea_lite.miz b/resources/campaigns/black_sea_lite.miz new file mode 100644 index 00000000..4c6297ab Binary files /dev/null and b/resources/campaigns/black_sea_lite.miz differ diff --git a/resources/campaigns/desert_war.json b/resources/campaigns/desert_war.json index 5cd60c84..2c076f9d 100644 --- a/resources/campaigns/desert_war.json +++ b/resources/campaigns/desert_war.json @@ -2,6 +2,9 @@ "name": "Persian Gulf - Desert War", "theater": "Persian Gulf", "authors": "Khopa", + "recommended_player_faction": "USA 2005", + "recommended_enemy_faction": "Iran 2015", "description": "This is a simple scenario in the Desert near Dubai and Abu-Dhabi. Progress from Liwa airbase to Al-Minhad.
This scenario shouldn't require too much performance.
", - "miz": "desert_war.miz" + "miz": "desert_war.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/desert_war.miz b/resources/campaigns/desert_war.miz index 0a11477e..a1044bac 100644 Binary files a/resources/campaigns/desert_war.miz and b/resources/campaigns/desert_war.miz differ diff --git a/resources/campaigns/dunkirk.json b/resources/campaigns/dunkirk.json index 8ccbe8ba..47859eab 100644 --- a/resources/campaigns/dunkirk.json +++ b/resources/campaigns/dunkirk.json @@ -2,6 +2,9 @@ "name": "The Channel - Dunkirk", "theater": "The Channel", "authors": "Khopa", + "recommended_player_faction": "Allies 1944", + "recommended_enemy_faction": "Germany 1942", "description": "In this scenario, your forces starts in Dunkirk and can be supported by the airfields on the other side of the Channel.
If you select the inverted configuration, you can play a German invasion of England.
Note: B-17 should be operated from Manston airfield
", - "miz": "dunkirk.miz" + "miz": "dunkirk.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/emirates.json b/resources/campaigns/emirates.json index 6579d3e8..78ffc4f9 100644 --- a/resources/campaigns/emirates.json +++ b/resources/campaigns/emirates.json @@ -2,6 +2,9 @@ "name": "Persian Gulf - Emirates", "theater": "Persian Gulf", "authors": "Khopa", + "recommended_player_faction": "USA 2005", + "recommended_enemy_faction": "Iran 2015", "description": "In this scenario, you can play an invasion of the Emirates and Oman, where your forces starts in Fujairah.
Note: Fujairah airfield has very few slots for aircrafts, so it recommended to operate from carriers at the start of the campaign. Thus, a carrier-capable faction is recommended.
", - "miz": "emirates.miz" + "miz": "emirates.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/exercise_vegas_nerve.json b/resources/campaigns/exercise_vegas_nerve.json new file mode 100644 index 00000000..03f2b7af --- /dev/null +++ b/resources/campaigns/exercise_vegas_nerve.json @@ -0,0 +1,8 @@ +{ + "name": "Nevada - Exercise Vegas Nerve", + "theater": "Nevada", + "authors": "Starfire", + "description": "A Red Flag Exercise scenario for the NTTR comprising 4 control points.
", + "miz": "exercise_vegas_nerve.miz", + "performance": 0 +} \ No newline at end of file diff --git a/resources/campaigns/exercise_vegas_nerve.miz b/resources/campaigns/exercise_vegas_nerve.miz new file mode 100644 index 00000000..7c0e3e25 Binary files /dev/null and b/resources/campaigns/exercise_vegas_nerve.miz differ diff --git a/resources/campaigns/full_caucasus.json b/resources/campaigns/full_caucasus.json index a11173ef..35fdc4a5 100644 --- a/resources/campaigns/full_caucasus.json +++ b/resources/campaigns/full_caucasus.json @@ -3,5 +3,6 @@ "theater": "Caucasus", "authors": "george", "description": "Full map of the Caucasus
Note: This scenario is heavy on performance, enabling \"culling\" in settings is highly recommended.
", - "miz": "full_caucasus.miz" + "miz": "full_caucasus.miz", + "performance": 3 } \ No newline at end of file diff --git a/resources/campaigns/golan_heights.json b/resources/campaigns/golan_heights.json index 01973830..bd6106b0 100644 --- a/resources/campaigns/golan_heights.json +++ b/resources/campaigns/golan_heights.json @@ -2,6 +2,9 @@ "name": "Syria - Battle for Golan Heights", "theater": "Syria", "authors": "Khopa", + "recommended_player_faction": "Israel 2000", + "recommended_enemy_faction": "Syria 2011", "description": "In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.
You can use the inverted configuration to start on the Syrian side.
If this scenario is too heavy, try the lite version.
In this scenario, you start in Israel and the conflict is focused around the golan heights, an historically disputed territory.
This scenario is designed to be performance friendly.
In this scenario, you start from Jordan, and have to fight your way through eastern Syria.
", - "miz": "inherent_resolve.miz" + "miz": "inherent_resolve.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/invasion_from_turkey.json b/resources/campaigns/invasion_from_turkey.json index f259a1e4..5610312a 100644 --- a/resources/campaigns/invasion_from_turkey.json +++ b/resources/campaigns/invasion_from_turkey.json @@ -2,6 +2,9 @@ "name": "Syria - Invasion from Turkey", "theater": "Syria", "authors": "Khopa", + "recommended_player_faction": "Turkey 2005", + "recommended_enemy_faction": "Insurgents (Hard)", "description": "In this scenario, you start from Turkey and have to invade territories in northern Syria.
", - "miz": "invasion_from_turkey.miz" + "miz": "invasion_from_turkey.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/invasion_of_iran.json b/resources/campaigns/invasion_of_iran.json index 8a8d475f..cb22512d 100644 --- a/resources/campaigns/invasion_of_iran.json +++ b/resources/campaigns/invasion_of_iran.json @@ -2,6 +2,9 @@ "name": "Persian Gulf - Invasion of Iran", "theater": "Persian Gulf", "authors": "Khopa", + "recommended_player_faction": "USA 2005", + "recommended_enemy_faction": "Iran 2015", "description": "In this scenario, you start in Bandar Abbas, and must invade Iran.
", - "miz": "invasion_of_iran.miz" + "miz": "invasion_of_iran.miz", + "performance": 3 } \ No newline at end of file diff --git a/resources/campaigns/invasion_of_iran_[lite].json b/resources/campaigns/invasion_of_iran_[lite].json index 684c9cc9..fbeba09e 100644 --- a/resources/campaigns/invasion_of_iran_[lite].json +++ b/resources/campaigns/invasion_of_iran_[lite].json @@ -2,6 +2,9 @@ "name": "Persian Gulf - Invasion of Iran [Lite]", "theater": "Persian Gulf", "authors": "Khopa", + "recommended_player_faction": "USA 2005", + "recommended_enemy_faction": "Iran 2015", "description": "This is lighter version of the invasion of Iran scenario.
", - "miz": "invasion_of_iran_lite.miz" + "miz": "invasion_of_iran_lite.miz", + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/normandy.json b/resources/campaigns/normandy.json index caf3b123..8a21115c 100644 --- a/resources/campaigns/normandy.json +++ b/resources/campaigns/normandy.json @@ -2,6 +2,9 @@ "name": "Normandy - Normandy", "theater": "Normandy", "authors": "Khopa", + "recommended_player_faction": "Allies 1944", + "recommended_enemy_faction": "Germany 1944", "description": "Normandy 1944 D-Day scenario.
", - "miz":"normandy.miz" + "miz":"normandy.miz", + "performance": 3 } \ No newline at end of file diff --git a/resources/campaigns/normandy_small.json b/resources/campaigns/normandy_small.json index 9aa63e78..d09e9a77 100644 --- a/resources/campaigns/normandy_small.json +++ b/resources/campaigns/normandy_small.json @@ -2,6 +2,9 @@ "name": "Normandy - Normandy Small", "theater": "Normandy", "authors": "Khopa", + "recommended_player_faction": "Allies 1944", + "recommended_enemy_faction": "Germany 1944", "description": "A lighter version of the Normandy 1944 D-Day scenario.
", - "miz": "normandy_small.miz" + "miz": "normandy_small.miz", + "performance": 2 } \ No newline at end of file diff --git a/resources/campaigns/north_caucasus.json b/resources/campaigns/north_caucasus.json index 08f60007..3090b625 100644 --- a/resources/campaigns/north_caucasus.json +++ b/resources/campaigns/north_caucasus.json @@ -97,5 +97,6 @@ "Maykop-Khanskaya", "Mineralnye Vody" ] - ] + ], + "performance": 1 } \ No newline at end of file diff --git a/resources/campaigns/north_nevada.json b/resources/campaigns/north_nevada.json deleted file mode 100644 index 86521fc2..00000000 --- a/resources/campaigns/north_nevada.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "Nevada - North Nevada", - "theater": "Nevada", - "authors": "Khopa", - "description": "A scenario taking place in the NTTR. Here you can simulate a red flag exercise.
", - "player_points": [ - { - "type": "airbase", - "id": "Nellis AFB", - "size": 2000, - "importance": 1.4 - } - ], - "enemy_points": [ - { - "type": "airbase", - "id": "Tonopah Test Range Airfield", - "size": 600, - "importance": 1, - "captured_invert": true - }, - { - "type": "airbase", - "id": "Lincoln County", - "size": 600, - "importance": 1.2 - }, - { - "type": "airbase", - "id": "Groom Lake AFB", - "size": 1000, - "importance": 1.4 - }, - { - "type": "airbase", - "id": "Creech AFB", - "size": 2000, - "importance": 1.4 - }, - { - "type": "airbase", - "id": "Mesquite", - "size": 1000, - "importance": 1.3 - } - ], - "links": [ - [ - "Lincoln County", - "Tonopah Test Range Airfield" - ], - [ - "Groom Lake AFB", - "Tonopah Test Range Airfield" - ], - [ - "Lincoln County", - "Mesquite" - ], - [ - "Groom Lake AFB", - "Mesquite" - ], - [ - "Creech AFB", - "Groom Lake AFB" - ], - [ - "Creech AFB", - "Nellis AFB" - ] - ] -} \ No newline at end of file diff --git a/resources/campaigns/persian_gulf_full_map.json b/resources/campaigns/persian_gulf_full_map.json index b47ecce3..8c6e581d 100644 --- a/resources/campaigns/persian_gulf_full_map.json +++ b/resources/campaigns/persian_gulf_full_map.json @@ -3,5 +3,6 @@ "theater": "Persian Gulf", "authors": "Plob", "description": "Full map of the Persian Gulf
Note: This scenario is heavy on performance, enabling \"culling\" in settings is highly recommended.
", - "miz": "persian_gulf_full_map.miz" + "miz": "persian_gulf_full_map.miz", + "performance": 3 } \ No newline at end of file diff --git a/resources/campaigns/russia_small.json b/resources/campaigns/russia_small.json index 490ebf93..570c70ee 100644 --- a/resources/campaigns/russia_small.json +++ b/resources/campaigns/russia_small.json @@ -2,6 +2,9 @@ "name": "Caucasus - Russia Small", "theater": "Caucasus", "authors": "Khopa", + "recommended_player_faction": "Russia 2010", + "recommended_enemy_faction": "USA 1990", "description": "A small theater in Russia, progress from Mozdok to Maykop.
This scenario is pretty simple, it is ideal if you want to run a short campaign. If your PC is not powerful, this is also the less performance heavy scenario.
", - "miz": "russia_small.miz" + "miz": "russia_small.miz", + "performance": 0 } \ No newline at end of file diff --git a/resources/campaigns/syria_full_map_remastered.json b/resources/campaigns/syria_full_map_remastered.json index d0df2b54..e0c9a235 100644 --- a/resources/campaigns/syria_full_map_remastered.json +++ b/resources/campaigns/syria_full_map_remastered.json @@ -2,6 +2,7 @@ "name": "Syria - Full Map", "theater": "Syria", "authors": "Hawkmoon", - "description": "Full map of Syria
Note:For a better early game experience is suggested to give the AI an high amount of starting money This scenario is heavy on performance, enabling \"culling\" in settings is highly recommended.
", - "miz": "syria_full_map_remastered.miz" + "description": "Full map of Syria
Note :
For a better early game experience, it is suggested to give the AI an high amount of starting money.
", + "miz": "syria_full_map_remastered.miz", + "performance": 3 } \ No newline at end of file diff --git a/resources/campaigns/syrian_civil_war.json b/resources/campaigns/syrian_civil_war.json index 77f879fe..86fb6ad1 100644 --- a/resources/campaigns/syrian_civil_war.json +++ b/resources/campaigns/syrian_civil_war.json @@ -2,6 +2,9 @@ "name": "Syria - Syrian Civil War", "theater": "Syria", "authors": "Khopa", + "recommended_player_faction": "Russia 2010", + "recommended_enemy_faction": "Insurgents (Hard)", "description": "This scenario can be used to simulate parts of the Syrian Civil War.
You start on the coast with an airbase in Latakia, and ground forces in Tartus.
This scenario can also be used to simulate a western invasion of Syria.
In inverted configuration you start in Aleppo.
A medium sized theater in the south west of the Caucasus map. Shouldn't be too hard on performance.
", - "player_points": [ - { - "type": "airbase", - "id": "Kobuleti", - "radials": [ - 0, - 45, - 90, - 135, - 180, - 225, - 315 - ], - "size": 600, - "importance": 1.1 - }, - { - "type": "carrier", - "id": 1001, - "x": -285810.6875, - "y": 496399.1875, - "captured_invert": true - }, - { - "type": "lha", - "id": 1002, - "x": -326050.6875, - "y": 519452.1875, - "captured_invert": true - } - ], - "enemy_points": [ - { - "type": "airbase", - "id": "Kutaisi", - "size": 600, - "importance": 1 - }, - { - "type": "airbase", - "id": "Senaki-Kolkhi", - "size": 1000, - "importance": 1 - }, - { - "type": "airbase", - "id": "Sukhumi-Babushara", - "radials": [ - 315, - 0, - 45, - 90, - 135 - ], - "size": 1000, - "importance": 1.2 - }, - { - "type": "airbase", - "id": "Gudauta", - "radials": [ - 315, - 0, - 45, - 90, - 135 - ], - "size": 1000, - "importance": 1.2 - }, - { - "type": "airbase", - "id": "Sochi-Adler", - "radials": [ - 315, - 0, - 45, - 90, - 135 - ], - "size": 2000, - "importance": 1.4, - "captured_invert": true - } - ], - "links": [ - [ - "Kutaisi", - "Senaki-Kolkhi" - ], - [ - "Kobuleti", - "Senaki-Kolkhi" - ], - [ - "Senaki-Kolkhi", - "Sukhumi-Babushara" - ], - [ - "Gudauta", - "Sukhumi-Babushara" - ], - [ - "Gudauta", - "Sochi-Adler" - ] - ] -} \ No newline at end of file diff --git a/resources/caulandmap.p b/resources/caulandmap.p index c9f77f43..c5076169 100644 Binary files a/resources/caulandmap.p and b/resources/caulandmap.p differ diff --git a/resources/channellandmap.p b/resources/channellandmap.p index 9f5ba1f8..92864e8c 100644 Binary files a/resources/channellandmap.p and b/resources/channellandmap.p differ diff --git a/resources/customized_payloads/AH-64A.lua b/resources/customized_payloads/AH-64A.lua index 80613b07..1bce3138 100644 --- a/resources/customized_payloads/AH-64A.lua +++ b/resources/customized_payloads/AH-64A.lua @@ -39,6 +39,14 @@ local unitPayloads = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, + [3] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 2, + }, }, ["tasks"] = { [1] = 18, @@ -58,6 +66,14 @@ local unitPayloads = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, + [3] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 2, + }, }, ["tasks"] = { [1] = 18, @@ -101,6 +117,14 @@ local unitPayloads = { ["num"] = 4, }, [2] = { + ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", + ["num"] = 3, + }, + [3] = { + ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", + ["num"] = 2, + }, + [4] = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, diff --git a/resources/customized_payloads/AH-64D.lua b/resources/customized_payloads/AH-64D.lua index f6ecce67..cac514d3 100644 --- a/resources/customized_payloads/AH-64D.lua +++ b/resources/customized_payloads/AH-64D.lua @@ -9,6 +9,14 @@ local unitPayloads = { ["num"] = 4, }, [2] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 3, + }, + [3] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 2, + }, + [4] = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, @@ -28,6 +36,14 @@ local unitPayloads = { ["num"] = 4, }, [2] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 3, + }, + [3] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 2, + }, + [4] = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, @@ -77,6 +93,14 @@ local unitPayloads = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, + [3] = { + ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", + ["num"] = 2, + }, }, ["tasks"] = { [1] = 18, @@ -93,6 +117,14 @@ local unitPayloads = { ["num"] = 4, }, [2] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 3, + }, + [3] = { + ["CLSID"] = "{FD90A1DC-9147-49FA-BF56-CB83EF0BD32B}", + ["num"] = 2, + }, + [4] = { ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["num"] = 1, }, diff --git a/resources/customized_payloads/AV8BNA.lua b/resources/customized_payloads/AV8BNA.lua index d2ba669a..ef0cb25a 100644 --- a/resources/customized_payloads/AV8BNA.lua +++ b/resources/customized_payloads/AV8BNA.lua @@ -2,114 +2,6 @@ local unitPayloads = { ["name"] = "AV8BNA", ["payloads"] = { [1] = { - ["name"] = "CAP", - ["pylons"] = { - [1] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 8, - }, - [2] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 1, - }, - [3] = { - ["CLSID"] = "{AIM-9M-ON-ADAPTER}", - ["num"] = 2, - }, - [4] = { - ["CLSID"] = "{AIM-9M-ON-ADAPTER}", - ["num"] = 7, - }, - [5] = { - ["CLSID"] = "{GAU_12_Equalizer}", - ["num"] = 4, - }, - }, - ["tasks"] = { - [1] = 31, - }, - }, - [2] = { - ["name"] = "CAS", - ["pylons"] = { - [1] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 8, - }, - [2] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 1, - }, - [3] = { - ["CLSID"] = "LAU_117_AGM_65G", - ["num"] = 2, - }, - [4] = { - ["CLSID"] = "LAU_117_AGM_65G", - ["num"] = 7, - }, - [5] = { - ["CLSID"] = "{GAU_12_Equalizer}", - ["num"] = 4, - }, - [6] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - }, - ["tasks"] = { - [1] = 31, - }, - }, - [3] = { - ["name"] = "STRIKE", - ["pylons"] = { - [1] = { - ["CLSID"] = "{BRU-42_2*GBU-38_LEFT}", - ["num"] = 2, - }, - [2] = { - ["CLSID"] = "{BRU-42_2*GBU-38_RIGHT}", - ["num"] = 7, - }, - [3] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - }, - ["tasks"] = { - [1] = 31, - }, - }, - [4] = { - ["name"] = "ANTISHIP", - ["pylons"] = { - [1] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 8, - }, - [2] = { - ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", - ["num"] = 1, - }, - [3] = { - ["CLSID"] = "LAU_117_AGM_65G", - ["num"] = 2, - }, - [4] = { - ["CLSID"] = "LAU_117_AGM_65G", - ["num"] = 7, - }, - [5] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - }, - ["tasks"] = { - [1] = 31, - }, - }, - [5] = { ["name"] = "INTERCEPT", ["pylons"] = { [1] = { @@ -137,7 +29,7 @@ local unitPayloads = { [1] = 31, }, }, - [6] = { + [2] = { ["name"] = "SEAD", ["pylons"] = { [1] = { @@ -149,11 +41,11 @@ local unitPayloads = { ["num"] = 1, }, [3] = { - ["CLSID"] = "{LAU_7_AGM_122_SIDEARM}", + ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 2, }, [4] = { - ["CLSID"] = "{LAU_7_AGM_122_SIDEARM}", + ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 7, }, [5] = { @@ -161,11 +53,11 @@ local unitPayloads = { ["num"] = 5, }, [6] = { - ["CLSID"] = "LAU_117_AGM_65G", + ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 6, }, [7] = { - ["CLSID"] = "LAU_117_AGM_65G", + ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 3, }, }, @@ -173,6 +65,130 @@ local unitPayloads = { [1] = 31, }, }, + [3] = { + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 8, + }, + [2] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 2, + }, + [4] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{GAU_12_Equalizer}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", + ["num"] = 5, + }, + [7] = { + ["CLSID"] = "{LAU-131 - 7 AGR-20 M282}", + ["num"] = 6, + }, + [8] = { + ["CLSID"] = "{LAU-131 - 7 AGR-20 M282}", + ["num"] = 3, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [4] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 8, + }, + [2] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 2, + }, + [4] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 6, + }, + [7] = { + ["CLSID"] = "LAU_117_AGM_65F", + ["num"] = 3, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [5] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{BRU-42_2*GBU-38_LEFT}", + ["num"] = 2, + }, + [2] = { + ["CLSID"] = "{BRU-42_2*GBU-38_RIGHT}", + ["num"] = 7, + }, + [3] = { + ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [6] = { + ["name"] = "CAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 8, + }, + [2] = { + ["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{AIM-9M-ON-ADAPTER}", + ["num"] = 2, + }, + [4] = { + ["CLSID"] = "{AIM-9M-ON-ADAPTER}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{GAU_12_Equalizer}", + ["num"] = 4, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, }, ["tasks"] = { }, diff --git a/resources/customized_payloads/J-11A.lua b/resources/customized_payloads/J-11A.lua new file mode 100644 index 00000000..6310a08e --- /dev/null +++ b/resources/customized_payloads/J-11A.lua @@ -0,0 +1,250 @@ +local unitPayloads = { + ["name"] = "J-11A", + ["payloads"] = { + [1] = { + ["name"] = "CAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{B79C379A-9E87-4E50-A1EE-7F7E29C2E87A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{B4C01D60-A8A3-4237-BD72-CA7655BC0FE9}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{B4C01D60-A8A3-4237-BD72-CA7655BC0FE9}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B4C01D60-A8A3-4237-BD72-CA7655BC0FE9}", + ["num"] = 6, + }, + [7] = { + ["CLSID"] = "{B4C01D60-A8A3-4237-BD72-CA7655BC0FE9}", + ["num"] = 7, + }, + [8] = { + ["CLSID"] = "{B79C379A-9E87-4E50-A1EE-7F7E29C2E87A}", + ["num"] = 8, + }, + [9] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 9, + }, + [10] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 10, + }, + }, + ["tasks"] = { + [1] = 18, + [2] = 19, + [3] = 10, + [4] = 11, + }, + }, + [2] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 9, + }, + [3] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 5, + }, + [7] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 4, + }, + [8] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 3, + }, + [9] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 2, + }, + [10] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 1, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + [3] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 9, + }, + [3] = { + ["CLSID"] = "{TWIN_S25}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 5, + }, + [7] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 4, + }, + [8] = { + ["CLSID"] = "{TWIN_S25}", + ["num"] = 3, + }, + [9] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 2, + }, + [10] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 1, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + [4] = { + ["name"] = "SEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 9, + }, + [3] = { + ["CLSID"] = "{A0648264-4BC0-4EE8-A543-D119F6BA4257}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 5, + }, + [7] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 4, + }, + [8] = { + ["CLSID"] = "{A0648264-4BC0-4EE8-A543-D119F6BA4257}", + ["num"] = 3, + }, + [9] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 2, + }, + [10] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 1, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + [5] = { + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 9, + }, + [3] = { + ["CLSID"] = "{TWIN_B13L_5OF}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{F99BEC1A-869D-4AC7-9730-FBA0E3B1F5FC}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}", + ["num"] = 5, + }, + [7] = { + ["CLSID"] = "{F99BEC1A-869D-4AC7-9730-FBA0E3B1F5FC}", + ["num"] = 4, + }, + [8] = { + ["CLSID"] = "{TWIN_B13L_5OF}", + ["num"] = 3, + }, + [9] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 2, + }, + [10] = { + ["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}", + ["num"] = 1, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + }, + ["unitType"] = "J-11A", +} +return unitPayloads diff --git a/resources/customized_payloads/S-3B.lua b/resources/customized_payloads/S-3B.lua new file mode 100644 index 00000000..bdbdd472 --- /dev/null +++ b/resources/customized_payloads/S-3B.lua @@ -0,0 +1,168 @@ +local unitPayloads = { + ["name"] = "S-3B", + ["payloads"] = { + [1] = { + ["name"] = "SEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 29, + }, + }, + [2] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + [3] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 32, + [1] = 33, + }, + }, + [4] = { + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{A76344EB-32D2-4532-8FA2-0C1BDC00747E}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{A76344EB-32D2-4532-8FA2-0C1BDC00747E}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + }, + [5] = { + ["name"] = "RUNWAY_ATTACK", + ["pylons"] = { + [1] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 34, + }, + }, + ["unitType"] = "S-3B", +} +return unitPayloads diff --git a/resources/customized_payloads/SH-60B.lua b/resources/customized_payloads/SH-60B.lua new file mode 100644 index 00000000..22ff5907 --- /dev/null +++ b/resources/customized_payloads/SH-60B.lua @@ -0,0 +1,18 @@ +local unitPayloads = { + ["name"] = "SH-60B", + ["payloads"] = { + [1] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{7B8DCEB4-820B-4015-9B48-1028A4195692}", + ["num"] = 1, + }, + }, + ["tasks"] = { + [1] = 30, + }, + }, + ["unitType"] = "SH-60B", +} +return unitPayloads diff --git a/resources/factions/NATO_Desert_Storm.json b/resources/factions/NATO_Desert_Storm.json index 677cd77a..d108f6d6 100644 --- a/resources/factions/NATO_Desert_Storm.json +++ b/resources/factions/NATO_Desert_Storm.json @@ -80,7 +80,7 @@ "LHA_1_Tarawa" ], "destroyers": [ - "OliverHazardPerryGroupGenerator" + "Oliver_Hazzard_Perry_class" ], "cruisers": [ "Ticonderoga_class" diff --git a/resources/factions/allies_1944.json b/resources/factions/allies_1944.json index 62eefeb9..abefb69e 100644 --- a/resources/factions/allies_1944.json +++ b/resources/factions/allies_1944.json @@ -21,7 +21,6 @@ "CT_Cromwell_IV", "CT_Centaur_IV", "HIT_Churchill_VII", - "M30_Cargo_Carrier", "LAC_M8_Greyhound", "TD_M10_GMC", "Daimler_Armoured_Car", diff --git a/resources/factions/australia_2005.json b/resources/factions/australia_2005.json index 8e9109d2..36968b09 100644 --- a/resources/factions/australia_2005.json +++ b/resources/factions/australia_2005.json @@ -6,6 +6,7 @@ "aircrafts": [ "FA_18C_hornet", "UH_1H", + "SH_60B", "AH_1W" ], "awacs": [ diff --git a/resources/factions/france_1985_frenchpack.json b/resources/factions/france_1985_frenchpack.json new file mode 100644 index 00000000..3837fbc1 --- /dev/null +++ b/resources/factions/france_1985_frenchpack.json @@ -0,0 +1,79 @@ +{ + "country": "France", + "name": "France 1985 (Frenchpack)", + "authors": "Colonel Panic", + "description": "1980s French equipment using FrenchPack.
", + "doctrine": "coldwar", + "aircrafts": [ + "M_2000C", + "SA342M", + "SA342L", + "SA342Mistral" + ], + "awacs": [ + "E_3A" + ], + "tankers": [ + "KC_135", + "KC130" + ], + "frontline_units": [ + "AMX_10RCR", + "AMX_10RCR_SEPAR", + "ERC_90", + "TRM_2000_PAMELA", + "VAB__50", + "VAB_MEPHISTO", + "VAB_T20_13", + "VAB_T20_13", + "VBL__50", + "VBL_AANF1", + "VBAE_CRAB", + "VBAE_CRAB_MMP", + "AMX_30B2", + "SAM_Roland_ADS" + ], + "artillery_units": [ + "MLRS_M270", + "SPH_M109_Paladin" + ], + "logistics_units": [ + "Transport_M818" + ], + "infantry_units": [ + "Infantry_M4", + "Soldier_M249", + "Stinger_MANPADS" + ], + "air_defenses": [ + "RolandGenerator", + "HawkGenerator" + ], + "aircraft_carrier": [], + "helicopter_carrier": [ + "LHA_1_Tarawa" + ], + "destroyers": [ + "USS_Arleigh_Burke_IIa" + ], + "cruisers": [ + "Ticonderoga_class" + ], + "requirements": { + "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" + }, + "carrier_names": [ + "R91 Charles de Gaulle" + ], + "helicopter_carrier_names": [ + "R97 Jeanne d'Arc", + "L9013 Mistral", + "L9014 Tonerre", + "L9015 Dixmude" + ], + "navy_generators": [ + "ArleighBurkeGroupGenerator" + ], + "has_jtac": true, + "jtac_unit": "SA342L" +} diff --git a/resources/factions/gdr_1985.json b/resources/factions/gdr_1985.json new file mode 100644 index 00000000..07131110 --- /dev/null +++ b/resources/factions/gdr_1985.json @@ -0,0 +1,65 @@ +{ + "country": "GDR", + "name": "German Democratic Republic 1985", + "authors": "Colonel Panic", + "description": "The German Democratic Republic in 1985.
", + "doctrine": "coldwar", + "aircrafts": [ + "MiG_21Bis", + "MiG_23MLD", + "Su_17M4", + "L_39ZA", + "Mi_8MT", + "Mi_24V" + ], + "awacs": [], + "tankers": [], + "frontline_units": [ + "IFV_BMP_1", + "IFV_BMP_2", + "ARV_BRDM_2", + "APC_MTLB", + "MBT_T_55", + "MBT_T_72B" + ], + "artillery_units": [ + "MLRS_BM_21_Grad", + "SPH_2S1_Gvozdika" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "Infantry_Soldier_Rus", + "Soldier_RPG", + "_2B11_mortar" + ], + "air_defenses": [ + "ColdWarFlakGenerator", + "SA2Generator", + "SA3Generator", + "SA6Generator", + "SA8Generator", + "SA9Generator", + "SA13Generator", + "ZSU23Generator", + "ZSU57Generator", + "ZU23Generator" + ], + "ewrs": [ + "FlatFaceGenerator" + ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [ + "Ticonderoga_class" + ], + "requirements": {}, + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], + "has_jtac": true, + "jtac_unit": "Mi_8MT" +} diff --git a/resources/factions/germany_1944.json b/resources/factions/germany_1944.json index 7cd95b44..e9d5ad78 100644 --- a/resources/factions/germany_1944.json +++ b/resources/factions/germany_1944.json @@ -56,7 +56,6 @@ "helicopter_carrier_names": [ ], "navy_generators": [ - "UBoatGroupGenerator", "SchnellbootGroupGenerator" ], "navy_group_count": 2, diff --git a/resources/factions/greece_2005.json b/resources/factions/greece_2005.json new file mode 100644 index 00000000..21bf75ad --- /dev/null +++ b/resources/factions/greece_2005.json @@ -0,0 +1,51 @@ +{ + "country": "Greece", + "name": "Greece 2005", + "authors": "Malakhit", + "description": "Hellenic army in the mid/late 2000s.
", + "aircrafts": [ + "F_16C_50", + "F_4E", + "M_2000C", + "Mirage_2000_5", + "UH_1H", + "AH_64A" + ], + "tankers": [ + "KC130" + ], + "frontline_units": [ + "MBT_Leopard_2", + "MBT_Leopard_1A3", + "MBT_M60A3_Patton", + "APC_M1043_HMMWV_Armament", + "ATGM_M1045_HMMWV_TOW", + "APC_M113", + "IFV_BMP_1" + ], + "artillery_units": [ + "SPH_M109_Paladin", + "MLRS_M270" + ], + "logistics_units": [ + "Transport_M818" + ], + "infantry_units": [ + "Infantry_M4", + "Soldier_M249", + "Stinger_MANPADS" + ], + "air_defenses": [ + "HawkGenerator", + "SA8Generator", + "SA10Generator", + "SA15Generator", + "ZU23Generator" + ], + "ewrs": [ + "HawkEwrGenerator", + "FlatFaceGenerator" + ], + "has_jtac": true, + "jtac_unit": "MQ_9_Reaper" +} \ No newline at end of file diff --git a/resources/factions/iran_1988.json b/resources/factions/iran_1988.json new file mode 100644 index 00000000..406bd9ab --- /dev/null +++ b/resources/factions/iran_1988.json @@ -0,0 +1,78 @@ +{ + "country": "Iran", + "name": "Iran 1988", + "authors": "Malakhit", + "description": "Iran at the end of the Iran-Iraq war
", + "aircrafts": [ + "MiG_21Bis", + "F_4E", + "F_5E_3", + "F_14A_135_GR", + "AH_1W" + ], + "awacs": [ + "A_50" + ], + "tankers": [ + "IL_78M" + ], + "frontline_units": [ + "APC_M113", + "APC_BTR_80", + "MBT_M60A3_Patton", + "IFV_BMP_1", + "SPAAA_ZSU_23_4_Shilka", + "AAA_ZSU_57_2" + ], + "artillery_units": [ + "MLRS_BM_21_Grad", + "SPH_2S1_Gvozdika" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "Paratrooper_AKS", + "Infantry_Soldier_Insurgents", + "Soldier_RPG", + "SAM_SA_18_Igla_S_MANPADS" + ], + "air_defenses": [ + "HawkGenerator", + "RapierGenerator", + "SA2Generator", + "ZSU57Generator", + "ZSU23Generator", + "ZU23Generator", + "ZU23UralGenerator" + ], + "ewrs": [ + "TallRackGenerator" + ], + "aircraft_carrier": [ + ], + "helicopter_carrier": [ + ], + "helicopter_carrier_names": [ + ], + "destroyers": [ + "FF_1135M_Rezky" + ], + "cruisers": [ + "FSG_1241_1MP_Molniya" + ], + "requirements": {}, + "carrier_names": [ + ], + "missiles": [ + "ScudGenerator" + ], + "missiles_group_count": 1, + "navy_generators": [ + "GrishaGroupGenerator", + "MolniyaGroupGenerator" + ], + "has_jtac": true, + "jtac_unit": "MQ_9_Reaper" +} diff --git a/resources/factions/iran_2015.json b/resources/factions/iran_2015.json index b8621de2..9f3d8870 100644 --- a/resources/factions/iran_2015.json +++ b/resources/factions/iran_2015.json @@ -81,8 +81,7 @@ "missiles_group_count": 1, "navy_generators": [ "GrishaGroupGenerator", - "MolniyaGroupGenerator", - "KiloSubGroupGenerator" + "MolniyaGroupGenerator" ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" diff --git a/resources/factions/iraq_1991.json b/resources/factions/iraq_1991.json index 0ff517ee..82562c1a 100644 --- a/resources/factions/iraq_1991.json +++ b/resources/factions/iraq_1991.json @@ -12,12 +12,11 @@ "Mi_8MT", "Su-25", "Su-24M", - "MiG_25PD", "Tu_22M3", - "L_39C", "L_39ZA", "Mi_24V", - "MiG_29A" + "MiG_29A", + "SA342M" ], "awacs": [ "A_50" diff --git a/resources/factions/israel_1973.json b/resources/factions/israel_1973.json index b3b30840..36bef190 100644 --- a/resources/factions/israel_1973.json +++ b/resources/factions/israel_1973.json @@ -9,7 +9,7 @@ "UH_1H" ], "awacs": [ - "E_3A" + "E_2C" ], "tankers": [ "KC_135", diff --git a/resources/factions/israel_1982.json b/resources/factions/israel_1982.json index b975c7b9..5c910edd 100644 --- a/resources/factions/israel_1982.json +++ b/resources/factions/israel_1982.json @@ -13,7 +13,7 @@ "AH_1W" ], "awacs": [ - "E_3A" + "E_2C" ], "tankers": [ "KC_135", diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 667df3bd..0cab7580 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -13,7 +13,7 @@ "AH_64D" ], "awacs": [ - "E_3A" + "E_2C" ], "tankers": [ "KC_135", diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index a2f24933..88f57175 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -11,7 +11,7 @@ "AH_64D" ], "awacs": [ - "E_3A" + "E_2C" ], "tankers": [ "KC_135", diff --git a/resources/factions/pmc_russian.json b/resources/factions/pmc_russian.json index aec2c021..3b20801a 100644 --- a/resources/factions/pmc_russian.json +++ b/resources/factions/pmc_russian.json @@ -4,7 +4,6 @@ "authors": "Khopa", "description": "A private military company using Russian units.
", "aircrafts": [ - "L_39C", "L_39ZA", "Mi_8MT", "Mi_24V", diff --git a/resources/factions/poland_2010.json b/resources/factions/poland_2010.json new file mode 100644 index 00000000..5090d6e7 --- /dev/null +++ b/resources/factions/poland_2010.json @@ -0,0 +1,56 @@ +{ + "country": "Poland", + "name": "Poland 2010", + "authors": "Malakhit", + "description": "Polish army in the 2010s.
", + "aircrafts": [ + "Su_17M4", + "MiG_29A", + "F_16C_50", + "Mi_8MT" + ], + "tankers": [ + "KC130" + ], + "frontline_units": [ + "APC_M1043_HMMWV_Armament", + "ATGM_M1045_HMMWV_TOW", + "APC_M1126_Stryker_ICV", + "ARV_BRDM_2", + "IFV_BMP_1", + "APC_MTLB", + "MBT_Leopard_2", + "MBT_T_72B3" + ], + "artillery_units": [ + "MLRS_BM_21_Grad", + "SPH_2S1_Gvozdika", + "SpGH_Dana" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "Paratrooper_AKS", + "Infantry_Soldier_Rus", + "Soldier_RPG", + "SAM_SA_18_Igla_S_MANPADS" + ], + "air_defenses": [ + "SA6Generator", + "SA8Generator", + "ZSU23Generator", + "ZU23Generator", + "ZU23UralGenerator" + ], + "ewrs": [ + "BigBirdGenerator" + ], + "requirements": {}, + "carrier_names": [], + "navy_generators": [ + "MolniyaGroupGenerator", + "OliverHazardPerryGroupGenerator" + ] +} diff --git a/resources/factions/redfor_china_2010.json b/resources/factions/redfor_china_2010.json new file mode 100644 index 00000000..ab7ce609 --- /dev/null +++ b/resources/factions/redfor_china_2010.json @@ -0,0 +1,120 @@ +{ + "country": "China", + "name": "Redfor (China) 2010", + "authors": "Robert Peary", + "description": "Combined Redfor under China's leadership in the late 2000s, early 2010s.
", + "aircrafts": [ + "J_11A", + "JF_17", + "Ka_50", + "L_39ZA", + "Mi_8MT", + "Mi_24V", + "Mi_28N", + "MiG_21Bis", + "MiG_29S", + "MiG_31", + "Su_24M", + "Su_25", + "Su_25T", + "Su_27", + "Su_30", + "Su_33", + "Su_34", + "Tu_22M3" + ], + "awacs": [ + "KJ_2000" + ], + "tankers": [ + "IL_78M" + ], + "frontline_units": [ + "APC_BTR_80", + "APC_BTR_82A", + "HQ_7_Self_Propelled_LN", + "IFV_BMP_1", + "IFV_BMP_2", + "IFV_BMP_3", + "MBT_T_55", + "MBT_T_72B3", + "MBT_T_80U", + "MBT_T_90", + "SAM_SA_19_Tunguska_2S6", + "ZBD_04A", + "ZTZ_96B" + ], + "artillery_units": [ + "MLRS_9A52_Smerch", + "MLRS_9K57_Uragan_BM_27", + "SPH_2S9_Nona", + "SPH_2S19_Msta" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "_2B11_mortar", + "Infantry_Soldier_Rus", + "Paratrooper_AKS", + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_MANPADS" + ], + "air_defenses": [ + "HQ7Generator", + "SA2Generator", + "SA6Generator", + "SA8Generator", + "SA9Generator", + "SA10Generator", + "SA11Generator", + "SA13Generator", + "SA15Generator", + "SA19Generator", + "Tier2SA10Generator", + "Tier3SA10Generator", + "ZSU23Generator", + "ZSU57Generator", + "ZU23Generator", + "ZU23UralGenerator" + ], + "ewrs": [ + "BoxSpringGenerator", + "TallRackGenerator" + ], + "aircraft_carrier": [ + "CV_1143_5_Admiral_Kuznetsov" + ], + "carrier_names": [ + "001 Liaoning", + "002 Shandong" + ], + "helicopter_carrier": [ + "Type_071_Amphibious_Transport_Dock" + ], + "helicopter_carrier_names": [ + "Kunlun Shan", + "Jinggang Shan", + "Changbai Shan", + "Yimeng Shan", + "Longhu Shan", + "Wuzhi Shan", + "Wudang Shan" + ], + "destroyers": [ + "FF_1135M_Rezky", + "Type_052B_Destroyer", + "Type_052C_Destroyer" + ], + "cruiser": [ + "FSG_1241_1MP_Molniya", + "Type_054A_Frigate" + ], + "requirements": {}, + "navy_generators": [ + "Type54GroupGenerator" + ], + "has_jtac": true, + "jtac_unit": "WingLoong_I" +} diff --git a/resources/factions/redfor_russia_2010.json b/resources/factions/redfor_russia_2010.json new file mode 100644 index 00000000..363139ec --- /dev/null +++ b/resources/factions/redfor_russia_2010.json @@ -0,0 +1,115 @@ +{ + "country": "Russia", + "name": "Redfor (Russia) 2010", + "authors": "Robert Peary", + "description": "Combined Redfor under Russia's leadership in the late 2000s, early 2010s.
", + "aircrafts": [ + "J_11A", + "JF_17", + "Ka_50", + "L_39ZA", + "Mi_8MT", + "Mi_24V", + "Mi_28N", + "MiG_21Bis", + "MiG_29S", + "MiG_31", + "Su_24M", + "Su_25", + "Su_25T", + "Su_27", + "Su_30", + "Su_33", + "Su_34", + "Tu_22M3" + ], + "awacs": [ + "A_50" + ], + "tankers": [ + "IL_78M" + ], + "frontline_units": [ + "APC_BTR_80", + "APC_BTR_82A", + "HQ_7_Self_Propelled_LN", + "IFV_BMP_1", + "IFV_BMP_2", + "IFV_BMP_3", + "MBT_T_55", + "MBT_T_72B3", + "MBT_T_80U", + "MBT_T_90", + "SAM_SA_19_Tunguska_2S6", + "ZBD_04A", + "ZTZ_96B" + ], + "artillery_units": [ + "MLRS_9A52_Smerch", + "MLRS_9K57_Uragan_BM_27", + "SPH_2S9_Nona", + "SPH_2S19_Msta" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "_2B11_mortar", + "Infantry_Soldier_Rus", + "Paratrooper_AKS", + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_MANPADS" + ], + "air_defenses": [ + "HQ7Generator", + "SA2Generator", + "SA6Generator", + "SA8Generator", + "SA9Generator", + "SA10Generator", + "SA11Generator", + "SA13Generator", + "SA15Generator", + "SA19Generator", + "Tier2SA10Generator", + "Tier3SA10Generator", + "ZSU23Generator", + "ZSU57Generator", + "ZU23Generator", + "ZU23UralGenerator" + ], + "ewrs": [ + "BoxSpringGenerator", + "TallRackGenerator" + ], + "aircraft_carrier": [ + "CV_1143_5_Admiral_Kuznetsov" + ], + "helicopter_carrier": [ + "Type_071_Amphibious_Transport_Dock" + ], + "helicopter_carrier_names": [ + "Ivan Rogov", + "Mitrofan Moskalenko" + ], + "destroyers": [ + "FF_1135M_Rezky", + "Type_052B_Destroyer", + "Type_052C_Destroyer" + ], + "cruisers": [ + "FSG_1241_1MP_Molniya", + "Type_054A_Frigate" + ], + "requirements": {}, + "carrier_names": [ + "Admiral Kuznetov" + ], + "navy_generators": [ + "RussianNavyGroupGenerator", + "KiloSubGroupGenerator" + ], + "has_jtac": true, + "jtac_unit": "MQ_9_Reaper" +} diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index 9f986f1d..1c764a45 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -7,7 +7,8 @@ "MiG_15bis", "MiG_19P", "MiG_21Bis", - "Mi_8MT" + "Mi_8MT", + "Tu_95MS" ], "awacs": [ "A_50" diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index 5630494c..4fbbf059 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -12,7 +12,9 @@ "Su_24M", "Su_25", "Mi_8MT", - "Mi_24V" + "Mi_24V", + "Tu_95MS", + "Tu_142" ], "awacs": [ "A_50" @@ -76,7 +78,7 @@ "carrier_names": [ ], "navy_generators": [ - "KiloSubGroupGenerator", "MolniyaGroupGenerator" + "MolniyaGroupGenerator" ], "has_jtac": false, "doctrine": "coldwar" diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index 74c52bf3..497cfb93 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -16,7 +16,9 @@ "Mi_8MT", "Mi_24V", "Tu_22M3", - "Tu_95MS" + "Tu_95MS", + "Tu_142", + "Tu_160" ], "awacs": [ "A_50" @@ -87,8 +89,7 @@ "Admiral Gorshkov" ], "navy_generators": [ - "RussianNavyGroupGenerator", - "KiloSubGroupGenerator" + "RussianNavyGroupGenerator" ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index bd6d037a..13e2fbe9 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -18,7 +18,10 @@ "Mi_24V", "Mi_28N", "Ka_50", - "Tu_22M3" + "Tu_22M3", + "Tu_95MS", + "Tu_142", + "Tu_160" ], "awacs": [ "A_50" @@ -88,8 +91,7 @@ "Admiral Kuznetov" ], "navy_generators": [ - "RussianNavyGroupGenerator", - "KiloSubGroupGenerator" + "RussianNavyGroupGenerator" ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" diff --git a/resources/factions/russia_2010_hds.json b/resources/factions/russia_2010_hds.json new file mode 100644 index 00000000..7e632c5f --- /dev/null +++ b/resources/factions/russia_2010_hds.json @@ -0,0 +1,95 @@ +{ + "country": "Russia", + "name": "Russia 2010 (High Digit SAMs)", + "authors": "Khopa", + "description": "Russian army in the early 2010s, featuring the High Digit SAMs mod units.
", + "aircrafts": [ + "MiG_29S", + "MiG_31", + "Su_24M", + "Su_25", + "Su_25T", + "Su_27", + "Su_30", + "Su_33", + "Su_34", + "L_39ZA", + "Mi_8MT", + "Mi_24V", + "Mi_28N", + "Ka_50", + "Tu_22M3", + "Tu_95MS", + "Tu_142", + "Tu_160" + ], + "awacs": [ + "A_50" + ], + "tankers": [ + "IL_78M" + ], + "frontline_units": [ + "IFV_BMP_1", + "IFV_BMP_2", + "IFV_BMP_3", + "APC_BTR_80", + "APC_BTR_82A", + "MBT_T_90", + "MBT_T_80U", + "MBT_T_72B3", + "SAM_SA_19_Tunguska_2S6" + ], + "artillery_units": [ + "MLRS_9K57_Uragan_BM_27", + "SPH_2S19_Msta" + ], + "logistics_units": [ + "Transport_Ural_375", + "Transport_UAZ_469" + ], + "infantry_units": [ + "Paratrooper_AKS", + "Infantry_Soldier_Rus", + "Paratrooper_RPG_16", + "_2B11_mortar", + "SAM_SA_18_Igla_MANPADS" + ], + "air_defenses": [ + "SA17Generator", + "SA13Generator", + "SA15Generator", + "SA19Generator", + "SA10BGenerator", + "SA12Generator", + "SA20Generator", + "SA20BGenerator", + "SA23Generator" + ], + "ewrs": [ + "BoxSpringGenerator", + "TallRackGenerator" + ], + "aircraft_carrier": [ + "CV_1143_5_Admiral_Kuznetsov" + ], + "helicopter_carrier": [ + ], + "helicopter_carrier_names": [ + ], + "destroyers": [ + "FF_1135M_Rezky" + ], + "cruisers": [ + "FSG_1241_1MP_Molniya" + ], + "requirements": { "High Digit SAMs": "https://github.com/Auranis/HighDigitSAMs/releases"}, + "carrier_names": [ + "Admiral Kuznetov" + ], + "navy_generators": [ + "RussianNavyGroupGenerator" + ], + "has_jtac": true, + "jtac_unit": "MQ_9_Reaper" +} diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 91554c82..730ecbf2 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -19,7 +19,10 @@ "Mi_24V", "Mi_28N", "Ka_50", - "Tu_22M3" + "Tu_22M3", + "Tu_95MS", + "Tu_142", + "Tu_160" ], "awacs": [ "A_50" @@ -86,8 +89,7 @@ "Admiral Kuznetov" ], "navy_generators": [ - "RussianNavyGroupGenerator", - "KiloSubGroupGenerator" + "RussianNavyGroupGenerator" ], "has_jtac": true, "jtac_unit": "MQ_9_Reaper" diff --git a/resources/factions/us_aggressors.json b/resources/factions/us_aggressors.json index 7568ccd5..31595c5f 100644 --- a/resources/factions/us_aggressors.json +++ b/resources/factions/us_aggressors.json @@ -13,6 +13,7 @@ "A_10C", "AV8BNA", "UH_1H", + "SH_60B", "AH_64D", "Ka_50", "B_52H", diff --git a/resources/factions/usa_1944.json b/resources/factions/usa_1944.json index 053ace3c..bdece25a 100644 --- a/resources/factions/usa_1944.json +++ b/resources/factions/usa_1944.json @@ -17,7 +17,6 @@ "MT_M4A4_Sherman_Firefly", "MT_M4_Sherman", "APC_M2A1", - "M30_Cargo_Carrier", "LAC_M8_Greyhound", "TD_M10_GMC", "AA_gun_QF_3_7" diff --git a/resources/factions/usa_1965.json b/resources/factions/usa_1965.json index e0a03e3f..e107e90a 100644 --- a/resources/factions/usa_1965.json +++ b/resources/factions/usa_1965.json @@ -9,6 +9,9 @@ "B_52H", "UH_1H" ], + "awacs": [ + "E_2C" + ], "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", diff --git a/resources/factions/usa_1975.json b/resources/factions/usa_1975.json index cd818384..13093f04 100644 --- a/resources/factions/usa_1975.json +++ b/resources/factions/usa_1975.json @@ -7,9 +7,13 @@ "F_5E_3", "F_4E", "F_14A_135_GR", + "S_3B", "B_52H", "UH_1H" ], + "awacs": [ + "E_2C" + ], "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index e2da4d5f..f33fbdb1 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -13,6 +13,8 @@ "A_10A", "AV8BNA", "UH_1H", + "S_3B", + "SH_60B", "AH_64A", "B_52H", "B_1B", diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 09a6fd1d..f7a5f912 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -7,16 +7,18 @@ "F_15C", "F_15E", "F_14B", + "F_117A", "FA_18C_hornet", "F_16C_50", "A_10C", "A_10C_2", "AV8BNA", "UH_1H", + "S_3B", + "SH_60B", "AH_64D", "B_52H", - "B_1B", - "F_117A" + "B_1B" ], "awacs": [ "E_3A" @@ -34,7 +36,8 @@ "APC_M1043_HMMWV_Armament", "ATGM_M1045_HMMWV_TOW", "SAM_Avenger_M1097", - "SAM_Linebacker_M6" + "SAM_Linebacker_M6", + "SPG_M1128_Stryker_MGS" ], "artillery_units": [ "MLRS_M270", diff --git a/resources/factions/usa_2005_c130.json b/resources/factions/usa_2005_c130.json index af749b94..8164ec23 100644 --- a/resources/factions/usa_2005_c130.json +++ b/resources/factions/usa_2005_c130.json @@ -13,6 +13,8 @@ "A_10C_2", "AV8BNA", "UH_1H", + "S_3B", + "SH_60B", "AH_64D", "B_52H", "B_1B", @@ -70,7 +72,9 @@ "cruisers": [ "Ticonderoga_class" ], - "requirements": {}, + "requirements": { + "C-130J-30 Super Hercules Mod by Anubis": "https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/" + }, "carrier_names": [ "CVN-71 Theodore Roosevelt", "CVN-72 Abraham Lincoln", diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index de7375e6..da821175 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -13,6 +13,8 @@ "A_10C_2", "AV8BNA", "UH_1H", + "S_3B", + "SH_60B", "AH_64D", "B_52H", "B_1B", diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index cfdef2bc..08230c1d 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -4,15 +4,16 @@ "authors": "HerrTom", "description": "Highway to the Danger Zone! For Tomcat lovers.
", "aircrafts": [ + "AH_1W", "F_4E", "F_14A_135_GR", "F_14B", "S_3B", - "UH_1H", - "AH_1W" + "SH_60B", + "UH_1H" ], "awacs": [ - "E_3A" + "E_2C" ], "tankers": [ "S_3B_Tanker" diff --git a/resources/groundobject_templates.p b/resources/groundobject_templates.p index eb39274b..59406efc 100644 Binary files a/resources/groundobject_templates.p and b/resources/groundobject_templates.p differ diff --git a/resources/gulflandmap.p b/resources/gulflandmap.p index 3e2e566e..98fe5bce 100644 Binary files a/resources/gulflandmap.p and b/resources/gulflandmap.p differ diff --git a/resources/nevlandmap.p b/resources/nevlandmap.p index 1b92631a..f8ef5cbb 100644 Binary files a/resources/nevlandmap.p and b/resources/nevlandmap.p differ diff --git a/resources/normandylandmap.p b/resources/normandylandmap.p index 808a2a1e..20eb8715 100644 Binary files a/resources/normandylandmap.p and b/resources/normandylandmap.p differ diff --git a/resources/plugins/ewrs/ewrs.lua b/resources/plugins/ewrs/ewrs.lua index b66b728a..a70c1806 100644 --- a/resources/plugins/ewrs/ewrs.lua +++ b/resources/plugins/ewrs/ewrs.lua @@ -135,6 +135,7 @@ ewrs.acCategories = { --Have I left anything out? Please let me know if I have [ "Su-33" ] = ewrs.FIGHTER , [ "TF-51D" ] = ewrs.ATTACK , [ "UH-1H" ] = ewrs.HELO , +[ "J-11A" ] = ewrs.FIGHTER , } ----END OF SCRIPT OPTIONS---- diff --git a/resources/plugins/herculescargo/Hercules_Cargo.lua b/resources/plugins/herculescargo/Hercules_Cargo.lua index 4aae96c0..09689b38 100644 --- a/resources/plugins/herculescargo/Hercules_Cargo.lua +++ b/resources/plugins/herculescargo/Hercules_Cargo.lua @@ -40,7 +40,70 @@ local Cargo_Drop_Position = {} local SoldierUnitID = 12000 local SoldierGroupID = 12000 local GroupSpacing = 0 - +--added by wrench +Hercules_Cargo.types = { + ["ATGM M1045 HMMWV TOW Air [7183lb]"] = {['name'] = "M1045 HMMWV TOW", ['container'] = true}, + ["ATGM M1045 HMMWV TOW Skid [7073lb]"] = {['name'] = "M1045 HMMWV TOW", ['container'] = false}, + ["APC M1043 HMMWV Armament Air [7023lb]"] = {['name'] = "M1043 HMMWV Armament", ['container'] = true}, + ["APC M1043 HMMWV Armament Skid [6912lb]"] = {['name'] = "M1043 HMMWV Armament", ['container'] = false}, + ["SAM Avenger M1097 Air [7200lb]"] = {['name'] = "M1097 Avenger", ['container'] = true}, + ["SAM Avenger M1097 Skid [7090lb]"] = {['name'] = "M1097 Avenger", ['container'] = false}, + ["APC Cobra Air [10912lb]"] = {['name'] = "Cobra", ['container'] = true}, + ["APC Cobra Skid [10802lb]"] = {['name'] = "Cobra", ['container'] = false}, + ["APC M113 Air [21624lb]"] = {['name'] = "M-113", ['container'] = true}, + ["APC M113 Skid [21494lb]"] = {['name'] = "M-113", ['container'] = false}, + ["Tanker M978 HEMTT [34000lb]"] = {['name'] = "M978 HEMTT Tanker", ['container'] = false}, + ["HEMTT TFFT [34400lb]"] = {['name'] = "HEMTT TFFT", ['container'] = false}, + ["SPG M1128 Stryker MGS [33036lb]"] = {['name'] = "M1128 Stryker MGS", ['container'] = false}, + ["AAA Vulcan M163 Air [21666lb]"] = {['name'] = "Vulcan", ['container'] = true}, + ["AAA Vulcan M163 Skid [21577lb]"] = {['name'] = "Vulcan", ['container'] = false}, + ["APC M1126 Stryker ICV [29542lb]"] = {['name'] = "M1126 Stryker ICV", ['container'] = false}, + ["ATGM M1134 Stryker [30337lb]"] = {['name'] = "M1134 Stryker ATGM", ['container'] = false}, + ["APC LAV-25 Air [22520lb]"] = {['name'] = "LAV-25", ['container'] = true}, + ["APC LAV-25 Skid [22514lb]"] = {['name'] = "LAV-25", ['container'] = false}, + ["M1025 HMMWV Air [6160lb]"] = {['name'] = "Hummer", ['container'] = true}, + ["M1025 HMMWV Skid [6050lb]"] = {['name'] = "Hummer", ['container'] = false}, + ["IFV M2A2 Bradley [34720lb]"] = {['name'] = "M-2 Bradley", ['container'] = false}, + ["IFV MCV-80 [34720lb]"] = {['name'] = "MCV-80", ['container'] = false}, + ["IFV BMP-1 [23232lb]"] = {['name'] = "BMP-1", ['container'] = false}, + ["IFV BMP-2 [25168lb]"] = {['name'] = "BMP-2", ['container'] = false}, + ["IFV BMP-3 [32912lb]"] = {['name'] = "BMP-3", ['container'] = false}, + ["ARV BRDM-2 Air [12320lb]"] = {['name'] = "BRDM-2", ['container'] = true}, + ["ARV BRDM-2 Skid [12210lb]"] = {['name'] = "BRDM-2", ['container'] = false}, + ["APC BTR-80 Air [23936lb]"] = {['name'] = "BTR-80", ['container'] = true}, + ["APC BTR-80 Skid [23826lb]"] = {['name'] = "BTR-80", ['container'] = false}, + ["APC BTR-82A Air [24998lb]"] = {['name'] = "BTR-82A", ['container'] = true}, + ["APC BTR-82A Skid [24888lb]"] = {['name'] = "BTR-82A", ['container'] = false}, + ["SAM ROLAND ADS [34720lb]"] = {['name'] = "Roland Radar", ['container'] = false}, + ["SAM ROLAND LN [34720b]"] = {['name'] = "Roland ADS", ['container'] = false}, + ["SAM SA-13 STRELA [21624lb]"] = {['name'] = "Strela-10M3", ['container'] = false}, + ["AAA ZSU-23-4 Shilka [32912lb]"] = {['name'] = "ZSU-23-4 Shilka", ['container'] = false}, + ["SAM SA-19 Tunguska 2S6 [34720lb]"] = {['name'] = "2S6 Tunguska", ['container'] = false}, + ["Transport UAZ-469 Air [3747lb]"] = {['name'] = "UAZ-469", ['container'] = true}, + ["Transport UAZ-469 Skid [3630lb]"] = {['name'] = "UAZ-469", ['container'] = false}, + ["AAA GEPARD [34720lb]"] = {['name'] = "Gepard", ['container'] = false}, + ["SAM CHAPARRAL Air [21624lb]"] = {['name'] = "M48 Chaparral", ['container'] = true}, + ["SAM CHAPARRAL Skid [21516lb]"] = {['name'] = "M48 Chaparral", ['container'] = false}, + ["SAM LINEBACKER [34720lb]"] = {['name'] = "M6 Linebacker", ['container'] = false}, + ["Transport URAL-375 [14815lb]"] = {['name'] = "Ural-375", ['container'] = false}, + ["Transport M818 [16000lb]"] = {['name'] = "M 818", ['container'] = false}, + ["IFV MARDER [34720lb]"] = {['name'] = "Marder", ['container'] = false}, + ["Transport Tigr Air [15900lb]"] = {['name'] = "Tigr_233036", ['container'] = true}, + ["Transport Tigr Skid [15730lb]"] = {['name'] = "Tigr_233036", ['container'] = false}, + ["IFV TPZ FUCH [33440lb]"] = {['name'] = "TPZ", ['container'] = false}, + ["IFV BMD-1 Air [18040lb]"] = {['name'] = "BMD-1", ['container'] = true}, + ["IFV BMD-1 Skid [17930lb]"] = {['name'] = "BMD-1", ['container'] = false}, + ["IFV BTR-D Air [18040lb]"] = {['name'] = "BTR_D", ['container'] = true}, + ["IFV BTR-D Skid [17930lb]"] = {['name'] = "BTR_D", ['container'] = false}, + ["EWR SBORKA Air [21624lb]"] = {['name'] = "Dog Ear radar", ['container'] = true}, + ["EWR SBORKA Skid [21624lb]"] = {['name'] = "Dog Ear radar", ['container'] = false}, + ["ART 2S9 NONA Air [19140lb]"] = {['name'] = "SAU 2-C9", ['container'] = true}, + ["ART 2S9 NONA Skid [19030lb]"] = {['name'] = "SAU 2-C9", ['container'] = false}, + ["ART GVOZDIKA [34720lb]"] = {['name'] = "SAU Gvozdika", ['container'] = false}, + ["APC MTLB Air [26400lb]"] = {['name'] = "MTLB", ['container'] = true}, + ["APC MTLB Skid [26290lb]"] = {['name'] = "MTLB", ['container'] = false}, + --["Generic Crate [20000lb]"] = {['name'] = "Hercules_Container_Parachute", ['container'] = true} +} function Hercules_Cargo.Soldier_SpawnGroup(Cargo_Drop_Position, Cargo_Type_name, CargoHeading, Cargo_Country, GroupSpacing) SoldierUnitID = SoldierUnitID + 30 SoldierGroupID = SoldierGroupID + 1 @@ -488,265 +551,24 @@ end -- EventHandlers ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ function Hercules_Cargo.Hercules_Cargo_Drop_Events:onEvent(Cargo_Drop_Event) - if Cargo_Drop_Event.id == world.event.S_EVENT_SHOT then - GT_DisplayName = Weapon.getDesc(Cargo_Drop_Event.weapon).typeName:sub(15, -1)--Remove "weapons.bombs." from string - -- trigger.action.outTextForCoalition(coalition.side.BLUE, string.format("Cargo_Drop_Event: %s", Weapon.getDesc(Cargo_Drop_Event.weapon).typeName), 10) - -- trigger.action.outTextForCoalition(coalition.side.RED, string.format("Cargo_Drop_Event: %s", Weapon.getDesc(Cargo_Drop_Event.weapon).typeName), 10) - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Squad 30 x Soldier [7950lb]") then - GT_Name = "Soldier M4 GRG" - SoldierGroup = true - ParatrooperGroupSpawnInit = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, SoldierGroup) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "ATGM M1045 HMMWV TOW [7183lb]") then - GT_Name = "M1045 HMMWV TOW" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC M1043 HMMWV Armament [7023lb]") then - GT_Name = "M1043 HMMWV Armament" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM Avenger M1097 [7200lb]") then - GT_Name = "M1097 Avenger" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC Cobra [10912lb]") then - GT_Name = "Cobra" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC M113 [21624lb]") then - GT_Name = "M-113" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Tanker M978 HEMTT [34000lb]") then - GT_Name = "M978 HEMTT Tanker" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "HEMTT TFFT [34400lb]") then - GT_Name = "HEMTT TFFT" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SPG M1128 Stryker MGS [33036lb]") then - GT_Name = "M1128 Stryker MGS" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "AAA Vulcan M163 [21666lb]") then - GT_Name = "Vulcan" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC M1126 Stryker ICV [29542lb]") then - GT_Name = "M1126 Stryker ICV" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "ATGM M1134 Stryker [30337lb]") then - GT_Name = "M1134 Stryker ATGM" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC LAV-25 [22514lb]") then - GT_Name = "LAV-25" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "M1025 HMMWV [6160lb]") then - GT_Name = "Hummer" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV M2A2 Bradley [34720lb]") then - GT_Name = "M-2 Bradley" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV MCV-80 [34720lb]") then - GT_Name = "MCV-80" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV BMP-1 [23232lb]") then - GT_Name = "BMP-1" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV BMP-2 [25168lb]") then - GT_Name = "BMP-2" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV BMP-3 [32912lb]") then - GT_Name = "BMP-3" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "ARV BRDM-2 [12320lb]") then - GT_Name = "BRDM-2" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC BTR-80 [23936lb]") then - GT_Name = "BTR-80" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM ROLAND ADS [34720lb]") then - GT_Name = "Roland Radar" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM ROLAND LN [34720b]") then - GT_Name = "Roland ADS" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM SA-13 STRELA [21624lb]") then - GT_Name = "Strela-10M3" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "AAA ZSU-23-4 Shilka [32912lb]") then - GT_Name = "ZSU-23-4 Shilka" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM SA-19 Tunguska 2S6 [34720lb]") then - GT_Name = "2S6 Tunguska" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Transport UAZ-469 [3747lb]") then - GT_Name = "UAZ-469" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Armed speedboat [2000lb]") then - GT_Name = "speedboat" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "AAA GEPARD [34720lb]") then - GT_Name = "Gepard" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM CHAPARRAL [21624lb]") then - GT_Name = "M48 Chaparral" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "SAM LINEBACKER [34720lb]") then - GT_Name = "M6 Linebacker" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Transport URAL-375 [14815lb]") then - GT_Name = "Ural-375" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Transport M818 [16000lb]") then - GT_Name = "M 818" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV MARDER [34720lb]") then - GT_Name = "Marder" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "Transport Tigr [15900lb]") then - GT_Name = "Tigr_233036" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV TPZ FUCH [33440lb]") then - GT_Name = "TPZ" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV BMD-1 [18040lb]") then - GT_Name = "BMD-1" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "IFV BTR-D [18040lb]") then - GT_Name = "BTR_D" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "EWR SBORKA [21624lb]") then - GT_Name = "Dog Ear radar" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "ART 2S9 NONA [19140lb]") then - GT_Name = "SAU 2-C9" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "ART GVOZDIKA [34720lb]") then - GT_Name = "SAU Gvozdika" - Cargo_Container_Enclosed = false - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - if (GT_DisplayName == "APC MTLB [26000lb]") then - GT_Name = "MTLB" - Cargo_Container_Enclosed = true - Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) - end - --------------------------------------------------------------------------------------------------------------------------------- - end + if Cargo_Drop_Event.id == world.event.S_EVENT_SHOT then + GT_DisplayName = Weapon.getDesc(Cargo_Drop_Event.weapon).typeName:sub(15, -1)--Remove "weapons.bombs." from string + -- trigger.action.outTextForCoalition(coalition.side.BLUE, string.format("Cargo_Drop_Event: %s", Weapon.getDesc(Cargo_Drop_Event.weapon).typeName), 10) + -- trigger.action.outTextForCoalition(coalition.side.RED, string.format("Cargo_Drop_Event: %s", Weapon.getDesc(Cargo_Drop_Event.weapon).typeName), 10) + --------------------------------------------------------------------------------------------------------------------------------- + if (GT_DisplayName == "Squad 30 x Soldier [7950lb]") then + GT_Name = "Soldier M4 GRG" + SoldierGroup = true + ParatrooperGroupSpawnInit = true + Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, SoldierGroup) + end + --------------------------------------------------------------------------------------------------------------------------------- + if Hercules_Cargo.types[GT_DisplayName] then + local GT_Name = Hercules_Cargo.types[GT_DisplayName]['name'] + local Cargo_Container_Enclosed = Hercules_Cargo.types[GT_DisplayName]['container'] + Hercules_Cargo.Cargo_Initialize(Cargo_Drop_Event.initiator, Cargo_Drop_Event.weapon, GT_Name, Cargo_Container_Enclosed) + end +end end world.addEventHandler(Hercules_Cargo.Hercules_Cargo_Drop_Events) diff --git a/resources/plugins/skynetiads/LICENSE.md b/resources/plugins/skynetiads/LICENSE.md new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/resources/plugins/skynetiads/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/resources/plugins/skynetiads/skynet-iads-compiled.lua b/resources/plugins/skynetiads/skynet-iads-compiled.lua index 61763cc4..7b7939a4 100644 --- a/resources/plugins/skynetiads/skynet-iads-compiled.lua +++ b/resources/plugins/skynetiads/skynet-iads-compiled.lua @@ -1,4 +1,4 @@ -env.info("--- SKYNET VERSION: 1.2.0 | BUILD TIME: 21.11.2020 1159Z ---") +env.info("--- SKYNET VERSION: 2.0.1 | BUILD TIME: 04.01.2021 0706Z ---") do --this file contains the required units per sam type samTypesDB = { @@ -6,8 +6,14 @@ samTypesDB = { ['type'] = 'complex', ['searchRadar'] = { ['S-300PS 40B6MD sr'] = { + ['name'] = { + ['NATO'] = 'Clam Shell', + }, }, ['S-300PS 64H6E sr'] = { + ['name'] = { + ['NATO'] = 'Big Bird', + }, }, }, ['trackingRadar'] = { @@ -34,6 +40,9 @@ samTypesDB = { ['type'] = 'complex', ['searchRadar'] = { ['SA-11 Buk SR 9S18M1'] = { + ['name'] = { + ['NATO'] = 'Snow Drift', + }, }, }, ['launchers'] = { @@ -50,11 +59,14 @@ samTypesDB = { }, ['harm_detection_chance'] = 70 }, - ['s-125'] = { + ['S-125'] = { ['type'] = 'complex', ['searchRadar'] = { ['p-19 s-125 sr'] = { - }, + ['name'] = { + ['NATO'] = 'Flat Face', + }, + }, }, ['trackingRadar'] = { ['snr s-125 tr'] = { @@ -67,12 +79,15 @@ samTypesDB = { ['name'] = { ['NATO'] = 'SA-3 Goa', }, - ['harm_detection_chance'] = 40 + ['harm_detection_chance'] = 30 }, - ['s-75'] = { + ['S-75'] = { ['type'] = 'complex', ['searchRadar'] = { ['p-19 s-125 sr'] = { + ['name'] = { + ['NATO'] = 'Flat Face', + }, }, }, ['trackingRadar'] = { @@ -92,6 +107,9 @@ samTypesDB = { ['type'] = 'complex', ['searchRadar'] = { ['Kub 1S91 str'] = { + ['name'] = { + ['NATO'] = 'Straight Flush', + }, }, }, ['launchers'] = { @@ -107,9 +125,11 @@ samTypesDB = { ['type'] = 'complex', ['searchRadar'] = { ['Patriot str'] = { + ['name'] = { + ['NATO'] = 'Patriot str', + }, }, }, - ['launchers'] = { ['Patriot ln'] = { }, @@ -139,6 +159,9 @@ samTypesDB = { ['type'] = 'complex', ['searchRadar'] = { ['Hawk sr'] = { + ['name'] = { + ['NATO'] = 'Hawk str', + }, }, }, ['trackingRadar'] = { @@ -299,6 +322,9 @@ samTypesDB = { ['HQ-7'] = { ['searchRadar'] = { ['HQ-7_STR_SP'] = { + ['name'] = { + ['NATO'] = 'CSA-4', + }, }, }, ['launchers'] = { @@ -315,109 +341,598 @@ samTypesDB = { ['type'] = 'ewr', ['searchRadar'] = { ['1L13 EWR'] = { + ['name'] = { + ['NATO'] = 'Box Spring', + }, }, }, - ['name'] = { - ['NATO'] = '1L13 EWR', - }, ['harm_detection_chance'] = 60 }, ['55G6 EWR'] = { ['type'] = 'ewr', ['searchRadar'] = { ['55G6 EWR'] = { + ['name'] = { + ['NATO'] = 'Tall Rack', + }, }, }, - ['name'] = { - ['NATO'] = '55G6 EWR', - }, ['harm_detection_chance'] = 60 }, ['Dog Ear'] = { ['type'] = 'ewr', ['searchRadar'] = { ['Dog Ear radar'] = { + ['name'] = { + ['NATO'] = 'Dog Ear', + }, }, }, - ['name'] = { - ['NATO'] = 'Dog Ear', - }, ['harm_detection_chance'] = 20 }, ['Roland Radar'] = { ['type'] = 'ewr', ['searchRadar'] = { ['Roland Radar'] = { + ['name'] = { + ['NATO'] = 'Roland EWR', + }, }, }, - ['name'] = { - ['NATO'] = 'Roland EWR', - }, + ['harm_detection_chance'] = 60 - }, - ['p-19 s-125 sr'] = { - ['searchRadar'] = { - ['p-19 s-125 sr'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Flat Face', - }, - ['harm_detection_chance'] = 40 - }, - ['Patriot str'] = { - ['searchRadar'] = { - ['Patriot str'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Patriot str', - }, - ['harm_detection_chance'] = 80 - }, - ['EW S-300'] = { - ['searchRadar'] = { - ['S-300PS 40B6MD sr'] = { - }, - ['S-300PS 64H6E sr'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Big Bird', - }, - ['harm_detection_chance'] = 90 - }, - ['SA-11 Buk SR 9S18M1'] = { - ['searchRadar'] = { - ['SA-11 Buk SR 9S18M1'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Snow Drift', - }, - ['harm_detection_chance'] = 70 - }, - ['Kub 1S91 str'] = { - ['searchRadar'] = { - ['Kub 1S91 str'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Straight Flush', - }, - ['harm_detection_chance'] = 40 - }, - ['Hawk str'] = { - ['searchRadar'] = { - ['Hawk sr'] = { - }, - }, - ['name'] = { - ['NATO'] = 'Hawk str', - }, - ['harm_detection_chance'] = 40 }, } +end +do +-- this file contains the definitions for the HightDigitSAMSs: https://github.com/Auranis/HighDigitSAMs + +--[[ units in SA-10 group Gargoyle: +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 54K6 cp +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 5P85CE ln +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 5P85DE ln +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 40B6MD sr +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 64N6E sr +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 40B6M tr +2020-12-10 18:27:27.050 INFO SCRIPTING: S-300PMU1 30N6E tr +--]] +samTypesDB['S-300PMU1'] = { + ['type'] = 'complex', + ['searchRadar'] = { + ['S-300PMU1 40B6MD sr'] = { + ['name'] = { + ['NATO'] = 'Clam Shell', + }, + }, + ['S-300PMU1 64N6E sr'] = { + ['name'] = { + ['NATO'] = 'Big Bird', + }, + }, + }, + ['trackingRadar'] = { + ['S-300PMU1 40B6M tr'] = { + }, + ['S-300PMU1 30N6E tr'] = { + }, + }, + ['misc'] = { + ['S-300PMU1 54K6 cp'] = { + ['required'] = true, + }, + }, + ['launchers'] = { + ['S-300PMU1 5P85CE ln'] = { + }, + ['S-300PMU1 5P85DE ln'] = { + }, + }, + ['name'] = { + ['NATO'] = 'SA-20A Gargoyle' + }, + ['harm_detection_chance'] = 90 +} + +--[[ Units in the SA-23 Group: +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9A82ME ln +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9A83ME ln +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9S15M2 sr +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9S19M2 sr +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9S32ME tr +2020-12-11 16:40:52.072 INFO SCRIPTING: S-300VM 9S457ME cp + +According to wikipedia: +dem 9A83-Startfahrzeug die Bezeichnung SA-12A Gladiator zu geben; das größere 9A82-Startfahrzeug erhielt die Bezeichnung SA-12B Giant. +9A83ME -> SA-23A Gladiator +9A82ME -> SA-23B Giant +]]-- +samTypesDB['S-300VM'] = { + ['type'] = 'complex', + ['searchRadar'] = { + ['S-300VM 9S15M2 sr'] = { + ['name'] = { + ['NATO'] = 'Bill Board-C', + }, + }, + ['S-300VM 9S19M2 sr'] = { + ['name'] = { + ['NATO'] = 'High Screen-B', + }, + }, + }, + ['trackingRadar'] = { + ['S-300VM 9S32ME tr'] = { + }, + }, + ['misc'] = { + ['S-300VM 9S457ME cp'] = { + ['required'] = true, + }, + }, + ['launchers'] = { + ['S-300VM 9A82ME ln'] = { + }, + ['S-300VM 9A83ME ln'] = { + }, + }, + ['name'] = { + ['NATO'] = 'SA-23 Gladiator/Giant' + }, + ['harm_detection_chance'] = 90 +} + +--[[ Units in the SA-10B Group: +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS SA-10B 40B6MD MAST sr +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS SA-10B 54K6 cp +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS 5P85SE_mod ln +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS 5P85SU_mod ln +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS 64H6E TRAILER sr +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS 30N6 TRAILER tr +2021-01-01 20:39:14.413 INFO SCRIPTING: S-300PS SA-10B 40B6M MAST tr +--]] +samTypesDB['S-300PS'] = { + ['type'] = 'complex', + ['searchRadar'] = { + ['S-300PS SA-10B 40B6MD MAST sr'] = { + }, + ['S-300PS 64H6E TRAILER sr'] = { + }, + }, + ['trackingRadar'] = { + ['S-300PS 30N6 TRAILER tr'] = { + }, + ['S-300PS SA-10B 40B6M MAST tr'] = { + }, + }, + ['misc'] = { + ['S-300PS SA-10B 54K6 cp'] = { + ['required'] = true, + }, + }, + ['launchers'] = { + ['S-300PS 5P85SE_mod ln'] = { + }, + ['S-300PS 5P85SU_mod ln'] = { + }, + }, + ['name'] = { + ['NATO'] = 'SA-10B Grumble' + }, + ['harm_detection_chance'] = 90 +} + +--[[ Extra launchers for the in game SA-10C and HighDigitSAMs SA-10B, SA-20B +2021-01-01 21:04:19.908 INFO SCRIPTING: S-300PS 5P85DE ln +2021-01-01 21:04:19.908 INFO SCRIPTING: S-300PS 5P85CE ln +--]] + +local s300launchers = samTypesDB['S-300']['launchers'] +s300launchers['S-300PS 5P85DE ln'] = {} +s300launchers['S-300PS 5P85CE ln'] = {} + +local s300launchers = samTypesDB['S-300PS']['launchers'] +s300launchers['S-300PS 5P85DE ln'] = {} +s300launchers['S-300PS 5P85CE ln'] = {} + +local s300launchers = samTypesDB['S-300PMU1']['launchers'] +s300launchers['S-300PS 5P85DE ln'] = {} +s300launchers['S-300PS 5P85CE ln'] = {} + +--[[ +New launcher for the SA-11 complex, will identify as SA-17 +SA-17 Buk M1-2 LN 9A310M1-2 + --]] +samTypesDB['Buk-M2'] = { + ['type'] = 'complex', + ['searchRadar'] = { + ['SA-11 Buk SR 9S18M1'] = { + }, + }, + ['launchers'] = { + ['SA-17 Buk M1-2 LN 9A310M1-2'] = { + }, + }, + ['misc'] = { + ['SA-11 Buk CC 9S470M1'] = { + ['required'] = true, + }, + }, + ['name'] = { + ['NATO'] = 'SA-17 Grizzly', + }, + ['harm_detection_chance'] = 90 +} + +--[[ +New launcher for the SA-2 complex: S_75M_Volhov_V759 +--]] +local s75launchers = samTypesDB['S-75']['launchers'] +s75launchers['S_75M_Volhov_V759'] = {} + +--[[ +New launcher for the SA-3 complex: +--]] +local s125launchers = samTypesDB['S-125']['launchers'] +s125launchers['5p73 V-601P ln'] = {} + +--[[ +New launcher for the SA-2 complex: HQ_2_Guideline_LN +--]] +local s125launchers = samTypesDB['S-75']['launchers'] +s125launchers['HQ_2_Guideline_LN'] = {} + +end + + + +do + +SkynetIADSLogger = {} +SkynetIADSLogger.__index = SkynetIADSLogger + +function SkynetIADSLogger:create(iads) + local logger = {} + setmetatable(logger, SkynetIADSLogger) + logger.debugOutput = {} + logger.debugOutput.IADSStatus = false + logger.debugOutput.samWentDark = false + logger.debugOutput.contacts = false + logger.debugOutput.radarWentLive = false + logger.debugOutput.jammerProbability = false + logger.debugOutput.addedEWRadar = false + logger.debugOutput.addedSAMSite = false + logger.debugOutput.warnings = true + logger.debugOutput.harmDefence = false + logger.debugOutput.samSiteStatusEnvOutput = false + logger.debugOutput.earlyWarningRadarStatusEnvOutput = false + logger.debugOutput.commandCenterStatusEnvOutput = false + logger.iads = iads + return logger +end + +function SkynetIADSLogger:getDebugSettings() + return self.debugOutput +end + +function SkynetIADSLogger:printOutput(output, typeWarning) + if typeWarning == true and self:getDebugSettings().warnings or typeWarning == nil then + if typeWarning == true then + output = "WARNING: "..output + end + trigger.action.outText(output, 4) + end +end + +function SkynetIADSLogger:printOutputToLog(output) + env.info("SKYNET: "..output, 4) +end + +function SkynetIADSLogger:printEarlyWarningRadarStatus() + local ewRadars = self.iads:getEarlyWarningRadars() + self:printOutputToLog("------------------------------------------ EW RADAR STATUS: "..self.iads:getCoalitionString().." -------------------------------") + for i = 1, #ewRadars do + local ewRadar = ewRadars[i] + local numConnectionNodes = #ewRadar:getConnectionNodes() + local numPowerSources = #ewRadar:getPowerSources() + local isActive = ewRadar:isActive() + local connectionNodes = ewRadar:getConnectionNodes() + local firstRadar = nil + local radars = ewRadar:getRadars() + + --get the first existing radar to prevent issues in calculating the distance later on: + for i = 1, #radars do + if radars[i]:isExist() then + firstRadar = radars[i] + break + end + + end + local numDamagedConnectionNodes = 0 + + + for j = 1, #connectionNodes do + local connectionNode = connectionNodes[j] + if connectionNode:isExist() == false then + numDamagedConnectionNodes = numDamagedConnectionNodes + 1 + end + end + local intactConnectionNodes = numConnectionNodes - numDamagedConnectionNodes + + local powerSources = ewRadar:getPowerSources() + local numDamagedPowerSources = 0 + for j = 1, #powerSources do + local powerSource = powerSources[j] + if powerSource:isExist() == false then + numDamagedPowerSources = numDamagedPowerSources + 1 + end + end + local intactPowerSources = numPowerSources - numDamagedPowerSources + + local detectedTargets = ewRadar:getDetectedTargets() + local samSitesInCoveredArea = ewRadar:getChildRadars() + + local unitName = "DESTROYED" + + if ewRadar:getDCSRepresentation():isExist() then + unitName = ewRadar:getDCSName() + end + + self:printOutputToLog("UNIT: "..unitName.." | TYPE: "..ewRadar:getNatoName()) + self:printOutputToLog("ACTIVE: "..tostring(isActive).."| DETECTED TARGETS: "..#detectedTargets.." | DEFENDING HARM: "..tostring(ewRadar:isDefendingHARM())) + if numConnectionNodes > 0 then + self:printOutputToLog("CONNECTION NODES: "..numConnectionNodes.." | DAMAGED: "..numDamagedConnectionNodes.." | INTACT: "..intactConnectionNodes) + else + self:printOutputToLog("NO CONNECTION NODES SET") + end + if numPowerSources > 0 then + self:printOutputToLog("POWER SOURCES : "..numPowerSources.." | DAMAGED:"..numDamagedPowerSources.." | INTACT: "..intactPowerSources) + else + self:printOutputToLog("NO POWER SOURCES SET") + end + + self:printOutputToLog("SAM SITES IN COVERED AREA: "..#samSitesInCoveredArea) + for j = 1, #samSitesInCoveredArea do + local samSiteCovered = samSitesInCoveredArea[j] + self:printOutputToLog(samSiteCovered:getDCSName()) + end + + for j = 1, #detectedTargets do + local contact = detectedTargets[j] + if firstRadar ~= nil and firstRadar:isExist() then + local distance = mist.utils.round(mist.utils.metersToNM(ewRadar:getDistanceInMetersToContact(firstRadar:getDCSRepresentation(), contact:getPosition().p)), 2) + self:printOutputToLog("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | DISTANCE NM: "..distance) + end + end + + self:printOutputToLog("---------------------------------------------------") + + end + +end + +function SkynetIADSLogger:getMetaInfo(abstractElementSupport) + local info = {} + info.numSources = #abstractElementSupport + info.numDamagedSources = 0 + info.numIntactSources = 0 + for j = 1, #abstractElementSupport do + local source = abstractElementSupport[j] + if source:isExist() == false then + info.numDamagedSources = info.numDamagedSources + 1 + end + end + info.numIntactSources = info.numSources - info.numDamagedSources + return info +end + +function SkynetIADSLogger:printSAMSiteStatus() + local samSites = self.iads:getSAMSites() + + self:printOutputToLog("------------------------------------------ SAM STATUS: "..self.iads:getCoalitionString().." -------------------------------") + for i = 1, #samSites do + local samSite = samSites[i] + local numConnectionNodes = #samSite:getConnectionNodes() + local numPowerSources = #samSite:getPowerSources() + local isAutonomous = samSite:getAutonomousState() + local isActive = samSite:isActive() + + local connectionNodes = samSite:getConnectionNodes() + local firstRadar = samSite:getRadars()[1] + local numDamagedConnectionNodes = 0 + for j = 1, #connectionNodes do + local connectionNode = connectionNodes[j] + if connectionNode:isExist() == false then + numDamagedConnectionNodes = numDamagedConnectionNodes + 1 + end + end + local intactConnectionNodes = numConnectionNodes - numDamagedConnectionNodes + + local powerSources = samSite:getPowerSources() + local numDamagedPowerSources = 0 + for j = 1, #powerSources do + local powerSource = powerSources[j] + if powerSource:isExist() == false then + numDamagedPowerSources = numDamagedPowerSources + 1 + end + end + local intactPowerSources = numPowerSources - numDamagedPowerSources + + local detectedTargets = samSite:getDetectedTargets() + + local samSitesInCoveredArea = samSite:getChildRadars() + + self:printOutputToLog("GROUP: "..samSite:getDCSName().." | TYPE: "..samSite:getNatoName()) + self:printOutputToLog("ACTIVE: "..tostring(isActive).." | AUTONOMOUS: "..tostring(isAutonomous).." | IS ACTING AS EW: "..tostring(samSite:getActAsEW()).." | DETECTED TARGETS: "..#detectedTargets.." | DEFENDING HARM: "..tostring(samSite:isDefendingHARM()).." | MISSILES IN FLIGHT: "..tostring(samSite:getNumberOfMissilesInFlight())) + + if numConnectionNodes > 0 then + self:printOutputToLog("CONNECTION NODES: "..numConnectionNodes.." | DAMAGED: "..numDamagedConnectionNodes.." | INTACT: "..intactConnectionNodes) + else + self:printOutputToLog("NO CONNECTION NODES SET") + end + if numPowerSources > 0 then + self:printOutputToLog("POWER SOURCES : "..numPowerSources.." | DAMAGED:"..numDamagedPowerSources.." | INTACT: "..intactPowerSources) + else + self:printOutputToLog("NO POWER SOURCES SET") + end + + self:printOutputToLog("SAM SITES IN COVERED AREA: "..#samSitesInCoveredArea) + for j = 1, #samSitesInCoveredArea do + local samSiteCovered = samSitesInCoveredArea[j] + self:printOutputToLog(samSiteCovered:getDCSName()) + end + + for j = 1, #detectedTargets do + local contact = detectedTargets[j] + if firstRadar ~= nil and firstRadar:isExist() then + local distance = mist.utils.round(mist.utils.metersToNM(samSite:getDistanceInMetersToContact(firstRadar:getDCSRepresentation(), contact:getPosition().p)), 2) + self:printOutputToLog("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | DISTANCE NM: "..distance) + end + end + + self:printOutputToLog("---------------------------------------------------") + end +end + +function SkynetIADSLogger:printCommandCenterStatus() + local commandCenters = self.iads:getCommandCenters() + self:printOutputToLog("------------------------------------------ COMMAND CENTER STATUS: "..self.iads:getCoalitionString().." -------------------------------") + + for i = 1, #commandCenters do + local commandCenter = commandCenters[i] + local numConnectionNodes = #commandCenter:getConnectionNodes() + local powerSourceInfo = self:getMetaInfo(commandCenter:getPowerSources()) + local connectionNodeInfo = self:getMetaInfo(commandCenter:getConnectionNodes()) + self:printOutputToLog("GROUP: "..commandCenter:getDCSName().." | TYPE: "..commandCenter:getNatoName()) + if connectionNodeInfo.numSources > 0 then + self:printOutputToLog("CONNECTION NODES: "..connectionNodeInfo.numSources.." | DAMAGED: "..connectionNodeInfo.numDamagedSources.." | INTACT: "..connectionNodeInfo.numIntactSources) + else + self:printOutputToLog("NO CONNECTION NODES SET") + end + if powerSourceInfo.numSources > 0 then + self:printOutputToLog("POWER SOURCES : "..powerSourceInfo.numSources.." | DAMAGED: "..powerSourceInfo.numDamagedSources.." | INTACT: "..powerSourceInfo.numIntactSources) + else + self:printOutputToLog("NO POWER SOURCES SET") + end + self:printOutputToLog("---------------------------------------------------") + end +end + +function SkynetIADSLogger:printSystemStatus() + + if self:getDebugSettings().IADSStatus or self:getDebugSettings().contacts then + local coalitionStr = self.iads:getCoalitionString() + self:printOutput("---- IADS: "..coalitionStr.." ------") + end + + if self:getDebugSettings().IADSStatus then + + local commandCenters = self.iads:getCommandCenters() + local numComCenters = #commandCenters + local numDestroyedComCenters = 0 + local numComCentersNoPower = 0 + local numComCentersNoConnectionNode = 0 + local numIntactComCenters = 0 + for i = 1, #commandCenters do + local commandCenter = commandCenters[i] + if commandCenter:hasWorkingPowerSource() == false then + numComCentersNoPower = numComCentersNoPower + 1 + end + if commandCenter:hasActiveConnectionNode() == false then + numComCentersNoConnectionNode = numComCentersNoConnectionNode + 1 + end + if commandCenter:isDestroyed() == false then + numIntactComCenters = numIntactComCenters + 1 + end + end + + numDestroyedComCenters = numComCenters - numIntactComCenters + + + self:printOutput("COMMAND CENTERS: "..numComCenters.." | Destroyed: "..numDestroyedComCenters.." | NoPowr: "..numComCentersNoPower.." | NoCon: "..numComCentersNoConnectionNode) + + local ewNoPower = 0 + local earlyWarningRadars = self.iads:getEarlyWarningRadars() + local ewTotal = #earlyWarningRadars + local ewNoConnectionNode = 0 + local ewActive = 0 + local ewRadarsInactive = 0 + + for i = 1, #earlyWarningRadars do + local ewRadar = earlyWarningRadars[i] + if ewRadar:hasWorkingPowerSource() == false then + ewNoPower = ewNoPower + 1 + end + if ewRadar:hasActiveConnectionNode() == false then + ewNoConnectionNode = ewNoConnectionNode + 1 + end + if ewRadar:isActive() then + ewActive = ewActive + 1 + end + end + + ewRadarsInactive = ewTotal - ewActive + local numEWRadarsDestroyed = #self.iads:getDestroyedEarlyWarningRadars() + self:printOutput("EW: "..ewTotal.." | On: "..ewActive.." | Off: "..ewRadarsInactive.." | Destroyed: "..numEWRadarsDestroyed.." | NoPowr: "..ewNoPower.." | NoCon: "..ewNoConnectionNode) + + local samSitesInactive = 0 + local samSitesActive = 0 + local samSites = self.iads:getSAMSites() + local samSitesTotal = #samSites + local samSitesNoPower = 0 + local samSitesNoConnectionNode = 0 + local samSitesOutOfAmmo = 0 + local samSiteAutonomous = 0 + local samSiteRadarDestroyed = 0 + for i = 1, #samSites do + local samSite = samSites[i] + if samSite:hasWorkingPowerSource() == false then + samSitesNoPower = samSitesNoPower + 1 + end + if samSite:hasActiveConnectionNode() == false then + samSitesNoConnectionNode = samSitesNoConnectionNode + 1 + end + if samSite:isActive() then + samSitesActive = samSitesActive + 1 + end + if samSite:hasRemainingAmmo() == false then + samSitesOutOfAmmo = samSitesOutOfAmmo + 1 + end + if samSite:getAutonomousState() == true then + samSiteAutonomous = samSiteAutonomous + 1 + end + if samSite:hasWorkingRadar() == false then + samSiteRadarDestroyed = samSiteRadarDestroyed + 1 + end + end + + samSitesInactive = samSitesTotal - samSitesActive + self:printOutput("SAM: "..samSitesTotal.." | On: "..samSitesActive.." | Off: "..samSitesInactive.." | Autonm: "..samSiteAutonomous.." | Raddest: "..samSiteRadarDestroyed.." | NoPowr: "..samSitesNoPower.." | NoCon: "..samSitesNoConnectionNode.." | NoAmmo: "..samSitesOutOfAmmo) + end + + if self:getDebugSettings().contacts then + local contacts = self.iads:getContacts() + if contacts then + for i = 1, #contacts do + local contact = contacts[i] + self:printOutput("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | GS: "..tostring(contact:getGroundSpeedInKnots()).." | LAST SEEN: "..contact:getAge()) + end + end + end + + if self:getDebugSettings().commandCenterStatusEnvOutput then + self:printCommandCenterStatus() + end + + if self:getDebugSettings().earlyWarningRadarStatusEnvOutput then + self:printEarlyWarningRadarStatus() + end + + if self:getDebugSettings().samSiteStatusEnvOutput then + self:printSAMSiteStatus() + end + +end + end do @@ -439,27 +954,12 @@ function SkynetIADS:create(name) iads.contacts = {} iads.maxTargetAge = 32 iads.name = name + iads.logger = SkynetIADSLogger:create(iads) if iads.name == nil then iads.name = "" end iads.contactUpdateInterval = 5 iads.samSetupTime = 60 - iads.destroyedUnitResponsibleForUpdateAutonomousStateOfSAMSite = nil - iads.debugOutput = {} - iads.debugOutput.IADSStatus = false - iads.debugOutput.samWentDark = false - iads.debugOutput.contacts = false - iads.debugOutput.radarWentLive = false - iads.debugOutput.ewRadarNoConnection = false - iads.debugOutput.samNoConnection = false - iads.debugOutput.jammerProbability = false - iads.debugOutput.addedEWRadar = false - iads.debugOutput.hasNoPower = false - iads.debugOutput.addedSAMSite = false - iads.debugOutput.warnings = true - iads.debugOutput.harmDefence = false - iads.debugOutput.samSiteStatusEnvOutput = false - iads.debugOutput.earlyWarningRadarStatusEnvOutput = false return iads end @@ -474,7 +974,7 @@ function SkynetIADS:setCoalition(item) self.coalitionID = coalitionID end if self.coalitionID ~= coalitionID then - self:printOutput("element: "..item:getName().." has a different coalition than the IADS", true) + self:printOutputToLog("element: "..item:getName().." has a different coalition than the IADS", true) end end end @@ -539,7 +1039,7 @@ end function SkynetIADS:addEarlyWarningRadar(earlyWarningRadarUnitName) local earlyWarningRadarUnit = Unit.getByName(earlyWarningRadarUnitName) if earlyWarningRadarUnit == nil then - self:printOutput("you have added an EW Radar that does not exist, check name of Unit in Setup and Mission editor: "..earlyWarningRadarUnitName, true) + self:printOutputToLog("you have added an EW Radar that does not exist, check name of Unit in Setup and Mission editor: "..earlyWarningRadarUnitName, true) return end self:setCoalition(earlyWarningRadarUnit) @@ -561,7 +1061,7 @@ function SkynetIADS:addEarlyWarningRadar(earlyWarningRadarUnitName) ewRadar:goLive() table.insert(self.earlyWarningRadars, ewRadar) if self:getDebugSettings().addedEWRadar then - self:printOutput(ewRadar:getDescription().." added to IADS") + self:printOutputToLog("ADDED: "..ewRadar:getDescription()) end return ewRadar end @@ -619,7 +1119,7 @@ end function SkynetIADS:addSAMSite(samSiteName) local samSiteDCS = Group.getByName(samSiteName) if samSiteDCS == nil then - self:printOutput("you have added an SAM Site that does not exist, check name of Group in Setup and Mission editor: "..tostring(samSiteName), true) + self:printOutputToLog("you have added an SAM Site that does not exist, check name of Group in Setup and Mission editor: "..tostring(samSiteName), true) return end self:setCoalition(samSiteDCS) @@ -632,13 +1132,13 @@ function SkynetIADS:addSAMSite(samSiteName) end samSite:setCachedTargetsMaxAge(self:getCachedTargetsMaxAge()) if samSite:getNatoName() == "UNKNOWN" then - self:printOutput("you have added an SAM Site that Skynet IADS can not handle: "..samSite:getDCSName(), true) + self:printOutputToLog("you have added an SAM site that Skynet IADS can not handle: "..samSite:getDCSName(), true) samSite:cleanUp() else samSite:goDark() table.insert(self.samSites, samSite) if self:getDebugSettings().addedSAMSite then - self:printOutput(samSite:getDescription().." added to IADS") + self:printOutputToLog("ADDED: "..samSite:getDescription()) end return samSite end @@ -788,7 +1288,7 @@ function SkynetIADS.evaluateContacts(self) samSite:targetCycleUpdateEnd() end - self:printSystemStatus() + self.logger:printSystemStatus() end function SkynetIADS:cleanAgedTargets() @@ -875,6 +1375,13 @@ function SkynetIADS:buildRadarCoverage() end self:addRadarsToCommandCenters() + + --we call this once on all sam sites, to make sure autonomous sites go live when IADS activates + for i = 1, #samSites do + local samSite = samSites[i] + samSite:informChildrenOfStateChange() + end + end function SkynetIADS:buildRadarCoverageForAbstractRadarElement(abstractRadarElement) @@ -887,12 +1394,12 @@ function SkynetIADS:buildRadarCoverageForAbstractRadarElement(abstractRadarEleme if getmetatable(aElementToCompare) == SkynetIADSSamSite and getmetatable(abstractRadarElement) == SkynetIADSSamSite then abstractRadarElement:addChildRadar(aElementToCompare) end - if getmetatable(aElementToCompare) == SkynetIADSSamSite and getmetatable(abstractRadarElement) == SkynetIADSEWRadar then + if getmetatable(aElementToCompare) == SkynetIADSSamSite and getmetatable(abstractRadarElement) == SkynetIADSEWRadar or getmetatable(aElementToCompare) == SkynetIADSSamSite and getmetatable(abstractRadarElement) == SkynetIADSAWACSRadar then abstractRadarElement:addChildRadar(aElementToCompare) end --EW Radars should not have parent Radars - if getmetatable(aElementToCompare) ~= SkynetIADSEWRadar then + if getmetatable(aElementToCompare) ~= SkynetIADSEWRadar and getmetatable(aElementToCompare) ~= SkynetIADSAWACSRadar then aElementToCompare:addParentRadar(abstractRadarElement) end end @@ -930,17 +1437,16 @@ function SkynetIADS:getContacts() return self.contacts end -function SkynetIADS:printOutput(output, typeWarning) - if typeWarning == true and self.debugOutput.warnings or typeWarning == nil then - if typeWarning == true then - output = "WARNING: "..output - end - trigger.action.outText(output, 4) - end +function SkynetIADS:getDebugSettings() + return self.logger.debugOutput end -function SkynetIADS:getDebugSettings() - return self.debugOutput +function SkynetIADS:printOutput(output, typeWarning) + self.logger:printOutput(output, typeWarning) +end + +function SkynetIADS:printOutputToLog(output) + self.logger:printOutputToLog(output) end -- will start going through the Early Warning Radars and SAM sites to check what targets they have detected @@ -1031,7 +1537,7 @@ function SkynetIADS:getCoalitionString() end if self.name then - coalitionStr = coalitionStr.." "..self.name + coalitionStr = "COALITION: "..coalitionStr.." | NAME: "..self.name end return coalitionStr @@ -1048,261 +1554,6 @@ function SkynetIADS:addMooseSetGroup(mooseSetGroup) self:getMooseConnector():addMooseSetGroup(mooseSetGroup) end -function SkynetIADS:printDetailedEarlyWarningRadarStatus() - local ewRadars = self:getEarlyWarningRadars() - env.info("------------------------------------------ EW RADAR STATUS: "..self:getCoalitionString().." -------------------------------") - for i = 1, #ewRadars do - local ewRadar = ewRadars[i] - local numConnectionNodes = #ewRadar:getConnectionNodes() - local numPowerSources = #ewRadar:getPowerSources() - local isActive = ewRadar:isActive() - local connectionNodes = ewRadar:getConnectionNodes() - local firstRadar = nil - local radars = ewRadar:getRadars() - - --get the first existing radar to prevent issues in calculating the distance later on: - for i = 1, #radars do - if radars[i]:isExist() then - firstRadar = radars[i] - break - end - - end - local numDamagedConnectionNodes = 0 - - - for j = 1, #connectionNodes do - local connectionNode = connectionNodes[j] - if connectionNode:isExist() == false then - numDamagedConnectionNodes = numDamagedConnectionNodes + 1 - end - end - local intactConnectionNodes = numConnectionNodes - numDamagedConnectionNodes - - local powerSources = ewRadar:getPowerSources() - local numDamagedPowerSources = 0 - for j = 1, #powerSources do - local powerSource = powerSources[j] - if powerSource:isExist() == false then - numDamagedPowerSources = numDamagedPowerSources + 1 - end - end - local intactPowerSources = numPowerSources - numDamagedPowerSources - - local detectedTargets = ewRadar:getDetectedTargets() - local samSitesInCoveredArea = ewRadar:getChildRadars() - - local unitName = "DESTROYED" - - if ewRadar:getDCSRepresentation():isExist() then - unitName = ewRadar:getDCSName() - end - - env.info("UNIT: "..unitName.." | TYPE: "..ewRadar:getNatoName()) - env.info("ACTIVE: "..tostring(isActive).."| DETECTED TARGETS: "..#detectedTargets.." | DEFENDING HARM: "..tostring(ewRadar:isDefendingHARM())) - if numConnectionNodes > 0 then - env.info("CONNECTION NODES: "..numConnectionNodes.." | DAMAGED: "..numDamagedConnectionNodes.." | INTACT: "..intactConnectionNodes) - else - env.info("NO CONNECTION NODES SET") - end - if numPowerSources > 0 then - env.info("POWER SOURCES : "..numPowerSources.." | DAMAGED:"..numDamagedPowerSources.." | INTACT: "..intactPowerSources) - else - env.info("NO POWER SOURCES SET") - end - - env.info("SAM SITES IN COVERED AREA: "..#samSitesInCoveredArea) - for j = 1, #samSitesInCoveredArea do - local samSiteCovered = samSitesInCoveredArea[j] - env.info(samSiteCovered:getDCSName()) - end - - for j = 1, #detectedTargets do - local contact = detectedTargets[j] - if firstRadar ~= nil and firstRadar:isExist() then - local distance = mist.utils.round(mist.utils.metersToNM(ewRadar:getDistanceInMetersToContact(firstRadar:getDCSRepresentation(), contact:getPosition().p)), 2) - env.info("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | DISTANCE NM: "..distance) - end - end - - env.info("---------------------------------------------------") - - end - -end - -function SkynetIADS:printDetailedSAMSiteStatus() - local samSites = self:getSAMSites() - - env.info("------------------------------------------ SAM STATUS: "..self:getCoalitionString().." -------------------------------") - for i = 1, #samSites do - local samSite = samSites[i] - local numConnectionNodes = #samSite:getConnectionNodes() - local numPowerSources = #samSite:getPowerSources() - local isAutonomous = samSite:getAutonomousState() - local isActive = samSite:isActive() - - local connectionNodes = samSite:getConnectionNodes() - local firstRadar = samSite:getRadars()[1] - local numDamagedConnectionNodes = 0 - for j = 1, #connectionNodes do - local connectionNode = connectionNodes[j] - if connectionNode:isExist() == false then - numDamagedConnectionNodes = numDamagedConnectionNodes + 1 - end - end - local intactConnectionNodes = numConnectionNodes - numDamagedConnectionNodes - - local powerSources = samSite:getPowerSources() - local numDamagedPowerSources = 0 - for j = 1, #powerSources do - local powerSource = powerSources[j] - if powerSource:isExist() == false then - numDamagedPowerSources = numDamagedPowerSources + 1 - end - end - local intactPowerSources = numPowerSources - numDamagedPowerSources - - local detectedTargets = samSite:getDetectedTargets() - - local samSitesInCoveredArea = samSite:getChildRadars() - - env.info("GROUP: "..samSite:getDCSName().." | TYPE: "..samSite:getNatoName()) - env.info("ACTIVE: "..tostring(isActive).." | AUTONOMOUS: "..tostring(isAutonomous).." | IS ACTING AS EW: "..tostring(samSite:getActAsEW()).." | DETECTED TARGETS: "..#detectedTargets.." | DEFENDING HARM: "..tostring(samSite:isDefendingHARM()).." | MISSILES IN FLIGHT:"..tostring(samSite:getNumberOfMissilesInFlight())) - - if numConnectionNodes > 0 then - env.info("CONNECTION NODES: "..numConnectionNodes.." | DAMAGED: "..numDamagedConnectionNodes.." | INTACT: "..intactConnectionNodes) - else - env.info("NO CONNECTION NODES SET") - end - if numPowerSources > 0 then - env.info("POWER SOURCES : "..numPowerSources.." | DAMAGED:"..numDamagedPowerSources.." | INTACT: "..intactPowerSources) - else - env.info("NO POWER SOURCES SET") - end - - env.info("SAM SITES IN COVERED AREA: "..#samSitesInCoveredArea) - for j = 1, #samSitesInCoveredArea do - local samSiteCovered = samSitesInCoveredArea[j] - env.info(samSiteCovered:getDCSName()) - end - - for j = 1, #detectedTargets do - local contact = detectedTargets[j] - if firstRadar ~= nil and firstRadar:isExist() then - local distance = mist.utils.round(mist.utils.metersToNM(samSite:getDistanceInMetersToContact(firstRadar:getDCSRepresentation(), contact:getPosition().p)), 2) - env.info("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | DISTANCE NM: "..distance) - end - end - - env.info("---------------------------------------------------") - end -end - -function SkynetIADS:printSystemStatus() - - if self:getDebugSettings().IADSStatus or self:getDebugSettings().contacts then - local coalitionStr = self:getCoalitionString() - self:printOutput("---- IADS: "..coalitionStr.." ------") - end - - if self:getDebugSettings().IADSStatus then - - local numComCenters = #self:getCommandCenters() - local numDestroyedComCenters = 0 - local numComCentersNoPower = 0 - local numComCentersNoConnectionNode = 0 - local numIntactComCenters = 0 - for i = 1, #self.commandCenters do - local commandCenter = self.commandCenters[i] - if commandCenter:hasWorkingPowerSource() == false then - numComCentersNoPower = numComCentersNoPower + 1 - end - if commandCenter:hasActiveConnectionNode() == false then - numComCentersNoConnectionNode = numComCentersNoConnectionNode + 1 - end - if commandCenter:isDestroyed() == false then - numIntactComCenters = numIntactComCenters + 1 - end - end - - numDestroyedComCenters = numComCenters - numIntactComCenters - - - self:printOutput("COMMAND CENTERS: "..numComCenters.." | Destroyed: "..numDestroyedComCenters.." | NoPowr: "..numComCentersNoPower.." | NoCon: "..numComCentersNoConnectionNode) - - local ewNoPower = 0 - local ewTotal = #self:getEarlyWarningRadars() - local ewNoConnectionNode = 0 - local ewActive = 0 - local ewRadarsInactive = 0 - - for i = 1, #self.earlyWarningRadars do - local ewRadar = self.earlyWarningRadars[i] - if ewRadar:hasWorkingPowerSource() == false then - ewNoPower = ewNoPower + 1 - end - if ewRadar:hasActiveConnectionNode() == false then - ewNoConnectionNode = ewNoConnectionNode + 1 - end - if ewRadar:isActive() then - ewActive = ewActive + 1 - end - end - - ewRadarsInactive = ewTotal - ewActive - local numEWRadarsDestroyed = #self:getDestroyedEarlyWarningRadars() - self:printOutput("EW: "..ewTotal.." | On: "..ewActive.." | Off: "..ewRadarsInactive.." | Destroyed: "..numEWRadarsDestroyed.." | NoPowr: "..ewNoPower.." | NoCon: "..ewNoConnectionNode) - - local samSitesInactive = 0 - local samSitesActive = 0 - local samSitesTotal = #self:getSAMSites() - local samSitesNoPower = 0 - local samSitesNoConnectionNode = 0 - local samSitesOutOfAmmo = 0 - local samSiteAutonomous = 0 - local samSiteRadarDestroyed = 0 - for i = 1, #self.samSites do - local samSite = self.samSites[i] - if samSite:hasWorkingPowerSource() == false then - samSitesNoPower = samSitesNoPower + 1 - end - if samSite:hasActiveConnectionNode() == false then - samSitesNoConnectionNode = samSitesNoConnectionNode + 1 - end - if samSite:isActive() then - samSitesActive = samSitesActive + 1 - end - if samSite:hasRemainingAmmo() == false then - samSitesOutOfAmmo = samSitesOutOfAmmo + 1 - end - if samSite:getAutonomousState() == true then - samSiteAutonomous = samSiteAutonomous + 1 - end - if samSite:hasWorkingRadar() == false then - samSiteRadarDestroyed = samSiteRadarDestroyed + 1 - end - end - - samSitesInactive = samSitesTotal - samSitesActive - self:printOutput("SAM: "..samSitesTotal.." | On: "..samSitesActive.." | Off: "..samSitesInactive.." | Autonm: "..samSiteAutonomous.." | Raddest: "..samSiteRadarDestroyed.." | NoPowr: "..samSitesNoPower.." | NoCon: "..samSitesNoConnectionNode.." | NoAmmo: "..samSitesOutOfAmmo) - end - if self:getDebugSettings().contacts then - for i = 1, #self.contacts do - local contact = self.contacts[i] - self:printOutput("CONTACT: "..contact:getName().." | TYPE: "..contact:getTypeName().." | GS: "..tostring(contact:getGroundSpeedInKnots()).." | LAST SEEN: "..contact:getAge()) - end - end - - if self:getDebugSettings().earlyWarningRadarStatusEnvOutput then - self:printDetailedEarlyWarningRadarStatus() - end - - if self:getDebugSettings().samSiteStatusEnvOutput then - self:printDetailedSAMSiteStatus() - end -end - end do @@ -1537,7 +1788,7 @@ function SkynetIADSAbstractElement:getNatoName() end function SkynetIADSAbstractElement:getDescription() - return "IADS ELEMENT: "..self:getDCSName().." | Type : "..tostring(self:getNatoName()) + return "IADS ELEMENT: "..self:getDCSName().." | Type: "..tostring(self:getNatoName()) end function SkynetIADSAbstractElement:onEvent(event) @@ -1958,7 +2209,9 @@ function SkynetIADSAbstractRadarElement:getHARMDetectionChance() end function SkynetIADSAbstractRadarElement:setHARMDetectionChance(chance) - self.harmDetectionChance = chance + if chance and chance >= 0 and chance <= 100 then + self.harmDetectionChance = chance + end return self end @@ -1986,40 +2239,44 @@ function SkynetIADSAbstractRadarElement:setupElements() end end - local numElementsCreated = #self.searchRadars + #self.trackingRadars + #self.launchers --this check ensures a unit or group has all required elements for the specific sam or ew type: if (hasLauncher and hasSearchRadar and hasTrackingRadar and #self.launchers > 0 and #self.searchRadars > 0 and #self.trackingRadars > 0 ) - or (hasSearchRadar and hasLauncher and #self.searchRadars > 0 and #self.launchers > 0) - or (hasSearchRadar and hasLauncher == false and hasTrackingRadar == false and #self.searchRadars > 0 and numUnits == 1) then + or (hasSearchRadar and hasLauncher and #self.searchRadars > 0 and #self.launchers > 0) then local harmDetection = dataType['harm_detection_chance'] - if harmDetection then - self.harmDetectionChance = harmDetection - end + self:setHARMDetectionChance(harmDetection) local natoName = dataType['name']['NATO'] - --we shorten the SA-XX names and don't return their code names eg goa, gainful.. - local pos = natoName:find(" ") - local prefix = natoName:sub(1, 2) - if string.lower(prefix) == 'sa' and pos ~= nil then - self.natoName = natoName:sub(1, (pos-1)) - else - self.natoName = natoName - end + self:buildNatoName(natoName) break end end end +function SkynetIADSAbstractRadarElement:buildNatoName(natoName) + --we shorten the SA-XX names and don't return their code names eg goa, gainful.. + local pos = natoName:find(" ") + local prefix = natoName:sub(1, 2) + if string.lower(prefix) == 'sa' and pos ~= nil then + self.natoName = natoName:sub(1, (pos-1)) + else + self.natoName = natoName + end +end + function SkynetIADSAbstractRadarElement:analyseAndAddUnit(class, tableToAdd, unitData) local units = self:getUnitsToAnalyse() for i = 1, #units do local unit = units[i] - local unitTypeName = unit:getTypeName() - for unitName, unitPerformanceData in pairs(unitData) do - if unitName == unitTypeName then - samElement = class:create(unit) - samElement:setupRangeData() - table.insert(tableToAdd, samElement) - end + self:buildSingleUnit(unit, class, tableToAdd, unitData) + end +end + +function SkynetIADSAbstractRadarElement:buildSingleUnit(unit, class, tableToAdd, unitData) + local unitTypeName = unit:getTypeName() + for unitName, unitPerformanceData in pairs(unitData) do + if unitName == unitTypeName then + samElement = class:create(unit) + samElement:setupRangeData() + table.insert(tableToAdd, samElement) end end end @@ -2102,7 +2359,7 @@ function SkynetIADSAbstractRadarElement:goLive() end self:pointDefencesStopActingAsEW() if self.iads:getDebugSettings().radarWentLive then - self.iads:printOutput(self:getDescription().." going live") + self.iads:printOutputToLog("GOING LIVE: "..self:getDescription()) end self:scanForHarms() end @@ -2138,8 +2395,8 @@ function SkynetIADSAbstractRadarElement:goDark() end self.aiState = false self:stopScanningForHARMs() - if self.iads:getDebugSettings().samWentDark then - self.iads:printOutput(self:getDescription().." going dark") + if self.iads:getDebugSettings().radarWentDark then + self.iads:printOutputToLog("GOING DARK: "..self:getDescription()) end end end @@ -2234,17 +2491,17 @@ function SkynetIADSAbstractRadarElement:jam(successProbability) local controller = self:getController() local probability = math.random(1, 100) if self.iads:getDebugSettings().jammerProbability then - self.iads:printOutput("JAMMER: "..self:getDescription()..": Probability: "..successProbability) + self.iads:printOutputToLog("JAMMER: "..self:getDescription()..": Probability: "..successProbability) end if successProbability > probability then controller:setOption(AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD) if self.iads:getDebugSettings().jammerProbability then - self.iads:printOutput("JAMMER: "..self:getDescription()..": jammed, setting to weapon hold") + self.iads:printOutputToLog("JAMMER: "..self:getDescription()..": jammed, setting to weapon hold") end else controller:setOption(AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE) if self.iads:getDebugSettings().jammerProbability then - self.iads:printOutput("Jammer: "..self:getDescription()..": jammed, setting to weapon free") + self.iads:printOutputToLog("JAMMER: "..self:getDescription()..": jammed, setting to weapon free") end end self.lastJammerUpdate = timer:getTime() @@ -2274,7 +2531,7 @@ function SkynetIADSAbstractRadarElement:goSilentToEvadeHARM(timeToImpact) --self.objectsIdentifiedAsHarms = {} local harmTime = self:getHarmShutDownTime() if self.iads:getDebugSettings().harmDefence then - self.iads:printOutput("HARM DEFENCE: "..self:getDCSName().." shutting down | FOR: "..harmTime.." seconds | TTI: "..timeToImpact) + self.iads:printOutputToLog("HARM DEFENCE SHUTTING DOWN: "..self:getDCSName().." | FOR: "..harmTime.." seconds | TTI: "..timeToImpact) end self.harmSilenceID = mist.scheduleFunction(SkynetIADSAbstractRadarElement.finishHarmDefence, {self}, timer.getTime() + harmTime, 1) self:goDark() @@ -2436,7 +2693,7 @@ function SkynetIADSAbstractRadarElement.evaluateIfTargetsContainHARMs(self) end if numDetections == 2 and shallReactToHarm == false then if self.iads:getDebugSettings().harmDefence then - self.iads:printOutput("HARM DEFENCE: "..self:getDCSName().." will not react") + self.iads:printOutputToLog("HARM DEFENCE NO REACTION: "..self:getDCSName()) end end end @@ -2510,7 +2767,7 @@ function SkynetIADSCommandCenter:create(commandCenter, iads) local instance = self:superClass():create(commandCenter, iads) setmetatable(instance, self) self.__index = self - instance.natoName = "Command Center" + instance.natoName = "COMMAND CENTER" return instance end @@ -2606,7 +2863,28 @@ function SkynetIADSEWRadar:create(radarUnit, iads) return instance end ---an Early Warning Radar has simplified check to detrmine if its autonomous or not +function SkynetIADSEWRadar:setupElements() + local unit = self:getDCSRepresentation() + local unitType = unit:getTypeName() + for typeName, dataType in pairs(SkynetIADS.database) do + for entry, unitData in pairs(dataType) do + if entry == 'searchRadar' then + self:buildSingleUnit(unit, SkynetIADSSAMSearchRadar, self.searchRadars, unitData) + if #self.searchRadars > 0 then + local harmDetection = dataType['harm_detection_chance'] + self:setHARMDetectionChance(harmDetection) + if unitData[unitType]['name'] then + local natoName = unitData[unitType]['name']['NATO'] + self:buildNatoName(natoName) + end + return + end + end + end + end +end + +--an Early Warning Radar has simplified check to determine if its autonomous or not function SkynetIADSEWRadar:setToCorrectAutonomousState() if self:hasActiveConnectionNode() and self:hasWorkingPowerSource() and self.iads:isCommandCenterUsable() then self:resetAutonomousState() @@ -2897,7 +3175,7 @@ function SkynetIADSSamSite:targetCycleUpdateStart() end function SkynetIADSSamSite:targetCycleUpdateEnd() - if self.targetsInRange == false and self.actAsEW == false then + if self.targetsInRange == false and self.actAsEW == false and self:getAutonomousState() == false and self:getAutonomousBehaviour() == SkynetIADSAbstractRadarElement.AUTONOMOUS_STATE_DCS_AI then self:goDark() end end diff --git a/resources/plugins/skynetiads/skynetiads-config.lua b/resources/plugins/skynetiads/skynetiads-config.lua index 8a384c96..fafa8104 100644 --- a/resources/plugins/skynetiads/skynetiads-config.lua +++ b/resources/plugins/skynetiads/skynetiads-config.lua @@ -12,108 +12,122 @@ env.info("DCSLiberation|Skynet-IADS plugin - configuration") if dcsLiberation and SkynetIADS then -- specific options - local createRedIADS = false - local createBlueIADS = false - local includeRedInRadio = false - local includeBlueInRadio = false - local debugRED = false - local debugBLUE = false - + local createRedIADS = false + local createBlueIADS = false + local includeRedInRadio = false + local includeBlueInRadio = false + local debugRED = false + local debugBLUE = false + -- retrieve specific options values if dcsLiberation.plugins then if dcsLiberation.plugins.skynetiads then - createRedIADS = dcsLiberation.plugins.skynetiads.createRedIADS - createBlueIADS = dcsLiberation.plugins.skynetiads.createBlueIADS - includeRedInRadio = dcsLiberation.plugins.skynetiads.includeRedInRadio - includeBlueInRadio = dcsLiberation.plugins.skynetiads.includeBlueInRadio - debugRED = dcsLiberation.plugins.skynetiads.debugRED - debugBLUE = dcsLiberation.plugins.skynetiads.debugBLUE - end + createRedIADS = dcsLiberation.plugins.skynetiads.createRedIADS + createBlueIADS = dcsLiberation.plugins.skynetiads.createBlueIADS + includeRedInRadio = dcsLiberation.plugins.skynetiads.includeRedInRadio + includeBlueInRadio = dcsLiberation.plugins.skynetiads.includeBlueInRadio + debugRED = dcsLiberation.plugins.skynetiads.debugRED + debugBLUE = dcsLiberation.plugins.skynetiads.debugBLUE + end end - - env.info(string.format("DCSLiberation|Skynet-IADS plugin - createRedIADS=%s",tostring(createRedIADS))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - createBlueIADS=%s",tostring(createBlueIADS))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeRedInRadio=%s",tostring(includeRedInRadio))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeBlueInRadio=%s",tostring(includeBlueInRadio))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugRED=%s",tostring(debugRED))) - env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugBLUE=%s",tostring(debugBLUE))) - -- actual configuration code + env.info(string.format("DCSLiberation|Skynet-IADS plugin - createRedIADS=%s",tostring(createRedIADS))) + env.info(string.format("DCSLiberation|Skynet-IADS plugin - createBlueIADS=%s",tostring(createBlueIADS))) + env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeRedInRadio=%s",tostring(includeRedInRadio))) + env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeBlueInRadio=%s",tostring(includeBlueInRadio))) + env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugRED=%s",tostring(debugRED))) + env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugBLUE=%s",tostring(debugBLUE))) - local function initializeIADS(iads, coalition, inRadio, debug) + -- actual configuration code - local coalitionPrefix = "BLUE" - if coalition == 1 then - coalitionPrefix = "RED" - end + local function initializeIADS(iads, coalition, inRadio, debug) - if debug then - env.info("adding debug information") - local iadsDebug = iads:getDebugSettings() - iadsDebug.IADSStatus = true - iadsDebug.samWentDark = true - iadsDebug.contacts = true - iadsDebug.radarWentLive = true - iadsDebug.noWorkingCommmandCenter = true - iadsDebug.ewRadarNoConnection = true - iadsDebug.samNoConnection = true - iadsDebug.jammerProbability = true - iadsDebug.addedEWRadar = true - iadsDebug.hasNoPower = true - iadsDebug.harmDefence = true - iadsDebug.samSiteStatusEnvOutput = true - iadsDebug.earlyWarningRadarStatusEnvOutput = true - end + local coalitionPrefix = "BLUE" + if coalition == 1 then + coalitionPrefix = "RED" + end - --add EW units to the IADS: - iads:addEarlyWarningRadarsByPrefix(coalitionPrefix .. "|EWR|") + if debug then + env.info("adding debug information") + local iadsDebug = iads:getDebugSettings() + iadsDebug.IADSStatus = true + iadsDebug.samWentDark = true + iadsDebug.contacts = true + iadsDebug.radarWentLive = true + iadsDebug.noWorkingCommmandCenter = true + iadsDebug.ewRadarNoConnection = true + iadsDebug.samNoConnection = true + iadsDebug.jammerProbability = true + iadsDebug.addedEWRadar = true + iadsDebug.hasNoPower = true + iadsDebug.harmDefence = true + iadsDebug.samSiteStatusEnvOutput = true + iadsDebug.earlyWarningRadarStatusEnvOutput = true + end - --add SAM groups to the IADS: - iads:addSAMSitesByPrefix(coalitionPrefix .. "|SAM|") + --add EW units to the IADS: + iads:addEarlyWarningRadarsByPrefix(coalitionPrefix .. "|EWR|") - -- add the AWACS - if dcsLiberation.AWACs then - for _, data in pairs(dcsLiberation.AWACs) do - env.info(string.format("DCSLiberation|Skynet-IADS plugin - processing AWACS %s", data.dcsGroupName)) - local group = Group.getByName(data.dcsGroupName) - if group then - if group:getCoalition() == coalition then - local unit = group:getUnit(1) - if unit then - local unitName = unit:getName() - env.info(string.format("DCSLiberation|Skynet-IADS plugin - adding AWACS %s", unitName)) - iads:addEarlyWarningRadar(unitName) - end - end - end - end - end + --add SAM groups to the IADS: + iads:addSAMSitesByPrefix(coalitionPrefix .. "|SAM|") - -- TODO: Add ships. + -- add the AWACS + if dcsLiberation.AWACs then + for _, data in pairs(dcsLiberation.AWACs) do + env.info(string.format("DCSLiberation|Skynet-IADS plugin - processing AWACS %s", data.dcsGroupName)) + local group = Group.getByName(data.dcsGroupName) + if group then + if group:getCoalition() == coalition then + local unit = group:getUnit(1) + if unit then + local unitName = unit:getName() + env.info(string.format("DCSLiberation|Skynet-IADS plugin - adding AWACS %s", unitName)) + iads:addEarlyWarningRadar(unitName) + end + end + end + end + end - if inRadio then - --activate the radio menu to toggle IADS Status output - env.info("DCSLiberation|Skynet-IADS plugin - adding in radio menu") - iads:addRadioMenu() - end + local sites = iads:getSAMSites() + for i = 1, #sites do + local site = sites[i] + local name = site:getDCSName() + if not string.match(name, "|PD") then + env.info(string.format("DCSLiberation|Skynet-IADS plugin - Checking %s for PD", name)) + local pds = iads:getSAMSitesByPrefix(name .. "|PD") + for j = 1, #pds do + pd = pds[j] + env.info(string.format("DCSLiberation|Skynet-IADS plugin - Adding %s as PD for %s", pd:getDCSName(), name)) + site:addPointDefence(pd) + site:setIgnoreHARMSWhilePointDefencesHaveAmmo(true) + end + end + end - --activate the IADS - iads:setupSAMSitesAndThenActivate() - end + if inRadio then + --activate the radio menu to toggle IADS Status output + env.info("DCSLiberation|Skynet-IADS plugin - adding in radio menu") + iads:addRadioMenu() + end - ------------------------------------------------------------------------------------------------------------------------------------------------------------ - -- create the IADS networks - ------------------------------------------------------------------------------------------------------------------------------------------------------------- - if createRedIADS then - env.info("DCSLiberation|Skynet-IADS plugin - creating red IADS") - redIADS = SkynetIADS:create("IADS") - initializeIADS(redIADS, 1, includeRedInRadio, debugRED) -- RED - end + --activate the IADS + iads:setupSAMSitesAndThenActivate() + end + + ------------------------------------------------------------------------------------------------------------------------------------------------------------ + -- create the IADS networks + ------------------------------------------------------------------------------------------------------------------------------------------------------------- + if createRedIADS then + env.info("DCSLiberation|Skynet-IADS plugin - creating red IADS") + redIADS = SkynetIADS:create("IADS") + initializeIADS(redIADS, 1, includeRedInRadio, debugRED) -- RED + end + + if createBlueIADS then + env.info("DCSLiberation|Skynet-IADS plugin - creating blue IADS") + blueIADS = SkynetIADS:create("IADS") + initializeIADS(blueIADS, 2, includeBlueInRadio, debugBLUE) -- BLUE + end - if createBlueIADS then - env.info("DCSLiberation|Skynet-IADS plugin - creating blue IADS") - blueIADS = SkynetIADS:create("IADS") - initializeIADS(blueIADS, 2, includeBlueInRadio, debugBLUE) -- BLUE - end - end \ No newline at end of file diff --git a/resources/stylesheets/style-dcs.css b/resources/stylesheets/style-dcs.css index f8539e83..ae829133 100644 --- a/resources/stylesheets/style-dcs.css +++ b/resources/stylesheets/style-dcs.css @@ -179,6 +179,21 @@ QPushButton[style="btn-sell"]:hover{ background:#D84545; } +/* Info button */ +QPushButton[style="btn-info"]{ + background-color:#329E9E; + color: white; + border-radius:2px; + font-weight:bold; + text-transform:lowercase; + margin: 0px; + padding: 2px; +} + +QPushButton[style="btn-info"]:hover{ + background:#45D8D8; +} + QPushButton[style="btn-danger"]{ @@ -300,6 +315,18 @@ QLabel[style="SEAD"]{ padding:2px 6px; } +QLabel[style="info-element"]{ + border: 1px solid #435466; + color:white; + padding:2px 6px; +} + +QTextBrowser[style="info-desc"]{ + border: 1px solid #435466; + color:white; + padding:2px 6px; +} + /*QGroupBox these are the sections that look like fieldsets*/ QGroupBox { margin-top: 1ex; /* leave space at the top for the title */ diff --git a/resources/syrialandmap.p b/resources/syrialandmap.p index 1b5cc168..f39fb3bb 100644 Binary files a/resources/syrialandmap.p and b/resources/syrialandmap.p differ diff --git a/resources/tools/generate_landmap.py b/resources/tools/generate_landmap.py index 1812ac4b..a23c7fd1 100644 --- a/resources/tools/generate_landmap.py +++ b/resources/tools/generate_landmap.py @@ -1,7 +1,36 @@ import pickle +from functools import singledispatch from dcs.mission import Mission -from shapely import geometry +from shapely.geometry import GeometryCollection, MultiPolygon, Polygon +from shapely.ops import unary_union + +from game.theater.landmap import Landmap + + +@singledispatch +def to_multipoly(obj) -> MultiPolygon: + raise NotImplementedError( + f"to_multipoly not implemented for {obj.__class__.__name__}") + + +@to_multipoly.register +def _poly_to_multipoly(obj: Polygon) -> MultiPolygon: + return MultiPolygon([obj]) + + +@to_multipoly.register +def _multipoly_to_multipoly(obj: MultiPolygon) -> MultiPolygon: + return obj + + +@to_multipoly.register +def _geometry_collection_to_multipoly(obj: GeometryCollection) -> MultiPolygon: + if obj.is_empty: + return MultiPolygon() + raise RuntimeError( + f"Not sure how to convert collection to multipoly: {obj.wkt}") + for terrain in ["cau", "nev", "syria", "channel", "normandy", "gulf"]: print("Terrain " + terrain) @@ -16,17 +45,22 @@ for terrain in ["cau", "nev", "syria", "channel", "normandy", "gulf"]: if terrain == "cau" and inclusion_zones: # legacy - exclusion_zones.append(geometry.Polygon(zone)) + exclusion_zones.append(Polygon(zone)) else: + poly = Polygon(zone) + if not poly.is_valid: + raise RuntimeError(f"{plane_group} is invalid") if plane_group.units[0].type == "F-15C": - exclusion_zones.append(geometry.Polygon(zone)) + exclusion_zones.append(poly) else: - inclusion_zones.append(geometry.Polygon(zone)) + inclusion_zones.append(poly) for ship_group in m.country("USA").ship_group: zone = [(x.position.x, x.position.y) for x in ship_group.points] - seas_zones.append(geometry.Polygon(zone)) + seas_zones.append(Polygon(zone)) with open("../{}landmap.p".format(terrain), "wb") as f: print(len(inclusion_zones), len(exclusion_zones), len(seas_zones)) - pickle.dump((inclusion_zones, exclusion_zones, seas_zones), f) + pickle.dump(Landmap(to_multipoly(unary_union(inclusion_zones)), + to_multipoly(unary_union(exclusion_zones)), + to_multipoly(unary_union(seas_zones))), f) diff --git a/resources/tools/groundobject_templates.miz b/resources/tools/groundobject_templates.miz index b4fe1437..da8d133c 100644 Binary files a/resources/tools/groundobject_templates.miz and b/resources/tools/groundobject_templates.miz differ diff --git a/resources/ui/ground_assets/nothreat.png b/resources/ui/ground_assets/nothreat.png new file mode 100644 index 00000000..175fa290 Binary files /dev/null and b/resources/ui/ground_assets/nothreat.png differ diff --git a/resources/ui/ground_assets/nothreat_blue.png b/resources/ui/ground_assets/nothreat_blue.png new file mode 100644 index 00000000..46f2532a Binary files /dev/null and b/resources/ui/ground_assets/nothreat_blue.png differ diff --git a/resources/ui/templates/campaign_performance_template_EN.j2 b/resources/ui/templates/campaign_performance_template_EN.j2 new file mode 100644 index 00000000..637f9ca7 --- /dev/null +++ b/resources/ui/templates/campaign_performance_template_EN.j2 @@ -0,0 +1,33 @@ +{% if performance == 0 %} ++This scenario is rather performance friendly. +
+{% elif performance == 1 %} ++This scenario requires a very good computer to run. +
+{% elif performance == 2 %} ++This scenario is not performance friendly. The usage of the culling settings is recommended for most users. +
+{% elif performance == 3 %} ++This theater is huge, and will generate very complex DCS missions with hundreds of units, pushing the limits of DCS engine. +An insanely powerful computer will be necessary to run it. +Usage of culling settings will probably be mandatory for decent FPS. +
+{%endif %} + ++Ce scénario est d'une taille limitée et pensé pour obtenir de bonnes performances en jeu. +
+{% elif performance == 1 %} ++Ce scénario nécessite une machine puissante. +
+{% elif performance == 2 %} ++Ce scénario n'est pas pensé pour la performance et requiert une machine très puissante. +L'usage des paramètres "culling" est recommandé pour la plupart des utilisateurs. +
+{% elif performance == 3 %} ++Ce scénario est gigantesque, et générera des missions DCS d'une grande compléxité contenant des centaines/milliers d'unités. +Une machine extrêmement puissante est nécessaire, et l'utilisation des paramètres de "culling" sera obligatoire pour des performances décentes. +
+{%endif %} + +