This commit is contained in:
moreoreganostodump 2021-08-14 00:23:12 +09:00
parent 183fb87f02
commit b709cab584
52 changed files with 2003 additions and 360 deletions

View File

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

Binary file not shown.

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<JobDef>
<defName>RapeVictim</defName>
<driverClass>RJWSexperience.JobDriver_RapeVictim</driverClass>
<reportString>rapin' victim</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
</Defs>

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="FurnitureWithQualityBase">
<defName>CumBucket</defName>
<label>cum bucket</label>
<description>A bucket for collecting cums.</description>
<thingClass>RJWSexperience.Building_CumBucket</thingClass>
<graphicData>
<texPath>Things/Item/CumBucket</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<drawSize>(1,1)</drawSize>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<fillPercent>0.4</fillPercent>
<castEdgeShadows>true</castEdgeShadows>
<pathCost>50</pathCost>
<rotatable>false</rotatable>
<stuffCategories>
<li>Metallic</li>
<li>Woody</li>
<li>Stony</li>
</stuffCategories>
<costStuffCount>10</costStuffCount>
<statBases>
<MaxHitPoints>50</MaxHitPoints>
<Mass>8</Mass>
<WorkToBuild>200</WorkToBuild>
<Flammability>1.0</Flammability>
<Beauty>-5</Beauty>
</statBases>
<size>(1,1)</size>
<building>
<preventDeteriorationOnTop>true</preventDeteriorationOnTop>
<ignoreStoredThingsBeauty>true</ignoreStoredThingsBeauty>
<fixedStorageSettings>
<filter>
<disallowNotEverStorable>true</disallowNotEverStorable>
<thingDefs>
<li>GatheredCum</li>
</thingDefs>
</filter>
</fixedStorageSettings>
<defaultStorageSettings>
<priority>Low</priority>
<filter>
<thingDefs>
<li>GatheredCum</li>
</thingDefs>
</filter>
</defaultStorageSettings>
</building>
<inspectorTabs>
<li>ITab_Storage</li>
</inspectorTabs>
<surfaceType>Item</surfaceType>
<canOverlapZones>false</canOverlapZones>
</ThingDef>
</Defs>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="OrganicProductBase">
<ThingDef Name ="GatheredCum" ParentName="OrganicProductBase">
<defName>GatheredCum</defName>
<label>cum</label>
<description>Gathered cum.</description>
@ -24,13 +24,33 @@
<Flammability>0.1</Flammability>
</statBases>
<ingestible>
<foodType>Fluid, AnimalProduct</foodType>
<preferability>DesperateOnlyForHumanlikes</preferability>
<foodType>Fluid, AnimalProduct</foodType>
<preferability>DesperateOnlyForHumanlikes</preferability>
<tasteThought>AteCum</tasteThought>
<specialThoughtAsIngredient>AteCum</specialThoughtAsIngredient>
<optimalityOffsetHumanlikes>-10</optimalityOffsetHumanlikes>
<optimalityOffsetFeedingAnimals>-10</optimalityOffsetFeedingAnimals>
<optimalityOffsetHumanlikes>-10</optimalityOffsetHumanlikes>
<optimalityOffsetFeedingAnimals>-10</optimalityOffsetFeedingAnimals>
<outcomeDoers>
<li Class="IngestionOutcomeDoer_GiveHediff">
<hediffDef>CumTolerance</hediffDef>
<severity>0.032</severity>
<divideByBodySize>true</divideByBodySize>
</li>
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
<offset>0.05</offset>
</li>
</outcomeDoers>
</ingestible>
<comps>
<li Class="CompProperties_Drug">
<chemical>Cum</chemical>
<addictiveness>0.050</addictiveness>
<minToleranceToAddict>0.8</minToleranceToAddict>
<existingAddictionSeverityOffset>0.1</existingAddictionSeverityOffset>
<needLevelOffset>1</needLevelOffset>
<listOrder>30</listOrder>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="PlantFoodRawBase">
@ -57,6 +77,16 @@
<preferability>DesperateOnlyForHumanlikes</preferability>
<tasteThought>AteCum</tasteThought>
<specialThoughtAsIngredient>AteCum</specialThoughtAsIngredient>
<outcomeDoers>
<li Class="IngestionOutcomeDoer_GiveHediff">
<hediffDef>CumTolerance</hediffDef>
<severity>0.032</severity>
<divideByBodySize>true</divideByBodySize>
</li>
<li Class="IngestionOutcomeDoer_OffsetPsyfocus">
<offset>0.05</offset>
</li>
</outcomeDoers>
</ingestible>
<altitudeLayer>Item</altitudeLayer>
<tickerType>Never</tickerType>
@ -67,7 +97,89 @@
<thingCategories>
<li>AnimalProductRaw</li>
</thingCategories>
<comps>
<li Class="CompProperties_Drug">
<chemical>Cum</chemical>
<addictiveness>0.050</addictiveness>
<minToleranceToAddict>0.8</minToleranceToAddict>
<existingAddictionSeverityOffset>0.1</existingAddictionSeverityOffset>
<needLevelOffset>1</needLevelOffset>
<listOrder>30</listOrder>
</li>
</comps>
</ThingDef>
<ChemicalDef>
<defName>Cum</defName>
<label>cum</label>
<addictionHediff>CumAddiction</addictionHediff>
<toleranceHediff>CumTolerance</toleranceHediff>
</ChemicalDef>
<NeedDef ParentName="DrugAddictionNeedBase">
<defName>Chemical_Cum</defName>
<needClass>Need_Chemical</needClass>
<label>cum</label>
<description>Addicted to cum.</description>
<listPriority>10</listPriority>
</NeedDef>
<HediffDef ParentName="DrugToleranceBase">
<defName>CumTolerance</defName>
<label>cum addictiveness</label>
<description>cum addictiveness.</description>
<isBad>false</isBad>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.020</severityPerDay>
</li>
</comps>
</HediffDef>
<HediffDef ParentName="AddictionBase">
<defName>CumAddiction</defName>
<hediffClass>Hediff_Addiction</hediffClass>
<label>cum addiction</label>
<description>cum addiction.</description>
<causesNeed>Chemical_Cum</causesNeed>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.1</severityPerDay>
<showDaysToRecover>true</showDaysToRecover>
</li>
</comps>
<stages>
<li>
<statOffsets>
<SexSatisfaction>0.25</SexSatisfaction>
<SexFrequency>0.25</SexFrequency>
<Vulnerability>0.5</Vulnerability>
</statOffsets>
</li>
<li>
<label>withdrawal</label>
<statOffsets>
<SexSatisfaction>0.25</SexSatisfaction>
<SexFrequency>1.0</SexFrequency>
</statOffsets>
</li>
</stages>
</HediffDef>
<ThoughtDef>
<defName>CumWithdrawal</defName>
<workerClass>ThoughtWorker_Hediff</workerClass>
<hediff>CumAddiction</hediff>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<visible>false</visible>
</li>
<li>
<label>cum withdrawal</label>
<description>I need it.</description>
<baseMoodEffect>-5</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@ -11,6 +11,7 @@
<RSNotHuman>not human</RSNotHuman>
<RSNotAnimal>not animal</RSNotAnimal>
<RSShouldCanFuck>capable of sex is required</RSShouldCanFuck>
<RSTotalGatheredCum>Total gathered cum: </RSTotalGatheredCum>
<RSOption_1_Label>Enable record randomizer</RSOption_1_Label>
<RSOption_1_Desc>Randomize pawn's sex records.</RSOption_1_Desc>

7
LoadFolders.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loadFolders>
<v1.3>
<li>\</li>
<li IfModActive="Ludeon.RimWorld.Ideology">RJWSexperience_Ideology</li>
</v1.3>
</loadFolders>

View File

@ -26,9 +26,6 @@
<Operation Class="PatchOperationAdd">
<xpath>Defs/StatDef[defName="Vulnerability"]/parts</xpath>
<value>
<li Class="RJWSexperience.StatPart_GenderPrimacy">
<modifier>0.5</modifier>
</li>
<li Class="RJWSexperience.StatPart_Slave">
<factor>3.0</factor>
</li>

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using RimWorld;
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);
storedcum -= num;
}
}
}

View File

@ -0,0 +1,343 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using rjw;
using RimWorld;
using Verse;
using UnityEngine;
namespace RJWSexperience.Ideology
{
[HarmonyPatch(typeof(ThinkNode_ChancePerHour_Bestiality), "MtbHours")]
public static class RJW_Patch_ChancePerHour_Bestiality
{
public static void Postfix(Pawn pawn, ref float __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) __result *= BestialityByPrecept(ideo); // ideo is null if don't have dlc
}
public static float BestialityByPrecept(Ideo ideo)
{
if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) return 0.3f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated)) return 0.6f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) return 0.75f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Disapproved)) return 1.0f;
else return 5f;
}
}
[HarmonyPatch(typeof(ThinkNode_ChancePerHour_RapeCP), "MtbHours")]
public static class RJW_Patch_ChancePerHour_RapeCP
{
public static void Postfix(Pawn pawn, ref float __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) __result *= RapeByPrecept(ideo); // ideo is null if don't have dlc
}
public static float RapeByPrecept(Ideo ideo)
{
if (ideo.HasPrecept(VariousDefOf.Rape_Honorable)) return 0.25f;
else if (ideo.HasPrecept(VariousDefOf.Rape_Acceptable)) return 0.5f;
else if (ideo.HasPrecept(VariousDefOf.Rape_Disapproved)) return 1.0f;
else return 3f;
}
}
[HarmonyPatch(typeof(xxx), "is_rapist")]
public static class RJW_Patch_is_rapist
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null && !pawn.IsSubmissive())
{
__result = __result || ideo.HasMeme(VariousDefOf.Rapist);
}
}
}
[HarmonyPatch(typeof(xxx), "is_zoophile")]
public static class RJW_Patch_is_zoophile
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null)
{
__result = __result || ideo.HasMeme(VariousDefOf.Zoophile);
}
}
}
[HarmonyPatch(typeof(xxx), "is_necrophiliac")]
public static class RJW_Patch_is_necrophiliac
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null)
{
__result = __result || ideo.HasMeme(VariousDefOf.Necrophile);
}
}
}
[HarmonyPatch(typeof(SexUtility), "Aftersex", new Type[] { typeof(Pawn), typeof(Pawn), typeof(bool), typeof(bool), typeof(bool), typeof(xxx.rjwSextype) })]
public static class RJW_Patch_Aftersex
{
public static void Postfix(Pawn pawn, Pawn partner, bool usedCondom, bool rape, bool isCoreLovin, xxx.rjwSextype sextype)
{
//Log.Message("Aftersex " + pawn.Label + ": " + sextype);
if (xxx.is_human(pawn)) AfterSexHuman(pawn, partner, usedCondom, rape, isCoreLovin, sextype);
else if (xxx.is_human(partner)) AfterSexHuman(partner, pawn, usedCondom, false, isCoreLovin, sextype, true);
}
public static void AfterSexHuman(Pawn human, Pawn partner, bool usedCondom, bool rape, bool isCoreLovin, xxx.rjwSextype sextype, bool isHumanReceiving = false)
{
string tag = "";
if (human.IsIncest(partner))
{
tag += HETag.Incestous;
}
if (partner.Dead)
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithCorpse.TaggedEvent(human, tag + HETag.Gender(human), partner));
}
else if (partner.IsAnimal())
{
if (isHumanReceiving && rape)
{
if (human.IsSlave) RapeEffectSlave(human);
if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
}
else
{
if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
}
}
else if (xxx.is_human(partner))
{
if (rape)
{
if (partner.IsSlave)
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedSlave.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedSlave.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
RapeEffectSlave(partner);
}
else if (partner.IsPrisoner)
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedPrisoner.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedPrisoner.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
partner.guest.will = Math.Max(0, partner.guest.will - 0.2f);
}
else
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.Raped.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRaped.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
}
}
else
{
HistoryEventDef sexevent = GetSexHistoryDef(sextype);
if (sexevent != null)
{
Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(human, tag + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(partner, tag + HETag.Gender(partner), human));
if (sexevent == VariousDefOf.PromiscuousSex)
{
human.records.AddTo(VariousDefOf.Lust, 1.0f);
partner.records.AddTo(VariousDefOf.Lust, 1.0f);
}
}
}
}
}
public static void RapeEffectSlave(Pawn victim)
{
Need_Suppression suppression = victim.needs.TryGetNeed<Need_Suppression>();
if (suppression != null)
{
Hediff broken = victim.health.hediffSet.GetFirstHediffOfDef(xxx.feelingBroken);
if (broken != null) suppression.CurLevel += 0.3f * broken.Severity + 0.05f;
else suppression.CurLevel += 0.05f;
}
}
/// <summary>
/// only for non-violate human sex
/// </summary>
/// <param name="pawn"></param>
/// <param name="partner"></param>
/// <param name="sextype"></param>
/// <returns></returns>
public static HistoryEventDef GetSexHistoryDef(xxx.rjwSextype sextype)
{
switch (sextype)
{
case xxx.rjwSextype.None:
case xxx.rjwSextype.MechImplant:
default:
return null;
case xxx.rjwSextype.Vaginal:
return VariousDefOf.VaginalSex;
case xxx.rjwSextype.Anal:
case xxx.rjwSextype.Rimming:
return VariousDefOf.AnalSex;
case xxx.rjwSextype.Oral:
case xxx.rjwSextype.Fellatio:
case xxx.rjwSextype.Cunnilingus:
return VariousDefOf.OralSex;
case xxx.rjwSextype.Masturbation:
case xxx.rjwSextype.Boobjob:
case xxx.rjwSextype.Handjob:
case xxx.rjwSextype.Footjob:
case xxx.rjwSextype.Fingering:
case xxx.rjwSextype.MutualMasturbation:
return VariousDefOf.MiscSex;
case xxx.rjwSextype.DoublePenetration:
case xxx.rjwSextype.Scissoring:
case xxx.rjwSextype.Fisting:
case xxx.rjwSextype.Sixtynine:
return VariousDefOf.PromiscuousSex;
}
}
}
/// <summary>
/// Set prefer sextype using precepts
/// </summary>
[HarmonyPatch(typeof(SexUtility), "DetermineSexScores")]
public static class RJW_Patch_DetermineSexScores
{
public static void Postfix(Pawn pawn, Pawn partner, bool rape, bool whoring, Pawn receiving, List<float> __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) PreceptSextype(ideo, pawn.GetStatValue(xxx.sex_drive_stat), __result, 0);
ideo = partner.Ideo;
if (!rape && ideo != null) PreceptSextype(ideo, pawn.GetStatValue(xxx.sex_drive_stat), __result, 1);
}
public static void PreceptSextype(Ideo ideo, float sexdrive, List<float> result, int offset)
{
float mult = 8.0f * Math.Max(0.3f, 1 / Math.Max(0.01f, sexdrive));
if (ideo.HasPrecept(VariousDefOf.Sex_VaginalOnly))
{
result[0 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_AnalOnly))
{
result[2 + offset] *= mult;
result[6 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_OralOnly))
{
result[4 + offset] *= mult;
result[8 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_Promiscuous))
{
result[10 + offset] *= mult;
result[20 + offset] *= mult;
result[24 + offset] *= mult;
result[26 + offset] *= mult;
}
}
}
[HarmonyPatch(typeof(SexAppraiser), "would_fuck", new Type[] { typeof(Pawn), typeof(Pawn), typeof(bool), typeof(bool), typeof(bool) })]
public static class RJW_Patch_would_fuck
{
public static void Postfix(Pawn fucker, Pawn fucked, bool invert_opinion, bool ignore_bleeding, bool ignore_gender, ref float __result)
{
if (xxx.is_human(fucker))
{
Ideo ideo = fucker.Ideo;
if (ideo != null)
{
if (fucker.IsIncest(fucked))
{
if (ideo.HasPrecept(VariousDefOf.Incestuos_IncestOnly)) __result *= 2.0f;
else if (!fucker.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, fucked) ?? false)
{
if (ideo.HasPrecept(VariousDefOf.Incestuos_Disapproved)) __result *= 0.5f;
else if (ideo.HasPrecept(VariousDefOf.Incestuos_Forbidden)) __result *= 0.1f;
}
}
if (fucked.IsAnimal())
{
if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) __result *= 2.0f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated))
{
if (ideo.IsVeneratedAnimal(fucked)) __result *= 2.0f;
else __result *= 0.05f;
}
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) __result *= 1.0f;
else __result *= 0.5f;
}
}
}
}
}
[HarmonyPatch(typeof(PawnDesignations_Breedee), "UpdateCanDesignateBreeding")]
public static class RJW_Patch_UpdateCanDesignateBreeding
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null && ideo.HasMeme(VariousDefOf.Zoophile))
{
SaveStorage.DataStore.GetPawnData(pawn).CanDesignateBreeding = true;
__result = true;
}
}
}
[HarmonyPatch(typeof(Hediff_BasePregnancy), "PostBirth")]
public static class RJW_Patch_PostBirth
{
public static void Postfix(Pawn mother, Pawn father, Pawn baby)
{
if (!mother.IsAnimal())
{
//baby.SetFactionDirect(baby.GetFactionUsingPrecept());
baby.SetFaction(baby.GetFactionUsingPrecept(out Ideo ideo));
baby.ideo.SetIdeo(ideo);
if (baby.Faction == Find.FactionManager.OfPlayer && !baby.IsSlave) baby.guest.SetGuestStatus(null, GuestStatus.Guest);
}
}
}
}

View File

@ -22,6 +22,7 @@ namespace RJWSexperience
public static readonly string RSNotHuman = "RSNotHuman".Translate();
public static readonly string RSNotAnimal = "RSNotAnimal".Translate();
public static readonly string RSShouldCanFuck = "RSShouldCanFuck".Translate();
public static readonly string RSTotalGatheredCum = "RSTotalGatheredCum".Translate();
public static readonly string Option_1_Label = "RSOption_1_Label".Translate();

View File

@ -16,17 +16,16 @@ namespace RJWSexperience
{
Pawn mother = other.GetMother();
Pawn father = other.GetFather();
if (me != other && (mother == me || father == me))
{
//if (!mother?.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, father) ?? true) return true;
//if (!mother?.relations?.DirectRelationExists(PawnRelationDefOf.ExSpouse, father) ?? true) return true;
return (!mother?.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, father) ?? true) || (!mother?.relations?.DirectRelationExists(PawnRelationDefOf.ExSpouse, father) ?? true);
if (mother == null || father == null) return true;
else if (mother.relations != null) return !(mother.relations.DirectRelationExists(PawnRelationDefOf.Spouse, father) || mother.relations.DirectRelationExists(PawnRelationDefOf.ExSpouse, father));
}
return false;
}
}
}

View File

@ -77,11 +77,14 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Buildings.cs" />
<Compile Include="Configurations.cs" />
<Compile Include="DebugAction.cs" />
<Compile Include="GoodwillSituationWorker_MemeCompatibility.cs" />
<Compile Include="Harmony.cs" />
<Compile Include="Ideology\RJW_Patch_Ideo.cs" />
<Compile Include="PawnRelationWorkers.cs" />
<Compile Include="Rituals\JobGiver_DrugOrgy.cs" />
<Compile Include="Rituals\JobGiver_GangbangVictim.cs" />
<Compile Include="Keyed.cs" />
<Compile Include="PreceptComp_SelftTookThoughtExtended.cs" />

View File

@ -49,8 +49,8 @@ namespace RJWSexperience
}
}
Pawn mother = baby.GetMother();
ideo = mother.Ideo;
return mother.Faction;
ideo = mother?.Ideo;
return mother?.Faction ?? baby.Faction;
}
@ -96,28 +96,32 @@ namespace RJWSexperience
}
[HarmonyPatch(typeof(SexUtility), "SatisfyPersonal")]
public static class RJW_Patch_SatisfyPersonal_Pre
public static class RJW_Patch_SatisfyPersonal
{
private const float base_sat_per_fuck = 0.4f;
public static void Prefix(Pawn pawn, Pawn partner, xxx.rjwSextype sextype, bool violent, bool pawn_is_raping, ref float satisfaction)
{
satisfaction *= partner.GetSexStat();
}
}
[HarmonyPatch(typeof(SexUtility), "SatisfyPersonal")]
public static class RJW_Patch_SatisfyPersonal_Post
{
private const float base_sat_per_fuck = 0.4f;
public static void Postfix(Pawn pawn, Pawn partner, xxx.rjwSextype sextype, bool violent, bool pawn_is_raping, float satisfaction)
{
float? lust = pawn.records?.GetValue(VariousDefOf.Lust);
if (lust != null)
{
if (sextype != xxx.rjwSextype.Masturbation) pawn.records.AddTo(VariousDefOf.Lust, Mathf.Clamp((satisfaction - base_sat_per_fuck) * LustIncrementFactor(lust ?? 0),-0.5f,0.5f)); // If the sex is satisfactory, lust grows up. Declines at the opposite.
else pawn.records.AddTo(VariousDefOf.Lust, Mathf.Clamp(satisfaction * satisfaction * LustIncrementFactor(lust ?? 0), 0,0.5f)); // Masturbation always increases lust.
if (sextype != xxx.rjwSextype.Masturbation || partner != null) pawn.records.AddTo(VariousDefOf.Lust, Mathf.Clamp((satisfaction - base_sat_per_fuck) * LustIncrementFactor(lust ?? 0), -0.5f, 0.5f)); // If the sex is satisfactory, lust grows up. Declines at the opposite.
else pawn.records.AddTo(VariousDefOf.Lust, Mathf.Clamp(satisfaction * satisfaction * LustIncrementFactor(lust ?? 0), 0, 0.5f)); // Masturbation always increases lust.
}
if (sextype == xxx.rjwSextype.Masturbation || partner == null)
{
Building_CumBucket cumbucket = (Building_CumBucket)pawn.GetAdjacentBuilding<Building_CumBucket>();
if (cumbucket != null)
{
cumbucket.AddCum(pawn.GetCumVolume());
}
}
}
public static float LustIncrementFactor(float lust)
@ -125,43 +129,8 @@ namespace RJWSexperience
return Mathf.Exp(-Mathf.Pow(lust / Configurations.LustLimit, 2));
}
}
[HarmonyPatch(typeof(ThinkNode_ChancePerHour_Bestiality), "MtbHours")]
public static class RJW_Patch_ChancePerHour_Bestiality
{
public static void Postfix(Pawn pawn, ref float __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) __result *= BestialityByPrecept(ideo); // ideo is null if don't have dlc
}
public static float BestialityByPrecept(Ideo ideo)
{
if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) return 0.3f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated)) return 0.6f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) return 0.75f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Disapproved)) return 1.0f;
else return 5f;
}
}
[HarmonyPatch(typeof(ThinkNode_ChancePerHour_RapeCP), "MtbHours")]
public static class RJW_Patch_ChancePerHour_RapeCP
{
public static void Postfix(Pawn pawn, ref float __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) __result *= RapeByPrecept(ideo); // ideo is null if don't have dlc
}
public static float RapeByPrecept(Ideo ideo)
{
if (ideo.HasPrecept(VariousDefOf.Rape_Honorable)) return 0.25f;
else if (ideo.HasPrecept(VariousDefOf.Rape_Acceptable)) return 0.5f;
else if (ideo.HasPrecept(VariousDefOf.Rape_Disapproved)) return 1.0f;
else return 3f;
}
}
[HarmonyPatch(typeof(xxx), "TransferNutrition")]
@ -178,212 +147,7 @@ namespace RJWSexperience
sextype == xxx.rjwSextype.Fellatio ||
sextype == xxx.rjwSextype.Sixtynine))
{
receiver.needs?.mood?.thoughts?.memories?.TryGainMemoryFast(VariousDefOf.AteCum);
}
}
}
[HarmonyPatch(typeof(xxx), "is_rapist")]
public static class RJW_Patch_is_rapist
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null)
{
__result = __result || ideo.HasMeme(VariousDefOf.Rapist);
}
}
}
[HarmonyPatch(typeof(xxx), "is_zoophile")]
public static class RJW_Patch_is_zoophile
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null)
{
__result = __result || ideo.HasMeme(VariousDefOf.Zoophile);
}
}
}
[HarmonyPatch(typeof(SexUtility), "Aftersex", new Type[] {typeof(Pawn), typeof(Pawn), typeof(bool), typeof(bool), typeof(bool), typeof(xxx.rjwSextype) })]
public static class RJW_Patch_Aftersex
{
public static void Postfix(Pawn pawn, Pawn partner, bool usedCondom, bool rape, bool isCoreLovin, xxx.rjwSextype sextype)
{
//Log.Message("Aftersex " + pawn.Label + ": " + sextype);
if (xxx.is_human(pawn)) AfterSexHuman(pawn, partner, usedCondom, rape, isCoreLovin, sextype);
else if (xxx.is_human(partner)) AfterSexHuman(partner, pawn, usedCondom, false, isCoreLovin, sextype, true);
}
public static void AfterSexHuman(Pawn human, Pawn partner, bool usedCondom, bool rape, bool isCoreLovin, xxx.rjwSextype sextype, bool isHumanReceiving = false)
{
string tag = "";
if (human.IsIncest(partner))
{
tag += HETag.Incestous;
}
if (partner.IsAnimal())
{
if (isHumanReceiving && rape)
{
if (human.IsSlave) RapeEffectSlave(human);
if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
}
else
{
if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
}
}
else if (xxx.is_human(partner))
{
if (rape)
{
if (partner.IsSlave)
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedSlave.TaggedEvent(human ,tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedSlave.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
RapeEffectSlave(partner);
}
else if (partner.IsPrisoner)
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedPrisoner.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedPrisoner.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
partner.guest.will = Math.Max(0, partner.guest.will - 0.2f);
}
else
{
Find.HistoryEventsManager.RecordEvent(VariousDefOf.Raped.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRaped.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
}
}
else
{
HistoryEventDef sexevent = GetSexHistoryDef(sextype);
if (sexevent != null)
{
Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(human, tag + HETag.Gender(human), partner));
Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(partner, tag + HETag.Gender(partner), human));
if (sexevent == VariousDefOf.PromiscuousSex)
{
human.records.AddTo(VariousDefOf.Lust, 1.0f);
partner.records.AddTo(VariousDefOf.Lust, 1.0f);
}
}
}
}
}
public static void RapeEffectSlave(Pawn victim)
{
Need_Suppression suppression = victim.needs.TryGetNeed<Need_Suppression>();
if (suppression != null)
{
Hediff broken = victim.health.hediffSet.GetFirstHediffOfDef(xxx.feelingBroken);
if (broken != null) suppression.CurLevel += 0.3f * broken.Severity + 0.05f;
else suppression.CurLevel += 0.05f;
}
}
/// <summary>
/// only for non-violate human sex
/// </summary>
/// <param name="pawn"></param>
/// <param name="partner"></param>
/// <param name="sextype"></param>
/// <returns></returns>
public static HistoryEventDef GetSexHistoryDef(xxx.rjwSextype sextype)
{
switch (sextype)
{
case xxx.rjwSextype.None:
case xxx.rjwSextype.MechImplant:
default:
return null;
case xxx.rjwSextype.Vaginal:
return VariousDefOf.VaginalSex;
case xxx.rjwSextype.Anal:
case xxx.rjwSextype.Rimming:
return VariousDefOf.AnalSex;
case xxx.rjwSextype.Oral:
case xxx.rjwSextype.Fellatio:
case xxx.rjwSextype.Cunnilingus:
return VariousDefOf.OralSex;
case xxx.rjwSextype.Masturbation:
case xxx.rjwSextype.Boobjob:
case xxx.rjwSextype.Handjob:
case xxx.rjwSextype.Footjob:
case xxx.rjwSextype.Fingering:
case xxx.rjwSextype.MutualMasturbation:
return VariousDefOf.MiscSex;
case xxx.rjwSextype.DoublePenetration :
case xxx.rjwSextype.Scissoring :
case xxx.rjwSextype.Fisting :
case xxx.rjwSextype.Sixtynine :
return VariousDefOf.PromiscuousSex;
}
}
}
/// <summary>
/// Set prefer sextype using precepts
/// </summary>
[HarmonyPatch(typeof(SexUtility), "DetermineSexScores")]
public static class RJW_Patch_DetermineSexScores
{
public static void Postfix(Pawn pawn, Pawn partner, bool rape, bool whoring, Pawn receiving, List<float> __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null) PreceptSextype(ideo, pawn.GetStatValue(xxx.sex_drive_stat), __result, 0);
ideo = partner.Ideo;
if (!rape && ideo != null) PreceptSextype(ideo, pawn.GetStatValue(xxx.sex_drive_stat), __result, 1);
}
public static void PreceptSextype(Ideo ideo, float sexdrive, List<float> result, int offset)
{
float mult = 8.0f * Math.Max(0.3f, 1 / Math.Max(0.01f, sexdrive));
if (ideo.HasPrecept(VariousDefOf.Sex_VaginalOnly))
{
result[0 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_AnalOnly))
{
result[2 + offset] *= mult;
result[6 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_OralOnly))
{
result[4 + offset] *= mult;
result[8 + offset] *= mult;
}
else if (ideo.HasPrecept(VariousDefOf.Sex_Promiscuous))
{
result[10 + offset] *= mult;
result[20 + offset] *= mult;
result[24 + offset] *= mult;
result[26 + offset] *= mult;
receiver.CumDrugEffect();
}
}
}
@ -403,74 +167,6 @@ namespace RJWSexperience
}
}
[HarmonyPatch(typeof(SexAppraiser), "would_fuck", new Type[] {typeof(Pawn), typeof(Pawn), typeof(bool), typeof(bool), typeof(bool) })]
public static class RJW_Patch_would_fuck
{
public static void Postfix(Pawn fucker, Pawn fucked, bool invert_opinion, bool ignore_bleeding, bool ignore_gender, ref float __result)
{
if (xxx.is_human(fucker))
{
Ideo ideo = fucker.Ideo;
if (ideo != null)
{
if (fucker.IsIncest(fucked))
{
if (ideo.HasPrecept(VariousDefOf.Incestuos_IncestOnly)) __result *= 2.0f;
else if (!fucker.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, fucked) ?? false)
{
if (ideo.HasPrecept(VariousDefOf.Incestuos_Disapproved)) __result *= 0.5f;
else if (ideo.HasPrecept(VariousDefOf.Incestuos_Forbidden)) __result *= 0.1f;
}
}
if (fucked.IsAnimal())
{
if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) __result *= 2.0f;
else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated))
{
if (ideo.IsVeneratedAnimal(fucked)) __result *= 2.0f;
else __result *= 0.05f;
}
else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) __result *= 1.0f;
else __result *= 0.5f;
}
}
}
}
}
[HarmonyPatch(typeof(PawnDesignations_Breedee), "UpdateCanDesignateBreeding")]
public static class RJW_Patch_UpdateCanDesignateBreeding
{
public static void Postfix(Pawn pawn, ref bool __result)
{
Ideo ideo = pawn.Ideo;
if (ideo != null && ideo.HasMeme(VariousDefOf.Zoophile))
{
SaveStorage.DataStore.GetPawnData(pawn).CanDesignateBreeding = true;
__result = true;
}
}
}
[HarmonyPatch(typeof(Hediff_BasePregnancy), "PostBirth")]
public static class RJW_Patch_PostBirth
{
public static void Postfix(Pawn mother, Pawn father, Pawn baby)
{
if (!mother.IsAnimal())
{
//baby.SetFactionDirect(baby.GetFactionUsingPrecept());
baby.SetFaction(baby.GetFactionUsingPrecept(out Ideo ideo));
baby.ideo.SetIdeo(ideo);
if (baby.Faction == Find.FactionManager.OfPlayer && !baby.IsSlave) baby.guest.SetGuestStatus(null, GuestStatus.Guest);
}
}
}
}

View File

@ -24,6 +24,8 @@ namespace RJWSexperience
Find.HistoryEventsManager.RecordEvent(new HistoryEvent(VariousDefOf.Incestuos_Marriage, secondPawn.Named(HistoryEventArgsNames.Doer)));
}
}
}
[HarmonyPatch(typeof(Pawn_RelationsTracker), "SecondaryRomanceChanceFactor")]

View File

@ -0,0 +1,279 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using rjw;
using Verse;
using Verse.AI;
using RimWorld;
namespace RJWSexperience
{
public class JobGiver_DrugOrgy : ThinkNode_JobGiver
{
protected override Job TryGiveJob(Pawn pawn)
{
if (pawn.Drafted) return null;
DutyDef dutyDef = null;
PawnDuty duty = null;
if (pawn.mindState != null)
{
duty = pawn.mindState.duty;
dutyDef = duty.def;
}
else return null;
if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn))
{
return null;
}
Pawn target = FindPartner(pawn, duty);
if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None,1)) return JobMaker.MakeJob(VariousDefOf.DrugMasturbate);
return JobMaker.MakeJob(VariousDefOf.DrugSex, target);
}
protected Pawn FindPartner(Pawn pawn, PawnDuty duty)
{
if (duty != null)
{
List<Pawn> pawns = pawn.Map.mapPawns.AllPawnsSpawned.FindAll(x => x.mindState?.duty?.def == duty.def);
return pawns.RandomElementByWeightWithDefault(x => SexAppraiser.would_fuck(pawn,x), 0.1f);
}
return null;
}
}
/// <summary>
/// copied from rjw
/// </summary>
public class JobDriver_SexDrugOrgy : JobDriver_SexBaseInitiator
{
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return true;
}
protected override IEnumerable<Toil> MakeNewToils()
{
//ModLog.Message("" + this.GetType().ToString() + "::MakeNewToils() called");
setup_ticks();
var PartnerJob = VariousDefOf.GettinDrugSex;
this.FailOnDespawnedNullOrForbidden(iTarget);
this.FailOn(() => !Partner.health.capacities.CanBeAwake);
this.FailOn(() => pawn.Drafted);
this.FailOn(() => Partner == null);
yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell);
//Toil findQuickieSpot = new Toil();
//findQuickieSpot.defaultCompleteMode = ToilCompleteMode.PatherArrival;
//findQuickieSpot.initAction = delegate
//{
// var spot = Partner.Position.RandomAdjacentCell8Way();
// pawn.pather.StartPath(spot, PathEndMode.OnCell);
// Partner.jobs.StopAll(); //sometimes errors with stuff like vomiting
// Job job = JobMaker.MakeJob(JobDefOf.GotoMindControlled, spot);
// Partner.jobs.StartJob(job, JobCondition.InterruptForced);
//};
//yield return findQuickieSpot;
Toil WaitForPartner = new Toil();
WaitForPartner.defaultCompleteMode = ToilCompleteMode.Delay;
WaitForPartner.initAction = delegate
{
ticksLeftThisToil = 5000;
};
WaitForPartner.tickAction = delegate
{
pawn.GainComfortFromCellIfPossible();
if (pawn.Position.DistanceTo(Partner.Position) <= 1f)
{
ReadyForNextToil();
}
};
yield return WaitForPartner;
Toil StartPartnerJob = new Toil();
StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant;
StartPartnerJob.socialMode = RandomSocialMode.Off;
StartPartnerJob.initAction = delegate
{
var dri = Partner.jobs.curDriver as JobDriver_DrugSexReceiver;
if (dri == null)
{
Job gettingQuickie = JobMaker.MakeJob(PartnerJob, pawn, Partner);
Partner.jobs.StartJob(gettingQuickie, JobCondition.InterruptForced);
}
};
yield return StartPartnerJob;
Toil SexToil = new Toil();
SexToil.defaultCompleteMode = ToilCompleteMode.Never;
SexToil.socialMode = RandomSocialMode.Off;
SexToil.defaultDuration = duration;
SexToil.handlingFacing = true;
SexToil.FailOn(() => Partner.CurJob.def != PartnerJob);
SexToil.initAction = delegate
{
Partner.pather.StopDead();
Partner.jobs.curDriver.asleep = false;
usedCondom = CondomUtility.TryUseCondom(pawn) || CondomUtility.TryUseCondom(Partner);
Start();
};
SexToil.AddPreTickAction(delegate
{
SexTick(pawn, Partner);
SexUtility.reduce_rest(Partner, 1);
SexUtility.reduce_rest(pawn, 1);
if (ticks_left <= 0)
ReadyForNextToil();
});
SexToil.AddFinishAction(delegate
{
End();
});
yield return SexToil;
yield return new Toil
{
initAction = delegate
{
//// Trying to add some interactions and social logs
SexUtility.ProcessSex(pawn, Partner, usedCondom: usedCondom, rape: isRape, sextype: sexType);
},
defaultCompleteMode = ToilCompleteMode.Instant
};
}
}
/// <summary>
/// copied from rjw
/// </summary>
public class JobDriver_DrugSexReceiver : JobDriver_SexBaseRecieverLoved
{
protected override IEnumerable<Toil> MakeNewToils()
{
setup_ticks();
parteners.Add(Partner);// add job starter, so this wont fail, before Initiator starts his job
//--ModLog.Message("JobDriver_GettinLoved::MakeNewToils is called");
//ModLog.Message("" + Partner.CurJob.def);
// More/less hearts based on opinion.
if (pawn.relations.OpinionOf(Partner) < 0)
ticks_between_hearts += 50;
else if (pawn.relations.OpinionOf(Partner) > 60)
ticks_between_hearts -= 25;
this.FailOnDespawnedOrNull(iTarget);
this.FailOn(() => !Partner.health.capacities.CanBeAwake);
this.FailOn(() => pawn.Drafted);
this.FailOn(() => Partner.Drafted);
this.FailOn(() => Partner == null);
yield return Toils_Reserve.Reserve(iTarget, 1, 0);
var get_loved = MakeSexToil();
get_loved.handlingFacing = false;
yield return get_loved;
}
protected Toil MakeSexToil()
{
Toil get_loved = new Toil();
get_loved.defaultCompleteMode = ToilCompleteMode.Never;
get_loved.socialMode = RandomSocialMode.Off;
get_loved.handlingFacing = true;
//get_loved.initAction = delegate
//{
//};
get_loved.tickAction = delegate
{
};
get_loved.AddEndCondition(new Func<JobCondition>(() =>
{
if (parteners.Count <= 0)
{
return JobCondition.Succeeded;
}
return JobCondition.Ongoing;
}));
get_loved.AddFinishAction(delegate
{
if (xxx.is_human(pawn))
pawn.Drawer.renderer.graphics.ResolveApparelGraphics();
});
get_loved.socialMode = RandomSocialMode.Off;
return get_loved;
}
}
/// <summary>
/// copied from rjw
/// </summary>
public class JobDriver_DrugMasturabate : JobDriver_Masturbate
{
protected override IEnumerable<Toil> MakeNewToils()
{
setup_ticks();
//this.FailOn(() => PawnUtility.PlayerForcedJobNowOrSoon(pawn));
this.FailOn(() => pawn.health.Downed);
this.FailOn(() => pawn.IsBurning());
this.FailOn(() => pawn.IsFighting());
this.FailOn(() => pawn.Drafted);
//ModLog.Message(" Making new toil for QuickFap.");
Toil SexToil = Toils_General.Wait(duration);
SexToil.handlingFacing = true;
SexToil.initAction = delegate
{
Start();
};
SexToil.tickAction = delegate
{
SexTick(pawn, null, true);
SexUtility.reduce_rest(pawn, 1);
if (ticks_left <= 0)
ReadyForNextToil();
};
SexToil.AddFinishAction(delegate
{
End();
});
yield return SexToil;
yield return new Toil
{
initAction = delegate
{
SexUtility.Aftersex(pawn, xxx.rjwSextype.Masturbation);
if (!SexUtility.ConsiderCleaning(pawn)) return;
LocalTargetInfo own_cum = pawn.PositionHeld.GetFirstThing<Filth>(pawn.Map);
Job clean = JobMaker.MakeJob(JobDefOf.Clean);
clean.AddQueuedTarget(TargetIndex.A, own_cum);
pawn.jobs.jobQueue.EnqueueFirst(clean);
},
defaultCompleteMode = ToilCompleteMode.Instant
};
}
}
}

View File

@ -33,7 +33,7 @@ namespace RJWSexperience
if (pawn.IsPrisonerOfColony || pawn.IsSlaveOfColony) return true;
if (pawn.Ideo?.HasMeme(MemeDefOf.FemaleSupremacy) ?? false && pawn.gender != Gender.Female) return true;
else if (pawn.Ideo?.HasMeme(MemeDefOf.MaleSupremacy) ?? false && pawn.gender != Gender.Male) return true;
else if (pawn.IsDesignatedComfort() || (pawn.guilt != null && pawn.guilt.IsGuilty) || (pawn.apparel != null && pawn.apparel.PsychologicallyNude)) return true;
if (pawn.IsDesignatedComfort() || (pawn.guilt != null && pawn.guilt.IsGuilty) || (pawn.apparel != null && pawn.apparel.PsychologicallyNude)) return true;
return false;
}
}
@ -97,10 +97,10 @@ namespace RJWSexperience
public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept)
{
//if (precept != null)
//{
// if (precept.ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) return false;
//}
if (precept != null)
{
if (precept.ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) return false;
}
if (!xxx.can_rape(animal)) return false;
return true;
}

View File

@ -48,6 +48,15 @@ namespace RJWSexperience
protected int recordIncrement = 1;
public override int CurStageIndex
{
get
{
if (pawn.health.hediffSet.HasHediff(VariousDefOf.CumAddiction)) return minimumValueforStage.Count;
return base.CurStageIndex;
}
}
public override void ExposeData()
{
base.ExposeData();

View File

@ -84,5 +84,83 @@ namespace RJWSexperience
return 1 + lust / 100f;
}
public static bool IsSubmissive(this Pawn pawn)
{
Ideo ideo = pawn.Ideo;
if (ideo != null)
{
if (ideo.HasPrecept(VariousDefOf.Submissive_Female) && pawn.gender == Gender.Female) return true;
else if (ideo.HasPrecept(VariousDefOf.Submissive_Male) && pawn.gender == Gender.Male) return true;
}
return false;
}
public static Building GetAdjacentBuilding<T>(this Pawn pawn) where T : Building
{
if (pawn.Spawned)
{
EdificeGrid edifice = pawn.Map.edificeGrid;
if (edifice[pawn.Position] is T) return edifice[pawn.Position];
IEnumerable<IntVec3> adjcells = GenAdjFast.AdjacentCells8Way(pawn.Position);
foreach(IntVec3 pos in adjcells)
{
if (edifice[pos] is T) return edifice[pos];
}
}
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;
}
public static void CumDrugEffect(this Pawn pawn)
{
Need need = pawn.needs?.TryGetNeed(VariousDefOf.Chemical_Cum);
if (need != null) need.CurLevel += VariousDefOf.CumneedLevelOffset;
Hediff addictive = HediffMaker.MakeHediff(VariousDefOf.CumTolerance, pawn);
addictive.Severity = 0.032f;
pawn.health.AddHediff(addictive);
Hediff addiction = pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.CumAddiction);
if (addiction != null) addiction.Severity += VariousDefOf.CumexistingAddictionSeverityOffset;
pawn.needs?.mood?.thoughts?.memories?.TryGainMemoryFast(VariousDefOf.AteCum);
}
}
}

View File

@ -15,9 +15,54 @@ namespace RJWSexperience
public static readonly SkillDef SexSkill = DefDatabase<SkillDef>.GetNamed("Sex");
public static readonly ThoughtDef_Recordbased AteCum = DefDatabase<ThoughtDef_Recordbased>.GetNamed("AteCum");
public static readonly JobDef RapeVictim = DefDatabase<JobDef>.GetNamed("RapeVictim");
public static readonly JobDef DrugSex = DefDatabase<JobDef>.GetNamed("DrugSex");
public static readonly JobDef GettinDrugSex = DefDatabase<JobDef>.GetNamed("GettinDrugSex");
public static readonly JobDef DrugMasturbate = DefDatabase<JobDef>.GetNamed("DrugMasturbate");
public static readonly PawnRelationDef Bastard = DefDatabase<PawnRelationDef>.GetNamed("Bastard");
public static readonly ThingDef GatheredCum = DefDatabase<ThingDef>.GetNamed("GatheredCum");
public static readonly HediffDef CumAddiction = DefDatabase<HediffDef>.GetNamed("CumAddiction");
public static readonly HediffDef CumTolerance = DefDatabase<HediffDef>.GetNamed("CumTolerance");
public static readonly ChemicalDef Cum = DefDatabase<ChemicalDef>.GetNamed("Cum");
public static readonly NeedDef Chemical_Cum = DefDatabase<NeedDef>.GetNamed("Chemical_Cum");
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;
}
protected static float? cumneedLevelOffsetcache = null;
protected static float? cumexistingAddictionSeverityOffsetcache = null;
[MayRequireIdeology] public static readonly MemeDef Zoophile = DefDatabase<MemeDef>.GetNamed("Zoophile");
[MayRequireIdeology] public static readonly MemeDef Rapist = DefDatabase<MemeDef>.GetNamed("Rapist");
[MayRequireIdeology] public static readonly MemeDef Lewd = DefDatabase<MemeDef>.GetNamed("Lewd");
[MayRequireIdeology] public static readonly MemeDef Necrophile = DefDatabase<MemeDef>.GetNamed("Necrophile");
[MayRequireIdeology] public static readonly HistoryEventDef SexWithAnimal = DefDatabase<HistoryEventDef>.GetNamed("SexWithAnimal");
[MayRequireIdeology] public static readonly HistoryEventDef SexWithVeneratedAnimal = DefDatabase<HistoryEventDef>.GetNamed("SexWithVeneratedAnimal");
[MayRequireIdeology] public static readonly HistoryEventDef Raped = DefDatabase<HistoryEventDef>.GetNamed("Raped");
@ -32,6 +77,7 @@ namespace RJWSexperience
[MayRequireIdeology] public static readonly HistoryEventDef MiscSex = DefDatabase<HistoryEventDef>.GetNamed("MiscSex");
[MayRequireIdeology] public static readonly HistoryEventDef PromiscuousSex = DefDatabase<HistoryEventDef>.GetNamed("PromiscuousSex");
[MayRequireIdeology] public static readonly HistoryEventDef Incestuos_Marriage = DefDatabase<HistoryEventDef>.GetNamed("Incestuos_Marriage");
[MayRequireIdeology] public static readonly HistoryEventDef SexWithCorpse = DefDatabase<HistoryEventDef>.GetNamed("SexWithCorpse");
[MayRequireIdeology] public static readonly PreceptDef Bestiality_Abhorrent = DefDatabase<PreceptDef>.GetNamed("Bestiality_Abhorrent");
[MayRequireIdeology] public static readonly PreceptDef Bestiality_Horrible = DefDatabase<PreceptDef>.GetNamed("Bestiality_Horrible");
[MayRequireIdeology] public static readonly PreceptDef Bestiality_Disapproved = DefDatabase<PreceptDef>.GetNamed("Bestiality_Disapproved");
@ -56,5 +102,13 @@ namespace RJWSexperience
[MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysMother = DefDatabase<PreceptDef>.GetNamed("BabyFaction_AlwaysMother");
[MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysFather = DefDatabase<PreceptDef>.GetNamed("BabyFaction_AlwaysFather");
[MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysColony = DefDatabase<PreceptDef>.GetNamed("BabyFaction_AlwaysColony");
[MayRequireIdeology] public static readonly PreceptDef Submissive_None = DefDatabase<PreceptDef>.GetNamed("Submissive_None");
[MayRequireIdeology] public static readonly PreceptDef Submissive_Male = DefDatabase<PreceptDef>.GetNamed("Submissive_Male");
[MayRequireIdeology] public static readonly PreceptDef Submissive_Female = DefDatabase<PreceptDef>.GetNamed("Submissive_Female");
[MayRequireIdeology] public static readonly PreceptDef Necrophilia_Abhorrent = DefDatabase<PreceptDef>.GetNamed("Necrophilia_Abhorrent");
[MayRequireIdeology] public static readonly PreceptDef Necrophilia_Horrible = DefDatabase<PreceptDef>.GetNamed("Necrophilia_Horrible");
[MayRequireIdeology] public static readonly PreceptDef Necrophilia_Disapproved = DefDatabase<PreceptDef>.GetNamed("Necrophilia_Disapproved");
[MayRequireIdeology] public static readonly PreceptDef Necrophilia_Acceptable = DefDatabase<PreceptDef>.GetNamed("Necrophilia_Acceptable");
[MayRequireIdeology] public static readonly PreceptDef Necrophilia_Approved = DefDatabase<PreceptDef>.GetNamed("Necrophilia_Approved");
}
}

View File

@ -36,6 +36,29 @@
</subNodes>
</thinkNode>
</DutyDef>
<DutyDef>
<defName>DrugOrgy</defName>
<hook>HighPriority</hook>
<socialModeMax>Off</socialModeMax>
<thinkNode Class="ThinkNode_Priority">
<subNodes>
<li Class="ThinkNode_ConditionalInGatheringArea">
<subNodes>
<li Class="ThinkNode_ConditionalRandom">
<chance>0.15</chance>
<subNodes>
<li Class="RJWSexperience.JobGiver_DrugOrgy"/>
</subNodes>
</li>
</subNodes>
</li>
<li Class="JobGiver_WanderInGatheringArea">
<locomotionUrgency>Jog</locomotionUrgency>
<ticksBetweenWandersRange>50~250</ticksBetweenWandersRange>
</li>
</subNodes>
</thinkNode>
</DutyDef>
</Defs>

View File

@ -11,6 +11,14 @@
<naturalGoodwillOffset>30</naturalGoodwillOffset>
</GoodwillSituationDef>
<GoodwillSituationDef>
<defName>Necrophile_Necrophile</defName>
<label>necrophile agreement</label>
<workerClass>GoodwillSituationWorker_MemeCompatibility</workerClass>
<meme>Necrophile</meme>
<otherMeme>Necrophile</otherMeme>
<naturalGoodwillOffset>30</naturalGoodwillOffset>
</GoodwillSituationDef>
<!-- Disagreement -->
<GoodwillSituationDef>
@ -30,4 +38,13 @@
<versusAll>true</versusAll>
<naturalGoodwillOffset>-20</naturalGoodwillOffset>
</GoodwillSituationDef>
<GoodwillSituationDef>
<defName>Necrophile_All</defName>
<label>necrophile</label>
<workerClass>RJWSexperience.GoodwillSituationWorker_OneWayReceive</workerClass>
<meme>Necrophile</meme>
<versusAll>true</versusAll>
<naturalGoodwillOffset>-50</naturalGoodwillOffset>
</GoodwillSituationDef>
</Defs>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<JobDef>
<defName>RapeVictim</defName>
<driverClass>RJWSexperience.JobDriver_RapeVictim</driverClass>
<reportString>rapin' victim</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
<JobDef>
<defName>DrugSex</defName>
<driverClass>RJWSexperience.JobDriver_SexDrugOrgy</driverClass>
<reportString>lovin'.</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
<JobDef>
<defName>GettinDrugSex</defName>
<driverClass>RJWSexperience.JobDriver_DrugSexReceiver</driverClass>
<reportString>lovin'.</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
<JobDef>
<defName>DrugMasturbate</defName>
<driverClass>RJWSexperience.JobDriver_DrugMasturabate</driverClass>
<reportString>masturbatin'.</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
</Defs>

View File

@ -151,4 +151,93 @@
</agreeableTraits>
</MemeDef>
<MemeDef ParentName="SexualDissoulutelyBase">
<defName>Lewd</defName>
<label>lewd</label>
<description>Perverts.</description>
<iconPath>UI/Memes/SexualDissolutely</iconPath>
<impact>3</impact>
<consumableBuildings>
<li>Burnbong_Aphrodisiac</li>
</consumableBuildings>
<requireOne>
<li>
<li>Lovin_FreeApproved</li>
</li>
<li>
<li>Incestuos_Free</li>
</li>
<li>
<li>Sex_Free</li>
<li>Sex_Promiscuous</li>
</li>
</requireOne>
<requiredRituals>
<li>
<precept>DateRitualConsumable</precept>
<pattern>DrugOrgy</pattern>
<building>Burnbong_Aphrodisiac</building>
</li>
</requiredRituals>
<generalRules>
<rulesStrings>
<li>memeAdjective->horny</li>
<li>memeAdjective->lewd</li>
<li>memeAdjective->arousing</li>
<li>memeAdjective->sexy</li>
<li>memeAdjective->estrous</li>
<li>memeAdjective->decadent</li>
<li>memeHyphenPrefix->estro</li>
<li>memeHyphenPrefix->lust</li>
<li>memeConcept->lust</li>
<li>memeConcept->libido</li>
<li>memeConcept->estrus</li>
<li>memeConcept->arousal</li>
<li>memeConcept->desire</li>
<li>memeConcept->sex</li>
<li>memeConcept->perversion</li>
<li>memeGod->slaanesh</li>
</rulesStrings>
</generalRules>
<symbolPacks>
<li>
<ideoName>Cult of Slaanesh</ideoName>
<theme>pleasure</theme>
<adjective>decadent</adjective>
<member>heretic</member>
</li>
</symbolPacks>
<addDesignators>
<li>Autobong_Aphrodisiac</li>
</addDesignators>
<agreeableTraits>
<li>Nymphomaniac</li>
</agreeableTraits>
</MemeDef>
<MemeDef ParentName="SexualDissoulutelyBase">
<defName>Necrophile</defName>
<label>necrophile</label>
<description>Corpse fuckers.</description>
<iconPath>UI/Memes/Necrophile</iconPath>
<impact>2</impact>
<requireOne>
<li>
<li>Necrophilia_Acceptable</li>
<li>Necrophilia_Approved</li>
</li>
<li>
<li>Corpses_DontCare</li>
</li>
</requireOne>
<generalRules>
<rulesStrings>
<li>memeGod->sonic</li>
<li>memeGod->mega man</li>
</rulesStrings>
</generalRules>
<agreeableTraits>
<li>Necrophiliac</li>
</agreeableTraits>
</MemeDef>
</Defs>

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- Issue -->
<IssueDef>
<defName>IdeoBuilding</defName>
<label>building</label>
<allowMultiplePrecepts>true</allowMultiplePrecepts>
</IssueDef>
<!-- Precepts -->
<PreceptDef>
<defName>IdeoBuilding</defName>
<label>building</label>
<description>A building of ideoligious significance. Only those who follow this ideoligion can build it. It may be used as a focus for rituals.</description>
<issue>IdeoBuilding</issue>
<preceptClass>Precept_Building</preceptClass>
<workerClass>PreceptWorker_Building</workerClass>
<nameMaker>NamerIdeoBuilding</nameMaker>
<impact>Medium</impact>
<buildingDefChances>
<Altar_Small>1</Altar_Small>
<Altar_Medium>1</Altar_Medium>
<Altar_Large>1</Altar_Large>
<Altar_Grand>1</Altar_Grand>
<Ideogram>4</Ideogram>
<SculptureSmall>1</SculptureSmall>
<SculptureLarge>1</SculptureLarge>
<SculptureGrand>1</SculptureGrand>
<ChristmasTree>0</ChristmasTree>
</buildingDefChances>
<useChoicesFromBuildingDefs>true</useChoicesFromBuildingDefs>
<allowDuplicates>true</allowDuplicates>
<countsTowardsPreceptLimit>false</countsTowardsPreceptLimit>
<maxCount>5</maxCount>
<buildingMinExpectations>
<li>Moderate</li>
<li>High</li>
</buildingMinExpectations>
<preceptInstanceCountCurve>
<points>
<li>(0.5, 1)</li>
<li>(1.0, 2)</li>
</points>
</preceptInstanceCountCurve>
<roomRequirementCountCurve>
<points>
<li>(0.5, 1)</li>
<li>(1.0, 2)</li>
</points>
</roomRequirementCountCurve>
<buildingRoomRequirements>
<li Class="RoomRequirement_Area">
<area>25</area>
</li>
<li Class="RoomRequirement_TerrainWithTags">
<labelKey>RoomRequirementAllFloored</labelKey>
<tags>
<li>Floor</li>
<li>FineFloor</li>
</tags>
</li>
<li Class="RoomRequirement_Impressiveness">
<impressiveness>60</impressiveness>
</li>
<li Class="RoomRequirement_ThingCount">
<thingDef>Column</thingDef>
<count>4</count>
</li>
</buildingRoomRequirements>
<buildingRoomRequirementsFixed>
<li Class="RoomRequirement_ForbiddenBuildings">
<labelKey>RoomRequirementNoBeds</labelKey>
<buildingTags><li>Bed</li></buildingTags>
</li>
<li Class="RoomRequirement_ForbiddenBuildings">
<labelKey>RoomRequirementNoProductionFacilities</labelKey>
<buildingTags><li>Production</li></buildingTags>
</li>
</buildingRoomRequirementsFixed>
</PreceptDef>
</Defs>

View File

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<!-- Issues -->
<IssueDef>
<defName>Necrophilia</defName>
<label>necrophilia</label>
<iconPath>UI/Issues/Necrophilia</iconPath>
</IssueDef>
<HistoryEventDef>
<defName>SexWithCorpse</defName>
<label>fucked corpse</label>
</HistoryEventDef>
<!-- Precepts -->
<PreceptDef>
<defName>Necrophilia_Abhorrent</defName>
<issue>Necrophilia</issue>
<label>abhorrent</label>
<description>Necrophilia beings is deeply evil.</description>
<impact>Low</impact>
<displayOrderInIssue>40</displayOrderInIssue>
<displayOrderInImpact>100</displayOrderInImpact>
<defaultSelectionWeight>30</defaultSelectionWeight>
<conflictingMemes>
<li>Necrophile</li>
</conflictingMemes>
<comps>
<li Class="PreceptComp_SelfTookMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Abhorrent</thought>
</li>
<li Class="PreceptComp_KnowsMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Know_Abhorrent</thought>
</li>
</comps>
</PreceptDef>
<PreceptDef>
<defName>Necrophilia_Horrible</defName>
<issue>Necrophilia</issue>
<label>horrible</label>
<description>Necrophilia is a horrible thing.</description>
<impact>Low</impact>
<displayOrderInIssue>30</displayOrderInIssue>
<displayOrderInImpact>200</displayOrderInImpact>
<defaultSelectionWeight>30</defaultSelectionWeight>
<conflictingMemes>
<li>Necrophile</li>
</conflictingMemes>
<comps>
<li Class="PreceptComp_SelfTookMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Horrible</thought>
</li>
<li Class="PreceptComp_KnowsMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Know_Horrible</thought>
</li>
</comps>
</PreceptDef>
<PreceptDef>
<defName>Necrophilia_Disapproved</defName>
<issue>Necrophilia</issue>
<label>disapproved</label>
<description>Necrophilia is extremely distasteful.</description>
<impact>Low</impact>
<displayOrderInIssue>20</displayOrderInIssue>
<displayOrderInImpact>300</displayOrderInImpact>
<defaultSelectionWeight>20</defaultSelectionWeight>
<conflictingMemes>
<li>Necrophile</li>
</conflictingMemes>
<comps>
<li Class="PreceptComp_SelfTookMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Disapproved</thought>
</li>
<li Class="PreceptComp_KnowsMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Know_Disapproved</thought>
</li>
</comps>
</PreceptDef>
<PreceptDef>
<defName>Necrophilia_Acceptable</defName>
<issue>Necrophilia</issue>
<label>acceptable</label>
<description>Necrophilia is a normal, unremarkable part of life.</description>
<impact>Medium</impact>
<displayOrderInIssue>10</displayOrderInIssue>
<defaultSelectionWeight>10</defaultSelectionWeight>
<approvesOfSlavery>true</approvesOfSlavery>
<requiredMemes>
<li>Necrophile</li>
</requiredMemes>
</PreceptDef>
<PreceptDef>
<defName>Necrophilia_Approved</defName>
<issue>Necrophilia</issue>
<label>approved</label>
<description>Fucking corpse is approval.</description>
<impact>High</impact>
<displayOrderInIssue>0</displayOrderInIssue>
<displayOrderInImpact>1000</displayOrderInImpact>
<requiredMemes>
<li>Necrophile</li>
<li>Lewd</li>
</requiredMemes>
<comps>
<li Class="PreceptComp_SelfTookMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Approved</thought>
</li>
<li Class="PreceptComp_KnowsMemoryThought">
<eventDef>SexWithCorpse</eventDef>
<thought>Necrophilia_Know_Approved</thought>
</li>
</comps>
</PreceptDef>
<!-- Thoughts -->
<ThoughtDef>
<defName>Necrophilia_Abhorrent</defName>
<durationDays>6</durationDays>
<stackLimit>1</stackLimit>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<description>I had fucked corpse.</description>
<baseMoodEffect>-15</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Know_Abhorrent</defName>
<thoughtClass>Thought_MemorySocial</thoughtClass>
<durationDays>15</durationDays>
<stackLimit>100</stackLimit>
<stackLimitForSameOtherPawn>3</stackLimitForSameOtherPawn>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<baseOpinionOffset>-30</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Horrible</defName>
<durationDays>6</durationDays>
<stackLimit>1</stackLimit>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<description>I had fucked corpse.</description>
<baseMoodEffect>-10</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Know_Horrible</defName>
<thoughtClass>Thought_MemorySocial</thoughtClass>
<durationDays>15</durationDays>
<stackLimit>100</stackLimit>
<stackLimitForSameOtherPawn>3</stackLimitForSameOtherPawn>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<baseOpinionOffset>-20</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Disapproved</defName>
<durationDays>6</durationDays>
<stackLimit>1</stackLimit>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<description>I had fucked corpse.</description>
<baseMoodEffect>-5</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Know_Disapproved</defName>
<thoughtClass>Thought_MemorySocial</thoughtClass>
<durationDays>15</durationDays>
<stackLimit>100</stackLimit>
<stackLimitForSameOtherPawn>3</stackLimitForSameOtherPawn>
<nullifyingTraits>
<li>Necrophiliac</li>
</nullifyingTraits>
<nullifyingPrecepts>
<li>Necrophilia_Approved</li>
<li>Necrophilia_Acceptable</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<baseOpinionOffset>-10</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Approved</defName>
<durationDays>6</durationDays>
<stackLimit>1</stackLimit>
<nullifyingPrecepts>
<li>Necrophilia_Abhorrent</li>
<li>Necrophilia_Horrible</li>
<li>Necrophilia_Disapproved</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<description>I had fucked corpse.</description>
<baseMoodEffect>4</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>Necrophilia_Know_Approved</defName>
<thoughtClass>Thought_MemorySocial</thoughtClass>
<durationDays>25</durationDays>
<stackLimit>100</stackLimit>
<stackLimitForSameOtherPawn>3</stackLimitForSameOtherPawn>
<nullifyingPrecepts>
<li>Necrophilia_Abhorrent</li>
<li>Necrophilia_Horrible</li>
<li>Necrophilia_Disapproved</li>
</nullifyingPrecepts>
<stages>
<li>
<label>fucked corpse</label>
<baseOpinionOffset>5</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@ -48,4 +48,26 @@
</requiredMemes>
</PreceptDef>
<PreceptDef>
<defName>DrugOrgyCeremony</defName>
<label>drug orgy</label>
<description>An orgy using massive aphrodisiac.</description>
<issue>Ritual</issue>
<impact>Medium</impact>
<iconPath>UI/Issues/Gangbang</iconPath>
<preceptClass>Precept_Ritual</preceptClass>
<ritualPatternBase>DrugOrgy</ritualPatternBase>
<allowDuplicates>true</allowDuplicates>
<countsTowardsPreceptLimit>false</countsTowardsPreceptLimit>
<selectionWeight>1.0</selectionWeight>
<displayOrderInImpact>100</displayOrderInImpact>
<ignoreLimitsInEditMode>false</ignoreLimitsInEditMode>
<receivesExpectationsQualityOffset>true</receivesExpectationsQualityOffset>
<canGenerateAsSpecialPrecept>false</canGenerateAsSpecialPrecept>
<allowStackingRitualObligationAlerts>true</allowStackingRitualObligationAlerts>
<requiredMemes>
<li>Lewd</li>
</requiredMemes>
</PreceptDef>
</Defs>

View File

@ -17,8 +17,8 @@
<descOverride>A ritualistic gangbang. The organizer will give a speech to excite the crowd, then fuck the victim. If the organizer cannot fuck victim, the ritual will be canceled.</descOverride>
<iconPathOverride>UI/Issues/Gangbang</iconPathOverride>
<ritualOnlyForIdeoMembers>false</ritualOnlyForIdeoMembers>
<patternGroupTag/>
<ritualOutcomeEffect>Gangbang</ritualOutcomeEffect>
<patternGroupTag/>
</RitualPatternDef>
<RitualPatternDef ParentName="GangbangBase">
@ -28,8 +28,19 @@
<descOverride>A ritualistic animal gangbang. The organizer will give a speech to excite the crowd, then animals begin fuck victim.</descOverride>
<iconPathOverride>UI/Commands/Breeding_Pawn_off</iconPathOverride>
<ritualOnlyForIdeoMembers>false</ritualOnlyForIdeoMembers>
<patternGroupTag/>
<ritualOutcomeEffect>BestialGangbang</ritualOutcomeEffect>
<patternGroupTag/>
</RitualPatternDef>
<RitualPatternDef ParentName="CelebrationConsumable">
<defName>DrugOrgy</defName>
<shortDescOverride>drug orgy</shortDescOverride>
<descOverride>An orgy with large amounts of aphrodisiac. Participants will gather around a burnbong or incense shrine, light it on fire, and fuck each other while inhaling the fumes.</descOverride>
<iconPathOverride>UI/Icons/Rituals/SmokeCircle</iconPathOverride>
<ritualOnlyForIdeoMembers>false</ritualOnlyForIdeoMembers>
<ritualObligationTargetFilter>DrugOrgy</ritualObligationTargetFilter>
<ritualBehavior>DrugOrgy</ritualBehavior>
<ritualOutcomeEffect>DrugOrgy</ritualOutcomeEffect>
</RitualPatternDef>
</Defs>

View File

@ -33,7 +33,7 @@
</li>
</roles>
<stages Inherit="False">
<li Class="RJWSexperience.RitualStage_InteractWithVictim_All">
<li Class="RJWSexperience.RitualStage_InteractWithVictim">
<defaultDuty>Spectate</defaultDuty>
<endTriggers>
<li Class="StageEndTrigger_PawnDeliveredOrNotValid"/>
@ -81,7 +81,7 @@
</li>
</roleBehaviors>
</li>
<li Class="RJWSexperience.RitualStage_InteractWithVictim_All">
<li Class="RJWSexperience.RitualStage_InteractWithVictim">
<defaultDuty>Gangbang</defaultDuty>
<essential>True</essential>
<endTriggers>
@ -103,7 +103,7 @@
</li>
</roleBehaviors>
</li>
<li Class="RJWSexperience.RitualStage_InteractWithVictim_All">
<li Class="RJWSexperience.RitualStage_InteractWithVictim">
<defaultDuty>Gangbang</defaultDuty>
<endTriggers>
<li Class="StageEndTrigger_DurationPercentage">
@ -222,7 +222,7 @@
</li>
</roleBehaviors>
</li>
<li Class="RJWSexperience.RitualStage_InteractWithVictim">
<li Class="RJWSexperience.RitualStage_InteractWithVictim_All">
<defaultDuty>Spectate</defaultDuty>
<essential>True</essential>
<endTriggers>
@ -269,4 +269,23 @@
</stages>
</RitualBehaviorDef>
<RitualBehaviorDef ParentName="DateRitualBehavior">
<defName>DrugOrgy</defName>
<durationTicks>7500</durationTicks>
<roles Inherit="False"/>
<spectatorsLabel>Participants</spectatorsLabel>
<spectatorGerund>participate</spectatorGerund>
<stages Inherit="False">
<li>
<defaultDuty>DrugOrgy</defaultDuty>
<endTriggers>
<li Class="StageEndTrigger_DurationPercentage">
<percentage>1.0</percentage>
</li>
</endTriggers>
</li>
</stages>
</RitualBehaviorDef>
</Defs>

View File

@ -9,7 +9,7 @@
</extraPredictedOutcomeDescriptions>
<comps>
<li Class="RitualOutcomeComp_RolePresentNotSubstituted">
<roleId>moralist</roleId>
<roleId>initiator</roleId>
<label>moral guide present</label>
<qualityOffset>0.10</qualityOffset>
</li>
@ -102,7 +102,7 @@
</extraPredictedOutcomeDescriptions>
<comps>
<li Class="RitualOutcomeComp_RolePresentNotSubstituted">
<roleId>moralist</roleId>
<roleId>initiator</roleId>
<label>moral guide present</label>
<qualityOffset>0.10</qualityOffset>
</li>
@ -180,4 +180,75 @@
</RitualOutcomeEffectDef>
<RitualOutcomeEffectDef>
<defName>DrugOrgy</defName>
<description>Depending on ritual quality, participants will get between {MINMOOD} and {MAXMOOD} mood for {MOODDAYS} days.</description>
<workerClass>RitualOutcomeEffectWorker_RemoveConsumableBuilding</workerClass>
<extraPredictedOutcomeDescriptions>
<li>If the {0} is satisfying, one of the participants might gain an inspiration.</li>
</extraPredictedOutcomeDescriptions>
<comps>
<li Class="RitualOutcomeComp_DestroyConsumableBuilding" />
<li Class="RitualOutcomeComp_ParticipantCount">
<label>participant count</label>
<curve>
<points>
<li>(1, -0.50)</li>
<li>(3, 0.0)</li>
<li>(5, 0.10)</li>
<li>(10, 0.30)</li>
</points>
</curve>
</li>
<li Class="RitualOutcomeComp_RoomStat">
<label>room impressiveness</label>
<statDef>Impressiveness</statDef>
<curve>
<points>
<li>0, 0</li>
<li>50, 0.1</li>
<li>120, 0.2</li>
</points>
</curve>
</li>
<li Class="RJWSexperience.RitualOutcomeComp_NeedBased">
<label>statisfied participants</label>
<qualityOffset>0.7</qualityOffset>
<needDef>Sex</needDef>
<minAvgNeed>0.7</minAvgNeed>
</li>
</comps>
<outcomeChances>
<li>
<label>Terrible</label>
<chance>0.05</chance>
<memory>TerribleOrgy</memory>
<description>The {0} was terrible!</description>
<positivityIndex>-2</positivityIndex>
</li>
<li>
<label>Boring</label>
<chance>0.10</chance>
<memory>BoringOrgy</memory>
<description>The {0} was boring.</description>
<positivityIndex>-1</positivityIndex>
</li>
<li>
<label>Satisfying</label>
<chance>0.6</chance>
<memory>FunOrgy</memory>
<description>The {0} was satisfying.</description>
<potentialExtraOutcomeDesc>There's a 5% chance that a random participant gets an inspiration.</potentialExtraOutcomeDesc>
<positivityIndex>1</positivityIndex>
</li>
<li>
<label>Spectacular</label>
<chance>0.25</chance>
<memory>UnforgettableOrgy</memory>
<description>The {0} was spectacular!</description>
<potentialExtraOutcomeDesc>There's a 10% chance that a random participant gets an inspiration.</potentialExtraOutcomeDesc>
<positivityIndex>2</positivityIndex>
</li>
</outcomeChances>
</RitualOutcomeEffectDef>
</Defs>

View File

@ -4,4 +4,12 @@
<defName>RitualSpotOrAltar_Gangbang</defName>
<workerClass>RitualObligationTargetWorker_AnyRitualSpotOrAltar_Scarification</workerClass>
</RitualObligationTargetFilterDef>
<RitualObligationTargetFilterDef>
<defName>DrugOrgy</defName>
<workerClass>RitualObligationTargetWorker_ConsumableBuilding</workerClass>
<thingDefs>
<li>Burnbong_Aphrodisiac</li>
</thingDefs>
</RitualObligationTargetFilterDef>
</Defs>

View File

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="IdeoSmokerBase">
<defName>Burnbong_Aphrodisiac</defName>
<label>lustbong</label>
<description>A wood structure packed with humpshroom. It can be ignited during a ritual and produce a huge amount of humpshroom smoke for a few hours, after which it is destroyed.</description>
<drawerType>RealtimeOnly</drawerType>
<graphicData>
<graphicClass>Graphic_Single</graphicClass>
<texPath>Things/Building/Misc/Burnbong/Burnbong</texPath>
<drawSize>(1.2,1.2)</drawSize>
<shadowData>
<volume>(0.92, 1 ,0.92)</volume>
</shadowData>
</graphicData>
<size>(1,1)</size>
<costList>
<WoodLog>30</WoodLog>
<HumpShroom>30</HumpShroom>
</costList>
<killedLeavings>
<HumpShroom>30</HumpShroom>
</killedLeavings>
<leaveResourcesWhenKilled>false</leaveResourcesWhenKilled>
<statBases>
<MaxHitPoints>50</MaxHitPoints>
<WorkToBuild>10000</WorkToBuild>
<Mass>25</Mass>
</statBases>
<comps>
<li Class="CompProperties_RitualTargetEffecterSpawner">
<effecter>BurnbongSmoke</effecter>
</li>
<li Class="CompProperties_FireOverlayRitual">
<fireSize>0.5</fireSize>
<offset>(0, 0, 0.42)</offset>
</li>
<li Class="CompProperties_RitualHediffGiverInRoom">
<hediff>HumpShroomEffect</hediff>
<resetLastRecreationalDrugTick>true</resetLastRecreationalDrugTick>
<minRadius>10</minRadius>
<severity>0.01</severity>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>Autobong_Aphrodisiac</defName>
<label>estro-bong</label>
<description>An automatic humpshroom-burning device which generates an estro-smoke cloud around itself. Anyone in the cloud will become horny over time.</description>
<category>Building</category>
<graphicData>
<texPath>Things/Building/Misc/Autobong/Autobong</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(2,2)</drawSize>
<shaderType>CutoutComplex</shaderType>
</graphicData>
<uiIconPath>Things/Building/Misc/Autobong/Autobong</uiIconPath>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<pathCost>42</pathCost>
<tickerType>Normal</tickerType>
<drawerType>RealtimeOnly</drawerType>
<fillPercent>0.20</fillPercent>
<canGenerateDefaultDesignator>false</canGenerateDefaultDesignator>
<size>(2,2)</size>
<statBases>
<MaxHitPoints>80</MaxHitPoints>
<WorkToBuild>800</WorkToBuild>
</statBases>
<selectable>true</selectable>
<costList>
<HumpShroom>10</HumpShroom>
<ComponentIndustrial>3</ComponentIndustrial>
</costList>
<stuffCategories>
<li>Metallic</li>
<li>Woody</li>
</stuffCategories>
<costStuffCount>100</costStuffCount>
<leaveResourcesWhenKilled>true</leaveResourcesWhenKilled>
<researchPrerequisites>
<li>MicroelectronicsBasics</li>
</researchPrerequisites>
<comps>
<li Class="CompProperties_Refuelable">
<fuelConsumptionRate>0.35</fuelConsumptionRate>
<fuelCapacity>10.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>HumpShroom</li>
</thingDefs>
</fuelFilter>
<initialFuelPercent>1</initialFuelPercent>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<consumeFuelOnlyWhenPowered>true</consumeFuelOnlyWhenPowered>
</li>
<li Class="CompProperties_Glower">
<glowRadius>10</glowRadius>
<glowColor>(252,187,113,0)</glowColor>
</li>
<li>
<compClass>CompGatherSpot</compClass>
</li>
<li Class="CompProperties_Power">
<compClass>CompPowerTrader</compClass>
<basePowerConsumption>150</basePowerConsumption>
<shortCircuitInRain>true</shortCircuitInRain>
</li>
<li Class="CompProperties_Flickable"/>
<li Class="CompProperties_GiveHediffSeverity">
<hediff>HumpShroomEffect</hediff>
<range>4.9</range>
<severityPerSecond>0.005</severityPerSecond>
<drugExposure>true</drugExposure>
</li>
<li Class="CompProperties_SmokeCloudMaker">
<sourceStreamEffect>BurnbongSmoke</sourceStreamEffect>
<cloudRadius>4.9</cloudRadius>
<fleckScale>4</fleckScale>
<cloudFleck>AutobongSmoke</cloudFleck>
<fleckSpawnMTB>25</fleckSpawnMTB>
</li>
</comps>
<designationCategory>Misc</designationCategory>
<drawPlaceWorkersWhileSelected>true</drawPlaceWorkersWhileSelected>
<placeWorkers>
<li>PlaceWorker_SmokeCloudMaker</li>
</placeWorkers>
</ThingDef>
</Defs>

View File

@ -57,4 +57,59 @@
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>TerribleOrgy</defName>
<thoughtClass>Thought_AttendedRitual</thoughtClass>
<durationDays>6</durationDays>
<stackLimit>3</stackLimit>
<stages>
<li>
<label>terrible orgy</label>
<description>That orgy was terrible. ugh.</description>
<baseMoodEffect>-3</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>BoringOrgy</defName>
<thoughtClass>Thought_AttendedRitual</thoughtClass>
<durationDays>6</durationDays>
<stackLimit>3</stackLimit>
<stages>
<li>
<label>boring orgy</label>
<description>That orgy was not good. Wish I never went.</description>
<baseMoodEffect>-1</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>FunOrgy</defName>
<thoughtClass>Thought_AttendedRitual</thoughtClass>
<durationDays>6</durationDays>
<stackLimit>3</stackLimit>
<stages>
<li>
<label>fun orgy</label>
<description>That was a fun orgy. It really satisfied me.</description>
<baseMoodEffect>8</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<ThoughtDef>
<defName>UnforgettableOrgy</defName>
<thoughtClass>Thought_AttendedRitual</thoughtClass>
<durationDays>6</durationDays>
<stackLimit>3</stackLimit>
<stages>
<li>
<label>unforgettable orgy</label>
<description>That orgy was awesome! Everything was perfect.</description>
<baseMoodEffect>16</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<Patch>
<Operation Class="PatchOperationReplace">
<xpath>Defs/HediffDef[defName="HumpShroomEffect"]/stages</xpath>
<value>
<stages>
<li>
<label>lingering</label>
<statOffsets>
<SexFrequency>1.25</SexFrequency>
<SexSatisfaction>0.25</SexSatisfaction>
</statOffsets>
</li>
<li>
<minSeverity>0.3</minSeverity>
<label>mild</label>
<restFallFactor>1.1</restFallFactor>
<statOffsets>
<SexFrequency>2</SexFrequency>
<SexSatisfaction>0.5</SexSatisfaction>
</statOffsets>
</li>
<li>
<minSeverity>0.6</minSeverity>
<label>moderate</label>
<restFallFactor>1.33</restFallFactor>
<statOffsets>
<SexFrequency>3</SexFrequency>
<SexSatisfaction>0.75</SexSatisfaction>
</statOffsets>
</li>
<li>
<minSeverity>0.9</minSeverity>
<label>high</label>
<restFallFactor>1.33</restFallFactor>
<statOffsets>
<SexFrequency>5</SexFrequency>
<SexSatisfaction>1.5</SexSatisfaction>
</statOffsets>
</li>
</stages>
</value>
</Operation>
</Patch>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<Patch>
<Operation Class="PatchOperationAdd">
<xpath>Defs/PreceptDef[defName="Corpses_DontCare"]/requiredMemes</xpath>
<value>
<li>Necrophile</li>
</value>
</Operation>
<Operation Class="PatchOperationAdd">
<xpath>Defs/PreceptDef[defName="Corpses_DontCare"]/associatedMemes</xpath>
<value>
<li>Necrophile</li>
</value>
</Operation>
<Operation Class="PatchOperationAdd">
<xpath>Defs/PreceptDef[defName="Lovin_FreeApproved"]</xpath>
<value>
<statOffsets>
<SexFrequency>0.5</SexFrequency>
<SexAbility>0.25</SexAbility>
</statOffsets>
</value>
</Operation>
</Patch>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<Patch>
<Operation Class="PatchOperationAdd">
<xpath>Defs/StatDef[defName="Vulnerability"]/parts</xpath>
<value>
<li Class="RJWSexperience.StatPart_GenderPrimacy">
<modifier>0.5</modifier>
</li>
</value>
</Operation>
</Patch>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -1,3 +1,17 @@
Version Beta 1.0.1.8
- fixed animal gangbang doesn't work properly
- fixed bastard relation was not removed after marriage
- fixed moral guide present
- separated ideology defs
- added cum bucket
- masturbating around this will collect cum
- added cum addiction
- added necrophile meme
- added lewd meme
- added drug orgy ritual
- added burnbong and autobong using humpshroom(require lewd meme)
- added some stages for humpshroom effect
Version Beta 1.0.1.7
- added baby faction and social affection precepts
- changed stat calculation of lust