bool CvPlot::canTrain(UnitTypes eUnit, bool bContinue, bool bTestVisible) const
{
CvCity* pCity = getPlotCity();
if (GC.getUnitInfo(eUnit).isPrereqReligion())
{
if (NULL == pCity || pCity->getReligionCount() > 0)
{
return false;
}
}
if (GC.getUnitInfo(eUnit).getPrereqReligion() != NO_RELIGION)
{
if (NULL == pCity || !pCity->isHasReligion((ReligionTypes)(GC.getUnitInfo(eUnit).getPrereqReligion())))
{
return false;
}
}
if (GC.getUnitInfo(eUnit).getPrereqCorporation() != NO_CORPORATION)
{
if (NULL == pCity || !pCity->isActiveCorporation((CorporationTypes)(GC.getUnitInfo(eUnit).getPrereqCorporation())))
{
return false;
}
}
if (GC.getUnitInfo(eUnit).isPrereqBonuses())
{
if (GC.getUnitInfo(eUnit).getDomainType() == DOMAIN_SEA)
{
bool bValid = false;
for (int iI = 0; iI < NUM_DIRECTION_TYPES; ++iI)
{
CvPlot* pLoopPlot = plotDirection(getX_INLINE(), getY_INLINE(), ((DirectionTypes)iI));
if (pLoopPlot != NULL)
{
if (pLoopPlot->isWater())
{
if (pLoopPlot->area()->getNumTotalBonuses() > 0)
{
bValid = true;
break;
}
}
}
}
if (!bValid)
{
return false;
}
}
else
{
if (area()->getNumTotalBonuses() > 0)
{
return false;
}
}
}
if (isCity())
{
if (GC.getUnitInfo(eUnit).getDomainType() == DOMAIN_SEA)
{
if (!isWater() && !isCoastalLand(GC.getUnitInfo(eUnit).getMinAreaSize()))
{
return false;
}
}
else
{
if (area()->getNumTiles() < GC.getUnitInfo(eUnit).getMinAreaSize())
{
return false;
}
}
}
else
{
if (area()->getNumTiles() < GC.getUnitInfo(eUnit).getMinAreaSize())
{
return false;
}
if (GC.getUnitInfo(eUnit).getDomainType() == DOMAIN_SEA)
{
if (!isWater())
{
return false;
}
}
else if (GC.getUnitInfo(eUnit).getDomainType() == DOMAIN_LAND)
{
if (isWater())
{
return false;
}
}
else
{
return false;
}
}
if (!bTestVisible)
{
if (GC.getUnitInfo(eUnit).getHolyCity() != NO_RELIGION)
{
if (NULL == pCity || !pCity->isHolyCity(((ReligionTypes)(GC.getUnitInfo(eUnit).getHolyCity()))))
{
return false;
}
}
if (GC.getUnitInfo(eUnit).getPrereqBuilding() != NO_BUILDING)
{
if (NULL == pCity)
{
return false;
}
if (pCity->getNumBuilding((BuildingTypes)(GC.getUnitInfo(eUnit).getPrereqBuilding())) == 0)
{
SpecialBuildingTypes eSpecialBuilding = ((SpecialBuildingTypes)(GC.getBuildingInfo((BuildingTypes)(GC.getUnitInfo(eUnit).getPrereqBuilding())).getSpecialBuildingType()));
if ((eSpecialBuilding == NO_SPECIALBUILDING) || !(GET_PLAYER(getOwnerINLINE()).isSpecialBuildingNotRequired(eSpecialBuilding)))
{
return false;
}
}
}
if (GC.getUnitInfo(eUnit).getPrereqAndBonus() != NO_BONUS)
{
if (NULL == pCity)
{
if (!isPlotGroupConnectedBonus(getOwnerINLINE(), (BonusTypes)GC.getUnitInfo(eUnit).getPrereqAndBonus()))
{
return false;
}
}
else
{
if (!pCity->hasBonus((BonusTypes)GC.getUnitInfo(eUnit).getPrereqAndBonus()))
{
return false;
}
}
}
bool bRequiresBonus = false;
bool bNeedsBonus = true;
for (int iI = 0; iI < GC.getNUM_UNIT_PREREQ_OR_BONUSES(); ++iI)
{
if (GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI) != NO_BONUS)
{
bRequiresBonus = true;
if (NULL == pCity)
{
if (isPlotGroupConnectedBonus(getOwnerINLINE(), (BonusTypes)GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI)))
{
bNeedsBonus = false;
break;
}
}
else
{
if (pCity->hasBonus((BonusTypes)GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI)))
{
bNeedsBonus = false;
break;
}
}
}
}
if (bRequiresBonus && bNeedsBonus)
{
return false;
}
}
return true;
}