예제 #1
0
        private void InitializeKingdom(Hero leader, Settlement target)
        {
            Kingdom newKingdom = MBObjectManager.Instance.CreateObject <Kingdom>();

            try
            {
                TextObject name = new TextObject("{=!}{CLAN_NAME}");

                string origin = target.Name.ToString().Replace("Castle", "").Trim();

                name.SetTextVariable("CLAN_NAME", leader.Name + " of " + origin);

                newKingdom.InitializeKingdom(name,
                                             name,
                                             leader.Culture,
                                             Banner.CreateRandomClanBanner(leader.StringId.GetDeterministicHashCode()),
                                             0,
                                             0,
                                             new Vec2(target.GatePosition.X, target.GatePosition.Y));

                ChangeKingdomAction.ApplyByJoinToKingdom(leader.Clan, newKingdom, false);
                newKingdom.RulingClan = leader.Clan;

                newKingdom.AddPolicy(DefaultPolicies.NobleRetinues);

                MBObjectManager.Instance.RegisterObject(newKingdom);
            }
            catch (Exception e)
            {
                Log.Info("Exception in InitializeKingdom");
                Log.Error(e);
            }
        }
예제 #2
0
        void processClans(XmlDocument document)
        {
            var nodes = document.SelectNodes("/Factions/Faction");

            foreach (XmlNode node in nodes)
            {
                string attr(string attrName) => node.Attributes[attrName]?.Value;

                var id = attr("id");
                if (id == "player_faction")
                {
                    continue;
                }

                var banner = attr("banner_key") ?? Banner.CreateRandomClanBanner(id.GetDeterministicHashCode()).Serialize();
                var color  = attr("color");
                if (color?.Trim()?.Length > 0)
                {
                    color = Color.FromUint(Convert.ToUInt32(color, 16)).ToString();
                }
                var color2 = attr("color2");
                if (color2?.Trim()?.Length > 0)
                {
                    color2 = Color.FromUint(Convert.ToUInt32(color2, 16)).ToString();
                }

                if (color != null || color2 != null)
                {
                    Settings.UniformColorOverride.Add(new UniformColor(id, color, color2));
                }
                Settings.ClanBannerOverride.Add(new ClanBanner(id, banner, true));
            }
        }
예제 #3
0
        private void InitializeClan(Hero leader, string origin)
        {
            Clan newClan = MBObjectManager.Instance.CreateObject <Clan>();

            try
            {
                newClan.Culture = leader.Culture;

                TextObject name = new TextObject("{=!}{CLAN_NAME}");

                origin = origin.Replace(" Castle", "");

                name.SetTextVariable("CLAN_NAME", leader.Name + " of " + origin);

                newClan.AddRenown(900, false);

                newClan.SetLeader(leader);

                leader.Clan = newClan;

                newClan.InitializeClan(name,
                                       name,
                                       leader.Culture,
                                       Banner.CreateRandomClanBanner(leader.StringId.GetDeterministicHashCode()));
            }
            catch (Exception e)
            {
                Log.Info("Exception in InitializeClan");
                Log.Error(e);
            }
        }
예제 #4
0
        void processKingdoms(XmlDocument document)
        {
            var nodes = document.SelectNodes("/Kingdoms/Kingdom");

            foreach (XmlNode node in nodes)
            {
                string attr(string attrName) => node.Attributes[attrName]?.Value;

                var id     = attr("id");
                var banner = attr("banner_key") ?? Banner.CreateRandomClanBanner(id.GetDeterministicHashCode()).Serialize();
                var color  = attr("color");
                if (color?.Trim()?.Length > 0)
                {
                    color = Color.FromUint(Convert.ToUInt32(color, 16)).ToString();
                }
                var color2 = attr("color2");
                if (color2?.Trim()?.Length > 0)
                {
                    color2 = Color.FromUint(Convert.ToUInt32(color2, 16)).ToString();
                }
                var primaryBannerColor   = BannerManager.GetColorId(Convert.ToUInt32(attr("primary_banner_color") ?? "-1", 16));
                var secondaryBannerColor = BannerManager.GetColorId(Convert.ToUInt32(attr("secondary_banner_color") ?? "-1", 16));

                Settings.UniformColorOverride.Add(new UniformColor(id, color, color2));
                Settings.FactionColorOverride.Add(new FactionColor(id, primaryBannerColor, secondaryBannerColor));

                // get ruling clan banner
                var rulingClan = MBObjectManager.Instance.ReadObjectReferenceFromXml <Hero>("owner", node)?.Clan;
                if (rulingClan != null)
                {
                    Settings.ClanBannerOverride.Add(new ClanBanner(rulingClan.StringId, banner, true));
                }
            }
        }
예제 #5
0
        public CustomClan(String name, String informalName, CultureObject culture)
        {
            this.name         = name;
            this.informalName = informalName;
            this.culture      = culture;
            this.banner       = Banner.CreateRandomClanBanner();

            this.clan = new Clan();
            clan.InitializeClan(new TextObject(name, null), new TextObject(informalName, null), culture, banner);
        }
예제 #6
0
        public CustomKingdom(String name, String informalName, CultureObject culture)
        {
            this.name          = name;
            this.informalName  = informalName;
            this.culture       = culture;
            this.banner        = Banner.CreateRandomClanBanner();
            this.kingdomColor1 = 7468453;
            this.kingdomColor2 = 7461621;

            kingdom = new Kingdom();
            kingdom.InitializeKingdom(new TextObject(name), new TextObject(informalName), culture, banner, kingdomColor1, kingdomColor2);
        }
예제 #7
0
        public static Kingdom CreateKingdom(Hero leader, TextObject name, TextObject informalName, Banner banner = null, bool showNotification = false)
        {
            var mainColor = ColorHelper.GetRandomColor();
            var altColor  = ColorHelper.GetRandomColor();

            var kingdom = MBObjectManager.Instance.CreateObject <Kingdom>();

            kingdom.InitializeKingdom(name, informalName, leader.Culture, banner ?? Banner.CreateRandomClanBanner(leader.StringId.GetDeterministicHashCode()), mainColor.ToUnsignedInteger(), mainColor.GetOpposingColor().ToUnsignedInteger(), leader.Clan.InitialPosition);

            ChangeKingdomAction.ApplyByCreateKingdom(leader.Clan, kingdom, showNotification);

            AccessTools.Property(typeof(Kingdom), "AlternativeColor").SetValue(kingdom, altColor.ToUnsignedInteger());
            AccessTools.Property(typeof(Kingdom), "AlternativeColor2").SetValue(kingdom, mainColor.GetOpposingColor().ToUnsignedInteger());

            AddKingdom(kingdom);
            return(kingdom);
        }
예제 #8
0
        public Kingdom CreateKingdom(Hero leader, TextObject name, TextObject informalName, Banner banner = null, bool showNotification = false)
        {
            var kingdom = MBObjectManager.Instance.CreateObject <Kingdom>();

            kingdom.InitializeKingdom(name, informalName, leader.Culture, banner ?? Banner.CreateRandomClanBanner(leader.StringId.GetDeterministicHashCode()), leader.Clan.Color, leader.Clan.Color2, leader.Clan.InitialPosition);

            ChangeKingdomAction.ApplyByJoinToKingdom(leader.Clan, kingdom, showNotification);
            kingdom.RulingClan = leader.Clan;

            AccessTools.Property(typeof(Kingdom), "AlternativeColor").SetValue(kingdom, leader.Clan.Color);
            AccessTools.Property(typeof(Kingdom), "AlternativeColor2").SetValue(kingdom, leader.Clan.Color2);
            AccessTools.Property(typeof(Kingdom), "LabelColor").SetValue(kingdom, ColorHelper.Black.ToUnsignedInteger());

            kingdom.AddPolicy(DefaultPolicies.RoyalGuard);
            kingdom.AddPolicy(DefaultPolicies.NobleRetinues);

            AddKingdom(kingdom);
            return(kingdom);
        }
예제 #9
0
        private Clan CreateRebellionClan(SettlementInfo info)
        {
            Clan clan = MBObjectManager.Instance.CreateObject <Clan>(info.Settlement.Name.ToString() + "_rebels_" + MBRandom.RandomInt(100000).ToString());
            Hero hero = HeroCreator.CreateSpecialHero(CreateLordCharacter(info.OriginalCulture), info.Settlement, clan, clan, 30);

            TextObject name  = new TextObject(hero.Name.ToString());
            int        value = MBMath.ClampInt(1, DefaultTraits.Commander.MinValue, DefaultTraits.Commander.MaxValue);

            hero.SetTraitLevel(DefaultTraits.Commander, value);
            hero.ChangeState(Hero.CharacterStates.Active);
            hero.Initialize();
            clan.InitializeClan(name, name, info.OriginalCulture, Banner.CreateRandomClanBanner(MBRandom.RandomInt(100000)));
            hero.Clan = clan;
            clan.SetLeader(hero);
            clan.IsUnderMercenaryService = false;
            var kingdom = FormRebelKingdom(clan, info.Settlement, info.CurrentFaction);

            kingdom.ReactivateKingdom();
            DeclareWarAction.Apply(kingdom, info.CurrentFaction);
            clan.ClanJoinFaction(kingdom);
            kingdom.RulingClan = clan;
            return(clan);
        }
예제 #10
0
        public void CreateVassal()
        {
            //Settlement settlement = GetCandidateSettlements().FirstOrDefault<Settlement>();
            if (targetSettlement == null)
            {
                return;
            }
            Hero hero = Hero.OneToOneConversationHero;

            if (hero == null)
            {
                return;
            }
            Kingdom kingdom = Hero.MainHero.MapFaction as Kingdom;

            if (kingdom == null)
            {
                return;
            }

            CultureObject culture  = targetSettlement.Culture;
            TextObject    clanName = NameGenerator.Current.GenerateClanName(culture, targetSettlement);
            string        str      = Guid.NewGuid().ToString().Replace("-", "");

            if (null == hero.LastSeenPlace)
            {
                hero.CacheLastSeenInformation(hero.HomeSettlement, true);
                hero.SyncLastSeenInformation();
            }
            //RemoveCompanionAction.ApplyByFire(Hero.MainHero.Clan, hero);
            //for  1.4.3 200815
            HeroOperation.DealApplyByFire(Hero.MainHero.Clan, hero);

            HeroOperation.SetOccupationToLord(hero);
            hero.ChangeState(Hero.CharacterStates.Active);
            Clan   clan   = TaleWorlds.ObjectSystem.MBObjectManager.Instance.CreateObject <Clan>("sue_clan_" + str);
            Banner banner = Banner.CreateRandomClanBanner(-1);

            clan.InitializeClan(clanName, clanName, culture, banner);
            clan.SetLeader(hero);

            //clan.Tier = 5; 修改家族等级
            FieldInfo fieldInfoId = clan.GetType().GetField("_tier", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            if (null != fieldInfoId)
            {
                fieldInfoId.SetValue(clan, selectClanTier);
            }
            //增加一些影响力
            clan.AddRenown(50 * selectClanTier, true);


            hero.Clan        = clan;
            hero.CompanionOf = null;
            hero.IsNoble     = true;
            hero.SetTraitLevel(DefaultTraits.Commander, 1);

            MobileParty mobileParty = clan.CreateNewMobileParty(hero);

            mobileParty.ItemRoster.AddToCounts(DefaultItems.Grain, 10);
            mobileParty.ItemRoster.AddToCounts(DefaultItems.Meat, 5);

            ChangeOwnerOfSettlementAction.ApplyByKingDecision(hero, targetSettlement);
            clan.UpdateHomeSettlement(targetSettlement);


            int takeMoney = TakeMoneyByTier(selectClanTier);

            if (targetSpouse != null)
            {
                GiveGoldAction.ApplyBetweenCharacters(Hero.MainHero, hero, takeMoney / 2, false);
            }
            else
            {
                GiveGoldAction.ApplyBetweenCharacters(Hero.MainHero, hero, takeMoney, false);
            }

            //关系处理
            //新晋家族关系增加
            int shipIncreate = ShipIncreateByTier(selectClanTier);

            ChangeRelationAction.ApplyPlayerRelation(hero, shipIncreate, true, true);
            if (targetSpouse != null)
            {
                ChangeRelationAction.ApplyPlayerRelation(targetSpouse, shipIncreate, true, true);
            }

            //以前家族关系减低,
            int     shipReduce = ShipReduceByTier(selectClanTier);
            Kingdom kindom     = Hero.MainHero.MapFaction as Kingdom;

            if (null != kindom && shipReduce > 0)
            {
                kindom.Clans.ToList().ForEach((obj) =>
                {
                    if (obj != Clan.PlayerClan)
                    {
                        ChangeRelationAction.ApplyPlayerRelation(obj.Leader, shipReduce * -1, true, true);
                    }
                }
                                              );
            }

            if (targetSpouse != null)
            {
                targetSpouse.Spouse = hero;
                InformationManager.AddQuickInformation(new TextObject($"{hero.Name} marry with {targetSpouse.Name}"), 0, null, "event:/ui/notification/quest_finished");

                HeroOperation.DealApplyByFire(Hero.MainHero.Clan, targetSpouse);
                //RemoveCompanionAction.ApplyByFire(Hero.MainHero.Clan, targetSpouse);

                targetSpouse.ChangeState(Hero.CharacterStates.Active);
                targetSpouse.IsNoble = true;
                HeroOperation.SetOccupationToLord(targetSpouse);
                targetSpouse.CompanionOf = null;
                targetSpouse.Clan        = clan;
                targetSpouse.SetTraitLevel(DefaultTraits.Commander, 1);
                //AddCompanionAction.Apply(clan, targetSpouse);

                MobileParty targetSpouseMobileParty = clan.CreateNewMobileParty(targetSpouse);

                targetSpouseMobileParty.ItemRoster.AddToCounts(DefaultItems.Grain, 10);
                targetSpouseMobileParty.ItemRoster.AddToCounts(DefaultItems.Meat, 5);
                GiveGoldAction.ApplyBetweenCharacters(Hero.MainHero, targetSpouse, takeMoney / 2, false);
            }

            // 他们孩子处理
            if (isTogetherWithThireChildren)
            {
                DealTheirChildren(hero, clan);
            }


            //加入王国
            ChangeKingdomAction.ApplyByJoinToKingdom(clan, kingdom, true);
        }
예제 #11
0
        public Clan CreateClan(Hero leader, TextObject name, TextObject informalName, Banner banner = null)
        {
            var clanName = NameGenerator.Current.GenerateClanName(leader.Culture, leader.HomeSettlement);

            var clan = MBObjectManager.Instance.CreateObject <Clan>();

            clan.InitializeClan(name ?? clanName, informalName ?? clanName, leader.Culture, banner ?? Banner.CreateRandomClanBanner(leader.StringId.GetDeterministicHashCode()));
            clan.SetLeader(leader);
            clan.AddRenown(1000, false);

            leader.Clan = clan;

            this.Get(clan).IsCustomClan = true;
            return(clan);
        }
예제 #12
0
        private static bool Prefix(Settlement settlement)
        {
            bool        hadPlayerSupport          = false;
            List <Hero> NotablesSupportingReveolt = new List <Hero>();

            if (settlement.IsVillage)
            {
                return(true);
            }
            Town town = settlement.Town;

            foreach (var pair in NotableBehavior.RebelliousNotables)
            {
                if (town.Settlement.Notables.Contains(pair.Key))
                {
                    if (town.MapFaction == pair.Value)
                    {
                        hadPlayerSupport = true;
                        NotablesSupportingReveolt.Add(pair.Key);
                    }
                }
                foreach (Village village in town.Villages)
                {
                    if (village.Settlement.Notables.Contains(pair.Key))
                    {
                        hadPlayerSupport = true;
                        NotablesSupportingReveolt.Add(pair.Key);
                    }
                }
            }

            if (hadPlayerSupport)
            {
                InformationManager.ShowInquiry(new InquiryData("Rebellion", "Your supporters have started an uprising in " + settlement.Town.Name.ToString() + ".  Do you want to take direct control of the settlement or let them elect their own leader?  Taking control of the settlement will lead to a war with the previous owners", true, true, "take it", "let them decide", (Action)(() => {
                    DeclareWarAction.ApplyDeclareWarOverSettlement(settlement.MapFaction, Hero.MainHero.MapFaction);
                    ChangeOwnerOfSettlementAction.ApplyByRebellion(Hero.MainHero, settlement);
                }), (Action)(() => {
                    Random rng = new Random();
                    Hero newLeader = NotablesSupportingReveolt[rng.Next(0, NotablesSupportingReveolt.Count - 1)];
                    FieldInfo field2 = newLeader.GetType().GetField("Occupation", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                    if ((FieldInfo)null != field2)
                    {
                        field2.SetValue((object)newLeader, Occupation.Lord);
                    }

                    Clan clan = MBObjectManager.Instance.CreateObject <Clan>();
                    Banner ClanBanner = Banner.CreateRandomClanBanner();
                    TextObject clanName = newLeader.Culture.ClanNameList[rng.Next(0, newLeader.Culture.ClanNameList.Count)];
                    clan.InitializeClan(clanName, clanName, newLeader.Culture, ClanBanner);
                    clan.SetLeader(newLeader);
                    FieldInfo field = clan.GetType().GetField("_tier", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                    if ((FieldInfo)null != field)
                    {
                        field.SetValue((object)clan, rng.Next(2, 4));
                    }

                    newLeader.Clan = clan;
                    newLeader.IsNoble = true;
                    MobileParty newMobileParty1 = clan.CreateNewMobileParty(newLeader);
                    newMobileParty1.ItemRoster.AddToCounts(DefaultItems.Grain, 10);
                    newMobileParty1.ItemRoster.AddToCounts(DefaultItems.Meat, 5);

                    List <Equipment> Lordgear = new List <Equipment>();
                    foreach (Hero hero in Campaign.Current.Heroes)
                    {
                        if (hero.Culture == newLeader.Culture && hero.IsNoble && hero.IsFemale == newLeader.IsFemale)
                        {
                            Lordgear.Add(hero.BattleEquipment);
                        }
                    }
                    EquipmentHelper.AssignHeroEquipmentFromEquipment(newLeader, Lordgear[rng.Next(0, Lordgear.Count - 1)]);

                    clan.UpdateHomeSettlement(settlement);

                    ChangeRelationAction.ApplyRelationChangeBetweenHeroes(newLeader, settlement.OwnerClan.Leader, -200);
                    if (settlement.OwnerClan.Leader != settlement.MapFaction.Leader)
                    {
                        ChangeRelationAction.ApplyRelationChangeBetweenHeroes(newLeader, settlement.MapFaction.Leader, -200);
                    }
                    DeclareWarAction.Apply(settlement.MapFaction, newLeader.MapFaction);
                    ChangeOwnerOfSettlementAction.ApplyByRebellion(newLeader, settlement);
                })));
                return(false);
            }
            else
            {
                return(true);
            }
        }
예제 #13
0
        private void CastleAbandonSettlementMenuOption(CampaignGameStarter campaignGameStarter)
        {
            campaignGameStarter.AddGameMenuOption("ruler_castle_menu", "ruler_castle_abandon", "Abandon Rulership of Castle", (GameMenuOption.OnConditionDelegate)(args =>
            {
                args.optionLeaveType = GameMenuOption.LeaveType.Manage;
                if (Settlement.CurrentSettlement.OwnerClan.Kingdom != null && Settlement.CurrentSettlement.OwnerClan.Kingdom.Leader != Hero.MainHero)
                {
                    args.Tooltip   = new TextObject("You must be the faction leader to abandon a settlement");
                    args.IsEnabled = false;
                }

                args.Tooltip = new TextObject("A minor noble will take control of the settlement");

                return(true);
            }), (GameMenuOption.OnConsequenceDelegate)(args => {
                InformationManager.ShowInquiry(new InquiryData("Abandon Castle", "Are you sure you want to abandon this castle?", true, true, "Yes", "No", (Action)(() => {
                    List <CharacterObject> source = new List <CharacterObject>();
                    CultureObject culture = Settlement.CurrentSettlement.Culture;
                    foreach (CharacterObject characterObject in CharacterObject.Templates.Where <CharacterObject>((Func <CharacterObject, bool>)(x => x.Occupation == Occupation.Lord)).ToList <CharacterObject>())
                    {
                        if (characterObject.Culture == culture)
                        {
                            source.Add(characterObject);
                        }
                    }
                    CharacterObject template = source[rng.Next(0, source.Count - 1)];
                    Hero NewHero = HeroCreator.CreateSpecialHero(template, Settlement.CurrentSettlement, null, Hero.MainHero.Clan, rng.Next(25, 30));
                    NewHero.ChangeState(Hero.CharacterStates.Active);
                    HeroCreationCampaignBehavior herocreationbehavior = new HeroCreationCampaignBehavior();
                    herocreationbehavior.DeriveSkillsFromTraits(NewHero, template);

                    List <CharacterObject> source2 = new List <CharacterObject>();
                    foreach (CharacterObject characterObject in CharacterObject.Templates.Where <CharacterObject>((Func <CharacterObject, bool>)(x => x.Occupation == Occupation.Lord)).ToList <CharacterObject>())
                    {
                        if (characterObject.Culture == culture)
                        {
                            source2.Add(characterObject);
                        }
                    }
                    CharacterObject template2 = source2[rng.Next(0, source2.Count - 1)];
                    template2.IsFemale = true;
                    Hero NewHero2 = HeroCreator.CreateSpecialHero(template2, Settlement.CurrentSettlement, null, Hero.MainHero.Clan, rng.Next(25, 30));
                    NewHero2.ChangeState(Hero.CharacterStates.Active);
                    herocreationbehavior.DeriveSkillsFromTraits(NewHero2, template2);
                    template2.IsFemale = false;

                    Clan clan = MBObjectManager.Instance.CreateObject <Clan>();
                    Banner ClanBanner = Banner.CreateRandomClanBanner();
                    TextObject clanName = culture.ClanNameList[rng.Next(0, culture.ClanNameList.Count)];
                    clan.InitializeClan(clanName, clanName, culture, ClanBanner);
                    clan.SetLeader(NewHero);
                    FieldInfo field = clan.GetType().GetField("_tier", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                    if ((FieldInfo)null != field)
                    {
                        field.SetValue((object)clan, rng.Next(2, 4));
                    }

                    NewHero.Clan = clan;
                    NewHero.IsNoble = true;
                    MobileParty newMobileParty1 = clan.CreateNewMobileParty(NewHero);
                    newMobileParty1.ItemRoster.AddToCounts(DefaultItems.Grain, 10);
                    newMobileParty1.ItemRoster.AddToCounts(DefaultItems.Meat, 5);

                    NewHero2.Clan = clan;
                    NewHero2.IsNoble = true;
                    MobileParty newMobileParty2 = clan.CreateNewMobileParty(NewHero2);
                    newMobileParty2.ItemRoster.AddToCounts(DefaultItems.Grain, 10);
                    newMobileParty2.ItemRoster.AddToCounts(DefaultItems.Meat, 5);

                    ChangeOwnerOfSettlementAction.ApplyByKingDecision(NewHero, Settlement.CurrentSettlement);
                    clan.UpdateHomeSettlement(Settlement.CurrentSettlement);

                    MarriageAction.Apply(NewHero, NewHero2);
                    ChangeRelationAction.ApplyPlayerRelation(NewHero, 40);
                }), (Action)(() => {
                    GameMenu.SwitchToMenu("castle");
                })), true);
            }), index: 1);;;
        }