Hooks
static bool BeforeCvCityCulture_GetTourismTooltip(CvCityCulture* self, CvString& result);static void AfterCvCityCulture_GetTourismTooltip(CvCityCulture* self, CvString& result);static CvString ReplaceCvCityCulture_GetTourismTooltip(CvString (*original)(CvCityCulture*), CvCityCulture* self);CivRegisterBefore<CivHooks::CvCityCulture_GetTourismTooltip>(host, &BeforeCvCityCulture_GetTourismTooltip);CivRegisterAfter<CivHooks::CvCityCulture_GetTourismTooltip>(host, &AfterCvCityCulture_GetTourismTooltip);CivRegisterReplace<CivHooks::CvCityCulture_GetTourismTooltip>(host, &ReplaceCvCityCulture_GetTourismTooltip);
Code
4706/// What is the tooltip describing the tourism output?4707CvString CvCityCulture::GetTourismTooltip()4708{4709 CvString szRtnValue = "";4710 CvString szTemp;4711 CvString sharedReligionCivs = "";4712 CvString openBordersCivs = "";4713 CvString tradeRouteCivs = "";4714 CvString lessHappyCivs = "";4715 CvString commonFoeCivs = "";4716 CvString sharedIdeologyCivs = "";4717 CvString differentIdeologyCivs = "";4718 TeamTypes eTeam = m_pCity->getTeam();4719 CvPlayer &kCityPlayer = GET_PLAYER(m_pCity->getOwner());4720 PolicyBranchTypes eMyIdeology = kCityPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();4721 ReligionTypes ePlayerReligion = kCityPlayer.GetReligions()->GetReligionInMostCities();47224723 // Great Works4724#if defined(MOD_GLOBAL_GREATWORK_YIELDTYPES)4725 // Ignore those Great Works in storage, ie not generating a yield4726 int iGWTourism = GetNumGreatWorks(false) * GC.getBASE_TOURISM_PER_GREAT_WORK();4727#else4728 int iGWTourism = GetNumGreatWorks() * GC.getBASE_TOURISM_PER_GREAT_WORK();4729#endif4730 iGWTourism += (m_pCity->GetCityBuildings()->GetGreatWorksTourismModifier() * iGWTourism / 100);4731 szRtnValue = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_GREAT_WORKS", iGWTourism, m_pCity->GetCityCulture()->GetNumGreatWorks());47324733#if defined(MOD_GLOBAL_GREATWORK_YIELDTYPES)4734 int iThemingBonuses = m_pCity->GetCityBuildings()->GetThemingBonuses(YIELD_CULTURE);4735#else4736 int iThemingBonuses = m_pCity->GetCityBuildings()->GetThemingBonuses();4737#endif4738 if (iThemingBonuses > 0)4739 {4740 szRtnValue += "[NEWLINE][NEWLINE]";4741 szRtnValue += GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_THEMING_BONUSES", iThemingBonuses);4742 }47434744 // Landmarks, Wonders, Natural Wonders, Improvements4745 int iTileTourism = 0;4746 int iPercent = m_pCity->GetCityBuildings()->GetLandmarksTourismPercent();4747 if (iPercent > 0)4748 {4749 int iFromWonders = GetCultureFromWonders();4750 int iFromNaturalWonders = GetCultureFromNaturalWonders();4751#if defined(MOD_API_UNIFIED_YIELDS)4752 int iFromImprovements = GetYieldFromImprovements(YIELD_CULTURE);4753#else4754 int iFromImprovements = GetCultureFromImprovements();4755#endif4756 iTileTourism = ((iFromWonders + iFromNaturalWonders + iFromImprovements) * iPercent / 100);4757 if (szRtnValue.length() > 0)4758 {4759 szRtnValue += "[NEWLINE][NEWLINE]";4760 }4761 szRtnValue += GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_TILES", iTileTourism, iPercent);4762 }47634764 // Beliefs4765 int iSacredSitesTourism = 0;4766 int iReligiousArtTourism = 0;4767 ReligionTypes eMajority = m_pCity->GetCityReligions()->GetReligiousMajority();4768 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, m_pCity->getOwner());4769 if(pReligion)4770 {4771 int iFaithBuildingTourism = pReligion->m_Beliefs.GetFaithBuildingTourism();4772 if (iFaithBuildingTourism > 0)4773 {4774 iSacredSitesTourism = m_pCity->GetCityBuildings()->GetNumBuildingsFromFaith() * iFaithBuildingTourism;4775 }4776 if (szRtnValue.length() > 0)4777 {4778 szRtnValue += "[NEWLINE][NEWLINE]";4779 }4780 szRtnValue += GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_FAITH_BUILDINGS", iSacredSitesTourism);47814782 for(int jJ = 0; jJ < GC.getNumBuildingClassInfos(); jJ++)4783 {4784 BuildingClassTypes eBuildingClass = (BuildingClassTypes)jJ;47854786 CvBuildingClassInfo* pkBuildingClassInfo = GC.getBuildingClassInfo(eBuildingClass);4787 if(!pkBuildingClassInfo)4788 {4789 continue;4790 }47914792 CvCivilizationInfo& playerCivilizationInfo = GET_PLAYER(m_pCity->getOwner()).getCivilizationInfo();4793 BuildingTypes eBuilding = (BuildingTypes)playerCivilizationInfo.getCivilizationBuildings(eBuildingClass);47944795 if(eBuilding != NO_BUILDING)4796 {4797 if(m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding) > 0)4798 {4799#if defined(MOD_BUGFIX_MINOR)4800 iReligiousArtTourism += pReligion->m_Beliefs.GetBuildingClassTourism(eBuildingClass) * m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding);4801#else4802 iReligiousArtTourism += pReligion->m_Beliefs.GetBuildingClassTourism(eBuildingClass);4803#endif4804 }4805 }4806 }4807 if (szRtnValue.length() > 0)4808 {4809 szRtnValue += "[NEWLINE][NEWLINE]";4810 }4811 szRtnValue += GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_RELIGIOUS_ART", iReligiousArtTourism);4812 }48134814 // Tech enhanced Tourism4815 for(int jJ = 0; jJ < GC.getNumBuildingClassInfos(); jJ++)4816 {4817 BuildingClassTypes eBuildingClass = (BuildingClassTypes)jJ;48184819 CvBuildingClassInfo* pkBuildingClassInfo = GC.getBuildingClassInfo(eBuildingClass);4820 if(!pkBuildingClassInfo)4821 {4822 continue;4823 }48244825 CvCivilizationInfo& playerCivilizationInfo = GET_PLAYER(m_pCity->getOwner()).getCivilizationInfo();4826 BuildingTypes eBuilding = (BuildingTypes)playerCivilizationInfo.getCivilizationBuildings(eBuildingClass);48274828 if(eBuilding != NO_BUILDING)4829 {4830 if(m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding) > 0)4831 {4832 int iTechEnhancedTourism = GC.getBuildingInfo(eBuilding)->GetTechEnhancedTourism();4833 if (iTechEnhancedTourism > 0 && GET_TEAM(m_pCity->getTeam()).GetTeamTechs()->HasTech((TechTypes)GC.getBuildingInfo(eBuilding)->GetEnhancedYieldTech()))4834 {4835#if defined(MOD_BUGFIX_MINOR)4836 iTechEnhancedTourism *= m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding);4837#endif4838 if (szRtnValue.length() > 0)4839 {4840 szRtnValue += "[NEWLINE][NEWLINE]";4841 }4842 szRtnValue += GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_TECH_ENHANCED", iTechEnhancedTourism);4843 }4844 }4845 }4846 }48474848 int iBuildingMod = 0;4849 for(int iBuildingClassLoop = 0; iBuildingClassLoop < GC.getNumBuildingClassInfos(); iBuildingClassLoop++)4850 {4851 CvCivilizationInfo& playerCivilizationInfo = kCityPlayer.getCivilizationInfo();4852 BuildingTypes eBuilding = (BuildingTypes)playerCivilizationInfo.getCivilizationBuildings((BuildingClassTypes)iBuildingClassLoop);4853 if (eBuilding != NO_BUILDING)4854 {4855 CvBuildingEntry *pkEntry = GC.getBuildingInfo(eBuilding);4856 if (pkEntry)4857 {4858 iBuildingMod = kCityPlayer.GetPlayerPolicies()->GetBuildingClassTourismModifier((BuildingClassTypes)iBuildingClassLoop);4859 if (iBuildingMod != 0 && m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding) > 0)4860 {4861#if defined(MOD_BUGFIX_MINOR)4862 iBuildingMod *= m_pCity->GetCityBuildings()->GetNumBuilding(eBuilding);4863#endif4864 if (szRtnValue.length() > 0)4865 {4866 szRtnValue += "[NEWLINE][NEWLINE]";4867 }4868 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_BUILDING_BONUS", iBuildingMod, pkEntry->GetDescription());4869 szRtnValue += szTemp;4870 }4871 }4872 }4873 }48744875 // Get policy bonuses4876 int iLessHappyMod = kCityPlayer.GetPlayerPolicies()->GetNumericModifier(POLICYMOD_TOURISM_MOD_LESS_HAPPY);4877 int iCommonFoeMod = kCityPlayer.GetPlayerPolicies()->GetNumericModifier(POLICYMOD_TOURISM_MOD_COMMON_FOE);4878 int iSharedIdeologyMod = kCityPlayer.GetPlayerPolicies()->GetNumericModifier(POLICYMOD_TOURISM_MOD_SHARED_IDEOLOGY);48794880 // If generating any, itemize which players we have bonuses with4881 if (iGWTourism > 0 || iTileTourism > 0)4882 {4883 for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)4884 {4885 CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);4886 PolicyBranchTypes eTheirIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();4887 if (kPlayer.isAlive() && !kPlayer.isMinorCiv() && iLoopPlayer != m_pCity->getOwner() && GET_TEAM(kCityPlayer.getTeam()).isHasMet(GET_PLAYER((PlayerTypes)iLoopPlayer).getTeam()))4888 {4889 // City shares religion with this player4890 if (kPlayer.GetReligions()->HasReligionInMostCities(ePlayerReligion))4891 {4892 if (sharedReligionCivs.length() > 0)4893 {4894 sharedReligionCivs += ", ";4895 }4896 sharedReligionCivs += kPlayer.getCivilizationShortDescription();4897 }48984899 // Open borders with this player4900 CvTeam &kTeam = GET_TEAM(kPlayer.getTeam());4901 if (kTeam.IsAllowsOpenBordersToTeam(eTeam))4902 {4903 if (openBordersCivs.length() > 0)4904 {4905 openBordersCivs += ", ";4906 }4907 openBordersCivs += kPlayer.getCivilizationShortDescription();4908 }49094910 // Trade route with this player4911 if (GC.getGame().GetGameTrade()->IsPlayerConnectedToPlayer(m_pCity->getOwner(), (PlayerTypes)iLoopPlayer))4912 {4913 if (tradeRouteCivs.length() > 0)4914 {4915 tradeRouteCivs += ", ";4916 }4917 tradeRouteCivs += kPlayer.getCivilizationShortDescription();4918 }49194920 // POLICY BONUSES4921 if (iLessHappyMod > 0)4922 {4923 if (kCityPlayer.GetExcessHappiness() > kPlayer.GetExcessHappiness())4924 {4925 if (lessHappyCivs.length() > 0)4926 {4927 lessHappyCivs += ", ";4928 }4929 lessHappyCivs += kPlayer.getCivilizationShortDescription();4930 }4931 }4932 if (iCommonFoeMod > 0)4933 {4934 PlayerTypes eLoopPlayer;4935 for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)4936 {4937 eLoopPlayer = (PlayerTypes) iPlayerLoop;49384939 if(eLoopPlayer !=(PlayerTypes) iLoopPlayer && eLoopPlayer != m_pCity->getOwner() && kCityPlayer.GetDiplomacyAI()->IsPlayerValid(eLoopPlayer))4940 {4941 // Are they at war with me too?4942 if (GET_TEAM(kCityPlayer.getTeam()).isAtWar(GET_PLAYER(eLoopPlayer).getTeam()) && GET_TEAM(kPlayer.getTeam()).isAtWar(GET_PLAYER(eLoopPlayer).getTeam()))4943 {4944 if (commonFoeCivs.length() > 0)4945 {4946 commonFoeCivs += ", ";4947 }4948 commonFoeCivs += kPlayer.getCivilizationShortDescription();4949 }4950 }4951 }4952 }49534954 // Shared ideology bonus (comes from a policy)4955 if (iSharedIdeologyMod > 0)4956 {4957 if (eMyIdeology != NO_POLICY_BRANCH_TYPE && eTheirIdeology != NO_POLICY_BRANCH_TYPE && eMyIdeology == eTheirIdeology)4958 {4959 if (sharedIdeologyCivs.length() > 0)4960 {4961 sharedIdeologyCivs += ", ";4962 }4963 sharedIdeologyCivs += kPlayer.getCivilizationShortDescription();4964 }4965 }49664967 // Different ideology penalty (applies all the time)4968 if (eMyIdeology != NO_POLICY_BRANCH_TYPE && eTheirIdeology != NO_POLICY_BRANCH_TYPE && eMyIdeology != eTheirIdeology)4969 {4970 if (differentIdeologyCivs.length() > 0)4971 {4972 differentIdeologyCivs += ", ";4973 }4974 differentIdeologyCivs += kPlayer.getCivilizationShortDescription();4975 }4976 }4977 }49784979 // Build the strings4980 if (sharedReligionCivs.length() > 0)4981 {4982 if (szRtnValue.length() > 0)4983 {4984 szRtnValue += "[NEWLINE][NEWLINE]";4985 }4986 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_RELIGION_BONUS", kCityPlayer.GetCulture()->GetTourismModifierSharedReligion());4987 szRtnValue += szTemp + sharedReligionCivs;4988 }4989 if (openBordersCivs.length() > 0)4990 {4991 if (szRtnValue.length() > 0)4992 {4993 szRtnValue += "[NEWLINE][NEWLINE]";4994 }4995 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_OPEN_BORDERS_BONUS", kCityPlayer.GetCulture()->GetTourismModifierOpenBorders());4996 szRtnValue += szTemp + openBordersCivs;4997 }4998 if (tradeRouteCivs.length() > 0)4999 {5000 if (szRtnValue.length() > 0)5001 {5002 szRtnValue += "[NEWLINE][NEWLINE]";5003 }5004 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_TRADE_ROUTE_BONUS", kCityPlayer.GetCulture()->GetTourismModifierTradeRoute());5005 szRtnValue += szTemp + tradeRouteCivs;5006 }5007 if (lessHappyCivs.length() > 0)5008 {5009 if (szRtnValue.length() > 0)5010 {5011 szRtnValue += "[NEWLINE][NEWLINE]";5012 }5013 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_LESS_HAPPY_BONUS", iLessHappyMod);5014 szRtnValue += szTemp + lessHappyCivs;5015 }5016 if (commonFoeCivs.length() > 0)5017 {5018 if (szRtnValue.length() > 0)5019 {5020 szRtnValue += "[NEWLINE][NEWLINE]";5021 }5022 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_COMMON_FOE_BONUS", iCommonFoeMod);5023 szRtnValue += szTemp + commonFoeCivs;5024 }5025 if (sharedIdeologyCivs.length() > 0)5026 {5027 if (szRtnValue.length() > 0)5028 {5029 szRtnValue += "[NEWLINE][NEWLINE]";5030 }5031 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_SHARED_IDEOLOGY_BONUS", iSharedIdeologyMod);5032 szRtnValue += szTemp + sharedIdeologyCivs;5033 }5034 if (differentIdeologyCivs.length() > 0)5035 {5036 if (szRtnValue.length() > 0)5037 {5038 szRtnValue += "[NEWLINE][NEWLINE]";5039 }5040 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_DIFFERENT_IDEOLOGY_PENALTY", GC.getTOURISM_MODIFIER_DIFFERENT_IDEOLOGIES());5041 szRtnValue += szTemp + differentIdeologyCivs;5042 }5043 }50445045 int iTechSpreadModifier = kCityPlayer.GetInfluenceSpreadModifier();5046 if (iTechSpreadModifier > 0)5047 {5048 if (szRtnValue.length() > 0)5049 {5050 szRtnValue += "[NEWLINE][NEWLINE]";5051 }5052 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_TECH_BONUS", iTechSpreadModifier);5053 szRtnValue += szTemp;5054 }5055 int iLeagueCityModifier = GC.getGame().GetGameLeagues()->GetCityTourismModifier(m_pCity->getOwner(), m_pCity);5056 if (iLeagueCityModifier > 0)5057 {5058 if (szRtnValue.length() > 0)5059 {5060 szRtnValue += "[NEWLINE][NEWLINE]";5061 }5062 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_LEAGUES_BONUS", iLeagueCityModifier);5063 szRtnValue += szTemp;5064 }50655066 if (kCityPlayer.isGoldenAge() && kCityPlayer.GetPlayerTraits()->GetGoldenAgeTourismModifier())5067 {5068 if (szRtnValue.length() > 0)5069 {5070 szRtnValue += "[NEWLINE][NEWLINE]";5071 }5072 szTemp = GetLocalizedText("TXT_KEY_CO_CITY_TOURISM_CARNIVAL_BONUS", kCityPlayer.GetPlayerTraits()->GetGoldenAgeTourismModifier());5073 szRtnValue += szTemp;5074 }50755076 return szRtnValue;5077}