Hooks
static bool BeforeCvCity_GetFaithPurchaseCost(CvCity* self, UnitTypes eUnit, bool bIncludeBeliefDiscounts, int& result);static void AfterCvCity_GetFaithPurchaseCost(CvCity* self, UnitTypes eUnit, bool bIncludeBeliefDiscounts, int& result);static int ReplaceCvCity_GetFaithPurchaseCost(int (*original)(CvCity*, UnitTypes, bool), CvCity* self, UnitTypes eUnit, bool bIncludeBeliefDiscounts);CivRegisterBefore<CivHooks::CvCity_GetFaithPurchaseCost>(host, &BeforeCvCity_GetFaithPurchaseCost);CivRegisterAfter<CivHooks::CvCity_GetFaithPurchaseCost>(host, &AfterCvCity_GetFaithPurchaseCost);CivRegisterReplace<CivHooks::CvCity_GetFaithPurchaseCost>(host, &ReplaceCvCity_GetFaithPurchaseCost);
Code
5026int CvCity::GetFaithPurchaseCost(UnitTypes eUnit, bool bIncludeBeliefDiscounts)5027{5028 VALIDATE_OBJECT50295030 int iCost = 0;5031 CvPlayer &kPlayer = GET_PLAYER(m_eOwner);50325033 CvUnitEntry* pkUnitInfo = GC.getUnitInfo(eUnit);5034 if(pkUnitInfo == NULL)5035 {5036 //Should never happen5037 return iCost;5038 }50395040 // LATE-GAME GREAT PERSON5041 SpecialUnitTypes eSpecialUnitGreatPerson = (SpecialUnitTypes) GC.getInfoTypeForString("SPECIALUNIT_PEOPLE");5042 if (pkUnitInfo->GetSpecialUnitType() == eSpecialUnitGreatPerson)5043 {5044 // We must be into the industrial era5045#if defined(MOD_CONFIG_GAME_IN_XML)5046 if(kPlayer.GetCurrentEra() >= GD_INT_GET(RELIGION_GP_FAITH_PURCHASE_ERA))5047#else5048 if(kPlayer.GetCurrentEra() >= GC.getInfoTypeForString("ERA_INDUSTRIAL", true /*bHideAssert*/))5049#endif5050 {5051 // Must be proper great person for our civ5052 const UnitClassTypes eUnitClass = (UnitClassTypes)pkUnitInfo->GetUnitClassType();5053 if (eUnitClass != NO_UNITCLASS)5054 {5055 const UnitTypes eThisPlayersUnitType = (UnitTypes)kPlayer.getCivilizationInfo().getCivilizationUnits(eUnitClass);5056 ReligionTypes eReligion = kPlayer.GetReligions()->GetReligionCreatedByPlayer();50575058 if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_PROPHET", true /*bHideAssert*/)) //here5059 {5060 // Can't be bought if didn't start religion5061 if (eReligion == NO_RELIGION)5062 {5063 iCost = -1;5064 }5065 else5066 {5067#if defined(MOD_GLOBAL_TRULY_FREE_GP)5068 iCost = kPlayer.GetReligions()->GetCostNextProphet(true /*bIncludeBeliefDiscounts*/, false /*bAdjustForSpeedDifficulty*/, MOD_GLOBAL_TRULY_FREE_GP);5069#else5070 iCost = kPlayer.GetReligions()->GetCostNextProphet(true /*bIncludeBeliefDiscounts*/, false /*bAdjustForSpeedDifficulty*/);5071#endif5072 }5073 }5074 else if (eThisPlayersUnitType == eUnit)5075 {5076 PolicyBranchTypes eBranch = NO_POLICY_BRANCH_TYPE;5077 int iNum = 0;50785079 // Check social policy tree5080 if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_WRITER", true /*bHideAssert*/))5081 {5082 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_AESTHETICS", true /*bHideAssert*/);5083 iNum = kPlayer.getWritersFromFaith();5084 }5085 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_ARTIST", true /*bHideAssert*/))5086 {5087 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_AESTHETICS", true /*bHideAssert*/);5088 iNum = kPlayer.getArtistsFromFaith();5089 }5090 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_MUSICIAN", true /*bHideAssert*/))5091 {5092 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_AESTHETICS", true /*bHideAssert*/);5093 iNum = kPlayer.getMusiciansFromFaith();5094 }5095 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_SCIENTIST", true /*bHideAssert*/))5096 {5097 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_RATIONALISM", true /*bHideAssert*/);5098 iNum = kPlayer.getScientistsFromFaith();5099 }5100 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_MERCHANT", true /*bHideAssert*/))5101 {5102 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_COMMERCE", true /*bHideAssert*/);5103 iNum = kPlayer.getMerchantsFromFaith();5104 }5105 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_ENGINEER", true /*bHideAssert*/))5106 {5107 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_TRADITION", true /*bHideAssert*/);5108 iNum = kPlayer.getEngineersFromFaith();5109 }5110 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_GREAT_GENERAL", true /*bHideAssert*/))5111 {5112 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_HONOR", true /*bHideAssert*/);5113 iNum = kPlayer.getGeneralsFromFaith();5114 }5115 else if (eUnitClass == GC.getInfoTypeForString("UNITCLASS_GREAT_ADMIRAL", true /*bHideAssert*/))5116 {5117 eBranch = (PolicyBranchTypes)GC.getInfoTypeForString("POLICY_BRANCH_EXPLORATION", true /*bHideAssert*/);5118 iNum = kPlayer.getAdmiralsFromFaith();5119 }51205121 bool bAllUnlockedByBelief = false;5122 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eReligion, getOwner());5123 if(pReligion)5124 { 5125 if (pReligion->m_Beliefs.IsFaithPurchaseAllGreatPeople())5126 {5127 bAllUnlockedByBelief = true;5128 }5129 }51305131#if defined(MOD_RELIGION_POLICY_BRANCH_FAITH_GP)5132 if (MOD_RELIGION_POLICY_BRANCH_FAITH_GP)5133 {5134 bool bIsUnlocked = bAllUnlockedByBelief;51355136 if (!bIsUnlocked)5137 {5138 EraTypes eCurrentEra = kPlayer.GetCurrentEra();51395140 for (int iPolicyLoop = 0; iPolicyLoop < kPlayer.GetPlayerPolicies()->GetPolicies()->GetNumPolicies(); iPolicyLoop++)5141 {5142 const PolicyTypes eLoopPolicy = static_cast<PolicyTypes>(iPolicyLoop);5143 CvPolicyEntry* pkLoopPolicyInfo = GC.getPolicyInfo(eLoopPolicy);5144 if (pkLoopPolicyInfo)5145 {5146 // We have this policy5147 if (kPlayer.HasPolicy(eLoopPolicy))5148 {5149 if (pkLoopPolicyInfo->IsFaithPurchaseUnitClass(eUnitClass, eCurrentEra))5150 {5151 bIsUnlocked = true;5152 break;5153 }5154 }5155 }5156 }5157 }51585159 if (bIsUnlocked)5160 {5161 iCost = GC.getGame().GetGameReligions()->GetFaithGreatPersonNumber(iNum + 1); 5162 }5163 }5164 else5165 {5166#endif5167 5168 if (bAllUnlockedByBelief || (eBranch != NO_POLICY_BRANCH_TYPE && kPlayer.GetPlayerPolicies()->IsPolicyBranchFinished(eBranch) && !kPlayer.GetPlayerPolicies()->IsPolicyBranchBlocked(eBranch)))5169 {5170 iCost = GC.getGame().GetGameReligions()->GetFaithGreatPersonNumber(iNum + 1); 5171 }5172#if defined(MOD_RELIGION_POLICY_BRANCH_FAITH_GP)5173 }5174#endif5175 }5176 }5177 }5178 }51795180 // ALL OTHERS5181 else5182 {5183 // Cost goes up in later eras5184 iCost = pkUnitInfo->GetFaithCost();5185 EraTypes eEra = GET_TEAM(GET_PLAYER(getOwner()).getTeam()).GetCurrentEra();5186 int iMultiplier = GC.getEraInfo(eEra)->getFaithCostMultiplier();5187 iCost = iCost * iMultiplier / 100;51885189 if (pkUnitInfo->IsSpreadReligion() || pkUnitInfo->IsRemoveHeresy())5190 {5191 iMultiplier = (100 + GET_PLAYER(getOwner()).GetPlayerPolicies()->GetNumericModifier(POLICYMOD_FAITH_COST_MODIFIER));5192 iCost = iCost * iMultiplier / 100;5193 }5194 }51955196 // Adjust for game speed5197 iCost *= GC.getGame().getGameSpeedInfo().getTrainPercent();5198 iCost /= 100;51995200 // Adjust for difficulty5201 if(!isHuman() && !GET_PLAYER(getOwner()).IsAITeammateOfHuman() && !isBarbarian())5202 {5203 iCost *= GC.getGame().getHandicapInfo().getAITrainPercent();5204 iCost /= 100;5205 }52065207 // Modify by any beliefs5208 if(bIncludeBeliefDiscounts && (pkUnitInfo->IsSpreadReligion() || pkUnitInfo->IsRemoveHeresy()) && !pkUnitInfo->IsFoundReligion())5209 {5210 CvGameReligions* pReligions = GC.getGame().GetGameReligions();5211 ReligionTypes eMajority = GetCityReligions()->GetReligiousMajority();5212 if(eMajority > RELIGION_PANTHEON)5213 {5214 const CvReligion* pReligion = pReligions->GetReligion(eMajority, getOwner());5215 if(pReligion)5216 {5217 int iReligionCostMod = pReligion->m_Beliefs.GetMissionaryCostModifier();52185219 if(iReligionCostMod != 0)5220 {5221 iCost *= (100 + iReligionCostMod);5222 iCost /= 100;5223 }5224 }5225 }5226 }52275228 // Make the number not be funky5229 int iDivisor = /*10*/ GC.getGOLD_PURCHASE_VISIBLE_DIVISOR();5230 iCost /= iDivisor;5231 iCost *= iDivisor;52325233 return iCost;5234}