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}