Hooks
static bool BeforeCvDealAI_GetResourceValue(CvDealAI* self, ResourceTypes eResource, int iResourceQuantity, int iNumTurns, bool bFromMe, PlayerTypes eOtherPlayer, int& result);static void AfterCvDealAI_GetResourceValue(CvDealAI* self, ResourceTypes eResource, int iResourceQuantity, int iNumTurns, bool bFromMe, PlayerTypes eOtherPlayer, int& result);static int ReplaceCvDealAI_GetResourceValue(int (*original)(CvDealAI*, ResourceTypes, int, int, bool, PlayerTypes), CvDealAI* self, ResourceTypes eResource, int iResourceQuantity, int iNumTurns, bool bFromMe, PlayerTypes eOtherPlayer);CivRegisterBefore<CivHooks::CvDealAI_GetResourceValue>(host, &BeforeCvDealAI_GetResourceValue);CivRegisterAfter<CivHooks::CvDealAI_GetResourceValue>(host, &AfterCvDealAI_GetResourceValue);CivRegisterReplace<CivHooks::CvDealAI_GetResourceValue>(host, &ReplaceCvDealAI_GetResourceValue);
Code
1221/// How much is a Resource worth?1222int CvDealAI::GetResourceValue(ResourceTypes eResource, int iResourceQuantity, int iNumTurns, bool bFromMe, PlayerTypes eOtherPlayer)1223{1224 CvAssertMsg(GetPlayer()->GetID() != eOtherPlayer, "DEAL_AI: Trying to check value of a Resource with oneself. Please send Jon this with your last 5 autosaves and what changelist # you're playing.");12251226 int iItemValue = 0;12271228 const CvResourceInfo* pkResourceInfo = GC.getResourceInfo(eResource);1229 CvAssert(pkResourceInfo != NULL);1230 if (pkResourceInfo == NULL)1231 return 0;12321233 ResourceUsageTypes eUsage = pkResourceInfo->getResourceUsage();12341235 // Luxury Resource1236 if(eUsage == RESOURCEUSAGE_LUXURY)1237 {1238 if (GC.getGame().GetGameLeagues()->IsLuxuryHappinessBanned(GetPlayer()->GetID(), eResource))1239 {1240 iItemValue = 0;1241 }1242 else1243 {1244 int iHappinessFromResource = pkResourceInfo->getHappiness();1245 iItemValue += (iResourceQuantity * iHappinessFromResource * iNumTurns * 2); // Ex: 1 Silk for 4 Happiness * 30 turns * 2 = 24012461247 // If we only have 1 of a Luxury then we value it much more1248 if(bFromMe)1249 {1250 if(GetPlayer()->getNumResourceAvailable(eResource) == 1)1251 {1252 iItemValue *= 3;1253 if(GetPlayer()->GetPlayerTraits()->GetLuxuryHappinessRetention() > 0)1254 {1255 iItemValue /= 2;1256 }1257 }1258 }1259 }1260 }1261 // Strategic Resource1262 else if(eUsage == RESOURCEUSAGE_STRATEGIC)1263 {1264 //tricksy humans trying to sploit us1265 if(!bFromMe)1266 {1267 // if we already have a big surplus of this resource1268 if(GetPlayer()->getNumResourceAvailable(eResource) > GetPlayer()->getNumCities())1269 {1270 iResourceQuantity = 0;1271 }1272 else1273 {1274 iResourceQuantity = min(max(5,GetPlayer()->getNumCities()), iResourceQuantity);1275 }1276 }1277 if(!GET_TEAM(GetPlayer()->getTeam()).IsResourceObsolete(eResource))1278 {1279 iItemValue += (iResourceQuantity * iNumTurns * 150 / 100); // Ex: 5 Iron for 30 turns * 2 = value of 3001280 }1281 else1282 {1283 iItemValue = 0;1284 }1285 }12861287 // Increase value if it's from us and we don't like the guy1288 if(bFromMe)1289 {1290 int iModifier = 0;12911292 // Opinion also matters1293 switch(GetPlayer()->GetDiplomacyAI()->GetMajorCivOpinion(eOtherPlayer))1294 {1295 case MAJOR_CIV_OPINION_ALLY:1296 iModifier = 100;1297 break;1298 case MAJOR_CIV_OPINION_FRIEND:1299 iModifier = 100;1300 break;1301 case MAJOR_CIV_OPINION_FAVORABLE:1302 iModifier = 100;1303 break;1304 case MAJOR_CIV_OPINION_NEUTRAL:1305 iModifier = 100;1306 break;1307 case MAJOR_CIV_OPINION_COMPETITOR:1308 iModifier = 175;1309 break;1310 case MAJOR_CIV_OPINION_ENEMY:1311 iModifier = 400;1312 break;1313 case MAJOR_CIV_OPINION_UNFORGIVABLE:1314 iModifier = 1000;1315 break;1316 default:1317 CvAssertMsg(false, "DEAL_AI: AI player has no valid Opinion for Resource valuation. Please send Jon this with your last 5 autosaves and what changelist # you're playing.")1318 iModifier = 100;1319 break;1320 }13211322 // Approach is important1323 switch(GetPlayer()->GetDiplomacyAI()->GetMajorCivApproach(eOtherPlayer, /*bHideTrueFeelings*/ true))1324 {1325 case MAJOR_CIV_APPROACH_HOSTILE:1326 iModifier += 300;1327 break;1328 case MAJOR_CIV_APPROACH_GUARDED:1329 iModifier += 150;1330 break;1331 case MAJOR_CIV_APPROACH_AFRAID:1332 iModifier = 200; // Forced value1333 break;1334 case MAJOR_CIV_APPROACH_FRIENDLY:1335 iModifier = 200; // Forced value1336 break;1337 case MAJOR_CIV_APPROACH_NEUTRAL:1338 iModifier += 100;1339 break;1340 default:1341 CvAssertMsg(false, "DEAL_AI: AI player has no valid Approach for Resource valuation. Please send Jon this with your last 5 autosaves and what changelist # you're playing.")1342 iModifier += 100;1343 break;1344 }13451346 iItemValue *= iModifier;1347 iItemValue /= 200; // 200 because we've added two mods together1348 }13491350 return iItemValue;1351}