Bazaar developer reference

CvPlayer::getAdvancedStartBuildingCost(BuildingTypes, bool, CvCity *)

Defined in
CvPlayer.cpp, line 23087
Class
CvPlayer
Hook name
CivHooks::CvPlayer_getAdvancedStartBuildingCost

Hooks

static bool BeforeCvPlayer_getAdvancedStartBuildingCost(CvPlayer* self, BuildingTypes eBuilding, bool bAdd, CvCity* pCity, int& result);static void AfterCvPlayer_getAdvancedStartBuildingCost(CvPlayer* self, BuildingTypes eBuilding, bool bAdd, CvCity* pCity, int& result);static int ReplaceCvPlayer_getAdvancedStartBuildingCost(int (*original)(CvPlayer*, BuildingTypes, bool, CvCity*), CvPlayer* self, BuildingTypes eBuilding, bool bAdd, CvCity* pCity);CivRegisterBefore<CivHooks::CvPlayer_getAdvancedStartBuildingCost>(host, &BeforeCvPlayer_getAdvancedStartBuildingCost);CivRegisterAfter<CivHooks::CvPlayer_getAdvancedStartBuildingCost>(host, &AfterCvPlayer_getAdvancedStartBuildingCost);CivRegisterReplace<CivHooks::CvPlayer_getAdvancedStartBuildingCost>(host, &ReplaceCvPlayer_getAdvancedStartBuildingCost);

Code

23087int CvPlayer::getAdvancedStartBuildingCost(BuildingTypes eBuilding, bool bAdd, CvCity* pCity)23088{23089	if(0 == getNumCities())23090	{23091		return -1;23092	}2309323094	CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);23095	if(pkBuildingInfo == NULL)23096	{23097		return -1;23098	}2309923100	int iCost = getProductionNeeded(eBuilding);2310123102	if(iCost < 0)23103	{23104		return -1;23105	}2310623107	if(pkBuildingInfo->GetFreeStartEra() != NO_ERA && GC.getGame().getStartEra() >=  pkBuildingInfo->GetFreeStartEra())23108	{23109		// you get this building for free23110		return -1;23111	}2311223113	if(NULL == pCity)23114	{23115		if(bAdd)23116		{23117			bool bValid = false;23118			int iLoop;23119			for(CvCity* pLoopCity = firstCity(&iLoop); NULL != pLoopCity; pLoopCity = nextCity(&iLoop))23120			{23121				if(pLoopCity->canConstruct(eBuilding))23122				{23123					bValid = true;23124					break;23125				}23126			}2312723128			if(!bValid)23129			{23130				return -1;23131			}23132		}23133	}23134	if(NULL != pCity)23135	{23136		if(pCity->getOwner() != GetID())23137		{23138			return -1;23139		}2314023141		iCost *= 100;23142		iCost /= std::max(1, 100 + pCity->getProductionModifier(eBuilding));2314323144		if(bAdd)23145		{23146			if(!pCity->canConstruct(eBuilding, true, false, false))23147			{23148				return -1;23149			}23150		}23151		else23152		{23153			if(pCity->GetCityBuildings()->GetNumRealBuilding(eBuilding) <= 0)23154			{23155				return -1;23156			}2315723158			// Check other buildings in this city and make sure none of them require this one2315923160			// Loop through Buildings to see which are present23161			for(int iBuildingLoop = 0; iBuildingLoop < GC.getNumBuildingInfos(); iBuildingLoop++)23162			{23163				const BuildingTypes eBuildingLoop = static_cast<BuildingTypes>(iBuildingLoop);23164				CvBuildingEntry* pkBuildingLoopInfo = GC.getBuildingInfo(eBuildingLoop);23165				if(pkBuildingLoopInfo)23166				{23167					if(pCity->GetCityBuildings()->GetNumBuilding(eBuildingLoop) > 0)23168					{23169						// Loop through present Building's requirements23170						for(int iBuildingClassPrereqLoop = 0; iBuildingClassPrereqLoop < GC.getNumBuildingClassInfos(); iBuildingClassPrereqLoop++)23171						{23172							const BuildingClassTypes eBuildingClass = static_cast<BuildingClassTypes>(iBuildingClassPrereqLoop);23173							CvBuildingClassInfo* pkBuildingClassInfo = GC.getBuildingClassInfo(eBuildingClass);23174							if(pkBuildingClassInfo)23175							{23176								if(pkBuildingLoopInfo->IsBuildingClassNeededInCity(iBuildingClassPrereqLoop))23177								{23178									if((BuildingTypes)(getCivilizationInfo().getCivilizationBuildings(iBuildingClassPrereqLoop)) == eBuilding)23179									{23180										return -1;23181									}23182								}23183							}23184						}23185					}23186				}23187			}23188		}23189	}2319023191	return iCost;23192}

Calls

Called by