PHP-Code:
int CvPlot::calculateImprovementYieldChange(ImprovementTypes eImprovement, YieldTypes eYield, PlayerTypes ePlayer, bool bOptimal, bool bBestRoute, bool bDisplay) const
{
PROFILE_FUNC();
BonusTypes eBonus;
int iBestYield;
int iYield;
int iI;
// ************************
// Edited for Planetfall
// ************************
CvImprovementInfo& pImprovementInfo = GC.getImprovementInfo(eImprovement);
iYield = pImprovementInfo.getYieldChange(eYield);
if (isRiverSide())
{
iYield += pImprovementInfo.getRiverSideYieldChange(eYield);
}
if (isHills())
{
iYield += pImprovementInfo.getHillsYieldChange(eYield);
}
// PlotType-specific yield changes
iYield += pImprovementInfo.getPlotTypeYieldChange(getPlotType(), eYield);
if (isWater())
{
iYield += GC.getImprovementInfo(eImprovement).getPlotTypeYieldChange(PLOT_OCEAN, eYield);
}
// TerrainType-specific yield changes
TerrainTypes eTerrain = getTerrainType();
if (eTerrain != NO_TERRAIN)
{
iYield += GC.getImprovementInfo(eImprovement).getTerrainTypeYieldChange((TerrainTypes)eTerrain, eYield);
}
// Coastal yield change
int iCoastalYieldChange = pImprovementInfo.getCoastalYieldChange(eYield);
if (iCoastalYieldChange)
{
if (isCoastalLand())
iYield += iCoastalYieldChange;
}
// ************************
// End Added for Planetfall
// ************************
if ((bOptimal) ? true : isIrrigationAvailable())
{
iYield += GC.getImprovementInfo(eImprovement).getIrrigatedYieldChange(eYield);
}
if (bOptimal)
{
iBestYield = 0;
for (iI = 0; iI < GC.getNumRouteInfos(); ++iI)
{
iBestYield = std::max(iBestYield, GC.getImprovementInfo(eImprovement).getRouteYieldChanges(iI, eYield));
}
iYield += iBestYield;
}
else
{
RouteTypes eRoute = getRouteType();
if( bBestRoute && ePlayer != NO_PLAYER )
{
eRoute = GET_PLAYER(ePlayer).getBestRoute(GC.getMapINLINE().plotSorenINLINE(getX_INLINE(), getY_INLINE()));
}
if (eRoute != NO_ROUTE)
{
iYield += GC.getImprovementInfo(eImprovement).getRouteYieldChanges(eRoute, eYield);
}
}
// Building Improvement Yield Change - Planetfall Maniac
CvCity* pCity = getWorkingCity();
if (bOptimal || NULL == pCity)
{
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
iYield += GC.getImprovementInfo(eImprovement).getBuildingYieldChange((BuildingTypes)iI, eYield);
}
}
else
{
if (!bDisplay || pCity->isRevealed(GC.getGameINLINE().getActiveTeam(), false))
{
iYield += pCity->getImprovementYieldChange(eImprovement, eYield);
}
}
//Orbital Cities
if (pCity->isOrbital())
{
if (!GC.getImprovementInfo(eImprovement).isOrbital())
{
return 0;
}
}
else
{
if (GC.getImprovementInfo(eImprovement).isOrbital())
{
return 0;
}
}
// End Planetfall Maniac
if (bOptimal || ePlayer == NO_PLAYER)
{
for (iI = 0; iI < GC.getNumTechInfos(); ++iI)
{
iYield += GC.getImprovementInfo(eImprovement).getTechYieldChanges(iI, eYield);
}
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
iYield += GC.getCivicInfo((CivicTypes) iI).getImprovementYieldChanges(eImprovement, eYield);
}
}
else
{
iYield += GET_PLAYER(ePlayer).getImprovementYieldChange(eImprovement, eYield);
iYield += GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getImprovementYieldChange(eImprovement, eYield);
}
if (ePlayer != NO_PLAYER)
{
eBonus = getBonusType(GET_PLAYER(ePlayer).getTeam());
if (eBonus != NO_BONUS)
{
iYield += GC.getImprovementInfo(eImprovement).getImprovementBonusYield(eBonus, eYield);
}
}
/*************************************************************************************************/
/* UNOFFICIAL_PATCH 06/02/10 Afforess & jdog5000 */
/* */
/* Bugfix */
/*************************************************************************************************/
/* original bts code
return iYield;
*/
// Improvement cannot actually produce negative yield
int iCurrYield = calculateNatureYield(eYield, (ePlayer == NO_PLAYER) ? NO_TEAM : GET_PLAYER(ePlayer).getTeam(), bOptimal);
return std::max( -iCurrYield, iYield );
/*************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/*************************************************************************************************/
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
Doch kein vorher auf null gesetzter Zeiger, puh. Aber korrupt kann er ja eigentlich auch nicht sein, weil er ja vorher noch funktioniert.
Edit: Es gibt noch eine Besonderheit, die CvCity Klasse ist jetzt abstrakt, aber das dürfte ja eigentlich kein Problem sein, weil die Klassen ja kompatibel sind. (oder nicht?) Die entsprechende erbende Klasse ist die CityAI-Klasse. Die Orbitalfunktion ist auch im Public-Bereich und liefert nur eine Variable zurück.