bool CvMapGenerator::canPlaceGoodyAt(ImprovementTypes eImprovement, int iX, int iY) { PROFILE_FUNC(); CvPlot* pPlot; FAssertMsg(eImprovement != NO_IMPROVEMENT, "Improvement is not assigned a valid value"); FAssertMsg(GC.getImprovementInfo(eImprovement).isGoody(), "ImprovementType eImprovement is expected to be a goody"); if (GC.getGameINLINE().isOption(GAMEOPTION_NO_GOODY_HUTS)) { return false; } pPlot = GC.getMapINLINE().plotINLINE(iX, iY); if (!(pPlot->canHaveImprovement(eImprovement, NO_TEAM))) { return false; } long result = 0; if (gDLL->getPythonIFace()->pythonCanPlaceGoodyAt(pPlot, &result) && !gDLL->getPythonIFace()->pythonUsingDefaultImpl()) // Python override { if (result >= 0) { return result; } else { FAssertMsg(false, "pythonGetRiverAltitude() must return >= 0"); } } if (pPlot->getImprovementType() != NO_IMPROVEMENT) { return false; } if (pPlot->getBonusType() != NO_BONUS) { return false; } if (pPlot->isImpassable()) { return false; } int iUniqueRange = GC.getImprovementInfo(eImprovement).getGoodyUniqueRange(); for (int iDX = -iUniqueRange; iDX <= iUniqueRange; iDX++) { for (int iDY = -iUniqueRange; iDY <= iUniqueRange; iDY++) { CvPlot *pLoopPlot = plotXY(iX, iY, iDX, iDY); if (pLoopPlot != NULL && pLoopPlot->getImprovementType() == eImprovement) { return false; } } } return true; }