added absorbers

This commit is contained in:
moreoreganostodump 2021-02-13 00:24:54 +09:00
parent fb170aacb2
commit bf20fc3ceb
26 changed files with 559 additions and 35 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Manifest>
<identifier>RJW Menstruation</identifier>
<version>1.0.1.0</version>
<version>1.0.1.1</version>
<dependencies>
</dependencies>
<incompatibleWith />

Binary file not shown.

View File

@ -12,7 +12,7 @@
<rotatable>false</rotatable>
<statBases>
<WorkToMake>2400</WorkToMake>
<MarketValue>120</MarketValue>
<MarketValue>160</MarketValue>
<Mass>0.05</Mass>
</statBases>
<techLevel>Industrial</techLevel>
@ -46,4 +46,52 @@
</li>
</comps>
</ThingDef>
<ThingDef ParentName="MakeableDrugPillBase">
<defName>SuperovulationInducingAgent</defName>
<label>Superovulation inducing agent</label>
<description>Induce superovulation&#10;&#10;May cause early menopause</description>
<graphicData>
<texPath>Things/Item/SIA</texPath>
<graphicClass>Graphic_StackCount</graphicClass>
</graphicData>
<rotatable>false</rotatable>
<statBases>
<WorkToMake>2400</WorkToMake>
<MarketValue>140</MarketValue>
<Mass>0.05</Mass>
</statBases>
<techLevel>Industrial</techLevel>
<ingestible>
<drugCategory>Medical</drugCategory>
<outcomeDoers>
<li Class="RJW_Menstruation.SuperOvulationOutcomDoer">
</li>
</outcomeDoers>
</ingestible>
<recipeMaker>
<researchPrerequisite>DrugProduction</researchPrerequisite>
<recipeUsers>
<li>DrugLab</li>
</recipeUsers>
</recipeMaker>
<costList>
<MedicineHerbal>12</MedicineHerbal>
<Neutroamine>6</Neutroamine>
</costList>
<comps>
<li Class="CompProperties_Drug">
<addictiveness>0</addictiveness>
<listOrder>1000</listOrder>
<overdoseSeverityOffset>
<min>0.08</min>
<max>0.14</max>
</overdoseSeverityOffset>
</li>
</comps>
</ThingDef>
</Defs>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<StatDef>
<defName>MaxAbsorbable</defName>
<label>Absorbable</label>
<description>Maximum fluids can be absorbed.</description>
<category>Apparel</category>
<minValue>0</minValue>
<toStringStyle>FloatOne</toStringStyle>
<formatString>{0} ml</formatString>
<showIfUndefined>false</showIfUndefined>
<displayPriorityInCategory>60</displayPriorityInCategory>
<parts>
<li Class="StatPart_Quality">
<factorAwful>0.5</factorAwful>
<factorPoor>0.8</factorPoor>
<factorNormal>1</factorNormal>
<factorGood>1.2</factorGood>
<factorExcellent>1.4</factorExcellent>
<factorMasterwork>2.0</factorMasterwork>
<factorLegendary>5.0</factorLegendary>
</li>
</parts>
</StatDef>
</Defs>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ApparelLayerDef>
<defName>Absorber</defName>
<label>genital</label>
<drawOrder>500</drawOrder>
</ApparelLayerDef>
</Defs>

View File

@ -0,0 +1,239 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="ApparelNoQualityBase">
<defName>Absorber_Tampon</defName>
<label>tampon</label>
<description>A tampon for absorbing fluids from vagina</description>
<thingClass>RJW_Menstruation.Absorber_Tampon</thingClass>
<graphicData>
<texPath>Things/Item/Tampon</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<tickerType>Never</tickerType>
<smeltable>false</smeltable>
<statBases>
<MaxHitPoints>20</MaxHitPoints>
<Mass>0.01</Mass>
<WorkToMake>1000</WorkToMake>
<Flammability>1.0</Flammability>
<EquipDelay>2</EquipDelay>
<MaxAbsorbable>10</MaxAbsorbable>
</statBases>
<costStuffCount>5</costStuffCount>
<stuffCategories>
<li>Fabric</li>
</stuffCategories>
<recipeMaker>
<unfinishedThingDef>UnfinishedApparel</unfinishedThingDef>
<researchPrerequisite>ComplexClothing</researchPrerequisite>
<workSpeedStat>GeneralLaborSpeed</workSpeedStat>
<workSkill>Crafting</workSkill>
<effectWorking>Tailor</effectWorking>
<soundWorking>Recipe_Tailor</soundWorking>
<recipeUsers>
<li>ElectricTailoringBench</li>
<li>HandTailoringBench</li>
</recipeUsers>
<useIngredientsForColor>true</useIngredientsForColor>
<skillRequirements>
<Crafting>4</Crafting>
</skillRequirements>
</recipeMaker>
<thingCategories>
<li>ApparelUtility</li>
</thingCategories>
<apparel>
<careIfWornByCorpse>true</careIfWornByCorpse>
<careIfDamaged>false</careIfDamaged>
<wearPerDay>0</wearPerDay>
<gender>Female</gender>
<bodyPartGroups>
<li>Torso</li>
</bodyPartGroups>
<layers>
<li>Absorber</li>
</layers>
<tags>
<li>Absorber</li>
</tags>
</apparel>
<modExtensions>
<li Class="RJW_Menstruation.AbsorberModExtention">
<leakAfterDirty>false</leakAfterDirty>
<effectsAfterDirty>true</effectsAfterDirty>
<minHourstoDirtyEffect>8</minHourstoDirtyEffect>
<dirtyDef>Absorber_Tampon_Dirty</dirtyDef>
</li>
</modExtensions>
</ThingDef>
<ThingDef ParentName="ApparelNoQualityBase">
<defName>Absorber_Tampon_Dirty</defName>
<label>dirty tampon</label>
<description>An wet used tampon</description>
<thingClass>RJW_Menstruation.Absorber_Tampon</thingClass>
<graphicData>
<texPath>Things/Item/Tampon_Dirty</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<tickerType>Never</tickerType>
<smeltable>false</smeltable>
<statBases>
<MaxHitPoints>20</MaxHitPoints>
<Mass>0.05</Mass>
<MarketValue>0</MarketValue>
<WorkToMake>1000</WorkToMake>
<Flammability>0.2</Flammability>
<EquipDelay>2</EquipDelay>
<MaxAbsorbable>10</MaxAbsorbable>
<Cleanliness>-5</Cleanliness>
</statBases>
<stuffCategories>
<li>Fabric</li>
</stuffCategories>
<thingCategories>
<li>ApparelUtility</li>
</thingCategories>
<apparel>
<careIfWornByCorpse>true</careIfWornByCorpse>
<careIfDamaged>false</careIfDamaged>
<wearPerDay>0</wearPerDay>
<gender>Female</gender>
<bodyPartGroups>
<li>Torso</li>
</bodyPartGroups>
<layers>
<li>Absorber</li>
</layers>
<tags>
<li>Absorber</li>
</tags>
</apparel>
<modExtensions>
<li Class="RJW_Menstruation.AbsorberModExtention">
<leakAfterDirty>false</leakAfterDirty>
<effectsAfterDirty>true</effectsAfterDirty>
<minHourstoDirtyEffect>8</minHourstoDirtyEffect>
<dirtyDef>Absorber_Tampon_Dirty</dirtyDef>
</li>
</modExtensions>
</ThingDef>
<ThingDef ParentName="ApparelNoQualityBase">
<defName>Absorber_Pad</defName>
<label>sanitary pad</label>
<description>A pad for absorbing fluids from vagina</description>
<thingClass>RJW_Menstruation.Absorber</thingClass>
<graphicData>
<texPath>Things/Item/Pad</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<tickerType>Never</tickerType>
<smeltable>false</smeltable>
<statBases>
<MaxHitPoints>20</MaxHitPoints>
<Mass>0.02</Mass>
<WorkToMake>1000</WorkToMake>
<Flammability>1.0</Flammability>
<EquipDelay>4</EquipDelay>
<MaxAbsorbable>25</MaxAbsorbable>
</statBases>
<costStuffCount>10</costStuffCount>
<stuffCategories>
<li>Fabric</li>
</stuffCategories>
<recipeMaker>
<unfinishedThingDef>UnfinishedApparel</unfinishedThingDef>
<workSpeedStat>GeneralLaborSpeed</workSpeedStat>
<workSkill>Crafting</workSkill>
<effectWorking>Tailor</effectWorking>
<soundWorking>Recipe_Tailor</soundWorking>
<recipeUsers>
<li>ElectricTailoringBench</li>
<li>HandTailoringBench</li>
</recipeUsers>
<useIngredientsForColor>true</useIngredientsForColor>
<skillRequirements>
<Crafting>4</Crafting>
</skillRequirements>
</recipeMaker>
<thingCategories>
<li>ApparelUtility</li>
</thingCategories>
<apparel>
<careIfWornByCorpse>true</careIfWornByCorpse>
<careIfDamaged>false</careIfDamaged>
<wearPerDay>0</wearPerDay>
<gender>Female</gender>
<bodyPartGroups>
<li>Torso</li>
</bodyPartGroups>
<layers>
<li>Absorber</li>
</layers>
<tags>
<li>Absorber</li>
</tags>
</apparel>
<modExtensions>
<li Class="RJW_Menstruation.AbsorberModExtention">
<leakAfterDirty>true</leakAfterDirty>
<effectsAfterDirty>false</effectsAfterDirty>
<dirtyDef>Absorber_Pad_Dirty</dirtyDef>
</li>
</modExtensions>
</ThingDef>
<ThingDef ParentName="ApparelNoQualityBase">
<defName>Absorber_Pad_Dirty</defName>
<label>wet sanitary pad</label>
<description>An wet used pad</description>
<thingClass>RJW_Menstruation.Absorber</thingClass>
<graphicData>
<texPath>Things/Item/Pad_Dirty</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<tickerType>Never</tickerType>
<smeltable>false</smeltable>
<statBases>
<MaxHitPoints>20</MaxHitPoints>
<Mass>0.10</Mass>
<MarketValue>0</MarketValue>
<WorkToMake>1000</WorkToMake>
<Flammability>0.2</Flammability>
<EquipDelay>4</EquipDelay>
<MaxAbsorbable>25</MaxAbsorbable>
<Cleanliness>-5</Cleanliness>
</statBases>
<stuffCategories>
<li>Fabric</li>
</stuffCategories>
<thingCategories>
<li>ApparelUtility</li>
</thingCategories>
<apparel>
<careIfWornByCorpse>true</careIfWornByCorpse>
<careIfDamaged>false</careIfDamaged>
<wearPerDay>0</wearPerDay>
<gender>Female</gender>
<bodyPartGroups>
<li>Torso</li>
</bodyPartGroups>
<layers>
<li>Absorber</li>
</layers>
<tags>
<li>Absorber</li>
</tags>
</apparel>
<modExtensions>
<li Class="RJW_Menstruation.AbsorberModExtention">
<leakAfterDirty>true</leakAfterDirty>
<effectsAfterDirty>false</effectsAfterDirty>
<dirtyDef>Absorber_Pad_Dirty</dirtyDef>
</li>
</modExtensions>
</ThingDef>
</Defs>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Absorber.label>성기</Absorber.label>
</LanguageData>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Hediff_MenstrualCramp.label>생리통</Hediff_MenstrualCramp.label>
<Hediff_MenstrualCramp.description>생리중입니다.</Hediff_MenstrualCramp.description>
<Hediff_MenstrualCramp.stages.0.label>불편함</Hediff_MenstrualCramp.stages.0.label>
<Hediff_MenstrualCramp.stages.1.label>짜증남</Hediff_MenstrualCramp.stages.1.label>
<Hediff_MenstrualCramp.stages.2.label>아픔</Hediff_MenstrualCramp.stages.2.label>
<Hediff_MenstrualCramp.stages.3.label>고통스러움</Hediff_MenstrualCramp.stages.3.label>
<Hediff_Climacteric.label>갱년기</Hediff_Climacteric.label>
<Hediff_Climacteric.description>갱년기입니다.</Hediff_Climacteric.description>
<Hediff_Climacteric.stages.0.label>초기</Hediff_Climacteric.stages.0.label>
<Hediff_Climacteric.stages.1.label>중기</Hediff_Climacteric.stages.1.label>
<Hediff_Climacteric.stages.2.label>후기</Hediff_Climacteric.stages.2.label>
<Hediff_Climacteric.stages.3.label>폐경</Hediff_Climacteric.stages.3.label>
<Hediff_Menopause.label>폐경</Hediff_Menopause.label>
<Hediff_Menopause.description>임신할수 없습니다.</Hediff_Menopause.description>
</LanguageData>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<MaxAbsorbable.label>흡수량</MaxAbsorbable.label>
<MaxAbsorbable.description>액체를 흡수할수 있는 정도입니다.</MaxAbsorbable.description>
</LanguageData>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Absorber_Tampon.label>탐폰</Absorber_Tampon.label>
<Absorber_Tampon.description>보지에서 나오는 액체를 흡수하는 탐폰입니다.</Absorber_Tampon.description>
<Absorber_Tampon_Dirty.label>더러운 탐폰</Absorber_Tampon_Dirty.label>
<Absorber_Tampon_Dirty.description>사용된 축축한 탐폰입니다.</Absorber_Tampon_Dirty.description>
<Absorber_Pad.label>생리대</Absorber_Pad.label>
<Absorber_Pad.description>보지에서 나오는 액체를 흡수하는 생리대입니다.</Absorber_Pad.description>
<Absorber_Pad_Dirty.label>젖은 생리대</Absorber_Pad_Dirty.label>
<Absorber_Pad_Dirty.description>사용된 축축한 생리대입니다.</Absorber_Pad_Dirty.description>
<OvaryRegenerationPill.label>난소 재생약</OvaryRegenerationPill.label>
<OvaryRegenerationPill.description>난소를 재생시켜 배출할수있는 난자의 양을 증가시킵니다.&#10;난자 소모량이 클수록 효과가 줄어듭니다.&#10;갱년기 증상을 완화시키지 않습니다.</OvaryRegenerationPill.description>
<SuperovulationInducingAgent.label>과배란 유도제</SuperovulationInducingAgent.label>
<SuperovulationInducingAgent.description>과배란을 유도하는 약물입니다.&#10;조기폐경을 초래할수도 있습니다.</SuperovulationInducingAgent.description>
</LanguageData>

View File

@ -4,6 +4,7 @@
<!-- folicularIntervalDays includes bleedingIntervalDays. -->
<!-- bleedingIntervalDays must be smaller than folicularIntervalDays -->
<!-- unit of maxCumCapacity is ml -->
<!-- actual max cum capacity is 500times of maxCumCapacity -->
<!-- one egg = 1 ovaryPower-->
<Patch>
@ -12,7 +13,7 @@
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>15</maxCumCapacity>
<maxCumCapacity>10</maxCumCapacity>
<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
<deviationFactor>0.05</deviationFactor>
@ -55,7 +56,7 @@
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>15</maxCumCapacity>
<maxCumCapacity>10</maxCumCapacity>
<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
<deviationFactor>0.05</deviationFactor>
@ -76,7 +77,7 @@
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>15</maxCumCapacity>
<maxCumCapacity>10</maxCumCapacity>
<wombTex>Womb/Womb</wombTex>
<vagTex>Genitals/BionicVagina</vagTex>
<infertile>true</infertile>
@ -90,7 +91,7 @@
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>15</maxCumCapacity>
<maxCumCapacity>10</maxCumCapacity>
<wombTex>Womb/Womb</wombTex>
<vagTex>Genitals/BionicVagina</vagTex>
<infertile>true</infertile>
@ -104,7 +105,7 @@
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>15</maxCumCapacity>
<maxCumCapacity>10</maxCumCapacity>
<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
<deviationFactor>0.05</deviationFactor>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1,3 +1,12 @@
Version 1.0.1.1
- requires RJW 4.6.1 or later
- added superovulation inducing agent
- cumflations (no effects yet)
- added tampon and sanitary pad can absorb fluids.
- tampon blocks fluids completly. however, keep wearing dirty tampon can cause infection.
- pad blocks fluids for a while, but if exceed over the absorbable, fluids leak again.
- fixed erros when male pawn take hyperfertility pills.
Version 1.0.1.0
- requires RJW 4.6.1 or later
- added multiple pregnancy

View File

@ -45,7 +45,7 @@ namespace RJW_Menstruation
DNAcache = DefDatabase<DNADef>.GetNamedSilentFail(pawn?.def.defName ?? "Human");
if (DNAcache == null)
{
DNAcache = VariousDefOf.defaultDNA;
DNAcache = VariousDefOf.HumanDNA;
}
return DNAcache;
}

View File

@ -13,11 +13,11 @@ namespace RJW_Menstruation
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
{
HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
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.ClimactericFollicular)
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.ClimactericLuteal)
)
))
{
comp.curStage = HediffComp_Menstruation.Stage.Ovulatory;
comp.ovarypower--;
@ -42,7 +42,19 @@ namespace RJW_Menstruation
}
}
public class SuperOvulationOutcomDoer : IngestionOutcomeDoer
{
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
{
HediffComp_Menstruation comp = Utility.GetMenstruationComp(pawn);
if (comp != null)
{
comp.eggstack += Rand.Range(1,4);
}
}
}

View File

@ -26,6 +26,7 @@ namespace RJW_Menstruation
public string vagTex = "Genitals/Vagina"; //fertiledays = ovaluationday - spermlifespan ~ ovaluationday + egglifespanday
public bool infertile = false;
public int ovaryPower = 600000000; // default: almost unlimited ovulation
public CompProperties_Menstruation()
{
@ -62,6 +63,7 @@ namespace RJW_Menstruation
public Action actionref;
public bool loaded = false;
public int ovarypower = -100000;
public int eggstack = 0;
public enum Stage
@ -132,7 +134,7 @@ namespace RJW_Menstruation
get
{
float res = Props.maxCumCapacity * parent.pawn.BodySize;
if (curStage == Stage.Pregnant) res *= 0.2f;
if (curStage != Stage.Pregnant) res *= 500f;
return res;
}
}
@ -315,6 +317,7 @@ namespace RJW_Menstruation
Scribe_Values.Look(ref recoveryIntervalhours, "recoveryIntervalhours", recoveryIntervalhours, true);
Scribe_Values.Look(ref crampPain, "crampPain", crampPain, true);
Scribe_Values.Look(ref ovarypower, "ovarypower", ovarypower, true);
Scribe_Values.Look(ref eggstack, "eggstack", eggstack, true);
}
@ -385,9 +388,9 @@ namespace RJW_Menstruation
{
float volume = injectedvolume * CumInFactor;
float tmp = TotalCum + volume;
if (tmp > Props.maxCumCapacity)
if (tmp > CumCapacity)
{
float cumoutrate = 1 - (Props.maxCumCapacity / tmp);
float cumoutrate = 1 - (CumCapacity / tmp);
bool merged = false;
if (!cums.NullOrEmpty()) foreach (Cum cum in cums)
{
@ -419,6 +422,7 @@ namespace RJW_Menstruation
}
if (!merged) cums.Add(new Cum(pawn, volume, fertility, filthdef));
}
AfterCumIn();
}
/// <summary>
@ -432,9 +436,9 @@ namespace RJW_Menstruation
public void CumIn(Pawn pawn, float volume, string notcumlabel, float decayresist = 0, ThingDef filthdef = null)
{
float tmp = TotalCum + volume;
if (tmp > Props.maxCumCapacity)
if (tmp > CumCapacity)
{
float cumoutrate = 1 - (Props.maxCumCapacity / tmp);
float cumoutrate = 1 - (CumCapacity / tmp);
bool merged = false;
if (!cums.NullOrEmpty()) foreach (Cum cum in cums)
{
@ -468,6 +472,21 @@ namespace RJW_Menstruation
}
if (!merged) cums.Add(new Cum(pawn, volume, notcumlabel,decayresist, filthdef));
}
AfterCumIn();
}
public void AfterCumIn()
{
}
public void BeforeCumOut(out Absorber absorber)
{
absorber = (Absorber)parent.pawn.apparel?.WornApparel?.Find(x => x.def.apparel.tags.Contains("Absorber"));
if (absorber != null)
{
if (absorber.dirty && absorber.EffectAfterDirty) absorber.DirtyEffect();
}
}
/// <summary>
@ -475,14 +494,18 @@ namespace RJW_Menstruation
/// </summary>
public void CumOut()
{
float leakfactor = 1.0f;
Absorber absorber;
BeforeCumOut(out absorber);
if (cums.NullOrEmpty()) return;
else if (absorber != null && absorber.dirty && !absorber.LeakAfterDirty) leakfactor = 0f;
List<Cum> removecums = new List<Cum>();
foreach(Cum cum in cums)
{
float vd = cum.volume;
cum.volume *= Math.Max(0,(1 - (Configurations.CumDecayRatio * (1 - cum.decayresist))));
cum.fertvolume *= Math.Max(0, (1 - (Configurations.CumDecayRatio * (1 - cum.decayresist))) * (1 - (Configurations.CumFertilityDecayRatio * (1 - cum.decayresist))));
if (vd - cum.volume > minmakefilthvalue) MakeCumFilth(cum);
cum.volume *= Math.Max(0, (1 - (Configurations.CumDecayRatio * (1 - cum.decayresist)) * leakfactor));
cum.fertvolume *= Math.Max(0, (1 - (Configurations.CumDecayRatio * (1 - cum.decayresist)) * leakfactor) * (1 - (Configurations.CumFertilityDecayRatio * (1 - cum.decayresist))));
MakeCumFilth(cum, vd - cum.volume, absorber);
if (cum.fertvolume < 0.01f) cum.fertvolume = 0;
if (cum.volume < 0.01f) removecums.Add(cum);
}
@ -501,16 +524,20 @@ namespace RJW_Menstruation
/// <returns></returns>
public float CumOut(Cum targetcum, float portion = 0.1f)
{
float leakfactor = 1.0f;
Absorber absorber;
BeforeCumOut(out absorber);
if (cums.NullOrEmpty()) return 0;
else if (absorber != null && absorber.dirty && !absorber.LeakAfterDirty) leakfactor = 0;
float outcum = 0;
List<Cum> removecums = new List<Cum>();
foreach (Cum cum in cums)
{
float vd = cum.volume;
if (cum.Equals(targetcum)) outcum = cum.volume * (portion * (1 - cum.decayresist));
cum.volume *= Math.Max(0, 1 - (portion * (1 - cum.decayresist)));
cum.fertvolume *= Math.Max(0, (1 - (portion * (1 - cum.decayresist))) * (1 - (Configurations.CumFertilityDecayRatio * (1 - cum.decayresist))));
if (vd-cum.volume > minmakefilthvalue) MakeCumFilth(cum);
cum.volume *= Math.Max(0, 1 - (portion * (1 - cum.decayresist)) * leakfactor);
cum.fertvolume *= Math.Max(0, (1 - (portion * (1 - cum.decayresist)) * leakfactor) * (1 - (Configurations.CumFertilityDecayRatio * (1 - cum.decayresist))));
MakeCumFilth(cum, vd - cum.volume,absorber);
if (cum.fertvolume < 0.01f) cum.fertvolume = 0;
if (cum.volume < 0.01f) removecums.Add(cum);
}
@ -523,7 +550,7 @@ namespace RJW_Menstruation
}
/// <summary>
/// Ignores cum's decayratio and get excreted amount of specific cum
/// Ignores cum's decayratio and absorber and get excreted amount of specific cum
/// </summary>
/// <param name="targetcum"></param>
/// <param name="portion"></param>
@ -539,7 +566,7 @@ namespace RJW_Menstruation
if (cum.Equals(targetcum)) outcum = cum.volume * (portion);
cum.volume *= 1 - (portion);
cum.fertvolume *= (1 - (portion)) * (1 - (Configurations.CumFertilityDecayRatio));
if (vd - cum.volume > minmakefilthvalue) MakeCumFilth(cum);
MakeCumFilth(cum, vd - cum.volume);
if (cum.fertvolume < 0.01f) cum.fertvolume = 0;
if (cum.volume < 0.1f) removecums.Add(cum);
}
@ -551,6 +578,10 @@ namespace RJW_Menstruation
return outcum;
}
/// <summary>
/// Fertilize eggs and return the result
/// </summary>
@ -738,9 +769,26 @@ namespace RJW_Menstruation
GetNotCum(Translations.Menstrual_Blood).color = Colors.blood;
}
private void MakeCumFilth(Cum cum)
private void MakeCumFilth(Cum cum, float amount, Absorber absorber = null)
{
FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, cum.FilthDef, cum.pawn.LabelShort);
if (absorber != null)
{
if (!absorber.dirty)
{
absorber.absorbedfluids += amount;
if (absorber.absorbedfluids < 10)
{
absorber.def = absorber.DirtyDef;
absorber.dirty = true;
}
}
else
{
if (absorber.LeakAfterDirty) FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, cum.FilthDef, cum.pawn.LabelShort);
}
}
else if (amount >= minmakefilthvalue) FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, cum.FilthDef, cum.pawn.LabelShort);
}
@ -794,8 +842,8 @@ namespace RJW_Menstruation
ovarypower--;
eggs.Add(new Egg((int)(Props.eggLifespanDays * 24 / CycleFactor)));
i++;
} while (i < Rand.ByCurve(parent.pawn.RaceProps.litterSizeCurve));
} while (i < Rand.ByCurve(parent.pawn.RaceProps.litterSizeCurve) + eggstack);
eggstack = 0;
if (Configurations.EnableMenopause && ovarypower < 1)
{
eggs.Clear();

View File

@ -67,6 +67,7 @@
<Compile Include="HediffComp_Menstruation.cs" />
<Compile Include="Patch\Pawn_Patch.cs" />
<Compile Include="Patch\RJW_Patch.cs" />
<Compile Include="Things.cs" />
<Compile Include="Translations.cs" />
<Compile Include="Utility.cs" />
<Compile Include="VariousDefOf.cs" />

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RimWorld;
using Verse;
using rjw;
namespace RJW_Menstruation
{
public class AbsorberModExtention : DefModExtension
{
public bool leakAfterDirty = false;
public bool effectsAfterDirty = false;
public ThingDef dirtyDef = null;
public int minHourstoDirtyEffect = 0;
}
public class Absorber : Apparel
{
public float absorbedfluids = 0;
public bool dirty = false;
public int wearhours = 0;
public virtual bool LeakAfterDirty => def.GetModExtension<AbsorberModExtention>().leakAfterDirty;
public virtual bool EffectAfterDirty => def.GetModExtension<AbsorberModExtention>().effectsAfterDirty;
public virtual ThingDef DirtyDef => def.GetModExtension<AbsorberModExtention>().dirtyDef;
public virtual int MinHrstoDirtyEffect => def.GetModExtension<AbsorberModExtention>().minHourstoDirtyEffect;
public virtual void DirtyEffect() {}
public virtual void WearEffect()
{
wearhours++;
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref absorbedfluids, "absorbedfluids", absorbedfluids, true);
Scribe_Values.Look(ref dirty, "dirty", dirty, true);
Scribe_Values.Look(ref wearhours, "wearhours", wearhours, true);
}
}
public class Absorber_Tampon : Absorber
{
public override void WearEffect()
{
base.WearEffect();
absorbedfluids += 0.1f;
}
public override void DirtyEffect()
{
if (wearhours > MinHrstoDirtyEffect && Rand.Chance(0.02f))
{
Hediff hediff = HediffMaker.MakeHediff(HediffDefOf.WoundInfection, Wearer, Genital_Helper.get_genitalsBPR(Wearer));
Wearer.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(Wearer));
}
}
}
}

View File

@ -11,20 +11,26 @@ namespace RJW_Menstruation
{
public static class VariousDefOf
{
public static readonly DNADef defaultDNA = new DNADef
{
fetusTexPath = "Fetus/Fetus_Default",
cumColor = new ColorInt(255, 255, 255, 255),
cumThickness = 0
};
//public static readonly DNADef defaultDNA = new DNADef
//{
// fetusTexPath = "Fetus/Fetus_Default",
// cumColor = new ColorInt(255, 255, 255, 255),
// cumThickness = 0
//};
public static readonly ThingDef CumFilth = DefDatabase<ThingDef>.GetNamed("FilthCum");
public static readonly ThingDef Tampon = DefDatabase<ThingDef>.GetNamed("Absorber_Tampon");
public static readonly ThingDef Tampon_Dirty = DefDatabase<ThingDef>.GetNamed("Absorber_Tampon_Dirty");
public static readonly HediffDef RJW_IUD = DefDatabase<HediffDef>.GetNamed("RJW_IUD");
public static readonly HediffDef Hediff_MenstrualCramp = DefDatabase<HediffDef>.GetNamed("Hediff_MenstrualCramp");
public static readonly HediffDef Hediff_Climacteric = DefDatabase<HediffDef>.GetNamed("Hediff_Climacteric");
public static readonly HediffDef Hediff_Menopause = DefDatabase<HediffDef>.GetNamed("Hediff_Menopause");
public static readonly DNADef HumanDNA = DefDatabase<DNADef>.GetNamed("Human");
public static readonly StatDef MaxAbsorbable = DefDatabase<StatDef>.GetNamed("MaxAbsorbable");
public static readonly PawnRelationDef Relation_birthgiver = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Sire");
public static readonly PawnRelationDef Relation_spawn = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Pup");
}
}