From 1f865320b02321dfc7b59f4ac13afbca74508457 Mon Sep 17 00:00:00 2001 From: Shabakur Date: Tue, 27 Dec 2022 13:48:38 +0100 Subject: [PATCH] Adding Lifeforce and succubus wings gene Adds lifeforce gene and functions for gaining lifeforce from oral sex and mental break if lifeforce reaches zero. Also add succubus wings drawn by me --- Common/Assemblies/Rjw-Genes.dll | Bin 43008 -> 52736 bytes Common/Defs/Genes/GeneDefs_Cosmetic.xml | 34 +++++ Common/Defs/Genes/GeneDefs_LifeForce.xml | 36 +++++ Common/Defs/JobDefs/Jobs_LifeForce.xml | 10 ++ .../MentalStateDefs/MentalState_Lifeforce.xml | 30 ++++ ...entalStateCritical_LifeForceRandomRape.xml | 35 +++++ .../Succubus_Wings_east.png | Bin 0 -> 1342 bytes .../Succubus_Wings_north.png | Bin 0 -> 1510 bytes .../Succubus_Wings_south.png | Bin 0 -> 1510 bytes Rjw-Genes.sln | 2 + Source/Animal_Inheritance/First.cs | 38 ----- Source/First.cs | 29 ++++ Source/GeneDefOf.cs | 3 + Source/Genes/Cum/CumUtility.cs | 30 ++++ Source/Genes/GeneUtility.cs | 35 +++++ .../Life_Force/GeneGizmo_ResourceLifeForce.cs | 83 +++++++++++ Source/Genes/Life_Force/Gene_LifeForce.cs | 138 ++++++++++++++++++ .../JobGiver_LifeForce_RandomRape.cs | 38 +++++ .../Life_Force/LifeForceMentalBreakWorker.cs | 32 ++++ .../Genes/Life_Force/LifeForceMentalState.cs | 23 +++ .../Life_Force/LifeForceMentalStateWorker.cs | 15 ++ Source/Genes/Life_Force/Patch_LifeForce.cs | 36 +++++ Source/Interactions/GenesPartKindUsageRule.cs | 56 +++++++ Source/JobDefOf.cs | 15 ++ Source/Rjw-Genes.csproj | 11 +- 25 files changed, 690 insertions(+), 39 deletions(-) create mode 100644 Common/Defs/Genes/GeneDefs_Cosmetic.xml create mode 100644 Common/Defs/Genes/GeneDefs_LifeForce.xml create mode 100644 Common/Defs/JobDefs/Jobs_LifeForce.xml create mode 100644 Common/Defs/MentalStateDefs/MentalState_Lifeforce.xml create mode 100644 Common/Patches/ThinkTree/MentalStateCritical_LifeForceRandomRape.xml create mode 100644 Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_east.png create mode 100644 Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_north.png create mode 100644 Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_south.png delete mode 100644 Source/Animal_Inheritance/First.cs create mode 100644 Source/First.cs create mode 100644 Source/Genes/Life_Force/GeneGizmo_ResourceLifeForce.cs create mode 100644 Source/Genes/Life_Force/Gene_LifeForce.cs create mode 100644 Source/Genes/Life_Force/JobGiver_LifeForce_RandomRape.cs create mode 100644 Source/Genes/Life_Force/LifeForceMentalBreakWorker.cs create mode 100644 Source/Genes/Life_Force/LifeForceMentalState.cs create mode 100644 Source/Genes/Life_Force/LifeForceMentalStateWorker.cs create mode 100644 Source/Genes/Life_Force/Patch_LifeForce.cs create mode 100644 Source/Interactions/GenesPartKindUsageRule.cs create mode 100644 Source/JobDefOf.cs diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index 5785b36754dcabce37b6476f1cecfe21c7590f3d..f89611e894207cb523ecbb9037a677c787db1c5a 100644 GIT binary patch literal 52736 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 literal 43008 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 diff --git a/Common/Defs/Genes/GeneDefs_Cosmetic.xml b/Common/Defs/Genes/GeneDefs_Cosmetic.xml new file mode 100644 index 0000000..acff4a5 --- /dev/null +++ b/Common/Defs/Genes/GeneDefs_Cosmetic.xml @@ -0,0 +1,34 @@ + + + + + + Miscellaneous + true + +
  • Wing
  • +
  • Wings
  • +
    + + Tailbone + +
    + + + rjw_genes_Succubus_Wings + + Carriers of this gene grow succubus wings. + UI/Icons/Genes/Gene_TailFurry + (0.75, 0.75, 0.75) + 1000 + 1 + + Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings + Hair + 2 + (0.0, 0.19, -0.1) + (0.0, 0.0, -0.1) + (0.1, 0.0, 0.0) + + +
    \ No newline at end of file diff --git a/Common/Defs/Genes/GeneDefs_LifeForce.xml b/Common/Defs/Genes/GeneDefs_LifeForce.xml new file mode 100644 index 0000000..1428ec2 --- /dev/null +++ b/Common/Defs/Genes/GeneDefs_LifeForce.xml @@ -0,0 +1,36 @@ + + + + rjw_genes_lifeforce + + Carriers of this gene have a reserve of biological strength powered by a resource called lifeforce. The resource can be gained and spent in various ways, all of which are unlocked by other genes.\n\nCarriers lose 10 lifeforce per day from biological entropy. + RJW_Genes.Gene_LifeForce + RJW_Genes.GeneGizmo_ResourceLifeForce + lifeforce + +
  • 0.25
  • +
  • 0.5
  • +
  • 0.75
  • +
    + true + true + A reserve of biological strength which can be gained and spent in a variety of ways. \n\nLifeforce can be increased by absorbing cum, typically through oral sex or stored cum. \n\nIf lifeforce reaches zero, {PAWN_nameDef} will become very unhappy and may try to obtain some forcefully. + UI/Icons/Genes/Gene_Hemogenic + 0 + Hemogen + -2 + +
  • Gives lifeforce supply.
  • +
    + + +
  • hemo
  • +
    +
    + rjw_genes_lifeforce_randomrape + 13 + 0.02 + 1 + 1 +
    +
    \ No newline at end of file diff --git a/Common/Defs/JobDefs/Jobs_LifeForce.xml b/Common/Defs/JobDefs/Jobs_LifeForce.xml new file mode 100644 index 0000000..274ade7 --- /dev/null +++ b/Common/Defs/JobDefs/Jobs_LifeForce.xml @@ -0,0 +1,10 @@ + + + + + rjw_genes_lifeforce_randomrape + rjw.JobDriver_RandomRape + Raping + false + + \ No newline at end of file diff --git a/Common/Defs/MentalStateDefs/MentalState_Lifeforce.xml b/Common/Defs/MentalStateDefs/MentalState_Lifeforce.xml new file mode 100644 index 0000000..1da6e15 --- /dev/null +++ b/Common/Defs/MentalStateDefs/MentalState_Lifeforce.xml @@ -0,0 +1,30 @@ + + + + + rjw_genes_lifeforce_randomrape + rjw_genes_lifeforce_randomrape + 1.5 + Extreme + + + + rjw_genes_lifeforce_randomrape + RJW_Genes.LifeForceMentalState + RJW_Genes.LifeForceMentalStateWorker + + Malicious + true + false + 30000 + 0.8 + 80000 + (0.5, 0.9, 0.5) + random rape + {0} has run out of lifeforce and is looking to obtain some. + ThreatSmall + {0} is no longer raping randomly. + Mental state: Random Rape + true + + \ No newline at end of file diff --git a/Common/Patches/ThinkTree/MentalStateCritical_LifeForceRandomRape.xml b/Common/Patches/ThinkTree/MentalStateCritical_LifeForceRandomRape.xml new file mode 100644 index 0000000..9532df8 --- /dev/null +++ b/Common/Patches/ThinkTree/MentalStateCritical_LifeForceRandomRape.xml @@ -0,0 +1,35 @@ + + + + + Defs/ThinkTreeDef[defName="MentalStateCritical"]/thinkRoot[@Class="ThinkNode_Tagger"]/subNodes + +
  • + rjw_genes_lifeforce_randomrape + +
  • + Rest + 0.05 + true + +
  • + +
  • +
  • + 0.5 + +
  • +
  • + +
  • + +
  • + + +
  • +
  • + +
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_east.png new file mode 100644 index 0000000000000000000000000000000000000000..19ecc3e26357ef0e13191b76cf7d11e920326e60 GIT binary patch literal 1342 zcmZ`(c~H^`6#mhAB`LM)I2#@{t&y5Bu2))$hIBpa^*$?v5&?_H0ze}O--=dN=-t1&1t$Z5X4f~s zUXf~kQ``)?J7fJ*BIe&u#OnpAD|I(Q|6BaWZ8k>=BQ+ zeHCll-U4mX%R;0w4_#yuP?I$PN57OiV)5EJr1SZdo3fLH>5E>PiZ{n^TK25r5XrHG zrtz;!CkU|=u9d>YcPdJ5OQkgDlVRo5Lt_J{?_HT#Sijk)=U}_!Zy(BwG1I;}SsUJj z?nVs8UT+mbyG1U{X$A-fV;T095 zxKBid-qX+C(AbRXD@2=#{cWP2%1bs*s;Y=0KMU`6RazdDM${EwmS?QTFdV`o<>8N! zt$CEj;sN+n&nrV7J#{7IxPHqf#iNhb&EBaC4h`)cepEhxHGn3|L(#xk2=|8;mGKhck97}15cwFp)hvB5|W;r?Aw!Qo~gVyA%|)0uU})0*`W)|2nOw& z^qgsGYsSzI#l#V>>vS#95n2isUj-9Pe-TOqN_#XTKY3Ngj zYXWT4M<=9LXt0nUeHJibYg#yA{>nJ!#k(KwmPdfe!aLMm3{#FW?wrdQdOaj2JYTR* z!etZwG&`{67Hq-dio6Qrz_HazJBG?@?oz-wJ#qHOq}~M5U8$-c#NYGiYFoq&rKPEM6 zXYtc_GXu9vG$wTmW*hGklbdkOVQ)$z(2L~=POHAl_4F0F(~(R4)>Io`$Afc?4XlRK z=P%6}lH$hhEF2PX`^j{cy^CaH7!Q?3P|auGdd=?|2+bIb0=W}xwaZ|(D+ar0p^n*M m0u5khrQvr%B_4zW0*(s9>dyjy&r3YhQ-)TB#&^tSECylHg<(Y zo+q^Oni`gQOdfePEK1Dd>i_O{&hPu3-{YL`zwe>5qm7ifk~jbWkg~mQ2|HrKPl$;g z?QT=w{v#5KhS^vE>V{O7kHqm{a|d$(pgvn-&sXF~|91O2A{qcV+5HnjjEJfL06-+( z*3#T9&YQ>S&rpHOGWfXO9uH{)s96Fb-m7^y<#(mr<_#UOfTGSm(u~i{>+{w!UQ4g7 zP-%Z0w>qX58K{0HYc6v!cCmDJjE5YBPr1TP^tq={HI=QeR-QzwdQF+2k1qdm*4}(W zuSO~yWnKA>yQH0 zV!TmWaBQYC_F5g)|pg@*=p}RP=)`DWxzv!kZ9I z>b)A3T2Ho0&8q{xJC!8g2Nw>QtH1NF$=1puCE*0H5X|4N3&Ld?@_uhY(bk$Y?d=+M z{}u2`oi|P}JBai-kUK=Z8OVGmvB?;kYQEYpUaJNZj$J7!bM-z^=rLCj*1vhp!{FQK z+Wv`nZi0Yh>d>^(c1)YI<1u}g)mh7G3M2Ut<<8nSg<;~@Z7FE`tz_z@*E6YBG3XEGM@fUSYhrL0Q&=EnoFegxd{IIE-6{=;IDVpr6y zu5}a2$Ij)`VT|Xo?2aL=k;`y%Ycjwz zQy6c;KF%_UEW+O&w)%)`a#2~V-7kk^t}}by!_Vc#zQTTnPTU&Dq4O?1EU$3l73z(M zJ0oNKUEuSM)N4dcI)){_L~>&VrW9W=iQp@F8TOv`XBQbM>yqn+6h!@MD;a^Aa%TOj zZDk>p5{2N@4l(}yZ7OeKbCibR7YA;Y;7HF&LAopK8w(pDaWhq-j}fJtD>SyC%g6;t zP=J}o9^g&o7lx;mSu`_vmxN7g(@@ehF%ijT*6hXtrE)UHwp6cj*sF~z8ln-PhzT|& z(SBEn1YP`KgbnwC3SL##)hf!`nO>G_i0znO$4+;DDaN@O_nxEkgJhMyxSG5663ni74M{EukYvypLqE*{A*eUT+jg4rzVVu#%BV0v>-5!)4` z9R@HtkHE_Yz;ieMYOF03xFtBId{-@U&-F7-t1m>QF+<^@pwIR&-NsvVc{S5@2K9se zSI^z~;k%QFXUrX~)S&G^lVNqujXo&?j-;w-vryyT9jj7IG9vTwFZwhQBGT20q{9n8 sWS#3I2|WmHQQ==cx&JWm7`^y#h>^71Iy#rX#fBK literal 0 HcmV?d00001 diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/rjw_genes_Succubus_Wings/Succubus_Wings_south.png new file mode 100644 index 0000000000000000000000000000000000000000..92c4a01194f511c25abb0abd2f8dd6a7f81aae2e GIT binary patch literal 1510 zcmZ`(do&XY7@tJ0N73;LrE@!k>B_4zW0*(s9>dyjy&r3YhQ-)TB#&^tSECylHg<(Y zo+q^Oni`gQOdfePEK1Dd>i_O{&hPu3-{YL`zwe>5qm7ifk~jbWkg~mQ2|HrKPl$;g z?QT=w{v#5KhS^vE>V{O7kHqm{a|d$(pgvn-&sXF~|91O2A{qcV+5HnjjEJfL06-+( z*3#T9&YQ>S&rpHOGWfXO9uH{)s96Fb-m7^y<#(mr<_#UOfTGSm(u~i{>+{w!UQ4g7 zP-%Z0w>qX58K{0HYc6v!cCmDJjE5YBPr1TP^tq={HI=QeR-QzwdQF+2k1qdm*4}(W zuSO~yWnKA>yQH0 zV!TmWaBQYC_F5g)|pg@*=p}RP=)`DWxzv!kZ9I z>b)A3T2Ho0&8q{xJC!8g2Nw>QtH1NF$=1puCE*0H5X|4N3&Ld?@_uhY(bk$Y?d=+M z{}u2`oi|P}JBai-kUK=Z8OVGmvB?;kYQEYpUaJNZj$J7!bM-z^=rLCj*1vhp!{FQK z+Wv`nZi0Yh>d>^(c1)YI<1u}g)mh7G3M2Ut<<8nSg<;~@Z7FE`tz_z@*E6YBG3XEGM@fUSYhrL0Q&=EnoFegxd{IIE-6{=;IDVpr6y zu5}a2$Ij)`VT|Xo?2aL=k;`y%Ycjwz zQy6c;KF%_UEW+O&w)%)`a#2~V-7kk^t}}by!_Vc#zQTTnPTU&Dq4O?1EU$3l73z(M zJ0oNKUEuSM)N4dcI)){_L~>&VrW9W=iQp@F8TOv`XBQbM>yqn+6h!@MD;a^Aa%TOj zZDk>p5{2N@4l(}yZ7OeKbCibR7YA;Y;7HF&LAopK8w(pDaWhq-j}fJtD>SyC%g6;t zP=J}o9^g&o7lx;mSu`_vmxN7g(@@ehF%ijT*6hXtrE)UHwp6cj*sF~z8ln-PhzT|& z(SBEn1YP`KgbnwC3SL##)hf!`nO>G_i0znO$4+;DDaN@O_nxEkgJhMyxSG5663ni74M{EukYvypLqE*{A*eUT+jg4rzVVu#%BV0v>-5!)4` z9R@HtkHE_Yz;ieMYOF03xFtBId{-@U&-F7-t1m>QF+<^@pwIR&-NsvVc{S5@2K9se zSI^z~;k%QFXUrX~)S&G^lVNqujXo&?j-;w-vryyT9jj7IG9vTwFZwhQBGT20q{9n8 sWS#3I2|WmHQQ==cx&JWm7`^y#h>^71Iy#rX#fBK literal 0 HcmV?d00001 diff --git a/Rjw-Genes.sln b/Rjw-Genes.sln index 858f9a2..3706653 100644 --- a/Rjw-Genes.sln +++ b/Rjw-Genes.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 17.0.32014.148 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rjw-Genes", "Source\Rjw-Genes.csproj", "{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FB09ADF4-FC35-4C1F-9135-2B4C4E4ED347}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/Source/Animal_Inheritance/First.cs b/Source/Animal_Inheritance/First.cs deleted file mode 100644 index 8194ab3..0000000 --- a/Source/Animal_Inheritance/First.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using rjw; -using Verse; -using RimWorld; - -namespace RJW_BGS -{ - [StaticConstructorOnStartup] - internal static class First - { - static First() - { - //RJWcopy.Racegroupdictbuilder(); - //Prints all found race dicts (debugging only) - //logAllFoundRaceGroupGenes - - } - - private static void logAllFoundRaceGroupGenes() - { - foreach (RaceGroupDef def in DefDatabase.AllDefs) - { - Log.Message("defName = " + def.defName); - if (def.raceNames != null) - { - foreach (string race in def.raceNames) - { - Log.Message(race); - } - } - } - } - } -} diff --git a/Source/First.cs b/Source/First.cs new file mode 100644 index 0000000..aa366ab --- /dev/null +++ b/Source/First.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using rjw; +using Verse; +using RimWorld; +using rjw.Modules.Interactions.Rules.PartKindUsageRules; +using rjw.Modules.Interactions.Internals.Implementation; + +namespace RJW_Genes +{ + [StaticConstructorOnStartup] + internal static class First + { + static First() + { + AddtoIPartPreferenceRule(); + } + + //Modified code from https://gitgud.io/lutepickle/rjw_menstruation/-/tree/main/1.4/source/RJW_Menstruation/RJW_Menstruation + private static void AddtoIPartPreferenceRule() + { + List partPreferenceRules = Unprivater.GetProtectedValue>("_partKindUsageRules", typeof(PartPreferenceDetectorService)); + partPreferenceRules.Add(new Interactions.GenesPartKindUsageRule()); + } + } +} diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs index e592100..726bb53 100644 --- a/Source/GeneDefOf.cs +++ b/Source/GeneDefOf.cs @@ -71,5 +71,8 @@ namespace RJW_Genes // Special public static readonly GeneDef rjw_genes_orgasm_rush; public static readonly GeneDef rjw_genes_aphrodisiac_pheromones; + + // LifeForce + public static readonly GeneDef rjw_genes_lifeforce; } } diff --git a/Source/Genes/Cum/CumUtility.cs b/Source/Genes/Cum/CumUtility.cs index ea049cc..9ad535a 100644 --- a/Source/Genes/Cum/CumUtility.cs +++ b/Source/Genes/Cum/CumUtility.cs @@ -33,5 +33,35 @@ namespace RJW_Genes } } + + //Get total fluidamount a persom has. + public static float GetTotalFluidAmount(Pawn pawn, float multiplier = 1f) + { + var partBPR = Genital_Helper.get_genitalsBPR(pawn); + var parts = Genital_Helper.get_PartsHediffList(pawn, partBPR); + float total_cum = 0; + if (!parts.NullOrEmpty()) + { + CompHediffBodyPart CompHediff; + + foreach (Hediff part in parts) + { + if (GenitaliaChanger.IsArtificial(part)) + continue; + + if (rjw.Genital_Helper.is_penis(part)) + { + CompHediff = part.TryGetComp(); + if (CompHediff != null) + { + total_cum += CompHediff.FluidAmmount * multiplier; + } + } + } + + } + return total_cum; + + } } } diff --git a/Source/Genes/GeneUtility.cs b/Source/Genes/GeneUtility.cs index ce022ba..3bea9a6 100644 --- a/Source/Genes/GeneUtility.cs +++ b/Source/Genes/GeneUtility.cs @@ -14,6 +14,41 @@ namespace RJW_Genes return pawn.genes.HasGene(GeneDefOf.rjw_genes_mechbreeder); } + public static bool HasLifeForce(Pawn pawn) + { + if (pawn.genes == null) + { + return false; + } + return pawn.genes.HasGene(GeneDefOf.rjw_genes_lifeforce); + } + + public static bool HasLowLifeForce(Pawn pawn) + { + if (HasLifeForce(pawn)) + { + Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); + if (gene.Resource.Value < gene.targetValue) + { + return true; + } + } + return false; + } + + public static bool HasCriticalLifeForce(Pawn pawn) + { + if (HasLifeForce(pawn)) + { + Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); + if (gene.Resource.Value < gene.MinLevelForAlert) + { + return true; + } + } + return false; + } + public static bool IsInsectIncubator(Pawn pawn) { if (pawn.genes == null) diff --git a/Source/Genes/Life_Force/GeneGizmo_ResourceLifeForce.cs b/Source/Genes/Life_Force/GeneGizmo_ResourceLifeForce.cs new file mode 100644 index 0000000..1dee43d --- /dev/null +++ b/Source/Genes/Life_Force/GeneGizmo_ResourceLifeForce.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +using UnityEngine; +namespace RJW_Genes +{ + //Copied from GeneGizmo_ResourceHemogen, with small modifications + public class GeneGizmo_ResourceLifeForce : GeneGizmo_Resource + { + public GeneGizmo_ResourceLifeForce(Gene_Resource gene, List drainGenes, Color barColor, Color barhighlightColor) : base(gene, drainGenes, barColor, barhighlightColor) + { + this.draggableBar = true; + } + + public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth, GizmoRenderParms parms) + { + return base.GizmoOnGUI(topLeft, maxWidth, parms); + } + + protected override string GetTooltip() + { + + this.tmpDrainGenes.Clear(); + string text = string.Format("{0}: {1} / {2}\n", this.gene.ResourceLabel.CapitalizeFirst().Colorize(ColoredText.TipSectionTitleColor), this.gene.ValueForDisplay, this.gene.MaxForDisplay); + if (this.gene.pawn.IsColonistPlayerControlled || this.gene.pawn.IsPrisonerOfColony) + { + if (this.gene.targetValue <= 0f) + { + text += "NeverConsumeCum"; + } + else + { + text = text + ("ConsumeCumBelow" + ": ") + this.gene.PostProcessValue(this.gene.targetValue); + } + } + if (!this.drainGenes.NullOrEmpty()) + { + float num = 0f; + foreach (IGeneResourceDrain geneResourceDrain in this.drainGenes) + { + if (geneResourceDrain.CanOffset) + { + this.tmpDrainGenes.Add(new Pair(geneResourceDrain, geneResourceDrain.ResourceLossPerDay)); + num += geneResourceDrain.ResourceLossPerDay; + } + } + if (num != 0f) + { + string text2 = (num < 0f) ? "RegenerationRate".Translate() : "DrainRate".Translate(); + text = string.Concat(new string[] + { + text, + "\n\n", + text2, + ": ", + "PerDay".Translate(Mathf.Abs(this.gene.PostProcessValue(num))).Resolve() + }); + foreach (Pair pair in this.tmpDrainGenes) + { + text = string.Concat(new string[] + { + text, + "\n - ", + pair.First.DisplayLabel.CapitalizeFirst(), + ": ", + "PerDay".Translate(this.gene.PostProcessValue(-pair.Second).ToStringWithSign()).Resolve() + }); + } + } + } + if (!this.gene.def.resourceDescription.NullOrEmpty()) + { + text = text + "\n\n" + this.gene.def.resourceDescription.Formatted(this.gene.pawn.Named("PAWN")).Resolve(); + } + return text; + } + private List> tmpDrainGenes = new List>(); + } +} diff --git a/Source/Genes/Life_Force/Gene_LifeForce.cs b/Source/Genes/Life_Force/Gene_LifeForce.cs new file mode 100644 index 0000000..fcc5bcb --- /dev/null +++ b/Source/Genes/Life_Force/Gene_LifeForce.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; +using RimWorld; + + +namespace RJW_Genes +{ + public class Gene_LifeForce : Gene_Resource, IGeneResourceDrain + { + public override void ExposeData() + { + base.ExposeData(); + } + + public bool ShouldConsumeLifeForceNow() + { + return this.Value < this.targetValue; + } + + //Same as Gene_Hemogen + public override IEnumerable GetGizmos() + { + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + IEnumerator enumerator = null; + foreach (Gizmo gizmo2 in GeneResourceDrainUtility.GetResourceDrainGizmos(this)) + { + yield return gizmo2; + } + enumerator = null; + yield break; + yield break; + } + + //Depending on how low the value is it will increase sexdrive and if it reaches zero it will create a random rape mental break. + //Not using base.Tick() as it is used to start mental breaks, but we have another way to do it. + public override void Tick() + { + //base.Tick(); + if (this.CanOffset && this.Resource != null) + { + this.Resource.Value -= this.ResourceLossPerDay / 60000; + if (this.Resource.Value <= 0 && this.pawn.IsHashIntervalTick(300)) + { + if (ModsConfig.BiotechActive && this.def.mentalBreakDef != null && + this.pawn.Spawned && !this.pawn.InMentalState && !this.pawn.Downed && + this.def.mentalBreakDef.Worker.BreakCanOccur(this.pawn)) + { + this.def.mentalBreakDef.Worker.TryStart(this.pawn, "MentalStateReason_Gene".Translate() + ": " + this.LabelCap, false); + } + } + } + //GeneResourceDrainUtility.TickResourceDrain(this); + } + + public Gene_Resource Resource + { + get + { + return this; + } + } + public Pawn Pawn + { + get + { + return this.pawn; + } + } + public bool CanOffset + { + get + { + return this.pawn.Spawned && this.Active; + } + } + + public float ResourceLossPerDay + { + get + { + return this.def.resourceLossPerDay; + } + } + + public string DisplayLabel + { + get + { + return this.def.resourceLabel; + } + } + + public override float InitialResourceMax + { + get + { + return 1f; + } + } + + public override float MinLevelForAlert + { + get + { + return 0.15f; + } + } + public override float MaxLevelOffset + { + get + { + return base.MaxLevelOffset; + } + } + protected override Color BarColor + { + get + { + return Color.grey; + } + } + protected override Color BarHighlightColor + { + get + { + return Color.white; + } + } + } +} diff --git a/Source/Genes/Life_Force/JobGiver_LifeForce_RandomRape.cs b/Source/Genes/Life_Force/JobGiver_LifeForce_RandomRape.cs new file mode 100644 index 0000000..f710c62 --- /dev/null +++ b/Source/Genes/Life_Force/JobGiver_LifeForce_RandomRape.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; +using Verse.AI; +using RimWorld; +using rjw; + +namespace RJW_Genes +{ + public class JobGiver_LifeForce_RandomRape : JobGiver_RandomRape + { + protected override Job TryGiveJob(Pawn pawn) + { + if (!can_rape(pawn, false)) + { + return null; + } + Pawn pawn2 = this.find_victim(pawn, pawn.Map); + if (pawn2 == null) + { + return null; + } + return JobMaker.MakeJob(JobDefOf.rjw_genes_lifeforce_randomrape, pawn2); + } + + //same as xxx.canrape from rjw, but without last requirements. + public static bool can_rape(Pawn pawn, bool forced = false) + { + return RJWSettings.rape_enabled && (xxx.is_mechanoid(pawn) || ((xxx.can_fuck(pawn) || + (!xxx.is_male(pawn) && xxx.get_vulnerability(pawn) < RJWSettings.nonFutaWomenRaping_MaxVulnerability && + xxx.can_be_fucked(pawn))) && (!xxx.is_human(pawn) || ((pawn.ageTracker.Growth >= 1f || pawn.ageTracker.CurLifeStage.reproductive))))); + } + } +} diff --git a/Source/Genes/Life_Force/LifeForceMentalBreakWorker.cs b/Source/Genes/Life_Force/LifeForceMentalBreakWorker.cs new file mode 100644 index 0000000..36b47b0 --- /dev/null +++ b/Source/Genes/Life_Force/LifeForceMentalBreakWorker.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; +using RimWorld; +using Verse.AI; + +namespace RJW_Genes +{ + public class LifeForceMentalBreakWorker : MentalBreakWorker + { + public override bool BreakCanOccur(Pawn pawn) + { + if (pawn.Spawned && base.BreakCanOccur(pawn)) + { + if (!GeneUtility.HasLifeForce(pawn)) + { + return false; + } + Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); + if( gene.Resource.Value <= 0) + { + return true; + } + } + return false; + } + } +} diff --git a/Source/Genes/Life_Force/LifeForceMentalState.cs b/Source/Genes/Life_Force/LifeForceMentalState.cs new file mode 100644 index 0000000..9c22f4e --- /dev/null +++ b/Source/Genes/Life_Force/LifeForceMentalState.cs @@ -0,0 +1,23 @@ +using System; +using Verse; +using Verse.AI; +using rjw; +namespace RJW_Genes +{ + public class LifeForceMentalState : MentalState + { + public override void MentalStateTick() + { + if (this.pawn.IsHashIntervalTick(150) && !GeneUtility.HasCriticalLifeForce(this.pawn)) + { + Pawn_JobTracker jobs = this.pawn.jobs; + if (!(((jobs != null) ? jobs.curDriver : null) is JobDriver_Sex)) + { + base.RecoverFromState(); + return; + } + } + base.MentalStateTick(); + } + } +} \ No newline at end of file diff --git a/Source/Genes/Life_Force/LifeForceMentalStateWorker.cs b/Source/Genes/Life_Force/LifeForceMentalStateWorker.cs new file mode 100644 index 0000000..e9ed20f --- /dev/null +++ b/Source/Genes/Life_Force/LifeForceMentalStateWorker.cs @@ -0,0 +1,15 @@ +using System; +using Verse; +using Verse.AI; +using rjw; +namespace RJW_Genes +{ + // Token: 0x020000FB RID: 251 + public class LifeForceMentalStateWorker : MentalStateWorker + { + public override bool StateCanOccur(Pawn pawn) + { + return base.StateCanOccur(pawn) && (xxx.is_human(pawn) && JobGiver_LifeForce_RandomRape.can_rape(pawn)); + } + } +} diff --git a/Source/Genes/Life_Force/Patch_LifeForce.cs b/Source/Genes/Life_Force/Patch_LifeForce.cs new file mode 100644 index 0000000..3aa953e --- /dev/null +++ b/Source/Genes/Life_Force/Patch_LifeForce.cs @@ -0,0 +1,36 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RimWorld; +using Verse; + +namespace RJW_Genes +{ + + [HarmonyPatch(typeof(SexUtility), nameof(SexUtility.SatisfyPersonal))] + public static class Patch_LifeForce + { + + public static void Postfix(SexProps props) + { + // ShortCuts: Exit Early if Pawn or Partner are null (can happen with Animals or Masturbation) + if (props.pawn == null || !props.hasPartner()) + return; + + if (GeneUtility.HasLifeForce(props.pawn)) + { + if (props.sexType == xxx.rjwSextype.Oral || props.sexType == xxx.rjwSextype.Fellatio || props.sexType == xxx.rjwSextype.Sixtynine) + { + Pawn_GeneTracker genes = props.pawn.genes; + Gene_LifeForce gene = genes.GetFirstGeneOfType(); + gene.Resource.Value += CumUtility.GetTotalFluidAmount(props.partner); //total amount may need to be modified to be balanced + } + } + } + } + +} diff --git a/Source/Interactions/GenesPartKindUsageRule.cs b/Source/Interactions/GenesPartKindUsageRule.cs new file mode 100644 index 0000000..f3f5196 --- /dev/null +++ b/Source/Interactions/GenesPartKindUsageRule.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using rjw; +using rjw.Modules.Interactions.Contexts; +using rjw.Modules.Interactions.Enums; +using rjw.Modules.Interactions.Rules.PartKindUsageRules; +using rjw.Modules.Shared; +using Verse; + +namespace RJW_Genes.Interactions +{ + public class GenesPartKindUsageRule : IPartPreferenceRule + { + public IEnumerable> ModifiersForDominant(InteractionContext context) + { + Pawn pawn = context.Internals.Dominant.Pawn; + if (GeneUtility.HasCriticalLifeForce(pawn)) + { + Log.Message("Critical"); + yield return new Weighted(50f, LewdablePartKind.Mouth); + } + else if (GeneUtility.HasLowLifeForce(pawn)) + { + Log.Message("Low"); + yield return new Weighted(10f, LewdablePartKind.Mouth); + } + else if (GeneUtility.HasLifeForce(pawn)) + { + Log.Message("normal"); + yield return new Weighted(2f, LewdablePartKind.Mouth); + } + yield break; + } + + public IEnumerable> ModifiersForSubmissive(InteractionContext context) + { + Pawn pawn = context.Internals.Submissive.Pawn; + if (GeneUtility.HasCriticalLifeForce(pawn)) + { + Log.Message("Critical"); + yield return new Weighted(50f, LewdablePartKind.Mouth); + } + else if (GeneUtility.HasLowLifeForce(pawn)) + { + Log.Message("Low"); + yield return new Weighted(10f, LewdablePartKind.Mouth); + } + else if (GeneUtility.HasLifeForce(pawn)) + { + Log.Message("normal"); + yield return new Weighted(2f, LewdablePartKind.Mouth); + } + yield break; + } + } +} diff --git a/Source/JobDefOf.cs b/Source/JobDefOf.cs new file mode 100644 index 0000000..fc64b2d --- /dev/null +++ b/Source/JobDefOf.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +namespace RJW_Genes +{ + [DefOf] + public static class JobDefOf + { + public static readonly JobDef rjw_genes_lifeforce_randomrape; + } +} diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index f98d314..3f24101 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -60,7 +60,7 @@ - + @@ -114,12 +114,21 @@ + + + + + + + + +