mirror of
https://gitgud.io/lutepickle/rjw_menstruation.git
synced 2026-06-18 19:36:20 +00:00
Compare commits
37 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5df8b1dce | ||
|
|
d8b98ca05e | ||
|
|
a8caad85c6 | ||
|
|
ef909091f8 | ||
|
|
8341d3f213 | ||
|
|
1600f0ea58 | ||
|
|
18d316c26b | ||
|
|
82216c5a7d | ||
|
|
c38464c806 | ||
|
|
714eba8e9c | ||
|
|
df134584d7 | ||
|
|
8b6d1f70c4 | ||
|
|
0408e792e6 | ||
|
|
7998d18f3d | ||
|
|
9c0cc92f7d | ||
|
|
2bb35f0241 | ||
|
|
8d4f4ac3f1 | ||
|
|
c5d1a901c9 | ||
|
|
0f5994dce4 | ||
|
|
325ccaa400 | ||
|
|
7041a25742 | ||
|
|
e0ceb0020d | ||
|
|
83b64f5d8d | ||
|
|
0a41e8a048 | ||
|
|
0b2f421b6e | ||
|
|
778a59a9c1 | ||
|
|
0515cc84f4 | ||
|
|
717fb3cfc9 | ||
|
|
2aaf496b15 | ||
|
|
9cffa1e822 | ||
|
|
8c76091ffc | ||
|
|
57811be7ae | ||
|
|
3e3f321270 | ||
|
|
325f8c9277 | ||
|
|
5d3b25b5de | ||
|
|
8f8c90d1ce | ||
|
|
299c6c6e17 |
45 changed files with 395 additions and 176 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -343,3 +343,6 @@ healthchecksdb
|
|||
*.psd
|
||||
*.dds
|
||||
*.pdn
|
||||
|
||||
Directory.Build.props
|
||||
Directory.Build.targets
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -25,7 +25,7 @@
|
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\assemblies\</OutputPath>
|
||||
<OutputPath>..\..\Assemblies\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
Binary file not shown.
11
1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml
Normal file
11
1.6/Defs/RJWTab/PawnColumnDefs_Menstruation.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<PawnColumnDef>
|
||||
<defName>RJWMenstruation_Womb</defName>
|
||||
<headerIcon>Womb/Womb</headerIcon>
|
||||
<headerTip>Open womb status. Click the header to sort by womb presence and cycle stage.</headerTip>
|
||||
<workerClass>RJW_Menstruation.MainTab.PawnColumnWorker_WombStatus</workerClass>
|
||||
<sortable>true</sortable>
|
||||
<width>34</width>
|
||||
</PawnColumnDef>
|
||||
</Defs>
|
||||
Binary file not shown.
|
|
@ -25,7 +25,7 @@
|
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\assemblies\</OutputPath>
|
||||
<OutputPath>..\..\Assemblies\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
|
@ -166,4 +166,7 @@
|
|||
<Description_Absorbed>已吸收</Description_Absorbed>
|
||||
<!--Generated at: 2025-01-21-->
|
||||
<Stage_Anestrus_Periodic_Desc>子宮處於月經週期之外。經過足夠的時間後,月經週期會恢復。</Stage_Anestrus_Periodic_Desc>
|
||||
<!--Generated at: 2026-02-15-->
|
||||
<Option_ShowInfertileIcon_Desc>對已經不育的子宮顯示子宮圖示</Option_ShowInfertileIcon_Desc>
|
||||
<Option_ShowInfertileIcon_Label>仍然展示不育的子宮狀態</Option_ShowInfertileIcon_Label>
|
||||
</LanguageData>
|
||||
|
|
|
|||
19
1.6/Patches/RJW_PawnTableDefs.xml
Normal file
19
1.6/Patches/RJW_PawnTableDefs.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Patch>
|
||||
<Operation Class="PatchOperationSequence">
|
||||
<operations>
|
||||
<li Class="PatchOperationInsert">
|
||||
<xpath>/Defs/PawnTableDef[defName="RJW_PawnTable_Colonists"]/columns/li[text()="Pregnant"]</xpath>
|
||||
<value>
|
||||
<li>RJWMenstruation_Womb</li>
|
||||
</value>
|
||||
</li>
|
||||
<li Class="PatchOperationInsert">
|
||||
<xpath>/Defs/PawnTableDef[defName="RJW_PawnTable_Property"]/columns/li[text()="Pregnant"]</xpath>
|
||||
<value>
|
||||
<li>RJWMenstruation_Womb</li>
|
||||
</value>
|
||||
</li>
|
||||
</operations>
|
||||
</Operation>
|
||||
</Patch>
|
||||
BIN
1.6/Quirks/Assemblies/Quirks.dll
Normal file
BIN
1.6/Quirks/Assemblies/Quirks.dll
Normal file
Binary file not shown.
|
|
@ -25,7 +25,7 @@
|
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\assemblies\</OutputPath>
|
||||
<OutputPath>..\..\Assemblies\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
|
@ -59,7 +59,6 @@
|
|||
<ItemGroup>
|
||||
<Compile Include="Harmony.cs" />
|
||||
<Compile Include="QuirksCompatibility.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="RedWings.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -72,5 +71,8 @@
|
|||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
using HarmonyLib;
|
||||
using RJW_Menstruation;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
using RJW_Menstruation;
|
||||
using RJWQuirks;
|
||||
using RJWQuirks.Condition;
|
||||
using System.Linq;
|
||||
|
|
@ -8,6 +9,13 @@ using Verse;
|
|||
|
||||
namespace RJW_Menstruation_Quirks
|
||||
{
|
||||
[DefOf]
|
||||
public static class QuirkDefs
|
||||
{
|
||||
public static readonly QuirkDef Teratophile;
|
||||
public static readonly QuirkDef RedWings;
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(QuirkUtility), nameof(QuirkUtility.HasQuirk))]
|
||||
public static class HasQuirk_Patch
|
||||
{
|
||||
|
|
@ -25,10 +33,10 @@ namespace RJW_Menstruation_Quirks
|
|||
__result = pawn.HasQuirk(RqDefOf.Quirk.Messy);
|
||||
return;
|
||||
case QuirkUtility.Quirks.Teratophile:
|
||||
__result = pawn.HasQuirk(RqDefOf.Quirk.Teratophile);
|
||||
__result = pawn.HasQuirk(QuirkDefs.Teratophile);
|
||||
return;
|
||||
case QuirkUtility.Quirks.RedWingsFetish:
|
||||
__result = pawn.HasQuirk(RedWingsCondition.RedWings);
|
||||
__result = pawn.HasQuirk(QuirkDefs.RedWings);
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
using rjw;
|
||||
using rjw.Modules.Interactions;
|
||||
using RJW_Menstruation;
|
||||
using RJWQuirks;
|
||||
using RJWQuirks.Condition;
|
||||
using RJWQuirks.Requirement;
|
||||
using System.Collections.Generic;
|
||||
|
|
@ -14,18 +13,12 @@ namespace RJW_Menstruation_Quirks
|
|||
{
|
||||
public override bool Satisfied(Pawn pawn)
|
||||
{
|
||||
List<Hediff> genitalsList = pawn.GetGenitalsList();
|
||||
return
|
||||
Genital_Helper.has_penis_fertile(pawn, genitalsList) ||
|
||||
Genital_Helper.has_penis_infertile(pawn, genitalsList) ||
|
||||
Genital_Helper.has_ovipositorF(pawn, genitalsList);
|
||||
return pawn.GetGenitalsList().Any(genital => (genital.def as HediffDef_SexPart)?.genitalFamily == GenitalFamily.Penis);
|
||||
}
|
||||
}
|
||||
|
||||
public class RedWingsCondition : ConditionBase
|
||||
{
|
||||
public static QuirkDef RedWings = DefDatabase<QuirkDef>.GetNamed("RedWings");
|
||||
|
||||
public override bool SatisfiedByPartner(Pawn pawn, Pawn partner)
|
||||
{
|
||||
if (!partner.ShouldCycle()) return false;
|
||||
|
|
@ -36,9 +29,7 @@ namespace RJW_Menstruation_Quirks
|
|||
{
|
||||
if (!sexProps.hasPartner()) return false;
|
||||
List<ILewdablePart> partnerParts = sexProps.IsInitiator() ? sexProps.resolved.RecipientParts : sexProps.resolved.InitiatorParts;
|
||||
if (partnerParts.Any(part => part.Family == LewdablePartFamily.Vagina))
|
||||
return SatisfiedByPartner(sexProps.pawn, sexProps.partner);
|
||||
else return false;
|
||||
return partnerParts.Any(part => part.Family == LewdablePartFamily.Vagina) && SatisfiedByPartner(sexProps.pawn, sexProps.partner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,33 +0,0 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
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("Quirks")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Quirks")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2025")]
|
||||
[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("d9363a87-bbc4-456d-9880-07414944c02a")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
Binary file not shown.
|
|
@ -25,7 +25,7 @@
|
|||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\assemblies\</OutputPath>
|
||||
<OutputPath>..\..\Assemblies\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Lib.Harmony" version="2.3.6" targetFramework="net48" />
|
||||
</packages>
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -188,7 +188,13 @@ namespace RJW_Menstruation
|
|||
}
|
||||
else return pregnancy;
|
||||
}
|
||||
set => pregnancy = value;
|
||||
|
||||
set
|
||||
{
|
||||
pregnancy = value;
|
||||
if (pregnancy != null && curStage != Stage.Pregnant)
|
||||
GoNextStage(Stage.Pregnant);
|
||||
}
|
||||
}
|
||||
|
||||
public int OvaryPowerThreshold
|
||||
|
|
@ -261,7 +267,7 @@ namespace RJW_Menstruation
|
|||
}
|
||||
public float TotalCumPercent
|
||||
{
|
||||
get => cums?.Sum(cum => cum.Volume) / Props.maxCumCapacity ?? 0;
|
||||
get => cums?.Sum(cum => cum.Volume) / (Props.maxCumCapacity * Pawn.BodySize) ?? 0;
|
||||
}
|
||||
public float CumCapacity
|
||||
{
|
||||
|
|
@ -307,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
|
||||
{
|
||||
|
|
@ -666,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;
|
||||
|
|
@ -674,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<MenstruationModExtension>()).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<MenstruationModExtension>();
|
||||
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<MenstruationModExtension>()).Where(ext => ext != null))
|
||||
ProcessExtension(geneExtension);
|
||||
|
||||
foreach (MenstruationModExtension hediffExtension in Pawn.health.hediffSet.hediffs.Select(hediff => hediff.def.GetModExtension<MenstruationModExtension>()).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;
|
||||
|
|
@ -855,6 +882,11 @@ namespace RJW_Menstruation
|
|||
return cums?.Find(cum => !cum.notcum && cum.pawn == pawn);
|
||||
}
|
||||
|
||||
public IEnumerable<Cum> GetFluids()
|
||||
{
|
||||
return cums ?? Enumerable.Empty<Cum>();
|
||||
}
|
||||
|
||||
public IEnumerable<Cum> GetFluids(Pawn pawn)
|
||||
{
|
||||
return cums?.Where(cum => cum.pawn == pawn) ?? Enumerable.Empty<Cum>();
|
||||
|
|
@ -1223,7 +1255,7 @@ namespace RJW_Menstruation
|
|||
|
||||
protected virtual void PreInitialize()
|
||||
{
|
||||
Notify_UpdatedGenes();
|
||||
DirtyStats();
|
||||
}
|
||||
|
||||
protected virtual void PostInitialize()
|
||||
|
|
@ -1449,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)
|
||||
|
|
@ -1467,7 +1499,7 @@ namespace RJW_Menstruation
|
|||
|
||||
case Configurations.PregnancyType.MultiplePregnancy:
|
||||
if (Configurations.Debug) Log.Message($"Creating new menstruation pregnancy");
|
||||
pregnancy = Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(Pawn, egg.fertilizer);
|
||||
pregnancy = Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(Pawn, egg.fertilizer); // Add fertility comp of mother
|
||||
pregnant = true;
|
||||
deadeggs.Add(egg);
|
||||
break;
|
||||
|
|
@ -1824,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;
|
||||
|
||||
|
|
@ -1831,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);
|
||||
|
|
@ -1845,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);
|
||||
|
|
@ -1866,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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,10 +78,10 @@ namespace RJW_Menstruation
|
|||
if (!PawnCapacityUtility.BodyCanEverDoCapacity(body, PawnCapacityDefOf.Breathing)) return 0.0f;
|
||||
HediffSet hediffs = target.health.hediffSet;
|
||||
float breathingEffect = PawnCapacityUtility.CalculateCapacityLevel(hediffs, PawnCapacityDefOf.Breathing);
|
||||
float noseEffect = 1.0f;
|
||||
List<BodyPartRecord> noses = body.GetPartsWithDef(VariousDefOf.Nose);
|
||||
if (noses.Any()) // if the body doesn't have a nose but still breathes, then let it be affected
|
||||
noseEffect = noses.Average(nose => PawnCapacityUtility.CalculatePartEfficiency(hediffs, nose));
|
||||
// if the body doesn't have a nose but still breathes, then let it be affected
|
||||
float noseEffect = body.GetPartsWithDef(VariousDefOf.Nose).
|
||||
Select(nose => PawnCapacityUtility.CalculatePartEfficiency(hediffs, nose)).
|
||||
DefaultIfEmpty(1.0f).Average();
|
||||
|
||||
return penisEffect * breathingEffect * noseEffect;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace RJW_Menstruation
|
|||
public static HediffComp_Menstruation GetRandomMenstruationComp(this Pawn pawn, bool preferDangerDay = false)
|
||||
{
|
||||
List<HediffComp_Menstruation> comps = pawn.GetMenstruationComps().ToList();
|
||||
return comps.Where(comp => !preferDangerDay || comp.IsDangerDay).RandomElementWithFallback(comps.RandomElementWithFallback());
|
||||
return comps.Where(comp => !preferDangerDay || comp.IsDangerDay).RandomElementWithFallback() ?? comps.RandomElementWithFallback();
|
||||
}
|
||||
|
||||
public static HediffComp_Menstruation GetMenstruationCompFromVagina(this Hediff vagina)
|
||||
|
|
@ -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<HediffComp_PregeneratedBabies>();
|
||||
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<PawnDNAModExtension>()?.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<HediffComp_PregeneratedBabies>();
|
||||
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<HediffComp_PregeneratedBabies>()?.BabyCount ?? 1;
|
||||
|
||||
string fetustex = babydef.GetModExtension<PawnDNAModExtension>()?.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<Texture2D>.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<Texture2D>.Get("Genitals/Anal00", true);
|
||||
if (!pawn.GetAnusList().Any()) return ContentFinder<Texture2D>.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;
|
||||
|
|
@ -366,11 +358,12 @@ namespace RJW_Menstruation
|
|||
public static bool ShouldCycle(this Pawn pawn)
|
||||
{
|
||||
if (!Configurations.EnableAnimalCycle && pawn.IsAnimal()) return false;
|
||||
if (pawn.GetComp<CompEggLayer>() != null) return false;
|
||||
if (VariousDefOf.CycleDisableThings.Contains(pawn.def)) return false;
|
||||
if (pawn.health?.hediffSet?.hediffs.Select(hediff => hediff.def).Intersect(VariousDefOf.CycleDisableHediffs).Any() ?? false) return false;
|
||||
if (pawn.RaceHasOviPregnancy()) return false;
|
||||
|
||||
if (ModsConfig.BiotechActive && pawn.genes != null &&
|
||||
pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def).Intersect(VariousDefOf.EggLayerGenes).Any()) return false;
|
||||
pawn.genes.GenesListForReading.Where(gene => gene.Active).Select(gene => gene.def).Intersect(VariousDefOf.CycleDisableGenes).Any()) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@ namespace RJW_Menstruation
|
|||
{
|
||||
protected Dictionary<Pawn, Pawn> enzygoticSiblings = new Dictionary<Pawn, Pawn>(); // Each pawn and who they split from
|
||||
|
||||
// used by Eltoro's addons
|
||||
public override void PostMake()
|
||||
{
|
||||
base.PostMake();
|
||||
}
|
||||
|
||||
public override void DiscoverPregnancy()
|
||||
{
|
||||
PregnancyThought();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<MenstruationModExtension>()) return;
|
||||
foreach (HediffComp_Menstruation comp in ___pawn.GetMenstruationComps())
|
||||
comp.Notify_HediffsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(Pawn_GeneTracker), "Notify_GenesChanged")]
|
||||
public class Notify_GenesChanged_Patch
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<Hediff> pawnparts = Genital_Helper.get_PartsHediffList(father, Genital_Helper.get_genitalsBPR(father));
|
||||
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@
|
|||
<Compile Include="HediffComps\HediffComp_Breast.cs" />
|
||||
<Compile Include="Hediff_MultiplePregnancy.cs" />
|
||||
<Compile Include="JobDrivers.cs" />
|
||||
<Compile Include="MainTab\PawnColumnWorker_WombStatus.cs" />
|
||||
<Compile Include="UI\Gizmo_Womb.cs" />
|
||||
<Compile Include="Patch\Harmony.cs" />
|
||||
<Compile Include="HediffComps\HediffComp_Menstruation.cs" />
|
||||
|
|
@ -178,4 +179,4 @@
|
|||
</Content>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<HediffComp_Breast>();
|
||||
string icon;
|
||||
if (comp != null) icon = comp.BreastTex ?? "Breasts/Breast_Breast";
|
||||
else
|
||||
{
|
||||
breast = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00", false);
|
||||
nipple = ContentFinder<Texture2D>.Get("Breasts/Breast_Breast00_Nipple00", false);
|
||||
areola = ContentFinder<Texture2D>.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<Texture2D>.Get(icon, false);
|
||||
areola = ContentFinder<Texture2D>.Get(areolaicon, false);
|
||||
nipple = ContentFinder<Texture2D>.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<Texture2D>.Get("Breasts/Breast_Breast00", false);
|
||||
nipple = ContentFinder<Texture2D>.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<HediffComp_Breast>();
|
||||
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<Texture2D>.Get(icon, false);
|
||||
areola = ContentFinder<Texture2D>.Get(areolaicon, false);
|
||||
nipple = ContentFinder<Texture2D>.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 "";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,7 +53,9 @@ namespace RJW_Menstruation
|
|||
private static HashSet<HediffDef> allvaginas = null;
|
||||
private static HashSet<HediffDef> allanuses = null;
|
||||
private static HashSet<HediffDef> allbreasts = null;
|
||||
private static HashSet<GeneDef> egglayergenes = null;
|
||||
private static HashSet<ThingDef> cycledisablethings = null;
|
||||
private static HashSet<HediffDef> cycledisablehediffs = null;
|
||||
private static HashSet<GeneDef> cycledisablegenes = null;
|
||||
|
||||
public static List<ThingDef> AllRaces
|
||||
{
|
||||
|
|
@ -106,14 +108,40 @@ namespace RJW_Menstruation
|
|||
return allbreasts;
|
||||
}
|
||||
}
|
||||
public static HashSet<GeneDef> EggLayerGenes
|
||||
|
||||
private static HashSet<T> CycleDisableType<T>() where T: Def
|
||||
{
|
||||
return DefDatabase<T>.AllDefsListForReading.Where(def => def.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();
|
||||
}
|
||||
public static HashSet<ThingDef> CycleDisableThings
|
||||
{
|
||||
get
|
||||
{
|
||||
if (egglayergenes != null) return egglayergenes;
|
||||
egglayergenes = DefDatabase<GeneDef>.AllDefsListForReading.Where(geneDef => geneDef.GetModExtension<MenstruationModExtension>()?.disableCycle ?? false).ToHashSet();
|
||||
if (cycledisablethings != null) return cycledisablethings;
|
||||
cycledisablethings = CycleDisableType<ThingDef>();
|
||||
cycledisablethings.UnionWith(DefDatabase<ThingDef>.AllDefsListForReading.Where(thingdef => thingdef.HasComp<CompEggLayer>()));
|
||||
|
||||
return egglayergenes;
|
||||
return cycledisablethings;
|
||||
}
|
||||
}
|
||||
public static HashSet<HediffDef> CycleDisableHediffs
|
||||
{
|
||||
get
|
||||
{
|
||||
if (cycledisablehediffs != null) return cycledisablehediffs;
|
||||
cycledisablehediffs = CycleDisableType<HediffDef>();
|
||||
|
||||
return cycledisablehediffs;
|
||||
}
|
||||
}
|
||||
public static HashSet<GeneDef> CycleDisableGenes
|
||||
{
|
||||
get
|
||||
{
|
||||
if (cycledisablegenes != null) return cycledisablegenes;
|
||||
cycledisablegenes = CycleDisableType<GeneDef>();
|
||||
|
||||
return cycledisablegenes;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
<li>rim.job.world</li>
|
||||
<li>Abraxas.RJW.RaceSupport</li>
|
||||
<li>rjw.milk.humanoid</li>
|
||||
<li>rjw.quirks</li>
|
||||
</loadAfter>
|
||||
<incompatibleWithByVersion>
|
||||
<v1.4>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<Manifest>
|
||||
<identifier>RJW Menstruation</identifier>
|
||||
<version>1.6.1.0</version>
|
||||
<version>1.6.2.4</version>
|
||||
<dependencies>
|
||||
</dependencies>
|
||||
<incompatibleWith />
|
||||
|
|
|
|||
|
|
@ -1,3 +1,23 @@
|
|||
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.
|
||||
- The other modifiers in MenstruationModExtension have no effect when used in a ThingDef or HediffDef for now.
|
||||
- Improved support for RJW Quirks.
|
||||
|
||||
Version 1.6.1.0
|
||||
- Compatibility update for RJW 6.0.1.
|
||||
- Requires RJW 6.0.1.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue