Hooks
static bool BeforeCvCityReligions_CityConvertsReligion(CvCityReligions* self, ReligionTypes eMajority, ReligionTypes eOldMajority, PlayerTypes eResponsibleParty);static void AfterCvCityReligions_CityConvertsReligion(CvCityReligions* self, ReligionTypes eMajority, ReligionTypes eOldMajority, PlayerTypes eResponsibleParty);static void ReplaceCvCityReligions_CityConvertsReligion(void (*original)(CvCityReligions*, ReligionTypes, ReligionTypes, PlayerTypes), CvCityReligions* self, ReligionTypes eMajority, ReligionTypes eOldMajority, PlayerTypes eResponsibleParty);CivRegisterBefore<CivHooks::CvCityReligions_CityConvertsReligion>(host, &BeforeCvCityReligions_CityConvertsReligion);CivRegisterAfter<CivHooks::CvCityReligions_CityConvertsReligion>(host, &AfterCvCityReligions_CityConvertsReligion);CivRegisterReplace<CivHooks::CvCityReligions_CityConvertsReligion>(host, &ReplaceCvCityReligions_CityConvertsReligion);
Code
4548/// Implement changes from a city changing religion4549void CvCityReligions::CityConvertsReligion(ReligionTypes eMajority, ReligionTypes eOldMajority, PlayerTypes eResponsibleParty)4550{4551 CvGameReligions* pReligions = GC.getGame().GetGameReligions();45524553 m_pCity->UpdateReligion(eMajority);45544555 if(eOldMajority > RELIGION_PANTHEON)4556 {4557 const CvReligion* pOldReligion = pReligions->GetReligion(eOldMajority, NO_PLAYER);4558 GET_PLAYER(pOldReligion->m_eFounder).UpdateReligion();4559 }45604561 if(eMajority > RELIGION_PANTHEON)4562 {4563 const CvReligion* pNewReligion = pReligions->GetReligion(eMajority, NO_PLAYER);4564 GET_PLAYER(pNewReligion->m_eFounder).UpdateReligion();45654566 // Pay adoption bonuses (if any)4567 if(!m_bHasPaidAdoptionBonus)4568 {4569 int iGoldBonus = pNewReligion->m_Beliefs.GetGoldWhenCityAdopts();4570 iGoldBonus *= GC.getGame().getGameSpeedInfo().getTrainPercent();;4571 iGoldBonus /= 100;45724573 if(iGoldBonus > 0)4574 {4575 GET_PLAYER(pNewReligion->m_eFounder).GetTreasury()->ChangeGold(iGoldBonus);4576 SetPaidAdoptionBonus(true);45774578 if(pNewReligion->m_eFounder == GC.getGame().getActivePlayer())4579 {4580 char text[256] = {0};4581 sprintf_s(text, "[COLOR_YELLOW]+%d[ENDCOLOR][ICON_GOLD]", iGoldBonus);4582#if defined(SHOW_PLOT_POPUP)4583 SHOW_PLOT_POPUP(m_pCity->plot(), NO_PLAYER, text, 0.5f);4584#else4585 GC.GetEngineUserInterface()->AddPopupText(m_pCity->getX(), m_pCity->getY(), text, 0.5f);4586#endif4587 }4588 }4589 }45904591 // Notification if the player's city was converted to a religion they didn't found4592 PlayerTypes eOwnerPlayer = m_pCity->getOwner();4593 CvPlayerAI& kOwnerPlayer = GET_PLAYER(eOwnerPlayer);4594 const ReligionTypes eOwnerPlayerReligion = kOwnerPlayer.GetReligions()->GetReligionCreatedByPlayer();45954596 if(eOwnerPlayer != eResponsibleParty && eMajority != eOldMajority && pNewReligion->m_eFounder != eOwnerPlayer4597 && eOwnerPlayerReligion > RELIGION_PANTHEON)4598 {4599 if(kOwnerPlayer.GetNotifications())4600 {4601 Localization::String strMessage;4602 Localization::String strSummary;4603 strMessage = GetLocalizedText("TXT_KEY_NOTIFICATION_RELIGION_SPREAD_ACTIVE_PLAYER", m_pCity->getName());4604 strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_RELIGION_SPREAD_ACTIVE_PLAYER_S");4605#if defined(MOD_API_EXTENSIONS)4606 kOwnerPlayer.GetNotifications()->Add(NOTIFICATION_RELIGION_SPREAD, strMessage.toUTF8(), strSummary.toUTF8(), m_pCity->getX(), m_pCity->getY(), eMajority, -1);4607#else4608 kOwnerPlayer.GetNotifications()->Add(NOTIFICATION_RELIGION_SPREAD, strMessage.toUTF8(), strSummary.toUTF8(), m_pCity->getX(), m_pCity->getY(), -1);4609#endif4610 }46114612#if !defined(NO_ACHIEVEMENTS)4613 //Achievements!4614 if(eOwnerPlayer == GC.getGame().getActivePlayer()){4615 const CvReligion* pkReligion = GC.getGame().GetGameReligions()->GetReligion(eOwnerPlayerReligion, eOwnerPlayer);4616 if(pkReligion != NULL)4617 {4618 if(m_pCity->getX() == pkReligion->m_iHolyCityX && m_pCity->getY() == pkReligion->m_iHolyCityY)4619 {4620 gDLL->UnlockAchievement(ACHIEVEMENT_XP1_20);4621 }4622 }4623 }4624#endif4625 }46264627 else if(eOwnerPlayer != eResponsibleParty && eMajority != eOldMajority && eOldMajority == NO_RELIGION)4628 {4629 if(kOwnerPlayer.GetNotifications())4630 {4631 Localization::String strMessage;4632 Localization::String strSummary;4633 strMessage = GetLocalizedText("TXT_KEY_NOTIFICATION_RELIGION_SPREAD_INITIAL_CONVERSION", m_pCity->getName());4634 strSummary = Localization::Lookup("TXT_KEY_NOTIFICATION_RELIGION_SPREAD_INITIAL_CONVERSION_S");4635#if defined(MOD_API_EXTENSIONS)4636 kOwnerPlayer.GetNotifications()->Add(NOTIFICATION_RELIGION_SPREAD_NATURAL, strMessage.toUTF8(), strSummary.toUTF8(), m_pCity->getX(), m_pCity->getY(), eMajority, -1);4637#else4638 kOwnerPlayer.GetNotifications()->Add(NOTIFICATION_RELIGION_SPREAD_NATURAL, strMessage.toUTF8(), strSummary.toUTF8(), m_pCity->getX(), m_pCity->getY(), -1);4639#endif4640 }4641 }46424643#if !defined(NO_ACHIEVEMENTS)4644 //More Achievements4645 if(m_pCity->getOwner() != GC.getGame().getActivePlayer() && pNewReligion->m_eFounder == GC.getGame().getActivePlayer())4646 {4647 if(m_pCity->GetCityReligions()->IsHolyCityAnyReligion() && !m_pCity->GetCityReligions()->IsHolyCityForReligion(pNewReligion->m_eReligion))4648 {4649 gDLL->UnlockAchievement(ACHIEVEMENT_XP1_18);4650 }4651 }46524653 if(m_pCity->isCapital() && pNewReligion->m_eFounder == GC.getGame().getActivePlayer())4654 {4655 //Determine if this is a standard size or larger map.4656 bool bIsStandardOrLarger = false;4657 Database::Connection* pDB = GC.GetGameDatabase();4658 Database::Results kStandardSize;4659 if(pDB->SelectAt(kStandardSize, "Worlds", "Type", "WORLDSIZE_STANDARD"))4660 {4661 if(kStandardSize.Step())4662 {4663 int idColumn = kStandardSize.ColumnPosition("ID");4664 if(idColumn >= 0)4665 {4666 WorldSizeTypes eWorldSize = GC.getMap().getWorldSize();4667 int standardWorldSize = kStandardSize.GetInt(idColumn);4668 if(eWorldSize >= standardWorldSize)4669 {4670 bIsStandardOrLarger = true;4671 }4672 }4673 }4674 }46754676 if(bIsStandardOrLarger)4677 {4678 //Determine if this religion has spread to all capitals4679 bool bSpreadToAllCapitals = true;4680 for(int i = 0; i < MAX_MAJOR_CIVS; ++i)4681 {4682 CvPlayerAI& kPlayer = GET_PLAYER(static_cast<PlayerTypes>(i));4683 if(kPlayer.isAlive())4684 {4685 CvCity* pCapital = kPlayer.getCapitalCity();4686 if(pCapital != NULL)4687 {4688 CvCityReligions* pCityReligions = pCapital->GetCityReligions();4689 if(pCityReligions != NULL)4690 {4691 if(pCityReligions->GetReligiousMajority() != pNewReligion->m_eFounder)4692 {4693 bSpreadToAllCapitals = false;4694 break;4695 }4696 }4697 }4698 }46994700 if(bSpreadToAllCapitals)4701 {4702 gDLL->UnlockAchievement(ACHIEVEMENT_XP1_19);4703 }4704 }4705 }4706 }4707#endif47084709 // Diplo implications (there must have been religion switch and a responsible party)4710 if(eMajority != eOldMajority && eResponsibleParty != NO_PLAYER)4711 {4712 // Is the city owner not the founder of this religion?4713 if(pNewReligion->m_eFounder != m_pCity->getOwner())4714 {4715 CvPlayer& kCityOwnerPlayer = GET_PLAYER(m_pCity->getOwner());47164717 // Did he found another religion?4718 ReligionTypes eCityOwnerReligion = kCityOwnerPlayer.GetReligions()->GetReligionCreatedByPlayer();4719 if(eCityOwnerReligion >= RELIGION_PANTHEON)4720 {4721 int iPoints = 0;47224723 // His religion wasn't present here, minor hit4724 if(eOldMajority != eCityOwnerReligion)4725 {4726 iPoints = GC.getRELIGION_DIPLO_HIT_INITIAL_CONVERT_FRIENDLY_CITY(); /*1*/4727 }47284729 // This was his holy city; huge hit!4730 else if(m_pCity->GetCityReligions()->IsHolyCityForReligion(eCityOwnerReligion))4731 {4732 iPoints = GC.getRELIGION_DIPLO_HIT_CONVERT_HOLY_CITY(); /*25*/4733 }47344735 // He had established his religion here, major hit4736 else4737 {4738 iPoints = GC.getRELIGION_DIPLO_HIT_RELIGIOUS_FLIP_FRIENDLY_CITY(); /*3*/4739 }47404741 kCityOwnerPlayer.GetDiplomacyAI()->ChangeNegativeReligiousConversionPoints(eResponsibleParty, iPoints);4742 }4743 }4744 }47454746 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();4747 if(pkScriptSystem)4748 {4749 CvLuaArgsHandle args;4750 args->Push(m_pCity->getOwner());4751 args->Push(eMajority);4752 args->Push(m_pCity->getX());4753 args->Push(m_pCity->getY());47544755 // Attempt to execute the game events.4756 // Will return false if there are no registered listeners.4757 bool bResult = false;4758 LuaSupport::CallHook(pkScriptSystem, "CityConvertsReligion", args.get(), bResult);4759 }4760 }4761}