mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	Fixed two recursive infinite loops in case of alternate buildings.
* introduced in https://github.com/vcmi/vcmi/pull/211
This commit is contained in:
		| @@ -539,12 +539,7 @@ EBuildingState::EBuildingState CGameInfoCallback::canBuildStructure( const CGTow | ||||
|  | ||||
| 	std::function<bool(BuildingID id)> allowedTest = [&](BuildingID id) -> bool | ||||
| 	{ | ||||
| 		if (vstd::contains(t->forbiddenBuildings, id)) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		return t->genBuildingRequirements(id, true).satisfiable(allowedTest, possiblyNotBuiltTest); | ||||
| 		return !vstd::contains(t->forbiddenBuildings, id); | ||||
| 	}; | ||||
|  | ||||
| 	if (!t->genBuildingRequirements(ID, true).satisfiable(allowedTest, possiblyNotBuiltTest)) | ||||
|   | ||||
| @@ -1128,7 +1128,8 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID, | ||||
| { | ||||
| 	const CBuilding * building = town->buildings.at(buildID); | ||||
|  | ||||
| 	deep = false;//FIXME: deep test crashes with alternate buildings | ||||
| 	//TODO: find better solution to prevent infinite loops | ||||
| 	std::set<BuildingID> processed; | ||||
|  | ||||
| 	std::function<CBuilding::TRequired::Variant(const BuildingID &)> dependTest = | ||||
| 	[&](const BuildingID & id) -> CBuilding::TRequired::Variant | ||||
| @@ -1144,10 +1145,14 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID, | ||||
| 				return id; | ||||
| 		} | ||||
|  | ||||
| 		if (build->upgrade != BuildingID::NONE) | ||||
| 			requirements.expressions.push_back(dependTest(build->upgrade)); | ||||
| 		if(!vstd::contains(processed, id)) | ||||
| 		{ | ||||
| 			processed.insert(id); | ||||
| 			if (build->upgrade != BuildingID::NONE) | ||||
| 				requirements.expressions.push_back(dependTest(build->upgrade)); | ||||
|  | ||||
| 		requirements.expressions.push_back(build->requirements.morph(dependTest)); | ||||
| 			requirements.expressions.push_back(build->requirements.morph(dependTest)); | ||||
| 		} | ||||
| 		return requirements; | ||||
| 	}; | ||||
|  | ||||
| @@ -1157,6 +1162,7 @@ CBuilding::TRequired CGTownInstance::genBuildingRequirements(BuildingID buildID, | ||||
| 		const CBuilding * upgr = town->buildings.at(building->upgrade); | ||||
|  | ||||
| 		requirements.expressions.push_back(dependTest(upgr->bid)); | ||||
| 		processed.clear(); | ||||
| 	} | ||||
| 	requirements.expressions.push_back(building->requirements.morph(dependTest)); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user