Bazaar developer reference

CvCityStrategyAI::DoTurn()

Defined in
CvCityStrategyAI.cpp, line 1275
Class
CvCityStrategyAI
Hook name
CivHooks::CvCityStrategyAI_DoTurn
Lua events
GameEvents.CityStrategyCanActivate

Hooks

static bool BeforeCvCityStrategyAI_DoTurn(CvCityStrategyAI* self);static void AfterCvCityStrategyAI_DoTurn(CvCityStrategyAI* self);static void ReplaceCvCityStrategyAI_DoTurn(void (*original)(CvCityStrategyAI*), CvCityStrategyAI* self);CivRegisterBefore<CivHooks::CvCityStrategyAI_DoTurn>(host, &BeforeCvCityStrategyAI_DoTurn);CivRegisterAfter<CivHooks::CvCityStrategyAI_DoTurn>(host, &AfterCvCityStrategyAI_DoTurn);CivRegisterReplace<CivHooks::CvCityStrategyAI_DoTurn>(host, &ReplaceCvCityStrategyAI_DoTurn);

Code

1274/// Called every turn to see what CityStrategies this City should using (or not)1275void CvCityStrategyAI::DoTurn()1276{1277	AI_PERF_FORMAT("City-AI-perf.csv", ("CvCityStrategyAI::DoTurn, Turn %03d, %s, %s", GC.getGame().getElapsedGameTurns(), m_pCity->GetPlayer()->getCivilizationShortDescription(), m_pCity->getName().c_str()) );12781279	int iCityStrategiesLoop = 0;12801281	// Loop through all CityStrategies1282	for(iCityStrategiesLoop = 0; iCityStrategiesLoop < GetAICityStrategies()->GetNumAICityStrategies(); iCityStrategiesLoop++)1283	{1284		AICityStrategyTypes eCityStrategy = (AICityStrategyTypes) iCityStrategiesLoop;1285		CvAICityStrategyEntry* pCityStrategy = GetAICityStrategies()->GetEntry(iCityStrategiesLoop);12861287		// Minor Civs can't run some Strategies1288		if(GET_PLAYER(GetCity()->getOwner()).isMinorCiv() && pCityStrategy->IsNoMinorCivs())1289		{1290			continue;1291		}12921293		bool bTestCityStrategyStart = true;12941295		// Do we already have this CityStrategy adopted?1296		if(IsUsingCityStrategy(eCityStrategy))1297		{1298			bTestCityStrategyStart = false;1299		}1300		else1301		{1302			// Has the prereq Tech necessary?1303			if(pCityStrategy->GetTechPrereq() != NO_TECH && !GET_TEAM(GetCity()->getTeam()).GetTeamTechs()->HasTech((TechTypes) pCityStrategy->GetTechPrereq()))1304			{1305				bTestCityStrategyStart = false;1306			}13071308			// Has the Tech which obsoletes this Strategy?1309			if(bTestCityStrategyStart && pCityStrategy->GetTechObsolete() != NO_TECH && GET_TEAM(GetCity()->getTeam()).GetTeamTechs()->HasTech((TechTypes) pCityStrategy->GetTechObsolete()))1310			{1311				bTestCityStrategyStart = false;1312			}1313		}13141315		bool bTestCityStrategyEnd = false;13161317		// CityStrategy is active, check to see if we should even try to disable it1318		if(IsUsingCityStrategy(eCityStrategy))1319		{1320			// If Strategy is Permanent we can't ever turn it off1321			if(!pCityStrategy->IsPermanent())1322			{1323				if(pCityStrategy->GetCheckTriggerTurnCount() > 0)1324				{1325					// Is it a turn where we want to check to see if this Strategy is maintained?1326					if((GC.getGame().getGameTurn() - GetTurnCityStrategyAdopted(eCityStrategy)) % pCityStrategy->GetCheckTriggerTurnCount() == 0)1327					{1328						bTestCityStrategyEnd = true;1329					}1330				}13311332				if(bTestCityStrategyEnd && pCityStrategy->GetMinimumNumTurnsExecuted() > 0)1333				{1334					// Has the minimum # of turns passed for this Strategy?1335					if(GC.getGame().getGameTurn() < GetTurnCityStrategyAdopted(eCityStrategy) + pCityStrategy->GetMinimumNumTurnsExecuted())1336					{1337						bTestCityStrategyEnd = false;1338					}1339				}1340			}1341		}13421343		// Check CityStrategy Triggers1344		// Functionality and existence of specific CityStrategies is hardcoded here, but data is stored in XML so it's easier to modify13451346		if(bTestCityStrategyStart || bTestCityStrategyEnd)1347		{1348			bool bStrategyShouldBeActive = false;13491350			// Has the Tech which obsoletes this Strategy? If so, Strategy should be deactivated regardless of other factors1351			if(pCityStrategy->GetTechObsolete() != NO_TECH && GET_TEAM(GetCity()->getTeam()).GetTeamTechs()->HasTech((TechTypes) pCityStrategy->GetTechObsolete()))1352			{1353				bStrategyShouldBeActive = false;1354			}1355			// Strategy isn't obsolete, so test triggers as normal1356			else1357			{1358				CvString strStrategyName = (CvString) pCityStrategy->GetType();13591360				// Check all of the CityStrategy Triggers1361				if(strStrategyName == "AICITYSTRATEGY_TINY_CITY")1362					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_TinyCity(GetCity());1363				else if(strStrategyName == "AICITYSTRATEGY_SMALL_CITY")1364					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_SmallCity(GetCity());1365				else if(strStrategyName == "AICITYSTRATEGY_MEDIUM_CITY")1366					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_MediumCity(GetCity());1367				else if(strStrategyName == "AICITYSTRATEGY_LARGE_CITY")1368					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_LargeCity(GetCity());1369				else if(strStrategyName == "AICITYSTRATEGY_LANDLOCKED")1370					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_Landlocked(GetCity());1371				else if(strStrategyName == "AICITYSTRATEGY_NEED_TILE_IMPROVERS")1372					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedTileImprovers(eCityStrategy, GetCity());1373				else if(strStrategyName == "AICITYSTRATEGY_WANT_TILE_IMPROVERS")1374					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_WantTileImprovers(eCityStrategy, GetCity());1375				else if(strStrategyName == "AICITYSTRATEGY_ENOUGH_TILE_IMPROVERS")1376					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_EnoughTileImprovers(eCityStrategy, GetCity());1377				else if(strStrategyName == "AICITYSTRATEGY_NEED_NAVAL_GROWTH")1378					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedNavalGrowth(eCityStrategy, GetCity());1379				else if(strStrategyName == "AICITYSTRATEGY_NEED_NAVAL_TILE_IMPROVEMENT")1380					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedNavalTileImprovement(GetCity());1381				else if(strStrategyName == "AICITYSTRATEGY_ENOUGH_NAVAL_TILE_IMPROVEMENT")1382					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_EnoughNavalTileImprovement(GetCity());1383				else if(strStrategyName == "AICITYSTRATEGY_NEED_IMPROVEMENT_FOOD")1384					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedImprovement(GetCity(), YIELD_FOOD);1385				else if(strStrategyName == "AICITYSTRATEGY_NEED_IMPROVEMENT_PRODUCTION")1386					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedImprovement(GetCity(), YIELD_PRODUCTION);1387				else if(strStrategyName == "AICITYSTRATEGY_HAVE_TRAINING_FACILITY")1388					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_HaveTrainingFacility(GetCity());1389				else if(strStrategyName == "AICITYSTRATEGY_CAPITAL_NEED_SETTLER")1390					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_CapitalNeedSettler(eCityStrategy, GetCity());1391				else if(strStrategyName == "AICITYSTRATEGY_CAPITAL_UNDER_THREAT")1392					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_CapitalUnderThreat(GetCity());1393				else if(strStrategyName == "AICITYSTRATEGY_FIRST_CULTURE_BUILDING_EMERGENCY")1394					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstCultureBuildingEmergency(GetCity());1395				else if(strStrategyName == "AICITYSTRATEGY_FIRST_CULTURE_BUILDING")1396					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstCultureBuilding(GetCity());1397				else if(strStrategyName == "AICITYSTRATEGY_FIRST_SCIENCE_BUILDING")1398					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstScienceBuilding(GetCity());1399				else if(strStrategyName == "AICITYSTRATEGY_FIRST_GOLD_BUILDING")1400					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstGoldBuilding(GetCity());1401				else if(strStrategyName == "AICITYSTRATEGY_FIRST_FAITH_BUILDING")1402					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstFaithBuilding(GetCity());1403				else if(strStrategyName == "AICITYSTRATEGY_FIRST_PRODUCTION_BUILDING")1404					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_FirstProductionBuilding(GetCity());1405				else if(strStrategyName == "AICITYSTRATEGY_UNDER_BLOCKADE")1406					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_UnderBlockade(GetCity());1407				else if(strStrategyName == "AICITYSTRATEGY_IS_PUPPET")1408					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_IsPuppet(GetCity());1409				else if(strStrategyName == "AICITYSTRATEGY_MEDIUM_CITY_HIGH_DIFFICULTY")1410					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_MediumCityHighDifficulty(GetCity());1411				else if(strStrategyName == "AICITYSTRATEGY_ORIGINAL_CAPITAL")1412					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_OriginalCapital(GetCity());14131414				else if(strStrategyName == "AICITYSTRATEGY_RIVER_CITY")1415					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_RiverCity(GetCity());1416				else if(strStrategyName == "AICITYSTRATEGY_MOUNTAIN_CITY")1417					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_MountainCity(GetCity());1418				else if(strStrategyName == "AICITYSTRATEGY_FOREST_CITY")1419					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_ForestCity(GetCity());1420				else if(strStrategyName == "AICITYSTRATEGY_HILL_CITY")1421					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_HillCity(GetCity());1422				else if(strStrategyName == "AICITYSTRATEGY_JUNGLE_CITY")1423					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_JungleCity(GetCity());1424				else if(strStrategyName == "AICITYSTRATEGY_COAST_CITY")1425					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_CoastCity(GetCity());1426				else if(strStrategyName == "AICITYSTRATEGY_MANY_TECHS_STOLEN")1427					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_ManyTechsStolen(GetCity());1428				else if(strStrategyName == "AICITYSTRATEGY_KEY_SCIENCE_CITY")1429					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_KeyScienceCity(GetCity());1430				else if(strStrategyName == "AICITYSTRATEGY_GOOD_GP_CITY")1431					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_GoodGPCity(GetCity());1432				else if(strStrategyName == "AICITYSTRATEGY_NEED_INTERNATIONAL_LAND_TRADE_ROUTE")1433					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedInternationalTradeRoute(GetCity(), DOMAIN_LAND);1434				else if(strStrategyName == "AICITYSTRATEGY_NO_NEED_INTERNATIONAL_LAND_TRADE_ROUTE")1435					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NoNeedInternationalTradeRoute(GetCity(), DOMAIN_LAND);1436				else if(strStrategyName == "AICITYSTRATEGY_NEED_INTERNATIONAL_SEA_TRADE_ROUTE")1437					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedInternationalTradeRoute(GetCity(), DOMAIN_SEA);1438				else if(strStrategyName == "AICITYSTRATEGY_NO_NEED_INTERNATIONAL_SEA_TRADE_ROUTE")1439					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NoNeedInternationalTradeRoute(GetCity(), DOMAIN_SEA);1440				else if(strStrategyName == "AICITYSTRATEGY_INTERNATIONAL_TRADE_DESTINATION")1441					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_IsInternationalTradeDestination(GetCity());1442				else if(strStrategyName == "AICITYSTRATEGY_INTERNATIONAL_TRADE_ORIGIN")1443					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_IsInternationalTradeOrigin(GetCity());1444				else if(strStrategyName == "AICITYSTRATEGY_NEED_CULTURE_BUILDING")1445					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedCultureBuilding(GetCity());1446				else if(strStrategyName == "AICITYSTRATEGY_NEED_TOURISM_BUILDING")1447					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_NeedTourismBuilding(GetCity());1448				else if(strStrategyName == "AICITYSTRATEGY_GOOD_AIRLIFT_CITY")1449					bStrategyShouldBeActive = CityStrategyAIHelpers::IsTestCityStrategy_GoodAirliftCity(GetCity());14501451				// Check Lua hook1452				ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();1453				if(pkScriptSystem && bStrategyShouldBeActive)1454				{1455					CvLuaArgsHandle args;1456					args->Push(iCityStrategiesLoop);1457					args->Push(GetCity()->getOwner());1458					args->Push(GetCity()->GetID());14591460					// Attempt to execute the game events.1461					// Will return false if there are no registered listeners.1462					bool bResult = false;1463					if(LuaSupport::CallTestAll(pkScriptSystem, "CityStrategyCanActivate", args.get(), bResult))1464					{1465						// Check the result.1466						if(bResult == false)1467						{1468							bStrategyShouldBeActive = false;1469						}1470					}1471				}1472			}14731474			// This variable keeps track of whether or not we should be doing something (i.e. Strategy is active now but should be turned off, OR Strategy is inactive and should be enabled)1475			bool bAdoptOrEndStrategy = false;14761477			// Strategy should be on, and if it's not, turn it on1478			if(bStrategyShouldBeActive)1479			{1480				if(bTestCityStrategyStart)1481				{1482					bAdoptOrEndStrategy = true;1483				}1484				else if(bTestCityStrategyEnd)1485				{1486					bAdoptOrEndStrategy = false;1487				}1488			}1489			// Strategy should be off, and if it's not, turn it off1490			else1491			{1492				if(bTestCityStrategyStart)1493				{1494					bAdoptOrEndStrategy = false;1495				}1496				else if(bTestCityStrategyEnd)1497				{1498					bAdoptOrEndStrategy = true;1499				}1500			}15011502			// Flavor propagation1503			if(bAdoptOrEndStrategy)1504			{1505				int iFlavorLoop;15061507				// We should adopt this CityStrategy1508				if(bTestCityStrategyStart)1509				{1510					SetUsingCityStrategy(eCityStrategy, true);15111512					const int iFlavorMinValue = /*-1000*/ GC.getFLAVOR_MIN_VALUE();1513					const int iFlavorMaxValue = /*1000*/ GC.getFLAVOR_MAX_VALUE();15141515					const int iNumFlavors = GC.getNumFlavorTypes();1516					for(iFlavorLoop = 0; iFlavorLoop < iNumFlavors; iFlavorLoop++)1517					{1518						if(pCityStrategy->GetFlavorValue(iFlavorLoop) != 0)1519						{1520							m_piLatestFlavorValues[iFlavorLoop] += pCityStrategy->GetFlavorValue(iFlavorLoop);15211522							if(m_piLatestFlavorValues[iFlavorLoop] < iFlavorMinValue)1523							{1524								m_piLatestFlavorValues[iFlavorLoop] = iFlavorMinValue;1525							}1526							else if(m_piLatestFlavorValues[iFlavorLoop] > iFlavorMaxValue)1527							{1528								m_piLatestFlavorValues[iFlavorLoop] = iFlavorMaxValue;1529							}15301531							LogFlavors((FlavorTypes) iFlavorLoop);1532						}1533					}15341535					FlavorUpdate();1536				}1537				// End the CityStrategy1538				else if(bTestCityStrategyEnd)1539				{1540					SetUsingCityStrategy(eCityStrategy, false);15411542					const int iFlavorMinValue = /*-1000*/ GC.getFLAVOR_MIN_VALUE();1543					const int iFlavorMaxValue = /*1000*/ GC.getFLAVOR_MAX_VALUE();15441545					const int iNumFlavors = GC.getNumFlavorTypes();1546					for(iFlavorLoop = 0; iFlavorLoop < iNumFlavors; iFlavorLoop++)1547					{1548						if(pCityStrategy->GetFlavorValue(iFlavorLoop) != 0)1549						{1550							m_piLatestFlavorValues[iFlavorLoop] -= pCityStrategy->GetFlavorValue(iFlavorLoop);15511552							if(m_piLatestFlavorValues[iFlavorLoop] < iFlavorMinValue)1553							{1554								m_piLatestFlavorValues[iFlavorLoop] = iFlavorMinValue;1555							}1556							else if(m_piLatestFlavorValues[iFlavorLoop] > iFlavorMaxValue)1557							{1558								m_piLatestFlavorValues[iFlavorLoop] = iFlavorMaxValue;1559							}15601561							LogFlavors((FlavorTypes) iFlavorLoop);1562						}1563					}15641565					FlavorUpdate();1566				}1567			}1568		}1569	}1570}

Calls

Called by