diff --git a/RJW-Genes-Addons/Common/Assemblies/shabe_genesaddons.dll b/RJW-Genes-Addons/Common/Assemblies/shabe_genesaddons.dll index 964581c..69e7e04 100644 Binary files a/RJW-Genes-Addons/Common/Assemblies/shabe_genesaddons.dll and b/RJW-Genes-Addons/Common/Assemblies/shabe_genesaddons.dll differ diff --git a/RJW-Genes-Addons/Common/Defs/AbilityDefs/Abilities.xml b/RJW-Genes-Addons/Common/Defs/AbilityDefs/Abilities.xml index 4ed7417..098dbdb 100644 --- a/RJW-Genes-Addons/Common/Defs/AbilityDefs/Abilities.xml +++ b/RJW-Genes-Addons/Common/Defs/AbilityDefs/Abilities.xml @@ -11,13 +11,13 @@ Mote_CoagulateStencil Coagulate Coagulate_Cast - CastAbilityOnThingMelee + HealPussy 401 Verb_CastAbilityTouch false -1 - 1 + 0 false false @@ -27,12 +27,23 @@ -
  • - 0.4~0.8 +
  • + 0.4~0.8
  • Manipulation
  • +
  • + +
  • Consensual
  • +
  • Rape
  • + + + +
  • Vagina
  • +
    +
    +
    \ No newline at end of file diff --git a/RJW-Genes-Addons/Common/Defs/JobDefs/Jobs_SexAbility.xml b/RJW-Genes-Addons/Common/Defs/JobDefs/Jobs_SexAbility.xml new file mode 100644 index 0000000..f4237fa --- /dev/null +++ b/RJW-Genes-Addons/Common/Defs/JobDefs/Jobs_SexAbility.xml @@ -0,0 +1,10 @@ + + + + + HealPussy + shabe_genesaddons.JobDriver_CastAbilityAfterSex + Healing someone with sex. + false + + \ No newline at end of file diff --git a/RJW-Genes-Addons/Common/Defs/ThoughtDefs/Thoughts_SexAbility.xml b/RJW-Genes-Addons/Common/Defs/ThoughtDefs/Thoughts_SexAbility.xml new file mode 100644 index 0000000..1a23deb --- /dev/null +++ b/RJW-Genes-Addons/Common/Defs/ThoughtDefs/Thoughts_SexAbility.xml @@ -0,0 +1,17 @@ + + + + + Pussy_Healed + Thought_Memory + 3.0 + 1 + +
  • + + Someone tended to my wound through having sex. + 5 +
  • +
    +
    +
    diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/8b58e365-4726-4f21-97a6-200c84f6481e.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/8b58e365-4726-4f21-97a6-200c84f6481e.vsidx deleted file mode 100644 index 158f319..0000000 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/8b58e365-4726-4f21-97a6-200c84f6481e.vsidx and /dev/null differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/92858c05-006a-4438-8ada-6afbf77808aa.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/92858c05-006a-4438-8ada-6afbf77808aa.vsidx new file mode 100644 index 0000000..b798347 Binary files /dev/null and b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/92858c05-006a-4438-8ada-6afbf77808aa.vsidx differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/98033c9f-5881-4845-ab6a-d2392c3cbaed.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/98033c9f-5881-4845-ab6a-d2392c3cbaed.vsidx deleted file mode 100644 index 4966fd2..0000000 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/98033c9f-5881-4845-ab6a-d2392c3cbaed.vsidx and /dev/null differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/9e9c4d40-16f4-4d3c-89d4-5a71aaca2fbf.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/9e9c4d40-16f4-4d3c-89d4-5a71aaca2fbf.vsidx new file mode 100644 index 0000000..aa0bcb8 Binary files /dev/null and b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/9e9c4d40-16f4-4d3c-89d4-5a71aaca2fbf.vsidx differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b1892b38-2c94-43ac-a9e0-f0ee140ff205.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b1892b38-2c94-43ac-a9e0-f0ee140ff205.vsidx deleted file mode 100644 index e8d1451..0000000 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b1892b38-2c94-43ac-a9e0-f0ee140ff205.vsidx and /dev/null differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b3b4c041-3ae2-4474-91db-480049ec0593.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b3b4c041-3ae2-4474-91db-480049ec0593.vsidx new file mode 100644 index 0000000..7f8cbde Binary files /dev/null and b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/b3b4c041-3ae2-4474-91db-480049ec0593.vsidx differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/ee1538e4-c06f-427e-865e-f7d0037ff5cd.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/ee1538e4-c06f-427e-865e-f7d0037ff5cd.vsidx deleted file mode 100644 index e8d1451..0000000 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/ee1538e4-c06f-427e-865e-f7d0037ff5cd.vsidx and /dev/null differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/f72ccb1e-9ebc-4773-be56-d50266e760a4.vsidx b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/f72ccb1e-9ebc-4773-be56-d50266e760a4.vsidx new file mode 100644 index 0000000..ef2e39f Binary files /dev/null and b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/FileContentIndex/f72ccb1e-9ebc-4773-be56-d50266e760a4.vsidx differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/v17/.suo b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/v17/.suo index 422fcf6..b06f292 100644 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/v17/.suo and b/RJW-Genes-Addons/Source/shabe_genesaddons/.vs/shabe_genesaddons/v17/.suo differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbilityEffect_PussyHeal.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbilityEffect_PussyHeal.cs index 959a871..a0e47e0 100644 --- a/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbilityEffect_PussyHeal.cs +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbilityEffect_PussyHeal.cs @@ -7,6 +7,7 @@ using Verse; using UnityEngine; using RimWorld; using rjw; +using rjw.Modules.Interactions.Helpers; namespace shabe_genesaddons { @@ -41,7 +42,24 @@ namespace shabe_genesaddons { MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "NumWoundsTended".Translate(num), 3.65f); } - FleckMaker.AttachedOverlay(pawn, FleckDefOf.FlashHollow, Vector3.zero, 1.5f, -1f); + this.AfterSex(this.parent.pawn, pawn); + //FleckMaker.AttachedOverlay(pawn, FleckDefOf.FlashHollow, Vector3.zero, 1.5f, -1f); + } + + public void AfterSex(Pawn pawn, Pawn target) + { + List hediffs = target.health.hediffSet.hediffs; + for (int i = 0; i < hediffs.Count; i++) + { + if ((hediffs[i] is Hediff_Injury || hediffs[i] is Hediff_MissingPart) && hediffs[i].TendableNow(false)) + { + target.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.Pussy_Healed, pawn, null); + break; + } + } + //InteractionHelper.GetWithExtension(dictionaryKey).DominantHasTag("CanBePenetrated") + + } public override bool Valid(LocalTargetInfo target, bool throwMessages = false) @@ -49,6 +67,8 @@ namespace shabe_genesaddons Pawn pawn = target.Pawn; if (pawn != null) { + + //to be replaced with severel checks to make it clear why target is unable to have sex if (!CasualSex_Helper.CanHaveSex(pawn)) { @@ -58,6 +78,15 @@ namespace shabe_genesaddons } return false; } + Pawn parent = this.parent.pawn; + if (parent == null || !Genital_Helper.has_vagina(parent)) + { + if (throwMessages && parent != null) + { + Messages.Message(parent.Name + " has no vagina to use", pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } AbilityUtility.ValidateHasTendableWound(pawn, throwMessages, this.parent); } diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbility_SexInteractionRequirements.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbility_SexInteractionRequirements.cs new file mode 100644 index 0000000..12b578c --- /dev/null +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/CompAbility_SexInteractionRequirements.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +namespace shabe_genesaddons +{ + public class CompAbility_SexInteractionRequirements : AbilityComp + { + public CompProperties_SexInteractionRequirements Props + { + get + { + return (CompProperties_SexInteractionRequirements)this.props; + } + } + } +} diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/CompProperties_SexInteractionRequirements.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/CompProperties_SexInteractionRequirements.cs new file mode 100644 index 0000000..0760d5c --- /dev/null +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/CompProperties_SexInteractionRequirements.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +using rjw; +using rjw.Modules.Interactions.Defs.DefFragment; +using rjw.Modules.Interactions.Enums; +namespace shabe_genesaddons +{ + public class CompProperties_SexInteractionRequirements : AbilityCompProperties + { + public CompProperties_SexInteractionRequirements() + { + this.compClass = typeof(CompAbility_SexInteractionRequirements); + } + + public List tags = new List(); + public InteractionRequirement dominantRequirement; + public InteractionRequirement submissiveRequirement; + } +} diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/JobDriver_CastAbilityAfterSex.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/JobDriver_CastAbilityAfterSex.cs new file mode 100644 index 0000000..2382ef5 --- /dev/null +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/JobDriver_CastAbilityAfterSex.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RimWorld; +using Verse; +using Verse.AI; +using rjw; + +namespace shabe_genesaddons +{ + public class JobDriver_CastAbilityAfterSex : JobDriver_SexBaseInitiator + { + protected override IEnumerable MakeNewToils() + { + base.setup_ticks(); + //this.FailOnDespawnedOrNull(TargetIndex.A); + //this.FailOnCannotTouch(TargetIndex.B, PathEndMode.OnCell); + this.FailOnDespawnedNullOrForbidden(this.iTarget); + //this.FailOn(() => !target.health.capacities.CanBeAwake); + JobDef PartnerJob = xxx.gettin_raped; + yield return Toils_Goto.Goto(TargetIndex.A, PathEndMode.OnCell); + yield return new Toil + { + defaultCompleteMode = ToilCompleteMode.Instant, + socialMode = RandomSocialMode.Off, + initAction = delegate () + { + Job newJob = JobMaker.MakeJob(PartnerJob, this.pawn, this.Partner); + this.Partner.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true); + } + }; + 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; + foreach (AbilityComp comp in this.job.ability.comps) + { + if (comp.props is CompProperties_SexInteractionRequirements) + { + CompProperties_SexInteractionRequirements sexpropsreq = comp.props as CompProperties_SexInteractionRequirements; + this.Sexprops = SexInteractionUtility.GenerateSexProps(this.pawn, this.Partner, sexpropsreq); + } + } + this.Start(); + this.Sexprops.usedCondom = (CondomUtility.TryUseCondom(this.pawn) || CondomUtility.TryUseCondom(this.Partner)); + }; + toil.AddPreTickAction(delegate + { + if (this.pawn.IsHashIntervalTick(this.ticks_between_hearts)) + { + this.ThrowMetaIconF(this.pawn.Position, this.pawn.Map, FleckDefOf.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(); + }); + yield return toil; + yield return new Toil + { + initAction = delegate () + { + SexUtility.ProcessSex(this.Sexprops); + }, + defaultCompleteMode = ToilCompleteMode.Instant + }; + yield return Toils_Combat.CastVerb(TargetIndex.A, TargetIndex.B, false); + yield break; + } + } +} diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/SexInteractionUtility.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/SexInteractionUtility.cs new file mode 100644 index 0000000..2654470 --- /dev/null +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/SexInteractionUtility.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +using rjw; +using rjw.Modules.Interactions.Objects; +using rjw.Modules.Interactions.Helpers; +using rjw.Modules.Interactions.Enums; +using rjw.Modules.Interactions.Implementation; +using rjw.Modules.Interactions.Defs.DefFragment; +//using rjw.Modules.Interactions.Enums; + +namespace shabe_genesaddons +{ + class SexInteractionUtility + { + public static List GenerateDomVaginaInteractionDefList(Pawn pawn, Pawn pawn2) + { + List list2 = new List(); + foreach (InteractionDef interactionDef in SexUtility.SexInterractions) + { + InteractionWithExtension withExtension = InteractionHelper.GetWithExtension(interactionDef); + if((withExtension.DominantHasTag(GenitalTag.CanBePenetrated) || withExtension.DominantHasFamily(GenitalFamily.Vagina)) + && LewdInteractionValidatorService.Instance.IsValid(interactionDef, pawn, pawn2)) + { + //Log.Message(interactionDef.ToString()); + list2.Add(interactionDef); + } + } + return list2; + } + + public static List GenerateInteractionDefList(Pawn pawn, Pawn pawn2, CompProperties_SexInteractionRequirements sexpropsreq) + { + List tags = sexpropsreq.tags; + InteractionRequirement dominantRequirement = sexpropsreq.dominantRequirement; + InteractionRequirement submissiveRequirement = sexpropsreq.submissiveRequirement; + List sexinteractions = SexUtility.SexInterractions; + List list = new List(); + //List a = from interaction in sexinteractions + //where InteractionHelper.GetWithExtension(interaction).DominantHasFamily(dominantRequirement.families.) + // select interaction; + foreach (InteractionDef interactionDef in SexUtility.SexInterractions) + { + if (!LewdInteractionValidatorService.Instance.IsValid(interactionDef, pawn, pawn2)) + { + continue; + } + InteractionWithExtension withExtension = InteractionHelper.GetWithExtension(interactionDef); + bool add_interaction = false; + foreach (InteractionTag tag in tags) + { + if (withExtension.HasInteractionTag(tag)) + { + add_interaction = true; + } + } + if (!add_interaction) + { + continue; + } + if (dominantRequirement != null) + { + foreach (GenitalFamily genitalFamily in dominantRequirement.families) + { + if (!withExtension.DominantHasFamily(genitalFamily)) + { + add_interaction = false; + + } + } + if (!add_interaction) + { + continue; + } + foreach (GenitalTag tag in dominantRequirement.tags) + { + if (!withExtension.DominantHasTag(tag)) + { + add_interaction = false; + + } + } + } + if (submissiveRequirement != null) + { + foreach (GenitalFamily genitalFamily in submissiveRequirement.families) + { + if (!withExtension.SubmissiveHasFamily(genitalFamily)) + { + add_interaction = false; + + } + } + if (!add_interaction) + { + continue; + } + foreach (GenitalTag tag in submissiveRequirement.tags) + { + if (!withExtension.SubmissiveHasTag(tag)) + { + add_interaction = false; + + } + + } + } + if (add_interaction) + { + list.Add(interactionDef); + } + + } + return list; + } + + public static SexProps GenerateSexProps(Pawn pawn, Pawn pawn2, CompProperties_SexInteractionRequirements sexpropsreq) + { + List interactionlist = GenerateInteractionDefList(pawn, pawn2, sexpropsreq); + if (interactionlist == null) + { + return null; + } + //foreach(InteractionDef interaction in interactionlist) + //{ + // Log.Message(interaction.ToString()); + //} + InteractionDef dictionaryKey = interactionlist.RandomElement(); + bool rape = InteractionHelper.GetWithExtension(dictionaryKey).HasInteractionTag(InteractionTag.Rape); + SexProps sexProps = new SexProps(); + sexProps.pawn = pawn; + sexProps.partner = pawn2; + sexProps.sexType = SexUtility.rjwSextypeGet(dictionaryKey); + sexProps.isRape = rape; + sexProps.isRapist = rape; + sexProps.canBeGuilty = false; + sexProps.dictionaryKey = dictionaryKey; + sexProps.rulePack = SexUtility.SexRulePackGet(dictionaryKey); + return sexProps; + } + + public static SexProps GenerateSexpropsDomVagina(Pawn pawn, Pawn pawn2) + { + List interactionlist = GenerateDomVaginaInteractionDefList(pawn, pawn2); + if (interactionlist == null) + { + return null; + } + InteractionDef dictionaryKey = interactionlist.RandomElement(); + bool rape = InteractionHelper.GetWithExtension(dictionaryKey).HasInteractionTag(InteractionTag.Rape); + SexProps sexProps = new SexProps(); + sexProps.pawn = pawn; + sexProps.partner = pawn2; + sexProps.sexType = SexUtility.rjwSextypeGet(dictionaryKey); + sexProps.isRape = rape; + sexProps.isRapist = rape; + sexProps.canBeGuilty = false; + sexProps.dictionaryKey = dictionaryKey; + sexProps.rulePack = SexUtility.SexRulePackGet(dictionaryKey); + return sexProps; + } + } +} diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/ThoughtDefOf.cs b/RJW-Genes-Addons/Source/shabe_genesaddons/ThoughtDefOf.cs new file mode 100644 index 0000000..f3d584b --- /dev/null +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/ThoughtDefOf.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 shabe_genesaddons +{ + [DefOf] + public static class ThoughtDefOf + { + public static readonly ThoughtDef Pussy_Healed; + } +} diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.csproj.CoreCompileInputs.cache b/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.csproj.CoreCompileInputs.cache index b6a2e64..18f06e7 100644 --- a/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.csproj.CoreCompileInputs.cache +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -5a8b4a39089fb64409d7431a53405d599f8307c0 +6ecf46e37be50c69fa3cb87cd34ade9851fe6e74 diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.dll b/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.dll index 964581c..69e7e04 100644 Binary files a/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.dll and b/RJW-Genes-Addons/Source/shabe_genesaddons/obj/Debug/shabe_genesaddons.dll differ diff --git a/RJW-Genes-Addons/Source/shabe_genesaddons/shabe_genesaddons.csproj b/RJW-Genes-Addons/Source/shabe_genesaddons/shabe_genesaddons.csproj index 7ace0e7..40ea6f5 100644 --- a/RJW-Genes-Addons/Source/shabe_genesaddons/shabe_genesaddons.csproj +++ b/RJW-Genes-Addons/Source/shabe_genesaddons/shabe_genesaddons.csproj @@ -58,14 +58,19 @@ + + + + + \ No newline at end of file