Hooks
static bool BeforeCvCitySiteEvaluator_CanFound(const CvCitySiteEvaluator* self, CvPlot* pPlot, const CvPlayer* pPlayer, bool bTestVisible, bool& result);static void AfterCvCitySiteEvaluator_CanFound(const CvCitySiteEvaluator* self, CvPlot* pPlot, const CvPlayer* pPlayer, bool bTestVisible, bool& result);static bool ReplaceCvCitySiteEvaluator_CanFound(bool (*original)(const CvCitySiteEvaluator*, CvPlot*, const CvPlayer*, bool), const CvCitySiteEvaluator* self, CvPlot* pPlot, const CvPlayer* pPlayer, bool bTestVisible);CivRegisterBefore<CivHooks::CvCitySiteEvaluator_CanFound>(host, &BeforeCvCitySiteEvaluator_CanFound);CivRegisterAfter<CivHooks::CvCitySiteEvaluator_CanFound>(host, &AfterCvCitySiteEvaluator_CanFound);CivRegisterReplace<CivHooks::CvCitySiteEvaluator_CanFound>(host, &ReplaceCvCitySiteEvaluator_CanFound);
Code
58/// Is it valid for this player to found a city here?59bool CvCitySiteEvaluator::CanFound(CvPlot* pPlot, const CvPlayer* pPlayer, bool bTestVisible) const60{61 CvAssert(pPlot);62 if(!pPlot)63 return false;6465 CvPlot* pLoopPlot(NULL);66 bool bValid(false);67 int iRange(0), iDX(0), iDY(0);6869 // Used to have a Python hook: CANNOT_FOUND_CITY_CALLBACK7071 if(GC.getGame().isFinalInitialized())72 {73 if(GC.getGame().isOption(GAMEOPTION_ONE_CITY_CHALLENGE) && pPlayer && pPlayer->isHuman())74 {75 if(pPlayer->getNumCities() > 0)76 {77 return false;78 }79 }80 }8182 if(pPlot->isImpassable() || pPlot->isMountain())83 {84 return false;85 }8687 if(pPlot->getFeatureType() != NO_FEATURE)88 {89 if(GC.getFeatureInfo(pPlot->getFeatureType())->isNoCity())90 {91 return false;92 }93 }9495 if(pPlayer)96 {97 if(pPlot->isOwned() && (pPlot->getOwner() != pPlayer->GetID()))98 {99 return false;100 }101 }102103 CvTerrainInfo* pTerrainInfo = GC.getTerrainInfo(pPlot->getTerrainType());104105 if(!bValid)106 {107 if(pTerrainInfo->isFound())108 {109 bValid = true;110 }111 }112113 if(!bValid)114 {115 if(pTerrainInfo->isFoundCoast())116 {117 if(pPlot->isCoastalLand())118 {119 bValid = true;120 }121 }122 }123124 if(!bValid)125 {126 if(pTerrainInfo->isFoundFreshWater())127 {128 if(pPlot->isFreshWater())129 {130 bValid = true;131 }132 }133 }134135 // Used to have a Python hook: CAN_FOUND_CITIES_ON_WATER_CALLBACK136137 if(pPlot->isWater())138 {139 return false;140 }141142 if(!bValid)143 {144 return false;145 }146147 if(!bTestVisible)148 {149 // look at same land mass150 iRange = GC.getMIN_CITY_RANGE();151152 for(iDX = -(iRange); iDX <= iRange; iDX++)153 {154 for(iDY = -(iRange); iDY <= iRange; iDY++)155 {156 pLoopPlot = plotXYWithRangeCheck(pPlot->getX(), pPlot->getY(), iDX, iDY, iRange);157158 if(pLoopPlot != NULL)159 {160 if(pLoopPlot->isCity())161 {162 if(pLoopPlot->getLandmass() == pPlot->getLandmass())163 {164 return false;165 }166 else if(hexDistance(iDX, iDY) < iRange) // one less for off shore167 {168 return false;169 }170 }171 }172 }173 }174 }175176#if defined(MOD_EVENTS_CITY_FOUNDING)177 if (MOD_EVENTS_CITY_FOUNDING) {178 if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_PlayerCanFoundCity, pPlayer->GetID(), pPlot->getX(), pPlot->getY()) == GAMEEVENTRETURN_FALSE) {179 return false;180 }181 }182#endif183 184 return true;185}