Пытался разобраться с этой функцией. Во первых она наглая, во вторых не должна она так часто вызываться, она же только для переговоров.

Немного изменил её, дабы calculateGoldRate() высчитывался лишь один раз.

Скрытый текст
Код:
int CvPlayerAI::AI_maxGoldPerTurnTrade(PlayerTypes ePlayer) const
{
	int iMaxGoldPerTurn;
	int GoldRate = calculateGoldRate();//Cansei 1.09.2013

	FAssert(ePlayer != getID());

	if (isHuman() || (GET_PLAYER(ePlayer).getTeam() == getTeam()))
	{
//		iMaxGoldPerTurn = (calculateGoldRate() + (getGold() / GC.getDefineINT("PEACE_TREATY_LENGTH")));//Cansei 1.09.2013
	iMaxGoldPerTurn = (GoldRate + (getGold() / 10));
	}
	else
	{
		iMaxGoldPerTurn = getTotalPopulation();

		iMaxGoldPerTurn *= GC.getLeaderHeadInfo(getPersonalityType()).getMaxGoldPerTurnTradePercent();
		iMaxGoldPerTurn /= 100;

		iMaxGoldPerTurn += std::min(0, getGoldPerTurnByPlayer(ePlayer));
	}

//	return std::max(0, std::min(iMaxGoldPerTurn, calculateGoldRate()));//Cansei 1.09.2013
	return std::max(0, std::min(iMaxGoldPerTurn, GoldRate));
}


Функция немного присмирела, но все равно остается неприлично прожорливой. Буду смотреть дальше, вглубь calculateGoldRate().
Код:
0x2eb90a0 	CvPlayerAI::AI_maxGoldPerTurnTrade 	2.25
Код:
0x2eb90a0        CvPlayerAI::AI_maxGoldPerTurnTrade 	2.80
Код:
0x2eb90a0        CvPlayerAI::AI_maxGoldPerTurnTrade 	1.96