Bazaar developer reference

CvCitySiteEvaluator::CanFound(CvPlot *, const CvPlayer *, bool) const

Defined in
CvSiteEvaluationClasses.cpp, line 59
Class
CvCitySiteEvaluator
Hook name
CivHooks::CvCitySiteEvaluator_CanFound
Lua events
GameEvents.PlayerCanFoundCity

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}

Calls

Called by