mirror of
https://gitgud.io/lutepickle/rjw_menstruation.git
synced 2024-08-14 22:46:52 +00:00
1.0.4.4
This commit is contained in:
parent
4b4a54c11b
commit
81e845b2b6
21 changed files with 377 additions and 237 deletions
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<Manifest>
|
<Manifest>
|
||||||
<identifier>RJW Menstruation</identifier>
|
<identifier>RJW Menstruation</identifier>
|
||||||
<version>1.0.4.3</version>
|
<version>1.0.4.4</version>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<incompatibleWith />
|
<incompatibleWith />
|
||||||
|
|
Binary file not shown.
|
@ -4,7 +4,7 @@
|
||||||
<ThingDef ParentName="MakeableDrugPillBase">
|
<ThingDef ParentName="MakeableDrugPillBase">
|
||||||
<defName>OvaryRegenerationPill</defName>
|
<defName>OvaryRegenerationPill</defName>
|
||||||
<label>Ovary regeneration pill</label>
|
<label>Ovary regeneration pill</label>
|
||||||
<description>Recovers ovary's health. Less effective on unhealthy ovary. Does not relieve climacteric symptoms.</description>
|
<description>Recovers ovary's health. Less effective on unhealthy ovary. Does not recover menopause.</description>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Things/Item/ORPill</texPath>
|
<texPath>Things/Item/ORPill</texPath>
|
||||||
<graphicClass>Graphic_StackCount</graphicClass>
|
<graphicClass>Graphic_StackCount</graphicClass>
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<Option5_Label>cum decay ratio per hour</Option5_Label>
|
<Option5_Label>cum decay ratio per hour</Option5_Label>
|
||||||
<Option5_Desc>cum will decrease about this ratio this value affects on the fertility chacne indirectly</Option5_Desc>
|
<Option5_Desc>cum will decrease about this ratio this value affects on the fertility chacne indirectly</Option5_Desc>
|
||||||
<Option6_Label>cum fertility decay ratio per hour</Option6_Label>
|
<Option6_Label>cum fertility decay ratio per hour</Option6_Label>
|
||||||
<Option6_Desc>cum will lose fertility about this ratio this value affects on the fertility chance indirectly</Option6_Desc>
|
<Option6_Desc>cum will lose fertility about this ratio this value affects on the fertility chance indirectly estimated sperm lifespan: cum lose most of fertility at this time.</Option6_Desc>
|
||||||
<Option7_Label>cycle accelerate</Option7_Label>
|
<Option7_Label>cycle accelerate</Option7_Label>
|
||||||
<Option7_Desc>accelerate menstrution cycle</Option7_Desc>
|
<Option7_Desc>accelerate menstrution cycle</Option7_Desc>
|
||||||
<Option8_Label>Debug</Option8_Label>
|
<Option8_Label>Debug</Option8_Label>
|
||||||
|
@ -92,7 +92,8 @@
|
||||||
<Option28_Tooltip>Open custom hybrid editor. This will overrides hybrid definitions of XML files.</Option28_Tooltip>
|
<Option28_Tooltip>Open custom hybrid editor. This will overrides hybrid definitions of XML files.</Option28_Tooltip>
|
||||||
<Option29_Label>Allow shrink icon</Option29_Label>
|
<Option29_Label>Allow shrink icon</Option29_Label>
|
||||||
<Option29_Desc>Let icon become smaller If needed.</Option29_Desc>
|
<Option29_Desc>Let icon become smaller If needed.</Option29_Desc>
|
||||||
|
<EstimatedCumLifespan>estimated sperm lifespan</EstimatedCumLifespan>
|
||||||
|
|
||||||
<FloatMenu_CleanSelf>Vaginal washing</FloatMenu_CleanSelf>
|
<FloatMenu_CleanSelf>Vaginal washing</FloatMenu_CleanSelf>
|
||||||
|
|
||||||
<CustomHybrid_List_Title>Custom Hybrid Editor</CustomHybrid_List_Title>
|
<CustomHybrid_List_Title>Custom Hybrid Editor</CustomHybrid_List_Title>
|
||||||
|
|
15
Languages/Korean/DefInjected/RecipeDef/BreastSurgeries.xml
Normal file
15
Languages/Korean/DefInjected/RecipeDef/BreastSurgeries.xml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LanguageData>
|
||||||
|
<Surgery_ExpandAreola.label>유륜확대 수술</Surgery_ExpandAreola.label>
|
||||||
|
<Surgery_ExpandAreola.description>유륜을 크게만듭니다.</Surgery_ExpandAreola.description>
|
||||||
|
<Surgery_ExpandAreola.jobString>유륜확대 수술중</Surgery_ExpandAreola.jobString>
|
||||||
|
<Surgery_ContractAreola.label>유륜축소 수술</Surgery_ContractAreola.label>
|
||||||
|
<Surgery_ContractAreola.description>유륜을 작게만듭니다.</Surgery_ContractAreola.description>
|
||||||
|
<Surgery_ContractAreola.jobString>유륜축소 수술중</Surgery_ContractAreola.jobString>
|
||||||
|
<Surgery_ExpandNipple.label>유두확대 수술</Surgery_ExpandNipple.label>
|
||||||
|
<Surgery_ExpandNipple.description>유두를 크게만듭니다.</Surgery_ExpandNipple.description>
|
||||||
|
<Surgery_ExpandNipple.jobString>유두확대 수술중</Surgery_ExpandNipple.jobString>
|
||||||
|
<Surgery_ContractNipple.label>유두축소 수술</Surgery_ContractNipple.label>
|
||||||
|
<Surgery_ContractNipple.description>유두를 작게만듭니다.</Surgery_ContractNipple.description>
|
||||||
|
<Surgery_ContractNipple.jobString>유두축소 수술중</Surgery_ContractNipple.jobString>
|
||||||
|
</LanguageData>
|
|
@ -9,7 +9,7 @@
|
||||||
<Absorber_Pad_Dirty.label>젖은 생리대</Absorber_Pad_Dirty.label>
|
<Absorber_Pad_Dirty.label>젖은 생리대</Absorber_Pad_Dirty.label>
|
||||||
<Absorber_Pad_Dirty.description>사용된 축축한 생리대입니다.</Absorber_Pad_Dirty.description>
|
<Absorber_Pad_Dirty.description>사용된 축축한 생리대입니다.</Absorber_Pad_Dirty.description>
|
||||||
<OvaryRegenerationPill.label>난소 재생약</OvaryRegenerationPill.label>
|
<OvaryRegenerationPill.label>난소 재생약</OvaryRegenerationPill.label>
|
||||||
<OvaryRegenerationPill.description>난소를 재생시켜 배출할수있는 난자의 양을 증가시킵니다. 난자 소모량이 클수록 효과가 줄어듭니다. 갱년기 증상을 완화시키지 않습니다.</OvaryRegenerationPill.description>
|
<OvaryRegenerationPill.description>난소를 재생시켜 배출할수있는 난자의 양을 증가시킵니다. 난자 소모량이 클수록 효과가 줄어듭니다. 폐경을 회복시키지 않습니다.</OvaryRegenerationPill.description>
|
||||||
<SuperovulationInducingAgent.label>과배란 유도제</SuperovulationInducingAgent.label>
|
<SuperovulationInducingAgent.label>과배란 유도제</SuperovulationInducingAgent.label>
|
||||||
<SuperovulationInducingAgent.description>과배란을 유도하는 약물입니다. 조기폐경을 초래할수도 있습니다.</SuperovulationInducingAgent.description>
|
<SuperovulationInducingAgent.description>과배란을 유도하는 약물입니다. 조기폐경을 초래할수도 있습니다.</SuperovulationInducingAgent.description>
|
||||||
<PainReliever.label>진통제</PainReliever.label>
|
<PainReliever.label>진통제</PainReliever.label>
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<Option5_Label>시간당 정액배출비율</Option5_Label>
|
<Option5_Label>시간당 정액배출비율</Option5_Label>
|
||||||
<Option5_Desc>이 비율만큼 매 시간마다 정액이 배출됩니다.</Option5_Desc>
|
<Option5_Desc>이 비율만큼 매 시간마다 정액이 배출됩니다.</Option5_Desc>
|
||||||
<Option6_Label>시간당 정자 사망비율</Option6_Label>
|
<Option6_Label>시간당 정자 사망비율</Option6_Label>
|
||||||
<Option6_Desc>이 비율만큼 매 시간마다 정자가 사망해 정액이 생식능력을 잃습니다.</Option6_Desc>
|
<Option6_Desc>이 비율만큼 매 시간마다 정자가 사망해 정액이 생식능력을 잃습니다. 정자 예상수명: 정액이 대부분의 생식능력을 잃는 시간입니다.</Option6_Desc>
|
||||||
<Option7_Label>주기 가속</Option7_Label>
|
<Option7_Label>주기 가속</Option7_Label>
|
||||||
<Option7_Desc>월경주기를 더 빠르게합니다.</Option7_Desc>
|
<Option7_Desc>월경주기를 더 빠르게합니다.</Option7_Desc>
|
||||||
<Option8_Label>Debug</Option8_Label>
|
<Option8_Label>Debug</Option8_Label>
|
||||||
|
@ -92,6 +92,7 @@
|
||||||
<Option28_Tooltip>사용자 지정 잡종 편집기를 엽니다. 이 설정은 XML파일의 잡종 정의를 대체합니다.</Option28_Tooltip>
|
<Option28_Tooltip>사용자 지정 잡종 편집기를 엽니다. 이 설정은 XML파일의 잡종 정의를 대체합니다.</Option28_Tooltip>
|
||||||
<Option29_Label>아이콘 축소 허용</Option29_Label>
|
<Option29_Label>아이콘 축소 허용</Option29_Label>
|
||||||
<Option29_Desc>아이콘 축소를 허용합니다.</Option29_Desc>
|
<Option29_Desc>아이콘 축소를 허용합니다.</Option29_Desc>
|
||||||
|
<EstimatedCumLifespan>정자 예상수명</EstimatedCumLifespan>
|
||||||
|
|
||||||
<FloatMenu_CleanSelf>질세척</FloatMenu_CleanSelf>
|
<FloatMenu_CleanSelf>질세척</FloatMenu_CleanSelf>
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -1,3 +1,10 @@
|
||||||
|
Version 1.0.4.4
|
||||||
|
- ovary regeneration pill can restore climacteric (not menopause)
|
||||||
|
- menstrual blood uses race's blood def
|
||||||
|
- added estimated sperm lifespan in modsetting
|
||||||
|
- fixed errors on pregnancy
|
||||||
|
- changed cum calculation method
|
||||||
|
|
||||||
Version 1.0.4.3
|
Version 1.0.4.3
|
||||||
- fixed errors on pregnancy
|
- fixed errors on pregnancy
|
||||||
- added surgeries for nipple/areola
|
- added surgeries for nipple/areola
|
||||||
|
|
|
@ -177,6 +177,7 @@ namespace RJW_Menstruation
|
||||||
base.ExposeData();
|
base.ExposeData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +244,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
wombsection.CheckboxLabeled(Translations.Option18_Label, ref Configurations.DrawEggOverlay, Translations.Option18_Desc);
|
wombsection.CheckboxLabeled(Translations.Option18_Label, ref Configurations.DrawEggOverlay, Translations.Option18_Desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
wombsection.CheckboxLabeled(Translations.Option10_Label, ref Configurations.DrawVaginaStatus, Translations.Option10_Desc);
|
wombsection.CheckboxLabeled(Translations.Option10_Label, ref Configurations.DrawVaginaStatus, Translations.Option10_Desc);
|
||||||
wombsection.CheckboxLabeled(Translations.Option29_Label, ref Configurations.AllowShrinkIcon, Translations.Option29_Desc);
|
wombsection.CheckboxLabeled(Translations.Option29_Label, ref Configurations.AllowShrinkIcon, Translations.Option29_Desc);
|
||||||
if (wombsection.ButtonText(Translations.Option11_Label + ": " + Configurations.LevelString(Configurations.InfoDetail)))
|
if (wombsection.ButtonText(Translations.Option11_Label + ": " + Configurations.LevelString(Configurations.InfoDetail)))
|
||||||
|
@ -333,7 +335,17 @@ namespace RJW_Menstruation
|
||||||
Configurations.CumDecayRatioAdjust = (int)listmain.Slider(Configurations.CumDecayRatioAdjust, 0, 1000);
|
Configurations.CumDecayRatioAdjust = (int)listmain.Slider(Configurations.CumDecayRatioAdjust, 0, 1000);
|
||||||
Configurations.CumDecayRatio = (float)Configurations.CumDecayRatioAdjust / 1000;
|
Configurations.CumDecayRatio = (float)Configurations.CumDecayRatioAdjust / 1000;
|
||||||
|
|
||||||
listmain.Label(Translations.Option6_Label + " " + Configurations.CumFertilityDecayRatio * 100 + "%", -1, Translations.Option6_Desc);
|
int semenlifespan = (int)(-5 / ((float)Math.Log10((1 - Configurations.CumFertilityDecayRatio)*10) - 1)) + 1;
|
||||||
|
string estimatedlifespan;
|
||||||
|
if (semenlifespan < 0)
|
||||||
|
{
|
||||||
|
estimatedlifespan = String.Format(": Infinite", semenlifespan);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
estimatedlifespan = String.Format(": {0:0}h", semenlifespan);
|
||||||
|
}
|
||||||
|
listmain.LabelDouble(Translations.Option6_Label + " " + Configurations.CumFertilityDecayRatio * 100 + "%", Translations.EstimatedCumLifespan + estimatedlifespan, Translations.Option6_Desc);
|
||||||
Configurations.CumFertilityDecayRatioAdjust = (int)listmain.Slider(Configurations.CumFertilityDecayRatioAdjust, 0, 1000);
|
Configurations.CumFertilityDecayRatioAdjust = (int)listmain.Slider(Configurations.CumFertilityDecayRatioAdjust, 0, 1000);
|
||||||
Configurations.CumFertilityDecayRatio = (float)Configurations.CumFertilityDecayRatioAdjust / 1000;
|
Configurations.CumFertilityDecayRatio = (float)Configurations.CumFertilityDecayRatioAdjust / 1000;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
|
@ -147,7 +148,7 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void ExposeData()
|
public virtual void ExposeData()
|
||||||
{
|
{
|
||||||
Scribe_References.Look(ref pawn, "pawn", true);
|
Scribe_References.Look(ref pawn, "pawn", true);
|
||||||
Scribe_Values.Look(ref volume, "volume", volume, true);
|
Scribe_Values.Look(ref volume, "volume", volume, true);
|
||||||
|
@ -158,6 +159,7 @@ namespace RJW_Menstruation
|
||||||
Scribe_Values.Look(ref notcumLabel, "notcumLabel", notcumLabel, true);
|
Scribe_Values.Look(ref notcumLabel, "notcumLabel", notcumLabel, true);
|
||||||
Scribe_Values.Look(ref useCustomColor, "useCustomColor", useCustomColor, true);
|
Scribe_Values.Look(ref useCustomColor, "useCustomColor", useCustomColor, true);
|
||||||
Scribe_Values.Look(ref customColor, "customColor", customColor, true);
|
Scribe_Values.Look(ref customColor, "customColor", customColor, true);
|
||||||
|
Scribe_Defs.Look(ref filthDef, "filthDef");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,8 +224,51 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CumMixture : Cum, IDisposable
|
||||||
|
{
|
||||||
|
protected List<string> cums;
|
||||||
|
|
||||||
|
|
||||||
|
public CumMixture()
|
||||||
|
{
|
||||||
|
notcum = true;
|
||||||
|
cums = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CumMixture(Pawn pawn, float volume, List<string> cums, Color color, ThingDef mixtureDef)
|
||||||
|
{
|
||||||
|
this.pawn = pawn;
|
||||||
|
this.volume = volume;
|
||||||
|
this.cums = cums;
|
||||||
|
this.customColor = color;
|
||||||
|
this.useCustomColor = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
cums.Clear();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ExposeData()
|
||||||
|
{
|
||||||
|
base.ExposeData();
|
||||||
|
Scribe_Collections.Look(ref cums, "cumslabel", LookMode.Value, new object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetIngredients()
|
||||||
|
{
|
||||||
|
string res = "";
|
||||||
|
if (!cums.NullOrEmpty()) for(int i=0; i<cums.Count; i++)
|
||||||
|
{
|
||||||
|
res += cums[i];
|
||||||
|
if (i < cums.Count - 1) res += ", ";
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
using rjw;
|
using rjw;
|
||||||
|
@ -9,7 +10,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
||||||
{
|
{
|
||||||
HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
|
HediffComp_Menstruation comp = pawn.GetMenstruationComp();
|
||||||
if (comp != null && (comp.curStage.Equals(HediffComp_Menstruation.Stage.Follicular)
|
if (comp != null && (comp.curStage.Equals(HediffComp_Menstruation.Stage.Follicular)
|
||||||
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.Luteal)
|
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.Luteal)
|
||||||
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.ClimactericFollicular)
|
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.ClimactericFollicular)
|
||||||
|
@ -31,10 +32,10 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
||||||
{
|
{
|
||||||
HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
|
HediffComp_Menstruation comp = pawn.GetMenstruationComp();
|
||||||
if (comp != null)
|
if (Configurations.EnableMenopause && comp != null)
|
||||||
{
|
{
|
||||||
comp.ovarypower = (int)(comp.ovarypower * (1 + effectOffset));
|
comp.RecoverOvary(1 + effectOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,7 +46,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
||||||
{
|
{
|
||||||
HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
|
HediffComp_Menstruation comp = pawn.GetMenstruationComp();
|
||||||
if (comp != null)
|
if (comp != null)
|
||||||
{
|
{
|
||||||
comp.eggstack += Rand.Range(1, 4);
|
comp.eggstack += Rand.Range(1, 4);
|
||||||
|
|
|
@ -60,12 +60,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class HediffComp_Menstruation : HediffComp
|
public class HediffComp_Menstruation : HediffComp
|
||||||
{
|
{
|
||||||
const float minmakefilthvalue = 1.0f;
|
const float minmakefilthvalue = 1.0f;
|
||||||
|
@ -444,7 +438,11 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
public override void CompPostPostAdd(DamageInfo? dinfo)
|
public override void CompPostPostAdd(DamageInfo? dinfo)
|
||||||
{
|
{
|
||||||
if (!loaded) Initialize();
|
if (!loaded)
|
||||||
|
{
|
||||||
|
InitOvary((int)Utility.RandGaussianLike(18,40));
|
||||||
|
Initialize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void CompPostTick(ref float severityAdjustment)
|
public override void CompPostTick(ref float severityAdjustment)
|
||||||
|
@ -458,9 +456,8 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
public override void CompPostPostRemoved()
|
public override void CompPostPostRemoved()
|
||||||
{
|
{
|
||||||
|
|
||||||
HugsLibController.Instance.TickDelayScheduler.TryUnscheduleCallback(actionref);
|
HugsLibController.Instance.TickDelayScheduler.TryUnscheduleCallback(actionref);
|
||||||
ModLog.Message(parent.pawn.Label + "tick scheduler removed");
|
Log.Message(parent.pawn.Label + "tick scheduler removed");
|
||||||
base.CompPostPostRemoved();
|
base.CompPostPostRemoved();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -715,8 +712,37 @@ namespace RJW_Menstruation
|
||||||
return outcum;
|
return outcum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Force excrete cums in womb and get mixture of cum.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mixtureDef"></param>
|
||||||
|
/// <param name="portion"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Cum MixtureOut(ThingDef mixtureDef ,float portion = 0.1f)
|
||||||
|
{
|
||||||
|
if (cums.NullOrEmpty()) return null;
|
||||||
|
Color color = GetCumMixtureColor;
|
||||||
|
float totalleak = 0;
|
||||||
|
List<string> cumlabels = new List<string>();
|
||||||
|
float cumd = TotalCumPercent;
|
||||||
|
List<Cum> removecums = new List<Cum>();
|
||||||
|
foreach (Cum cum in cums)
|
||||||
|
{
|
||||||
|
float vd = cum.DismishForce(portion);
|
||||||
|
string tmp = "FilthLabelWithSource".Translate(cum.FilthDef.label, cum.pawn?.LabelShort ?? "Unknown", 1.ToString());
|
||||||
|
cumlabels.Add(tmp.Replace(" x1", ""));
|
||||||
|
totalleak += vd;
|
||||||
|
if (cum.ShouldRemove()) removecums.Add(cum);
|
||||||
|
}
|
||||||
|
foreach (Cum cum in removecums)
|
||||||
|
{
|
||||||
|
cums.Remove(cum);
|
||||||
|
}
|
||||||
|
removecums.Clear();
|
||||||
|
return new CumMixture(parent.pawn, totalleak, cumlabels, color, mixtureDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fertilize eggs and return the result
|
/// Fertilize eggs and return the result
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -761,43 +787,7 @@ namespace RJW_Menstruation
|
||||||
if (eggs == null) eggs = new List<Egg>();
|
if (eggs == null) eggs = new List<Egg>();
|
||||||
|
|
||||||
|
|
||||||
if (!Configurations.EnableMenopause)
|
InitOvary(parent.pawn.ageTracker.AgeBiologicalYears);
|
||||||
{
|
|
||||||
RemoveClimactericEffect();
|
|
||||||
}
|
|
||||||
else if (ovarypower < -50000)
|
|
||||||
{
|
|
||||||
if (Props.ovaryPower > 10000000) ovarypower = Props.ovaryPower;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float avglittersize;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
avglittersize = Rand.ByCurveAverage(parent.pawn.def.race.litterSizeCurve);
|
|
||||||
}
|
|
||||||
catch (NullReferenceException)
|
|
||||||
{
|
|
||||||
avglittersize = 1;
|
|
||||||
}
|
|
||||||
ovarypower = (int)(((Props.ovaryPower * Rand.Range(0.7f, 1.3f) * parent.pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy)
|
|
||||||
- (Math.Max(0, parent.pawn.ageTracker.AgeBiologicalYears - RJWSettings.sex_minimum_age * parent.pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy))
|
|
||||||
* (60 / (Props.folicularIntervalDays + Props.lutealIntervalDays) * Configurations.CycleAcceleration)) * avglittersize);
|
|
||||||
if (ovarypower < 1)
|
|
||||||
{
|
|
||||||
Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn);
|
|
||||||
hediff.Severity = 0.2f;
|
|
||||||
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
|
||||||
curStage = Stage.Young;
|
|
||||||
}
|
|
||||||
else if (ovarypower < ovarypowerthreshold)
|
|
||||||
{
|
|
||||||
Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Climacteric, parent.pawn);
|
|
||||||
hediff.Severity = 0.008f * (ovarypowerthreshold - ovarypower);
|
|
||||||
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (parent.pawn.IsPregnant()) curStage = Stage.Pregnant;
|
if (parent.pawn.IsPregnant()) curStage = Stage.Pregnant;
|
||||||
if (parent.pawn.IsAnimal())
|
if (parent.pawn.IsAnimal())
|
||||||
|
@ -823,6 +813,57 @@ namespace RJW_Menstruation
|
||||||
loaded = true;
|
loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void InitOvary(int ageYear)
|
||||||
|
{
|
||||||
|
if (!Configurations.EnableMenopause)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
}
|
||||||
|
else if (ovarypower < -50000)
|
||||||
|
{
|
||||||
|
if (Props.ovaryPower > 10000000) ovarypower = Props.ovaryPower;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float avglittersize;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
avglittersize = Rand.ByCurveAverage(parent.pawn.def.race.litterSizeCurve);
|
||||||
|
}
|
||||||
|
catch (NullReferenceException)
|
||||||
|
{
|
||||||
|
avglittersize = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ovarypower = (int)(((Props.ovaryPower * Utility.RandGaussianLike(0.70f, 1.30f) * parent.pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy)
|
||||||
|
- (Math.Max(0, ageYear - RJWSettings.sex_minimum_age * parent.pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy))
|
||||||
|
* (60 / (Props.folicularIntervalDays + Props.lutealIntervalDays) * Configurations.CycleAcceleration)) * avglittersize);
|
||||||
|
if (ovarypower < 1)
|
||||||
|
{
|
||||||
|
Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn);
|
||||||
|
hediff.Severity = 0.2f;
|
||||||
|
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
||||||
|
curStage = Stage.Young;
|
||||||
|
}
|
||||||
|
else if (ovarypower < ovarypowerthreshold)
|
||||||
|
{
|
||||||
|
Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Climacteric, parent.pawn);
|
||||||
|
hediff.Severity = 0.008f * (ovarypowerthreshold - ovarypower);
|
||||||
|
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecoverOvary(float multiply = 0.2f)
|
||||||
|
{
|
||||||
|
ovarypower = Math.Max(0, (int)(ovarypower * multiply));
|
||||||
|
if (ovarypower >= ovarypowerthreshold)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void AfterSimulator()
|
protected void AfterSimulator()
|
||||||
{
|
{
|
||||||
if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold)
|
if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold)
|
||||||
|
@ -969,7 +1010,7 @@ namespace RJW_Menstruation
|
||||||
protected void BleedOut()
|
protected void BleedOut()
|
||||||
{
|
{
|
||||||
//FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, ThingDefOf.Filth_Blood,parent.pawn.Label);
|
//FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, ThingDefOf.Filth_Blood,parent.pawn.Label);
|
||||||
CumIn(parent.pawn, Rand.Range(0.02f * Configurations.BleedingAmount, 0.04f * Configurations.BleedingAmount), Translations.Menstrual_Blood, -5.0f, ThingDefOf.Filth_Blood);
|
CumIn(parent.pawn, Rand.Range(0.02f * Configurations.BleedingAmount, 0.04f * Configurations.BleedingAmount), Translations.Menstrual_Blood, -5.0f, parent.pawn.def.race?.BloodDef ?? ThingDefOf.Filth_Blood);
|
||||||
GetNotCum(Translations.Menstrual_Blood).color = BloodColor;
|
GetNotCum(Translations.Menstrual_Blood).color = BloodColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,6 +1157,7 @@ namespace RJW_Menstruation
|
||||||
hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn);
|
hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn);
|
||||||
hediff.Severity = 0.2f;
|
hediff.Severity = 0.2f;
|
||||||
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn));
|
||||||
|
ovarypower = 0;
|
||||||
GoNextStage(Stage.Young);
|
GoNextStage(Stage.Young);
|
||||||
}
|
}
|
||||||
else if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold)
|
else if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold)
|
||||||
|
@ -1215,7 +1257,14 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
protected virtual void YoungAction()
|
protected virtual void YoungAction()
|
||||||
{
|
{
|
||||||
if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) <= 0) StayCurrentStageConst(Stage.Young);
|
if (!Configurations.EnableMenopause && ovarypower < 0 && ovarypower > -10000)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
}
|
||||||
|
if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) <= 0)
|
||||||
|
{
|
||||||
|
StayCurrentStageConst(Stage.Young);
|
||||||
|
}
|
||||||
else GoNextStage(Stage.Follicular);
|
else GoNextStage(Stage.Follicular);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1277,10 +1326,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void ThoughtCummer()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private Action PeriodSimulator(Stage targetstage)
|
private Action PeriodSimulator(Stage targetstage)
|
||||||
|
|
|
@ -5,18 +5,161 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
using rjw;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
namespace RJW_Menstruation
|
namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
public static class MenstruationUtility
|
public static class MenstruationUtility
|
||||||
{
|
{
|
||||||
|
public static HediffComp_Menstruation GetMenstruationComp(this Pawn pawn)
|
||||||
|
{
|
||||||
|
var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
|
||||||
|
HediffComp_Menstruation result;
|
||||||
|
if (hedifflist.NullOrEmpty()) return null;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (Hediff h in hedifflist)
|
||||||
|
{
|
||||||
|
result = h.TryGetComp<HediffComp_Menstruation>();
|
||||||
|
if (result != null) return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HediffComp_Menstruation GetMenstruationComp(this Hediff hediff)
|
||||||
|
{
|
||||||
|
if (hediff is Hediff_PartBaseNatural || hediff is Hediff_PartBaseArtifical)
|
||||||
|
{
|
||||||
|
return hediff.TryGetComp<HediffComp_Menstruation>();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static float GetFertilityChance(this HediffComp_Menstruation comp)
|
public static float GetFertilityChance(this HediffComp_Menstruation comp)
|
||||||
{
|
{
|
||||||
return comp.TotalFertCum * Configurations.FertilizeChance;
|
return comp.TotalFertCum * Configurations.FertilizeChance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HediffComp_Menstruation.Stage GetCurStage(this Pawn pawn)
|
||||||
|
{
|
||||||
|
return GetMenstruationComp(pawn)?.curStage ?? HediffComp_Menstruation.Stage.Bleeding;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Texture2D GetPregnancyIcon(this HediffComp_Menstruation comp, Hediff hediff)
|
||||||
|
{
|
||||||
|
string icon = "";
|
||||||
|
Texture2D result = null;
|
||||||
|
int babycount = 1;
|
||||||
|
if (hediff is Hediff_MechanoidPregnancy)
|
||||||
|
{
|
||||||
|
return ContentFinder<Texture2D>.Get(("Womb/Mechanoid_Fluid"), true);
|
||||||
|
}
|
||||||
|
else if (hediff is Hediff_BasePregnancy)
|
||||||
|
{
|
||||||
|
Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
|
||||||
|
babycount = h.babies.Count;
|
||||||
|
string fetustex = h.babies?.FirstOrDefault()?.def.GetModExtension<PawnDNAModExtension>()?.fetusTexPath ?? "Fetus/Fetus_Default";
|
||||||
|
if (h.GestationProgress < 0.2f) icon = comp.wombTex + "_Implanted";
|
||||||
|
else if (h.GestationProgress < 0.3f)
|
||||||
|
{
|
||||||
|
if (h.babies?.First()?.def?.race?.FleshType == FleshTypeDefOf.Insectoid) icon += "Fetus/Insects/Insect_Early00";
|
||||||
|
else icon += "Fetus/Fetus_Early00";
|
||||||
|
}
|
||||||
|
else if (h.GestationProgress < 0.4f) icon += fetustex + "00";
|
||||||
|
else if (h.GestationProgress < 0.5f) icon += fetustex + "01";
|
||||||
|
else if (h.GestationProgress < 0.6f) icon += fetustex + "02";
|
||||||
|
else if (h.GestationProgress < 0.7f) icon += fetustex + "03";
|
||||||
|
else if (h.GestationProgress < 0.8f) icon += fetustex + "04";
|
||||||
|
else icon += fetustex + "05";
|
||||||
|
}
|
||||||
|
else icon = "Fetus/Slime_Abomi02";
|
||||||
|
|
||||||
|
result = TryGetTwinsIcon(icon, babycount);
|
||||||
|
|
||||||
|
if (result == null) result = ContentFinder<Texture2D>.Get((icon), true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Texture2D TryGetTwinsIcon(string path, int babycount)
|
||||||
|
{
|
||||||
|
Texture2D result = null;
|
||||||
|
for (int i = babycount; i > 1; i--)
|
||||||
|
{
|
||||||
|
result = ContentFinder<Texture2D>.Get((path + "_Multiplet_" + i), false);
|
||||||
|
if (result != null) return result;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Texture2D GetCumIcon(this HediffComp_Menstruation comp)
|
||||||
|
{
|
||||||
|
string icon = comp.wombTex;
|
||||||
|
float cumpercent = comp.TotalCumPercent;
|
||||||
|
if (cumpercent < 0.001f) return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
||||||
|
else if (cumpercent < 0.01f) icon += "_Cum_00";
|
||||||
|
else if (cumpercent < 0.05f) icon += "_Cum_01";
|
||||||
|
else if (cumpercent < 0.11f) icon += "_Cum_02";
|
||||||
|
else if (cumpercent < 0.17f) icon += "_Cum_03";
|
||||||
|
else if (cumpercent < 0.23f) icon += "_Cum_04";
|
||||||
|
else if (cumpercent < 0.29f) icon += "_Cum_05";
|
||||||
|
else if (cumpercent < 0.35f) icon += "_Cum_06";
|
||||||
|
else if (cumpercent < 0.41f) icon += "_Cum_07";
|
||||||
|
else if (cumpercent < 0.47f) icon += "_Cum_08";
|
||||||
|
else if (cumpercent < 0.53f) icon += "_Cum_09";
|
||||||
|
else if (cumpercent < 0.59f) icon += "_Cum_10";
|
||||||
|
else if (cumpercent < 0.65f) icon += "_Cum_11";
|
||||||
|
else if (cumpercent < 0.71f) icon += "_Cum_12";
|
||||||
|
else if (cumpercent < 0.77f) icon += "_Cum_13";
|
||||||
|
else if (cumpercent < 0.83f) icon += "_Cum_14";
|
||||||
|
else if (cumpercent < 0.89f) icon += "_Cum_15";
|
||||||
|
else if (cumpercent < 0.95f) icon += "_Cum_16";
|
||||||
|
else icon += "_Cum_17";
|
||||||
|
Texture2D cumtex = ContentFinder<Texture2D>.Get((icon), true);
|
||||||
|
return cumtex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Texture2D GetWombIcon(this HediffComp_Menstruation comp)
|
||||||
|
{
|
||||||
|
if (comp.Pawn.health.hediffSet.GetHediffs<Hediff_InsectEgg>().FirstOrDefault() != null) return ContentFinder<Texture2D>.Get(("Womb/Womb_Egged"), true);
|
||||||
|
string icon = comp.wombTex;
|
||||||
|
HediffComp_Menstruation.Stage stage = comp.curStage;
|
||||||
|
if (stage == HediffComp_Menstruation.Stage.Bleeding) icon += "_Bleeding";
|
||||||
|
|
||||||
|
Texture2D wombtex = ContentFinder<Texture2D>.Get((icon), true);
|
||||||
|
|
||||||
|
return wombtex;
|
||||||
|
}
|
||||||
|
public static Texture2D GetEggIcon(this HediffComp_Menstruation comp)
|
||||||
|
{
|
||||||
|
if (comp.parent.pawn.IsPregnant())
|
||||||
|
{
|
||||||
|
if (comp.parent.pawn.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
|
||||||
|
else return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
||||||
|
}
|
||||||
|
else if (!comp.IsEggExist) return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int fertstage = comp.IsFertilized;
|
||||||
|
if (fertstage >= 0)
|
||||||
|
{
|
||||||
|
if (fertstage < 1) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized00", true);
|
||||||
|
else if (fertstage < 24) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized01", true);
|
||||||
|
else return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized02", true);
|
||||||
|
}
|
||||||
|
else if (comp.IsEggFertilizing) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing01", true);
|
||||||
|
else return ContentFinder<Texture2D>.Get("Eggs/Egg", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DrawEggOverlay(this HediffComp_Menstruation comp, Rect wombRect)
|
||||||
|
{
|
||||||
|
Rect rect = new Rect(wombRect.xMax - wombRect.width / 3, wombRect.y, wombRect.width / 3, wombRect.width / 3);
|
||||||
|
GUI.color = Color.white;
|
||||||
|
GUI.DrawTexture(rect, comp.GetEggIcon(), ScaleMode.ScaleToFit);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,12 +206,12 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
if (xxx.is_human(father))
|
if (xxx.is_human(father))
|
||||||
{
|
{
|
||||||
melanin = (mother.story.melanin + father.story.melanin) / 2;
|
melanin = (mother.story?.melanin ?? 0f + father.story?.melanin ?? 0f) / 2;
|
||||||
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
|
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
melanin = mother.story.melanin;
|
melanin = mother.story?.melanin ?? 0f;
|
||||||
lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
|
lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
if (xxx.is_human(father))
|
if (xxx.is_human(father))
|
||||||
{
|
{
|
||||||
melanin = father.story.melanin;
|
melanin = father.story?.melanin ?? 0f;
|
||||||
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
|
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -410,10 +410,10 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
string MotherRaceName = "";
|
string MotherRaceName = "";
|
||||||
string FatherRaceName = "";
|
string FatherRaceName = "";
|
||||||
MotherRaceName = mother.kindDef.race.defName;
|
MotherRaceName = mother.kindDef?.race?.defName;
|
||||||
PawnKindDef tmp = spawn_kind_def;
|
PawnKindDef tmp = spawn_kind_def;
|
||||||
if (father != null)
|
if (father != null)
|
||||||
FatherRaceName = father.kindDef.race.defName;
|
FatherRaceName = father.kindDef?.race?.defName;
|
||||||
|
|
||||||
|
|
||||||
if (FatherRaceName != "" && Configurations.UseHybridExtention)
|
if (FatherRaceName != "" && Configurations.UseHybridExtention)
|
||||||
|
@ -458,7 +458,7 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
else if (!Configurations.UseHybridExtention || spawn_kind_def == null)
|
else if (!Configurations.UseHybridExtention || spawn_kind_def == null)
|
||||||
{
|
{
|
||||||
spawn_kind_def = mother.RaceProps.AnyPawnKind;
|
spawn_kind_def = mother.RaceProps?.AnyPawnKind ?? mother.kindDef;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spawn_kind_def.defName.Contains("Nymph"))
|
if (spawn_kind_def.defName.Contains("Nymph"))
|
||||||
|
@ -476,7 +476,7 @@ namespace RJW_Menstruation
|
||||||
if (spawn_kind_def_list.NullOrEmpty())
|
if (spawn_kind_def_list.NullOrEmpty())
|
||||||
spawn_kind_def = PawnKindDefOf.Colonist;
|
spawn_kind_def = PawnKindDefOf.Colonist;
|
||||||
|
|
||||||
spawn_kind_def = spawn_kind_def_list.RandomElement();
|
if (!spawn_kind_def_list.NullOrEmpty()) spawn_kind_def = spawn_kind_def_list.RandomElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace RJW_Menstruation
|
||||||
protected override IEnumerable<Toil> MakeNewToils()
|
protected override IEnumerable<Toil> MakeNewToils()
|
||||||
{
|
{
|
||||||
|
|
||||||
HediffComp_Menstruation Comp = Utility.GetMenstruationComp(pawn);
|
HediffComp_Menstruation Comp = pawn.GetMenstruationComp();
|
||||||
this.FailOn(delegate
|
this.FailOn(delegate
|
||||||
{
|
{
|
||||||
return !(Comp.TotalCumPercent > 0.001);
|
return !(Comp.TotalCumPercent > 0.001);
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace RJW_Menstruation
|
||||||
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
||||||
if (Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
|
if (Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
|
||||||
{
|
{
|
||||||
icon = Utility.GetPregnancyIcon(comp, hediff);
|
icon = comp.GetPregnancyIcon(hediff);
|
||||||
if (hediff is Hediff_BasePregnancy)
|
if (hediff is Hediff_BasePregnancy)
|
||||||
{
|
{
|
||||||
Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
|
Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace RJW_Menstruation
|
||||||
else return true;
|
else return true;
|
||||||
|
|
||||||
if (female.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
|
if (female.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
|
||||||
HediffComp_Menstruation comp = Utility.GetMenstruationComp(female);
|
HediffComp_Menstruation comp = female.GetMenstruationComp();
|
||||||
if (comp != null)
|
if (comp != null)
|
||||||
{
|
{
|
||||||
if (Genital_Helper.has_penis_fertile(male, maleparts) && PregnancyHelper.CanImpregnate(male, female, sextype))
|
if (Genital_Helper.has_penis_fertile(male, maleparts) && PregnancyHelper.CanImpregnate(male, female, sextype))
|
||||||
|
@ -47,10 +47,9 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
comp.CumIn(male, Rand.Range(0.5f,3.0f) * RJWSettings.cum_on_body_amount_adjust * male.BodySize, 1.0f);
|
comp.CumIn(male, Rand.Range(0.5f,3.0f) * RJWSettings.cum_on_body_amount_adjust * male.BodySize, 1.0f);
|
||||||
}
|
}
|
||||||
else comp.CumIn(male, male.GetCumVolume(), 0);
|
else comp.CumIn(male, male.GetCumVolume(maleparts), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//if (Genital_Helper.has_vagina(partner, partnerparts))
|
//if (Genital_Helper.has_vagina(partner, partnerparts))
|
||||||
//{
|
//{
|
||||||
// if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
|
// if (partner.IsAnimal() && !Configurations.EnableAnimalCycle) return true;
|
||||||
|
|
|
@ -99,6 +99,8 @@ namespace RJW_Menstruation
|
||||||
public static readonly string Option29_Label = "Option29_Label".Translate();
|
public static readonly string Option29_Label = "Option29_Label".Translate();
|
||||||
public static readonly string Option29_Desc = "Option29_Desc".Translate();
|
public static readonly string Option29_Desc = "Option29_Desc".Translate();
|
||||||
|
|
||||||
|
public static readonly string EstimatedCumLifespan = "EstimatedCumLifespan".Translate();
|
||||||
|
|
||||||
public static readonly string FloatMenu_CleanSelf = "FloatMenu_CleanSelf".Translate();
|
public static readonly string FloatMenu_CleanSelf = "FloatMenu_CleanSelf".Translate();
|
||||||
|
|
||||||
public static readonly string CustomHybrid_List_Title = "CustomHybrid_List_Title".Translate();
|
public static readonly string CustomHybrid_List_Title = "CustomHybrid_List_Title".Translate();
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace RJW_Menstruation
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
float width = 450f + 2 * windowMargin;
|
float width = 450f + 2 * windowMargin;
|
||||||
float height = 820f;
|
float height = 780f + 2 * windowMargin;
|
||||||
if (!Configurations.DrawWombStatus) height -= wombRectHeight;
|
if (!Configurations.DrawWombStatus) height -= wombRectHeight;
|
||||||
if (!Configurations.DrawVaginaStatus || pawn.IsAnimal()) width -= 150f;
|
if (!Configurations.DrawVaginaStatus || pawn.IsAnimal()) width -= 150f;
|
||||||
return new Vector2(width, height);
|
return new Vector2(width, height);
|
||||||
|
@ -132,7 +132,7 @@ namespace RJW_Menstruation
|
||||||
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
||||||
if (pregnant && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
|
if (pregnant && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
|
||||||
{
|
{
|
||||||
womb = Utility.GetPregnancyIcon(comp, hediff);
|
womb = comp.GetPregnancyIcon(hediff);
|
||||||
if (hediff is Hediff_MultiplePregnancy)
|
if (hediff is Hediff_MultiplePregnancy)
|
||||||
{
|
{
|
||||||
Hediff_MultiplePregnancy h = (Hediff_MultiplePregnancy)hediff;
|
Hediff_MultiplePregnancy h = (Hediff_MultiplePregnancy)hediff;
|
||||||
|
@ -297,6 +297,7 @@ namespace RJW_Menstruation
|
||||||
//Widgets.DrawTextureFitted(wombRect, cum,1.0f);
|
//Widgets.DrawTextureFitted(wombRect, cum,1.0f);
|
||||||
GUI.DrawTexture(rect, womb, ScaleMode.ScaleToFit, true, 0, Color.white, 0, 0);
|
GUI.DrawTexture(rect, womb, ScaleMode.ScaleToFit, true, 0, Color.white, 0, 0);
|
||||||
GUI.DrawTexture(rect, cum, ScaleMode.ScaleToFit, true, 0, cumcolor, 0, 0);
|
GUI.DrawTexture(rect, cum, ScaleMode.ScaleToFit, true, 0, cumcolor, 0, 0);
|
||||||
|
|
||||||
GUI.color = Color.white;
|
GUI.color = Color.white;
|
||||||
|
|
||||||
|
|
||||||
|
@ -378,12 +379,11 @@ namespace RJW_Menstruation
|
||||||
statvalue = pawn.records.GetValue(xxx.CountOfWhore);
|
statvalue = pawn.records.GetValue(xxx.CountOfWhore);
|
||||||
if (statvalue > 0)
|
if (statvalue > 0)
|
||||||
{
|
{
|
||||||
FillableBarLabeled(lineRect, " " + xxx.CountOfWhore.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 500, TextureCache.slaaneshTexture, Texture2D.blackTexture);
|
FillableBarLabeled(lineRect, " " + xxx.CountOfWhore.LabelCap.CapitalizeFirst() + " " + statvalue, statvalue / 50, TextureCache.slaaneshTexture, Texture2D.blackTexture);
|
||||||
statvalue = pawn.records.GetValue(xxx.EarnedMoneyByWhore);
|
statvalue = pawn.records.GetValue(xxx.EarnedMoneyByWhore);
|
||||||
lineRect.y += height;
|
lineRect.y += height;
|
||||||
FillableBarLabeled(lineRect, " " + VariousDefOf.RJW_EarnedMoneyByWhore.label.CapitalizeFirst() + " " + statvalue, statvalue / 10000, TextureCache.ghalmarazTexture, Texture2D.blackTexture);
|
FillableBarLabeled(lineRect, " " + VariousDefOf.RJW_EarnedMoneyByWhore.label.CapitalizeFirst() + " " + statvalue, statvalue / 10000, TextureCache.ghalmarazTexture, Texture2D.blackTexture);
|
||||||
|
|
||||||
|
|
||||||
lineRect.y += height;
|
lineRect.y += height;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -56,15 +56,30 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
public static float GetCumVolume(this Pawn pawn)
|
public static float GetCumVolume(this Pawn pawn)
|
||||||
{
|
{
|
||||||
CompHediffBodyPart part = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn));
|
||||||
if (part == null) part = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
if (hediffs.NullOrEmpty()) return 0;
|
||||||
if (part == null) part = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
else return pawn.GetCumVolume(hediffs);
|
||||||
if (part == null) part = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
}
|
||||||
|
|
||||||
|
public static float GetCumVolume(this Pawn pawn, List<Hediff> hediffs)
|
||||||
|
{
|
||||||
|
CompHediffBodyPart part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
|
||||||
|
|
||||||
|
return pawn.GetCumVolume(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part)
|
||||||
|
{
|
||||||
|
float res;
|
||||||
|
|
||||||
float res = 0;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
res = part.FluidAmmount * part.FluidModifier * pawn.BodySize * Rand.Range(0.8f, 1.2f) * RJWSettings.cum_on_body_amount_adjust * 0.3f;
|
res = part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize * Rand.Range(0.8f, 1.2f) * RJWSettings.cum_on_body_amount_adjust * 0.3f;
|
||||||
}
|
}
|
||||||
catch (NullReferenceException)
|
catch (NullReferenceException)
|
||||||
{
|
{
|
||||||
|
@ -76,30 +91,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static HediffComp_Menstruation GetMenstruationComp(this Pawn pawn)
|
|
||||||
{
|
|
||||||
var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
|
|
||||||
HediffComp_Menstruation result;
|
|
||||||
if (hedifflist.NullOrEmpty()) return null;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (Hediff h in hedifflist)
|
|
||||||
{
|
|
||||||
result = h.TryGetComp<HediffComp_Menstruation>();
|
|
||||||
if (result != null) return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HediffComp_Menstruation GetMenstruationComp(this Hediff hediff)
|
|
||||||
{
|
|
||||||
if (hediff is Hediff_PartBaseNatural || hediff is Hediff_PartBaseArtifical)
|
|
||||||
{
|
|
||||||
return hediff.TryGetComp<HediffComp_Menstruation>();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HediffComp_Breast GetBreastComp(this Pawn pawn)
|
public static HediffComp_Breast GetBreastComp(this Pawn pawn)
|
||||||
{
|
{
|
||||||
|
@ -158,12 +149,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static HediffComp_Menstruation.Stage GetCurStage(this Pawn pawn)
|
|
||||||
{
|
|
||||||
return GetMenstruationComp(pawn)?.curStage ?? HediffComp_Menstruation.Stage.Bleeding;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static float GetPregnancyProgress(this Pawn pawn)
|
public static float GetPregnancyProgress(this Pawn pawn)
|
||||||
{
|
{
|
||||||
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
Hediff hediff = PregnancyHelper.GetPregnancy(pawn);
|
||||||
|
@ -194,93 +179,6 @@ namespace RJW_Menstruation
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static Texture2D GetPregnancyIcon(HediffComp_Menstruation comp, Hediff hediff)
|
|
||||||
{
|
|
||||||
string icon = "";
|
|
||||||
Texture2D result = null;
|
|
||||||
int babycount = 1;
|
|
||||||
if (hediff is Hediff_MechanoidPregnancy)
|
|
||||||
{
|
|
||||||
return ContentFinder<Texture2D>.Get(("Womb/Mechanoid_Fluid"), true);
|
|
||||||
}
|
|
||||||
else if (hediff is Hediff_BasePregnancy)
|
|
||||||
{
|
|
||||||
Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
|
|
||||||
babycount = h.babies.Count;
|
|
||||||
string fetustex = h.babies?.FirstOrDefault()?.def.GetModExtension<PawnDNAModExtension>()?.fetusTexPath ?? "Fetus/Fetus_Default";
|
|
||||||
if (h.GestationProgress < 0.2f) icon = comp.wombTex + "_Implanted";
|
|
||||||
else if (h.GestationProgress < 0.3f)
|
|
||||||
{
|
|
||||||
if (h.babies?.First()?.def?.race?.FleshType == FleshTypeDefOf.Insectoid) icon += "Fetus/Insects/Insect_Early00";
|
|
||||||
else icon += "Fetus/Fetus_Early00";
|
|
||||||
}
|
|
||||||
else if (h.GestationProgress < 0.4f) icon += fetustex + "00";
|
|
||||||
else if (h.GestationProgress < 0.5f) icon += fetustex + "01";
|
|
||||||
else if (h.GestationProgress < 0.6f) icon += fetustex + "02";
|
|
||||||
else if (h.GestationProgress < 0.7f) icon += fetustex + "03";
|
|
||||||
else if (h.GestationProgress < 0.8f) icon += fetustex + "04";
|
|
||||||
else icon += fetustex + "05";
|
|
||||||
}
|
|
||||||
else icon = "Fetus/Slime_Abomi02";
|
|
||||||
|
|
||||||
result = TryGetTwinsIcon(icon, babycount);
|
|
||||||
|
|
||||||
if (result == null) result = ContentFinder<Texture2D>.Get((icon), true);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D TryGetTwinsIcon(string path, int babycount)
|
|
||||||
{
|
|
||||||
Texture2D result = null;
|
|
||||||
for (int i = babycount; i>1; i--)
|
|
||||||
{
|
|
||||||
result = ContentFinder<Texture2D>.Get((path + "_Multiplet_" + i), false);
|
|
||||||
if (result != null) return result;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D GetCumIcon(this HediffComp_Menstruation comp)
|
|
||||||
{
|
|
||||||
string icon = comp.wombTex;
|
|
||||||
float cumpercent = comp.TotalCumPercent;
|
|
||||||
if (cumpercent < 0.001f) return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
|
||||||
else if (cumpercent < 0.01f) icon += "_Cum_00";
|
|
||||||
else if (cumpercent < 0.05f) icon += "_Cum_01";
|
|
||||||
else if (cumpercent < 0.11f) icon += "_Cum_02";
|
|
||||||
else if (cumpercent < 0.17f) icon += "_Cum_03";
|
|
||||||
else if (cumpercent < 0.23f) icon += "_Cum_04";
|
|
||||||
else if (cumpercent < 0.29f) icon += "_Cum_05";
|
|
||||||
else if (cumpercent < 0.35f) icon += "_Cum_06";
|
|
||||||
else if (cumpercent < 0.41f) icon += "_Cum_07";
|
|
||||||
else if (cumpercent < 0.47f) icon += "_Cum_08";
|
|
||||||
else if (cumpercent < 0.53f) icon += "_Cum_09";
|
|
||||||
else if (cumpercent < 0.59f) icon += "_Cum_10";
|
|
||||||
else if (cumpercent < 0.65f) icon += "_Cum_11";
|
|
||||||
else if (cumpercent < 0.71f) icon += "_Cum_12";
|
|
||||||
else if (cumpercent < 0.77f) icon += "_Cum_13";
|
|
||||||
else if (cumpercent < 0.83f) icon += "_Cum_14";
|
|
||||||
else if (cumpercent < 0.89f) icon += "_Cum_15";
|
|
||||||
else if (cumpercent < 0.95f) icon += "_Cum_16";
|
|
||||||
else icon += "_Cum_17";
|
|
||||||
Texture2D cumtex = ContentFinder<Texture2D>.Get((icon), true);
|
|
||||||
return cumtex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D GetWombIcon(this HediffComp_Menstruation comp)
|
|
||||||
{
|
|
||||||
if (comp.Pawn.health.hediffSet.GetHediffs<Hediff_InsectEgg>().FirstOrDefault() != null) return ContentFinder<Texture2D>.Get(("Womb/Womb_Egged"), true);
|
|
||||||
string icon = comp.wombTex;
|
|
||||||
HediffComp_Menstruation.Stage stage = comp.curStage;
|
|
||||||
if (stage == HediffComp_Menstruation.Stage.Bleeding) icon += "_Bleeding";
|
|
||||||
|
|
||||||
Texture2D wombtex = ContentFinder<Texture2D>.Get((icon), true);
|
|
||||||
|
|
||||||
return wombtex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D GetGenitalIcon(this Pawn pawn)
|
public static Texture2D GetGenitalIcon(this Pawn pawn)
|
||||||
{
|
{
|
||||||
var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.Find((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
|
var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.Find((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
|
||||||
|
@ -543,35 +441,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawEggOverlay(this HediffComp_Menstruation comp, Rect wombRect)
|
|
||||||
{
|
|
||||||
Rect rect = new Rect(wombRect.xMax - wombRect.width / 3, wombRect.y, wombRect.width / 3, wombRect.width / 3);
|
|
||||||
GUI.color = Color.white;
|
|
||||||
GUI.DrawTexture(rect, comp.GetEggIcon(), ScaleMode.ScaleToFit);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D GetEggIcon(this HediffComp_Menstruation comp)
|
|
||||||
{
|
|
||||||
if (comp.parent.pawn.IsPregnant())
|
|
||||||
{
|
|
||||||
if (comp.parent.pawn.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
|
|
||||||
else return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
|
||||||
}
|
|
||||||
else if (!comp.IsEggExist) return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int fertstage = comp.IsFertilized;
|
|
||||||
if (fertstage >= 0)
|
|
||||||
{
|
|
||||||
if (fertstage < 1) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized00", true);
|
|
||||||
else if (fertstage < 24) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized01", true);
|
|
||||||
else return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized02", true);
|
|
||||||
}
|
|
||||||
else if (comp.IsEggFertilizing) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing01", true);
|
|
||||||
else return ContentFinder<Texture2D>.Get("Eggs/Egg", true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float RandGaussianLike(float min, float max, int iterations = 3)
|
public static float RandGaussianLike(float min, float max, int iterations = 3)
|
||||||
{
|
{
|
||||||
double res = 0;
|
double res = 0;
|
||||||
|
|
Loading…
Reference in a new issue