rjw-quirks/RJW-Quirks/Modules/Interactions/QuirksPartKindUsageRule.cs

72 lines
2.5 KiB
C#

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<Weighted<LewdablePartKind>> ModifiersForDominant(InteractionContext context)
{
return Enumerable.Concat(
ModifierFromPawnQuirks(context.Internals.Dominant, context.Internals.Submissive),
ModifierFromPartnerQuirks(context.Internals.Submissive, context.Internals.Dominant)
);
}
public IEnumerable<Weighted<LewdablePartKind>> ModifiersForSubmissive(InteractionContext context)
{
return Enumerable.Concat(
ModifierFromPawnQuirks(context.Internals.Submissive, context.Internals.Dominant),
ModifierFromPartnerQuirks(context.Internals.Dominant, context.Internals.Submissive)
);
}
/// <summary>
/// What pawn wants to use because of quirks
/// </summary>
private IEnumerable<Weighted<LewdablePartKind>> ModifierFromPawnQuirks(InteractionPawn quirkOwner, InteractionPawn partner)
{
foreach (var comp in GetQuirkComps(quirkOwner.Pawn))
{
foreach (var rule in comp.GetModifiersForPawn(quirkOwner, partner))
{
yield return rule;
}
}
}
/// <summary>
/// What pawn want from partner because of pawn's quirks
/// </summary>
private IEnumerable<Weighted<LewdablePartKind>> 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<Quirks.Comps.PartKindUsageRules> GetQuirkComps(Pawn pawn)
{
foreach (var comp in pawn.GetQuirks().AllQuirks.SelectMany(quirk => quirk.def.GetComps<Quirks.Comps.PartKindUsageRules>()))
{
yield return comp;
}
}
}
}