Bazaar developer reference

CvCity::isValidBuildingLocation(BuildingTypes) const

Defined in
CvCity.cpp, line 15755
Class
CvCity
Hook name
CivHooks::CvCity_isValidBuildingLocation

Hooks

static bool BeforeCvCity_isValidBuildingLocation(const CvCity* self, BuildingTypes eBuilding, bool& result);static void AfterCvCity_isValidBuildingLocation(const CvCity* self, BuildingTypes eBuilding, bool& result);static bool ReplaceCvCity_isValidBuildingLocation(bool (*original)(const CvCity*, BuildingTypes), const CvCity* self, BuildingTypes eBuilding);CivRegisterBefore<CivHooks::CvCity_isValidBuildingLocation>(host, &BeforeCvCity_isValidBuildingLocation);CivRegisterAfter<CivHooks::CvCity_isValidBuildingLocation>(host, &AfterCvCity_isValidBuildingLocation);CivRegisterReplace<CivHooks::CvCity_isValidBuildingLocation>(host, &ReplaceCvCity_isValidBuildingLocation);

Code

15755bool CvCity::isValidBuildingLocation(BuildingTypes eBuilding) const15756{15757	VALIDATE_OBJECT1575815759	CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);15760	if(pkBuildingInfo == NULL)15761		return false;1576215763	// Requires coast15764	if(pkBuildingInfo->IsWater())15765	{15766		if(!isCoastal(pkBuildingInfo->GetMinAreaSize()))15767			return false;15768	}1576915770	// Requires River15771	if(pkBuildingInfo->IsRiver())15772	{15773		if(!(plot()->isRiver()))15774			return false;15775	}1577615777	// Requires Fresh Water15778	if(pkBuildingInfo->IsFreshWater())15779	{15780		if(!plot()->isFreshWater())15781			return false;15782	}1578315784	// Requires adjacent Mountain15785	if(pkBuildingInfo->IsMountain())15786	{15787		bool bFoundMountain = false;1578815789		CvPlot* pAdjacentPlot;15790		for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; iDirectionLoop++)15791		{15792			pAdjacentPlot = plotDirection(getX(), getY(), ((DirectionTypes)iDirectionLoop));1579315794			if(pAdjacentPlot != NULL)15795			{15796				if(pAdjacentPlot->isMountain())15797				{15798					bFoundMountain = true;15799					break;15800				}15801			}15802		}1580315804		if(!bFoundMountain)15805			return false;15806	}1580715808	// Requires nearby Mountain (within 2 tiles)15809	if(pkBuildingInfo->IsNearbyMountainRequired())15810	{15811		bool bFoundMountain = false;1581215813		const int iMountainRange = 2;15814		CvPlot* pLoopPlot;1581515816		for(int iDX = -iMountainRange; iDX <= iMountainRange; iDX++)15817		{15818			for(int iDY = -iMountainRange; iDY <= iMountainRange; iDY++)15819			{15820				pLoopPlot = plotXYWithRangeCheck(getX(), getY(), iDX, iDY, iMountainRange);15821				if(pLoopPlot)15822				{15823					if(pLoopPlot->isMountain() && !pLoopPlot->IsNaturalWonder() && pLoopPlot->getOwner() == getOwner())15824					{15825						bFoundMountain = true;15826						break;15827					}15828				}15829			}1583015831			if(bFoundMountain == true)15832				break;15833		}1583415835		if(!bFoundMountain)15836			return false;15837	}1583815839	// Requires Hills15840	if(pkBuildingInfo->IsHill())15841	{15842		if(!plot()->isHills())15843			return false;15844	}1584515846	// Requires Flat15847	if(pkBuildingInfo->IsFlat())15848	{15849		if(plot()->isHills())15850			return false;15851	}1585215853	// Requires city not built on certain terrain?15854	TerrainTypes eTerrainProhibited = (TerrainTypes) pkBuildingInfo->GetProhibitedCityTerrain();15855	if(eTerrainProhibited != NO_TERRAIN)15856	{15857		if(plot()->getTerrainType() == eTerrainProhibited)15858		{15859			return false;15860		}15861	}1586215863	// Requires city to be on or next to a particular terrain type?15864	TerrainTypes eTerrainRequired = (TerrainTypes) pkBuildingInfo->GetNearbyTerrainRequired();15865	if(eTerrainRequired != NO_TERRAIN)15866	{15867		bool bFoundTerrain = false;1586815869		// City on the right terrain?15870		if(plot()->getTerrainType() == eTerrainRequired)15871			bFoundTerrain = true;1587215873		// Check adjacent plots15874		if(!bFoundTerrain)15875		{15876			CvPlot* pAdjacentPlot;15877			for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; iDirectionLoop++)15878			{15879				pAdjacentPlot = plotDirection(getX(), getY(), ((DirectionTypes)iDirectionLoop));1588015881				if(pAdjacentPlot != NULL)15882				{15883					// City adjacent to the right terrain?15884					if(pAdjacentPlot->getTerrainType() == eTerrainRequired)15885					{15886						bFoundTerrain = true;15887						break;15888					}15889				}15890			}15891		}1589215893		// Didn't find nearby required terrain15894		if(!bFoundTerrain)15895			return false;15896	}1589715898	return true;15899}

Calls

Called by