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}