private static List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> > PrepareRecruitmentCommands(IEnumerable <PartyCharacterVM> recruitablePrisoners, int partySpace, ref RecruitmentResults results, PartyVM partyVm)
        {
            List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> > commands = new List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> >();

            CharacterObject playerSelectedCharacter = partyVm.CurrentCharacter.Character;

            foreach (PartyCharacterVM prisoners in recruitablePrisoners)
            {
                if (partySpace == 0 && !States.HotkeyControl)
                {
                    break;
                }

                int prisonerCount      = prisoners.NumOfRecruitablePrisoners;
                int prisonersToRecruit = States.HotkeyControl ? prisonerCount : Math.Min(prisonerCount, partySpace);
                int numOfRemainingRecruitablePrisoners = prisonerCount - prisonersToRecruit;
                results.RecruitedTypes++;
                results.RecruitedTotal += prisonersToRecruit;
                partySpace             -= prisonersToRecruit;

                partyVm.CurrentCharacter.Character = prisoners.Character;

                Campaign.Current.GetCampaignBehavior <IRecruitPrisonersCampaignBehavior>().SetRecruitableNumber(partyVm.CurrentCharacter.Character, numOfRemainingRecruitablePrisoners + 1);

                PartyScreenLogic.PartyCommand recruitCommand = new PartyScreenLogic.PartyCommand();
                recruitCommand.FillForRecruitTroop(prisoners.Side, prisoners.Type, prisoners.Character, prisonersToRecruit);
                commands.Add(new Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand>(prisoners, recruitCommand));

                partyVm.CurrentCharacter.UpdateRecruitable();
            }

            partyVm.CurrentCharacter.Character = playerSelectedCharacter;

            return(commands);
        }
Exemplo n.º 2
0
 public static void ProcessCommand(this PartyScreenLogic instance, PartyScreenLogic.PartyCommand command)
 {
     Traverse.Create(instance).Method("ProcessCommand", new Type[1]
     {
         typeof(PartyScreenLogic.PartyCommand)
     }).GetValue(command);
 }
Exemplo n.º 3
0
        public static void ExecuteRecruitAll(this PartyVM partyVM)
        {
            PartyScreenLogic partyScreenLogic = GetPartyScreenLogic(partyVM);
            int num  = partyScreenLogic.RightOwnerParty.PartySizeLimit - partyScreenLogic.MemberRosters[1].TotalManCount;
            int num2 = 0;
            int num3 = 0;

            foreach (PartyCharacterVM item in partyVM.MainPartyPrisoners.OrderByDescending((PartyCharacterVM o) => o.Character.Tier).ToList())
            {
                if (num <= 0)
                {
                    break;
                }
                if (!item.IsHero && item.NumOfRecruitablePrisoners > 0)
                {
                    int num4 = Math.Min(item.NumOfRecruitablePrisoners, num);
                    num2++;
                    num  -= num4;
                    num3 += num4;
                    PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                    partyCommand.FillForRecruitTroop(item.Side, item.Type, item.Character, num4);
                    partyVM.CurrentCharacter = item;
                    ProcessCommand(partyScreenLogic, partyCommand);
                }
            }
            RefreshPartyScreen(partyVM);
            if (num2 > 0)
            {
                InformationManager.DisplayMessage(new InformationMessage($"招募 {num3} 兵 ({num2})"));
            }
            if (num <= 0)
            {
                InformationManager.DisplayMessage(new InformationMessage("队伍成员达到上限."));
            }
        }
Exemplo n.º 4
0
        public static void Postfix(PartyScreenLogic.PartyCommand command)
        {
            DropChance      dc         = new DropChance();
            double          dropChance = dc.CalculateChance();
            Random          random     = new Random();
            CharacterObject character  = command.Character;

            for (int index = 0; index < 12; ++index)
            {
                try
                {
                    if (random.NextDouble() < dropChance)
                    {
                        EquipmentElement equipmentElement = character.Equipment.GetEquipmentFromSlot((EquipmentIndex)index);
                        if (equipmentElement.Item != null)
                        {
                            ItemRoster itemRoster = PartyBase.MainParty.ItemRoster;
                            equipmentElement = character.Equipment.GetEquipmentFromSlot((EquipmentIndex)index);

                            itemRoster.AddToCounts(equipmentElement.Item, 1, true);

                            SubModule.WriteDebugMessage(equipmentElement.Item.Name.ToString() + " was looted");
                        }
                    }
                }
                catch (Exception ex)
                {
                    SubModule.WriteDebugMessage(ex.Message);
                }
            }
        }
Exemplo n.º 5
0
        public void RecruitAllPrisoners(bool ignorePartyLimit)
        {
            var currentlyRecruitingPrisoner = "";

            try
            {
                var recruits = PartyVM?.MainPartyPrisoners?
                               .Where(x => !x.IsHero &&
                                      x.IsRecruitablePrisoner && x.NumOfRecruitablePrisoners > 0).ToList();


                if (PartyManagerSettings.Settings.RecruitPrisonersUseWhitelist)
                {
                    recruits = recruits.Where(x =>
                                              PartyManagerSettings.Settings.RecruitPrisonerBlackWhiteList.Contains(x.Name)).ToList();
                }
                else
                {
                    recruits = recruits.Where(x =>
                                              !PartyManagerSettings.Settings.RecruitPrisonerBlackWhiteList.Contains(x.Name)).ToList();
                }

                if (recruits?.Count > 0)
                {
                    var freeUnitSlots = PartyScreenLogic.RightOwnerParty.PartySizeLimit - PartyScreenLogic.RightOwnerParty.NumberOfAllMembers;

                    var recruitCount = 0;

                    foreach (var troop in recruits)
                    {
                        currentlyRecruitingPrisoner = troop?.Name?.ToString();
                        if (freeUnitSlots > 0 || ignorePartyLimit)
                        {
                            var toBeRecruited = ignorePartyLimit ? troop.NumOfRecruitablePrisoners : Math.Min(freeUnitSlots, troop.NumOfRecruitablePrisoners);
                            for (int i = 0; i < toBeRecruited; i++)
                            {
                                PartyScreenLogic.PartyCommand command = new PartyScreenLogic.PartyCommand();
                                command.FillForRecruitTroop(PartyScreenLogic.PartyRosterSide.Right, troop.Type,
                                                            troop.Character, 1);
                                PartyScreenLogic.AddCommand(command);
                            }

                            GenericHelpers.LogDebug("RecruitAll", $"Recruited {toBeRecruited} {troop.Character.Name}");
                            recruitCount  += toBeRecruited;
                            freeUnitSlots -= toBeRecruited;
                        }
                    }

                    ButtonClickRefresh(true, true);
                }
                else
                {
                    GenericHelpers.LogMessage("No prisoners found to recruit");
                }
            }
            catch (Exception ex)
            {
                GenericHelpers.LogException($"RecruitAllPrisoners UnitType({currentlyRecruitingPrisoner})", ex);
            }
        }
Exemplo n.º 6
0
        public void UpdateLabel([CanBeNull] PartyScreenLogic.PartyCommand command)
        {
            try
            {
                if (!PartyScreenConfig.ExtraSettings.ShouldShowCompletePartyNumber)
                {
                    return;
                }

                var _otherParty = _partyVM.OtherPartyTroops;
                var _mainParty  = _partyVM.MainPartyTroops;

                if (_mainParty != null && !_mainParty.IsEmpty() &&
                    (_partyScreenLogic.RightOwnerParty?.PartySizeLimit > 0))
                {
                    _partyVM.MainPartyTroopsLbl =
                        PopulatePartyList(_mainParty, _partyScreenLogic.RightOwnerParty.PartySizeLimit);
                }

                if (_otherParty != null && !_otherParty.IsEmpty() &&
                    (_partyScreenLogic.LeftOwnerParty?.PartySizeLimit > 0))
                {
                    _partyVM.OtherPartyTroopsLbl =
                        PopulatePartyList(_otherParty, _partyScreenLogic.LeftOwnerParty.PartySizeLimit);
                }
            }
            catch (Exception e)
            {
                Logging.Log(Logging.Levels.ERROR, $"Update Label: {e}");
                Utilities.DisplayMessage($"PSE UpdateLabel Exception: {e}");
            }
        }
Exemplo n.º 7
0
 private void UpgradeUnit(PartyCharacterVM troop, bool path1)
 {
     PartyScreenLogic.PartyCommand command = new PartyScreenLogic.PartyCommand();
     command.FillForUpgradeTroop(PartyScreenLogic.PartyRosterSide.Right, troop.Type, troop.Character,
                                 path1 ? troop.NumOfTarget1UpgradesAvailable : troop.NumOfTarget2UpgradesAvailable,
                                 path1 ? PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget1 : PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget2);
     PartyScreenLogic.AddCommand(command);
 }
        private void SendCommand(PartyCharacterVM character, int amount,
                                 int target)
        {
            var partyCommand = new PartyScreenLogic.PartyCommand();

            partyCommand.FillForUpgradeTroop(character.Side, character.Type, character.Character, amount, target);
            _partyVM.CurrentCharacter = character;
            _partyLogic.AddCommand(partyCommand);
        }
Exemplo n.º 9
0
        public static void Postfix(PartyScreenLogic.PartyCommand command)
        {
            Random          random    = new Random();
            CharacterObject character = command.Character;

            for (int i = 0; i < 12; i++)
            {
                if (character.HeroObject.BattleEquipment[i].Item != null)
                {
                    ItemRoster       itemRoster = PartyBase.MainParty.ItemRoster;
                    EquipmentElement item       = character.HeroObject.BattleEquipment[i];
                    itemRoster.AddToCounts(item.Item, 1, true);
                    item = character.HeroObject.BattleEquipment[i];
                    InformationManager.DisplayMessage(new InformationMessage(string.Concat(item.Item.Name.ToString(), " Added to inventory")));
                }
            }
        }
Exemplo n.º 10
0
        public static void Postfix(PartyScreenLogic.PartyCommand command)
        {
            CharacterObject character = command.Character;

            Equipment battleEquipment = character.HeroObject.BattleEquipment;

            for (int i = 0; i < Equipment.EquipmentSlotLength - 1; i++)
            {
                ItemObject item = battleEquipment[i].Item;
                if (item != null)
                {
                    PartyBase.MainParty.ItemRoster.AddToCounts(item, 1);
                    InformationManager.DisplayMessage(
                        new InformationMessage($"Obtained {item.Name}")
                        );
                }
            }
        }
        private void RecruitPrisoner(PartyCharacterVM character, int remainingSize, ref int amount)
        {
            if (!_partyLogic.IsPrisonerRecruitable(character.Type, character.Character, character.Side))
            {
                return;
            }

            var number = Math.Min(character.NumOfRecruitablePrisoners, remainingSize);

            if (number > 0)
            {
                PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                partyCommand.FillForRecruitTroop(character.Side, character.Type,
                                                 character.Character, number);

                _partyLogic.AddCommand(partyCommand);

                amount += number;
                character.UpdateRecruitable();
            }
        }
        // Something wrong with upgrade
        private static List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> > PrepareUpgradeCommands(IEnumerable <PartyCharacterVM> upgradableTroops, PartyScreenLogic partyScreenLogic, ref UpgradeResults upgradeResults)
        {
            List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> > commands = new List <Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand> >();

            AvailableResources availableResources = new AvailableResources();

            foreach (PartyCharacterVM troops in upgradableTroops)
            {
                List <(int, PartyScreenLogic.PartyCommand.UpgradeTargetType)> upgradesPerTypes =
                    new List <(int maxUpgradableTroops, PartyScreenLogic.PartyCommand.UpgradeTargetType upgradeTargetType)> {
                    (int.MaxValue, PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget1)
                };

                if (HasTwoUpgradePaths(troops) && !YapoSettings.Instance.PlayerDecision && !MultipathUpgradeLogic.TryGetUpgradePaths(troops, out upgradesPerTypes))
                {
                    upgradeResults.MultiPathSkipped++;
                    continue;
                }

                foreach ((int maxUpgradableTroops, PartyScreenLogic.PartyCommand.UpgradeTargetType upgradeTargetType)upgradesPerType in upgradesPerTypes)
                {
                    int troopsToUpgrade = CalculateCountOfTroopsThatCanBeUpgraded(availableResources, troops, partyScreenLogic, upgradesPerType);
                    if (troopsToUpgrade == 0)
                    {
                        continue;
                    }

                    upgradeResults.UpgradedTypes++;
                    upgradeResults.UpgradedTotal += troopsToUpgrade;

                    PartyScreenLogic.PartyCommand upgradeCommand = new PartyScreenLogic.PartyCommand();
                    upgradeCommand.FillForUpgradeTroop(troops.Side, troops.Type, troops.Character, troopsToUpgrade, upgradesPerType.upgradeTargetType);
                    commands.Add(new Tuple <PartyCharacterVM, PartyScreenLogic.PartyCommand>(troops, upgradeCommand));

                    availableResources.UpdateAvailableResources(troops, troopsToUpgrade, (int)upgradesPerType.upgradeTargetType);
                }
            }

            return(commands);
        }
Exemplo n.º 13
0
        public static void Postfix(PartyScreenLogic.PartyCommand command)
        {
            if (!LootOverhaulSettings.Instance.LootExecutedLords)
            {
                return;
            }

            CharacterObject  character = command.Character;
            EquipmentElement equipmentElement;

            int maxItemsToLoot = LootOverhaulSettings.Instance.ApplyItemPerUnitToLords? LootOverhaulSettings.Instance.MaxItemsPerUnit : 12;
            int itemsLooted    = 0;

            foreach (EquipmentIndex ei in LootOverhaul.allowedSlotsToLoot.Shuffle())
            {
                try
                {
                    if (itemsLooted >= maxItemsToLoot)
                    {
                        break;
                    }

                    equipmentElement = character.Equipment.GetEquipmentFromSlot(ei);
                    if (equipmentElement.Item == null)
                    {
                        continue;
                    }

                    LootExecuted(equipmentElement.Item);
                    SubModule.WriteLootMessage(equipmentElement);
                    itemsLooted++;
                }
                catch (Exception ex)
                {
                    SubModule.WriteException(ex.Message);
                }
            }
        }
Exemplo n.º 14
0
        private static bool TransferAllCharacters(PartyVM __instance, ref PartyScreenLogic ____partyScreenLogic, ref PartyCharacterVM ____currentCharacter, PartyScreenLogic.PartyRosterSide rosterSide, PartyScreenLogic.TroopType type)
        {
            MBBindingList <PartyCharacterVM> list;

            if (type == PartyScreenLogic.TroopType.Member)
            {
                if (rosterSide == PartyScreenLogic.PartyRosterSide.Left)
                {
                    list = __instance.OtherPartyTroops;
                }
                else
                {
                    list = __instance.MainPartyTroops;
                }
            }
            else
            {
                if (rosterSide == PartyScreenLogic.PartyRosterSide.Left)
                {
                    list = __instance.OtherPartyPrisoners;
                }
                else
                {
                    list = __instance.MainPartyPrisoners;
                }
            }


            var newList = list;
            var lack    = 10000;

            var prisionerSetting = PrisonerSetting.Instance;

            if (prisionerSetting.IsEnabled && rosterSide == PartyScreenLogic.PartyRosterSide.Left && PartyScreenLogic.TroopType.Prisoner == type)
            {
                var limit = MobileParty.MainParty.Party.PrisonerSizeLimit;
                lack = limit - __instance.MainPartyPrisoners.Sum(a => a.Number);



                var fixeds = new List <PartyCharacterVM>();
                var order1 = new List <PartyCharacterVM>();
                var order2 = new List <PartyCharacterVM>();
                var order3 = new List <PartyCharacterVM>();
                var order4 = new List <PartyCharacterVM>();
                var other  = new List <PartyCharacterVM>();

                foreach (var item in newList)
                {
                    if (prisionerSetting.IsFixTroop(item.Character) > 0)
                    {
                        fixeds.Add(item);
                    }
                    else if (prisionerSetting.OrderTroop(item.Character, prisionerSetting.Order1, prisionerSetting.Order1MinTier) > 0)
                    {
                        order1.Add(item);
                    }
                    else if (prisionerSetting.OrderTroop(item.Character, prisionerSetting.Order2, prisionerSetting.Order2MinTier) > 0)
                    {
                        order2.Add(item);
                    }
                    else if (prisionerSetting.OrderTroop(item.Character, prisionerSetting.Order3, prisionerSetting.Order3MinTier) > 0)
                    {
                        order3.Add(item);
                    }
                    else if (prisionerSetting.OrderTroop(item.Character, prisionerSetting.Order4, prisionerSetting.Order4MinTier) > 0)
                    {
                        order4.Add(item);
                    }
                    else if (!prisionerSetting.EnableFilter)
                    {
                        other.Add(item);
                    }
                }

                //var orderList = newList
                //    .OrderBy(a =>
                //    {
                //        return prisionerSetting.IsFixTroop(a.Character);

                //    })
                //    .ThenBy(a => { return prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order1, prisionerSetting.Order1MinTier); })
                //    .ThenBy(a => { return prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order2, prisionerSetting.Order2MinTier); })
                //    .ThenBy(a => { return prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order3, prisionerSetting.Order3MinTier); })
                //    .ThenBy(a => { return prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order4, prisionerSetting.Order4MinTier); })
                //    .ToList();

                newList = new MBBindingList <PartyCharacterVM>();
                foreach (var item in other.OrderBy(a => a.Character.Tier))
                {
                    newList.Add(item);
                }
                foreach (var item in order4.OrderBy(a => { return(prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order4, prisionerSetting.Order4MinTier)); }))
                {
                    newList.Add(item);
                }
                foreach (var item in order3.OrderBy(a => { return(prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order3, prisionerSetting.Order3MinTier)); }))
                {
                    newList.Add(item);
                }
                foreach (var item in order2.OrderBy(a => { return(prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order2, prisionerSetting.Order2MinTier)); }))
                {
                    newList.Add(item);
                }
                foreach (var item in order1.OrderBy(a => { return(prisionerSetting.OrderTroop(a.Character, prisionerSetting.Order1, prisionerSetting.Order1MinTier)); }))
                {
                    newList.Add(item);
                }
                foreach (var item in fixeds.OrderBy(a => { return(prisionerSetting.IsFixTroop(a.Character)); }))
                {
                    newList.Add(item);
                }
            }

            int tranfer = 0;

            for (int i = newList.Count - 1; i >= 0; i--)
            {
                if (lack <= tranfer)
                {
                    break;
                }

                if (____partyScreenLogic.IsTroopTransferrable(type, newList[i].Character, (int)newList[i].Side))
                {
                    PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                    PartyCharacterVM partyCharacterVM          = newList[i];
                    ____currentCharacter = partyCharacterVM;

                    if (partyCharacterVM.Type == PartyScreenLogic.TroopType.AttachedGroups)
                    {
                        partyCommand.FillForTransferPartyLeaderTroop(partyCharacterVM.Side, __instance.CurrentCharacter.Type, partyCharacterVM.Character, partyCharacterVM.Troop.Number);
                    }
                    else if (partyCharacterVM.Side == PartyScreenLogic.PartyRosterSide.Right)
                    {
                        if (PartyScreenLogic.TroopType.Prisoner == type && prisionerSetting.IsEnabled && prisionerSetting.IsFixTroop(partyCharacterVM.Character) > 0)
                        {
                            continue;
                        }

                        partyCommand.FillForTransferTroop(partyCharacterVM.Side, partyCharacterVM.Type, partyCharacterVM.Character, partyCharacterVM.Troop.Number, partyCharacterVM.Troop.WoundedNumber, -1);
                    }
                    else
                    {
                        var tranferNumber        = partyCharacterVM.Troop.Number;
                        var tranferWoundedNumber = partyCharacterVM.Troop.WoundedNumber;
                        if (rosterSide == PartyScreenLogic.PartyRosterSide.Left && PartyScreenLogic.TroopType.Prisoner == type)
                        {
                            if (lack - tranfer <= partyCharacterVM.Troop.Number)
                            {
                                tranferNumber = lack - tranfer;

                                var heath = partyCharacterVM.Troop.Number - partyCharacterVM.Troop.WoundedNumber;
                                if (tranferNumber < heath)
                                {
                                    tranferWoundedNumber = 0;
                                }
                                else
                                {
                                    tranferWoundedNumber = tranferNumber - heath;
                                }
                            }
                            tranfer += tranferNumber;
                        }
                        partyCommand.FillForTransferTroop(partyCharacterVM.Side, partyCharacterVM.Type, partyCharacterVM.Character, tranferNumber, tranferWoundedNumber, -1);
                    }
                    ____partyScreenLogic.AddCommand(partyCommand);
                }
            }

            return(false);
        }
Exemplo n.º 15
0
 public void RefreshDelegate(PartyScreenLogic.PartyCommand command)
 {
     RefreshValues();
 }
Exemplo n.º 16
0
        public static void ExecuteUpgradeAll(this PartyVM partyVM)
        {
            var hasTwoUpgrade = new List <PartyCharacterVM>();

            PartyScreenLogic partyScreenLogic = GetPartyScreenLogic(partyVM);
            int troopNum      = 0;
            int troopNumTotal = 0;

            var party = partyVM.MainPartyTroops.OrderByDescending((PartyCharacterVM o) => o.Character.Tier).ToList();

            foreach (PartyCharacterVM partyCharacterVM in party)
            {
                if (!partyCharacterVM.IsHero && partyCharacterVM.IsUpgrade1Available && !partyCharacterVM.IsUpgrade2Exists && partyCharacterVM.NumOfTarget1UpgradesAvailable > 0 && !partyCharacterVM.IsUpgrade1Insufficient)
                {
                    int numOfTarget1UpgradesAvailable = partyCharacterVM.NumOfTarget1UpgradesAvailable;
                    troopNum++;
                    troopNumTotal += numOfTarget1UpgradesAvailable;
                    PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                    partyCommand.FillForUpgradeTroop(partyCharacterVM.Side, partyCharacterVM.Type, partyCharacterVM.Character, numOfTarget1UpgradesAvailable, PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget1);
                    partyVM.CurrentCharacter = partyCharacterVM;
                    ProcessCommand(partyScreenLogic, partyCommand);
                }

                if (!partyCharacterVM.IsHero && partyCharacterVM.IsUpgrade1Exists && partyCharacterVM.IsUpgrade1Available && partyCharacterVM.IsUpgrade2Exists && partyCharacterVM.IsUpgrade2Available)
                {
                    hasTwoUpgrade.Add(partyCharacterVM);
                }
            }

            foreach (var partyCharacterVM in hasTwoUpgrade)
            {
                if (UpgradeSetting.Instance.IsEnabled && partyCharacterVM.IsUpgrade1Exists && partyCharacterVM.IsUpgrade2Exists && partyCharacterVM.IsUpgrade1Available && partyCharacterVM.IsUpgrade2Available && !partyCharacterVM.IsUpgrade1Insufficient && !partyCharacterVM.IsUpgrade2Insufficient)
                {
                    var upgradeSide = UpgradeSetting.Instance.FindUpgradeTopInSetting(partyCharacterVM.Character);
                    if (upgradeSide > -1 && upgradeSide < 2)
                    {
                        var upgradeNum = upgradeSide == 0 ? partyCharacterVM.NumOfTarget1UpgradesAvailable : partyCharacterVM.NumOfTarget2UpgradesAvailable;
                        troopNum++;
                        troopNumTotal += upgradeNum;

                        PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                        partyCommand.FillForUpgradeTroop(partyCharacterVM.Side, partyCharacterVM.Type, partyCharacterVM.Character, upgradeNum, (PartyScreenLogic.PartyCommand.UpgradeTargetType)upgradeSide);

                        partyVM.CurrentCharacter = partyCharacterVM;
                        ProcessCommand(partyScreenLogic, partyCommand);
                        continue;
                    }
                }

                partyVM.MainPartyTroops.Remove(partyCharacterVM);
                partyVM.MainPartyTroops.Insert(1, partyCharacterVM);
            }



            RefreshPartyScreen(partyVM);
            if (troopNum > 0)
            {
                InformationManager.DisplayMessage(new InformationMessage($"升级 {troopNumTotal} 部队 ({troopNum})"));
            }
        }
Exemplo n.º 17
0
        protected override void OnClick()
        {
            MobileParty mainParty    = MobileParty.MainParty;
            TroopRoster memberRoster = mainParty.MemberRoster;
            Hero        playerHero   = mainParty.Party.LeaderHero;
            Random      r            = new Random();
            int         num          = 0;

            bool upgrade1LastTime = false;

            for (int index = 0; index < _mainPartyList.Count; index++)
            {
                PartyCharacterVM partyCharacter = _mainPartyList[index];
                int numOfUpgradableTroops       = partyCharacter.NumOfUpgradeableTroops;
                if (numOfUpgradableTroops > 0)
                {
                    for (int i = 0; i < numOfUpgradableTroops; i++)
                    {
                        if (Settings.Instance.DontUpgradeMultipath && partyCharacter.IsUpgrade2Exists)
                        {
                            continue;
                        }

                        bool[] availableUpgrade = new bool[2];
                        availableUpgrade[0] = partyCharacter.IsUpgrade1Available && !partyCharacter.IsUpgrade1Insufficient;
                        availableUpgrade[1] = partyCharacter.IsUpgrade2Available && !partyCharacter.IsUpgrade2Insufficient;

                        if (!availableUpgrade[0] && !availableUpgrade[1])
                        {
                            continue;
                        }

                        int onlyPossibleIndex = -1;
                        if (availableUpgrade[0] && !availableUpgrade[1])
                        {
                            onlyPossibleIndex = 0;
                        }
                        if (!availableUpgrade[0] && availableUpgrade[1])
                        {
                            onlyPossibleIndex = 1;
                        }


                        int upgradePath;
                        if (onlyPossibleIndex == -1)
                        {
                            if (upgrade1LastTime)
                            {
                                upgradePath = 1;
                            }
                            else
                            {
                                upgradePath = 0;
                            }
                            upgrade1LastTime = !upgrade1LastTime;
                        }
                        else
                        {
                            upgradePath = onlyPossibleIndex;
                        }

                        PartyScreenLogic.PartyCommand partyCommand = new PartyScreenLogic.PartyCommand();
                        if (partyCharacter.Number == 1)
                        {
                            index--;
                        }
                        partyCommand.FillForUpgradeTroop(PartyScreenLogic.PartyRosterSide.Right, PartyScreenLogic.TroopType.Member, partyCharacter.Character, 1, (PartyScreenLogic.PartyCommand.UpgradeTargetType)upgradePath);
                        this._partyVM.CurrentCharacter = partyCharacter;
                        this._partyLogic.AddCommand(partyCommand);
                        num++;
                    }
                }
            }
            InformationManager.DisplayMessage(new InformationMessage("Upgraded " + num.ToString() + " soldiers."));
        }
Exemplo n.º 18
0
        public void UpgradeAllTroops(bool customOnly = false)
        {
            var currentlyUpgradingUnit = "";

            try
            {
                var upgrades = PartyVM?.MainPartyTroops?
                               .Where(x => !x.IsHero &&
                                      ((x.IsUpgrade1Available && !x.IsUpgrade1Insufficient) || (x.IsUpgrade2Available && !x.IsUpgrade2Insufficient))).ToList();

                var upgradesCount = 0;

                if (!PartyManagerSettings.Settings.DisableCustomUpgradePaths)

                {
                    var splitTroops    = PartyManagerSettings.Settings.SavedTroopUpgradePaths.Where(x => x.EvenSplit).Select(x => x.UnitName).ToList();
                    var customTroops   = PartyManagerSettings.Settings.SavedTroopUpgradePaths.Where(x => !x.EvenSplit).Select(x => x.UnitName).ToList();
                    var splitUpgrades  = upgrades.Where(x => splitTroops.Contains(x.Name.ToString())).ToList();
                    var customUpgrades = upgrades.Where(x => customTroops.Contains(x.Name.ToString())).ToList();
                    upgrades = upgrades.Where(x => !splitTroops.Contains(x.Name.ToString()) && !customTroops.Contains(x.Name.ToString())).ToList();

                    foreach (var troop in splitUpgrades)
                    {
                        currentlyUpgradingUnit = troop?.Character?.Name?.ToString();
                        var unitUpgrades = Math.Min(troop.NumOfTarget1UpgradesAvailable,
                                                    troop.NumOfTarget2UpgradesAvailable) / 2;
                        GenericHelpers.LogDebug("UpgradeAllTroops", $"Split {troop.Name.ToString()}: {unitUpgrades}");

                        var unitsUpgraded = false;

                        for (int i = 0; i < unitUpgrades; i++)
                        {
                            if (troop.IsUpgrade1Insufficient || troop.IsUpgrade2Insufficient || !troop.IsUpgrade1Available || !troop.IsUpgrade2Available)
                            {
                                break;
                            }

                            PartyScreenLogic.PartyCommand command1 = new PartyScreenLogic.PartyCommand();
                            PartyScreenLogic.PartyCommand command2 = new PartyScreenLogic.PartyCommand();
                            command1.FillForUpgradeTroop(PartyScreenLogic.PartyRosterSide.Right, troop.Type, troop.Character, 1,
                                                         PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget1);
                            var c1Valid = PartyScreenLogic.ValidateCommand(command1);
                            PartyScreenLogic.AddCommand(command1);


                            if (troop.IsUpgrade2Insufficient)
                            {
                                GenericHelpers.LogDebug("UpgradeAllTroops", $"Upgrade2 Insufficient");
                                break;
                            }

                            command2.FillForUpgradeTroop(PartyScreenLogic.PartyRosterSide.Right, troop.Type, troop.Character, 1,
                                                         PartyScreenLogic.PartyCommand.UpgradeTargetType.UpgradeTarget2);
                            var c2Valid = PartyScreenLogic.ValidateCommand(command1);
                            PartyScreenLogic.AddCommand(command2);
                            unitsUpgraded = true;
                        }



                        if (unitsUpgraded)
                        {
                            upgradesCount++;
                        }
                    }

                    foreach (var troop in customUpgrades)
                    {
                        currentlyUpgradingUnit = troop?.Character?.Name?.ToString();
                        var upgradePath = PartyManagerSettings.Settings.SavedTroopUpgradePaths
                                          .Where(x => x.UnitName == troop.Name.ToString())?.Select(x => x.TargetUpgrade).FirstOrDefault();

                        if (upgradePath == 0 && !troop.IsUpgrade1Insufficient)
                        {
                            UpgradeUnit(troop, true);
                            upgradesCount++;
                        }
                        else if (upgradePath == 1 && !troop.IsUpgrade2Insufficient)
                        {
                            UpgradeUnit(troop, false);
                            upgradesCount++;
                        }
                    }
                }

                if (!customOnly)
                {
                    //single upgrade units
                    var singleUpgrades = upgrades.Where(x => !(x.IsUpgrade1Exists && x.IsUpgrade2Exists)).ToList();

                    if (PartyManagerSettings.Settings.UpgradeTroopsUseWhitelist)
                    {
                        singleUpgrades = singleUpgrades.Where(x =>
                                                              PartyManagerSettings.Settings.UpgradeTroopsBlackWhiteList.Contains(x.Name)).ToList();
                    }
                    else
                    {
                        singleUpgrades = singleUpgrades.Where(x =>
                                                              !PartyManagerSettings.Settings.UpgradeTroopsBlackWhiteList.Contains(x.Name)).ToList();
                    }


                    foreach (var troop in singleUpgrades)
                    {
                        currentlyUpgradingUnit = troop?.Character?.Name?.ToString();
                        PartyScreenLogic.PartyCommand command = new PartyScreenLogic.PartyCommand();
                        if (troop.NumOfTarget1UpgradesAvailable > 0)
                        {
                            UpgradeUnit(troop, true);
                        }
                        else
                        {
                            UpgradeUnit(troop, false);
                        }

                        upgradesCount++;
                    }
                }

                if (upgradesCount > 0)
                {
                    GenericHelpers.LogDebug("UpgradeAllTroops", $"{upgradesCount} troops upgraded");
                    ButtonClickRefresh(true, false);
                }
                else
                {
                    GenericHelpers.LogMessage("No troops found to upgrade");
                }
            }
            catch (Exception ex)
            {
                GenericHelpers.LogException($"UpgradeAllTroops unittype({currentlyUpgradingUnit})", ex);
            }
        }