This commit is contained in:
moreoreganostodump 2021-08-14 00:29:43 +09:00
parent 1851627615
commit c1ac806cb2
35 changed files with 778 additions and 45 deletions

Binary file not shown.

View File

@ -136,5 +136,53 @@
</comps>
</ThingDef>
<ThingDef ParentName="MakeableDrugPillBase">
<defName>Cyclosporine</defName>
<label>cyclosporine</label>
<description>An immunosuppressant.&#10;Can cure antisperm antibody.</description>
<graphicData>
<texPath>Things/Item/Cyclosporine</texPath>
<graphicClass>Graphic_StackCount</graphicClass>
</graphicData>
<rotatable>false</rotatable>
<statBases>
<WorkToMake>1000</WorkToMake>
<MarketValue>12</MarketValue>
<Mass>0.01</Mass>
</statBases>
<techLevel>Industrial</techLevel>
<ingestible>
<drugCategory>Medical</drugCategory>
<outcomeDoers>
<li Class="IngestionOutcomeDoer_GiveHediff">
<hediffDef>Hediff_Cyclosporine</hediffDef>
<severity>1.0</severity>
</li>
<li Class="RJW_Menstruation.IngestionOutcomeDoer_AdjustSeverity">
<hediffDef>Hediff_ASA</hediffDef>
<severity>-0.20</severity>
</li>
</outcomeDoers>
</ingestible>
<recipeMaker>
<researchPrerequisite>DrugProduction</researchPrerequisite>
<recipeUsers>
<li>DrugLab</li>
</recipeUsers>
</recipeMaker>
<costList>
<MedicineHerbal>1</MedicineHerbal>
</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,111 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<hediffClass>HediffWithComps</hediffClass>
<defName>Hediff_ASA</defName>
<label>Antisperm antibody</label>
<labelNoun>antisperm antibody</labelNoun>
<description>Antisperm antibody.&#10;Increases death rate of sperm.</description>
<labelNounPretty>{0} got antisperm antibody</labelNounPretty>
<defaultLabelColor>(0.8,0.1,0.1)</defaultLabelColor>
<isBad>false</isBad>
<tendable>false</tendable>
<makesSickThought>false</makesSickThought>
<makesAlert>true</makesAlert>
<maxSeverity>1</maxSeverity>
<initialSeverity>0.1</initialSeverity>
<injuryProps>
<canMerge>true</canMerge>
</injuryProps>
<stages>
<li>
<becomeVisible>false</becomeVisible>
</li>
<li>
<minSeverity>0.40</minSeverity>
<becomeVisible>true</becomeVisible>
</li>
</stages>
<comps>
</comps>
</HediffDef>
<HediffDef>
<hediffClass>HediffWithComps</hediffClass>
<defName>Hediff_ForceFertile</defName>
<label>fertile</label>
<labelNoun>fertile</labelNoun>
<description>fertile</description>
<labelNounPretty>{0} is fertile</labelNounPretty>
<defaultLabelColor>(0.3,0.3,0.8)</defaultLabelColor>
<isBad>false</isBad>
<tendable>false</tendable>
<makesSickThought>false</makesSickThought>
<makesAlert>true</makesAlert>
<maxSeverity>3</maxSeverity>
<initialSeverity>0.1</initialSeverity>
<injuryProps>
<canMerge>true</canMerge>
</injuryProps>
<stages>
<li>
<becomeVisible>false</becomeVisible>
<capMods>
<li>
<capacity>RJW_Fertility</capacity>
<offset>0.05</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.20</minSeverity>
<becomeVisible>false</becomeVisible>
<capMods>
<li>
<capacity>RJW_Fertility</capacity>
<offset>0.25</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.40</minSeverity>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>RJW_Fertility</capacity>
<offset>0.50</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.60</minSeverity>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>RJW_Fertility</capacity>
<offset>0.75</offset>
</li>
</capMods>
</li>
<li>
<minSeverity>0.80</minSeverity>
<becomeVisible>true</becomeVisible>
<capMods>
<li>
<capacity>RJW_Fertility</capacity>
<offset>1.00</offset>
</li>
</capMods>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-1.0</severityPerDay>
<showHoursToRecover>true</showHoursToRecover>
</li>
</comps>
</HediffDef>
</Defs>

View File

@ -260,4 +260,30 @@
</li>
</comps>
</HediffDef>
<HediffDef>
<hediffClass>HediffWithComps</hediffClass>
<defName>Hediff_Cyclosporine</defName>
<label>Cyclosporine</label>
<description>Immunosuppressant.</description>
<defaultLabelColor>(0.75,0.75,1.0)</defaultLabelColor>
<isBad>false</isBad>
<tendable>false</tendable>
<makesSickThought>false</makesSickThought>
<makesAlert>false</makesAlert>
<maxSeverity>10</maxSeverity>
<initialSeverity>1.0</initialSeverity>
<stages>
<li>
<statOffsets>
<ImmunityGainSpeed>-0.25</ImmunityGainSpeed>
</statOffsets>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-1.0</severityPerDay>
</li>
</comps>
</HediffDef>
</Defs>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
<Operation Class="PatchOperationAddModExtension">
<xpath>Defs/ThingDef[defName="Race's defName"]</xpath>
@ -7,7 +8,13 @@
<li Class="RJW_Menstruation.PawnDNAModExtension">
<fetusTexPath>Fetus/Fetus_Default</fetusTexPath>
<cumColor>(255,255,255,255)</cumColor>
<cumThickness>0.2</cumThickness>
<cumThickness>0.2</cumThickness>
<cumOutcomeDoers>
<li Class="IngestionOutcomeDoers">
<Some field>value</Some field>
<Some field>value</Some field>
</li>
</cumOutcomeDoers>
<hybridExtension>
<Other Race's defName>
<Race or PawnKind defName>1.0</Race or PawnKind defName>
@ -33,6 +40,13 @@
<fetusTexPath>Fetus/Fetus_Default</fetusTexPath>
<cumColor>(255,255,255,255)</cumColor>
<cumThickness>0.2</cumThickness>
<ingestionOutcomeDoers>
<li Class="IngestionOutcomeDoer_GiveHediff">
<chance>0.02</chance>
<hediffDef>Hediff_ASA</hediffDef>
<severity>0.02</severity>
</li>
</ingestionOutcomeDoers>
<hybridExtension>
</hybridExtension>
</li>

Binary file not shown.

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="GatheredCum">
<defName>GatheredCumMixture</defName>
<label>cum mixture</label>
<description>Gathered mixture of cum.</description>
<thingClass>RJW_Menstruation.Sexperience.GatheredCumMixture</thingClass>
<graphicData>
<texPath>Things/Item/GatheredCum</texPath>
<drawSize>1</drawSize>
<graphicClass>Graphic_StackCount</graphicClass>
</graphicData>
</ThingDef>
</Defs>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<JobDef>
<defName>VaginaWashingwithBucket</defName>
<driverClass>RJW_Menstruation.Sexperience.JobDriver_VaginaWashingWithBucket</driverClass>
<reportString>washing vagina</reportString>
<casualInterruptible>true</casualInterruptible>
</JobDef>
</Defs>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -17,7 +17,7 @@
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<OutputPath>..\..\..\MilkModule\Assemblies\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@ -90,6 +90,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="JobDriver_MilkSelf.cs" />
<Compile Include="Milk_Patch.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using HarmonyLib;
using Verse;
using RimWorld;
using Milk;
using RJW_Menstruation;
namespace MilkModule
{
internal static class First
{
static First()
{
var har = new Harmony("RJW_Menstruation_MilkModule");
har.PatchAll(Assembly.GetExecutingAssembly());
}
}
[HarmonyPatch(typeof(HumanCompHasGatherableBodyResource), "Gathered")]
public static class Milk_Patch
{
public static void Postfix(Pawn doer, HumanCompHasGatherableBodyResource __instance)
{
Pawn pawn = __instance.parent as Pawn;
HediffComp_Breast comp = null;
if (pawn != null) comp = pawn.GetBreastComp();
if (comp != null)
{
comp.AdjustAreolaSize(Rand.Range(0.0f, 0.01f * Configurations.NipplePermanentTransitionVariance));
comp.AdjustNippleSize(Rand.Range(0.0f, 0.01f * Configurations.NipplePermanentTransitionVariance));
}
}
}
}

View File

@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW_Menstruation", "RJW_Men
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MilkModule", "MilkModule\MilkModule.csproj", "{3591B3C1-EB57-44BF-AB69-A613E097A7F8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SexperienceModule", "SexperienceModule\SexperienceModule.csproj", "{7DB664D7-D4B4-4673-9FF1-62EC18305715}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -21,6 +23,10 @@ Global
{3591B3C1-EB57-44BF-AB69-A613E097A7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3591B3C1-EB57-44BF-AB69-A613E097A7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3591B3C1-EB57-44BF-AB69-A613E097A7F8}.Release|Any CPU.Build.0 = Release|Any CPU
{7DB664D7-D4B4-4673-9FF1-62EC18305715}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7DB664D7-D4B4-4673-9FF1-62EC18305715}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7DB664D7-D4B4-4673-9FF1-62EC18305715}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7DB664D7-D4B4-4673-9FF1-62EC18305715}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -18,6 +18,7 @@ namespace RJW_Menstruation
protected bool useCustomColor = false;
protected float notcumthickness = 0;
protected float cumthickness = 1.0f;
protected Thing internalThing;
public float Volume
{
@ -109,6 +110,19 @@ namespace RJW_Menstruation
}
}
public Thing CumThing
{
get
{
if (internalThing == null)
{
internalThing = ThingMaker.MakeThing(VariousDefOf.CumFilth);
internalThing.stackCount = (int)volume;
}
internalThing.stackCount = (int)volume;
return internalThing;
}
}
public Cum() { }
@ -151,6 +165,7 @@ namespace RJW_Menstruation
public virtual void ExposeData()
{
Scribe_References.Look(ref pawn, "pawn", true);
Scribe_References.Look(ref internalThing, "internalThing", true);
Scribe_Values.Look(ref volume, "volume", volume, true);
Scribe_Values.Look(ref fertvolume, "fertvolume", fertvolume, true);
Scribe_Values.Look(ref notcumthickness, "notcumthickness", notcumthickness, true);
@ -208,14 +223,25 @@ namespace RJW_Menstruation
CutMinor();
totalleak -= volume;
return totalleak;
}
public void CumEffects(Pawn pawn)
{
if (!notcum && DNA != null && volume >= 1.0f)
{
List<IngestionOutcomeDoer> doers = DNA.ingestionOutcomeDoers;
if (!doers.NullOrEmpty()) for (int i = 0; i < doers.Count; i++)
{
doers[i].DoIngestionOutcome(pawn, CumThing);
}
}
}
protected void CutMinor()
{
if (volume < 0.01f) volume = 0f;
if (fertvolume < 0.001f) fertvolume = 0f;
}
@ -224,7 +250,8 @@ namespace RJW_Menstruation
public class CumMixture : Cum, IDisposable
{
protected List<string> cums;
public bool ispurecum = true;
public List<string> Getingredients => cums;
public CumMixture()
{
@ -232,13 +259,14 @@ namespace RJW_Menstruation
cums = new List<string>();
}
public CumMixture(Pawn pawn, float volume, List<string> cums, Color color, ThingDef mixtureDef)
public CumMixture(Pawn pawn, float volume, List<string> cums, Color color, ThingDef mixtureDef, bool pure)
{
this.pawn = pawn;
this.volume = volume;
this.cums = cums;
this.customColor = color;
this.useCustomColor = true;
ispurecum = pure;
}
public void Dispose()
@ -263,7 +291,7 @@ namespace RJW_Menstruation
}
return res;
}
}

View File

@ -25,6 +25,36 @@ namespace RJW_Menstruation
}
}
public class InduceOvulationOutcomDoer : IngestionOutcomeDoer
{
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
{
HediffComp_Menstruation comp = pawn.GetMenstruationComp();
if (comp != null && (comp.curStage.Equals(HediffComp_Menstruation.Stage.Follicular)
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.ClimactericFollicular)
|| comp.curStage.Equals(HediffComp_Menstruation.Stage.Anestrus)
))
{
comp.SetEstrus(comp.Props.eggLifespanDays);
comp.curStage = HediffComp_Menstruation.Stage.Ovulatory;
comp.eggstack += ingested.stackCount - 1;
}
}
}
public class IngestionOutcomeDoer_AdjustSeverity : IngestionOutcomeDoer
{
public HediffDef hediffDef;
public float severity;
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
{
Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(hediffDef);
if (hediff != null) hediff.Severity += severity;
}
}
public class OvaryPillOutcomDoer : IngestionOutcomeDoer
{
public float effectOffset;
@ -37,8 +67,6 @@ namespace RJW_Menstruation
{
comp.RecoverOvary(1 + effectOffset);
}
}
}

View File

@ -83,6 +83,10 @@ namespace RJW_Menstruation
}
}
public float OriginAlpha => originalpha;
public float OriginNipple => originnipple;
public float OriginAreola => originareola;
public Color OriginColor => Colors.CMYKLerp(parent?.pawn?.story?.SkinColor ?? Color.white, Props.BlackNippleColor, originalpha);
public Color NippleColor
{

View File

@ -111,7 +111,7 @@ namespace RJW_Menstruation
{
get
{
if (opcache < 0) opcache = (int)(72f * ThingDefOf.Human.race.lifeExpectancy / parent.pawn.def.race.lifeExpectancy);
if (opcache < 0) opcache = (int)(72f * parent.pawn.def.race.lifeExpectancy / ThingDefOf.Human.race.lifeExpectancy);
return opcache;
}
}
@ -610,9 +610,11 @@ namespace RJW_Menstruation
protected void BeforeCumOut(out Absorber absorber)
{
Hediff asa = parent.pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_ASA);
float asafactor = asa?.Severity ?? 0f;
if (parent.pawn.health.hediffSet.HasHediff(VariousDefOf.RJW_IUD)) antisperm = 0.70f;
else antisperm = 0.0f;
if (parent.pawn.health.hediffSet.HasHediff(VariousDefOf.RJW_IUD)) antisperm = 0.70f + asafactor;
else antisperm = 0.0f + asafactor;
absorber = (Absorber)parent.pawn.apparel?.WornApparel?.Find(x => x is Absorber);
if (absorber != null)
@ -657,6 +659,7 @@ namespace RJW_Menstruation
List<Cum> removecums = new List<Cum>();
foreach (Cum cum in cums)
{
cum.CumEffects(parent.pawn);
float vd = cum.DismishNatural(leakfactor, antisperm);
cum.MakeThinner(Configurations.CycleAcceleration);
totalleak += AbsorbCum(cum, vd, absorber);
@ -719,7 +722,7 @@ namespace RJW_Menstruation
/// <param name="mixtureDef"></param>
/// <param name="portion"></param>
/// <returns></returns>
public Cum MixtureOut(ThingDef mixtureDef ,float portion = 0.1f)
public CumMixture MixtureOut(ThingDef mixtureDef ,float portion = 0.1f)
{
if (cums.NullOrEmpty()) return null;
Color color = GetCumMixtureColor;
@ -727,6 +730,7 @@ namespace RJW_Menstruation
List<string> cumlabels = new List<string>();
float cumd = TotalCumPercent;
List<Cum> removecums = new List<Cum>();
bool pure = true;
foreach (Cum cum in cums)
{
float vd = cum.DismishForce(portion);
@ -734,13 +738,14 @@ namespace RJW_Menstruation
cumlabels.Add(tmp.Replace(" x1", ""));
totalleak += vd;
if (cum.ShouldRemove()) removecums.Add(cum);
if (cum.notcum) pure = false;
}
foreach (Cum cum in removecums)
{
cums.Remove(cum);
}
removecums.Clear();
return new CumMixture(parent.pawn, totalleak, cumlabels, color, mixtureDef);
return new CumMixture(parent.pawn, totalleak, cumlabels, color, mixtureDef, pure);
}
@ -866,7 +871,7 @@ namespace RJW_Menstruation
}
}
public void RecoverOvary(float multiply = 0.2f)
public void RecoverOvary(float multiply = 1.2f)
{
ovarypower = Math.Max(0, (int)(ovarypower * multiply));
if (ovarypower >= ovarypowerthreshold)
@ -1512,9 +1517,10 @@ namespace RJW_Menstruation
action += delegate
{
if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) <= 0) curStage = Stage.Young;
CumOut();
//CumOut();
AfterSimulator();
};
action = CumOut + action;
actionref = action;
return actionref;

View File

@ -207,7 +207,8 @@ namespace RJW_Menstruation
{
if (xxx.is_human(father))
{
melanin = (mother.story?.melanin ?? 0f + father.story?.melanin ?? 0f) / 2;
melanin = ChildRelationUtility.GetRandomChildSkinColor(father.story?.melanin ?? 0f, mother.story?.melanin ?? 0f);
//melanin = (mother.story?.melanin ?? 0f + father.story?.melanin ?? 0f) / 2;
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
}
else
@ -215,24 +216,18 @@ namespace RJW_Menstruation
melanin = mother.story?.melanin ?? 0f;
lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
}
}
else if (xxx.is_human(father))
{
melanin = father.story?.melanin ?? 0f;
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
}
else
{
if (xxx.is_human(father))
{
melanin = father.story?.melanin ?? 0f;
lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
}
else
{
melanin = Rand.Range(0, 1.0f);
lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
}
melanin = Rand.Range(0, 1.0f);
lastname = "";
}
PawnGenerationRequest request = new PawnGenerationRequest(
newborn: true,
allowDowned: true,
@ -274,7 +269,8 @@ namespace RJW_Menstruation
firstheadpath = (string)baby.story.GetMemberValue("headGraphicPath");
if (firstheadpath == null)
{
baby.story.SetMemberValue("headGraphicPath", GraphicDatabaseHeadRecords.GetHeadRandom(baby.gender, baby.story.SkinColor, baby.story.crownType, true).GraphicPath);
Graphic_Multi head = GraphicDatabaseHeadRecords.GetHeadRandom(baby.gender, baby.story.SkinColor, baby.story.crownType, true);
if (head != null) baby.story.SetMemberValue("headGraphicPath", head.GraphicPath);
firstheadpath = (string)baby.story.GetMemberValue("headGraphicPath");
}
if (Configurations.HARActivated && baby.IsHAR())

View File

@ -42,7 +42,7 @@ namespace RJW_Menstruation
foreach (LocalTargetInfo t in selftargets)
{
if (pawn.HasMenstruationComp()) opts.AddDistinct(MakeSelfMenu(pawn, t));
if (t.Pawn == pawn && pawn.HasMenstruationComp()) opts.AddDistinct(MakeSelfMenu(pawn, t));
break;
}
@ -60,9 +60,6 @@ namespace RJW_Menstruation
return option;
}
}
//[HarmonyPatch(typeof(HealthCardUtility), "DrawHediffListing")]

View File

@ -114,6 +114,14 @@
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.InputModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.TextCoreModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextCoreModule.dll</HintPath>
<Private>False</Private>

View File

@ -15,6 +15,7 @@ namespace RJW_Menstruation
public Color CumColor => cumColor.ToColor;
public float cumThickness = 0f;
public List<HybridExtension> hybridExtension;
public List<IngestionOutcomeDoer> ingestionOutcomeDoers;
public HybridExtension GetHybridExtension(string race)
{

View File

@ -201,12 +201,11 @@ namespace RJW_Menstruation
Rect pawnLabelRect = new Rect(0, pawnRectHeight, pawnRectWidth, fontheight - 10);
Rect pawnLabel2Rect = new Rect(0, pawnRectHeight + fontheight - 10, pawnRectWidth, fontheight - 10);
fontstylecenter.normal.textColor = pawn.DrawColor;
GUI.Label(pawnLabelRect, pawn.Name.ToStringFull, fontstylecenter);
if (pawn.story != null) GUI.Label(pawnLabel2Rect, pawn.story.Title, fontstylecenter);
GUI.Label(pawnLabelRect, pawn.Name?.ToStringFull ?? pawn.Label, fontstylecenter);
if (pawn.story != null) GUI.Label(pawnLabel2Rect, pawn.ageTracker.AgeBiologicalYears + ", " + pawn.story.Title, fontstylecenter);
GUI.color = Color.white;
float wombrecth = 0;
if (Configurations.DrawWombStatus)
{
@ -342,7 +341,9 @@ namespace RJW_Menstruation
GUI.color = new Color(1.00f, 0.47f, 0.47f, 1);
GUI.Box(rect, "", boxstyle);
pawn.DrawBreastIcon(BreastIconRect);
pawn.DrawBreastIcon(BreastIconRect, Mouse.IsOver(BreastIconRect) && Input.GetMouseButton(0));
GUI.color = Color.white;

View File

@ -228,7 +228,7 @@ namespace RJW_Menstruation
}
}
public static void DrawBreastIcon(this Pawn pawn, Rect rect)
public static void DrawBreastIcon(this Pawn pawn, Rect rect , bool drawOrigin = false)
{
var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("breast"));
Texture2D breast, nipple, areola;
@ -259,9 +259,20 @@ namespace RJW_Menstruation
else icon += "_Breast05";
string nippleicon, areolaicon;
float nipplesize, areolasize;
if (drawOrigin)
{
nipplesize = comp.OriginNipple;
areolasize = comp.OriginAreola;
}
else
{
nipplesize = comp.NippleSize;
areolasize = comp.AreolaSize;
}
nippleicon = icon + "_Nipple0" + GetNippleIndex(comp.NippleSize);
areolaicon = icon + "_Areola0" + GetAreolaIndex(comp.AreolaSize);
nippleicon = icon + "_Nipple0" + GetNippleIndex(nipplesize);
areolaicon = icon + "_Areola0" + GetAreolaIndex(areolasize);
breast = ContentFinder<Texture2D>.Get(icon, false);
@ -270,7 +281,14 @@ namespace RJW_Menstruation
GUI.color = pawn.story.SkinColor;
GUI.DrawTexture(rect, breast, ScaleMode.ScaleToFit);
GUI.color = comp.NippleColor;
if (drawOrigin)
{
GUI.color = comp.OriginColor;
}
else
{
GUI.color = comp.NippleColor;
}
GUI.DrawTexture(rect, areola, ScaleMode.ScaleToFit);
GUI.DrawTexture(rect, nipple, ScaleMode.ScaleToFit);

View File

@ -20,6 +20,7 @@ namespace RJW_Menstruation
public static readonly HediffDef Hediff_Menopause = DefDatabase<HediffDef>.GetNamed("Hediff_Menopause");
public static readonly HediffDef Hediff_Estrus = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus");
public static readonly HediffDef Hediff_Estrus_Consealed = DefDatabase<HediffDef>.GetNamed("Hediff_Estrus_Consealed");
public static readonly HediffDef Hediff_ASA = DefDatabase<HediffDef>.GetNamed("Hediff_ASA");
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");

View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using RimWorld;
using RJWSexperience;
using RJW_Menstruation;
using UnityEngine;
namespace RJW_Menstruation.Sexperience
{
public class GatheredCumMixture : ThingWithComps
{
public Color cumColor;
public List<string> ingredients = new List<string>();
public override Color DrawColor => cumColor;
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref cumColor, "cumColor", Color.white, true);
Scribe_Collections.Look(ref ingredients, "ingredients");
}
public override bool TryAbsorbStack(Thing other, bool respectStackLimit)
{
float amount = stackCount;
float count = ThingUtility.TryAbsorbStackNumToTake(this, other, respectStackLimit);
bool res = base.TryAbsorbStack(other, respectStackLimit);
if (res && other is GatheredCumMixture)
{
GatheredCumMixture othercum = (GatheredCumMixture)other;
cumColor = Colors.CMYKLerp(cumColor,othercum.cumColor,count/(amount+count));
if (!othercum.ingredients.NullOrEmpty()) for (int i=0; i<othercum.ingredients.Count; i++)
{
if (!ingredients.Contains(othercum.ingredients[i])) ingredients.Add(othercum.ingredients[i]);
}
}
return res;
}
public override string GetInspectString()
{
string res = "";
if (!ingredients.NullOrEmpty()) for(int i=0; i<ingredients.Count; i++)
{
res += ingredients[i];
if (i != ingredients.Count - 1) res += ", ";
}
return res;
}
public void InitwithCum(CumMixture cum)
{
ingredients.AddRange(cum.Getingredients);
cumColor = cum.color;
}
}
}

View File

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using Verse;
using Verse.AI;
using RimWorld;
using RJWSexperience;
namespace RJW_Menstruation.Sexperience
{
public class JobDriver_VaginaWashingWithBucket : JobDriver
{
const int excretingTime = 300;//ticks - 120 = 2 real seconds, 3 in-game minutes
protected Building_CumBucket Bucket => TargetB.Thing as Building_CumBucket;
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(pawn, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
HediffComp_Menstruation Comp = pawn.GetMenstruationComp();
this.FailOn(delegate
{
return !(Comp.TotalCumPercent > 0.001);
});
yield return Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.ClosestTouch);
Toil excreting = Toils_General.Wait(excretingTime, TargetIndex.None);//duration of
excreting.WithProgressBarToilDelay(TargetIndex.A);
yield return excreting;
yield return new Toil()
{
initAction = delegate ()
{
CumMixture mixture = Comp.MixtureOut(RJWSexperience.VariousDefOf.GatheredCum, 0.5f);
float amount = mixture.Volume;
if (mixture.ispurecum)
{
Bucket.AddCum(amount);
}
else
{
GatheredCumMixture cummixture = (GatheredCumMixture)ThingMaker.MakeThing(VariousDefOf.GatheredCumMixture);
cummixture.InitwithCum(mixture);
Bucket.AddCum(amount, cummixture);
}
if (Comp.TotalCumPercent > 0.001) JumpToToil(excreting);
}
};
//yield return excreting;
yield break;
}
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using System.Reflection;
using Verse;
namespace RJW_Menstruation.Sexperience
{
[StaticConstructorOnStartup]
internal static class First
{
static First()
{
var har = new Harmony("RJW_Menstruation.Sexperience");
har.PatchAll(Assembly.GetExecutingAssembly());
}
}
}

View File

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using Verse.AI;
using RimWorld;
using HarmonyLib;
using UnityEngine;
using RJWSexperience;
namespace RJW_Menstruation.Sexperience
{
[HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")]
public class HumanlikeOrder_Patch
{
public static void Postfix(Vector3 clickPos, Pawn pawn, List<FloatMenuOption> opts)
{
var targets = GenUI.TargetsAt(clickPos, TargetingParameters.ForBuilding());
foreach (LocalTargetInfo t in targets)
{
Building building = t.Thing as Building;
if (building != null)
{
if (building is Building_CumBucket)
{
opts.AddDistinct(MakeMenu(pawn, building));
break;
}
}
}
}
public static FloatMenuOption MakeMenu(Pawn pawn, LocalTargetInfo target)
{
FloatMenuOption option = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(Translations.FloatMenu_CleanSelf, delegate ()
{
pawn.jobs.TryTakeOrderedJob(new Verse.AI.Job(VariousDefOf.VaginaWashingwithBucket, null, target, target.Cell));
}, MenuOptionPriority.Low), pawn, target);
return option;
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("SexperienceModule")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SexperienceModule")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("7db664d7-d4b4-4673-9ff1-62ec18305715")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7DB664D7-D4B4-4673-9FF1-62EC18305715}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RJW_Menstruation.Sexperience</RootNamespace>
<AssemblyName>SexperienceModule</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\..\SexperienceModule\Assemblies\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\..\SexperienceModule\Assemblies\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="0Harmony">
<HintPath>D:\잉어\Lib\Harmony.2.0.4.0\net472\0Harmony.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Assembly-CSharp">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RJW">
<HintPath>..\..\..\..\..\RJW\1.3\Assemblies\RJW.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RJWSexperience">
<HintPath>..\..\..\..\..\RJW_Sexperience\Assemblies\RJWSexperience.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RJW_Menstruation">
<HintPath>..\..\..\Assemblies\RJW_Menstruation.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="UnityEngine">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.IMGUIModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.InputModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.TextCoreModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextCoreModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.TextRenderingModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.UI">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.UIElementsModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UIElementsModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.UIModule">
<HintPath>..\..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.UIModule.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="GatheredCumMixture.cs" />
<Compile Include="JobDrivers.cs" />
<Compile Include="Patch\Harmony.cs" />
<Compile Include="Patch\Pawn_Patch.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VariousDefOf.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,17 @@
using RimWorld;
using rjw;
using System.Linq;
using System;
using System.Collections.Generic;
using Verse;
namespace RJW_Menstruation.Sexperience
{
public static class VariousDefOf
{
public static readonly JobDef VaginaWashingwithBucket = DefDatabase<JobDef>.GetNamed("VaginaWashingwithBucket");
public static readonly ThingDef GatheredCumMixture = DefDatabase<ThingDef>.GetNamed("GatheredCumMixture");
}
}

View File

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

View File

@ -9,5 +9,6 @@
<li>1.3</li>
<li IfModActive="Abraxas.RJW.RaceSupport">1.3\RJW Menstruation Race Support</li>
<li IfModActive="rjw.milk.humanoid">1.3\MilkModule</li>
<li IfModActive="rjw.sexperience">1.3\SexperienceModule</li>
</v1.3>
</loadFolders>

View File

@ -1,3 +1,15 @@
Version 1.0.5.4
- lactating cause nipple morph
- clicking breast image will show nipple's origin state(before & after)
- fixed animal pregnancy error
- added cum effects
- use IngestionOutcomeDoer
- might you can make aphrodisiac cum with this
- added antisperm antibody
- added cyclosporine which cures antisperm antibody
- sexperience integrations
- added ability to gather cums in womb using cumbucket
Version 1.0.5.3
- now impregnate on every orgasm
- added egg lifespan setting