Code:
bool CvPlayerAI::AI_doDiploDeclareWar(PlayerTypes ePlayer)
{
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
int iDeclareWarTradeRand = GC.getLeaderHeadInfo(getPersonalityType()).getDeclareWarTradeRand();
int iMinAtWarCounter = MAX_INT;
for (int iJ = 0; iJ < MAX_TEAMS; iJ++)
{
if (GET_TEAM((TeamTypes)iJ).isAlive())
{
if (atWar(((TeamTypes)iJ), getTeam()))
{
int iAtWarCounter = GET_TEAM(getTeam()).AI_getAtWarCounter((TeamTypes)iJ);
if (GET_TEAM(getTeam()).AI_getWarPlan((TeamTypes)iJ) == WARPLAN_DOGPILE)
{
iAtWarCounter *= 2;
iAtWarCounter += 5;
}
iMinAtWarCounter = std::min(iAtWarCounter, iMinAtWarCounter);
}
}
}
if (iMinAtWarCounter < 10)
{
iDeclareWarTradeRand *= iMinAtWarCounter;
iDeclareWarTradeRand /= 10;
iDeclareWarTradeRand ++;
}
if (iMinAtWarCounter < 4)
{
iDeclareWarTradeRand /= 4;
iDeclareWarTradeRand ++;
}
if (GC.getGameINLINE().getSorenRandNum(iDeclareWarTradeRand, "AI Diplo Declare War Trade") != 0)
{
return false;
}
int iGoldValuePercent = AI_goldTradeValuePercent();
int iBestValue = 0;
TeamTypes eBestTeam = NO_TEAM;
for (int iJ = 0; iJ < MAX_TEAMS; iJ++)
{
if (GET_TEAM((TeamTypes)iJ).isAlive())
{
if (atWar(((TeamTypes) iJ), getTeam()) && !atWar(((TeamTypes) iJ), kPlayer.getTeam()))
{
if (GET_TEAM((TeamTypes)iJ).getAtWarCount() < std::max(2, (GC.getGameINLINE().countCivTeamsAlive() / 2)))
{
TradeData item;
setTradeItem(&item, TRADE_WAR, iJ, NULL);
if (kPlayer.canTradeItem(getID(), item, true))
{
int iValue = (1 + GC.getGameINLINE().getSorenRandNum(1000, "AI Declare War Trading"));
iValue *= (101 + GET_TEAM((TeamTypes)iJ).AI_getAttitudeWeight(getTeam()));
iValue /= 100;
if (iValue > iBestValue)
{
iBestValue = iValue;
eBestTeam = ((TeamTypes)iJ);
}
}
}
}
}
}
if (eBestTeam == NO_TEAM)
{
return false;
}
iBestValue = 0;
int iOurValue = GET_TEAM(getTeam()).AI_declareWarTradeVal(eBestTeam, kPlayer.getTeam());
int iTheirValue = 0;
int iReceiveGold = 0;
int iGiveGold = 0;
if (iTheirValue > iOurValue)
{
int iGold = std::min(((iTheirValue - iOurValue) * 100) / iGoldValuePercent, kPlayer.AI_maxGoldTrade(getID()));
if (iGold > 0)
{
TradeData item;
setTradeItem(&item, TRADE_GOLD, iGold, NULL);
if (kPlayer.canTradeItem(getID(), item, true))
{
iReceiveGold = iGold;
iOurValue += (iGold * iGoldValuePercent) / 100;
}
}
}
else if (iOurValue > iTheirValue)
{
int iGold = std::min(((iOurValue - iTheirValue) * 100) / iGoldValuePercent, AI_maxGoldTrade(ePlayer));
if (iGold > 0)
{
TradeData item;
setTradeItem(&item, TRADE_GOLD, iGold, NULL);
if (canTradeItem((ePlayer), item, true))
{
iGiveGold = iGold;
iTheirValue += (iGold * iGoldValuePercent) / 100;
}
}
}
if (iTheirValue <= (iOurValue * 3 / 4))
{
return false;
}
CLinkList<TradeData> theirList;
CLinkList<TradeData> ourList;
TradeData item;
setTradeItem(&item, TRADE_WAR, eBestTeam, NULL);
theirList.insertAtEnd(item);
if (iGiveGold != 0)
{
setTradeItem(&item, TRADE_GOLD, iGiveGold, NULL);
ourList.insertAtEnd(item);
}
if (iReceiveGold != 0)
{
setTradeItem(&item, TRADE_GOLD, iReceiveGold, NULL);
theirList.insertAtEnd(item);
}
GC.getGameINLINE().implementDeal(getID(), (ePlayer), &ourList, &theirList);
return true;
}