CvUnit::canEmbark(const CvPlot *) const
- Defined in
- CvUnit.cpp, line 4820
- Class
- CvUnit
- Hook name
CivHooks::CvUnit_canEmbark
Hooks
static bool BeforeCvUnit_canEmbark(const CvUnit* self, const CvPlot* pPlot, bool& result);static void AfterCvUnit_canEmbark(const CvUnit* self, const CvPlot* pPlot, bool& result);static bool ReplaceCvUnit_canEmbark(bool (*original)(const CvUnit*, const CvPlot*), const CvUnit* self, const CvPlot* pPlot);CivRegisterBefore<CivHooks::CvUnit_canEmbark>(host, &BeforeCvUnit_canEmbark);CivRegisterAfter<CivHooks::CvUnit_canEmbark>(host, &AfterCvUnit_canEmbark);CivRegisterReplace<CivHooks::CvUnit_canEmbark>(host, &ReplaceCvUnit_canEmbark);
Code
4820bool CvUnit::canEmbark(const CvPlot* pPlot) const4821{4822 VALIDATE_OBJECT4823 if(getDomainType() != DOMAIN_LAND)4824 {4825 return false;4826 }48274828 if(isEmbarked())4829 {4830 return false;4831 }48324833 if(movesLeft() <= 0)4834 {4835 return false;4836 }48374838#if defined(MOD_PATHFINDER_TERRAFIRMA)4839 // Can we embark from this plot?4840 // Only if it's coastal land4841 bool bCanEmbark = pPlot->isCoastalLand();4842#if defined(MOD_PATHFINDER_CROSS_ICE)4843 // ... or an ice-floe4844 bCanEmbark = bCanEmbark || (canCrossIce() && pPlot->isIce());4845#endif4846#if defined(MOD_PATHFINDER_DEEP_WATER_EMBARKATION)4847 // ... or shallow water4848 bCanEmbark = bCanEmbark || (IsHoveringUnit() && pPlot->isShallowWater());4849#endif4850 if(!bCanEmbark)4851#else4852 if(!pPlot->isCoastalLand())4853#endif4854 {4855 return false;4856 }48574858#if defined(MOD_PATHFINDER_DEEP_WATER_EMBARKATION)4859 if(!IsHasEmbarkAbility() && !IsEmbarkDeepWater())4860#else4861 if(!IsHasEmbarkAbility())4862#endif4863 {4864 return false;4865 }48664867 // search the water plots around this plot to see if any are vacant4868 int iRange = 1;4869 bool bOpenPlot = false;4870 for(int iX = -iRange; iX <= iRange; iX++)4871 {4872 for(int iY = -iRange; iY <= iRange; iY++)4873 {4874 CvPlot* pEvalPlot = plotXYWithRangeCheck(pPlot->getX(), pPlot->getY(), iX, iY, iRange);4875 if(!pEvalPlot)4876 {4877 continue;4878 }48794880 if(pEvalPlot->getX() == pPlot->getX() && pEvalPlot->getY() == pPlot->getY())4881 {4882 continue;4883 }48844885 CvPlot* p = plot();4886 if(p && canEmbarkOnto(*p, *pEvalPlot))4887 {4888 bOpenPlot = true;48894890 // get out of the loop4891 iX = iRange + 1;4892 iY = iRange + 1;4893 }4894 }4895 }48964897 return bOpenPlot;4898}
Calls
- CvPlot::getX() const
- CvPlot::getY() const
- CvPlot::isCoastalLand(int) const
- CvPlot::isIce() const
- CvPlot::isShallowWater() const
- CvUnit::canCrossIce() const
- CvUnit::canEmbarkOnto(const CvPlot &, const CvPlot &, bool, bool) const
- CvUnit::getDomainType() const
- CvUnit::IsEmbarkDeepWater() const
- CvUnit::isEmbarked() const
- CvUnit::IsHasEmbarkAbility() const
- CvUnit::IsHoveringUnit() const
- CvUnit::movesLeft() const
- CvUnit::plot() const
- plotXYWithRangeCheck(int, int, int, int, int)