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}