diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50a2b82..9de9d2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,68 @@
-# 1.1.0 (2023-xx-xx)
+# 1.2
+
+Changes:
+
+- Cocoon Weaver Gene
+
+Fixes:
+
+- Cockeater Ability has now Icon of Cockeater Gene
+- Cockeater now leaves a bite wound!
+
+# 1.1.4
+
+Fixes:
+
+- 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`
+
+Sometimes life is like that, and you have to fix the fixes.
+It was never really broken, life is just very long.
+
+# 1.1.3
+
+Changes:
+
+- Youth Fountain and Age Drainer "stop" 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)
+
+Fixes:
+
+- InsectBreeder would mess with normal Pawn-Animal pregancy for egg laying animals (#23)
+
+# 1.1.2
+
+Changes:
+
+- Added more cool images from WasMachenDennSachen (#22)
+
+Fixes:
+
+- Aphrodisiac Pheromones checks for children and other conditions (#25)
+
+# 1.1.1
+
+Changes:
+
+- 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
+- Featureless Chest Gene (No Nipples at all, adds the RJW Featureless Chest as requested per some Kobold fetishists)
+
+Fixes:
+
+- Small and Big Male Genitalia had images wrong way round
+- Fertilin should activate at a MinAge of 18
+
+**Important**: The Fertilin Changes could throw errors! I tested a bit, but not a lot.
+So please reach out if you get something and I will try to fix it ASAP.
+
+# 1.1.0 (2023-03-04)
1.1.0-beta-1 was released on 05.02.2023.
+Changes since beta: Typos, Icons & Merge of Anal & Vaginal Absorber.
+
## Features:
- Succubus, other Fertilin Xenotypes (see below)
@@ -72,6 +133,7 @@ Currently Succubi and Incubi only spawn through a special event determined by th
- Genitalia Resizing triggers on 20th Birthday (#11)
- RJW-Gene-Inheritance Settings now do things (#13, Shabakur)
- Check for Animals in Orgasm Rush, no Orgasm Rush for and from Animals (#15)
+- Using Character Editor, it can happen that the Genes fired twice. I hoped to harden this issue by checking better (#19)
# 1.0.1 (2022-12-20)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1f3d4d5..486a3b9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,6 +16,7 @@ But please consider also the following:
## Contributors
- Shabalox (MechBreeding, InsectBreeding, Animal Gene Inheritance)
+- WasMachenDennSachen (Various Icons)
## Other Credits
@@ -24,5 +25,5 @@ But please consider also the following:
- Many of the Icons I made (e.g. Genitalia Types) include things from [OpenMoji](https://openmoji.org/) which is awesome
- Placeholder, Rapist, Necrophile come from [RJW-Sexperience Ideology](https://gitgud.io/amevarashi/rjw-sexperience-ideology/)
- Hypersexual & Zoophile comes from [RJW](https://gitgud.io/Ed86/rjw)
-- Cockeater & Naked Prowess come from *WasMachenSachen*.
+- Cockeater & Naked Prowess come from *WasMachenDennSachen* but I copied it from Discord Chat.
- Fertilin, Fertilin Drain, Healpussy, Succubus Wing & Tail come from Shabakur
\ No newline at end of file
diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll
index 9878f26..7e3fd40 100644
Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ
diff --git a/Common/Defs/AbilityDefs/Ability_CockEater.xml b/Common/Defs/AbilityDefs/Ability_CockEater.xml
index d333c1d..f74e38c 100644
--- a/Common/Defs/AbilityDefs/Ability_CockEater.xml
+++ b/Common/Defs/AbilityDefs/Ability_CockEater.xml
@@ -4,7 +4,7 @@
rjw_genes_cockeaterEat the cock of another pawn, restoring fertilin based on the size of the cock.
- Things/Mote/Heart
+ Genes/Icons/cockeatertruetruefalse
@@ -27,8 +27,7 @@
-
-
+
\ No newline at end of file
diff --git a/Common/Defs/AbilityDefs/Ability_CocoonWeaver.xml b/Common/Defs/AbilityDefs/Ability_CocoonWeaver.xml
new file mode 100644
index 0000000..06133a1
--- /dev/null
+++ b/Common/Defs/AbilityDefs/Ability_CocoonWeaver.xml
@@ -0,0 +1,34 @@
+
+
+
+ rjw_genes_cocoonweaver
+
+ Weaves the victim into a (self-sustaining) cocoon. The victim cannot move, but can be bred.
+ Things/Mote/Heart
+ true
+ true
+ false
+ Mote_CocoonStencil
+ CocoonWeave
+ CastAbilityOnThingMelee
+ 404
+
+ 30000
+
+ Verb_CastAbilityTouch
+ false
+ -1
+ 15
+
+ true
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Common/Defs/AbilityDefs/Ability_NakedProwess.xml b/Common/Defs/AbilityDefs/Ability_NakedProwess.xml
index 82d5bd8..06e5618 100644
--- a/Common/Defs/AbilityDefs/Ability_NakedProwess.xml
+++ b/Common/Defs/AbilityDefs/Ability_NakedProwess.xml
@@ -6,7 +6,7 @@
Enhance the strength and resilience of your naked body with fertilin.Genes/Icons/rjw_naked_prowessThings/Mote/Heart
- CastAbilityOnThing
+ CastAbilityOnThingFalseFalseTrue
diff --git a/Common/Defs/AbilityDefs/Ability_Seduce.xml b/Common/Defs/AbilityDefs/Ability_Seduce.xml
index 3310595..65c281a 100644
--- a/Common/Defs/AbilityDefs/Ability_Seduce.xml
+++ b/Common/Defs/AbilityDefs/Ability_Seduce.xml
@@ -9,7 +9,7 @@
truetruefalse
-
+ 10Mote_CoagulateStencil
diff --git a/Common/Defs/Effects/cocoonweave.xml b/Common/Defs/Effects/cocoonweave.xml
new file mode 100644
index 0000000..945e631
--- /dev/null
+++ b/Common/Defs/Effects/cocoonweave.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ CocoonWeave
+
+
+
+
+
+
+ Mote_CocoonStencil
+ MoteAttached
+ Terrain
+
+ 0.1
+ 0.4
+ 999999
+ True
+
+
+ Graphic_PawnBodySilhouette
+ PawnSilhouetteStencil
+ Things/Mote/Transparent
+
+
+
+
\ No newline at end of file
diff --git a/Common/Defs/GeneDefs/GeneCategories.xml b/Common/Defs/GeneDefs/GeneCategories.xml
index 06b31cc..8106c8e 100644
--- a/Common/Defs/GeneDefs/GeneCategories.xml
+++ b/Common/Defs/GeneDefs/GeneCategories.xml
@@ -67,6 +67,11 @@
8
+
+ rjw_genes_hive
+
+ 7
+
\ No newline at end of file
diff --git a/Common/Defs/GeneDefs/GeneDefs_Breeding.xml b/Common/Defs/GeneDefs/GeneDefs_Breeding.xml
index bd201cc..a2d7d7e 100644
--- a/Common/Defs/GeneDefs/GeneDefs_Breeding.xml
+++ b/Common/Defs/GeneDefs/GeneDefs_Breeding.xml
@@ -40,7 +40,7 @@
rjw_genes_breedingXenotypes with this Gene are Zoophile.
- Genes/Icons/Zoophile_2
+ Genes/Icons/Zoophile54
diff --git a/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml b/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml
index c2acd4c..22764ea 100644
--- a/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml
+++ b/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml
@@ -70,7 +70,7 @@
rjw_genes_no_breasts
- Females of this do not have a pair of breasts.
+ Females of this do not have a pair of breasts, but only nipples.Genes/Icons/No_BreastsRJW_Genes.Gene_NoBreasts706
@@ -106,7 +106,7 @@
rjw_genes_futa
- Males of this xenotype grow additional female genitalia, Females grow additional male genitalia.
+ Males with this gene grow additional female genitalia, females grow additional male genitalia.Genes/Icons/FutaRJW_Genes.Gene_Futa709
@@ -116,4 +116,16 @@
+
+ rjw_genes_featureless_chest
+
+ Carriers of this gene do not have breasts or nipples.
+ Genes/Icons/No_Breasts
+ RJW_Genes.Gene_FeaturelessChest
+ 710
+
+
BreastAmount
+
+
+
\ No newline at end of file
diff --git a/Common/Defs/GeneDefs/GeneDefs_GenitaliaSizes.xml b/Common/Defs/GeneDefs/GeneDefs_GenitaliaSizes.xml
index cc26c04..c5d8826 100644
--- a/Common/Defs/GeneDefs/GeneDefs_GenitaliaSizes.xml
+++ b/Common/Defs/GeneDefs/GeneDefs_GenitaliaSizes.xml
@@ -10,7 +10,7 @@
rjw_genes_big_male_genitaliaPenises of this Xenotype are bigger.(Resizing takes place at 20th Birthday)
- Genes/Icons/Small_Male_Genitalia
+ Genes/Icons/Big_Male_GenitaliaRJW_Genes.Gene_BigMaleGenitalia751
@@ -22,7 +22,7 @@
rjw_genes_small_male_genitaliaPenises of this Xenotype are smaller. (Resizing takes place at 20th Birthday)
- Genes/Icons/Big_Male_Genitalia
+ Genes/Icons/Small_Male_GenitaliaRJW_Genes.Gene_SmallMaleGenitalia753
diff --git a/Common/Defs/GeneDefs/GeneDefs_Hive.xml b/Common/Defs/GeneDefs/GeneDefs_Hive.xml
new file mode 100644
index 0000000..8b6ab1f
--- /dev/null
+++ b/Common/Defs/GeneDefs/GeneDefs_Hive.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ rjw_genes_cocoonweaver
+
+ cocooner
+ Carriers of this gene can produce a cocoon to prepare helpless victims for breeding.
+ Things/Mote/Heart
+ 11
+ rjw_genes_hive
+
+
rjw_genes_cocoonweaver
+
+
+ rjw_genes_cocoonweaver
+
+ 1
+ -1
+
+
+
\ No newline at end of file
diff --git a/Common/Defs/GeneDefs/GeneDefs_LifeForce.xml b/Common/Defs/GeneDefs/GeneDefs_LifeForce.xml
index cc70eae..e8987d0 100644
--- a/Common/Defs/GeneDefs/GeneDefs_LifeForce.xml
+++ b/Common/Defs/GeneDefs/GeneDefs_LifeForce.xml
@@ -19,6 +19,7 @@
0rjw_genes_fertilin-2
+ 18
-
\ No newline at end of file
+
diff --git a/Common/Textures/Genes/Icons/Extra_Anus.png b/Common/Textures/Genes/Icons/Extra_Anus.png
index 1075bbd..9dfbbb6 100644
Binary files a/Common/Textures/Genes/Icons/Extra_Anus.png and b/Common/Textures/Genes/Icons/Extra_Anus.png differ
diff --git a/Common/Textures/Genes/Icons/Extra_Breasts.png b/Common/Textures/Genes/Icons/Extra_Breasts.png
index f2c470e..5e7cbc3 100644
Binary files a/Common/Textures/Genes/Icons/Extra_Breasts.png and b/Common/Textures/Genes/Icons/Extra_Breasts.png differ
diff --git a/Common/Textures/Genes/Icons/Genitalia_Demon.png b/Common/Textures/Genes/Icons/Genitalia_Demon.png
index 7831b4d..d8ace83 100644
Binary files a/Common/Textures/Genes/Icons/Genitalia_Demon.png and b/Common/Textures/Genes/Icons/Genitalia_Demon.png differ
diff --git a/Common/Textures/Genes/Icons/Loose_Anus.png b/Common/Textures/Genes/Icons/Loose_Anus.png
index c96dec3..86036d8 100644
Binary files a/Common/Textures/Genes/Icons/Loose_Anus.png and b/Common/Textures/Genes/Icons/Loose_Anus.png differ
diff --git a/Common/Textures/Genes/Icons/No_Anus.png b/Common/Textures/Genes/Icons/No_Anus.png
index f5a9a03..69f7d6b 100644
Binary files a/Common/Textures/Genes/Icons/No_Anus.png and b/Common/Textures/Genes/Icons/No_Anus.png differ
diff --git a/Common/Textures/Genes/Icons/No_Male_Genitalia.png b/Common/Textures/Genes/Icons/No_Male_Genitalia.png
index ce1fa4e..9104ea6 100644
Binary files a/Common/Textures/Genes/Icons/No_Male_Genitalia.png and b/Common/Textures/Genes/Icons/No_Male_Genitalia.png differ
diff --git a/Common/Textures/Genes/Icons/Tight_Anus.png b/Common/Textures/Genes/Icons/Tight_Anus.png
index dd355fb..0e797de 100644
Binary files a/Common/Textures/Genes/Icons/Tight_Anus.png and b/Common/Textures/Genes/Icons/Tight_Anus.png differ
diff --git a/Common/Textures/Genes/Icons/Zoophile.png b/Common/Textures/Genes/Icons/Zoophile.png
index ed45040..75afdf4 100644
Binary files a/Common/Textures/Genes/Icons/Zoophile.png and b/Common/Textures/Genes/Icons/Zoophile.png differ
diff --git a/Common/Textures/Genes/Icons/Zoophile_2.png b/Common/Textures/Genes/Icons/Zoophile_2.png
deleted file mode 100644
index d313bcb..0000000
Binary files a/Common/Textures/Genes/Icons/Zoophile_2.png and /dev/null differ
diff --git a/Common/Textures/Genes/Icons/extra_male.png b/Common/Textures/Genes/Icons/extra_male.png
index 5390ecc..c39e163 100644
Binary files a/Common/Textures/Genes/Icons/extra_male.png and b/Common/Textures/Genes/Icons/extra_male.png differ
diff --git a/Common/Textures/Things/Mote/Cocoon/WeaveA.psd b/Common/Textures/Things/Mote/Cocoon/WeaveA.psd
new file mode 100644
index 0000000..2328868
Binary files /dev/null and b/Common/Textures/Things/Mote/Cocoon/WeaveA.psd differ
diff --git a/Common/Textures/Things/Mote/Cocoon/WeaveB.psd b/Common/Textures/Things/Mote/Cocoon/WeaveB.psd
new file mode 100644
index 0000000..c1a852e
Binary files /dev/null and b/Common/Textures/Things/Mote/Cocoon/WeaveB.psd differ
diff --git a/KNOWN_BUGS.md b/KNOWN_BUGS.md
index ebedd72..f9bc556 100644
--- a/KNOWN_BUGS.md
+++ b/KNOWN_BUGS.md
@@ -2,6 +2,27 @@
Collection of Known Bugs and reasons for their origin.
+## I changed Parts of a pawn and my genes do not apply!
+
+Issue: You had a pawn with "huge genitalia" and add a horse-cock with licentia or surgery. This new genitalia is not huge.
+
+Reason: The genes are applied when they are added. This is usually character-spawn. The genes change the attributes of the genitalia-hediff, and thus genitalia added after the genes are not affected.
+
+I think I will not gonna fix this.
+First of all, I think transplants wouldn't reasonably affected by genes.
+Second, for implementation I'd need to regularly check if every gene changed all relevant genitalia already, and do the same every x-ticks.
+This seems like a performance sink, so I will not gonna do it.
+
+## Pawn does not refresh empty Fertilin!
+
+Issue: A pawn has 0 (or low) Fertilin, and a mood debuff. But they do not do anything about it.
+
+Reason: Pawns might go on a mental break when their fertilin is low to rape people. However, if your pawn is generally happy, they will not have a mental break. Then they run around with low fertilin.
+
+Workarounds / Solutions: Depending on your Gene-Setup, you might consider a cum-based diet. You can also tweak sex-settings for more sex need and hookups. Lastly, you can edit the xml to give higher mood penalties, which will lead to more mental breakdowns.
+
+In general, I am happy to hear your feedback. If you have other ideas how to change this to be a bit tricky but not too punishing please let me know.
+
## Fertilin does not go up after Sex!
Error: An Incubus or Succubus had sex with another pawn, but did not gain Fertilin.
@@ -22,6 +43,7 @@ Error: You have a succubus using seduce on a hostile pawn, they start sex but im
Things to Consider:
1. Is your Succubus drafted? If not, they might have a flight-mode set and are scared of the enemy.
+2. Do you have mods changing combat AI? (CAI5000 or Combat Extended)
It seems that things changing Enemy Combat AI also affect this. One report was about CAI5000 and we also expect Combat Extended to be incompatible.
@@ -43,6 +65,8 @@ Maybe you can also fix it by changing `` in the Male/Fem
## Full-No-Genital-Genes get Genitals later
+*Update: Should be addressed with 1.1.1 and not appear anymore*
+
Error: I added all "no-XXX" genes but my pawn has genitalia on map!
Reason: If you go with Full-No-Genitals (No Penis, No Anus, No Breasts, No Vagina) then the pawn spawns without any Genitalia on the map,
@@ -52,6 +76,8 @@ however then the RJW base-logic runs the sexualizer.
## Log Pops up for Xenotypes with Female/Male Only Gene
+*Update: Should not appear anymore after 1.1 when used with current rjw versions*
+
Error:
When using a Xenotype with the Female only gene, upon refresh it can open the log with the following (red) statement:
diff --git a/README.md b/README.md
index d138b8a..f0a12ac 100644
--- a/README.md
+++ b/README.md
@@ -28,9 +28,14 @@ Please consider looking at [the known bugs](./KNOWN_BUGS.md)
I currently don't use Races after Biotech was introduced.
One of the main motivations was to have genes being added to the xenotypes that other mods and the base game add, e.g. adding demonic penis for impids.
-## Load Order / Deps
+Some HAR races change sex-ages and behave unfriendly with this mod.
+You can make reports about that, but I might not fix it.
-1. Please load this after any mod adding genes, and after the used RJW-Mods (Licentia, Sexperience).
-2. Should not be used with the original RJW_Animal_Gene_Inheritance anymore.
-3. There was an issue with other "Male-Only / Female-Only" Mods --- for which we provide our own Genes now.
-4. CAI5000 will not crash, but will make *Seduce*-Ability fail.
\ No newline at end of file
+## Load Order, Dependencies and Conflicts
+
+Please load this after any mod adding genes, and after the used RJW-Mods (Licentia, Sexperience).
+
+**Conflicts:**
+1. Should not be used with the original RJW_Animal_Gene_Inheritance anymore.
+2. There was an issue with other "Male-Only / Female-Only" Mods --- for which we provide our own Genes now.
+3. CAI5000 will not crash, but will make *Seduce*-Ability fail. I think same goes for Combat Extended.
\ No newline at end of file
diff --git a/Source/Genes/Breeding/PatchPawnExtensions.cs b/Source/Genes/Breeding/PatchPawnExtensions.cs
deleted file mode 100644
index be2e2dc..0000000
--- a/Source/Genes/Breeding/PatchPawnExtensions.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using HarmonyLib;
-using rjw;
-using Verse;
-
-namespace RJW_Genes
-{
- ///
- /// Kindly provided by 'shabalox' https://github.com/Shabalox/RJW_Genes_Addons/
- ///
- /// Note on the logic: the result mentioned below is changing the result of fertilization (true or false) to true if the pawn has the insect-breeder gene.
- ///
- [HarmonyPatch(typeof(PawnExtensions), "RaceImplantEggs")]
- public static class PatchPawnExtensions
- {
- [HarmonyPostfix]
- public static void Postfix(Pawn pawn, ref bool __result)
- {
- if (!__result)
- {
- __result = GeneUtility.IsInsectBreeder(pawn);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Source/Genes/ExtraGenitalia/Gene_FeaturelessChest.cs b/Source/Genes/ExtraGenitalia/Gene_FeaturelessChest.cs
new file mode 100644
index 0000000..8a93c51
--- /dev/null
+++ b/Source/Genes/ExtraGenitalia/Gene_FeaturelessChest.cs
@@ -0,0 +1,61 @@
+using Verse;
+using rjw;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class Gene_FeaturelessChest : RJW_Gene
+ {
+ internal Hediff removed_breasts;
+ internal Hediff added_nipples;
+ public override void PostMake()
+ {
+ base.PostMake();
+
+ if (removed_breasts == null)
+ {
+ RemoveButStoreBreasts();
+ AddFeaturelessBreast();
+ }
+ }
+
+ public override void PostAdd()
+ {
+ base.PostAdd();
+
+ if (removed_breasts == null)
+ {
+ RemoveButStoreBreasts();
+ AddFeaturelessBreast();
+ }
+ }
+
+ public override void PostRemove()
+ {
+ base.PostRemove();
+ if (added_nipples != null)
+ pawn.health.RemoveHediff(added_nipples);
+ if (removed_breasts != null)
+ pawn.health.AddHediff(removed_breasts);
+ }
+
+ internal void RemoveButStoreBreasts()
+ {
+ var partBPR = Genital_Helper.get_breastsBPR(pawn);
+ Hediff breastsToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaUtility.IsBreasts(x));
+
+ if (breastsToRemove != null)
+ {
+ removed_breasts = breastsToRemove;
+ pawn.health.RemoveHediff(breastsToRemove);
+ }
+ }
+
+ internal void AddFeaturelessBreast()
+ {
+ var partBPR = Genital_Helper.get_breastsBPR(pawn);
+ this.added_nipples = pawn.health.AddHediff(Genital_Helper.featureless_chest, partBPR);
+ }
+
+ }
+}
diff --git a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs
index ddc75a1..874ff5f 100644
--- a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs
+++ b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs
@@ -6,18 +6,15 @@ namespace RJW_Genes
{
public class Gene_NoBreasts : RJW_Gene
{
+ Hediff breastsToShrink;
+ internal float oldSize = -1f;
- internal Hediff removed_breasts;
-
- // TODO: This gene only works if another Gene was set specifying the genitalia.
- // If it is added later, it still works, but on creation it needs a different
- // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn. IDEA: Add male-nipples ?
public override void PostMake()
{
base.PostMake();
// Breasts are removed for female pawns!
- if (GenderUtility.IsFemale(pawn) && removed_breasts == null)
+ if (GenderUtility.IsFemale(pawn) && oldSize < 0)
{
RemoveButStoreBreasts();
}
@@ -28,7 +25,7 @@ namespace RJW_Genes
base.PostAdd();
// Breasts are removed for female pawns!
- if (GenderUtility.IsFemale(pawn) && removed_breasts == null)
+ if (GenderUtility.IsFemale(pawn) && oldSize < 0)
{
RemoveButStoreBreasts();
}
@@ -37,21 +34,33 @@ namespace RJW_Genes
public override void PostRemove()
{
base.PostRemove();
- if(removed_breasts != null)
- pawn.health.AddHediff(removed_breasts);
+ // Re-Add the old breasts
+ if (oldSize != null)
+ breastsToShrink.Severity = oldSize;
}
internal void RemoveButStoreBreasts()
{
var partBPR = Genital_Helper.get_breastsBPR(pawn);
- Hediff breastsToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaUtility.IsBreasts(x));
+ breastsToShrink = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaUtility.IsBreasts(x));
- if(breastsToRemove != null)
+ if(breastsToShrink != null)
{
- removed_breasts = breastsToRemove;
- pawn.health.RemoveHediff(breastsToRemove);
+ oldSize = breastsToShrink.Severity;
+ //pawn.health.RemoveHediff(breastsToRemove);
+ breastsToShrink.Severity = 0f;
}
}
+ /*
+ ///
+ /// Adds a "rjw.featurelesschest", which means nipples but nothing else (like male human pawns do).
+ ///
+ internal void AddFeaturelessBreast()
+ {
+ var partBPR = Genital_Helper.get_breastsBPR(pawn);
+ //this.added_nipples = pawn.health.AddHediff(Genital_Helper.featureless_chest, partBPR);
+ }
+ */
}
}
diff --git a/Source/Genes/GeneUtility.cs b/Source/Genes/GeneUtility.cs
index 66cfd74..a6361aa 100644
--- a/Source/Genes/GeneUtility.cs
+++ b/Source/Genes/GeneUtility.cs
@@ -43,7 +43,9 @@ namespace RJW_Genes
{
if (HasLifeForce(pawn))
{
- Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType();
+ Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType();
+ if (gene == null || !gene.Active)
+ return false;
if (gene.Resource.Value < gene.targetValue)
{
return true;
@@ -57,6 +59,8 @@ namespace RJW_Genes
if (HasLifeForce(pawn))
{
Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType();
+ if (gene == null || !gene.Active)
+ return false;
if (gene.Resource.Value < gene.MinLevelForAlert)
{
return true;
@@ -122,4 +126,27 @@ namespace RJW_Genes
public static bool IsCumEater(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_cum_eater); }
}
-}
\ No newline at end of file
+}
+
+/*
+Exception in Verse.AI.ThinkNode_Priority TryIssueJobPackage: System.NullReferenceException: Object reference not set to an instance of an object
+ at RJW_Genes.GeneUtility.HasLowLifeForce (Verse.Pawn pawn) [0x00014] in < 881b7541af8144a78a14c9dad08e43c7 >:0
+ at RJW_Genes.ThinkNode_ConditionalLowLifeForce.Satisfied(Verse.Pawn p) [0x00000] in < 881b7541af8144a78a14c9dad08e43c7 >:0
+ at Verse.AI.ThinkNode_Conditional.TryIssueJobPackage(Verse.Pawn pawn, Verse.AI.JobIssueParams jobParams) [0x00000] in < 38562b1a2ab64eacb931fb5df05ca994 >:0
+ at Verse.AI.ThinkNode_Priority.TryIssueJobPackage(Verse.Pawn pawn, Verse.AI.JobIssueParams jobParams) [0x00022] in < 38562b1a2ab64eacb931fb5df05ca994 >:0
+UnityEngine.StackTraceUtility:ExtractStackTrace()
+Verse.Log:Error(string)
+Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Verse.Pawn, Verse.AI.JobIssueParams)
+Verse.AI.ThinkNode_SubtreesByTag:TryIssueJobPackage(Verse.Pawn, Verse.AI.JobIssueParams)
+Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Verse.Pawn, Verse.AI.JobIssueParams)
+Verse.AI.Pawn_JobTracker:DetermineNextJob(Verse.ThinkTreeDef &)
+Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
+Verse.AI.Pawn_JobTracker:EndCurrentJob(Verse.AI.JobCondition, bool, bool)
+Verse.AI.Pawn_JobTracker:JobTrackerTick()
+Verse.Pawn:Tick()
+Verse.TickList:Tick()
+(wrapper dynamic - method) Verse.TickManager:Verse.TickManager.DoSingleTick_Patch2(Verse.TickManager)
+Verse.TickManager:TickManagerUpdate()
+Verse.Game:UpdatePlay()
+Verse.Root_Play:Update()
+*/
\ No newline at end of file
diff --git a/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs b/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs
new file mode 100644
index 0000000..af362aa
--- /dev/null
+++ b/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs
@@ -0,0 +1,81 @@
+using Verse;
+using RimWorld;
+using rjw;
+
+namespace RJW_Genes
+{
+ ///
+ /// The CocoonWeaver Ability applies the RJW-Cocoon to a pawn.
+ /// Friendly Pawns can always be cocooned, neutral and hostile pawns must be downed.
+ ///
+ public class CompAbilityEffect_CocoonWeaver : CompAbilityEffect
+ {
+ private new CompProperties_AbilityCocoonWeaver Props
+ {
+ get
+ {
+ return (CompProperties_AbilityCocoonWeaver)this.props;
+ }
+ }
+
+
+ public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
+ {
+ base.Apply(target, dest);
+
+ Pawn CocooningPawn = this.parent.pawn;
+ Pawn PawnToCocoon = target.Pawn;
+
+ // Error Case - Null Pawn
+ if (PawnToCocoon == null)
+ {
+ return;
+ }
+
+ PawnToCocoon.health.AddHediff(HediffDef.Named("RJW_Cocoon"));
+
+ }
+
+ ///
+ /// For validity, there are a few checks:
+ /// 0. Target is not already cocooned
+ /// 1. Target is either Colonist / Prisoner
+ /// 2. If the Target is an enemy or neutral, it must be downed.
+ ///
+ public override bool Valid(LocalTargetInfo target, bool throwMessages = false)
+ {
+ Pawn cocoonTarget = target.Pawn;
+ if (cocoonTarget != null)
+ {
+ bool CocoonTargetIsColonistOrPrisoner = cocoonTarget.Faction == this.parent.pawn.Faction || cocoonTarget.IsPrisonerOfColony;
+ bool CocoonTargetIsHostile = cocoonTarget.HostileTo(this.parent.pawn);
+ bool CocoonTargetIsDowned = cocoonTarget.Downed;
+
+ if (cocoonTarget.health.hediffSet.hediffs.Any(t => t.def.defName == "RJW_Cocoon"))
+ {
+ if (throwMessages)
+ Messages.Message(cocoonTarget.Name + " is already cocooned.", cocoonTarget, MessageTypeDefOf.RejectInput, false);
+ return false;
+ }
+
+ if (!CocoonTargetIsColonistOrPrisoner && !(CocoonTargetIsHostile && CocoonTargetIsDowned))
+ {
+ if (throwMessages)
+ {
+ if(CocoonTargetIsHostile && !CocoonTargetIsDowned)
+ {
+ Messages.Message(cocoonTarget.Name + " is hostile, but not downed.", cocoonTarget, MessageTypeDefOf.RejectInput, false);
+ }
+ else if (!CocoonTargetIsColonistOrPrisoner)
+ {
+ Messages.Message(cocoonTarget.Name + " is not a part of the colony or hostile.", cocoonTarget, MessageTypeDefOf.RejectInput, false);
+ }
+ }
+ return false;
+ }
+ }
+ return base.Valid(target, throwMessages);
+ }
+
+ }
+}
diff --git a/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs b/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs
new file mode 100644
index 0000000..e73d22d
--- /dev/null
+++ b/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Verse;
+using RimWorld;
+
+namespace RJW_Genes
+{
+ public class CompProperties_AbilityCocoonWeaver : CompProperties_AbilityEffect
+ {
+ public CompProperties_AbilityCocoonWeaver()
+ {
+ this.compClass = typeof(CompAbilityEffect_CocoonWeaver);
+ }
+ }
+}
diff --git a/Source/Genes/Life_Force/Abilities/CompAbilityEffect_CockEater.cs b/Source/Genes/Life_Force/Abilities/CompAbilityEffect_CockEater.cs
index dc0f0fa..977c77b 100644
--- a/Source/Genes/Life_Force/Abilities/CompAbilityEffect_CockEater.cs
+++ b/Source/Genes/Life_Force/Abilities/CompAbilityEffect_CockEater.cs
@@ -51,9 +51,9 @@ namespace RJW_Genes
}
// Increase LifeForce for Biter
GeneUtility.OffsetLifeForce(GeneUtility.GetLifeForceGene(CockBiter), gained_lifeforce);
-
// Handle Damage for Bitten
- CockBittenPawn.health.RemoveHediff(part);
+ CockBittenPawn.TakeDamage(new DamageInfo(DamageDefOf.Bite, 99999f, 999f, hitPart: Genital_Helper.get_genitalsBPR(CockBittenPawn)));
+ //CockBittenPawn.health.RemoveHediff(part);
CockBittenPawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.rjw_genes_cock_eaten, CockBittenPawn, null);
//Only one penis at the time
diff --git a/Source/Genes/Life_Force/UI/Alert_LowFertilin.cs b/Source/Genes/Life_Force/UI/Alert_LowFertilin.cs
index d76d4ce..09601de 100644
--- a/Source/Genes/Life_Force/UI/Alert_LowFertilin.cs
+++ b/Source/Genes/Life_Force/UI/Alert_LowFertilin.cs
@@ -42,7 +42,7 @@ namespace RJW_Genes
{
Pawn_GeneTracker genes = pawn.genes;
Gene_LifeForce gene_Lifeforce = (genes != null) ? genes.GetFirstGeneOfType() : null;
- if (gene_Lifeforce != null && gene_Lifeforce.Value < gene_Lifeforce.MinLevelForAlert)
+ if (gene_Lifeforce != null && gene_Lifeforce.Active && gene_Lifeforce.Value < gene_Lifeforce.MinLevelForAlert)
{
this.targets.Add(pawn);
this.targetLabels.Add(pawn.NameShortColored.Resolve());
diff --git a/Source/Genes/Special/Gene_Aphrodisiac_Pheromones.cs b/Source/Genes/Special/Gene_Aphrodisiac_Pheromones.cs
index e3628dc..875d1dd 100644
--- a/Source/Genes/Special/Gene_Aphrodisiac_Pheromones.cs
+++ b/Source/Genes/Special/Gene_Aphrodisiac_Pheromones.cs
@@ -39,9 +39,25 @@ namespace RJW_Genes
{
foreach (Pawn pawn in map.mapPawns.AllPawns)
{
- if (pawn != null && this.pawn != null && pawn != this.pawn
- && pos.DistanceTo(pawn.Position) < APHRODISIAC_DISTANCE && GenSight.LineOfSight(pos, pawn.Position, pawn.Map)
- && !GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_aphrodisiac_pheromones))
+ // Return for trivial errors
+ if (pawn == null || this.pawn == null || pawn == this.pawn)
+ continue;
+ // Check for position-existance
+ if (pawn.Position == null || pos == null || pawn.Map == null)
+ continue;
+ // Do nothing if pawn is carried
+ if (pawn.CarriedBy != null)
+ continue;
+ // Do nothing if Pawn is Baby or Child (#25)
+ if (!pawn.ageTracker.Adult)
+ continue;
+ // Do nothing for pawns that also have pheromones
+ if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_aphrodisiac_pheromones))
+ continue;
+
+ // Actual Logic:
+ // Pawn qualifies in right distance and needs line of sight.
+ if (pos.DistanceTo(pawn.Position) < APHRODISIAC_DISTANCE && GenSight.LineOfSight(pos, pawn.Position, pawn.Map))
{
yield return pawn;
}
diff --git a/Source/Genes/Special/Patch_AgeDrain.cs b/Source/Genes/Special/Patch_AgeDrain.cs
index 2c7e55d..4138a78 100644
--- a/Source/Genes/Special/Patch_AgeDrain.cs
+++ b/Source/Genes/Special/Patch_AgeDrain.cs
@@ -11,28 +11,33 @@ namespace RJW_Genes.Genes.Special
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public static class Patch_AgeDrain
{
+ /**
+ * Update Issue #26:
+ * There are options that a 16 yo pawn and a 16 yo pawn have sex,
+ * or there are races that have a different age-limits.
+ * I am not sure how I feel about this, but as some people that I consider "normal" asked me about this I changed it as requested in #26 and #28
+ */
const long AGE_TRANSFERED = 120000; // 120k == 2 days
- // 20 Years * 60 Days / Year * 60k Ticks/Day + 1 for safety
- const long MINIMUM_AGE = 20 * 60 * 60000 + 1;
+ // 18 Years * 60 Days / Year * 60k Ticks/Day + 1 for safety
+ const long MINIMUM_AGE = 18 * 60 * 60000 + 1;
- // Comment Below in for debugging, changes years
- // const long AGE_TRANSFERED = 12000000;
public static void Postfix(SexProps props)
{
if (props == null || props.pawn == null || props.partner == null || props.partner.IsAnimal() )
{
return;
}
- if (GeneUtility.IsAgeDrainer(props.pawn))
+ if (GeneUtility.IsAgeDrainer(props.pawn) && props.pawn.ageTracker.AgeBiologicalTicks > MINIMUM_AGE)
{
var pawnAge = props.pawn.ageTracker.AgeBiologicalTicks;
//ModLog.Error($"Firing Age Drain \nMinimum Age is \t{MINIMUM_AGE} \nPawn Age is \t{pawnAge} \nTransferred \t{AGE_TRANSFERED}\nResulting in \t{pawnAge - AGE_TRANSFERED}");
// Make Partner older
props.partner.ageTracker.AgeBiologicalTicks += AGE_TRANSFERED;
- // Make Pawn younger
- props.pawn.ageTracker.AgeBiologicalTicks = Math.Max(MINIMUM_AGE, (pawnAge - AGE_TRANSFERED));
+ // Make Pawn younger if he is older than minimum age
+ if (pawnAge - AGE_TRANSFERED > MINIMUM_AGE)
+ props.pawn.ageTracker.AgeBiologicalTicks = Math.Max(MINIMUM_AGE, (pawnAge - AGE_TRANSFERED));
}
}
diff --git a/Source/Genes/Special/Patch_Youth_Fountain.cs b/Source/Genes/Special/Patch_Youth_Fountain.cs
index a1a1840..bc07f1b 100644
--- a/Source/Genes/Special/Patch_Youth_Fountain.cs
+++ b/Source/Genes/Special/Patch_Youth_Fountain.cs
@@ -11,34 +11,33 @@ namespace RJW_Genes.Genes.Special
[HarmonyPatch(typeof(SexUtility), "Aftersex")]
public static class Patch_Youth_Fountain
{
+ /**
+ * Update Issue #26:
+ * There are options that a 16 yo pawn and a 16 yo pawn have sex,
+ * or there are races that have a different age-limits.
+ * I am not sure how I feel about this, but as some people that I consider "normal" asked me about this I changed it as requested in #26 and #28
+ */
const long AGE_REDUCTION = 60000; // 60k == 1 day
- // 20 Years * 60 Days / Year * 60k Ticks/Day + 1 for safety
- const long MINIMUM_AGE = 20 * 60 * 60000 + 1;
+ // 18 Years * 60 Days / Year * 60k Ticks/Day + 1 for safety
+ const long MINIMUM_AGE = 18 * 60 * 60000 + 1;
- // Comment Below in for debugging
- // const long AGE_REDUCTION = 6000000; // 6000k == 100 days
public static void Postfix(SexProps props)
{
if (props == null || props.pawn == null || props.partner == null || props.partner.IsAnimal())
{
return;
}
- if (GeneUtility.IsYouthFountain(props.pawn))
+ if (GeneUtility.IsYouthFountain(props.pawn) && props.pawn.ageTracker.AgeBiologicalTicks >= MINIMUM_AGE)
{
var partnerAge = props.partner.ageTracker.AgeBiologicalTicks;
- //ModLog.Error($"Firing Youth Fountain \nMinimum Age is \t{MINIMUM_AGE}\t{ticksToYears(MINIMUM_AGE)}y\nPawn Age is \t{partnerAge}\t{ticksToYears(partnerAge)}y \nTransferred \t {AGE_REDUCTION}\t{ticksToYears(AGE_REDUCTION)}y\nResulting in \t{partnerAge - AGE_REDUCTION}\t{ticksToYears(partnerAge - AGE_REDUCTION)}y");
-
- props.partner.ageTracker.AgeBiologicalTicks = Math.Max(MINIMUM_AGE, partnerAge - AGE_REDUCTION);
+ if(partnerAge - AGE_REDUCTION > MINIMUM_AGE)
+ props.partner.ageTracker.AgeBiologicalTicks = Math.Max(MINIMUM_AGE, partnerAge - AGE_REDUCTION);
}
}
- private static float ticksToYears(long ticks)
- {
- return (ticks / 60000f) / 60f;
- }
}
}
diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj
index 96bc6f5..dbb4495 100644
--- a/Source/Rjw-Genes.csproj
+++ b/Source/Rjw-Genes.csproj
@@ -44,7 +44,6 @@
-
@@ -59,6 +58,7 @@
+
@@ -87,6 +87,8 @@
+
+
diff --git a/TODOS.md b/TODOS.md
index 66083a5..7e223a1 100644
--- a/TODOS.md
+++ b/TODOS.md
@@ -1,7 +1,6 @@
# ToDos and Planned Genes
-I have many ideas but not too much time / knowledge of Rimworld or Modding.
-So any help is very appreciated, even if it is just pointing me to existing similar projects.
+Any help is very appreciated, even if it is just pointing me to existing similar projects.
## Additions to existing things
@@ -21,6 +20,34 @@ So any help is very appreciated, even if it is just pointing me to existing simi
**Self-Fertilizing Eggs** Pawns fertilize eggs that are put inside them (with themselves as a parent)
+**Death-Rest** until the pawn is cumflated.
+
+**Alpha / Beta Genes** that you can only have one alpha, and the alpha makes mostly beta children (1:10). This might fit with the xenotypes below. As this is an RJW mod, this should also somewhat affect sex (e.g. betas cannot impregnate betas).
+
+## Planned Xenotypes
+
+**Beastmaster:**
+
+- [] Animal Mating Call (Get fucked by everything nearby, potentially ending animal rage)
+- [] Pheromone Spit that marks a target for being raped by animals
+- [] Power-Boost & Bonding to animals through zoophilia
+- [] Maybe: Boost pregnancy times of Animals
+- [] Maybe: Make it Animal-Fertilin-Dependend
+- [] Either: Can only eat meat or cannot eat meat
+
+Can't help but think about Rexxar Porn now I am a bad person.
+
+**Hive Mother:**
+
+- [] Spawn the small scarabs
+- [] Fertilise Eggs inside her
+- [] Produce cocoons
+- [] Maybe: Insert "dropped" Insect eggs
+- [] Very fragile, no use except breeding
+- [] Maybe: can only eat insect jelly
+- [] Should look like a nice green-yellow alien as we all know fuckable insects would look like.
+- [] There can only be one Hive Mother, some penalties if there are others. This could be implement with an "Alpha Gene" that gives heavy penalties when other Alpha exists.
+
## 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:
@@ -28,4 +55,9 @@ There were some suggestions on the Discord I saved them somewhere else. I am far
- Genitalia deal damage as per size (on normal sex-use)
- Genitalia can cause Terror (as ability)
- Cumshot Sniper Abilities
-- Healing Pussy
\ No newline at end of file
+
+## Cleanups:
+
+- Streamline Filenames / Names to either be LifeForce or Fertilin (e.g. `Hediffs_Fertilin.xml` but `Pawnkind_LifeForce.xml`). I think most things are called LifeForce.
+- Similar cleanup for the patches, and make a note what to find where in the patches
+- Change Project structure to the 1.3, 1.4 Structure of other mods
\ No newline at end of file