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); } }
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}")); }