Bazaar developer reference

CvTeam::setHasTech(TechTypes, bool, PlayerTypes, bool, bool)

Defined in
CvTeam.cpp, line 5420
Class
CvTeam
Hook name
CivHooks::CvTeam_setHasTech

Hand-placed hooks inside

A replacement for this function that does not call original stops these hooks from running.

Hooks

static bool BeforeCvTeam_setHasTech(CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);static void AfterCvTeam_setHasTech(CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);static void ReplaceCvTeam_setHasTech(void (*original)(CvTeam*, TechTypes, bool, PlayerTypes, bool, bool), CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);CivRegisterBefore<CivHooks::CvTeam_setHasTech>(host, &BeforeCvTeam_setHasTech);CivRegisterAfter<CivHooks::CvTeam_setHasTech>(host, &AfterCvTeam_setHasTech);CivRegisterReplace<CivHooks::CvTeam_setHasTech>(host, &ReplaceCvTeam_setHasTech);

Code

5420void CvTeam::setHasTech(TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce)5421{5422	CvCity* pCapitalCity;5423	CvCity* pCity;5424	CvString strBuffer;5425	UnitTypes eFreeUnit;5426	bool bFirstResource;5427	5428	if(eIndex == NO_TECH)5429	{5430		return;5431	}54325433	CvTechEntry* pkTechInfo = GC.getTechInfo(eIndex);5434	if(pkTechInfo == NULL)5435	{5436		return;5437	}54385439	if(ePlayer == NO_PLAYER)5440	{5441		ePlayer = getLeaderID();5442	}54435444	CvAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");5445	CvAssertMsg(eIndex < GC.getNumTechInfos(), "eIndex is expected to be within maximum bounds (invalid Index)");5446	CvAssertMsg(ePlayer >= 0, "eIndex is expected to be non-negative (invalid Index)");5447	CvAssertMsg(ePlayer < MAX_PLAYERS, "ePlayer is expected to be within maximum bounds (invalid Index)");54485449	if(ePlayer == NO_PLAYER)5450	{5451		return;5452	}54535454	if(GetTeamTechs()->HasTech(eIndex) != bNewValue)5455	{5456#if !defined(NO_ACHIEVEMENTS)5457		CvPlayerAI& kResearchingPlayer = GET_PLAYER(ePlayer);54585459		if(	GC.getGame().getActivePlayer() == ePlayer &&5460			strcmp(pkTechInfo->GetType(), "TECH_SATELLITES") == 0 &&5461			strcmp(kResearchingPlayer.getCivilizationTypeKey(), "CIVILIZATION_HUNS") == 0 &&5462			strcmp(GC.getMap().getWorldInfo().GetType(), "WORLDSIZE_HUGE") == 0)5463		{5464			gDLL->UnlockAchievement(ACHIEVEMENT_XP1_30);5465		}5466#endif54675468		if(pkTechInfo->IsRepeat())5469		{5470			GetTeamTechs()->IncrementTechCount(eIndex);54715472			GetTeamTechs()->SetResearchProgress(eIndex, 0, ePlayer);54735474			// Repeating techs are good for score!5475			int iScoreChange = /*10*/ GC.getSCORE_FUTURE_TECH_MULTIPLIER();5476			for(int iI = 0; iI < MAX_PLAYERS; iI++)5477			{5478				const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5479				CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5480				if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID())5481				{5482					kLoopPlayer.ChangeScoreFromFutureTech(iScoreChange);5483				}5484			}54855486			// report event to Python5487			////gDLL->getEventReporterIFace()->techAcquired(eIndex, GetID(), ePlayer, bAnnounce && 1 == GetTeamTechs()->GetTechCount(eIndex));54885489			if(1 == GetTeamTechs()->GetTechCount(eIndex))5490			{5491				if(bAnnounce)5492				{5493					if(GC.getGame().isFinalInitialized())5494					{5495						announceTechToPlayers(eIndex);5496					}5497				}5498			}5499		}5500		else5501		{5502			GetTeamTechs()->SetHasTech(eIndex, bNewValue);55035504			// Tech progress affects city strength, so update5505			CvCity* pLoopCity;5506			int iLoop;55075508			for(int iI = 0; iI < MAX_PLAYERS; iI++)5509			{5510				const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5511				CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5512				if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID())5513				{5514					for(pLoopCity = kLoopPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kLoopPlayer.nextCity(&iLoop))5515					{5516						pLoopCity->updateStrengthValue();5517					}5518				}5519			}55205521			NotificationTypes eNotificationType = NO_NOTIFICATION_TYPE;55225523			const bool bIsActiveTeam = (GetID() == GC.getGame().getActiveTeam());5524			const int iNumPlots = GC.getMap().numPlots();5525			for(int iPlotLoop = 0; iPlotLoop < iNumPlots; iPlotLoop++)5526			{5527				CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iPlotLoop);55285529				const ResourceTypes eResource = pLoopPlot->getResourceType();5530				if(eResource != NO_RESOURCE)5531				{5532					CvResourceInfo* pResourceInfo = GC.getResourceInfo(eResource);5533					CvAssert(pResourceInfo);55345535					if(bNewValue)5536					{5537						const TechTypes eTechReveal = static_cast<TechTypes>(pResourceInfo->getTechReveal());5538						// Resource Reveal5539						if(eTechReveal == eIndex)5540						{5541							// update the resources5542							if(pLoopPlot->isRevealed(m_eID))5543							{5544								if(pLoopPlot->getResourceType(m_eID) != NO_RESOURCE)5545								{5546									// Create resource link5547									if(pLoopPlot->isOwned())5548										pLoopPlot->DoFindCityToLinkResourceTo();55495550									// Only update for active team5551									if(bIsActiveTeam)5552									{5553										// If we've force revealed the resource for this team, then don't send another event5554										if(!pLoopPlot->IsResourceForceReveal(GetID()))5555										{5556											pLoopPlot->setLayoutDirty(true);5557										}55585559										// Notify the player that owns this Plot5560										if(pLoopPlot->getOwner() == GC.getGame().getActivePlayer() && pLoopPlot->getTeam() == GetID())5561										{5562											if(!CvPreGame::loadWBScenario() || GC.getGame().getGameTurn() > 0)5563											{5564												strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_RESOURCE", pResourceInfo->GetTextKey());5565									5566												CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pResourceInfo->GetTextKey());55675568												switch(pResourceInfo->getResourceUsage())5569												{5570												case RESOURCEUSAGE_LUXURY:5571													eNotificationType = NOTIFICATION_DISCOVERED_LUXURY_RESOURCE;5572													break;5573												case RESOURCEUSAGE_STRATEGIC:5574													eNotificationType = NOTIFICATION_DISCOVERED_STRATEGIC_RESOURCE;5575													break;5576												case RESOURCEUSAGE_BONUS:5577													eNotificationType = NOTIFICATION_DISCOVERED_BONUS_RESOURCE;5578													break;5579												}55805581												CvNotifications* pNotifications = GET_PLAYER(pLoopPlot->getOwner()).GetNotifications();5582												if(pNotifications)5583												{5584													pNotifications->Add(eNotificationType, strBuffer, strSummary, pLoopPlot->getX(), pLoopPlot->getY(), eResource);5585												}5586											}5587										}5588									}5589								}5590							}5591						}5592					}5593					// Resource Connection5594					if(pLoopPlot->getTeam() == GetID())5595					{5596						if(pResourceInfo->getTechCityTrade() == eIndex)5597						{5598							if(pLoopPlot->isCity() || pLoopPlot->getImprovementType() != NO_IMPROVEMENT)5599							{5600								// Appropriate Improvement on this Plot?5601								if(pLoopPlot->isCity() || GC.getImprovementInfo(pLoopPlot->getImprovementType())->IsImprovementResourceTrade(eResource))5602								{5603									for(int iI = 0; iI < MAX_PLAYERS; iI++)5604									{5605										const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5606										CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5607										if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID() && pLoopPlot->getOwner() == eLoopPlayer)5608										{5609											// We now have a new Tech5610											if(bNewValue)5611											{5612												// slewis - added in so resources wouldn't be double counted when the minor civ researches the technology5613												if (!(kLoopPlayer.isMinorCiv() && pLoopPlot->IsImprovedByGiftFromMajor()))5614												{5615													kLoopPlayer.changeNumResourceTotal(eResource, pLoopPlot->getNumResourceForPlayer(eLoopPlayer));5616												}56175618												// Reconnect resource link5619												if(pLoopPlot->GetResourceLinkedCity() != NULL)5620												{5621													pLoopPlot->SetResourceLinkedCityActive(true);5622												}5623												// Create resource link5624												else5625												{5626													pLoopPlot->DoFindCityToLinkResourceTo();5627												}5628											}5629											// Removing Tech5630											else5631											{5632												kLoopPlayer.changeNumResourceTotal(eResource, -pLoopPlot->getNumResourceForPlayer(eLoopPlayer));56335634												// Disconnect resource link5635												if(pLoopPlot->GetResourceLinkedCity() != NULL)5636													pLoopPlot->SetResourceLinkedCityActive(false);5637											}5638										}5639									}5640								}5641							}5642						}5643					}5644				}5645			}5646		}56475648		processTech(eIndex, ((bNewValue) ? 1 : -1));56495650		//Antiquity site notifications.5651		//Notifications for Artifacts and Hidden Artifacts have to come AFTER processTech because they may not have been spawned yet.5652		if(!CvPreGame::loadWBScenario() || GC.getGame().getGameTurn() > 0)5653		{5654			bool bTechRevealsArtifacts = false;5655			bool bTechRevealsHiddenArtifacts = false;56565657			ResourceTypes eArtifactResource = (ResourceTypes)GC.getInfoTypeForString("RESOURCE_ARTIFACTS", true);5658			CvResourceInfo* pArtifactResource = NULL;5659			if(eArtifactResource != NO_RESOURCE)5660			{5661				pArtifactResource = GC.getResourceInfo(eArtifactResource);5662				bTechRevealsArtifacts = pArtifactResource->getTechReveal() == eIndex;			5663			}56645665			ResourceTypes eHiddenArtifactResource = (ResourceTypes)GC.getInfoTypeForString("RESOURCE_HIDDEN_ARTIFACTS", true);;5666			CvResourceInfo* pHiddenArtifactResource = NULL;5667			if(eHiddenArtifactResource != NO_RESOURCE)5668			{5669				pHiddenArtifactResource = GC.getResourceInfo(eHiddenArtifactResource);5670				bTechRevealsHiddenArtifacts = pHiddenArtifactResource->getTechReveal() == eIndex;5671			}56725673			if(bTechRevealsArtifacts | bTechRevealsHiddenArtifacts)5674			{5675				const PlayerTypes eActivePlayer = GC.getGame().getActivePlayer();5676				const int iNumPlots = GC.getMap().numPlots();5677				for(int iPlotLoop = 0; iPlotLoop < iNumPlots; iPlotLoop++)5678				{5679					CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iPlotLoop);56805681					if(pLoopPlot->getOwner() == eActivePlayer && pLoopPlot->getTeam() == m_eID && pLoopPlot->isRevealed(m_eID))5682					{5683						const ResourceTypes ePlotResource = pLoopPlot->getResourceType(m_eID);5684						if( (bTechRevealsArtifacts && ePlotResource == eArtifactResource) || 5685							(bTechRevealsHiddenArtifacts && ePlotResource == eHiddenArtifactResource))5686						{5687							CvString strSummary;5688					//		CvString strBuffer;5689							ResourceUsageTypes eResourceUsage = RESOURCEUSAGE_LUXURY;5690							NotificationTypes eNotificationType = NO_NOTIFICATION_TYPE;56915692							if(ePlotResource == eArtifactResource)5693							{5694								strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_ARTIFACTS");5695								strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pArtifactResource->GetTextKey());5696								eResourceUsage = pArtifactResource->getResourceUsage();5697							}5698							else if(ePlotResource == eHiddenArtifactResource)5699							{5700								strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_HIDDEN_ARTIFACTS");5701								strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pHiddenArtifactResource->GetTextKey());5702								eResourceUsage = pHiddenArtifactResource->getResourceUsage();5703							}57045705							switch(eResourceUsage)5706							{5707							case RESOURCEUSAGE_LUXURY:5708								eNotificationType = NOTIFICATION_DISCOVERED_LUXURY_RESOURCE;5709								break;5710							case RESOURCEUSAGE_STRATEGIC:5711								eNotificationType = NOTIFICATION_DISCOVERED_STRATEGIC_RESOURCE;5712								break;5713							case RESOURCEUSAGE_BONUS:5714								eNotificationType = NOTIFICATION_DISCOVERED_BONUS_RESOURCE;5715								break;5716							}57175718							CvNotifications* pNotifications = GET_PLAYER(pLoopPlot->getOwner()).GetNotifications();5719							if(pNotifications)5720							{5721								pNotifications->Add(eNotificationType, strBuffer, strSummary, pLoopPlot->getX(), pLoopPlot->getY(), ePlotResource);5722							}5723						}5724					}5725				}5726			}57275728		}57295730		if(GetTeamTechs()->HasTech(eIndex))5731		{5732			EraTypes eThisTechsEra = (EraTypes) pkTechInfo->GetEra();57335734			// Era change for this Team?5735			if(GetCurrentEra() < eThisTechsEra)5736			{5737				EraTypes eNewEra = (EraTypes) pkTechInfo->GetEra();5738				//int iEraChange = eNewEra - GetCurrentEra();57395740				//int iVictoryPointChange = iEraChange * /*1*/ GC.getVICTORY_POINTS_PER_ERA();5741				//changeVictoryPoints(iVictoryPointChange);57425743				//strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_ERA_VICTORY_POINTS", iVictoryPointChange);5744				//CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_ERA_VICTORY_POINTS");5745				//AddNotification(NOTIFICATION_VICTORY, strBuffer, strSummary);57465747				SetCurrentEra(eNewEra);5748			}5749			// DON'T enter a new era with this tech5750			else5751			{5752				// If we have all the techs in the earlier eras, then we're in that era5753				bool bHasAllEarlierTechs = true;5754				for(int iTechLoop = 0; iTechLoop < GC.getNumTechInfos(); iTechLoop++)5755				{5756					const TechTypes eLoopTech = static_cast<TechTypes>(iTechLoop);5757					CvTechEntry* pkLoopTech = GC.getTechInfo(eLoopTech);5758					if(pkLoopTech)5759					{5760						// Only look at techs prior to our era - there's no need to go further5761						if(pkLoopTech->GetEra() <= GetCurrentEra())5762						{5763							if(!GetTeamTechs()->HasTech(eLoopTech))5764							{5765								bHasAllEarlierTechs = false;5766								break;5767							}5768						}5769					}5770				}57715772				if(bHasAllEarlierTechs)5773				{5774					const EraTypes currentEra = GetCurrentEra();5775					const int iNextEra = static_cast<int>(currentEra) + 1;5776					if(iNextEra < GC.getNumEraInfos())5777					{5778						const EraTypes nextEra = static_cast<EraTypes>(iNextEra);5779						const CvEraInfo* pkEraInfo = GC.getEraInfo(nextEra);5780						if(pkEraInfo != NULL)5781						{5782							SetCurrentEra(nextEra);5783						}5784					}57855786				}5787			}57885789			if(pkTechInfo->IsMapVisible())5790			{5791				GC.getMap().setRevealedPlots(GetID(), true, true);5792				GC.getMap().updateDeferredFog();5793			}57945795			DoUpdateBestRoute();57965797			// report event to Python, along with some other key state5798			//////gDLL->getEventReporterIFace()->techAcquired(eIndex, GetID(), ePlayer, bAnnounce);57995800			bFirstResource = false;58015802			for(int iI = 0; iI < MAX_PLAYERS; iI++)5803			{5804				const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5805				CvPlayerAI& kPlayer = GET_PLAYER(eLoopPlayer);5806				if(kPlayer.isAlive() && kPlayer.getTeam() == GetID())5807				{5808					if(kPlayer.GetPlayerTechs()->IsResearchingTech(eIndex))5809					{5810						kPlayer.popResearch(eIndex);5811					}58125813					// notify the player they now have the tech, if they want to make immediate changes5814					//GET_PLAYER((PlayerTypes)iI).AI_nowHasTech(eIndex);58155816					kPlayer.invalidateYieldRankCache();5817				}5818			}58195820			if(bFirst)5821			{5822				if(GC.getGame().countKnownTechNumTeams(eIndex) == 1)5823				{5824					if(pkTechInfo->GetFirstFreeUnitClass() != NO_UNITCLASS)5825					{5826						bFirstResource = true;58275828						eFreeUnit = ((UnitTypes)(GET_PLAYER(ePlayer).getCivilizationInfo().getCivilizationUnits(GC.getTechInfo(eIndex)->GetFirstFreeUnitClass())));58295830						if(eFreeUnit != NULL)5831						{5832							pCapitalCity = GET_PLAYER(ePlayer).getCapitalCity();58335834							if(pCapitalCity != NULL)5835							{5836#if defined(MOD_GLOBAL_TRULY_FREE_GP)5837								pCapitalCity->GetCityCitizens()->DoSpawnGreatPerson(eFreeUnit, true, false, MOD_GLOBAL_TRULY_FREE_GP);5838#else5839								pCapitalCity->GetCityCitizens()->DoSpawnGreatPerson(eFreeUnit, true, false);5840#endif5841							}5842						}5843					}58445845					if(pkTechInfo->GetFirstFreeTechs() > 0)5846					{5847						bFirstResource = true;58485849						if(!isHuman())5850						{5851							for(int iI = 0; iI < pkTechInfo->GetFirstFreeTechs(); iI++)5852							{5853								GET_PLAYER(ePlayer).AI_chooseFreeTech();5854							}5855						}5856						else5857						{5858							strBuffer = GetLocalizedText("TXT_KEY_MISC_FIRST_TECH_CHOOSE_FREE", pkTechInfo->GetTextKey());5859							GET_PLAYER(ePlayer).chooseTech(GC.getTechInfo(eIndex)->GetFirstFreeTechs(), strBuffer.GetCString());5860						}58615862						for(int iI = 0; iI < MAX_PLAYERS; iI++)5863						{5864							const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5865							CvPlayerAI& kLoopPLayer = GET_PLAYER(eLoopPlayer);5866							if(kLoopPLayer.isAlive() && GC.getGame().getActivePlayer())5867							{5868								if(isHasMet(kLoopPLayer.getTeam()))5869								{5870									strBuffer = GetLocalizedText("TXT_KEY_MISC_SOMEONE_FIRST_TO_TECH", GET_PLAYER(ePlayer).getNameKey(), pkTechInfo->GetTextKey());5871								}5872								else5873								{5874									strBuffer = GetLocalizedText("TXT_KEY_MISC_UNKNOWN_FIRST_TO_TECH", GC.getTechInfo(eIndex)->GetTextKey());5875								}5876								DLLUI->AddMessage(0, eLoopPlayer, false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_HIGHLIGHT_TEXT")*/);5877							}5878						}58795880						strBuffer = GetLocalizedText("TXT_KEY_MISC_SOMEONE_FIRST_TO_TECH", GET_PLAYER(ePlayer).getName(), GC.getTechInfo(eIndex)->GetTextKey());5881						GC.getGame().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, ePlayer, strBuffer, -1, -1);5882					}58835884					if(bFirstResource)5885					{5886						for(int iI = 0; iI < MAX_PLAYERS; iI++)5887						{5888							const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5889							CvPlayerAI& kPlayer = GET_PLAYER(eLoopPlayer);5890							if(kPlayer.isAlive())5891							{5892								if(!(kPlayer.isHuman()))5893								{5894									if(kPlayer.GetPlayerTechs()->IsResearchingTech(eIndex))5895									{5896										kPlayer.clearResearchQueue();5897									}5898								}5899							}5900						}5901					}5902				}5903			}59045905			if(bAnnounce)5906			{5907				if(GC.getGame().isFinalInitialized()/* && !(gDLL->GetWorldBuilderMode())*/)5908				{5909					announceTechToPlayers(eIndex);59105911					// Resources discovered in a player's territory5912					for(int iI = 0; iI < GC.getMap().numPlots(); iI++)5913					{5914						CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iI);59155916						if(pLoopPlot->getTeam() == GetID() && pLoopPlot->getOwner() == GC.getGame().getActivePlayer())5917						{5918							ResourceTypes eResource = pLoopPlot->getResourceType();59195920							if(eResource != NO_RESOURCE)5921							{5922								if(GC.getResourceInfo(eResource)->getTechReveal() == eIndex && !isForceRevealedResource(eResource))5923								{5924									pCity = GC.getMap().findCity(pLoopPlot->getX(), pLoopPlot->getY(), NO_PLAYER, GetID(), false);59255926									if(pCity != NULL)5927									{5928										CvResourceInfo* pResourceInfo = GC.getResourceInfo(eResource);59295930										if(strcmp(pResourceInfo->GetType(), "RESOURCE_ARTIFACTS") == 0)5931										{5932											strBuffer = GetLocalizedText("TXT_KEY_MISC_DISCOVERED_ARTIFACTS_NEAR", pCity->getNameKey());5933										}5934										else if(strcmp(pResourceInfo->GetType(), "RESOURCE_HIDDEN_ARTIFACTS") == 0)5935										{5936											strBuffer = GetLocalizedText("TXT_KEY_MISC_DISCOVERED_HIDDEN_ARTIFACTS_NEAR", pCity->getNameKey());5937										}5938										else5939										{5940											strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_DISCOVERED_RESOURCE", pResourceInfo->GetTextKey(), pCity->getNameKey());5941										}59425943										DLLUI->AddPlotMessage(0, pLoopPlot->GetPlotIndex(), pLoopPlot->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_DISCOVERRESOURCE", MESSAGE_TYPE_INFO, GC.getResourceInfo(eResource)->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pLoopPlot->getX(), pLoopPlot->getY(), true, true*/);5944									}5945								}5946							}5947						}5948					}59495950					// Cities demand a Resource that's been newly revealed5951					CvCity* pLoopCity;5952					int iLoop;5953					PlayerTypes eLoopPlayer;5954					ResourceTypes eResourceDemanded;59555956					// Check all players on this team5957					for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)5958					{5959						eLoopPlayer = (PlayerTypes) iPlayerLoop;59605961						if(GET_PLAYER(eLoopPlayer).getTeam() == GetID() && eLoopPlayer == GC.getGame().getActivePlayer())5962						{5963							// Look at all Cities5964							for(pLoopCity = GET_PLAYER(eLoopPlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(eLoopPlayer).nextCity(&iLoop))5965							{5966								eResourceDemanded = pLoopCity->GetResourceDemanded();59675968								if(eResourceDemanded != NO_RESOURCE)5969								{5970									// Resource being demanded is revealed by this Tech5971									if(GC.getResourceInfo(eResourceDemanded)->getTechReveal() == eIndex)5972									{5973										strBuffer = GetLocalizedText("TXT_KEY_MISC_RESOURCE_DISCOVERED_CITY_DEMANDS", GC.getResourceInfo(eResourceDemanded)->GetTextKey(), pLoopCity->getNameKey());5974										DLLUI->AddCityMessage(0, pLoopCity->GetIDInfo(), eLoopPlayer, false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_DISCOVERRESOURCE", MESSAGE_TYPE_INFO, GC.getResourceInfo(eResourceDemanded)->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pLoopCity->getX(), pLoopCity->getY(), true, true*/);5975									}5976								}5977							}5978						}5979					}5980				}5981			}59825983			for(int iI = 0; iI < MAX_TEAMS; iI++)5984			{5985				const TeamTypes eLoopTeam = static_cast<TeamTypes>(iI);5986				CvTeam& kLoopTeam = GET_TEAM(eLoopTeam);5987				if(kLoopTeam.isAlive())5988				{5989					if(eLoopTeam != GetID())5990					{5991						kLoopTeam.updateTechShare(eIndex);5992					}5993				}5994			}59955996			// Cities that are owed a culture building are granted a culture building5997			CvCity* pLoopCity;5998			int iLoop;5999			PlayerTypes eLoopPlayer;60006001			// Check all players on this team6002			for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)6003			{6004				eLoopPlayer = (PlayerTypes) iPlayerLoop;60056006				if(GET_PLAYER(eLoopPlayer).getTeam() == GetID())6007				{6008					// Look at all Cities6009					for(pLoopCity = GET_PLAYER(eLoopPlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(eLoopPlayer).nextCity(&iLoop))6010					{6011						if (pLoopCity->IsOwedCultureBuilding())6012						{6013							BuildingTypes eFreeCultureBuilding = pLoopCity->ChooseFreeCultureBuilding();6014							if (eFreeCultureBuilding != NO_BUILDING)6015							{6016								pLoopCity->GetCityBuildings()->SetNumFreeBuilding(eFreeCultureBuilding, 1);6017								pLoopCity->SetOwedCultureBuilding(false);6018							}6019						}60206021#if defined(MOD_BUGFIX_FREE_FOOD_BUILDING)6022						if (pLoopCity->IsOwedFoodBuilding())6023						{6024							BuildingTypes eFreeFoodBuilding = pLoopCity->ChooseFreeFoodBuilding();6025							if (eFreeFoodBuilding != NO_BUILDING)6026							{6027								pLoopCity->GetCityBuildings()->SetNumFreeBuilding(eFreeFoodBuilding, 1);6028								pLoopCity->SetOwedFoodBuilding(false);6029							}6030						}6031#endif6032					}6033				}6034			}6035		}60366037		if(bNewValue)6038		{6039			if(bAnnounce)6040			{6041				if(GC.getGame().isFinalInitialized())6042				{6043					CvAssert(ePlayer != NO_PLAYER);6044					if(GET_PLAYER(ePlayer).isHuman())6045					{6046						if(GET_PLAYER(ePlayer).GetPlayerTechs()->IsResearch() && (GET_PLAYER(ePlayer).GetPlayerTechs()->GetCurrentResearch() == NO_TECH))6047						{6048							strBuffer = GetLocalizedText("TXT_KEY_MISC_WHAT_TO_RESEARCH_NEXT");6049							GET_PLAYER(ePlayer).chooseTech(0, strBuffer, eIndex);6050						}6051					}6052				}6053			}60546055			// espionage logic. Whenever someone gains a tech, reset the stealable techs for all other leaders6056			if(!GET_PLAYER(ePlayer).isMinorCiv() && !GET_PLAYER(ePlayer).isBarbarian())6057			{6058				CvPlayerEspionage* pEspionage = GET_PLAYER(ePlayer).GetEspionage();6059				if(pEspionage)6060				{6061					for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)6062					{6063						pEspionage->BuildStealableTechList((PlayerTypes)ui);60646065						// if the player is out of techs to steal, set their number of stealable techs to zero6066						if(pEspionage->m_aaPlayerStealableTechList[ui].size() == 0)6067						{6068							pEspionage->m_aiNumTechsToStealList[ui] = 0;6069						}6070					}6071				}6072			}6073		}60746075		// Update Happiness for all players6076		for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)6077		{6078			if(GET_PLAYER((PlayerTypes)iPlayerLoop).isAlive() && GET_PLAYER((PlayerTypes) iPlayerLoop).getTeam() == GetID())6079			{6080				GET_PLAYER((PlayerTypes) iPlayerLoop).DoUpdateHappiness();6081			}6082		}60836084		if(GC.getGame().isFinalInitialized())6085		{6086			if(GetID() == GC.getGame().getActiveTeam())6087			{6088				DLLUI->setDirty(MiscButtons_DIRTY_BIT, true);6089				DLLUI->setDirty(SelectionButtons_DIRTY_BIT, true);6090				DLLUI->setDirty(ResearchButtons_DIRTY_BIT, true);6091			}60926093			if(eIndex != NO_TECH && bNewValue)6094			{6095				bool bDontShowRewardPopup = DLLUI->IsOptionNoRewardPopups();60966097#if defined(CIV_HOST_API)6098				CivHandPopupRaised(CivHostTeamPlayers(GetID()), BUTTONPOPUP_TECH_AWARD, -1, 0, eIndex, false, false, "");hand-placed hook: PopupRaised6099#endif6100				// Notification in MP games6101#if defined(MOD_API_EXTENSIONS)6102				if(bDontShowRewardPopup || GC.getGame().isReallyNetworkMultiPlayer())6103#else6104				if(bDontShowRewardPopup || GC.getGame().isNetworkMultiPlayer())6105#endif6106				{6107					Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_YOU_DISCOVERED_TECH");6108					localizedText << pkTechInfo->GetTextKey();6109					AddNotification(NOTIFICATION_TECH_AWARD, localizedText.toUTF8(), localizedText.toUTF8(), -1, -1, 0, (int) eIndex);6110				}6111				// Popup in SP games6112				else if(GetID() == GC.getGame().getActiveTeam())6113				{6114					CvPopupInfo kPopup(BUTTONPOPUP_TECH_AWARD, GC.getGame().getActivePlayer(), 0, eIndex);6115					//kPopup.setText(localizedText.toUTF8());6116					DLLUI->AddPopup(kPopup);6117				}6118			}6119		}61206121		if(bNewValue)6122		{6123			gDLL->GameplayTechAcquired(GetID(), eIndex);6124		}6125	}6126}

Calls

Called by