Code:
bool CvPlayerAI::AI_doDiploDemandTribute(PlayerTypes ePlayer)
{
CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);
if (!kPlayer.isHuman())
{
return false;
}
if (GET_TEAM(getTeam()).getLeaderID() != getID())
{
return false;
}
if (!GET_TEAM(getTeam()).canDeclareWar(kPlayer.getTeam()))
{
return false;
}
if (GET_TEAM(getTeam()).AI_isSneakAttackPreparing(kPlayer.getTeam()))
{
return false;
}
if (GET_TEAM(kPlayer.getTeam()).getDefensivePower() >= GET_TEAM(getTeam()).getPower())
{
return false;
}
if (AI_getAttitude(ePlayer) > GC.getLeaderHeadInfo(kPlayer.getPersonalityType()).getDemandTributeAttitudeThreshold())
{
return false;
}
if (AI_getContactTimer((ePlayer), CONTACT_DEMAND_TRIBUTE) > 0)
{
return false;
}
if (GC.getGameINLINE().getSorenRandNum(GC.getLeaderHeadInfo(getPersonalityType()).getContactRand(CONTACT_DEMAND_TRIBUTE), "AI Diplo Demand Tribute") != 0)
{
return false;
}
TradeData item;
int iReceiveGold = std::min(std::max(0, (kPlayer.getGold() - 50)), kPlayer.AI_goldTarget());
iReceiveGold -= (iReceiveGold % GC.getDefineINT("DIPLOMACY_VALUE_REMAINDER"));
if (iReceiveGold > 50)
{
setTradeItem(&item, TRADE_GOLD, iReceiveGold, NULL);
}
else if (GET_TEAM(getTeam()).AI_mapTradeVal(kPlayer.getTeam()) > 100)
{
setTradeItem(&item, TRADE_MAPS, 0, NULL);
}
if (!canTradeItem(ePlayer, item, true))
{
return false;
}
CLinkList<TradeData> theirList;
theirList.insertAtEnd(item);
AI_changeContactTimer((ePlayer), CONTACT_DEMAND_TRIBUTE, GC.getLeaderHeadInfo(getPersonalityType()).getContactDelay(CONTACT_DEMAND_TRIBUTE));
CvDiploParameters* pDiplo = new CvDiploParameters(getID());
pDiplo->setDiploComment((DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_DEMAND_TRIBUTE"));
pDiplo->setAIContact(true);
pDiplo->setOurOfferList(theirList);
gDLL->beginDiplomacy(pDiplo, ePlayer);
return true;
}