Hooks
static bool BeforeCvDiplomacyAI_GetBestApproachTowardsMajorCiv(CvDiplomacyAI* self, PlayerTypes ePlayer, int& iHighestWeight, bool bLookAtOtherPlayers, bool bLog, WarFaceTypes& eWarFace, MajorCivApproachTypes& result);static void AfterCvDiplomacyAI_GetBestApproachTowardsMajorCiv(CvDiplomacyAI* self, PlayerTypes ePlayer, int& iHighestWeight, bool bLookAtOtherPlayers, bool bLog, WarFaceTypes& eWarFace, MajorCivApproachTypes& result);static MajorCivApproachTypes ReplaceCvDiplomacyAI_GetBestApproachTowardsMajorCiv(MajorCivApproachTypes (*original)(CvDiplomacyAI*, PlayerTypes, int&, bool, bool, WarFaceTypes&), CvDiplomacyAI* self, PlayerTypes ePlayer, int& iHighestWeight, bool bLookAtOtherPlayers, bool bLog, WarFaceTypes& eWarFace);CivRegisterBefore<CivHooks::CvDiplomacyAI_GetBestApproachTowardsMajorCiv>(host, &BeforeCvDiplomacyAI_GetBestApproachTowardsMajorCiv);CivRegisterAfter<CivHooks::CvDiplomacyAI_GetBestApproachTowardsMajorCiv>(host, &AfterCvDiplomacyAI_GetBestApproachTowardsMajorCiv);CivRegisterReplace<CivHooks::CvDiplomacyAI_GetBestApproachTowardsMajorCiv>(host, &ReplaceCvDiplomacyAI_GetBestApproachTowardsMajorCiv);
Code
2858/// What is the best approach to take towards a player? Can also pass in iHighestWeight by reference if you just want to know what the player feels most strongly about without actually caring about WHAT it is2859MajorCivApproachTypes CvDiplomacyAI::GetBestApproachTowardsMajorCiv(PlayerTypes ePlayer, int& iHighestWeight, bool bLookAtOtherPlayers, bool bLog, WarFaceTypes& eWarFace)2860{2861 CvAssertMsg(ePlayer >= 0, "DIPLOMACY_AI: Invalid Player Index. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");2862 CvAssertMsg(ePlayer < MAX_MAJOR_CIVS, "DIPLOMACY_AI: Invalid Player Index. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");28632864 TeamTypes eTeam = GET_PLAYER(ePlayer).getTeam();2865 CvTeam* pTeam = &GET_TEAM(eTeam);28662867 PlayerTypes eMyPlayer = GetPlayer()->GetID();28682869 MajorCivApproachTypes eApproach;2870 // This vector is what we'll stuff the values into first, and pass it into our logging function (which can't take a CvWeightedVector, which we need to sort...)2871 FStaticVector< int, 128, true, c_eCiv5GameplayDLL > viApproachWeights;28722873 int iApproachLoop;28742875 viApproachWeights.clear();28762877 for(iApproachLoop = 0; iApproachLoop < NUM_MAJOR_CIV_APPROACHES; iApproachLoop++)2878 {2879 viApproachWeights.push_back(0);2880 }28812882 ////////////////////////////////////2883 // NEUTRAL DEFAULT WEIGHT2884 ////////////////////////////////////28852886 viApproachWeights[MAJOR_CIV_APPROACH_NEUTRAL] += /*4*/ GC.getAPPROACH_NEUTRAL_DEFAULT();28872888 ////////////////////////////////////2889 // CURRENT APPROACH BIASES2890 ////////////////////////////////////28912892 // Bias for our current Approach. This should prevent it from jumping around from turn-to-turn as much2893 // We use the scratch pad here since the normal array has been cleared so that we have knowledge of who we've already assigned an Approach for this turn; this should be the only place the scratch pad is used2894 MajorCivApproachTypes eOldApproach = (MajorCivApproachTypes) m_paeApproachScratchPad[ePlayer];2895 if(eOldApproach == NO_MAJOR_CIV_APPROACH)2896 eOldApproach = MAJOR_CIV_APPROACH_NEUTRAL;28972898 viApproachWeights[eOldApproach] += /*5*/ GC.getAPPROACH_BIAS_FOR_CURRENT();28992900 // If our previous Approach was deceptive, this gives us a bonus for war2901 if(eOldApproach == MAJOR_CIV_APPROACH_DECEPTIVE)2902 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*2*/ GC.getAPPROACH_WAR_CURRENTLY_DECEPTIVE();29032904 // If our previous Approach was Hostile, boost the strength (so we're unlikely to switch out of it)2905 if(eOldApproach == MAJOR_CIV_APPROACH_HOSTILE)2906 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*5*/ GC.getAPPROACH_HOSTILE_CURRENTLY_HOSTILE();29072908 // Wanted war last turn bias: war must be calm or better to apply2909 WarStateTypes eWarState = GetWarState(ePlayer);2910 if(eWarState > WAR_STATE_STALEMATE)2911 {2912 // If we're planning a war then give it a bias so that we don't get away from it too easily2913 if(eOldApproach == MAJOR_CIV_APPROACH_WAR)2914 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*3*/ GC.getAPPROACH_WAR_CURRENTLY_WAR();2915 }29162917 // Conquest bias: must be a stalemate or better to apply (or not at war yet)2918 if(eWarState == NO_WAR_STATE_TYPE || eWarState > WAR_STATE_DEFENSIVE)2919 {2920 if(IsGoingForWorldConquest())2921 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*5*/ GC.getAPPROACH_WAR_CONQUEST_GRAND_STRATEGY();2922 }29232924 ////////////////////////////////////2925 // PERSONALITY2926 ////////////////////////////////////29272928 for(iApproachLoop = 0; iApproachLoop < NUM_MAJOR_CIV_APPROACHES; iApproachLoop++)2929 {2930 viApproachWeights[iApproachLoop] += GetPersonalityMajorCivApproachBias((MajorCivApproachTypes) iApproachLoop);2931 }29322933 ////////////////////////////////////2934 // OPINION2935 ////////////////////////////////////29362937 switch(GetMajorCivOpinion(ePlayer))2938 {2939 case MAJOR_CIV_OPINION_UNFORGIVABLE:2940 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*10*/ GC.getAPPROACH_OPINION_UNFORGIVABLE_WAR();2941 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*4*/ GC.getAPPROACH_OPINION_UNFORGIVABLE_HOSTILE();2942 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_OPINION_UNFORGIVABLE_DECEPTIVE();2943 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*4*/ GC.getAPPROACH_OPINION_UNFORGIVABLE_GUARDED();2944 break;2945 case MAJOR_CIV_OPINION_ENEMY:2946 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*8*/ GC.getAPPROACH_OPINION_ENEMY_WAR();2947 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*4*/ GC.getAPPROACH_OPINION_ENEMY_HOSTILE();2948 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*1*/ GC.getAPPROACH_OPINION_ENEMY_DECEPTIVE();2949 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*4*/ GC.getAPPROACH_OPINION_ENEMY_GUARDED();2950 break;2951 case MAJOR_CIV_OPINION_COMPETITOR:2952 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_OPINION_COMPETITOR_WAR();2953 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*4*/ GC.getAPPROACH_OPINION_COMPETITOR_HOSTILE();2954 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*2*/ GC.getAPPROACH_OPINION_COMPETITOR_DECEPTIVE();2955 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*2*/ GC.getAPPROACH_OPINION_COMPETITOR_GUARDED();2956 break;2957 case MAJOR_CIV_OPINION_NEUTRAL:2958 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_OPINION_NEUTRAL_DECEPTIVE();2959 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*2*/ GC.getAPPROACH_OPINION_NEUTRAL_FRIENDLY();2960 break;2961 case MAJOR_CIV_OPINION_FAVORABLE:2962 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-5*/ GC.getAPPROACH_OPINION_FAVORABLE_HOSTILE();2963 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_OPINION_FAVORABLE_DECEPTIVE();2964 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*4*/ GC.getAPPROACH_OPINION_FAVORABLE_FRIENDLY();2965 break;2966 case MAJOR_CIV_OPINION_FRIEND:2967 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-5*/ GC.getAPPROACH_OPINION_FRIEND_HOSTILE();2968 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*10*/ GC.getAPPROACH_OPINION_FRIEND_FRIENDLY();2969 break;2970 case MAJOR_CIV_OPINION_ALLY:2971 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*10*/ GC.getAPPROACH_OPINION_ALLY_FRIENDLY();2972 break;2973 }29742975 ////////////////////////////////////2976 // DECLARATION OF FRIENDSHIP2977 ////////////////////////////////////29782979 if(IsDoFAccepted(ePlayer))2980 {2981 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*3*/ GC.getAPPROACH_DECEPTIVE_WORKING_WITH_PLAYER();2982 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*15*/ GC.getAPPROACH_FRIENDLY_WORKING_WITH_PLAYER();2983 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-100*/ GC.getAPPROACH_HOSTILE_WORKING_WITH_PLAYER();2984 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*-100*/ GC.getAPPROACH_GUARDED_WORKING_WITH_PLAYER();2985 }29862987 ////////////////////////////////////2988 // DENOUNCE2989 ////////////////////////////////////29902991 // We denounced them2992 if(IsDenouncedPlayer(ePlayer))2993 {2994 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*10*/ GC.getAPPROACH_WAR_DENOUNCED();2995 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*10*/ GC.getAPPROACH_HOSTILE_DENOUNCED();2996 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*5*/ GC.getAPPROACH_GUARDED_DENOUNCED();2997 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-100*/ GC.getAPPROACH_FRIENDLY_DENOUNCED();2998 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-100*/ GC.getAPPROACH_DECEPTIVE_DENOUNCED();2999 }30003001 // We were friends and they betrayed us!3002 if(IsFriendDenouncedUs(ePlayer))3003 {3004 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*10*/ GC.getAPPROACH_WAR_DENOUNCED();3005 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*10*/ GC.getAPPROACH_HOSTILE_DENOUNCED();3006 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*5*/ GC.getAPPROACH_GUARDED_DENOUNCED();3007 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-100*/ GC.getAPPROACH_FRIENDLY_DENOUNCED();3008 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-100*/ GC.getAPPROACH_DECEPTIVE_DENOUNCED();3009 }30103011 // They denounced us3012 if(GET_PLAYER(ePlayer).GetDiplomacyAI()->IsDenouncedPlayer(eMyPlayer))3013 {3014 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*10*/ GC.getAPPROACH_WAR_DENOUNCED();3015 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*10*/ GC.getAPPROACH_HOSTILE_DENOUNCED();3016 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*5*/ GC.getAPPROACH_GUARDED_DENOUNCED();3017 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-100*/ GC.getAPPROACH_FRIENDLY_DENOUNCED();3018 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-100*/ GC.getAPPROACH_DECEPTIVE_DENOUNCED();3019 }30203021 ////////////////////////////////////3022 // WORKING AGAINST THIS PLAYER?3023 ////////////////////////////////////30243025 //if (IsWorkingAgainstPlayer(ePlayer))3026 //{3027 // viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*10*/ GC.getAPPROACH_DECEPTIVE_WORKING_AGAINST_PLAYER();3028 // viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*10*/ GC.getAPPROACH_HOSTILE_WORKING_AGAINST_PLAYER();3029 // viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*10*/ GC.getAPPROACH_WAR_WORKING_AGAINST_PLAYER();3030 //}30313032 ////////////////////////////////////3033 // MISTREATED OUR PROTECTED MINORS?3034 ////////////////////////////////////30353036 //antonjs: consider: add cases for IsAngryAboutProtectedMinorBullied, IsAngryAboutSidedWithTheirProtectedMinor30373038 if(IsAngryAboutProtectedMinorKilled(ePlayer) || IsAngryAboutProtectedMinorAttacked(ePlayer))3039 {3040 int iTurnsSinceMinorAttack = GetTurnsSincePlayerAttackedProtectedMinor(ePlayer);3041 if (IsAngryAboutProtectedMinorKilled(ePlayer) || iTurnsSinceMinorAttack < /*50*/ GC.getOPINION_WEIGHT_ATTACKED_PROTECTED_MINOR_RECENTLY_NUM_TURNS())3042 {3043 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*6*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_WAR();3044 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*2*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_HOSTILE();3045 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*1*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_GUARDED();3046 }3047 else3048 {3049 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_PAST_WAR();3050 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*1*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_PAST_HOSTILE();3051 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*1*/ GC.getAPPROACH_ATTACKED_PROTECTED_MINOR_PAST_GUARDED();3052 }3053 }30543055 ////////////////////////////////////3056 // They made a demand3057 ////////////////////////////////////30583059 if(IsDemandEverMade(ePlayer))3060 {3061 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-6*/ GC.getAPPROACH_DECEPTIVE_DEMAND();3062 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-6*/ GC.getAPPROACH_FRIENDLY_DEMAND();3063 }30643065 ////////////////////////////////////3066 // BROKEN PROMISES ;_;3067 ////////////////////////////////////30683069 // Broken military promise with us?3070 if(IsPlayerBrokenMilitaryPromise(ePlayer))3071 {3072 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_BROKEN_MILITARY_PROMISE();3073 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-10*/ GC.getAPPROACH_DECEPTIVE_BROKEN_MILITARY_PROMISE();3074 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-10*/ GC.getAPPROACH_FRIENDLY_BROKEN_MILITARY_PROMISE();3075 }3076 // Broken military promise with someone?3077 else if(pTeam->IsBrokenMilitaryPromise())3078 {3079 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*5*/ GC.getAPPROACH_WAR_BROKEN_MILITARY_PROMISE_WORLD();3080 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_BROKEN_MILITARY_PROMISE_WORLD();3081 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_BROKEN_MILITARY_PROMISE_WORLD();3082 }3083 // Ignored our request for them to make a military promise?3084 else if(IsPlayerIgnoredMilitaryPromise(ePlayer))3085 {3086 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_IGNORED_MILITARY_PROMISE();3087 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_IGNORED_MILITARY_PROMISE();3088 }30893090 // Broken Expansion promise with us?3091 if(IsPlayerBrokenExpansionPromise(ePlayer))3092 {3093 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_BROKEN_EXPANSION_PROMISE();3094 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-6*/ GC.getAPPROACH_DECEPTIVE_BROKEN_EXPANSION_PROMISE();3095 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-6*/ GC.getAPPROACH_FRIENDLY_BROKEN_EXPANSION_PROMISE();3096 }3097 // Ignored our request for them to make a Expansion promise?3098 else if(IsPlayerIgnoredExpansionPromise(ePlayer))3099 {3100 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*3*/ GC.getAPPROACH_WAR_IGNORED_EXPANSION_PROMISE();3101 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_IGNORED_EXPANSION_PROMISE();3102 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_IGNORED_EXPANSION_PROMISE();3103 }31043105 // Broken Border promise with us?3106 if(IsPlayerBrokenBorderPromise(ePlayer))3107 {3108 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_BROKEN_BORDER_PROMISE();3109 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-6*/ GC.getAPPROACH_DECEPTIVE_BROKEN_BORDER_PROMISE();3110 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-6*/ GC.getAPPROACH_FRIENDLY_BROKEN_BORDER_PROMISE();3111 }3112 // Ignored our request for them to make a Border promise?3113 else if(IsPlayerIgnoredBorderPromise(ePlayer))3114 {3115 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*3*/ GC.getAPPROACH_WAR_IGNORED_BORDER_PROMISE();3116 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_IGNORED_BORDER_PROMISE();3117 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_IGNORED_BORDER_PROMISE();3118 }31193120 // Broken CityState attack promise with us?3121 if(IsPlayerBrokenAttackCityStatePromise(ePlayer))3122 {3123 //antonjs: todo: rename these constants3124 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_BROKEN_CITY_STATE_PROMISE();3125 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-10*/ GC.getAPPROACH_DECEPTIVE_BROKEN_CITY_STATE_PROMISE();3126 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-10*/ GC.getAPPROACH_FRIENDLY_BROKEN_CITY_STATE_PROMISE();3127 }3128 // Broken CityState attack promise with someone?3129 else if(pTeam->IsBrokenCityStatePromise())3130 {3131 //antonjs: todo: rename these constants3132 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*3*/ GC.getAPPROACH_WAR_BROKEN_CITY_STATE_PROMISE_WORLD();3133 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-3*/ GC.getAPPROACH_DECEPTIVE_BROKEN_CITY_STATE_PROMISE_WORLD();3134 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-3*/ GC.getAPPROACH_FRIENDLY_BROKEN_CITY_STATE_PROMISE_WORLD();3135 }3136 // Ignored our request for them to make a CityState attack promise?3137 else if(IsPlayerIgnoredAttackCityStatePromise(ePlayer))3138 {3139 //antonjs: todo: rename these constants3140 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_IGNORED_CITY_STATE_PROMISE();3141 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_IGNORED_CITY_STATE_PROMISE();3142 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_IGNORED_CITY_STATE_PROMISE();3143 }31443145 // Promise to not bully a city-state3146 if(IsPlayerBrokenBullyCityStatePromise(ePlayer))3147 {3148 //antonjs: todo: custom constants3149 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_BROKEN_CITY_STATE_PROMISE() / 2;3150 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-10*/ GC.getAPPROACH_DECEPTIVE_BROKEN_CITY_STATE_PROMISE() / 2;3151 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-10*/ GC.getAPPROACH_FRIENDLY_BROKEN_CITY_STATE_PROMISE() / 2;3152 }3153 else if(IsPlayerIgnoredBullyCityStatePromise(ePlayer))3154 {3155 //antonjs: todo: custom constants3156 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*4*/ GC.getAPPROACH_WAR_IGNORED_CITY_STATE_PROMISE() / 2;3157 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*-4*/ GC.getAPPROACH_DECEPTIVE_IGNORED_CITY_STATE_PROMISE() / 2;3158 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*-4*/ GC.getAPPROACH_FRIENDLY_IGNORED_CITY_STATE_PROMISE() / 2;3159 }316031613162 ////////////////////////////////////3163 // MILITARY THREAT3164 ////////////////////////////////////31653166 switch(GetMilitaryThreat(ePlayer))3167 {3168 case THREAT_CRITICAL:3169 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_DECEPTIVE_MILITARY_THREAT_CRITICAL();3170 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*4*/ GC.getAPPROACH_GUARDED_MILITARY_THREAT_CRITICAL();3171 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] += /*4*/ GC.getAPPROACH_AFRAID_MILITARY_THREAT_CRITICAL();3172 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*0*/ GC.getAPPROACH_FRIENDLY_MILITARY_THREAT_CRITICAL();3173 break;3174 case THREAT_SEVERE:3175 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_DECEPTIVE_MILITARY_THREAT_SEVERE();3176 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*3*/ GC.getAPPROACH_GUARDED_MILITARY_THREAT_SEVERE();3177 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] += /*2*/ GC.getAPPROACH_AFRAID_MILITARY_THREAT_SEVERE();3178 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*0*/ GC.getAPPROACH_FRIENDLY_MILITARY_THREAT_SEVERE();3179 break;3180 case THREAT_MAJOR:3181 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_DECEPTIVE_MILITARY_THREAT_MAJOR();3182 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*2*/ GC.getAPPROACH_GUARDED_MILITARY_THREAT_MAJOR();3183 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] += /*1*/ GC.getAPPROACH_AFRAID_MILITARY_THREAT_MAJOR();3184 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*0*/ GC.getAPPROACH_FRIENDLY_MILITARY_THREAT_MAJOR();3185 break;3186 case THREAT_MINOR:3187 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*0*/ GC.getAPPROACH_DECEPTIVE_MILITARY_THREAT_MINOR();3188 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*0*/ GC.getAPPROACH_GUARDED_MILITARY_THREAT_MINOR();3189 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] += /*1*/ GC.getAPPROACH_AFRAID_MILITARY_THREAT_MINOR();3190 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*0*/ GC.getAPPROACH_FRIENDLY_MILITARY_THREAT_MINOR();3191 break;3192 case THREAT_NONE:3193 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*2*/ GC.getAPPROACH_HOSTILE_MILITARY_THREAT_NONE();3194 break;3195 }31963197 ////////////////////////////////////3198 // NUKES3199 ////////////////////////////////////32003201 int iTheirNukes = GET_PLAYER(ePlayer).getNumNukeUnits();3202 int iOurNukes = m_pPlayer->getNumNukeUnits();3203 int iHowLikelyAreTheyToNukeUs = GET_PLAYER(ePlayer).isHuman() ? 100 : 0; // assume humans will use 'em if they've got 'em3204 if (iHowLikelyAreTheyToNukeUs == 0)3205 {3206 if (IsNukedBy(ePlayer) || GET_PLAYER(ePlayer).GetDiplomacyAI()->IsNukedBy(eMyPlayer)) // nukes have been used already3207 {3208 iHowLikelyAreTheyToNukeUs = 100;3209 }3210 //else if (GET_PLAYER(ePlayer).GetDiplomacyAI()->GetWarProjection(eMyPlayer) == WAR_PROJECTION_DESTRUCTION) // they are surely going to lose a war with 3211 //{3212 // iHowLikelyAreTheyToNukeUs = 100;3213 //}3214 else3215 {3216 int iFlavorNuke = GET_PLAYER(ePlayer).GetGrandStrategyAI()->GetPersonalityAndGrandStrategy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_USE_NUKE")) + 1;3217 iHowLikelyAreTheyToNukeUs = iFlavorNuke * iFlavorNuke; // use nukes has to pass 2 rolls3218 }3219 }3220 // do we have nukes and they don't3221 if(iTheirNukes == 0 && iOurNukes > 0)3222 {3223 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += 25;3224 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += 25;3225 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += 25;3226 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] -= 25;3227 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] -= 50;3228 }3229 // do they have nukes and we don't3230 else if (iTheirNukes > 0 && iOurNukes == 0 && iHowLikelyAreTheyToNukeUs > 50)3231 {3232 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] += 50;3233 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += 50;3234 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] -= 25;3235 viApproachWeights[MAJOR_CIV_APPROACH_WAR] -= 50;3236 }3237 // do we both have nukes3238 else if (iTheirNukes > 0 && iOurNukes > 0 && iHowLikelyAreTheyToNukeUs > 25)3239 {3240 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += 25;3241 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] -= 25;3242 viApproachWeights[MAJOR_CIV_APPROACH_WAR] -= 25;3243 viApproachWeights[MAJOR_CIV_APPROACH_NEUTRAL] += 25;3244 }32453246 int iPlayerLoop;3247 PlayerTypes eLoopPlayer;32483249 ////////////////////////////////////3250 // AT WAR RIGHT NOW3251 ////////////////////////////////////32523253 for(iPlayerLoop = 0; iPlayerLoop < MAX_CIV_PLAYERS; iPlayerLoop++)3254 {3255 eLoopPlayer = (PlayerTypes) iPlayerLoop;32563257 // Don't look at the guy we're already thinking about or anyone on his team3258 if(ePlayer != eLoopPlayer && GET_PLAYER(ePlayer).getTeam() != GET_PLAYER(eLoopPlayer).getTeam())3259 {3260 if(IsPlayerValid(eLoopPlayer))3261 {3262 if(GET_TEAM(GetTeam()).isAtWar(GET_PLAYER(eLoopPlayer).getTeam()))3263 {3264 if(GetStateAllWars() == STATE_ALL_WARS_NEUTRAL)3265 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-9*/ GC.getAPPROACH_WAR_AT_WAR_WITH_PLAYER_WARS_NEUTRAL();3266 else if(GetStateAllWars() == STATE_ALL_WARS_WINNING)3267 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-3*/ GC.getAPPROACH_WAR_AT_WAR_WITH_PLAYER_WARS_WINNING();3268 else3269 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-12*/ GC.getAPPROACH_WAR_AT_WAR_WITH_PLAYER_WARS_LOSING();32703271 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-2*/ GC.getAPPROACH_HOSTILE_AT_WAR_WITH_PLAYER();3272 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*2*/ GC.getAPPROACH_DECEPTIVE_AT_WAR_WITH_PLAYER();3273 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*0*/ GC.getAPPROACH_GUARDED_AT_WAR_WITH_PLAYER();3274 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*2*/ GC.getAPPROACH_FRIENDLY_AT_WAR_WITH_PLAYER();3275 }3276 }3277 }3278 }32793280 ////////////////////////////////////3281 // APPROACHES TOWARDS OTHER PLAYERS3282 ////////////////////////////////////32833284 // Look at Approaches we've already adopted for players we feel more strongly about3285 if(bLookAtOtherPlayers)3286 {3287 bool bMinorCiv;32883289 for(iPlayerLoop = 0; iPlayerLoop < MAX_CIV_PLAYERS; iPlayerLoop++)3290 {3291 eLoopPlayer = (PlayerTypes) iPlayerLoop;32923293 // Don't look at the guy we're already thinking about3294 if(eLoopPlayer != ePlayer)3295 {3296 if(IsPlayerValid(eLoopPlayer))3297 {3298 bMinorCiv = GET_PLAYER(eLoopPlayer).isMinorCiv();32993300 // Planning war with this player? (Can't ONLY use the War Approach because this could have been cleared before, but we have to also check it because it could have just been set for someone else earlier this turn)3301 if(GetWarGoal(eLoopPlayer) == WAR_GOAL_PREPARE ||3302 (!bMinorCiv && GetMajorCivApproach(eLoopPlayer, /*bHideTrueFeelings*/ false) == MAJOR_CIV_APPROACH_WAR)) // Major Civs only3303 {3304 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-12*/ GC.getAPPROACH_WAR_PLANNING_WAR_WITH_ANOTHER_PLAYER();3305 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-2*/ GC.getAPPROACH_HOSTILE_PLANNING_WAR_WITH_ANOTHER_PLAYER();3306 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*2*/ GC.getAPPROACH_DECEPTIVE_PLANNING_WAR_WITH_ANOTHER_PLAYER();3307 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] += /*0*/ GC.getAPPROACH_GUARDED_PLANNING_WAR_WITH_ANOTHER_PLAYER();3308 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*2*/ GC.getAPPROACH_FRIENDLY_PLANNING_WAR_WITH_ANOTHER_PLAYER();3309 }33103311 // Approaches already assigned to other higher-priority Majors3312 if(!bMinorCiv)3313 {3314 switch(GetMajorCivApproach(eLoopPlayer, /*bHideTrueFeelings*/ false))3315 {3316 case MAJOR_CIV_APPROACH_HOSTILE:3317 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-2*/ GC.getAPPROACH_WAR_HOSTILE_WITH_ANOTHER_PLAYER();3318 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-2*/ GC.getAPPROACH_HOSTILE_HOSTILE_WITH_ANOTHER_PLAYER();3319 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*2*/ GC.getAPPROACH_DECEPTIVE_HOSTILE_WITH_ANOTHER_PLAYER();3320 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*2*/ GC.getAPPROACH_FRIENDLY_HOSTILE_WITH_ANOTHER_PLAYER();3321 break;3322 case MAJOR_CIV_APPROACH_AFRAID:3323 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*-4*/ GC.getAPPROACH_WAR_AFRAID_WITH_ANOTHER_PLAYER();3324 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] += /*-4*/ GC.getAPPROACH_HOSTILE_AFRAID_WITH_ANOTHER_PLAYER();3325 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += /*2*/ GC.getAPPROACH_DECEPTIVE_AFRAID_WITH_ANOTHER_PLAYER();3326 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += /*2*/ GC.getAPPROACH_FRIENDLY_AFRAID_WITH_ANOTHER_PLAYER();3327 break;3328 }3329 }3330 }3331 }3332 }3333 }33343335 ////////////////////////////////////3336 // Are we getting money from trade with them3337 ////////////////////////////////////3338 int iCurrentTradeValue = GetPlayer()->GetTrade()->GetAllTradeValueFromPlayerTimes100(YIELD_GOLD, ePlayer) / 100;3339 if(iCurrentTradeValue > 0) // todo: add thresholds3340 {3341 // todo: constant/XML3342 viApproachWeights[MAJOR_CIV_APPROACH_WAR] -= 5;3343 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] -= 5;3344 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] += 5;3345 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] -= 1;3346 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] -= 1;3347 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] += 5;3348 viApproachWeights[MAJOR_CIV_APPROACH_NEUTRAL] -= 2;33493350 // sanity check - if we will go negative from war with this player, don't go to war3351 int iGPT = GetPlayer()->calculateGoldRate();3352 int iDeltaGPT = iGPT - iCurrentTradeValue;3353 if (iGPT >= 0 && (iDeltaGPT < 0))3354 {3355 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += iDeltaGPT;3356 }3357 }33583359 ////////////////////////////////////3360 // WAR PROJECTION - how do we think a war against ePlayer will go?3361 ////////////////////////////////////33623363 switch(GetWarProjection(ePlayer))3364 {3365 case WAR_PROJECTION_DESTRUCTION:3366 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*45*/ GC.getAPPROACH_WAR_PROJECTION_DESTRUCTION_PERCENT();3367 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3368 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*45*/ GC.getAPPROACH_WAR_PROJECTION_DESTRUCTION_PERCENT();3369 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3370 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*125*/ GC.getAPPROACH_GUARDED_PROJECTION_DESTRUCTION_PERCENT();3371 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3372 break;3373 case WAR_PROJECTION_DEFEAT:3374 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*60*/ GC.getAPPROACH_WAR_PROJECTION_DEFEAT_PERCENT();3375 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3376 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*60*/ GC.getAPPROACH_WAR_PROJECTION_DEFEAT_PERCENT();3377 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3378 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*115*/ GC.getAPPROACH_GUARDED_PROJECTION_DEFEAT_PERCENT();3379 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3380 break;3381 case WAR_PROJECTION_STALEMATE:3382 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*80*/ GC.getAPPROACH_WAR_PROJECTION_STALEMATE_PERCENT();3383 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3384 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*105*/ GC.getAPPROACH_GUARDED_PROJECTION_STALEMATE_PERCENT();3385 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3386 break;3387 case WAR_PROJECTION_UNKNOWN:3388 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*100*/ GC.getAPPROACH_WAR_PROJECTION_UNKNOWN_PERCENT();3389 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3390 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*100*/ GC.getAPPROACH_GUARDED_PROJECTION_UNKNOWN_PERCENT();3391 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3392 break;3393 case WAR_PROJECTION_GOOD:3394 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*150*/ GC.getAPPROACH_WAR_PROJECTION_GOOD_PERCENT();3395 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3396 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*150*/ GC.getAPPROACH_WAR_PROJECTION_GOOD_PERCENT();3397 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3398 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*80*/ GC.getAPPROACH_GUARDED_PROJECTION_GOOD_PERCENT();3399 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3400 break;3401 case WAR_PROJECTION_VERY_GOOD:3402 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*180*/ GC.getAPPROACH_WAR_PROJECTION_VERY_GOOD_PERCENT();3403 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3404 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*180*/ GC.getAPPROACH_WAR_PROJECTION_VERY_GOOD_PERCENT();3405 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3406 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] *= /*60*/ GC.getAPPROACH_GUARDED_PROJECTION_VERY_GOOD_PERCENT();3407 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] /= 100;3408 break;3409 }34103411 ////////////////////////////////////3412 // Is this player a reckless expander?3413 ////////////////////////////////////34143415 if(IsPlayerRecklessExpander(ePlayer))3416 {3417 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*160*/ GC.getAPPROACH_WAR_RECKLESS_EXPANDER();3418 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3419 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*160*/ GC.getAPPROACH_WAR_RECKLESS_EXPANDER();3420 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3421 }34223423 ////////////////////////////////////3424 // Is this player already in a war with someone who isn't us?3425 ////////////////////////////////////34263427 bool bThinkingAboutDogpiling = false;3428 for(iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)3429 {3430 eLoopPlayer = (PlayerTypes) iPlayerLoop;34313432 // Is this a player we have relations with?3433 if(eLoopPlayer != GET_PLAYER(ePlayer).GetID() && eLoopPlayer != m_pPlayer->GetID() && GET_PLAYER(ePlayer).GetDiplomacyAI()->IsPlayerValid(eLoopPlayer))3434 {3435 eWarState = GET_PLAYER(ePlayer).GetDiplomacyAI()->GetWarState(eLoopPlayer);3436 if(eWarState != NO_WAR_STATE_TYPE)3437 {3438 bThinkingAboutDogpiling = true;3439 }3440 }3441 }3442 if (bThinkingAboutDogpiling)3443 {3444 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= 200;3445 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3446 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= 150;3447 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3448 }34493450 ////////////////////////////////////3451 // DISTANCE - the farther away a player is the less likely we are to want to attack them!3452 ////////////////////////////////////34533454 // Factor in distance3455 switch(GetPlayer()->GetProximityToPlayer(ePlayer))3456 {3457 case PLAYER_PROXIMITY_NEIGHBORS:3458 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*115*/ GC.getAPPROACH_WAR_PROXIMITY_NEIGHBORS();3459 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3460 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*115*/ GC.getAPPROACH_WAR_PROXIMITY_NEIGHBORS();3461 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3462 break;3463 case PLAYER_PROXIMITY_CLOSE:3464 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*100*/ GC.getAPPROACH_WAR_PROXIMITY_CLOSE();3465 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3466 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*100*/ GC.getAPPROACH_WAR_PROXIMITY_CLOSE();3467 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3468 break;3469 case PLAYER_PROXIMITY_FAR:3470 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*60*/ GC.getAPPROACH_WAR_PROXIMITY_FAR();3471 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3472 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*60*/ GC.getAPPROACH_WAR_PROXIMITY_FAR();3473 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3474 break;3475 case PLAYER_PROXIMITY_DISTANT:3476 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*50*/ GC.getAPPROACH_WAR_PROXIMITY_DISTANT();3477 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3478 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= /*50*/ GC.getAPPROACH_WAR_PROXIMITY_DISTANT();3479 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3480 break;3481 }34823483 ////////////////////////////////////3484 // PEACE TREATY - have we made peace with this player before? If so, reduce war weight3485 ////////////////////////////////////34863487 int iPeaceTreatyTurn = GET_TEAM(GetTeam()).GetTurnMadePeaceTreatyWithTeam(eTeam);3488 if(iPeaceTreatyTurn > -1)3489 {3490 int iTurnsSincePeace = GC.getGame().getElapsedGameTurns() - iPeaceTreatyTurn;3491 if(iTurnsSincePeace < /*25*/ GC.getTURNS_SINCE_PEACE_WEIGHT_DAMPENER())3492 {3493 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= /*65*/ GC.getAPPROACH_WAR_HAS_MADE_PEACE_BEFORE_PERCENT();3494 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3495 }3496 }34973498 ////////////////////////////////////3499 // DUEL - If there's only 2 players in this game, no friendly or deceptive3500 ////////////////////////////////////35013502 int iNumMajorsLeft = GC.getGame().countMajorCivsAlive();3503 if(iNumMajorsLeft == 2)3504 {3505 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] = 0;3506 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] = 0;3507 }35083509 ////////////////////////////////////3510 // COOP WAR - agreed to go to war with someone?3511 ////////////////////////////////////35123513 if(IsLockedIntoCoopWar(ePlayer))3514 viApproachWeights[MAJOR_CIV_APPROACH_WAR] += /*1000*/ GC.getCOOP_WAR_LOCKED_TURNS_WAR_WEIGHT();35153516 ////////////////////////////////////3517 // RANDOM FACTOR3518 ////////////////////////////////////35193520 int iRandAmount;3521 for(iApproachLoop = 0; iApproachLoop < NUM_MAJOR_CIV_APPROACHES; iApproachLoop++)3522 {3523 // Increase weights to hundreds to give us more fidelity3524 viApproachWeights[iApproachLoop] *= 100;35253526 iRandAmount = viApproachWeights[iApproachLoop] * /*15*/ GC.getAPPROACH_RANDOM_PERCENT();35273528 // If the amount is negative, only bad things can happen. Plus, it's not likely we're going to pick this anyways3529 if(iRandAmount > 0)3530 {3531 iRandAmount /= 100;3532 viApproachWeights[iApproachLoop] += GC.getGame().getJonRandNumVA(iRandAmount, "Randomizing Diplo AI Major Civ Approach Weight (%d; %d)", (int)GetPlayer()->GetID(), (int)ePlayer);3533 }3534 }35353536 ////////////////////////////////////3537 // CAN WE DECLARE WAR?3538 ////////////////////////////////////35393540#if defined(MOD_EVENTS_WAR_AND_PEACE)3541 if(!GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(ePlayer).getTeam(), GetPlayer()->GetID()))3542#else3543 if(!GET_TEAM(GetTeam()).canDeclareWar(GET_PLAYER(ePlayer).getTeam()))3544#endif3545 {3546 // If we're already at war with this player don't cancel out the weight for them!3547 if(!GET_TEAM(GetTeam()).isAtWar(GET_PLAYER(ePlayer).getTeam()))3548 {3549 viApproachWeights[MAJOR_CIV_APPROACH_WAR] = 0;3550 }3551 }35523553 ////////////////////////////////////3554 // On the same team?3555 ////////////////////////////////////3556 if(GetTeam() == GET_PLAYER(ePlayer).getTeam())3557 {3558 viApproachWeights[MAJOR_CIV_APPROACH_WAR] = 0;3559 viApproachWeights[MAJOR_CIV_APPROACH_HOSTILE] = 0;3560 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] = 0;3561 viApproachWeights[MAJOR_CIV_APPROACH_GUARDED] = 0;3562 viApproachWeights[MAJOR_CIV_APPROACH_AFRAID] = 0;3563 viApproachWeights[MAJOR_CIV_APPROACH_NEUTRAL] = 0;3564 viApproachWeights[MAJOR_CIV_APPROACH_FRIENDLY] = 100;3565 }35663567 ////////////////////////////////////3568 // MODIFY WAR BASED ON HUMAN DIFFICULTY LEVEL3569 ////////////////////////////////////35703571 if(GET_PLAYER(ePlayer).isHuman())3572 {3573 HandicapTypes eHandicap = GET_PLAYER(ePlayer).getHandicapType();3574 int iWarMod = 100;35753576 CvHandicapInfo* pHandicap = GC.getHandicapInfo(eHandicap);3577 if(pHandicap)3578 iWarMod = pHandicap->getAIDeclareWarProb();35793580 viApproachWeights[MAJOR_CIV_APPROACH_WAR] *= iWarMod;3581 viApproachWeights[MAJOR_CIV_APPROACH_WAR] /= 100;3582 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] *= iWarMod;3583 viApproachWeights[MAJOR_CIV_APPROACH_DECEPTIVE] /= 100;3584 }35853586 // This vector is what we'll use to sort3587 CvWeightedVector< MajorCivApproachTypes, 128 > vApproachWeightsForSorting;3588 vApproachWeightsForSorting.clear();35893590 // Transfer values from our normal int vector (which we need for logging) to the Weighted Vector we can sort3591 for(iApproachLoop = 0; iApproachLoop < NUM_MAJOR_CIV_APPROACHES; iApproachLoop++)3592 {3593 vApproachWeightsForSorting.push_back((MajorCivApproachTypes) iApproachLoop, viApproachWeights[iApproachLoop]);3594 }35953596 vApproachWeightsForSorting.SortItems();35973598 eApproach = vApproachWeightsForSorting.GetElement(0);3599 iHighestWeight = vApproachWeightsForSorting.GetWeight(0);36003601 // If we're going to war then update how we're acting3602 if(eApproach == MAJOR_CIV_APPROACH_WAR)3603 {3604 eWarFace = GetWarFaceWithPlayer(ePlayer);36053606 // If we haven't set WarFace on a previous turn, figure out what it should be3607 if(eWarFace == NO_WAR_FACE_TYPE)3608 {3609 MajorCivApproachTypes eTempApproach;36103611 // Use index of 1 since we already know element 0 is war; that will give us the most reasonable approach3612 eTempApproach = vApproachWeightsForSorting.GetElement(1);36133614 // Pick among the Approach types3615 switch(eTempApproach)3616 {36173618 case MAJOR_CIV_APPROACH_HOSTILE:3619 eWarFace = WAR_FACE_HOSTILE;3620 break;36213622 case MAJOR_CIV_APPROACH_DECEPTIVE:3623 case MAJOR_CIV_APPROACH_AFRAID:3624 case MAJOR_CIV_APPROACH_FRIENDLY:36253626 // Denounced them? If so, let's not be too friendly3627 if(IsDenouncedPlayer(ePlayer))3628 {3629 eWarFace = WAR_FACE_NEUTRAL;3630 }3631 else3632 {3633 eWarFace = WAR_FACE_FRIENDLY;3634 }3635 break;36363637 default:3638 eWarFace = WAR_FACE_NEUTRAL;3639 break;3640 }3641 }3642 }3643 else3644 {3645 eWarFace = NO_WAR_FACE_TYPE;3646 }36473648 // Don't want to log if we're just seeing what the highest weight is and don't care about what Approach we like3649 if(bLog)3650 {3651 LogMajorCivApproachUpdate(ePlayer, viApproachWeights.begin(), eApproach, eOldApproach, eWarFace);3652 }36533654 return eApproach;3655}