Bazaar developer reference

CvPlayer::processBuilding(BuildingTypes, int, bool, CvArea *)

Defined in
CvPlayer.cpp, line 9098
Class
CvPlayer
Hook name
CivHooks::CvPlayer_processBuilding

Hooks

static bool BeforeCvPlayer_processBuilding(CvPlayer* self, BuildingTypes eBuilding, int iChange, bool bFirst, CvArea* pArea);static void AfterCvPlayer_processBuilding(CvPlayer* self, BuildingTypes eBuilding, int iChange, bool bFirst, CvArea* pArea);static void ReplaceCvPlayer_processBuilding(void (*original)(CvPlayer*, BuildingTypes, int, bool, CvArea*), CvPlayer* self, BuildingTypes eBuilding, int iChange, bool bFirst, CvArea* pArea);CivRegisterBefore<CivHooks::CvPlayer_processBuilding>(host, &BeforeCvPlayer_processBuilding);CivRegisterAfter<CivHooks::CvPlayer_processBuilding>(host, &AfterCvPlayer_processBuilding);CivRegisterReplace<CivHooks::CvPlayer_processBuilding>(host, &ReplaceCvPlayer_processBuilding);

Code

9097// What is the effect of a building on the player?9098void CvPlayer::processBuilding(BuildingTypes eBuilding, int iChange, bool bFirst, CvArea* pArea)9099{9100	int iI, iJ;91019102	CvBuildingEntry* pBuildingInfo = GC.getBuildingInfo(eBuilding);9103	if(pBuildingInfo == NULL)9104		return;91059106	// One-shot items9107	if(bFirst && iChange > 0)9108	{9109		// Free Policies9110		int iFreePolicies = pBuildingInfo->GetFreePolicies();9111		if(iFreePolicies > 0)9112			ChangeNumFreePolicies(iFreePolicies);91139114		int iFreeGreatPeople = pBuildingInfo->GetFreeGreatPeople();9115		if(iFreeGreatPeople > 0)9116			ChangeNumFreeGreatPeople(iFreeGreatPeople);91179118		// Golden Age9119		if(pBuildingInfo->IsGoldenAge())9120		{9121			int iGoldenAgeTurns = getGoldenAgeLength();9122			changeGoldenAgeTurns(iGoldenAgeTurns);9123		}91249125		// Global Pop change9126		if(pBuildingInfo->GetGlobalPopulationChange() != 0)9127		{9128			CvCity* pLoopCity;9129			int iLoop;91309131			for(iI = 0; iI < MAX_PLAYERS; iI++)9132			{9133				if(GET_PLAYER((PlayerTypes)iI).isAlive())9134				{9135					if(GET_PLAYER((PlayerTypes)iI).getTeam() == getTeam())9136					{9137						if(pBuildingInfo->IsTeamShare() || (iI == GetID()))9138						{9139							for(pLoopCity = GET_PLAYER((PlayerTypes)iI).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)iI).nextCity(&iLoop))9140							{9141								pLoopCity->setPopulation(std::max(1, (pLoopCity->getPopulation() + iChange * GC.getBuildingInfo(eBuilding)->GetGlobalPopulationChange())));9142							}9143						}9144					}9145				}9146			}9147		}91489149		// Free techs9150		if(pBuildingInfo->GetFreeTechs() > 0)9151		{9152			if(!isHuman())9153			{9154				for(iI = 0; iI < pBuildingInfo->GetFreeTechs(); iI++)9155				{9156					for(int iLoop = 0; iLoop < iChange; iLoop++)9157						AI_chooseFreeTech();9158				}9159			}9160			else9161			{9162				Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_COMPLETED_WONDER_CHOOSE_TECH");9163				localizedText << pBuildingInfo->GetTextKey();9164				chooseTech(pBuildingInfo->GetFreeTechs() * iChange, localizedText.toUTF8());9165			}9166		}9167		if(pBuildingInfo->GetMedianTechPercentChange() > 0)9168		{9169			ChangeMedianTechPercentage(pBuildingInfo->GetMedianTechPercentChange());9170		}91719172		if(pBuildingInfo->GetExtraSpies() > 0)9173		{9174			CvPlayerEspionage* pEspionage = GetEspionage();9175			CvAssertMsg(pEspionage, "pEspionage is null! What's up with that?!");9176			if(pEspionage)9177			{9178				int iNumSpies = pBuildingInfo->GetExtraSpies();9179				for(int i = 0; i < iNumSpies; i++)9180				{9181					pEspionage->CreateSpy();9182				}9183			}9184		}91859186		if(pBuildingInfo->GetInstantSpyRankChange() > 0)9187		{9188			CvPlayerEspionage* pEspionage = GetEspionage();9189			CvAssertMsg(pEspionage, "pEspionage is null! What's up with that?!");9190			if(pEspionage)9191			{9192				for(uint ui = 0; ui < pEspionage->m_aSpyList.size(); ui++)9193				{9194					pEspionage->LevelUpSpy(ui);9195				}9196			}9197		}91989199		if(pBuildingInfo->GetSpyRankChange() > 0)9200		{9201			ChangeStartingSpyRank(pBuildingInfo->GetSpyRankChange());9202		}92039204		// Free Gold9205		if(pBuildingInfo->GetGold() > 0)9206			GetTreasury()->ChangeGold(pBuildingInfo->GetGold());92079208		// Instant Friendship change with all Minors9209		int iMinorFriendshipChange = pBuildingInfo->GetMinorFriendshipChange();9210		if(iMinorFriendshipChange != 0)9211		{9212			int iNewValue;9213			iMinorFriendshipChange += 100;	// Make it a mod92149215			for(int iMinorLoop = MAX_MAJOR_CIVS; iMinorLoop < MAX_CIV_PLAYERS; iMinorLoop++)9216			{9217				iNewValue = GET_PLAYER((PlayerTypes) iMinorLoop).GetMinorCivAI()->GetBaseFriendshipWithMajorTimes100(GetID());9218				iNewValue *= iMinorFriendshipChange;9219				iNewValue /= 100;92209221				GET_PLAYER((PlayerTypes) iMinorLoop).GetMinorCivAI()->SetFriendshipWithMajorTimes100(GetID(), iNewValue);9222			}9223		}9224	}92259226	if(pBuildingInfo->GetFreeBuildingClass() != NO_BUILDINGCLASS)9227	{9228		BuildingTypes eFreeBuilding = (BuildingTypes)getCivilizationInfo().getCivilizationBuildings(pBuildingInfo->GetFreeBuildingClass());9229		changeFreeBuildingCount(eFreeBuilding, iChange);9230	}92319232	// Unit upgrade cost mod9233	ChangeUnitUpgradeCostMod(pBuildingInfo->GetUnitUpgradeCostMod() * iChange);92349235	// Policy cost mod9236	ChangePolicyCostBuildingModifier(pBuildingInfo->GetPolicyCostModifier() * iChange);92379238	// Border growth mods9239	ChangePlotCultureCostModifier(pBuildingInfo->GetGlobalPlotCultureCostModifier() * iChange);9240	ChangePlotGoldCostMod(pBuildingInfo->GetGlobalPlotBuyCostModifier() * iChange);9241#if defined(MOD_BUILDINGS_CITY_WORKING)9242	ChangeCityWorkingChange(pBuildingInfo->GetGlobalCityWorkingChange() * iChange);9243#endif92449245#if defined(MOD_BUILDINGS_CITY_AUTOMATON_WORKERS)9246	ChangeCityAutomatonWorkersChange(pBuildingInfo->GetGlobalCityAutomatonWorkersChange() * iChange);9247#endif92489249	// City Culture Mod9250	ChangeJONSCultureCityModifier(pBuildingInfo->GetGlobalCultureRateModifier() * iChange);92519252	// Trade route gold modifier9253	GetTreasury()->ChangeCityConnectionTradeRouteGoldModifier(pBuildingInfo->GetCityConnectionTradeRouteModifier() * iChange);92549255	// Free Promotion9256	PromotionTypes eFreePromotion = (PromotionTypes) pBuildingInfo->GetFreePromotion();9257	if(eFreePromotion != NO_PROMOTION)9258		ChangeFreePromotionCount(eFreePromotion, iChange);92599260	// Free Promotion Removed9261	PromotionTypes eFreePromotionRemoved = (PromotionTypes) pBuildingInfo->GetFreePromotionRemoved();9262	if(eFreePromotionRemoved != NO_PROMOTION)9263		ChangeFreePromotionCount(eFreePromotionRemoved, -iChange);92649265	// Extra Happiness Per City9266	ChangeExtraHappinessPerCity(pBuildingInfo->GetHappinessPerCity() * iChange);92679268	// Extra Happiness Per Policy9269	ChangeExtraHappinessPerXPolicies(pBuildingInfo->GetHappinessPerXPolicies() * iChange);92709271	// City Count Unhappiness Mod9272	ChangeCityCountUnhappinessMod(pBuildingInfo->GetCityCountUnhappinessMod() * iChange);92739274	// Hurries9275	for(iI = 0; iI < GC.getNumHurryInfos(); iI++)9276	{9277		changeHurryModifier((HurryTypes) iI, (pBuildingInfo->GetHurryModifier(iI) * iChange));9278	}92799280	changeGreatPeopleRateModFromBldgs(pBuildingInfo->GetGlobalGreatPeopleRateModifier() * iChange);9281	changeGreatGeneralRateModFromBldgs(pBuildingInfo->GetGreatGeneralRateModifier() * iChange);9282	ChangeGreatScientistBeakerMod(pBuildingInfo->GetGreatScientistBeakerModifier() * iChange);9283	ChangeGreatPersonExpendGold(pBuildingInfo->GetGreatPersonExpendGold() * iChange);9284	recomputeGreatPeopleModifiers();92859286	changeGoldenAgeModifier(pBuildingInfo->GetGoldenAgeModifier() * iChange);9287	changeFreeExperienceFromBldgs(pBuildingInfo->GetGlobalFreeExperience() * iChange);9288	changeWorkerSpeedModifier(pBuildingInfo->GetWorkerSpeedModifier() * iChange);9289	ChangeSpecialistCultureChange(pBuildingInfo->GetSpecialistExtraCulture() * iChange);9290	changeBorderObstacleCount(pBuildingInfo->IsPlayerBorderObstacle() * iChange);92919292	changeSpaceProductionModifier(pBuildingInfo->GetGlobalSpaceProductionModifier() * iChange);92939294	for(iI = 0; iI < NUM_YIELD_TYPES; iI++)9295	{9296		pArea->changeYieldRateModifier(GetID(), ((YieldTypes)iI), (pBuildingInfo->GetAreaYieldModifier(iI) * iChange));9297		changeYieldRateModifier(((YieldTypes)iI), (pBuildingInfo->GetGlobalYieldModifier(iI) * iChange));9298	}92999300	for(iI = 0; iI < GC.getNumSpecialistInfos(); iI++)9301	{9302		for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)9303		{9304			changeSpecialistExtraYield(((SpecialistTypes)iI), ((YieldTypes)iJ), (pBuildingInfo->GetSpecialistYieldChange(iI, iJ) * iChange));9305		}9306	}93079308	int iOldEspionageModifier = GetEspionageModifier();9309	ChangeEspionageModifier(pBuildingInfo->GetGlobalEspionageModifier() * iChange);9310	if(iOldEspionageModifier != GetEspionageModifier())9311	{9312		int iLoop;9313		CvCity* pLoopCity;9314		for(pLoopCity = firstCity(&iLoop); pLoopCity != NULL; pLoopCity = nextCity(&iLoop))9315		{9316			for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)9317			{9318				PlayerTypes ePlayer = (PlayerTypes)ui;9319				GET_PLAYER(ePlayer).GetEspionage()->UpdateCity(pLoopCity);9320			}9321		}9322	}93239324	ChangeExtraLeagueVotes(pBuildingInfo->GetExtraLeagueVotes() * iChange);93259326	// Loop through Cities9327	int iLoop;9328	CvCity* pLoopCity;9329	int iBuildingCount;9330	for(pLoopCity = firstCity(&iLoop); pLoopCity != NULL; pLoopCity = nextCity(&iLoop))9331	{9332		// Building modifiers9333		BuildingClassTypes eBuildingClass;9334		for(iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)9335		{9336			eBuildingClass = (BuildingClassTypes) iI;93379338			CvBuildingClassInfo* pkBuildingClassInfo = GC.getBuildingClassInfo(eBuildingClass);9339			if(!pkBuildingClassInfo)9340			{9341				continue;9342			}93439344			eBuilding = (BuildingTypes) getCivilizationInfo().getCivilizationBuildings(eBuildingClass);93459346			if(eBuilding != NO_BUILDING)9347			{9348				CvBuildingEntry* pkBuilding = GC.getBuildingInfo(eBuilding);9349				if(pkBuilding)9350				{9351					iBuildingCount = pLoopCity->GetCityBuildings()->GetNumRealBuilding(eBuilding);93529353					if(iBuildingCount > 0)9354					{9355						pLoopCity->ChangeJONSCulturePerTurnFromBuildings(pBuildingInfo->GetBuildingClassYieldChange(eBuildingClass, YIELD_CULTURE) * iBuildingCount * iChange);93569357						// Building Class Yield Stuff9358						for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)9359						{9360							switch(iJ)9361							{9362							case YIELD_CULTURE:9363							{9364								// Skip, handled above9365								break;9366							}9367							case YIELD_FAITH:9368							{9369								pLoopCity->ChangeFaithPerTurnFromBuildings(pBuildingInfo->GetBuildingClassYieldChange(eBuildingClass, iJ) * iBuildingCount * iChange);9370								break;9371							}9372							default:9373							{9374								YieldTypes eYield = (YieldTypes) iJ;9375								int iYieldChange = pBuildingInfo->GetBuildingClassYieldChange(eBuildingClass, eYield);9376								if(iYieldChange > 0)9377								{9378									pLoopCity->ChangeBaseYieldRateFromBuildings(eYield, iYieldChange * iBuildingCount * iChange);9379								}9380							}9381							}9382						}9383					}9384				}9385			}9386		}9387	}9388}

Calls

Called by