From da8939c4b8e53bb7dc031f10769c0887e90912cb Mon Sep 17 00:00:00 2001 From: c0ffeeeeeeee Date: Thu, 5 Nov 2020 22:03:16 -0800 Subject: [PATCH] bonus mood, thinknode AI --- Assemblies/RJW-ToysAndMasturbation.dll | Bin 14336 -> 15360 bytes Defs/ThinkTreeDefs/ThinkTrees_Masturbate.xml | 21 +++++++ Defs/ThoughtDefs/Thoughts_SexToy.xml | 17 ++++++ RJW-ToysAndMasturbation.csproj | 2 + Source/DefOfs/MasturbateToyDefOf.cs | 2 + .../JobDrivers/JobDriver_MasturbateWithToy.cs | 4 +- .../JobGivers/JobGiver_MasturbateWithToy.cs | 55 +++++++++++++++--- Source/ThingComps/CompProperties_SexToy.cs | 1 + Source/ThingComps/CompSexToy.cs | 2 + 9 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 Defs/ThinkTreeDefs/ThinkTrees_Masturbate.xml create mode 100644 Defs/ThoughtDefs/Thoughts_SexToy.xml diff --git a/Assemblies/RJW-ToysAndMasturbation.dll b/Assemblies/RJW-ToysAndMasturbation.dll index 17a7d54437fd3d5b3f77ce62964012b8166690b3..042aabd3897c22a4554a4d471bee2cc1fae7c011 100644 GIT binary patch literal 15360 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∾}9Nz)*SG=6|S=8Va*BmONVc>#K*x_d4}!{9U#B_j<`qe zm9HBc<*Twan32ciTiVy;Nx93~sc;wYMDXwAJY=v>J|PBtKageOpN)T)AIpaWKb4nc zqjgrEm&be`%B7-NI}bb8<$fk>@I7m%R)ZJOUjs+e0C22Bui;ij?*VU6c%#BP#lMw) z27a^R+^ujmeGbk8G)}LfUYe}eQIbySd+-Q5`dNAs>ksGyAfYW!;SIzXS2$MT%?j%j zt^zuz^wo+;E8L^-sK=3y&|5lbr`UwTRSMGz_b5E7@T|g{b=F*^aF4>H3ePGepR%Ly zVLD6~=pOM6@s1-F$;EQ5{6uOPDHdKU_+E!W^iA_Yjp(;Q{-aP|&ZEGZoX4|ke(P(v zM&k>qq!P?@iFcVFSb-8-GzFAJQ$blY9Ye;VnW(UZ0Xzvfhpq?C#niEBAvxo5TLe{` z8fhBvHmKUv1XY`s;O`1H-2v5ckljkls7`!KyesrH&%fax8(~_C)&eCExTw3nlRC@cNeWm+_dtZEkdnCT@P-WRsdFZpTpUR?T z>+rjwuB)?~=Jocrciy*Q>!iBob!|QF^oogYU&SK3uC2Rmbw^)Ed$0SeipE1XCaQ(o zIq@F%?TIb!jLOy4YV57s(AInCA1iN`ZvLc%e_314{q21X8`rq4liK`jySaVKvM%?7 zNweHZHMhH|nlYhR3);Ay;tIF8hif+Ft^U!wJ3c%8LBrFZH|~4$yU#bdGq1nSY0>cI z#4L=YGa}Na$MFz>F~%s2d<8Vdl9J>TB$1TmsipTqA7b1|L|Ve>gFX^iXhx({H^S*- zW?Y0ja5qSVmxenuQ%K#2r291^+>uA7#4_9w>9nj!+Bu0iE0}|p3kHMIz^@jj&*-L< z5*^5E3+}^9eTX6bAzS)YAg;kQD7DrROFz_=&J(f} zrm)jzgLlb63Q$a+LGTUm9O;ZSSaB&3eYgXzGCl^s;TZ}*GGx?5lCaaCV_GuOiC81) zuLBL0>Z>Z&ufre;u{20J+r<+9yp;MwaM+@mjtHT5y>jmJ7e+EAu(MD4;Al)y1kp;C zl|loOQj#j_edt&V^|2(*DKk;X9F>;R0;MCfApYJIY2z$1)4ZgScKR5L+As)|i0g~5 z$!Z!{nR%Rly%EO&XX9b%{ zM#z8yju^hfnHCw&wBm3>A-s)6IMa@V!Dzw3DXErlzWyl~%C}lXvg!`{kqD~uX9K=-wae6Nn<8W1@cmksvd2)Ai zn{yBFQQ}CE6xt^)vJDObRztY)190Veh_tEm-D_u`4_H^u)BE%Ux(g6#(-Ibq@nMzT zd+5m<9u{&kxuI#Lk$BV90W_P}@&2-?tZs6bPkZH1eD+jvC^Y?3&407^e~xaOdni2n JH=@7R{6FV5YpDPL diff --git a/Defs/ThinkTreeDefs/ThinkTrees_Masturbate.xml b/Defs/ThinkTreeDefs/ThinkTrees_Masturbate.xml new file mode 100644 index 0000000..2734935 --- /dev/null +++ b/Defs/ThinkTreeDefs/ThinkTrees_Masturbate.xml @@ -0,0 +1,21 @@ + + + + FapWithToyTree + Humanlike_PostMentalState + 12 + + +
  • + +
  • + +
  • + +
  • +
    + + +
    +
    +
    \ No newline at end of file diff --git a/Defs/ThoughtDefs/Thoughts_SexToy.xml b/Defs/ThoughtDefs/Thoughts_SexToy.xml new file mode 100644 index 0000000..4e1c739 --- /dev/null +++ b/Defs/ThoughtDefs/Thoughts_SexToy.xml @@ -0,0 +1,17 @@ + + + + UsedSexToy + Thought_Memory + 1.0 + 3 + 0.2 + +
  • + + A step above just using your hand. + 4 +
  • +
    +
    +
    \ No newline at end of file diff --git a/RJW-ToysAndMasturbation.csproj b/RJW-ToysAndMasturbation.csproj index 9345f24..be0acd2 100644 --- a/RJW-ToysAndMasturbation.csproj +++ b/RJW-ToysAndMasturbation.csproj @@ -72,6 +72,8 @@ + + diff --git a/Source/DefOfs/MasturbateToyDefOf.cs b/Source/DefOfs/MasturbateToyDefOf.cs index dfca664..6edcdaf 100644 --- a/Source/DefOfs/MasturbateToyDefOf.cs +++ b/Source/DefOfs/MasturbateToyDefOf.cs @@ -13,6 +13,8 @@ namespace RJW_ToysAndMasturbation { public static JobDef MasturbateWithToy; + public static ThoughtDef UsedSexToy; + static MasturbateToyDefOf() { DefOfHelper.EnsureInitializedInCtor(typeof(JobDefOf)); } diff --git a/Source/JobDrivers/JobDriver_MasturbateWithToy.cs b/Source/JobDrivers/JobDriver_MasturbateWithToy.cs index 66d2523..b09e854 100644 --- a/Source/JobDrivers/JobDriver_MasturbateWithToy.cs +++ b/Source/JobDrivers/JobDriver_MasturbateWithToy.cs @@ -32,7 +32,7 @@ namespace RJW_ToysAndMasturbation { yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A); yield return Toils_Haul.StartCarryThing(TargetIndex.A); - if (!SexToyUtility.isRJWAnimationsLoaded || true /*True for now, anims come later; disable once created animations*/) { + if (!SexToyUtility.isRJWAnimationsLoaded || true /*True for now*/) { //place down if anims isn't loaded yield return Toils_Haul.CarryHauledThingToCell(TargetIndex.C); yield return Toils_Haul.PlaceHauledThingInCell(TargetIndex.C, Toils_Goto.GotoCell(TargetIndex.C, PathEndMode.OnCell), storageMode: false); @@ -66,6 +66,8 @@ namespace RJW_ToysAndMasturbation { cleanup.AddQueuedTarget(TargetIndex.A, filth); pawn.jobs.jobQueue.EnqueueFirst(cleanup); } + //bonus mood + pawn.needs?.mood?.thoughts?.memories?.TryGainMemory(MasturbateToyDefOf.UsedSexToy); }; yield return AfterToil; diff --git a/Source/JobGivers/JobGiver_MasturbateWithToy.cs b/Source/JobGivers/JobGiver_MasturbateWithToy.cs index 57a6856..4ce85f4 100644 --- a/Source/JobGivers/JobGiver_MasturbateWithToy.cs +++ b/Source/JobGivers/JobGiver_MasturbateWithToy.cs @@ -21,20 +21,59 @@ namespace RJW_ToysAndMasturbation { if (!xxx.can_be_fucked(pawn) && !xxx.can_fuck(pawn)) { return null; } - if ((SexUtility.ReadyForLovin(pawn) && (!xxx.is_whore(pawn) || pawn.IsPrisoner || xxx.is_slave(pawn))) || xxx.is_frustrated(pawn)) { - if (RJWPreferenceSettings.FapInBed && pawn.jobs.curDriver is JobDriver_LayDown) { - Building_Bed bed = ((JobDriver_LayDown)pawn.jobs.curDriver).Bed; - if (bed != null) { - return JobMaker.MakeJob(xxx.Masturbate, null, bed, bed.Position); + + if(findSexToyOnMap(pawn, out Thing sexToy)) { + if ((SexUtility.ReadyForLovin(pawn) && (!xxx.is_whore(pawn) || pawn.IsPrisoner || xxx.is_slave(pawn))) || xxx.is_frustrated(pawn)) { + if (RJWPreferenceSettings.FapInBed && pawn.jobs.curDriver is JobDriver_LayDown) { + Building_Bed bed = ((JobDriver_LayDown)pawn.jobs.curDriver).Bed; + if (bed != null) { + + Job j = JobMaker.MakeJob(MasturbateToyDefOf.MasturbateWithToy, sexToy, bed, bed.Position); + j.count = 1; + return j; + + } } + else if (RJWPreferenceSettings.FapEverywhere && (xxx.is_frustrated(pawn) || xxx.has_quirk(pawn, "Exhibitionist"))) { + Job j = JobMaker.MakeJob(MasturbateToyDefOf.MasturbateWithToy, sexToy, null, FapLocation(pawn)); + j.count = 1; + return j; + } + } - else if (RJWPreferenceSettings.FapEverywhere && (xxx.is_frustrated(pawn) || xxx.has_quirk(pawn, "Exhibitionist"))) { - return JobMaker.MakeJob(xxx.Masturbate, null, null, FapLocation(pawn)); - } + + return null; } + return null; } + public static bool findSexToyOnMap(Pawn p, out Thing sexToy) { + + Predicate validator = delegate (Thing t) { + if(t.TryGetComp() == null) { + return false; + } + //homo check + if (t.TryGetComp().Props.primaryGender == p.gender || + (t.TryGetComp().Props.primaryGender == Gender.Male && xxx.can_fuck(p) && (RJWPreferenceSettings.FeMalesex == RJWPreferenceSettings.AllowedSex.All || RJWPreferenceSettings.FeMalesex == RJWPreferenceSettings.AllowedSex.Homo)) || + (t.TryGetComp().Props.primaryGender == Gender.Female && xxx.can_be_fucked(p) && (RJWPreferenceSettings.Malesex == RJWPreferenceSettings.AllowedSex.All || RJWPreferenceSettings.Malesex == RJWPreferenceSettings.AllowedSex.Homo))) + { + return true; + } + + return false; + }; + + + sexToy = GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableAlways), PathEndMode.OnCell, TraverseParms.For(p), validator: validator, maxDistance: 100); + + if (sexToy != null) + return true; + + return false; + } + } } diff --git a/Source/ThingComps/CompProperties_SexToy.cs b/Source/ThingComps/CompProperties_SexToy.cs index 3dc7f3c..164e945 100644 --- a/Source/ThingComps/CompProperties_SexToy.cs +++ b/Source/ThingComps/CompProperties_SexToy.cs @@ -9,6 +9,7 @@ using Verse; namespace RJW_ToysAndMasturbation { public class CompProperties_SexToy : CompProperties { + public Gender primaryGender = Gender.Female; public CompProperties_SexToy() { compClass = typeof(CompSexToy); } diff --git a/Source/ThingComps/CompSexToy.cs b/Source/ThingComps/CompSexToy.cs index b7a2b6c..1470786 100644 --- a/Source/ThingComps/CompSexToy.cs +++ b/Source/ThingComps/CompSexToy.cs @@ -13,6 +13,8 @@ namespace RJW_ToysAndMasturbation { public static IntVec3 FapLocation(Pawn p) => (new JobGiver_Masturbate()).FindFapLocation(p); + public CompProperties_SexToy Props => (CompProperties_SexToy)props; + public override IEnumerable CompFloatMenuOptions(Pawn pawn) { if (!pawn.CanReach(parent, PathEndMode.Touch, Danger.Deadly)) {