diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..6fdfe2d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "Source/dependencies/rjw"]
+ path = Source/dependencies/rjw
+ url = https://gitgud.io/Ed86/rjw.git
+[submodule "Source/dependencies/licentia-labs"]
+ path = Source/dependencies/licentia-labs
+ url = https://gitgud.io/Jaaldabaoth/licentia-labs
diff --git a/1.3/Assemblies/RJW_PlasticSurgeries.dll b/1.3/Assemblies/RJW_PlasticSurgeries.dll
index 35fe78c..1981e9e 100644
Binary files a/1.3/Assemblies/RJW_PlasticSurgeries.dll and b/1.3/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/1.4/Assemblies/RJW_PlasticSurgeries.dll b/1.4/Assemblies/RJW_PlasticSurgeries.dll
index 74f2809..4abb372 100644
Binary files a/1.4/Assemblies/RJW_PlasticSurgeries.dll and b/1.4/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/1.5/Assemblies/RJW_PlasticSurgeries.dll b/1.5/Assemblies/RJW_PlasticSurgeries.dll
index af19c04..6cadb50 100644
Binary files a/1.5/Assemblies/RJW_PlasticSurgeries.dll and b/1.5/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/1.6/Assemblies/RJW_PlasticSurgeries.dll b/1.6/Assemblies/RJW_PlasticSurgeries.dll
new file mode 100644
index 0000000..937f39a
Binary files /dev/null and b/1.6/Assemblies/RJW_PlasticSurgeries.dll differ
diff --git a/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Beautify.xml b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Beautify.xml
new file mode 100644
index 0000000..5d60603
--- /dev/null
+++ b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Beautify.xml
@@ -0,0 +1,43 @@
+
+
+
+
+ Surgery_Beautify
+
+ Surgically beautifies the pawn.
+ beautifying
+ Surgery
+ Recipe_Surgery
+ MedicalOperationSpeed
+ Medicine
+ 0.2
+ 400
+ true
+
+
Human
+
+ 95
+
+
+
+
+
Medicine
+
+
+ 1
+
+
+
+
+
Medicine
+
+
+
+
+ Surgery_Beautify_Beautiful
+
+ Surgically beautifies the pawn.
+ RJW_PlasticSurgeries.Recipe_Surgery_Beautify_Beautiful
+ beautify the pawn.
+
+
\ No newline at end of file
diff --git a/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml
new file mode 100644
index 0000000..c9756a3
--- /dev/null
+++ b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Mammoplasty.xml
@@ -0,0 +1,163 @@
+
+
+
+
+ Surgery_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
+
+ Surgically gives the pawn an A cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_A
+ alter cup size to A
+
+
+ Surgery_Mammoplasty_B
+
+ Surgically gives the pawn an B cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_B
+ alter cup size to B
+
+
+ Surgery_Mammoplasty_C
+
+ Surgically gives the pawn an C cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_C
+ alter cup size to C
+
+
+ Surgery_Mammoplasty_D
+
+ Surgically gives the pawn an D cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_D
+ alter cup size to D
+
+
+ Surgery_Mammoplasty_E
+
+ Surgically gives the pawn an E cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_E
+ alter cup size to E
+
+
+ Surgery_Mammoplasty_F
+
+ Surgically gives the pawn an F cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_F
+ alter cup size to F
+
+
+ Surgery_Mammoplasty_G
+
+ Surgically gives the pawn an G cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_G
+ alter cup size to G
+
+
+ Surgery_Mammoplasty_H
+
+ Surgically gives the pawn an H cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_H
+ alter cup size to H
+
+
+ Surgery_Mammoplasty_J
+
+ Surgically gives the pawn an J cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_J
+ alter cup size to J
+
+
+ Surgery_Mammoplasty_K
+
+ Surgically gives the pawn an K cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_K
+ alter cup size to K
+
+
+ Surgery_Mammoplasty_L
+
+ Surgically gives the pawn an L cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_L
+ alter cup size to L
+
+
+ Surgery_Mammoplasty_M
+
+ Surgically gives the pawn an M cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_M
+ alter cup size to M
+
+
+ Surgery_Mammoplasty_N
+
+ Surgically gives the pawn an N cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_N
+ alter cup size to N
+
+
+ Surgery_Mammoplasty_O
+
+ Surgically gives the pawn an O cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_O
+ alter cup size to O
+
+
+ Surgery_Mammoplasty_P
+
+ Surgically gives the pawn an P cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_P
+ alter cup size to P
+
+
+ Surgery_Mammoplasty_Q
+
+ Surgically gives the pawn an Q cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_Q
+ alter cup size to Q
+
+
+ Surgery_Mammoplasty_R
+
+ Surgically gives the pawn an R cup.
+ RJW_PlasticSurgeries.Recipe_Surgery_Mammoplasty_R
+ alter cup size to R
+
+
+ Surgery_Mammoplasty_Unknown
+
+ 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/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Penoplasty.xml b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Penoplasty.xml
new file mode 100644
index 0000000..3edac14
--- /dev/null
+++ b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Penoplasty.xml
@@ -0,0 +1,72 @@
+
+
+
+
+ Surgery_Penoplasty
+
+ Surgically enlarges the pawn's Penis by 25%.
+
+ enlarging Penis
+ Surgery
+ Recipe_Surgery
+ MedicalOperationSpeed
+ Medicine
+ 0.2
+ 400
+ true
+
+
Human
+
+ 95
+
+
+
+
+
Medicine
+
+
+ 1
+
+
+
+
+
Medicine
+
+
+
+
+ Surgery_Penoplasty_Micro
+
+ Surgically gives the pawn an micro Penis.
+ RJW_PlasticSurgeries.Recipe_Surgery_Penoplasty_Micro
+ alter Penis size to micro
+
+
+ Surgery_Penoplasty_Small
+
+ Surgically gives the pawn an small Penis.
+ RJW_PlasticSurgeries.Recipe_Surgery_Penoplasty_Small
+ alter Penis size to small
+
+
+ Surgery_Penoplasty_Average
+
+ Surgically gives the pawn an average Penis.
+ RJW_PlasticSurgeries.Recipe_Surgery_Penoplasty_Average
+ alter Penis size to average
+
+
+ Surgery_Penoplasty_Large
+
+ Surgically gives the pawn an accomodating Penis.
+ RJW_PlasticSurgeries.Recipe_Surgery_Penoplasty_Large
+ alter Penis size to large
+
+
+ Surgery_Penoplasty_Huge
+
+ Surgically gives the pawn an huge Penis.
+ RJW_PlasticSurgeries.Recipe_Surgery_Penoplasty_Huge
+ alter Penis size to huge
+
+
\ No newline at end of file
diff --git a/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml
new file mode 100644
index 0000000..578d9db
--- /dev/null
+++ b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Sphinctoplasty.xml
@@ -0,0 +1,72 @@
+
+
+
+
+ Surgery_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
+
+ Surgically gives the pawn an micro Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Micro
+ alter Sphincter size to micro
+
+
+ Surgery_Sphinctoplasty_Tight
+
+ Surgically gives the pawn an tight Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Tight
+ alter Sphincter size to tight
+
+
+ Surgery_Sphinctoplasty_Average
+
+ Surgically gives the pawn an average Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Average
+ alter Sphincter size to average
+
+
+ Surgery_Sphinctoplasty_Accomodating
+
+ Surgically gives the pawn an accomodating Sphincter.
+ RJW_PlasticSurgeries.Recipe_Surgery_Sphinctoplasty_Accomodating
+ alter Sphincter size to accomodating
+
+
+ Surgery_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/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml
new file mode 100644
index 0000000..11e9c8e
--- /dev/null
+++ b/1.6/Defs/Recipe_Surgery/Recipes_Surgery_Vaginoplasty.xml
@@ -0,0 +1,72 @@
+
+
+
+
+ Surgery_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
+
+ Surgically gives the pawn an micro Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Micro
+ alter Vagina size to micro
+
+
+ Surgery_Vaginoplasty_Tight
+
+ Surgically gives the pawn an tight Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Tight
+ alter Vagina size to tight
+
+
+ Surgery_Vaginoplasty_Average
+
+ Surgically gives the pawn an average Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Average
+ alter Vagina size to average
+
+
+ Surgery_Vaginoplasty_Accomodating
+
+ Surgically gives the pawn an accomodating Vagina.
+ RJW_PlasticSurgeries.Recipe_Surgery_Vaginoplasty_Accomodating
+ alter Vagina size to accomodating
+
+
+ Surgery_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/About/About.xml b/About/About.xml
index 55aab1b..6cdb3b7 100644
--- a/About/About.xml
+++ b/About/About.xml
@@ -7,6 +7,7 @@
1.3
1.4
1.5
+
1.6
Stardust3D.RJW.PlasticSurgeriesSurgically alter pawn's genitals.
diff --git a/About/Manifest.xml b/About/Manifest.xml
index cb4e292..5a51cbc 100644
--- a/About/Manifest.xml
+++ b/About/Manifest.xml
@@ -2,5 +2,5 @@
RJW PlasticSurgeries
- 5400.0.1.8
-
\ No newline at end of file
+ 6010.0.1.8
+
diff --git a/Source/RJW_PlasticSurgeries.sln b/Source/RJW_PlasticSurgeries.sln
index a8eb130..b0004cd 100644
--- a/Source/RJW_PlasticSurgeries.sln
+++ b/Source/RJW_PlasticSurgeries.sln
@@ -3,11 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33110.190
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RJW_PlasticSurgeries_1.3", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.3.csproj", "{EB363145-6DB4-42CB-B2CB-82DA7AE02A97}"
+Project("{EB363145-6DB4-42CB-B2CB-82DA7AE02A97}") = "RJW_PlasticSurgeries_1.3", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.3.csproj", "{EB363145-6DB4-42CB-B2CB-82DA7AE02A97}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RJW_PlasticSurgeries_1.4", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.4.csproj", "{F17C6B3F-BA9D-4133-A201-1265A64BCB72}"
+Project("{F17C6B3F-BA9D-4133-A201-1265A64BCB72}") = "RJW_PlasticSurgeries_1.4", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.4.csproj", "{F17C6B3F-BA9D-4133-A201-1265A64BCB72}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RJW_PlasticSurgeries_1.5", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.5.csproj", "{02AA6D85-913F-44B8-9C32-6E8024261824}"
+Project("{02AA6D85-913F-44B8-9C32-6E8024261824}") = "RJW_PlasticSurgeries_1.5", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.5.csproj", "{02AA6D85-913F-44B8-9C32-6E8024261824}"
+EndProject
+Project("{a543e968-6ecf-46de-8e76-1050188a4050}") = "RJW_PlasticSurgeries_1.6", "RJW_PlasticSurgeries\RJW_PlasticSurgeries_1.6.csproj", "{a543e968-6ecf-46de-8e76-1050188a4050}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +29,10 @@ Global
{02AA6D85-913F-44B8-9C32-6E8024261824}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02AA6D85-913F-44B8-9C32-6E8024261824}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02AA6D85-913F-44B8-9C32-6E8024261824}.Release|Any CPU.Build.0 = Release|Any CPU
+ {a543e968-6ecf-46de-8e76-1050188a4050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {a543e968-6ecf-46de-8e76-1050188a4050}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {a543e968-6ecf-46de-8e76-1050188a4050}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {a543e968-6ecf-46de-8e76-1050188a4050}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Source/RJW_PlasticSurgeries/1.5/Recipe_Surgery_Mammoplasty.cs b/Source/RJW_PlasticSurgeries/1.5/Recipe_Surgery_Mammoplasty.cs
new file mode 100644
index 0000000..549373c
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.5/Recipe_Surgery_Mammoplasty.cs
@@ -0,0 +1,198 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Mammoplasty : Recipe_Plastic_Surgery
+ {
+ protected override BodyPartRecord GetPartCandidate(Pawn pawn)
+ {
+ return Genital_Helper.get_genitalsBPR(pawn);
+ }
+
+ protected override bool HasPart(Pawn pawn, List hediffs)
+ {
+ return Genital_Helper.has_breasts(pawn, hediffs) &&
+ pawn.GetBreastList().Any(hed => hed.Severity >= 0.02f);
+ }
+
+ protected override List GetHediffs(Pawn pawn)
+ {
+ throw new NotSupportedException();
+ }
+
+ protected void SurgeryCupX(Pawn pawn, int stage)
+ {
+ pawn.GetBreastList().ForEach(hed =>
+ {
+ float severity;
+ if (TryGetSeverityFromSize(hed, stage, out severity)) hed.Severity = severity;
+ });
+ }
+
+ private static bool TryGetSeverityFromSize(Hediff hediff, float cupSize, out float severity)
+ {
+ var list = (hediff.def as HediffDef_SexPart)?.sizeProfile.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;
+ }
+
+ protected override (HediffDef, float) GetLicentiaDamage() => throw new NotSupportedException();
+ }
+
+ public class Recipe_Surgery_Mammoplasty_A : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 1);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_B : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 2);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_C : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 3);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_D : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 4);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_E : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 6);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_F : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 7);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_G : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 9);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_H : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 11);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_J : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 13);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_K : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 15);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_L : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 17);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_M : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 19);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_N : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 21);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_O : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 23);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_P : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 25);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Q : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 27);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_R : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 29);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Unknown : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 31);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Plastic_Surgery.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Plastic_Surgery.cs
new file mode 100644
index 0000000..3f54ce7
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Plastic_Surgery.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+using RimWorld;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Plastic_Surgery : Recipe_Surgery
+ {
+ public override IEnumerable GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+ {
+ var part = GetPartCandidate(pawn);
+ if (part != null)
+ {
+ var hediffs = Genital_Helper.get_PartsHediffList(pawn, part);
+ if (HasPart(pawn, hediffs)) yield return part;
+ }
+ }
+
+ protected abstract BodyPartRecord GetPartCandidate(Pawn pawn);
+ protected abstract bool HasPart(Pawn pawn, List hediffs);
+
+ 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);
+ }
+ }
+
+ protected abstract void SurgeryResult(Pawn pawn);
+
+ protected void SurgeryX(Pawn pawn, float severity, bool damagePart = false)
+ {
+ GetHediffs(pawn).ForEach(hed =>
+ {
+ hed.Severity = severity;
+ /* if (damagePart)
+ {
+ var dmg = HediffDef.Named();
+ hed.pawn.health.AddHediff(dmg);
+ var (type, damage) = GetLicentiaDamage();
+ LicentiaLabs.DamageHelper.ApplyDamage(pawn, hed.Part, type, damage);
+ } */
+ });
+ }
+
+ protected abstract List GetHediffs(Pawn pawn);
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Beautify.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Beautify.cs
new file mode 100644
index 0000000..bdf4023
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Beautify.cs
@@ -0,0 +1,61 @@
+using System.Collections.Generic;
+using RimWorld;
+using Verse;
+using static rjw.VanillaTraitDefOf;
+
+namespace RJW_PlasticSurgeries
+{
+ ///
+ public abstract class Recipe_Surgery_Beautify : Recipe_Surgery
+ {
+ ///
+ public override IEnumerable GetPartsToApplyOn(Pawn pawn, RecipeDef recipe)
+ {
+ if (!pawn.story.traits.HasTrait(Beauty) ||
+ pawn.story.traits.HasTrait(Beauty) && pawn.story.traits.GetTrait(Beauty).Degree < 2)
+ yield return pawn.RaceProps.body.corePart;
+ }
+
+ ///
+ 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);
+
+ ///
+ /// Setts the severity of the Beautiful trait for the selected pawn.
+ /// If the trait doesn't exist in the pawns traits, it will be added.
+ ///
+ /// the pawn to modify
+ /// the new severity of the pawn's Beautiful trait
+ protected void SurgeryX(Pawn pawn, int severity)
+ {
+ if (pawn.story.traits.HasTrait(Beauty))
+ {
+ pawn.story.traits.allTraits.FindAll(t => Beauty.ConflictsWith(t))
+ .ForEach(t => pawn.story.traits.RemoveTrait(t));
+ pawn.story.traits.RemoveTrait(pawn.story.traits.allTraits.Find(t => t.def == Beauty));
+ }
+
+ pawn.story.traits.GainTrait(new Trait(Beauty, severity));
+ }
+ }
+
+ ///
+ public class Recipe_Surgery_Beautify_Beautiful : Recipe_Surgery_Beautify
+ {
+ ///
+ public override void SurgeryResult(Pawn pawn) => SurgeryX(pawn, 2);
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Mammoplasty.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Mammoplasty.cs
new file mode 100644
index 0000000..2ef03a6
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Mammoplasty.cs
@@ -0,0 +1,196 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Mammoplasty : Recipe_Plastic_Surgery
+ {
+ protected override BodyPartRecord GetPartCandidate(Pawn pawn)
+ {
+ return Genital_Helper.get_genitalsBPR(pawn);
+ }
+
+ protected override bool HasPart(Pawn pawn, List hediffs)
+ {
+ return Genital_Helper.has_breasts(pawn, hediffs) &&
+ pawn.GetBreastList().Any(hed => hed.Severity >= 0.02f);
+ }
+
+ protected override List GetHediffs(Pawn pawn)
+ {
+ throw new NotSupportedException();
+ }
+
+ protected void SurgeryCupX(Pawn pawn, int stage)
+ {
+ pawn.GetBreastList().ForEach(hed =>
+ {
+ float severity;
+ if (TryGetSeverityFromSize(hed, stage, out severity)) hed.Severity = severity;
+ });
+ }
+
+ private static bool TryGetSeverityFromSize(Hediff hediff, float cupSize, out float severity)
+ {
+ var list = (hediff.def as HediffDef_SexPart)?.sizeProfile.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
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 1);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_B : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 2);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_C : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 3);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_D : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 4);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_E : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 6);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_F : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 7);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_G : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 9);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_H : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 11);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_J : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 13);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_K : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 15);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_L : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 17);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_M : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 19);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_N : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 21);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_O : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 23);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_P : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 25);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Q : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 27);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_R : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 29);
+ }
+ }
+
+ public class Recipe_Surgery_Mammoplasty_Unknown : Recipe_Surgery_Mammoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryCupX(pawn, 31);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Penoplasty.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Penoplasty.cs
new file mode 100644
index 0000000..f52b6c6
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Penoplasty.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Penoplasty : Recipe_Plastic_Surgery
+ {
+ protected override BodyPartRecord GetPartCandidate(Pawn pawn)
+ {
+ return Genital_Helper.get_genitalsBPR(pawn);
+ }
+
+ protected override bool HasPart(Pawn pawn, List hediffs)
+ {
+ return Genital_Helper.has_penis_fertile(pawn, hediffs) ||
+ Genital_Helper.has_penis_infertile(pawn, hediffs);
+ }
+
+ protected override List GetHediffs(Pawn pawn)
+ {
+ return pawn.GetGenitalsList().FindAll(Genital_Helper.is_penis);
+ }
+ }
+
+ public class Recipe_Surgery_Penoplasty_Micro : Recipe_Surgery_Penoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.1f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Penoplasty_Small : Recipe_Surgery_Penoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.3f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Penoplasty_Average : Recipe_Surgery_Penoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.5f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Penoplasty_Large : Recipe_Surgery_Penoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.7f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Penoplasty_Huge : Recipe_Surgery_Penoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.9f, true);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Sphinctoplasty.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Sphinctoplasty.cs
new file mode 100644
index 0000000..251f5b9
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Sphinctoplasty.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Sphinctoplasty : Recipe_Plastic_Surgery
+ {
+ protected override BodyPartRecord GetPartCandidate(Pawn pawn)
+ {
+ return Genital_Helper.get_anusBPR(pawn);
+ }
+
+ protected override bool HasPart(Pawn pawn, List hediffs)
+ {
+ return Genital_Helper.has_anus(pawn, hediffs);
+ }
+
+ protected override List GetHediffs(Pawn pawn)
+ {
+ return pawn.GetAnusList();
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Micro : Recipe_Surgery_Sphinctoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.1f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Tight : Recipe_Surgery_Sphinctoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.3f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Average : Recipe_Surgery_Sphinctoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.5f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Accomodating : Recipe_Surgery_Sphinctoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.7f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Sphinctoplasty_Cavernous : Recipe_Surgery_Sphinctoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.9f, true);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Vaginoplasty.cs b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Vaginoplasty.cs
new file mode 100644
index 0000000..f9a457f
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/Recipe_Surgery_Vaginoplasty.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using rjw;
+using Verse;
+
+namespace RJW_PlasticSurgeries
+{
+ public abstract class Recipe_Surgery_Vaginoplasty : Recipe_Plastic_Surgery
+ {
+ protected override BodyPartRecord GetPartCandidate(Pawn pawn)
+ {
+ return Genital_Helper.get_genitalsBPR(pawn);
+ }
+
+ protected override bool HasPart(Pawn pawn, List hediffs)
+ {
+ return Genital_Helper.has_vagina(pawn, hediffs);
+ }
+
+ protected override List GetHediffs(Pawn pawn)
+ {
+ return pawn.GetGenitalsList().FindAll(Genital_Helper.is_vagina);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Micro : Recipe_Surgery_Vaginoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.1f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Tight : Recipe_Surgery_Vaginoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.3f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Average : Recipe_Surgery_Vaginoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.5f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Accomodating : Recipe_Surgery_Vaginoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.7f, true);
+ }
+ }
+
+ public class Recipe_Surgery_Vaginoplasty_Cavernous : Recipe_Surgery_Vaginoplasty
+ {
+ protected override void SurgeryResult(Pawn pawn)
+ {
+ SurgeryX(pawn, 0.9f, true);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/1.6/VanillaTraitDefOf.cs b/Source/RJW_PlasticSurgeries/1.6/VanillaTraitDefOf.cs
new file mode 100644
index 0000000..918c7ca
--- /dev/null
+++ b/Source/RJW_PlasticSurgeries/1.6/VanillaTraitDefOf.cs
@@ -0,0 +1,26 @@
+using Verse;
+using RimWorld;
+
+namespace rjw
+{
+ [DefOf]
+ public static class VanillaTraitDefOf
+ {
+ public static TraitDef Tough;
+
+ public static TraitDef Nerves;
+
+ public static TraitDef Beauty;
+
+ public static TraitDef TooSmart;
+
+ public static TraitDef NaturalMood;
+
+ public static TraitDef Cannibal;
+
+ static VanillaTraitDefOf()
+ {
+ DefOfHelper.EnsureInitializedInCtor(typeof(VanillaTraitDefOf));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/RJW_PlasticSurgeries/About/About.xml b/Source/RJW_PlasticSurgeries/About/About.xml
index 55aab1b..6cdb3b7 100644
--- a/Source/RJW_PlasticSurgeries/About/About.xml
+++ b/Source/RJW_PlasticSurgeries/About/About.xml
@@ -7,6 +7,7 @@