Bazaar developer reference

CvUnit::DoSpreadReligion()

Defined in
CvUnit.cpp, line 8538
Class
CvUnit
Hook name
CivHooks::CvUnit_DoSpreadReligion

Hooks

static bool BeforeCvUnit_DoSpreadReligion(CvUnit* self, bool& result);static void AfterCvUnit_DoSpreadReligion(CvUnit* self, bool& result);static bool ReplaceCvUnit_DoSpreadReligion(bool (*original)(CvUnit*), CvUnit* self);CivRegisterBefore<CivHooks::CvUnit_DoSpreadReligion>(host, &BeforeCvUnit_DoSpreadReligion);CivRegisterAfter<CivHooks::CvUnit_DoSpreadReligion>(host, &AfterCvUnit_DoSpreadReligion);CivRegisterReplace<CivHooks::CvUnit_DoSpreadReligion>(host, &ReplaceCvUnit_DoSpreadReligion);

Code

8538bool CvUnit::DoSpreadReligion()8539{8540#if !defined(MOD_API_UNIFIED_YIELDS)8541	int iScienceBonus = 0;8542#endif85438544	CvCity* pCity = GetSpreadReligionTargetCity();85458546	if (pCity != NULL)8547	{8548		if(CanSpreadReligion(plot()))8549		{8550#if defined(MOD_RELIGION_CONVERSION_MODIFIERS)8551			int iConversionStrength = GetConversionStrength(pCity);8552#else8553			int iConversionStrength = GetConversionStrength();8554#endif8555			CvGameReligions* pReligions = GC.getGame().GetGameReligions();8556			ReligionTypes eReligion = GetReligionData()->GetReligion();8557			if(eReligion > RELIGION_PANTHEON)8558			{8559				const CvReligion* pReligion = pReligions->GetReligion(eReligion, getOwner());8560				if(pReligion)8561				{8562#if defined(MOD_API_UNIFIED_YIELDS)8563					// Requires majority for this city to be another religion8564					ReligionTypes eCurrentReligion = pCity->GetCityReligions()->GetReligiousMajority();8565					int iOtherFollowers = pCity->GetCityReligions()->GetFollowersOtherReligions(eReligion);8566					if (eCurrentReligion != NO_RELIGION && eCurrentReligion != eReligion && iOtherFollowers > 0)8567					{8568#if defined(MOD_BUGFIX_USE_GETTERS)8569						CvPlayer &kPlayer = GET_MY_PLAYER();8570#else8571						CvPlayer &kPlayer = GET_PLAYER(m_eOwner);8572#endif8573#if !defined(SHOW_PLOT_POPUP)8574						int iDelay = 0;8575#endif8576						bool bFloatText = pCity->plot() && pCity->plot()->GetActiveFogOfWarMode() == FOGOFWARMODE_OFF;8577						for (int iI = 0; iI < NUM_YIELD_TYPES; iI++)8578						{8579							YieldTypes eYield = (YieldTypes) iI;8580							8581							if (eYield == YIELD_FOOD || eYield == YIELD_PRODUCTION)8582							{8583								continue;8584							}8585							8586							int iYieldBonus = pReligion->m_Beliefs.GetYieldPerOtherReligionFollower(eYield);85878588							if (eYield == YIELD_SCIENCE)8589							{8590								iYieldBonus += pReligion->m_Beliefs.GetSciencePerOtherReligionFollower();8591							}85928593							if (iYieldBonus > 0)8594							{8595								iYieldBonus *= iOtherFollowers;8596									8597								switch(eYield)8598								{8599								case YIELD_GOLD:8600									kPlayer.GetTreasury()->ChangeGold(iYieldBonus);8601									break;8602								case YIELD_CULTURE:8603									kPlayer.changeJONSCulture(iYieldBonus);8604									break;8605								case YIELD_FAITH:8606									kPlayer.ChangeFaith(iYieldBonus);8607									break;8608								case YIELD_GOLDEN_AGE_POINTS:8609									kPlayer.ChangeGoldenAgeProgressMeter(iYieldBonus);8610									break;8611								case YIELD_SCIENCE:8612									{8613									TechTypes eCurrentTech = kPlayer.GetPlayerTechs()->GetCurrentResearch();8614									if(eCurrentTech == NO_TECH)8615									{8616										kPlayer.changeOverflowResearch(iYieldBonus);8617									}8618									else8619									{8620										GET_TEAM(kPlayer.getTeam()).GetTeamTechs()->ChangeResearchProgress(eCurrentTech, iYieldBonus, kPlayer.GetID());8621									}8622									}8623									break;8624								case YIELD_TOURISM:8625									kPlayer.GetCulture()->AddTourismAllKnownCivs(iYieldBonus);8626									break;8627								}86288629								if (bFloatText)8630								{8631									char text[256] = {0};8632									sprintf_s(text, "%s+%d[ENDCOLOR]%s", GC.getYieldInfo(eYield)->getColorString(), iYieldBonus, GC.getYieldInfo(eYield)->getIconString());8633#if defined(SHOW_PLOT_POPUP)8634									SHOW_PLOT_POPUP(pCity->plot(), getOwner(), text, 0.0f);8635#else8636									float fDelay = GC.getPOST_COMBAT_TEXT_DELAY() * (2 + ((float)(iDelay++) * 0.5f));8637									DLLUI->AddPopupText(pCity->getX(), pCity->getY(), text, fDelay);8638#endif8639								}8640							}8641						}8642					}8643#else8644					iScienceBonus = pReligion->m_Beliefs.GetSciencePerOtherReligionFollower();8645					if(iScienceBonus > 0)8646					{8647						// Requires majority for this city to be another religion8648						ReligionTypes eCurrentReligion = pCity->GetCityReligions()->GetReligiousMajority();8649						if (eCurrentReligion != NO_RELIGION && eCurrentReligion != eReligion)8650						{8651							iScienceBonus *= pCity->GetCityReligions()->GetFollowersOtherReligions(eReligion);8652						}8653						else8654						{8655							iScienceBonus = 0;8656						}8657					}8658#endif8659				}8660			}86618662			if(IsGreatPerson())8663			{8664				pCity->GetCityReligions()->AddProphetSpread(eReligion, iConversionStrength, getOwner());8665			}8666			else8667			{8668				pCity->GetCityReligions()->AddReligiousPressure(FOLLOWER_CHANGE_MISSIONARY, eReligion, iConversionStrength, getOwner());8669			}8670			GetReligionData()->SetSpreadsLeft(GetReligionData()->GetSpreadsLeft() - 1);86718672			if (pCity->plot() && pCity->plot()->GetActiveFogOfWarMode() == FOGOFWARMODE_OFF)8673			{8674#if defined(MOD_BUGFIX_USE_GETTERS)8675				const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(GetReligionData()->GetReligion(), getOwner());8676#else8677				const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(GetReligionData()->GetReligion(), m_eOwner);8678#endif8679				Localization::String strReligionName = Localization::Lookup(pReligion->GetName());86808681				char text[256] = {0};8682				sprintf_s(text, "[COLOR_WHITE]%s: %d [ICON_PEACE][ENDCOLOR]",8683					strReligionName.toUTF8(),8684					iConversionStrength / GC.getRELIGION_MISSIONARY_PRESSURE_MULTIPLIER());8685#if defined(SHOW_PLOT_POPUP)8686				SHOW_PLOT_POPUP(pCity->plot(), getOwner(), text, 0.0f);8687#else8688				float fDelay = 0.0f;8689				DLLUI->AddPopupText(pCity->getX(), pCity->getY(), text, fDelay);8690#endif8691			}86928693#if !defined(MOD_API_UNIFIED_YIELDS)8694			if (iScienceBonus > 0)8695			{8696#if defined(MOD_BUGFIX_USE_GETTERS)8697				CvPlayer &kPlayer = GET_MY_PLAYER();8698#else8699				CvPlayer &kPlayer = GET_PLAYER(m_eOwner);8700#endif87018702				TechTypes eCurrentTech = kPlayer.GetPlayerTechs()->GetCurrentResearch();8703				if(eCurrentTech == NO_TECH)8704				{8705					kPlayer.changeOverflowResearch(iScienceBonus);8706				}8707				else8708				{8709					CvTeam &kTeam = GET_TEAM(kPlayer.getTeam());8710					kTeam.GetTeamTechs()->ChangeResearchProgress(eCurrentTech, iScienceBonus, kPlayer.GetID());8711				}87128713				if (pCity->plot() && pCity->plot()->GetActiveFogOfWarMode() == FOGOFWARMODE_OFF)8714				{8715					char text[256] = {0};8716					sprintf_s(text, "[COLOR_BLUE]+%d[ENDCOLOR][ICON_RESEARCH]", iScienceBonus);8717					float fDelay = GC.getPOST_COMBAT_TEXT_DELAY() * 2;8718#if defined(SHOW_PLOT_POPUP)8719					SHOW_PLOT_POPUP(pCity->plot(), getOwner(), text, fDelay);8720#else8721					DLLUI->AddPopupText(pCity->getX(), pCity->getY(), text, fDelay);8722#endif8723				}8724			}8725#endif87268727			bool bShow = plot()->isActiveVisible(false);8728			if(bShow)8729			{8730				auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(this));8731				gDLL->GameplayUnitActivate(pDllUnit.get());8732			}87338734			if(GetReligionData()->GetSpreadsLeft() <= 0)8735			{8736				if(IsGreatPerson())8737				{8738					CvPlayer& kPlayer = GET_PLAYER(getOwner());8739#if defined(MOD_EVENTS_GREAT_PEOPLE)8740					kPlayer.DoGreatPersonExpended(getUnitType(), this);8741#else8742					kPlayer.DoGreatPersonExpended(getUnitType());8743#endif8744				}87458746				kill(true);8747			}8748			else8749			{8750				if(bShow)8751				{8752					// Because the "Activate" animation will possibly put the animation state into a end-state, we will force a reset, since the unit will still be alive8753					auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(this));8754					gDLL->GameplayUnitResetAnimationState(pDllUnit.get());8755				}87568757				finishMoves();8758			}87598760#if !defined(NO_ACHIEVEMENTS)8761			//Achievements8762			const PlayerTypes eActivePlayer = GC.getGame().getActivePlayer();8763			if(getOwner() == eActivePlayer && pCity->getOwner() != eActivePlayer)8764			{8765				gDLL->UnlockAchievement(ACHIEVEMENT_XP1_17);8766			}8767#endif8768		}8769	}87708771	return false;8772}

Calls

Called by