From e70903c16eee8eb7f29a3f6c71e6e905845e949f Mon Sep 17 00:00:00 2001
From: amevarashi <kp-karasu@yandex.ru>
Date: Wed, 27 Apr 2022 13:37:30 +0500
Subject: [PATCH] More sophisticated CumAddictPartKindUsageRule

---
 .../CumAddictPartKindUsageRule.cs             | 64 ++++++++++++++++---
 1 file changed, 54 insertions(+), 10 deletions(-)

diff --git a/RJWSexperience/RJWSexperience/Interactions/CumAddictPartKindUsageRule.cs b/RJWSexperience/RJWSexperience/Interactions/CumAddictPartKindUsageRule.cs
index dccbc88..1b59cab 100644
--- a/RJWSexperience/RJWSexperience/Interactions/CumAddictPartKindUsageRule.cs
+++ b/RJWSexperience/RJWSexperience/Interactions/CumAddictPartKindUsageRule.cs
@@ -1,8 +1,12 @@
-using rjw.Modules.Interactions.Contexts;
+using RimWorld;
+using rjw.Modules.Interactions.Contexts;
 using rjw.Modules.Interactions.Enums;
 using rjw.Modules.Interactions.Rules.PartKindUsageRules;
 using rjw.Modules.Shared;
+using RJWSexperience.Logs;
 using System.Collections.Generic;
+using System.Linq;
+using Verse;
 
 namespace RJWSexperience.Interactions
 {
@@ -10,22 +14,62 @@ namespace RJWSexperience.Interactions
 	{
 		public IEnumerable<Weighted<LewdablePartKind>> ModifiersForDominant(InteractionContext context)
 		{
-			if (context.Internals.Dominant.Pawn.health?.hediffSet?.HasHediff(VariousDefOf.CumAddiction) ?? false)
-			{
-				// Cum addicts are really eager to use mouth
-				yield return new Weighted<LewdablePartKind>(Multipliers.DoubledPlus, LewdablePartKind.Mouth);
-			}
+			if (context.Internals.Submissive.Parts.Penises.Any())
+				return GetForCumAddict(context.Internals.Dominant.Pawn);
+
+			if (AddictionUtility.IsAddicted(context.Internals.Submissive.Pawn, VariousDefOf.Cum))
+				return GetForPartner();
+
+			return Enumerable.Empty<Weighted<LewdablePartKind>>();
 		}
 
 		public IEnumerable<Weighted<LewdablePartKind>> ModifiersForSubmissive(InteractionContext context)
 		{
-			Logs.LogManager.GetLogger<CumAddictPartKindUsageRule, Logs.DebugLogProvider>().Warning($"Called for {context.Internals.Submissive.Pawn.NameShortColored}");
+			if (context.Internals.Dominant.Parts.Penises.Any())
+				return GetForCumAddict(context.Internals.Submissive.Pawn);
 
-			if (context.Internals.Submissive.Pawn.health?.hediffSet?.HasHediff(VariousDefOf.CumAddiction) ?? false)
+			if (AddictionUtility.IsAddicted(context.Internals.Dominant.Pawn, VariousDefOf.Cum))
+				return GetForPartner();
+
+			return Enumerable.Empty<Weighted<LewdablePartKind>>();
+		}
+
+		/// <summary>
+		/// Addict wants to use mouth
+		/// </summary>
+		private IEnumerable<Weighted<LewdablePartKind>> GetForCumAddict(Pawn pawn)
+		{
+			var log = LogManager.GetLogger<CumAddictPartKindUsageRule, DebugLogProvider>();
+			log.Message($"Called for {pawn.NameShortColored}");
+
+			if (!(pawn.needs.TryGetNeed(VariousDefOf.Chemical_Cum) is Need_Chemical cumNeed))
+				yield break;
+
+			log.Message($"{pawn.NameShortColored} is cum addict, current desire level: {cumNeed.CurCategory}");
+
+			yield return new Weighted<LewdablePartKind>(Multipliers.DoubledPlus, LewdablePartKind.Mouth);
+
+			// In dire need also they are also refuse to use other orifices
+			switch (cumNeed.CurCategory)
 			{
-				// Cum addicts are really eager to use mouth
-				yield return new Weighted<LewdablePartKind>(Multipliers.DoubledPlus, LewdablePartKind.Mouth);
+				case DrugDesireCategory.Desire:
+					yield return new Weighted<LewdablePartKind>(Multipliers.VeryRare, LewdablePartKind.Anus);
+					yield return new Weighted<LewdablePartKind>(Multipliers.VeryRare, LewdablePartKind.Vagina);
+					break;
+
+				case DrugDesireCategory.Withdrawal:
+					yield return new Weighted<LewdablePartKind>(Multipliers.Never, LewdablePartKind.Anus);
+					yield return new Weighted<LewdablePartKind>(Multipliers.Never, LewdablePartKind.Vagina);
+					break;
 			}
 		}
+
+		/// <summary>
+		/// Addict asks partner to use penis
+		/// </summary>
+		private IEnumerable<Weighted<LewdablePartKind>> GetForPartner()
+		{
+			yield return new Weighted<LewdablePartKind>(Multipliers.Common, LewdablePartKind.Penis);
+		}
 	}
 }