- added a validation / warnhing logic to handle cases of duplicate resource values entered in XML
This commit is contained in:
parent
1e34bc66c1
commit
0b62b4137e
|
@ -665,12 +665,14 @@ bool Faction::applyCosts(const ProducibleType *p){
|
||||||
if(r == NULL) {
|
if(r == NULL) {
|
||||||
char szBuf[1024]="";
|
char szBuf[1024]="";
|
||||||
sprintf(szBuf,"cannot apply costs for p [%s] %d of %d costs resource is null",p->getName().c_str(),i,p->getCostCount());
|
sprintf(szBuf,"cannot apply costs for p [%s] %d of %d costs resource is null",p->getName().c_str(),i,p->getCostCount());
|
||||||
|
throw runtime_error(szBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ResourceType *rt= r->getType();
|
const ResourceType *rt= r->getType();
|
||||||
if(rt == NULL) {
|
if(rt == NULL) {
|
||||||
char szBuf[1024]="";
|
char szBuf[1024]="";
|
||||||
sprintf(szBuf,"cannot apply costs for p [%s] %d of %d costs resourcetype [%s] is null",p->getName().c_str(),i,p->getCostCount(),r->getDescription().c_str());
|
sprintf(szBuf,"cannot apply costs for p [%s] %d of %d costs resourcetype [%s] is null",p->getName().c_str(),i,p->getCostCount(),r->getDescription().c_str());
|
||||||
|
throw runtime_error(szBuf);
|
||||||
}
|
}
|
||||||
int cost= r->getAmount();
|
int cost= r->getAmount();
|
||||||
if((cost > 0 || (rt->getClass() != rcStatic)) && rt->getClass() != rcConsumable)
|
if((cost > 0 || (rt->getClass() != rcStatic)) && rt->getClass() != rcConsumable)
|
||||||
|
|
|
@ -347,31 +347,52 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree,
|
||||||
std::map<string,int> sortedItems;
|
std::map<string,int> sortedItems;
|
||||||
|
|
||||||
//unit requirements
|
//unit requirements
|
||||||
|
bool hasDup = false;
|
||||||
const XmlNode *unitRequirementsNode= parametersNode->getChild("unit-requirements");
|
const XmlNode *unitRequirementsNode= parametersNode->getChild("unit-requirements");
|
||||||
for(int i=0; i<unitRequirementsNode->getChildCount(); ++i){
|
for(int i=0; i<unitRequirementsNode->getChildCount(); ++i){
|
||||||
const XmlNode *unitNode= unitRequirementsNode->getChild("unit", i);
|
const XmlNode *unitNode= unitRequirementsNode->getChild("unit", i);
|
||||||
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = 0;
|
sortedItems[name] = 0;
|
||||||
}
|
}
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, unit type [%s] has one or more duplicate unit requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
unitReqs.push_back(factionType->getUnitType(iterMap->first));
|
unitReqs.push_back(factionType->getUnitType(iterMap->first));
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//upgrade requirements
|
//upgrade requirements
|
||||||
const XmlNode *upgradeRequirementsNode= parametersNode->getChild("upgrade-requirements");
|
const XmlNode *upgradeRequirementsNode= parametersNode->getChild("upgrade-requirements");
|
||||||
for(int i=0; i<upgradeRequirementsNode->getChildCount(); ++i){
|
for(int i=0; i<upgradeRequirementsNode->getChildCount(); ++i){
|
||||||
const XmlNode *upgradeReqNode= upgradeRequirementsNode->getChild("upgrade", i);
|
const XmlNode *upgradeReqNode= upgradeRequirementsNode->getChild("upgrade", i);
|
||||||
string name= upgradeReqNode->getAttribute("name")->getRestrictedValue();
|
string name= upgradeReqNode->getAttribute("name")->getRestrictedValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = 0;
|
sortedItems[name] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, unit type [%s] has one or more duplicate upgrade requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
upgradeReqs.push_back(factionType->getUpgradeType(iterMap->first));
|
upgradeReqs.push_back(factionType->getUpgradeType(iterMap->first));
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//resource requirements
|
//resource requirements
|
||||||
const XmlNode *resourceRequirementsNode= parametersNode->getChild("resource-requirements");
|
const XmlNode *resourceRequirementsNode= parametersNode->getChild("resource-requirements");
|
||||||
|
@ -380,8 +401,18 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree,
|
||||||
const XmlNode *resourceNode= resourceRequirementsNode->getChild("resource", i);
|
const XmlNode *resourceNode= resourceRequirementsNode->getChild("resource", i);
|
||||||
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
||||||
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
sortedItems[name] = amount;
|
sortedItems[name] = amount;
|
||||||
}
|
}
|
||||||
|
//if(hasDup || sortedItems.size() != costs.size()) printf("Found duplicate resource requirement, costs.size() = %d sortedItems.size() = %d\n",costs.size(),sortedItems.size());
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, unit type [%s] has one or more duplicate resource requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if(sortedItems.size() < costs.size()) {
|
if(sortedItems.size() < costs.size()) {
|
||||||
costs.resize(sortedItems.size());
|
costs.resize(sortedItems.size());
|
||||||
}
|
}
|
||||||
|
@ -392,6 +423,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree,
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//resources stored
|
//resources stored
|
||||||
const XmlNode *resourcesStoredNode= parametersNode->getChild("resources-stored");
|
const XmlNode *resourcesStoredNode= parametersNode->getChild("resources-stored");
|
||||||
|
@ -400,8 +432,18 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree,
|
||||||
const XmlNode *resourceNode= resourcesStoredNode->getChild("resource", i);
|
const XmlNode *resourceNode= resourcesStoredNode->getChild("resource", i);
|
||||||
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
||||||
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = amount;
|
sortedItems[name] = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, unit type [%s] has one or more duplicate stored resources\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if(sortedItems.size() < storedResources.size()) {
|
if(sortedItems.size() < storedResources.size()) {
|
||||||
storedResources.resize(sortedItems.size());
|
storedResources.resize(sortedItems.size());
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,41 +258,81 @@ void UpgradeType::load(const string &dir, const TechTree *techTree,
|
||||||
std::map<string,int> sortedItems;
|
std::map<string,int> sortedItems;
|
||||||
|
|
||||||
//unit requirements
|
//unit requirements
|
||||||
|
bool hasDup = false;
|
||||||
const XmlNode *unitRequirementsNode= upgradeNode->getChild("unit-requirements");
|
const XmlNode *unitRequirementsNode= upgradeNode->getChild("unit-requirements");
|
||||||
for(int i = 0; i < unitRequirementsNode->getChildCount(); ++i) {
|
for(int i = 0; i < unitRequirementsNode->getChildCount(); ++i) {
|
||||||
const XmlNode *unitNode= unitRequirementsNode->getChild("unit", i);
|
const XmlNode *unitNode= unitRequirementsNode->getChild("unit", i);
|
||||||
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = 0;
|
sortedItems[name] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, upgrade type [%s] has one or more duplicate unit requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
unitReqs.push_back(factionType->getUnitType(iterMap->first));
|
unitReqs.push_back(factionType->getUnitType(iterMap->first));
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//upgrade requirements
|
//upgrade requirements
|
||||||
const XmlNode *upgradeRequirementsNode= upgradeNode->getChild("upgrade-requirements");
|
const XmlNode *upgradeRequirementsNode= upgradeNode->getChild("upgrade-requirements");
|
||||||
for(int i = 0; i < upgradeRequirementsNode->getChildCount(); ++i) {
|
for(int i = 0; i < upgradeRequirementsNode->getChildCount(); ++i) {
|
||||||
const XmlNode *upgradeReqNode= upgradeRequirementsNode->getChild("upgrade", i);
|
const XmlNode *upgradeReqNode= upgradeRequirementsNode->getChild("upgrade", i);
|
||||||
string name= upgradeReqNode->getAttribute("name")->getRestrictedValue();
|
string name= upgradeReqNode->getAttribute("name")->getRestrictedValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = 0;
|
sortedItems[name] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, upgrade type [%s] has one or more duplicate upgrade requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
upgradeReqs.push_back(factionType->getUpgradeType(iterMap->first));
|
upgradeReqs.push_back(factionType->getUpgradeType(iterMap->first));
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//resource requirements
|
//resource requirements
|
||||||
int index = 0;
|
int index = 0;
|
||||||
const XmlNode *resourceRequirementsNode= upgradeNode->getChild("resource-requirements");
|
const XmlNode *resourceRequirementsNode= upgradeNode->getChild("resource-requirements");
|
||||||
|
hasDup = false;
|
||||||
costs.resize(resourceRequirementsNode->getChildCount());
|
costs.resize(resourceRequirementsNode->getChildCount());
|
||||||
for(int i = 0; i < costs.size(); ++i) {
|
for(int i = 0; i < costs.size(); ++i) {
|
||||||
const XmlNode *resourceNode= resourceRequirementsNode->getChild("resource", i);
|
const XmlNode *resourceNode= resourceRequirementsNode->getChild("resource", i);
|
||||||
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
string name= resourceNode->getAttribute("name")->getRestrictedValue();
|
||||||
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
int amount= resourceNode->getAttribute("amount")->getIntValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = amount;
|
sortedItems[name] = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if(hasDup || sortedItems.size() != costs.size()) printf("Found duplicate resource requirement, costs.size() = %d sortedItems.size() = %d\n",costs.size(),sortedItems.size());
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, upgrade type [%s] has one or more duplicate resource requirements\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sortedItems.size() < costs.size()) {
|
||||||
|
costs.resize(sortedItems.size());
|
||||||
|
}
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
|
@ -300,14 +340,25 @@ void UpgradeType::load(const string &dir, const TechTree *techTree,
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
sortedItems.clear();
|
sortedItems.clear();
|
||||||
|
hasDup = false;
|
||||||
|
|
||||||
//effects
|
//effects
|
||||||
const XmlNode *effectsNode= upgradeNode->getChild("effects");
|
const XmlNode *effectsNode= upgradeNode->getChild("effects");
|
||||||
for(int i = 0; i < effectsNode->getChildCount(); ++i) {
|
for(int i = 0; i < effectsNode->getChildCount(); ++i) {
|
||||||
const XmlNode *unitNode= effectsNode->getChild("unit", i);
|
const XmlNode *unitNode= effectsNode->getChild("unit", i);
|
||||||
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
string name= unitNode->getAttribute("name")->getRestrictedValue();
|
||||||
|
|
||||||
|
if(sortedItems.find(name) != sortedItems.end()) {
|
||||||
|
hasDup = true;
|
||||||
|
}
|
||||||
|
|
||||||
sortedItems[name] = 0;
|
sortedItems[name] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(hasDup) {
|
||||||
|
printf("WARNING, upgrade type [%s] has one or more duplicate effects\n",this->getName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
for(std::map<string,int>::iterator iterMap = sortedItems.begin();
|
||||||
iterMap != sortedItems.end(); ++iterMap) {
|
iterMap != sortedItems.end(); ++iterMap) {
|
||||||
effects.push_back(factionType->getUnitType(iterMap->first));
|
effects.push_back(factionType->getUnitType(iterMap->first));
|
||||||
|
|
Loading…
Reference in New Issue