Bazaar developer reference

CvCity::GetFaithPurchaseCost(UnitTypes, bool)

Defined in
CvCity.cpp, line 5026
Class
CvCity
Hook name
CivHooks::CvCity_GetFaithPurchaseCost

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}

Calls

Called by