mirror of
				https://github.com/amevarashi/RJW-Sexperience.git
				synced 2024-08-14 23:54:08 +00:00 
			
		
		
		
	Refactor StatParts
This commit is contained in:
		
							parent
							
								
									257d86a416
								
							
						
					
					
						commit
						b4231341ff
					
				
					 7 changed files with 87 additions and 41 deletions
				
			
		| 
						 | 
				
			
			@ -3,9 +3,6 @@
 | 
			
		|||
  <RS_Mod_Title>RJW Sexperience</RS_Mod_Title>
 | 
			
		||||
 | 
			
		||||
  <!-- Sex status screen -->
 | 
			
		||||
  <LustStatFactor>Lust: x{0}%</LustStatFactor>
 | 
			
		||||
  <SlaveStatFactor>Slave: x{0}%</SlaveStatFactor>
 | 
			
		||||
  <SlaveStatFactorDefault>Not Slave: x100%</SlaveStatFactorDefault>
 | 
			
		||||
  <MemeStatFactor>Meme: x{0}%</MemeStatFactor>
 | 
			
		||||
  <RSVictimCondition>slave, prisoner, submissive gender only</RSVictimCondition>
 | 
			
		||||
  <RSBreederCondition>improper animal: cannot breed or forbidden by precepts</RSBreederCondition>
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +11,6 @@
 | 
			
		|||
  <RSShouldCanFuck>capable of sex is required</RSShouldCanFuck>
 | 
			
		||||
  <RSTotalGatheredCum>Total gathered cum: </RSTotalGatheredCum>
 | 
			
		||||
  <RS_LostVirgin>{1} took {0}'s virginity.</RS_LostVirgin>
 | 
			
		||||
  <RS_FloatMenu_CleanSelf>Gather cums on body</RS_FloatMenu_CleanSelf>
 | 
			
		||||
  <RS_Best_Sextype>Best sextype</RS_Best_Sextype>
 | 
			
		||||
  <RS_Recent_Sextype>Recent sextype</RS_Recent_Sextype>
 | 
			
		||||
  <RS_Sex_Partners>Sex partners</RS_Sex_Partners>
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +29,6 @@
 | 
			
		|||
  <RS_Best_Sex_Partner>Best Sex Partner</RS_Best_Sex_Partner>
 | 
			
		||||
  <RS_Best_Sex_Partner_ToolTip>The partner who had most satisfying sex.</RS_Best_Sex_Partner_ToolTip>
 | 
			
		||||
  <RS_VirginsTaken>Taken virgins</RS_VirginsTaken>
 | 
			
		||||
  <RS_VirginsTaken_ToolTip>The number of partners who i taken first.</RS_VirginsTaken_ToolTip>
 | 
			
		||||
  <RS_TotalSexHad>Total sex had</RS_TotalSexHad>
 | 
			
		||||
  <RS_TotalSexHad_ToolTip>Total number of sex.</RS_TotalSexHad_ToolTip>
 | 
			
		||||
  <RS_Raped>Raped: </RS_Raped>
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +44,6 @@
 | 
			
		|||
  <RS_Interspecies>Interspecies</RS_Interspecies>
 | 
			
		||||
  <RS_Normal>Normal</RS_Normal>
 | 
			
		||||
  <RS_Necrophile>Necrophile</RS_Necrophile>
 | 
			
		||||
  <RS_GatherCum>Gather cum</RS_GatherCum>
 | 
			
		||||
  <RS_SexSkill>Sex skill</RS_SexSkill>
 | 
			
		||||
  <RS_CumAddiction>Cum addiction</RS_CumAddiction>
 | 
			
		||||
  <RS_CumAddiction_Tooltip>Addicted to cum.</RS_CumAddiction_Tooltip>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,9 +25,7 @@
 | 
			
		|||
	<Operation Class="PatchOperationAdd">
 | 
			
		||||
		<xpath>Defs/StatDef[defName="SexFrequency"]/parts</xpath>
 | 
			
		||||
		<value>
 | 
			
		||||
			<li Class="RJWSexperience.StatPart_Lust">
 | 
			
		||||
				<factor>1.0</factor>
 | 
			
		||||
			</li>
 | 
			
		||||
			<li Class="RJWSexperience.StatPart_Lust" />
 | 
			
		||||
		</value>
 | 
			
		||||
	</Operation>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
using rjw;
 | 
			
		||||
using RimWorld;
 | 
			
		||||
using rjw;
 | 
			
		||||
using RJWSexperience.UI;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
using Verse;
 | 
			
		||||
| 
						 | 
				
			
			@ -7,17 +8,13 @@ namespace RJWSexperience
 | 
			
		|||
{
 | 
			
		||||
	public static class Keyed
 | 
			
		||||
	{
 | 
			
		||||
		public static string LustStatFactor(string value) => "LustStatFactor".Translate(value);
 | 
			
		||||
		public static string SlaveStatFactor(string value) => "SlaveStatFactor".Translate(value);
 | 
			
		||||
		public static string RS_LostVirgin(string pawn, string partner) => "RS_LostVirgin".Translate(pawn.Colorize(Color.yellow), partner.Colorize(Color.yellow));
 | 
			
		||||
		public static string RS_Sex_Info(string sextype, string sexcount) => "RS_Sex_Info".Translate(sextype, sexcount);
 | 
			
		||||
		public static string RS_SAT_AVG(string avgsat) => "RS_SAT_AVG".Translate(avgsat);
 | 
			
		||||
		public static string RS_HadBestSexDaysAgo(string days) => "RS_HadBestSexDaysAgo".Translate(days);
 | 
			
		||||
 | 
			
		||||
		public static readonly string Mod_Title = "RS_Mod_Title".Translate();
 | 
			
		||||
		public static readonly string SlaveStatFactorDefault = "SlaveStatFactorDefault".Translate();
 | 
			
		||||
		public static readonly string RSTotalGatheredCum = "RSTotalGatheredCum".Translate();
 | 
			
		||||
		public static readonly string RS_FloatMenu_CleanSelf = "RS_FloatMenu_CleanSelf".Translate();
 | 
			
		||||
		public static readonly string RS_Best_Sextype = "RS_Best_Sextype".Translate();
 | 
			
		||||
		public static readonly string RS_Recent_Sextype = "RS_Recent_Sextype".Translate();
 | 
			
		||||
		public static readonly string RS_Sex_Partners = "RS_Sex_Partners".Translate();
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +32,6 @@ namespace RJWSexperience
 | 
			
		|||
		public static readonly string RS_First_Sex_Partner_ToolTip = "RS_First_Sex_Partner_ToolTip".Translate();
 | 
			
		||||
		public static readonly string RS_Most_Sex_Partner_ToolTip = "RS_Most_Sex_Partner_ToolTip".Translate();
 | 
			
		||||
		public static readonly string RS_Best_Sex_Partner_ToolTip = "RS_Best_Sex_Partner_ToolTip".Translate();
 | 
			
		||||
		public static readonly string RS_VirginsTaken_ToolTip = "RS_VirginsTaken_ToolTip".Translate();
 | 
			
		||||
		public static readonly string RS_Raped = "RS_Raped".Translate();
 | 
			
		||||
		public static readonly string RS_RapedMe = "RS_RapedMe".Translate();
 | 
			
		||||
		public static readonly string RS_Sex_History = "RS_Sex_History".Translate();
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +49,6 @@ namespace RJWSexperience
 | 
			
		|||
		public static readonly string RS_Bestiality = "RS_Bestiality".Translate();
 | 
			
		||||
		public static readonly string RS_Interspecies = "RS_Interspecies".Translate();
 | 
			
		||||
		public static readonly string RS_Necrophile = "RS_Necrophile".Translate();
 | 
			
		||||
		public static readonly string RS_GatherCum = "RS_GatherCum".Translate();
 | 
			
		||||
		public static readonly string RS_SexSkill = "RS_SexSkill".Translate();
 | 
			
		||||
		public static readonly string RS_CumAddiction = "RS_CumAddiction".Translate();
 | 
			
		||||
		public static readonly string RS_CumAddiction_Tooltip = "RS_CumAddiction_Tooltip".Translate();
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +57,7 @@ namespace RJWSexperience
 | 
			
		|||
		public static readonly string RS_NumofTimes = "RS_NumofTimes".Translate();
 | 
			
		||||
		public static readonly string RS_Ago = "RS_Ago".Translate();
 | 
			
		||||
		public static readonly string RS_LastSex = "RS_LastSex".Translate();
 | 
			
		||||
		[MayRequireRoyalty] public static readonly string Slave = "Slave".Translate();
 | 
			
		||||
 | 
			
		||||
		public static readonly string TabLabelMain = "TabLabelMain".Translate();
 | 
			
		||||
		public static readonly string TabLabelHistory = "TabLabelHistory".Translate();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										75
									
								
								RJWSexperience/RJWSexperience/LustUtility.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								RJWSexperience/RJWSexperience/LustUtility.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
using Verse;
 | 
			
		||||
 | 
			
		||||
namespace RJWSexperience
 | 
			
		||||
{
 | 
			
		||||
	public static class LustUtility
 | 
			
		||||
	{
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///  ~0.023.
 | 
			
		||||
		///  No need to calculate this every call
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		private static readonly float magicNum1 = Mathf.Log(10f) / 100;
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// Transforms lust value into a stat multiplier
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// <param name="lust"></param>
 | 
			
		||||
		/// <returns>Positive value</returns>
 | 
			
		||||
		public static float GetLustFactor(float lust)
 | 
			
		||||
		{
 | 
			
		||||
			float effectiveLust = lust * SexperienceMod.Settings.LustEffectPower;
 | 
			
		||||
			if (effectiveLust < 0)
 | 
			
		||||
			{
 | 
			
		||||
				effectiveLust = Mathf.Exp((effectiveLust + 200f) * magicNum1) - 100f;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				effectiveLust = Mathf.Sqrt((effectiveLust + 25f) * 100f) - 50f;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return 1 + (effectiveLust / 100f);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static void DrawGraph(Rect graphRect)
 | 
			
		||||
		{
 | 
			
		||||
			List<SimpleCurveDrawInfo> curves = new List<SimpleCurveDrawInfo>();
 | 
			
		||||
			FloatRange lustRange = new FloatRange(-300f, 300f);
 | 
			
		||||
 | 
			
		||||
			SimpleCurveDrawInfo simpleCurveDrawInfo = new SimpleCurveDrawInfo
 | 
			
		||||
			{
 | 
			
		||||
				color = Color.yellow,
 | 
			
		||||
				label = "Sex freq mult",
 | 
			
		||||
				valueFormat = "x{0}",
 | 
			
		||||
				curve = new SimpleCurve()
 | 
			
		||||
			};
 | 
			
		||||
			for (float lust = lustRange.min; lust <= lustRange.max; lust++)
 | 
			
		||||
			{
 | 
			
		||||
				simpleCurveDrawInfo.curve.Add(new CurvePoint(lust, GetLustFactor(lust)), false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			curves.Add(simpleCurveDrawInfo);
 | 
			
		||||
 | 
			
		||||
			SimpleCurveDrawerStyle curveDrawerStyle = new SimpleCurveDrawerStyle
 | 
			
		||||
			{
 | 
			
		||||
				UseFixedSection = true,
 | 
			
		||||
				FixedSection = lustRange,
 | 
			
		||||
				UseFixedScale = true,
 | 
			
		||||
				FixedScale = new Vector2(0f, GetLustFactor(lustRange.max)),
 | 
			
		||||
				DrawPoints = false,
 | 
			
		||||
				DrawBackgroundLines = true,
 | 
			
		||||
				DrawCurveMousePoint = true,
 | 
			
		||||
				DrawMeasures = true,
 | 
			
		||||
				MeasureLabelsXCount = 8,
 | 
			
		||||
				MeasureLabelsYCount = 3,
 | 
			
		||||
				XIntegersOnly = true,
 | 
			
		||||
				YIntegersOnly = false,
 | 
			
		||||
				LabelX = Keyed.Lust
 | 
			
		||||
			};
 | 
			
		||||
			SimpleCurveDrawer.DrawCurves(graphRect, curves, curveDrawerStyle);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -59,6 +59,7 @@
 | 
			
		|||
    <Compile Include="Cum\JobDriver_CleanSelfWithBucket.cs" />
 | 
			
		||||
    <Compile Include="Logs\DebugLogProvider.cs" />
 | 
			
		||||
    <Compile Include="Logs\LogManager.cs" />
 | 
			
		||||
    <Compile Include="LustUtility.cs" />
 | 
			
		||||
    <Compile Include="Patches\DefInjection.cs" />
 | 
			
		||||
    <Compile Include="Patches\GetGizmos.cs" />
 | 
			
		||||
    <Compile Include="Recipe_HymenSurgery.cs" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ namespace RJWSexperience
 | 
			
		|||
			int deviation = (int)Settings.MaxSexCountDeviation;
 | 
			
		||||
			if (pawn.story != null)
 | 
			
		||||
			{
 | 
			
		||||
				_ = RandomizeLust(pawn);
 | 
			
		||||
				float lust = RandomizeLust(pawn);
 | 
			
		||||
 | 
			
		||||
				int sexableage = 0;
 | 
			
		||||
				int minsexage = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ namespace RJWSexperience
 | 
			
		|||
				if (pawn.ageTracker.AgeBiologicalYears > minsexage)
 | 
			
		||||
				{
 | 
			
		||||
					sexableage = pawn.ageTracker.AgeBiologicalYears - minsexage;
 | 
			
		||||
					avgsex = (int)(sexableage * Settings.SexPerYear * StatPart_Lust.GetLustFactor(pawn));
 | 
			
		||||
					avgsex = (int)(sexableage * Settings.SexPerYear * LustUtility.GetLustFactor(lust));
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (pawn.relations != null && pawn.gender == Gender.Female)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,4 @@
 | 
			
		|||
using RimWorld;
 | 
			
		||||
using System;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
using Verse;
 | 
			
		||||
using System.Diagnostics.CodeAnalysis;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11,14 +9,11 @@ namespace RJWSexperience
 | 
			
		|||
	/// </summary>
 | 
			
		||||
	public class StatPart_Lust : StatPart
 | 
			
		||||
	{
 | 
			
		||||
		[SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")]
 | 
			
		||||
		public float factor;
 | 
			
		||||
 | 
			
		||||
		public override string ExplanationPart(StatRequest req)
 | 
			
		||||
		{
 | 
			
		||||
			if (req.HasThing && (req.Thing is Pawn pawn))
 | 
			
		||||
			{
 | 
			
		||||
				return Keyed.LustStatFactor(String.Format("{0:0.##}", GetLustFactor(pawn) * factor * 100));
 | 
			
		||||
				return $"{Keyed.Lust.CapitalizeFirst()}: x{GetLustFactor(pawn).ToStringPercent()}";
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -26,23 +21,10 @@ namespace RJWSexperience
 | 
			
		|||
		public override void TransformValue(StatRequest req, ref float val)
 | 
			
		||||
		{
 | 
			
		||||
			if (req.HasThing && (req.Thing is Pawn pawn))
 | 
			
		||||
				val *= GetLustFactor(pawn) * factor;
 | 
			
		||||
				val *= GetLustFactor(pawn);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static float GetLustFactor(Pawn pawn)
 | 
			
		||||
		{
 | 
			
		||||
			float lust = pawn.records.GetValue(VariousDefOf.Lust) * SexperienceMod.Settings.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;
 | 
			
		||||
		}
 | 
			
		||||
		protected float GetLustFactor(Pawn pawn) => LustUtility.GetLustFactor(pawn.records.GetValue(VariousDefOf.Lust));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -57,9 +39,9 @@ namespace RJWSexperience
 | 
			
		|||
		{
 | 
			
		||||
			if (req.HasThing && ((req.Thing as Pawn)?.IsSlave == true))
 | 
			
		||||
			{
 | 
			
		||||
				return Keyed.SlaveStatFactor(String.Format("{0:0.##}", factor * 100));
 | 
			
		||||
				return $"{Keyed.Slave.CapitalizeFirst()}: x{factor.ToStringPercent()}";
 | 
			
		||||
			}
 | 
			
		||||
			return Keyed.SlaveStatFactorDefault;
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override void TransformValue(StatRequest req, ref float val)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue