Bazaar developer reference

CvPlot::canHaveImprovement(ImprovementTypes, TeamTypes, bool) const

Defined in
CvPlot.cpp, line 2228
Class
CvPlot
Hook name
CivHooks::CvPlot_canHaveImprovement
Lua events
GameEvents.PlotCanImprove

Hooks

static bool BeforeCvPlot_canHaveImprovement(const CvPlot* self, ImprovementTypes eImprovement, TeamTypes eTeam, bool arg2, bool& result);static void AfterCvPlot_canHaveImprovement(const CvPlot* self, ImprovementTypes eImprovement, TeamTypes eTeam, bool arg2, bool& result);static bool ReplaceCvPlot_canHaveImprovement(bool (*original)(const CvPlot*, ImprovementTypes, TeamTypes, bool), const CvPlot* self, ImprovementTypes eImprovement, TeamTypes eTeam, bool arg2);CivRegisterBefore<CivHooks::CvPlot_canHaveImprovement>(host, &BeforeCvPlot_canHaveImprovement);CivRegisterAfter<CivHooks::CvPlot_canHaveImprovement>(host, &AfterCvPlot_canHaveImprovement);CivRegisterReplace<CivHooks::CvPlot_canHaveImprovement>(host, &ReplaceCvPlot_canHaveImprovement);

Code

2228bool CvPlot::canHaveImprovement(ImprovementTypes eImprovement, TeamTypes eTeam, bool) const2229{2230	CvPlot* pLoopPlot;2231	bool bValid;2232	int iI;22332234	CvAssertMsg(eImprovement != NO_IMPROVEMENT, "Improvement is not assigned a valid value");2235#if !defined(MOD_GLOBAL_ALPINE_PASSES)2236	CvAssertMsg(getTerrainType() != NO_TERRAIN, "TerrainType is not assigned a valid value");2237#endif22382239	CvImprovementEntry* pkImprovementInfo = GC.getImprovementInfo(eImprovement);2240	if(pkImprovementInfo == NULL)2241	{2242		return false;2243	}22442245#if defined(MOD_GLOBAL_ALPINE_PASSES)2246	if (MOD_GLOBAL_ALPINE_PASSES && pkImprovementInfo->IsMountainsMakesValid() && isMountain()) {2247		return true;2248	}22492250	CvAssertMsg(getTerrainType() != NO_TERRAIN, "TerrainType is not assigned a valid value");2251#endif22522253	bValid = false;22542255	if(isCity())2256	{2257		return false;2258	}22592260	if(isImpassable() || isMountain())2261	{2262		return false;2263	}22642265	if(pkImprovementInfo->IsWater() != isWater())2266	{2267		return false;2268	}22692270	if(getFeatureType() != NO_FEATURE)2271	{2272		if(GC.getFeatureInfo(getFeatureType())->isNoImprovement())2273		{2274			return false;2275		}2276	}22772278	ResourceTypes thisResource = getResourceType(eTeam);2279	// The functionality of this line is different in Civ 4: in that game a "Valid" Resource ALLOWS an Improvement on a Tile.  In Civ 5 this makes a Resource REQUIRE a certain Improvement2280	if(thisResource != NO_RESOURCE &&2281	        !pkImprovementInfo->IsBuildableOnResources() &&	// Some improvements can be built anywhere2282	        !pkImprovementInfo->IsImprovementResourceMakesValid(thisResource))2283	{2284		return false;2285	}2286	// If there IS a valid resource here then set validity to true (because something has to)2287	else if(thisResource != NO_RESOURCE)2288	{2289		bValid = true;2290	}22912292	const bool bIsFreshWater = isFreshWater();22932294	if(pkImprovementInfo->IsNoFreshWater() && bIsFreshWater)2295	{2296		return false;2297	}22982299	if(pkImprovementInfo->IsRequiresFlatlands() && !isFlatlands())2300	{2301		return false;2302	}23032304	if(pkImprovementInfo->IsRequiresFlatlandsOrFreshWater() && !isFlatlands() && !bIsFreshWater)2305	{2306		return false;2307	}23082309	if(pkImprovementInfo->IsRequiresFeature() && (getFeatureType() == NO_FEATURE))2310	{2311		return false;2312	}23132314	if(pkImprovementInfo->IsRequiresImprovement())2315	{2316		if (getImprovementType() == NO_IMPROVEMENT)2317		{2318			return false;2319		}2320		else2321		{2322			bValid = false;2323		}2324	}23252326	if(pkImprovementInfo->IsCoastal() && !isCoastalLand())2327	{2328		return false;2329	}23302331	if(pkImprovementInfo->IsHillsMakesValid() && isHills())2332	{2333		bValid = true;2334	}23352336	if(pkImprovementInfo->IsFreshWaterMakesValid() && bIsFreshWater)2337	{2338		bValid = true;2339	}23402341	if(pkImprovementInfo->IsRiverSideMakesValid() && isRiverSide())2342	{2343		bValid = true;2344	}23452346	if(pkImprovementInfo->GetTerrainMakesValid(getTerrainType()))2347	{2348		bValid = true;2349	}23502351	if((getImprovementType() != NO_IMPROVEMENT) && pkImprovementInfo->GetImprovementMakesValid(getImprovementType()))2352	{2353		bValid = true;2354	}23552356	if((getFeatureType() != NO_FEATURE) && pkImprovementInfo->GetFeatureMakesValid(getFeatureType()))2357	{2358		bValid = true;2359	}23602361	if(!bValid)2362	{2363		return false;2364	}23652366	if(pkImprovementInfo->IsRiverSideMakesValid())2367	{2368		bValid = false;23692370		for(iI = 0; iI < NUM_DIRECTION_TYPES; ++iI)2371		{2372			pLoopPlot = plotDirection(getX(), getY(), ((DirectionTypes)iI));23732374			if(pLoopPlot != NULL)2375			{2376				if(isRiverCrossing(directionXY(this, pLoopPlot)))2377				{2378					if(pLoopPlot->getImprovementType() != eImprovement)2379					{2380						bValid = true;2381						break;2382					}2383				}2384			}2385		}23862387		if(!bValid)2388		{2389			return false;2390		}2391	}23922393	int iRequiredAdjacentLand = pkImprovementInfo->GetRequiresXAdjacentLand();2394	if (iRequiredAdjacentLand > -1)2395	{2396		int iAdjacentLand = 0;23972398		for(iI = 0; iI < NUM_DIRECTION_TYPES; ++iI)2399		{2400			pLoopPlot = plotDirection(getX(), getY(), ((DirectionTypes)iI));24012402			if(pLoopPlot != NULL)2403			{2404				if (!pLoopPlot->isWater())2405				{2406					iAdjacentLand++;2407				}2408			}2409		}24102411		if (iAdjacentLand < iRequiredAdjacentLand)2412		{2413			return false;2414		}2415	}24162417#if defined(MOD_API_EXTENSIONS)2418	int iRequiredAdjacentWater = pkImprovementInfo->GetRequiresXAdjacentWater();2419	if (iRequiredAdjacentWater > -1)2420	{2421		int iAdjacentWater = 0;24222423		for(iI = 0; iI < NUM_DIRECTION_TYPES; ++iI)2424		{2425			pLoopPlot = plotDirection(getX(), getY(), ((DirectionTypes)iI));24262427			if(pLoopPlot != NULL)2428			{2429				if (pLoopPlot->isWater())2430				{2431					iAdjacentWater++;2432				}2433			}2434		}24352436		if (iAdjacentWater < iRequiredAdjacentWater)2437		{2438			return false;2439		}2440	}2441#endif24422443	for(iI = 0; iI < NUM_YIELD_TYPES; ++iI)2444	{2445		if(calculateNatureYield(((YieldTypes)iI), eTeam) < pkImprovementInfo->GetPrereqNatureYield(iI))2446		{2447			return false;2448		}2449	}24502451#if defined(MOD_EVENTS_PLOT)2452	if (MOD_EVENTS_PLOT) {2453		if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_PlotCanImprove, getX(), getY(), eImprovement) == GAMEEVENTRETURN_FALSE) {2454			return false;2455		}2456	}2457#endif24582459	return true;2460}

Calls

Called by