/// Do we want to accept ePlayer as our voluntary vassal?
bool CvDiplomacyAI::IsVoluntaryVassalageRequestAcceptable(PlayerTypes ePlayer)
{
// We will only accept forced capitulation from backstabbers and people who have stolen cities from us.
if (IsUntrustworthy(ePlayer) || GetNumCitiesCapturedBy(ePlayer) > 0)
return false;
vector<PlayerTypes> vTheirTeam = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getPlayers();
int iNumCaps = 0;
bool bWeLikeOneOfThem = false;
for (size_t i=0; i<vTheirTeam.size(); i++)
{
if (!GET_PLAYER(vTheirTeam[i]).isAlive() || GET_PLAYER(vTheirTeam[i]).getNumCities() <= 0)
continue;
if (!GET_PLAYER(vTheirTeam[i]).IsHasLostCapital())
iNumCaps++;
iNumCaps += GET_PLAYER(vTheirTeam[i]).GetNumCapitalCities();
bool bWeLikeThem = IsDoFAccepted(vTheirTeam[i]) || IsHasDefensivePact(vTheirTeam[i]) || (GetCivOpinion(vTheirTeam[i]) >= CIV_OPINION_FRIEND && GetCivApproach(vTheirTeam[i]) == CIV_APPROACH_FRIENDLY);
// We must be stronger.
if (bWeLikeThem)
{
if (GetPlayerMilitaryStrengthComparedToUs(vTheirTeam[i]) > STRENGTH_STRONG)
return false;
if (GetPlayerEconomicStrengthComparedToUs(vTheirTeam[i]) > STRENGTH_STRONG)
return false;
// If we like them and we can't honestly protect them, then don't agree.
if (GetPlayer()->GetProximityToPlayer(vTheirTeam[i]) < PLAYER_PROXIMITY_CLOSE)
return false;
bWeLikeOneOfThem = true;
}
else
{
if (GetPlayerMilitaryStrengthComparedToUs(vTheirTeam[i]) > STRENGTH_AVERAGE)
return false;
if (GetPlayerEconomicStrengthComparedToUs(vTheirTeam[i]) > STRENGTH_AVERAGE)
return false;
}
}
// Do not accept voluntary capitulation if we need their capitals to win.
if (IsGoingForWorldConquest() || IsCloseToDominationVictory())
{
if (iNumCaps > 0)
return false;
}
// We must be willing to go to war with everyone they're currently at war with.
vector<PlayerTypes> vNewWarPlayers;
for (int iPlayerLoop = 0; iPlayerLoop < MAX_CIV_PLAYERS; iPlayerLoop++)
{
PlayerTypes eLoopPlayer = (PlayerTypes) iPlayerLoop;
if (!IsPlayerValid(eLoopPlayer))
continue;
// We're already at war - ignore
if (IsAtWar(eLoopPlayer))
continue;
if (GET_PLAYER(ePlayer).IsAtWarWith(eLoopPlayer))
{
if (std::find(vNewWarPlayers.begin(), vNewWarPlayers.end(), eLoopPlayer) == vNewWarPlayers.end())
vNewWarPlayers.push_back(eLoopPlayer);
vector<PlayerTypes> vLinkedWarPlayers = GetLinkedWarPlayers(eLoopPlayer, false, true, false);
for (std::vector<PlayerTypes>::iterator it = vLinkedWarPlayers.begin(); it != vLinkedWarPlayers.end(); it++)
{
if (std::find(vNewWarPlayers.begin(), vNewWarPlayers.end(), *it) == vNewWarPlayers.end())
vNewWarPlayers.push_back(*it);
}
}
}
for (std::vector<PlayerTypes>::iterator it = vNewWarPlayers.begin(); it != vNewWarPlayers.end(); it++)
{
// Don't attack friends or people keeping us financially afloat.
if (!IsWarSane(*it))
return false;
// Don't attack if they're not a potential war target.
if (GET_PLAYER(*it).isMajorCiv() && !IsPotentialWarTarget(*it))
return false;
// Ignore City-States unless peace blocked, since we can just make peace as their new master if we want.
if (GET_PLAYER(*it).isMinorCiv())
{
if (GET_PLAYER(ePlayer).GetDiplomacyAI()->GetPeaceBlockReason(*it) == 6 || GET_PLAYER(ePlayer).GetDiplomacyAI()->GetPeaceBlockReason(*it) == 7)
{
if (GetCivApproach(*it) > CIV_APPROACH_HOSTILE && GetPlayerMilitaryStrengthComparedToUs(*it) > STRENGTH_AVERAGE)
return false;
}
}
// Avoid DoWing a powerful neighbor.
else if (GET_PLAYER(*it).GetProximityToPlayer(GetID()) >= PLAYER_PROXIMITY_CLOSE)
{
if (GetCivApproach(*it) == CIV_APPROACH_AFRAID)
return false;
else if (GetCivApproach(*it) != CIV_APPROACH_WAR && GetWarGoal(*it) != WAR_GOAL_DEMAND)
{
if (GetBoldness() > 6 || bWeLikeOneOfThem)
{
if (GetPlayerMilitaryStrengthComparedToUs(*it) > STRENGTH_STRONG)
return false;
}
else if (GetPlayerMilitaryStrengthComparedToUs(*it) > STRENGTH_AVERAGE)
return false;
}
}
}
// If everything is clear, then accept.
return true;
}