示例#1
0
            private static void Prefix(MapEvent __instance)
            {
                if (__instance.DefeatedSide is BattleSideEnum.None)
                {
                    return;
                }

                var loserBMs = __instance.PartiesOnSide(__instance.DefeatedSide)
                               .Where(p => p.Party?.MobileParty?.PartyComponent is ModBanditMilitiaPartyComponent ||
                                      !string.IsNullOrEmpty(p.Party?.MobileParty?.LeaderHero?.CharacterObject?.StringId) &&
                                      p.Party.MobileParty.LeaderHero.CharacterObject.StringId.Contains("Bandit_Militia"));

                foreach (var party in loserBMs)
                {
                    var heroes = party.Party.MemberRoster.RemoveIf(t => t.Character.IsHero).ToListQ();
                    for (var i = 0; i < heroes.Count; i++)
                    {
                        Mod.Log($">>> Killing {heroes[i].Character.Name} ({heroes[i].Character.StringId}) at FinishBattle.");
                        heroes[i].Character.HeroObject.RemoveMilitiaHero();
                    }

                    if (party.Party.MobileParty.LeaderHero is null)
                    {
                        party.Party.MobileParty.SetCustomName(new TextObject("Leaderless Bandit Militia"));
                    }

                    Helper.RemoveUndersizedTracker(party.Party);
                }

                Helper.DoPowerCalculations();
            }
示例#2
0
            private static void Prefix(MapEvent __instance)
            {
                var loserBMs = __instance.PartiesOnSide(__instance.DefeatedSide)
                               .Where(p => p.Party?.MobileParty?.PartyComponent is ModBanditMilitiaPartyComponent ||
                                      !string.IsNullOrEmpty(p.Party?.MobileParty?.LeaderHero?.CharacterObject?.StringId) &&
                                      p.Party.MobileParty.LeaderHero.CharacterObject.StringId.Contains("Bandit_Militia"));

                foreach (var party in loserBMs)
                {
                    var heroes = party.Party.MemberRoster.RemoveIf(t => t.Character.IsHero).ToListQ();
                    for (var i = 0; i < heroes.Count; i++)
                    {
                        Mod.Log($">>> Killing {heroes[i].Character.Name} at LootDefeatedParties.");
                        heroes[i].Character.HeroObject.RemoveMilitiaHero();
                    }

                    Helper.RemoveUndersizedTracker(party.Party);
                }

                Helper.DoPowerCalculations();
            }
        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;
            }
        }