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

Status
Not open for further replies.
The only change that I'm less certain about is the elimination of vassal votes for diplomatic victories. That's a pretty big change. Autocracy was suited for diplomatic victory because of vassals. But diplomatic victory was also easily a substitute for domination victory with full vassal votes. We can play it and see? Maybe 50%?

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.
 
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.

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.
 
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.
 
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.

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.
 
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.

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.
 
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.

Vassal independence & capitulation logic was revised by me for this latest version.
 
Vassal independence & capitulation logic was revised by me for this latest version.

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.
 
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.

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:
"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."
Sorry, I don't understand what the code says...:cry: Does voluntary vassalage still exist, or not?
 
Sorry, I don't understand what the code says...:cry: Does voluntary vassalage still exist, or not?

Yes, it still exists.
 
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.

That's not true, you can buy out vassalage if you're considerably stronger than other civs and they don't hate you
 
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.
 
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.

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.
 
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.

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?
 
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?

I removed the AI's extra XP bonuses on their initial Scout. Could possibly be a bug with recon code, though.
 
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.
 
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.

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.
 
I think CS should be able to build units that require strategics, as well as their own UU if militaristic.
 
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.

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.
 
Status
Not open for further replies.
Top Bottom