示例#1
0
        private bool IsDefeatedBanditLike(MapEvent m)
        {
            try
            {
                if (m.GetLeaderParty(m.DefeatedSide).MapFaction.IsBanditFaction&& KBRRModLibSettings.Instance.IncludeBandits)
                {
                    return(true);
                }

                if (m.GetLeaderParty(m.DefeatedSide).MapFaction.IsOutlaw&& KBRRModLibSettings.Instance.IncludeOutlaws)
                {
                    return(true);
                }

                if (m.GetLeaderParty(m.DefeatedSide).Owner.Clan.IsMafia&& KBRRModLibSettings.Instance.IncludeMafia)
                {
                    return(true);
                }
            }

            catch (Exception ex)
            {
                //Avoids crash for parties without an owner set
            }
            return(false);
        }
 public BattleHistoryEntry(MapEvent battle, CampaignTime endTime)
 {
     Attacker = battle.GetLeaderParty(BattleSideEnum.Attacker);
     Defender = battle.GetLeaderParty(BattleSideEnum.Defender);
     Type     = battle.EventType;
     State    = battle.BattleState;
     Time     = endTime;
 }
示例#3
0
        public void MergeNearbyBanditsAfterBanditFight(MapEvent m)
        {
            if (!m.GetLeaderParty(m.DefeatedSide).MapFaction.IsBanditFaction || !Settings.Instance.MergeEnabled)
            {
                return;
            }

            var banditSide = m.PlayerSide == BattleSideEnum.Attacker ? m.DefenderSide : m.AttackerSide;

            BanditDeathCounter += banditSide.Casualties;

            InformationManager.DisplayMessage(new InformationMessage("Bandit Casualties: " + BanditDeathCounter,
                                                                     Color.Black));

            var nearbyBanditParties = MobileParty.All.ToList().FindAll(i =>
                                                                       i.IsBandit &&
                                                                       i.Party.NumberOfAllMembers > 0 &&
                                                                       i.Party.NumberOfAllMembers <= Settings.Instance.BanditNumber &&
                                                                       i.Party.Culture.StringId == banditSide.LeaderParty.Culture.StringId &&
                                                                       i.MapEvent == null &&
                                                                       i.Position2D.DistanceSquared(m.Position) <= Settings.Instance.Radius)
                                      .OrderBy(o => o.Party.TotalStrength).Take(2).ToList();

            if (nearbyBanditParties.Count < 2)
            {
                return;
            }

            MobileParty temp = null;

            foreach (var mp in nearbyBanditParties)
            {
                if (temp != null)
                {
                    InformationManager.DisplayMessage(new InformationMessage(
                                                          $"{mp.Party.Culture} has increase {temp.Party.NumberOfAllMembers} mans",
                                                          Color.FromUint(4282569842U)));
                    MergePartiesAction.Apply(mp.Party, temp.Party);
                    temp = null;
                }
                else
                {
                    temp = mp;
                }
            }

            ResetBanditDeathCounter();
        }
        private void OnMapEventEnded(MapEvent mapEvent)
        {
            if (mapEvent.EventType == MapEvent.BattleTypes.None)
            {
                return;
            }

            var attacker = mapEvent.GetLeaderParty(BattleSideEnum.Attacker);
            var defender = mapEvent.GetLeaderParty(BattleSideEnum.Defender);

            var attackers = mapEvent.PartiesOnSide(BattleSideEnum.Attacker).Where(a => a != attacker).ToList();
            var defenders = mapEvent.PartiesOnSide(BattleSideEnum.Defender).Where(d => d != defender).ToList();

            switch (mapEvent.WinningSide)
            {
            // If you attack groups larger than you, the same thing with the [Daring] trait.
            case BattleSideEnum.Attacker:
            {
                var hero = attacker.LeaderHero;
                if (hero == null)
                {
                    break;
                }

                var multiplier = hero.Clan.IsUnderMercenaryService
                        ? MercenarySettings.Instance.MercenaryMultiplier
                        : MercenarySettings.Instance.VassalMultiplier;

                var ratio = (mapEvent.StrengthOfSide[0] / mapEvent.StrengthOfSide[1]) - 1f;

                var value = 0;
                if (ratio >= 0.33f)
                {
                    value = 1;
                }
                else if (ratio >= 0.66f)
                {
                    value = 2;
                }
                else if (ratio >= 0.99f)
                {
                    value = 3;
                }
                if (value == 0)
                {
                    break;
                }

                foreach (var kingdomHero in hero.Clan.Kingdom.Heroes)
                {
                    var valor = kingdomHero.GetTraitLevel(DefaultTraits.Valor);
                    if (valor > 0)
                    {
                        AragasChangeRelationAction.ApplyRelation(
                            hero,
                            kingdomHero,
                            value * multiplier * valor,
                            MercenarySettings.Instance.TraitCap,
                            true);
                    }
                }

                break;
            }

            // Helping out other parties in battles, positive rep with people with the [Generous] trait.
            case BattleSideEnum.Defender:
            {
                var ratio = (attacker.TotalStrength / defender.TotalStrength) - 1f;

                var value = 0;
                if (ratio >= 0.33f)
                {
                    value = 1;
                }
                else if (ratio >= 0.66f)
                {
                    value = 2;
                }
                else if (ratio >= 0.99f)
                {
                    value = 3;
                }
                if (value == 0)
                {
                    break;
                }

                if (_partiedJoinedMapEvent.TryGetValue(mapEvent, out var parties))
                {
                    foreach (var partyBase in parties)
                    {
                        var joinedHero = partyBase.LeaderHero;
                        if (joinedHero == null)
                        {
                            continue;
                        }

                        var contributionRate = mapEvent.AttackerSide.GetPartyContributionRate(partyBase);
                        if (contributionRate < 0.3f)
                        {
                            continue;
                        }

                        var multiplier = joinedHero.Clan.IsUnderMercenaryService
                                ? MercenarySettings.Instance.MercenaryMultiplier
                                : MercenarySettings.Instance.VassalMultiplier;

                        var otherHeroesNotJoined = defenders
                                                   .Where(p => !parties.Contains(p))
                                                   .Select(p => p.LeaderHero)
                                                   .Where(h => h != null)
                                                   .ToList();

                        foreach (var notJoinedHero in otherHeroesNotJoined)
                        {
                            var generosity = notJoinedHero.GetTraitLevel(DefaultTraits.Generosity);
                            if (generosity > 0)
                            {
                                AragasChangeRelationAction.ApplyRelation(
                                    joinedHero,
                                    notJoinedHero,
                                    value * multiplier * generosity,
                                    MercenarySettings.Instance.HelpedDefenderCap,
                                    true);
                            }
                        }
                    }
                }
                break;
            }

            case BattleSideEnum.None:
            case BattleSideEnum.NumSides:
                break;
            }

            // Clean up storage after event ended
            if (_partiedJoinedMapEvent.TryGetValue(mapEvent, out var list))
            {
                _partiedJoinedMapEvent.Remove(mapEvent);
                list.Clear();
                list = null;
            }
        }