Made some changes to healpussy and made a sexfrenzy gene

This commit is contained in:
Shabakur 2022-11-23 20:00:53 +01:00
parent 8a988f48a5
commit 1483959f92
28 changed files with 404 additions and 88 deletions

View File

@ -1,2 +1,10 @@
# RJW_Genes_Addons
Some code which can be copied into RJW genes if they want to, however a few names may need to be changed for it to work. Names, labels, descriptions and icons are just placeholders.
# RJW_More_Genes
Adds some more genes related to RJW to the game.
Current Genes
- PussyHeal
- Sexfrenzy
Any suggestions and ideas are welcome.

View File

@ -1,11 +1,11 @@
<ModMetaData>
<name>RJW Genes Addons</name>
<name>RJW More Genes</name>
<author>Shaba</author>
<packageId>Shaba.rjw.genes.addons</packageId>
<packageId>Shaba.rjw.more.genes</packageId>
<supportedVersions>
<li>1.4</li>
</supportedVersions>
<description>Adds additional contentfor RJW Genes</description>
<description>Adds additional more genes connected to RJW to the game</description>
<modDependencies>
<li>
<packageId>ludeon.rimworld.biotech</packageId>
@ -22,14 +22,6 @@
<steamWorkshopUrl>steam://url/CommunityFilePage/2009463077</steamWorkshopUrl>
<downloadUrl>https://github.com/pardeike/HarmonyRimWorld/releases/latest</downloadUrl>
</li>
<!--
<li>
<packageId>UnlimitedHugs.HugsLib</packageId>
<displayName>HugsLib</displayName>
<downloadUrl>https://github.com/UnlimitedHugs/RimworldHugsLib/releases/latest</downloadUrl>
<steamWorkshopUrl>steam://url/CommunityFilePage/818773962</steamWorkshopUrl>
</li>
-->
</modDependencies>
<loadAfter>
<li>rim.job.world</li>

View File

@ -3,8 +3,8 @@
<AbilityDef ParentName="AbilityTouchBase">
<defName>PussyHeal</defName>
<label>SexHeal</label>
<description>Use special vagina to quickly tend someone's wounds.</description>
<iconPath>UI/Icons/Genes/Gene_Coagulate</iconPath>
<description>Rape another pawn, so you can heal them with your vagina's special healing power.</description>
<iconPath>Things/Mote/Heart</iconPath>
<stunTargetWhileCasting>false</stunTargetWhileCasting>
<displayGizmoWhileUndrafted>true</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
@ -20,7 +20,7 @@
<range>-1</range>
<warmupTime>0</warmupTime>
<targetParams>
<canTargetAnimals>false</canTargetAnimals>
<canTargetAnimals>true</canTargetAnimals>
<canTargetSelf>false</canTargetSelf>
<canTargetBuildings>false</canTargetBuildings>
<canTargetMechs>false</canTargetMechs>
@ -30,9 +30,6 @@
<comps>
<li Class="RJW_More_Genes.CompProperties_AbilityPussyHeal"> <!-- namespace needs to be changed when copied to another mod-->
<tendQualityRange>0.4~0.8</tendQualityRange>
</li>
<li Class="CompProperties_AbilityRequiresCapacity">
<capacity>Manipulation</capacity>
</li>
<li Class="RJW_More_Genes.CompProperties_SexInteractionRequirements">
<tags>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<AbilityDef>
<defName>SexFrenzy</defName>
<label>SexFrenzy</label>
<description>Causes nearby pawns to go into a sex frenzy, trying to rape anyone if they can.</description>
<iconPath>Things/Mote/Heart</iconPath>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
<disableGizmoWhileUndrafted>false</disableGizmoWhileUndrafted>
<cooldownTicksRange>180000</cooldownTicksRange>
<warmupStartSound>Coagulate_Cast</warmupStartSound>
<displayOrder>402</displayOrder>
<verbProperties>
<verbClass>Verb_CastAbility</verbClass>
<warmupTime>1</warmupTime>
<range>7.9</range>
<targetParams>
<canTargetSelf>True</canTargetSelf>
<canTargetAnimals>True</canTargetAnimals>
<canTargetLocations>True</canTargetLocations>
</targetParams>
</verbProperties>
<comps>
<li Class="RJW_More_Genes.CompProperties_AbilitySexFrenzy"> <!-- namespace needs to be changed when copied to another mod-->
<radius>4.9</radius>
</li>
</comps>
</AbilityDef>
</Defs>

View File

@ -4,8 +4,8 @@
<defName>rjw_genes_pussyhealer</defName>
<label>Pussy Healer</label>
<labelShortAdj>pussyhealer</labelShortAdj>
<description>Carriers of this gene are able use vaginal sex to tend to others wounds.</description>
<iconPath>UI/Icons/Genes/Gene_Coagulate</iconPath>
<description>Carriers of this gene are able use vaginal sex to tend to other's wounds.</description>
<iconPath>Things/Mote/Heart</iconPath>
<displayCategory>Ability</displayCategory>
<abilities>
<li>PussyHeal</li>
@ -14,7 +14,31 @@
<AbilityDef>PussyHeal</AbilityDef>
</descriptionHyperlinks>
<biostatMet>-1</biostatMet>
<minAgeActive>3</minAgeActive>
<minAgeActive>13</minAgeActive>
<symbolPack>
<suffixSymbols>
<li><symbol>life</symbol></li>
<li><symbol>clotter</symbol></li>
<li><symbol>tender</symbol></li>
</suffixSymbols>
</symbolPack>
</GeneDef>
<GeneDef>
<defName>rjw_genes_sexfrenzy</defName>
<label>Sex Frenzy</label>
<labelShortAdj>sexfrenzy</labelShortAdj>
<description>Carriers of this gene are able to induce a sexfrenzy nearby.</description>
<iconPath>Things/Mote/Heart</iconPath>
<displayCategory>Ability</displayCategory>
<abilities>
<li>SexFrenzy</li>
</abilities>
<descriptionHyperlinks>
<AbilityDef>SexFrenzy</AbilityDef>
</descriptionHyperlinks>
<biostatMet>-2</biostatMet>
<minAgeActive>13</minAgeActive>
<symbolPack>
<suffixSymbols>
<li><symbol>life</symbol></li>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<HediffDef>
<defName>SexFrenzy</defName>
<label>SexFrenzied</label>
<labelNoun>sexfrenzied</labelNoun>
<description>A pawn under the influence of sex frenzy.</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.5, 0.5, 0.9)</defaultLabelColor>
<makesSickThought>false</makesSickThought>
<isBad>false</isBad>
<tendable>false</tendable>
<initialSeverity>1.0</initialSeverity>
<minSeverity>1.0</minSeverity>
<maxSeverity>1.0</maxSeverity>
<scenarioCanAdd>false</scenarioCanAdd>
<comps>
<li Class="HediffCompProperties_Disappears">
<disappearsAfterTicks>
<!--1 hour-->
<min>250</min>
<!--2 hours-->
<max>500</max>
</disappearsAfterTicks>
</li>
</comps>
<stages>
<li>
<becomeVisible>true</becomeVisible>
</li>
</stages>
</HediffDef>
</Defs>

View File

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using rjw;
using rjw.Modules.Interactions.Helpers;
using rjw.Modules.Interactions.Enums;
namespace RJW_More_Genes
{
public class AbilityUtility
{
public static void PussyHeal(SexProps props)
{
if (InteractionHelper.GetWithExtension(props.dictionaryKey).DominantHasFamily(GenitalFamily.Vagina) || InteractionHelper.GetWithExtension(props.dictionaryKey).SubmissiveHasFamily(GenitalFamily.Vagina))
{
Pawn pawn = props.pawn;
Pawn partner = props.partner;
FloatRange tendQualityRange;
tendQualityRange.min = 0.4f;
tendQualityRange.max = 0.8f;
if (GeneUtility.isPussyHealer(pawn))
{
Heal(partner, tendQualityRange);
}
if (GeneUtility.isPussyHealer(partner))
{
Heal(pawn, tendQualityRange);
}
}
}
public static bool Heal(Pawn pawn, FloatRange tendQualityRange)
{
bool any_wound_tended = false;
List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
for (int i = hediffs.Count - 1; i >= 0; i--)
{
if ((hediffs[i] is Hediff_Injury || hediffs[i] is Hediff_MissingPart) && hediffs[i].TendableNow(false))
{
hediffs[i].Tended(tendQualityRange.RandomInRange, tendQualityRange.TrueMax, 1);
any_wound_tended = true;
}
}
return any_wound_tended;
}
}
}

View File

@ -28,21 +28,13 @@ namespace RJW_More_Genes
{
return;
}
int num = 0;
List<Hediff> hediffs = pawn.health.hediffSet.hediffs;
for (int i = hediffs.Count - 1; i >= 0; i--)
bool any_wound_tended = AbilityUtility.Heal(pawn, this.Props.tendQualityRange);
if (any_wound_tended)
{
if ((hediffs[i] is Hediff_Injury || hediffs[i] is Hediff_MissingPart) && hediffs[i].TendableNow(false))
{
hediffs[i].Tended(this.Props.tendQualityRange.RandomInRange, this.Props.tendQualityRange.TrueMax, 1);
num++;
}
MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "Sex Healed Wounds", 3.65f);
pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.Pussy_Healed, pawn, null);
}
if (num > 0)
{
MoteMaker.ThrowText(pawn.DrawPos, pawn.Map, "NumWoundsTended".Translate(num), 3.65f);
}
this.AfterSex(this.parent.pawn, pawn);
//this.AfterSex(any_wound_tended);
//FleckMaker.AttachedOverlay(pawn, FleckDefOf.FlashHollow, Vector3.zero, 1.5f, -1f);
}
@ -67,8 +59,6 @@ namespace RJW_More_Genes
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))
{
@ -78,19 +68,36 @@ namespace RJW_More_Genes
}
return false;
}
Pawn parent = this.parent.pawn;
if (parent == null || !Genital_Helper.has_vagina(parent))
{
if (throwMessages && parent != null)
else if (pawn.IsAnimal() && !RJWSettings.bestiality_enabled)
{
if (throwMessages)
{
Messages.Message(parent.Name + " has no vagina to use", pawn, MessageTypeDefOf.RejectInput, false);
Messages.Message("bestiality is disabled", pawn, MessageTypeDefOf.RejectInput, false);
}
return false;
}
AbilityUtility.ValidateHasTendableWound(pawn, throwMessages, this.parent);
//AbilityUtility.ValidateHasTendableWound(pawn, throwMessages, this.parent);
}
return base.Valid(target, throwMessages);
}
public override bool GizmoDisabled(out string reason)
{
reason = null;
if (!Genital_Helper.has_vagina(this.parent.pawn))
{
reason = this.parent.pawn.Name + " has no vagina to use.";
return true;
}
else if (!RJWSettings.rape_enabled)
{
reason = "Rape is disabled";
return true;
}
return false;
}
}
}

View File

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using UnityEngine;
using RimWorld;
using rjw;
using Verse.AI;
using rjw.Modules.Interactions.Helpers;
namespace RJW_More_Genes
{
public class CompAbilityEffect_SexFrenzy : CompAbilityEffect
{
private new CompProperties_AbilitySexFrenzy Props
{
get
{
return (CompProperties_AbilitySexFrenzy)this.props;
}
}
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
foreach (Pawn pawn in AffectedPawns(target, this.parent.pawn.Map))
{
if (pawn != null)
{
Need_Sex needsex = pawn.needs.TryGetNeed<Need_Sex>();
needsex.CurLevel = 0f;
pawn.health.AddHediff(HediffDefOf.SexFrenzy);
}
}
foreach (Pawn pawn in AffectedPawns(target,this.parent.pawn.Map))
{
if(pawn == null || !xxx.can_rape(pawn, false)|| pawn.jobs.curJob.def.defName == "GettinRaped" || pawn.jobs.curJob.def.defName == "SexFrenzy")
{
continue;
}
Pawn pawn2 = FindVictim(pawn);
if (pawn2 == null)
{
continue;
}
pawn.pather.StopDead();
pawn.jobs.StopAll();
//pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.RandomRape, null, true, false, null, false, false, false);
Job newJob = JobMaker.MakeJob(xxx.RapeRandom, pawn2);
pawn.jobs.StartJob(newJob, JobCondition.InterruptForced, null, false, true, null, null, false, false, null, false, true);
}
Log.Message("test");
}
public override bool GizmoDisabled(out string reason)
{
reason = null;
if (!RJWSettings.rape_enabled)
{
reason = "Rape is disabled";
return true;
}
return false;
}
private IEnumerable<Pawn> AffectedPawns(LocalTargetInfo target, Map map)
{
foreach (Pawn pawn in map.mapPawns.AllPawns)
{
if (target.Cell.DistanceTo(pawn.Position) < this.Props.radius)
{
yield return pawn;
}
}
IEnumerator<Pawn> enumerator = null;
yield break;
yield break;
}
public override void DrawEffectPreview(LocalTargetInfo target)
{
GenDraw.DrawRadiusRing(target.Cell, this.Props.radius);
}
public Pawn FindVictim(Pawn pawn)
{
Map m = pawn.Map;
IEnumerable<Pawn> source = from x in m.mapPawns.AllPawnsSpawned
where x != pawn && xxx.is_not_dying(x) && (xxx.can_get_raped(x) || (xxx.can_be_fucked(x) && x.health.hediffSet.HasHediff(HediffDefOf.SexFrenzy))) &&
!x.Suspended && !x.IsForbidden(pawn) && x.jobs.curJob.def.defName != "GettinRaped" && x.jobs.curJob.def.defName != "RandomRape" &&
IntVec3Utility.DistanceTo(pawn.Position, x.Position) < 15 && pawn.CanReserveAndReach(x, PathEndMode.Touch, Danger.Deadly, 1, 0, null, false)
select x;
if (source != null)
{
return source.RandomElement();
}
else
{
return null;
}
}
}
}

View File

@ -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 RJW_More_Genes
{
public class CompProperties_AbilitySexFrenzy : CompProperties_AbilityEffect
{
public CompProperties_AbilitySexFrenzy()
{
this.compClass = typeof(CompAbilityEffect_SexFrenzy);
}
public float radius;
}
}

View File

@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_More_Genes
{
public class GeneUtility
@ -17,5 +18,7 @@ namespace RJW_More_Genes
}
return pawn.genes.HasGene(GeneDefOf.rjw_genes_pussyhealer);
}
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RimWorld;
using Verse;
namespace RJW_More_Genes
{
[DefOf]
public static class HediffDefOf
{
public static readonly HediffDef SexFrenzy;
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_More_Genes
{
public static class MentalStateDefOf
{
public static readonly MentalStateDef RandomRape;
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using rjw;
namespace RJW_More_Genes
{
[HarmonyPatch(typeof(SexUtility), "ProcessSex")]
class PatchProcessSex
{
[HarmonyPostfix]
public static void ProcessSexGenes(SexProps props)
{
AbilityUtility.PussyHeal(props);
}
}
}

View File

@ -57,13 +57,19 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AbilityUtility.cs" />
<Compile Include="CompAbilityEffect_SexFrenzy.cs" />
<Compile Include="CompAbilityEffect_PussyHeal.cs" />
<Compile Include="CompAbility_SexInteractionRequirements.cs" />
<Compile Include="CompProperties_SexFrenzy.cs" />
<Compile Include="CompProperties_AbilityPussyHeal.cs" />
<Compile Include="CompProperties_SexInteractionRequirements.cs" />
<Compile Include="GeneDefOf.cs" />
<Compile Include="HarmonyInit.cs" />
<Compile Include="HediffDefOf.cs" />
<Compile Include="JobDriver_CastAbilityAfterSex.cs" />
<Compile Include="MentalStateDefOf.cs" />
<Compile Include="PatchProcessSex.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="GeneUtility.cs" />
<Compile Include="SexInteractionUtility.cs" />

View File

@ -17,25 +17,19 @@ namespace RJW_More_Genes
{
class SexInteractionUtility
{
public static List<InteractionDef> GenerateDomVaginaInteractionDefList(Pawn pawn, Pawn pawn2)
{
List<InteractionDef> list2 = new List<InteractionDef>();
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<InteractionDef> GenerateInteractionDefList(Pawn pawn, Pawn pawn2, CompProperties_SexInteractionRequirements sexpropsreq)
{
List<InteractionTag> tags = sexpropsreq.tags;
List<InteractionTag> tags = new List<InteractionTag>();
if (pawn2.IsAnimal())
{
tags.Add(InteractionTag.Animal);
}
else
{
tags = sexpropsreq.tags;
}
InteractionRequirement dominantRequirement = sexpropsreq.dominantRequirement;
InteractionRequirement submissiveRequirement = sexpropsreq.submissiveRequirement;
List<InteractionDef> sexinteractions = SexUtility.SexInterractions;
@ -121,35 +115,10 @@ namespace RJW_More_Genes
public static SexProps GenerateSexProps(Pawn pawn, Pawn pawn2, CompProperties_SexInteractionRequirements sexpropsreq)
{
List<InteractionDef> interactionlist = GenerateInteractionDefList(pawn, pawn2, sexpropsreq);
if (interactionlist == null)
if (!interactionlist.Any())
{
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<InteractionDef> 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();

View File

@ -1 +1 @@
4d7ff98164d1cf091715f5b60c92ca5ce544b757
1d1d2f5a3658f55aaa88d8cc24b3d4d7c5755ab0

18
TODOS.txt Normal file
View File

@ -0,0 +1,18 @@
Healpussy
- Mood effect depends on relationship between pawns.
- Add sex interaction to have a female, female animal vaginal interaction, animal scissoring?
-
Sex frenzy gene
- Add Special Mind break, Run around colony and cause other pawns to go into random rape.
Aphrodisiac gene
- Increases sexdrive of pawns around pawn
Cumabsorber gene
- Gain benefits after cum enters any orfice, rest? combat?
Vigorous gene
- Gain rest after sex

View File

@ -1,4 +1,10 @@
V1.0 Made Changelog, currently have insectincubator and mechbreeder genes
V1.0.1 Fixed some null errors in geneutility
V1.0.2 Added insectbreeder gene
V1.0.3 Added Healpussy Gene
V1.0.3 Added Healpussy Gene
V1.0.4 Changed Name and Removed Genes which were copied to rjw_genes
V1.0.5
- Allowed Healpussy to work on animals
V1.0.6
- Allowed Healpussy to work passively
- Added checks for RJWsettings and if the pawn has a vagina.