using rjw.Modules.Interactions.Contexts; using rjw.Modules.Interactions.Enums; using rjw.Modules.Interactions.Objects; using rjw.Modules.Interactions.Rules.PartKindUsageRules; using rjw.Modules.Shared; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Verse; namespace rjwquirks.Modules.Interactions { public class QuirksPartKindUsageRule : IPartPreferenceRule { public IEnumerable> ModifiersForDominant(InteractionContext context) { return Enumerable.Concat( ModifierFromPawnQuirks(context.Internals.Dominant, context.Internals.Submissive), ModifierFromPartnerQuirks(context.Internals.Submissive, context.Internals.Dominant) ); } public IEnumerable> ModifiersForSubmissive(InteractionContext context) { return Enumerable.Concat( ModifierFromPawnQuirks(context.Internals.Submissive, context.Internals.Dominant), ModifierFromPartnerQuirks(context.Internals.Dominant, context.Internals.Submissive) ); } /// /// What pawn wants to use because of quirks /// private IEnumerable> ModifierFromPawnQuirks(InteractionPawn quirkOwner, InteractionPawn partner) { foreach (var comp in GetQuirkComps(quirkOwner.Pawn)) { foreach (var rule in comp.GetModifiersForPawn(quirkOwner, partner)) { yield return rule; } } } /// /// What pawn want from partner because of pawn's quirks /// private IEnumerable> ModifierFromPartnerQuirks(InteractionPawn quirkOwner, InteractionPawn partner) { foreach (var comp in GetQuirkComps(quirkOwner.Pawn)) { foreach (var rule in comp.GetModifiersForPartner(quirkOwner, partner)) { yield return rule; } } } private IEnumerable GetQuirkComps(Pawn pawn) { foreach (var comp in pawn.GetQuirks().AllQuirks.SelectMany(quirk => quirk.def.GetComps())) { yield return comp; } } } }