mirror of
https://gitgud.io/lutepickle/rjw_menstruation.git
synced 2024-08-14 22:46:52 +00:00
Merge 1.0.6.5
This commit is contained in:
commit
2367091ede
21 changed files with 461 additions and 241 deletions
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 an ovary's health, restoring some quantity of eggs. Less effective on ovaries with few eggs remaining. Cannot recover menopause.</description>
|
<description>Recovers the ovaries' health, restoring some quantity of eggs. Less effective on ovaries with few eggs remaining. Cannot recover menopause.</description>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Things/Item/ORPill</texPath>
|
<texPath>Things/Item/ORPill</texPath>
|
||||||
<graphicClass>Graphic_StackCount</graphicClass>
|
<graphicClass>Graphic_StackCount</graphicClass>
|
||||||
|
@ -139,7 +139,7 @@
|
||||||
<ThingDef ParentName="MakeableDrugPillBase">
|
<ThingDef ParentName="MakeableDrugPillBase">
|
||||||
<defName>Cyclosporine</defName>
|
<defName>Cyclosporine</defName>
|
||||||
<label>cyclosporine</label>
|
<label>cyclosporine</label>
|
||||||
<description>An immunosuppressant. Can cure antisperm antibody, but harms the body's ability to fight off infection and disease for 24 hours.</description>
|
<description>An immunosuppressant. Can cure antisperm antibody, but reduces the body's ability to fight off infection and disease for 24 hours.</description>
|
||||||
<graphicData>
|
<graphicData>
|
||||||
<texPath>Things/Item/Cyclosporine</texPath>
|
<texPath>Things/Item/Cyclosporine</texPath>
|
||||||
<graphicClass>Graphic_StackCount</graphicClass>
|
<graphicClass>Graphic_StackCount</graphicClass>
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
<defName>Hediff_Menopause</defName>
|
<defName>Hediff_Menopause</defName>
|
||||||
<label>Menopause</label>
|
<label>Menopause</label>
|
||||||
<labelNoun>menopause</labelNoun>
|
<labelNoun>menopause</labelNoun>
|
||||||
<description>A condition caused by exhaustion of the ovaries' eggs. Without eggs, the womb can no longer produce children.</description>
|
<description>A condition caused by exhaustion of the ovaries' eggs. The womb can no longer produce children.</description>
|
||||||
<labelNounPretty>{0} has entered menopause</labelNounPretty>
|
<labelNounPretty>{0} has entered menopause</labelNounPretty>
|
||||||
<defaultLabelColor>(0.70,0.70,0.00)</defaultLabelColor>
|
<defaultLabelColor>(0.70,0.70,0.00)</defaultLabelColor>
|
||||||
<isBad>false</isBad>
|
<isBad>false</isBad>
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
<defName>Hediff_Climacteric</defName>
|
<defName>Hediff_Climacteric</defName>
|
||||||
<label>Climacteric</label>
|
<label>Climacteric</label>
|
||||||
<labelNoun>climacteric</labelNoun>
|
<labelNoun>climacteric</labelNoun>
|
||||||
<description>The ovaries have produced their final eggs. Menopause will soon occur.</description>
|
<description>Ovulation has become irregular as the ovaries approach exhaustion. Menopause will soon occur.</description>
|
||||||
<defaultLabelColor>(0.70,0.70,0.00)</defaultLabelColor>
|
<defaultLabelColor>(0.70,0.70,0.00)</defaultLabelColor>
|
||||||
<isBad>false</isBad>
|
<isBad>false</isBad>
|
||||||
<tendable>false</tendable>
|
<tendable>false</tendable>
|
||||||
|
@ -178,7 +178,7 @@
|
||||||
<defName>Hediff_Estrus</defName>
|
<defName>Hediff_Estrus</defName>
|
||||||
<label>Estrus</label>
|
<label>Estrus</label>
|
||||||
<labelNoun>estrus</labelNoun>
|
<labelNoun>estrus</labelNoun>
|
||||||
<description>A condition caused by a womb entering its most fertile phase of the menstrual cycle. Sexual arousal and desire increase dramatically as the body yearns to become pregnant. Increased chance of vaginal sex occurring and potentially lower standards in mate selection.</description>
|
<description>A condition caused by a womb entering the most fertile phase of its menstrual cycle. Sexual arousal and desire increase dramatically as the body yearns to become pregnant. Increased chance of vaginal sex occurring and potentially lower standards in mate selection.</description>
|
||||||
<defaultLabelColor>(1.00,0.60,0.75)</defaultLabelColor>
|
<defaultLabelColor>(1.00,0.60,0.75)</defaultLabelColor>
|
||||||
<isBad>false</isBad>
|
<isBad>false</isBad>
|
||||||
<tendable>false</tendable>
|
<tendable>false</tendable>
|
||||||
|
|
|
@ -17,67 +17,16 @@
|
||||||
</ThoughtDef>
|
</ThoughtDef>
|
||||||
|
|
||||||
<ThoughtDef>
|
<ThoughtDef>
|
||||||
<defName>CameInsideF</defName>
|
<defName>HaterCameInsideM</defName>
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
<durationDays>7.0</durationDays>
|
<durationDays>1.0</durationDays>
|
||||||
<stackLimit>5</stackLimit>
|
<stackLimit>5</stackLimit>
|
||||||
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
<stackedEffectMultiplier>0.4</stackedEffectMultiplier>
|
||||||
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
|
||||||
<stages>
|
<stages>
|
||||||
<li>
|
<li>
|
||||||
<label>{0} came inside</label>
|
<label>came inside of {0}</label>
|
||||||
<description>I'm worried I might get pregnant.</description>
|
<description>I came inside of my rival!</description>
|
||||||
<baseMoodEffect>-3</baseMoodEffect>
|
<baseMoodEffect>5</baseMoodEffect>
|
||||||
<baseOpinionOffset>-2</baseOpinionOffset>
|
|
||||||
</li>
|
|
||||||
</stages>
|
|
||||||
</ThoughtDef>
|
|
||||||
|
|
||||||
<ThoughtDef>
|
|
||||||
<defName>CameInsideFLowFert</defName>
|
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
|
||||||
<durationDays>3.0</durationDays>
|
|
||||||
<stackLimit>5</stackLimit>
|
|
||||||
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
|
||||||
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
|
||||||
<stages>
|
|
||||||
<li>
|
|
||||||
<label>{0} came inside</label>
|
|
||||||
<description>I'm worried I might get pregnant. The chance is low, but...</description>
|
|
||||||
<baseMoodEffect>-1</baseMoodEffect>
|
|
||||||
</li>
|
|
||||||
</stages>
|
|
||||||
</ThoughtDef>
|
|
||||||
|
|
||||||
<ThoughtDef>
|
|
||||||
<defName>CameInsideFFetish</defName>
|
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
|
||||||
<durationDays>3.0</durationDays>
|
|
||||||
<stackLimit>5</stackLimit>
|
|
||||||
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
|
||||||
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
|
||||||
<stages>
|
|
||||||
<li>
|
|
||||||
<label>{0} came inside</label>
|
|
||||||
<description>I hope I get pregnant.</description>
|
|
||||||
<baseMoodEffect>10</baseMoodEffect>
|
|
||||||
<baseOpinionOffset>5</baseOpinionOffset>
|
|
||||||
</li>
|
|
||||||
</stages>
|
|
||||||
</ThoughtDef>
|
|
||||||
|
|
||||||
<ThoughtDef>
|
|
||||||
<defName>CameInsideFFetishSafe</defName>
|
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
|
||||||
<durationDays>3.0</durationDays>
|
|
||||||
<stackLimit>5</stackLimit>
|
|
||||||
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
|
||||||
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
|
||||||
<stages>
|
|
||||||
<li>
|
|
||||||
<label>{0} came inside</label>
|
|
||||||
<description>I don't think I'll get pregnant, but it's fun to fantasize.</description>
|
|
||||||
<baseMoodEffect>3</baseMoodEffect>
|
|
||||||
<baseOpinionOffset>1</baseOpinionOffset>
|
<baseOpinionOffset>1</baseOpinionOffset>
|
||||||
</li>
|
</li>
|
||||||
</stages>
|
</stages>
|
||||||
|
@ -100,7 +49,7 @@
|
||||||
</ThoughtDef>
|
</ThoughtDef>
|
||||||
|
|
||||||
<ThoughtDef>
|
<ThoughtDef>
|
||||||
<defName>HaterCameInsideFSafe</defName>
|
<defName>CameInsideFFetish</defName>
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
<durationDays>3.0</durationDays>
|
<durationDays>3.0</durationDays>
|
||||||
<stackLimit>5</stackLimit>
|
<stackLimit>5</stackLimit>
|
||||||
|
@ -109,9 +58,9 @@
|
||||||
<stages>
|
<stages>
|
||||||
<li>
|
<li>
|
||||||
<label>{0} came inside</label>
|
<label>{0} came inside</label>
|
||||||
<description>I probably won't get pregnant, but I still don't like it.</description>
|
<description>I hope I get pregnant.</description>
|
||||||
<baseMoodEffect>-2</baseMoodEffect>
|
<baseMoodEffect>10</baseMoodEffect>
|
||||||
<baseOpinionOffset>-5</baseOpinionOffset>
|
<baseOpinionOffset>5</baseOpinionOffset>
|
||||||
</li>
|
</li>
|
||||||
</stages>
|
</stages>
|
||||||
</ThoughtDef>
|
</ThoughtDef>
|
||||||
|
@ -151,21 +100,72 @@
|
||||||
</ThoughtDef>
|
</ThoughtDef>
|
||||||
|
|
||||||
<ThoughtDef>
|
<ThoughtDef>
|
||||||
<defName>HaterCameInsideM</defName>
|
<defName>CameInsideFLowFert</defName>
|
||||||
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
<durationDays>1.0</durationDays>
|
<durationDays>3.0</durationDays>
|
||||||
<stackLimit>5</stackLimit>
|
<stackLimit>5</stackLimit>
|
||||||
<stackedEffectMultiplier>0.4</stackedEffectMultiplier>
|
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
||||||
|
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
||||||
<stages>
|
<stages>
|
||||||
<li>
|
<li>
|
||||||
<label>came inside of {0}</label>
|
<label>{0} came inside</label>
|
||||||
<description>I came inside of that bitch!</description>
|
<description>I'm worried I might get pregnant. The chance is low, but...</description>
|
||||||
<baseMoodEffect>5</baseMoodEffect>
|
<baseMoodEffect>-1</baseMoodEffect>
|
||||||
|
</li>
|
||||||
|
</stages>
|
||||||
|
</ThoughtDef>
|
||||||
|
|
||||||
|
<ThoughtDef>
|
||||||
|
<defName>CameInsideF</defName>
|
||||||
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
|
<durationDays>7.0</durationDays>
|
||||||
|
<stackLimit>5</stackLimit>
|
||||||
|
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
||||||
|
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
||||||
|
<stages>
|
||||||
|
<li>
|
||||||
|
<label>{0} came inside</label>
|
||||||
|
<description>I'm worried I might get pregnant.</description>
|
||||||
|
<baseMoodEffect>-3</baseMoodEffect>
|
||||||
|
<baseOpinionOffset>-2</baseOpinionOffset>
|
||||||
|
</li>
|
||||||
|
</stages>
|
||||||
|
</ThoughtDef>
|
||||||
|
|
||||||
|
<ThoughtDef>
|
||||||
|
<defName>CameInsideFFetishSafe</defName>
|
||||||
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
|
<durationDays>3.0</durationDays>
|
||||||
|
<stackLimit>5</stackLimit>
|
||||||
|
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
||||||
|
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
||||||
|
<stages>
|
||||||
|
<li>
|
||||||
|
<label>{0} came inside</label>
|
||||||
|
<description>I don't think I'll get pregnant, but it's fun to fantasize.</description>
|
||||||
|
<baseMoodEffect>3</baseMoodEffect>
|
||||||
<baseOpinionOffset>1</baseOpinionOffset>
|
<baseOpinionOffset>1</baseOpinionOffset>
|
||||||
</li>
|
</li>
|
||||||
</stages>
|
</stages>
|
||||||
</ThoughtDef>
|
</ThoughtDef>
|
||||||
|
|
||||||
|
<ThoughtDef>
|
||||||
|
<defName>HaterCameInsideFSafe</defName>
|
||||||
|
<thoughtClass>Thought_MemorySocial</thoughtClass>
|
||||||
|
<durationDays>3.0</durationDays>
|
||||||
|
<stackLimit>5</stackLimit>
|
||||||
|
<stackedEffectMultiplier>0.1</stackedEffectMultiplier>
|
||||||
|
<stackLimitForSameOtherPawn>1</stackLimitForSameOtherPawn>
|
||||||
|
<stages>
|
||||||
|
<li>
|
||||||
|
<label>{0} came inside</label>
|
||||||
|
<description>I probably won't get pregnant, but I still don't like it.</description>
|
||||||
|
<baseMoodEffect>-2</baseMoodEffect>
|
||||||
|
<baseOpinionOffset>-5</baseOpinionOffset>
|
||||||
|
</li>
|
||||||
|
</stages>
|
||||||
|
</ThoughtDef>
|
||||||
|
|
||||||
<ThoughtDef>
|
<ThoughtDef>
|
||||||
<defName>UnwantedPregnancy</defName>
|
<defName>UnwantedPregnancy</defName>
|
||||||
<thoughtClass>Thought_Memory</thoughtClass>
|
<thoughtClass>Thought_Memory</thoughtClass>
|
||||||
|
|
|
@ -14,6 +14,16 @@
|
||||||
<Stage_None>None</Stage_None>
|
<Stage_None>None</Stage_None>
|
||||||
<Stage_Climacteric>Climacteric</Stage_Climacteric>
|
<Stage_Climacteric>Climacteric</Stage_Climacteric>
|
||||||
<Stage_Anestrus>Anestrus</Stage_Anestrus>
|
<Stage_Anestrus>Anestrus</Stage_Anestrus>
|
||||||
|
<Stage_Follicular_Desc>The ovaries are preparing to release an egg. Ovulation will occur at the end of this phase.</Stage_Follicular_Desc>
|
||||||
|
<Stage_Follicular_Induced_Desc>The ovaries are preparing to release an egg. Ovulation will occur if semen enters the womb.</Stage_Follicular_Induced_Desc>
|
||||||
|
<Stage_Ovulatory_Desc>The ovaries are releasing an egg into the womb.</Stage_Ovulatory_Desc>
|
||||||
|
<Stage_Luteal_Desc>The womb is prepared to recieve a fertilized egg. Pregnancy will result if one implants before the end of the stage.</Stage_Luteal_Desc>
|
||||||
|
<Stage_Bleeding_Desc>The womb is shedding its lining, along with any eggs that failed to implant.</Stage_Bleeding_Desc>
|
||||||
|
<Stage_Pregnant_Desc>A baby is growing inside the womb. With time and care, it will become a new resident of this world.</Stage_Pregnant_Desc>
|
||||||
|
<Stage_Recover_Desc>The womb is recovering from its recent pregnancy.</Stage_Recover_Desc>
|
||||||
|
<Stage_None_Desc>The womb is not fertile and cannot become pregnant.</Stage_None_Desc>
|
||||||
|
<Stage_Climacteric_Desc>The ovaries have neared exhaustion and the menstrual cycle has become irregular.</Stage_Climacteric_Desc>
|
||||||
|
<Stage_Anestrus_Desc>The womb is out of breeding season. The cycle will resume once conditions are met.</Stage_Anestrus_Desc>
|
||||||
<Button_HealthTab>Status</Button_HealthTab>
|
<Button_HealthTab>Status</Button_HealthTab>
|
||||||
<Button_MilkTooltip>Lactate self</Button_MilkTooltip>
|
<Button_MilkTooltip>Lactate self</Button_MilkTooltip>
|
||||||
<Dialog_WombInfo01>State</Dialog_WombInfo01>
|
<Dialog_WombInfo01>State</Dialog_WombInfo01>
|
||||||
|
@ -29,6 +39,8 @@
|
||||||
<Dialog_DontCleanWomb_Tooltip>Store cum in womb</Dialog_DontCleanWomb_Tooltip>
|
<Dialog_DontCleanWomb_Tooltip>Store cum in womb</Dialog_DontCleanWomb_Tooltip>
|
||||||
<Dialog_FatherUnknown>Unknown</Dialog_FatherUnknown>
|
<Dialog_FatherUnknown>Unknown</Dialog_FatherUnknown>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Option1_Label_1>Enable womb icon</Option1_Label_1>
|
<Option1_Label_1>Enable womb icon</Option1_Label_1>
|
||||||
<Option1_Label_2>Enable button in health tab</Option1_Label_2>
|
<Option1_Label_2>Enable button in health tab</Option1_Label_2>
|
||||||
<Option2_Label>Enable animal cycle</Option2_Label>
|
<Option2_Label>Enable animal cycle</Option2_Label>
|
||||||
|
@ -109,7 +121,7 @@
|
||||||
<Option_EstrusRelationship_Label>Hookup minimum opinion in estrus</Option_EstrusRelationship_Label>
|
<Option_EstrusRelationship_Label>Hookup minimum opinion in estrus</Option_EstrusRelationship_Label>
|
||||||
<EstimatedCumLifespan>Estimated sperm lifespan</EstimatedCumLifespan>
|
<EstimatedCumLifespan>Estimated sperm lifespan</EstimatedCumLifespan>
|
||||||
<EstimatedEggLifespan>Estimated egg lifespan</EstimatedEggLifespan>
|
<EstimatedEggLifespan>Estimated egg lifespan</EstimatedEggLifespan>
|
||||||
<FertilityDesc>Chance of fertilization in the next hour: {0}% The chance of pregnancy of a fertilized egg. The white overlay indicates fertilization chance of sperm in womb.</FertilityDesc>
|
<FertilityDesc>Implantation chance of fertilized eggs. Chance of fertilization this hour: {0}%</FertilityDesc>
|
||||||
<Button_ResetToDefault>Reset to default</Button_ResetToDefault>
|
<Button_ResetToDefault>Reset to default</Button_ResetToDefault>
|
||||||
|
|
||||||
<Gizmo_GatherCum>Gather cum</Gizmo_GatherCum>
|
<Gizmo_GatherCum>Gather cum</Gizmo_GatherCum>
|
||||||
|
|
BIN
1.3/Textures/Ovaries/Ovary_00.png
Normal file
BIN
1.3/Textures/Ovaries/Ovary_00.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
1.3/Textures/Ovaries/Ovary_01.png
Normal file
BIN
1.3/Textures/Ovaries/Ovary_01.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
1.3/Textures/Ovaries/Ovary_02.png
Normal file
BIN
1.3/Textures/Ovaries/Ovary_02.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
|
@ -16,7 +16,7 @@ namespace RJW_Menstruation.Interactions
|
||||||
private bool WillingAndAble(Pawn fucker, Pawn fucked, bool visible)
|
private bool WillingAndAble(Pawn fucker, Pawn fucked, bool visible)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
HediffComp_Menstruation.IsInEstrus(fucked, visible)
|
fucked.IsInEstrus(visible)
|
||||||
&&
|
&&
|
||||||
PregnancyHelper.CanImpregnate(fucker, fucked);
|
PregnancyHelper.CanImpregnate(fucker, fucked);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,8 @@ namespace RJW_Menstruation
|
||||||
public const float VARIANT = 0.2f;
|
public const float VARIANT = 0.2f;
|
||||||
public const int TICKINTERVAL = 3750;
|
public const int TICKINTERVAL = 3750;
|
||||||
public const float MAX_BREAST_INCREMENT = 0.10f;
|
public const float MAX_BREAST_INCREMENT = 0.10f;
|
||||||
|
public const float BREAST_GROWTH_START = 1f / 6f;
|
||||||
|
public const float BREAST_GROWTH_END = 1f / 3f;
|
||||||
|
|
||||||
public CompProperties_Breast Props;
|
public CompProperties_Breast Props;
|
||||||
|
|
||||||
|
@ -282,7 +284,7 @@ namespace RJW_Menstruation
|
||||||
// Scenario B: Pregnant, grow in the second half of first trimester
|
// Scenario B: Pregnant, grow in the second half of first trimester
|
||||||
else if (parent.pawn.IsPregnant())
|
else if (parent.pawn.IsPregnant())
|
||||||
{
|
{
|
||||||
float pregnancySize = Mathf.InverseLerp(1f / 6f, 1f / 3f, parent.pawn.GetPregnancyProgress()) * MAX_BREAST_INCREMENT;
|
float pregnancySize = Mathf.InverseLerp(BREAST_GROWTH_START, BREAST_GROWTH_END, parent.pawn.GetPregnancyProgress()) * MAX_BREAST_INCREMENT;
|
||||||
if (breastSizeIncreased > pregnancySize)
|
if (breastSizeIncreased > pregnancySize)
|
||||||
{
|
{
|
||||||
debugGrowthStatus = "Shrinking due to being oversize for pregnancy";
|
debugGrowthStatus = "Shrinking due to being oversize for pregnancy";
|
||||||
|
|
|
@ -20,6 +20,22 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
public class HediffComp_InducedOvulator : HediffComp_Menstruation
|
public class HediffComp_InducedOvulator : HediffComp_Menstruation
|
||||||
{
|
{
|
||||||
|
public override string GetCurStageDesc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
switch (CurrentVisibleStage)
|
||||||
|
{
|
||||||
|
case Stage.Follicular:
|
||||||
|
return Translations.Stage_Follicular_Induced_Desc;
|
||||||
|
case Stage.ClimactericFollicular:
|
||||||
|
return Translations.Stage_Follicular_Induced_Desc + " " + Translations.Stage_Climacteric_Desc;
|
||||||
|
default:
|
||||||
|
return base.GetCurStageDesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void FollicularAction()
|
protected override void FollicularAction()
|
||||||
{
|
{
|
||||||
if (!IsBreedingSeason())
|
if (!IsBreedingSeason())
|
||||||
|
@ -29,8 +45,40 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
if (curStageHrs >= FollicularIntervalHours)
|
if (curStageHrs >= FollicularIntervalHours)
|
||||||
{
|
{
|
||||||
GoNextStage(Stage.Luteal);
|
|
||||||
estrusflag = false;
|
estrusflag = false;
|
||||||
|
lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor);
|
||||||
|
GoNextStage(Stage.Luteal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
if (!estrusflag && curStageHrs > FollicularIntervalHours - Props.estrusDaysBeforeOvulation * 24)
|
||||||
|
{
|
||||||
|
estrusflag = true;
|
||||||
|
SetEstrus(Props.eggLifespanDays + Props.estrusDaysBeforeOvulation);
|
||||||
|
}
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ClimactericFollicularAction()
|
||||||
|
{
|
||||||
|
if (!Configurations.EnableMenopause)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
else if (curStageHrs >= (follicularIntervalhours - bleedingIntervalhours) * CycleFactor)
|
||||||
|
{
|
||||||
|
estrusflag = false;
|
||||||
|
lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor);
|
||||||
|
GoNextStage(Stage.ClimactericLuteal);
|
||||||
|
}
|
||||||
|
else if (ovarypower < OvaryPowerThreshold / 3 && Rand.Range(0.0f, 1.0f) < 0.2f) // Might randomly skip to luteal early)
|
||||||
|
{
|
||||||
|
estrusflag = false;
|
||||||
|
lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor * 6);
|
||||||
|
GoNextStage(Stage.ClimactericLuteal);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -47,7 +95,13 @@ namespace RJW_Menstruation
|
||||||
protected override void AfterCumIn(Pawn cummer)
|
protected override void AfterCumIn(Pawn cummer)
|
||||||
{
|
{
|
||||||
base.AfterCumIn(cummer);
|
base.AfterCumIn(cummer);
|
||||||
if (curStage == Stage.Follicular || curStage == Stage.ClimactericFollicular) curStage = Stage.Ovulatory;
|
switch (curStage)
|
||||||
|
{
|
||||||
|
case Stage.Follicular:
|
||||||
|
case Stage.ClimactericFollicular:
|
||||||
|
curStage = Stage.Ovulatory;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsDangerDay
|
public override bool IsDangerDay
|
||||||
|
|
|
@ -65,7 +65,7 @@ namespace RJW_Menstruation
|
||||||
const float minmakefilthvalue = 1.0f;
|
const float minmakefilthvalue = 1.0f;
|
||||||
//const int ovarypowerthreshold = 72;
|
//const int ovarypowerthreshold = 72;
|
||||||
|
|
||||||
public static readonly int tickInterval = 2500; // an hour
|
public const int tickInterval = GenDate.TicksPerHour;
|
||||||
public CompProperties_Menstruation Props;
|
public CompProperties_Menstruation Props;
|
||||||
public Stage curStage = Stage.Follicular;
|
public Stage curStage = Stage.Follicular;
|
||||||
public int curStageHrs = 0;
|
public int curStageHrs = 0;
|
||||||
|
@ -302,6 +302,43 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public virtual string GetCurStageDesc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
switch (CurrentVisibleStage)
|
||||||
|
{
|
||||||
|
case Stage.Follicular:
|
||||||
|
return Translations.Stage_Follicular_Desc;
|
||||||
|
case Stage.Ovulatory:
|
||||||
|
return Translations.Stage_Ovulatory_Desc;
|
||||||
|
case Stage.Luteal:
|
||||||
|
return Translations.Stage_Luteal_Desc;
|
||||||
|
case Stage.Bleeding:
|
||||||
|
return Translations.Stage_Bleeding_Desc;
|
||||||
|
case Stage.Fertilized:
|
||||||
|
return Translations.Stage_Luteal_Desc;
|
||||||
|
case Stage.Pregnant:
|
||||||
|
return Translations.Stage_Pregnant_Desc;
|
||||||
|
case Stage.Recover:
|
||||||
|
return Translations.Stage_Recover_Desc;
|
||||||
|
case Stage.None:
|
||||||
|
case Stage.Young:
|
||||||
|
return Translations.Stage_None_Desc;
|
||||||
|
case Stage.ClimactericFollicular:
|
||||||
|
return Translations.Stage_Follicular_Desc + " " + Translations.Stage_Climacteric_Desc;
|
||||||
|
case Stage.ClimactericLuteal:
|
||||||
|
return Translations.Stage_Luteal_Desc + " " + Translations.Stage_Climacteric_Desc;
|
||||||
|
case Stage.ClimactericBleeding:
|
||||||
|
return Translations.Stage_Bleeding_Desc + " " + Translations.Stage_Climacteric_Desc;
|
||||||
|
case Stage.Anestrus:
|
||||||
|
return Translations.Stage_Anestrus_Desc;
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string WombTex
|
public string WombTex
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -382,6 +419,15 @@ namespace RJW_Menstruation
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public IEnumerable<Pawn> GetCummersAndFertilizers()
|
||||||
|
{
|
||||||
|
if (!cums.NullOrEmpty())
|
||||||
|
foreach (Cum cum in cums)
|
||||||
|
yield return cum.pawn;
|
||||||
|
if (!eggs.NullOrEmpty())
|
||||||
|
foreach (Egg egg in eggs)
|
||||||
|
yield return egg.fertilizer;
|
||||||
|
}
|
||||||
public bool IsEggExist
|
public bool IsEggExist
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -1025,12 +1071,6 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsInEstrus(Pawn pawn, bool visible = true)
|
|
||||||
{
|
|
||||||
if (pawn.Dead) return false;
|
|
||||||
return pawn.health?.hediffSet?.HasHediff(visible ? VariousDefOf.Hediff_Estrus : VariousDefOf.Hediff_Estrus_Concealed) ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetEstrus(int days)
|
public void SetEstrus(int days)
|
||||||
{
|
{
|
||||||
HediffDef estrusdef = Props.concealedEstrus ? VariousDefOf.Hediff_Estrus_Concealed : VariousDefOf.Hediff_Estrus;
|
HediffDef estrusdef = Props.concealedEstrus ? VariousDefOf.Hediff_Estrus_Concealed : VariousDefOf.Hediff_Estrus;
|
||||||
|
@ -1056,39 +1096,57 @@ namespace RJW_Menstruation
|
||||||
switch (GenLocalDate.Season(map))
|
switch (GenLocalDate.Season(map))
|
||||||
{
|
{
|
||||||
case Season.Spring:
|
case Season.Spring:
|
||||||
if ((Props.breedingSeason & SeasonalBreed.Spring) != 0) return true;
|
return (Props.breedingSeason & SeasonalBreed.Spring) != 0;
|
||||||
break;
|
|
||||||
case Season.Summer:
|
case Season.Summer:
|
||||||
case Season.PermanentSummer:
|
case Season.PermanentSummer:
|
||||||
if ((Props.breedingSeason & SeasonalBreed.Summer) != 0) return true;
|
return (Props.breedingSeason & SeasonalBreed.Summer) != 0;
|
||||||
break;
|
|
||||||
case Season.Fall:
|
case Season.Fall:
|
||||||
if ((Props.breedingSeason & SeasonalBreed.Fall) != 0) return true;
|
return (Props.breedingSeason & SeasonalBreed.Fall) != 0;
|
||||||
break;
|
|
||||||
case Season.Winter:
|
case Season.Winter:
|
||||||
case Season.PermanentWinter:
|
case Season.PermanentWinter:
|
||||||
if ((Props.breedingSeason & SeasonalBreed.Winter) != 0) return true;
|
return (Props.breedingSeason & SeasonalBreed.Winter) != 0;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Pawn Fertilize()
|
protected Pawn Fertilize()
|
||||||
{
|
{
|
||||||
if (cums.NullOrEmpty()) return null;
|
if (cums.NullOrEmpty()) return null;
|
||||||
foreach (Cum cum in cums)
|
List<Cum> eligibleCum = cums.FindAll(cum => cum.FertVolume > 0 && cum.pawn != null && (RJWPregnancySettings.bestial_pregnancy_enabled || xxx.is_animal(parent.pawn) == xxx.is_animal(cum.pawn)));
|
||||||
{
|
if (eligibleCum.Count == 0) return null;
|
||||||
float rand = Rand.Range(0.0f, 1.0f);
|
|
||||||
if (cum.pawn != null && !cum.notcum && rand < cum.FertVolume * cum.fertFactor * Configurations.FertilizeChance * Props.basefertilizationChanceFactor)
|
float totalFertPower = 0;
|
||||||
{
|
foreach (Cum cum in eligibleCum)
|
||||||
if (!RJWPregnancySettings.bestial_pregnancy_enabled && (xxx.is_animal(parent.pawn) ^ xxx.is_animal(cum.pawn))) continue;
|
totalFertPower += cum.FertVolume;
|
||||||
parent.pawn.records.AddTo(VariousDefOf.AmountofFertilizedEggs, 1);
|
|
||||||
return cum.pawn;
|
if (Rand.Range(0.0f, 1.0f) > totalFertPower * Configurations.FertilizeChance * Props.basefertilizationChanceFactor)
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
parent.pawn.records.AddTo(VariousDefOf.AmountofFertilizedEggs, 1);
|
||||||
|
float selection = Rand.Range(0.0f, totalFertPower);
|
||||||
|
|
||||||
|
foreach (Cum cum in eligibleCum)
|
||||||
|
{
|
||||||
|
selection -= cum.FertVolume;
|
||||||
|
if (selection <= 0) return cum.pawn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We shouldn't reach here, but floating point errors exist, so just to be sure, select whomever came the most
|
||||||
|
|
||||||
|
float mostCum = 0;
|
||||||
|
Pawn mostCummer = null;
|
||||||
|
|
||||||
|
foreach (Cum cum in eligibleCum)
|
||||||
|
{
|
||||||
|
if(cum.FertVolume > mostCum)
|
||||||
|
{
|
||||||
|
mostCum = cum.FertVolume;
|
||||||
|
mostCummer = cum.pawn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mostCummer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1427,6 +1485,31 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual void RecoverAction()
|
||||||
|
{
|
||||||
|
if (curStageHrs >= recoveryIntervalhours)
|
||||||
|
{
|
||||||
|
if (Configurations.EnableMenopause && ovarypower < OvaryPowerThreshold)
|
||||||
|
{
|
||||||
|
GoNextStage(Stage.ClimactericFollicular);
|
||||||
|
}
|
||||||
|
else if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) == 0)
|
||||||
|
{
|
||||||
|
GoNextStage(Stage.Young);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor);
|
||||||
|
GoNextStage(Stage.Follicular);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual void YoungAction()
|
protected virtual void YoungAction()
|
||||||
{
|
{
|
||||||
if (!Configurations.EnableMenopause && ovarypower < 0 && ovarypower > -10000)
|
if (!Configurations.EnableMenopause && ovarypower < 0 && ovarypower > -10000)
|
||||||
|
@ -1440,6 +1523,97 @@ namespace RJW_Menstruation
|
||||||
else GoNextStage(Stage.Follicular);
|
else GoNextStage(Stage.Follicular);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual void ClimactericFollicularAction()
|
||||||
|
{
|
||||||
|
if (!Configurations.EnableMenopause)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
else if (curStageHrs >= (follicularIntervalhours - bleedingIntervalhours) * CycleFactor)
|
||||||
|
{
|
||||||
|
GoNextStage(Stage.Ovulatory);
|
||||||
|
}
|
||||||
|
else if (ovarypower < OvaryPowerThreshold / 3 && Rand.Range(0.0f, 1.0f) < 0.2f) //skips ovulatory
|
||||||
|
{
|
||||||
|
lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor * 6);
|
||||||
|
GoNextStage(Stage.ClimactericLuteal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void ClimactericLutealAction()
|
||||||
|
{
|
||||||
|
if (!Configurations.EnableMenopause)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
else if (!eggs.NullOrEmpty())
|
||||||
|
{
|
||||||
|
FertilizationCheck();
|
||||||
|
EggDecay();
|
||||||
|
if (Implant()) GoNextStage(Stage.Pregnant);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (curStageHrs <= lutealIntervalhours)
|
||||||
|
{
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eggs.Clear();
|
||||||
|
if (Props.bleedingIntervalDays == 0)
|
||||||
|
{
|
||||||
|
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
||||||
|
GoNextStage(Stage.ClimactericFollicular);
|
||||||
|
}
|
||||||
|
else if (ovarypower < OvaryPowerThreshold / 4 || (ovarypower < OvaryPowerThreshold / 3 && Rand.Range(0.0f, 1.0f) < 0.3f)) //skips bleeding
|
||||||
|
{
|
||||||
|
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
||||||
|
GoNextStage(Stage.ClimactericFollicular);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor);
|
||||||
|
if (crampPain >= 0.05f)
|
||||||
|
{
|
||||||
|
AddCrampPain();
|
||||||
|
}
|
||||||
|
GoNextStage(Stage.ClimactericBleeding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void ClimactericBleedingAction()
|
||||||
|
{
|
||||||
|
if (!Configurations.EnableMenopause)
|
||||||
|
{
|
||||||
|
RemoveClimactericEffect();
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
else if (curStageHrs >= bleedingIntervalhours)
|
||||||
|
{
|
||||||
|
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
||||||
|
GoNextStage(Stage.ClimactericFollicular);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (curStageHrs < bleedingIntervalhours / 6) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut();
|
||||||
|
curStageHrs += Configurations.CycleAcceleration;
|
||||||
|
StayCurrentStage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual void AnestrusAction()
|
protected virtual void AnestrusAction()
|
||||||
{
|
{
|
||||||
if (IsBreedingSeason())
|
if (IsBreedingSeason())
|
||||||
|
@ -1478,10 +1652,13 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
else if (parent.pawn.relations.OpinionOf(cummer) <= -5)
|
else if (parent.pawn.relations.OpinionOf(cummer) <= -5)
|
||||||
{
|
{
|
||||||
|
parent.pawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(VariousDefOf.CameInsideF, cummer);
|
||||||
|
parent.pawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(VariousDefOf.HaterCameInsideFEstrus, cummer);
|
||||||
parent.pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer);
|
parent.pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.HaterCameInsideF, cummer);
|
||||||
}
|
}
|
||||||
else if (IsInEstrus(parent.pawn) && parent.pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup)
|
else if (parent.pawn.IsInEstrus() && parent.pawn.relations.OpinionOf(cummer) < RJWHookupSettings.MinimumRelationshipToHookup)
|
||||||
{
|
{
|
||||||
|
parent.pawn.needs.mood.thoughts.memories.RemoveMemoriesOfDefWhereOtherPawnIs(VariousDefOf.CameInsideF, cummer);
|
||||||
parent.pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer);
|
parent.pawn.needs.mood.thoughts.memories.TryGainMemory(VariousDefOf.HaterCameInsideFEstrus, cummer);
|
||||||
}
|
}
|
||||||
else if (!parent.pawn.relations.DirectRelationExists(PawnRelationDefOf.Spouse, cummer) && !parent.pawn.relations.DirectRelationExists(PawnRelationDefOf.Fiance, cummer))
|
else if (!parent.pawn.relations.DirectRelationExists(PawnRelationDefOf.Spouse, cummer) && !parent.pawn.relations.DirectRelationExists(PawnRelationDefOf.Fiance, cummer))
|
||||||
|
@ -1534,30 +1711,7 @@ namespace RJW_Menstruation
|
||||||
action = PregnantAction;
|
action = PregnantAction;
|
||||||
break;
|
break;
|
||||||
case Stage.Recover:
|
case Stage.Recover:
|
||||||
action = delegate
|
action = RecoverAction;
|
||||||
{
|
|
||||||
if (curStageHrs >= recoveryIntervalhours)
|
|
||||||
{
|
|
||||||
if (Configurations.EnableMenopause && ovarypower < OvaryPowerThreshold)
|
|
||||||
{
|
|
||||||
GoNextStage(Stage.ClimactericFollicular);
|
|
||||||
}
|
|
||||||
else if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) == 0)
|
|
||||||
{
|
|
||||||
GoNextStage(Stage.Young);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor);
|
|
||||||
GoNextStage(Stage.Follicular);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
curStageHrs += Configurations.CycleAcceleration;
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case Stage.None:
|
case Stage.None:
|
||||||
action = delegate
|
action = delegate
|
||||||
|
@ -1569,99 +1723,13 @@ namespace RJW_Menstruation
|
||||||
action = YoungAction;
|
action = YoungAction;
|
||||||
break;
|
break;
|
||||||
case Stage.ClimactericFollicular:
|
case Stage.ClimactericFollicular:
|
||||||
action = delegate
|
action = ClimactericFollicularAction;
|
||||||
{
|
|
||||||
if (!Configurations.EnableMenopause)
|
|
||||||
{
|
|
||||||
RemoveClimactericEffect();
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
else if (curStageHrs >= (follicularIntervalhours - bleedingIntervalhours) * CycleFactor)
|
|
||||||
{
|
|
||||||
GoNextStage(Stage.Ovulatory);
|
|
||||||
}
|
|
||||||
else if (ovarypower < OvaryPowerThreshold / 3 && Rand.Range(0.0f, 1.0f) < 0.2f) //skips ovulatory
|
|
||||||
{
|
|
||||||
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
|
||||||
GoNextStage(Stage.ClimactericFollicular);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
curStageHrs += Configurations.CycleAcceleration;
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case Stage.ClimactericLuteal:
|
case Stage.ClimactericLuteal:
|
||||||
action = delegate
|
action = ClimactericLutealAction;
|
||||||
{
|
|
||||||
if (!Configurations.EnableMenopause)
|
|
||||||
{
|
|
||||||
RemoveClimactericEffect();
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
else if (!eggs.NullOrEmpty())
|
|
||||||
{
|
|
||||||
FertilizationCheck();
|
|
||||||
EggDecay();
|
|
||||||
if (Implant()) GoNextStage(Stage.Pregnant);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
curStageHrs += Configurations.CycleAcceleration;
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (curStageHrs <= lutealIntervalhours)
|
|
||||||
{
|
|
||||||
curStageHrs += Configurations.CycleAcceleration;
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
eggs.Clear();
|
|
||||||
if (Props.bleedingIntervalDays == 0)
|
|
||||||
{
|
|
||||||
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
|
||||||
GoNextStage(Stage.ClimactericFollicular);
|
|
||||||
}
|
|
||||||
else if (ovarypower < OvaryPowerThreshold / 4 || (ovarypower < OvaryPowerThreshold / 3 && Rand.Range(0.0f, 1.0f) < 0.3f)) //skips bleeding
|
|
||||||
{
|
|
||||||
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
|
||||||
GoNextStage(Stage.ClimactericFollicular);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor);
|
|
||||||
if (crampPain >= 0.05f)
|
|
||||||
{
|
|
||||||
AddCrampPain();
|
|
||||||
}
|
|
||||||
GoNextStage(Stage.ClimactericBleeding);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case Stage.ClimactericBleeding:
|
case Stage.ClimactericBleeding:
|
||||||
action = delegate
|
action = ClimactericBleedingAction;
|
||||||
{
|
|
||||||
if (!Configurations.EnableMenopause)
|
|
||||||
{
|
|
||||||
RemoveClimactericEffect();
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
else if (curStageHrs >= bleedingIntervalhours)
|
|
||||||
{
|
|
||||||
follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor * 6);
|
|
||||||
GoNextStage(Stage.ClimactericFollicular);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (curStageHrs < bleedingIntervalhours / 6) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut();
|
|
||||||
curStageHrs += Configurations.CycleAcceleration;
|
|
||||||
StayCurrentStage();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case Stage.Anestrus:
|
case Stage.Anestrus:
|
||||||
action = AnestrusAction;
|
action = AnestrusAction;
|
||||||
|
|
|
@ -155,33 +155,55 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
return wombtex;
|
return wombtex;
|
||||||
}
|
}
|
||||||
public static Texture2D GetEggIcon(this HediffComp_Menstruation comp)
|
public static Texture2D GetEggIcon(this HediffComp_Menstruation comp, bool includeOvary)
|
||||||
{
|
{
|
||||||
if (comp.parent.pawn.IsPregnant(Configurations.InfoDetail != Configurations.DetailLevel.All))
|
if (comp.parent.pawn.IsPregnant(Configurations.InfoDetail != Configurations.DetailLevel.All))
|
||||||
{
|
{
|
||||||
if (comp.parent.pawn.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
|
if (comp.parent.pawn.GetPregnancyProgress() < 0.2f) return ContentFinder<Texture2D>.Get("Eggs/Egg_Implanted00", true);
|
||||||
else return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
else return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
||||||
}
|
}
|
||||||
else if (!comp.IsEggExist) return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
|
||||||
else
|
switch(comp.curStage)
|
||||||
{
|
{
|
||||||
|
case HediffComp_Menstruation.Stage.Follicular:
|
||||||
|
case HediffComp_Menstruation.Stage.ClimactericFollicular:
|
||||||
|
if (!includeOvary) break;
|
||||||
|
if (comp is HediffComp_InducedOvulator) break;
|
||||||
|
if (comp.curStageHrs > comp.FollicularIntervalHours - 30) // Approximate time for ovulation to occur
|
||||||
|
return ContentFinder<Texture2D>.Get("Ovaries/Ovary_01", true);
|
||||||
|
else break;
|
||||||
|
case HediffComp_Menstruation.Stage.Ovulatory:
|
||||||
|
if (!includeOvary) break;
|
||||||
|
return ContentFinder<Texture2D>.Get("Ovaries/Ovary_02", true);
|
||||||
|
case HediffComp_Menstruation.Stage.Luteal:
|
||||||
|
case HediffComp_Menstruation.Stage.ClimactericLuteal:
|
||||||
|
if (!comp.IsEggExist) break;
|
||||||
int fertstage = comp.IsFertilized;
|
int fertstage = comp.IsFertilized;
|
||||||
if (fertstage >= 0)
|
if (fertstage >= 0)
|
||||||
{
|
{
|
||||||
if (fertstage < 1) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized00", true);
|
if (fertstage <= comp.CycleFactor) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing02", true);
|
||||||
else if (fertstage < 24) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized01", true);
|
if (fertstage <= 18) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized00", true);
|
||||||
|
else if (fertstage <= 54) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized01", true);
|
||||||
else return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized02", true);
|
else return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilized02", true);
|
||||||
}
|
}
|
||||||
else if (comp.IsEggFertilizing) return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing01", true);
|
else if (comp.IsEggFertilizing)
|
||||||
|
{
|
||||||
|
if (comp.GetFertilityChance() < 0.5f)
|
||||||
|
return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing00", true);
|
||||||
|
else
|
||||||
|
return ContentFinder<Texture2D>.Get("Eggs/Egg_Fertilizing01", true);
|
||||||
|
}
|
||||||
else return ContentFinder<Texture2D>.Get("Eggs/Egg", true);
|
else return ContentFinder<Texture2D>.Get("Eggs/Egg", true);
|
||||||
}
|
}
|
||||||
|
return ContentFinder<Texture2D>.Get("Womb/Empty", true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawEggOverlay(this HediffComp_Menstruation comp, Rect wombRect)
|
public static void DrawEggOverlay(this HediffComp_Menstruation comp, Rect wombRect, bool includeOvary)
|
||||||
{
|
{
|
||||||
Rect rect = new Rect(wombRect.xMax - wombRect.width / 3, wombRect.y, wombRect.width / 3, wombRect.width / 3);
|
Rect rect = new Rect(wombRect.xMax - wombRect.width / 3, wombRect.y, wombRect.width / 3, wombRect.width / 3);
|
||||||
GUI.color = Color.white;
|
GUI.color = Color.white;
|
||||||
GUI.DrawTexture(rect, comp.GetEggIcon(), ScaleMode.ScaleToFit);
|
GUI.DrawTexture(rect, comp.GetEggIcon(includeOvary), ScaleMode.ScaleToFit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -257,7 +279,11 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
else return (hediff.p_end_tick - hediff.p_start_tick) / GenDate.TicksPerHour;
|
else return (hediff.p_end_tick - hediff.p_start_tick) / GenDate.TicksPerHour;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsInEstrus(this Pawn pawn, bool visible = true)
|
||||||
|
{
|
||||||
|
if (pawn.Dead) return false;
|
||||||
|
return pawn.health?.hediffSet?.HasHediff(visible ? VariousDefOf.Hediff_Estrus : VariousDefOf.Hediff_Estrus_Concealed) ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using HarmonyLib;
|
||||||
|
using Verse;
|
||||||
|
using RimWorld;
|
||||||
|
using RimWorld.Planet;
|
||||||
|
|
||||||
|
namespace RJW_Menstruation.Patch
|
||||||
|
{
|
||||||
|
[HarmonyPatch(typeof(WorldPawnGC), "GetCriticalPawnReason")]
|
||||||
|
public static class GetCriticalPawnReason_Patch
|
||||||
|
{
|
||||||
|
readonly public static HashSet<Pawn> cummedPawns = new HashSet<Pawn>();
|
||||||
|
|
||||||
|
public static void Postfix(ref string __result, Pawn pawn)
|
||||||
|
{
|
||||||
|
if (!__result.NullOrEmpty()) return;
|
||||||
|
if (cummedPawns.Contains(pawn))
|
||||||
|
__result = "Has cum or fertilized egg in a womb";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(WorldPawnGC), "AccumulatePawnGCData")]
|
||||||
|
public static class PawnGCPass_Patch
|
||||||
|
{
|
||||||
|
public static void Prefix()
|
||||||
|
{
|
||||||
|
GetCriticalPawnReason_Patch.cummedPawns.Clear();
|
||||||
|
// foreach(Pawn p in PawnsFinder.All_AliveOrDead)
|
||||||
|
foreach(Pawn p in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_OfPlayerFaction.Union(PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_PrisonersOfColony))
|
||||||
|
{
|
||||||
|
HediffComp_Menstruation comp = p.GetMenstruationComp();
|
||||||
|
if (comp is null) continue;
|
||||||
|
GetCriticalPawnReason_Patch.cummedPawns.UnionWith(comp.GetCummersAndFertilizers());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -168,15 +168,15 @@ namespace RJW_Menstruation
|
||||||
}
|
}
|
||||||
public static void Postfix(ref float __result, Pawn fucker, Pawn fucked)
|
public static void Postfix(ref float __result, Pawn fucker, Pawn fucked)
|
||||||
{
|
{
|
||||||
if (HediffComp_Menstruation.IsInEstrus(fucker, true) && PregnancyHelper.CanImpregnate(fucked, fucker))
|
if (fucker.IsInEstrus(true) && PregnancyHelper.CanImpregnate(fucked, fucker))
|
||||||
{
|
{
|
||||||
__result *= (1f + GetNetFertility(fucker, fucked) / 4);
|
__result *= (1f + GetNetFertility(fucker, fucked) / 4);
|
||||||
}
|
}
|
||||||
else if (HediffComp_Menstruation.IsInEstrus(fucker, false) && PregnancyHelper.CanImpregnate(fucked, fucker))
|
else if (fucker.IsInEstrus(false) && PregnancyHelper.CanImpregnate(fucked, fucker))
|
||||||
{
|
{
|
||||||
__result *= (1f + GetNetFertility(fucker, fucked) / 40);
|
__result *= (1f + GetNetFertility(fucker, fucked) / 40);
|
||||||
}
|
}
|
||||||
else if(xxx.is_animal(fucker) && HediffComp_Menstruation.IsInEstrus(fucked, true) && PregnancyHelper.CanImpregnate(fucker, fucked))
|
else if(xxx.is_animal(fucker) && fucked.IsInEstrus(true) && PregnancyHelper.CanImpregnate(fucker, fucked))
|
||||||
{
|
{
|
||||||
__result *= 1.25f;
|
__result *= 1.25f;
|
||||||
}
|
}
|
||||||
|
@ -188,7 +188,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
private static float FuckabilityThreshold(Pawn pawn, Pawn partner)
|
private static float FuckabilityThreshold(Pawn pawn, Pawn partner)
|
||||||
{
|
{
|
||||||
return (Configurations.EstrusOverridesHookupSettings && HediffComp_Menstruation.IsInEstrus(pawn) && PregnancyHelper.CanImpregnate(partner, pawn))
|
return (Configurations.EstrusOverridesHookupSettings && pawn.IsInEstrus() && PregnancyHelper.CanImpregnate(partner, pawn))
|
||||||
? Configurations.EstrusFuckabilityToHookup : RJWHookupSettings.MinimumFuckabilityToHookup;
|
? Configurations.EstrusFuckabilityToHookup : RJWHookupSettings.MinimumFuckabilityToHookup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,12 +217,12 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
private static float AttractivenessThreshold(Pawn pawn, Pawn partner)
|
private static float AttractivenessThreshold(Pawn pawn, Pawn partner)
|
||||||
{
|
{
|
||||||
return (Configurations.EstrusOverridesHookupSettings && HediffComp_Menstruation.IsInEstrus(pawn) && PregnancyHelper.CanImpregnate(partner, pawn))
|
return (Configurations.EstrusOverridesHookupSettings && pawn.IsInEstrus() && PregnancyHelper.CanImpregnate(partner, pawn))
|
||||||
? Configurations.EstrusAttractivenessToHookup : RJWHookupSettings.MinimumAttractivenessToHookup;
|
? Configurations.EstrusAttractivenessToHookup : RJWHookupSettings.MinimumAttractivenessToHookup;
|
||||||
}
|
}
|
||||||
private static float RelationshipThreshold(Pawn pawn, Pawn partner)
|
private static float RelationshipThreshold(Pawn pawn, Pawn partner)
|
||||||
{
|
{
|
||||||
return (Configurations.EstrusOverridesHookupSettings && HediffComp_Menstruation.IsInEstrus(pawn) && PregnancyHelper.CanImpregnate(partner, pawn))
|
return (Configurations.EstrusOverridesHookupSettings && pawn.IsInEstrus() && PregnancyHelper.CanImpregnate(partner, pawn))
|
||||||
? Configurations.EstrusRelationshipToHookup : RJWHookupSettings.MinimumRelationshipToHookup;
|
? Configurations.EstrusRelationshipToHookup : RJWHookupSettings.MinimumRelationshipToHookup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@
|
||||||
<Compile Include="HediffComps\HediffComp_InducedOvulator.cs" />
|
<Compile Include="HediffComps\HediffComp_InducedOvulator.cs" />
|
||||||
<Compile Include="HediffComps\MenstruationUtility.cs" />
|
<Compile Include="HediffComps\MenstruationUtility.cs" />
|
||||||
<Compile Include="IngestionOutcomeDoers.cs" />
|
<Compile Include="IngestionOutcomeDoers.cs" />
|
||||||
|
<Compile Include="Patch\GC_Patch.cs" />
|
||||||
<Compile Include="Recipe_Surgery.cs" />
|
<Compile Include="Recipe_Surgery.cs" />
|
||||||
<Compile Include="UI\Dialog_HybridCustom.cs" />
|
<Compile Include="UI\Dialog_HybridCustom.cs" />
|
||||||
<Compile Include="UI\Dialog_WombStatus.cs" />
|
<Compile Include="UI\Dialog_WombStatus.cs" />
|
||||||
|
|
|
@ -17,6 +17,16 @@ namespace RJW_Menstruation
|
||||||
public static readonly string Stage_None = "Stage_None".Translate();
|
public static readonly string Stage_None = "Stage_None".Translate();
|
||||||
public static readonly string Stage_Climacteric = "Stage_Climacteric".Translate();
|
public static readonly string Stage_Climacteric = "Stage_Climacteric".Translate();
|
||||||
public static readonly string Stage_Anestrus = "Stage_Anestrus".Translate();
|
public static readonly string Stage_Anestrus = "Stage_Anestrus".Translate();
|
||||||
|
public static readonly string Stage_Follicular_Desc = "Stage_Follicular_Desc".Translate();
|
||||||
|
public static readonly string Stage_Follicular_Induced_Desc = "Stage_Follicular_Induced_Desc".Translate();
|
||||||
|
public static readonly string Stage_Ovulatory_Desc = "Stage_Ovulatory_Desc".Translate();
|
||||||
|
public static readonly string Stage_Luteal_Desc = "Stage_Luteal_Desc".Translate();
|
||||||
|
public static readonly string Stage_Bleeding_Desc = "Stage_Bleeding_Desc".Translate();
|
||||||
|
public static readonly string Stage_Pregnant_Desc = "Stage_Pregnant_Desc".Translate();
|
||||||
|
public static readonly string Stage_Recover_Desc = "Stage_Recover_Desc".Translate();
|
||||||
|
public static readonly string Stage_None_Desc = "Stage_None_Desc".Translate();
|
||||||
|
public static readonly string Stage_Climacteric_Desc = "Stage_Climacteric_Desc".Translate();
|
||||||
|
public static readonly string Stage_Anestrus_Desc = "Stage_Anestrus_Desc".Translate();
|
||||||
public static readonly string Button_HealthTab = "Button_HealthTab".Translate();
|
public static readonly string Button_HealthTab = "Button_HealthTab".Translate();
|
||||||
public static readonly string Button_MilkTooltip = "Button_MilkTooltip".Translate();
|
public static readonly string Button_MilkTooltip = "Button_MilkTooltip".Translate();
|
||||||
public static readonly string Dialog_DoCleanWomb_Tooltip = "Dialog_DoCleanWomb_Tooltip".Translate();
|
public static readonly string Dialog_DoCleanWomb_Tooltip = "Dialog_DoCleanWomb_Tooltip".Translate();
|
||||||
|
|
|
@ -242,7 +242,7 @@ namespace RJW_Menstruation
|
||||||
|
|
||||||
if (Configurations.DrawEggOverlay)
|
if (Configurations.DrawEggOverlay)
|
||||||
{
|
{
|
||||||
comp.DrawEggOverlay(wombRect);
|
comp.DrawEggOverlay(wombRect, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -257,6 +257,7 @@ namespace RJW_Menstruation
|
||||||
GUI.Box(wombInfoRect, Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel, buttonstyle);
|
GUI.Box(wombInfoRect, Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel, buttonstyle);
|
||||||
Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);
|
Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);
|
||||||
GUI.color = Color.white;
|
GUI.color = Color.white;
|
||||||
|
TooltipHandler.TipRegion(wombInfoRect, comp.GetCurStageDesc);
|
||||||
|
|
||||||
|
|
||||||
fontstyleright.normal.textColor = Color.red;
|
fontstyleright.normal.textColor = Color.red;
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace RJW_Menstruation
|
||||||
GUI.color = color;
|
GUI.color = color;
|
||||||
Widgets.DrawTextureFitted(rect, overay, iconDrawScale * 0.85f, iconProportions, iconTexCoords, iconAngle, buttonMat);
|
Widgets.DrawTextureFitted(rect, overay, iconDrawScale * 0.85f, iconProportions, iconTexCoords, iconAngle, buttonMat);
|
||||||
GUI.color = Color.white;
|
GUI.color = Color.white;
|
||||||
if (Configurations.DrawEggOverlay) comp.DrawEggOverlay(rect);
|
if (Configurations.DrawEggOverlay) comp.DrawEggOverlay(rect, false);
|
||||||
Rect progressRect = new Rect(rect.x + 2f, rect.y, rect.width - 4f, progressbarHeight);
|
Rect progressRect = new Rect(rect.x + 2f, rect.y, rect.width - 4f, progressbarHeight);
|
||||||
Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);
|
Widgets.FillableBar(progressRect, comp.StageProgress, comp.GetStageTexture);
|
||||||
|
|
||||||
|
|
|
@ -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.6.4</version>
|
<version>1.0.6.5</version>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<incompatibleWith />
|
<incompatibleWith />
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
Version 1.0.6.5
|
||||||
|
- Handle climacteric induced ovulators a bit better.
|
||||||
|
- Compatibility update for Sexperience 1.0.4.2
|
||||||
|
- Add a brief description when mousing over the current phase in the womb dialog.
|
||||||
|
- Add an ovary image to the womb status dialog (but not the little icon) when ovulation is imminent or occuring.
|
||||||
|
- Redone algorithm for paternity selection upon an egg being fertilized, to make for a fairer contest when there is lots of sperm from multiple people.
|
||||||
|
- NPC pawns with cum inside a pawn of your faction (or a prisoner you're holding) won't be removed by the garbage collector early.
|
||||||
|
|
||||||
Version 1.0.6.4
|
Version 1.0.6.4
|
||||||
- Fix a bug with pawns not being generated.
|
- Fix a bug with pawns not being generated.
|
||||||
- Fix ovary initialization for races with invalid litter sizes.
|
- Fix ovary initialization for races with invalid litter sizes.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue