设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
查看: 41062|回复: 17

[原创] 【DLL】帮你理解意识形态的红脸

[复制链接]
发表于 2013-11-19 07:04:41 | 显示全部楼层 |阅读模式
众所周知红脸状态对发展非常不利,不可不察。
有关红脸的一些有用数据:
1、标图直辖城和傀儡城每城3红脸,每人口1红脸,无法院的占领城每城5红脸,每人口1.34红脸。
2、非常不快乐(Very unhappy)阈值为10,红脸达到10则人口停止增长,并且不能造移民,国内出现野蛮人叛军。
3、极度不快乐(Super unhappy)阈值为20,红脸达到20,城市可能会向文化影响高的玩家倒戈。
4、红脸对产能、金币和战斗力都有惩罚,每红脸-2%,最大-40%。
5、红脸低于10也会影响人口增长,粮食积累速度-75%,如果有2余粮,则会减到0.5。

发现很多新手对意识形态产生红脸缘由很疑惑,现在游戏里的提示已经很详细了,细心一点很容易明白的。
但是很多情况自己可能永远无法碰到,想全面了解,还要翻翻代码的。和大家共享一下,希望有所帮助。

要搞清楚意识形态红脸来源,首先要了解文化影响的等级,这是根据对某文明魅力输出占该文明文化产出的百分比确定的,共分五个等级:
无级别(0%)默默无闻,一级(阈值10%)初具风情,二级(阈值30%)众口相传,三级(阈值60%)广受称誉,四级(阈值100%)无远弗届,五级(阈值200%)绝对支配。
因此,减少其他文明的文化影响有两种方法,降低对手的魅力输出加成,或着增加自己的文化产出(包括大文学家创造的文化)。
魅力输出加成因素很多,请参考其他有关文化胜利的帖子,对所有玩家达到无远弗届的影响力就会获得文化胜利。

其次要了解意识形态的压力,玩家受到的每种意识形态压力是分开计算的,每种意识形态的压力初始赋值为0。
如果世界议会通过了世界意识形态决议,会增加该意识形态压力2。
每种意识形态的压力,还要加上与对应意识形态的文明互相影响的等级差,小于零则不加。比如玩家对某ai文化影响等级为默默无闻,而该ai对玩家的影响为初具风情,该ai开启了自由意识形态,则玩家受到的自由意识形态压力+1(相差一个等级)。
注意,双方未碰面之前影响力永远是默默无闻,已灭国或未开启意识形态的玩家也不产生影响。

再次要了解公共舆论,关系到国民对意识形态满足度的判定。
如果受到本阵营意识形态的压力>=其他两种意识形态压力和,则判定为心满意足(意识形态不附加红脸),否则两者差值记为不满值。
根据不满值确定不满等级,不满值小于3为秉持异议,不满值大于或等于3、小于5为和平抗争,不满值大于等于5为革命浪潮。

最后,分别根据城市数量和人口数量计算红脸,取两种算法最大值。
每城红脸数和人口红脸分数分别为:秉持异议1和10,和平抗争2和5,革命浪潮4和3。
意识形态造成的红脸数 = max(城市数×每城红脸数,人口数/人口红脸分数)
比如玩家处于革命浪潮,此时有10城和123人口,每城4红脸会产生40红脸,每3人口一红脸会产生41红脸,取最大值则意识形态会附加41红脸。

[ 本帖最后由 everchu 于 2013-11-19 13:49 编辑 ]

评分

2

查看全部评分

 楼主| 发表于 2013-11-19 07:05:09 | 显示全部楼层
相关参数的定义,参见:
Sid Meier's Civilization V\Assets\DLC\Expansion2\Gameplay\XML\GlobalDefines.xml

-<Row Name="UNHAPPINESS_PER_POPULATION"> <Value>1</Value> </Row>
-<Row Name="UNHAPPINESS_PER_OCCUPIED_POPULATION"> <Value>1.34</Value> </Row>
-<Row Name="UNHAPPINESS_PER_CITY"> <Value>3</Value> </Row>
-<Row Name="UNHAPPINESS_PER_CAPTURED_CITY"> <Value>5</Value> </Row>
-<Row Name="UNHAPPY_GROWTH_PENALTY"> <Value>-75</Value> </Row>
-<Row Name="VERY_UNHAPPY_GROWTH_PENALTY"> <Value>-100</Value> </Row>
-<Row Name="VERY_UNHAPPY_CANT_TRAIN_SETTLERS"> <Value>1</Value> </Row>
-<Row Name="VERY_UNHAPPY_THRESHOLD"> <Value>-10</Value> </Row>
-<Row Name="VERY_UNHAPPY_COMBAT_PENALTY_PER_UNHAPPY"> <Value>-2</Value> </Row>
-<Row Name="VERY_UNHAPPY_MAX_COMBAT_PENALTY"> <Value>-40</Value> </Row>
-<Row Name="STRATEGIC_RESOURCE_EXHAUSTED_PENALTY"> <Value>-50</Value> </Row>
-<Row Name="VERY_UNHAPPY_PRODUCTION_PENALTY_PER_UNHAPPY"> <Value>-2</Value> </Row>
-<Row Name="VERY_UNHAPPY_MAX_PRODUCTION_PENALTY"> <Value>-40</Value> </Row>
-<Row Name="VERY_UNHAPPY_GOLD_PENALTY_PER_UNHAPPY"> <Value>-2</Value> </Row>
-<Row Name="VERY_UNHAPPY_MAX_GOLD_PENALTY"> <Value>-40</Value> </Row>
-<Row Name="SUPER_UNHAPPY_THRESHOLD"> <Value>-20</Value> </Row>

-<Row Name="TOURISM_MODIFIER_SHARED_RELIGION"> <Value>25</Value> </Row> //共同宗教加成25%
-<Row Name="TOURISM_MODIFIER_TRADE_ROUTE"> <Value>25</Value> </Row>  //商路加成25%
-<Row Name="TOURISM_MODIFIER_OPEN_BORDERS"> <Value>25</Value> </Row>//开边加成25%
-<Row Name="TOURISM_MODIFIER_DIFFERENT_IDEOLOGIES"> <Value>-34</Value> </Row> //不同意识形态-34%
-<Row Name="TOURISM_MODIFIER_DIPLOMAT"> <Value>25</Value> </Row> //不同意识形态派驻外交官+25%
-<Row Name="MINIUMUM_TOURISM_BLAST_STRENGTH"> <Value>100</Value> </Row>//大音最小战斗力
-<Row Name="CULTURE_LEVEL_EXOTIC"> <Value>10</Value> </Row> //10%初具风情
-<Row Name="CULTURE_LEVEL_FAMILIAR"> <Value>30</Value> </Row> //30%众口相传
-<Row Name="CULTURE_LEVEL_POPULAR"> <Value>60</Value> </Row> //60%广受称誉
-<Row Name="CULTURE_LEVEL_INFLUENTIAL"> <Value>100</Value> </Row> //100%无远弗届
-<Row Name="CULTURE_LEVEL_DOMINANT"> <Value>200</Value> </Row> //200%绝对支配
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 07:09:19 | 显示全部楼层
以下几楼是dll相关代码,参见:
Sid Meier's Civilization V SDK\CvGameCoreSource\CvGameCoreDLL_Expansion2\CvCultureClasses.cpp

//判断文化影响等级的函数
InfluenceLevelTypes CvPlayerCulture::GetInfluenceLevel(PlayerTypes ePlayer) const
{
        InfluenceLevelTypes eRtnValue;

        CvPlayer &kOtherPlayer = GET_PLAYER(ePlayer);
        CvTeam &kOtherTeam = GET_TEAM(kOtherPlayer.getTeam());

        if (!kOtherTeam.isHasMet(m_pPlayer->getTeam())) //未碰面的文明直接判定为默默无闻,也就是无影响
        {
                eRtnValue = NO_INFLUENCE_LEVEL;
        }
        else
        {
                int iInfluenceOn = GetInfluenceOn(ePlayer);
                int iLifetimeCulture = kOtherPlayer.GetJONSCultureEverGenerated();
                int iPercent = 0;

                if (iLifetimeCulture > 0)
                {
                        iPercent = iInfluenceOn * 100 / iLifetimeCulture; //计算对某文明魅力输出占该文明文化产出的百分比
                }

                eRtnValue = INFLUENCE_LEVEL_UNKNOWN; //根据文化影响百分比确定影响等级

                if (iPercent >= GC.getCULTURE_LEVEL_DOMINANT())
                {
                        eRtnValue = INFLUENCE_LEVEL_DOMINANT;
                }
                else if (iPercent >= GC.getCULTURE_LEVEL_INFLUENTIAL())
                {
                        eRtnValue = INFLUENCE_LEVEL_INFLUENTIAL;
                }
                else if (iPercent >= GC.getCULTURE_LEVEL_POPULAR())
                {
                        eRtnValue = INFLUENCE_LEVEL_POPULAR;
                }
                else if (iPercent >= GC.getCULTURE_LEVEL_FAMILIAR())
                {
                        eRtnValue = INFLUENCE_LEVEL_FAMILIAR;
                }
                else if (iPercent >= GC.getCULTURE_LEVEL_EXOTIC())
                {
                        eRtnValue = INFLUENCE_LEVEL_EXOTIC;
                }
        }

        return eRtnValue;
}

[ 本帖最后由 everchu 于 2013-11-19 07:14 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 07:10:17 | 显示全部楼层
//计算公共舆论的相关项目的函数
// PRIVATE METHODS
/// Once per turn calculation of public opinion data
void CvPlayerCulture::DoPublicOpinion()
{
        m_eOpinion = NO_PUBLIC_OPINION;
        m_ePreferredIdeology = NO_POLICY_BRANCH_TYPE;
        m_iOpinionUnhappiness = 0;
        m_strOpinionTooltip = "";
        m_strOpinionUnhappinessTooltip = "";
        m_eOpinionBiggestInfluence = NO_PLAYER;

        PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM();
        PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY();
        PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER();

        if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE) //未开启意识形态跳过
        {
                return;
        }

        Localization::String locOverview = Localization::Lookup("TXT_KEY_CO_OPINION_TT_OVERVIEW");
        m_strOpinionTooltip += locOverview.toUTF8();

        PolicyBranchTypes eCurrentIdeology = m_pPlayer->GetPlayerPolicies()->GetLateGamePolicyTree();

        // We have an ideology, so public opinion matters //已开启意识形态,则进入公共舆论的相关项目计算
        if (eCurrentIdeology != NO_POLICY_BRANCH_TYPE)
        {
                int iPressureForFreedom = 0;
                int iPressureForAutocracy = 0;
                int iPressureForOrder = 0;
                CvString strWorldIdeologyPressureString = "";
                CvString strFreedomPressureString = "";
                CvString strAutocracyPressureString = "";
                CvString strOrderPressureString = "";

                // Look at World Congress //世界议会的影响,受到每种意识形态压力单独计算,如果是世界意识形态,该意识形态压力+2
                //加2是可以确定的,不再查具体的计算过程
                iPressureForFreedom += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eFreedomBranch);
                if (iPressureForFreedom > 0)
                {
                        Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_FREEDOM");
                        CvString sIcons = "";
                        for (int i = 0; i < iPressureForFreedom; i++)
                        {
                                sIcons += "[ICON_IDEOLOGY_FREEDOM]";
                        }
                        sTemp << sIcons;
                        strWorldIdeologyPressureString += sTemp.toUTF8();
                }
                iPressureForAutocracy += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eAutocracyBranch);
                if (iPressureForAutocracy > 0)
                {
                        Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_AUTOCRACY");
                        CvString sIcons = "";
                        for (int i = 0; i < iPressureForAutocracy; i++)
                        {
                                sIcons += "[ICON_IDEOLOGY_AUTOCRACY]";
                        }
                        sTemp << sIcons;
                        strWorldIdeologyPressureString += sTemp.toUTF8();
                }
                iPressureForOrder += GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eOrderBranch);
                if (iPressureForOrder > 0)
                {
                        Localization::String sTemp = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_ORDER");
                        CvString sIcons = "";
                        for (int i = 0; i < iPressureForOrder; i++)
                        {
                                sIcons += "[ICON_IDEOLOGY_ORDER]";
                        }
                        sTemp << sIcons;
                        strWorldIdeologyPressureString += sTemp.toUTF8();
                }

                // Look at each civ //文明的影响,已灭亡或无意识形态的文明无影响
                //每种意识形态的压力,要加上与对应意识形态的文明影响等级差
                for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)
                {
                        CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);
                        if (iLoopPlayer != m_pPlayer->GetID() && kPlayer.isAlive() && !kPlayer.isMinorCiv())
                        {
                                PolicyBranchTypes eOtherCivIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();
                                if (eOtherCivIdeology != NO_POLICY_BRANCH_TYPE)
                                {
                                        int iCulturalDominanceOverUs = kPlayer.GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - m_pPlayer->GetCulture()->GetInfluenceLevel((PlayerTypes)iLoopPlayer);
                                        if (iCulturalDominanceOverUs > 0)
                                        {
                                                if (eOtherCivIdeology == eFreedomBranch)
                                                {
                                                        iPressureForFreedom += iCulturalDominanceOverUs;
                                                        if (strFreedomPressureString.size() > 0)
                                                        {
                                                                strFreedomPressureString += ", ";
                                                        }
                                                        strFreedomPressureString += kPlayer.getCivilizationShortDescription();
                                                        for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)
                                                        {
                                                                strFreedomPressureString += "[ICON_IDEOLOGY_FREEDOM]";
                                                        }
                                                }
                                                else if (eOtherCivIdeology == eAutocracyBranch)
                                                {
                                                        iPressureForAutocracy += iCulturalDominanceOverUs;
                                                        if (strAutocracyPressureString.size() > 0)
                                                        {
                                                                strAutocracyPressureString += ", ";
                                                        }
                                                        strAutocracyPressureString += kPlayer.getCivilizationShortDescription();
                                                        for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)
                                                        {
                                                                strAutocracyPressureString += "[ICON_IDEOLOGY_AUTOCRACY]";
                                                        }
                                                }
                                                else
                                                {
                                                        iPressureForOrder += iCulturalDominanceOverUs;
                                                        if (strOrderPressureString.size() > 0)
                                                        {
                                                                strOrderPressureString += ", ";
                                                        }
                                                        strOrderPressureString += kPlayer.getCivilizationShortDescription();
                                                        for (int iI = 0; iI < iCulturalDominanceOverUs; iI++)
                                                        {
                                                                strOrderPressureString += "[ICON_IDEOLOGY_ORDER]";
                                                        }
                                                }
                                        }
                                }
                        }
                }

[ 本帖最后由 everchu 于 2013-11-19 07:11 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 07:10:39 | 显示全部楼层

回复 4# 的帖子

// Now compute satisfaction with this branch compared to two other ones
//国民满足度的判定,如果受到本意识形态的压力>其他两种意识形态压力和,则判定为心满意足,否则两者差值记为不满值
                int iDissatisfaction = 0;
                if (eCurrentIdeology == eFreedomBranch)
                {
                        if (iPressureForFreedom >= (iPressureForAutocracy + iPressureForOrder))
                        {
                                m_eOpinion = PUBLIC_OPINION_CONTENT;
                        }
                        else
                        {
                                if (iPressureForAutocracy > iPressureForOrder)
                                {
                                        m_ePreferredIdeology = eAutocracyBranch;
                                }
                                else if (iPressureForOrder >= iPressureForAutocracy)
                                {
                                        m_ePreferredIdeology = eOrderBranch;
                                }
                                iDissatisfaction = (iPressureForAutocracy + iPressureForOrder) - iPressureForFreedom;
                        }
                }
                else if (eCurrentIdeology == eAutocracyBranch)
                {
                        if (iPressureForAutocracy >= (iPressureForFreedom + iPressureForOrder))
                        {
                                m_eOpinion = PUBLIC_OPINION_CONTENT;
                        }
                        else
                        {
                                if (iPressureForFreedom >= iPressureForOrder)
                                {
                                        m_ePreferredIdeology = eFreedomBranch;
                                }
                                else if (iPressureForOrder > iPressureForFreedom)
                                {
                                        m_ePreferredIdeology = eOrderBranch;
                                }
                                iDissatisfaction = (iPressureForFreedom + iPressureForOrder) - iPressureForAutocracy;
                        }
                }
                else
                {
                        if (iPressureForOrder >= (iPressureForFreedom + iPressureForAutocracy))
                        {
                                m_eOpinion = PUBLIC_OPINION_CONTENT;
                        }
                        else
                        {
                                if (iPressureForFreedom > iPressureForAutocracy)
                                {
                                        m_ePreferredIdeology = eFreedomBranch;
                                }
                                else if (iPressureForAutocracy >= iPressureForFreedom)
                                {
                                        m_ePreferredIdeology = eAutocracyBranch;
                                }
                                iDissatisfaction = (iPressureForFreedom + iPressureForAutocracy) - iPressureForOrder;
                        }
                }

                // Compute effects of dissatisfaction
                //根据不满值确定不满等级,不满值小于3为秉持异议,不满值大于或等于3、小于5和平抗争,不满值大于等于5革命浪潮
                int iPerCityUnhappy = 1;
                int iUnhappyPerXPop = 10;
                if (m_eOpinion != PUBLIC_OPINION_CONTENT)
                {
                        if (iDissatisfaction < 3)
                        {
                                m_eOpinion = PUBLIC_OPINION_DISSIDENTS;
                        }
                        else if (iDissatisfaction < 5)
                        {
                                m_eOpinion = PUBLIC_OPINION_CIVIL_RESISTANCE;
                        }
                        else
                        {
                                m_eOpinion = PUBLIC_OPINION_REVOLUTIONARY_WAVE;
                        }

                        m_iOpinionUnhappiness = ComputePublicOpinionUnhappiness(iDissatisfaction, iPerCityUnhappy, iUnhappyPerXPop);

                        // Find civ exerting greatest pressure
                        int iGreatestDominance = -1;
                        for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)
                        {
                                CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);
                                if (iLoopPlayer != m_pPlayer->GetID() && kPlayer.isAlive() && !kPlayer.isMinorCiv())
                                {
                                        PolicyBranchTypes eOtherCivIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();
                                        if (eOtherCivIdeology == m_ePreferredIdeology)
                                        {
                                                int iCulturalDominanceOverUs = kPlayer.GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - m_pPlayer->GetCulture()->GetInfluenceLevel((PlayerTypes)iLoopPlayer);
                                                if (iCulturalDominanceOverUs > 0)
                                                {
                                                        if (iCulturalDominanceOverUs > iGreatestDominance)
                                                        {
                                                                iGreatestDominance = iCulturalDominanceOverUs;
                                                                m_eOpinionBiggestInfluence = (PlayerTypes)iLoopPlayer;
                                                        }
                                                }
                                        }
                                }
                        }
                }

                // Build tooltip
                if (strFreedomPressureString.size() > 0)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_FREEDOM");
                        locText << strFreedomPressureString;
                        strFreedomPressureString = locText.toUTF8();
                }
                if (strAutocracyPressureString.size() > 0)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_AUTOCRACY");
                        locText << strAutocracyPressureString;
                        strAutocracyPressureString = locText.toUTF8();
                }
                if (strOrderPressureString.size() > 0)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_FOR_ORDER");
                        locText << strOrderPressureString;
                        strOrderPressureString = locText.toUTF8();
                }

                if (strWorldIdeologyPressureString.size() != 0)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_INFLUENCED_WORLD_IDEOLOGY");
                        m_strOpinionTooltip += locText.toUTF8();
                        m_strOpinionTooltip += strWorldIdeologyPressureString;
                        m_strOpinionTooltip += "[NEWLINE][NEWLINE]";
                }

                if ((strFreedomPressureString.size() + strAutocracyPressureString.size() + strOrderPressureString.size()) == 0)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_NOT_INFLUENCED");
                        m_strOpinionTooltip += locText.toUTF8();
                }
                else
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_INFLUENCED_BY");
                        m_strOpinionTooltip += locText.toUTF8();
                        m_strOpinionTooltip += strFreedomPressureString + strAutocracyPressureString + strOrderPressureString;
                }

                if (m_ePreferredIdeology != NO_POLICY_BRANCH_TYPE)
                {
                        Localization::String locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_PREFERRED_IDEOLOGY");
                        locText << GC.getPolicyBranchInfo(m_ePreferredIdeology)->GetDescription();
                        m_strOpinionTooltip += locText.toUTF8();
                }

                if (m_iOpinionUnhappiness > 0)
                {
                        Localization::String locText;
                        locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE1");
                        locText << m_iOpinionUnhappiness;
                        m_strOpinionUnhappinessTooltip += locText.toUTF8();

                        locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE2");
                        m_strOpinionUnhappinessTooltip += locText.toUTF8();

                        locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE3");
                        locText << iPerCityUnhappy;
                        m_strOpinionUnhappinessTooltip += locText.toUTF8();

                        locText = Localization::Lookup("TXT_KEY_CO_OPINION_TT_UNHAPPINESS_LINE4");
                        locText << iUnhappyPerXPop;
                        m_strOpinionUnhappinessTooltip += locText.toUTF8();
                }
        }
}

[ 本帖最后由 everchu 于 2013-11-19 07:12 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 07:10:57 | 显示全部楼层
/// What would the unhappiness be if we chose this Ideology?//根据不满等级计算红脸数
int CvPlayerCulture::ComputeHypotheticalPublicOpinionUnhappiness(PolicyBranchTypes eBranch)
{
        int iDissatisfaction = 0;

        PolicyBranchTypes eFreedomBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_FREEDOM();
        PolicyBranchTypes eAutocracyBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_AUTOCRACY();
        PolicyBranchTypes eOrderBranch = (PolicyBranchTypes)GC.getPOLICY_BRANCH_ORDER();

        if (eFreedomBranch == NO_POLICY_BRANCH_TYPE || eAutocracyBranch == NO_POLICY_BRANCH_TYPE || eOrderBranch == NO_POLICY_BRANCH_TYPE)
        {
                return 0;
        }

        // Start with World Congress
        int iPressureForFreedom = GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eFreedomBranch);
        int iPressureForAutocracy = GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eAutocracyBranch);
        int iPressureForOrder = GC.getGame().GetGameLeagues()->GetPressureForIdeology(m_pPlayer->GetID(), eOrderBranch);

        // Look at each civ
        for (int iLoopPlayer = 0; iLoopPlayer < MAX_MAJOR_CIVS; iLoopPlayer++)
        {
                CvPlayer &kPlayer = GET_PLAYER((PlayerTypes)iLoopPlayer);
                if (iLoopPlayer != m_pPlayer->GetID() && kPlayer.isAlive() && !kPlayer.isMinorCiv())
                {
                        PolicyBranchTypes eOtherCivIdeology = kPlayer.GetPlayerPolicies()->GetLateGamePolicyTree();
                        if (eOtherCivIdeology != NO_POLICY_BRANCH_TYPE)
                        {
                                int iCulturalDominanceOverUs = kPlayer.GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - m_pPlayer->GetCulture()->GetInfluenceLevel((PlayerTypes)iLoopPlayer);
                                if (iCulturalDominanceOverUs > 0)
                                {
                                        if (eOtherCivIdeology == eFreedomBranch)
                                        {
                                                iPressureForFreedom += iCulturalDominanceOverUs;
                                        }
                                        else if (eOtherCivIdeology == eAutocracyBranch)
                                        {
                                                iPressureForAutocracy += iCulturalDominanceOverUs;
                                        }
                                        else
                                        {
                                                iPressureForOrder += iCulturalDominanceOverUs;
                                        }
                                }
                        }
                }
        }

        if (eBranch == eFreedomBranch)
        {
                if (iPressureForFreedom < (iPressureForAutocracy + iPressureForOrder))
                {
                        if (iPressureForAutocracy > iPressureForOrder)
                        {
                                m_ePreferredIdeology = eAutocracyBranch;
                        }
                        else if (iPressureForOrder >= iPressureForAutocracy)
                        {
                                m_ePreferredIdeology = eOrderBranch;
                        }
                        iDissatisfaction = (iPressureForAutocracy + iPressureForOrder) - iPressureForFreedom;
                }
        }
        else if (eBranch == eAutocracyBranch)
        {
                if (iPressureForAutocracy < (iPressureForFreedom + iPressureForOrder))
                {
                        if (iPressureForFreedom >= iPressureForOrder)
                        {
                                m_ePreferredIdeology = eFreedomBranch;
                        }
                        else if (iPressureForOrder > iPressureForFreedom)
                        {
                                m_ePreferredIdeology = eOrderBranch;
                        }
                        iDissatisfaction = (iPressureForFreedom + iPressureForOrder) - iPressureForAutocracy;
                }
        }
        else
        {
                if (iPressureForOrder < (iPressureForFreedom + iPressureForAutocracy))
                {
                        if (iPressureForFreedom > iPressureForAutocracy)
                        {
                                m_ePreferredIdeology = eFreedomBranch;
                        }
                        else if (iPressureForAutocracy >= iPressureForFreedom)
                        {
                                m_ePreferredIdeology = eAutocracyBranch;
                        }
                        iDissatisfaction = (iPressureForFreedom + iPressureForAutocracy) - iPressureForOrder;
                }
        }

        int iPerCityUnhappy = 1;
        int iUnhappyPerXPop = 10;

        if (iDissatisfaction == 0)
        {
                return 0;
        }
        else
        {
                return ComputePublicOpinionUnhappiness(iDissatisfaction, iPerCityUnhappy, iUnhappyPerXPop);//调用红脸计算过程
        }
}

/// Compute effects of dissatisfaction//分别根据城市数量和人口数量计算红脸,取两种算法最大值
//每城红脸和人口红脸分数分别为:秉持异议1和10,和平抗争2和5,革命浪潮4和3
int CvPlayerCulture::ComputePublicOpinionUnhappiness(int iDissatisfaction, int &iPerCityUnhappy, int &iUnhappyPerXPop)
{
        if (iDissatisfaction < 3)
        {
                iPerCityUnhappy = 1;
                iUnhappyPerXPop = 10;
        }
        else if (iDissatisfaction < 5)
        {
                iPerCityUnhappy = 2;
                iUnhappyPerXPop = 5;
        }
        else
        {
                iPerCityUnhappy = 4;
                iUnhappyPerXPop = 3;
        }

        return max(m_pPlayer->getNumCities() * iPerCityUnhappy, m_pPlayer->getTotalPopulation() / iUnhappyPerXPop);
}
回复 支持 反对

使用道具 举报

发表于 2013-11-19 09:31:47 | 显示全部楼层
咦?城市红脸不是单独计算的么?
之前还以为和接壤有关系
=.=不过好久没开游戏了已经
回复 支持 反对

使用道具 举报

发表于 2013-11-19 11:37:42 | 显示全部楼层

回复 7# 的帖子

是分开算的,在文化胜利界面鼠标移到红脸数上有提示
回复 支持 反对

使用道具 举报

发表于 2013-11-19 15:39:57 | 显示全部楼层
我觉得最高只到革命浪潮还远远不够,ai顶着革命浪潮160的红脸仍然有20笑脸,惩罚明显不够嘛。建议意识形态的不满会随回合数自动增加
回复 支持 反对

使用道具 举报

发表于 2013-11-19 21:09:13 | 显示全部楼层
顶一下楼主,以前一直想做结果事情太多坑掉了
回复 支持 反对

使用道具 举报

发表于 2013-11-19 21:23:12 | 显示全部楼层

回复 10# 的帖子

坑坑更健康
回复 支持 反对

使用道具 举报

发表于 2013-11-20 09:04:07 | 显示全部楼层
我只想说,小心,反编译是违法滴。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-20 10:33:24 | 显示全部楼层

回复 12# 的帖子

DLL代码是公开的好不好~
哪家反编译出来的东西会这么好读?人家不会用混淆技术么~
回复 支持 反对

使用道具 举报

发表于 2013-11-22 02:09:55 | 显示全部楼层
要抵御意识形态的红脸就是要加大箱子产出或者总的文化点数?
回复 支持 反对

使用道具 举报

发表于 2013-11-22 10:49:03 | 显示全部楼层

回复 14# 的帖子

对,判定文化影响等级用的是累计值。
但也不一定,如果本意识形态阵营魅力输出更强,压低文化可能更好
回复 支持 反对

使用道具 举报

发表于 2013-11-22 16:38:22 | 显示全部楼层
好专业。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-24 13:51:19 | 显示全部楼层
终于能吃DLL了。。。不错。。。
看来我之前的理解还是有偏差的,mark一下。。
回复 支持 反对

使用道具 举报

发表于 2014-3-22 00:01:08 | 显示全部楼层
“如果受到本阵营意识形态的压力>=其他两种意识形态压力和,则判定为心满意足(意识形态不附加红脸),否则两者差值记为不满值。”
差值怎么算?5个初具风情 就顶一个无远弗届?

即使你无远弗届了,其他9家都和你不一样。都是初具风情,你也会得到一个革命浪潮的下场?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|塞爱维(CIV)文明联盟    

GMT+8, 2024-4-20 00:17

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表