private void SetRealmTier(Character owner, TitleTier maxTier)
        {
            List <Province> ownedProvs = (List <Province>)owner.CustomFlags["provs"];
            TitleTier       tier       = TitleTier.Count;

            if (ownedProvs.Count >= m_options.RuleSet.EmpireMinSize)
            {
                tier = TitleTier.Emperor;
            }
            else if (ownedProvs.Count >= m_options.RuleSet.KingdomMinSize)
            {
                tier = TitleTier.King;
            }
            else if (ownedProvs.Count >= m_options.RuleSet.DuchyMinSize)
            {
                tier = TitleTier.Duke;
            }

            if (tier > maxTier)
            {
                tier = maxTier;
            }

            owner.CustomFlags["Tier"] = tier;
        }
        private static Title GetLiegeTitle(Character liege)
        {
            Title     liegeTitle;
            TitleTier liegeTier = (TitleTier)liege.CustomFlags["Tier"];

            switch (liegeTier)
            {
            case TitleTier.Duke:
                liegeTitle = ((List <Title>)liege.CustomFlags["duchies"]).First();
                break;

            case TitleTier.King:
                liegeTitle = ((List <Title>)liege.CustomFlags["kingdoms"]).First();
                break;

            case TitleTier.Emperor:
                liegeTitle = ((List <Title>)liege.CustomFlags["empires"]).First();
                break;

            default:
                throw new ArgumentOutOfRangeException(string.Format("Liege {0} is a count.", liege.ID));
            }
            return(liegeTitle);
        }
        private List <Character> MakeVassals(Character liege)
        {
            Log(" -- Making vassals for " + liege.ID);

            List <Character> vassals = new List <Character>();

            TitleTier vassalTier = (TitleTier)liege.CustomFlags["Tier"];

            switch (vassalTier)
            {
            case TitleTier.Duke:
                vassalTier = TitleTier.Count;
                break;

            case TitleTier.King:
                vassalTier = TitleTier.Duke;
                break;

            case TitleTier.Emperor:
                vassalTier = TitleTier.King;
                break;

            default:
                return(vassals);
            }

            List <Province> usable = GetUnReservedProvinces(liege);

            if (!usable.Any())
            {
                return(vassals);
            }

            //Prepare for vassal growth.
            foreach (Province prov in usable)
            {
                prov.CustomFlags.Remove("charSurrounded");
                prov.CustomFlags.Remove("charOwned");
                prov.CustomFlags.Remove("charOwner");
            }

            int vassalSize = 1;

            switch (vassalTier)
            {
            case TitleTier.Count:
                vassalSize = usable.Count / 3;
                break;

            case TitleTier.Duke:
                vassalSize = usable.Count / m_options.RuleSet.DuchyMinSize;
                break;

            case TitleTier.King:
                vassalSize = usable.Count / m_options.RuleSet.KingdomMinSize;
                break;
            }

            int numVassals = vassalTier == TitleTier.Count
                                                                                   ? vassalSize
                                                                                   : m_options.Random.Next((int)(vassalSize * 0.75), (int)(vassalSize * 1.25));

            MakeFeudalRealms(vassals, liege, vassalTier, numVassals, usable);

            // Ensure *all* provinces are filled.
            if (usable.Any())
            {
                MakeFeudalRealms(vassals, liege, TitleTier.Count, usable.Count, usable);
            }

            return(vassals);
        }
        private void MakeFeudalRealms(List <Character> allChars, Character liege = null,
                                      TitleTier maxTier = TitleTier.King, int numRealms = -1, List <Province> usableProvs = null)
        {
            Log(" --Creating " + m_numRealms + " Feudal Realms");
            SendMessage("Setting History... Creating Realms");

            if (numRealms == -1)
            {
                numRealms = m_numRealms;
            }
            if (usableProvs == null)
            {
                usableProvs = m_unownedProvs;
            }

            // Create characters and randomly assign them home provinces.
            List <Character> owners = CreateNewFeudalCharacters(numRealms, usableProvs, liege);

            Log(" --Growing Territory");
            SendMessage("Setting History... Growing Territory");

            #region Growth Phase
            bool finishedGrowing;
            do
            {
                finishedGrowing = true;
                foreach (Character owner in owners)
                {
                    GrowRealm(owner, ref finishedGrowing, usableProvs);
                }
            } while(!finishedGrowing);
            #endregion

            List <Character> vassals = new List <Character>();

            //Set potential tier.
            if (maxTier > TitleTier.Count)
            {
                foreach (Character ch in owners)
                {
                    SetRealmTier(ch, maxTier);

                    TitleTier tier = (TitleTier)ch.CustomFlags["Tier"];
                    if (tier >= TitleTier.Duke)
                    {
                        MakeDukes(ch, liege);
                    }
                    if (tier >= TitleTier.King)
                    {
                        MakeKings(ch, liege);
                    }

                    if (tier > TitleTier.Count)
                    {
                        vassals.AddRange(MakeVassals(ch));
                    }
                }
            }

            allChars.AddRange(vassals);
            allChars.AddRange(owners);
        }
		private void SetRealmTier( Character owner, TitleTier maxTier )
		{
			List<Province> ownedProvs = (List<Province>)owner.CustomFlags["provs"];
			TitleTier tier = TitleTier.Count;

			if( ownedProvs.Count >= m_options.RuleSet.EmpireMinSize )
				tier = TitleTier.Emperor;
			else if( ownedProvs.Count >= m_options.RuleSet.KingdomMinSize )
				tier = TitleTier.King;
			else if( ownedProvs.Count >= m_options.RuleSet.DuchyMinSize )
				tier = TitleTier.Duke;

			if( tier > maxTier )
				tier = maxTier;

			owner.CustomFlags["Tier"] = tier;
		}
		private void MakeFeudalRealms( List<Character> allChars, Character liege = null,
									   TitleTier maxTier = TitleTier.King, int numRealms = -1, List<Province> usableProvs = null )
		{
			Log( " --Creating " + m_numRealms + " Feudal Realms" );
			SendMessage( "Setting History... Creating Realms" );

			if( numRealms == -1 )
				numRealms = m_numRealms;
			if( usableProvs == null )
				usableProvs = m_unownedProvs;

			// Create characters and randomly assign them home provinces.
			List<Character> owners = CreateNewFeudalCharacters( numRealms, usableProvs, liege );

			Log( " --Growing Territory" );
			SendMessage( "Setting History... Growing Territory" );

			#region Growth Phase
			bool finishedGrowing;
			do
			{
				finishedGrowing = true;
				foreach( Character owner in owners )
					GrowRealm( owner, ref finishedGrowing, usableProvs );
			} while( !finishedGrowing );
			#endregion

			List<Character> vassals = new List<Character>();

			//Set potential tier.
			if( maxTier > TitleTier.Count )
			{
				foreach( Character ch in owners )
				{
					SetRealmTier( ch, maxTier );

					TitleTier tier = (TitleTier)ch.CustomFlags["Tier"];
					if( tier >= TitleTier.Duke )
						MakeDukes( ch, liege );
					if( tier >= TitleTier.King )
						MakeKings( ch, liege );

					if( tier > TitleTier.Count )
						vassals.AddRange( MakeVassals( ch ) );
				}
			}

			allChars.AddRange( vassals );
			allChars.AddRange( owners );
		}