diff --git a/About/Manifest.xml b/About/Manifest.xml index d2b2963..f0ae67b 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW Sexperience - 1.0.1.7 + 1.0.1.8 diff --git a/Assemblies/RJWSexperience.dll b/Assemblies/RJWSexperience.dll index 3db0243..2eae33b 100644 Binary files a/Assemblies/RJWSexperience.dll and b/Assemblies/RJWSexperience.dll differ diff --git a/Defs/JobDefs/Jobs_Ritual_Rape.xml b/Defs/JobDefs/Jobs_Ritual_Rape.xml deleted file mode 100644 index 26f3e59..0000000 --- a/Defs/JobDefs/Jobs_Ritual_Rape.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - RapeVictim - RJWSexperience.JobDriver_RapeVictim - rapin' victim - false - - \ No newline at end of file diff --git a/Defs/ThingDefs/Buildings_Cum.xml b/Defs/ThingDefs/Buildings_Cum.xml new file mode 100644 index 0000000..b79b5b6 --- /dev/null +++ b/Defs/ThingDefs/Buildings_Cum.xml @@ -0,0 +1,61 @@ + + + + + CumBucket + + A bucket for collecting cums. + RJWSexperience.Building_CumBucket + + Things/Item/CumBucket + Graphic_Multi + (1,1) + + Building + PassThroughOnly + 0.4 + true + 50 + false + +
  • Metallic
  • +
  • Woody
  • +
  • Stony
  • +
    + 10 + + 50 + 8 + 200 + 1.0 + -5 + + (1,1) + + true + true + + + true + +
  • GatheredCum
  • +
    +
    +
    + + Low + + +
  • GatheredCum
  • +
    +
    +
    +
    + +
  • ITab_Storage
  • +
    + Item + false +
    + +
    diff --git a/Defs/ThingDefs/Items_Resource_Cum.xml b/Defs/ThingDefs/Items_Resource_Cum.xml index 915df14..ffb7c64 100644 --- a/Defs/ThingDefs/Items_Resource_Cum.xml +++ b/Defs/ThingDefs/Items_Resource_Cum.xml @@ -1,6 +1,6 @@ - + GatheredCum Gathered cum. @@ -24,13 +24,33 @@ 0.1 - Fluid, AnimalProduct - DesperateOnlyForHumanlikes + Fluid, AnimalProduct + DesperateOnlyForHumanlikes AteCum AteCum - -10 - -10 + -10 + -10 + +
  • + CumTolerance + 0.032 + true +
  • +
  • + 0.05 +
  • +
    + +
  • + Cum + 0.050 + 0.8 + 0.1 + 1 + 30 +
  • +
    @@ -57,6 +77,16 @@ DesperateOnlyForHumanlikes AteCum AteCum + +
  • + CumTolerance + 0.032 + true +
  • +
  • + 0.05 +
  • +
    Item Never @@ -67,7 +97,89 @@
  • AnimalProductRaw
  • + +
  • + Cum + 0.050 + 0.8 + 0.1 + 1 + 30 +
  • +
    + + Cum + + CumAddiction + CumTolerance + + + Chemical_Cum + Need_Chemical + + Addicted to cum. + 10 + + + + CumTolerance + + cum addictiveness. + false + +
  • + -0.020 +
  • +
    +
    + + + CumAddiction + Hediff_Addiction + + cum addiction. + Chemical_Cum + +
  • + -0.1 + true +
  • +
    + +
  • + + 0.25 + 0.25 + 0.5 + +
  • +
  • + + + 0.25 + 1.0 + +
  • +
    +
    + + + CumWithdrawal + ThoughtWorker_Hediff + CumAddiction + true + +
  • + false +
  • +
  • + + I need it. + -5 +
  • +
    +
    \ No newline at end of file diff --git a/Languages/English/Keyed/RJW_Sexperience.xml b/Languages/English/Keyed/RJW_Sexperience.xml index 9c8edcc..7b0339f 100644 --- a/Languages/English/Keyed/RJW_Sexperience.xml +++ b/Languages/English/Keyed/RJW_Sexperience.xml @@ -11,6 +11,7 @@ not human not animal capable of sex is required + Total gathered cum: Enable record randomizer Randomize pawn's sex records. diff --git a/LoadFolders.xml b/LoadFolders.xml new file mode 100644 index 0000000..664f5f0 --- /dev/null +++ b/LoadFolders.xml @@ -0,0 +1,7 @@ + + + +
  • \
  • +
  • RJWSexperience_Ideology
  • +
    +
    \ No newline at end of file diff --git a/Patches/RJW_StatDefs.xml b/Patches/RJW_StatDefs.xml index 48764b8..05594a9 100644 --- a/Patches/RJW_StatDefs.xml +++ b/Patches/RJW_StatDefs.xml @@ -26,9 +26,6 @@ Defs/StatDef[defName="Vulnerability"]/parts -
  • - 0.5 -
  • 3.0
  • diff --git a/RJWSexperience/RJWSexperience/Buildings.cs b/RJWSexperience/RJWSexperience/Buildings.cs new file mode 100644 index 0000000..e913598 --- /dev/null +++ b/RJWSexperience/RJWSexperience/Buildings.cs @@ -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; + } + + } +} diff --git a/RJWSexperience/RJWSexperience/Ideology/RJW_Patch_Ideo.cs b/RJWSexperience/RJWSexperience/Ideology/RJW_Patch_Ideo.cs new file mode 100644 index 0000000..f7f8098 --- /dev/null +++ b/RJWSexperience/RJWSexperience/Ideology/RJW_Patch_Ideo.cs @@ -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(); + 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; + } + } + + + /// + /// only for non-violate human sex + /// + /// + /// + /// + /// + 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; + } + + } + + } + + + /// + /// Set prefer sextype using precepts + /// + [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 __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 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); + } + } + } + +} diff --git a/RJWSexperience/RJWSexperience/Keyed.cs b/RJWSexperience/RJWSexperience/Keyed.cs index 70b3e9e..943d3bc 100644 --- a/RJWSexperience/RJWSexperience/Keyed.cs +++ b/RJWSexperience/RJWSexperience/Keyed.cs @@ -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(); diff --git a/RJWSexperience/RJWSexperience/PawnRelationWorkers.cs b/RJWSexperience/RJWSexperience/PawnRelationWorkers.cs index 64256e1..9125f42 100644 --- a/RJWSexperience/RJWSexperience/PawnRelationWorkers.cs +++ b/RJWSexperience/RJWSexperience/PawnRelationWorkers.cs @@ -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; } - - } + + + } diff --git a/RJWSexperience/RJWSexperience/RJWSexperience.csproj b/RJWSexperience/RJWSexperience/RJWSexperience.csproj index c108fca..d44bb23 100644 --- a/RJWSexperience/RJWSexperience/RJWSexperience.csproj +++ b/RJWSexperience/RJWSexperience/RJWSexperience.csproj @@ -77,11 +77,14 @@ + + + diff --git a/RJWSexperience/RJWSexperience/RJW_Patch.cs b/RJWSexperience/RJWSexperience/RJW_Patch.cs index 8a377db..c775705 100644 --- a/RJWSexperience/RJWSexperience/RJW_Patch.cs +++ b/RJWSexperience/RJWSexperience/RJW_Patch.cs @@ -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(); + 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(); - 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; - } - } - - - /// - /// only for non-violate human sex - /// - /// - /// - /// - /// - 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; - } - - } - - } - - - /// - /// Set prefer sextype using precepts - /// - [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 __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 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); - } - } - } - - } diff --git a/RJWSexperience/RJWSexperience/Rimworld_Patch.cs b/RJWSexperience/RJWSexperience/Rimworld_Patch.cs index 11b63cb..de2263a 100644 --- a/RJWSexperience/RJWSexperience/Rimworld_Patch.cs +++ b/RJWSexperience/RJWSexperience/Rimworld_Patch.cs @@ -24,6 +24,8 @@ namespace RJWSexperience Find.HistoryEventsManager.RecordEvent(new HistoryEvent(VariousDefOf.Incestuos_Marriage, secondPawn.Named(HistoryEventArgsNames.Doer))); } } + + } [HarmonyPatch(typeof(Pawn_RelationsTracker), "SecondaryRomanceChanceFactor")] diff --git a/RJWSexperience/RJWSexperience/Rituals/JobGiver_DrugOrgy.cs b/RJWSexperience/RJWSexperience/Rituals/JobGiver_DrugOrgy.cs new file mode 100644 index 0000000..d83dd75 --- /dev/null +++ b/RJWSexperience/RJWSexperience/Rituals/JobGiver_DrugOrgy.cs @@ -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 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; + } + + } + + /// + /// copied from rjw + /// + public class JobDriver_SexDrugOrgy : JobDriver_SexBaseInitiator + { + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return true; + } + + protected override IEnumerable 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 + }; + } + } + + /// + /// copied from rjw + /// + public class JobDriver_DrugSexReceiver : JobDriver_SexBaseRecieverLoved + { + + protected override IEnumerable 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(() => + { + 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; + } + } + + /// + /// copied from rjw + /// + public class JobDriver_DrugMasturabate : JobDriver_Masturbate + { + + protected override IEnumerable 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(pawn.Map); + + Job clean = JobMaker.MakeJob(JobDefOf.Clean); + clean.AddQueuedTarget(TargetIndex.A, own_cum); + + pawn.jobs.jobQueue.EnqueueFirst(clean); + }, + defaultCompleteMode = ToilCompleteMode.Instant + }; + } + } + + +} diff --git a/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs b/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs index aee7347..977e4dc 100644 --- a/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs +++ b/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs @@ -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; } diff --git a/RJWSexperience/RJWSexperience/Thought_Recordbased.cs b/RJWSexperience/RJWSexperience/Thought_Recordbased.cs index 2a8f7ce..ccbcf14 100644 --- a/RJWSexperience/RJWSexperience/Thought_Recordbased.cs +++ b/RJWSexperience/RJWSexperience/Thought_Recordbased.cs @@ -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(); diff --git a/RJWSexperience/RJWSexperience/Utility.cs b/RJWSexperience/RJWSexperience/Utility.cs index 1f9b95c..a195390 100644 --- a/RJWSexperience/RJWSexperience/Utility.cs +++ b/RJWSexperience/RJWSexperience/Utility.cs @@ -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(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 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 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 hediffs) + { + CompHediffBodyPart part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp(); + if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp(); + if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp(); + if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp(); + + + 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); + } + } } diff --git a/RJWSexperience/RJWSexperience/VariousDefOf.cs b/RJWSexperience/RJWSexperience/VariousDefOf.cs index ae17038..50d3887 100644 --- a/RJWSexperience/RJWSexperience/VariousDefOf.cs +++ b/RJWSexperience/RJWSexperience/VariousDefOf.cs @@ -15,9 +15,54 @@ namespace RJWSexperience public static readonly SkillDef SexSkill = DefDatabase.GetNamed("Sex"); public static readonly ThoughtDef_Recordbased AteCum = DefDatabase.GetNamed("AteCum"); public static readonly JobDef RapeVictim = DefDatabase.GetNamed("RapeVictim"); + public static readonly JobDef DrugSex = DefDatabase.GetNamed("DrugSex"); + public static readonly JobDef GettinDrugSex = DefDatabase.GetNamed("GettinDrugSex"); + public static readonly JobDef DrugMasturbate = DefDatabase.GetNamed("DrugMasturbate"); + public static readonly PawnRelationDef Bastard = DefDatabase.GetNamed("Bastard"); + public static readonly ThingDef GatheredCum = DefDatabase.GetNamed("GatheredCum"); + public static readonly HediffDef CumAddiction = DefDatabase.GetNamed("CumAddiction"); + public static readonly HediffDef CumTolerance = DefDatabase.GetNamed("CumTolerance"); + public static readonly ChemicalDef Cum = DefDatabase.GetNamed("Cum"); + public static readonly NeedDef Chemical_Cum = DefDatabase.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.GetNamed("Zoophile"); [MayRequireIdeology] public static readonly MemeDef Rapist = DefDatabase.GetNamed("Rapist"); + [MayRequireIdeology] public static readonly MemeDef Lewd = DefDatabase.GetNamed("Lewd"); + [MayRequireIdeology] public static readonly MemeDef Necrophile = DefDatabase.GetNamed("Necrophile"); [MayRequireIdeology] public static readonly HistoryEventDef SexWithAnimal = DefDatabase.GetNamed("SexWithAnimal"); [MayRequireIdeology] public static readonly HistoryEventDef SexWithVeneratedAnimal = DefDatabase.GetNamed("SexWithVeneratedAnimal"); [MayRequireIdeology] public static readonly HistoryEventDef Raped = DefDatabase.GetNamed("Raped"); @@ -32,6 +77,7 @@ namespace RJWSexperience [MayRequireIdeology] public static readonly HistoryEventDef MiscSex = DefDatabase.GetNamed("MiscSex"); [MayRequireIdeology] public static readonly HistoryEventDef PromiscuousSex = DefDatabase.GetNamed("PromiscuousSex"); [MayRequireIdeology] public static readonly HistoryEventDef Incestuos_Marriage = DefDatabase.GetNamed("Incestuos_Marriage"); + [MayRequireIdeology] public static readonly HistoryEventDef SexWithCorpse = DefDatabase.GetNamed("SexWithCorpse"); [MayRequireIdeology] public static readonly PreceptDef Bestiality_Abhorrent = DefDatabase.GetNamed("Bestiality_Abhorrent"); [MayRequireIdeology] public static readonly PreceptDef Bestiality_Horrible = DefDatabase.GetNamed("Bestiality_Horrible"); [MayRequireIdeology] public static readonly PreceptDef Bestiality_Disapproved = DefDatabase.GetNamed("Bestiality_Disapproved"); @@ -56,5 +102,13 @@ namespace RJWSexperience [MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysMother = DefDatabase.GetNamed("BabyFaction_AlwaysMother"); [MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysFather = DefDatabase.GetNamed("BabyFaction_AlwaysFather"); [MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysColony = DefDatabase.GetNamed("BabyFaction_AlwaysColony"); + [MayRequireIdeology] public static readonly PreceptDef Submissive_None = DefDatabase.GetNamed("Submissive_None"); + [MayRequireIdeology] public static readonly PreceptDef Submissive_Male = DefDatabase.GetNamed("Submissive_Male"); + [MayRequireIdeology] public static readonly PreceptDef Submissive_Female = DefDatabase.GetNamed("Submissive_Female"); + [MayRequireIdeology] public static readonly PreceptDef Necrophilia_Abhorrent = DefDatabase.GetNamed("Necrophilia_Abhorrent"); + [MayRequireIdeology] public static readonly PreceptDef Necrophilia_Horrible = DefDatabase.GetNamed("Necrophilia_Horrible"); + [MayRequireIdeology] public static readonly PreceptDef Necrophilia_Disapproved = DefDatabase.GetNamed("Necrophilia_Disapproved"); + [MayRequireIdeology] public static readonly PreceptDef Necrophilia_Acceptable = DefDatabase.GetNamed("Necrophilia_Acceptable"); + [MayRequireIdeology] public static readonly PreceptDef Necrophilia_Approved = DefDatabase.GetNamed("Necrophilia_Approved"); } } diff --git a/Defs/DutyDefs/Duties_Rituals_sex.xml b/RJWSexperience_Ideology/Defs/DutyDefs/Duties_Rituals_sex.xml similarity index 59% rename from Defs/DutyDefs/Duties_Rituals_sex.xml rename to RJWSexperience_Ideology/Defs/DutyDefs/Duties_Rituals_sex.xml index 3811d42..e9e2347 100644 --- a/Defs/DutyDefs/Duties_Rituals_sex.xml +++ b/RJWSexperience_Ideology/Defs/DutyDefs/Duties_Rituals_sex.xml @@ -36,6 +36,29 @@ - + + DrugOrgy + HighPriority + Off + + +
  • + +
  • + 0.15 + +
  • + +
  • +
    + + +
  • + Jog + 50~250 +
  • + +
    +
    \ No newline at end of file diff --git a/Defs/Goodwill/MemeCompatibility_Sex.xml b/RJWSexperience_Ideology/Defs/Goodwill/MemeCompatibility_Sex.xml similarity index 61% rename from Defs/Goodwill/MemeCompatibility_Sex.xml rename to RJWSexperience_Ideology/Defs/Goodwill/MemeCompatibility_Sex.xml index 4024d31..7c71e61 100644 --- a/Defs/Goodwill/MemeCompatibility_Sex.xml +++ b/RJWSexperience_Ideology/Defs/Goodwill/MemeCompatibility_Sex.xml @@ -11,6 +11,14 @@ 30 + + Necrophile_Necrophile + + GoodwillSituationWorker_MemeCompatibility + Necrophile + Necrophile + 30 + @@ -30,4 +38,13 @@ true -20 + + + Necrophile_All + + RJWSexperience.GoodwillSituationWorker_OneWayReceive + Necrophile + true + -50 + diff --git a/Defs/InteractionDefs/Interactions_Speech_sex.xml b/RJWSexperience_Ideology/Defs/InteractionDefs/Interactions_Speech_sex.xml similarity index 100% rename from Defs/InteractionDefs/Interactions_Speech_sex.xml rename to RJWSexperience_Ideology/Defs/InteractionDefs/Interactions_Speech_sex.xml diff --git a/RJWSexperience_Ideology/Defs/JobDefs/Jobs_Ritual_Sex.xml b/RJWSexperience_Ideology/Defs/JobDefs/Jobs_Ritual_Sex.xml new file mode 100644 index 0000000..2c702ad --- /dev/null +++ b/RJWSexperience_Ideology/Defs/JobDefs/Jobs_Ritual_Sex.xml @@ -0,0 +1,31 @@ + + + + + RapeVictim + RJWSexperience.JobDriver_RapeVictim + rapin' victim + false + + + + DrugSex + RJWSexperience.JobDriver_SexDrugOrgy + lovin'. + false + + + + GettinDrugSex + RJWSexperience.JobDriver_DrugSexReceiver + lovin'. + false + + + + DrugMasturbate + RJWSexperience.JobDriver_DrugMasturabate + masturbatin'. + false + + \ No newline at end of file diff --git a/Defs/MemeDefs/Memes_Sexual.xml b/RJWSexperience_Ideology/Defs/MemeDefs/Memes_Sexual.xml similarity index 72% rename from Defs/MemeDefs/Memes_Sexual.xml rename to RJWSexperience_Ideology/Defs/MemeDefs/Memes_Sexual.xml index 90748fa..b7a808d 100644 --- a/Defs/MemeDefs/Memes_Sexual.xml +++ b/RJWSexperience_Ideology/Defs/MemeDefs/Memes_Sexual.xml @@ -151,4 +151,93 @@
    + + Lewd + + Perverts. + UI/Memes/SexualDissolutely + 3 + +
  • Burnbong_Aphrodisiac
  • +
    + +
  • +
  • Lovin_FreeApproved
  • + +
  • +
  • Incestuos_Free
  • + +
  • +
  • Sex_Free
  • +
  • Sex_Promiscuous
  • + +
    + +
  • + DateRitualConsumable + DrugOrgy + Burnbong_Aphrodisiac +
  • +
    + + +
  • memeAdjective->horny
  • +
  • memeAdjective->lewd
  • +
  • memeAdjective->arousing
  • +
  • memeAdjective->sexy
  • +
  • memeAdjective->estrous
  • +
  • memeAdjective->decadent
  • +
  • memeHyphenPrefix->estro
  • +
  • memeHyphenPrefix->lust
  • +
  • memeConcept->lust
  • +
  • memeConcept->libido
  • +
  • memeConcept->estrus
  • +
  • memeConcept->arousal
  • +
  • memeConcept->desire
  • +
  • memeConcept->sex
  • +
  • memeConcept->perversion
  • +
  • memeGod->slaanesh
  • +
    +
    + +
  • + Cult of Slaanesh + pleasure + decadent + heretic +
  • +
    + +
  • Autobong_Aphrodisiac
  • +
    + +
  • Nymphomaniac
  • +
    +
    + + + Necrophile + + Corpse fuckers. + UI/Memes/Necrophile + 2 + +
  • +
  • Necrophilia_Acceptable
  • +
  • Necrophilia_Approved
  • + +
  • +
  • Corpses_DontCare
  • + +
    + + +
  • memeGod->sonic
  • +
  • memeGod->mega man
  • +
    +
    + +
  • Necrophiliac
  • +
    +
    \ No newline at end of file diff --git a/Defs/PreceptDefs/Precepts_BabyFaction.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_BabyFaction.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_BabyFaction.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_BabyFaction.xml diff --git a/Defs/PreceptDefs/Precepts_Bestiality.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Bestiality.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_Bestiality.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Bestiality.xml diff --git a/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Buildings_sex.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Buildings_sex.xml new file mode 100644 index 0000000..9371a48 --- /dev/null +++ b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Buildings_sex.xml @@ -0,0 +1,85 @@ + + + + + + + IdeoBuilding + + true + + + + + + IdeoBuilding + + A building of ideoligious significance. Only those who follow this ideoligion can build it. It may be used as a focus for rituals. + IdeoBuilding + Precept_Building + PreceptWorker_Building + NamerIdeoBuilding + Medium + + 1 + 1 + 1 + 1 + 4 + 1 + 1 + 1 + 0 + + true + true + false + 5 + +
  • Moderate
  • +
  • High
  • +
    + + +
  • (0.5, 1)
  • +
  • (1.0, 2)
  • +
    +
    + + +
  • (0.5, 1)
  • +
  • (1.0, 2)
  • +
    +
    + +
  • + 25 +
  • +
  • + RoomRequirementAllFloored + +
  • Floor
  • +
  • FineFloor
  • + + +
  • + 60 +
  • +
  • + Column + 4 +
  • +
    + +
  • + RoomRequirementNoBeds +
  • Bed
  • + +
  • + RoomRequirementNoProductionFacilities +
  • Production
  • + +
    +
    + +
    \ No newline at end of file diff --git a/Defs/PreceptDefs/Precepts_Incest.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Incest.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_Incest.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Incest.xml diff --git a/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Necrophilia.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Necrophilia.xml new file mode 100644 index 0000000..43042a8 --- /dev/null +++ b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Necrophilia.xml @@ -0,0 +1,291 @@ + + + + + + Necrophilia + + UI/Issues/Necrophilia + + + + SexWithCorpse + + + + + + + Necrophilia_Abhorrent + Necrophilia + + Necrophilia beings is deeply evil. + Low + 40 + 100 + 30 + +
  • Necrophile
  • +
    + +
  • + SexWithCorpse + Necrophilia_Abhorrent +
  • +
  • + SexWithCorpse + Necrophilia_Know_Abhorrent +
  • +
    +
    + + + Necrophilia_Horrible + Necrophilia + + Necrophilia is a horrible thing. + Low + 30 + 200 + 30 + +
  • Necrophile
  • +
    + +
  • + SexWithCorpse + Necrophilia_Horrible +
  • +
  • + SexWithCorpse + Necrophilia_Know_Horrible +
  • +
    +
    + + + Necrophilia_Disapproved + Necrophilia + + Necrophilia is extremely distasteful. + Low + 20 + 300 + 20 + +
  • Necrophile
  • +
    + +
  • + SexWithCorpse + Necrophilia_Disapproved +
  • +
  • + SexWithCorpse + Necrophilia_Know_Disapproved +
  • +
    +
    + + + Necrophilia_Acceptable + Necrophilia + + Necrophilia is a normal, unremarkable part of life. + Medium + 10 + 10 + true + +
  • Necrophile
  • +
    +
    + + + Necrophilia_Approved + Necrophilia + + Fucking corpse is approval. + High + 0 + 1000 + +
  • Necrophile
  • +
  • Lewd
  • +
    + +
  • + SexWithCorpse + Necrophilia_Approved +
  • +
  • + SexWithCorpse + Necrophilia_Know_Approved +
  • +
    +
    + + + + + + Necrophilia_Abhorrent + 6 + 1 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + I had fucked corpse. + -15 +
  • +
    +
    + + + Necrophilia_Know_Abhorrent + Thought_MemorySocial + 15 + 100 + 3 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + -30 +
  • +
    +
    + + + Necrophilia_Horrible + 6 + 1 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + I had fucked corpse. + -10 +
  • +
    +
    + + + Necrophilia_Know_Horrible + Thought_MemorySocial + 15 + 100 + 3 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + -20 +
  • +
    +
    + + + Necrophilia_Disapproved + 6 + 1 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + I had fucked corpse. + -5 +
  • +
    +
    + + + Necrophilia_Know_Disapproved + Thought_MemorySocial + 15 + 100 + 3 + +
  • Necrophiliac
  • +
    + +
  • Necrophilia_Approved
  • +
  • Necrophilia_Acceptable
  • +
    + +
  • + + -10 +
  • +
    +
    + + + Necrophilia_Approved + 6 + 1 + +
  • Necrophilia_Abhorrent
  • +
  • Necrophilia_Horrible
  • +
  • Necrophilia_Disapproved
  • +
    + +
  • + + I had fucked corpse. + 4 +
  • +
    +
    + + + Necrophilia_Know_Approved + Thought_MemorySocial + 25 + 100 + 3 + +
  • Necrophilia_Abhorrent
  • +
  • Necrophilia_Horrible
  • +
  • Necrophilia_Disapproved
  • +
    + +
  • + + 5 +
  • +
    +
    + +
    \ No newline at end of file diff --git a/Defs/PreceptDefs/Precepts_Rape.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Rape.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_Rape.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Rape.xml diff --git a/Defs/PreceptDefs/Precepts_Ritual_sex.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Ritual_sex.xml similarity index 69% rename from Defs/PreceptDefs/Precepts_Ritual_sex.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Ritual_sex.xml index 87d0c7b..f7280cb 100644 --- a/Defs/PreceptDefs/Precepts_Ritual_sex.xml +++ b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Ritual_sex.xml @@ -48,4 +48,26 @@ + + + DrugOrgyCeremony + + An orgy using massive aphrodisiac. + Ritual + Medium + UI/Issues/Gangbang + Precept_Ritual + DrugOrgy + true + false + 1.0 + 100 + false + true + false + true + +
  • Lewd
  • +
    +
    \ No newline at end of file diff --git a/Defs/PreceptDefs/Precepts_Sex.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Sex.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_Sex.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Sex.xml diff --git a/Defs/PreceptDefs/Precepts_SocialAffection.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_SocialAffection.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_SocialAffection.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_SocialAffection.xml diff --git a/Defs/PreceptDefs/Precepts_Submissive.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Submissive.xml similarity index 100% rename from Defs/PreceptDefs/Precepts_Submissive.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/Precepts_Submissive.xml diff --git a/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml b/RJWSexperience_Ideology/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml similarity index 71% rename from Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml rename to RJWSexperience_Ideology/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml index 1fcfe7b..011ebd1 100644 --- a/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml +++ b/RJWSexperience_Ideology/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml @@ -17,8 +17,8 @@ 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. UI/Issues/Gangbang false - Gangbang + @@ -28,8 +28,19 @@ A ritualistic animal gangbang. The organizer will give a speech to excite the crowd, then animals begin fuck victim. UI/Commands/Breeding_Pawn_off false - BestialGangbang + + + + + DrugOrgy + drug orgy + 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. + UI/Icons/Rituals/SmokeCircle + false + DrugOrgy + DrugOrgy + DrugOrgy \ No newline at end of file diff --git a/Defs/PreconfiguredIdeos/IdeoPresetDefs_sex.xml b/RJWSexperience_Ideology/Defs/PreconfiguredIdeos/IdeoPresetDefs_sex.xml similarity index 100% rename from Defs/PreconfiguredIdeos/IdeoPresetDefs_sex.xml rename to RJWSexperience_Ideology/Defs/PreconfiguredIdeos/IdeoPresetDefs_sex.xml diff --git a/Defs/Rituals/Ritual_Behaviors_sex.xml b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Behaviors_sex.xml similarity index 92% rename from Defs/Rituals/Ritual_Behaviors_sex.xml rename to RJWSexperience_Ideology/Defs/Rituals/Ritual_Behaviors_sex.xml index 78cf13d..90a9320 100644 --- a/Defs/Rituals/Ritual_Behaviors_sex.xml +++ b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Behaviors_sex.xml @@ -33,7 +33,7 @@ -
  • +
  • Spectate
  • @@ -81,7 +81,7 @@
  • -
  • +
  • Gangbang True @@ -103,7 +103,7 @@
  • -
  • +
  • Gangbang
  • @@ -222,7 +222,7 @@
  • -
  • +
  • Spectate True @@ -269,4 +269,23 @@ + + DrugOrgy + 7500 + + Participants + participate + +
  • + DrugOrgy + +
  • + 1.0 +
  • + + +
    + + + \ No newline at end of file diff --git a/Defs/Rituals/Ritual_Outcomes_sex.xml b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Outcomes_sex.xml similarity index 73% rename from Defs/Rituals/Ritual_Outcomes_sex.xml rename to RJWSexperience_Ideology/Defs/Rituals/Ritual_Outcomes_sex.xml index 0899557..d8159cf 100644 --- a/Defs/Rituals/Ritual_Outcomes_sex.xml +++ b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Outcomes_sex.xml @@ -9,7 +9,7 @@
  • - moralist + initiator 0.10
  • @@ -102,7 +102,7 @@
  • - moralist + initiator 0.10
  • @@ -180,4 +180,75 @@ + + DrugOrgy + Depending on ritual quality, participants will get between {MINMOOD} and {MAXMOOD} mood for {MOODDAYS} days. + RitualOutcomeEffectWorker_RemoveConsumableBuilding + +
  • If the {0} is satisfying, one of the participants might gain an inspiration.
  • +
    + +
  • +
  • + + + +
  • (1, -0.50)
  • +
  • (3, 0.0)
  • +
  • (5, 0.10)
  • +
  • (10, 0.30)
  • + + + +
  • + + Impressiveness + + +
  • 0, 0
  • +
  • 50, 0.1
  • +
  • 120, 0.2
  • + + + +
  • + + 0.7 + Sex + 0.7 +
  • +
    + +
  • + + 0.05 + TerribleOrgy + The {0} was terrible! + -2 +
  • +
  • + + 0.10 + BoringOrgy + The {0} was boring. + -1 +
  • +
  • + + 0.6 + FunOrgy + The {0} was satisfying. + There's a 5% chance that a random participant gets an inspiration. + 1 +
  • +
  • + + 0.25 + UnforgettableOrgy + The {0} was spectacular! + There's a 10% chance that a random participant gets an inspiration. + 2 +
  • +
    +
    \ No newline at end of file diff --git a/Defs/Rituals/Ritual_Targets_sex.xml b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Targets_sex.xml similarity index 50% rename from Defs/Rituals/Ritual_Targets_sex.xml rename to RJWSexperience_Ideology/Defs/Rituals/Ritual_Targets_sex.xml index 67e9ca5..5805f34 100644 --- a/Defs/Rituals/Ritual_Targets_sex.xml +++ b/RJWSexperience_Ideology/Defs/Rituals/Ritual_Targets_sex.xml @@ -4,4 +4,12 @@ RitualSpotOrAltar_Gangbang RitualObligationTargetWorker_AnyRitualSpotOrAltar_Scarification + + + DrugOrgy + RitualObligationTargetWorker_ConsumableBuilding + +
  • Burnbong_Aphrodisiac
  • +
    +
    \ No newline at end of file diff --git a/RJWSexperience_Ideology/Defs/ThingDefs/Buildings_Ideo_sex.xml b/RJWSexperience_Ideology/Defs/ThingDefs/Buildings_Ideo_sex.xml new file mode 100644 index 0000000..eaaba10 --- /dev/null +++ b/RJWSexperience_Ideology/Defs/ThingDefs/Buildings_Ideo_sex.xml @@ -0,0 +1,134 @@ + + + + Burnbong_Aphrodisiac + + 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. + RealtimeOnly + + Graphic_Single + Things/Building/Misc/Burnbong/Burnbong + (1.2,1.2) + + (0.92, 1 ,0.92) + + + (1,1) + + 30 + 30 + + + 30 + + false + + 50 + 10000 + 25 + + +
  • + BurnbongSmoke +
  • +
  • + 0.5 + (0, 0, 0.42) +
  • +
  • + HumpShroomEffect + true + 10 + 0.01 +
  • +
    +
    + + + + Autobong_Aphrodisiac + + An automatic humpshroom-burning device which generates an estro-smoke cloud around itself. Anyone in the cloud will become horny over time. + Building + + Things/Building/Misc/Autobong/Autobong + Graphic_Single + (2,2) + CutoutComplex + + Things/Building/Misc/Autobong/Autobong + Building + PassThroughOnly + 42 + Normal + RealtimeOnly + 0.20 + false + (2,2) + + 80 + 800 + + true + + 10 + 3 + + +
  • Metallic
  • +
  • Woody
  • +
    + 100 + true + +
  • MicroelectronicsBasics
  • +
    + +
  • + 0.35 + 10.0 + + +
  • HumpShroom
  • + + + 1 + true + true + +
  • + 10 + (252,187,113,0) +
  • +
  • + CompGatherSpot +
  • +
  • + CompPowerTrader + 150 + true +
  • +
  • +
  • + HumpShroomEffect + 4.9 + 0.005 + true +
  • +
  • + BurnbongSmoke + 4.9 + 4 + AutobongSmoke + 25 +
  • +
    + Misc + true + +
  • PlaceWorker_SmokeCloudMaker
  • +
    +
    + + +
    \ No newline at end of file diff --git a/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml b/RJWSexperience_Ideology/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml similarity index 51% rename from Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml rename to RJWSexperience_Ideology/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml index be1c2ed..9488047 100644 --- a/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml +++ b/RJWSexperience_Ideology/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml @@ -57,4 +57,59 @@ + + TerribleOrgy + Thought_AttendedRitual + 6 + 3 + +
  • + + That orgy was terrible. ugh. + -3 +
  • +
    +
    + + + BoringOrgy + Thought_AttendedRitual + 6 + 3 + +
  • + + That orgy was not good. Wish I never went. + -1 +
  • +
    +
    + + + FunOrgy + Thought_AttendedRitual + 6 + 3 + +
  • + + That was a fun orgy. It really satisfied me. + 8 +
  • +
    +
    + + + UnforgettableOrgy + Thought_AttendedRitual + 6 + 3 + +
  • + + That orgy was awesome! Everything was perfect. + 16 +
  • +
    +
    \ No newline at end of file diff --git a/RJWSexperience_Ideology/Patches/RJW_Drugs.xml b/RJWSexperience_Ideology/Patches/RJW_Drugs.xml new file mode 100644 index 0000000..e0a93bb --- /dev/null +++ b/RJWSexperience_Ideology/Patches/RJW_Drugs.xml @@ -0,0 +1,47 @@ + + + + + Defs/HediffDef[defName="HumpShroomEffect"]/stages + + +
  • + + + 1.25 + 0.25 + +
  • +
  • + 0.3 + + 1.1 + + 2 + 0.5 + +
  • +
  • + 0.6 + + 1.33 + + 3 + 0.75 + +
  • +
  • + 0.9 + + 1.33 + + 5 + 1.5 + +
  • +
    +
    +
    + + +
    \ No newline at end of file diff --git a/RJWSexperience_Ideology/Patches/RJW_Precepts.xml b/RJWSexperience_Ideology/Patches/RJW_Precepts.xml new file mode 100644 index 0000000..a36d408 --- /dev/null +++ b/RJWSexperience_Ideology/Patches/RJW_Precepts.xml @@ -0,0 +1,29 @@ + + + + + Defs/PreceptDef[defName="Corpses_DontCare"]/requiredMemes + +
  • Necrophile
  • +
    +
    + + + Defs/PreceptDef[defName="Corpses_DontCare"]/associatedMemes + +
  • Necrophile
  • +
    +
    + + + Defs/PreceptDef[defName="Lovin_FreeApproved"] + + + 0.5 + 0.25 + + + + + +
    \ No newline at end of file diff --git a/RJWSexperience_Ideology/Patches/RJW_StatDefs_Ideo.xml b/RJWSexperience_Ideology/Patches/RJW_StatDefs_Ideo.xml new file mode 100644 index 0000000..e7b2e8d --- /dev/null +++ b/RJWSexperience_Ideology/Patches/RJW_StatDefs_Ideo.xml @@ -0,0 +1,14 @@ + + + + + Defs/StatDef[defName="Vulnerability"]/parts + +
  • + 0.5 +
  • +
    +
    + + +
    \ No newline at end of file diff --git a/Patches/RJW_ThoughtDefs.xml b/RJWSexperience_Ideology/Patches/RJW_ThoughtDefs.xml similarity index 100% rename from Patches/RJW_ThoughtDefs.xml rename to RJWSexperience_Ideology/Patches/RJW_ThoughtDefs.xml diff --git a/Patches/RJW_ThoughtDefsDeath.xml b/RJWSexperience_Ideology/Patches/RJW_ThoughtDefsDeath.xml similarity index 100% rename from Patches/RJW_ThoughtDefsDeath.xml rename to RJWSexperience_Ideology/Patches/RJW_ThoughtDefsDeath.xml diff --git a/Patches/RJW_ThoughtDefsLost.xml b/RJWSexperience_Ideology/Patches/RJW_ThoughtDefsLost.xml similarity index 100% rename from Patches/RJW_ThoughtDefsLost.xml rename to RJWSexperience_Ideology/Patches/RJW_ThoughtDefsLost.xml diff --git a/Textures/Things/Item/CumBucket.png b/Textures/Things/Item/CumBucket.png new file mode 100644 index 0000000..5e0e4a6 Binary files /dev/null and b/Textures/Things/Item/CumBucket.png differ diff --git a/Textures/UI/Issues/Necrophilia.png b/Textures/UI/Issues/Necrophilia.png new file mode 100644 index 0000000..4e43a59 Binary files /dev/null and b/Textures/UI/Issues/Necrophilia.png differ diff --git a/Textures/UI/Memes/Necrophile.png b/Textures/UI/Memes/Necrophile.png new file mode 100644 index 0000000..5b2bf61 Binary files /dev/null and b/Textures/UI/Memes/Necrophile.png differ diff --git a/changelogs.txt b/changelogs.txt index fe2a156..860a65d 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -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