Widget Help

so i got the yield input\outputs working great, but the bonus outputs are not showing. e.g. building is inputting 2 yield a turn, and is supposed to produce 2 iron. the 2 yield deduction is applied, but i get 0 iron production. here is the code:


Code:
void CvCity::doIndustry(BuildingTypes eIndex)
{
	CvBuildingInfo& kBuilding = GC.getBuildingInfo(eIndex);
	int iI;
	int iHighestOrSource = 0;
	BonusTypes eHighestOrBonus = NO_BONUS;
	int iContendingSource;
	int iRate;
	bool bLevelOkay = true;
	int iOldValue;
	
	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( (BuildingClassTypes) kBuilding.getBuildingClassType(), (YieldTypes) iI);
		if (kBuilding.getYieldOutput(iI) > 0)
		{				
			changeBuildingYieldChange( (BuildingClassTypes) kBuilding.getBuildingClassType(), (YieldTypes) iI, -iOldValue + (iRate*kBuilding.getYieldOutput(iI)) );			
			
		}
		if (kBuilding.getYieldInput(iI) > 0)
		{
			changeBuildingYieldChange( (BuildingClassTypes) kBuilding.getBuildingClassType(), (YieldTypes) iI, -(iOldValue + (iRate*kBuilding.getYieldInput(iI))) );
		}
	}
	
	for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
	{
		if (kBuilding.getBonusOutput(iI) > 0)
		{
			changeBonusStock( (BonusTypes) iI, iRate*kBuilding.getBonusOutput(iI));
		}
		if (kBuilding.getAndBonusInput(iI) > 0)
		{
			changeOverallBonusStock( (BonusTypes) iI, -(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;
			}
		}
	}
	if (eHighestOrBonus != NO_BONUS)
	{
		changeOverallBonusStock(eHighestOrBonus, -(iRate*kBuilding.getOrBonusInput(eHighestOrBonus)));
	
	}
}

and BonusStock
Code:
int CvCity::getBonusStock(BonusTypes eBonus)
{
	return m_aiBonusStock != NULL ? m_aiBonusStock[(int) eBonus] : 0;
}

void CvCity::setBonusStock(BonusTypes eBonus, int iValue)
{
	if (m_aiBonusStock != NULL)
	{
		if (iValue > 0)
		{
			m_aiBonusStock[(int) eBonus] = iValue;
		}
		else
		{
			m_aiBonusStock[(int) eBonus] = 0;
		}
	}
}

void CvCity::changeBonusStock(BonusTypes eBonus, int iChange)
{
	setBonusStock(eBonus, getBonusStock(eBonus) + iChange);
}

Also, I am thinking of handling the bonus stockpile changes with a vector the way BuildingYieldChange is handled. I've been looking at some tutorials online, but I'm wondering, how would i declare m_aBuildingBonusStockChange? this is very new for me.

Once again, thanks so much for the help!
 
Problem in previous post is solved, some silly mistakes on my part.

Again thanks to xienwolf, godemperor, and emperorfool..

Back to working on the actual widget on the city screen!
 
You asked about changing m_aiBonusStockChange to a vector. I would say it's probably not worth it. The code to work with it will be more complex and slightly slower (likely not noticeable) with only a small gain in space savings.

The reason the building yield changes are done using a vector is that there are a lot of buildings and likely to be very few changes for any given city. But look at the code that deals with that vector compared to other array-based code.
 
Back
Top Bottom