void CvCity::doIndustry(BuildingTypes eIndex)
{
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eIndex);
int iI;
int iHighestOrSource = 0;
BonusTypes eHighestOrBonus = NO_BONUS;
BuildingClassTypes eBuildingClassIndex = (BuildingClassTypes) kBuilding.getBuildingClassType();
int iContendingSource;
int iRate;
bool bLevelOkay = true;
int iOldValue, iOldOverallValue;
if (eIndex == NO_BUILDING)
{
return;
}
for (iRate = getBuildingOutputRate(eIndex); iRate >= 0; iRate--)
{
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
if (kBuilding.getYieldInput(iI) > 0)
{
if (getYieldRate((YieldTypes) iI) < (iRate*(kBuilding.getYieldInput(iI))))
{
bLevelOkay = false;
break;
}
}
}
if (bLevelOkay)
{
for (iI = 0; iI <GC.getNumBonusInfos(); iI++)
{
if (kBuilding.getOrBonusInput(iI) > 0)
{
if (getOverallBonusStock((BonusTypes) iI) >= (iRate*(GC.getBuildingInfo(eIndex).getOrBonusInput(iI))))
{
bLevelOkay = true;
break;
}
else
{
bLevelOkay = false;
}
}
}
}
if (bLevelOkay)
{
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
if (kBuilding.getOrBonusInput(iI) > 0)
{
if (getOverallBonusStock((BonusTypes) iI) < (iRate*(GC.getBuildingInfo(eIndex).getAndBonusInput(iI))))
{
bool bLevelOkay = false;
break;
}
}
}
}
if (bLevelOkay == true)
{
break;
}
}
setBuildingOutputRate(eIndex, iRate);
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
iOldValue = getBuildingYieldChange( eBuildingClassIndex, (YieldTypes) iI);
if (kBuilding.getYieldOutput(iI) > 0)
{
changeBuildingYieldChange( eBuildingClassIndex, (YieldTypes) iI, -iOldValue + (iRate*kBuilding.getYieldOutput(iI)) );
}
if (kBuilding.getYieldInput(iI) > 0)
{
changeBuildingYieldChange( eBuildingClassIndex, (YieldTypes) iI, -(iOldValue + (iRate*kBuilding.getYieldInput(iI))) );
}
}
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
iOldValue = getBuildingBonusStockChange( eBuildingClassIndex, (BonusTypes) iI);
iOldOverallValue = getBuildingOverallBonusStockChange( eBuildingClassIndex, (BonusTypes) iI);
if (kBuilding.getBonusOutput(iI) > 0)
{
changeBuildingBonusStockChange( eBuildingClassIndex, (BonusTypes) iI, -iOldValue + (iRate*kBuilding.getBonusOutput(iI)) );
}
if (kBuilding.getAndBonusInput(iI) > 0)
{
changeBuildingOverallBonusStockChange( eBuildingClassIndex, (BonusTypes) iI, -(iOldOverallValue + (iRate*kBuilding.getAndBonusInput(iI))) );
}
if (kBuilding.getOrBonusInput(iI) > 0)
{
iContendingSource = getOverallBonusStock((BonusTypes) iI) - (iRate*kBuilding.getOrBonusInput(iI));
if ( iContendingSource >= iHighestOrSource)
{
iContendingSource = iHighestOrSource;
eHighestOrBonus = (BonusTypes) iI;
changeBuildingOverallBonusStockChange(eBuildingClassIndex, (BonusTypes) iI, -iOldOverallValue);
}
}
}
if (eHighestOrBonus != NO_BONUS)
{
iOldOverallValue = getBuildingOverallBonusStockChange( eBuildingClassIndex, eHighestOrBonus);
changeBuildingOverallBonusStockChange(eBuildingClassIndex, eHighestOrBonus, -(iOldOverallValue + (iRate*kBuilding.getOrBonusInput(iI))) );
}
}