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}