mirror of
https://github.com/vegapnk/RJW-Genes.git
synced 2024-08-15 00:23:31 +00:00
Succubus xenotype & pawnkind, sex preferencees & start incident
Made xenotype and pawnkind, modified part preferences
This commit is contained in:
parent
09157e923d
commit
4a4b436270
13 changed files with 234 additions and 54 deletions
Binary file not shown.
|
@ -30,7 +30,7 @@
|
|||
<li Class="RJW_Genes.CompProperties_AbilityLifeForceCost">
|
||||
<fertilinCost>0.2</fertilinCost>
|
||||
</li>
|
||||
<li Class="RJW_Genes.CompProperties_AbilityPussyHeal"> <!-- namespace needs to be changed when copied to another mod-->
|
||||
<li Class="RJW_Genes.CompProperties_AbilityPussyHeal">
|
||||
<tendQualityRange>0.4~0.8</tendQualityRange>
|
||||
</li>
|
||||
<li Class="RJW_Genes.CompProperties_SexInteractionRequirements">
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
</GeneDef>
|
||||
|
||||
<GeneDef>
|
||||
<defName>LifeForceDrain</defName>
|
||||
<defName>rjw_genes_lifeforcedrain</defName>
|
||||
<label>fertilin drain</label>
|
||||
<labelShortAdj>draining</labelShortAdj>
|
||||
<description>Carriers lose an additional 15 fertilin per day from biological entropy.</description>
|
||||
|
@ -50,7 +50,7 @@
|
|||
</GeneDef>
|
||||
|
||||
<GeneDef>
|
||||
<defName>rjw_genes_pussyhealer</defName>
|
||||
<defName>rjw_genes_pussyhealing</defName>
|
||||
<label>Pussy Healer</label>
|
||||
<labelShortAdj>pussyhealer</labelShortAdj>
|
||||
<description>Carriers of this gene are able use vaginal sex to tend to other's wounds.</description>
|
||||
|
|
30
Common/Defs/Genes/XenotypeDefs.xml
Normal file
30
Common/Defs/Genes/XenotypeDefs.xml
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<XenotypeDef>
|
||||
<defName>Succubus</defName>
|
||||
<label>succubus</label>
|
||||
<description>A succubus, an ancient race created long ago to fullfill sexual fantasies of humankind. (better description required) \n\nSuccubi require fertilin to survive, which is commonly derived from cum.</description> <iconPath>UI/Icons/Xenotypes/Baseliner</iconPath>
|
||||
<inheritable>true</inheritable>
|
||||
<displayPriority>1000</displayPriority>
|
||||
<factionlessGenerationWeight>0</factionlessGenerationWeight>
|
||||
<genes>
|
||||
<li>rjw_genes_female_only</li>
|
||||
<li>Beauty_Beautiful</li>
|
||||
<li>rjw_genes_succubus_tail</li>
|
||||
<li>rjw_genes_Succubus_Wings</li>
|
||||
<li>rjw_genes_aphrodisiac_pheromones</li>
|
||||
<li>rjw_genes_orgasm_rush</li>
|
||||
<li>rjw_genes_hypersexual</li>
|
||||
<li>rjw_genes_lifeforce</li>
|
||||
<li>rjw_genes_lifeforcedrain</li>
|
||||
<li>rjw_genes_pussyhealer</li>
|
||||
<li>rjw_genes_cockeater</li>
|
||||
<li>rjw_genes_paralysingkiss</li>
|
||||
<li>rjw_genes_seduce</li>
|
||||
<li>rjw_genes_vaginal_absorber</li>
|
||||
<li>rjw_genes_anal_absorber</li>
|
||||
<li>rjw_genes_drainer</li>
|
||||
</genes>
|
||||
</XenotypeDef>
|
||||
</Defs>
|
16
Common/Defs/IncidentsDefs/Incidents_Succubus.xml
Normal file
16
Common/Defs/IncidentsDefs/Incidents_Succubus.xml
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<Defs>
|
||||
<IncidentDef>
|
||||
<defName>SuccubusDreamVisit</defName>
|
||||
<label>dirty dreams</label>
|
||||
<category>Misc</category>
|
||||
<targetTags>
|
||||
<li>Map_PlayerHome</li>
|
||||
</targetTags>
|
||||
<workerClass>RJW_Genes.IncidentWorker_SuccubusDreamVisit</workerClass>
|
||||
<baseChance>1.0</baseChance>
|
||||
<minRefireDays>10</minRefireDays>
|
||||
<pointsScaleable>false</pointsScaleable>
|
||||
</IncidentDef>
|
||||
</Defs>
|
45
Common/Defs/PawnKindDefs/PawnKind_Succubus.xml
Normal file
45
Common/Defs/PawnKindDefs/PawnKind_Succubus.xml
Normal file
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<Defs>
|
||||
<PawnKindDef>
|
||||
<defName>Succubus</defName>
|
||||
<label>succubus</label>
|
||||
<combatPower>50</combatPower>
|
||||
<race>Human</race>
|
||||
<xenotypeSet>
|
||||
<xenotypeChances>
|
||||
<Succubus>999</Succubus>
|
||||
</xenotypeChances>
|
||||
</xenotypeSet>
|
||||
<acceptArrestChanceFactor>0.5</acceptArrestChanceFactor>
|
||||
<useFactionXenotypes>false</useFactionXenotypes>
|
||||
<minGenerationAge>18</minGenerationAge>
|
||||
<maxGenerationAge>27</maxGenerationAge>
|
||||
<itemQuality>Poor</itemQuality>
|
||||
<backstoryCryptosleepCommonality>0.0</backstoryCryptosleepCommonality>
|
||||
<isFighter>false</isFighter>
|
||||
<gearHealthRange>
|
||||
<min>0.3</min>
|
||||
<max>0.9</max>
|
||||
</gearHealthRange>
|
||||
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
|
||||
<apparelTags>
|
||||
<li>Tribal</li>
|
||||
</apparelTags>
|
||||
<apparelMoney>
|
||||
<min>0</min>
|
||||
<max>0</max>
|
||||
</apparelMoney>
|
||||
<apparelAllowHeadgearChance>0</apparelAllowHeadgearChance>
|
||||
<techHediffsMoney>
|
||||
<min>0</min>
|
||||
<max>0</max>
|
||||
</techHediffsMoney>
|
||||
<techHediffsTags>
|
||||
<li>Poor</li>
|
||||
</techHediffsTags>
|
||||
<techHediffsChance>0.0</techHediffsChance>
|
||||
<initialWillRange>2~4</initialWillRange>
|
||||
<initialResistanceRange>28~44</initialResistanceRange>
|
||||
</PawnKindDef>
|
||||
</Defs>
|
|
@ -75,7 +75,7 @@ namespace RJW_Genes
|
|||
|
||||
// LifeForce
|
||||
public static readonly GeneDef rjw_genes_lifeforce;
|
||||
public static readonly GeneDef rjw_genes_pussyhealer;
|
||||
public static readonly GeneDef rjw_genes_pussyhealing;
|
||||
public static readonly GeneDef rjw_genes_vaginal_absorber;
|
||||
public static readonly GeneDef rjw_genes_anal_absorber;
|
||||
public static readonly GeneDef rjw_genes_drainer;
|
||||
|
@ -87,5 +87,7 @@ namespace RJW_Genes
|
|||
public static readonly GeneDef rjw_genes_youth_fountain;
|
||||
public static readonly GeneDef rjw_genes_sex_age_drain;
|
||||
public static readonly HediffDef rjw_genes_orgasm_rush_hediff;
|
||||
|
||||
public static readonly XenotypeDef Succubus;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,7 +162,7 @@ namespace RJW_Genes
|
|||
{
|
||||
return false;
|
||||
}
|
||||
return pawn.genes.HasGene(GeneDefOf.rjw_genes_pussyhealer);
|
||||
return pawn.genes.HasGene(GeneDefOf.rjw_genes_pussyhealing);
|
||||
}
|
||||
|
||||
public static bool IsUnbreakable(Pawn pawn)
|
||||
|
|
87
Source/Genes/Life_Force/IncidentWorker_SuccubusDreamVisit.cs
Normal file
87
Source/Genes/Life_Force/IncidentWorker_SuccubusDreamVisit.cs
Normal file
|
@ -0,0 +1,87 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
namespace RJW_Genes
|
||||
{
|
||||
public class IncidentWorker_SuccubusDreamVisit : IncidentWorker
|
||||
{
|
||||
//This incidint will only fire if there is a pawn asleep which while sexneed is lower than 0.25
|
||||
protected override bool CanFireNowSub(IncidentParms parms)
|
||||
{
|
||||
if (!base.CanFireNowSub(parms))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Map map = (Map)parms.target;
|
||||
if (!map.mapTemperature.SeasonAcceptableFor(ThingDefOf.Human))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
foreach (Pawn pawn in map.mapPawns.FreeColonistsAndPrisonersSpawned)
|
||||
{
|
||||
if (pawn.jobs.curDriver.asleep && xxx.need_some_sex(pawn) > 1f)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
protected override bool TryExecuteWorker(IncidentParms parms)
|
||||
{
|
||||
Map map = (Map)parms.target;
|
||||
Pawn victim = ValidVictims(map).RandomElement();
|
||||
if (victim == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
IntVec3 loc = victim.Position;
|
||||
Faction faction;
|
||||
if (!this.TryFindFormerFaction(out faction))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//Spawn succubus at pawn and initiate sex
|
||||
Pawn succubus = PawnGenerator.GeneratePawn(new PawnGenerationRequest(PawnKindDef.Named("Succubus"), faction, PawnGenerationContext.NonPlayer, -1,
|
||||
false, false, false, true, false, 1f, false, true, false, true, true, false, false, false, false, 0f, 0f, null, 1f, null, null,
|
||||
null, null, null, null, null, null, null, null, null, null, false, false, false, false, null, null, null, null, null, 0f,
|
||||
DevelopmentalStage.Adult, null, null, null, false));
|
||||
succubus.SetFaction(null, null);
|
||||
GenSpawn.Spawn(succubus, loc, map, WipeMode.Vanish);
|
||||
|
||||
//Sends letter
|
||||
//string value = succubus.DevelopmentalStage.Child() ? "FeralChild".Translate().ToString() : succubus.KindLabel;
|
||||
//TaggedString value2 = succubus.DevelopmentalStage.Child() ? "Child".Translate() : "Person".Translate();
|
||||
//TaggedString baseLetterLabel = this.def.letterLabel.Formatted(value).CapitalizeFirst();
|
||||
//TaggedString baseLetterText = this.def.letterText.Formatted(succubus.NameShortColored, value2, succubus.Named("PAWN")).AdjustedFor(succubus, "PAWN", true).CapitalizeFirst();
|
||||
//PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref baseLetterText, ref baseLetterLabel, succubus);
|
||||
//base.SendStandardLetter(baseLetterLabel, baseLetterText, this.def.letterDef, parms, succubus, Array.Empty<NamedArgument>());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private IEnumerable<Pawn> ValidVictims(Map map)
|
||||
{
|
||||
foreach (Pawn pawn in map.mapPawns.FreeColonistsAndPrisonersSpawned)
|
||||
{
|
||||
if (pawn.jobs.curDriver.asleep && xxx.need_some_sex(pawn) > 1f)
|
||||
{
|
||||
yield return pawn;
|
||||
}
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
|
||||
private bool TryFindFormerFaction(out Faction formerFaction)
|
||||
{
|
||||
return Find.FactionManager.TryGetRandomNonColonyHumanlikeFaction(out formerFaction, false, true, TechLevel.Undefined, false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -7,7 +7,6 @@ using System.Text;
|
|||
using System.Threading.Tasks;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
||||
namespace RJW_Genes
|
||||
{
|
||||
|
||||
|
@ -114,30 +113,6 @@ namespace RJW_Genes
|
|||
if (props.sexType == xxx.rjwSextype.Sixtynine)
|
||||
{
|
||||
absorb_factor += 1f;
|
||||
|
||||
}
|
||||
else if (props.sexType == xxx.rjwSextype.Vaginal)
|
||||
{
|
||||
//with insertion absorbtion or vaginal cum absorbtion
|
||||
//absorb_factor += 1f;
|
||||
}
|
||||
else if (props.sexType == xxx.rjwSextype.DoublePenetration)
|
||||
{
|
||||
if (GeneUtility.HasGeneNullCheck(succubus, GeneDefOf.rjw_genes_vaginal_absorber))
|
||||
{
|
||||
//with insertion absorbtion?
|
||||
//absorb_factor += 0.5f;
|
||||
}
|
||||
if (GeneUtility.HasGeneNullCheck(succubus, GeneDefOf.rjw_genes_anal_absorber))
|
||||
{
|
||||
//with insertion absorbtion?
|
||||
//absorb_factor += 0.5f;
|
||||
}
|
||||
}
|
||||
else if (props.sexType == xxx.rjwSextype.Scissoring)
|
||||
{
|
||||
//with vaginal cum absorption && vaginal absorbtion
|
||||
//absorb_factor += 1f;
|
||||
}
|
||||
return absorb_factor;
|
||||
}
|
||||
|
@ -148,7 +123,6 @@ namespace RJW_Genes
|
|||
if (props.sexType == xxx.rjwSextype.Oral || props.sexType == xxx.rjwSextype.Fellatio || props.sexType == xxx.rjwSextype.Sixtynine)
|
||||
{
|
||||
absorb_factor += 1f;
|
||||
|
||||
}
|
||||
else if (props.sexType == xxx.rjwSextype.Vaginal && GeneUtility.HasGeneNullCheck(succubus, GeneDefOf.rjw_genes_vaginal_absorber))
|
||||
{
|
||||
|
|
|
@ -10,42 +10,64 @@ using Verse;
|
|||
namespace RJW_Genes.Interactions
|
||||
{
|
||||
//Summary//
|
||||
//Set custom preferences for pawn. Gets integrated to rjw by AddtoIPartPreferenceRule in First
|
||||
//Set custom preferences for pawn. Gets integrated into rjw by AddtoIPartPreferenceRule in First
|
||||
//Depending on the level of lifeforce increase the chance for using the mouth.
|
||||
public class GenesPartKindUsageRule : IPartPreferenceRule
|
||||
{
|
||||
public IEnumerable<Weighted<LewdablePartKind>> ModifiersForDominant(InteractionContext context)
|
||||
{
|
||||
Pawn pawn = context.Internals.Dominant.Pawn;
|
||||
if (GeneUtility.HasCriticalLifeForce(pawn))
|
||||
Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType<Gene_LifeForce>();
|
||||
if (gene != null)
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(50f, LewdablePartKind.Mouth);
|
||||
}
|
||||
else if (GeneUtility.HasLowLifeForce(pawn))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(10f, LewdablePartKind.Mouth);
|
||||
}
|
||||
else if (GeneUtility.HasLifeForce(pawn))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(2f, LewdablePartKind.Mouth);
|
||||
float weight = 2f;
|
||||
if (gene.Value < gene.MinLevelForAlert)
|
||||
{
|
||||
weight *= 10;
|
||||
}
|
||||
else if (gene.Value < gene.targetValue)
|
||||
{
|
||||
weight *= 2.5f;
|
||||
}
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Mouth);
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Beak);
|
||||
if (pawn.genes.HasGene(GeneDefOf.rjw_genes_vaginal_absorber))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Vagina);
|
||||
}
|
||||
if (pawn.genes.HasGene(GeneDefOf.rjw_genes_anal_absorber))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Anus);
|
||||
}
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
|
||||
public IEnumerable<Weighted<LewdablePartKind>> ModifiersForSubmissive(InteractionContext context)
|
||||
{
|
||||
Pawn pawn = context.Internals.Submissive.Pawn;
|
||||
if (GeneUtility.HasCriticalLifeForce(pawn))
|
||||
Pawn pawn = context.Internals.Dominant.Pawn;
|
||||
Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType<Gene_LifeForce>();
|
||||
if (gene != null)
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(50f, LewdablePartKind.Mouth);
|
||||
}
|
||||
else if (GeneUtility.HasLowLifeForce(pawn))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(10f, LewdablePartKind.Mouth);
|
||||
}
|
||||
else if (GeneUtility.HasLifeForce(pawn))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(2f, LewdablePartKind.Mouth);
|
||||
float weight = 2f;
|
||||
if (gene.Value < gene.MinLevelForAlert)
|
||||
{
|
||||
weight *= 10;
|
||||
}
|
||||
else if (gene.Value < gene.targetValue)
|
||||
{
|
||||
weight *= 2.5f;
|
||||
}
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Mouth);
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Beak);
|
||||
if (pawn.genes.HasGene(GeneDefOf.rjw_genes_vaginal_absorber))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Vagina);
|
||||
}
|
||||
if (pawn.genes.HasGene(GeneDefOf.rjw_genes_anal_absorber))
|
||||
{
|
||||
yield return new Weighted<LewdablePartKind>(weight, LewdablePartKind.Anus);
|
||||
}
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
</Reference>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="LicentiaLabs">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\licentia-labs-master\Assemblies\LicentiaLabs.dll</HintPath>
|
||||
|
@ -35,6 +36,7 @@
|
|||
</Reference>
|
||||
<Reference Include="RJW">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\rjw-master\1.4\Assemblies\RJW.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
|
@ -54,6 +56,7 @@
|
|||
</Reference>
|
||||
<Reference Include="UnityEngine.CoreModule">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="UnityEngine.IMGUIModule">
|
||||
<HintPath>..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll</HintPath>
|
||||
|
@ -122,6 +125,7 @@
|
|||
<Compile Include="Genes\Life_Force\Abilities\CompProperties_Seduce.cs" />
|
||||
<Compile Include="Genes\Life_Force\Abilities\CompProperties_AbilityCockEater.cs" />
|
||||
<Compile Include="Genes\Life_Force\Gene_LifeForceDrain.cs" />
|
||||
<Compile Include="Genes\Life_Force\IncidentWorker_SuccubusDreamVisit.cs" />
|
||||
<Compile Include="Genes\Life_Force\IngestionOutcomeDoer_LifeForceOffset.cs" />
|
||||
<Compile Include="Genes\Life_Force\JobDrivers\JobDriver_SexOnSpotReceiver.cs" />
|
||||
<Compile Include="Genes\Life_Force\JobDrivers\JobDriver_SexOnSpot.cs" />
|
||||
|
@ -155,7 +159,7 @@
|
|||
<Compile Include="HediffDefOf.cs" />
|
||||
<Compile Include="Interactions\CustomSexInteraction_Helper.cs" />
|
||||
<Compile Include="Interactions\GenesPartKindUsageRule.cs" />
|
||||
<Compile Include="Interactions\SubSuccubusTailCustomRequirementHandler - Copy.cs" />
|
||||
<Compile Include="Interactions\SubSuccubusTailCustomRequirementHandler.cs" />
|
||||
<Compile Include="Interactions\DomSuccubusTailCustomRequirementHandler.cs" />
|
||||
<Compile Include="JobDefOf.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
|
|
Loading…
Reference in a new issue