Browse Source

First part of fix for 1712
- implemented recursive search for missing dependencies
- todo - update GUI. As of now Gui may provide incorrect information

Ivan Savenko 11 years ago
parent
commit
16eb4b3267
1 changed files with 24 additions and 6 deletions
  1. 24 6
      lib/CGameInfoCallback.cpp

+ 24 - 6
lib/CGameInfoCallback.cpp

@@ -403,20 +403,38 @@ EBuildingState::EBuildingState CGameInfoCallback::canBuildStructure( const CGTow
 			return EBuildingState::NO_WATER; //lack of water
 	}
 
-	auto buildTest = [&](const BuildingID & id)
+	/// returns true if building prerequisites are fulfilled
+	std::function<bool(BuildingID)> buildTest;
+
+	auto dependTest = [&](BuildingID id) -> bool
 	{
-		return t->hasBuilt(id);
+		const CBuilding * build = t->town->buildings.at(id);
+
+		if (build->upgrade != BuildingID::NONE)
+		{
+			if (!t->hasBuilt(build->upgrade))
+				return false;
+
+			if (!t->town->buildings.at(build->upgrade)->requirements.test(buildTest))
+				return false;
+		}
+
+		if (!build->requirements.test(buildTest))
+			return false;
+		return true;
 	};
 
-	if (!building->requirements.test(buildTest))
+	buildTest = [&](BuildingID bid)
+	{
+		return t->hasBuilt(bid) && dependTest(bid);
+	};
+
+	if (!dependTest(ID))
 		return EBuildingState::PREREQUIRES;
 
 	if(t->builded >= VLC->modh->settings.MAX_BUILDING_PER_TURN)
 		return EBuildingState::CANT_BUILD_TODAY; //building limit
 
-	if (building->upgrade != BuildingID::NONE && !t->hasBuilt(building->upgrade))
-		return EBuildingState::MISSING_BASE;
-
 	//checking resources
 	if(!building->resources.canBeAfforded(getPlayer(t->tempOwner)->resources))
 		return EBuildingState::NO_RESOURCES; //lack of res