code:
using Verse;
using Verse.AI.Group;

namespace rjw
{
	public class Trigger_SexSatisfy : TriggerFilter
	{
		private const int CheckInterval = 120;
		private const int TickTimeout = 900;
		private int currentTick = 0;
		public float targetValue = 0.3f;

		public Trigger_SexSatisfy(float t)
		{
			this.targetValue = t;
			currentTick = 0;
		}

		public override bool AllowActivation(Lord lord, TriggerSignal signal)
		{
			currentTick++;
			if (signal.type == TriggerSignalType.Tick && Find.TickManager.TicksGame % CheckInterval == 0)
			{
				float? avgValue = null;
				foreach (var pawn in lord.ownedPawns)
				{
					/*foreach(Pawn p in lord.Map.mapPawns.PawnsInFaction(Faction.OfPlayer))
					{
					}*/
					Need_Sex n = pawn.needs.TryGetNeed<Need_Sex>();
					//if (n != null && pawn.gender == Gender.Male && !pawn.Downed)
					if(xxx.can_rape(pawn) && (xxx.is_healthy_enough(pawn) && xxx.IsTargetPawnOkay(pawn) || !xxx.is_human(pawn)) && Find.TickManager.TicksGame > pawn.mindState.canLovinTick)
					{
						avgValue = (avgValue == null) ? n.CurLevel : (avgValue + n.CurLevel) / 2f;
					}
				}
				//--Log.Message("[ABF]Trigger_SexSatisfy::ActivateOn Checked value :" + avgValue + "/" + targetValue);
				return avgValue == null || avgValue >= targetValue;
			}
			return currentTick >= TickTimeout;
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape a comfort prisoner
	/// </summary>
	public class WorkGiver_BestialityF : WorkGiver_RJW_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			if (!RJWSettings.rape_enabled) return false;

			Pawn target = t as Pawn;
			if (!RJWSettings.WildMode)
			{
				if (xxx.is_kind(pawn))
				{
					JobFailReason.Is("refuses to rape");
					return false;
				}
				//satisfied pawns
				//horny non rapists
				if ((xxx.need_some_sex(pawn) <= 1f)
					|| (xxx.need_some_sex(pawn) <= 2f && !(xxx.is_rapist(pawn) || xxx.is_psychopath(pawn) || xxx.is_nympho(pawn))))
					{
						JobFailReason.Is("not horny enough");
						return false;
					}
				if (!target.IsDesignatedComfort())
				{
					//JobFailReason.Is("not designated as CP", null);
					return false;
				}
				if (!xxx.is_healthy_enough(target)
					|| !xxx.is_not_dying(target) && (xxx.is_bloodlust(pawn) || xxx.is_psychopath(pawn) || xxx.is_rapist(pawn) || xxx.has_quirk(pawn, "Somnophile")))
				{
					//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called0 - target isn't healthy enough or is in a forbidden position.");
					JobFailReason.Is("target not healthy enough");
					return false;
				}
				if (pawn.relations.OpinionOf(target) > 50 && !xxx.is_rapist(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_masochist(target))
				{
					JobFailReason.Is("refuses to rape a friend");
					return false;
				}
				if (!xxx.can_rape(pawn))
				{
					//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called1 - pawn don't need sex or is not healthy, or cannot rape");
					JobFailReason.Is("cannot rape target (vulnerability too low, or age mismatch)");
					return false;
				}
				if (!xxx.isSingleOrPartnerNotHere(pawn) && !xxx.is_lecher(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_nympho(pawn))
					if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, target))
					{
						//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called2 - pawn is not single or has partner around");
						JobFailReason.Is("cannot rape while in stable relationship");
						return false;
					}
			}

			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			//Log.Message("[RJW]" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			//--Log.Message("[RJW]WorkGiver_RapeCP::JobOnThing(" + xxx.get_pawnname(pawn) + "," + t.ToStringSafe() + ") is called.");
			return new Job(xxx.comfort_prisoner_rapin, t);
		}
	}
}

repo_name: ElToro/rjw

license: mit


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to breed animal(passive)
	/// </summary>
	public class WorkGiver_BestialityForFemale : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + ":: base checks: pass");
			if (!RJWSettings.bestiality_enabled) return false;

			Pawn target = t as Pawn;
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.can_be_fucked(pawn))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("pawn cant be fucked");
				return false;
			}

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (!xxx.is_zoophile(pawn) && !xxx.is_frustrated(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not willing to have sex with animals");
						return false;
					}
					if (!xxx.is_hornyorfrustrated(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
						return false;
					}
					if (!xxx.is_healthy_enough(target))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("target not healthy enough");
						return false;
					}

					//ModLog.Message("WorkGiver_BestialityForFemale::" + SexAppraiser.would_fuck_animal(pawn, target));
					if (SexAppraiser.would_fuck_animal(pawn, target) < 0.1f)
					{
						return false;
					}
					//add some more fancy conditions from JobGiver_Bestiality?
				}

			//ModLog.Message("" + this.GetType().ToString() + ":: extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (!xxx.is_animal(target))
			{
				return false;
			}
			Building_Bed bed = pawn.ownership.OwnedBed;
			if (bed == null)
			{
				if (RJWSettings.DevMode) JobFailReason.Is("pawn has no bed");
				return false;
			}
			if (!target.CanReach(bed, PathEndMode.OnCell, Danger.Some) || target.Downed)
			{
				if (RJWSettings.DevMode) JobFailReason.Is("target cant reach bed");
				return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			Building_Bed bed = pawn.ownership.OwnedBed;
			return JobMaker.MakeJob(xxx.bestialityForFemale, t, bed);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to breed animal(active)
	/// </summary>
	public class WorkGiver_BestialityForMale : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			if (!RJWSettings.bestiality_enabled) return false;

			Pawn target = t as Pawn;
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.can_be_fucked(target))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("target cant be fucked");
				return false;
			}

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (!xxx.is_zoophile(pawn) && !xxx.is_frustrated(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not willing to have sex with animals");
						return false;
					}
					if (!xxx.is_hornyorfrustrated(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
						return false;
					}
					if (!xxx.is_healthy_enough(target)
						|| !xxx.is_not_dying(target) && (xxx.is_bloodlust(pawn) || xxx.is_psychopath(pawn) || xxx.has_quirk(pawn, "Somnophile")))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("target not healthy enough");
						return false;
					}

					//ModLog.Message("WorkGiver_BestialityForMale::" + SexAppraiser.would_fuck_animal(pawn, target));
					if (SexAppraiser.would_fuck_animal(pawn, target) < 0.1f)
					{
						return false;
					}
					//add some more fancy conditions from JobGiver_Bestiality?
				}

			//ModLog.Message("" + this.GetType().ToString() + ":: extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (!xxx.is_animal(target))
			{
				return false;
			}
			if (!xxx.can_fuck(pawn))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("cant fuck");
				return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.bestiality, t);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape a comfort prisoner
	/// </summary>
	public class WorkGiver_BestialityM : WorkGiver_RJW_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			if (!RJWSettings.rape_enabled) return false;

			Pawn target = t as Pawn;
			if (!RJWSettings.WildMode)
			{
				if (xxx.is_kind(pawn))
				{
					JobFailReason.Is("refuses to rape");
					return false;
				}
				//satisfied pawns
				//horny non rapists
				if ((xxx.need_some_sex(pawn) <= 1f)
					|| (xxx.need_some_sex(pawn) <= 2f && !(xxx.is_rapist(pawn) || xxx.is_psychopath(pawn) || xxx.is_nympho(pawn))))
					{
						JobFailReason.Is("not horny enough");
						return false;
					}
				if (!target.IsDesignatedComfort())
				{
					//JobFailReason.Is("not designated as CP", null);
					return false;
				}
				if (!xxx.is_healthy_enough(target)
					|| !xxx.is_not_dying(target) && (xxx.is_bloodlust(pawn) || xxx.is_psychopath(pawn) || xxx.is_rapist(pawn) || xxx.has_quirk(pawn, "Somnophile")))
				{
					//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called0 - target isn't healthy enough or is in a forbidden position.");
					JobFailReason.Is("target not healthy enough");
					return false;
				}
				if (pawn.relations.OpinionOf(target) > 50 && !xxx.is_rapist(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_masochist(target))
				{
					JobFailReason.Is("refuses to rape a friend");
					return false;
				}
				if (!xxx.can_rape(pawn))
				{
					//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called1 - pawn don't need sex or is not healthy, or cannot rape");
					JobFailReason.Is("cannot rape target (vulnerability too low, or age mismatch)");
					return false;
				}
				if (!xxx.isSingleOrPartnerNotHere(pawn) && !xxx.is_lecher(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_nympho(pawn))
					if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, target))
					{
						//--Log.Message("[RJW]WorkGiver_RapeCP::HasJobOnThing called2 - pawn is not single or has partner around");
						JobFailReason.Is("cannot rape while in stable relationship");
						return false;
					}
			}

			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			//Log.Message("[RJW]" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			//--Log.Message("[RJW]WorkGiver_RapeCP::JobOnThing(" + xxx.get_pawnname(pawn) + "," + t.ToStringSafe() + ") is called.");
			return new Job(xxx.comfort_prisoner_rapin, t);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to cleanup/collect sex fluids
	/// </summary>
	//TODO: add sex fluid collection/cleaning
	public class WorkGiver_CleanSexStuff : WorkGiver_Sexchecks
	{
		public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.filth);

		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			return false;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return null;
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;
using System.Linq;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to fap in bed
	/// </summary>
	public class WorkGiver_Masturbate_Bed : WorkGiver_Sexchecks
	{
		public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial);

		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			if (pawn.Position == t.Position)
			{
				//use quickfap
				return false;
			}
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			Building_Bed target = t as Building_Bed;
			if (!(target is Building_Bed))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("not a bed");
				return false;
			}
			if (!pawn.CanReserve(target))
			{
				//if (RJWSettings.DevMode) JobFailReason.Is("not a bed");
				return false;
			}

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (!target.OwnersForReading.Contains(pawn) && !xxx.is_psychopath(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not my bed");
						return false;
					}
					if (!xxx.is_nympho(pawn))
						if (!xxx.is_hornyorfrustrated(pawn))
						{
							if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
							return false;
						}
					if (target.CurOccupants.Count() != 0)
					{
						if (target.CurOccupants.Count() == 1 && !target.CurOccupants.Contains(pawn))
						{
							if (RJWSettings.DevMode) JobFailReason.Is("bed not empty");
							return false;
						}
						if (target.CurOccupants.Count() > 1)
						{
							if (RJWSettings.DevMode) JobFailReason.Is("bed not empty");
							return false;
						}
					}

					//TODO: more exhibitionsts checks?
					bool canbeseen = false;
					foreach (Pawn bystander in pawn.Map.mapPawns.AllPawnsSpawned.Where(x => xxx.is_human(x) && x != pawn))
					{
						// dont see through walls, dont see whole map, only 15 cells around
						if (bystander.CanSee(target) && bystander.Position.DistanceTo(target.Position) < 15)
						{
							//if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, bystander))
							canbeseen = true;
						}
					}
					if (!xxx.has_quirk(pawn, "Exhibitionist") && canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can be seen");
						return false;
					}
					if (xxx.has_quirk(pawn, "Exhibitionist") && !canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can not be seen");
						return false;
					}
				}

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.Masturbate, null, t, t.Position);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;
using System.Linq;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to fap in chair
	/// </summary>
	public class WorkGiver_Masturbate_Chair : WorkGiver_Sexchecks
	{
		public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial);

		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			if (pawn.Position == t.Position)
			{
				//use quickfap
				return false;
			}
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			Building target = t as Building;
			if (!(target is Building))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("not a building");
				return false;
			}
			if (!(target.def.building.isSittable))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("not a sittable building");
				return false;
			}
			if (!pawn.CanReserve(target))
			{
				//if (RJWSettings.DevMode) JobFailReason.Is("not a bed");
				return false;
			}

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (!xxx.is_nympho(pawn))
						if (!xxx.is_hornyorfrustrated(pawn))
						{
							if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
							return false;
						}

					//TODO: more exhibitionsts checks?
					bool canbeseen = false;
					foreach (Pawn bystander in pawn.Map.mapPawns.AllPawnsSpawned.Where(x => xxx.is_human(x) && x != pawn))
					{
						// dont see through walls, dont see whole map, only 15 cells around
						if (bystander.CanSee(target) && bystander.Position.DistanceTo(target.Position) < 15)
						{
							//if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, bystander))
							canbeseen = true;
						}
					}
					if (!xxx.has_quirk(pawn, "Exhibitionist") && canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can be seen");
						return false;
					}
					if (xxx.has_quirk(pawn, "Exhibitionist") && !canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can not be seen");
						return false;
					}
				}

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.Masturbate, null, t, t.Position);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;
using System.Linq;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to fap
	/// </summary>
	public class WorkGiver_Masturbate : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			Pawn target = t as Pawn;
			if (target != pawn)
			{
				return false;
			}

			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (!xxx.is_nympho(pawn))
						if (!xxx.is_hornyorfrustrated(pawn))
						{
							if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
							return false;
						}

					//TODO: more exhibitionsts checks?
					bool canbeseen = false;
					foreach (Pawn bystander in pawn.Map.mapPawns.AllPawnsSpawned.Where(x => xxx.is_human(x) && x != pawn))
					{
						// dont see through walls, dont see whole map, only 15 cells around
						if (pawn.CanSee(bystander) && pawn.Position.DistanceTo(bystander.Position) < 15)
						{
							//if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, bystander))
							canbeseen = true;
						}
					}
					if (!xxx.has_quirk(pawn, "Exhibitionist") && canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can be seen");
						return false;
					}
					if (xxx.has_quirk(pawn, "Exhibitionist") && !canbeseen)
					{
						if (RJWSettings.DevMode) JobFailReason.Is("can not be seen");
						return false;
					}
				}
			//experimental change textures of bed to whore bed
			//ModLog.Message(" bed " + t.GetType().ToString() + " path " + t.Graphic.data.texPath);
			//t.Graphic.data.texPath = "Things/Building/Furniture/Bed/DoubleBedWhore";
			//t.Graphic.path = "Things/Building/Furniture/Bed/DoubleBedWhore";
			//t.DefaultGraphic.data.texPath = "Things/Building/Furniture/Bed/DoubleBedWhore";
			//t.DefaultGraphic.path = "Things/Building/Furniture/Bed/DoubleBedWhore";
			//ModLog.Message(" bed " + t.GetType().ToString() + " texPath " + t.Graphic.data.texPath);
			//ModLog.Message(" bed " + t.GetType().ToString() + " drawSize " + t.Graphic.data.drawSize);
			//t.Draw();
			//t.ExposeData();
			//Scribe_Values.Look(ref t.Graphic.data.texPath, t.Graphic.data.texPath, "Things/Building/Furniture/Bed/DoubleBedWhore", true);

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.Masturbate, null, null, t.Position);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape
	/// </summary>
	public class WorkGiver_Quickie : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{

			Pawn target = t as Pawn;
			if (target == pawn)
			{
				//JobFailReason.Is("no self rape", null);
				return false;
			}
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.is_human(target))
			{
				return false;
			}

			if(target.GetPosture() == PawnPosture.LayingInBed)
			{
				return false;
			}
			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				return false;
			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (pawn.HostileTo(target))
			{
				return false;
			}
			return true;
		}
		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.quick_sex, t as Pawn);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape
	/// </summary>
	public class WorkGiver_Rape : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			if (RJWSettings.DebugRape) ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			if (!RJWSettings.rape_enabled) return false;

			Pawn target = t as Pawn;
			if (target == pawn)
			{
				//JobFailReason.Is("no self rape", null);
				return false;
			}
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.is_human(target))
			{
				return false;
			}
			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (xxx.is_kind(pawn) || xxx.is_masochist(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("refuses to rape");
						return false;
					}
					if (pawn.relations.OpinionOf(target) > 50 && !xxx.is_rapist(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_masochist(target))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("refuses to rape a friend");
						return false;
					}
					if (!xxx.can_get_raped(target))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("cannot rape target");
						return false;
					}
					//fail for:
					//satisfied pawns
					//horny non rapists
					if ((xxx.need_some_sex(pawn) <= 1f)
						|| (xxx.need_some_sex(pawn) <= 2f && !(xxx.is_rapist(pawn) || xxx.is_psychopath(pawn) || xxx.is_nympho(pawn))))
						{
						if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
							return false;
						}
					if (!xxx.can_rape(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("cannot rape");
						return false;
					}
					if (!xxx.is_healthy_enough(target)
						|| !xxx.is_not_dying(target) && (xxx.is_bloodlust(pawn) || xxx.is_psychopath(pawn) || xxx.is_rapist(pawn) || xxx.has_quirk(pawn, "Somnophile")))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("target not healthy enough");
						return false;
					}
					if (!xxx.is_lecher(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_nympho(pawn))
						if (!xxx.isSingleOrPartnerNotHere(pawn))
							if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, target))
							{
								if (RJWSettings.DevMode) JobFailReason.Is("cannot rape while partner around");
								return false;
							}
					//ModLog.Message("WorkGiver_RapeCP::" + SexAppraiser.would_fuck(pawn, target));
					if (SexAppraiser.would_fuck(pawn, target) < 0.1f)
					{
						return false;
					}
				}

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (pawn.HostileTo(target) || target.IsDesignatedComfort())
			{
				return false;
			}
			return true;
		}
		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.RapeRandom, t);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape a comfort prisoner
	/// </summary>
	public class WorkGiver_RapeCP : WorkGiver_Rape
	{
		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (!target.IsDesignatedComfort())
			{
				if (RJWSettings.DevMode) JobFailReason.Is("not designated for comfort", null);
					return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.RapeCP, t);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape enemy
	/// </summary>
	public class WorkGiver_RapeEnemy : WorkGiver_Rape
	{
		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (!pawn.HostileTo(target))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("not hostile", null);
					return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.RapeEnemy, t);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to have sex with
	/// </summary>
	public class WorkGiver_Sex : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");

			Pawn target = t as Pawn;
			if (target == pawn)
			{
				//JobFailReason.Is("no self sex", null);
				return false;
			}
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.is_human(target))
			{
				return false;
			}
			if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
				return false;

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					//check initiator
					//fail for:
					//satisfied non nymph pawns
					if (xxx.need_some_sex(pawn) <= 1f && !xxx.is_nympho(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
						return false;
					}
					if (!xxx.IsTargetPawnOkay(target))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("target not healthy enough");
						return false;
					}
					if (!xxx.is_lecher(pawn) && !xxx.is_psychopath(pawn) && !xxx.is_nympho(pawn))
						if (!xxx.isSingleOrPartnerNotHere(pawn))
							if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, target))
							{
								if (RJWSettings.DevMode) JobFailReason.Is("cannot have sex while partner around");
								return false;
							}

					float relations = 0;
					float attraction = 0;
					if (!xxx.is_animal(target))
					{
						relations = pawn.relations.OpinionOf(target);
						if (relations < RJWHookupSettings.MinimumRelationshipToHookup)
						{
							if (!(relations > 0 && xxx.is_nympho(pawn)))
							{
								if (RJWSettings.DevMode) JobFailReason.Is($"i don't like them:({relations})");
								return false;
							}
						}

						attraction = pawn.relations.SecondaryRomanceChanceFactor(target);
						if (attraction < RJWHookupSettings.MinimumAttractivenessToHookup)
						{
							if (!(attraction > 0 && xxx.is_nympho(pawn)))
							{
								if (RJWSettings.DevMode) JobFailReason.Is($"i don't find them attractive:({attraction})");
								return false;
							}
						}
					}
					//ModLog.Message("WorkGiver_Sex::" + SexAppraiser.would_fuck(pawn, target));
					if (SexAppraiser.would_fuck(pawn, target) < 0.1f)
					{
						return false;
					}

					if (!xxx.is_animal(target))
					{
						//check partner
						if (xxx.need_some_sex(target) <= 1f && !xxx.is_nympho(target))
						{
							if (RJWSettings.DevMode) JobFailReason.Is("partner not horny enough");
							return false;
						}
						if (!xxx.is_lecher(target) && !xxx.is_psychopath(target) && !xxx.is_nympho(target))
							if (!xxx.isSingleOrPartnerNotHere(target))
								if (!LovePartnerRelationUtility.LovePartnerRelationExists(pawn, target))
								{
									if (RJWSettings.DevMode) JobFailReason.Is("partner cannot have sex while their partner around");
									return false;
								}

						relations = target.relations.OpinionOf(pawn);
						if (relations <= RJWHookupSettings.MinimumRelationshipToHookup)
						{
							if (!(relations > 0 && xxx.is_nympho(target)))
							{
								if (RJWSettings.DevMode) JobFailReason.Is($"don't like me:({relations})");
								return false;
							}
						}

						attraction = target.relations.SecondaryRomanceChanceFactor(pawn);
						if (attraction <= RJWHookupSettings.MinimumAttractivenessToHookup)
						{
							if (!(attraction > 0 && xxx.is_nympho(target)))
							{
								if (RJWSettings.DevMode) JobFailReason.Is($"doesn't find me attractive:({attraction})");
								return false;
							}
						}
					}

					//ModLog.Message("WorkGiver_Sex::" + SexAppraiser.would_fuck(target, pawn));
					if (SexAppraiser.would_fuck(target, pawn) < 0.1f)
					{
						return false;
					}
				}

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (pawn.HostileTo(target) || target.IsDesignatedComfort())
			{
				return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			//TODO:: fix bed stealing during join other pawn
			//Building_Bed bed = pawn.ownership.OwnedBed;
			//if (bed == null)
			//	bed = (t as Pawn).ownership.OwnedBed;

			Building_Bed bed = (t as Pawn).CurrentBed();

			if (bed == null)
				return null;

			//if (pawn.CurrentBed() != (t as Pawn).CurrentBed())
			//	return null;

			return JobMaker.MakeJob(xxx.casual_sex, t as Pawn, bed);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;
using Multiplayer.API;

namespace rjw
{
	/// <summary>
	/// Allow pawn to have sex
	/// dunno if this should be used to allow manual sex start or limit it behind sort of "hero" designator for RP purposes, so player can only control 1 pawn directly?
	/// </summary>
	public class WorkGiver_Sexchecks : WorkGiver_Scanner
	{
		public override int MaxRegionsToScanBeforeGlobalSearch => 4;
		public override PathEndMode PathEndMode => PathEndMode.OnCell;
		public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.Pawn);

		public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			if (!forced)
			//if (!(forced || RJWSettings.WildMode))
			{
				//ModLog.Message("WorkGiver_RJW_Sexchecks::not player interaction, exit:" + forced);
				return false;
			}
			var isHero = RJWSettings.RPG_hero_control && pawn.IsDesignatedHero();
			if (!(RJWSettings.override_control || isHero))
			{
				//ModLog.Message("WorkGiver_RJW_Sexchecks::direct_control disabled or not hero, exit");
				return false;
			}
			//!
			if (!isHero)
			{
				if (!RJWSettings.override_control || MP.IsInMultiplayer)
				{
					//ModLog.Message("WorkGiver_RJW_Sexchecks::direct_control disabled or is in MP , exit");
					return false;
				}
			}
			else if (!pawn.IsHeroOwner())
			{
				//ModLog.Message("WorkGiver_RJW_Sexchecks::not hero owner, exit");
				return false;
			}
			Pawn target = t as Pawn;
			if (t is Corpse)
			{
				Corpse corpse = t as Corpse;
				target = corpse.InnerPawn;
				//ModLog.Message("WorkGiver_RJW_Sexchecks::Pawn(" + xxx.get_pawnname(pawn) + "), Target corpse(" + xxx.get_pawnname(target) + ")");
			}
			else
			{
				//ModLog.Message("WorkGiver_RJW_Sexchecks::Pawn(" + xxx.get_pawnname(pawn) + "), Target pawn(" + xxx.get_pawnname(target) + ")");
			}

			//Log.Message("1");
			if (t == null || t.Map == null)
			{
				return false;
			}
			//Log.Message("2");
			if (!(xxx.can_fuck(pawn) || xxx.can_be_fucked(pawn)))
			{
				//ModLog.Message("WorkGiver_RJW_Sexchecks::JobOnThing(" + xxx.get_pawnname(pawn) + ") is cannot fuck or be fucked.");
				return false;
			}
			//Log.Message("3");
			if (t is Pawn)
				if (!(xxx.can_fuck(target) || xxx.can_be_fucked(target)))
				{
					//ModLog.Message("WorkGiver_RJW_Sexchecks::JobOnThing(" + xxx.get_pawnname(target) + ") is cannot fuck or be fucked.");
					return false;
				}
			//Log.Message("4");

			if (!RJWSettings.bestiality_enabled && xxx.is_animal(target))
			{
				//if (RJWSettings.DevMode) JobFailReason.Is("bestiality disabled");
				return false;
			}
			//investigate AoA, someday
			//move this?
			//if (xxx.is_animal(pawn) && xxx.is_animal(target) && !RJWSettings.animal_on_animal_enabled)
			//{
			//	return false;
			//}
			if (!xxx.is_human(pawn) && !(xxx.RoMIsActive && pawn.health.hediffSet.HasHediff(xxx.TM_ShapeshiftHD)))
			{
				return false;
			}

			//Log.Message("5");
			if (!pawn.CanReach(t, PathEndMode, Danger.Some))
			{
				if (RJWSettings.DevMode) JobFailReason.Is(
					pawn.CanReach(t, PathEndMode, Danger.Deadly)
						? "unable to reach target safely" : "target unreachable");
				return false;
			}
			//Log.Message("6");
			if (t.IsForbidden(pawn))
			{
				if (RJWSettings.DevMode) JobFailReason.Is("target is outside of allowed area");
				return false;
			}
			//Log.Message("7");
			if (!pawn.IsDesignatedHero())
			{
				if (!RJWSettings.WildMode)
				{
					if (pawn.IsDesignatedComfort() || pawn.IsDesignatedBreeding())
					{
						if (RJWSettings.DevMode) JobFailReason.Is("designated pawns cannot initiate sex");
						return false;
					}
					if (!xxx.is_healthy_enough(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("not healthy enough for sex");
						return false;
					}
					if (xxx.is_asexual(pawn))
					{
						if (RJWSettings.DevMode) JobFailReason.Is("refuses to have sex");
						return false;
					}
				}
			}
			else
			{
				if (!pawn.IsHeroOwner())
				{
					//ModLog.Message("WorkGiver_Sexchecks::player interaction for not owned hero, exit");
					return false;
				}
			}

			if (!MoreChecks(pawn, t, forced))
				return false;

			return true;
		}

		public virtual bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			return false;
		}

		public virtual bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return null;
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Try to solicit pawn to have sex with
	/// </summary>
	public class WorkGiver_Solicit : WorkGiver_Sexchecks
	{
		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");

			Pawn target = t as Pawn;
			if (target == pawn)
			{
				//JobFailReason.Is("no self solicit", null);
				return false;
			}
			if (!WorkGiverChecks(pawn, t, forced))
				return false;

			if (!xxx.is_human(target))
			{
				return false;
			}
			//if (!pawn.CanReserve(target, xxx.max_rapists_per_prisoner, 0))
			//	return false;

			//ModLog.Message("WorkGiver_Sex::" + SexAppraiser.would_fuck(target, pawn));
			//if (SexAppraiser.would_fuck(target, pawn) < 0.1f)
			//{
			//	return false;
			//}

			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override bool WorkGiverChecks(Pawn pawn, Thing t, bool forced = false)
		{
			Pawn target = t as Pawn;
			if (pawn.HostileTo(target) || target.IsDesignatedComfort())
			{
				return false;
			}
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			//TODO:: fix bed stealing during join other pawn
			//Building_Bed bed = pawn.ownership.OwnedBed;
			//if (bed == null)
			//	bed = (t as Pawn).ownership.OwnedBed;

			Building_Bed bed = (pawn as Pawn).ownership.OwnedBed;

			if (bed == null)
				return null;

			//if (pawn.CurrentBed() != (t as Pawn).CurrentBed())
			//	return null;

			return JobMaker.MakeJob(xxx.whore_inviting_visitors, t as Pawn, bed);
		}
	}
}


code:
using RimWorld;
using Verse;
using Verse.AI;

namespace rjw
{
	/// <summary>
	/// Assigns a pawn to rape a corpse
	/// </summary>
	public class WorkGiver_ViolateCorpse : WorkGiver_Sexchecks
	{
		public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.Corpse);

		public override bool MoreChecks(Pawn pawn, Thing t, bool forced = false)
		{
			//ModLog.Message("" + this.GetType().ToString() + " base checks: pass");
			if (!RJWSettings.necrophilia_enabled) return false;

			//Pawn target = (t as Corpse).InnerPawn;
			if (!pawn.CanReserve(t, xxx.max_rapists_per_prisoner, 0))
				return false;

			if (!(pawn.IsDesignatedHero() || RJWSettings.override_control))
				if (!RJWSettings.WildMode)
				{
					if (xxx.is_necrophiliac(pawn) && !xxx.is_hornyorfrustrated(pawn))
						{
						if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
							return false;
						}
					if (!xxx.is_necrophiliac(pawn))
						if ((t as Corpse).CurRotDrawMode != RotDrawMode.Fresh)
						{
							if (RJWSettings.DevMode) JobFailReason.Is("refuse to rape rotten");
							return false;
						}
						else if (!xxx.is_frustrated(pawn))
							{
							if (RJWSettings.DevMode) JobFailReason.Is("not horny enough");
								return false;
							}
					//ModLog.Message("WorkGiver_ViolateCorpse::" + SexAppraiser.would_fuck(pawn, t as Corpse));
					if (SexAppraiser.would_fuck(pawn, t as Corpse) > 0.1f)
					{
						return false;
					}
				}
			//ModLog.Message("" + this.GetType().ToString() + " extended checks: can start sex");
			return true;
		}

		public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
		{
			return JobMaker.MakeJob(xxx.RapeCorpse, t as Corpse);
		}
	}
}


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<rjw.BackstoryDef>
		<defName>rjw_childC</defName>
		<baseDescription>[PAWN_nameDef] was born in civil settlement.</baseDescription>
		<title>Child</title>
		<titleShort>Child</titleShort>
		<slot>Childhood</slot>
		<categoryName>Civil</categoryName>
	</rjw.BackstoryDef>

	<rjw.BackstoryDef>
		<defName>rjw_childT</defName>
		<baseDescription>[PAWN_nameDef] was born in a tribe.</baseDescription>
		<title>Child</title>
		<titleShort>Child</titleShort>
		<slot>Childhood</slot>
		<categoryName>Tribal</categoryName>
	</rjw.BackstoryDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<BodyPartDef>
		<defName>Genitals</defName>
		genitals
		<hitPoints>12</hitPoints>
		<frostbiteVulnerability>0.01</frostbiteVulnerability>
		<skinCovered>true</skinCovered>
		<solid>false</solid>
		<canSuggestAmputation>false</canSuggestAmputation>
		<bleedRate>1.0</bleedRate>
		<tags>

RJW_Fertility

		</tags>
	</BodyPartDef>

	<BodyPartDef>
		<defName>Chest</defName>
		chest
		<hitPoints>24</hitPoints>
		<frostbiteVulnerability>0.01</frostbiteVulnerability>
		<skinCovered>true</skinCovered>
		<solid>false</solid>
		<canSuggestAmputation>false</canSuggestAmputation>
		<bleedRate>1.0</bleedRate>
	</BodyPartDef>

	<BodyPartDef>
		<defName>Anus</defName>
		anus
		<hitPoints>8</hitPoints>
		<frostbiteVulnerability>0.01</frostbiteVulnerability>
		<skinCovered>true</skinCovered>
		<solid>false</solid>
		<canSuggestAmputation>false</canSuggestAmputation>
		<bleedRate>1.0</bleedRate>
	</BodyPartDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<BodyPartDef>
		<defName>MechGenitals</defName>
		mechanoid implanter
		<hitPoints>20</hitPoints>
		<skinCovered>true</skinCovered>
		<solid>true</solid>
		<canSuggestAmputation>false</canSuggestAmputation>
		<bleedRate>0</bleedRate>
		<frostbiteVulnerability>0.0</frostbiteVulnerability>
		<tags>

RJW_Fertility

		</tags>
	</BodyPartDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<BodyPartTagDef>
		<defName>RJW_Fertility</defName>
		<label>fertility_source</label>
		<description>Neccessary for reproduction</description>
		<vital>false</vital>
	</BodyPartTagDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<rjw.AgeConfigDef>
		<defName>RJW_AgeConfig</defName>

		<attractivenessByAgeFemale>
			<points>

(12, 0)

(13, .7)

(18, .95)

(22, 1)

(38, .9)

(80, .8)

			</points>
		</attractivenessByAgeFemale>

		<attractivenessByAgeMale>
			<points>

(12, 0)

(13, .5)

(18, .95)

(28, 1)

(38, .95)

(80, .9)

			</points>
		</attractivenessByAgeMale>

		<lovinIntervalHoursByAge>
			<points>

(1, 12)

(16, 6)

(22, 9)

(30, 12)

(50, 18)

(75, 24)

			</points>
		</lovinIntervalHoursByAge>

		<rigidityByAge>
			<points>

(0, .1)

(16, .1)

(40, 1)

(80, 1)

			</points>
		</rigidityByAge>

		<whoringPriceByAge>
			<points>

(12, 1)

(18, 1.5)

(24, 1.4)

(32, 1)

(48, .8)

(80, .6)

(400, .6)

			</points>
		</whoringPriceByAge>
	</rjw.AgeConfigDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<rjw.config>
		<defName>the_one</defName>
		<max_nymph_fraction>0.99</max_nymph_fraction>
		<!-- STD stuff -->
		<nymph_spawn_with_std_mul>3.0</nymph_spawn_with_std_mul>
		<!-- Logs the process of handing out STDs after sex for debug purposes (or for anyone who's curious) -->
		<std_show_roll_to_catch>false</std_show_roll_to_catch>
		<!-- STD infections must be at least this severe to spread between pawns -->
		<std_min_severity_to_pitch>0.21</std_min_severity_to_pitch>
		<!-- "Clean" rooms (cleanliness stat >= 0) have their stat multiplied by this amount -->
		<std_env_pitch_cleanliness_exaggeration>2.0</std_env_pitch_cleanliness_exaggeration>
		<!-- "Dirty" rooms (cleanliness stat< 0) have their stat multiplied by this amount -->
		<std_env_pitch_dirtiness_exaggeration>0.5</std_env_pitch_dirtiness_exaggeration>
		<!-- Cleanliness stat for sex outside of a room -->
		<std_outdoor_cleanliness>-1.0</std_outdoor_cleanliness>
		<opp_inf_initial_immunity>0.55</opp_inf_initial_immunity>
		<!-- Cooldown for animal breeding, CP.-->
		<comfort_prisoner_rape_mtbh_mul>4.0</comfort_prisoner_rape_mtbh_mul>

		<!-- Rape beating -->
		<minor_pain_threshold>0.3</minor_pain_threshold>
		<significant_pain_threshold>0.6</significant_pain_threshold>
		<extreme_pain_threshold>0.9</extreme_pain_threshold>
		<base_chance_to_hit_prisoner>0.50</base_chance_to_hit_prisoner>
		<min_ticks_between_hits>500</min_ticks_between_hits>
		<max_ticks_between_hits>700</max_ticks_between_hits>
	</rjw.config>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<DamageDef>
		<defName>ViralDamage</defName>
		<workerClass>DamageWorker_AddInjury</workerClass>
		<label>viral damage</label>
		<externalViolence>false</externalViolence>
		<deathMessage>{0} has died of a disease.</deathMessage>
		<hediff>VirusPerma</hediff>
		<hediffSkin>VirusPerma</hediffSkin>
		<hediffSolid>VirusPerma</hediffSolid>
		<makesBlood>false</makesBlood>
		<harmAllLayersUntilOutside>false</harmAllLayersUntilOutside>
	</DamageDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<ThingDef ParentName="MakeableDrugBase">
		<defName>Aphrodisiac</defName>
		Aphrodisiac drug
		<description>A smokable drug made from humpshroom.</description>
		<graphicData>
			<texPath>Things/Item/Drug/Penoxycyline</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>450</WorkToMake>
			<MarketValue>50</MarketValue>
			<Mass>0.05</Mass>
			<DeteriorationRate>6</DeteriorationRate>
			<Flammability>1.3</Flammability>
		</statBases>
		<techLevel>Medieval</techLevel>
		<ingestible>
			<foodType>Plant, Processed</foodType>
			<joyKind>Chemical</joyKind>
			<joy>0.80</joy>
			<baseIngestTicks>720</baseIngestTicks>
			<nurseable>true</nurseable>
			<drugCategory>Social</drugCategory>
			<ingestSound>Ingest_Smoke</ingestSound>
			<ingestEffect>Smoke_Joint</ingestEffect>
			<ingestEffectEat>EatVegetarian</ingestEffectEat>
			<ingestHoldOffsetStanding>
				<northDefault>
					<offset>(0.27,0,0.08)</offset>
					<behind>true</behind>
				</northDefault>
				<east>
					<offset>(0.45,0,0.08)</offset>
				</east>
				<south>
					<offset>(0.27,0,0.08)</offset>
				</south>
				<west>
					<offset>(-0.50,0,0.08)</offset>
					<flip>true</flip>
				</west>
			</ingestHoldOffsetStanding>
			<ingestHoldUsesTable>false</ingestHoldUsesTable>
			<ingestCommandString>Smoke {0}</ingestCommandString>
			<ingestReportString>Smoking {0}.</ingestReportString>
			<ingestReportStringEat>Consuming {0}.</ingestReportStringEat>
			<useEatingSpeedStat>false</useEatingSpeedStat>
			<outcomeDoers>

					<hediffDef>HumpShroomEffect</hediffDef>
					<severity>0.6</severity>
					<toleranceChemical>HumpShroom</toleranceChemical>

					<hediffDef>HumpShroomTolerance</hediffDef>
					<severity>0.042</severity>
					<divideByBodySize>true</divideByBodySize>

					<need>Sex</need>
					<offset>-0.5</offset>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<recipeUsers>

CraftingSpot

DrugLab

			</recipeUsers>
			<workSpeedStat>DrugCookingSpeed</workSpeedStat>
			<workSkill>Cooking</workSkill>
		</recipeMaker>
		<costList>
			<HumpShroom>4</HumpShroom>
		</costList>
		<comps>

				<chemical>HumpShroom</chemical>
				<addictiveness>0.030</addictiveness>
				<minToleranceToAddict>0.15</minToleranceToAddict>
				<existingAddictionSeverityOffset>0.1</existingAddictionSeverityOffset>
				<needLevelOffset>1</needLevelOffset>
				<listOrder>30</listOrder>

		</comps>
	</ThingDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>

	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>RJW_Contraceptive</defName>
		Contraception pills
		<description>Deliver severe hit to fertility for one quadrum.</description>
		<graphicData>
			<texPath>Things/Item/Contraceptive</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>120</WorkToMake>
			<MarketValue>15</MarketValue>
			<Mass>0.05</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

					<hediffDef>RJW_Contraceptive</hediffDef>
					<severity>1.0</severity>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>1</MedicineHerbal>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

	<HediffDef>
		<defName>RJW_Contraceptive</defName>
		<hediffClass>HediffWithComps</hediffClass>
		contraceptive
		<description>Contraception pills deliver severe hit to fertility for one quadrum.</description>
		<defaultLabelColor>(0.75, 0.75, 1.0)</defaultLabelColor>
		<isBad>false</isBad>
		<comps>

				<disappearsAfterTicks>
					<min>900000</min>
					<max>900000</max>
				</disappearsAfterTicks>

		</comps>
		<stages>

				Contracepted
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<setMax>0.1</setMax>

				</capMods>

		</stages>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>

	<ThingDef ParentName="MakeableDrugPillBase">
		<defName>RJW_FertPill</defName>
		Hyperfertility pills
		<description>Enhances fertility for 48 hours. Also works as a mild aphrodisiac.</description>
		<graphicData>
			<texPath>Things/Item/FertPill</texPath>
			<graphicClass>Graphic_StackCount</graphicClass>
		</graphicData>
		<rotatable>false</rotatable>
		<statBases>
			<WorkToMake>120</WorkToMake>
			<MarketValue>15</MarketValue>
			<Mass>0.05</Mass>
		</statBases>
		<techLevel>Industrial</techLevel>
		<ingestible>
			<drugCategory>Medical</drugCategory>
			<outcomeDoers>

					<hediffDef>RJW_FertPill</hediffDef>
					<severity>1.0</severity>

					<need>Sex</need>
					<offset>-0.25</offset>

			</outcomeDoers>
		</ingestible>
		<recipeMaker>
			<researchPrerequisite>DrugProduction</researchPrerequisite>
			<recipeUsers>

DrugLab

			</recipeUsers>
		</recipeMaker>
		<costList>
			<MedicineHerbal>1</MedicineHerbal>
			<HumpShroom>1</HumpShroom>
		</costList>
		<comps>

			<addictiveness>0</addictiveness>
			<listOrder>1000</listOrder>
				<overdoseSeverityOffset>
					<min>0.08</min>
					<max>0.14</max>
				</overdoseSeverityOffset>

		</comps>
	</ThingDef>

	<HediffDef>
		<defName>RJW_FertPill</defName>
		<hediffClass>HediffWithComps</hediffClass>
		fertpill
		<description>Enhanced fertility. A mild aphrodisiac.</description>
		<defaultLabelColor>(0.75, 0.75, 1.0)</defaultLabelColor>
		<isBad>false</isBad>
		<comps>

				<disappearsAfterTicks>
					<min>120000</min>
					<max>120000</max>
				</disappearsAfterTicks>

		</comps>
		<stages>

				Hyperfertility
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>4</offset>

				</capMods>

		</stages>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>

	<ThingDef ParentName="CavePlantBase">
		<defName>PlantHumpShroom</defName>
		humpshroom shroom
		<description>Thick shroom with tough flesh, thick juice and smooth soft skin. Exhibits aphrodisiac effects when consumed, refills psyfocus.</description>
		<statBases>
			<MaxHitPoints>85</MaxHitPoints>
			<Beauty>2</Beauty>
			<Nutrition>0.15</Nutrition>
			<MeditationFocusStrength>1.0</MeditationFocusStrength>
		</statBases>
		<graphicData>
			<texPath>Things/Item/Humpshroom/Humpshroom</texPath>
			<graphicClass>Graphic_Single</graphicClass>
		</graphicData>
		<selectable>true</selectable>
		<pathCost>10</pathCost>
		<plant>
			<fertilityMin>0.01</fertilityMin>
			<fertilitySensitivity>0.25</fertilitySensitivity>
			<growDays>15.00</growDays>
			<harvestTag>Standard</harvestTag>
			<harvestedThingDef>HumpShroom</harvestedThingDef>
			<harvestYield>2</harvestYield>
			<sowMinSkill>4</sowMinSkill>
			<sowTags>

Hydroponic

			</sowTags>
			<topWindExposure>0.1</topWindExposure>
			<visualSizeRange>0.4~0.7</visualSizeRange>
		</plant>
		<comps>

				<glowRadius>1</glowRadius>
				<glowColor>(255,105,180,0)</glowColor>

				<statDef>MeditationFocusStrength</statDef>
				<focusTypes>

Sex

				</focusTypes>

		</comps>
	</ThingDef>

	<ThingDef ParentName="DrugBase">
		<defName>HumpShroom</defName>
		Hump shroom
		<description>A shroom with tough flesh, thick juice and smooth soft skin. Exhibits aphrodisiac effects when consumed, refills psyfocus.</description>
		<tradeability>Sellable</tradeability>
		<socialPropernessMatters>true</socialPropernessMatters>
		<tickerType>Rare</tickerType>
		<graphicData>
			<texPath>Things/Item/Humpshroom/HumpshroomCollected</texPath>
			<graphicClass>Graphic_Single</graphicClass>
		</graphicData>
		<thingCategories>

PlantFoodRaw

		</thingCategories>
		<statBases>
			<MarketValue>10</MarketValue>
			<Mass>0.1</Mass>
			<DeteriorationRate>4</DeteriorationRate>
			<Nutrition>0.40</Nutrition>
		</statBases>
		<techLevel>Neolithic</techLevel>
		<ingestible>
			<baseIngestTicks>100</baseIngestTicks>
			<chairSearchRadius>4</chairSearchRadius>
			<preferability>RawTasty</preferability>
			<tasteThought></tasteThought>
			<foodType>Fungus</foodType>
			<maxNumToIngestAtOnce>1</maxNumToIngestAtOnce>
			<optimalityOffsetHumanlikes>-6</optimalityOffsetHumanlikes>
			<optimalityOffsetFeedingAnimals>-11</optimalityOffsetFeedingAnimals>
			<ingestEffect>EatVegetarian</ingestEffect>
			<ingestSound>RawVegetable_Eat</ingestSound>
			<joy>0.5</joy>
			<joyKind>Social</joyKind>
			<nurseable>true</nurseable>
			<drugCategory>Social</drugCategory>
			<outcomeDoers>

					<hediffDef>HumpShroomEffect</hediffDef>
					<severity>0.50</severity>
					<toleranceChemical>HumpShroom</toleranceChemical>

					<hediffDef>HumpShroomTolerance</hediffDef>
					<severity>0.032</severity>
					<divideByBodySize>true</divideByBodySize>

					<need>Sex</need>
					<offset>-0.5</offset>

					<offset>1.0</offset>

		</outcomeDoers>
		</ingestible>
		<comps>

				<daysToRotStart>30</daysToRotStart>
				<rotDestroys>true</rotDestroys>

				<chemical>HumpShroom</chemical>
				<addictiveness>0.050</addictiveness>
				<minToleranceToAddict>0.15</minToleranceToAddict>
				<existingAddictionSeverityOffset>0.1</existingAddictionSeverityOffset>
				<needLevelOffset>1</needLevelOffset>
				<listOrder>30</listOrder>

		</comps>
	</ThingDef>

	<HediffDef>
		<defName>HumpShroomEffect</defName>
		<hediffClass>HediffWithComps</hediffClass>
		Induced libido
		<description>Hump shroom aphrodisiac effects.</description>
		<defaultLabelColor>(1,0,0.5)</defaultLabelColor>
		<scenarioCanAdd>true</scenarioCanAdd>
		<maxSeverity>1.0</maxSeverity>
		<comps>

				<severityPerDay>-0.9</severityPerDay>

		</comps>
		<stages>

				<restFallFactor>1.33</restFallFactor>
				<statOffsets>
					<SexFrequency>2</SexFrequency>
					<SexSatisfaction>0.5</SexSatisfaction>
				</statOffsets>

		</stages>
	</HediffDef>

	<ThoughtDef>
		<defName>HumpShroomEffect</defName>
		<workerClass>ThoughtWorker_Hediff</workerClass>
		<hediff>HumpShroomEffect</hediff>
		<validWhileDespawned>true</validWhileDespawned>
		<stages>

				Humpshroom aftertaste
				<description>Tastes funny.</description>
				<baseMoodEffect>1</baseMoodEffect>

		</stages>
	</ThoughtDef>

	<ChemicalDef>
		<defName>HumpShroom</defName>
		humpshroom
		<addictionHediff>HumpShroomAddiction</addictionHediff>
		<toleranceHediff>HumpShroomTolerance</toleranceHediff>
		<onGeneratedAddictedToleranceChance>0.8</onGeneratedAddictedToleranceChance>
	</ChemicalDef>

	<NeedDef ParentName="DrugAddictionNeedBase">
		<defName>Chemical_HumpShroom</defName>
		<needClass>Need_Chemical</needClass>
		humpshroom
		<description>Person is now hooked on shrooms. Without them, their handholding performance may fall.</description>
		<listPriority>10</listPriority>
	</NeedDef>

	<HediffDef ParentName="DrugToleranceBase">
		<defName>HumpShroomTolerance</defName>
		humpshroom tolerance
		<description>Hump shroom effects tolerance.</description>
		<isBad>false</isBad>
		<comps>

				<severityPerDay>-0.020</severityPerDay>

				<chemical>HumpShroom</chemical>

		</comps>
	</HediffDef>

	<HediffDef ParentName="AddictionBase">
		<defName>HumpShroomAddiction</defName>
		<hediffClass>Hediff_Addiction</hediffClass>
		humpshroom addiction
		<description>Hump shroom effects addiction.</description>
		<causesNeed>Chemical_HumpShroom</causesNeed>
		<comps>

				<severityPerDay>-0.1</severityPerDay>
				<showDaysToRecover>true</showDaysToRecover>

		</comps>
		<stages>

				withdrawal
				<statOffsets>
					<SexSatisfaction>-1</SexSatisfaction>
				</statOffsets>

		</stages>
	</HediffDef>

	<ThoughtDef>
		<defName>HumpShroomWithdrawal</defName>
		<workerClass>ThoughtWorker_Hediff</workerClass>
		<hediff>HumpShroomAddiction</hediff>
		<validWhileDespawned>true</validWhileDespawned>
		<stages>

				<visible>false</visible>

				humpshroom withdrawal
				<description>I just feel nothing down there.</description>
				<baseMoodEffect>-5</baseMoodEffect>

		</stages>
	</ThoughtDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<FleckDef ParentName="FleckBase_Thrown">
		<defName>Mote_NoHeart</defName>
		<graphicData>
			<texPath>UI/Icons/noheart</texPath>
		</graphicData>
		<altitudeLayer>MetaOverlays</altitudeLayer>
		<fadeInTime>0.08</fadeInTime>
		<solidTime>1.4</solidTime>
		<fadeOutTime>1.5</fadeOutTime>
	</FleckDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<HediffDef Name="BondageBase" Abstract="True">
		<hediffClass>Hediff</hediffClass>
		<defaultLabelColor>(0.5, 0.5, 0.9)</defaultLabelColor>
		<makesSickThought>false</makesSickThought>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<scenarioCanAdd>false</scenarioCanAdd>
	</HediffDef>

	<HediffDef ParentName="BondageBase">
		<defName>Chains</defName>
		chains
		<labelNoun>chains</labelNoun>
		<description>A series of chains that restrict its wearer.</description>
		<stages>

				<capMods>

						<capacity>Manipulation</capacity>
						<setMax>0.35</setMax>

						<capacity>Moving</capacity>
						<setMax>0.35</setMax>

				 </capMods>

		</stages>
	</HediffDef>

	<HediffDef ParentName="BondageBase">
		<defName>BoundHands</defName>
		bound hands
		<labelNoun>bound hands</labelNoun>
		<description>Bound hands.</description>
		<stages>

				<capMods>

						<capacity>Manipulation</capacity>
						<setMax>0.00</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef ParentName="BondageBase">
		<defName>BoundLegs</defName>
		bound legs
		<labelNoun>bound legs</labelNoun>
		<description>Bound legs.</description>
		<stages>

				<capMods>

						<capacity>Moving</capacity>
						<setMax>0.00</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef ParentName="BondageBase">
		<defName>RJW_Restraints</defName>
		Restraints
		<labelNoun>restraints</labelNoun>
		<description>A set of restraints.</description>
		<stages>

				<capMods>

						<capacity>Manipulation</capacity>
						<setMax>0.00</setMax>

						<capacity>Moving</capacity>
						<setMax>0.00</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef ParentName="BondageBase">
		<defName>RJW_Cocoon</defName>
		<hediffClass>rjw.Cocoon</hediffClass>
		Cocoon
		<labelNoun>A cocoon</labelNoun>
		<description>A cocoon that tends to its host until ready to procreate.</description>
		<stages>

				<capMods>

						<capacity>Manipulation</capacity>
						<setMax>0.00</setMax>

						<capacity>Moving</capacity>
						<setMax>0.00</setMax>

				</capMods>
				<statOffsets>
					<ComfyTemperatureMin>-50</ComfyTemperatureMin>
					<ComfyTemperatureMax>50</ComfyTemperatureMax>
				</statOffsets>

		</stages>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

	<HediffDef>
		<defName>Hediff_Bukkake</defName>
		<hediffClass>rjw.Hediff_Bukkake</hediffClass>
		Mess
		<description>Sticky fluids.</description>
		<makesSickThought>false</makesSickThought>
		<initialSeverity>0.01</initialSeverity>
		<maxSeverity>1</maxSeverity>

		<isBad>false</isBad>
		<tendable>false</tendable>
		<stages>

				minor
				<becomeVisible>false</becomeVisible>

				<minSeverity>0.3</minSeverity>
				little
				<statOffsets>
					<Vulnerability>0.2</Vulnerability>
					<SocialImpact>-0.1</SocialImpact>
				</statOffsets>

				<minSeverity>0.6</minSeverity>
				extensive
				<statOffsets>
					<Vulnerability>0.3</Vulnerability>
					<SocialImpact>-0.3</SocialImpact>
				</statOffsets>

				<minSeverity>0.8</minSeverity>
				full
				<statOffsets>
					<Vulnerability>-0.1</Vulnerability>
					<SocialImpact>-0.5</SocialImpact>
				</statOffsets>

		</stages>
	</HediffDef>

	<HediffDef Name="Hediff_Semen">
		<hediffClass>rjw.Hediff_Semen</hediffClass>
		<defName>Hediff_Semen</defName>
		sweat
		<labelNoun>sweat</labelNoun>
		<description>Sweat.</description>
		<labelNounPretty>Sweat on {1}</labelNounPretty>
		<defaultLabelColor>(0.95,0.95,0.95)</defaultLabelColor>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<makesSickThought>false</makesSickThought>
		<makesAlert>false</makesAlert>
		<maxSeverity>1</maxSeverity>
		<initialSeverity>0.001</initialSeverity>
		<injuryProps>
			<canMerge>true</canMerge>
		</injuryProps>
		<stages>

				little

				<minSeverity>0.25</minSeverity>
				some

				<minSeverity>0.5</minSeverity>
				dripping

				<minSeverity>0.8</minSeverity>
				drenched

		</stages>
		<comps>

				<healIntervalTicksStanding>1800</healIntervalTicksStanding>
				<healAmount>0.01</healAmount>

		</comps>
	</HediffDef>

	<HediffDef ParentName="Hediff_Semen">
		<defName>Hediff_InsectSpunk</defName>
		<description>Insect fluids.</description>
		insect fluids
		<labelNoun>insect fluids</labelNoun>
		<labelNounPretty>insect fluids on {1}</labelNounPretty>
		<defaultLabelColor>(0.6,0.83,0.35)</defaultLabelColor>
	</HediffDef>

	<HediffDef ParentName="Hediff_Semen">
		<defName>Hediff_MechaFluids</defName>
		<description>Mechanoid fluids.</description>
		mechanoid fluids
		<labelNoun>mechanoid fluids</labelNoun>
		<labelNounPretty>mecha fluids on {1}</labelNounPretty>
		<defaultLabelColor>(0.37,0.71,0.82)</defaultLabelColor>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>

	<rjw.HediffDef_InsectEgg Name="RJW_ImplantEgg" Abstract="True">
		<defName>RJW_InsectEgg</defName>
		Egg
		<hediffClass>rjw.Hediff_InsectEgg</hediffClass>
		<description>Egg.</description>
		<defaultLabelColor>(0.8, 0.8, 0.35)</defaultLabelColor>
		<initialSeverity>0.01</initialSeverity>
		<isBad>false</isBad>
		<tendable>false</tendable>
		<eggsize>1</eggsize>
		<selffertilized>true</selffertilized>
		<stages>

				<minSeverity>0.01</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.01</offset>

				</capMods>

				<minSeverity>0.02</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.02</offset>

				</capMods>

				<minSeverity>0.05</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.05</offset>

				</capMods>

				<minSeverity>0.10</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.10</offset>

				</capMods>

				<minSeverity>0.15</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.15</offset>

				</capMods>

				<minSeverity>0.20</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.20</offset>

				</capMods>

				<minSeverity>0.25</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.25</offset>

				</capMods>

				<minSeverity>0.30</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.30</offset>

				</capMods>

				<minSeverity>0.40</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.40</offset>

				</capMods>

				<minSeverity>0.50</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.50</offset>

				</capMods>

				<minSeverity>0.75</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.75</offset>

				</capMods>

				<minSeverity>0.9</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-1.0</offset>

				</capMods>

		</stages>
	</rjw.HediffDef_InsectEgg>

	<rjw.HediffDef_InsectEgg ParentName="RJW_ImplantEgg">
		<defName>RJW_UnknownEgg</defName>
		<parentDef>Unknown</parentDef>
		<UnFertEggDef>RJW_EggUnfertilized</UnFertEggDef>
		<FertEggDef>RJW_EggFertilized</FertEggDef>
	</rjw.HediffDef_InsectEgg>

	<rjw.HediffDef_InsectEgg ParentName="RJW_ImplantEgg">
		<defName>RJW_InsectHiveEgg</defName>
		<parentDefs>

Megascarab

Spelopede

Megaspider

Queen

		</parentDefs>
		<childrenDefs>

Megascarab

Megascarab

Megascarab

Megascarab

Megascarab

Spelopede

Spelopede

Spelopede

Spelopede

Megaspider

		</childrenDefs>
		<UnFertEggDef>RJW_EggInsectUnfertilized</UnFertEggDef>
		<FertEggDef>RJW_EggInsectFertilized</FertEggDef>
	</rjw.HediffDef_InsectEgg>

	<rjw.HediffDef_MechImplants Name="RJW_ImplantMech" Abstract="True">
		<hediffClass>rjw.Hediff_MechImplants</hediffClass>
		<defaultLabelColor>(0.8, 0.8, 0.35)</defaultLabelColor>
		<description>A small computer that enters a host through one of their orifices.
Can analyze vital signs and location data, and relay that information back to its implanter.</description>
		<initialSeverity>0.01</initialSeverity>
		<isBad>false</isBad>
		<tendable>false</tendable>
	</rjw.HediffDef_MechImplants>

	<rjw.HediffDef_MechImplants ParentName="RJW_ImplantMech">
		<defName>RJW_MechanoidImplant</defName>
		<parentDefs>

Mech_Lancer

Mech_Scyther

Mech_Centipede

Mech_Pikeman

		</parentDefs>
		<childrenDefs>

Mech_Scyther

		</childrenDefs>
	</rjw.HediffDef_MechImplants>

	<rjw.HediffDef_MechImplants ParentName="RJW_ImplantMech">
		<hediffClass>rjw.Hediff_MicroComputer</hediffClass>
		<defName>RJW_MicroComputer</defName>
		<tendable>false</tendable>
		<isBad>true</isBad>
		MicroComputer
		<description>A small computer that enters a host through one of their orifices.
Can analyze vital signs and location data, and relay that information back to its implanter.</description>
		<minEventInterval>30000</minEventInterval>
		<maxEventInterval>90000</maxEventInterval>
		<randomHediffDefs>

RJW_Orgasm

TransportCums

TransportEggs

		</randomHediffDefs>
	</rjw.HediffDef_MechImplants>

	<rjw.HediffDef_EnemyImplants>
		<defName>Parasite</defName>
		<hediffClass>rjw.Hediff_Parasite</hediffClass>
		<defaultLabelColor>(0.7, 1.0, 0.7)</defaultLabelColor>
		<initialSeverity>0.1</initialSeverity>
		<isBad>true</isBad>
		pregnant
		<description>A organism that lives inside a host and feeds off its nutrients, giving the host
severe discomfort.</description>
		<comps>

				<sendLetterWhenDiscovered>true</sendLetterWhenDiscovered>
				<discoverLetterLabel>{0} Parasited</discoverLetterLabel>
				<discoverLetterText>{0} is parasited!</discoverLetterText>

		</comps>
		<stages>

				early-stage-hidden
				<becomeVisible>false</becomeVisible>
				<vomitMtbDays>2.5</vomitMtbDays>

				middle-stage
				<minSeverity>0.333</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.15</offset>

				</capMods>

				late-stage
				<minSeverity>0.666</minSeverity>
				<vomitMtbDays>2</vomitMtbDays>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.30</offset>

				</capMods>

		</stages>
	</rjw.HediffDef_EnemyImplants>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<HediffDef>
		<defName>FeelingBroken</defName>
		<hediffClass>rjw.AdvancedHediffWithComps</hediffClass>
		Feeling broken
		<defaultLabelColor>(0.5, 0.7, 0.45)</defaultLabelColor>
		<makesSickThought>false</makesSickThought>
		<initialSeverity>0.025</initialSeverity>
		<maxSeverity>1</maxSeverity>
		<scenarioCanAdd>true</scenarioCanAdd>
		<tendable>false</tendable>
		<description>Mind broken. No longer capable of emotion.</description>
		<isBad>false</isBad>
		<comps>

				<severityPerDayReduce>
					<points>

(1,0)

(10,-0.025)

					</points>
				</severityPerDayReduce>

				<severityPerDayIncrease>
					<points>

(0,0.1)

(1,1)

					</points>
				</severityPerDayIncrease>

		</comps>
		<stages>

				early-stage
				<becomeVisible>false</becomeVisible>

				in a trance
				<minSeverity>0.1</minSeverity>
				<painOffset>0.1</painOffset>
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.8</postFactor>

				</capMods>

				broken
				<minSeverity>0.3</minSeverity>
				<painOffset>0.05</painOffset>
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.7</postFactor>

				</capMods>
				<statOffsets>
					<Vulnerability>0.25</Vulnerability>
				</statOffsets>

				Extremely broken
				<minSeverity>0.5</minSeverity>
				<painOffset>-0.1</painOffset>
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.6</postFactor>

				</capMods>
				<statOffsets>
					<Vulnerability>0.5</Vulnerability>
				</statOffsets>

		</stages>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<HediffDef>
		<defName>RJW_IUD</defName>
		IUD
		<hediffClass>HediffWithComps</hediffClass>
		<description>A small silver device that prevents pregnancy.</description>
		<defaultLabelColor>(0.8, 0.8, 0.35)</defaultLabelColor>
		<isBad>false</isBad>
		<scenarioCanAdd>true</scenarioCanAdd>
	</HediffDef>

	<HediffDef>
		<defName>IncreasedFertility</defName>
		Increased fertility
		<description>Increased fertility, for baby making.</description>
		<hediffClass>HediffWithComps</hediffClass>
		<defaultLabelColor>(0.7, 1.0, 0.7)</defaultLabelColor>
		<isBad>false</isBad>
		<scenarioCanAdd>false</scenarioCanAdd>
		<stages>

				<becomeVisible>false</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>0.25</offset>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef>
		<defName>DecreasedFertility</defName>
		Low fertility
		<description>Low fertility.</description>
		<hediffClass>HediffWithComps</hediffClass>
		<defaultLabelColor>(1, 0.2, 0.2)</defaultLabelColor>
		<isBad>false</isBad>
		<scenarioCanAdd>false</scenarioCanAdd>
		<stages>

				<becomeVisible>false</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>-0.5</offset>
						<setMax>0.25</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef>
		<defName>ImpregnationBlocker</defName>
		Archotech pregnancy blocker
		<description>A complex device that prevents pregnancy.</description>
		<hediffClass>HediffWithComps</hediffClass>
		<defaultLabelColor>(0.7, 1.0, 0.7)</defaultLabelColor>
		<isBad>false</isBad>
		<scenarioCanAdd>false</scenarioCanAdd>
		<stages>

				<becomeVisible>true</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<setMax>0</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef>
		<defName>FertilityEnhancer</defName>
		Archotech fertility enhancer
		<description>A complex device that increases the likelihood of pregnancy.</description>
		<hediffClass>HediffWithComps</hediffClass>
		<defaultLabelColor>(0.7, 1.0, 0.7)</defaultLabelColor>
		<isBad>false</isBad>
		<scenarioCanAdd>false</scenarioCanAdd>
		<stages>

				<becomeVisible>true</becomeVisible>
				<capMods>

						<capacity>RJW_Fertility</capacity>
						<offset>1</offset>

				</capMods>

		</stages>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<HediffDef>
		<defName>RJW_Orgasm</defName>
		<hediffClass>rjw.Hediff_Orgasm</hediffClass>
		Orgasm
		<defaultLabelColor>(0.5, 0.7, 0.45)</defaultLabelColor>
		<makesSickThought>false</makesSickThought>
		<initialSeverity>0.1</initialSeverity>
		<maxSeverity>1</maxSeverity>
		<scenarioCanAdd>false</scenarioCanAdd>
		<tendable>false</tendable>
		<description>"Ohh, yeahh, hah, hnnh, OH!"</description>
		<comps>

				<severityPerDay>-1</severityPerDay>

		</comps>
		<stages>

				Slightly
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.9</postFactor>

						<capacity>Manipulation</capacity>
						<postFactor>0.9</postFactor>

						<capacity>Moving</capacity>
						<postFactor>0.9</postFactor>

						<capacity>Talking</capacity>
						<postFactor>0.9</postFactor>

				</capMods>
				<statOffsets>
					<Vulnerability>0.2</Vulnerability>
				</statOffsets>

				Heavy
				<minSeverity>0.2</minSeverity>
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.65</postFactor>

						<capacity>Manipulation</capacity>
						<postFactor>0.65</postFactor>

						<capacity>Moving</capacity>
						<postFactor>0.65</postFactor>

						<capacity>Talking</capacity>
						<postFactor>0.65</postFactor>

				</capMods>
				<statOffsets>
					<Vulnerability>0.3</Vulnerability>
				</statOffsets>

				Extremely
				<minSeverity>0.501</minSeverity>
				<capMods>

						<capacity>Consciousness</capacity>
						<postFactor>0.3</postFactor>

						<capacity>Manipulation</capacity>
						<postFactor>0.65</postFactor>

						<capacity>Moving</capacity>
						<postFactor>0.2</postFactor>

						<capacity>Talking</capacity>
						<postFactor>0.5</postFactor>

				</capMods>
				<statOffsets>
					<Vulnerability>0.6</Vulnerability>
				</statOffsets>

		</stages>
	</HediffDef>

	<HediffDef>
		<defName>TransportCums</defName>
		<hediffClass>rjw.Hediff_TransportCums</hediffClass>
		<description>Cumming inside.</description>
		<isBad>false</isBad>
	</HediffDef>

	<HediffDef>
		<defName>TransportEggs</defName>
		<hediffClass>rjw.Hediff_TransportEggs</hediffClass>
		<description>Laying egg inside.</description>
		<isBad>false</isBad>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

	<HediffDef>
		<defName>Immunodeficiency</defName>
		<hediffClass>rjw.Hediff_ID</hediffClass>
		<defaultLabelColor>(1.0, 0.0, 0.0)</defaultLabelColor>
		Immunodeficiency
		<makesSickThought>false</makesSickThought>
		<minSeverity>0.600</minSeverity>
		<description>Very susceptible to disease.</description>
		<initialSeverity>0.601</initialSeverity>
		<tendable>false</tendable>
		<stages>

				<minSeverity>0.60</minSeverity>
				minor
				<restFallFactor>1.10</restFallFactor>
				<capMods>

						<capacity>Consciousness</capacity>
						<offset>-0.05</offset>

				</capMods>

				<minSeverity>0.75</minSeverity>
				major
				<restFallFactor>1.30</restFallFactor>
				<capMods>

						<capacity>Consciousness</capacity>
						<offset>-0.10</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.15</offset>

						<capacity>Moving</capacity>
						<offset>-0.15</offset>

				</capMods>

				<minSeverity>0.90</minSeverity>
				extreme
				<restFallFactor>1.50</restFallFactor>
				<capMods>

						<capacity>Consciousness</capacity>
						<offset>-0.15</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.30</offset>

						<capacity>Moving</capacity>
						<offset>-0.30</offset>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef>
		<defName>VirusPerma</defName>
		<hediffClass>Hediff_Injury</hediffClass>
		<tendable>false</tendable>
		<displayWound>true</displayWound>
		<chanceToCauseNoPain>1.0</chanceToCauseNoPain>
		<description>Viral damage.</description>
		viral damage
		<comps>

				<permanentLabel>permanent viral damage</permanentLabel>
				<instantlyPermanentLabel>permanent viral damage</instantlyPermanentLabel>

		</comps>
		<injuryProps>
			<painPerSeverity>0.0</painPerSeverity>
			<averagePainPerSeverityPermanent>0.0</averagePainPerSeverityPermanent>
			<destroyedLabel>Destroyed by disease</destroyedLabel>
			<destroyedOutLabel>Destroyed by disease</destroyedOutLabel>
		</injuryProps>
	</HediffDef>

	<HediffDef ParentName="AddedBodyPartBase">
		<defName>PegArm</defName>
		peg arm
		<labelNoun>a peg arm</labelNoun>
		<description>A peg arm.</description>
		<addedPartProps>
			<solid>true</solid>
			<partEfficiency>0.00</partEfficiency>
			<betterThanNatural>false</betterThanNatural>
		</addedPartProps>
		<spawnThingOnRemoved>WoodLog</spawnThingOnRemoved>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>

<Defs>
	<HediffDef Name="RJW_pregnancy_template" Abstract="True">
		Pregnant
		<description>Baby in the oven.</description>
		<defaultLabelColor>(1, 0.41, 0.81)</defaultLabelColor>
		<initialSeverity>0.001</initialSeverity>
		<isBad>false</isBad>
		<stages>

				early-stage
				<vomitMtbDays>2</vomitMtbDays>
				<hungerRateFactorOffset>0.25</hungerRateFactorOffset>

				middle-stage
				<minSeverity>0.333</minSeverity>
				<vomitMtbDays>4</vomitMtbDays>
				<hungerRateFactorOffset>0.3</hungerRateFactorOffset>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.15</offset>

				</capMods>

				late-stage
				<minSeverity>0.666</minSeverity>
				<vomitMtbDays>6</vomitMtbDays>
				<hungerRateFactorOffset>0.3</hungerRateFactorOffset>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.30</offset>

				</capMods>

				having contractions
				<minSeverity>0.99</minSeverity>
				<painOffset>0.5</painOffset>
				<capMods>

						<capacity>Moving</capacity>
						<setMax>0.0</setMax>

				</capMods>

		</stages>
	</HediffDef>

	<HediffDef ParentName="RJW_pregnancy_template">
		<defName>RJW_pregnancy</defName>
		<hediffClass>rjw.Hediff_BasePregnancy</hediffClass>
	</HediffDef>

	<HediffDef ParentName="RJW_pregnancy_template">
		<defName>RJW_pregnancy_beast</defName>
		<hediffClass>rjw.Hediff_BestialPregnancy</hediffClass>
	</HediffDef>

	<HediffDef ParentName="RJW_pregnancy_template">
		<defName>RJW_pregnancy_mech</defName>
		<hediffClass>rjw.Hediff_MechanoidPregnancy</hediffClass>
	</HediffDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<rjw.HediffDef_PartBase Name="RJW_PrivatePartBase" Abstract="True">
		<DefaultBodyPartList>

		</DefaultBodyPartList>

		<FluidType></FluidType>

		<isBad>false</isBad>
		<comps>

		</comps>
		<priceImpact>false</priceImpact>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="RJW_PrivatePartBase" Name="NaturalPrivatePartBase" Abstract="True">
		<hediffClass>rjw.Hediff_PartBaseNatural</hediffClass>
		<defaultLabelColor>(0.5, 0.8, 0.5)</defaultLabelColor>
		<addedPartProps>
			<solid>false</solid>
			<partEfficiency>1.0</partEfficiency>
		</addedPartProps>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBase" Name="NaturalPrivatePartPenis" Abstract="True">
		<FluidType>Cum</FluidType>
		<DefaultBodyPart>Genitals</DefaultBodyPart>
		<stages>

				Micro
				<minSeverity>0.01</minSeverity>

				Small
				<minSeverity>0.20</minSeverity>

				Average
				<minSeverity>0.40</minSeverity>

				Large
				<minSeverity>0.60</minSeverity>
					<capMods>

						<capacity>Moving</capacity>
						<offset>-0.02</offset>

				</capMods>

				Huge
				<minSeverity>0.80</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.05</offset>

				</capMods>

				Towering
				<minSeverity>1.01</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.10</offset>

				</capMods>

		</stages>
		<modExtensions>

				<bodysizescale>true</bodysizescale>
				<density>1.0</density>
				<lengths>

0

5.0

10.0

18.0

25.0

35.0

				</lengths>
				<girths>

0

5.0

10.0

13.0

17.0

21.0

				</girths>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBase" Name="NaturalPrivatePartVagina" Abstract="True">
		<FluidType>Cum</FluidType>
		<DefaultBodyPart>Genitals</DefaultBodyPart>
		<stages>

				Micro
				<minSeverity>0.01</minSeverity>

				Tight
				<minSeverity>0.20</minSeverity>

				Average
				<minSeverity>0.40</minSeverity>

				Accomodating
				<minSeverity>0.60</minSeverity>

				Cavernous
				<minSeverity>0.80</minSeverity>

				Abyssal
				<minSeverity>1.01</minSeverity>

		</stages>
		<modExtensions>

				<bodysizescale>true</bodysizescale>

				<lengths>

0

5.0

10.0

18.0

25.0

35.0

				</lengths>
				<girths>

0

5.0

10.0

13.0

17.0

21.0

				</girths>

				<props>
				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBase" Name="NaturalPrivatePartAnus" Abstract="True">
		<FluidType></FluidType>
		<DefaultBodyPart>Anus</DefaultBodyPart>
		<stages>

				Micro
				<minSeverity>0.01</minSeverity>

				Tight
				<minSeverity>0.20</minSeverity>

				Average
				<minSeverity>0.40</minSeverity>

				Accomodating
				<minSeverity>0.60</minSeverity>

				Cavernous
				<minSeverity>0.80</minSeverity>

				Abyssal
				<minSeverity>1.01</minSeverity>

		</stages>
		<modExtensions>

				<bodysizescale>true</bodysizescale>

				<girths>

0

5.0

10.0

13.0

17.0

21.0

				</girths>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBase" Name="NaturalPrivatePartBreast" Abstract="True">
		<FluidType>Milk</FluidType>
		<DefaultBodyPart>Chest</DefaultBodyPart>
		<stages>

				Nipples
				<minSeverity>0.01</minSeverity>

				Tiny
				<minSeverity>0.02</minSeverity>

				Small
				<minSeverity>0.20</minSeverity>

				Average
				<minSeverity>0.40</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.01</offset>

				</capMods>

				Large
				<minSeverity>0.60</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.025</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.01</offset>

				</capMods>

				Huge
				<minSeverity>0.80</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.05</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.02</offset>

				</capMods>

				Enormous
				<minSeverity>1.00</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.10</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.04</offset>

			</capMods>

				Massive
				<minSeverity>1.2</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.15</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.08</offset>

				</capMods>

				Gargantuan
				<minSeverity>1.4</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.25</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.12</offset>

				</capMods>

				Colossal
				<minSeverity>1.6</minSeverity>

				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.40</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.20</offset>

				</capMods>

				Titanic
				<minSeverity>1.8</minSeverity>
				<capMods>

						<capacity>Moving</capacity>
						<offset>-0.65</offset>

						<capacity>Manipulation</capacity>
						<offset>-0.32</offset>

				</capMods>

		</stages>
		<modExtensions>

				<bodysizescale>true</bodysizescale>

				<density>1.0</density>
				<cupSizes>

0

1

2

4

7

11

15

19

25

31

				</cupSizes>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="RJW_PrivatePartBase" Name="ArtificialPrivatePartBase" Abstract="True">
		<hediffClass>rjw.Hediff_PartBaseArtifical</hediffClass>
		<defaultLabelColor>(0.5, 0.5, 0.9)</defaultLabelColor>
		<addedPartProps>
			<solid>true</solid>
			<partEfficiency>1.0</partEfficiency>
		</addedPartProps>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="ArtificialPrivatePartBase" Name="ArtificialPrivatePartLotech" Abstract="True">
		<addedPartProps>
			<betterThanNatural>false</betterThanNatural>
		</addedPartProps>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="ArtificialPrivatePartBase" Name="ArtificialPrivatePartHitech" Abstract="True">
		<addedPartProps>
			<betterThanNatural>true</betterThanNatural>
		</addedPartProps>
		<priceImpact>true</priceImpact>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>GenericPenis</defName>
		generic penis
		<labelNoun>a penis</labelNoun>
		<description>A penis. Generic placeholder part for unsuported race.</description>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>GenericVagina</defName>
		generic vagina
		<labelNoun>a vagina</labelNoun>
		<description>A vagina. Generic placeholder part for unsuported race.</description>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartAnus">
		<defName>GenericAnus</defName>
		generic anus
		<labelNoun>an anus</labelNoun>
		<description>An anus. Generic placeholder part for unsuported race.</description>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBreast">
		<defName>GenericBreasts</defName>
		generic breasts
		<labelNoun>breasts</labelNoun>
		<description>A pair of breasts. Generic placeholder part for unsuported race.</description>
	</rjw.HediffDef_PartBase>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>HorsePenis</defName>
		equine penis
		<labelNoun>an equine penis</labelNoun>
		<description>A large horse penis. Flares out during sex.</description>
		<descriptionHyperlinks><ThingDef>HorsePenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>HorsePenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Flared

Sheathed

Long

Girthy

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>HorseVagina</defName>
		equine vagina
		<labelNoun>an equine vagina</labelNoun>
		<description>A mare vagina.</description>
		<descriptionHyperlinks><ThingDef>HorseVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>HorseVagina</spawnThingOnRemoved>
		<modExtensions>

				<props>

Loose

Deep

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>CatPenis</defName>
		feline penis
		<labelNoun>a feline penis</labelNoun>
		<description>A spine-covered feline penis.</description>
		<descriptionHyperlinks><ThingDef>CatPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CatPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Barbed

Sheathed

Tapered

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>CatVagina</defName>
		feline vagina
		<labelNoun>a feline vagina</labelNoun>
		<description>A feline vagina.</description>
		<descriptionHyperlinks><ThingDef>CatVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CatVagina</spawnThingOnRemoved>
		<modExtensions>

				<props>

Tight

Deep

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>DogPenis</defName>
		canine penis
		<labelNoun>a dog penis</labelNoun>
		<description>A bright red dog penis. The knot will expand during sex, locking its lover to their partner for a long time.</description>
		<descriptionHyperlinks><ThingDef>DogPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>DogPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Knoted

Sheathed

Tapered

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>DogVagina</defName>
		canine vagina
		<labelNoun>a dog vagina</labelNoun>
		<description>A dog vagina.</description>
		<descriptionHyperlinks><ThingDef>DogVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>DogVagina</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>DragonPenis</defName>
		dragon penis
		<labelNoun>a dragon penis</labelNoun>
		<description>A dragon penis. Has a knot that expands similarly to a dog's penis,
but the ribbings on both sides takes its lover to greater heights of pleasure.</description>
		<descriptionHyperlinks><ThingDef>DragonPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>DragonPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Ridged

Girthy

Knoted

Internal

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>DragonVagina</defName>
		dragon vagina
		<labelNoun>a dragon vagina</labelNoun>
		<description>A dragon vagina. Has a similar texture to their outer hide.</description>
		<descriptionHyperlinks><ThingDef>DragonVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>DragonVagina</spawnThingOnRemoved>
		<modExtensions>

				<props>

Loose

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>RaccoonPenis</defName>
		procyonine penis
		<labelNoun>a procyonine penis</labelNoun>
		<description>A raccoon penis.</description>
		<descriptionHyperlinks><ThingDef>RaccoonPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>RaccoonPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Long

Thin

Rigid

Sheathed

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>HemiPenis</defName>
		hemipenis
		<labelNoun>a hemipenis</labelNoun>
		<description>Twice the members for double the fun.</description>
		<descriptionHyperlinks><ThingDef>HemiPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>HemiPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Barbed

Tapered

Multiple

Small

Internal

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>CrocodilianPenis</defName>
		crocodilian penis
		<labelNoun>a crocodilian penis</labelNoun>
		<description>A crocodilian penis. Large and permenantly erect.</description>
		<descriptionHyperlinks><ThingDef>CrocodilianPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CrocodilianPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Rigid

Internal

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBreast">
		<DefaultBodyPartList>

Torso

		</DefaultBodyPartList>
		<DefaultBodyPart>Torso</DefaultBodyPart>
		<defName>UdderBreasts</defName>
		udder
		<labelNoun>an udders</labelNoun>
		<description>A animal like "breasts" with 4 nipples.</description>
		<descriptionHyperlinks><ThingDef>UdderBreasts</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>UdderBreasts</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>NarrowVagina</defName>
		narrow vagina
		<labelNoun>a narrow vagina</labelNoun>
		<description>A tight, narrow vagina.</description>
		<descriptionHyperlinks><ThingDef>NarrowVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>NarrowVagina</spawnThingOnRemoved>
		<modExtensions>

				<props>

Tight

Deep

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>NeedlePenis</defName>
		needle penis
		<labelNoun>a needle penis</labelNoun>
		<description>A small and thin penis.</description>
		<descriptionHyperlinks><ThingDef>NeedlePenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>NeedlePenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Sheathed

Long

Thin

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>RodentVagina</defName>
		rodent vagina
		<labelNoun>a rodent vagina</labelNoun>
		<description>A rodent vagina.</description>
		<descriptionHyperlinks><ThingDef>RodentVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>RodentVagina</spawnThingOnRemoved>
		<modExtensions>

				<props>

Tight

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>RodentPenis</defName>
		rodent penis
		<labelNoun>a rodent penis</labelNoun>
		<description>A rodent penis.</description>
		<descriptionHyperlinks><ThingDef>RodentPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>RodentPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Sheathed

Small

Tapered

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>CloacalPenis</defName>
		cloacal penis
		<labelNoun>a cloacal penis</labelNoun>
		<description>A cloacal penis.</description>
		<descriptionHyperlinks><ThingDef>CloacalPenis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CloacalPenis</spawnThingOnRemoved>
		<modExtensions>

				<props>

Internal

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>CloacalVagina</defName>
		cloacal vagina
		<labelNoun>a cloacal vagina</labelNoun>
		<description>A cloacal vagina.</description>
		<descriptionHyperlinks><ThingDef>CloacalVagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CloacalVagina</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartAnus">
		<defName>CloacalAnus</defName>
		cloacal anus
		<labelNoun>cloacal anus</labelNoun>
		<description>A cloacal anus.</description>
		<descriptionHyperlinks><ThingDef>CloacalAnus</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>CloacalAnus</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>DemonTentaclePenis</defName>
		demon tentacles
		<labelNoun>demon tentacles</labelNoun>
		<description>Tentacles capable of reaching corners of the body you never thought possible.</description>
		<descriptionHyperlinks><ThingDef>DemonTentaclePenis</ThingDef></descriptionHyperlinks>
		<modExtensions>

				<props>

Barbed

Prehensile

Thin

Internal

Resizable

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>DemonPenis</defName>
		demon penis
		<labelNoun>a demon penis</labelNoun>
		<description>A large, daunting mass that can cause its lovers to succumb to debauchery.</description>
		<descriptionHyperlinks><ThingDef>DemonPenis</ThingDef></descriptionHyperlinks>
		<modExtensions>

				<props>

Ridged

Barbed

Humanlike

Resizable

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>DemonVagina</defName>
		demon vagina
		<labelNoun>a demon vagina</labelNoun>
		<description>A tight vagina that can send its lovers to heaven.</description>
		<descriptionHyperlinks><ThingDef>DemonVagina</ThingDef></descriptionHyperlinks>
		<modExtensions>

				<props>

Ridged

Tight

Resizable

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartAnus">
		<defName>DemonAnus</defName>
		demon anus
		<labelNoun>a demon anus</labelNoun>
		<description>A demon anus.</description>
		<descriptionHyperlinks><ThingDef>DemonAnus</ThingDef></descriptionHyperlinks>
		<modExtensions>

				<props>

Resizable

				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartPenis">
		<defName>Penis</defName>
		penis
		<labelNoun>a penis</labelNoun>
		<description>A penis.</description>
		<descriptionHyperlinks><ThingDef>Penis</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>Penis</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartVagina">
		<defName>Vagina</defName>
		vagina
		<labelNoun>a vagina</labelNoun>
		<description>A vagina.</description>
		<descriptionHyperlinks><ThingDef>Vagina</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>Vagina</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartAnus">
		<defName>Anus</defName>
		anus
		<labelNoun>an anus</labelNoun>
		<description>A anus.</description>
		<descriptionHyperlinks><ThingDef>Anus</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>Anus</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBreast">
		<defName>Breasts</defName>
		breasts
		<labelNoun>a pair of breasts</labelNoun>
		<description>A pair of breasts.</description>
		<descriptionHyperlinks><ThingDef>Breasts</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>Breasts</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>

	<rjw.HediffDef_PartBase ParentName="NaturalPrivatePartBase">
		<defName>FeaturelessChest</defName>
		featureless chest
		<labelNoun>a featureless chest</labelNoun>
		<description>a flat chest without any nipples where there should be.</description>
		<descriptionHyperlinks><ThingDef>FeaturelessChest</ThingDef></descriptionHyperlinks>
		<spawnThingOnRemoved>FeaturelessChest</spawnThingOnRemoved>
	</rjw.HediffDef_PartBase>
</Defs>