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}