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}