Bazaar developer reference

CvPlayerCulture::DoPublicOpinion()

Defined in
CvCultureClasses.cpp, line 3470
Class
CvPlayerCulture
Hook name
CivHooks::CvPlayerCulture_DoPublicOpinion

Hooks

static bool BeforeCvPlayerCulture_DoPublicOpinion(CvPlayerCulture* self);static void AfterCvPlayerCulture_DoPublicOpinion(CvPlayerCulture* self);static void ReplaceCvPlayerCulture_DoPublicOpinion(void (*original)(CvPlayerCulture*), CvPlayerCulture* self);CivRegisterBefore<CivHooks::CvPlayerCulture_DoPublicOpinion>(host, &BeforeCvPlayerCulture_DoPublicOpinion);CivRegisterAfter<CivHooks::CvPlayerCulture_DoPublicOpinion>(host, &AfterCvPlayerCulture_DoPublicOpinion);CivRegisterReplace<CivHooks::CvPlayerCulture_DoPublicOpinion>(host, &ReplaceCvPlayerCulture_DoPublicOpinion);

Code

3469/// Once per turn calculation of public opinion data3470void CvPlayerCulture::DoPublicOpinion()3471{3472	m_eOpinion = NO_PUBLIC_OPINION;3473	m_ePreferredIdeology = NO_POLICY_BRANCH_TYPE;3474	m_iOpinionUnhappiness = 0;3475	m_strOpinionTooltip = "";3476	m_strOpinionUnhappinessTooltip = "";3477	m_eOpinionBiggestInfluence = NO_PLAYER;34783479	PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM();3480	PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY();3481	PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER();34823483	if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE)3484	{3485		return;3486	}34873488	Localization::String locOverview = Localization::Lookup("TXT_KEY_CO_OPINION_TT_OVERVIEW");3489	m_strOpinionTooltip += locOverview.toUTF8();34903491	PolicyBranchTypes eCurrentIdeology = m_pPlayer->GetPlayerPolicies()->GetLateGamePolicyTree();34923493	// We have an ideology, so public opinion matters3494	if (eCurrentIdeology != NO_POLICY_BRANCH_TYPE)3495	{3496		int iPressureForFreedom = 0;3497		int iPressureForAutocracy = 0;3498		int iPressureForOrder = 0;3499		CvString strWorldIdeologyPressureString = "";3500		CvString strFreedomPressureString = "";3501		CvString strAutocracyPressureString = "";3502		CvString strOrderPressureString = "";35033504		// Look at World Congress3505		iPressureForFreedom += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eFreedomBranch);3506		if (iPressureForFreedom > 0)3507		{3508			Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_FREEDOM");3509			CvString sIcons = "";3510			for (int i = 0; i < iPressureForFreedom; i++)3511			{3512				sIcons += "[ICON_IDEOLOGY_FREEDOM]";3513			}3514			sTemp << sIcons;3515			strWorldIdeologyPressureString += sTemp.toUTF8();3516		}3517		iPressureForAutocracy += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eAutocracyBranch);3518		if (iPressureForAutocracy > 0)3519		{3520			Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_AUTOCRACY");3521			CvString sIcons = "";3522			for (int i = 0; i < iPressureForAutocracy; i++)3523			{3524				sIcons += "[ICON_IDEOLOGY_AUTOCRACY]";3525			}3526			sTemp << sIcons;3527			strWorldIdeologyPressureString += sTemp.toUTF8();3528		}3529		iPressureForOrder += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eOrderBranch);3530		if (iPressureForOrder > 0)3531		{3532			Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_ORDER");3533			CvString sIcons = "";3534			for (int i = 0; i < iPressureForOrder; i++)3535			{3536				sIcons += "[ICON_IDEOLOGY_ORDER]";3537			}3538			sTemp << sIcons;3539			strWorldIdeologyPressureString += sTemp.toUTF8();3540		}35413542		// Look at each civ3543		for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)3544		{3545			CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);3546			if (iLoopPlayer != m_pPlayer->GetID() && kPlayer.isAlive() && !kPlayer.isMinorCiv())3547			{3548				PolicyBranchTypes eOtherCivIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();3549				if (eOtherCivIdeology != NO_POLICY_BRANCH_TYPE)3550				{3551					int iCulturalDominanceOverUs = kPlayer.GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - m_pPlayer->GetCulture()->GetInfluenceLevel((PlayerTypes)iLoopPlayer);3552					if (iCulturalDominanceOverUs > 0)3553					{3554						if (eOtherCivIdeology == eFreedomBranch)3555						{3556							iPressureForFreedom += iCulturalDominanceOverUs;3557							if (strFreedomPressureString.size() > 0)3558							{3559								strFreedomPressureString += ", ";3560							}3561							strFreedomPressureString += kPlayer.getCivilizationShortDescription();3562							for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)3563							{3564								strFreedomPressureString += "[ICON_IDEOLOGY_FREEDOM]";3565							}3566						}3567						else if (eOtherCivIdeology == eAutocracyBranch)3568						{3569							iPressureForAutocracy += iCulturalDominanceOverUs;3570							if (strAutocracyPressureString.size() > 0)3571							{3572								strAutocracyPressureString += ", ";3573							}3574							strAutocracyPressureString += kPlayer.getCivilizationShortDescription();3575							for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)3576							{3577								strAutocracyPressureString += "[ICON_IDEOLOGY_AUTOCRACY]";3578							}3579						}3580						else3581						{3582							iPressureForOrder += iCulturalDominanceOverUs;3583							if (strOrderPressureString.size() > 0)3584							{3585								strOrderPressureString += ", ";3586							}3587							strOrderPressureString += kPlayer.getCivilizationShortDescription();3588							for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)3589							{3590								strOrderPressureString += "[ICON_IDEOLOGY_ORDER]";3591							}3592						}3593					}3594				}3595			}3596		}35973598		// Now compute satisfaction with this branch compared to two other ones3599		int iDissatisfaction = 0;3600		if (eCurrentIdeology == eFreedomBranch)3601		{3602			if (iPressureForFreedom >= (iPressureForAutocracy + iPressureForOrder))3603			{3604				m_eOpinion = PUBLIC_OPINION_CONTENT;3605			}3606			else3607			{3608				if (iPressureForAutocracy > iPressureForOrder)3609				{3610					m_ePreferredIdeology = eAutocracyBranch;3611				}3612				else if (iPressureForOrder >= iPressureForAutocracy)3613				{3614					m_ePreferredIdeology = eOrderBranch;3615				}3616				iDissatisfaction = (iPressureForAutocracy + iPressureForOrder) - iPressureForFreedom;3617			}3618		}3619		else if (eCurrentIdeology == eAutocracyBranch)3620		{3621			if (iPressureForAutocracy >= (iPressureForFreedom + iPressureForOrder))3622			{3623				m_eOpinion = PUBLIC_OPINION_CONTENT;3624			}3625			else3626			{3627				if (iPressureForFreedom >= iPressureForOrder)3628				{3629					m_ePreferredIdeology = eFreedomBranch;3630				}3631				else if (iPressureForOrder > iPressureForFreedom)3632				{3633					m_ePreferredIdeology = eOrderBranch;3634				}3635				iDissatisfaction = (iPressureForFreedom + iPressureForOrder) - iPressureForAutocracy;3636			}3637		}3638		else3639		{3640			if (iPressureForOrder >= (iPressureForFreedom + iPressureForAutocracy))3641			{3642				m_eOpinion = PUBLIC_OPINION_CONTENT;3643			}3644			else3645			{3646				if (iPressureForFreedom > iPressureForAutocracy)3647				{3648					m_ePreferredIdeology = eFreedomBranch;3649				}3650				else if (iPressureForAutocracy >= iPressureForFreedom)3651				{3652					m_ePreferredIdeology = eAutocracyBranch;3653				}3654				iDissatisfaction = (iPressureForFreedom + iPressureForAutocracy) - iPressureForOrder;3655			}3656		}36573658		// Compute effects of dissatisfaction3659		int iPerCityUnhappy = 1;3660		int iUnhappyPerXPop = 10;3661		if (m_eOpinion != PUBLIC_OPINION_CONTENT)3662		{3663			if (iDissatisfaction < 3)3664			{3665				m_eOpinion = PUBLIC_OPINION_DISSIDENTS;3666			}3667			else if (iDissatisfaction < 5)3668			{3669				m_eOpinion = PUBLIC_OPINION_CIVIL_RESISTANCE;3670			}3671			else3672			{3673				m_eOpinion = PUBLIC_OPINION_REVOLUTIONARY_WAVE;3674			}36753676			m_iOpinionUnhappiness = ComputePublicOpinionUnhappiness(iDissatisfaction, iPerCityUnhappy, iUnhappyPerXPop);36773678			// Find civ exerting greatest pressure3679			int iGreatestDominance = -1;3680			for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)3681			{3682				CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);3683				if (iLoopPlayer != m_pPlayer->GetID() && kPlayer.isAlive() && !kPlayer.isMinorCiv())3684				{3685					PolicyBranchTypes eOtherCivIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();3686					if (eOtherCivIdeology == m_ePreferredIdeology)3687					{3688						int iCulturalDominanceOverUs = kPlayer.GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - m_pPlayer->GetCulture()->GetInfluenceLevel((PlayerTypes)iLoopPlayer);3689						if (iCulturalDominanceOverUs > 0)3690						{3691							if (iCulturalDominanceOverUs > iGreatestDominance)3692							{3693								iGreatestDominance = iCulturalDominanceOverUs;3694								m_eOpinionBiggestInfluence = (PlayerTypes)iLoopPlayer;3695							}3696						}3697					}3698				}3699			}3700		}37013702		// Build tooltip3703		if (strFreedomPressureString.size() > 0)3704		{3705			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_FREEDOM");3706			locText << strFreedomPressureString;3707			strFreedomPressureString = locText.toUTF8();3708		}3709		if (strAutocracyPressureString.size() > 0)3710		{3711			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_AUTOCRACY");3712			locText << strAutocracyPressureString;3713			strAutocracyPressureString = locText.toUTF8();3714		}3715		if (strOrderPressureString.size() > 0)3716		{3717			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_ORDER");3718			locText << strOrderPressureString;3719			strOrderPressureString = locText.toUTF8();3720		}37213722		if (strWorldIdeologyPressureString.size() != 0)3723		{3724			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_INFLUENCED_WORLD_IDEOLOGY");3725			m_strOpinionTooltip += locText.toUTF8();3726			m_strOpinionTooltip += strWorldIdeologyPressureString;3727			m_strOpinionTooltip += "[NEWLINE][NEWLINE]";3728		}37293730		if ((strFreedomPressureString.size() + strAutocracyPressureString.size() + strOrderPressureString.size()) == 0)3731		{3732			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_NOT_INFLUENCED");3733			m_strOpinionTooltip += locText.toUTF8();3734		}3735		else3736		{3737			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_INFLUENCED_BY");3738			m_strOpinionTooltip += locText.toUTF8();3739			m_strOpinionTooltip += strFreedomPressureString + strAutocracyPressureString + strOrderPressureString;3740		}37413742		if (m_ePreferredIdeology != NO_POLICY_BRANCH_TYPE)3743		{3744			Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_PREFERRED_IDEOLOGY");3745			locText << GC.getPolicyBranchInfo(m_ePreferredIdeology)->GetDescription();3746			m_strOpinionTooltip += locText.toUTF8();3747		}3748 3749		if (m_iOpinionUnhappiness > 0)3750		{3751			Localization::String locText;3752			locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE1");3753			locText << m_iOpinionUnhappiness;3754			m_strOpinionUnhappinessTooltip += locText.toUTF8();37553756			locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE2");3757			m_strOpinionUnhappinessTooltip += locText.toUTF8();37583759			locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE3");3760			locText << iPerCityUnhappy;3761			m_strOpinionUnhappinessTooltip += locText.toUTF8();37623763			locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE4");3764			locText << iUnhappyPerXPop;3765			m_strOpinionUnhappinessTooltip += locText.toUTF8();3766		}3767	}3768}

Calls

Called by