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}