void CvMapGenerator::addUniqueImprovements()
{
if (gDLL->getPythonIFace()->pythonAddGoodies() && !gDLL->getPythonIFace()->pythonUsingDefaultImpl())
{
return;
}
bool bValid = true;
CvPlot* pAdjacentPlot;
CvPlot* pPlot;
CvPlot* pBestPlot = NULL;
int iBestValue = 0;
int iValue = 0;
int iChance = GC.getDefineINT("IMPROVEMENT_UNIQUE_CHANCE") + GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getUniqueFeatureChance();
/*************************************************************************************************/
/** FeatureGalore 09/27/08 Xienwolf **/
/** **/
/** **/
/*************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_ALL_UNIQUE_FEATURES))
iChance = 100;
/*************************************************************************************************/
/** FeatureGalore END **/
/*************************************************************************************************/
for (int iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
if (GC.getImprovementInfo((ImprovementTypes)iI).isUnique())
{
iBestValue = 0;
pBestPlot = NULL;
if (GC.getGameINLINE().getSorenRandNum(100, "Unique Improvements") < iChance)
{
for (int iJ = 0; iJ < GC.getMapINLINE().numPlotsINLINE(); iJ++)
{
pPlot = GC.getMapINLINE().plotByIndexINLINE(iJ);
if (pPlot->getBonusType(NO_TEAM) == NO_BONUS)
{
if (pPlot->getImprovementType() == NO_IMPROVEMENT)
{
bValid = true;
for (int iJ = 0; iJ < NUM_DIRECTION_TYPES; ++iJ)
{
pAdjacentPlot = plotDirection(pPlot->getX_INLINE(), pPlot->getY_INLINE(), ((DirectionTypes)iJ));
if (pAdjacentPlot != NULL)
{
if (pAdjacentPlot->getImprovementType() != NO_IMPROVEMENT)
{
bValid = false;
}
}
}
}
}
if (bValid)
{
if (pPlot->getImprovementType() == NO_IMPROVEMENT)
{
/*************************************************************************************************/
/** Xienwolf Tweak 10/01/08 **/
/** **/
/** Prevents Unique Features from overwriting each other **/
/*************************************************************************************************/
/** ---- Start Original Code ---- **
if (pPlot->canHaveImprovement((ImprovementTypes)iI))
/** ---- End Original Code ---- **/
if (pPlot->canHaveImprovement((ImprovementTypes)iI) && pPlot->getImprovementType() == NO_IMPROVEMENT)
/*************************************************************************************************/
/** Tweak END **/
/*************************************************************************************************/
{
if (pPlot->getBonusType(NO_TEAM) == NO_BONUS)
{
iValue = GC.getGameINLINE().getSorenRandNum(10000, "Unique Improvements");
if (iValue > iBestValue)
{
iBestValue = iValue;
pBestPlot = pPlot;
}
}
}
}
}
}
if (pBestPlot != NULL)
{
pBestPlot->setImprovementType((ImprovementTypes)iI);
pBestPlot->setFeatureType(NO_FEATURE);
}
}
}
}
}