CvCity::isValidBuildingLocation(BuildingTypes) const
- Defined in
- CvCity.cpp, line 15755
- Class
- CvCity
- Hook name
CivHooks::CvCity_isValidBuildingLocation
Hooks
static bool BeforeCvCity_isValidBuildingLocation(const CvCity* self, BuildingTypes eBuilding, bool& result);static void AfterCvCity_isValidBuildingLocation(const CvCity* self, BuildingTypes eBuilding, bool& result);static bool ReplaceCvCity_isValidBuildingLocation(bool (*original)(const CvCity*, BuildingTypes), const CvCity* self, BuildingTypes eBuilding);CivRegisterBefore<CivHooks::CvCity_isValidBuildingLocation>(host, &BeforeCvCity_isValidBuildingLocation);CivRegisterAfter<CivHooks::CvCity_isValidBuildingLocation>(host, &AfterCvCity_isValidBuildingLocation);CivRegisterReplace<CivHooks::CvCity_isValidBuildingLocation>(host, &ReplaceCvCity_isValidBuildingLocation);
Code
15755bool CvCity::isValidBuildingLocation(BuildingTypes eBuilding) const15756{15757 VALIDATE_OBJECT1575815759 CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);15760 if(pkBuildingInfo == NULL)15761 return false;1576215763 // Requires coast15764 if(pkBuildingInfo->IsWater())15765 {15766 if(!isCoastal(pkBuildingInfo->GetMinAreaSize()))15767 return false;15768 }1576915770 // Requires River15771 if(pkBuildingInfo->IsRiver())15772 {15773 if(!(plot()->isRiver()))15774 return false;15775 }1577615777 // Requires Fresh Water15778 if(pkBuildingInfo->IsFreshWater())15779 {15780 if(!plot()->isFreshWater())15781 return false;15782 }1578315784 // Requires adjacent Mountain15785 if(pkBuildingInfo->IsMountain())15786 {15787 bool bFoundMountain = false;1578815789 CvPlot* pAdjacentPlot;15790 for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; iDirectionLoop++)15791 {15792 pAdjacentPlot = plotDirection(getX(), getY(), ((DirectionTypes)iDirectionLoop));1579315794 if(pAdjacentPlot != NULL)15795 {15796 if(pAdjacentPlot->isMountain())15797 {15798 bFoundMountain = true;15799 break;15800 }15801 }15802 }1580315804 if(!bFoundMountain)15805 return false;15806 }1580715808 // Requires nearby Mountain (within 2 tiles)15809 if(pkBuildingInfo->IsNearbyMountainRequired())15810 {15811 bool bFoundMountain = false;1581215813 const int iMountainRange = 2;15814 CvPlot* pLoopPlot;1581515816 for(int iDX = -iMountainRange; iDX <= iMountainRange; iDX++)15817 {15818 for(int iDY = -iMountainRange; iDY <= iMountainRange; iDY++)15819 {15820 pLoopPlot = plotXYWithRangeCheck(getX(), getY(), iDX, iDY, iMountainRange);15821 if(pLoopPlot)15822 {15823 if(pLoopPlot->isMountain() && !pLoopPlot->IsNaturalWonder() && pLoopPlot->getOwner() == getOwner())15824 {15825 bFoundMountain = true;15826 break;15827 }15828 }15829 }1583015831 if(bFoundMountain == true)15832 break;15833 }1583415835 if(!bFoundMountain)15836 return false;15837 }1583815839 // Requires Hills15840 if(pkBuildingInfo->IsHill())15841 {15842 if(!plot()->isHills())15843 return false;15844 }1584515846 // Requires Flat15847 if(pkBuildingInfo->IsFlat())15848 {15849 if(plot()->isHills())15850 return false;15851 }1585215853 // Requires city not built on certain terrain?15854 TerrainTypes eTerrainProhibited = (TerrainTypes) pkBuildingInfo->GetProhibitedCityTerrain();15855 if(eTerrainProhibited != NO_TERRAIN)15856 {15857 if(plot()->getTerrainType() == eTerrainProhibited)15858 {15859 return false;15860 }15861 }1586215863 // Requires city to be on or next to a particular terrain type?15864 TerrainTypes eTerrainRequired = (TerrainTypes) pkBuildingInfo->GetNearbyTerrainRequired();15865 if(eTerrainRequired != NO_TERRAIN)15866 {15867 bool bFoundTerrain = false;1586815869 // City on the right terrain?15870 if(plot()->getTerrainType() == eTerrainRequired)15871 bFoundTerrain = true;1587215873 // Check adjacent plots15874 if(!bFoundTerrain)15875 {15876 CvPlot* pAdjacentPlot;15877 for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; iDirectionLoop++)15878 {15879 pAdjacentPlot = plotDirection(getX(), getY(), ((DirectionTypes)iDirectionLoop));1588015881 if(pAdjacentPlot != NULL)15882 {15883 // City adjacent to the right terrain?15884 if(pAdjacentPlot->getTerrainType() == eTerrainRequired)15885 {15886 bFoundTerrain = true;15887 break;15888 }15889 }15890 }15891 }1589215893 // Didn't find nearby required terrain15894 if(!bFoundTerrain)15895 return false;15896 }1589715898 return true;15899}
Calls
- CvBuildingEntry::GetMinAreaSize() const
- CvBuildingEntry::GetNearbyTerrainRequired() const
- CvBuildingEntry::GetProhibitedCityTerrain() const
- CvBuildingEntry::IsFlat() const
- CvBuildingEntry::IsFreshWater() const
- CvBuildingEntry::IsHill() const
- CvBuildingEntry::IsMountain() const
- CvBuildingEntry::IsNearbyMountainRequired() const
- CvBuildingEntry::IsRiver() const
- CvBuildingEntry::IsWater() const
- CvCity::getOwner() const
- CvCity::getX() const
- CvCity::getY() const
- CvCity::isCoastal(int) const
- CvCity::plot() const
- CvGlobals::getBuildingInfo(BuildingTypes)
- CvPlot::getOwner() const
- CvPlot::getTerrainType() const
- CvPlot::isFreshWater() const
- CvPlot::isHills() const
- CvPlot::isMountain() const
- CvPlot::IsNaturalWonder() const
- CvPlot::isRiver() const
- plotDirection(int, int, DirectionTypes)
- plotXYWithRangeCheck(int, int, int, int, int)