diff --git a/.gitignore b/.gitignore
index 3a2b88f..ca6bb31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -301,3 +301,9 @@ __pycache__/
*.btm.cs
*.odx.cs
*.xsd.cs
+/Assemblies/RJW.dll
+/Assemblies/RJW_PlasticSurgeries.pdb
+/Assemblies/0Harmony.dll
+/Assemblies/0Harmony.xml
+/Assemblies/0MultiplayerAPI.dll
+/Assemblies/Dyspareunia.dll
diff --git a/1.3/Assemblies/RJW_PlasticSurgeries.dll b/1.3/Assemblies/RJW_PlasticSurgeries.dll
new file mode 100644
index 0000000..42556d0
Binary files /dev/null and b/1.3/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/About/About.xml b/About/About.xml
new file mode 100644
index 0000000..7632f9a
--- /dev/null
+++ b/About/About.xml
@@ -0,0 +1,34 @@
+
+
+
+ RJW PlasticSurgeries
+ Stardust3D
+
+ 1.3
+
+ Stardust3D.RJW.PlasticSurgeries
+ Surgically alter pawn's genitals.
+
+
+ rim.job.world
+ RimJobWorld
+ https://gitgud.io/Ed86/rjw
+
+
+ brrainz.harmony
+ Harmony
+ steam://url/CommunityFilePage/2009463077
+ https://github.com/pardeike/HarmonyRimWorld/releases/latest
+
+
+ NuttySquabble.Dyspareunia
+ Dyspareunia
+ https://gitgud.io/NuttySquabble/Dyspareunia
+
+
+
+ Ludeon.RimWorld
+ rim.job.world
+ NuttySquabble.Dyspareunia
+
+
\ No newline at end of file
diff --git a/About/Manifest.xml b/About/Manifest.xml
new file mode 100644
index 0000000..2deb0e6
--- /dev/null
+++ b/About/Manifest.xml
@@ -0,0 +1,6 @@
+
+
+
+ RJW PlasticSurgeries
+ 4942.0.1.2
+
\ No newline at end of file
diff --git a/Assemblies/RJW_PlasticSurgeries.dll b/Assemblies/RJW_PlasticSurgeries.dll
new file mode 100644
index 0000000..42556d0
Binary files /dev/null and b/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/Assemblies/RJW_PlasticSurgeries.xml b/Assemblies/RJW_PlasticSurgeries.xml
new file mode 100644
index 0000000..7ccfe20
--- /dev/null
+++ b/Assemblies/RJW_PlasticSurgeries.xml
@@ -0,0 +1,14 @@
+
+
+
+ RJW_PlasticSurgeries
+
+
+
+
+
+
+
+
+
+
diff --git a/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml b/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml
new file mode 100644
index 0000000..5c34aeb
--- /dev/null
+++ b/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml
@@ -0,0 +1,163 @@
+
+
+
+
+ Surgery_Mammoplasty
+ mammoplasty
+ Surgically increases the pawn's breast size by 25%.
+
+ increasing breast size
+ Surgery
+ Recipe_Surgery
+ MedicalOperationSpeed
+ Medicine
+ 0.2
+ 400
+ true
+
+ Human
+
+ 95
+
+
+
+
+ Medicine
+
+
+ 1
+
+
+
+
+ Medicine
+
+
+
+
+ Surgery_Mammoplasty_A
+ mammoplasty (A Cup)
+ Surgically gives the pawn an A cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_A
+ alter cup size to A
+
+
+ Surgery_Mammoplasty_B
+ mammoplasty (B Cup)
+ Surgically gives the pawn an B cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_B
+ alter cup size to B
+
+
+ Surgery_Mammoplasty_C
+ mammoplasty (C Cup)
+ Surgically gives the pawn an C cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_C
+ alter cup size to C
+
+
+ Surgery_Mammoplasty_D
+ mammoplasty (D Cup)
+ Surgically gives the pawn an D cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_D
+ alter cup size to D
+
+
+ Surgery_Mammoplasty_E
+ mammoplasty (E Cup)
+ Surgically gives the pawn an E cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_E
+ alter cup size to E
+
+
+ Surgery_Mammoplasty_F
+ mammoplasty (F Cup)
+ Surgically gives the pawn an F cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_F
+ alter cup size to F
+
+
+ Surgery_Mammoplasty_G
+ mammoplasty (G Cup)
+ Surgically gives the pawn an G cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_G
+ alter cup size to G
+
+
+ Surgery_Mammoplasty_H
+ mammoplasty (H Cup)
+ Surgically gives the pawn an H cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_H
+ alter cup size to H
+
+
+ Surgery_Mammoplasty_J
+ mammoplasty (J Cup)
+ Surgically gives the pawn an J cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_J
+ alter cup size to J
+
+
+ Surgery_Mammoplasty_K
+ mammoplasty (K Cup)
+ Surgically gives the pawn an K cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_K
+ alter cup size to K
+
+
+ Surgery_Mammoplasty_L
+ mammoplasty (L Cup)
+ Surgically gives the pawn an L cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_L
+ alter cup size to L
+
+
+ Surgery_Mammoplasty_M
+ mammoplasty (M Cup)
+ Surgically gives the pawn an M cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_M
+ alter cup size to M
+
+
+ Surgery_Mammoplasty_N
+ mammoplasty (N Cup)
+ Surgically gives the pawn an N cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_N
+ alter cup size to N
+
+
+ Surgery_Mammoplasty_O
+ mammoplasty (O Cup)
+ Surgically gives the pawn an O cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_O
+ alter cup size to O
+
+
+ Surgery_Mammoplasty_P
+ mammoplasty (P Cup)
+ Surgically gives the pawn an P cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_P
+ alter cup size to P
+
+
+ Surgery_Mammoplasty_Q
+ mammoplasty (Q Cup)
+ Surgically gives the pawn an Q cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_Q
+ alter cup size to Q
+
+
+ Surgery_Mammoplasty_R
+ mammoplasty (R Cup)
+ Surgically gives the pawn an R cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_R
+ alter cup size to R
+
+
+ Surgery_Mammoplasty_Unknown
+ mammoplasty (??? Cup)
+ Surgically gives the pawn an ??? cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_Unknown
+ alter cup size to ???
+
+
\ No newline at end of file
diff --git a/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml b/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml
new file mode 100644
index 0000000..800996b
--- /dev/null
+++ b/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml
@@ -0,0 +1,72 @@
+
+
+
+
+ Surgery_Sphinctoplasty
+ sphinctoplasty
+ Surgically tightens the pawn's Sphincter by 25%.
+
+ tightening Sphincter
+ Surgery
+ Recipe_Surgery
+ MedicalOperationSpeed
+ Medicine
+ 0.2
+ 400
+ true
+
+ Human
+
+ 95
+
+
+
+
+ Medicine
+
+
+ 1
+
+
+
+
+ Medicine
+
+
+
+
+ Surgery_Sphinctoplasty_Micro
+ sphinctoplasty (micro)
+ Surgically gives the pawn an micro Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Micro
+ alter Sphincter size to micro
+
+
+ Surgery_Sphinctoplasty_Tight
+ sphinctoplasty (tight)
+ Surgically gives the pawn an tight Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Tight
+ alter Sphincter size to tight
+
+
+ Surgery_Sphinctoplasty_Average
+ sphinctoplasty (average)
+ Surgically gives the pawn an average Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Average
+ alter Sphincter size to average
+
+
+ Surgery_Sphinctoplasty_Accomodating
+ sphinctoplasty (accomodating)
+ Surgically gives the pawn an accomodating Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Accomodating
+ alter Sphincter size to accomodating
+
+
+ Surgery_Sphinctoplasty_Cavernous
+ sphinctoplasty (cavernous)
+ Surgically gives the pawn an cavernous Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Cavernous
+ alter Sphincter size to cavernous
+
+
\ No newline at end of file
diff --git a/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml b/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml
new file mode 100644
index 0000000..ee3097b
--- /dev/null
+++ b/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml
@@ -0,0 +1,72 @@
+
+
+
+
+ Surgery_Vaginoplasty
+ vaginoplasty
+ Surgically tightens the pawn's Vagina by 25%.
+
+ tightening Vagina
+ Surgery
+ Recipe_Surgery
+ MedicalOperationSpeed
+ Medicine
+ 0.2
+ 400
+ true
+
+ Human
+
+ 95
+
+
+
+
+ Medicine
+
+
+ 1
+
+
+
+
+ Medicine
+
+
+
+
+ Surgery_Vaginoplasty_Micro
+ vaginoplasty (micro)
+ Surgically gives the pawn an micro Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Micro
+ alter Vagina size to micro
+
+
+ Surgery_Vaginoplasty_Tight
+ vaginoplasty (tight)
+ Surgically gives the pawn an tight Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Tight
+ alter Vagina size to tight
+
+
+ Surgery_Vaginoplasty_Average
+ vaginoplasty (average)
+ Surgically gives the pawn an average Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Average
+ alter Vagina size to average
+
+
+ Surgery_Vaginoplasty_Accomodating
+ vaginoplasty (accomodating)
+ Surgically gives the pawn an accomodating Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Accomodating
+ alter Vagina size to accomodating
+
+
+ Surgery_Vaginoplasty_Cavernous
+ vaginoplasty (cavernous)
+ Surgically gives the pawn an cavernous Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Cavernous
+ alter Vagina size to cavernous
+
+
\ No newline at end of file
diff --git a/Source/Preview.psd b/Source/Preview.psd
new file mode 100644
index 0000000..40d39a2
Binary files /dev/null and b/Source/Preview.psd differ
diff --git a/Source/RJW_PlasticSurgeries.sln b/Source/RJW_PlasticSurgeries.sln
new file mode 100644
index 0000000..fbf9f79
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31911.196
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW PlasticSurgeries", "RJW_PlasticSurgeries\RJW PlasticSurgeries.csproj", "{F17C6B3F-BA9D-4133-A201-1265A64BCB71}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F17C6B3F-BA9D-4133-A201-1265A64BCB71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F17C6B3F-BA9D-4133-A201-1265A64BCB71}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F17C6B3F-BA9D-4133-A201-1265A64BCB71}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F17C6B3F-BA9D-4133-A201-1265A64BCB71}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DBAFE1CE-D76E-4E7B-9E31-5DBC343D7281}
+ EndGlobalSection
+EndGlobal
diff --git a/Source/RJW_PlasticSurgeries/Mod.cs b/Source/RJW_PlasticSurgeries/Mod.cs
new file mode 100644
index 0000000..4eb81fc
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/Mod.cs
@@ -0,0 +1,9 @@
+using HugsLib;
+
+namespace RJW_PlasticSurgeries
+{
+ public class Mod : ModBase
+ {
+ public override string ModIdentifier => "Stardust3D.RJW.PlasticSurgeries";
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/Properties/AssemblyInfo.cs b/Source/RJW_PlasticSurgeries/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..648cfd5
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("RJW Vaginoplasty")]
+[assembly: AssemblyDescription("Surgically alter pawn's genitals.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("RJW_PlasticSurgeries")]
+[assembly: AssemblyCopyright("©2021 Stardust3D")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("eefbb469-e5e0-48be-bf4d-c5e838d1362b")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("4942.0.1.2")]
+[assembly: AssemblyFileVersion("4942.0.1.2")]
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/RJW PlasticSurgeries.csproj b/Source/RJW_PlasticSurgeries/RJW PlasticSurgeries.csproj
new file mode 100644
index 0000000..a715a16
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/RJW PlasticSurgeries.csproj
@@ -0,0 +1,93 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {F17C6B3F-BA9D-4133-A201-1265A64BCB71}
+ Library
+ Properties
+ RJW_PlasticSurgeries
+ RJW_PlasticSurgeries
+ v4.8
+ 512
+
+
+
+
+ true
+ portable
+ false
+ ..\..\Assemblies\
+ DEBUG;TRACE
+ prompt
+ 4
+ false
+
+
+
+
+ portable
+ true
+ ..\..\Assemblies\
+
+
+ prompt
+ 4
+ false
+ ..\..\Assemblies\RJW_PlasticSurgeries.xml
+ true
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+
+ ..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll
+ False
+
+
+ ..\..\..\dyspareunia\Assemblies\Dyspareunia.dll
+
+
+ ..\..\..\..\..\..\workshop\content\294100\818773962\Assemblies\HugsLib.dll
+ False
+
+
+ ..\..\..\rjw-base\1.3\Assemblies\RJW.dll
+
+
+
+
+
+
+
+
+
+
+
+
+ About\About.xml
+
+
+ About\Manifest.xml
+
+
+ Defs\Recipe_Surgery\Recipes_Surgery_Mammoplasty.xml
+
+
+ Defs\Recipe_Surgery\Recipes_Surgery_Sphinctoplasty.xml
+
+
+ Defs\Recipe_Surgery\Recipes_Surgery_Vaginoplasty.xml
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/Recipe_Surgery_Mammoplasty.cs b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Mammoplasty.cs
new file mode 100644
index 0000000..e01620b
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Mammoplasty.cs
@@ -0,0 +1,221 @@
+using RimWorld;
+using rjw;
+using System.Collections.Generic;
+using System.Linq;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Mammoplasty : Recipe_Surgery
+ {
+ public override IEnumerable GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+ {
+ var part = Genital_Helper.get_genitalsBPR(pawn);
+ if (part != null)
+ {
+ var hediffs = Genital_Helper.get_PartsHediffList(pawn, part);
+ if (Genital_Helper.has_breasts(pawn, hediffs) && pawn.GetBreastList().Any(hed => hed.Severity >= 0.02f))
+ yield return part;
+ }
+ }
+
+ public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List ingredients,
+ Bill bill)
+ {
+ if (billDoer != null)
+ {
+ TaleRecorder.RecordTale(TaleDefOf.DidSurgery, billDoer, pawn);
+ SurgeryResult(pawn);
+ }
+ }
+
+ public abstract void SurgeryResult(Pawn pawn);
+ /*{
+ pawn.GetBreastList().ForEach(hed => hed.Severity = Math.Min(1.0f, hed.Severity * 1.25f));
+ //Log.Message($"Cup sizes: {pawn.GetBreastList().SelectMany(hed => hed.def.GetModExtension().cupSizes.Join()).Join(delimiter: ";")}");
+ float val = 0;
+ PartSizeExtension.TryGetCupSize(pawn.GetBreastList().First(), out val);
+ pawn.GetBreastList().First().def.stages.First();
+ Log.Message($"Cup size: {val}");
+ }*/
+
+ protected void SurgeryCupX(Pawn pawn, int stage)
+ {
+ pawn.GetBreastList().ForEach(hed =>
+ {
+ float severity;
+ if (TryGetSeverityFromSize(hed, stage, out severity))
+ {
+ hed.Severity = severity;
+ }
+ });
+ }
+
+ static bool TryGetSeverityFromSize(Hediff hediff, float cupSize, out float severity)
+ {
+ if (!hediff.def.HasModExtension())
+ {
+ severity = 0f;
+ return false;
+ }
+
+ var extension = hediff.def.GetModExtension();
+ var list = extension.cupSizes;
+
+ if (list == null)
+ {
+ severity = 0f;
+ return false;
+ }
+
+ var curve = new SimpleCurve(hediff.def.stages.Zip(list,
+ (stage, s) => new CurvePoint(s, stage.minSeverity)));
+ severity = curve.Evaluate(cupSize);
+ return true;
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_A : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 1);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_B : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 2);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_C : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 3);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_D : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 4);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_E : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 6);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_F : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 7);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_G : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 9);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_H : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 11);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_J : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 13);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_K : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 15);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_L : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 17);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_M : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 19);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_N : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 21);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_O : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 23);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_P : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 25);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Q : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 27);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_R : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 29);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Unknown : Recipe_Surgery_Mammoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryCupX(pawn, 31);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/Recipe_Surgery_Sphinctoplasty.cs b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Sphinctoplasty.cs
new file mode 100644
index 0000000..c482bd6
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Sphinctoplasty.cs
@@ -0,0 +1,91 @@
+using System;
+using RimWorld;
+using rjw;
+using System.Collections.Generic;
+using Dyspareunia;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Sphinctoplasty : Recipe_Surgery
+ {
+ public override IEnumerable GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+ {
+ var part = Genital_Helper.get_anusBPR(pawn);
+ if (part != null)
+ {
+ var hediffs = Genital_Helper.get_PartsHediffList(pawn, part);
+ if (Genital_Helper.has_anus(pawn, hediffs)) yield return part;
+ }
+ }
+
+ ///
+ public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List ingredients,
+ Bill bill)
+ {
+ if (billDoer != null)
+ {
+ TaleRecorder.RecordTale(TaleDefOf.DidSurgery, billDoer, pawn);
+ SurgeryResult(pawn);
+ }
+ }
+
+ public abstract void SurgeryResult(Pawn pawn);
+
+ protected void SurgeryX(Pawn pawn, float severity)
+ {
+ pawn.GetAnusList().ForEach(hed =>
+ {
+ hed.Severity = severity;
+ try
+ {
+ PenetrationUtility.AddDamageHediff(Dyspareunia.DamageDefOf.SexStretch, 0.5f, hed, null);
+ }
+ catch (Exception e)
+ {
+ Log.Error("Try enabling Dyspareunia for sore genitals");
+ }
+ });
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Micro : Recipe_Surgery_Sphinctoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.1f);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Tight : Recipe_Surgery_Sphinctoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.3f);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Average : Recipe_Surgery_Sphinctoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.5f);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Accomodating : Recipe_Surgery_Sphinctoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.7f);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Cavernous : Recipe_Surgery_Sphinctoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.9f);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/Recipe_Surgery_Vaginoplasty.cs b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Vaginoplasty.cs
new file mode 100644
index 0000000..1881bd2
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/Recipe_Surgery_Vaginoplasty.cs
@@ -0,0 +1,92 @@
+using System;
+using RimWorld;
+using rjw;
+using System.Collections.Generic;
+using System.Linq;
+using Dyspareunia;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Vaginoplasty : Recipe_Surgery
+ {
+ public override IEnumerable GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+ {
+ var part = Genital_Helper.get_genitalsBPR(pawn);
+ if (part != null)
+ {
+ var hediffs = Genital_Helper.get_PartsHediffList(pawn, part);
+ if (Genital_Helper.has_vagina(pawn, hediffs)) yield return part;
+ }
+ }
+
+ ///
+ public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List ingredients,
+ Bill bill)
+ {
+ if (billDoer != null)
+ {
+ TaleRecorder.RecordTale(TaleDefOf.DidSurgery, billDoer, pawn);
+ SurgeryResult(pawn);
+ }
+ }
+
+ public abstract void SurgeryResult(Pawn pawn);
+
+ protected void SurgeryX(Pawn pawn, float severity)
+ {
+ pawn.GetGenitalsList().FindAll(Genital_Helper.is_vagina).ForEach(hed =>
+ {
+ hed.Severity = severity;
+ try
+ {
+ PenetrationUtility.AddDamageHediff(Dyspareunia.DamageDefOf.SexStretch, 0.5f, hed, null);
+ }
+ catch (Exception e)
+ {
+ Log.Error("Try enabling Dyspareunia for sore genitals");
+ }
+ });
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Micro : Recipe_Surgery_Vaginoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.1f);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Tight : Recipe_Surgery_Vaginoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.3f);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Average : Recipe_Surgery_Vaginoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.5f);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Accomodating : Recipe_Surgery_Vaginoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.7f);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Cavernous : Recipe_Surgery_Vaginoplasty
+ {
+ public override void SurgeryResult(Pawn pawn)
+ {
+ this.SurgeryX(pawn, 0.9f);
+ }
+ }
+}
\ No newline at end of file