Move all record randomization code to separate class

This commit is contained in:
amevarashi 2022-03-02 18:15:22 +05:00
parent e258ca3d7c
commit dc2a90599a
9 changed files with 303 additions and 424 deletions

Binary file not shown.

View file

@ -33,9 +33,7 @@ namespace RJWSexperience
[DebugAction("RJW Sexperience", "Reset lust", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)] [DebugAction("RJW Sexperience", "Reset lust", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)]
private static void ResetLust(Pawn p) private static void ResetLust(Pawn p)
{ {
float lust; float lust = RecordRandomizer.RandomizeLust(p);
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);
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Lust: " + lust); MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Lust: " + lust);
} }

View file

@ -1,150 +1,52 @@
using System; using HarmonyLib;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using RimWorld; using RimWorld;
using Verse;
using rjw; using rjw;
using System;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using Verse;
namespace RJWSexperience namespace RJWSexperience
{ {
[HarmonyPatch(typeof(PawnGenerator), "GeneratePawn", new Type[] { typeof(PawnGenerationRequest) })] [HarmonyPatch(typeof(PawnGenerator), "GeneratePawn", new Type[] { typeof(PawnGenerationRequest) })]
public static class Rimworld_Patch_GeneratePawn public static class Rimworld_Patch_GeneratePawn
{ {
public static void Postfix(PawnGenerationRequest request, ref Pawn __result) public static void Postfix(PawnGenerationRequest request, ref Pawn __result)
{ {
if (Configurations.EnableRecordRandomizer && __result != null && !request.Newborn && xxx.is_human(__result)) if (Configurations.EnableRecordRandomizer && __result != null && !request.Newborn && xxx.is_human(__result))
{ {
int avgsex = -500; RecordRandomizer.Randomize(__result);
bool isvirgin = Rand.Chance(Configurations.VirginRatio); }
int totalsex = 0; __result.AddVirginTrait();
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; [HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")]
int minsexage = 0; public class HumanlikeOrder_Patch
if (Configurations.MinSexableFromLifestage) {
minsexage = (int)__result.RaceProps.lifeStageAges.Find(x => x.def.reproductive).minAge; public static void Postfix(Vector3 clickPos, Pawn pawn, List<FloatMenuOption> opts)
else {
minsexage = (int)(__result.RaceProps.lifeExpectancy * Configurations.MinSexablePercent); var targets = GenUI.TargetsAt(clickPos, TargetingParameters.ForBuilding());
if (__result.ageTracker.AgeBiologicalYears > minsexage) if (pawn.health.hediffSet.HasHediff(RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake))
{ foreach (LocalTargetInfo t in targets)
sexableage = __result.ageTracker.AgeBiologicalYears - minsexage; {
avgsex = (int)(sexableage * Configurations.SexPerYear * __result.LustFactor()); if (t.Thing is Building_CumBucket building)
} {
opts.AddDistinct(MakeMenu(pawn, building));
break;
}
}
}
public static FloatMenuOption MakeMenu(Pawn pawn, LocalTargetInfo target)
{
FloatMenuOption option = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(Keyed.RS_FloatMenu_CleanSelf, delegate ()
{
pawn.jobs.TryTakeOrderedJob(new Verse.AI.Job(VariousDefOf.CleanSelfwithBucket, null, target, target.Cell));
}, MenuOptionPriority.Low), pawn, target);
if (__result.relations != null && __result.gender == Gender.Female) return option;
{ }
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.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
{
public static void Postfix(Vector3 clickPos, Pawn pawn, List<FloatMenuOption> opts)
{
var targets = GenUI.TargetsAt(clickPos, TargetingParameters.ForBuilding());
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)
{
opts.AddDistinct(MakeMenu(pawn, building));
break;
}
}
}
}
public static FloatMenuOption MakeMenu(Pawn pawn, LocalTargetInfo target)
{
FloatMenuOption option = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(Keyed.RS_FloatMenu_CleanSelf, delegate ()
{
pawn.jobs.TryTakeOrderedJob(new Verse.AI.Job(VariousDefOf.CleanSelfwithBucket, null, target, target.Cell));
}, MenuOptionPriority.Low), pawn, target);
return option;
}
}
} }

View file

@ -74,6 +74,7 @@
<Compile Include="Patches\DefInjection.cs" /> <Compile Include="Patches\DefInjection.cs" />
<Compile Include="Patches\GetGizmos.cs" /> <Compile Include="Patches\GetGizmos.cs" />
<Compile Include="Recipe_HymenSurgery.cs" /> <Compile Include="Recipe_HymenSurgery.cs" />
<Compile Include="SexHistory\RecordRandomizer.cs" />
<Compile Include="RJWUtility.cs" /> <Compile Include="RJWUtility.cs" />
<Compile Include="SexHistory\HistoryUtility.cs" /> <Compile Include="SexHistory\HistoryUtility.cs" />
<Compile Include="SexHistory\SexHistory.cs" /> <Compile Include="SexHistory\SexHistory.cs" />

View file

@ -35,10 +35,9 @@ namespace RJWSexperience
/// </summary> /// </summary>
public static bool IsVirgin(this Pawn pawn) public static bool IsVirgin(this Pawn pawn)
{ {
if (pawn.records.GetValue(VariousDefOf.VaginalSexCount) == 0) return true; return pawn.records.GetValue(VariousDefOf.VaginalSexCount) == 0;
return false; }
} public static bool HasHymen(this Pawn pawn)
public static bool HasHymen(this Pawn pawn)
{ {
Trait virgin = pawn.story?.traits?.GetTrait(VariousDefOf.Virgin); Trait virgin = pawn.story?.traits?.GetTrait(VariousDefOf.Virgin);
if (virgin != null) if (virgin != null)
@ -132,10 +131,8 @@ namespace RJWSexperience
DetermineGiversAndReceivers(props, out Pawn giver, out Pawn receiver); DetermineGiversAndReceivers(props, out Pawn giver, out Pawn receiver);
if (partner != null) if (partner != null)
{ {
switch (sextype) switch (sextype)
{ {
case xxx.rjwSextype.Vaginal: case xxx.rjwSextype.Vaginal:
@ -151,7 +148,7 @@ namespace RJWSexperience
{ {
IncreaseRecords(giver, receiver, VariousDefOf.OralSexCount, VariousDefOf.BlowjobCount); 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); IncreaseRecords(giver, receiver, VariousDefOf.BlowjobCount, VariousDefOf.OralSexCount);
} }
@ -251,90 +248,6 @@ namespace RJWSexperience
partner.records?.AddTo(recordforpartner, 1); 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) public static Gender PreferGender(this Pawn pawn)
{ {
if (pawn.gender == Gender.Male) 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) public static bool IsBestiality(this SexProps props)
{ {
if (props.partner != null) if (props.partner != null)
@ -426,7 +327,5 @@ namespace RJWSexperience
} }
} }
} }
} }
} }

View 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);
}
}
}

View file

@ -1,65 +1,70 @@
using System; using RimWorld;
using System.Collections.Generic; using System;
using System.Linq; using UnityEngine;
using System.Text;
using System.Threading.Tasks;
using rjw;
using RimWorld;
using Verse; using Verse;
namespace RJWSexperience namespace RJWSexperience
{ {
public class StatPart_Lust : StatPart /// <summary>
{ /// Lust changes SexFrequency stat
public float factor; /// </summary>
public class StatPart_Lust : StatPart
{
public float factor; // Value is loaded from XML
public override string ExplanationPart(StatRequest req) public override string ExplanationPart(StatRequest req)
{ {
Pawn pawn = req.Thing as Pawn; if (req.HasThing && (req.Thing is Pawn pawn))
return Keyed.LustStatFactor(String.Format("{0:0.##}", pawn.LustFactor() * factor * 100)); {
return Keyed.LustStatFactor(String.Format("{0:0.##}", GetLustFactor(pawn) * factor * 100));
}
return null;
}
} public override void TransformValue(StatRequest req, ref float val)
{
if (req.HasThing && (req.Thing is Pawn pawn))
val *= GetLustFactor(pawn) * factor;
}
public override void TransformValue(StatRequest req, ref float val) public static float GetLustFactor(Pawn pawn)
{ {
Pawn pawn = req.Thing as Pawn; float lust = pawn.records.GetValue(VariousDefOf.Lust) * Configurations.LustEffectPower;
if (pawn != null) val *= pawn.LustFactor() * factor; 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; // Value is loaded from XML
public class StatPart_Slave : StatPart public override string ExplanationPart(StatRequest req)
{ {
public float factor; if (req.HasThing && ((req.Thing as Pawn)?.IsSlave == true))
public override string ExplanationPart(StatRequest req) {
{ return Keyed.SlaveStatFactor(String.Format("{0:0.##}", factor * 100));
float fact = factor * 100; }
Pawn pawn = req.Thing as Pawn; return Keyed.SlaveStatFactorDefault;
if (pawn != null) }
{
if (pawn.IsSlave)
{
return Keyed.SlaveStatFactor(String.Format("{0:0.##}", fact));
}
}
return Keyed.SlaveStatFactorDefault;
}
public override void TransformValue(StatRequest req, ref float val)
{
Pawn pawn = req.Thing as Pawn;
if (pawn != null)
{
if (pawn.IsSlave)
{
val *= factor;
}
}
}
}
public override void TransformValue(StatRequest req, ref float val)
{
if (req.HasThing && ((req.Thing as Pawn)?.IsSlave == true))
{
val *= factor;
}
}
}
} }

View file

@ -10,7 +10,6 @@ using UnityEngine;
namespace RJWSexperience namespace RJWSexperience
{ {
public static class Utility public static class Utility
{ {
public static System.Random random = new System.Random(Environment.TickCount); public static System.Random random = new System.Random(Environment.TickCount);
@ -46,44 +45,8 @@ namespace RJWSexperience
records.AddTo(record, value - recordval); 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 public static T GetAdjacentBuilding<T>(this Pawn pawn) where T : Building
{ {
if (pawn.Spawned) if (pawn.Spawned)
{ {
EdificeGrid edifice = pawn.Map.edificeGrid; EdificeGrid edifice = pawn.Map.edificeGrid;
@ -97,7 +60,6 @@ namespace RJWSexperience
return null; return null;
} }
public static float GetCumVolume(this Pawn pawn) public static float GetCumVolume(this Pawn pawn)
{ {
List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(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("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).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); return pawn.GetCumVolume(part);
} }
public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part) public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part)
{ {
float res; float res;
@ -134,10 +94,8 @@ namespace RJWSexperience
return res; return res;
} }
public static float Normalization(this float num, float min, float max) public static float Normalization(this float num, float min, float max)
{ {
return (num - min)/(max - min); return (num - min)/(max - min);
} }
@ -152,89 +110,9 @@ namespace RJWSexperience
{ {
if (Configurations.EnableRecordRandomizer && pawn != null && xxx.is_human(pawn)) if (Configurations.EnableRecordRandomizer && pawn != null && xxx.is_human(pawn))
{ {
int avgsex = -500; RecordRandomizer.Randomize(pawn);
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);
}
} }
pawn.AddVirginTrait();
} }
else else
{ {