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