code:
using RimWorld;
using rjw;
using rjw.Modules.Attraction;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using Verse;
using Verse.AI;
using static UnityEngine.GraphicsBuffer;

namespace ElToro_BAddon
{
    [StaticConstructorOnStartup]
    public class WorkGiver_BreedAnimals : WorkGiver_Scanner
    {
        public override PathEndMode PathEndMode => PathEndMode.Touch;

        public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.Pawn);

        public override IEnumerable<Thing> PotentialWorkThingsGlobal(Pawn pawn)
        {
            if (!Settings.BreedingWork)
                yield break;

            var validTargets = new List<Pawn>();
            float minScore = 0.1f;

            var registry = pawn.Map.GetComponent<MapComponent_ForcedBreedingAnimalRegistry>();
            if (registry == null || !registry.designatedAnimals.Any())
                yield break;

            foreach (Pawn target in registry.GetAll())
            {
                if (!xxx.is_animal(target))
                    continue;

                if (target.CurJob != null && target.jobs.curDriver != null &&
                    (target.jobs.curDriver is JobDriver_SexBaseInitiator || target.jobs.curDriver is JobDriver_SexBaseReciever || target.jobs.curDriver.asleep == true))
                    continue;

                if (xxx.IsTargetPawnOkay(pawn))
                    continue;

                if (target.HostileTo(pawn) || target.IsForbidden(pawn))
                    continue;

                if (!PregnancyHelper.CanImpregnate(pawn, target) || (!PregnancyHelper.CanImpregnate(target, pawn)))
                    continue;

                if (!pawn.CanReserveAndReach(target, PathEndMode.Touch, Danger.Some))
                    continue;

                if (!Pather_Utility.cells_to_target_rape(pawn, target.Position))
                    continue;

                if (!CasualSex_Helper.CanHaveSex(target) || !SexUtility.ReadyForLovin(target))
                    continue;

                float score = AttractionUtility.Evaluate(pawn, target, AttractionPurpose.ForFucking);

                if (score >= minScore)
                {
                    validTargets.Add(target);
                }
            }

            foreach (var target in validTargets.OrderByDescending(t => AttractionUtility.Evaluate(pawn, t, AttractionPurpose.ForFucking)))
            {
                yield return target;
            }
        }

        public override bool ShouldSkip(Pawn pawn, bool forced = false)
        {
            if (!Settings.BreedingWork)
                return true;

            if (pawn.TryGetComp<CompForcedBreedingHuman>()?.IsDesignated != true)
                return true;

            if (!SexUtility.ReadyForLovin(pawn))
                return true;

            if (pawn.IsVisiblyPregnant())
                return true;

            return false;
        }

        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn animal = t as Pawn;

            if (animal == null)
                return false;

            if (animal.CurJob != null && animal.jobs.curDriver != null &&
                (animal.jobs.curDriver is JobDriver_SexBaseInitiator || animal.jobs.curDriver is JobDriver_SexBaseReciever || animal.jobs.curDriver.asleep == true))
                return false;

            if (!BreedingWorkHelper.IsDesignatedForForcedBreeding(animal))
                return false;

            if (!xxx.is_animal(animal) || animal.Dead || animal.IsPregnant())
                return false;

            if (!pawn.CanReach(animal, PathEndMode.Touch, Danger.Some))
                return false;

            if (animal.InAggroMentalState)
                return false;

            if (AttractionUtility.Evaluate(pawn, animal, AttractionPurpose.ForFucking) < 0.1f)
                return false;

            if (!CasualSex_Helper.CanHaveSex(pawn) || !CasualSex_Helper.CanHaveSex(animal) || !SexUtility.ReadyForLovin(animal))
                return false;

            if (!PregnancyHelper.CanImpregnate(pawn, animal) || (!PregnancyHelper.CanImpregnate(animal, pawn)))
                return false;

            return true;
        }

        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn animal = t as Pawn;

            if (animal == null)
                return null;

            return JobMaker.MakeJob(defs.AnimalBreedInvite, animal);
        }
    }
}


code:
using RimWorld;
using rjw;
using rjw.Modules.Attraction;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using Verse;
using Verse.AI;

namespace ElToro_BAddon
{
    public class WorkGiver_BreedAnimalsForced : WorkGiver_Scanner
    {
        public override PathEndMode PathEndMode => PathEndMode.Touch;

        public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForGroup(ThingRequestGroup.Pawn);

        public override IEnumerable<Thing> PotentialWorkThingsGlobal(Pawn pawn)
        {
            if (!Settings.BreedingWork)
                yield break;

            var validTargets = new List<Pawn>();

            var registry = pawn.Map.GetComponent<MapComponent_ForcedBreedingAnimalRegistry>();
            if (registry == null || !registry.designatedAnimals.Any())
                yield break;

            foreach (Pawn target in registry.GetAll())
            {
                if (!xxx.is_animal(target))
                    continue;

                if (target.CurJob != null && target.jobs.curDriver != null &&
                    (target.jobs.curDriver is JobDriver_SexBaseInitiator || target.jobs.curDriver is JobDriver_SexBaseReciever || target.jobs.curDriver.asleep))
                    continue;

                if (xxx.IsTargetPawnOkay(target))
                    continue;

                if (target.HostileTo(pawn) || target.IsForbidden(pawn))
                    continue;

                if (!PregnancyHelper.CanImpregnate(pawn, target) || (!PregnancyHelper.CanImpregnate(target, pawn)))
                    continue;

                if (!pawn.CanReserveAndReach(target, PathEndMode.Touch, Danger.Some))
                    continue;

                if (!Pather_Utility.cells_to_target_rape(pawn, target.Position))
                    continue;

                if (!CasualSex_Helper.CanHaveSex(target) || !SexUtility.ReadyForLovin(target))
                    continue;

                validTargets.Add(target);
            }

            foreach (var target in validTargets.InRandomOrder())
                yield return target;
        }

        public override bool ShouldSkip(Pawn pawn, bool forced = false)
        {
            if (!Settings.BreedingWork)
                return true;

            if (pawn.TryGetComp<CompForcedBreedingHuman>()?.IsDesignated != true)
                return true;

            if (!SexUtility.ReadyForLovin(pawn))
                return true;

            if (pawn.IsVisiblyPregnant())
                return true;

            return false;
        }

        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn animal = t as Pawn;

            if (animal == null)
                return false;

            if (animal.CurJob != null && animal.jobs.curDriver != null &&
                (animal.jobs.curDriver is JobDriver_SexBaseInitiator || animal.jobs.curDriver is JobDriver_SexBaseReciever || animal.jobs.curDriver.asleep == true))
                return false;

            if (!BreedingWorkHelper.IsDesignatedForForcedBreeding(animal))
                return false;

            if (!xxx.is_animal(animal) || animal.Dead || animal.IsPregnant())
                return false;

            if (!pawn.CanReach(animal, PathEndMode.Touch, Danger.Some))
                return false;

            if (animal.InAggroMentalState)
                return false;

            if (!CasualSex_Helper.CanHaveSex(pawn) || !CasualSex_Helper.CanHaveSex(animal) || !SexUtility.ReadyForLovin(animal))
                return false;

            if (!PregnancyHelper.CanImpregnate(pawn, animal) || (!PregnancyHelper.CanImpregnate(animal, pawn)))
                return false;

            return true;
        }

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

            bool likesBreeding = BreedingWorkHelper.IsConditionedLikes(pawn);

            if (likesBreeding)
                return JobMaker.MakeJob(defs.AnimalBreedInvite, animal);

            if (AttractionUtility.Evaluate(pawn, animal, AttractionPurpose.ForFucking) < 0.1f)
                return JobMaker.MakeJob(defs.AnimalBreedInviteForced, animal);

            return JobMaker.MakeJob(defs.AnimalBreedInvite, animal);
        }
    }
}

repo_name: ElToro/rjw

license: unknown


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{22D89E69-8BD8-460F-BC36-C01610CB5A75}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ElToro_BAddon</RootNamespace>
    <AssemblyName>ElToro_BAddon</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
    <TargetFrameworkProfile />
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>false</DebugSymbols>
    <DebugType>none</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>..\..\Assemblies\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="0Harmony">
      <HintPath>C:\Steam\steamapps\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Assembly-CSharp">
      <HintPath>C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="Rimworld-Animations">
      <HintPath>..\..\..\..\ModReferences\rimworld-animations-1.5\1.5\Assemblies\Rimworld-Animations.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="RJW">
      <HintPath>..\..\..\..\ModReferences\rjw-5.7\1.6\Assemblies\RJW.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="UnityEngine">
      <HintPath>C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.CoreModule">
      <HintPath>C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.IMGUIModule">
      <HintPath>C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="UnityEngine.TextRenderingModule">
      <HintPath>C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_ForcedBreedingWaiting.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_ForcedBreeding.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_InterspiciesMatingInteractionDecline.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_InterspiciesMatingInteractionAccept.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_InterspiciesMatingInteraction.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Patches\Patch_AnimalInitiatedMating_AfterSexUtilityUpdateRecords.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\PawnTraitsMap.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\ThinkNode\ThinkNode_ConditionalMate.cs" />
    <Compile Include="AnimalInitiatedMating\PawnPreferences\AnimalInitiatedHighPawnPreferences.cs" />
    <Compile Include="AnimalInitiatedMating\PawnPreferences\AnimalInitiatedLowPawnPreferences.cs" />
    <Compile Include="AnimalInitiatedMating\PawnPreferences\AnimalInitiatedMediumPawnPreferences.cs" />
    <Compile Include="BestialityAcceptance\BestialityAcceptancePref.cs" />
    <Compile Include="BestialityAcceptance\PawnPreferences\BestialityAcceptanceHighPawnPreferences.cs" />
    <Compile Include="BestialityAcceptance\PawnPreferences\BestialityAcceptanceMediumPawnPreferences.cs" />
    <Compile Include="BestialityAcceptance\PawnPreferences\BestialityAcceptanceLowPawnPreferences.cs" />
    <Compile Include="BestialityAcceptance\PawnPreferences\Patch_DefaultBestialityDisable.cs" />
    <Compile Include="BreedingWork\Designator\Animal\CompProperties_ForcedBreedingAnimal.cs" />
    <Compile Include="BreedingWork\Designator\Animal\InjectForcedBreedingAnimalComp.cs" />
    <Compile Include="BreedingWork\Designator\Animal\MapComponent\MapComponent_ForcedBreedingAnimalRegistry.cs" />
    <Compile Include="BreedingWork\Designator\Animal\PawnColumnWorker_ForcedBreedingAnimal.cs" />
    <Compile Include="BreedingWork\Designator\Human\CompProperties_ForcedBreedingHuman.cs" />
    <Compile Include="BreedingWork\Designator\Human\InjectForcedBreedingHumanComp.cs" />
    <Compile Include="BreedingWork\Designator\Human\MapComponent\MapComponent_ForcedBreedingHuman.cs" />
    <Compile Include="BreedingWork\Designator\Human\MapComponent\MapComponent_ForcedBreedingHumanRegistry.cs" />
    <Compile Include="BreedingWork\Designator\Human\PawnColumnWorker_ForcedBreedingHuman.cs" />
    <Compile Include="BreedingWork\JobDriver_BreedingWorkSexAnimalInitiate.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptanceBonding.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptance_TryTrain.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptance_DoRecruit.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptanceGiveTraits.cs" />
    <Compile Include="BestialityAcceptance\BestialityAcceptanceUtility.cs" />
    <Compile Include="BestialityAcceptance\BestialityTalk.cs" />
    <Compile Include="BestialityAcceptance\InteractionWorker_BestialityTalk.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptanceNuzzle.cs" />
    <Compile Include="BreedingWork\BreedingWorkHelper.cs" />
    <Compile Include="BreedingWork\JobDriver_AnimalBreedInvite.cs" />
    <Compile Include="BreedingWork\JobDriver_AnimalBreedInviteForced.cs" />
    <Compile Include="BreedingWork\JobDriver_BreedingWorkRapeAnimalInitiate.cs" />
    <Compile Include="BreedingWork\Designator\Animal\MapComponent\MapComponent_ForcedBreedingAnimal.cs" />
    <Compile Include="BreedingWork\PawnPreferences\BreedingWorkPawnPreferences.cs" />
    <Compile Include="BreedingWork\WorkGiver_BreedAnimalsForced.cs" />
    <Compile Include="BreedingWork\WorkGiver_BreedAnimals.cs" />
    <Compile Include="defs.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\InteractionWorker\InteractionWorker_InterspiciesMating.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobGiver\JobGiver_InterspiciesMating.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Patches\Patch_AnimalInitiatedMating_WorkGiver_Train_JobOnThing.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\CompAnimalSexMemory.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\CompInjector_AnimalSexMemory.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\CompProperties_AnimalSexMemory.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\DebugAction.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\JobDriver\JobDriver_TrainInterspeciesSex.cs" />
    <Compile Include="MatingHelper.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\PawnFloatMap.cs" />
    <Compile Include="AnimalInitiatedMating\MatingPartner\Comp\PawnIntMap.cs" />
    <Compile Include="AnimalInitiatedMating\NuzzleSex\DebugAction.cs" />
    <Compile Include="AnimalInitiatedMating\NuzzleSex\InteractionWorker\InteractionWorker_NuzzleSex.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptanceMtbHours.cs" />
    <Compile Include="Hybrid\Patch_ApplyBirthOutcome_NewTemp_AnimalHybrid.cs" />
    <Compile Include="Hybrid\Patch_Hediff_BestialPregnancy_GiveBirth.cs" />
    <Compile Include="Hybrid\Patch_BabyPostBirth_AnimalHybrid.cs" />
    <Compile Include="HarmonyInit.cs" />
    <Compile Include="BestialityAcceptance\Patch_BestialityAcceptanceUpdateRecords.cs" />
    <Compile Include="Hybrid\Patch_HumanHybrid_Changes.cs" />
    <Compile Include="AnimalInitiatedMating\SharedFeatures\JobDriver_SexInitiatorAnimalSex.cs" />
    <Compile Include="AnimalInitiatedMating\SharedFeatures\JobDriver_SexRecieverAnimalSex.cs" />
    <Compile Include="AnimalInitiatedMating\NuzzleSex\Patches\Patch_NuzzleSex_JobDriver_Nuzzle_Escalation.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="settings\Settings.cs" />
    <Compile Include="settings\SettingsController.cs" />
  </ItemGroup>
  <ItemGroup>
    <Analyzer Include="C:\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll" />
  </ItemGroup>
  <ItemGroup />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>


code:
using HarmonyLib;
using RimWorld;
using Verse;

namespace ElToro_BAddon
{
    [StaticConstructorOnStartup]
    internal static class HarmonyInit
    {
        static HarmonyInit()
        {
            Harmony harmony = new Harmony("ElToro_BAddon");

            // Human/Animal Hybrid hediff and it's changes
            if (Settings.Hybrids)
            {
                harmony.CreateClassProcessor(typeof(Patch_Hediff_BestialPregnancy_GiveBirth)).Patch();
                harmony.CreateClassProcessor(typeof(TrainableUtility_TrainedTooRecently_Patch)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_TrainingTrackerTickRare)).Patch();
                harmony.CreateClassProcessor(typeof(ThinkNode_ChancePerHour_Nuzzle_Patch)).Patch();
                harmony.CreateClassProcessor(typeof(JobGiver_Nuzzle_Patch)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BabyPostBirth_AnimalHybrid)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_ApplyBirthOutcome_AnimalHybrid)).Patch();
            }

            // NuzzleSex
            if (Settings.AnimalInitiatedMating)
            {
                harmony.CreateClassProcessor(typeof(Patch_NuzzleSex_JobDriver_Nuzzle_Escalation)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_AnimalInitiatedMating_WorkGiver_Train_JobOnThing)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_AnimalInitiatedMating_AfterSexUtilityUpdateRecords)).Patch();
            }

            if (Settings.BestialityAcceptance)
            {
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptanceUpdateRecords)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptanceMtbHours)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptanceGiveTraits)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptanceNuzzle)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptance_DoRecruit)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptance_TryTrain)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_BestialityAcceptanceBonding)).Patch();
                harmony.CreateClassProcessor(typeof(Patch_DisableDefaultBestialityPreferences)).Patch();
            }
        }
    }
}


code:
using HarmonyLib;
using Verse;
using RimWorld;
using rjw;

namespace ElToro_BAddon
{
    [HarmonyPatch(typeof(PregnancyUtility), "ApplyBirthOutcome")]
    public static class Patch_ApplyBirthOutcome_AnimalHybrid
    {
        public static void Postfix(
            Thing __result,
            Pawn father)
        {
            // Ensure the baby is a human pawn with a story tracker
            if (!(__result is Pawn baby) || baby.story == null || !xxx.is_human(baby))
                return;

            bool isHybrid = xxx.is_animal(father);

            if (!isHybrid)
                return;

            // Assign custom AnimalHybrid trait
            if (!baby.story.traits.HasTrait(defs.AnimalHybrid))
            {
                baby.story.traits.GainTrait(new Trait(defs.AnimalHybrid));
            }
        }
    }
}


code:
using HarmonyLib;
using RimWorld;
using Verse;
using rjw;

namespace ElToro_BAddon
{
    [HarmonyPatch(typeof(Hediff_BasePregnancy), "BabyPostBirth")]
    public static class Patch_BabyPostBirth_AnimalHybrid
    {
        [HarmonyPostfix]
        public static void Postfix(Pawn mother, Pawn father, Pawn baby)
        {
            if (baby == null || baby.story == null || !xxx.is_human(baby)) return;
            bool isHybrid = (xxx.is_human(mother) && xxx.is_animal(father)) || (xxx.is_animal(mother) && xxx.is_human(father));
            if (!isHybrid) return;

            baby.story.traits.GainTrait(new Trait(defs.AnimalHybrid));
        }
    }
}


code:
using HarmonyLib;
using RimWorld;
using Verse;
using rjw;

namespace ElToro_BAddon
{
    [HarmonyPatch(typeof(Hediff_BestialPregnancy), "GiveBirth")]
    public static class Patch_Hediff_BestialPregnancy_GiveBirth
    {
        [HarmonyPostfix]
        public static void Postfix(Hediff_BestialPregnancy __instance)
        {
            Pawn father = __instance.father;
            Pawn mother = __instance.pawn;

            foreach (Pawn baby in __instance.babies)
            {
                if (xxx.is_animal(baby) && (xxx.is_human(mother) || (xxx.is_human(father))))
                {
                    HediffDef humanHybridDef = defs.HumanHybrid;
                    if (baby.health.hediffSet.GetFirstHediffOfDef(humanHybridDef) == null)
                    {
                        baby.health.AddHediff(humanHybridDef);
                    }
                }
            }
        }
    }
}


code:
using HarmonyLib;
using RimWorld;
using System.Linq;
using System.Reflection;
using UnityEngine;
using Verse;
using Verse.AI;

namespace ElToro_BAddon
{

    [HarmonyPatch(typeof(TrainableUtility), "TrainedTooRecently")]
    public static class TrainableUtility_TrainedTooRecently_Patch
    {
        [HarmonyPostfix]
        public static void Postfix(Pawn animal, ref bool __result)
        {
            if (animal.health.hediffSet.HasHediff(defs.HumanHybrid))
            {
                __result = Find.TickManager.TicksGame < animal.mindState.lastAssignedInteractTime + 12000;
            }
        }
    }

    [HarmonyPatch(typeof(Pawn_TrainingTracker), "TrainingTrackerTickRare")]
    public static class Patch_TrainingTrackerTickRare
    {
        private static readonly FieldInfo stepsField = AccessTools.Field(typeof(Pawn_TrainingTracker), "steps");

        public static void Postfix(Pawn_TrainingTracker __instance)
        {
            Pawn pawn = __instance.pawn;
            if (pawn == null || !pawn.health.hediffSet.HasHediff(defs.HumanHybrid))
                return;

            if (__instance.CanBeTrained(TrainableDefOf.Tameness))
            {
                var steps = (DefMap<TrainableDef, int>)stepsField.GetValue(__instance);
                if (steps != null)
                {
                    steps[TrainableDefOf.Tameness] = TrainableDefOf.Tameness.steps;
                }
            }
        }
    }

    [HarmonyPatch(typeof(ThinkNode_ChancePerHour_Nuzzle), "MtbHours")]
    public static class ThinkNode_ChancePerHour_Nuzzle_Patch
    {
        [HarmonyPostfix]
        public static void Postfix(Pawn pawn, ref float __result)
        {
            if (pawn.health.hediffSet.HasHediff(defs.HumanHybrid))
            {
                if (pawn.RaceProps.nuzzleMtbHours <= 0f)
                {
                    __result = 24f;
                }
                else
                {
                    __result = Mathf.Max(pawn.RaceProps.nuzzleMtbHours * 0.5f, 0.5f);
                }
            }
        }
    }

    [HarmonyPatch(typeof(JobGiver_Nuzzle), "TryGiveJob")]
    public static class JobGiver_Nuzzle_Patch
    {
        [HarmonyPostfix]
        public static void Postfix(Pawn pawn, ref Job __result)
        {
            if (pawn.health.hediffSet.HasHediff(defs.HumanHybrid) && __result == null)
            {
                if (!(from p in pawn.Map.mapPawns.SpawnedPawnsInFaction(pawn.Faction)
                      where !p.NonHumanlikeOrWildMan() && p != pawn && p.Position.InHorDistOf(pawn.Position, 40f)
                      && pawn.GetRoom() == p.GetRoom() && !p.Position.IsForbidden(pawn) && p.CanCasuallyInteractNow()
                      select p).TryRandomElement(out var result))
                {
                    return;
                }

                Job job = JobMaker.MakeJob(JobDefOf.Nuzzle, result);
                job.locomotionUrgency = LocomotionUrgency.Walk;
                job.expiryInterval = 3000;
                __result = job;
            }
        }
    }
}


code:
using RimWorld;
using rjw;
using rjw.Modules.Attraction;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using UnityEngine;
using Verse;
using Verse.AI;

namespace ElToro_BAddon
{
    internal class MatingHelper
    {
        public static Pawn FindBestSexPartner(Pawn animal, bool ishumanmating = true)
        {
            if (animal == null || !xxx.is_animal(animal))
                return null;

            Pawn fixated = TryFindFixatedPartner(animal);
            if (fixated != null)
                return fixated;

            if (ishumanmating)
                return FindHighestScoringHumanPartner(animal);

            if (!ishumanmating)
                return FindHighestScoringAnimalPartner(animal);

            return null;
        }

        public static Pawn TryFindFixatedPartner(Pawn animal)
        {
            if (animal.relations == null || animal.relations.DirectRelations == null)
                return null;

            foreach (DirectPawnRelation rel in animal.relations.DirectRelations)
            {
                if (rel.def == defs.FixatedMatingPartner)
                {
                    Pawn fixated = rel.otherPawn;
                    if (fixated != null &&
                        xxx.IsTargetPawnOkay(fixated) &&
                        fixated.Map == animal.Map &&
                        !fixated.IsForbidden(animal) &&
                        !fixated.HostileTo(animal) &&
                        animal.CanReach(fixated, PathEndMode.OnCell, Danger.Some) &&
                        fixated.CanReserve(animal) &&
                        AttractionUtility.Evaluate(animal, fixated, AttractionPurpose.ForFucking) > 0.1f &&
                        AttractionUtility.Evaluate(fixated, animal, AttractionPurpose.ForFucking) > 0.1f)
                    {
                        return fixated;
                    }
                }
            }
            return null;
        }

        public static Pawn FindHighestScoringHumanPartner(Pawn animal)
        {

            List<Pawn> candidates = animal.Map.mapPawns.AllPawns.Where(human =>
                human != animal &&
                xxx.is_human(human) &&
                xxx.IsTargetPawnOkay(human) &&
                !human.IsForbidden(animal) &&
                !human.HostileTo(animal) &&
                animal.CanReach(human, PathEndMode.OnCell, Danger.Some) &&
                CasualSex_Helper.CanHaveSex(human) &&
                AttractionUtility.Evaluate(animal, human, AttractionPurpose.ForFucking) > 0.1f &&
                AttractionUtility.Evaluate(human, animal, AttractionPurpose.ForFucking) > 0.1f
            ).ToList();

            if (candidates.NullOrEmpty())
                return null;

            var comp = animal.TryGetComp<CompAnimalSexMemory>();
            Pawn bestPartner = null;
            float bestScore = 0f;

            foreach (Pawn human in candidates)
            {
                float score = AttractionUtility.Evaluate(animal, human, AttractionPurpose.ForFucking);

                if (animal.relations.DirectRelationExists(PawnRelationDefOf.Bond, human))
                    score += 0.3f;

                if (comp != null)
                {
                    float affinity = comp.GetAffinityMap().TryGetValue(human, out var a) ? a : 0f;
                    int sexCount = comp.GetSexCount().TryGetValue(human, out var s) ? s : 0;

                    score += affinity * 0.5f;
                    score += Mathf.Min(sexCount * 0.01f, 0.2f);
                }

                // Distance penalty
                float dist = (animal.Position - human.Position).LengthHorizontal;
                score -= dist * 0.005f;

                if (score > bestScore)
                {
                    bestScore = score;
                    bestPartner = human;
                }
            }

            return bestPartner;
        }
        public static Pawn FindHighestScoringAnimalPartner(Pawn pawn, bool shouldbeColony = true)
        {
            Dictionary<Pawn, float> dictionary = new Dictionary<Pawn, float>();
            IEnumerable<Pawn> enumerable = pawn.Map.mapPawns.AllPawns.Where((Pawn x) => x != pawn && xxx.is_animal(x) && xxx.can_get_raped(x) && !x.IsForbidden(pawn) && !x.Suspended && !x.HostileTo(pawn) && pawn.CanReserveAndReach(x, PathEndMode.Touch, Danger.Some) && pawn.def.race != x.def.race);

            if (!enumerable.Any())
            {
                return null;
            }

            var comp = pawn.TryGetComp<CompAnimalSexMemory>();
            Pawn bestPartner = null;
            float bestScore = 0f;

            const float MaxBodySizeDiff = 1f;

            foreach (Pawn item in enumerable)
            {
                if (shouldbeColony == true)
                {
                    if (item.Faction != pawn.Faction)
                    {
                        continue;
                    }
                }

                if (Math.Abs(item.BodySize - pawn.BodySize) > MaxBodySizeDiff)
                    continue;

                float score = AttractionUtility.Evaluate(pawn, item, AttractionPurpose.ForFucking);

                if (comp != null)
                {
                    float affinity = comp.GetAffinityMap().TryGetValue(item, out var a) ? a : 0f;
                    int sexCount = comp.GetSexCount().TryGetValue(item, out var s) ? s : 0;

                    score += affinity * 0.5f;
                    score += Mathf.Min(sexCount * 0.01f, 0.2f);
                }

                if (Pather_Utility.cells_to_target_rape(pawn, item.Position))
                {
                    float dist = (pawn.Position - item.Position).LengthHorizontal;
                    score -= dist * 0.005f;

                    if (score > bestScore)
                    {
                        bestScore = score;
                        bestPartner = item;
                    }
                }
            }

            return bestPartner;
        }
        public static int CountPreferredPartners(Pawn animal)
        {
            if (animal?.relations == null)
                return 0;

            int count = 0;
            foreach (var rel in animal.relations.DirectRelations)
            {
                if (rel.def == defs.PreferredMatingPartner)
                    count++;
            }
            return count;
        }
        public static int CountFixatedPartners(Pawn animal)
        {
            if (animal?.relations == null)
                return 0;

            int count = 0;
            foreach (var rel in animal.relations.DirectRelations)
            {
                if (rel.def == defs.FixatedMatingPartner)
                    count++;
            }
            return count;
        }
        public static void ShortenLovinCooldown(Pawn pawn, float delay_reduction = 0.75f)
        {
            if (pawn == null || pawn.Dead) return;

            int now = Find.TickManager.TicksGame;
            int current_delay = pawn.mindState.canLovinTick - now;

            if (current_delay <= 0) return;

            int new_delay = (int)(current_delay * delay_reduction);
            if (new_delay < 1) new_delay = 1;

            pawn.mindState.canLovinTick = now + new_delay;
        }
        public static IntVec3 FindSexLocation(Pawn pawn, Pawn partner = null)
        {
            IntVec3 position = pawn.Position;
            int num = -100;
            IntVec3 result = pawn.Position;
            int maxInclusive = 40;
            FloatRange floatRange = pawn.ComfortableTemperatureRange();
            List<Pawn> list = pawn.Map.mapPawns.AllPawnsSpawned.Where((Pawn x) => x.Position.DistanceTo(pawn.Position) < 100f && xxx.is_human(x) && x != pawn && x != partner).ToList();
            bool flag = false;
            bool flag2 = false;
            List<IntVec3> list2 = new List<IntVec3>();
            Dictionary<int, int> dictionary = new Dictionary<int, int>();
            for (int i = 0; i < 50; i++)
            {
                list2.Add(position + IntVec3.FromVector3(Vector3Utility.HorizontalVectorFromAngle(Rand.Range(0, 360)) * Rand.RangeInclusive(1, maxInclusive)));
            }

            list2 = list2.Where((IntVec3 x) => x.Standable(pawn.Map) && x.InAllowedArea(pawn) && x.InAllowedArea(partner) && x.GetDangerFor(pawn, pawn.Map) != Danger.Deadly && !x.ContainsTrap(pawn.Map) && !x.ContainsStaticFire(pawn.Map)).Distinct().ToList();
            foreach (IntVec3 item in list2)
            {
                Room room = item.GetRoom(pawn.Map);
                if (!dictionary.ContainsKey(room.ID) && !room.PsychologicallyOutdoors)
                {
                    dictionary.Add(room.ID, room.ContainedAndAdjacentThings.Count((Thing x) => x.def.IsDoor && x.def.holdsRoof && x.def.blockLight));
                }
            }

            foreach (IntVec3 random_cell in list2)
            {
                if (!Pather_Utility.cells_to_target_casual(pawn, random_cell))
                {
                    continue;
                }

                int num2 = 0;
                Room room2 = random_cell.GetRoom(pawn.Map);
                bool flag3 = CasualSex_Helper.MightBeSeen(list, random_cell, pawn, partner);
                if (flag2)
                {
                    num2 = ((!flag3) ? (num2 - 10) : (num2 + 5));
                }
                else if (flag3)
                {
                    num2 -= 30;
                }

                if (partner == null && flag && list.Any((Pawn x) => !x.Awake() && x.Position.DistanceTo(random_cell) < 6f && GenSight.LineOfSight(random_cell, x.Position, pawn.Map)))
                {
                    num2 += 50;
                }

                num2 = ((!(random_cell.GetTemperature(pawn.Map) > floatRange.min) || !(random_cell.GetTemperature(pawn.Map) < floatRange.max)) ? (num2 - 20) : (num2 + 20));
                if (random_cell.Roofed(pawn.Map))
                {
                    num2 += 5;
                }

                if (random_cell.HasEatSurface(pawn.Map))
                {
                    num2 += 5;
                }

                if (random_cell.GetDangerFor(pawn, pawn.Map) == Danger.Some)
                {
                    num2 -= 25;
                }
                else if (random_cell.GetDangerFor(pawn, pawn.Map) == Danger.None)
                {
                    num2 += 5;
                }

                if (random_cell.GetTerrain(pawn.Map) == TerrainDefOf.WaterShallow || random_cell.GetTerrain(pawn.Map) == TerrainDefOf.WaterMovingShallow || random_cell.GetTerrain(pawn.Map) == TerrainDefOf.WaterOceanShallow)
                {
                    num2 -= 20;
                }

                if (random_cell.GetThingList(pawn.Map).Any((Thing x) => x.def.IsWithinCategory(ThingCategoryDefOf.Corpses)))
                {
                    num2 = ((!xxx.is_necrophiliac(pawn)) ? (num2 - 20) : (num2 + 20));
                }

                if (random_cell.GetThingList(pawn.Map).Any((Thing x) => x.def.IsWithinCategory(ThingCategoryDefOf.Foods)))
                {
                    num2 -= 10;
                }

                if (room2 == pawn.Position.GetRoom(pawn.MapHeld))
                {
                    num2 -= 10;
                }

                if (room2.PsychologicallyOutdoors)
                {
                    num2 += 5;
                }

                if (room2.IsHuge)
                {
                    num2 -= 5;
                }

                if (room2.ContainedBeds.Any())
                {
                    num2 += 5;
                    if (room2.ContainedBeds.Any((Building_Bed x) => x.Position == random_cell))
                    {
                        num2 += 5;
                    }
                }

                if (!room2.Owners.Any())
                {
                    num2 += 10;
                }
                else if (room2.Owners.Contains(pawn))
                {
                    num2 += 20;
                }

                if (room2.IsDoorway && !flag2)
                {
                    num2 -= 100;
                }

                if (room2.Role == RoomRoleDefOf.Bedroom)
                {
                    num2 += 10;
                }
                else if (room2.Role == RoomRoleDefOf.Barracks || room2.Role == RoomRoleDefOf.PrisonBarracks || room2.Role == RoomRoleDefOf.PrisonCell || room2.Role == VanillaRoomRoleDefOf.Laboratory || room2.Role == VanillaRoomRoleDefOf.RecRoom || room2.Role == VanillaRoomRoleDefOf.DiningRoom || room2.Role == RoomRoleDefOf.Hospital)
                {
                    num2 = ((!flag2) ? (num2 - 5) : (num2 + 10));
                }

                if (room2.GetStat(RoomStatDefOf.Cleanliness) < 0.01f)
                {
                    num2 -= 5;
                }

                if (room2.GetStat(RoomStatDefOf.GraveVisitingJoyGainFactor) > 0.1f)
                {
                    num2 = ((!xxx.is_necrophiliac(pawn)) ? (num2 - 5) : (num2 + 5));
                }

                int num3 = dictionary.TryGetValue(room2.ID, 0);
                if (num3 > 1)
                {
                    num2 = ((!flag2) ? (num2 - 5 * num3) : (num2 + 2 * num3));
                }

                if (num2 > num)
                {
                    num = num2;
                    result = random_cell;
                }
            }

            return result;
        }
        public static bool IsBestiality(Pawn a, Pawn b, out Pawn human)
        {
            if (xxx.is_human(a) && xxx.is_animal(b))
            {
                human = a;
                return true;
            }
            if (xxx.is_animal(a) && xxx.is_human(b))
            {
                human = b;
                return true;
            }
            human = null;
            return false;
        }
    }
}


code:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ElToro_BAddon")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ElToro_BAddon")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("22d89e69-8bd8-460f-bc36-c01610cb5a75")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


code:
using RimWorld;
using Rimworld_Animations;
using Verse;

namespace ElToro_BAddon
{
    [DefOf]
    public static class defs
	{
        public static readonly HediffDef BestialityAcceptance;
        public static readonly HediffDef HumanHybrid;
        public static readonly TraitDef AnimalHybrid;
        public static readonly InteractionDef NuzzleSex;
        public static readonly InteractionDef NuzzleSexForcedFemale;
        public static readonly InteractionDef NuzzleSexForcedMale;
        public static readonly InteractionDef NuzzleSexAcceptedFemale;
        public static readonly InteractionDef NuzzleSexAcceptedMale;
        public static readonly InteractionDef NuzzleSexDeclinedFemale;
        public static readonly InteractionDef NuzzleSexDeclinedMale;
        public static readonly InteractionDef NuzzleSexWaitingForcedFemale;
        public static readonly InteractionDef NuzzleSexWaitingForcedMale;
        public static readonly InteractionDef NuzzleSexCancel;
        public static readonly InteractionDef InterspiciesHumanMatingMale;
        public static readonly InteractionDef InterspiciesHumanMatingFemale;
        public static readonly InteractionDef BreedingWorkInviteFemale;
        public static readonly InteractionDef BreedingWorkInviteMale;
        public static readonly InteractionDef BreedingWorkInviteForcedFemale;
        public static readonly InteractionDef BreedingWorkInviteForcedMale;
        public static readonly InteractionDef BreedingWorkAnimalResponseMale;
        public static readonly InteractionDef BreedingWorkAnimalResponseFemale;
        public static readonly InteractionDef BreedingWorkAnimalResponseMaleForced;
        public static readonly InteractionDef BreedingWorkAnimalResponseFemaleForced;
        public static readonly JobDef SexInitiatorAnimalSex;
        public static readonly JobDef BreedingWorkSexAnimalInitiate;
        public static readonly JobDef BreedingWorkRapeAnimalInitiate;
        public static readonly JobDef SexRecieverAnimalSex;
        public static readonly JobDef InterspiciesMatingInteraction;
        public static readonly JobDef InterspiciesMatingInteractionAccept;
        public static readonly JobDef InterspiciesMatingInteractionDecline;
        public static readonly JobDef ForcedBreeding;
        public static readonly JobDef ForcedBreedingWaiting;
        public static readonly JobDef ForcedBreedingReciever;
        public static readonly JobDef ForcedBreedingRecieverMale;
        public static readonly JobDef AnimalBreedInvite;
        public static readonly JobDef AnimalBreedInviteForced;
        public static readonly PawnRelationDef PreferredMatingPartner;
        public static readonly PawnRelationDef FixatedMatingPartner;
        public static readonly PawnRelationDef ExMatingPartner;
        public static readonly TrainableDef InterspeciesHumanSex;
        public static readonly TrainableDef InterspeciesAnimalSex;
        public static readonly PreceptDef BreedingWorkMaleColonists;
        public static readonly PreceptDef BreedingWorkMaleSlaves;
        public static readonly PreceptDef BreedingWorkMaleForcedColonists;
        public static readonly PreceptDef BreedingWorkMaleForcedSlaves;
        public static readonly PreceptDef BreedingWorkFemaleColonists;
        public static readonly PreceptDef BreedingWorkFemaleSlaves;
        public static readonly PreceptDef BreedingWorkFemaleForcedColonists;
        public static readonly PreceptDef BreedingWorkFemaleForcedSlaves;
        public static readonly PreceptDef ForcedBreed_AllAnimals;
        public static readonly PreceptDef ForcedBreed_PenAnimals;
        public static readonly PreceptDef ForcedBreed_NonPenAnimals;
        public static readonly PreceptDef ForcedBreed_Venerated;
        public static readonly PreceptDef ForcedBreed_NonVenerated;
        public static readonly PreceptDef ForcedBreed_NonBonded;
        public static readonly ThoughtDef BreedingWork_FemaleColonist_Neg;
        public static readonly ThoughtDef BreedingWork_FemaleColonist_Pos;
        public static readonly ThoughtDef BreedingWork_MaleColonist_Neg;
        public static readonly ThoughtDef BreedingWork_MaleColonist_Pos;
        public static readonly ThoughtDef BreedingWork_FemaleSlave_Neg;
        public static readonly ThoughtDef BreedingWork_FemaleSlave_Pos;
        public static readonly ThoughtDef BreedingWork_MaleSlave_Neg;
        public static readonly ThoughtDef BreedingWork_MaleSlave_Pos;
        public static readonly ThoughtDef BreedingWork_BreedingConditionedFemale;
        public static readonly ThoughtDef BreedingWork_BreedingConditionedMale;
    }
}


code:
using RimWorld;
using System.Collections.Generic;
using UnityEngine;
using Verse;

namespace ElToro_BAddon
{
    public class Settings : ModSettings
    {
        public static bool BestialityAcceptance = false;
        public static bool AnimalInitiatedMating = false;
        public static bool Hybrids = false;
        public static bool BreedingWork = false;
        public static float BestialityTalkChances = 1f;
        public static float InterspiciesHumanModifier = 1f;
        public static float InterspiciesRapeModifier = 1f;

        public override void ExposeData()
        {
            base.ExposeData();
            Scribe_Values.Look(ref BestialityAcceptance, "BestialityAcceptance", false);
            Scribe_Values.Look(ref AnimalInitiatedMating, "AnimalInitiatedMating", false);
            Scribe_Values.Look(ref Hybrids, "Hybrids", false);
            Scribe_Values.Look(ref BreedingWork, "BreedingWork", false);
            Scribe_Values.Look(ref BestialityTalkChances, "BestialityTalkChances", 1f);
            Scribe_Values.Look(ref InterspiciesHumanModifier, "InterspiciesHumanModifier", 1f);
            Scribe_Values.Look(ref InterspiciesRapeModifier, "InterspiciesRapeModifier", 1f);
        }

        private static FeatureTab selectedTab = FeatureTab.BestialityAcceptance;

        private enum FeatureTab
        {
            BestialityAcceptance,
            AnimalInitiatedMating,
            BreedingWork,
            Hybrids
        }

        public static void DoWindowContents(Rect inRect)
        {
            Rect tabRect = new Rect(inRect.x, inRect.y + 32f, inRect.width, 30f);
            Rect contentRect = new Rect(inRect.x, inRect.y + 70f, inRect.width, inRect.height - 70f);

            List<TabRecord> tabs = new List<TabRecord>
            {
                new TabRecord("Bestiality Acceptance", () => selectedTab = FeatureTab.BestialityAcceptance, selectedTab == FeatureTab.BestialityAcceptance),
                new TabRecord("Animal-initiated mating", () => selectedTab = FeatureTab.AnimalInitiatedMating, selectedTab == FeatureTab.AnimalInitiatedMating),
                new TabRecord("Breeding Work", () => selectedTab = FeatureTab.BreedingWork, selectedTab == FeatureTab.BreedingWork),
                new TabRecord("Hybrids", () => selectedTab = FeatureTab.Hybrids, selectedTab == FeatureTab.Hybrids)
            };
            TabDrawer.DrawTabs(tabRect, tabs);

            Listing_Standard listing = new Listing_Standard();
            listing.Begin(contentRect);
            listing.Gap(4f);

            switch (selectedTab)
            {
                case FeatureTab.BestialityAcceptance:
                    Text.Font = GameFont.Small;
                    listing.Label("Replaces the zoophile trait acquisition system. Instead of a fixed sex count threshold, pawns gradually develop acceptance through casual interactions with animals. A new 'Bestiality Talk' interaction can influence this acceptance. Higher acceptance increases the chance of engaging in bestiality, and only high acceptance + experience will lead to the zoophile trait.");
                    Text.Font = GameFont.Medium;
                    listing.GapLine();

                    bool prevAcceptance = BestialityAcceptance;
                    listing.CheckboxLabeled("Enable Bestiality Acceptance", ref BestialityAcceptance, tooltip:"Requires restart");
                    if (BestialityAcceptance != prevAcceptance)
                    {
                        Find.WindowStack.Add(new Dialog_MessageBox("This setting requires a restart to take effect."));
                    }

                    listing.Gap();
                    BestialityTalkChances = listing.SliderLabeled(
                        $"Bestiality Talk Chances: {BestialityTalkChances:F1}",
                        BestialityTalkChances,
                        0.1f,
                        2f,
                        tooltip: "Changes initialization chances for Bestiality Talk between pawns."
                    );

                    Rect lastRect = listing.GetRect(24f);
                    Rect buttonRect = new Rect(lastRect.x + 8f, lastRect.y, 60f, 24f);
                    if (Widgets.ButtonText(buttonRect, "Reset"))
                    {
                        BestialityTalkChances = 1f;
                    }
                    break;

                case FeatureTab.AnimalInitiatedMating:
                    Text.Font = GameFont.Small;
                    listing.Label("Animals with specific paraphilic traits or special training may attempt to mate with a human. The chance to initiate matting attempt depends on the animal's paraphilia level, hybrid status, and more. The human may accept or reject based on their willingness.");
                    Text.Font = GameFont.Medium;
                    listing.GapLine();

                    bool prevNuzzle = AnimalInitiatedMating;
                    listing.CheckboxLabeled("Enable Animal Initiated mating", ref AnimalInitiatedMating, tooltip: "Requires restart");
                    if (AnimalInitiatedMating != prevNuzzle)
                    {
                        Find.WindowStack.Add(new Dialog_MessageBox("This setting requires a restart to take effect."));
                    }

                    listing.Gap();
                    InterspiciesHumanModifier = listing.SliderLabeled(
                        $"Interspicies Human Mating modifier: {InterspiciesHumanModifier:F1}",
                        InterspiciesHumanModifier,
                        0.1f,
                        2f,
                        tooltip: "Changes acceptance chances for Interspicies Human Mating for animal-initiated human mating attempt."
                    );

                    Rect InterspiciesHumanModifierlastRect = listing.GetRect(24f);
                    Rect InterspiciesHumanModifierbuttonRect = new Rect(InterspiciesHumanModifierlastRect.x + 8f, InterspiciesHumanModifierlastRect.y, 60f, 24f);
                    if (Widgets.ButtonText(InterspiciesHumanModifierbuttonRect, "Reset"))
                    {
                        InterspiciesHumanModifier = 1f;
                    }
                    listing.Gap();
                    InterspiciesRapeModifier = listing.SliderLabeled(
                        $"Interspicies Human Rape modifier: {InterspiciesRapeModifier:F1}",
                        InterspiciesRapeModifier,
                        0f,
                        10f,
                        tooltip: "Changes Rape chances for Interspicies Human Mating for animal-initiated and rejected by a human mating attempt. Also affects job interruption chances for aggresive animals."
                    );

                    // Add reset button
                    Rect InterspiciesRapeModifierlastRect = listing.GetRect(24f);
                    Rect InterspiciesRapeModifierbuttonRect = new Rect(InterspiciesRapeModifierlastRect.x + 8f, InterspiciesRapeModifierlastRect.y, 60f, 24f);
                    if (Widgets.ButtonText(InterspiciesRapeModifierbuttonRect, "Reset"))
                    {
                        InterspiciesRapeModifier = 1f;
                    }
                    break;

                case FeatureTab.Hybrids:
                    Text.Font = GameFont.Small;
                    listing.Label("Adds hybrid traits and hediffs to offspring of human-animal pairings. Hybrid animals gain bonuses: they won't go wild, are easier to train, may nuzzle regardless of species, and have increased human affinity. Humans with the hybrid trait get bonuses to animal interactions.");
                    Text.Font = GameFont.Medium;
                    listing.GapLine();

                    bool prevHybrids = Hybrids;
                    listing.CheckboxLabeled("Enable Hybrids", ref Hybrids, tooltip: "Requires restart");
                    if (Hybrids != prevHybrids)
                    {
                        Find.WindowStack.Add(new Dialog_MessageBox("This setting requires a restart to take effect."));
                    }

                    break;

                case FeatureTab.BreedingWork:
                    Text.Font = GameFont.Small;
                    listing.Label("Adds new Precepts that will allow colony pawns to breed marked animals as a separate work if assigned to Handling.");
                    Text.Font = GameFont.Medium;
                    listing.GapLine();

                    listing.CheckboxLabeled("Enable Breeding Work", ref BreedingWork, tooltip: "Works without restart");

                    break;
            }

            listing.End();
        }
    }
}


code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Verse;

namespace ElToro_BAddon
{
    public class ElToro_BAddon_SettingsController : Mod
    {
        private readonly Settings settings;

        public ElToro_BAddon_SettingsController(ModContentPack content) : base(content)
        {
            settings = GetSettings<Settings>();
        }

        public override string SettingsCategory()
        {
            return "ElToro Bestiality Addon";
        }

        public override void DoSettingsWindowContents(Rect inRect)
        {
            Settings.DoWindowContents(inRect);
        }

    }
}


code:
# Máy hàn Jasic

## Getting started

To make it easy for you to get started with GitLab, here's a list of recommended next steps.

Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!

## Add your files

- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:

```
cd existing_repo
git remote add origin https://gitgud.io/mayhanjasic/may-han-jasic.git
git branch -M master
git push -uf origin master
```

## Integrate with your tools

- [ ] [Set up project integrations](https://gitgud.io/mayhanjasic/may-han-jasic/-/settings/integrations)

## Collaborate with your team

- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)

## Test and Deploy

Use the built-in continuous integration in GitLab.

- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)

***

# Editing this README

When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!).  Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.

## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.

## Name
Choose a self-explaining name for your project.

## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.

## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.

## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.

## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.

## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.

## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.

## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.

## Contributing
State if you are open to contributions and what your requirements are for accepting them.

For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.

You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.

## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.

## License
For open source projects, say how it is licensed.

## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.

repo_name: mayhanjasic/may


code:
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

repo_name: Jaaldabaoth/licentia

path: .gitignore


code:
<?xml version="1.0" encoding="utf-8"?>
<ModMetaData>
  <name>RimJobWorld - Licentia Labs</name>
  <author>LustLicentia and Linkolas and Ed86</author>
	<url>https://gitgud.io/John-the-Anabaptist/licentia-labs</url>
  <supportedVersions>

1.5

  </supportedVersions>
  <packageId>LustLicentia.RJWLabs</packageId>
  <description>
    Adds body altering serums and stetching mechanics to RimJobWorld.

    Last tested with RJW 5.3.0.5.
	v0.11
	- Updated for RJW 5.3.0.5.
	- SexAbility references removed or replaced with SexFrequency references.
    - Rebalanced serum prices.
    v0.10.1
    - Updated for RJW 4.9.6.1.
    - By amevarashi:
      - Fixes issues in determining penetrator/penetratee.
      - Prevent double-counting of stretching or cumflation.
    v0.10
    - Updated for RJW 4.9.4.2.
    v0.9.1
    - Hotfix to fix a nullable pawn problem when checking for deadness.
    v0.9
    - Updated for RJW 4.8.1.1.
    - Cumflation calculations now occur whenever an orgasm occurs (TransferNutrition is called).
    - Cumflation now satisfies thirst.
    - Pawns with the "Likes Cumflation" trait no longer vomit, but instead leak.
    - Stretching and cumflation mechanics now use new RJW penetration determiner, so results from sex are probably more consistent.
    - Added a record for cumstuffing and cumflation.
    v0.8.1
    - Hotfix to fix a problem with cum vomit.
    v0.8.0
    - Updated for Rimworld 1.3 and RJW 4.7.1.1.
    - Added cum vomit.
    - Fixed a bug where oral cumstuffing did not work.
    - Increased threshold for prolapse damage.
    v0.7.4
    - Continued work on the recipe patching, with help from Abraxas.
    - Added Russian localisation, courtesy of Natsu_Zirok.
    - Added a null check for GetAdjustedHediffDimensions.
    v0.7.4
    - Added prolapse surgery to a recipe patch so that the surgeries are usable.
    - Changed Harmony integration from HarmonyPrefix to HarmonyPostfix to prevent Pawns from getting downed mid-sex.
    - Removed consciousness penalties from cumflation to prevent death from consciousness loss.
    - Fixed a bug where cumflation would not be persistent.
    - Added a null check in the GetAdjustedHediffDimensions function.
    v0.7.2
    - Made vomit occur immediately after sex instead of interrupting it.
    v0.7.1
    - Fixed a bug where the penetrator pawn was being considered for serum/body effects in orifice calculations.
    - Minor code changes.
    v0.7
    - Overhauled stretching calculation to take into account multiple penetrators and extended RJW values (i.e. length and girth).
    - Difficulty of extreme stretching has increased; extremely overstretched orifices can take up to 4 days to restore.
    - Prolapse and damage are no longer chance based but size-based.
    - Damage caused to stretched orifices has increased in severity, meaning that a number of stretching penetrations can destroy an orifice.
    - New Hediff added: "CervixPunch".
    - Added option to violate thermodynamics when transferring nutrition (i.e. pawns can transfer nutrition even if they themselves have none left).
    - When cumflation is enabled, too much anal cumflation will overflow into the stomach, and too much overflow from the stomach will induce vomiting.
    - Settings have been cleaned up; old settings file will error out.
    v0.6.1
    - Added option to transfer nutrition upon orally cumming (cumflation amount is unaffected).
    - Added "Likes Cumflation trait" serum (for adding and removing serum through gameplay).
    v0.6
    - Slightly adjusted text and effects of cumflation in general.
    - Added oral cumflation.
    - Added overinflation effects (just mood, no health).
    - Added "Likes Cumflation" trait.
    v0.5f - Ed86
    - Raised serum prices and production costs
    - Changed research tree, most research are now spacer tech
    - Moved gender serums to own research
    - Slightly changed some descriptions
    - Removed double effect from temp serums
    - Changed serum effect from sexability to sexdrive
    v0.5e - Ed86
    - Updated for RJW 4.2.0.
    v0.5d - Ed86
    - Changed stretching from random rolls to size comparison.
    - Permanent stretching = pp 150% > orifice
    - Temp stretching = pp > orifice
    - Changed cuminflation to use real ejaculation value
    - Fixed genital growing serums
    v0.5c - Skömer
    - Growth/reduction rework: serums add/remove 10% size on a scale where "huge" is 90%, so you may need multiple serums to go a rjw size up (from average to big for example). Stretching  uses the same system.
    - Inflation calculations have been reworked. Inflation multiplier slider can be set to up to 20x.
    - You'll need rjw race support mod for the futa/genderbend/reverter to work as intended if you use alien races.
    Updated to 1.1 by Ed86
    Updated to 1.1 by Linkolas
    Based on mod version: 0.4b by LustLicentia
    Preview image provided by the lovely yuriob262.
  </description>
  <modDependencies>

      <packageId>rim.job.world</packageId>
      <displayName>RimJobWorld</displayName>
      <downloadUrl>https://www.loverslab.com/files/file/7257-rimjobworld/</downloadUrl>

      <packageId>brrainz.harmony</packageId>
      <displayName>Harmony</displayName>
      <steamWorkshopUrl>steam://url/CommunityFilePage/2009463077</steamWorkshopUrl>
      <downloadUrl>https://github.com/pardeike/HarmonyRimWorld/releases/latest</downloadUrl>

      <packageId>UnlimitedHugs.HugsLib</packageId>
      <displayName>HugsLib</displayName>
      <downloadUrl>https://github.com/UnlimitedHugs/RimworldHugsLib/releases/latest</downloadUrl>
      <steamWorkshopUrl>steam://url/CommunityFilePage/818773962</steamWorkshopUrl>

  </modDependencies>
  <loadAfter>

rim.job.world

brrainz.harmony

UnlimitedHugs.HugsLib

  </loadAfter>
</ModMetaData>


code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest>
  <identifier>RJW-LicentiaLabs</identifier>
  <version>0.10.1</version>
  <dependencies>

RimJobWorld

  </dependencies>
  <incompatibleWith/>
  <loadBefore>
  </loadBefore>
  <loadAfter>

RimJobWorld

  </loadAfter>
</Manifest>


code:
# Changelog

Last tested with RJW 4.9.6.1

## v0.11

- Updated for RJW 5.3.0.5.
- SexAbility references removed or replaced with SexFrequency references.
- Rebalanced serum prices.

## v0.10.1

- Updated for RJW 4.9.6.1.
- By amevarashi:
  - Fixes issues in determining penetrator/penetratee.
  - Prevent double-counting of stretching or cumflation.

## v0.10

- Updated for RJW 4.9.4.2.

## v0.9.1

- Hotfix to fix a nullable pawn problem when checking for deadness.

## v0.9

- Updated for RJW 4.8.1.1.
- Cumflation calculations now occur whenever an orgasm occurs (TransferNutrition is called).
- Cumflation now satisfies thirst.
- Pawns with the "Likes Cumflation" trait no longer vomit, but instead leak.
- Stretching and cumflation mechanics now use new RJW penetration determiner, so results from sex are probably more consistent.
- Added a record for cumstuffing and cumflation.

## v0.8.1

- Hotfix to fix a problem with cum vomit.

## v0.8.0

- Updated for Rimworld 1.3 and RJW 4.7.1.1.
- Added cum vomit.
- Fixed a bug where oral cumstuffing did not work.
- Increased threshold for prolapse damage.

## v0.7.4

- Continued work on the recipe patching, with help from Abraxas.
- Added Russian localisation, courtesy of Natsu_Zirok.
- Added a null check for GetAdjustedHediffDimensions.

## v0.7.3

- Added prolapse surgery to a recipe patch so that the surgeries are usable.
- Changed Harmony integration from HarmonyPrefix to HarmonyPostfix to prevent Pawns from getting downed mid-sex.
- Removed consciousness penalties from cumflation to prevent death from consciousness loss.
- Fixed a bug where cumflation would not be persistent.
- Added a null check in the GetAdjustedHediffDimensions function.

## v0.7.2

- Made vomit occur immediately after sex instead of interrupting it.

## v0.7.1

- Fixed a bug where the penetrator pawn was being considered for serum/body effects in orifice calculations.
- Minor code changes.

## v0.7.0

- Overhauled stretching calculation to take into account multiple penetrators and extended RJW values (i.e. length and girth).
- Difficulty of extreme stretching has increased; extremely overstretched orifices can take up to 4 days to restore.
- Prolapse and damage are no longer chance based but size-based.
- Damage caused to stretched orifices has increased in severity, meaning that a number of stretching penetrations can destroy an orifice.
- New Hediff added: "CervixPunch".
- Added option to violate thermodynamics when transferring nutrition (i.e. pawns can transfer nutrition even if they themselves have none left).
- When cumflation is enabled, too much anal cumflation will overflow into the stomach, and too much overflow from the stomach will induce vomiting.
- Settings have been cleaned up; old settings file will error out.

## v0.6.1

- Added option to transfer nutrition upon orally cumming (cumflation amount is unaffected).
- Added "Likes Cumflation trait" serum (for adding and removing serum through gameplay).

## v0.6

- Slightly adjusted text and effects of cumflation in general.
- Added oral cumflation.
- Added overinflation effects (just mood, no health).
- Added "Likes Cumflation" trait.

## v0.5f - Ed86

- Raised serum prices and production costs
- Changed research tree, most research are now spacer tech
- Moved gender serums to own research
- Slightly changed some descriptions
- Removed double effect from temp serums
- Changed serum effect from sexability to sexdrive

## v0.5e - Ed86

- Updated for RJW 4.2.0.

## v0.5d - Ed86

- Changed stretching from random rolls to size comparison.
- Permanent stretching = pp 150% > orifice
- Temp stretching = pp > orifice
- Changed cuminflation to use real ejaculation value
- Fixed genital growing serums

## v0.5c - Skömer

- Growth/reduction rework: serums add/remove 10% size on a scale where "huge" is 90%, so you may need multiple serums to go a rjw size up (from average to big for example). Stretching  uses the same system.
- Inflation calculations have been reworked. Inflation multiplier slider can be set to up to 20x.
- You'll need rjw race support mod for the futa/genderbend/reverter to work as intended if you use alien races.

## Other

Updated to 1.1 by Ed86
Updated to 1.1 by Linkolas
Based on mod version: 0.4b by LustLicentia
Preview image provided by the lovely yuriob262.


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

  <ThingDef ParentName="LL_SerumBase">
    <defName>BreastExpansionSerum</defName>
    breast expansion serum
    <description>Increases the user's breast size.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>100</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>30</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>BreastReductionSerum</defName>
    breast reduction serum
    <description>Decreases the user's breast size.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>100</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>30</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>GenitalExtrusionSerum</defName>
    genital extrusion serum
    <description>Increases the size of the user's penis. Alternatively, it will decrease the size of a vagina.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>500</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>40</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>GenitalRetractionSerum</defName>
    genital retraction serum
    <description>Decreases the size of the user's penis. Alternatively, it will increase the size of a vagina.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>50</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>15</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>CumIncreaseSerum</defName>
    Cum+ serum
    <description>Increases the ammount of cum production.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>250</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>12</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>CumDecreaseSerum</defName>
    Cum- serum
    <description>Decreases the ammount of cum production.</description>
    <graphicData>
      <color>(140,0,0)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>5</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>150</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>16</HormonalSerum>
    </costList>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>TighteningSerumAnal</defName>
    anal tightening serum
    <description>Tightens up the user's anus...</description>
    <recipeMaker>
      <researchPrerequisite>BasicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>6</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>250</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>20</HormonalSerum>
    </costList>
    <graphicData>
      <color>(100,220,100)</color>
    </graphicData>
    <comps>

    </comps>
  </ThingDef>

</Defs>

path: Defs/Drugs/Alteration Serums.xml


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

  <ThingDef ParentName="LL_SerumBase">
    <defName>GenderBendSerum</defName>
    genderbend serum
    <description>Swaps penises and vaginas and adds or removes breasts.</description>
    <graphicData>
      <color>(140,100,170)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>GenderChangeSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>6</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <costList>
      <HormonalSerum>12</HormonalSerum>
    </costList>
    <statBases>
      <MarketValue>300</MarketValue>
    </statBases>
    <comps>

    </comps>
    <ingestible>
      <outcomeDoers>

          <hediffDef>Genderbent</hediffDef>
          <severity>1</severity>
          <toleranceChemical>HormonalSerum</toleranceChemical>

          <need>Sex</need>
          <offset>-0.35</offset>

      </outcomeDoers>
    </ingestible>
  </ThingDef>

  <ThingDef ParentName="LL_SerumBase">
    <defName>FutaSerum</defName>
    futa serum
    <description>Makes the user a futa if they aren't already.</description>
    <graphicData>
      <color>(140,100,170)</color>
    </graphicData>
    <recipeMaker>
      <researchPrerequisite>GenderChangeSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>6</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <costList>
      <HormonalSerum>10</HormonalSerum>
    </costList>
    <statBases>
      <MarketValue>300</MarketValue>
    </statBases>
    <comps>

    </comps>
    <ingestible>
      <outcomeDoers>

          <hediffDef>Genderbent</hediffDef>
          <severity>1</severity>
          <toleranceChemical>HormonalSerum</toleranceChemical>

          <need>Sex</need>
          <offset>-0.35</offset>

      </outcomeDoers>
    </ingestible>
  </ThingDef>

  <HediffDef>
    <defName>Genderbent</defName>
    <hediffClass>HediffWithComps</hediffClass>
    <description>Description text</description>
    genderbent
    <labelNoun>genderbent</labelNoun>
    <defaultLabelColor>(1,0,0.5)</defaultLabelColor>
    <scenarioCanAdd>false</scenarioCanAdd>
    <maxSeverity>1.0</maxSeverity>
    <isBad>false</isBad>
    <comps>

        <severityPerDay>-0.25</severityPerDay>

    </comps>
    <stages>

        needs change
        <statOffsets>
          <SexFrequency>-0.5</SexFrequency>
        </statOffsets>

        acclimated
        <minSeverity>0.1</minSeverity>

        horny
        <minSeverity>0.70</minSeverity>
        <statOffsets>
          <SexFrequency>0.3</SexFrequency>
          <Vulnerability>0.2</Vulnerability>
        </statOffsets>

        confused
        <minSeverity>0.95</minSeverity>

    </stages>
  </HediffDef>

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

        feeling uneasy
        <description>I tire of this altered body.</description>
        <baseMoodEffect>15</baseMoodEffect>

        acclimated
        <description>I've adapted to my new body.</description>
        <baseMoodEffect>25</baseMoodEffect>

        genderbent
        <description>I feel so lovely and warm... and these new parts! I must try them!</description>
        <baseMoodEffect>30</baseMoodEffect>

        genderbent confusion
        <description>What's happening to me? I feel all warped inside.</description>
        <baseMoodEffect>15</baseMoodEffect>

    </stages>
  </ThoughtDef>

</Defs>

path: Defs/Drugs/Genderbend Serums.xml


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

  <ThingDef ParentName="LL_SerumBase">
    <defName>ReverterSerum</defName>
    reverter serum
    <description>Reverts a humanoid pawn to have average human parts.</description>
    <recipeMaker>
      <researchPrerequisite>ReverterSerum</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>8</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>150</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>10</HormonalSerum>
    </costList>
    <graphicData>
      <color>(100,220,100)</color>
    </graphicData>
    <comps>

    </comps>
  </ThingDef>

  <ThingDef Name="LL_MutagenicSerumBase"
            ParentName="LL_SerumBase"
            Abstract="True">
    <recipeMaker>
      <researchPrerequisite>MutagenicSerums</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>8</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <costList>
      <HormonalSerum>10</HormonalSerum>
    </costList>
    <statBases>
      <MarketValue>150</MarketValue>
    </statBases>
    <ingestible>
      <outcomeDoers>

          <hediffDef>MutatedParts</hediffDef>
          <severity>1</severity>
          <toleranceChemical>HormonalSerum</toleranceChemical>

          <need>Sex</need>
          <offset>-0.40</offset>

      </outcomeDoers>
    </ingestible>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>CanineMutagenicSerum</defName>
    canine mutagenic serum
    <description>Gives the user canine genitalia.</description>
    <graphicData>
      <color>(220,145,30)</color>
    </graphicData>
    <comps>

        <penisDef>DogPenis</penisDef>
        <vaginaDef>DogVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>FelineMutagenicSerum</defName>
    feline mutagenic serum
    <description>Gives the user feline genitalia.</description>
    <graphicData>
      <color>(240,200,30)</color>
    </graphicData>
    <comps>

        <penisDef>CatPenis</penisDef>
        <vaginaDef>CatVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>EquineMutagenicSerum</defName>
    equine mutagenic serum
    <description>Gives the user equine genitalia.</description>
    <graphicData>
      <color>(60,40,15)</color>
    </graphicData>
    <statBases>
      <MarketValue>250</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>11</HormonalSerum>
    </costList>
    <comps>

        <penisDef>HorsePenis</penisDef>
        <vaginaDef>HorseVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>DraconicMutagenicSerum</defName>
    draconic mutagenic serum
    <description>Gives the user draconic genitalia.</description>
    <graphicData>
      <color>(25,5,35)</color>
    </graphicData>
    <statBases>
      <MarketValue>250</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>12</HormonalSerum>
    </costList>
    <comps>

        <penisDef>DragonPenis</penisDef>
        <vaginaDef>DragonVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>DemonicMutagenicSerum</defName>
    demonic mutagenic serum
    <description>Gives the user demonic genitalia and anus.</description>
    <graphicData>
      <color>(100,0,30)</color>
    </graphicData>
    <costList>
      <HormonalSerum>16</HormonalSerum>
    </costList>
    <statBases>
      <MarketValue>300</MarketValue>
    </statBases>
    <comps>

        <penisDef>DemonPenis</penisDef>
        <vaginaDef>DemonVagina</vaginaDef>

        <anus>true</anus>
        <anusDef>DemonAnus</anusDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>SlimeMutagenicSerum</defName>
    slime mutagenic serum
    <description>Gives the user slime breasts, genitalia, and anus.</description>
    <graphicData>
      <color>(45,170,40)</color>
    </graphicData>
    <costList>
      <HormonalSerum>20</HormonalSerum>
    </costList>
    <statBases>
      <MarketValue>320</MarketValue>
    </statBases>
    <comps>

        <penisDef>SlimeTentacles</penisDef>
        <vaginaDef>SlimeVagina</vaginaDef>

        <anus>true</anus>
        <anusDef>SlimeAnus</anusDef>
        <breast>true</breast>
        <breastDef>SlimeBreasts</breastDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>InsectoidMutagenicSerum</defName>
    insectoid mutagenic serum
    <description>Gives the user an ovipositor and insectoid anus.</description>
    <graphicData>
      <color>(5,5,0)</color>
    </graphicData>
    <comps>

        <penisDef>OvipositorM</penisDef>
        <vaginaDef>OvipositorF</vaginaDef>

        <anus>true</anus>
        <anusDef>InsectAnus</anusDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>RodentMutagenicSerum</defName>
    rodent mutagenic serum
    <description>Gives the user rodent genitalia.</description>
    <graphicData>
      <color>(150,80,20)</color>
    </graphicData>
    <statBases>
      <MarketValue>200</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>8</HormonalSerum>
    </costList>
    <comps>

        <penisDef>RodentPenis</penisDef>
        <vaginaDef>RodentVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>NarrowMutagenicSerum</defName>
    narrow mutagenic serum
    <description>Gives the user narrow genitalia.</description>
    <graphicData>
      <color>(130,100,10)</color>
    </graphicData>
    <statBases>
      <MarketValue>220</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>9</HormonalSerum>
    </costList>
    <comps>

        <penisDef>NeedlePenis</penisDef>
        <vaginaDef>NarrowVagina</vaginaDef>

    </comps>
  </ThingDef>

  <ThingDef ParentName="LL_MutagenicSerumBase">
    <defName>CloacalMutagenicSerum</defName>
    cloacal mutagenic serum
    <description>Gives the user a cloaca.</description>
    <graphicData>
      <color>(220,190,110)</color>
    </graphicData>
    <comps>

        <penisDef>CloacalPenis</penisDef>
        <vaginaDef>CloacalVagina</vaginaDef>

        <anus>true</anus>
        <anusDef>CloacalAnus</anusDef>

    </comps>
  </ThingDef>

  <HediffDef>
    <defName>MutatedParts</defName>
    <hediffClass>HediffWithComps</hediffClass>
    <description>Description text</description>
    mutated parts
    <labelNoun>mutated parts</labelNoun>
    <defaultLabelColor>(140,0,0)</defaultLabelColor>
    <scenarioCanAdd>false</scenarioCanAdd>
    <maxSeverity>1.0</maxSeverity>
    <isBad>false</isBad>
    <comps>

        <severityPerDay>-0.25</severityPerDay>

    </comps>
    <stages>

        horny
        <statOffsets>
          <SexFrequency>0.3</SexFrequency>
          <Vulnerability>0.2</Vulnerability>
        </statOffsets>

        growing
        <minSeverity>0.90</minSeverity>
        <statOffsets>
          <SexFrequency>-0.7</SexFrequency>
          <Vulnerability>0.3</Vulnerability>
        </statOffsets>
        <painOffset>0.1</painOffset>

    </stages>
  </HediffDef>

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

        mutated parts
        <description>I feel so lovely and warm... and these new parts! I must try them!</description>
        <baseMoodEffect>10</baseMoodEffect>

        growing mutated parts
        <description>What's happenning to me? I feel all warped inside.</description>
        <baseMoodEffect>-5</baseMoodEffect>

    </stages>
  </ThoughtDef>

</Defs>

path: Defs/Drugs/Mutagenic Serums.xml


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

  <ThingDef ParentName="LL_SerumBase">
    <defName>ProductionSerum</defName>
    production serum
    <description>Makes the user produce hormonal serum every few days. Can cause mild mood issues.</description>
    <recipeMaker>
      <researchPrerequisite>ProducingSerum</researchPrerequisite>
      <recipeUsers>

DrugLab

      </recipeUsers>
      <workSpeedStat>DrugCookingSpeed</workSpeedStat>
      <workSkill>Intellectual</workSkill>
      <skillRequirements>
        <Intellectual>12</Intellectual>
      </skillRequirements>
    </recipeMaker>
    <statBases>
      <MarketValue>320</MarketValue>
    </statBases>
    <costList>
      <HormonalSerum>26</HormonalSerum>
    </costList>
    <graphicData>
      <color>(0,10,80)</color>
    </graphicData>
    <ingestible>
      <outcomeDoers>

          <hediffDef>ProducingHormonalSerum</hediffDef>
          <severity>0</severity>
          <toleranceChemical>HormonalSerum</toleranceChemical>

      </outcomeDoers>
    </ingestible>
  </ThingDef>

  <HediffDef>
    <defName>ProducingHormonalSerum</defName>
    <description>Description text</description>
    <hediffClass>LicentiaLabs.Hediff_ProducingHormonalSerum</hediffClass>
    producing serum
    <labelNoun>producing serum</labelNoun>
    <defaultLabelColor>(202,202,218)</defaultLabelColor>
    <scenarioCanAdd>false</scenarioCanAdd>
    <maxSeverity>1.0</maxSeverity>
    <isBad>false</isBad>
    <comps>

        <severityPerDay>0.25</severityPerDay>

    </comps>
    <stages>

        empty

        producing
        <minSeverity>0.1</minSeverity>

        full
        <minSeverity>0.90</minSeverity>

    </stages>
  </HediffDef>

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

        <visible>false</visible>

        <visible>false</visible>

        hormonal
        <description>I'm such a mess.</description>
        <baseMoodEffect>-5</baseMoodEffect>

    </stages>
  </ThoughtDef>

</Defs>

path: Defs/Drugs/Production Serums.xml