From 6d1a218b2eecaf1f5416ef3c63fa6f37c9206a29 Mon Sep 17 00:00:00 2001 From: c0ffee Date: Mon, 12 Apr 2021 00:48:48 -0700 Subject: [PATCH] first commit --- About/About.xml | 37 ++++++ About/Manifest.xml | 5 + Assemblies/RJW-Events.dll | Bin 0 -> 17920 bytes Defs/DutyDefs/DutyDefs_Sex.xml | 48 ++++++++ Defs/GatheringDefs/Gatherings_Sex.xml | 18 +++ Defs/JobDefs/Jobs_Naked.xml | 8 ++ Defs/JobDefs/Jobs_OrgySex.xml | 15 +++ Defs/TaleDefs/Tales_Sex.xml | 32 +++++ Defs/ThoughtDefs/Thoughts_Sex.xml | 15 +++ RJW-Events.csproj | 81 +++++++++++++ RJW-Events.sln | 25 ++++ Source/DefOfs/TaleDefOf.cs | 20 ++++ Source/DefOfs/ThoughtDefOf.cs | 20 ++++ .../GatheringWorkers/GatheringWorker_Orgy.cs | 25 ++++ Source/JobDrivers/JobDriver_GetNaked.cs | 29 +++++ Source/JobDrivers/JobDriver_OrgySex.cs | 111 ++++++++++++++++++ .../JobDrivers/JobDriver_OrgySexReceiver.cs | 79 +++++++++++++ Source/JobGivers/JobGiver_FindOrgyPartner.cs | 102 ++++++++++++++++ Source/JobGivers/JobGiver_GetNaked.cs | 18 +++ Source/LordJobs/LordJob_Joinable_Orgy.cs | 64 ++++++++++ Source/Patches/HarmonyPatch_ReclotheOnEnd.cs | 24 ++++ Source/Patches/Harmony_PatchAll.cs | 21 ++++ .../ThinkNodes/ThinkNode_ConditionalNude.cs | 39 ++++++ 23 files changed, 836 insertions(+) create mode 100644 About/About.xml create mode 100644 About/Manifest.xml create mode 100644 Assemblies/RJW-Events.dll create mode 100644 Defs/DutyDefs/DutyDefs_Sex.xml create mode 100644 Defs/GatheringDefs/Gatherings_Sex.xml create mode 100644 Defs/JobDefs/Jobs_Naked.xml create mode 100644 Defs/JobDefs/Jobs_OrgySex.xml create mode 100644 Defs/TaleDefs/Tales_Sex.xml create mode 100644 Defs/ThoughtDefs/Thoughts_Sex.xml create mode 100644 RJW-Events.csproj create mode 100644 RJW-Events.sln create mode 100644 Source/DefOfs/TaleDefOf.cs create mode 100644 Source/DefOfs/ThoughtDefOf.cs create mode 100644 Source/GatheringWorkers/GatheringWorker_Orgy.cs create mode 100644 Source/JobDrivers/JobDriver_GetNaked.cs create mode 100644 Source/JobDrivers/JobDriver_OrgySex.cs create mode 100644 Source/JobDrivers/JobDriver_OrgySexReceiver.cs create mode 100644 Source/JobGivers/JobGiver_FindOrgyPartner.cs create mode 100644 Source/JobGivers/JobGiver_GetNaked.cs create mode 100644 Source/LordJobs/LordJob_Joinable_Orgy.cs create mode 100644 Source/Patches/HarmonyPatch_ReclotheOnEnd.cs create mode 100644 Source/Patches/Harmony_PatchAll.cs create mode 100644 Source/ThinkNodes/ThinkNode_ConditionalNude.cs diff --git a/About/About.xml b/About/About.xml new file mode 100644 index 0000000..ceea282 --- /dev/null +++ b/About/About.xml @@ -0,0 +1,37 @@ + + + + RJW-Events + C0ffee + +
  • 1.2
  • +
    + c0ffee.rjw.events + +
  • + brrainz.harmony + Harmony + steam://url/CommunityFilePage/2009463077 + https://github.com/pardeike/HarmonyRimWorld/releases/latest +
  • +
  • + UnlimitedHugs.HugsLib + HugsLib + https://github.com/UnlimitedHugs/RimworldHugsLib/releases/latest + steam://url/CommunityFilePage/818773962 +
  • +
  • + rim.job.world + RimJobWorld + https://www.loverslab.com/topic/110270-mod-rimjobworld/ +
  • +
    + +
  • UnlimitedHugs.HugsLib
  • +
  • brrainz.harmony
  • +
  • rim.job.world
  • +
    + + RJW Events + +
    diff --git a/About/Manifest.xml b/About/Manifest.xml new file mode 100644 index 0000000..2a41c8c --- /dev/null +++ b/About/Manifest.xml @@ -0,0 +1,5 @@ + + + RJW-Events + 0.0.1 + \ No newline at end of file diff --git a/Assemblies/RJW-Events.dll b/Assemblies/RJW-Events.dll new file mode 100644 index 0000000000000000000000000000000000000000..4c12f274577236e53e431663d96920a714f0b175 GIT binary patch literal 17920 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 + + + Orgy + + MediumPriority + + + +
  • + +
  • + +
  • + 0.25 + +
  • +
    + + +
  • + 0.45 + +
  • + + + +
  • + 50~250 +
  • + + + +
  • + + + + +
  • + Jog + 50~250 +
  • + +
    + +
    + +
    \ No newline at end of file diff --git a/Defs/GatheringDefs/Gatherings_Sex.xml b/Defs/GatheringDefs/Gatherings_Sex.xml new file mode 100644 index 0000000..a344ed3 --- /dev/null +++ b/Defs/GatheringDefs/Gatherings_Sex.xml @@ -0,0 +1,18 @@ + + + + Orgy + + 1 + Orgy + {ORGANIZER_labelShort} is hosting an orgy! Everyone who goes will gain social and sexual energy. + The orgy has been called off. + The orgy has finished. + Orgy + GatheringWorker_Party + +
  • PartySpot
  • +
    +
    +
    + diff --git a/Defs/JobDefs/Jobs_Naked.xml b/Defs/JobDefs/Jobs_Naked.xml new file mode 100644 index 0000000..48f8bd6 --- /dev/null +++ b/Defs/JobDefs/Jobs_Naked.xml @@ -0,0 +1,8 @@ + + + + GetNaked + RJW_Events.JobDriver_GetNaked + Gettin' nekkid. + + diff --git a/Defs/JobDefs/Jobs_OrgySex.xml b/Defs/JobDefs/Jobs_OrgySex.xml new file mode 100644 index 0000000..ae500a4 --- /dev/null +++ b/Defs/JobDefs/Jobs_OrgySex.xml @@ -0,0 +1,15 @@ + + + + OrgySex + RJW_Events.JobDriver_OrgySex + lovin' in orgy. + false + + + GettinOrgySex + RJW_Events.JobDriver_OrgySexReceiver + Gettin' loved in orgy. + false + + \ No newline at end of file diff --git a/Defs/TaleDefs/Tales_Sex.xml b/Defs/TaleDefs/Tales_Sex.xml new file mode 100644 index 0000000..952844f --- /dev/null +++ b/Defs/TaleDefs/Tales_Sex.xml @@ -0,0 +1,32 @@ + + + + AttendedOrgy + + Tale_DoublePawn + Volatile + ATTENDER + ORGANIZER + 1 + + +
  • tale_noun->[ATTENDER_nameDef] attending [ORGANIZER_nameDef]'s orgy
  • +
  • tale_noun->[ATTENDER_nameDef] having sex with [ORGANIZER_nameDef] at an orgy
  • +
  • image->[ATTENDER_nameFull] making out with [ORGANIZER_nameFull] [circumstance_group]
  • +
  • image->[ATTENDER_nameFull] getting a drink from [ORGANIZER_nameFull] [circumstance_group]
  • +
  • image->[ATTENDER_nameFull] chatting with [ORGANIZER_nameFull] [circumstance_group]
  • +
  • image->[ORGANIZER_nameFull] welcoming [ATTENDER_nameFull] [circumstance_group]
  • +
  • image->[ORGANIZER_nameFull] introducing [ATTENDER_nameFull] to a friend [circumstance_group]
  • +
  • circumstance_phrase->with a broad grin
  • +
  • circumstance_phrase->with a laugh
  • +
  • circumstance_phrase->with a [AdjectiveFriendly] smile
  • +
  • circumstance_phrase->while laughing uproariously
  • +
  • circumstance_phrase->while [AdjectiveFriendly]
  • +
  • desc_sentence->[Quantity_adjphrase] [PersonJob]s are involved in the conversation.
  • +
  • desc_sentence->The area is decorated with [Color] and [Color].
  • +
  • desc_sentence->[Quantity_adjphrase] [Animal]s play nearby.
  • +
    +
    +
    +
    + diff --git a/Defs/ThoughtDefs/Thoughts_Sex.xml b/Defs/ThoughtDefs/Thoughts_Sex.xml new file mode 100644 index 0000000..d06d5ce --- /dev/null +++ b/Defs/ThoughtDefs/Thoughts_Sex.xml @@ -0,0 +1,15 @@ + + + + AttendedOrgy + 10 + 10 + +
  • + + I got very intimate with everyone at that orgy. + 8 +
  • +
    +
    +
    diff --git a/RJW-Events.csproj b/RJW-Events.csproj new file mode 100644 index 0000000..e5ef7b7 --- /dev/null +++ b/RJW-Events.csproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + {938E73E7-1D25-4842-A27F-8C7D0EE7F67F} + Library + Properties + RJW_Events + RJW-Events + v4.7.2 + 512 + true + + + false + none + false + Assemblies\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\Modpacks\Mods\836308268\1.2\Assemblies\0Harmony.dll + False + + + ..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + + + ..\rjw-master\1.2\Assemblies\RJW.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RJW-Events.sln b/RJW-Events.sln new file mode 100644 index 0000000..086d215 --- /dev/null +++ b/RJW-Events.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RJW-Events", "RJW-Events.csproj", "{FCB2ED70-7FE4-4C45-B90C-D7BF7E5B5E06}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FCB2ED70-7FE4-4C45-B90C-D7BF7E5B5E06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCB2ED70-7FE4-4C45-B90C-D7BF7E5B5E06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCB2ED70-7FE4-4C45-B90C-D7BF7E5B5E06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCB2ED70-7FE4-4C45-B90C-D7BF7E5B5E06}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {839AB9DE-FF41-498A-9F8F-1DE2BCC6ECD5} + EndGlobalSection +EndGlobal diff --git a/Source/DefOfs/TaleDefOf.cs b/Source/DefOfs/TaleDefOf.cs new file mode 100644 index 0000000..388561b --- /dev/null +++ b/Source/DefOfs/TaleDefOf.cs @@ -0,0 +1,20 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RJW_Events +{ + [DefOf] + public static class TaleDefOf + { + static TaleDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(TaleDefOf)); + } + + public static TaleDef AttendedOrgy; + } +} diff --git a/Source/DefOfs/ThoughtDefOf.cs b/Source/DefOfs/ThoughtDefOf.cs new file mode 100644 index 0000000..dc1b044 --- /dev/null +++ b/Source/DefOfs/ThoughtDefOf.cs @@ -0,0 +1,20 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RJW_Events +{ + [DefOf] + public static class ThoughtDefOf + { + static ThoughtDefOf() + { + DefOfHelper.EnsureInitializedInCtor(typeof(ThoughtDefOf)); + } + + public static ThoughtDef AttendedOrgy; + } +} diff --git a/Source/GatheringWorkers/GatheringWorker_Orgy.cs b/Source/GatheringWorkers/GatheringWorker_Orgy.cs new file mode 100644 index 0000000..ebf91cc --- /dev/null +++ b/Source/GatheringWorkers/GatheringWorker_Orgy.cs @@ -0,0 +1,25 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI.Group; + +namespace RJW_Events +{ + class GatheringWorker_Orgy : GatheringWorker + { + + protected override LordJob CreateLordJob(IntVec3 spot, Pawn organizer) + { + return new LordJob_Joinable_Orgy(spot, organizer, this.def); + } + protected override bool TryFindGatherSpot(Pawn organizer, out IntVec3 spot) + { + return RCellFinder.TryFindGatheringSpot_NewTemp(organizer, this.def, false, out spot); + } + + } +} diff --git a/Source/JobDrivers/JobDriver_GetNaked.cs b/Source/JobDrivers/JobDriver_GetNaked.cs new file mode 100644 index 0000000..53e3d57 --- /dev/null +++ b/Source/JobDrivers/JobDriver_GetNaked.cs @@ -0,0 +1,29 @@ +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse.AI; + +namespace RJW_Events +{ + class JobDriver_GetNaked : JobDriver + { + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return true; + } + + protected override IEnumerable MakeNewToils() + { + Toil t = new Toil(); + t.AddFinishAction(() => { + + SexUtility.DrawNude(pawn); + + }); + yield return t; + } + } +} diff --git a/Source/JobDrivers/JobDriver_OrgySex.cs b/Source/JobDrivers/JobDriver_OrgySex.cs new file mode 100644 index 0000000..d9f0340 --- /dev/null +++ b/Source/JobDrivers/JobDriver_OrgySex.cs @@ -0,0 +1,111 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI; +using Verse.AI.Group; + +namespace RJW_Events +{ + class JobDriver_OrgySex : JobDriver_SexQuick + { + + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return true; + } + + protected override IEnumerable MakeNewToils() + { + base.setup_ticks(); + JobDef PartnerJob = DefDatabase.GetNamed("GettinOrgySex", true); + this.FailOnDespawnedNullOrForbidden(this.iTarget); + this.FailOn(() => !this.Partner.health.capacities.CanBeAwake); + this.FailOn(() => this.pawn.IsFighting()); + this.FailOn(() => this.Partner.IsFighting()); + this.FailOn(() => this.pawn.Drafted); + yield return Toils_Goto.GotoThing(this.iTarget, PathEndMode.OnCell); + yield return new Toil + { + defaultCompleteMode = ToilCompleteMode.Delay, + initAction = delegate () + { + this.ticksLeftThisToil = 5000; + }, + tickAction = delegate () + { + this.pawn.GainComfortFromCellIfPossible(false); + if (this.pawn.Position.DistanceTo(this.Partner.Position) <= 1f) + { + this.ReadyForNextToil(); + } + } + }; + yield return new Toil + { + defaultCompleteMode = ToilCompleteMode.Instant, + socialMode = RandomSocialMode.Off, + initAction = delegate () + { + + if(Partner.CurJob.def != PartnerJob) + { + Job newJob = JobMaker.MakeJob(PartnerJob, this.pawn, this.Partner); + this.Partner.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false); + } + + } + }; + Toil toil = new Toil(); + toil.defaultCompleteMode = ToilCompleteMode.Never; + toil.socialMode = RandomSocialMode.Off; + toil.defaultDuration = this.duration; + toil.handlingFacing = true; + toil.FailOn(() => this.Partner.CurJob.def != PartnerJob); + toil.initAction = delegate () + { + this.Partner.pather.StopDead(); + this.Partner.jobs.curDriver.asleep = false; + this.usedCondom = (CondomUtility.TryUseCondom(this.pawn) || CondomUtility.TryUseCondom(this.Partner)); + this.Start(); + }; + toil.AddPreTickAction(delegate + { + this.ticks_left--; + if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts)) + { + this.ThrowMetaIcon(this.pawn.Position, this.pawn.Map, ThingDefOf.Mote_Heart); + } + this.SexTick(this.pawn, this.Partner, true, true); + SexUtility.reduce_rest(this.Partner, 1f); + SexUtility.reduce_rest(this.pawn, 1f); + if (this.ticks_left <= 0) + { + this.ReadyForNextToil(); + } + }); + toil.AddFinishAction(delegate + { + this.End(); + if(LordUtility.GetLord(pawn)?.CurLordToil != null && !(LordUtility.GetLord(pawn).CurLordToil is LordToil_End)) + SexUtility.DrawNude(pawn); + }); + yield return toil; + yield return new Toil + { + initAction = delegate () + { + SexUtility.ProcessSex(this.pawn, this.Partner, this.usedCondom, this.isRape, false, false, this.sexType); + }, + defaultCompleteMode = ToilCompleteMode.Instant + }; + yield break; + } + + + } +} diff --git a/Source/JobDrivers/JobDriver_OrgySexReceiver.cs b/Source/JobDrivers/JobDriver_OrgySexReceiver.cs new file mode 100644 index 0000000..4596cd1 --- /dev/null +++ b/Source/JobDrivers/JobDriver_OrgySexReceiver.cs @@ -0,0 +1,79 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI; + +namespace RJW_Events +{ + class JobDriver_OrgySexReceiver : JobDriver_SexBaseReciever + { + + protected override IEnumerable MakeNewToils() + { + base.setup_ticks(); + this.parteners.Add(base.Partner); + float num = xxx.get_sex_ability(base.Partner); + if (num < 0.8f) + { + this.ticks_between_thrusts += 120; + } + else if (num > 2f) + { + this.ticks_between_thrusts -= 30; + } + if (this.pawn.relations.OpinionOf(base.Partner) < 0) + { + this.ticks_between_hearts += 50; + } + else if (this.pawn.relations.OpinionOf(base.Partner) > 60) + { + this.ticks_between_hearts -= 25; + } + this.FailOnDespawnedOrNull(this.iTarget); + this.FailOn(() => !base.Partner.health.capacities.CanBeAwake); + this.FailOn(() => this.pawn.Drafted); + this.FailOn(() => base.Partner.Drafted); + + + yield return Toils_Reserve.Reserve(this.iTarget, 1, 0, null); + Toil toil2 = this.MakeSexToil(); + toil2.handlingFacing = false; + yield return toil2; + + + yield break; + } + + private Toil MakeSexToil() + { + Toil toil = new Toil(); + toil.defaultCompleteMode = ToilCompleteMode.Never; + toil.socialMode = RandomSocialMode.Off; + toil.handlingFacing = true; + toil.tickAction = delegate () + { + if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts)) + { + base.ThrowMetaIcon(this.pawn.Position, this.pawn.Map, ThingDefOf.Mote_Heart); + } + }; + toil.AddEndCondition(delegate + { + if (this.parteners.Count <= 0) + { + return JobCondition.Succeeded; + } + return JobCondition.Ongoing; + }); + toil.socialMode = RandomSocialMode.Off; + return toil; + } + + + } +} diff --git a/Source/JobGivers/JobGiver_FindOrgyPartner.cs b/Source/JobGivers/JobGiver_FindOrgyPartner.cs new file mode 100644 index 0000000..2f08b90 --- /dev/null +++ b/Source/JobGivers/JobGiver_FindOrgyPartner.cs @@ -0,0 +1,102 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI; +using Verse.AI.Group; + +namespace RJW_Events +{ + + + public class JobGiver_FindOrgyPartner : ThinkNode_JobGiver + { + + protected override Job TryGiveJob(Pawn pawn) + { + if (!RJWHookupSettings.HookupsEnabled) + { + return null; + } + if (pawn.Drafted) + { + return null; + } + + Pawn_MindState mindState = pawn.mindState; + DutyDef dutyDef; + if (mindState == null) + { + dutyDef = null; + } + else + { + PawnDuty duty = mindState.duty; + dutyDef = ((duty != null) ? duty.def : null); + } + if (dutyDef == DutyDefOf.TravelOrLeave) + { + if (RJWSettings.DebugLogJoinInBed) + { + ModLog.Message("JoinInBed.TryGiveJob:(" + xxx.get_pawnname(pawn) + "): has TravelOrLeave, no time for lovin!"); + } + return null; + } + + if (!CasualSex_Helper.CanHaveSex(pawn)) + { + return null; + } + + List targets = LordUtility.GetLord(pawn).ownedPawns; + + Pawn pawn2 = null; + if(!BestPawnForOrgyExists(pawn, targets, out pawn2)) + { + return null; + } + if (pawn2 == null) + { + return null; + } + + if (pawn2.jobs.curDriver is JobDriver_SexBaseInitiator) + { + pawn2 = (Pawn)pawn2.CurJob.targetA; + } + else if (pawn.CurJob != null && pawn.jobs.curDriver != null) + { + pawn.jobs.curDriver.EndJobWith(JobCondition.InterruptForced); + } + return JobMaker.MakeJob(DefDatabase.GetNamed("OrgySex", true), pawn2); + } + + public bool BestPawnForOrgyExists(Pawn pawn1, List targets, out Pawn result) + { + if(targets.TryRandomElementByWeight((Pawn p) => { + + float chance = pawn1.relations.SecondaryRomanceChanceFactor(p); + if(!(p.jobs.curDriver is JobDriver_Sex)) + { + //higher chance if person is doing nothing + chance *= 3f; + } + return chance; + + }, out Pawn option)) { + result = option; + return true; + } + else + { + result = null; + return false; + } + + } + } +} diff --git a/Source/JobGivers/JobGiver_GetNaked.cs b/Source/JobGivers/JobGiver_GetNaked.cs new file mode 100644 index 0000000..d6e8878 --- /dev/null +++ b/Source/JobGivers/JobGiver_GetNaked.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI; + +namespace RJW_Events +{ + public class JobGiver_GetNaked : ThinkNode_JobGiver + { + protected override Job TryGiveJob(Pawn pawn) + { + return JobMaker.MakeJob(DefDatabase.GetNamed("GetNaked", true)); + } + } +} diff --git a/Source/LordJobs/LordJob_Joinable_Orgy.cs b/Source/LordJobs/LordJob_Joinable_Orgy.cs new file mode 100644 index 0000000..567c155 --- /dev/null +++ b/Source/LordJobs/LordJob_Joinable_Orgy.cs @@ -0,0 +1,64 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Events +{ + class LordJob_Joinable_Orgy : LordJob_Joinable_Party + { + protected override ThoughtDef AttendeeThought + { + get + { + return ThoughtDefOf.AttendedOrgy; + } + } + + protected override TaleDef AttendeeTale + { + get + { + return TaleDefOf.AttendedOrgy; + } + } + protected override ThoughtDef OrganizerThought + { + get + { + return ThoughtDefOf.AttendedOrgy; + } + } + + protected override TaleDef OrganizerTale + { + get + { + return TaleDefOf.AttendedOrgy; + } + } + + public LordJob_Joinable_Orgy(IntVec3 spot, Pawn organizer, GatheringDef gatheringDef) : base(spot, organizer, gatheringDef) + { + + } + + + public override float VoluntaryJoinPriorityFor(Pawn p) + { + if (!CasualSex_Helper.CanHaveSex(p) || p.Map.mapPawns.FreeColonists.Exists((Pawn p1) => + { + + return p.relations.SecondaryRomanceChanceFactor(p1) > 0 || p1.relations.SecondaryRomanceChanceFactor(p) > 0; + + })) return 0; + + return base.VoluntaryJoinPriorityFor(p); + } + + } +} diff --git a/Source/Patches/HarmonyPatch_ReclotheOnEnd.cs b/Source/Patches/HarmonyPatch_ReclotheOnEnd.cs new file mode 100644 index 0000000..4b0f197 --- /dev/null +++ b/Source/Patches/HarmonyPatch_ReclotheOnEnd.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; + +namespace RJW_Events +{ + [HarmonyPatch(typeof(LordJob_Joinable_Party), "ApplyOutcome")] + public static class HarmonyPatch_ReclotheOnEnd + { + public static void Postfix(LordToil_Party toil) + { + List ownedPawns = toil.lord.ownedPawns; + foreach(Pawn p in ownedPawns) + { + p.Drawer.renderer.graphics.ResolveApparelGraphics(); + } + } + } +} diff --git a/Source/Patches/Harmony_PatchAll.cs b/Source/Patches/Harmony_PatchAll.cs new file mode 100644 index 0000000..88dba15 --- /dev/null +++ b/Source/Patches/Harmony_PatchAll.cs @@ -0,0 +1,21 @@ +using HarmonyLib; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Events +{ + [StaticConstructorOnStartup] + class Harmony_PatchAll + { + static Harmony_PatchAll() + { + Harmony harmony = new Harmony("rimworldevents"); + harmony.PatchAll(Assembly.GetExecutingAssembly()); + } + } +} diff --git a/Source/ThinkNodes/ThinkNode_ConditionalNude.cs b/Source/ThinkNodes/ThinkNode_ConditionalNude.cs new file mode 100644 index 0000000..6e71124 --- /dev/null +++ b/Source/ThinkNodes/ThinkNode_ConditionalNude.cs @@ -0,0 +1,39 @@ +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using Verse.AI; + +namespace RJW_Events +{ + public class ThinkNode_ConditionalNude : ThinkNode_Conditional + { + protected override bool Satisfied(Pawn pawn) + { + //if pawn is rendering apparel they shouldn't be, + if (pawn.Drawer.renderer.graphics.apparelGraphics.Any((ApparelGraphicRecord x) => { + + if (x.sourceApparel.def.defName.ToLower().ContainsAny(new string[] + { + "vibrator", + "piercing", + "strapon" + }) || (RJWPreferenceSettings.sex_wear == RJWPreferenceSettings.Clothing.Headgear && !x.sourceApparel.def.apparel.bodyPartGroups.Contains(BodyPartGroupDefOf.UpperHead))) + return false; + + return true; + + })) + { + //they aren't nude + return false; + } + + return true; + } + } +}