diff --git a/dcs/coalition.py b/dcs/coalition.py index f5f541a3..f73854ed 100644 --- a/dcs/coalition.py +++ b/dcs/coalition.py @@ -90,7 +90,7 @@ def get_name(mission: "Mission", name: str) -> str: else: return name - def load_from_dict(self, mission, d) -> List[StatusMessage]: + def load_from_dict(self, mission, d, countries_in_coalition: Dict[int, int]) -> List[StatusMessage]: status: List[StatusMessage] = [] for country_idx in d["country"]: imp_country = d["country"][country_idx] @@ -257,6 +257,13 @@ def load_from_dict(self, mission, d) -> List[StatusMessage]: static_group.add_unit(static) _country.add_static_group(static_group) self.add_country(_country) + + # iterate over all .miz countries in coalition, even without any units + # on the map, and add them to the respective coalition + for country_id in countries_in_coalition.values(): + if self.country_by_id(country_id) is None: + self.add_country(countries.get_by_id(country_id)) + return status def set_bullseye(self, bulls): diff --git a/dcs/mission.py b/dcs/mission.py index da3832b6..0dd1341e 100644 --- a/dcs/mission.py +++ b/dcs/mission.py @@ -356,7 +356,8 @@ def loaddict(fname: str, mizfile: zipfile.ZipFile, reserved_files: List[str]) -> for col_name in ["blue", "red", "neutrals"]: if col_name in imp_mission["coalition"]: self.coalition[col_name] = Coalition(col_name, imp_mission["coalition"][col_name]["bullseye"]) - status += self.coalition[col_name].load_from_dict(self, imp_mission["coalition"][col_name]) + status += self.coalition[col_name].load_from_dict(self, imp_mission["coalition"][col_name], + imp_mission["coalitions"][col_name]) # triggers self.bypassed_triggers = None @@ -2087,7 +2088,7 @@ def dict(self): col_blue = list(col_blue) col_red = list(col_red) m["coalitions"] = { - "neutral": {x + 1: col_neutral[x] for x in range(0, len(col_neutral))}, + "neutrals": {x + 1: col_neutral[x] for x in range(0, len(col_neutral))}, "blue": {x + 1: col_blue[x] for x in range(0, len(col_blue))}, "red": {x + 1: col_red[x] for x in range(0, len(col_red))} } diff --git a/tests/missions/countries-without-units-on-the-map.miz b/tests/missions/countries-without-units-on-the-map.miz new file mode 100644 index 00000000..bac558fb Binary files /dev/null and b/tests/missions/countries-without-units-on-the-map.miz differ diff --git a/tests/test_mission.py b/tests/test_mission.py index 275eca4e..c97b376c 100644 --- a/tests/test_mission.py +++ b/tests/test_mission.py @@ -1245,6 +1245,33 @@ def test_action_a_out_picture_u(self) -> None: self.assertEqual(m_action, m2.triggerrules.triggers[0].actions[5]) + def test_empty_mission_with_coalitions(self) -> None: + m = dcs.mission.Mission() + m_filename = "tests/missions/countries-without-units-on-the-map.miz" + m.load_file(m_filename) + + m_blue_countries = m.coalition['blue'].countries + for country in ["Australia", "UK", "USA", "USSR"]: + self.assertIn(country, m_blue_countries) + self.assertEqual(len(m.coalition['blue'].countries["UK"].plane_group), 1) + + m_red_countries = m.coalition['red'].countries + for country in ["Third Reich", "Bulgaria", "Romania", "Finland"]: + self.assertIn(country, m_red_countries) + + m2_miz_filename = "missions/saved.countries-without-units-on-the-map.miz" + m.save(m2_miz_filename) + + m2 = dcs.mission.Mission() + m2.load_file(m2_miz_filename) + m2_blue_countries = m2.coalition['blue'].countries + m2_red_countries = m2.coalition['red'].countries + self.assertTrue(sorted(m_blue_countries.keys()), sorted(m2_blue_countries.keys())) + self.assertTrue(sorted(m_red_countries.keys()), sorted(m2_red_countries.keys())) + self.assertEqual(len(m.coalition['blue'].countries["UK"].plane_group), + len(m2.coalition['blue'].countries["UK"].plane_group)) + + def test_smoke_action_carpet_bombing(self) -> None: # this is fictional enum to simplify addressing as defined