BuildingClassNeededs do not work after changing a building to a unique building

Cybah

Emperor
Joined
Jun 22, 2007
Messages
1,481
Grrrr! Sometimes this game really annoys me.

One leadertrait in my mod gives a chance of X% that you get a unique building instead of the common building.

When this happens, for some reason the "BuildingClassNeededs" function won't work correctly anymore.

Example:

I have constructed a forge and this forge get switched for a malinese forge by

PHP:
					pCity.setNumRealBuilding(iBuildingType,0)
					pCity.setNumRealBuilding(l_UniqueBuildings[chance],1)

For some reason, I won't be able to construct the Colossus in that city (it says it requires a forge).

I don't have any idea to fix this problem. Need help. :(



Edit... should have something to do with this found in CvCity.cpp:

PHP:
bool CvCity::canConstruct(BuildingTypes eBuilding, bool bContinue, bool bTestVisible, bool bIgnoreCost) const
{
...


		for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
		{
			if (GC.getBuildingInfo(eBuilding).isBuildingClassNeededInCity(iI))
			{
				ePrereqBuilding = ((BuildingTypes)(GC.getCivilizationInfo(getCivilizationType()).getCivilizationBuildings(iI)));

				if (ePrereqBuilding != NO_BUILDING)
				{
					if (0 == getNumBuilding(ePrereqBuilding) /* && (bContinue || (getFirstBuildingOrder(ePrereqBuilding) == -1))*/)
					{
						return false;
					}
				}
			}
		}
 
That seems like an interesting idea, do you mind posting the code behind the trait?
 
sure:

PHP:
# Creative Trait Start -----------------------------------------------------------------------------------------------
		iTraitCre = gc.getInfoTypeForString("TRAIT_CREATIVE")
		if pPlayer.hasTrait(iTraitCre):
			l_UniqueBuildings = []
			for iCiv in xrange(gc.getNumCivilizationInfos()):
				for iBuilding in xrange(gc.getNumBuildingClassInfos()):
					iUniqueBuilding = gc.getCivilizationInfo(iCiv).getCivilizationBuildings(iBuilding);
					iDefaultBuilding = gc.getBuildingClassInfo(iBuilding).getDefaultBuildingIndex();
					if (iDefaultBuilding > -1 and iUniqueBuilding > -1 and iDefaultBuilding != iUniqueBuilding):
						if iBuildingType == iDefaultBuilding:
							l_UniqueBuildings.append(iUniqueBuilding)
			if len(l_UniqueBuildings) >= 1:
				## 25% chance
				iForeignUBChance = self.getRandomNumber( 4 )
				if iForeignUBChance == 0:
					chance = CyGame().getSorenRandNum(len(l_UniqueBuildings), "Random for UniqueBuildings")
					pCity.setNumRealBuilding(iBuildingType,0)
					pCity.setNumRealBuilding(l_UniqueBuildings[chance],1)
# Creative Trait End -----------------------------------------------------------------------------------------------


edit: you don't have self.getRandomNumber, its just another getSorenRandNum.
 
Warning: It's still bugged. When University got changed to Seowon, you will be able to build another (common) University cause the University has prereqbuildings defined (Library).
 
Top Bottom