/// Is it valid for this player to found a city here? bool CvCitySiteEvaluator::CanFound(CvPlot* pPlot, const CvPlayer* pPlayer, bool bTestVisible) const { CvAssert(pPlot); if(!pPlot) return false; CvPlot* pLoopPlot(NULL); bool bValid(false); int iRange(0), iDX(0), iDY(0); // Used to have a Python hook: CANNOT_FOUND_CITY_CALLBACK if(GC.getGame().isFinalInitialized()) { if(GC.getGame().isOption(GAMEOPTION_ONE_CITY_CHALLENGE) && pPlayer && pPlayer->isHuman()) { if(pPlayer->getNumCities() > 0) { return false; } } } if(pPlot->isImpassable() || pPlot->isMountain()) { return false; } if(pPlot->getFeatureType() != NO_FEATURE) { if(GC.getFeatureInfo(pPlot->getFeatureType())->isNoCity()) { return false; } } if(pPlayer) { if(pPlot->isOwned() && (pPlot->getOwner() != pPlayer->GetID())) { return false; } } CvTerrainInfo* pTerrainInfo = GC.getTerrainInfo(pPlot->getTerrainType()); if(!bValid) { if(pTerrainInfo->isFound()) { bValid = true; } } if(!bValid) { if(pTerrainInfo->isFoundCoast()) { if(pPlot->isCoastalLand()) { bValid = true; } } } if(!bValid) { if(pTerrainInfo->isFoundFreshWater()) { if(pPlot->isFreshWater()) { bValid = true; } } } // Used to have a Python hook: CAN_FOUND_CITIES_ON_WATER_CALLBACK if(pPlot->isWater()) { return false; } if(!bValid) { return false; } if(!bTestVisible) { // look at same land mass iRange = GC.getMIN_CITY_RANGE(); for(iDX = -(iRange); iDX <= iRange; iDX++) { for(iDY = -(iRange); iDY <= iRange; iDY++) { pLoopPlot = plotXYWithRangeCheck(pPlot->getX(), pPlot->getY(), iDX, iDY, iRange); if(pLoopPlot != NULL) { if(pLoopPlot->isCity()) { if(pLoopPlot->getLandmass() == pPlot->getLandmass()) { return false; } else if(hexDistance(iDX, iDY) < iRange) // one less for off shore { return false; } } } } } } return true; }
bool CvCitySiteEvaluator::CanFound(const CvPlot* pPlot, const CvPlayer* pPlayer, bool bIgnoreDistanceToExistingCities, const CvUnit* pUnit) const #else bool CvCitySiteEvaluator::CanFound(CvPlot* pPlot, const CvPlayer* pPlayer, bool bIgnoreDistanceToExistingCities) const #endif { CvAssert(pPlot); if(!pPlot) return false; CvPlot* pLoopPlot(NULL); bool bValid(false); // Used to have a Python hook: CANNOT_FOUND_CITY_CALLBACK if(GC.getGame().isFinalInitialized()) { if(GC.getGame().isOption(GAMEOPTION_ONE_CITY_CHALLENGE) && pPlayer && pPlayer->isHuman()) { if(pPlayer->getNumCities() > 0) { return false; } } } if (pUnit) { if(!pUnit->canEnterTerrain(*pPlot)) { return false; } } else if(!pPlot->isValidMovePlot(pPlayer ? pPlayer->GetID() : NO_PLAYER )) { return false; } if(pPlot->IsNaturalWonder()) return false; if(pPlot->getFeatureType() != NO_FEATURE) { if(GC.getFeatureInfo(pPlot->getFeatureType())->isNoCity()) { return false; } } if(pPlayer) { if(pPlot->isOwned() && (pPlot->getOwner() != pPlayer->GetID())) { return false; } } CvTerrainInfo* pTerrainInfo = GC.getTerrainInfo(pPlot->getTerrainType()); if(!bValid) { if(pTerrainInfo->isFound()) { bValid = true; } } if(!bValid) { if(pTerrainInfo->isFoundCoast()) { if(pPlot->isCoastalLand()) { bValid = true; } } } if(!bValid) { if(pTerrainInfo->isFoundFreshWater()) { if(pPlot->isFreshWater_cached()) { bValid = true; } } } // Used to have a Python hook: CAN_FOUND_CITIES_ON_WATER_CALLBACK if(pPlot->isWater()) { return false; } if(!bValid) { return false; } #if defined(MOD_BALANCE_CORE) if(pPlayer && pPlot->IsAdjacentOwnedByOtherTeam(pPlayer->getTeam())) { return false; } if(!bIgnoreDistanceToExistingCities) { int iMinDist(0), iDX(0), iDY(0); // look at same land mass iMinDist = /*3*/ GC.getMIN_CITY_RANGE(); if(pPlayer && pPlayer->isMinorCiv()) { if(GC.getMap().getWorldInfo().getMinDistanceCityStates() > 0) { iMinDist = GC.getMap().getWorldInfo().getMinDistanceCityStates(); } } else if(GC.getMap().getWorldInfo().getMinDistanceCities() > 0) { iMinDist = GC.getMap().getWorldInfo().getMinDistanceCities(); } for(iDX = -(iMinDist); iDX <= iMinDist; iDX++) { for(iDY = -(iMinDist); iDY <= iMinDist; iDY++) { pLoopPlot = plotXYWithRangeCheck(pPlot->getX(), pPlot->getY(), iDX, iDY, iMinDist); if(pLoopPlot != NULL) { if(pLoopPlot->isCity()) { if(pLoopPlot->getLandmass() == pPlot->getLandmass()) { return false; //we know that distance <= iMinDist here } else if(hexDistance(iDX, iDY) < iMinDist) // one less for off shore { return false; } } } } } } #endif return true; }