void unit_type_t::_load_xml(xml_parser_t::walker_t& xml) { reset(); xml.check("unit"); height = xml.get_child("parameters").get_child("height").value_int(); max_ep = xml.get_peer("max-ep").value_int(); regeneration_ep = xml.has_key("regeneration")? xml.value_int("regeneration"): 0; max_hp = xml.get_peer("max-hp").value_int(); regeneration_hp = xml.has_key("regeneration")? xml.value_int("regeneration"): 0; sight = xml.get_peer("sight").value_int(); time = xml.get_peer("time").value_int(); armour = xml.get_peer("armor").value_int(); armour_type = mgr.techtree().armour_ID(xml.get_peer("armor-type").value_string()); size = xml.get_peer("size").value_int(); if(size<1 || size>8) data_error("size is out of range"); cellmap = ~0; if(xml.up().has_child("cellmap")) { if(xml.get_child("cellmap").value_bool()) { cellmap = 0; for(int i=0; i<size; i++) { if(!xml.get_child("row",i)) data_error("not enough rows in cellmap"); const std::string bits = xml.value_string(); if((int)bits.size() != size) data_error("wrong number of bits in cellmap row"); for(int j=0; j<size; j++) if(bits[j] == '1') cellmap |= (1 << j) << (i*8); else if(bits[j] != '0') data_error(bits[j]<<" is not binary digit"); xml.up(); } if(xml.get_child("row",size)) data_error("cellmap has too many rows"); if(!cellmap) data_error("cellmap cannot be empty"); } xml.up(); } if(xml.has_child("multi-selection")) { multi_selection = xml.get_child("multi-selection").value_bool(); xml.up(); } else multi_selection = false; if(xml.has_child("light")) { if(xml.get_child("light").value_bool("enabled")) { light_colour.r = xml.value_float("red"); if(light_colour.r<0 || light_colour.r>1) data_error("light colour red is illegal"); light_colour.g = xml.value_float("green"); if(light_colour.g<0 || light_colour.g>1) data_error("light colour green is illegal"); light_colour.b = xml.value_float("blue"); if(light_colour.b<0 || light_colour.b>1) data_error("light colour blue is illegal"); } xml.up(); } else light = false; xml.get_child("resource-requirements"); for(size_t i=0; xml.get_child("resource",i); xml.up(), i++) { const std::string name(xml.value_string("name")); if(!mgr.techtree().get_resources().contains(name)) data_error("resource "<<name<<" not in "<<mgr.techtree()); resource_requirements.push_back(mgr.techtree(),RESOURCE,name, xml.value_int("amount")); } xml.up(); if(xml.has_child("unit-requirements")) { xml.get_child("unit-requirements"); for(size_t i=0; xml.get_child("unit",i); xml.up(), i++) { const std::string name(xml.value_string("name")); if(!faction.get_units().contains(name)) data_error("unit "<<name<<" not in "<<faction); unit_requirements.push_back(mgr.techtree(),UNIT_TYPE,name); } xml.up(); } if(xml.has_child("upgrade-requirements")) { xml.get_child("upgrade-requirements"); for(size_t i=0; xml.get_child("upgrade",i); xml.up(), i++) { const std::string name(xml.value_string("name")); if(!faction.get_upgrades().contains(name)) data_error("upgrade "<<name<<" not in "<<faction); resource_requirements.push_back(mgr.techtree(),UPGRADE,name); } xml.up(); } if(xml.has_child("resources-stored")) { xml.get_child("resources-stored"); for(size_t i=0; xml.get_child("resource",i); xml.up(), i++) { const std::string name(xml.value_string("name")); if(!mgr.techtree().get_resources().contains(name)) data_error("resource "<<name<<" not in "<<mgr.techtree()); resources_stored.push_back(mgr.techtree(),RESOURCE,name, xml.value_int("amount")); } xml.up(); } xml.check("parameters").up(); if(xml.has_child("skills")) { xml.get_child("skills"); for(size_t i=0; xml.get_child("skill",i); xml.up(), i++) skills.push_back(skill_t(xml)); xml.up(); } }
int GameInfo::Unserialize(LArchive &a) { int i, n; // treat all enums as ints a << demoversion; a << n; mode = gamemode_t(n); a << n; state = gamestate_t(n); a << n; skill = skill_t(n); // flags a << netgame << multiplayer << modified << paused << inventory; a << maxteams; a << maxplayers; if (!a.Marker(MARK_GROUP)) return -1; // mapinfo (and maps) a << n; for (i = 0; i < n; i++) { MapInfo *m = new MapInfo; if (m->Unserialize(a)) return -2; mapinfo[m->mapnumber] = m; } if (!a.Marker(MARK_GROUP)) return -1; // clustermap a << n; for (i = 0; i < n; i++) { MapCluster *c = new MapCluster; if (c->Unserialize(a)) return -3; clustermap[c->number] = c; } a << n; currentcluster = clustermap[n]; if (!a.Marker(MARK_GROUP)) return -1; // episodes a << n; episodes.resize(n); for (i = 0; i < n; i++) { episodes[i] = new Episode; if (episodes[i]->Unserialize(a)) return -666; } if (!a.Marker(MARK_GROUP)) return -1; // teams a << n; teams.resize(n); for (i = 0; i < n; i++) { teams[i] = new TeamInfo; if (teams[i]->Unserialize(a)) return -4; } if (!a.Marker(MARK_GROUP)) return -1; // players a << n; for (i = 0; i < n; i++) { PlayerInfo *p = new PlayerInfo; if (p->Unserialize(a)) return -5; Players[p->number] = p; } if (!a.Marker(MARK_GROUP)) return -1; // global script data a.Read((byte *)ACS_world_vars, sizeof(ACS_world_vars)); if (!a.Marker(MARK_GROUP)) return -1; // client stuff a << n; for (i = 0; i < n; i++) { int num; a << num; if (num == -1) LocalPlayers[i].info = NULL; else LocalPlayers[i].info = FindPlayer(num); } if (!a.Marker(MARK_GROUP)) return -1; // misc shit a << n; P_SetRandIndex(n); string mus; a << mus; S.StartMusic(mus.c_str(), true); return 0; }