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}