Bazaar developer reference

CvEspionageAI::DoTurn()

Defined in
CvEspionageClasses.cpp, line 4723
Class
CvEspionageAI
Hook name
CivHooks::CvEspionageAI_DoTurn

Hooks

static bool BeforeCvEspionageAI_DoTurn(CvEspionageAI* self);static void AfterCvEspionageAI_DoTurn(CvEspionageAI* self);static void ReplaceCvEspionageAI_DoTurn(void (*original)(CvEspionageAI*), CvEspionageAI* self);CivRegisterBefore<CivHooks::CvEspionageAI_DoTurn>(host, &BeforeCvEspionageAI_DoTurn);CivRegisterAfter<CivHooks::CvEspionageAI_DoTurn>(host, &AfterCvEspionageAI_DoTurn);CivRegisterReplace<CivHooks::CvEspionageAI_DoTurn>(host, &ReplaceCvEspionageAI_DoTurn);

Code

4721/// Called every turn to see what to do with their spies4722/// To be called after CvEspionagePlayer::DoTurn is run4723void CvEspionageAI::DoTurn()4724{4725	// no humans, minor civs, or barbarians allowed!4726	if(m_pPlayer->isHuman() || m_pPlayer->isMinorCiv() || m_pPlayer->isBarbarian())4727	{4728		return;4729	}47304731	AI_PERF_FORMAT("AI-perf.csv", ("Espionage AI, Turn %03d, %s", GC.getGame().getElapsedGameTurns(), m_pPlayer->getCivilizationShortDescription()) );47324733	StealTechnology();4734	UpdateCivOutOfTechTurn();4735	AttemptCoups();47364737	// mark these spies available to reassign4738	EvaluateUnassignedSpies();4739	EvaluateDefensiveSpies();4740	EvaluateDiplomatSpies();47414742	// when the UN countdown starts, mark all spies to be reassigned4743	if (!m_bUNCountdownStarted && GC.getGame().IsUnitedNationsActive())4744	{4745		m_bUNCountdownStarted = true;4746		CvPlayerEspionage* pEspionage = m_pPlayer->GetEspionage();4747		for (uint ui = 0; ui < pEspionage->m_aSpyList.size(); ui++)4748		{4749			CvEspionageSpy* pSpy = &(pEspionage->m_aSpyList[ui]);4750			// don't process dead spies4751#if defined(MOD_API_ESPIONAGE)4752			if (pSpy->m_eSpyState == SPY_STATE_DEAD || pSpy->m_eSpyState == SPY_STATE_TERMINATED)4753#else4754			if (pSpy->m_eSpyState == SPY_STATE_DEAD)4755#endif4756			{4757				continue;4758			}47594760			pSpy->m_bEvaluateReassignment = true;4761			if(GC.getLogging())4762			{4763				CvString strMsg;4764				strMsg.Format("Re-eval: UN constructed/reassign, %d,", ui);4765#if defined(MOD_BUGFIX_SPY_NAMES)4766				strMsg += GetLocalizedText(pSpy->GetSpyName(m_pPlayer));4767#else4768				strMsg += GetLocalizedText(m_pPlayer->getCivilizationInfo().getSpyNames(pSpy->m_iName));4769#endif4770				pEspionage->LogEspionageMsg(strMsg);4771			}4772		}4773	}47744775	int iTargetOffensiveSpies = 0;4776	int iTargetDefensiveSpies = 0;4777	int iTargetCityStateSpies = 0;4778	int iTargetDiplomatSpies  = 0;4779	FindTargetSpyNumbers(&iTargetOffensiveSpies, &iTargetDefensiveSpies, &iTargetCityStateSpies, &iTargetDiplomatSpies);47804781	std::vector<CvCity*> apCityDiplomat;4782	std::vector<CvCity*> apCityOffense;4783	std::vector<CvCity*> apCityDefense;4784	std::vector<CvCity*> apCityMinor;4785	4786	if (iTargetDiplomatSpies > 0)4787	{4788		BuildDiplomatCityList(apCityDiplomat);4789	}47904791	if (iTargetOffensiveSpies > 0)4792	{4793		BuildOffenseCityList(apCityOffense);4794	}47954796	if (iTargetDefensiveSpies > 0)4797	{4798		BuildDefenseCityList(apCityDefense);4799	}48004801	if (iTargetCityStateSpies > 0)4802	{4803		BuildMinorCityList(apCityMinor);4804	}48054806	CvPlayerEspionage* pEspionage = m_pPlayer->GetEspionage();48074808	// loop through spies an extract all that aren't in a correct location4809	int iCorrectlyAssignedDiplomatSpies = 0;4810	int iCorrectlyAssignedDefenseSpies = 0;4811	int iCorrectlyAssignedOffenseSpies = 0;4812	int iCorrectlyAssignedCityStateSpies = 0;48134814	for(uint uiSpy = 0; uiSpy < pEspionage->m_aSpyList.size(); uiSpy++)4815	{4816		// dead spies are not processed4817#if defined(MOD_API_ESPIONAGE)4818		if(pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_DEAD || pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_TERMINATED)4819#else4820		if(pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_DEAD)4821#endif4822		{4823			continue;4824		}48254826		CvCity* pSpyCity = pEspionage->GetCityWithSpy(uiSpy);48274828		// spies that are not assigned don't need to be processed4829		if(!pSpyCity)4830		{4831			continue;4832		}48334834		bool bAlreadyAssigned = false;48354836		// diplomat cities4837		if (!bAlreadyAssigned)4838		{4839			// see if the spy is in any of the diplomat cities4840			for(int iDiplomatIndex = 0; iDiplomatIndex < iTargetDiplomatSpies && iDiplomatIndex < (int)apCityDiplomat.size(); iDiplomatIndex++)4841			{4842				if(pSpyCity == apCityDiplomat[iDiplomatIndex] && pEspionage->m_aSpyList[uiSpy].m_bIsDiplomat)4843				{4844					iCorrectlyAssignedDiplomatSpies++;4845					bAlreadyAssigned = true;4846					break;4847				}4848			}4849		}48504851		// defensive cities4852		if(!bAlreadyAssigned)4853		{4854			// see if the spy is in any of the defensive cities4855			for(int iDefensiveIndex = 0; iDefensiveIndex < iTargetDefensiveSpies && iDefensiveIndex < (int)apCityDefense.size(); iDefensiveIndex++)4856			{4857				if(pSpyCity == apCityDefense[iDefensiveIndex])4858				{4859					iCorrectlyAssignedDefenseSpies++;4860					bAlreadyAssigned = true;4861					break;4862				}4863			}4864		}48654866		// offensive cities4867		if(!bAlreadyAssigned)4868		{4869			// see if the spy is in any of the offensive cities4870			for(int iOffensiveIndex = 0; iOffensiveIndex < iTargetOffensiveSpies && iOffensiveIndex < (int)apCityOffense.size(); iOffensiveIndex++)4871			{4872				if(pSpyCity == apCityOffense[iOffensiveIndex] && !pEspionage->m_aSpyList[uiSpy].m_bIsDiplomat)4873				{4874					iCorrectlyAssignedOffenseSpies++;4875					bAlreadyAssigned = true;4876					break;4877				}4878			}4879		}48804881		// city-states4882		if (!bAlreadyAssigned)4883		{4884			// see if the spy is in any of the city-states4885			for (int iCityStateIndex = 0; iCityStateIndex < iTargetCityStateSpies && iCityStateIndex < (int)apCityMinor.size(); iCityStateIndex++)4886			{4887				if (pSpyCity == apCityMinor[iCityStateIndex])4888				{4889					iCorrectlyAssignedCityStateSpies++;4890					bAlreadyAssigned = true;4891					break;4892				}4893			}4894		}48954896		// if the spy is flagged to be reassigned4897		if (pEspionage->m_aSpyList[uiSpy].m_bEvaluateReassignment)4898		{4899			// if the spy is already assigned to a correct city, mark them as assigned4900			if (bAlreadyAssigned)4901			{4902				pEspionage->m_aSpyList[uiSpy].m_bEvaluateReassignment = false;		4903			}4904			else4905			{4906				// move spy out of target city4907				pEspionage->MoveSpyTo(NULL, uiSpy, false);4908			}4909		}4910	}49114912	// go through spy list again and put spies in locations where they are needed4913	for(uint uiSpy = 0; uiSpy < pEspionage->m_aSpyList.size(); uiSpy++)4914	{4915		// dead spies are not processed4916#if defined(MOD_API_ESPIONAGE)4917		if(pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_DEAD || pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_TERMINATED)4918#else4919		if(pEspionage->m_aSpyList[uiSpy].m_eSpyState == SPY_STATE_DEAD)4920#endif4921		{4922			continue;4923		}49244925		// if this spy is not to be re-evaluated4926		if (!pEspionage->m_aSpyList[uiSpy].m_bEvaluateReassignment)4927		{4928			continue;4929		}49304931		// we're assigning the spy now, so reset their evaluate statement4932		pEspionage->m_aSpyList[uiSpy].m_bEvaluateReassignment = false;49334934		CvCity* pSpyCity = pEspionage->GetCityWithSpy(uiSpy);49354936		// spies that are already are in a city are assumed to be in the right place4937		if(pSpyCity)4938		{4939			continue;4940		}49414942		// if we have remaining defensive spies to assign4943		if(iTargetDiplomatSpies > iCorrectlyAssignedDiplomatSpies)4944		{4945			// walk through cities and an open spot for the spy4946			for(int iCity = 0; iCity < iTargetDiplomatSpies && iCity < (int)apCityDiplomat.size(); iCity++)4947			{4948				CvCity* pCity = apCityDiplomat[iCity];49494950				// if a spy is already in this city, skip it4951				if(pEspionage->GetSpyIndexInCity(pCity) != -1)4952				{4953					continue;4954				}49554956				pEspionage->MoveSpyTo(pCity, uiSpy, true);4957				iCorrectlyAssignedDefenseSpies++;4958				break;4959			}4960		}4961		// if we have remaining defensive spies to assign4962		else if(iTargetDefensiveSpies > iCorrectlyAssignedDefenseSpies)4963		{4964			// walk through cities and an open spot for the spy4965			for(int iCity = 0; iCity < iTargetDefensiveSpies && iCity < (int)apCityDefense.size(); iCity++)4966			{4967				CvCity* pCity = apCityDefense[iCity];49684969				// if a spy is already in this city, skip it4970				if(pEspionage->GetSpyIndexInCity(pCity) != -1)4971				{4972					continue;4973				}49744975				pEspionage->MoveSpyTo(pCity, uiSpy, false);4976				iCorrectlyAssignedDefenseSpies++;4977				break;4978			}4979		}4980		// if we have remaining offensive spies to assign4981		else if(iTargetOffensiveSpies > iCorrectlyAssignedOffenseSpies)4982		{4983			for(int iCity = 0; iCity < iTargetOffensiveSpies && iCity < (int)apCityOffense.size(); iCity++)4984			{4985				CvCity* pCity = apCityOffense[iCity];49864987				// if a spy is already in this city, skip it4988				if(pEspionage->GetSpyIndexInCity(pCity) != -1)4989				{4990					continue;4991				}49924993				pEspionage->MoveSpyTo(pCity, uiSpy, false);4994				iCorrectlyAssignedOffenseSpies++;4995				break;4996			}4997		}4998		// if we have remaining city-state spies to assign4999		else if (iTargetCityStateSpies > iCorrectlyAssignedCityStateSpies)5000		{5001			for (int iCity = 0; iCity < iTargetCityStateSpies && iCity < (int)apCityMinor.size(); iCity++)5002			{5003				CvCity* pCity = apCityMinor[iCity];50045005				// if a spy is already in this city, skip it5006				if (pEspionage->GetSpyIndexInCity(pCity) != -1)5007				{5008					continue;5009				}50105011				pEspionage->MoveSpyTo(pCity, uiSpy, false);5012				iCorrectlyAssignedCityStateSpies++;5013				break;5014			}5015		}5016	}5017}

Calls

Called by