void CvCity::doPlotCulture(bool bUpdate, PlayerTypes ePlayer, int iCultureRate)
{
CvPlot* pLoopPlot;
int iDX, iDY;
int iCultureRange;
CultureLevelTypes eCultureLevel = (CultureLevelTypes)0;
CyCity* pyCity = new CyCity(this);
CyArgsList argsList;
argsList.add(gDLL->getPythonIFace()->makePythonObject(pyCity)); // pass in city class
argsList.add(bUpdate);
argsList.add(ePlayer);
argsList.add(iCultureRate);
long lResult=0;
gDLL->getPythonIFace()->callFunction(PYGameModule, "doPlotCulture", argsList.makeFunctionArgs(), &lResult);
delete pyCity; // python fxn must not hold on to this pointer
if (lResult == 1)
{
return;
}
FAssert(NO_PLAYER != ePlayer);
if (getOwnerINLINE() == ePlayer)
{
eCultureLevel = getCultureLevel();
}
else
{
for (int iI = (GC.getNumCultureLevelInfos() - 1); iI > 0; iI--)
{
if (getCultureTimes100(ePlayer) >= 100 * GC.getCultureLevelInfo((CultureLevelTypes)iI).getSpeedThreshold(GC.getGameINLINE().getGameSpeedType()))
{
eCultureLevel = (CultureLevelTypes)iI;
break;
}
}
}
int iFreeCultureRate = GC.getDefineINT("CITY_FREE_CULTURE_GROWTH_FACTOR");
if (getCultureTimes100(ePlayer) > 0)
{
if (eCultureLevel != NO_CULTURELEVEL)
{
for (iDX = -eCultureLevel; iDX <= eCultureLevel; iDX++)
{
for (iDY = -eCultureLevel; iDY <= eCultureLevel; iDY++)
{
iCultureRange = cultureDistance(iDX, iDY);
if (iCultureRange <= eCultureLevel)
{
pLoopPlot = plotXY(getX_INLINE(), getY_INLINE(), iDX, iDY);
if (pLoopPlot != NULL)
{
if (pLoopPlot->isPotentialCityWorkForArea(area()))
{
pLoopPlot->changeCulture(ePlayer, (((eCultureLevel - iCultureRange) * iFreeCultureRate) + iCultureRate + 1), (bUpdate || !(pLoopPlot->isOwned())));
}
}
}
}
}
}
}
}