Bazaar developer reference

CvTreasury::CalculateUnitCost(int &, int &, int &, int &)

Defined in
CvTreasury.cpp, line 510
Class
CvTreasury
Hook name
CivHooks::CvTreasury_CalculateUnitCost

Hooks

static bool BeforeCvTreasury_CalculateUnitCost(CvTreasury* self, int& iFreeUnits, int& iPaidUnits, int& iBaseUnitCost, int& iExtraCost, int& result);static void AfterCvTreasury_CalculateUnitCost(CvTreasury* self, int& iFreeUnits, int& iPaidUnits, int& iBaseUnitCost, int& iExtraCost, int& result);static int ReplaceCvTreasury_CalculateUnitCost(int (*original)(CvTreasury*, int&, int&, int&, int&), CvTreasury* self, int& iFreeUnits, int& iPaidUnits, int& iBaseUnitCost, int& iExtraCost);CivRegisterBefore<CivHooks::CvTreasury_CalculateUnitCost>(host, &BeforeCvTreasury_CalculateUnitCost);CivRegisterAfter<CivHooks::CvTreasury_CalculateUnitCost>(host, &AfterCvTreasury_CalculateUnitCost);CivRegisterReplace<CivHooks::CvTreasury_CalculateUnitCost>(host, &ReplaceCvTreasury_CalculateUnitCost);

Code

509/// Compute unit maintenance cost for the turn (returns component info)510int CvTreasury::CalculateUnitCost(int& iFreeUnits, int& iPaidUnits, int& iBaseUnitCost, int& iExtraCost)511{512	// If player has 0 Cities then no Unit cost513	if(m_pPlayer->getNumCities() == 0)514	{515		return 0;516	}517518	int iSupport = 0;519520	CvHandicapInfo& playerHandicap = m_pPlayer->getHandicapInfo();521	iFreeUnits = playerHandicap.getGoldFreeUnits();522523	// Defined in XML by unit info type524	iFreeUnits += m_pPlayer->GetNumMaintenanceFreeUnits();525	iFreeUnits += m_pPlayer->getBaseFreeUnits();526527	iPaidUnits = max(0, m_pPlayer->getNumUnits() - iFreeUnits);528529	iBaseUnitCost = iPaidUnits * m_pPlayer->getGoldPerUnitTimes100();530531	// Discount on land unit maintenance?532	int iLandUnitMod = m_pPlayer->GetPlayerTraits()->GetLandUnitMaintenanceModifier();533	if(iLandUnitMod != 0)534	{535		int iLandUnits = m_pPlayer->GetNumUnitsWithDomain(DOMAIN_LAND, true /*bMilitaryOnly*/);536		int iFreeLandUnits = m_pPlayer->GetNumMaintenanceFreeUnits(DOMAIN_LAND, true);537		int iPaidLandUnits = iLandUnits - iFreeLandUnits;538		iBaseUnitCost += (iLandUnitMod * iPaidLandUnits * m_pPlayer->getGoldPerUnitTimes100()) / 100;539	}540541	// Discount on naval unit maintenance?542	int iNavalUnitMod = m_pPlayer->GetPlayerTraits()->GetNavalUnitMaintenanceModifier();543	if(iNavalUnitMod != 0)544	{545		int iNavalUnits = m_pPlayer->GetNumUnitsWithDomain(DOMAIN_SEA, true /*bMilitaryOnly*/);546		int iFreeNavalUnits = m_pPlayer->GetNumMaintenanceFreeUnits(DOMAIN_SEA, true);547		int iPaidNavalUnits = iNavalUnits - iFreeNavalUnits;548		iBaseUnitCost += (iNavalUnitMod * iPaidNavalUnits * m_pPlayer->getGoldPerUnitTimes100()) / 100;549	}550551	// Discounts for units of certain UnitCombat classes552	for(int iI = 0; iI < GC.getNumUnitCombatClassInfos(); iI++)553	{554		const UnitCombatTypes eUnitCombatClass = static_cast<UnitCombatTypes>(iI);555		CvBaseInfo* pkUnitCombatClassInfo = GC.getUnitCombatClassInfo(eUnitCombatClass);556		if(pkUnitCombatClassInfo)557		{558			int iModifier = m_pPlayer->GetPlayerTraits()->GetMaintenanceModifierUnitCombat(eUnitCombatClass);559			if (iModifier != 0)560			{561				int iNumUnits = m_pPlayer->GetNumUnitsWithUnitCombat(eUnitCombatClass);562				int iCost = iNumUnits * m_pPlayer->getGoldPerUnitTimes100(); 563				int iModifiedCost = iNumUnits * m_pPlayer->getGoldPerUnitTimes100() * (100 + iModifier) / 100; 564				565				// Reduce cost based on difference566				iBaseUnitCost += (iModifiedCost - iCost);567			}568		}569	}570571	iExtraCost = m_pPlayer->getExtraUnitCost() * 100;	// In hundreds to avoid rounding errors572573	iSupport = iBaseUnitCost + iExtraCost;574575	// Game progress factor ranges from 0.0 to 1.0 based on how far into the game we are576	double fGameProgressFactor = double(GC.getGame().getElapsedGameTurns()) / GC.getGame().getDefaultEstimateEndTurn();577578	// Multiplicative increase - helps scale costs as game goes on - the HIGHER this number the more is paid579	double fMultiplyFactor = 1.0 + (fGameProgressFactor* /*8*/ GC.getUNIT_MAINTENANCE_GAME_MULTIPLIER());580	// Exponential increase - this one really punishes those with a HUGE military - the LOWER this number the more is paid581	double fExponentialFactor = 1.0 + (fGameProgressFactor / /*7*/ GC.getUNIT_MAINTENANCE_GAME_EXPONENT_DIVISOR());582583	double fTempCost = fMultiplyFactor * iSupport;584	fTempCost /= 100;	// Take this out of hundreds now585586	double dFinalCost = pow(fTempCost, fExponentialFactor);587588	// A mod at the player level? (Policies, etc.)589	if(m_pPlayer->GetUnitGoldMaintenanceMod() != 0)590	{591		dFinalCost *= (100 + m_pPlayer->GetUnitGoldMaintenanceMod());592		dFinalCost /= 100;593	}594595	// Human bonus for unit maintenance costs596	if(m_pPlayer->isHuman())597	{598		dFinalCost *= playerHandicap.getUnitCostPercent();599		dFinalCost /= 100;600	}601	// AI bonus for unit maintenance costs602	else if(!m_pPlayer->IsAITeammateOfHuman())603	{604		dFinalCost *= GC.getGame().getHandicapInfo().getAIUnitCostPercent();605		dFinalCost /= 100;606	}607608	//iFinalCost /= 100;609610	return std::max(0, int(dFinalCost));611}

Calls

Called by