diff --git a/game/db.py b/game/db.py index 1a6c6008..499ac936 100644 --- a/game/db.py +++ b/game/db.py @@ -1234,7 +1234,7 @@ def find_unittype(for_task: Task, country_name: str) -> List[Type[UnitType]]: return [x for x in UNIT_BY_TASK[for_task] if x in FACTIONS[country_name].units] -def find_infantry(country_name: str) -> List[UnitType]: +def find_infantry(country_name: str, allow_manpad: bool = False) -> List[UnitType]: inf = [ Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, @@ -1253,6 +1253,10 @@ def find_infantry(country_name: str) -> List[UnitType]: Infantry.Infantry_M1_Garand, Infantry.Infantry_M1_Garand, Infantry.Infantry_M1_Garand, Infantry.Infantry_Soldier_Insurgents, Infantry.Infantry_Soldier_Insurgents, Infantry.Infantry_Soldier_Insurgents ] + if allow_manpad: + inf.append(AirDefence.SAM_SA_18_Igla_MANPADS) + inf.append(AirDefence.SAM_SA_18_Igla_S_MANPADS) + inf.append(AirDefence.Stinger_MANPADS) return [x for x in inf if x in FACTIONS[country_name].infantry_units] diff --git a/game/settings.py b/game/settings.py index 08c28c15..2359a88e 100644 --- a/game/settings.py +++ b/game/settings.py @@ -26,6 +26,7 @@ class Settings: multiplier: float = 1.0 generate_marks: bool = True sams: bool = True # Legacy parameter do not use + manpads: bool = True cold_start: bool = False # Legacy parameter do not use version: Optional[str] = None diff --git a/gen/armor.py b/gen/armor.py index 448ceb50..147576ba 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -179,7 +179,7 @@ class GroundConflictGenerator: else: faction = self.game.enemy_name - possible_infantry_units = db.find_infantry(faction) + possible_infantry_units = db.find_infantry(faction, allow_manpad=self.game.settings.manpads) if len(possible_infantry_units) == 0: return @@ -203,7 +203,6 @@ class GroundConflictGenerator: heading=forward_heading, move_formation=PointAction.OffRoad) - def plan_action_for_groups(self, stance, ally_groups, enemy_groups, forward_heading, from_cp, to_cp): if not self.game.settings.perf_moving_units: @@ -334,7 +333,6 @@ class GroundConflictGenerator: dcs_group.add_waypoint(retreat_point, PointAction.OnRoad) dcs_group.add_waypoint(reposition_point, PointAction.OffRoad) - def add_morale_trigger(self, dcs_group, forward_heading): """ This add a trigger to manage units fleeing whenever their group is hit hard, or being engaged by CAS @@ -371,7 +369,6 @@ class GroundConflictGenerator: self.mission.triggerrules.triggers.append(fallback) - def find_retreat_point(self, dcs_group, frontline_heading, distance=RETREAT_DISTANCE): """ Find a point to retreat to @@ -438,7 +435,6 @@ class GroundConflictGenerator: return potential_target.points[0].position return None - def get_artilery_group_distance_from_frontline(self, group): """ For artilery group, decide the distance from frontline with the range of the unit @@ -450,7 +446,6 @@ class GroundConflictGenerator: rg = DISTANCE_FROM_FRONTLINE[CombatGroupRole.TANK] + 100 return rg - def get_valid_position_for_group( self, conflict_position: Point, diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 1506187d..74b16332 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -151,6 +151,10 @@ class QSettingsWindow(QDialog): self.enemyCoalitionSkill.currentIndexChanged.connect(self.applySettings) self.enemyAASkill.currentIndexChanged.connect(self.applySettings) + self.manpads = QCheckBox() + self.manpads.setChecked(self.game.settings.manpads) + self.manpads.toggled.connect(self.applySettings) + self.difficultyLayout.addWidget(QLabel("Player coalition skill"), 0, 0) self.difficultyLayout.addWidget(self.playerCoalitionSkill, 0, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy skill"), 1, 0) @@ -158,19 +162,22 @@ class QSettingsWindow(QDialog): self.difficultyLayout.addWidget(QLabel("Enemy AA and vehicles skill"), 2, 0) self.difficultyLayout.addWidget(self.enemyAASkill, 2, 1, Qt.AlignRight) + self.difficultyLayout.addWidget(QLabel("Manpads"), 3, 0) + self.difficultyLayout.addWidget(self.manpads, 3, 1, Qt.AlignRight) + self.difficultyLabel = QComboBox() [self.difficultyLabel.addItem(t) for t in CONST.LABELS_OPTIONS] self.difficultyLabel.setCurrentIndex(CONST.LABELS_OPTIONS.index(self.game.settings.labels)) self.difficultyLabel.currentIndexChanged.connect(self.applySettings) - self.difficultyLayout.addWidget(QLabel("In Game Labels"), 3, 0) - self.difficultyLayout.addWidget(self.difficultyLabel, 3, 1, Qt.AlignRight) + self.difficultyLayout.addWidget(QLabel("In Game Labels"), 4, 0) + self.difficultyLayout.addWidget(self.difficultyLabel, 4, 1, Qt.AlignRight) self.noNightMission = QCheckBox() self.noNightMission.setChecked(self.game.settings.night_disabled) self.noNightMission.toggled.connect(self.applySettings) - self.difficultyLayout.addWidget(QLabel("No night missions"), 4, 0) - self.difficultyLayout.addWidget(self.noNightMission, 4, 1, Qt.AlignRight) + self.difficultyLayout.addWidget(QLabel("No night missions"), 5, 0) + self.difficultyLayout.addWidget(self.noNightMission, 5, 1, Qt.AlignRight) self.mapVisibiitySelection = QComboBox() self.mapVisibiitySelection.addItem("All", ForcedOptions.Views.All) @@ -189,14 +196,14 @@ class QSettingsWindow(QDialog): if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyMap: self.mapVisibiitySelection.setCurrentIndex(4) self.mapVisibiitySelection.currentIndexChanged.connect(self.applySettings) - self.difficultyLayout.addWidget(QLabel("Map visibility options"), 5, 0) - self.difficultyLayout.addWidget(self.mapVisibiitySelection, 5, 1, Qt.AlignRight) + self.difficultyLayout.addWidget(QLabel("Map visibility options"), 6, 0) + self.difficultyLayout.addWidget(self.mapVisibiitySelection, 6, 1, Qt.AlignRight) self.ext_views = QCheckBox() self.ext_views.setChecked(self.game.settings.external_views_allowed) self.ext_views.toggled.connect(self.applySettings) - self.difficultyLayout.addWidget(QLabel("Allow external views"), 6, 0) - self.difficultyLayout.addWidget(self.ext_views, 6, 1, Qt.AlignRight) + self.difficultyLayout.addWidget(QLabel("Allow external views"), 7, 0) + self.difficultyLayout.addWidget(self.ext_views, 7, 1, Qt.AlignRight) def initGeneratorLayout(self): @@ -353,6 +360,7 @@ class QSettingsWindow(QDialog): self.game.settings.player_skill = CONST.SKILL_OPTIONS[self.playerCoalitionSkill.currentIndex()] self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[self.enemyCoalitionSkill.currentIndex()] self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[self.enemyAASkill.currentIndex()] + self.game.settings.manpads = self.manpads.isChecked() self.game.settings.labels = CONST.LABELS_OPTIONS[self.difficultyLabel.currentIndex()] self.game.settings.night_disabled = self.noNightMission.isChecked() self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData() diff --git a/resources/factions/australia_2005.json b/resources/factions/australia_2005.json index d983055d..8e9109d2 100644 --- a/resources/factions/australia_2005.json +++ b/resources/factions/australia_2005.json @@ -29,7 +29,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "HawkGenerator", diff --git a/resources/factions/bluefor_modern.json b/resources/factions/bluefor_modern.json index aa733bf5..f422a6eb 100644 --- a/resources/factions/bluefor_modern.json +++ b/resources/factions/bluefor_modern.json @@ -54,7 +54,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/canada_2005.json b/resources/factions/canada_2005.json index 324007b0..9a170a6f 100644 --- a/resources/factions/canada_2005.json +++ b/resources/factions/canada_2005.json @@ -29,7 +29,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/china_2010.json b/resources/factions/china_2010.json index acc807dd..2fe1cb6f 100644 --- a/resources/factions/china_2010.json +++ b/resources/factions/china_2010.json @@ -35,7 +35,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "HQ7Generator", diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index 2b441852..2c553009 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -35,7 +35,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "RolandGenerator", diff --git a/resources/factions/france_2005_modded.json b/resources/factions/france_2005_modded.json index 4edc8e10..34e4511a 100644 --- a/resources/factions/france_2005_modded.json +++ b/resources/factions/france_2005_modded.json @@ -45,7 +45,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "RolandGenerator", diff --git a/resources/factions/georgia_2008.json b/resources/factions/georgia_2008.json index 3aec3b57..45b8cfc1 100644 --- a/resources/factions/georgia_2008.json +++ b/resources/factions/georgia_2008.json @@ -30,7 +30,8 @@ ], "infantry_units": [ "Paratrooper_AKS", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA3Generator", diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index 137437b6..bdf243e7 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -31,7 +31,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "GepardGenerator", diff --git a/resources/factions/india_2010.json b/resources/factions/india_2010.json index 9490e2a5..7b6cedb3 100644 --- a/resources/factions/india_2010.json +++ b/resources/factions/india_2010.json @@ -34,7 +34,8 @@ ], "infantry_units": [ "Infantry_M4", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA3Generator", diff --git a/resources/factions/insurgents.json b/resources/factions/insurgents.json index 1e21f6db..8634c534 100644 --- a/resources/factions/insurgents.json +++ b/resources/factions/insurgents.json @@ -21,7 +21,8 @@ ], "infantry_units": [ "Infantry_Soldier_Insurgents", - "Soldier_RPG" + "Soldier_RPG", + "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/insurgents_modded.json b/resources/factions/insurgents_modded.json index f9ae046c..296ee8b5 100644 --- a/resources/factions/insurgents_modded.json +++ b/resources/factions/insurgents_modded.json @@ -22,7 +22,8 @@ ], "infantry_units": [ "Infantry_Soldier_Insurgents", - "Soldier_RPG" + "Soldier_RPG", + "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/iran_2015.json b/resources/factions/iran_2015.json index a6c51cca..cb6ba5f2 100644 --- a/resources/factions/iran_2015.json +++ b/resources/factions/iran_2015.json @@ -40,7 +40,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Insurgents", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "HawkGenerator", diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 72c86dd9..c23c315e 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -34,7 +34,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/italy_1990.json b/resources/factions/italy_1990.json index 2a804488..62ac4ce5 100644 --- a/resources/factions/italy_1990.json +++ b/resources/factions/italy_1990.json @@ -28,7 +28,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/italy_1990_mb339.json b/resources/factions/italy_1990_mb339.json index e76b7f0a..186926f7 100644 --- a/resources/factions/italy_1990_mb339.json +++ b/resources/factions/italy_1990_mb339.json @@ -29,7 +29,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index 1b6df9aa..de03dbd8 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -27,7 +27,8 @@ ], "artillery_units": [ "SPH_M109_Paladin", - "MLRS_M270" + "MLRS_M270", + "Stinger_MANPADS" ], "logistics_units": [ "Transport_M818" diff --git a/resources/factions/libya_2011.json b/resources/factions/libya_2011.json index 0da7fb5a..8090ea3c 100644 --- a/resources/factions/libya_2011.json +++ b/resources/factions/libya_2011.json @@ -31,7 +31,8 @@ ], "infantry_units": [ "Infantry_Soldier_Insurgents", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ "HQ7Generator", diff --git a/resources/factions/netherlands_1990.json b/resources/factions/netherlands_1990.json index cc86b3d1..44fc54ed 100644 --- a/resources/factions/netherlands_1990.json +++ b/resources/factions/netherlands_1990.json @@ -26,7 +26,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/north_korea_2000.json b/resources/factions/north_korea_2000.json index bfdfd599..a790b576 100644 --- a/resources/factions/north_korea_2000.json +++ b/resources/factions/north_korea_2000.json @@ -38,7 +38,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA2Generator", diff --git a/resources/factions/pakistan_2015.json b/resources/factions/pakistan_2015.json index acf24440..43ba4bba 100644 --- a/resources/factions/pakistan_2015.json +++ b/resources/factions/pakistan_2015.json @@ -36,7 +36,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "Stinger_MANPADS" ], "air_defenses": [ "HQ7Generator", diff --git a/resources/factions/pmc_russian.json b/resources/factions/pmc_russian.json index 42e914df..844bdb3c 100644 --- a/resources/factions/pmc_russian.json +++ b/resources/factions/pmc_russian.json @@ -24,7 +24,8 @@ ], "infantry_units": [ "Paratrooper_AKS", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/pmc_us.json b/resources/factions/pmc_us.json index bfa0b96c..e75e193f 100644 --- a/resources/factions/pmc_us.json +++ b/resources/factions/pmc_us.json @@ -20,7 +20,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator" diff --git a/resources/factions/pmc_us_with_mb339.json b/resources/factions/pmc_us_with_mb339.json index a8a05395..ef01e093 100644 --- a/resources/factions/pmc_us_with_mb339.json +++ b/resources/factions/pmc_us_with_mb339.json @@ -21,7 +21,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator" diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index 912a5010..dd9048bd 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -42,7 +42,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA2Generator", diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index 1c7b86a4..cc2631df 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -46,7 +46,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ "SA8Generator", diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 3bb952d9..b1c45b8a 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -45,7 +45,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA8Generator", diff --git a/resources/factions/sweden_1990.json b/resources/factions/sweden_1990.json index 86acb4af..c5d78b6e 100644 --- a/resources/factions/sweden_1990.json +++ b/resources/factions/sweden_1990.json @@ -26,7 +26,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/syria_2011.json b/resources/factions/syria_2011.json index 1aa8f834..7c0c7850 100644 --- a/resources/factions/syria_2011.json +++ b/resources/factions/syria_2011.json @@ -46,7 +46,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "ColdWarFlakGenerator", diff --git a/resources/factions/turkey_2005.json b/resources/factions/turkey_2005.json index 9ee72b51..0a11e63a 100644 --- a/resources/factions/turkey_2005.json +++ b/resources/factions/turkey_2005.json @@ -32,7 +32,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Paratrooper_AKS" + "Paratrooper_AKS", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/uae_2005.json b/resources/factions/uae_2005.json index 3c1a42f4..bff684e0 100644 --- a/resources/factions/uae_2005.json +++ b/resources/factions/uae_2005.json @@ -28,7 +28,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "HawkGenerator", diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index 95ec74cc..b3db7880 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -32,7 +32,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/ukraine_2010.json b/resources/factions/ukraine_2010.json index b635da57..dac93cb8 100644 --- a/resources/factions/ukraine_2010.json +++ b/resources/factions/ukraine_2010.json @@ -36,7 +36,8 @@ "infantry_units": [ "Paratrooper_AKS", "Infantry_Soldier_Rus", - "Paratrooper_RPG_16" + "Paratrooper_RPG_16", + "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ "SA3Generator", diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index 8aa7f6c7..dfe64438 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -43,7 +43,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 753f6059..5ebe5d1c 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -43,7 +43,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index cbc94f2e..e4839515 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -44,7 +44,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index 525f2bf8..55bc56e5 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -31,7 +31,8 @@ ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Soldier_M249", + "Stinger_MANPADS" ], "air_defenses": [ "ChaparralGenerator",