Bazaar developer reference

CvTeam::processTech(TechTypes, int)

Defined in
CvTeam.cpp, line 6483
Class
CvTeam
Hook name
CivHooks::CvTeam_processTech
Lua events
GameEvents.TeamTechResearched

Hooks

static bool BeforeCvTeam_processTech(CvTeam* self, TechTypes eTech, int iChange);static void AfterCvTeam_processTech(CvTeam* self, TechTypes eTech, int iChange);static void ReplaceCvTeam_processTech(void (*original)(CvTeam*, TechTypes, int), CvTeam* self, TechTypes eTech, int iChange);CivRegisterBefore<CivHooks::CvTeam_processTech>(host, &BeforeCvTeam_processTech);CivRegisterAfter<CivHooks::CvTeam_processTech>(host, &AfterCvTeam_processTech);CivRegisterReplace<CivHooks::CvTeam_processTech>(host, &ReplaceCvTeam_processTech);

Code

6483void CvTeam::processTech(TechTypes eTech, int iChange)6484{6485	CvCity* pCity;6486	CvPlot* pLoopPlot;6487	ResourceTypes eResource;6488	int iI, iJ;64896490	CvTechEntry* pTech = GC.getTechInfo(eTech);64916492	if (pTech->IsAllowsWorldCongress())6493	{6494		SetHasTechForWorldCongress(true);6495	}64966497	if(pTech->IsTriggersArchaeologicalSites())6498	{6499		GC.getGame().TriggerArchaeologySiteCreation(true /*bCheckInitialized*/);6500	}65016502	if(pTech->IsExtraWaterSeeFrom())6503	{6504		changeExtraWaterSeeFromCount(iChange);6505	}65066507	if(pTech->IsMapCentering())6508	{6509		if(iChange > 0)6510		{6511			setMapCentering(true);6512		}6513	}65146515	if(pTech->IsMapTrading())6516	{6517		changeMapTradingCount(iChange);6518	}65196520	if(pTech->IsTechTrading())6521	{6522		changeTechTradingCount(iChange);6523	}65246525	if(pTech->IsGoldTrading())6526	{6527		changeGoldTradingCount(iChange);6528	}65296530	if(pTech->IsAllowEmbassyTradingAllowed())6531	{6532		changeAllowEmbassyTradingAllowedCount(iChange);6533	}65346535	if(pTech->IsOpenBordersTradingAllowed())6536	{6537		changeOpenBordersTradingAllowedCount(iChange);6538	}65396540	if(pTech->IsDefensivePactTradingAllowed())6541	{6542		changeDefensivePactTradingAllowedCount(iChange);6543	}65446545	if(pTech->IsResearchAgreementTradingAllowed())6546	{6547		ChangeResearchAgreementTradingAllowedCount(iChange);6548	}65496550	if(pTech->IsTradeAgreementTradingAllowed())6551	{6552		ChangeTradeAgreementTradingAllowedCount(iChange);6553	}65546555	if(pTech->IsPermanentAllianceTrading())6556	{6557		changePermanentAllianceTradingCount(iChange);6558	}65596560#if defined(MOD_TECHS_CITY_WORKING)6561	if(pTech->GetCityWorkingChange() != 0)6562	{6563		changeCityWorkingChange(pTech->GetCityWorkingChange() * iChange);6564	}6565#endif65666567#if defined(MOD_TECHS_CITY_AUTOMATON_WORKERS)6568	if(pTech->GetCityAutomatonWorkersChange() != 0)6569	{6570		changeCityAutomatonWorkersChange(pTech->GetCityAutomatonWorkersChange() * iChange);6571	}6572#endif65736574	if(pTech->IsBridgeBuilding())6575	{6576		changeBridgeBuildingCount(iChange);6577	}65786579	if(pTech->IsWaterWork())6580	{6581		changeWaterWorkCount(iChange);6582	}65836584	if(pTech->IsAllowsEmbarking())6585	{6586		changeCanEmbarkCount(iChange);6587	}65886589	if(pTech->IsAllowsDefensiveEmbarking())6590	{6591		changeDefensiveEmbarkCount(iChange);6592	}65936594	if(pTech->IsEmbarkedAllWaterPassage())6595	{6596		changeEmbarkedAllWaterPassage(iChange);6597	}65986599	if(pTech->GetEmbarkedMoveChange() != 0)6600	{6601		changeEmbarkedExtraMoves(pTech->GetEmbarkedMoveChange() * iChange);6602	}66036604	for(iI = 0; iI < GC.getNumRouteInfos(); iI++)6605	{6606		changeRouteChange(((RouteTypes)iI), (GC.getRouteInfo((RouteTypes) iI)->getTechMovementChange(eTech) * iChange));6607	}66086609	for (int i = 0; i < GC.getNumBuildInfos(); i++)6610	{6611		CvBuildInfo* pkBuildInfo = GC.getBuildInfo((BuildTypes)i);6612		if (pkBuildInfo != NULL)6613			changeBuildTimeChange(((BuildTypes)i), (pkBuildInfo->getTechTimeChange(eTech) * iChange));6614	}66156616	for(iI = 0; iI < NUM_DOMAIN_TYPES; iI++)6617	{6618		changeExtraMoves(((DomainTypes)iI), (pTech->GetDomainExtraMoves(iI) * iChange));6619	}66206621	for(iI = 0; iI < GC.getNumBuildingInfos(); iI++)6622	{6623		CvBuildingEntry* pBuildingEntry = GC.getBuildingInfo((BuildingTypes) iI);6624		if(pBuildingEntry)6625		{6626			if(pBuildingEntry->GetObsoleteTech() == eTech)6627			{6628				changeObsoleteBuildingCount(((BuildingTypes)iI), iChange);6629			}6630			if(pBuildingEntry->GetEnhancedYieldTech() == eTech)6631			{6632				enhanceBuilding(((BuildingTypes)iI), iChange);6633			}6634		}6635	}6636	6637#if defined(MOD_API_UNIFIED_YIELDS)6638	for(iI = 0; iI < GC.getNumFeatureInfos(); iI++)6639	{6640		CvFeatureInfo* pFeatureEntry = GC.getFeatureInfo((FeatureTypes)iI);6641		if(pFeatureEntry)6642		{6643			for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6644			{6645				changeFeatureYieldChange(((FeatureTypes)iI), ((YieldTypes)iJ), (pFeatureEntry->GetTechYieldChanges(eTech, iJ) * iChange));6646			}6647		}6648	}66496650	for(iI = 0; iI < GC.getNumTerrainInfos(); iI++)6651	{6652		CvTerrainInfo* pTerrainEntry = GC.getTerrainInfo((TerrainTypes)iI);6653		if(pTerrainEntry)6654		{6655			for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6656			{6657				changeTerrainYieldChange(((TerrainTypes)iI), ((YieldTypes)iJ), (pTerrainEntry->GetTechYieldChanges(eTech, iJ) * iChange));6658			}6659		}6660	}6661#endif66626663	for(iI = 0; iI < GC.getNumImprovementInfos(); iI++)6664	{6665		CvImprovementEntry* pImprovementEntry = GC.getImprovementInfo((ImprovementTypes)iI);6666		if(pImprovementEntry)6667		{6668			for(iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)6669			{6670				changeImprovementYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechYieldChanges(eTech, iJ) * iChange));6671				changeImprovementNoFreshWaterYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechNoFreshWaterYieldChanges(eTech, iJ) * iChange));6672				changeImprovementFreshWaterYieldChange(((ImprovementTypes)iI), ((YieldTypes)iJ), (pImprovementEntry->GetTechFreshWaterYieldChanges(eTech, iJ) * iChange));6673			}6674		}6675	}66766677	CvPlot* pNewUnitPlot;6678	for(iI = 0; iI < MAX_PLAYERS; iI++)6679	{6680		CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI);6681		if(kPlayer.getTeam() == GetID() && kPlayer.isEverAlive())6682		{6683			kPlayer.changeFeatureProductionModifier(pTech->GetFeatureProductionModifier() * iChange);6684			kPlayer.changeUnitFortificationModifier(pTech->GetUnitFortificationModifier() * iChange);6685			kPlayer.changeUnitBaseHealModifier(pTech->GetUnitBaseHealModifier() * iChange);6686			kPlayer.changeWorkerSpeedModifier(pTech->GetWorkerSpeedModifier() * iChange);6687			kPlayer.ChangeInfluenceSpreadModifier(pTech->GetInfluenceSpreadModifier() * iChange);6688			kPlayer.ChangeExtraVotesPerDiplomat(pTech->GetExtraVotesPerDiplomat() * iChange);66896690			// Free promotion from this tech?6691			for(int iPromotion = 0; iPromotion < GC.getNumPromotionInfos(); iPromotion++)6692			{6693				PromotionTypes ePromotion = (PromotionTypes) iPromotion;6694				if(pTech->IsFreePromotion(ePromotion))6695					kPlayer.ChangeFreePromotionCount(ePromotion, iChange);6696			}66976698			// Update our traits (some may have become obsolete)6699			kPlayer.GetPlayerTraits()->Reset();6700			kPlayer.GetPlayerTraits()->InitPlayerTraits();6701			kPlayer.recomputePolicyCostModifier();67026703			// Does our trait give us a new unit when we reach this tech?6704			UnitTypes eLoopUnit;6705			int iDefaultAI;6706			int iUnitClass = kPlayer.GetPlayerTraits()->GetFirstFreeUnit(eTech);6707			while(iUnitClass != NO_UNITCLASS)6708			{6709				CvCivilizationInfo& playerCivilization = kPlayer.getCivilizationInfo();6710				eLoopUnit = (UnitTypes)playerCivilization.getCivilizationUnits(iUnitClass);6711				iDefaultAI = GC.GetGameUnits()->GetEntry(eLoopUnit)->GetDefaultUnitAIType();6712				pNewUnitPlot = kPlayer.addFreeUnit(eLoopUnit,(UnitAITypes)iDefaultAI);67136714				// Notification below only tells user if their civ gets a Great Person from their trait.  But trait code allows ANY unit to be received from reaching a tech.6715				// So in the future we should use a different notification ("you received a new unit from your trait since you reached this tech") instead.6716				SpecialUnitTypes eSpecialUnitGreatPerson = (SpecialUnitTypes) GC.getInfoTypeForString("SPECIALUNIT_PEOPLE");6717				if(pNewUnitPlot && kPlayer.GetNotifications() && GC.GetGameUnits()->GetEntry(eLoopUnit)->GetSpecialUnitType() == eSpecialUnitGreatPerson)6718				{6719					Localization::String strText = Localization::Lookup("TXT_KEY_NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER");6720					Localization::String strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_SUMMARY_GREAT_PERSON");6721					kPlayer.GetNotifications()->Add(NOTIFICATION_GREAT_PERSON_ACTIVE_PLAYER, strText.toUTF8(), strSummary.toUTF8(), pNewUnitPlot->getX(), pNewUnitPlot->getY(), eLoopUnit);6722				}67236724				// Another?6725				iUnitClass = kPlayer.GetPlayerTraits()->GetNextFreeUnit();6726			}6727		}6728	}67296730	for(iI = 0; iI < GC.getMap().numPlots(); iI++)6731	{6732		pLoopPlot = GC.getMap().plotByIndexUnchecked(iI);67336734		eResource = pLoopPlot->getResourceType();67356736		if(eResource != NO_RESOURCE)6737		{6738			if(GC.getResourceInfo(eResource)->getTechReveal() == eTech)6739			{6740				pLoopPlot->updateYield();6741				if(pLoopPlot->isRevealed(m_eID))6742				{6743					pLoopPlot->setLayoutDirty(true);6744				}6745			}6746		}6747	}67486749	for(iI = 0; iI < GC.getNumBuildInfos(); iI++)6750	{6751		CvBuildInfo* pBuildInfo = GC.getBuildInfo((BuildTypes) iI);6752		if(pBuildInfo && pBuildInfo->getTechPrereq() == eTech)6753		{6754			if(pBuildInfo->getRoute() != NO_ROUTE)6755			{6756				for(iJ = 0; iJ < GC.getMap().numPlots(); iJ++)6757				{6758					pLoopPlot = GC.getMap().plotByIndexUnchecked(iJ);67596760					pCity = pLoopPlot->getPlotCity();67616762					if(pCity != NULL)6763					{6764						if(pCity->getTeam() == GetID())6765						{6766							pLoopPlot->updateCityRoute();6767						}6768					}6769				}6770			}6771		}6772	}67736774	ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();6775	if(pkScriptSystem)6776	{6777		CvLuaArgsHandle args(3);6778		args->Push(GetID());6779		args->Push(eTech);6780		args->Push(iChange);67816782		bool bResult;6783		LuaSupport::CallHook(pkScriptSystem, "TeamTechResearched", args.get(), bResult);6784	}67856786	// End game!6787	if(pTech->IsEndsGame())6788	{6789		GC.getGame().SetEndGameTechResearched(true);6790	}6791}

Calls

Called by