Initial upload

This commit is contained in:
Matthew 2022-11-01 12:15:06 -04:00
parent feb28b10a4
commit 7585da099c
106 changed files with 4860 additions and 0 deletions

View file

@ -0,0 +1,25 @@
using rjw;
using System.Collections.Generic;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class BySextype : SexSelector
{
public xxx.rjwSextype sextype = xxx.rjwSextype.None;
public override bool SexSatisfies(SexProps sexProps) => sexProps.hasPartner() && sexProps.sexType == sextype;
public override IEnumerable<string> ConfigErrors()
{
foreach (string error in base.ConfigErrors())
{
yield return error;
}
if (sextype == xxx.rjwSextype.None)
{
yield return "<sextype> is not filled or has value \"None\"";
}
}
}
}

View file

@ -0,0 +1,9 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class CanBeImpregnated : SexSelector
{
public override bool SexSatisfies(SexProps sexProps) => sexProps.hasPartner() && PregnancyHelper.CanImpregnate(sexProps.partner, sexProps.pawn, sexProps.sexType);
}
}

View file

@ -0,0 +1,9 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class CanImpregnate : SexSelector
{
public override bool SexSatisfies(SexProps sexProps) => sexProps.hasPartner() && PregnancyHelper.CanImpregnate(sexProps.pawn, sexProps.partner, sexProps.sexType);
}
}

View file

@ -0,0 +1,9 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class Clothed : SexSelector
{
public override bool SexSatisfies(SexProps sexProps) => !sexProps.pawn.apparel.PsychologicallyNude;
}
}

View file

@ -0,0 +1,10 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public interface ISexSelector : Shared.IDefPart
{
void SetParent(QuirkDef quirkDef);
bool SexSatisfies(SexProps sexProps);
}
}

View file

@ -0,0 +1,20 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class LogicalAnd : LogicalMultipart
{
public override bool SexSatisfies(SexProps sexProps)
{
for (int i = 0; i < parts.Count; i++)
{
if (!parts[i].SexSatisfies(sexProps))
{
return false;
}
}
return true;
}
}
}

View file

@ -0,0 +1,36 @@
using System.Collections.Generic;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public abstract class LogicalMultipart : SexSelector
{
public List<ISexSelector> parts = new List<ISexSelector>();
public override void SetParent(QuirkDef quirkDef)
{
base.SetParent(quirkDef);
parts.ForEach(selector => selector.SetParent(quirkDef));
}
public override IEnumerable<string> ConfigErrors()
{
foreach (string error in base.ConfigErrors())
{
yield return error;
}
if (parts.Count < 2)
{
yield return "<parts> should have at least 2 elements";
}
foreach (var part in parts)
{
foreach (string error in part.ConfigErrors())
{
yield return error;
}
}
}
}
}

View file

@ -0,0 +1,39 @@
using rjw;
using System.Collections.Generic;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class LogicalNot : SexSelector
{
public ISexSelector negated;
public override bool SexSatisfies(SexProps sexProps) => !negated.SexSatisfies(sexProps);
public override void SetParent(QuirkDef quirkDef)
{
base.SetParent(quirkDef);
negated.SetParent(quirkDef);
}
public override IEnumerable<string> ConfigErrors()
{
foreach (string error in base.ConfigErrors())
{
yield return error;
}
if (negated == null)
{
yield return "<negated> is empty";
}
else
{
foreach (string error in negated.ConfigErrors())
{
yield return error;
}
}
}
}
}

View file

@ -0,0 +1,20 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class LogicalOr : LogicalMultipart
{
public override bool SexSatisfies(SexProps sexProps)
{
for (int i = 0; i < parts.Count; i++)
{
if (parts[i].SexSatisfies(sexProps))
{
return true;
}
}
return false;
}
}
}

View file

@ -0,0 +1,23 @@
using rjw;
using Verse;
using Verse.AI;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class Seen : SexSelector
{
// Current implementation works only if somebody sees pawn exactly at the moment quirks are evaluated
public override bool SexSatisfies(SexProps sexProps) => sexProps.hasPartner() && SexSeen(sexProps);
public static bool SexSeen(SexProps sexProps)
{
bool isZoophile = xxx.is_zoophile(sexProps.pawn);
return sexProps.pawn.Map.mapPawns.AllPawnsSpawned.Any(x =>
x != sexProps.pawn
&& x != sexProps.partner
&& !x.Dead
&& (isZoophile || !xxx.is_animal(x))
&& x.CanSee(sexProps.pawn));
}
}
}

View file

@ -0,0 +1,19 @@
using rjw;
using System.Collections.Generic;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public abstract class SexSelector : ISexSelector
{
protected QuirkDef parentDef;
public abstract bool SexSatisfies(SexProps sexProps);
public virtual void SetParent(QuirkDef quirkDef) => parentDef = quirkDef;
public virtual IEnumerable<string> ConfigErrors()
{
yield break;
}
}
}

View file

@ -0,0 +1,9 @@
using rjw;
namespace rjwquirks.Modules.Quirks.SexSelectors
{
public class WithPreferedPartner : SexSelector
{
public override bool SexSatisfies(SexProps sexProps) => sexProps.hasPartner() && parentDef.partnerPreference?.PartnerSatisfies(sexProps.pawn, sexProps.partner) == true;
}
}