MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / load

Method load

src/Ruleset/RuleRegion.cpp:53–117  ·  view source on GitHub ↗

* Loads the region type from a YAML file. * @param node YAML node. */

Source from the content-addressed store, hash-verified

51 * @param node YAML node.
52 */
53void RuleRegion::load(const YAML::Node &node)
54{
55 _type = node["type"].as<std::string>(_type);
56 _cost = node["cost"].as<int>(_cost);
57 std::vector< std::vector<double> > areas;
58 areas = node["areas"].as< std::vector< std::vector<double> > >(areas);
59 for (size_t i = 0; i != areas.size(); ++i)
60 {
61 _lonMin.push_back(areas[i][0] * M_PI / 180.0);
62 _lonMax.push_back(areas[i][1] * M_PI / 180.0);
63 _latMin.push_back(areas[i][2] * M_PI / 180.0);
64 _latMax.push_back(areas[i][3] * M_PI / 180.0);
65 }
66 _missionZones = node["missionZones"].as< std::vector<MissionZone> >(_missionZones);
67 if (const YAML::Node &cities = node["cities"])
68 {
69 for (YAML::const_iterator i = cities.begin(); i != cities.end(); ++i)
70 {
71 // if a city has been added, make sure that it has a zone 3 associated with it, if not, create one for it.
72 if (_missionZones.size() >= CITY_MISSION_ZONE)
73 {
74 MissionArea ma;
75 ma.lonMin = ma.lonMax = (*i)["lon"].as<double>(0.0);
76 ma.latMin = ma.latMax = (*i)["lat"].as<double>(0.0);
77 if (std::find(_missionZones.at(CITY_MISSION_ZONE).areas.begin(),
78 _missionZones.at(CITY_MISSION_ZONE).areas.end(),
79 ma) == _missionZones.at(CITY_MISSION_ZONE).areas.end())
80 {
81 _missionZones.at(CITY_MISSION_ZONE).areas.push_back(ma);
82 }
83 }
84
85 City *rule = new City("", 0.0, 0.0);
86 rule->load(*i);
87 _cities.push_back(rule);
88 }
89 // make sure all the zone 3s line up with cities in this region
90 // only applicable if there ARE cities in this region.
91 for (std::vector<MissionArea>::iterator i = _missionZones.at(CITY_MISSION_ZONE).areas.begin(); i != _missionZones.at(CITY_MISSION_ZONE).areas.end();)
92 {
93 bool matching = false;
94 for (std::vector<City*>::iterator j = _cities.begin(); j != _cities.end() && !matching; ++j)
95 {
96 matching = (AreSame((*j)->getLatitude(), ((*i).latMin * M_PI / 180.0)) &&
97 AreSame((*j)->getLongitude(), ((*i).lonMin * M_PI / 180.0)) &&
98 AreSame((*i).latMax, (*i).latMin) &&
99 AreSame((*i).lonMax, (*i).lonMin));
100 }
101 if (matching)
102 {
103 ++i;
104 }
105 else
106 {
107 i = _missionZones.at(CITY_MISSION_ZONE).areas.erase(i);
108 }
109 }
110 }

Callers

nothing calls this directly

Calls 3

AreSameFunction · 0.85
getLatitudeMethod · 0.45
getLongitudeMethod · 0.45

Tested by

no test coverage detected