diff --git a/.gitignore b/.gitignore
index 2236aa5..b14b0f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -343,3 +343,6 @@ healthchecksdb
*.psd
*.dds
*.pdn
+
+Directory.Build.props
+Directory.Build.targets
diff --git a/1.6/Animal Genetics/Assemblies/Animal Genetics.dll b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll
index ff81c70..e28598f 100644
Binary files a/1.6/Animal Genetics/Assemblies/Animal Genetics.dll and b/1.6/Animal Genetics/Assemblies/Animal Genetics.dll differ
diff --git a/1.6/Assemblies/RJW_Menstruation.dll b/1.6/Assemblies/RJW_Menstruation.dll
index 458e7c3..86b2376 100644
Binary files a/1.6/Assemblies/RJW_Menstruation.dll and b/1.6/Assemblies/RJW_Menstruation.dll differ
diff --git a/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml b/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml
new file mode 100644
index 0000000..1ef4a86
--- /dev/null
+++ b/1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml
@@ -0,0 +1,11 @@
+
+
+
+ RJWMenstruation_Womb
+ Womb/Womb
+ Open womb status. Click the header to sort by womb presence and cycle stage.
+ RJW_Menstruation.MainTab.PawnColumnWorker_WombStatus
+ true
+ 34
+
+
diff --git a/1.6/Humanoid Alien Races/Assemblies/HAR.dll b/1.6/Humanoid Alien Races/Assemblies/HAR.dll
index 4ce2a5f..611da42 100644
Binary files a/1.6/Humanoid Alien Races/Assemblies/HAR.dll and b/1.6/Humanoid Alien Races/Assemblies/HAR.dll differ
diff --git a/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml b/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml
index 99bf5f0..d61c6b9 100644
--- a/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml
+++ b/1.6/Languages/ChineseTraditional/Keyed/RJW_Menstruation.xml
@@ -166,4 +166,7 @@
已吸收
子宮處於月經週期之外。經過足夠的時間後,月經週期會恢復。
+
+ 對已經不育的子宮顯示子宮圖示
+ 仍然展示不育的子宮狀態
diff --git a/1.6/Patches/RJW_PawnTableDefs.xml b/1.6/Patches/RJW_PawnTableDefs.xml
new file mode 100644
index 0000000..edbc555
--- /dev/null
+++ b/1.6/Patches/RJW_PawnTableDefs.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ /Defs/PawnTableDef[defName="RJW_PawnTable_Colonists"]/columns/li[text()="Pregnant"]
+
+ RJWMenstruation_Womb
+
+
+
+ /Defs/PawnTableDef[defName="RJW_PawnTable_Property"]/columns/li[text()="Pregnant"]
+
+ RJWMenstruation_Womb
+
+
+
+
+
diff --git a/1.6/Quirks/Assemblies/Quirks.dll b/1.6/Quirks/Assemblies/Quirks.dll
index 774829d..91a4a19 100644
Binary files a/1.6/Quirks/Assemblies/Quirks.dll and b/1.6/Quirks/Assemblies/Quirks.dll differ
diff --git a/1.6/Quirks/Source/Quirks/RedWings.cs b/1.6/Quirks/Source/Quirks/RedWings.cs
index 2c11420..0623748 100644
--- a/1.6/Quirks/Source/Quirks/RedWings.cs
+++ b/1.6/Quirks/Source/Quirks/RedWings.cs
@@ -13,8 +13,7 @@ namespace RJW_Menstruation_Quirks
{
public override bool Satisfied(Pawn pawn)
{
- List genitalsList = pawn.GetGenitalsList();
- return genitalsList.Any(genital => (genital.def as HediffDef_SexPart)?.genitalFamily == GenitalFamily.Penis);
+ return pawn.GetGenitalsList().Any(genital => (genital.def as HediffDef_SexPart)?.genitalFamily == GenitalFamily.Penis);
}
}
diff --git a/1.6/Vanilla Expanded Core/Assemblies/VECore.dll b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll
index d99975c..f47a501 100644
Binary files a/1.6/Vanilla Expanded Core/Assemblies/VECore.dll and b/1.6/Vanilla Expanded Core/Assemblies/VECore.dll differ
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs
index b02d683..94eecdb 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Cum.cs
@@ -169,6 +169,13 @@ namespace RJW_Menstruation
Scribe_Values.Look(ref useCustomColor, "useCustomColor", false);
Scribe_Values.Look(ref customColor, "customColor", default);
Scribe_Defs.Look(ref filthDef, "filthDef");
+ if (Scribe.mode == LoadSaveMode.PostLoadInit &&
+ (Single.IsInfinity(FertVolume) || Single.IsNaN(FertVolume) || volume < 0f))
+ {
+ Log.Error($"Invalid amount of {pawn}'s cum in a womb");
+ volume = 0;
+ fertility = 0;
+ }
}
public void MakeThinner(float speed)
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs
index f8e807b..afca25e 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs
@@ -126,7 +126,7 @@ namespace RJW_Menstruation
protected int? opcache = null;
protected float antisperm = 0.0f;
// RJW pregnancy, or Biotech pregnancy/labor/laborpushing
- protected Hediff pregnancy = null;
+ protected Hediff pregnancy = null; // Remove, instead reference per-genital pregnancy list
protected int eggLifeSpanTicks = GenDate.DaysToTicks(2);
protected EstrusLevel estrusLevel = EstrusLevel.Visible;
@@ -313,7 +313,7 @@ namespace RJW_Menstruation
{
StatDefOf.Fertility.Worker.ClearCacheForThing(Pawn); // No effect for now, but a future RW update might add caching for this
calculatingOvulationChance = true;
- ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction);
+ ovulationChance *= PawnCapacityUtility.CalculateCapacityLevel(Pawn.health.hediffSet, xxx.reproduction); // Add genital fertility
}
finally
{
@@ -672,7 +672,16 @@ namespace RJW_Menstruation
}
}
- public void Notify_UpdatedGenes()
+ private void ProcessExtension(MenstruationModExtension extension)
+ {
+ eggLifeSpanTicks = (int)(eggLifeSpanTicks * extension.eggLifeTimeFactor);
+ if (extension.alwaysEstrus) estrusLevel = EstrusLevel.Visible;
+ else if (extension.neverEstrus) estrusLevel = EstrusLevel.None;
+ ovulationFactor *= extension.ovulationFactor;
+ if (extension.noBleeding) noBleeding = true;
+ }
+
+ public void DirtyStats()
{
eggLifeSpanTicks = GenDate.DaysToTicks(Props.eggLifespanDays);
estrusLevel = Props.concealedEstrus ? EstrusLevel.Concealed : EstrusLevel.Visible;
@@ -680,19 +689,31 @@ namespace RJW_Menstruation
noBleeding = false;
opcache = null;
- if (Pawn.genes == null || !ModsConfig.BiotechActive) return;
- foreach (MenstruationModExtension extension in Pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def.GetModExtension()).Where(ext => ext != null))
- {
- eggLifeSpanTicks = (int)(eggLifeSpanTicks * extension.eggLifeTimeFactor);
- if (extension.alwaysEstrus) estrusLevel = EstrusLevel.Visible;
- else if (extension.neverEstrus) estrusLevel = EstrusLevel.None;
- ovulationFactor *= extension.ovulationFactor;
- if (extension.noBleeding) noBleeding = true;
- }
+ MenstruationModExtension thingExtension = Pawn.def.GetModExtension();
+ if (thingExtension != null)
+ ProcessExtension(thingExtension);
+
+ if (Pawn.genes != null && ModsConfig.BiotechActive)
+ foreach (MenstruationModExtension geneExtension in Pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def.GetModExtension()).Where(ext => ext != null))
+ ProcessExtension(geneExtension);
+
+ foreach (MenstruationModExtension hediffExtension in Pawn.health.hediffSet.hediffs.Select(hediff => hediff.def.GetModExtension()).Where(ext => ext != null))
+ ProcessExtension(hediffExtension);
+
if (eggLifeSpanTicks < 0) eggLifeSpanTicks = 0;
if (ovulationFactor < 0f) ovulationFactor = 0f;
}
+ public void Notify_UpdatedGenes()
+ {
+ DirtyStats();
+ }
+
+ public void Notify_HediffsChanged()
+ {
+ DirtyStats();
+ }
+
public bool ShouldSimulate()
{
if (!Pawn.ShouldCycle()) return false;
@@ -861,6 +882,11 @@ namespace RJW_Menstruation
return cums?.Find(cum => !cum.notcum && cum.pawn == pawn);
}
+ public IEnumerable GetFluids()
+ {
+ return cums ?? Enumerable.Empty();
+ }
+
public IEnumerable GetFluids(Pawn pawn)
{
return cums?.Where(cum => cum.pawn == pawn) ?? Enumerable.Empty();
@@ -1229,7 +1255,7 @@ namespace RJW_Menstruation
protected virtual void PreInitialize()
{
- Notify_UpdatedGenes();
+ DirtyStats();
}
protected virtual void PostInitialize()
@@ -1455,7 +1481,7 @@ namespace RJW_Menstruation
try
{
if (Configurations.Debug) Log.Message($"Implanting fertilized egg of {Pawn} into {parent}, father {egg.fertilizer}");
- if (pregnancy == null)
+ if (pregnancy == null) // Support pregnancy list, maybe split off into function
{
Configurations.PregnancyType usePregnancy = xxx.is_human(Pawn) ? Configurations.PregnancySource : Configurations.PregnancyType.MultiplePregnancy;
switch (usePregnancy)
@@ -1473,7 +1499,7 @@ namespace RJW_Menstruation
case Configurations.PregnancyType.MultiplePregnancy:
if (Configurations.Debug) Log.Message($"Creating new menstruation pregnancy");
- pregnancy = Hediff_BasePregnancy.Create(Pawn, egg.fertilizer);
+ pregnancy = Hediff_BasePregnancy.Create(Pawn, egg.fertilizer); // Add fertility comp of mother
pregnant = true;
deadeggs.Add(egg);
break;
@@ -1830,6 +1856,7 @@ namespace RJW_Menstruation
protected virtual void ThoughtCumInside(Pawn cummer)
{
+ const int haterThreshold = -5;
MemoryThoughtHandler cummerMemories = cummer?.needs?.mood?.thoughts.memories;
MemoryThoughtHandler pawnMemories = Pawn?.needs?.mood?.thoughts.memories;
@@ -1837,7 +1864,7 @@ namespace RJW_Menstruation
if (cummer.IsProPregnancy(out Precept preceptm) || (cummer.IsTeratophile() != (Pawn.GetStatValue(StatDefOf.PawnBeauty) >= 0)))
{
- if (cummer.relations.OpinionOf(Pawn) <= -5)
+ if (cummer.relations.OpinionOf(Pawn) <= haterThreshold)
cummerMemories.TryGainMemory(VariousDefOf.HaterCameInsideM, Pawn);
else if (preceptm != null)
cummerMemories.TryGainMemory(VariousDefOf.CameInsideMIdeo, Pawn, preceptm);
@@ -1851,14 +1878,14 @@ namespace RJW_Menstruation
{
if (preceptf != null)
{
- if (Pawn.relations.OpinionOf(cummer) <= -5)
+ if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFIdeo, cummer, preceptf);
else
pawnMemories.TryGainMemory(VariousDefOf.CameInsideFIdeo, cummer, preceptf);
}
else pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetish, cummer);
}
- else if (Pawn.relations.OpinionOf(cummer) <= -5)
+ else if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer);
else if (Pawn.IsInEstrus() && Pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer);
@@ -1872,7 +1899,7 @@ namespace RJW_Menstruation
{
if (Pawn.IsProPregnancy(out Precept _))
pawnMemories.TryGainMemory(VariousDefOf.CameInsideFFetishSafe, cummer);
- else if (Pawn.relations.OpinionOf(cummer) <= -5)
+ else if (Pawn.relations.OpinionOf(cummer) <= haterThreshold)
pawnMemories.TryGainMemory(VariousDefOf.HaterCameInsideFSafe, cummer);
}
}
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs
index b25f098..92f5dfc 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs
@@ -87,35 +87,27 @@ namespace RJW_Menstruation
return 1.0f - Mathf.Pow(1.0f - Configurations.FertilizeChance, comp.TotalFertCum * comp.Props.basefertilizationChanceFactor);
}
+ public static string GetSingleBabyImage(HediffComp_Menstruation comp, Hediff pregnancy)
+ {
+ ThingDef babydef;
+ HediffComp_PregeneratedBabies babiescomp = pregnancy?.TryGetComp();
+ if (pregnancy.IsMechanoidPregnant()) babydef = (pregnancy as Hediff_BasePregnancy)?.babies?.FirstOrDefault()?.def ?? VariousDefOf.Scyther;
+ else if (pregnancy is Hediff_BasePregnancy preg) babydef = preg.babies?.FirstOrDefault()?.def ?? ThingDefOf.Human;
+ else if (babiescomp?.HasBaby ?? false) babydef = babiescomp.PeekBaby().def;
+ else babydef = comp.Pawn.def;
+
+ return babydef.GetModExtension()?.fetusTexPath ?? "Fetus/Fetus_Default";
+ }
+
public static Texture2D GetPregnancyIcon(this HediffComp_Menstruation comp, Hediff hediff)
{
float gestationProgress = comp.StageProgress;
- ThingDef babydef;
int babycount;
- HediffComp_PregeneratedBabies babiescomp = hediff?.TryGetComp();
- if (hediff.IsMechanoidPregnant())
- {
- babydef = (hediff as Hediff_BasePregnancy)?.babies?.FirstOrDefault()?.def ?? VariousDefOf.Scyther;
- babycount = 1;
- }
- else if (hediff is Hediff_BasePregnancy preg)
- {
- babydef = preg.babies?.FirstOrDefault()?.def ?? ThingDefOf.Human;
- babycount = preg.babies?.Count ?? 1;
- }
- else if (babiescomp?.HasBaby ?? false)
- {
- babydef = babiescomp.PeekBaby().def;
- babycount = babiescomp.BabyCount;
- }
- else
- {
- babydef = comp.Pawn.def;
- babycount = 1;
- }
+ if (hediff is Hediff_BasePregnancy preg) babycount = preg.babies?.Count ?? 1;
+ else babycount = hediff?.TryGetComp()?.BabyCount ?? 1;
- string fetustex = babydef.GetModExtension()?.fetusTexPath ?? "Fetus/Fetus_Default";
+ string fetustex = GetSingleBabyImage(comp, hediff);
string icon;
if (gestationProgress < 0.2f) icon = comp.WombTex + "_Implanted";
else if (gestationProgress < 0.4f) icon = fetustex + "00";
@@ -316,11 +308,11 @@ namespace RJW_Menstruation
return ContentFinder.Get(icon, true);
}
- public static Texture2D GetAnalIcon(this Pawn pawn)
+ // comp used by Menstruation Fluids
+ public static Texture2D GetAnalIcon(this Pawn pawn, HediffComp_Menstruation comp)
{
- Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ??
- pawn.health.hediffSet.hediffs.FirstOrDefault(h => h.def.defName.ToLower().Contains("anus"));
- if (hediff == null) return ContentFinder.Get("Genitals/Anal00", true);
+ if (!pawn.GetAnusList().Any()) return ContentFinder.Get("Genitals/Anal00", true);
+ Hediff hediff = pawn.GetAnusList().MaxBy(a => a.Severity);
string icon = ((CompProperties_Anus)hediff.GetAnusComp()?.props)?.analTex ?? "Genitals/Anal";
float severity = hediff.Severity;
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
index 52c356b..e67afc0 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Hediff_MultiplePregnancy.cs
@@ -10,6 +10,12 @@ namespace RJW_Menstruation
{
protected Dictionary enzygoticSiblings = new Dictionary(); // Each pawn and who they split from
+ // used by Eltoro's addons
+ public override void PostMake()
+ {
+ base.PostMake();
+ }
+
public override void DiscoverPregnancy()
{
PregnancyThought();
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs
new file mode 100644
index 0000000..3c28db8
--- /dev/null
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/MainTab/PawnColumnWorker_WombStatus.cs
@@ -0,0 +1,138 @@
+using RimWorld;
+using UnityEngine;
+using Verse;
+
+namespace RJW_Menstruation.MainTab
+{
+ public class PawnColumnWorker_WombStatus : PawnColumnWorker
+ {
+ private const float CellIconSize = 24f;
+ private const float ProgressBarHeight = 2f;
+ private const float IconScale = 0.85f;
+ private const int HasVisibleWombOffset = 100;
+
+ public override void DoCell(Rect rect, Pawn pawn, PawnTable table)
+ {
+ HediffComp_Menstruation comp = GetDisplayComp(pawn);
+ if (comp == null) return;
+
+ Gizmo_Womb gizmo = Pawn_GetGizmos.CreateGizmo_WombStatus(pawn, comp);
+ Rect iconRect = new Rect(
+ rect.x + (rect.width - CellIconSize) / 2f,
+ rect.y + Mathf.Max((rect.height - CellIconSize) / 2f, 0f),
+ CellIconSize,
+ CellIconSize);
+
+ DrawCellIcon(iconRect, gizmo);
+
+ if (Mouse.IsOver(iconRect) && !gizmo.defaultDesc.NullOrEmpty())
+ {
+ TooltipHandler.TipRegion(iconRect, gizmo.defaultDesc);
+ }
+
+ if (Widgets.ButtonInvisible(iconRect, doMouseoverSound: false))
+ {
+ Dialog_WombStatus.ToggleWindow(pawn, comp);
+ }
+ }
+
+ public override int GetMinWidth(PawnTable table)
+ {
+ return 30;
+ }
+
+ public override int GetMaxWidth(PawnTable table)
+ {
+ return GetMinWidth(table);
+ }
+
+ public override int GetMinCellHeight(Pawn pawn)
+ {
+ return 30;
+ }
+
+ public override int Compare(Pawn a, Pawn b)
+ {
+ int result = GetSortValue(a).CompareTo(GetSortValue(b));
+ if (result != 0) return result;
+
+ return string.CompareOrdinal(a.LabelShortCap, b.LabelShortCap);
+ }
+
+ private static HediffComp_Menstruation GetDisplayComp(Pawn pawn)
+ {
+ if (!pawn.ShowStatus() || !pawn.ShouldCycle()) return null;
+
+ HediffComp_Menstruation comp = pawn.GetFirstMenstruationComp();
+ if (comp == null) return null;
+
+ if (!Configurations.ShowInfertileIcon &&
+ (comp.CurrentVisibleStage == HediffComp_Menstruation.Stage.Infertile ||
+ comp.CurrentVisibleStage == HediffComp_Menstruation.Stage.None))
+ {
+ return null;
+ }
+
+ return comp;
+ }
+
+ private static int GetSortValue(Pawn pawn)
+ {
+ if (!pawn.ShowStatus() || !pawn.ShouldCycle()) return int.MinValue;
+
+ HediffComp_Menstruation comp = pawn.GetFirstMenstruationComp();
+ if (comp == null) return int.MinValue + 1;
+
+ return HasVisibleWombOffset + GetStageSortValue(comp.CurrentVisibleStage);
+ }
+
+ private static int GetStageSortValue(HediffComp_Menstruation.Stage stage)
+ {
+ switch (stage)
+ {
+ case HediffComp_Menstruation.Stage.Luteal:
+ return 9;
+ case HediffComp_Menstruation.Stage.Ovulatory:
+ return 8;
+ case HediffComp_Menstruation.Stage.Follicular:
+ return 7;
+ case HediffComp_Menstruation.Stage.Pregnant:
+ return 6;
+ case HediffComp_Menstruation.Stage.Bleeding:
+ return 5;
+ case HediffComp_Menstruation.Stage.Recover:
+ return 4;
+ case HediffComp_Menstruation.Stage.Anestrus:
+ return 3;
+ case HediffComp_Menstruation.Stage.Infertile:
+ return 2;
+ case HediffComp_Menstruation.Stage.None:
+ return 1;
+ default:
+ return 0;
+ }
+ }
+
+ private static void DrawCellIcon(Rect rect, Gizmo_Womb gizmo)
+ {
+ Texture baseIcon = gizmo.icon ?? BaseContent.BadTex;
+ Texture overlay = gizmo.icon_overlay ?? BaseContent.BadTex;
+
+ Widgets.DrawTextureFitted(rect, baseIcon, IconScale);
+
+ Color oldColor = GUI.color;
+ GUI.color = gizmo.cumcolor;
+ Widgets.DrawTextureFitted(rect, overlay, IconScale);
+ GUI.color = Color.white;
+
+ if (Configurations.DrawEggOverlay)
+ {
+ gizmo.comp.DrawEggOverlay(rect, false);
+ }
+
+ Rect progressRect = new Rect(rect.x + 2f, rect.y, rect.width - 4f, ProgressBarHeight);
+ Widgets.FillableBar(progressRect, gizmo.comp.StageProgress, gizmo.comp.GetStageTexture);
+ GUI.color = oldColor;
+ }
+ }
+}
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs
index ee40f8c..7ff4746 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs
@@ -204,6 +204,17 @@ namespace RJW_Menstruation
}
}
+ [HarmonyPatch(typeof(Pawn_HealthTracker), nameof(Pawn_HealthTracker.CheckForStateChange))]
+ public class CheckForStateChange_Patch
+ {
+ public static void Postfix(Pawn ___pawn, Hediff hediff)
+ {
+ if (hediff == null || !hediff.def.HasModExtension()) return;
+ foreach (HediffComp_Menstruation comp in ___pawn.GetMenstruationComps())
+ comp.Notify_HediffsChanged();
+ }
+ }
+
[HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")]
public class Notify_GenesChanged_Patch
{
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs
index 7838e01..8c2b59b 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/Gizmo_Patch.cs
@@ -46,7 +46,7 @@ namespace RJW_Menstruation
}
- private static Gizmo CreateGizmo_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
+ internal static Gizmo_Womb CreateGizmo_WombStatus(Pawn pawn, HediffComp_Menstruation comp)
{
if (!comp.loaded)
comp.Initialize();
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs
index b1577ec..fa25f4c 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Patch/RJW_Patch.cs
@@ -23,7 +23,7 @@ namespace RJW_Menstruation
if (sextype != xxx.rjwSextype.Vaginal && sextype != xxx.rjwSextype.DoublePenetration) return true;
if (!mother.ShouldCycle()) return true;
- if (!InteractionCanCausePregnancy(props)) return false;
+ if (!InteractionCanCausePregnancy(props)) return true;
List pawnparts = Genital_Helper.get_PartsHediffList(father, Genital_Helper.get_genitalsBPR(father));
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj b/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj
index 0c6dfeb..26593c6 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj
@@ -90,6 +90,7 @@
+
@@ -178,4 +179,4 @@
-
\ No newline at end of file
+
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs
index 72706ef..e172853 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs
@@ -390,7 +390,7 @@ namespace RJW_Menstruation
Rect genitalAnusLabelRect = new Rect(rect.x, rect.y + fontheight + genitalRectHeight, genitalRectWidth, fontheight);
vagina = pawn.GetGenitalIcon(comp);
- anal = pawn.GetAnalIcon();
+ anal = pawn.GetAnalIcon(comp);
GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
GUI.Box(rect, "", boxstyle);
GUI.color = Utility.SafeSkinColor(pawn);
diff --git a/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs
index 26deb88..854e200 100644
--- a/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs
+++ b/1.6/source/RJW_Menstruation/RJW_Menstruation/Utility.cs
@@ -188,60 +188,9 @@ namespace RJW_Menstruation
public static void DrawBreastIcon(this Pawn pawn, Rect rect)
{
- Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
Texture2D breast, nipple, areola;
- if (hediff != null)
- {
- HediffComp_Breast comp = hediff.TryGetComp();
- string icon;
- if (comp != null) icon = comp.BreastTex ?? "Breasts/Breast_Breast";
- else
- {
- breast = ContentFinder.Get("Breasts/Breast_Breast00", false);
- nipple = ContentFinder.Get("Breasts/Breast_Breast00_Nipple00", false);
- areola = ContentFinder.Get("Breasts/Breast_Breast00_Areola00", false);
-
- GUI.color = SafeSkinColor(pawn);
- GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
- GUI.color = Color.white;
- GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
- GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
- return;
- }
-
- if (hediff.Severity < 0.20f) icon += "_Breast00";
- else if (hediff.Severity < 0.40f) icon += "_Breast01";
- else if (hediff.Severity < 0.60f) icon += "_Breast02";
- else if (hediff.Severity < 0.80f) icon += "_Breast03";
- else if (hediff.Severity < 1.00f) icon += "_Breast04";
- else icon += "_Breast05";
-
- string nippleicon, areolaicon;
- float nipplesize, areolasize;
- nipplesize = comp.NippleSize;
- areolasize = comp.AreolaSize;
-
- nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
- areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);
-
-
- breast = ContentFinder.Get(icon, false);
- areola = ContentFinder.Get(areolaicon, false);
- nipple = ContentFinder.Get(nippleicon, false);
- GUI.color = SafeSkinColor(pawn);
- GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
-
- GUI.color = comp.NippleColor;
-
- GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
-
- GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
-
-
- if (Configurations.Debug) TooltipHandler.TipRegion(rect, comp.DebugInfo());
-
- }
- else
+ int breastCount = pawn.GetBreastList().Count();
+ if (breastCount == 0)
{
breast = ContentFinder.Get("Breasts/Breast_Breast00", false);
nipple = ContentFinder.Get("Breasts/Breast_Breast00_Nipple00", false);
@@ -251,10 +200,42 @@ namespace RJW_Menstruation
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = Color.white;
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
- GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
+ GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
+ return;
}
+ Hediff hediff = pawn.GetBreastList().MaxBy(h => h.Severity);
+ HediffComp_Breast comp = hediff.TryGetComp();
+ string icon;
+ if (breastCount > 1) icon = "Breasts_Udder/Breast";
+ else icon = comp?.BreastTex ?? "Breasts/Breast";
+ if (hediff.Severity < 0.20f) icon += "_Breast00";
+ else if (hediff.Severity < 0.40f) icon += "_Breast01";
+ else if (hediff.Severity < 0.60f) icon += "_Breast02";
+ else if (hediff.Severity < 0.80f) icon += "_Breast03";
+ else if (hediff.Severity < 1.00f) icon += "_Breast04";
+ else icon += "_Breast05";
+
+ string nippleicon, areolaicon;
+ float nipplesize, areolasize;
+ nipplesize = comp?.NippleSize ?? 0.4f;
+ areolasize = comp?.AreolaSize ?? 0.4f;
+
+ nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
+ areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);
+
+ breast = ContentFinder.Get(icon, false);
+ areola = ContentFinder.Get(areolaicon, false);
+ nipple = ContentFinder.Get(nippleicon, false);
+
+ GUI.color = SafeSkinColor(pawn);
+ GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
+ GUI.color = comp?.NippleColor ?? Color.white;
+ GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
+ GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);
+
+ if (Configurations.Debug && comp != null) TooltipHandler.TipRegion(rect, comp.DebugInfo());
}
public static int GetNippleIndex(float nipplesize)
@@ -358,7 +339,7 @@ namespace RJW_Menstruation
}
public static string GetBreastLabel(this Pawn pawn)
{
- Hediff hediff = pawn.health.hediffSet.hediffs.FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
+ Hediff hediff = pawn.health.hediffSet.hediffs.Where(h => VariousDefOf.AllBreasts.Contains(h.def)).MaxByWithFallback(h => h.Severity);
if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
else return "";
}
diff --git a/About/Manifest.xml b/About/Manifest.xml
index 6b24453..bef173d 100644
--- a/About/Manifest.xml
+++ b/About/Manifest.xml
@@ -1,7 +1,7 @@
RJW Menstruation
- 1.6.2.0
+ 1.6.2.4
diff --git a/changelogs.txt b/changelogs.txt
index e776155..7316879 100644
--- a/changelogs.txt
+++ b/changelogs.txt
@@ -1,3 +1,17 @@
+Version 1.6.2.4
+ - Fix error on startup and missing womb status in RJW tab with RJW 6.1.4.
+
+Version 1.6.2.3
+ - Fix multiple breasts not appearing in the menstruation UI.
+ - Status of wombs now appears in RJW main tab, contributed by GhostClinic.
+
+Version 1.6.2.2
+ - Pawns with multiple breasts will now display an udder in the menstruation UI.
+ - Updated Traditional Chinese translation by Hydrogen.
+
+Version 1.6.2.1
+ - Modifiers in MenstruationModExtensions in ThingDefs and HediffDefs now function.
+
Version 1.6.2.0
- Added support for adding the MenstruationModExtension to ThingDefs and HediffDefs.
- This can be used to disable the menstrual cycle on pawns of particular types and with particular hediffs.