Пример #1
0
        private void TrainMilitia()
        {
            try
            {
                if (MobileParty.MemberRoster.Count == 0)
                {
                    Mod.Log("Trying to configure militia with no troops, trashing", LogLevel.Info);
                    Trash(MobileParty);
                    return;
                }

                if (!Globals.Settings.CanTrain ||
                    DifficultyXpMap[Globals.Settings.XpGift] == 0)
                {
                    return;
                }

                int iterations = default;
                switch (Globals.Settings.XpGift)
                {
                case "OFF":
                    break;

                case "NORMAL":
                    iterations = 1;
                    break;

                case "HARD":
                    iterations = 2;
                    break;

                case "HARDEST":
                    iterations = 4;
                    break;
                }

                int number, numberToUpgrade;
                if (Globals.Settings.LooterUpgradeFactor > float.Epsilon)
                {
                    // upgrade any looters first, then go back over and iterate further upgrades
                    var looters = MobileParty.MemberRoster.GetTroopRoster().Where(x =>
                                                                                  x.Character.Name.Contains("Looter")).ToList();
                    var culture = FindMostPrevalentFaction(MobileParty.Position2D);
                    if (looters.Any())
                    {
                        foreach (var looter in looters)
                        {
                            number          = MobileParty.MemberRoster.GetElementCopyAtIndex(MobileParty.MemberRoster.FindIndexOfTroop(looter.Character)).Number;
                            numberToUpgrade = Convert.ToInt32(number * Globals.Settings.LooterUpgradeFactor);
                            if (numberToUpgrade == 0)
                            {
                                continue;
                            }

                            var roster = MobileParty.MemberRoster;
                            roster.RemoveTroop(looter.Character, numberToUpgrade);
                            ConvertLootersToKingdomCultureRecruits(ref roster, culture, numberToUpgrade);
                        }
                    }
                }

                var troopUpgradeModel = Campaign.Current.Models.PartyTroopUpgradeModel;
                for (var i = 0; i < iterations; i++)
                {
                    var validTroops = MobileParty.MemberRoster.GetTroopRoster().Where(x =>
                                                                                      x.Character.Tier < Globals.Settings.MaxTrainingTier &&
                                                                                      !x.Character.IsHero &&
                                                                                      troopUpgradeModel.IsTroopUpgradeable(MobileParty.Party, x.Character));
                    var troopToTrain = validTroops.ToList().GetRandomElement();
                    number = troopToTrain.Number;
                    if (number < 1)
                    {
                        continue;
                    }

                    var minNumberToUpgrade = Convert.ToInt32(Globals.Settings.UpgradeUnitsFactor * number * Rng.NextDouble());
                    minNumberToUpgrade = Math.Max(1, minNumberToUpgrade);
                    numberToUpgrade    = Convert.ToInt32(Rng.Next(minNumberToUpgrade, Convert.ToInt32((number + 1) / 2f)));
                    Mod.Log($"{MobileParty.LeaderHero.Name} is upgrading up to {numberToUpgrade} of {number} \"{troopToTrain.Character.Name}\".");
                    var xpGain = numberToUpgrade * DifficultyXpMap[Globals.Settings.XpGift];
                    MobileParty.MemberRoster.AddXpToTroop(xpGain, troopToTrain.Character);
                    PartyUpgraderCopy.UpgradeReadyTroops(MobileParty.Party);
                    // this is gross, not sure why it doesn't update itself, seems like the right way to call
                    Traverse.Create(MobileParty.MemberRoster).Field <List <TroopRosterElement> >("_troopRosterElements").Value
                        = MobileParty.MemberRoster.GetTroopRoster();
                    MobileParty.MemberRoster.UpdateVersion();
                    if (TestingMode)
                    {
                        var party = Hero.MainHero.PartyBelongedTo ?? Hero.MainHero.PartyBelongedToAsPrisoner.MobileParty;
                        MobileParty.Position2D = party.Position2D;
                    }
                }
            }
            catch (Exception ex)
            {
                Mod.Log("Bandit Militias is failing to configure parties!  Exception: " + ex);
                Debug.PrintError("Bandit Militias is failing to configure parties!  Exception: " + ex);
                Trash(MobileParty);
            }
        }
Пример #2
0
 public static void LogMessage(Level level, string str)
 {
     //File.AppendAllLines(LogPath, new []{ $"{DateTime.Now:yyyyMMddHHmmss}|{str}"});
     RaiseLogEvent(level, str);
     MainThreadSync.Run(() => Debug.Print($"[BLT][{level}][{DateTime.Now:mmss}] {str}"));
 }