mirror of
https://github.com/amevarashi/RJW-Sexperience.git
synced 2024-08-14 23:54:08 +00:00
Move all cum related code to a separate folder
This commit is contained in:
parent
e70903c16e
commit
481c73f389
21 changed files with 245 additions and 281 deletions
|
|
@ -40,7 +40,7 @@
|
||||||
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
||||||
<offset>0.05</offset>
|
<offset>0.05</offset>
|
||||||
</li>
|
</li>
|
||||||
<li Class="RJWSexperience.CumOutcomeDoers"/>
|
<li Class="RJWSexperience.Cum.IngestionOutcomeDoer_RecordEatenCum"/>
|
||||||
</outcomeDoers>
|
</outcomeDoers>
|
||||||
</ingestible>
|
</ingestible>
|
||||||
<comps>
|
<comps>
|
||||||
|
|
@ -137,7 +137,7 @@
|
||||||
<parentCategory>Foods</parentCategory>
|
<parentCategory>Foods</parentCategory>
|
||||||
<allowedByDefault>true</allowedByDefault>
|
<allowedByDefault>true</allowedByDefault>
|
||||||
<saveKey>allowWithCum</saveKey>
|
<saveKey>allowWithCum</saveKey>
|
||||||
<workerClass>RJWSexperience.SpecialThingFilterWorker_Cum</workerClass>
|
<workerClass>RJWSexperience.Cum.FilterWorkers.SpecialThingFilterWorker_Cum</workerClass>
|
||||||
</SpecialThingFilterDef>
|
</SpecialThingFilterDef>
|
||||||
|
|
||||||
<SpecialThingFilterDef>
|
<SpecialThingFilterDef>
|
||||||
|
|
@ -147,6 +147,6 @@
|
||||||
<parentCategory>Foods</parentCategory>
|
<parentCategory>Foods</parentCategory>
|
||||||
<allowedByDefault>true</allowedByDefault>
|
<allowedByDefault>true</allowedByDefault>
|
||||||
<saveKey>allowWithoutCum</saveKey>
|
<saveKey>allowWithoutCum</saveKey>
|
||||||
<workerClass>RJWSexperience.SpecialThingFilterWorker_NoCum</workerClass>
|
<workerClass>RJWSexperience.Cum.FilterWorkers.SpecialThingFilterWorker_NoCum</workerClass>
|
||||||
</SpecialThingFilterDef>
|
</SpecialThingFilterDef>
|
||||||
</Defs>
|
</Defs>
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
||||||
<offset>0.05</offset>
|
<offset>0.05</offset>
|
||||||
</li>
|
</li>
|
||||||
<li Class="RJWSexperience.CumOutcomeDoers">
|
<li Class="RJWSexperience.Cum.IngestionOutcomeDoer_RecordEatenCum">
|
||||||
<unitAmount>5.2</unitAmount>
|
<unitAmount>5.2</unitAmount>
|
||||||
</li>
|
</li>
|
||||||
</outcomeDoers>
|
</outcomeDoers>
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
|
||||||
<offset>0.05</offset>
|
<offset>0.05</offset>
|
||||||
</li>
|
</li>
|
||||||
<li Class="RJWSexperience.CumOutcomeDoers">
|
<li Class="RJWSexperience.Cum.IngestionOutcomeDoer_RecordEatenCum">
|
||||||
<unitAmount>5.2</unitAmount>
|
<unitAmount>5.2</unitAmount>
|
||||||
</li>
|
</li>
|
||||||
</value>
|
</value>
|
||||||
|
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Verse;
|
|
||||||
using RimWorld;
|
|
||||||
using rjw;
|
|
||||||
|
|
||||||
namespace RJWSexperience
|
|
||||||
{
|
|
||||||
public class Building_CumBucket : Building_Storage
|
|
||||||
{
|
|
||||||
protected float storedcum = 0f;
|
|
||||||
protected float totalgathered = 0f;
|
|
||||||
|
|
||||||
public override void ExposeData()
|
|
||||||
{
|
|
||||||
Scribe_Values.Look(ref storedcum, "storedcum", storedcum, true);
|
|
||||||
Scribe_Values.Look(ref totalgathered, "totalgathered", totalgathered, true);
|
|
||||||
base.ExposeData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string GetInspectString()
|
|
||||||
{
|
|
||||||
return Keyed.RSTotalGatheredCum + String.Format("{0:0.##}ml", totalgathered);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCum(float amount)
|
|
||||||
{
|
|
||||||
AddCum(amount, VariousDefOf.GatheredCum);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCum(float amount, ThingDef cumDef)
|
|
||||||
{
|
|
||||||
Thing cum = ThingMaker.MakeThing(cumDef);
|
|
||||||
AddCum(amount, cum);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCum(float amount, Thing cum)
|
|
||||||
{
|
|
||||||
storedcum += amount;
|
|
||||||
totalgathered += amount;
|
|
||||||
int num = (int)storedcum;
|
|
||||||
|
|
||||||
cum.stackCount = num;
|
|
||||||
if (cum.stackCount > 0 && !GenPlace.TryPlaceThing(cum, PositionHeld, Map, ThingPlaceMode.Direct, out Thing res))
|
|
||||||
{
|
|
||||||
FilthMaker.TryMakeFilth(PositionHeld, Map, VariousDefOf.FilthCum, num);
|
|
||||||
}
|
|
||||||
storedcum -= num;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
48
RJWSexperience/RJWSexperience/Cum/Building_Cumbucket.cs
Normal file
48
RJWSexperience/RJWSexperience/Cum/Building_Cumbucket.cs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
using RimWorld;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace RJWSexperience // Used in Menstruation with this namespace
|
||||||
|
{
|
||||||
|
public class Building_CumBucket : Building_Storage
|
||||||
|
{
|
||||||
|
protected float storedcum = 0f;
|
||||||
|
protected float totalgathered = 0f;
|
||||||
|
|
||||||
|
public override void ExposeData()
|
||||||
|
{
|
||||||
|
Scribe_Values.Look(ref storedcum, "storedcum", storedcum, true);
|
||||||
|
Scribe_Values.Look(ref totalgathered, "totalgathered", totalgathered, true);
|
||||||
|
base.ExposeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetInspectString()
|
||||||
|
{
|
||||||
|
return Keyed.RSTotalGatheredCum + string.Format("{0:0.##}ml", totalgathered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCum(float amount)
|
||||||
|
{
|
||||||
|
AddCum(amount, VariousDefOf.GatheredCum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCum(float amount, ThingDef cumDef)
|
||||||
|
{
|
||||||
|
Thing cum = ThingMaker.MakeThing(cumDef);
|
||||||
|
AddCum(amount, cum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddCum(float amount, Thing cum)
|
||||||
|
{
|
||||||
|
storedcum += amount;
|
||||||
|
totalgathered += amount;
|
||||||
|
int num = (int)storedcum;
|
||||||
|
|
||||||
|
cum.stackCount = num;
|
||||||
|
if (cum.stackCount > 0 && !GenPlace.TryPlaceThing(cum, PositionHeld, Map, ThingPlaceMode.Direct, out Thing res))
|
||||||
|
{
|
||||||
|
FilthMaker.TryMakeFilth(PositionHeld, Map, VariousDefOf.FilthCum, num);
|
||||||
|
}
|
||||||
|
storedcum -= num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
61
RJWSexperience/RJWSexperience/Cum/CumUtility.cs
Normal file
61
RJWSexperience/RJWSexperience/Cum/CumUtility.cs
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
using rjw;
|
||||||
|
using RJWSexperience.Logs;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace RJWSexperience.Cum
|
||||||
|
{
|
||||||
|
public static class CumUtility
|
||||||
|
{
|
||||||
|
public static float GetCumVolume(Pawn pawn)
|
||||||
|
{
|
||||||
|
List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn));
|
||||||
|
if (hediffs.NullOrEmpty()) return 0f;
|
||||||
|
else return GetCumVolume(pawn, hediffs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float GetCumVolume(Pawn pawn, List<Hediff> hediffs)
|
||||||
|
{
|
||||||
|
CompHediffBodyPart part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
||||||
|
if (part == null) return 0f;
|
||||||
|
|
||||||
|
return GetCumVolume(pawn, part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float GetCumVolume(Pawn pawn, CompHediffBodyPart part)
|
||||||
|
{
|
||||||
|
float res;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
res = part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize * Rand.Range(0.8f, 1.2f) * RJWSettings.cum_on_body_amount_adjust * 0.3f;
|
||||||
|
}
|
||||||
|
catch (NullReferenceException)
|
||||||
|
{
|
||||||
|
res = 0.0f;
|
||||||
|
}
|
||||||
|
if (pawn.Has(Quirk.Messy)) res *= Rand.Range(4.0f, 8.0f);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void FeedCum(Pawn pawn, float amount)
|
||||||
|
{
|
||||||
|
const float allOf = 1000f;
|
||||||
|
|
||||||
|
var log = LogManager.GetLogger<DebugLogProvider>("PawnExtensions");
|
||||||
|
log.Message($"AteCum({pawn.NameShortColored}, {amount})");
|
||||||
|
|
||||||
|
Thing cum = ThingMaker.MakeThing(VariousDefOf.GatheredCum);
|
||||||
|
cum.stackCount = (int)Math.Ceiling(amount);
|
||||||
|
log.Message($"Created a stack of {cum.stackCount} cum");
|
||||||
|
cum.Ingested(pawn, allOf);
|
||||||
|
log.Message($"{pawn.NameShortColored} ingested cum");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience.Cum.FilterWorkers
|
||||||
{
|
{
|
||||||
public class SpecialThingFilterWorker_Cum : SpecialThingFilterWorker_CumBase
|
public class SpecialThingFilterWorker_Cum : SpecialThingFilterWorker_CumBase
|
||||||
{
|
{
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience.Cum.FilterWorkers
|
||||||
{
|
{
|
||||||
public abstract class SpecialThingFilterWorker_CumBase : SpecialThingFilterWorker
|
public abstract class SpecialThingFilterWorker_CumBase : SpecialThingFilterWorker
|
||||||
{
|
{
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience.Cum.FilterWorkers
|
||||||
{
|
{
|
||||||
public class SpecialThingFilterWorker_NoCum : SpecialThingFilterWorker_CumBase
|
public class SpecialThingFilterWorker_NoCum : SpecialThingFilterWorker_CumBase
|
||||||
{
|
{
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience.Cum
|
||||||
{
|
{
|
||||||
public class CumOutcomeDoers : IngestionOutcomeDoer
|
public class IngestionOutcomeDoer_RecordEatenCum : IngestionOutcomeDoer
|
||||||
{
|
{
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")]
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")]
|
||||||
public float unitAmount = 1.0f;
|
public float unitAmount = 1.0f;
|
||||||
|
|
@ -11,7 +11,7 @@ namespace RJWSexperience
|
||||||
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
|
||||||
{
|
{
|
||||||
int amount = ingested.stackCount * (int)unitAmount;
|
int amount = ingested.stackCount * (int)unitAmount;
|
||||||
Logs.LogManager.GetLogger<CumOutcomeDoers, Logs.DebugLogProvider>().Message($"Record {pawn.NameShortColored} eating {amount} ml of cum");
|
Logs.LogManager.GetLogger<IngestionOutcomeDoer_RecordEatenCum, Logs.DebugLogProvider>().Message($"Record {pawn.NameShortColored} eating {amount} ml of cum");
|
||||||
pawn.records.Increment(VariousDefOf.NumofEatenCum);
|
pawn.records.Increment(VariousDefOf.NumofEatenCum);
|
||||||
pawn.records.AddTo(VariousDefOf.AmountofEatenCum, amount);
|
pawn.records.AddTo(VariousDefOf.AmountofEatenCum, amount);
|
||||||
}
|
}
|
||||||
|
|
@ -8,7 +8,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience.Interactions
|
namespace RJWSexperience.Cum.Interactions
|
||||||
{
|
{
|
||||||
public class CumAddictPartKindUsageRule : IPartPreferenceRule
|
public class CumAddictPartKindUsageRule : IPartPreferenceRule
|
||||||
{
|
{
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
using RimWorld;
|
||||||
|
using rjw;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Verse;
|
||||||
|
using Verse.AI;
|
||||||
|
|
||||||
|
namespace RJWSexperience // Used in Menstruation with this namespace
|
||||||
|
{
|
||||||
|
public class JobDriver_CleanSelfWithBucket : JobDriver
|
||||||
|
{
|
||||||
|
protected const int UNITTIME = 240;//ticks - 120 = 2 real seconds, 3 in-game minutes
|
||||||
|
protected float progress = 0;
|
||||||
|
protected float severitycache = 1;
|
||||||
|
protected Hediff hediffcache;
|
||||||
|
protected float CleaningTime
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return severitycache * UNITTIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
this.FailOn(delegate
|
||||||
|
{
|
||||||
|
List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
|
||||||
|
return !hediffs.Exists(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake);
|
||||||
|
});
|
||||||
|
yield return Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.ClosestTouch);
|
||||||
|
Toil cleaning = new Toil
|
||||||
|
{
|
||||||
|
initAction = CleaningInit,
|
||||||
|
tickAction = CleaningTick,
|
||||||
|
defaultCompleteMode = ToilCompleteMode.Never
|
||||||
|
};
|
||||||
|
cleaning.AddFinishAction(Finish);
|
||||||
|
cleaning.WithProgressBar(TargetIndex.A, () => progress / CleaningTime);
|
||||||
|
|
||||||
|
yield return cleaning;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void CleaningInit()
|
||||||
|
{
|
||||||
|
hediffcache = pawn.health.hediffSet.hediffs.Find(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk);
|
||||||
|
if (hediffcache == null)
|
||||||
|
{
|
||||||
|
pawn.jobs.EndCurrentJob(JobCondition.Succeeded);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
progress = 0;
|
||||||
|
severitycache = hediffcache.Severity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void CleaningTick()
|
||||||
|
{
|
||||||
|
progress++;
|
||||||
|
if (progress > CleaningTime)
|
||||||
|
{
|
||||||
|
Cleaned();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Cleaned()
|
||||||
|
{
|
||||||
|
if (hediffcache != null)
|
||||||
|
{
|
||||||
|
float cumamount = hediffcache.Severity * 10;
|
||||||
|
hediffcache.Severity = 0;
|
||||||
|
Bucket.AddCum(cumamount);
|
||||||
|
}
|
||||||
|
CleaningInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Finish()
|
||||||
|
{
|
||||||
|
if (pawn.CurJobDef == JobDefOf.Wait_MaintainPosture)
|
||||||
|
{
|
||||||
|
pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
14
RJWSexperience/RJWSexperience/Cum/JobGiver_UseBucket.cs
Normal file
14
RJWSexperience/RJWSexperience/Cum/JobGiver_UseBucket.cs
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System;
|
||||||
|
using Verse;
|
||||||
|
using Verse.AI;
|
||||||
|
|
||||||
|
namespace RJWSexperience.Cum
|
||||||
|
{
|
||||||
|
public class JobGiver_UseBucket : ThinkNode_JobGiver
|
||||||
|
{
|
||||||
|
protected override Job TryGiveJob(Pawn pawn)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience // Change in namespace will lead to save incompatibility
|
||||||
{
|
{
|
||||||
public class Thought_AteCum : Thought_Recordbased
|
public class Thought_AteCum : Thought_Recordbased
|
||||||
{
|
{
|
||||||
|
|
@ -22,7 +22,7 @@ namespace RJWSexperience
|
||||||
Thought_AteCum thought_Memory = (Thought_AteCum)thoughts.memories.OldestMemoryInGroup(this);
|
Thought_AteCum thought_Memory = (Thought_AteCum)thoughts.memories.OldestMemoryInGroup(this);
|
||||||
if (thought_Memory != null)
|
if (thought_Memory != null)
|
||||||
{
|
{
|
||||||
showBubble = (thought_Memory.age > thought_Memory.def.DurationTicks / 2);
|
showBubble = thought_Memory.age > thought_Memory.def.DurationTicks / 2;
|
||||||
thought_Memory.Merged();
|
thought_Memory.Merged();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +1,7 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using rjw;
|
using rjw;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using Verse;
|
using Verse;
|
||||||
using RJWSexperience.Logs;
|
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience
|
||||||
{
|
{
|
||||||
|
|
@ -47,40 +44,6 @@ namespace RJWSexperience
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float GetCumVolume(this Pawn pawn)
|
|
||||||
{
|
|
||||||
List<Hediff> hediffs = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn));
|
|
||||||
if (hediffs.NullOrEmpty()) return 0;
|
|
||||||
else return pawn.GetCumVolume(hediffs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float GetCumVolume(this Pawn pawn, List<Hediff> hediffs)
|
|
||||||
{
|
|
||||||
CompHediffBodyPart part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
|
||||||
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
|
||||||
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
|
||||||
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>();
|
|
||||||
|
|
||||||
return pawn.GetCumVolume(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float GetCumVolume(this Pawn pawn, CompHediffBodyPart part)
|
|
||||||
{
|
|
||||||
float res;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
res = part.FluidAmmount * part.FluidModifier * pawn.BodySize / pawn.RaceProps.baseBodySize * Rand.Range(0.8f, 1.2f) * RJWSettings.cum_on_body_amount_adjust * 0.3f;
|
|
||||||
}
|
|
||||||
catch (NullReferenceException)
|
|
||||||
{
|
|
||||||
res = 0.0f;
|
|
||||||
}
|
|
||||||
if (pawn.Has(Quirk.Messy)) res *= Rand.Range(4.0f, 8.0f);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If the pawn is virgin, return true.
|
/// If the pawn is virgin, return true.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -131,20 +94,6 @@ namespace RJWSexperience
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AteCum(this Pawn pawn, float amount)
|
|
||||||
{
|
|
||||||
const float allOf = 1000f;
|
|
||||||
|
|
||||||
var log = LogManager.GetLogger<DebugLogProvider>("PawnExtensions");
|
|
||||||
log.Message($"AteCum({pawn.NameShortColored}, {amount})");
|
|
||||||
|
|
||||||
Thing cum = ThingMaker.MakeThing(VariousDefOf.GatheredCum);
|
|
||||||
cum.stackCount = (int)Math.Ceiling(amount);
|
|
||||||
log.Message($"Created a stack of {cum.stackCount} cum");
|
|
||||||
cum.Ingested(pawn, allOf);
|
|
||||||
log.Message($"{pawn.NameShortColored} ingested cum");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddVirginTrait(this Pawn pawn)
|
public static void AddVirginTrait(this Pawn pawn)
|
||||||
{
|
{
|
||||||
if (pawn.story?.traits != null)
|
if (pawn.story?.traits != null)
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ namespace RJWSexperience
|
||||||
var log = LogManager.GetLogger("StaticConstructorOnStartup");
|
var log = LogManager.GetLogger("StaticConstructorOnStartup");
|
||||||
|
|
||||||
List<IPartPreferenceRule> partKindUsageRules = Unprivater.GetProtectedValue<List<IPartPreferenceRule>>("_partKindUsageRules", typeof(PartPreferenceDetectorService));
|
List<IPartPreferenceRule> partKindUsageRules = Unprivater.GetProtectedValue<List<IPartPreferenceRule>>("_partKindUsageRules", typeof(PartPreferenceDetectorService));
|
||||||
partKindUsageRules.Add(new Interactions.CumAddictPartKindUsageRule());
|
partKindUsageRules.Add(new Cum.Interactions.CumAddictPartKindUsageRule());
|
||||||
log.Message("Added 1 rule to PartPreferenceDetectorService._partKindUsageRules");
|
log.Message("Added 1 rule to PartPreferenceDetectorService._partKindUsageRules");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Verse;
|
|
||||||
using Verse.AI;
|
|
||||||
using RimWorld;
|
|
||||||
using rjw;
|
|
||||||
|
|
||||||
namespace RJWSexperience
|
|
||||||
{
|
|
||||||
public class JobGiver_UseBucket : ThinkNode_JobGiver
|
|
||||||
{
|
|
||||||
protected override Job TryGiveJob(Pawn pawn)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class JobDriver_CleanSelfWithBucket : JobDriver
|
|
||||||
{
|
|
||||||
const int UNITTIME = 240;//ticks - 120 = 2 real seconds, 3 in-game minutes
|
|
||||||
protected float progress = 0;
|
|
||||||
protected float severitycache = 1;
|
|
||||||
protected Hediff hediffcache;
|
|
||||||
protected float CleaningTime
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return severitycache * UNITTIME;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
|
|
||||||
this.FailOn(delegate
|
|
||||||
{
|
|
||||||
List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
|
|
||||||
return !hediffs.Exists(x => x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Bukkake);
|
|
||||||
});
|
|
||||||
yield return Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.ClosestTouch);
|
|
||||||
Toil cleaning = new Toil();
|
|
||||||
cleaning.initAction = CleaningInit;
|
|
||||||
cleaning.tickAction = CleaningTick;
|
|
||||||
cleaning.AddFinishAction(Finish);
|
|
||||||
cleaning.defaultCompleteMode = ToilCompleteMode.Never;
|
|
||||||
cleaning.WithProgressBar(TargetIndex.A, () => progress/CleaningTime);
|
|
||||||
|
|
||||||
yield return cleaning;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void CleaningInit()
|
|
||||||
{
|
|
||||||
hediffcache = pawn.health.hediffSet.hediffs.Find(x => (x.def == RJW_SemenoOverlayHediffDefOf.Hediff_Semen || x.def == RJW_SemenoOverlayHediffDefOf.Hediff_InsectSpunk));
|
|
||||||
if (hediffcache == null)
|
|
||||||
{
|
|
||||||
pawn.jobs.EndCurrentJob(JobCondition.Succeeded);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
progress = 0;
|
|
||||||
severitycache = hediffcache.Severity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void CleaningTick()
|
|
||||||
{
|
|
||||||
progress += 1;
|
|
||||||
if (progress > CleaningTime)
|
|
||||||
{
|
|
||||||
Cleaned();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void Cleaned()
|
|
||||||
{
|
|
||||||
if (hediffcache != null)
|
|
||||||
{
|
|
||||||
float cumamount = hediffcache.Severity * 10;
|
|
||||||
hediffcache.Severity = 0;
|
|
||||||
Bucket.AddCum(cumamount);
|
|
||||||
}
|
|
||||||
CleaningInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void Finish()
|
|
||||||
{
|
|
||||||
if (pawn.CurJobDef == JobDefOf.Wait_MaintainPosture)
|
|
||||||
{
|
|
||||||
pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using rjw;
|
using rjw;
|
||||||
using rjw.Modules.Interactions.Enums;
|
using rjw.Modules.Interactions.Enums;
|
||||||
|
using RJWSexperience.Cum;
|
||||||
using RJWSexperience.ExtensionMethods;
|
using RJWSexperience.ExtensionMethods;
|
||||||
using RJWSexperience.Logs;
|
using RJWSexperience.Logs;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
@ -66,7 +67,7 @@ namespace RJWSexperience
|
||||||
if (props.sexType == xxx.rjwSextype.Masturbation || partner == null)
|
if (props.sexType == xxx.rjwSextype.Masturbation || partner == null)
|
||||||
{
|
{
|
||||||
Building_CumBucket cumbucket = pawn.GetAdjacentBuilding<Building_CumBucket>();
|
Building_CumBucket cumbucket = pawn.GetAdjacentBuilding<Building_CumBucket>();
|
||||||
cumbucket?.AddCum(pawn.GetCumVolume());
|
cumbucket?.AddCum(CumUtility.GetCumVolume(pawn));
|
||||||
}
|
}
|
||||||
|
|
||||||
RJWUtility.UpdateSatisfactionHIstory(pawn, partner, props, satisfaction);
|
RJWUtility.UpdateSatisfactionHIstory(pawn, partner, props, satisfaction);
|
||||||
|
|
@ -124,7 +125,7 @@ namespace RJWSexperience
|
||||||
if (!PawnsPenisIsInPartnersMouth(props))
|
if (!PawnsPenisIsInPartnersMouth(props))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
props.partner.AteCum(props.pawn.GetCumVolume());
|
CumUtility.FeedCum(props.partner, CumUtility.GetCumVolume(props.pawn));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool PawnsPenisIsInPartnersMouth(SexProps props)
|
private static bool PawnsPenisIsInPartnersMouth(SexProps props)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using rjw;
|
using rjw;
|
||||||
using RJWSexperience.ExtensionMethods;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
|
||||||
|
|
@ -65,18 +65,20 @@
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Building_Cumbucket.cs" />
|
<Compile Include="Cum\Building_Cumbucket.cs" />
|
||||||
<Compile Include="Configurations.cs" />
|
<Compile Include="Configurations.cs" />
|
||||||
|
<Compile Include="Cum\CumUtility.cs" />
|
||||||
|
<Compile Include="Cum\JobGiver_UseBucket.cs" />
|
||||||
<Compile Include="DebugAction.cs" />
|
<Compile Include="DebugAction.cs" />
|
||||||
<Compile Include="ExtensionMethods\PawnExtensions.cs" />
|
<Compile Include="ExtensionMethods\PawnExtensions.cs" />
|
||||||
<Compile Include="ExtensionMethods\SexPropsExtensions.cs" />
|
<Compile Include="ExtensionMethods\SexPropsExtensions.cs" />
|
||||||
<Compile Include="FilterWorkers\SpecialThingFilterWorker_CumBase.cs" />
|
<Compile Include="Cum\FilterWorkers\SpecialThingFilterWorker_CumBase.cs" />
|
||||||
<Compile Include="FilterWorkers\SpecialThingFilterWorker_NoCum.cs" />
|
<Compile Include="Cum\FilterWorkers\SpecialThingFilterWorker_NoCum.cs" />
|
||||||
<Compile Include="GlobalSuppressions.cs" />
|
<Compile Include="GlobalSuppressions.cs" />
|
||||||
<Compile Include="Harmony.cs" />
|
<Compile Include="Harmony.cs" />
|
||||||
<Compile Include="IngestionOutcomeDoers.cs" />
|
<Compile Include="Cum\IngestionOutcomeDoer_RecordEatenCum.cs" />
|
||||||
<Compile Include="Interactions\CumAddictPartKindUsageRule.cs" />
|
<Compile Include="Cum\Interactions\CumAddictPartKindUsageRule.cs" />
|
||||||
<Compile Include="JobDrivers.cs" />
|
<Compile Include="Cum\JobDriver_CleanSelfWithBucket.cs" />
|
||||||
<Compile Include="Logs\DebugLogProvider.cs" />
|
<Compile Include="Logs\DebugLogProvider.cs" />
|
||||||
<Compile Include="Logs\LogManager.cs" />
|
<Compile Include="Logs\LogManager.cs" />
|
||||||
<Compile Include="Patches\DefInjection.cs" />
|
<Compile Include="Patches\DefInjection.cs" />
|
||||||
|
|
@ -92,12 +94,12 @@
|
||||||
<Compile Include="Patches\Rimworld_Patch.cs" />
|
<Compile Include="Patches\Rimworld_Patch.cs" />
|
||||||
<Compile Include="Patches\RJW_Patch.cs" />
|
<Compile Include="Patches\RJW_Patch.cs" />
|
||||||
<Compile Include="SexperienceMod.cs" />
|
<Compile Include="SexperienceMod.cs" />
|
||||||
<Compile Include="FilterWorkers\SpecialThingFilterWorker_Cum.cs" />
|
<Compile Include="Cum\FilterWorkers\SpecialThingFilterWorker_Cum.cs" />
|
||||||
<Compile Include="StatParts.cs" />
|
<Compile Include="StatParts.cs" />
|
||||||
<Compile Include="Thoughts\ThoughtDefExtension_IncreaseRecord.cs" />
|
<Compile Include="Thoughts\ThoughtDefExtension_IncreaseRecord.cs" />
|
||||||
<Compile Include="Thoughts\ThoughtDefExtension_StageFromOpinion.cs" />
|
<Compile Include="Thoughts\ThoughtDefExtension_StageFromOpinion.cs" />
|
||||||
<Compile Include="Thoughts\ThoughtDefExtension_StageFromRecord.cs" />
|
<Compile Include="Thoughts\ThoughtDefExtension_StageFromRecord.cs" />
|
||||||
<Compile Include="Thoughts\Thought_AteCum.cs" />
|
<Compile Include="Cum\Thought_AteCum.cs" />
|
||||||
<Compile Include="Thoughts\Thought_IncreaseRecord.cs" />
|
<Compile Include="Thoughts\Thought_IncreaseRecord.cs" />
|
||||||
<Compile Include="Thoughts\Thought_Opinionbased.cs" />
|
<Compile Include="Thoughts\Thought_Opinionbased.cs" />
|
||||||
<Compile Include="Thoughts\Thought_Recordbased.cs" />
|
<Compile Include="Thoughts\Thought_Recordbased.cs" />
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,15 @@
|
||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using rjw;
|
using rjw;
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using Verse;
|
using Verse;
|
||||||
using Verse.AI;
|
using Verse.AI;
|
||||||
using UnityEngine;
|
|
||||||
using rjw.Modules.Interactions.Objects;
|
using rjw.Modules.Interactions.Objects;
|
||||||
using rjw.Modules.Interactions.Helpers;
|
using rjw.Modules.Interactions.Helpers;
|
||||||
using rjw.Modules.Interactions.Enums;
|
using rjw.Modules.Interactions.Enums;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience
|
||||||
{
|
{
|
||||||
public static class RJWUtility
|
public static class RJWUtility
|
||||||
{
|
{
|
||||||
public static bool RemoveVirginTrait(Pawn pawn, Pawn partner, SexProps props)
|
public static bool RemoveVirginTrait(Pawn pawn, Pawn partner, SexProps props)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
using System.Linq;
|
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience
|
||||||
|
|
@ -36,39 +35,5 @@ namespace RJWSexperience
|
||||||
public static readonly PawnRelationDef relation_birthgiver = DefDatabase<PawnRelationDef>.GetNamed("RJW_Sire");
|
public static readonly PawnRelationDef relation_birthgiver = DefDatabase<PawnRelationDef>.GetNamed("RJW_Sire");
|
||||||
public static readonly PawnRelationDef relation_spawn = DefDatabase<PawnRelationDef>.GetNamed("RJW_Pup");
|
public static readonly PawnRelationDef relation_spawn = DefDatabase<PawnRelationDef>.GetNamed("RJW_Pup");
|
||||||
public static readonly KeyBindingDef OpenSexStatistics = DefDatabase<KeyBindingDef>.GetNamed("OpenSexStatistics");
|
public static readonly KeyBindingDef OpenSexStatistics = DefDatabase<KeyBindingDef>.GetNamed("OpenSexStatistics");
|
||||||
|
|
||||||
public static float CumneedLevelOffset
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (cumneedLevelOffsetcache == null)
|
|
||||||
{
|
|
||||||
CreateCumCompCache();
|
|
||||||
}
|
|
||||||
return cumneedLevelOffsetcache ?? 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float CumexistingAddictionSeverityOffset
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (cumexistingAddictionSeverityOffsetcache == null)
|
|
||||||
{
|
|
||||||
CreateCumCompCache();
|
|
||||||
}
|
|
||||||
return cumexistingAddictionSeverityOffsetcache ?? 1.0f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CreateCumCompCache()
|
|
||||||
{
|
|
||||||
CompProperties_Drug comp = (CompProperties_Drug)GatheredCum.comps.FirstOrDefault(x => x is CompProperties_Drug);
|
|
||||||
cumneedLevelOffsetcache = comp.needLevelOffset;
|
|
||||||
cumexistingAddictionSeverityOffsetcache = comp.existingAddictionSeverityOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static float? cumneedLevelOffsetcache = null;
|
|
||||||
private static float? cumexistingAddictionSeverityOffsetcache = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue