mirror of
				https://github.com/amevarashi/RJW-Sexperience.git
				synced 2024-08-14 23:54:08 +00:00 
			
		
		
		
	Merge branch 'master' into unmerged-rjw
This commit is contained in:
		
						commit
						6455c529e2
					
				
					 7 changed files with 303 additions and 424 deletions
				
			
		| 
						 | 
				
			
			@ -33,9 +33,7 @@ namespace RJWSexperience
 | 
			
		|||
        [DebugAction("RJW Sexperience", "Reset lust", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)]
 | 
			
		||||
        private static void ResetLust(Pawn p)
 | 
			
		||||
        {
 | 
			
		||||
            float lust;
 | 
			
		||||
            if (xxx.is_nympho(p)) lust = p.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, 0);
 | 
			
		||||
            else lust = p.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, float.MinValue);
 | 
			
		||||
            float lust = RecordRandomizer.RandomizeLust(p);
 | 
			
		||||
            MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Lust: " + lust);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,10 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using HarmonyLib;
 | 
			
		||||
using HarmonyLib;
 | 
			
		||||
using RimWorld;
 | 
			
		||||
using Verse;
 | 
			
		||||
using rjw;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using Verse;
 | 
			
		||||
 | 
			
		||||
namespace RJWSexperience
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -21,98 +15,11 @@ namespace RJWSexperience
 | 
			
		|||
		{
 | 
			
		||||
			if (Configurations.EnableRecordRandomizer && __result != null && !request.Newborn && xxx.is_human(__result))
 | 
			
		||||
			{
 | 
			
		||||
                int avgsex = -500;
 | 
			
		||||
                bool isvirgin = Rand.Chance(Configurations.VirginRatio);
 | 
			
		||||
                int totalsex = 0;
 | 
			
		||||
                int totalbirth = 0;
 | 
			
		||||
                int deviation = (int)Configurations.MaxSexCountDeviation;
 | 
			
		||||
                if (__result.story != null)
 | 
			
		||||
                {
 | 
			
		||||
                    float lust;
 | 
			
		||||
                    if (xxx.is_nympho(__result)) lust = __result.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, 0);
 | 
			
		||||
                    else lust = __result.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, float.MinValue);
 | 
			
		||||
 | 
			
		||||
                    int sexableage = 0;
 | 
			
		||||
                    int minsexage = 0;
 | 
			
		||||
                    if (Configurations.MinSexableFromLifestage)
 | 
			
		||||
                        minsexage = (int)__result.RaceProps.lifeStageAges.Find(x => x.def.reproductive).minAge;
 | 
			
		||||
                    else
 | 
			
		||||
                        minsexage = (int)(__result.RaceProps.lifeExpectancy * Configurations.MinSexablePercent);
 | 
			
		||||
 | 
			
		||||
                    if (__result.ageTracker.AgeBiologicalYears > minsexage)
 | 
			
		||||
                    {
 | 
			
		||||
                        sexableage = __result.ageTracker.AgeBiologicalYears - minsexage;
 | 
			
		||||
                        avgsex = (int)(sexableage * Configurations.SexPerYear * __result.LustFactor());
 | 
			
		||||
				RecordRandomizer.Randomize(__result);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    if (__result.relations != null && __result.gender == Gender.Female)
 | 
			
		||||
                    {
 | 
			
		||||
                        totalbirth += __result.relations.ChildrenCount;
 | 
			
		||||
                        totalsex += totalbirth;
 | 
			
		||||
                        __result.records?.AddTo(xxx.CountOfSexWithHumanlikes, totalbirth);
 | 
			
		||||
                        __result.records?.SetTo(xxx.CountOfBirthHuman, totalbirth);
 | 
			
		||||
                        if (totalbirth > 0) isvirgin = false;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!isvirgin)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (xxx.is_rapist(__result))
 | 
			
		||||
                        {
 | 
			
		||||
                            if (xxx.is_zoophile(__result))
 | 
			
		||||
                            {
 | 
			
		||||
                                if (__result.Has(Quirk.ChitinLover)) totalsex += __result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
                                else totalsex += __result.RecordRandomizer(xxx.CountOfRapedAnimals, avgsex, deviation);
 | 
			
		||||
                            }
 | 
			
		||||
                            else totalsex += __result.RecordRandomizer(xxx.CountOfRapedHumanlikes, avgsex, deviation);
 | 
			
		||||
                            avgsex /= 8;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (xxx.is_zoophile(__result))
 | 
			
		||||
                        {
 | 
			
		||||
                            if (__result.Has(Quirk.ChitinLover)) totalsex += __result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
                            else totalsex += __result.RecordRandomizer(xxx.CountOfSexWithAnimals, avgsex, deviation);
 | 
			
		||||
                            avgsex /= 10;
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (xxx.is_necrophiliac(__result))
 | 
			
		||||
                        {
 | 
			
		||||
                            totalsex += __result.RecordRandomizer(xxx.CountOfSexWithCorpse, avgsex, deviation);
 | 
			
		||||
                            avgsex /= 4;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (__result.IsSlave)
 | 
			
		||||
                        {
 | 
			
		||||
                            totalsex += __result.RecordRandomizer(xxx.CountOfBeenRapedByAnimals, Rand.Range(-50, 10), Rand.Range(0, 10) * sexableage);
 | 
			
		||||
                            totalsex += __result.RecordRandomizer(xxx.CountOfBeenRapedByHumanlikes, 0, Rand.Range(0, 100) * sexableage);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        totalsex += __result.RecordRandomizer(xxx.CountOfSexWithHumanlikes, avgsex, deviation);
 | 
			
		||||
                        
 | 
			
		||||
                        if (totalsex > 0) __result.records.AddTo(VariousDefOf.SexPartnerCount, Math.Max(1, Rand.Range(0, totalsex/7)));
 | 
			
		||||
			__result.AddVirginTrait();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
                __result.records?.SetTo(xxx.CountOfSex, totalsex);
 | 
			
		||||
                RJWUtility.GenerateSextypeRecords(__result, totalsex);
 | 
			
		||||
            }
 | 
			
		||||
            if (__result.story?.traits != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (__result.IsVirgin())
 | 
			
		||||
                {
 | 
			
		||||
                    int degree = 0;
 | 
			
		||||
                    if (__result.gender == Gender.Female) degree = 2;
 | 
			
		||||
                    Trait virgin = new Trait(VariousDefOf.Virgin, degree ,true);
 | 
			
		||||
                    __result.story.traits.GainTrait(virgin);
 | 
			
		||||
                }
 | 
			
		||||
                else if (__result.gender == Gender.Female && Rand.Chance(0.05f))
 | 
			
		||||
                {
 | 
			
		||||
                    Trait virgin = new Trait(VariousDefOf.Virgin, 1, true);
 | 
			
		||||
                    __result.story.traits.GainTrait(virgin);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	[HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")]
 | 
			
		||||
	public class HumanlikeOrder_Patch
 | 
			
		||||
| 
						 | 
				
			
			@ -124,17 +31,13 @@ namespace RJWSexperience
 | 
			
		|||
			if (pawn.health.hediffSet.HasHediff(RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake))
 | 
			
		||||
				foreach (LocalTargetInfo t in targets)
 | 
			
		||||
				{
 | 
			
		||||
                Building building = t.Thing as Building;
 | 
			
		||||
                if (building != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (building is Building_CumBucket)
 | 
			
		||||
					if (t.Thing is Building_CumBucket building)
 | 
			
		||||
					{
 | 
			
		||||
						opts.AddDistinct(MakeMenu(pawn, building));
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
		}
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		public static FloatMenuOption MakeMenu(Pawn pawn, LocalTargetInfo target)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -146,5 +49,4 @@ namespace RJWSexperience
 | 
			
		|||
			return option;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,6 +74,7 @@
 | 
			
		|||
    <Compile Include="Patches\DefInjection.cs" />
 | 
			
		||||
    <Compile Include="Patches\GetGizmos.cs" />
 | 
			
		||||
    <Compile Include="Recipe_HymenSurgery.cs" />
 | 
			
		||||
    <Compile Include="SexHistory\RecordRandomizer.cs" />
 | 
			
		||||
    <Compile Include="RJWUtility.cs" />
 | 
			
		||||
    <Compile Include="SexHistory\HistoryUtility.cs" />
 | 
			
		||||
    <Compile Include="SexHistory\SexHistory.cs" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,8 +35,7 @@ namespace RJWSexperience
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        public static bool IsVirgin(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn.records.GetValue(VariousDefOf.VaginalSexCount) == 0) return true;
 | 
			
		||||
            return false;
 | 
			
		||||
			return pawn.records.GetValue(VariousDefOf.VaginalSexCount) == 0;
 | 
			
		||||
		}
 | 
			
		||||
		public static bool HasHymen(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -132,10 +131,8 @@ namespace RJWSexperience
 | 
			
		|||
 | 
			
		||||
            DetermineGiversAndReceivers(props, out Pawn giver, out Pawn receiver);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if (partner != null)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                switch (sextype)
 | 
			
		||||
                {
 | 
			
		||||
                    case xxx.rjwSextype.Vaginal:
 | 
			
		||||
| 
						 | 
				
			
			@ -151,7 +148,7 @@ namespace RJWSexperience
 | 
			
		|||
                        {
 | 
			
		||||
                            IncreaseRecords(giver, receiver, VariousDefOf.OralSexCount, VariousDefOf.BlowjobCount);
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (Genital_Helper.has_penis_infertile(receiver) || Genital_Helper.has_penis_infertile(receiver))
 | 
			
		||||
                        else if (Genital_Helper.has_penis_fertile(receiver) || Genital_Helper.has_penis_infertile(receiver))
 | 
			
		||||
                        {
 | 
			
		||||
                            IncreaseRecords(giver, receiver, VariousDefOf.BlowjobCount, VariousDefOf.OralSexCount);
 | 
			
		||||
                        }
 | 
			
		||||
| 
						 | 
				
			
			@ -251,90 +248,6 @@ namespace RJWSexperience
 | 
			
		|||
            partner.records?.AddTo(recordforpartner, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void GenerateSextypeRecords(Pawn pawn, int totalsex)
 | 
			
		||||
        {
 | 
			
		||||
            float totalweight =
 | 
			
		||||
                RJWPreferenceSettings.vaginal +
 | 
			
		||||
                RJWPreferenceSettings.anal +
 | 
			
		||||
                RJWPreferenceSettings.fellatio +
 | 
			
		||||
                RJWPreferenceSettings.cunnilingus +
 | 
			
		||||
                RJWPreferenceSettings.rimming +
 | 
			
		||||
                RJWPreferenceSettings.double_penetration +
 | 
			
		||||
                RJWPreferenceSettings.breastjob +
 | 
			
		||||
                RJWPreferenceSettings.handjob +
 | 
			
		||||
                RJWPreferenceSettings.mutual_masturbation +
 | 
			
		||||
                RJWPreferenceSettings.fingering +
 | 
			
		||||
                RJWPreferenceSettings.footjob +
 | 
			
		||||
                RJWPreferenceSettings.scissoring +
 | 
			
		||||
                RJWPreferenceSettings.fisting +
 | 
			
		||||
                RJWPreferenceSettings.sixtynine;
 | 
			
		||||
            Gender prefer = pawn.PreferGender();
 | 
			
		||||
            int sex = (int)(totalsex * RJWPreferenceSettings.vaginal / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.VaginalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.anal / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.AnalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.fellatio / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.BlowjobCount, sex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.OralSexCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.cunnilingus / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.OralSexCount, sex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.CunnilingusCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.rimming / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.double_penetration / totalweight) / 2;
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.VaginalSexCount, sex);
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.AnalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.breastjob / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.handjob / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.HandjobCount, sex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.fingering / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            if (prefer == Gender.Female) pawn.records.AddTo(VariousDefOf.FingeringCount, sex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.mutual_masturbation / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.HandjobCount, sex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.FingeringCount, sex);
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.footjob / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.FootjobCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.scissoring / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
            sex = (int)(totalsex * RJWPreferenceSettings.fisting / totalweight);
 | 
			
		||||
            totalsex -= sex;
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
            pawn.records.AddTo(VariousDefOf.OralSexCount, totalsex);
 | 
			
		||||
            if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.BlowjobCount, totalsex);
 | 
			
		||||
            else pawn.records.AddTo(VariousDefOf.CunnilingusCount, totalsex);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Gender PreferGender(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            if (pawn.gender == Gender.Male)
 | 
			
		||||
| 
						 | 
				
			
			@ -349,18 +262,6 @@ namespace RJWSexperience
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool GetRapist(this SexProps props, out Pawn rapist)
 | 
			
		||||
        {
 | 
			
		||||
            if (!props.isRape)
 | 
			
		||||
            {
 | 
			
		||||
                rapist = null;
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            rapist = props.pawn;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool IsBestiality(this SexProps props)
 | 
			
		||||
        {
 | 
			
		||||
            if (props.partner != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -426,7 +327,5 @@ namespace RJWSexperience
 | 
			
		|||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										196
									
								
								RJWSexperience/RJWSexperience/SexHistory/RecordRandomizer.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								RJWSexperience/RJWSexperience/SexHistory/RecordRandomizer.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,196 @@
 | 
			
		|||
using rjw;
 | 
			
		||||
using System;
 | 
			
		||||
using Verse;
 | 
			
		||||
using RimWorld;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
namespace RJWSexperience
 | 
			
		||||
{
 | 
			
		||||
	public static class RecordRandomizer
 | 
			
		||||
	{
 | 
			
		||||
		public static void Randomize(Pawn pawn)
 | 
			
		||||
		{
 | 
			
		||||
			int avgsex = -500;
 | 
			
		||||
			bool isvirgin = Rand.Chance(Configurations.VirginRatio);
 | 
			
		||||
			int totalsex = 0;
 | 
			
		||||
			int totalbirth = 0;
 | 
			
		||||
			int deviation = (int)Configurations.MaxSexCountDeviation;
 | 
			
		||||
			if (pawn.story != null)
 | 
			
		||||
			{
 | 
			
		||||
				_ = RandomizeLust(pawn);
 | 
			
		||||
 | 
			
		||||
				int sexableage = 0;
 | 
			
		||||
				int minsexage = 0;
 | 
			
		||||
				if (Configurations.MinSexableFromLifestage)
 | 
			
		||||
					minsexage = (int)pawn.RaceProps.lifeStageAges.Find(x => x.def.reproductive).minAge;
 | 
			
		||||
				else
 | 
			
		||||
					minsexage = (int)(pawn.RaceProps.lifeExpectancy * Configurations.MinSexablePercent);
 | 
			
		||||
 | 
			
		||||
				if (pawn.ageTracker.AgeBiologicalYears > minsexage)
 | 
			
		||||
				{
 | 
			
		||||
					sexableage = pawn.ageTracker.AgeBiologicalYears - minsexage;
 | 
			
		||||
					avgsex = (int)(sexableage * Configurations.SexPerYear * StatPart_Lust.GetLustFactor(pawn));
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (pawn.relations != null && pawn.gender == Gender.Female)
 | 
			
		||||
				{
 | 
			
		||||
					totalbirth += pawn.relations.ChildrenCount;
 | 
			
		||||
					totalsex += totalbirth;
 | 
			
		||||
					pawn.records?.AddTo(xxx.CountOfSexWithHumanlikes, totalbirth);
 | 
			
		||||
					pawn.records?.SetTo(xxx.CountOfBirthHuman, totalbirth);
 | 
			
		||||
					if (totalbirth > 0) isvirgin = false;
 | 
			
		||||
				}
 | 
			
		||||
				if (!isvirgin)
 | 
			
		||||
				{
 | 
			
		||||
					if (xxx.is_rapist(pawn))
 | 
			
		||||
					{
 | 
			
		||||
						if (xxx.is_zoophile(pawn))
 | 
			
		||||
						{
 | 
			
		||||
							if (pawn.Has(Quirk.ChitinLover)) totalsex += RandomizeRecord(pawn, xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
							else totalsex += RandomizeRecord(pawn, xxx.CountOfRapedAnimals, avgsex, deviation);
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							totalsex += RandomizeRecord(pawn, xxx.CountOfRapedHumanlikes, avgsex, deviation);
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						avgsex /= 8;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if (xxx.is_zoophile(pawn))
 | 
			
		||||
					{
 | 
			
		||||
						if (pawn.Has(Quirk.ChitinLover)) totalsex += RandomizeRecord(pawn, xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
						else totalsex += RandomizeRecord(pawn, xxx.CountOfSexWithAnimals, avgsex, deviation);
 | 
			
		||||
						avgsex /= 10;
 | 
			
		||||
					}
 | 
			
		||||
					else if (xxx.is_necrophiliac(pawn))
 | 
			
		||||
					{
 | 
			
		||||
						totalsex += RandomizeRecord(pawn, xxx.CountOfSexWithCorpse, avgsex, deviation);
 | 
			
		||||
						avgsex /= 4;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					if (pawn.IsSlave)
 | 
			
		||||
					{
 | 
			
		||||
						totalsex += RandomizeRecord(pawn, xxx.CountOfBeenRapedByAnimals, Rand.Range(-50, 10), Rand.Range(0, 10) * sexableage);
 | 
			
		||||
						totalsex += RandomizeRecord(pawn, xxx.CountOfBeenRapedByHumanlikes, 0, Rand.Range(0, 100) * sexableage);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					totalsex += RandomizeRecord(pawn, xxx.CountOfSexWithHumanlikes, avgsex, deviation);
 | 
			
		||||
 | 
			
		||||
					if (totalsex > 0) pawn.records.AddTo(VariousDefOf.SexPartnerCount, Math.Max(1, Rand.Range(0, totalsex / 7)));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			pawn.records?.SetTo(xxx.CountOfSex, totalsex);
 | 
			
		||||
			GenerateSextypeRecords(pawn, totalsex);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static float RandomizeLust(Pawn pawn)
 | 
			
		||||
		{
 | 
			
		||||
			float value = Utility.RandGaussianLike(Configurations.AvgLust - Configurations.MaxLustDeviation, Configurations.AvgLust + Configurations.MaxLustDeviation);
 | 
			
		||||
			float minValue;
 | 
			
		||||
 | 
			
		||||
			if (xxx.is_nympho(pawn))
 | 
			
		||||
				minValue = 0;
 | 
			
		||||
			else
 | 
			
		||||
				minValue = float.MinValue;
 | 
			
		||||
 | 
			
		||||
			value = Mathf.Clamp(value, minValue, float.MaxValue);
 | 
			
		||||
			float recordvalue = pawn.records.GetValue(VariousDefOf.Lust);
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.Lust, value - recordvalue);
 | 
			
		||||
 | 
			
		||||
			return value;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static int RandomizeRecord(Pawn pawn, RecordDef record, int avg, int dist, int min = 0, int max = int.MaxValue)
 | 
			
		||||
		{
 | 
			
		||||
			int value = (int)Mathf.Clamp(Utility.RandGaussianLike(avg - dist, avg + dist), min, max);
 | 
			
		||||
			int recordvalue = pawn.records.GetAsInt(record);
 | 
			
		||||
			pawn.records.AddTo(record, value - recordvalue);
 | 
			
		||||
 | 
			
		||||
			return value;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static void GenerateSextypeRecords(Pawn pawn, int totalsex)
 | 
			
		||||
		{
 | 
			
		||||
			float totalweight =
 | 
			
		||||
				RJWPreferenceSettings.vaginal +
 | 
			
		||||
				RJWPreferenceSettings.anal +
 | 
			
		||||
				RJWPreferenceSettings.fellatio +
 | 
			
		||||
				RJWPreferenceSettings.cunnilingus +
 | 
			
		||||
				RJWPreferenceSettings.rimming +
 | 
			
		||||
				RJWPreferenceSettings.double_penetration +
 | 
			
		||||
				RJWPreferenceSettings.breastjob +
 | 
			
		||||
				RJWPreferenceSettings.handjob +
 | 
			
		||||
				RJWPreferenceSettings.mutual_masturbation +
 | 
			
		||||
				RJWPreferenceSettings.fingering +
 | 
			
		||||
				RJWPreferenceSettings.footjob +
 | 
			
		||||
				RJWPreferenceSettings.scissoring +
 | 
			
		||||
				RJWPreferenceSettings.fisting +
 | 
			
		||||
				RJWPreferenceSettings.sixtynine;
 | 
			
		||||
			Gender prefer = pawn.PreferGender();
 | 
			
		||||
			int sex = (int)(totalsex * RJWPreferenceSettings.vaginal / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.VaginalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.anal / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.AnalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.fellatio / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.BlowjobCount, sex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.OralSexCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.cunnilingus / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.OralSexCount, sex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.CunnilingusCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.rimming / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.double_penetration / totalweight) / 2;
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.VaginalSexCount, sex);
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.AnalSexCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.breastjob / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.handjob / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.HandjobCount, sex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.fingering / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			if (prefer == Gender.Female) pawn.records.AddTo(VariousDefOf.FingeringCount, sex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.mutual_masturbation / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.HandjobCount, sex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.FingeringCount, sex);
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.GenitalCaressCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.footjob / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.FootjobCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.scissoring / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
			sex = (int)(totalsex * RJWPreferenceSettings.fisting / totalweight);
 | 
			
		||||
			totalsex -= sex;
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.MiscSexualBehaviorCount, sex);
 | 
			
		||||
 | 
			
		||||
			pawn.records.AddTo(VariousDefOf.OralSexCount, totalsex);
 | 
			
		||||
			if (prefer == Gender.Male) pawn.records.AddTo(VariousDefOf.BlowjobCount, totalsex);
 | 
			
		||||
			else pawn.records.AddTo(VariousDefOf.CunnilingusCount, totalsex);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,65 +1,70 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using rjw;
 | 
			
		||||
using RimWorld;
 | 
			
		||||
using RimWorld;
 | 
			
		||||
using System;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
using Verse;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace RJWSexperience
 | 
			
		||||
{
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// Lust changes SexFrequency stat
 | 
			
		||||
	/// </summary>
 | 
			
		||||
	public class StatPart_Lust : StatPart
 | 
			
		||||
	{
 | 
			
		||||
        public float factor;
 | 
			
		||||
		public float factor; // Value is loaded from XML
 | 
			
		||||
 | 
			
		||||
		public override string ExplanationPart(StatRequest req)
 | 
			
		||||
		{
 | 
			
		||||
            Pawn pawn = req.Thing as Pawn;
 | 
			
		||||
            return Keyed.LustStatFactor(String.Format("{0:0.##}", pawn.LustFactor() * factor * 100));
 | 
			
		||||
 | 
			
		||||
			if (req.HasThing && (req.Thing is Pawn pawn))
 | 
			
		||||
			{
 | 
			
		||||
				return Keyed.LustStatFactor(String.Format("{0:0.##}", GetLustFactor(pawn) * factor * 100));
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void TransformValue(StatRequest req, ref float val)
 | 
			
		||||
		{
 | 
			
		||||
            Pawn pawn = req.Thing as Pawn;
 | 
			
		||||
            if (pawn != null) val *= pawn.LustFactor() * factor;
 | 
			
		||||
			if (req.HasThing && (req.Thing is Pawn pawn))
 | 
			
		||||
				val *= GetLustFactor(pawn) * factor;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static float GetLustFactor(Pawn pawn)
 | 
			
		||||
		{
 | 
			
		||||
			float lust = pawn.records.GetValue(VariousDefOf.Lust) * Configurations.LustEffectPower;
 | 
			
		||||
			if (lust < 0)
 | 
			
		||||
			{
 | 
			
		||||
				lust = Mathf.Exp((lust + 200f * Mathf.Log(10f)) / 100f) - 100f;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				lust = Mathf.Sqrt(100f * (lust + 25f)) - 50f;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return 1 + lust / 100f;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// <summary>
 | 
			
		||||
	/// Make slaves more vulnurable
 | 
			
		||||
	/// </summary>
 | 
			
		||||
	public class StatPart_Slave : StatPart
 | 
			
		||||
	{
 | 
			
		||||
        public float factor;
 | 
			
		||||
		public float factor; // Value is loaded from XML
 | 
			
		||||
 | 
			
		||||
		public override string ExplanationPart(StatRequest req)
 | 
			
		||||
		{
 | 
			
		||||
            float fact = factor * 100;
 | 
			
		||||
            Pawn pawn = req.Thing as Pawn;
 | 
			
		||||
            if (pawn != null)
 | 
			
		||||
			if (req.HasThing && ((req.Thing as Pawn)?.IsSlave == true))
 | 
			
		||||
			{
 | 
			
		||||
                if (pawn.IsSlave)
 | 
			
		||||
                {
 | 
			
		||||
                    return Keyed.SlaveStatFactor(String.Format("{0:0.##}", fact));
 | 
			
		||||
                }
 | 
			
		||||
				return Keyed.SlaveStatFactor(String.Format("{0:0.##}", factor * 100));
 | 
			
		||||
			}
 | 
			
		||||
			return Keyed.SlaveStatFactorDefault;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void TransformValue(StatRequest req, ref float val)
 | 
			
		||||
		{
 | 
			
		||||
            Pawn pawn = req.Thing as Pawn;
 | 
			
		||||
            if (pawn != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (pawn.IsSlave)
 | 
			
		||||
			if (req.HasThing && ((req.Thing as Pawn)?.IsSlave == true))
 | 
			
		||||
			{
 | 
			
		||||
				val *= factor;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ using UnityEngine;
 | 
			
		|||
 | 
			
		||||
namespace RJWSexperience
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    public static class Utility
 | 
			
		||||
    {
 | 
			
		||||
        public static System.Random random = new System.Random(Environment.TickCount);
 | 
			
		||||
| 
						 | 
				
			
			@ -46,44 +45,8 @@ namespace RJWSexperience
 | 
			
		|||
            records.AddTo(record, value - recordval);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        public static float RecordRandomizer(this Pawn pawn, RecordDef record, float avg, float dist, float min = 0, float max = float.MaxValue)
 | 
			
		||||
        {
 | 
			
		||||
            float value = Mathf.Clamp(RandGaussianLike(avg - dist,avg + dist),min,max);
 | 
			
		||||
            float recordvalue = pawn.records.GetValue(record);
 | 
			
		||||
            pawn.records.AddTo(record, value - recordvalue);
 | 
			
		||||
 | 
			
		||||
            return value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static int RecordRandomizer(this Pawn pawn, RecordDef record, int avg, int dist, int min = 0, int max = int.MaxValue)
 | 
			
		||||
        {
 | 
			
		||||
            int value = (int)Mathf.Clamp(RandGaussianLike(avg - dist, avg + dist), min, max);
 | 
			
		||||
            int recordvalue = pawn.records.GetAsInt(record);
 | 
			
		||||
            pawn.records.AddTo(record, value - recordvalue);
 | 
			
		||||
 | 
			
		||||
            return value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static float LustFactor(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            float lust = pawn.records.GetValue(VariousDefOf.Lust) * Configurations.LustEffectPower;
 | 
			
		||||
            if (lust < 0)
 | 
			
		||||
            {
 | 
			
		||||
                lust = Mathf.Exp((lust + 200f * Mathf.Log(10f)) / 100f) - 100f;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                lust = Mathf.Sqrt(100f*(lust + 25f)) - 50f;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            return 1 + lust / 100f;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static T GetAdjacentBuilding<T>(this Pawn pawn) where T : Building 
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            if (pawn.Spawned)
 | 
			
		||||
            {
 | 
			
		||||
                EdificeGrid edifice = pawn.Map.edificeGrid;
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +60,6 @@ namespace RJWSexperience
 | 
			
		|||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static float GetCumVolume(this Pawn pawn)
 | 
			
		||||
        {
 | 
			
		||||
            List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn));
 | 
			
		||||
| 
						 | 
				
			
			@ -112,11 +74,9 @@ namespace RJWSexperience
 | 
			
		|||
            if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
 | 
			
		||||
            if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            return pawn.GetCumVolume(part);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part)
 | 
			
		||||
        {
 | 
			
		||||
            float res;
 | 
			
		||||
| 
						 | 
				
			
			@ -134,10 +94,8 @@ namespace RJWSexperience
 | 
			
		|||
            return res;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public static float Normalization(this float num, float min, float max)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            return (num - min)/(max - min);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -152,89 +110,9 @@ namespace RJWSexperience
 | 
			
		|||
            {
 | 
			
		||||
                if (Configurations.EnableRecordRandomizer && pawn != null && xxx.is_human(pawn))
 | 
			
		||||
                {
 | 
			
		||||
                    int avgsex = -500;
 | 
			
		||||
                    bool isvirgin = Rand.Chance(Configurations.VirginRatio);
 | 
			
		||||
                    int totalsex = 0;
 | 
			
		||||
                    int totalbirth = 0;
 | 
			
		||||
                    int deviation = (int)Configurations.MaxSexCountDeviation;
 | 
			
		||||
                    if (pawn.story != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        float lust;
 | 
			
		||||
                        if (xxx.is_nympho(pawn)) lust = pawn.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, 0);
 | 
			
		||||
                        else lust = pawn.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, float.MinValue);
 | 
			
		||||
 | 
			
		||||
                        int sexableage = 0;
 | 
			
		||||
                        int minsexage = (int)(pawn.RaceProps.lifeExpectancy * Configurations.MinSexablePercent);
 | 
			
		||||
                        if (pawn.ageTracker.AgeBiologicalYears > minsexage)
 | 
			
		||||
                        {
 | 
			
		||||
                            sexableage = pawn.ageTracker.AgeBiologicalYears - minsexage;
 | 
			
		||||
                            avgsex = (int)(sexableage * Configurations.SexPerYear * pawn.LustFactor());
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        if (pawn.relations != null && pawn.gender == Gender.Female)
 | 
			
		||||
                        {
 | 
			
		||||
                            totalbirth += pawn.relations.ChildrenCount;
 | 
			
		||||
                            totalsex += totalbirth;
 | 
			
		||||
                            pawn.records?.AddTo(xxx.CountOfSexWithHumanlikes, totalbirth);
 | 
			
		||||
                            pawn.records?.SetTo(xxx.CountOfBirthHuman, totalbirth);
 | 
			
		||||
                            if (totalbirth > 0) isvirgin = false;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (!isvirgin)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (xxx.is_rapist(pawn))
 | 
			
		||||
                            {
 | 
			
		||||
                                if (xxx.is_zoophile(pawn))
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (pawn.Has(Quirk.ChitinLover)) totalsex += pawn.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
                                    else totalsex += pawn.RecordRandomizer(xxx.CountOfRapedAnimals, avgsex, deviation);
 | 
			
		||||
                                }
 | 
			
		||||
                                else totalsex += pawn.RecordRandomizer(xxx.CountOfRapedHumanlikes, avgsex, deviation);
 | 
			
		||||
                                avgsex /= 8;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (xxx.is_zoophile(pawn))
 | 
			
		||||
                            {
 | 
			
		||||
                                if (pawn.Has(Quirk.ChitinLover)) totalsex += pawn.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, deviation);
 | 
			
		||||
                                else totalsex += pawn.RecordRandomizer(xxx.CountOfSexWithAnimals, avgsex, deviation);
 | 
			
		||||
                                avgsex /= 10;
 | 
			
		||||
                            }
 | 
			
		||||
                            else if (xxx.is_necrophiliac(pawn))
 | 
			
		||||
                            {
 | 
			
		||||
                                totalsex += pawn.RecordRandomizer(xxx.CountOfSexWithCorpse, avgsex, deviation);
 | 
			
		||||
                                avgsex /= 4;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (pawn.IsSlave)
 | 
			
		||||
                            {
 | 
			
		||||
                                totalsex += pawn.RecordRandomizer(xxx.CountOfBeenRapedByAnimals, Rand.Range(-50, 10), Rand.Range(0, 10) * sexableage);
 | 
			
		||||
                                totalsex += pawn.RecordRandomizer(xxx.CountOfBeenRapedByHumanlikes, 0, Rand.Range(0, 100) * sexableage);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                            totalsex += pawn.RecordRandomizer(xxx.CountOfSexWithHumanlikes, avgsex, deviation);
 | 
			
		||||
 | 
			
		||||
                            if (totalsex > 0) pawn.records.AddTo(VariousDefOf.SexPartnerCount, Math.Max(1, Rand.Range(0, totalsex / 7)));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    pawn.records?.SetTo(xxx.CountOfSex, totalsex);
 | 
			
		||||
                    RJWUtility.GenerateSextypeRecords(pawn, totalsex);
 | 
			
		||||
                }
 | 
			
		||||
                if (pawn.story?.traits != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (pawn.IsVirgin())
 | 
			
		||||
                    {
 | 
			
		||||
                        int degree = 0;
 | 
			
		||||
                        if (pawn.gender == Gender.Female) degree = 2;
 | 
			
		||||
                        Trait virgin = new Trait(VariousDefOf.Virgin, degree, true);
 | 
			
		||||
                        pawn.story.traits.GainTrait(virgin);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (pawn.gender == Gender.Female && Rand.Chance(0.05f))
 | 
			
		||||
                    {
 | 
			
		||||
                        Trait virgin = new Trait(VariousDefOf.Virgin, 1, true);
 | 
			
		||||
                        pawn.story.traits.GainTrait(virgin);
 | 
			
		||||
                    }
 | 
			
		||||
                    RecordRandomizer.Randomize(pawn);
 | 
			
		||||
                }
 | 
			
		||||
                pawn.AddVirginTrait();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue