public void DailyTick(MobileParty mobileParty) { if (!Campaign.Current.DesertionEnabled || !mobileParty.IsActive || (mobileParty.IsDisbanding || mobileParty.Party.MapEvent != null) || !mobileParty.IsLordParty && (!mobileParty.IsGarrison || mobileParty.CurrentSettlement == null) && !mobileParty.IsCaravan) { return; } // This party can have desertions, so figure out if it needs them and apply TroopRoster desertedTroopList = (TroopRoster)null; if (mobileParty.IsLordParty || mobileParty.IsCaravan) { this.CheckDesertionDueToMorale(mobileParty, ref desertedTroopList); } this.CheckDesertionDueToPartySizeExceedsPaymentRatio(mobileParty, ref desertedTroopList); if (desertedTroopList != (TroopRoster)null && desertedTroopList.Count > 0 && mobileParty.IsMainParty) { GUI.Notifications.Desertion.Show(Hero.MainHero, desertedTroopList.TotalManCount); // Apply penalties to clan (notification handled on action level) Actions.ChangeRenown.Apply(mobileParty.LeaderHero, -Convert.ToSingle(desertedTroopList.TotalManCount) * 0.8f, Convert.ToSingle(Campaign.Current.Models.ClanTierModel.GetRequiredRenownForTier(mobileParty.LeaderHero.Clan.Tier))); // TODO test effects if applying to all parties Actions.ChangeInfluence.Apply(mobileParty.LeaderHero, -Convert.ToSingle(desertedTroopList.TotalManCount * 2f)); } // Remove party if all members have deserted if (mobileParty.Party.NumberOfAllMembers > 0) { return; } mobileParty.RemoveParty(); }
private static bool OpenAdoptedHeroScreen() { if (!PartyScreenAllowed) { return(false); } if (ScreenManager.TopScreen is not MapScreen) { Game.Current.GameStateManager.PopState(); } var _partyScreenLogic = new PartyScreenLogic(); AccessTools.Field(typeof(PartyScreenManager), "_partyScreenLogic").SetValue(PartyScreenManager.Instance, _partyScreenLogic); AccessTools.Field(typeof(PartyScreenManager), "_currentMode").SetValue(PartyScreenManager.Instance, PartyScreenMode.Normal); var heroRoster = new TroopRoster(null); foreach (var hero in BLTAdoptAHeroCampaignBehavior.GetAllAdoptedHeroes().OrderBy(h => h.Name.Raw().ToLower())) { heroRoster.AddToCounts(hero.CharacterObject, 1); } _partyScreenLogic.Initialize(heroRoster, new(null), MobileParty.MainParty, false, new("Viewers"), 0, (_, _, _, _, _, _, _, _, _) => true, new("BLT Viewer Heroes"), false); _partyScreenLogic.InitializeTrade(PartyScreenLogic.TransferState.NotTransferable, PartyScreenLogic.TransferState.NotTransferable, PartyScreenLogic.TransferState.NotTransferable); _partyScreenLogic.SetTroopTransferableDelegate((_, _, _, _) => false); var partyState = Game.Current.GameStateManager.CreateState <PartyState>(); partyState.InitializeLogic(_partyScreenLogic); Game.Current.GameStateManager.PushState(partyState); return(true); }
private static void Postfix(Clan clan, ref ExplainedNumber goldChange, bool applyWithdrawals = false) { foreach (var pair in SlaveEstateBehavior.SlaveEstates) { int wage = 0; SlaveEstate slaveEstate = pair.Value; Village village = pair.Key; if (slaveEstate.Guards == null) { slaveEstate.Guards = TroopRoster.CreateDummyTroopRoster(); } else { foreach (TroopRosterElement troop in slaveEstate.Guards) { wage += troop.Number * troop.Character.TroopWage; } } if (wage > 0) { goldChange.Add(-1 * wage, new TextObject("Wage of slave estate guards at " + village.Name.ToString())); } } }
internal static void TrySplitParty(MobileParty mobileParty) { if (GlobalMilitiaPower + mobileParty.Party.TotalStrength > CalculatedGlobalPowerLimit || mobileParty.MemberRoster.TotalManCount < MinSplitSize || !IsBM(mobileParty) || mobileParty.IsTooBusyToMerge()) { return; } var roll = Rng.NextDouble(); if (roll <= Globals.Settings.RandomSplitChance || !IsBM(mobileParty) || mobileParty.Party.TotalStrength <= CalculatedMaxPartyStrength * Globals.Settings.StrengthSplitFactor * Variance || mobileParty.Party.MemberRoster.TotalManCount <= CalculatedMaxPartySize * Globals.Settings.SizeSplitFactor * Variance) { return; } var party1 = TroopRoster.CreateDummyTroopRoster(); var party2 = TroopRoster.CreateDummyTroopRoster(); var prisoners1 = TroopRoster.CreateDummyTroopRoster(); var prisoners2 = TroopRoster.CreateDummyTroopRoster(); var inventory1 = new ItemRoster(); var inventory2 = new ItemRoster(); SplitRosters(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2); CreateSplitMilitias(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2); }
internal LootCollector() { this.LootedMembers = new TroopRoster(); this.LootedPrisoners = new TroopRoster(); this.LootedItems = new ItemRoster(); this.CasualtiesInBattle = new TroopRoster(); }
bool OpenSlelectTroops(MenuCallbackArgs args, TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> canChangeStatusOfTroop, Action <TroopRoster> onDone) { bool excueted = false;; if (null != args.MenuContext.Handler as MenuViewContext) { excueted = true; MenuViewContext menuViewContext = (MenuViewContext)args.MenuContext.Handler; MenuView menuView = null; menuView = menuViewContext.AddMenuView <SpousesDefaultSelectTroops>(new object[] { initialRoster, maxNum, canChangeStatusOfTroop, onDone, new Action(() => { if (null != menuView) { menuViewContext.RemoveMenuView(menuView); } }) }); } return(excueted); }
private static void SplitRosters(MobileParty original, TroopRoster troops1, TroopRoster troops2, TroopRoster prisoners1, TroopRoster prisoners2, ItemRoster inventory1, ItemRoster inventory2) { //Mod.Log($"Processing troops: {original.MemberRoster.Count} types, {original.MemberRoster.TotalManCount} in total"); foreach (var rosterElement in original.MemberRoster.GetTroopRoster().Where(x => x.Character.HeroObject is null)) { SplitRosters(troops1, troops2, rosterElement); } if (original.PrisonRoster.TotalManCount > 0) { //Mod.Log($"Processing prisoners: {original.PrisonRoster.Count} types, {original.PrisonRoster.TotalManCount} in total"); foreach (var rosterElement in original.PrisonRoster.GetTroopRoster()) { SplitRosters(prisoners1, prisoners2, rosterElement); } } foreach (var item in original.ItemRoster) { if (string.IsNullOrEmpty(item.EquipmentElement.Item?.Name?.ToString())) { Mod.Log("Bad item: " + item.EquipmentElement); continue; } var half = Math.Max(1, item.Amount / 2); inventory1.AddToCounts(item.EquipmentElement, half); var remainder = item.Amount % 2; inventory2.AddToCounts(item.EquipmentElement, half + remainder); } }
internal static void TrySplitParty(MobileParty mobileParty) { if (MilitiaPowerPercent > Globals.Settings.GlobalPowerPercent || mobileParty.MemberRoster.TotalManCount < MinSplitSize || !mobileParty.IsBM() || mobileParty.IsTooBusyToMerge()) { return; } var roll = Rng.Next(0, 101); if (roll > Globals.Settings.RandomSplitChance || mobileParty.Party.MemberRoster.TotalManCount > Math.Max(1, CalculatedMaxPartySize * ReductionFactor)) { return; } var party1 = TroopRoster.CreateDummyTroopRoster(); var party2 = TroopRoster.CreateDummyTroopRoster(); var prisoners1 = TroopRoster.CreateDummyTroopRoster(); var prisoners2 = TroopRoster.CreateDummyTroopRoster(); var inventory1 = new ItemRoster(); var inventory2 = new ItemRoster(); SplitRosters(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2); CreateSplitMilitias(mobileParty, party1, party2, prisoners1, prisoners2, inventory1, inventory2); }
private Dictionary <int, int> GetNaughtyPrisoners(TroopRoster prisonRoster) { Dictionary <int, int> nPrisoners = new Dictionary <int, int>(); for (int i = 0; i < prisonRoster.Count; i++) { CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(i); if (IsPrisonerRecruitable(characterAtIndex)) { int naughty = 0; if (GlobalSettings <Settings> .Instance.ApplyEachUnit) { naughty = prisonRoster.GetElementNumber(i) - GetRecruitableNumberInternal(characterAtIndex); } else { naughty = 1; } if (naughty > 0) { nPrisoners[i] = naughty; } } } return(nPrisoners); }
private static void SynthesizeBM() { if (!Globals.Settings.MilitiaSpawn || CalculatedMaxPartySize < Globals.Settings.MinPartySize) { return; } for (var i = 0; i < (Globals.Settings.GlobalPowerPercent - MilitiaPowerPercent) / 24f; i++) { var settlement = Settlement.All.Where(s => !s.IsVisible).GetRandomElementInefficiently(); var clan = Clan.BanditFactions.ToList()[Rng.Next(0, Clan.BanditFactions.Count())]; var mobileParty = settlement.IsHideout ? BanditPartyComponent.CreateBanditParty("Bandit_Militia", clan, settlement.Hideout, false) : BanditPartyComponent.CreateLooterParty("Bandit_Militia", clan, settlement, false); mobileParty.InitializeMobilePartyAroundPosition(clan.DefaultPartyTemplate, settlement.GatePosition, 0); var simulatedMergedRoster = TroopRoster.CreateDummyTroopRoster(); for (var count = 0; count < CalculatedMaxPartySize / Globals.Settings.MinPartySize && simulatedMergedRoster.TotalManCount < CalculatedMaxPartySize && NumMountedTroops(simulatedMergedRoster) <= simulatedMergedRoster.TotalManCount / 2; count++) { simulatedMergedRoster.Add(mobileParty.MemberRoster); } var _ = new Militia(mobileParty.Position2D, simulatedMergedRoster, TroopRoster.CreateDummyTroopRoster()); Trash(mobileParty); DoPowerCalculations(); } }
public static void SortUnits(TroopRoster input, SortType sortType, MBBindingList <PartyCharacterVM> partyVmUnits = null, bool useStickySlots = false) { if (input == null || input.Count == 0) { return; } int sticky = 0; if (useStickySlots) { sticky = PartyManagerSettings.Settings.StickySlots; } var stickyUnits = input.Where(x => !x.Character.IsHero).Select(x => x.Character.Name.ToString()).Take(sticky).ToList(); var inputList = input.ToList(); var flattenedOrder = CreateFlattenedRoster(input, sortType, partyVmUnits); flattenedOrder = flattenedOrder.Where(x => !stickyUnits.Contains(x.Troop.Name.ToString())).ToList(); for (int i = 0; i < inputList.Count; i++) { if (!inputList[i].Character.IsHero && !stickyUnits.Contains(inputList[i].Character.Name.ToString())) { input.RemoveTroop(inputList[i].Character, inputList[i].Number); } } input.Add(flattenedOrder); }
protected override void OnClick() { TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster; int num = 0; IRecruitPrisonersCampaignBehavior campaignBehavior = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>(); CharacterObject bestPrisoner = null; while ((bestPrisoner = getBestRecruitablePrisoner()) != null) { if (MobileParty.MainParty.Party.PartySizeLimit <= MobileParty.MainParty.MemberRoster.TotalManCount) { break; } int recruitableNumber = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>().GetRecruitableNumber(bestPrisoner); if (recruitableNumber > 0) { int maxRecruitable = MobileParty.MainParty.Party.PartySizeLimit - MobileParty.MainParty.MemberRoster.TotalManCount; recruitableNumber = Math.Min(recruitableNumber, maxRecruitable); num += recruitableNumber; PartyCommand command = new PartyCommand(); command.FillForRecruitTroop(PartyRosterSide.Right, TroopType.Prisoner, bestPrisoner, recruitableNumber); _partyLogic.AddCommand(command); } } InformationManager.DisplayMessage(new InformationMessage("Recruited " + num.ToString() + " prisoners")); }
// Helpers.MobilePartyHelper public static FlattenedTroopRoster GetStrongestAndPriorTroops(MobileParty mobileParty, int maxTroopCount, List <Hero> includeList) { TroopRoster troopRoster = TroopRoster.CreateDummyTroopRoster(); FlattenedTroopRoster memberRoster = mobileParty.MemberRoster.ToFlattenedRoster(); memberRoster.RemoveIf((x) => x.IsWounded); List <CharacterObject> list = memberRoster.Select((x) => x.Troop).OrderByDescending((x) => x.Level).ToList <CharacterObject>(); if (null != includeList && includeList.Count > 0) { foreach (Hero hero in includeList) { if (list.Any((x) => x == hero.CharacterObject)) { list.Remove(hero.CharacterObject); troopRoster.AddToCounts(hero.CharacterObject, 1, false, 0, 0, true, -1); maxTroopCount--; } } } List <CharacterObject> heroList = list.Where((x) => x.IsHero).ToList <CharacterObject>(); int num = Math.Min(heroList.Count <CharacterObject>(), maxTroopCount); for (int i = 0; i < num; i++) { troopRoster.AddToCounts(heroList[i], 1, false, 0, 0, true, -1); list.Remove(heroList[i]); } return(troopRoster.ToFlattenedRoster()); }
public static void Prefix(ref TroopRoster rightMemberRoster) { if (Settings.Instance.Enabled && Settings.Instance.ApplyInventoryPatch && rightMemberRoster.Contains(Hero.MainHero.CharacterObject)) { //TroopRoster newRoster = new TroopRoster(); TroopRoster newRoster = TroopRoster.CreateDummyTroopRoster(); newRoster.Add(rightMemberRoster); PatchInventoryDefaults.DefaultCharacterEquipments.Clear(); foreach (Hero hero in Clan.PlayerClan.Heroes) { if (hero.IsAlive && !hero.IsChild && hero != Hero.MainHero && !newRoster.Contains(hero.CharacterObject)) { newRoster.AddToCounts(hero.CharacterObject, 1); PatchInventoryDefaults.SetDefault(hero.CharacterObject); } } foreach (Hero hero in Clan.PlayerClan.Companions) { if (hero.IsAlive && hero.IsPlayerCompanion && !newRoster.Contains(hero.CharacterObject)) { newRoster.AddToCounts(hero.CharacterObject, 1); PatchInventoryDefaults.SetDefault(hero.CharacterObject); } } rightMemberRoster = newRoster; } }
public static void Prefix(MobileParty sellerParty, TroopRoster prisoners, Settlement currentSettlement, bool applyGoldChange) { if (currentSettlement != null) { currentSettlement.Prosperity += (float)prisoners.TotalRegulars * SubModule.Settings.PrisonerProsperityValue; } }
private void DailyTick() { MobileParty mainParty = MobileParty.MainParty; TroopRoster memberRoster = mainParty.MemberRoster; if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit) { return; } TroopRoster prisonRoster = mainParty.PrisonRoster; if (prisonRoster.TotalManCount == 0) { return; } IRecruitPrisonersCampaignBehavior recruitPrisonerBehavior = Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>(); if (recruitPrisonerBehavior == null) { return; } List <Tuple <CharacterObject, int> > recruitablePrisoners = new List <Tuple <CharacterObject, int> >(); for (int i = 0; i < prisonRoster.Count; i++) { CharacterObject prisoner = prisonRoster.GetCharacterAtIndex(i); int numRecruitable = recruitPrisonerBehavior.GetRecruitableNumber(prisoner); if (numRecruitable > 0) { recruitablePrisoners.Add(new Tuple <CharacterObject, int>(prisoner, numRecruitable)); } } recruitablePrisoners.Sort((x, y) => y.Item1.Tier.CompareTo(x.Item1.Tier)); for (int i = 0; i < recruitablePrisoners.Count; i++) { CharacterObject prisoner = recruitablePrisoners[i].Item1; int numRecruitable = recruitablePrisoners[i].Item2; while (numRecruitable > 0) { recruitPrisonerBehavior.SetRecruitableNumber(prisoner, --numRecruitable); prisonRoster.AddToCounts(prisoner, -1, false, 0, 0, true, -1); mainParty.MemberRoster.AddToCounts(prisoner, 1, false, 0, 0, true, -1); if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit) { break; } } if (memberRoster.TotalManCount >= mainParty.Party.PartySizeLimit) { break; } } }
private void btnPrisoners_Click(object sender, EventArgs e) { this.prisonRoster = !this.prisonRoster; Roster = this.prisonRoster ? Coordinator.Hero.PartyBelongedTo.Party.PrisonRoster : Coordinator.Hero.PartyBelongedTo.Party.MemberRoster; this.UpdateRosterList(); this.btnPrisoners.Text = "显示 " + (this.prisonRoster ? "部队" : "俘虏"); this.btnTroopsUpgrade.Text = this.prisonRoster ? "招募" : "升级"; }
public GauntletMenuSpousesSelectTroops(TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> changeChangeStatusOfTroop, Action <TroopRoster> onDone, Action onCanel) { this._onCanel = onCanel; this._onDone = onDone; this._initialRoster = initialRoster; this._maxNum = maxNum; this._changeChangeStatusOfTroop = changeChangeStatusOfTroop; }
public static void ConvertLootersToKingdomCultureRecruits(ref TroopRoster troopRoster, CultureObject culture, int numberToUpgrade) { var recruit = Recruits.Where(x => x.Culture == Clan.All.FirstOrDefault(k => k.Culture == culture)?.Culture) .ToList().GetRandomElement() ?? Recruits.ToList().GetRandomElement(); troopRoster.AddToCounts(recruit, numberToUpgrade); }
private void outputRoster(TroopRoster roster) { for (int i = 0; i < roster.Count(); i++) { CharacterObject troop = roster.GetCharacterAtIndex(i); Debug.WriteLine("roster member: " + troop.Name + ", count: " + roster.GetTroopCount(troop)); } }
public Militia(MobileParty mobileParty, TroopRoster party, TroopRoster prisoners) { Banner = Banners.GetRandomElement(); BannerKey = Banner.Serialize(); Spawn(mobileParty, party, prisoners); TrainMilitia(); PartyMilitiaMap.Add(MobileParty, this); LogMilitiaFormed(MobileParty); }
public static void RegisterTemplate(Hero leader, TroopRoster template) { if (PartyAICommandsBehavior.Instance.template_map == null) { PartyAICommandsBehavior.Instance.template_map = new Dictionary <Hero, TroopRoster>(); } PartyAICommandsBehavior.Instance.template_map[leader] = new TroopRoster((PartyBase)null); PartyAICommandsBehavior.Instance.template_map[leader].Add(template); }
private void AddTroops() { Debug.WriteLine("adding troops, count: " + troopRosterRemovedTroops.Count()); MobileParty heroParty = MobileParty.MainParty; TroopRoster troops = heroParty.MemberRoster; troops.Add(troopRosterRemovedTroops); troopRosterRemovedTroops = new TroopRoster(); areTroopsRemoved = false; }
public SpousesSelectTroopsVM(TroopRoster initialRoster, int maxNum, Func <CharacterObject, bool> canChangeChangeStatusOfTroop, Action <TroopRoster> onDone) { this._canChangeChangeStatusOfTroop = canChangeChangeStatusOfTroop; this._onDone = onDone; this._maxNum = maxNum; this._initialRoster = initialRoster; this.InitList(); this.RefreshValues(); this._maxSelectableTroopCount = maxNum; this.OnCurrentSelectedAmountChange(); }
public static List <FlattenedTroopRosterElement> CreateFlattenedRoster(TroopRoster roster) { IEnumerable <FlattenedTroopRosterElement> source = from x in roster.ToFlattenedRoster() where !x.Troop.IsHero select x; switch (SortPartyConfig.SortOrder) { case TroopSortType.TierDesc: return((from x in source orderby x.Troop.Tier descending, x.Troop.Name.ToString() select x).ToList()); case TroopSortType.TierAsc: return((from x in source orderby x.Troop.Tier, x.Troop.Name.ToString() select x).ToList()); case TroopSortType.TierDescType: return((from x in source orderby x.Troop.Tier descending, IsMountedUnit(x.Troop), IsRangedUnit(x.Troop), x.Troop.Name.ToString() select x).ToList()); case TroopSortType.TierAscType: return((from x in source orderby x.Troop.Tier, IsMountedUnit(x.Troop), IsRangedUnit(x.Troop), x.Troop.Name.ToString() select x).ToList()); case TroopSortType.MountRangeTierDesc: return((from x in source orderby IsMountedUnit(x.Troop) descending, IsRangedUnit(x.Troop), x.Troop.Tier descending, x.Troop.Name.ToString() select x).ToList()); case TroopSortType.MountRangeTierAsc: return((from x in source orderby IsMountedUnit(x.Troop) descending, IsRangedUnit(x.Troop), x.Troop.Tier, x.Troop.Name.ToString() select x).ToList()); case TroopSortType.CultureTierDesc: return((from x in source orderby x.Troop.Culture.Name.ToString(), x.Troop.Tier descending, x.Troop.Name.ToString() select x).ToList()); case TroopSortType.CultureTierAsc: return((from x in source orderby x.Troop.Culture.Name.ToString(), x.Troop.Tier, x.Troop.Name.ToString() select x).ToList()); default: return((from x in source orderby x.Troop.Tier descending, x.Troop.Name.ToString() select x).ToList()); } }
public SlaveEstate() { _village = Settlement.CurrentSettlement.Village; _prisoners = TroopRoster.CreateDummyTroopRoster(); _stockpile = new ItemRoster(); _product = FindProduct(_village); _logs = new List <DailyLog>(); _surgeon_house_level = 0; _overseer_house_level = 0; _tool_repair_workshop_level = 0; }
public static TroopRoster ConstructTroopRoster(PartyTemplateObject template, PartyBase party) { TroopRoster roster = new TroopRoster(party); foreach (PartyTemplateStack stack in template.Stacks) { int num = MBRandom.RandomInt(stack.MinValue, stack.MaxValue); roster.AddToCounts(stack.Character, num); } return(roster); }
public static void DesertTroopsFromParty(MobileParty party, int stackNo, int numberOfDeserters, ref TroopRoster desertedTroopList) { TroopRosterElement rosterSlot = party.MemberRoster.GetElementCopyAtIndex(stackNo); party.MemberRoster.AddToCounts(rosterSlot.Character, -numberOfDeserters, false, 0, 0, true, -1); if (desertedTroopList == (TroopRoster)null) { desertedTroopList = new TroopRoster(); } desertedTroopList.AddToCounts(rosterSlot.Character, numberOfDeserters, false, 0, 0, true, -1); }
private void DailyTick() { Settings settings = GlobalSettings <Settings> .Instance; TroopRoster prisonRoster = MobileParty.MainParty.PrisonRoster; // I'm not sure how the following line redirects to my function. Todd Howard: "It just works" float[] dailyRecruitedPrisoners = Campaign.Current.Models.PrisonerRecruitmentCalculationModel.GetDailyRecruitedPrisoners(MobileParty.MainParty); float excess = dailyRecruitedPrisoners[dailyRecruitedPrisoners.Length - 1]; // This is pooled chance to recruit higher tiers than we have settings for Dictionary <int, int> nPrisoners = GetNaughtyPrisoners(prisonRoster); // Get prisoner index -> not yet recruitable number int totalN = GetTotalNaughty(nPrisoners); // Determine how many loops we need to process the above dictionary for (int n = 0; n < totalN; n++) { int i = MBRandom.RandomInt(nPrisoners.Count); // Get random for better distribution int index = nPrisoners.ElementAt(i).Key; nPrisoners[index] -= 1; if (nPrisoners[index] < 1) { nPrisoners.Remove(index); } CharacterObject characterAtIndex = prisonRoster.GetCharacterAtIndex(index); int tier = characterAtIndex.Tier; if (dailyRecruitedPrisoners[tier] > 0f) // TODO We should probably organise nPrisoners by Tier, index, then unrecruited so we can remove Tier chance < 0 { if (tier < dailyRecruitedPrisoners.Length) { if (MBRandom.RandomFloat < dailyRecruitedPrisoners[tier]) { // 100 Leadership decreases chance decrease per recruitment by 33%, capped at 275 float chanceDecreaseLeadership = settings.LeadershipBase - Math.Min(settings.LeadershipCap, Clan.PlayerClan.Leader.GetSkillValue(DefaultSkills.Charm)) / (float)settings.LeadershipDiv; SetRecruitableNumberInternal(characterAtIndex, GetRecruitableNumberInternal(characterAtIndex) + 1); // Clan Tier has exponential effect, increase power base to increase steepness, change float multipler to change ceiling float clanPowerThing = (float)Math.Pow(settings.ClanTierChanceLossDecreasePowerBase, Clan.PlayerClan.Tier + settings.ClanTierChanceLossDecreasePowerAdd); float clanImpact = settings.ClanTierChanceLossDecreaseBase + settings.ClanTierChanceLossDecreaseFloat * clanPowerThing - settings.ClanTierChanceLossDecreaseFloat; dailyRecruitedPrisoners[tier] -= chanceDecreaseLeadership / (clanImpact); } } else if (MBRandom.RandomFloat < excess) { float chanceDecreaseLeadership = settings.LeadershipBase - Math.Min(settings.LeadershipCap, Clan.PlayerClan.Leader.GetSkillValue(DefaultSkills.Charm)) / (float)settings.LeadershipDiv; SetRecruitableNumberInternal(characterAtIndex, GetRecruitableNumberInternal(characterAtIndex) + 1); float clanPowerThing = (float)Math.Pow(settings.ClanTierChanceLossDecreasePowerBase, Clan.PlayerClan.Tier + settings.ClanTierChanceLossDecreasePowerAdd); float clanImpact = settings.ClanTierChanceLossDecreaseBase + settings.ClanTierChanceLossDecreaseFloat * clanPowerThing - settings.ClanTierChanceLossDecreaseFloat; excess -= chanceDecreaseLeadership / clanImpact; } } } RemoveUnused(prisonRoster); }
private void RemoveTroops() { MobileParty heroParty = MobileParty.MainParty; TroopRoster troops = heroParty.MemberRoster; TroopRosterElement troopElement; CharacterObject troop; int troopTypeCount; int numOfTroopsToTake; TroopRoster tempTroopRoster; for (int i = 0; i < troops.Count; i++) { tempTroopRoster = new TroopRoster(); troop = troops.GetCharacterAtIndex(i); troopElement = troops.GetElementCopyAtIndex(i); Debug.WriteLine("troopElement " + i + ": " + troopElement.Character.Name); troopTypeCount = troops.GetTroopCount(troop); Debug.WriteLine("cons2 Troop " + i + ": " + troop.Name + ", count:" + troopTypeCount); if (numOfTroopNeeded > 0) { numOfTroopsToTake = getNumTroopNeeded(troop, troopTypeCount); int numOfTroopsToRemove = troopTypeCount - numOfTroopsToTake; Debug.WriteLine("take Troop " + troop.Name + ", num to take: " + numOfTroopsToTake + ", num to remove: " + numOfTroopsToRemove); numOfTroopNeeded -= numOfTroopsToTake; if (numOfTroopsToRemove > 0) { Debug.WriteLine("remove Troop1 " + troop.Name + ", num: " + numOfTroopsToRemove); CharacterObject tempTroop = troopElement.Character; tempTroopRoster.FillMembersOfRoster(numOfTroopsToTake, troop); troopRosterRemovedTroops.Add(tempTroopRoster); Debug.WriteLine("troopRoosterRemovedTroops count" + troopRosterRemovedTroops.Count()); troops.RemoveTroop(troop, numOfTroopsToRemove); i--; } } else { Debug.WriteLine("remove Troop2 " + troop.Name + ", num: " + troopTypeCount + ", troopCound: " + troopTypeCount); CharacterObject tempTroop = troopElement.Character; tempTroopRoster.FillMembersOfRoster(troopTypeCount, troop); Debug.WriteLine("output temp roster: "); outputRoster(troopRosterRemovedTroops); troopRosterRemovedTroops.Add(tempTroopRoster); Debug.WriteLine("output roster: "); outputRoster(troopRosterRemovedTroops); Debug.WriteLine("troopRoosterRemovedTroops count" + troopRosterRemovedTroops.Count() + ", troopRoster tootalCount: " + troopRosterRemovedTroops.TotalManCount); troops.RemoveTroop(troop, troopTypeCount); i--; } } Debug.WriteLine("end of remove troops"); }