Bazaar developer reference

EconomicAIHelpers::IsTestStrategy_FoundCity(EconomicAIStrategyTypes, CvPlayer *)

Defined in
CvEconomicAI.cpp, line 3597
Hook name
CivHooks::EconomicAIHelpers_IsTestStrategy_FoundCity

Hooks

static bool BeforeEconomicAIHelpers_IsTestStrategy_FoundCity(EconomicAIStrategyTypes arg0, CvPlayer* pPlayer, bool& result);static void AfterEconomicAIHelpers_IsTestStrategy_FoundCity(EconomicAIStrategyTypes arg0, CvPlayer* pPlayer, bool& result);static bool ReplaceEconomicAIHelpers_IsTestStrategy_FoundCity(bool (*original)(EconomicAIStrategyTypes, CvPlayer*), EconomicAIStrategyTypes arg0, CvPlayer* pPlayer);CivRegisterBefore<CivHooks::EconomicAIHelpers_IsTestStrategy_FoundCity>(host, &BeforeEconomicAIHelpers_IsTestStrategy_FoundCity);CivRegisterAfter<CivHooks::EconomicAIHelpers_IsTestStrategy_FoundCity>(host, &AfterEconomicAIHelpers_IsTestStrategy_FoundCity);CivRegisterReplace<CivHooks::EconomicAIHelpers_IsTestStrategy_FoundCity>(host, &ReplaceEconomicAIHelpers_IsTestStrategy_FoundCity);

Code

3594/// "Found City" Player Strategy: If there is a settler who isn't in an operation?  If so, find him a city site3595// Very dependent on the fact that the player probably won't have more than 2 settlers available at a time; needs an3596//   upgrade if that assumption is no longer true3597bool EconomicAIHelpers::IsTestStrategy_FoundCity(EconomicAIStrategyTypes /*eStrategy*/, CvPlayer* pPlayer)3598{3599	int iUnitLoop;3600	CvUnit* pLoopUnit;3601	CvUnit* pFirstSettler = 0;3602	int iLooseSettler = 0;3603	//int iStrategyWeight = 0;3604	int iFirstSettlerArea = -1;3605	int iBestArea;3606	int iSecondBestArea;3607	int iNumAreas;3608	int iArea = -1;36093610	if(GC.getGame().isOption(GAMEOPTION_ONE_CITY_CHALLENGE) && pPlayer->isHuman())3611	{3612		return false;3613	}36143615	// Never run this strategy for a human player3616	if(!pPlayer->isHuman())3617	{3618		// Look at map for loose settlers3619		for(pLoopUnit = pPlayer->firstUnit(&iUnitLoop); pLoopUnit != NULL; pLoopUnit = pPlayer->nextUnit(&iUnitLoop))3620		{3621			if(pLoopUnit != NULL)3622			{3623				if(pLoopUnit->AI_getUnitAIType() == UNITAI_SETTLE)3624				{3625					if(pLoopUnit->getArmyID() == FFreeList::INVALID_INDEX)3626					{3627						iLooseSettler++;3628						iFirstSettlerArea = pLoopUnit->getArea();3629						pFirstSettler = pLoopUnit;3630						break;3631					}3632				}3633			}3634		}36353636		// Don't run this strategy if have 0 cities, in that case we just want to drop down a city wherever we happen to be3637		if (iLooseSettler && pPlayer->getNumCities() >= 1)3638		{3639			iNumAreas = pPlayer->GetBestSettleAreas(pPlayer->GetEconomicAI()->GetMinimumSettleFertility(), iBestArea, iSecondBestArea);3640			if(iNumAreas == 0)3641			{3642				return false;3643			}36443645			bool bCanEmbark = GET_TEAM(pPlayer->getTeam()).canEmbark() || pPlayer->GetPlayerTraits()->IsEmbarkedAllWater();3646			bool bWantEscort = false;36473648			// CASE 1: we can go offshore3649			if (bCanEmbark && (pPlayer->getNumCities() > 1))3650			{3651				int iRandArea = GC.getGame().getJonRandNum(6, "Randomly choose an area to settle");36523653				if (iRandArea <= 1) // this is "pick best tile I know ignoring what area it is part of", in the early game this is usually the start landmass3654				{3655					iArea = -1;3656					CvPlot* pPlot = pPlayer->GetBestSettlePlot(pFirstSettler, bWantEscort, -1);3657					if (!pPlot)3658					{3659						bWantEscort = true;3660					}3661				}3662				else if (iRandArea == 2) // least likely3663				{3664					iArea = iSecondBestArea;3665					bWantEscort = IsAreaSafeForQuickColony(iArea, pPlayer);3666				}3667				else // this is as likely as the other options combined3668				{3669					iArea = iBestArea;3670					bWantEscort = IsAreaSafeForQuickColony(iArea, pPlayer);3671				}36723673				if (bWantEscort)3674				{3675					pPlayer->addAIOperation(AI_OPERATION_FOUND_CITY, NO_PLAYER, iArea);3676				}3677				else3678				{3679					pPlayer->addAIOperation(AI_OPERATION_QUICK_COLONIZE, NO_PLAYER, iArea);3680				}36813682				return true;3683			}3684			else // we can't embark yet3685			{3686				pPlayer->addAIOperation(AI_OPERATION_FOUND_CITY, NO_PLAYER, iBestArea);3687				return true;3688			}3689		}3690	}36913692	return false;3693}

Calls

Called by