Compare commits

...

7 commits

12 changed files with 262 additions and 52 deletions

View file

@ -1,4 +1,4 @@
# 2.2.0 # 2.2.0 (dd-mm-2024)
**Genetic Diseases** **Genetic Diseases**
@ -12,6 +12,7 @@ Infections can be
- Chances are adjustable per XML per Gene - Chances are adjustable per XML per Gene
By turning their spread off, you effectively have a set of normal negative genes. By turning their spread off, you effectively have a set of normal negative genes.
Dead pawns can spread diseases, but cannot receive them. For all you necros out there.
*Why???* *Why???*
@ -19,20 +20,26 @@ Most of the genes so far were positive or neutral,
so I got some fair requests to introduce negative genes to keep xenotypes balanced. so I got some fair requests to introduce negative genes to keep xenotypes balanced.
I know that this is some overlap with the STD mod, but well ... you are free to turn things off? I know that this is some overlap with the STD mod, but well ... you are free to turn things off?
**Additions** **Additions:**
- Passive Gene: *Genetic Disease Immunity* - cannot get infected by any genetic diseases, and won't be affected by some other genes (see relevant genes) - Passive Gene: *Genetic Disease Immunity* - cannot get infected by any genetic diseases, and won't be affected by some other genes (see relevant genes)
- Disease Gene: Vulnerability. Pawn is likelier to be raped - Disease Gene: Vulnerability. Pawn is likelier to be raped
- Disease Gene: Infectious Hypersexuality - Disease Gene: Infectious Hypersexuality
- Disease Gene: Infectious Homosexuality & Bisexuality - Disease Gene: Infectious Homosexuality & Bisexuality
- Disease Gene: Fluctual Sexual Need. (Configurable) Chance to reset sex-need to near-zero and gain a bit of rest-need. - Disease Gene: Fluctual Sexual Need. (Configurable) Chance to reset sex-need to near-zero and gain a bit of rest-need.
- Disease Gene: Size Blinded. Pawns have a higher chance for hooking up with pawns with a big cock, lower chance for small cocks.
**Internal** **Fixes:**
- Fixed an Issue where pawns would always get the Pheromone social boost, unless they had the pheromone (#113)
**Internal:**
- GenderFluid-Gene now uses a generalized `TickBasedChanceExtension` over its unique special `GenderFluidExtension` - GenderFluid-Gene now uses a generalized `TickBasedChanceExtension` over its unique special `GenderFluidExtension`
- Introduced a `ModLog.Debug` Function that checks for the settings before printing - trying to spread it over the whole project. - Introduced a `ModLog.Debug` Function that checks for the settings before printing - trying to spread it over the whole project.
- Removed TODO File. I have enough to do.
# 2.1.0 # 2.1.0 (27-06-2024)
**Additions**: **Additions**:
@ -79,7 +86,7 @@ I know that this is some overlap with the STD mod, but well ... you are free to
- Some new Icons thanks to Kira-Bad-Artist - Some new Icons thanks to Kira-Bad-Artist
- Some new Icons thanks to Archer - Some new Icons thanks to Archer
# 2.0.0 # 2.0.0 (30-05-2024)
**Summary**: **Summary**:
@ -126,20 +133,20 @@ I know that this is some overlap with the STD mod, but well ... you are free to
- Patches to RJW-Pregnancy Helper to account for Male Pregs. - Patches to RJW-Pregnancy Helper to account for Male Pregs.
- Some replacements from `hasGene` to `hasActiveGene` - Some replacements from `hasGene` to `hasActiveGene`
# 1.3.3 # 1.3.3 (02-11-2023)
**Fixes:** **Fixes:**
- Added another check to the AG Malachai Xenotype (Fixes #68) - Added another check to the AG Malachai Xenotype (Fixes #68)
- Fixed the `GatheredCum`Fertilin Ingestion Patch throwing an Error for people without Sexperience (Fixes #69 (nice)) - Fixed the `GatheredCum`Fertilin Ingestion Patch throwing an Error for people without Sexperience (Fixes #69 (nice))
# 1.3.2 # 1.3.2 (24-10-2023)
**Fixes:** **Fixes:**
- Removed patch for Malachai, needs a different patching operator but I don't want to have broken fixes for now (Tracked in a new Issue) - Removed patch for Malachai, needs a different patching operator but I don't want to have broken fixes for now (Tracked in a new Issue)
# 1.3.1 # 1.3.1 (22-10-2023)
**Changes** **Changes**
@ -178,7 +185,7 @@ The pawns that are gender fluid can get pregnant.
However, with RJW 5.3.7 these pregnancies disappear. However, with RJW 5.3.7 these pregnancies disappear.
This is a change needed upstream, but I will have a look. This is a change needed upstream, but I will have a look.
# 1.2.1 # 1.2.1 (18-06-2023)
**Fixes**: **Fixes**:
@ -258,9 +265,9 @@ And I am aware that the TiTs-Myr work different than the things I made now.
- Mostly Patches and Changes to the Halamyr Defs - Mostly Patches and Changes to the Halamyr Defs
- Some re-arranging and mayRequires for other mods - Some re-arranging and mayRequires for other mods
# 1.1.4 # 1.1.4 (06-04-2023)
Fixes: **Fixes:**
- Youth Fountain and Age Drainer **really** "stop" at 18 (#26, #28) and never age pawns - Youth Fountain and Age Drainer **really** "stop" at 18 (#26, #28) and never age pawns
- Drastically reduced vomiting time due to an missunderstanding (#29). `0.4` instead of `0.01` - Drastically reduced vomiting time due to an missunderstanding (#29). `0.4` instead of `0.01`
@ -268,37 +275,37 @@ Fixes:
Sometimes life is like that, and you have to fix the fixes. Sometimes life is like that, and you have to fix the fixes.
It was never really broken, life is just very long. It was never really broken, life is just very long.
# 1.1.3 # 1.1.3 (28-03-2023)
Changes: **Changes:**
- Youth Fountain and Age Drainer "stop" at 18 (#26) - Youth Fountain and Age Drainer "stop" at 18 (#26)
- Youth Fountain and Age Drainer activate only for pawns at 18 (#26) - Youth Fountain and Age Drainer activate only for pawns at 18 (#26)
- Drained Pawns vomit less (from mtb 0.05 to 0.01)(#29) - Drained Pawns vomit less (from mtb 0.05 to 0.01)(#29)
Fixes: **Fixes:**
- InsectBreeder would mess with normal Pawn-Animal pregancy for egg laying animals (#23) - InsectBreeder would mess with normal Pawn-Animal pregancy for egg laying animals (#23)
# 1.1.2 # 1.1.2 (19-03-2023)
Changes: **Changes:**
- Added more cool images from WasMachenDennSachen (#22) - Added more cool images from WasMachenDennSachen (#22)
Fixes: **Fixes:**
- Aphrodisiac Pheromones checks for children and other conditions (#25) - Aphrodisiac Pheromones checks for children and other conditions (#25)
# 1.1.1 # 1.1.1 (10-03-2023)
Changes: **Changes:**
- Drastically increased mood-penalty for Fertilin-Loss (if the pawn is still too happy, there will never be a breakdown for missing fertilin) - Drastically increased mood-penalty for Fertilin-Loss (if the pawn is still too happy, there will never be a breakdown for missing fertilin)
- No-Breast Genes add Nipples - No-Breast Genes add Nipples
- Featureless Chest Gene (No Nipples at all, adds the RJW Featureless Chest as requested per some Kobold fetishists) - Featureless Chest Gene (No Nipples at all, adds the RJW Featureless Chest as requested per some Kobold fetishists)
Fixes: **Fixes:**
- Small and Big Male Genitalia had images wrong way round - Small and Big Male Genitalia had images wrong way round
- Fertilin should activate at a MinAge of 18 - Fertilin should activate at a MinAge of 18

View file

@ -186,4 +186,20 @@
</modExtensions> </modExtensions>
</GeneDef> </GeneDef>
<GeneDef ParentName="RJWGeneDisease">
<defName>rjw_genes_size_blinded</defName>
<label>size blinded</label>
<description>This genetic disease makes the carrier dramatically more drawn to pawns with huge cocks.</description>
<iconPath>UI/Icons/ColonistBar/Idle</iconPath>
<biostatCpx>1</biostatCpx>
<biostatMet>1</biostatMet>
<displayOrderInCategory>11</displayOrderInCategory>
<modExtensions>
<li Class="RJW_Genes.GeneticDiseaseExtension">
<infectionChance>0.1</infectionChance>
</li>
</modExtensions>
</GeneDef>
</Defs> </Defs>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThoughtDef>
<defName>rjw_genes_appealing_cock</defName>
<thoughtClass>Thought_SituationalSocial</thoughtClass>
<workerClass>RJW_Genes.ThoughtWorker_SizeBlinded_Social</workerClass>
<validWhileDespawned>true</validWhileDespawned>
<stages>
<li>
<label>small cock</label>
<baseOpinionOffset>-10</baseOpinionOffset>
</li>
<li>
<label>big cock</label>
<baseOpinionOffset>10</baseOpinionOffset>
</li>
<li>
<label>monster cock</label>
<baseOpinionOffset>20</baseOpinionOffset>
</li>
</stages>
</ThoughtDef>
</Defs>

View file

@ -126,6 +126,7 @@ namespace RJW_Genes
public static readonly GeneDef rjw_genes_minor_vulnerability; public static readonly GeneDef rjw_genes_minor_vulnerability;
public static readonly GeneDef rjw_genes_major_vulnerability; public static readonly GeneDef rjw_genes_major_vulnerability;
public static readonly GeneDef rjw_genes_fluctual_sexual_needs; public static readonly GeneDef rjw_genes_fluctual_sexual_needs;
public static readonly GeneDef rjw_genes_size_blinded;
//Other Defs //Other Defs
public static readonly XenotypeDef rjw_genes_succubus; public static readonly XenotypeDef rjw_genes_succubus;

View file

@ -43,6 +43,11 @@ namespace RJW_Genes.Genes.Diseases.Patches
ModLog.Debug($"{infected} is immune to genetic diseases"); ModLog.Debug($"{infected} is immune to genetic diseases");
return; return;
} }
if (infected.Dead)
{
// Dead people can spread, but not receive, diseases.
return;
}
foreach (GeneDef disease in GetGeneticDiseaseGenes(infector)) { foreach (GeneDef disease in GetGeneticDiseaseGenes(infector)) {
ModLog.Debug($"Found genetic disease {disease} in {infector}, trying to infect {infected}"); ModLog.Debug($"Found genetic disease {disease} in {infector}, trying to infect {infected}");

View file

@ -0,0 +1,56 @@
using HarmonyLib;
using RimWorld;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace RJW_Genes
{
/// <summary>
/// This patch helps with the gene `rjw_genes_size_blinded`.
/// Within RJW the CasualSexHelper utilizes the basefunction "pawn.relations.SecondaryRomanceChanceFactor"
/// https://gitgud.io/Ed86/rjw/-/blob/master/1.5/Source/Common/Helpers/CasualSex_Helper.cs
///
/// We check on hookup for the other pawn if they have a penis.
/// If yes, we modulate the romance chance based on the following:
/// (Severity * BodySize - 0.5) * romance_multiplier
/// So pawns with a cock smaller than 0.5 will be penalized, while pawns with more than 0.5 will be preferred.
/// </summary>
[HarmonyPatch(typeof(Pawn_RelationsTracker), "SecondaryRomanceChanceFactor")]
public class Patch_SecondaryRomanceChanceFactor_Gene_SizeBlinded
{
const float romance_multiplier = 2f;
public static void Postfix( Pawn ___pawn, Pawn otherPawn, ref float __result)
{
if (otherPawn == null || ___pawn == null || ___pawn.genes == null || otherPawn.genes == null)
{
return;
}
if (___pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_size_blinded) && Genital_Helper.has_penis_fertile(otherPawn) || (Genital_Helper.has_penis_infertile(otherPawn)))
{
Hediff biggest_cock = GenitaliaUtility.GetBiggestPenis(otherPawn);
if (biggest_cock != null)
{
float bodysize = GenitaliaUtility.GetBodySizeOfSexPart(biggest_cock);
// Bodysize can only be a bonus, not a minus.
bodysize = Math.Max(1.0f, bodysize);
float attraction_bonus = (biggest_cock.Severity * bodysize - 0.5f) * romance_multiplier;
float result_backup = __result;
__result += attraction_bonus;
// Don't make it smaller than 0, to not get issues.
__result = __result < 0 ? 0.0f : __result;
ModLog.Debug($"Gene_SizeBlind: Modulate Romance-Chance {___pawn}-->{otherPawn} from {result_backup} by {attraction_bonus} to {__result}");
}
}
}
}
}

View file

@ -0,0 +1,70 @@
using RimWorld;
using rjw;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Verse;
namespace RJW_Genes
{
public class ThoughtWorker_SizeBlinded_Social : ThoughtWorker
{
protected override ThoughtState CurrentSocialStateInternal(Pawn pawn, Pawn other)
{
// Return for trivial errors
if (pawn == null || other == null || pawn == other)
return (ThoughtState)false;
// Check for position-existance
if (pawn.Position == null || other.Position == null || pawn.Map == null || other.Map == null)
return (ThoughtState)false;
// Do nothing if pawn is carried
if (pawn.CarriedBy != null)
return (ThoughtState)false;
// Do nothing if Pawn is Baby or Child (#25)
if (!pawn.ageTracker.Adult)
return (ThoughtState)false;
if (!other.ageTracker.Adult)
return (ThoughtState)false;
// Only check if they are spawned humans
if (!pawn.Spawned || !other.Spawned)
return (ThoughtState)false;
if (!pawn.RaceProps.Humanlike)
return (ThoughtState)false;
if (!other.RaceProps.Humanlike)
return (ThoughtState)false;
// Pawns that have not "met" wont give each other Mali
// Known-Each-Other is a key-word for Rimworld that shows they have had any interaction and stored each other in relations.
if (!RelationsUtility.PawnsKnowEachOther(pawn, other))
return (ThoughtState)false;
// If the pawn is not on Map (e.g. caravan), no mali
if (!MapUtility.PawnIsOnHomeMap(pawn))
return (ThoughtState)false;
//ModLog.Debug($"ThoughtWorker Checks Size Blinded {pawn} -> {other}");
// Do nothing if there is no size-blinded involved
if (!GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_size_blinded))
return (ThoughtState)false;
else
ModLog.Debug($"{pawn} has the size blinded gene");
// Iff the pawn has a penis, retrieve it's size.
var penis = GenitaliaUtility.GetBiggestPenis(other);
// Do Nothing if the other pawn has no penis
if (penis == null) return (ThoughtState)false;
var bodysize = GenitaliaUtility.GetBodySizeOfSexPart(penis);
if (penis.Severity + (bodysize) - 1.0 > 1.0)
return ThoughtState.ActiveAtStage(2);
else if (penis.Severity >= 0.8f)
return ThoughtState.ActiveAtStage(1);
else
return ThoughtState.ActiveAtStage(0);
}
}
}

View file

@ -73,5 +73,48 @@ namespace RJW_Genes
{ {
return candidate.def.defName.ToLower().Contains("breast"); return candidate.def.defName.ToLower().Contains("breast");
} }
/// <summary>
/// Returns the biggest penis of a pawn.
/// In case of a identical severity, the highest body size is returned.
/// For women, or pawns without a penis, null is returned.
/// </summary>
/// <param name="pawn"></param>
/// <returns>The biggest penis of a pawn. Null on women or error.</returns>
public static Hediff GetBiggestPenis(Pawn pawn)
{
Hediff best = null;
var parts = Genital_Helper.get_AllPartsHediffList(pawn);
foreach (var part in parts)
{
if (Genital_Helper.is_sex_part(part) && Genital_Helper.is_penis(part))
{
if (best == null) best = part;
// On a draw of size, we check the body-size.
if (part.Severity == best.Severity) {
var partSize = part.TryGetComp<rjw.CompHediffBodyPart>();
var bestSize = part.TryGetComp<rjw.CompHediffBodyPart>();
if (partSize == null || bestSize == null) { continue; }
best = partSize.SizeOwner > bestSize.SizeOwner ? part : best;
} else if (part.Severity > best.Severity) {
best = part;
}
}
}
return best;
}
public static float GetBodySizeOfSexPart(Hediff part)
{
if (part == null || part.TryGetComp<rjw.CompHediffBodyPart>() == null)
return 0.0f;
else
return part.TryGetComp<rjw.CompHediffBodyPart>().SizeOwner;
}
} }
} }

View file

@ -40,10 +40,20 @@ namespace RJW_Genes
// If the pawn is not on Map (e.g. caravan), no mali // If the pawn is not on Map (e.g. caravan), no mali
if (!MapUtility.PawnIsOnHomeMap(pawn)) if (!MapUtility.PawnIsOnHomeMap(pawn))
return (ThoughtState)false; return (ThoughtState)false;
// Do nothing for pawns that also have pheromones
if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_aphrodisiac_pheromones)) // Do nothing if the pawn does not have the pheromones
if (!GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_aphrodisiac_pheromones))
return (ThoughtState)false; return (ThoughtState)false;
// Do nothing for others that also have pheromones
if (GeneUtility.HasGeneNullCheck(other, GeneDefOf.rjw_genes_aphrodisiac_pheromones))
return (ThoughtState)false;
// Do nothing for pawns that wear Gas-Masks
if (other.apparel != null && other.apparel.AnyApparel)
if (other.apparel.WornApparel.Any(apparel => apparel.def == RimWorld.ThingDefOf.Apparel_GasMask))
return (ThoughtState)false;
// Actual Logic: // Actual Logic:
// Pawn qualifies in right distance and needs line of sight. // Pawn qualifies in right distance and needs line of sight.
var pos = other.Position; var pos = other.Position;

View file

@ -78,6 +78,8 @@
<Compile Include="Genes\Diseases\Defs\GeneticDiseaseExtension.cs" /> <Compile Include="Genes\Diseases\Defs\GeneticDiseaseExtension.cs" />
<Compile Include="Genes\Diseases\Genes\Gene_FluctualSexualNeed.cs" /> <Compile Include="Genes\Diseases\Genes\Gene_FluctualSexualNeed.cs" />
<Compile Include="Genes\Diseases\Patches\Patch_AftersexUtility_TransferGeneticDiseases.cs" /> <Compile Include="Genes\Diseases\Patches\Patch_AftersexUtility_TransferGeneticDiseases.cs" />
<Compile Include="Genes\Diseases\Patches\Patch_SecondaryRomanceChanceFactor_Gene_SizeBlinded.cs" />
<Compile Include="Genes\Diseases\Thoughts\ThoughtWorker_SizeBlinded_Social.cs" />
<Compile Include="Genes\Life_Force\Events\SuccubusVisit\IncidentWorker_SuccubusVisit.cs" /> <Compile Include="Genes\Life_Force\Events\SuccubusVisit\IncidentWorker_SuccubusVisit.cs" />
<Compile Include="Genes\Life_Force\Events\SuccubusVisit\LordJob_SuccubusVisit.cs" /> <Compile Include="Genes\Life_Force\Events\SuccubusVisit\LordJob_SuccubusVisit.cs" />
<Compile Include="Genes\Life_Force\Interactions\SuccubusTailjob\DomSuccubusTailCustomRequirementHandler.cs" /> <Compile Include="Genes\Life_Force\Interactions\SuccubusTailjob\DomSuccubusTailCustomRequirementHandler.cs" />

View file

@ -15,6 +15,8 @@ namespace RJW_Genes
public static readonly ThoughtDef rjw_genes_pheromone_carrier_nearby; public static readonly ThoughtDef rjw_genes_pheromone_carrier_nearby;
public static readonly ThoughtDef rjw_genes_appealing_cock;
//Others with same names but other defs than in genedefof //Others with same names but other defs than in genedefof
public static readonly InteractionDef rjw_genes_flirt; public static readonly InteractionDef rjw_genes_flirt;
} }

View file

@ -1,29 +0,0 @@
# ToDos and Planned Genes
Any help is very appreciated, even if it is just pointing me to existing similar projects.
## Planned / Wanted Genes
**Adjustable Cock-Size** like e.g. artificial genitalia have
**Infectious Hypersexuality Gene** (Maybe?) add Hypersexuality Gene through sex with a certain chance.
**Cum Addiction** add Cum-Addiction from Sexperience, slowly loose conciousness while addiction is not attended.
**Cum-Drugs** eating cum has an effect similar to Go-Juice (including (separate?) addiction)
**Death-Rest** until the pawn is cumflated. I would have liked
**STD Immunity** & maybe a potential to be carrier, but not suffer effects. I just don't play with STDs
## Genes with Abilities and more Effects
There were some suggestions on the Discord I saved them somewhere else. I am far away from making that work, but to have them here:
- Genitalia deal damage as per size (on normal sex-use) - This started in the branch `GenitaliaDamage` but prooves a bit overboarding!
- Genitalia can cause Terror (as ability)
- Cumshot Sniper Abilities. Scale damage with body size and genitalia size, scale distance by cum-amount (relative to the damage - high damage projectiles need more cum per meter).
## Cleanups:
- Change Project structure to the 1.3, 1.4 Structure of other mods