New Beta Version - March 2nd (3-2)

Discussion in 'Community Patch Project' started by Gazebo, Mar 2, 2021.

  1. youngsteve

    youngsteve Prince

    Joined:
    Sep 10, 2007
    Messages:
    378
    Gender:
    Male
    Location:
    England
    I think that is a good move, as it was really exploitive. Stalker explained this very well in his experiences in using vassals, pointing out that they need to be nerfed.
     
    Bromar1, JamesNinelives and DeAnno like this.
  2. tothePAIN

    tothePAIN King

    Joined:
    Dec 31, 2018
    Messages:
    774
    Gender:
    Male
    Yes, I agree that using vassals to get diplomatic victory has been an easier path to victory than actually finishing a domination victory. Conquering diplomatic civilizations could be very effective for diplomatic victory.

    But vassals are a larger source of votes for diplomatic victory. With them gone 100%, I'm not sure how that will shake up. I've said play it out - and also suggested a compromised of vassals votes for diplomatic victory counting only 50%, rather than 0. So still a nerf, just not as much as currently happening.
     
    Chaste and Txurce like this.
  3. bahamut19

    bahamut19 Chieftain

    Joined:
    Jun 15, 2020
    Messages:
    67
    I think the vassal system where you earned all of the vassal's votes was more of a puppet state system, which is not necessarily a vassal. Also, a vassal in VP basically meant you earned a glorified city-state ally, which is not really how a vassal worked.

    A vassal system is basically a mutual agreement between 2 nations, one of which is obviously superior to another. Since a vassal in VP can only be earned through war, part of the mutual agreement should include the defensive pact and open borders which currently happens. The tax system used currently is more of an imposition than agreement, and instead there should be some tradeable asset(s) the vassal can agree to provide for your protection, your mercy, and your strength. Gold could be a part of that agreement, certain types of votes, or even stuff not in the diplomatic game (if anyone wanted to program it) such as great works, great people, or great people points, free conversion of all cities to your religion, or whatever. The key is it is a mutual agreement and the agreement is not forever. It has a duration, perhaps longer than normal trade deals, definitely longer than a truce, but still finite.

    I am glad that vassalage isn't exactly an automatic puppet state now in the new beta.
     
    James Ryle and JamesNinelives like this.
  4. SpankmyMetroid

    SpankmyMetroid Warlord

    Joined:
    Jun 22, 2016
    Messages:
    296
    You can still use them to support other proposals to shape your DV victory (passing UN, getting spheres of influence, etc). Gunboat diplomacy already helps with securing city state votes. Why should a peaceful diplo player be at such a disadvantage over a warmonger player (who might not have even went statecraft) simply because of extra votes from vassals? I like this change but we’ll have to see if it’s too hard for autocracy to pivot.
     
    youngsteve likes this.
  5. youngsteve

    youngsteve Prince

    Joined:
    Sep 10, 2007
    Messages:
    378
    Gender:
    Male
    Location:
    England
    That is incorrect, unless it has changed with this latest version. In my last two games. Portugal stopped me winning by suddenly gaining a large Persia as vassal, who was not at war. In my previous game as Huns, just entered medieval era & Spain who had 5 cities wanted to be protected & became my vassal. Was never at war with her previously & was actually friendly.
     
  6. Recursive

    Recursive Covets Lands That You Currently Own Moderator

    Joined:
    Dec 19, 2017
    Messages:
    2,691
    Gender:
    Male
    Vassal independence & capitulation logic was revised by me for this latest version.
     
  7. youngsteve

    youngsteve Prince

    Joined:
    Sep 10, 2007
    Messages:
    378
    Gender:
    Male
    Location:
    England
    I didn't know that, as I am currently playing the older version saves. Is there a reason for that, as many nations became vassals of stronger neighbours, usually for fear or protection.

    One question I was going to ask. I notice Gazebo mentioning changes to Spain. Hopefully these are positive ones, as every game I play, not as Spain, they always struggle & do badly. Eventually either being vassalised or destroyed.
     
  8. Recursive

    Recursive Covets Lands That You Currently Own Moderator

    Joined:
    Dec 19, 2017
    Messages:
    2,691
    Gender:
    Male
    I revised it so the AI made more sensible choices about when and when not to capitulate, as well as who to capitulate to. If you're interested, here's the revised code.
    Spoiler :

    General "Become Vassal" Function:
    *a few checks for both types of vassalage - then moves to either the capitulation or voluntary vassalage acceptability function

    Code:
    /// Do we want to become the vassal of ePlayer?
    bool CvDiplomacyAI::IsVassalageAcceptable(PlayerTypes ePlayer)
    {
       if (ePlayer < 0 || ePlayer >= MAX_MAJOR_CIVS) return false;
    
       // We are already ePlayer's vassal
       if (IsVassal(ePlayer))
           return false;
    
       // We can't become ePlayer's vassal
       if (!GET_TEAM(GetTeam()).canBecomeVassal(GET_PLAYER(ePlayer).getTeam()))
           return false;
    
       // Shadow AI does not make decisions for human!
       if (GetPlayer()->IsAITeammateOfHuman())
           return false;
    
       // Can't capitulate if we have vassals
       if (GetPlayer()->GetNumVassals() > 0)
           return false;
    
       vector<PlayerTypes> vOurTeam = GET_TEAM(GetTeam()).getPlayers();
       vector<PlayerTypes> vTheirTeam = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getPlayers();
    
       int iNumTeamMembersInFavor = 0;
       int iNumTeamMembersAgainst = 0;
    
       for (size_t i=0; i<vOurTeam.size(); i++)
       {
           if (!GET_PLAYER(vOurTeam[i]).isAlive() || GET_PLAYER(vOurTeam[i]).getNumCities() <= 0)
               continue;
    
           bool bYes = false;
    
           for (size_t j=0; j<vTheirTeam.size(); j++)
           {
               if (!GET_PLAYER(vTheirTeam[j]).isAlive() || GET_PLAYER(vTheirTeam[j]).getNumCities() <= 0)
                   continue;
    
               // If we're at war, this is capitulation - otherwise, it's voluntary vassalage
               // If we agree to become the vassal of any of their team members, then we agree to become the vassal of all of them
               if (IsAtWar(ePlayer))
               {
                   if (GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->IsCapitulationAcceptable(vTheirTeam[j]))
                   {
                       bYes = true;
                       iNumTeamMembersInFavor++;
                       break;
                   }
               }
               else
               {
                   if (GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->IsVoluntaryVassalageAcceptable(vTheirTeam[j]))
                   {
                       bYes = true;
                       iNumTeamMembersInFavor++;
                       break;
                   }
               }
           }
    
           if (!bYes)
               iNumTeamMembersAgainst++;
       }
    
       // More team members must agree than refuse
       if (iNumTeamMembersInFavor > 0 && iNumTeamMembersInFavor > iNumTeamMembersAgainst)
           return true;
    
       return false;
    }
    
    Capitulation:
    Code:
    /// Do we want to capitulate to ePlayer due to war?
    bool CvDiplomacyAI::IsCapitulationAcceptable(PlayerTypes ePlayer)
    {
       int iWarScore = GetWarScore(ePlayer);
    
       // We've totally lost...
       if (iWarScore <= -95)
           return true;
    
       // War score must be at least -75 to even consider it
       if (iWarScore > -75)
           return false;
    
       // Not defensive
       if (GetWarState(ePlayer) > WAR_STATE_DEFENSIVE)
           return false;
    
       int iCapitulationScore = iWarScore * -1;
    
       // How strong are they militarily? (must be stronger!)
       switch (GetPlayerMilitaryStrengthComparedToUs(ePlayer))
       {
       case STRENGTH_IMMENSE:
           iCapitulationScore += 20;
           break;
       case STRENGTH_POWERFUL:
           iCapitulationScore += 10;
           break;
       case STRENGTH_STRONG:
           iCapitulationScore += 5;
           break;
       default:
           return false;
           break;
       }
    
       // Are they threatening us with military?
       switch (GetMilitaryAggressivePosture(ePlayer))
       {
       case AGGRESSIVE_POSTURE_INCREDIBLE:
           iCapitulationScore += 10;
           break;
       case AGGRESSIVE_POSTURE_HIGH:
           iCapitulationScore += 5;
           break;
       case AGGRESSIVE_POSTURE_MEDIUM:
           iCapitulationScore += 0;
           break;
       default:
           return false;
           break;
       }
    
       // How close are they to us?
       switch (GET_PLAYER(ePlayer).GetProximityToPlayer(GetID()))
       {
       case PLAYER_PROXIMITY_NEIGHBORS:
           iCapitulationScore += 10;
           break;
       case PLAYER_PROXIMITY_CLOSE:
           iCapitulationScore += 0;
           break;
       case PLAYER_PROXIMITY_FAR:
           iCapitulationScore -= 10;
           break;
       case PLAYER_PROXIMITY_DISTANT:
           iCapitulationScore -= 20;
           break;
       }
    
       // We're going for conquest
       if (IsGoingForWorldConquest())
           iCapitulationScore -= 20;
    
       // We're close to victory? Resist!
       if (IsCloseToAnyVictoryCondition())
           iCapitulationScore -= 20;
    
       // Are we very unhappy?
       if (GetPlayer()->IsEmpireSuperUnhappy())
       {
           iCapitulationScore += 20;
       }
       else if (GetPlayer()->IsEmpireVeryUnhappy())
       {
           iCapitulationScore += 10;
       }
       // No? How about them?
       else
       {
           iCapitulationScore -= GetPlayer()->IsEmpireUnhappy() ? 5 : 10;
    
           // Their cities might revolt! Resist!
           if (GET_PLAYER(ePlayer).IsEmpireSuperUnhappy())
               return false;
           // If they're very unhappy, hold out for longer...
           else if (GET_PLAYER(ePlayer).IsEmpireVeryUnhappy())
               iCapitulationScore -= 10;
       }
    
       // Are any of our cities about to be lost? Try to maintain as many of our cities as we can if we're going to lose anyway.
       int iCityLoop;
       int iNumCitiesInDanger = 0;
       for (CvCity* pLoopCity = GetPlayer()->firstCity(&iCityLoop); pLoopCity != NULL; pLoopCity = GetPlayer()->nextCity(&iCityLoop))
       {
           if (!pLoopCity->IsInDanger(ePlayer))
               continue;
    
           iNumCitiesInDanger++;
    
           if (pLoopCity->isInDangerOfFalling() || pLoopCity->getDamage() >= (pLoopCity->GetMaxHitPoints()/3))
           {
               // Our last city about to fall?
               if (GetPlayer()->getNumCities() == 1)
                   return true;
    
               iCapitulationScore += 20;
           }
           else if (pLoopCity->IsBlockadedWaterAndLand() || pLoopCity->getDamage() >= (pLoopCity->GetMaxHitPoints()/2))
           {
               iCapitulationScore += 10;
           }
       }
    
       // Are any of THEIR cities in danger? Try to grab any cities we can from them.
       int iNumTheirCitiesInDanger = 0;
       for (CvCity* pLoopCity = GET_PLAYER(ePlayer).firstCity(&iCityLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(ePlayer).nextCity(&iCityLoop))
       {
           if (!pLoopCity->IsInDanger(GetID()))
               continue;
    
           iNumTheirCitiesInDanger++;
    
           if (pLoopCity->isInDangerOfFalling() || pLoopCity->getDamage() >= (pLoopCity->GetMaxHitPoints()/3))
           {
               return false;
           }
           else if (pLoopCity->IsBlockadedWaterAndLand())
           {
               // Don't surrender if we could get our capital or Holy City back!
               if (pLoopCity->IsOriginalCapitalForPlayer(GetPlayer()->GetID()) || pLoopCity->GetCityReligions()->IsHolyCityForReligion(GetPlayer()->GetReligions()->GetCurrentReligion(false)))
                   return false;
    
               iCapitulationScore -= 15;
           }
           else if (pLoopCity->isUnderSiege() && pLoopCity->getDamage() >= (pLoopCity->GetMaxHitPoints()/2))
           {
               // Don't surrender if we could get our capital or Holy City back!
               if (pLoopCity->IsOriginalCapitalForPlayer(GetID()) || pLoopCity->GetCityReligions()->IsHolyCityForReligion(GetPlayer()->GetReligions()->GetCurrentReligion(false)))
                   return false;
    
               iCapitulationScore -= 10;
           }
       }
    
       // Have we lost our capital?
       if (GetPlayer()->IsHasLostCapital())
       {
           iCapitulationScore += 20;
    
           // To them?
           if (IsCapitalCapturedBy(ePlayer, true, true))
           {
               iCapitulationScore += 20;
           }
       }
       // No cities in danger and we still have our capital? Resist!
       else if (iNumCitiesInDanger == 0)
       {
           return false;
       }
       // At least as many of their cities are endangered as ours? Resist!
       else if (iNumTheirCitiesInDanger >= iNumCitiesInDanger)
       {
           return false;
       }
    
       int iOurCivs = GET_TEAM(GetTeam()).getAliveCount();
       int iTheirCivs = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getAliveCount();
    
       // Harder if we have more civs on our team
       if (iOurCivs > iTheirCivs)
       {
           iCapitulationScore -= min(30, 10 * (iOurCivs - iTheirCivs));
       }
       // Easier if they have more civs on their team
       else if (iTheirCivs > iOurCivs)
       {
           iCapitulationScore += min(30, 10 * (iTheirCivs - iOurCivs));
       }
    
       return iCapitulationScore > /*100*/ GC.getVASSALAGE_CAPITULATE_BASE_THRESHOLD();
    }
    
    Voluntary Vassalage:
    Code:
    /// Do we want to voluntarily become ePlayer's vassal?
    bool CvDiplomacyAI::IsVoluntaryVassalageAcceptable(PlayerTypes ePlayer)
    {
       // No voluntary capitulation if there's less than 50% of the players ever alive
       if (GC.getGame().countMajorCivsAlive() < (GC.getGame().countMajorCivsEverAlive() / 2))
           return false;
    
       // Never acceptable if they've refused to give us independence!
       if (IsAngryAboutPlayerVassalageForcefullyRevoked(ePlayer))
           return false;
    
       // They failed to protect us before!
       if (GetVassalFailedProtectScore(ePlayer) > 0 && GetVassalFailedProtectScore(ePlayer) > (GetVassalProtectScore(ePlayer) * -1))
           return false;
    
       int iOurCivs = GET_TEAM(GetTeam()).getAliveCount();
       int iTheirCivs = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getAliveCount();
    
       // We have more members - no
       if (iOurCivs > iTheirCivs)
           return false;
    
       // They're too far away - no
       if (GET_PLAYER(ePlayer).GetProximityToPlayer(GetID()) < PLAYER_PROXIMITY_CLOSE)
           return false;
    
       // Refuse if we have different ideologies; we'll lose our ideology!
       if (GetPlayer()->GetPlayerPolicies()->GetLateGamePolicyTree() != NO_POLICY_BRANCH_TYPE && !IsPlayerSameIdeology(ePlayer))
           return false;
    
       // if we're hostile with this player, don't want to be his voluntary vassal
       if (GetMajorCivApproach(ePlayer) <= MAJOR_CIV_APPROACH_GUARDED)
           return false;
    
       if (GetMajorCivOpinion(ePlayer) <= MAJOR_CIV_OPINION_ENEMY)
           return false;
    
       if (GetPlayer()->HasAnyOffensiveOperationsAgainstPlayer(ePlayer) || AvoidExchangesWithPlayer(ePlayer, false))
           return false;
    
       // Unacceptable if they're untrustworthy (this includes if they captured our capital/Holy City; that's what capitulation is for...)
       if (IsUntrustworthy(ePlayer))
           return false;
    
       // Don't become a vassal if we're close to winning!
       if (IsCloseToAnyVictoryCondition())
           return false;
    
       // The point of vassalage is protection, so they must be stronger than us
       if (GetPlayerMilitaryStrengthComparedToUs(ePlayer) <= STRENGTH_AVERAGE)
           return false;
    
       if (GetPlayerEconomicStrengthComparedToUs(ePlayer) <= STRENGTH_AVERAGE)
           return false;
    
       if (GetPlayerTargetValue(ePlayer) >= TARGET_VALUE_FAVORABLE)
           return false;
    
       if (IsEasyTarget(ePlayer))
           return false;
    
       // If we're going for world conquest, they must be at least 2x stronger than us for us to consider this
       if (IsGoingForWorldConquest() && GetPlayerMilitaryStrengthComparedToUs(ePlayer) < STRENGTH_POWERFUL)
           return false;
    
       // Are we dominating them culturally?
       if (GetPlayer()->GetCulture()->GetInfluenceLevel(ePlayer) >= INFLUENCE_LEVEL_POPULAR)
       {
           if (GetPlayer()->GetCulture()->GetInfluenceLevel(ePlayer) >= INFLUENCE_LEVEL_INFLUENTIAL || GetPlayer()->GetCulture()->GetInfluenceTrend(ePlayer) != INFLUENCE_TREND_FALLING)
               return false;
       }
    
       // Do we own more capitals than they do?
       int iOurCapitals = 0;
       int iTheirCapitals = 0;
       vector<PlayerTypes> vOurTeam = GET_TEAM(GetTeam()).getPlayers();
       vector<PlayerTypes> vTheirTeam = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getPlayers();
    
       for (size_t i=0; i<vOurTeam.size(); i++)
       {
           if (!GET_PLAYER(vOurTeam[i]).isAlive() || GET_PLAYER(vOurTeam[i]).getNumCities() <= 0)
               continue;
    
           // Teammate is close to winning?
           if (IsTeammate(vOurTeam[i]) && GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->IsCloseToAnyVictoryCondition())
               return false;
    
           if (!GET_PLAYER(vOurTeam[i]).IsHasLostCapital())
               iOurCapitals++;
    
           iOurCapitals += GET_PLAYER(vOurTeam[i]).GetNumCapitalCities();
    
           // while we're at it, let's check to see if any of our teammates hate any of their teammates
           for (size_t j=0; j<vTheirTeam.size(); j++)
           {
               if (!GET_PLAYER(vTheirTeam[j]).isAlive() || GET_PLAYER(vTheirTeam[j]).getNumCities() <= 0)
                   continue;
    
               if (GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->GetMajorCivApproach(vTheirTeam[j]) <= MAJOR_CIV_APPROACH_GUARDED)
                   return false;
    
               if (GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->GetMajorCivOpinion(vTheirTeam[j]) <= MAJOR_CIV_OPINION_ENEMY)
                   return 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())
               iTheirCapitals++;
    
           iTheirCapitals += GET_PLAYER(vTheirTeam[i]).GetNumCapitalCities();
       }
    
       // No voluntary capitulation if we have more capitals than they do
       if (iOurCapitals > iTheirCapitals)
           return false;
    
       // ...or if we have more capitals than team members
       if (iOurCapitals > iOurCivs)
           return false;
    
       // If we got down here, then vassalage is possible - let's evaluate
       int iWantVassalageScore = -10;
    
       // What do we think about them?
       switch (GetMajorCivOpinion(ePlayer))
       {
       case MAJOR_CIV_OPINION_ALLY:
           iWantVassalageScore += 25;
           break;
       case MAJOR_CIV_OPINION_FRIEND:
           iWantVassalageScore += 15;
           break;
       case MAJOR_CIV_OPINION_FAVORABLE:
           iWantVassalageScore += 5;
           break;
       case MAJOR_CIV_OPINION_NEUTRAL:
           iWantVassalageScore -= 25;
           break;
       case MAJOR_CIV_OPINION_COMPETITOR:
           iWantVassalageScore -= 50;
           break;
       }
    
       switch (GetMajorCivApproach(ePlayer))
       {
       case MAJOR_CIV_APPROACH_FRIENDLY:
           iWantVassalageScore += 5;
           break;
       case MAJOR_CIV_APPROACH_NEUTRAL:
           iWantVassalageScore -= 10;
           break;
       case MAJOR_CIV_APPROACH_AFRAID:
           iWantVassalageScore += 20;
           break;
       }
    
       // How strong are they compared to us? Military strength is twice as important...
       switch (GetPlayerMilitaryStrengthComparedToUs(ePlayer))
       {
       case STRENGTH_IMMENSE:
           iWantVassalageScore += 100;
           break;
       case STRENGTH_POWERFUL:
           iWantVassalageScore += 50;
           break;
       case STRENGTH_STRONG:
           iWantVassalageScore += 20;
           break;
       }
    
       switch (GetPlayerEconomicStrengthComparedToUs(ePlayer))
       {
       case STRENGTH_IMMENSE:
           iWantVassalageScore += 50;
           break;
       case STRENGTH_POWERFUL:
           iWantVassalageScore += 25;
           break;
       case STRENGTH_STRONG:
           iWantVassalageScore += 10;
           break;
       }
    
       // Are they a warmonger?
       switch (GetWarmongerThreat(ePlayer))
       {
       case THREAT_CRITICAL:
           iWantVassalageScore -= 150;
           break;
       case THREAT_SEVERE:
           iWantVassalageScore -= 75;
           break;
       case THREAT_MAJOR:
           iWantVassalageScore -= 30;
           break;
       case THREAT_MINOR:
           iWantVassalageScore -= 10;
           break;
       case THREAT_NONE:
           iWantVassalageScore += 10;
           break;
       }
    
       int iTechPercent = GET_TEAM(GetTeam()).GetTeamTechs()->GetNumTechsKnown() / max(1, GET_TEAM(GET_PLAYER(ePlayer).getTeam()).GetTeamTechs()->GetNumTechsKnown());
    
       if (iTechPercent >= 95) // We are at a similar tech level!
           iWantVassalageScore -= 10;
       else if (iTechPercent >= 85) // Lagging behind!
           iWantVassalageScore += 10;
       else if (iTechPercent >= 75)
           iWantVassalageScore += 20;
       else if (iTechPercent >= 65) // Really far behind!
           iWantVassalageScore += 30;
       else
           iWantVassalageScore += 40;
    
       // Unhappy?
       if (GetPlayer()->IsEmpireUnhappy())
           iWantVassalageScore += 10;
    
       // Unique abilities influence this...
       if (GetPlayer()->GetPlayerTraits()->IsWarmonger() || GetPlayer()->GetPlayerTraits()->IsExpansionist() || GetPlayer()->GetPlayerTraits()->IsDiplomat())
       {
           iWantVassalageScore -= 20;
       }
       else if (GetPlayer()->GetPlayerTraits()->IsNerd() || GetPlayer()->GetPlayerTraits()->IsTourism() || GetPlayer()->GetPlayerTraits()->IsSmaller())
       {
           iWantVassalageScore += 20;
       }
    
       // Adjust score based on civ flavors
       iWantVassalageScore += (GetDoFWillingness() + GetLoyalty()) * 2;
       iWantVassalageScore -= (GetBoldness() + GetDiploBalance()) * 2;
    
       CvFlavorManager* pFlavorMgr = GetPlayer()->GetFlavorManager();
       iWantVassalageScore += pFlavorMgr->GetPersonalityFlavorForDiplomacy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_EXPANSION")) * -2;
       iWantVassalageScore += pFlavorMgr->GetPersonalityFlavorForDiplomacy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_OFFENSE")) * -2;
       iWantVassalageScore += pFlavorMgr->GetPersonalityFlavorForDiplomacy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_DEFENSE"));
       iWantVassalageScore += pFlavorMgr->GetPersonalityFlavorForDiplomacy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_CULTURE"));
       iWantVassalageScore += pFlavorMgr->GetPersonalityFlavorForDiplomacy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_WONDER"));
    
       // Evaluate current wars
       for (int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)
       {
           PlayerTypes eLoopPlayer = (PlayerTypes) iPlayerLoop;
    
           if (IsPlayerValid(eLoopPlayer) && GET_PLAYER(ePlayer).GetDiplomacyAI()->IsPlayerValid(eLoopPlayer))
           {
               // At war with a common foe?
               if (IsAtWar(eLoopPlayer) && GET_PLAYER(ePlayer).IsAtWarWith(eLoopPlayer))
               {
                   WarStateTypes eOurWarState = GetWarState(eLoopPlayer);
                   WarStateTypes eTheirWarState = GET_PLAYER(ePlayer).GetDiplomacyAI()->GetWarState(eLoopPlayer);
    
                   // Are they doing better than us?
                   if (eOurWarState < WAR_STATE_OFFENSIVE && eTheirWarState > WAR_STATE_DEFENSIVE && eTheirWarState > eOurWarState)
                   {
                       iWantVassalageScore += ((int)eTheirWarState - (int)eOurWarState) * 30;
                   }
                   // Are they doing worse than us?
                   else if (eTheirWarState < WAR_STATE_OFFENSIVE && eOurWarState > eTheirWarState)
                   {
                       iWantVassalageScore -= ((int)eOurWarState - (int)eTheirWarState) * 30;
                   }
               }
               // We're at war and they're not?
               else if (IsAtWar(eLoopPlayer) && !GET_PLAYER(ePlayer).IsAtWarWith(eLoopPlayer))
               {
                   int iStrengthFactor = (int)GET_PLAYER(ePlayer).GetDiplomacyAI()->GetPlayerMilitaryStrengthComparedToUs(eLoopPlayer) - 3;
    
                   switch (GetWarState(eLoopPlayer))
                   {
                   case WAR_STATE_NEARLY_WON:
                       iWantVassalageScore -= 80;
                       break;
                   case WAR_STATE_OFFENSIVE:
                       iWantVassalageScore -= 30;
                       break;
                   case WAR_STATE_CALM:
                       iWantVassalageScore -= 10;
                       break;
                   case WAR_STATE_STALEMATE:
                       iWantVassalageScore += 10 * iStrengthFactor;
                       break;
                   case WAR_STATE_DEFENSIVE:
                       iWantVassalageScore += 30 * iStrengthFactor;
                       break;
                   case WAR_STATE_NEARLY_DEFEATED:
                       iWantVassalageScore += 80 * iStrengthFactor;
                       break;
                   }
               }
               // They're at war and we're not?
               else if (!IsAtWar(eLoopPlayer) && GET_PLAYER(ePlayer).IsAtWarWith(eLoopPlayer))
               {
                   // At war with our friends or trade partners? Grr...
                   if (IsFriendOrAlly(eLoopPlayer) || GetMajorCivOpinion(eLoopPlayer) >= MAJOR_CIV_OPINION_FRIEND || (IsStrategicTradePartner(eLoopPlayer) && GetMajorCivOpinion(eLoopPlayer) >= MAJOR_CIV_OPINION_FAVORABLE))
                   {
                       iWantVassalageScore -= 100;
                   }
                   // With someone close to us?
                   else if (GET_PLAYER(eLoopPlayer).GetProximityToPlayer(GetID()) >= PLAYER_PROXIMITY_CLOSE)
                   {
                       int iStrengthFactor = (int)GetPlayerMilitaryStrengthComparedToUs(eLoopPlayer) - 3;
                       int iOpinionFactor = GetMajorCivOpinion(ePlayer) <= MAJOR_CIV_OPINION_ENEMY ? 1 : 2;
    
                       // How's the war going?
                       switch (GET_PLAYER(ePlayer).GetDiplomacyAI()->GetWarState(eLoopPlayer))
                       {
                       case WAR_STATE_NEARLY_DEFEATED:
                           iWantVassalageScore -= 100 * iStrengthFactor * iOpinionFactor; // eep! No thanks!
                           break;
                       case WAR_STATE_DEFENSIVE:
                           iWantVassalageScore -= 30 * iStrengthFactor * iOpinionFactor; // should probably bail!
                           break;
                       case WAR_STATE_STALEMATE:
                           iWantVassalageScore -= 10 * iStrengthFactor * iOpinionFactor; // bail if they're too strong or we don't dislike them enough
                           break;
                       case WAR_STATE_CALM:
                           iWantVassalageScore -= 5 * iStrengthFactor * iOpinionFactor;
                           break;
                       case WAR_STATE_OFFENSIVE:
                           iWantVassalageScore += 5 * iStrengthFactor * iOpinionFactor; // may want to become a voluntary vassal if they're going to conquer our neighbors, especially if we don't like them...
                           break;
                       case WAR_STATE_NEARLY_WON:
                           iWantVassalageScore += 10 * iStrengthFactor * iOpinionFactor; // ditto, but moreso!
                           break;
                       }
                   }
               }
           }
       }
    
       // Modify score based on global politics - are they likely to support our interests?
       iWantVassalageScore += GetNumMutualFriends(ePlayer) * 10;
       iWantVassalageScore += GetNumEnemiesDenounced(ePlayer) * 10;
       iWantVassalageScore += GetNumMutualDefensePacts(ePlayer) * 20;
       iWantVassalageScore -= GetNumEnemyFriends(ePlayer) * 20;
       iWantVassalageScore -= GetNumEnemyDefensePacts(ePlayer) * 20;
       iWantVassalageScore -= GetNumFriendsDenounced(ePlayer) * 20;
    
       // Increase score if they've liberated us
       if (WasResurrectedBy(ePlayer))
           iWantVassalageScore += 100;
    
       if (IsPlayerLiberatedCapital(ePlayer))
           iWantVassalageScore += 50;
       else if (IsPlayerReturnedCapital(ePlayer))
           iWantVassalageScore += 20;
    
       if (IsPlayerLiberatedHolyCity(ePlayer))
           iWantVassalageScore += 30;
       else if (IsPlayerReturnedHolyCity(ePlayer))
           iWantVassalageScore += 10;
    
       if (GetNumCitiesLiberatedBy(ePlayer) > GetNumCitiesCapturedBy(ePlayer))
           iWantVassalageScore += (GetNumCitiesLiberatedBy(ePlayer) - GetNumCitiesCapturedBy(ePlayer)) * 10;
    
       // Reduce score based on past aggression towards us
       iWantVassalageScore -= GetNumWarsDeclaredOnUs(ePlayer) * 10;
       iWantVassalageScore -= GetNumCitiesCapturedBy(ePlayer) * 30;
    
       // Reduce score based on number of his vassals
       iWantVassalageScore -= 20 * GET_PLAYER(ePlayer).GetNumVassals();
    
       if (iWantVassalageScore <= 0)
           return false;
    
       // Modifier based on culture
       int iCulturalDominanceOverUs = GET_PLAYER(ePlayer).GetCulture()->GetInfluenceLevel(m_pPlayer->GetID()) - GetPlayer()->GetCulture()->GetInfluenceLevel(ePlayer);
    
       iWantVassalageScore *= (100 + 10 * iCulturalDominanceOverUs);
       iWantVassalageScore /= 100;
    
       // If they aren't bigger than us, they probably can't protect us
       if (GetPlayer()->getNumCities() >= GET_PLAYER(ePlayer).getNumCities())
       {
           iWantVassalageScore /= 2;
       }
       if (GetPlayer()->getTotalPopulation() >= GET_PLAYER(ePlayer).getTotalPopulation())
       {
           iWantVassalageScore /= 2;
       }
    
       // Modifier based on proximity
       switch (GET_PLAYER(ePlayer).GetProximityToPlayer(GetID()))
       {
       case PLAYER_PROXIMITY_NEIGHBORS:
           iWantVassalageScore *= 125;
           iWantVassalageScore /= 100;
           break;
       case PLAYER_PROXIMITY_CLOSE:
           iWantVassalageScore *= 100;
           iWantVassalageScore /= 100;
           break;
       }
    
       return iWantVassalageScore >= /*100*/ GC.getVASSALAGE_CAPITULATE_BASE_THRESHOLD();
    }
    
    General "End Vassal" Function:
    * a few checks in both cases
    Code:
    /// Is it acceptable for us to terminate the vassalage agreement with ePlayer?
    bool CvDiplomacyAI::IsEndVassalageAcceptable(PlayerTypes ePlayer)
    {
       // Shadow AI does not make decisions for human!
       if (GetPlayer()->IsAITeammateOfHuman())
           return false;
    
       // We are the MASTER receiving the request
       if (IsMaster(ePlayer))
       {
           int iPeaceful = 0;
           int iForceful = 0;
           vector<PlayerTypes> vOurTeam = GET_TEAM(GetTeam()).getPlayers();
           vector<PlayerTypes> vTheirTeam = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getPlayers();
    
           for (size_t i=0; i<vOurTeam.size(); i++)
           {
               if (!GET_PLAYER(vOurTeam[i]).isAlive() || GET_PLAYER(vOurTeam[i]).getNumCities() <= 0)
                   continue;
    
               for (size_t j=0; j<vTheirTeam.size(); j++)
               {
                   if (!GET_PLAYER(vTheirTeam[j]).isAlive() || GET_PLAYER(vTheirTeam[j]).getNumCities() <= 0)
                       continue;
    
                   if (GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->IsEndVassalageRequestAcceptable(vTheirTeam[j]))
                       iPeaceful++;
                   else
                       iForceful++;
               }
           }
    
           if (iPeaceful > 0 && iPeaceful > iForceful)
               return true;
    
           return false;
       }
    
       if (!IsVassal(ePlayer))
           return false;
    
       // We are the VASSAL sending the request
    
       // If we actually can't end Vassalage with ePlayer (conditions not satisfied) then abort
       if (!GET_TEAM(GetTeam()).canEndVassal(GET_PLAYER(ePlayer).getTeam()))
           return false;
    
       // don't do this in anarchy
       if (m_pPlayer->IsAnarchy())
           return false;
    
       // if we're close to winning, we want out
       if (IsCloseToAnyVictoryCondition())
           return true;
    
       int iOurCivs = 0;
       int iTheirCivs = 0;
       int iOurCapitals = 0;
       int iTheirCapitals = 0;
       int iMastersWantIndependenceFrom = 0;
       int iMastersWantToRemainWith = 0;
       vector<PlayerTypes> vOurTeam = GET_TEAM(GetTeam()).getPlayers();
       vector<PlayerTypes> vTheirTeam = GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getPlayers();
    
       for (size_t i=0; i<vOurTeam.size(); i++)
       {
           if (!GET_PLAYER(vOurTeam[i]).isAlive() || GET_PLAYER(vOurTeam[i]).getNumCities() <= 0)
               continue;
    
           // Teammate is close to winning?
           if (IsTeammate(vOurTeam[i]) && GET_PLAYER(vOurTeam[i]).GetDiplomacyAI()->IsCloseToAnyVictoryCondition())
               return true;
    
           if (!GET_PLAYER(vOurTeam[i]).IsHasLostCapital())
               iOurCapitals++;
    
           iOurCivs++;
           iOurCapitals += GET_PLAYER(vOurTeam[i]).GetNumCapitalCities();
       }
       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())
               iTheirCapitals++;
    
           iTheirCivs++;
           iTheirCapitals += GET_PLAYER(vTheirTeam[i]).GetNumCapitalCities();
    
           if (IsEndVassalageWithPlayerAcceptable(ePlayer))
               iMastersWantIndependenceFrom++;
           else
               iMastersWantToRemainWith++;
       }
    
       // If we have more capitals than they do or more capitals than civs, we want out
       if (iOurCapitals > iTheirCapitals)
           return true;
    
       if (iOurCapitals > iOurCivs)
           return true;
    
       // Don't want independence from anyone?
       if (iMastersWantIndependenceFrom == 0)
           return false;
    
       // Want to remain with more masters than we want to abandon?
       if (iMastersWantToRemainWith > 0 && iMastersWantToRemainWith > iMastersWantIndependenceFrom)
           return false;
    
      // If a single member on the team wants independence, all other members must accept it to give their teammate a shot at winning.
       return true;
    }
    
    Vassal Wants Independence Or Not:
    Code:
    bool CvDiplomacyAI::IsEndVassalageWithPlayerAcceptable(PlayerTypes ePlayer)
    {
       int iIndependenceScore = GetBoldness();
    
       // How are we being treated? This is a major factor!
       switch (GetVassalTreatmentLevel(ePlayer))
       {
       case VASSAL_TREATMENT_CONTENT:
           iIndependenceScore -= 20;
           break;
       case VASSAL_TREATMENT_DISAGREE:
           iIndependenceScore += 20;
           break;
       case VASSAL_TREATMENT_MISTREATED:
           iIndependenceScore += 50;
           break;
       case VASSAL_TREATMENT_UNHAPPY:
           iIndependenceScore += 70;
           break;
       case VASSAL_TREATMENT_ENSLAVED:
           iIndependenceScore += 100;
           break;
       }
    
       // Double this for voluntary vassalage.
       if (IsVoluntaryVassalage(ePlayer))
           iIndependenceScore *= 2;
    
       // How strong are they compared to us? Military strength is a huge factor.
       switch (GetPlayerMilitaryStrengthComparedToUs(ePlayer))
       {
       case STRENGTH_IMMENSE:
           iIndependenceScore -= 200;
           break;
       case STRENGTH_POWERFUL:
           iIndependenceScore -= 100;
           break;
       case STRENGTH_STRONG:
           iIndependenceScore -= 50;
           break;
       case STRENGTH_AVERAGE:
           iIndependenceScore += 30;
           break;
       case STRENGTH_POOR:
           iIndependenceScore += 70;
           break;
       case STRENGTH_WEAK:
           iIndependenceScore += 150;
           break;
       case STRENGTH_PATHETIC:
           iIndependenceScore += 300;
           break;
       }
    
       // How far are they from us? More likely to request independence from distant players than neighbors
       switch (GET_PLAYER(ePlayer).GetProximityToPlayer(GetID()))
       {
       case PLAYER_PROXIMITY_NEIGHBORS:
           iIndependenceScore -= 30;
           break;
       case PLAYER_PROXIMITY_CLOSE:
           iIndependenceScore -= 15;
           break;
       case PLAYER_PROXIMITY_FAR:
           iIndependenceScore += 15;
           break;
       case PLAYER_PROXIMITY_DISTANT:
           iIndependenceScore += 30;
           break;
       }
    
       // What do we think of them?
       switch (GetMajorCivOpinion(ePlayer))
       {
       case MAJOR_CIV_OPINION_UNFORGIVABLE:
           iIndependenceScore += 50;
           break;
       case MAJOR_CIV_OPINION_ENEMY:
           iIndependenceScore += 30;
           break;
       case MAJOR_CIV_OPINION_COMPETITOR:
           iIndependenceScore += 15;
           break;
       case MAJOR_CIV_OPINION_NEUTRAL:
           iIndependenceScore -= 10;
           break;
       case MAJOR_CIV_OPINION_FAVORABLE:
           iIndependenceScore -= 20;
           break;
       case MAJOR_CIV_OPINION_FRIEND:
           iIndependenceScore -= 30;
           break;
       case MAJOR_CIV_OPINION_ALLY:
           iIndependenceScore -= 50;
           break;
       }
    
       if (GetMajorCivApproach(ePlayer) <= MAJOR_CIV_APPROACH_GUARDED)
       {
           iIndependenceScore += 25;
       }
       else if (GetMajorCivApproach(ePlayer) == MAJOR_CIV_APPROACH_AFRAID)
       {
           iIndependenceScore -= 50;
       }
    
       // Are we unhappy?
       if (GetPlayer()->IsEmpireSuperUnhappy())
       {
           iIndependenceScore -= 200;
       }
       else if (GetPlayer()->IsEmpireVeryUnhappy())
       {
           iIndependenceScore -= 80;
       }
       else if (GetPlayer()->IsEmpireUnhappy())
       {
           iIndependenceScore -= 20;
       }
       else
       {
           iIndependenceScore += 10;
       }
    
       // Did they resurrect us?
       if (WasResurrectedBy(ePlayer))
           iIndependenceScore -= 50;
    
       if (iIndependenceScore <= 0)
           return false;
    
       // Modifier based on number of wars currently fighting - don't like lots of conflict
       iIndependenceScore *= (100 + GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getAtWarCount(true) * 20);
       iIndependenceScore /= 100;
    
       // Are we culturally dominant over them?
       int iCulturalDominanceOverUs = (int)GET_PLAYER(ePlayer).GetCulture()->GetInfluenceLevel(GetID()) - (int)GetPlayer()->GetCulture()->GetInfluenceLevel(ePlayer);
       if (iCulturalDominanceOverUs <= 0)
       {
           iIndependenceScore *= 150;
           iIndependenceScore /= 100;
       }
    
       // Master is failing to protect us
       if (GetVassalFailedProtectScore(ePlayer) > 0 && GetVassalFailedProtectScore(ePlayer) > (GetVassalProtectScore(ePlayer) * -1))
       {
           iIndependenceScore *= 200;
           iIndependenceScore /= 100;
       }
    
       // We're bigger than him? Bail!
       if (GetPlayer()->getNumCities() > GET_PLAYER(ePlayer).getNumCities())
       {
           iIndependenceScore *= 200;
           iIndependenceScore /= 100;
       }
    
       if (GetPlayer()->getTotalPopulation() > GET_PLAYER(ePlayer).getTotalPopulation())
       {
           iIndependenceScore *= 200;
           iIndependenceScore /= 100;
       }
    
       // if we're a warmonger
       if (IsGoingForWorldConquest() || GetPlayer()->GetPlayerTraits()->IsWarmonger())
       {
           iIndependenceScore *= 200;
           iIndependenceScore /= 100;
       }
    
       // Master is threatening us with military near our borders
       switch (GetMilitaryAggressivePosture(ePlayer))
       {
       case AGGRESSIVE_POSTURE_INCREDIBLE:
           iIndependenceScore *= 40;
           iIndependenceScore /= 100;
           break;
       case AGGRESSIVE_POSTURE_HIGH:
           iIndependenceScore *= 60;
           iIndependenceScore /= 100;
           break;
       case AGGRESSIVE_POSTURE_MEDIUM:
           iIndependenceScore *= 80;
           iIndependenceScore /= 100;
           break;
       case AGGRESSIVE_POSTURE_LOW:
           iIndependenceScore *= 90;
           iIndependenceScore /= 100;
           break;
       }
    
       return iIndependenceScore >= 100; // todo: global define
    }
    
    Master Is Okay With Giving Independence Or Not:
    * this last one was revised the least, but should still be relatively ok

    Code:
    /// Player ended vassalage with us, is that acceptable?
    bool CvDiplomacyAI::IsEndVassalageRequestAcceptable(PlayerTypes ePlayer)
    {
       if (!IsMaster(ePlayer))
           return false;
    
       // We hate him - war!
       if (GetMajorCivOpinion(ePlayer) <= MAJOR_CIV_OPINION_ENEMY)
           return false;
    
       if (GetMajorCivApproach(ePlayer) <= MAJOR_CIV_APPROACH_GUARDED)
           return false;
    
       // We're afraid - give in
       if (GetMajorCivApproach(ePlayer) == MAJOR_CIV_APPROACH_AFRAID)
           return true;
    
       // We're a backstabber - too bad!
       if (IsBackstabber())
           return false;
    
       // Player has original capitals and we're going for world conquest - not a chance!
       if (IsGoingForWorldConquest() || IsCloseToDominationVictory())
       {
           if (!GET_PLAYER(ePlayer).IsHasLostCapital() || GET_PLAYER(ePlayer).GetNumCapitalCities() > 0)
               return false;
       }
       // We're close to other victory conditions and they're not a threat - let them go
       else if (IsCloseToAnyVictoryCondition() && !GET_PLAYER(ePlayer).GetDiplomacyAI()->IsCloseToAnyVictoryCondition() && GetPlayerMilitaryStrengthComparedToUs(ePlayer) < STRENGTH_AVERAGE)
       {
           return true;
       }
    
       int iChanceToGiveIn = 0;
    
       // Do we like him?
       switch (GetMajorCivOpinion(ePlayer))
       {
       case MAJOR_CIV_OPINION_ALLY:
           iChanceToGiveIn += 25;
           break;
       case MAJOR_CIV_OPINION_FRIEND:
           iChanceToGiveIn += 15;
           break;
       case MAJOR_CIV_OPINION_FAVORABLE:
           iChanceToGiveIn += 8;
           break;
       case MAJOR_CIV_OPINION_COMPETITOR:
           iChanceToGiveIn -= 20;
           break;
       }
    
       // How will a war against ePlayer go?
       switch (GetWarProjection(ePlayer))
       {
       case WAR_PROJECTION_VERY_GOOD:
           iChanceToGiveIn -= 33;
           break;
       case WAR_PROJECTION_GOOD:
           iChanceToGiveIn -= 18;
           break;
       case WAR_PROJECTION_STALEMATE:
           iChanceToGiveIn += 0;
           break;
       case WAR_PROJECTION_DEFEAT:
           iChanceToGiveIn += 18;
           break;
       case WAR_PROJECTION_DESTRUCTION:
           iChanceToGiveIn += 33;
           break;
       }
    
       switch (GetPlayerMilitaryStrengthComparedToUs(ePlayer))
       {
       case STRENGTH_IMMENSE:
           iChanceToGiveIn += 50;
           break;
       case STRENGTH_POWERFUL:
           iChanceToGiveIn += 33;
           break;
       case STRENGTH_STRONG:
           iChanceToGiveIn += 18;
           break;
       case STRENGTH_AVERAGE:
           iChanceToGiveIn += 0;
           break;
       case STRENGTH_POOR:
           iChanceToGiveIn -= 20;
           break;
       case STRENGTH_WEAK:
           iChanceToGiveIn -= 40;
           break;
       case STRENGTH_PATHETIC:
           iChanceToGiveIn -= 60;
           break;
       }
    
       // How much money are we making off this vassal and his team?
       int iTaxIncome = GET_PLAYER(ePlayer).GetTreasury()->GetExpensePerTurnFromVassalTaxesTimes100();
       int iOurGPT = m_pPlayer->calculateGoldRateTimes100();
      
       if (iTaxIncome * 50 >= iOurGPT) // Tax is 50% or more of our income, heavily reliant on it
           iChanceToGiveIn += -25;
       else if (iTaxIncome * 20 >= iOurGPT) // Tax is 20% or more of our income
           iChanceToGiveIn += -10;
       else
           iChanceToGiveIn += 0;
    
       // Resurrection in either direction?
       if (WasResurrectedBy(ePlayer) || GET_PLAYER(ePlayer).GetDiplomacyAI()->WasResurrectedBy(GetID()))
           iChanceToGiveIn += 150;
    
       // Liberator?
       if (IsPlayerLiberatedCapital(ePlayer) || IsPlayerLiberatedHolyCity(ePlayer))
           iChanceToGiveIn += 50;
       else if (IsPlayerReturnedCapital(ePlayer) || IsPlayerReturnedHolyCity(ePlayer))
           iChanceToGiveIn += 25;
    
       if (GetNumCitiesLiberatedBy(ePlayer) > GetNumCitiesCapturedBy(ePlayer))
           iChanceToGiveIn += 10 * GetNumCitiesLiberatedBy(ePlayer);
    
       // We're close to or going for Diplomatic Victory - we want their league votes
       if (IsGoingForDiploVictory() || IsCloseToDiploVictory())
       {
           if (!GET_PLAYER(ePlayer).GetDiplomacyAI()->WasResurrectedBy(GetID()))
           {
               iChanceToGiveIn -= 25;
           }
       }
    
       if (iChanceToGiveIn <= 0)
           return false;
    
       switch (GetPlayer()->GetProximityToPlayer(ePlayer))
       {
       case PLAYER_PROXIMITY_NEIGHBORS:
           iChanceToGiveIn *= 80;
           break;
       case PLAYER_PROXIMITY_CLOSE:
           iChanceToGiveIn *= 100;
           break;
       case PLAYER_PROXIMITY_FAR:
           iChanceToGiveIn *= 110;
           break;
       case PLAYER_PROXIMITY_DISTANT:
           iChanceToGiveIn *= 120;
           break;
       }
    
       iChanceToGiveIn /= 1000;
    
       if (iChanceToGiveIn <= 3)
           iChanceToGiveIn = 3;
    
       if (GC.getGame().getSmallFakeRandNum(10, m_pPlayer->getGlobalAverage(YIELD_CULTURE)) < iChanceToGiveIn)
           return true;
    
       return false;
    }
    
     
    Last edited: Mar 3, 2021
  9. 4CV

    4CV Warlord

    Joined:
    Jan 9, 2017
    Messages:
    178
    Gender:
    Male
    Location:
    Germany
    Sorry, I don't understand what the code says...:cry: Does voluntary vassalage still exist, or not?
     
  10. Recursive

    Recursive Covets Lands That You Currently Own Moderator

    Joined:
    Dec 19, 2017
    Messages:
    2,691
    Gender:
    Male
    Yes, it still exists.
     
    Carloshooter likes this.
  11. Stickerbrush

    Stickerbrush Chieftain

    Joined:
    Jan 28, 2016
    Messages:
    46
    That's not true, you can buy out vassalage if you're considerably stronger than other civs and they don't hate you
     
  12. JamesNinelives

    JamesNinelives Emperor

    Joined:
    Mar 16, 2019
    Messages:
    1,611
    Gender:
    Male
    Location:
    Australia
  13. ChefBRD

    ChefBRD Chieftain

    Joined:
    Sep 8, 2020
    Messages:
    28
    Well this is wonderful news all around. What are the changes to barb spawns and theft amounts? I was growing quite fond of the new absolutely savage barbs of the last version.
     
  14. Recursive

    Recursive Covets Lands That You Currently Own Moderator

    Joined:
    Dec 19, 2017
    Messages:
    2,691
    Gender:
    Male
    Think that was a misunderstanding, barb spawns aren't changed, I just cleaned up some of the code.

    Theft amount is capped at the Barbarian unit's current HP, to prevent them stealing 40,000 Science in the lategame, etc.

    They do heal everywhere now, though, not just in encampments.
     
  15. ChefBRD

    ChefBRD Chieftain

    Joined:
    Sep 8, 2020
    Messages:
    28
    Sick. I usually play 10 or 11 civs on a standard size communitu continents, and the recent changes have made the barb threat real on a crowded map for the first time. Really shaking up the rote opening rounds.

    On that note, I do wonder if anyone else has shared my experience of finding lots more ruins in this and the last version? I used to find maybe 3-4 per game and my last several games, I've found 8+. Maybe because of either a more barb-cautious AI or else some reckless AI scouts getting offed? Anyone else experiencing this?
     
  16. Recursive

    Recursive Covets Lands That You Currently Own Moderator

    Joined:
    Dec 19, 2017
    Messages:
    2,691
    Gender:
    Male
    I removed the AI's extra XP bonuses on their initial Scout. Could possibly be a bug with recon code, though.
     
  17. Kim Dong Un

    Kim Dong Un The One & Unly Supporter

    Joined:
    Dec 17, 2017
    Messages:
    955
    Gender:
    Male
    Location:
    Pyongyang
    The thing I'm weary of regarding DV is not that vassals don't contribute to hegemony anymore, but the fact that recently CS are more vulnerable and susceptible to conquer over the course of a game; the tactical + diplo AI is becoming superbly bold, decisive and advantageous, so I've found that fewer CS remain by game's end.

    When combined, we may find that DV is actually quite hard to achieve now. I'm okay with trying vassals abstaining from the hegemony vote, but the vote requirement might have to be lowered, or CS might need some kind of defensive buff that kicks in around the mid/late game -- maybe give them a tiny supply boost (2) once Renaissance or Industrial era hits, so they can each have another unit or two for defending themselves a bit better.
     
    Erikose, FyreFly_, Chaste and 5 others like this.
  18. tothePAIN

    tothePAIN King

    Joined:
    Dec 31, 2018
    Messages:
    774
    Gender:
    Male
    I strongly agree with this. An allied CS these days is likely to be conquered if in a vulnerable position near a warmonger. So the effect of no vassal votes for diplomatic victory can be quite critical. Let's play and see.
     
    Carloshooter and 2506 like this.
  19. azum4roll

    azum4roll Emperor

    Joined:
    Jul 17, 2018
    Messages:
    1,736
    Gender:
    Male
    I think CS should be able to build units that require strategics, as well as their own UU if militaristic.
     
  20. youngsteve

    youngsteve Prince

    Joined:
    Sep 10, 2007
    Messages:
    378
    Gender:
    Male
    Location:
    England
    Although I agree with the decision regarding vassals, you are right about the vulnerability of CS, & agree these should also be made slightly more stronger or vote requairement for UN lowered. I also cannot see why Civs can't support any allied CS that is declared war on without any repurcussions to your democracy. In reality countries have done this constantly. Austria declaring war on little serbia caused WW1, which Britain joined when little Belgium was attacked by Germany.
     
    Carloshooter and vyyt like this.

Share This Page