Bazaar developer reference

CvDealAI::GetResourceValue(ResourceTypes, int, int, bool, PlayerTypes)

Defined in
CvDealAI.cpp, line 1222
Class
CvDealAI
Hook name
CivHooks::CvDealAI_GetResourceValue

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}

Calls

Called by