diff --git a/.gitignore b/.gitignore index bd55167..971fc41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ +*.user + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. - # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs @@ -253,4 +254,4 @@ paket-files/ # Python Tools for Visual Studio (PTVS) __pycache__/ -*.pyc \ No newline at end of file +*.pyc diff --git a/About/About.xml b/About/About.xml index de6326a..c0ac3e5 100644 --- a/About/About.xml +++ b/About/About.xml @@ -3,7 +3,7 @@ Vegapnk Vegapnk.rjw.genes -
  • 1.4
  • +
  • 1.5
  • Adds Genes for RJW Content https://steamcommunity.com/id/Vegapnk/myworkshopfiles/?appid=294100 diff --git a/About/Manifest.xml b/About/Manifest.xml index 522aa5e..2589c5d 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW-Genes - 1.3.1 + 2.0.0
  • RimJobWorld
  • HugsLib
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aceb43..6baf611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,50 @@ +# 2.0.0 + +**Summary**: + +- 1.5 Support +- Femboys, MPReg +- Couple Implants around Fertility / Sex / Pregnancy +- Hive Removal (to be reintroduced somewhere else) +- Licentia Genes became placeholders, no functions until Licentia is on 1.5 + +**Additions**: + +- initial Rimworld 1.5 thanks to @jaaldabaoth +- Fertile Anus Gene, thanks to @jaaldabaoth +- Femboy Genes, for male pawns with Vaginas @jaaldabaoth +- Udder Gene @jaaldabaoth , Fixes #57 +- Some other Genitalia Sets (Crocodilian, Racoon, ...) thanks to @jaaldabaoth, Closes #57 +- LitteredBirthsGene thanks to @jaaldabaoth +- OvaryAgitator that allows for a cyclic fertility. Thanks @jaaldabaoth. See [its description](./Common/Defs/ThingDefs/OvaryAgitator.xml) +- LimbicStimulator / Scrambler thanks to @jaaldabaoth. See [Scrambler Description](Common/Defs/ThingDefs/Scrambler.xml) and [Limbic Stimulator](./Common/Defs/ThingDefs/LimbicStimulator.xml) +- Bioscaffold that allows for faster pregnancies. thanks to @jaaldabaoth. See [its description](./Common/Defs/ThingDefs/Bioscaffold.xml) +- Multi-Pregnancy Gene thanks to @jaaldabaoth +- Many genes have settings configurable in their xml - tick speeds and distances. + +**Changes**: + +- Modularised many "change gentialia sets"-genes into a XML configurations. Thanks to @flock-of-birds +- **Removed** Hive Logic for now! This might break some of your save-games. +- Highmates "Initiate Loving" uses Succubus "Seduce" ability, thanks to @jaaldabaoth +- Slider for Evergrowth Tick-Speed, thanks to @jaaldabaoth +- Resizing Age for resizing Genes can be set in Settings @jaaldabaoth +- **Licentia related genes are only placeholders**, as Licentia is not 1.5 yet +- InsectIncubator only does self-fertilization now, but does not increase storage capacities for eggs anymore +- Some Genes (GenitaliaTypes, Cum, some others) cannot be in quest-rewards anymore. Special, Size, Breeding and Lifeforce genes still can be quest rewards. + +**Fixes:** + +- Small changes to drawing Succubus Wings +- Minor Format changes to lots of XML files +- Pawns with ONLY an Archotech penis will not give Fertilin, and will not receive debuffs (Fixes #71) + +**Hidden Changes:** + +- Patches for "Same Mother" / "Same Father" to account for Male-Pregs. This should only extend behaviour but be warned a bit. +- Patches to RJW-Pregnancy Helper to account for Male Pregs. +- Some replacements from `hasGene` to `hasActiveGene` + # 1.3.3 **Fixes:** diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 486a3b9..b596a24 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,8 @@ But please consider also the following: - Shabalox (MechBreeding, InsectBreeding, Animal Gene Inheritance) - WasMachenDennSachen (Various Icons) +- Jaaldabaoth (1.5 Migration, MPreg, Femboys) +- Flock-of-Birds (Cosmetic Genitalia per XML) ## Other Credits diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index 6152493..fac437a 100644 Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ diff --git a/Common/Defs/AbilityDefs/Ability_Seduce.xml b/Common/Defs/AbilityDefs/Ability_Seduce.xml index d4467e6..620be2b 100644 --- a/Common/Defs/AbilityDefs/Ability_Seduce.xml +++ b/Common/Defs/AbilityDefs/Ability_Seduce.xml @@ -40,4 +40,5 @@ + \ No newline at end of file diff --git a/Common/Defs/AbilityDefs/Ability_SpawnSpelopede.xml b/Common/Defs/AbilityDefs/Ability_SpawnSpelopede.xml deleted file mode 100644 index 7279149..0000000 --- a/Common/Defs/AbilityDefs/Ability_SpawnSpelopede.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - rjw_genes_ability_spawn_spelopede - - Generates a tame spelopede, ready to serve their master. - Genes/Icons/Spelopede_Dispenser - true - false - - - Verb_CastAbility - 3 - False - False - 2 - - False - True - - - - False - 1800000 - - -
  • - RJW_Genes.CompAbilityEffect_SpawnSpelopede - Spelopede - true - 1.00 -
  • -
    -
    - -
    \ No newline at end of file diff --git a/Common/Defs/Effects/cocoonweave.xml b/Common/Defs/Effects/cocoonweave.xml index 945e631..573ccd2 100644 --- a/Common/Defs/Effects/cocoonweave.xml +++ b/Common/Defs/Effects/cocoonweave.xml @@ -1,6 +1,6 @@ - + CocoonWeave diff --git a/Common/Defs/GeneDefs/GeneCategories.xml b/Common/Defs/GeneDefs/GeneCategories.xml index 8106c8e..ecce35f 100644 --- a/Common/Defs/GeneDefs/GeneCategories.xml +++ b/Common/Defs/GeneDefs/GeneCategories.xml @@ -21,7 +21,7 @@ rjw_genes_genitalia_type - + 19 @@ -67,11 +67,5 @@ 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 aadecc9..6d16ee6 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Breeding.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Breeding.xml @@ -2,28 +2,31 @@ - + + rjw_genes_breeding + + +
  • + Genes/Icons/RJW_Genes_Endogene_Background + Genes/Icons/RJW_Genes_Xenogene_Background +
  • +
    +
    + + + rjw_genes_mechbreeder Pawns with this gene are able to birth mechanoids unharmed. World/WorldObjects/Expanding/Mechanoids 51 - rjw_genes_breeding 1 -1 - - -
  • - Genes/Icons/RJW_Genes_Endogene_Background - Genes/Icons/RJW_Genes_Xenogene_Background -
  • -
    - + rjw_genes_zoophile - rjw_genes_breeding Xenotypes with this Gene are Zoophile. Genes/Icons/Zoophile 54 @@ -32,13 +35,46 @@ Zoophile + + + + rjw_genes_fertile_anus + + Xenotypes with this gene have a functional uterus connected to the anal cavity even for males + Genes/Icons/Fertile_anus + 54 + - -
  • - Genes/Icons/RJW_Genes_Endogene_Background - Genes/Icons/RJW_Genes_Xenogene_Background -
  • -
    + + rjw_genes_insectincubator + + RJW_Genes.Gene_InsectIncubator + Pawns with this gene fertilize insect eggs that are placed inside them. + Genes/Icons/Egg + 52 + 1 + -1 + + + + rjw_genes_insectbreeder + + Pawns with this gene are able to fertilize eggs with any fertile penis. + Genes/Icons/Insect_Breeder + 53 + 1 + -1 + + + + rjw_genes_fervent_ovipositor + + RJW_Genes.Gene_FerventOvipositor + Pawns that have a female (egg producing) ovipositor produce eggs at drastically increased speed. + Genes/Icons/Fervent_Ovipositor + 55 + 1 + -1
    \ No newline at end of file diff --git a/Common/Defs/GeneDefs/GeneDefs_Cosmetic.xml b/Common/Defs/GeneDefs/GeneDefs_Cosmetic.xml index 6767e77..cfe7024 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Cosmetic.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Cosmetic.xml @@ -6,9 +6,6 @@
  • Wing
  • - - Tailbone - @@ -26,14 +23,25 @@ 1 -1 - - Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings - Skin - 2 - (0.0, 0.01, -0.1) - (0.0, 0.0, -0.1) - (0.1, 0.0, 0.0) - + 0 + +
  • + PawnRenderNodeWorker_AttachmentBody + Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings + 1.5 + Body + Skin + + + -2 + + true + + 90 + + +
  • +
  • @@ -53,19 +61,41 @@
  • Manipulation - 0.05 + 0.05
  • 1 -1 - - Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail - Skin - 2 - (0, 0.2, -0.1) - (0, -0.1, 0.1) - (0.2, 0.2, 0.1) - + 0 + +
  • + PawnRenderNodeWorker_AttachmentBody + Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail + (1.5, 1.5) + Body + Skin + Fresh, Rotting + + true + + -2 + + + (0, 0, -0.15) + 90 + + + (-0, 0, -0.15) + + + (-0.2, 0, -0.15) + + + (0.2, 0, -0.15) + + +
  • +
    true diff --git a/Common/Defs/GeneDefs/GeneDefs_Cum.xml b/Common/Defs/GeneDefs/GeneDefs_Cum.xml index 28b841a..c031645 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Cum.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Cum.xml @@ -5,7 +5,7 @@
  • CumAmount
  • - + false
  • Genes/Icons/RJW_Genes_Endogene_Background diff --git a/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml b/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml index 294dc66..c9d3c17 100644 --- a/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml +++ b/Common/Defs/GeneDefs/GeneDefs_ExtraGenitalia.xml @@ -3,6 +3,7 @@ rjw_genes_genitalia_extras + false
  • Genes/Icons/RJW_Genes_Endogene_Background @@ -122,6 +123,19 @@ + + rjw_genes_femboy + + Males with this gene are considered female despite having a penis + Genes/Icons/Futa + RJW_Genes.Gene_Femboy + 709 + +
  • PenisAmount
  • +
  • VaginaAmount
  • + +
    + rjw_genes_featureless_chest @@ -133,13 +147,11 @@
  • BreastAmount
  • - - \ No newline at end of file + + diff --git a/Common/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml b/Common/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml index 4c27701..6d173b9 100644 --- a/Common/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml +++ b/Common/Defs/GeneDefs/GeneDefs_GenitaliaTypes.xml @@ -3,9 +3,11 @@ rjw_genes_genitalia_type + RJW_Genes.Gene_GenitaliaType
  • GenitalType
  • + false 0 @@ -21,7 +23,28 @@ Carriers of this gene develop equine genitalia. Genes/Icons/Genitalia_Equine - RJW_Genes.Gene_EquineGenitalia + +
  • + HorsePenis + HorseVagina + GenericAnus +
  • +
    + 802 +
    + + + rjw_genes_human_genitalia + + Carriers of this gene develop human genitalia. + Genes/Icons/Genitalia_human + +
  • + Penis + Vagina + Anus +
  • +
    802
    @@ -30,7 +53,13 @@ Carriers of this gene develop canine genitalia. Genes/Icons/Genitalia_Canine - RJW_Genes.Gene_CanineGenitalia + +
  • + DogPenis + DogVagina + GenericAnus +
  • +
    803 @@ -39,7 +68,13 @@ Carriers of this gene develop feline genitalia. Genes/Icons/Genitalia_Feline - RJW_Genes.Gene_FelineGenitalia + +
  • + CatPenis + CatVagina + GenericAnus +
  • +
    804 @@ -48,7 +83,13 @@ Carriers of this gene have demonic genitalia. Genes/Icons/Genitalia_Demon - RJW_Genes.Gene_DemonicGenitalia + +
  • + DemonPenis + DemonVagina + DemonAnus +
  • +
    805 @@ -57,7 +98,13 @@ Carriers of this gene develop dragon genitalia. Genes/Icons/Genitalia_Draconic - RJW_Genes.Gene_DragonGenitalia + +
  • + DragonPenis + DragonVagina + GenericAnus +
  • +
    806 @@ -66,16 +113,196 @@ Carriers of this gene have slime genitalia. Genes/Icons/Slime_Genitalia - RJW_Genes.Gene_SlimeGenitalia + +
  • + SlimeTentacles + SlimeVagina + SlimeAnus +
  • +
    807 + + + rjw_genes_demonicT_genitalia + + Carriers of this gene have demonic tentacle genitalia. + Genes/Icons/Genitalia_tentacle_icon + +
  • + DemonTentaclePenis + DemonVagina + DemonAnus +
  • +
    + 807 +
    + + + rjw_genes_crocodilian_genitalia + + Carriers of this gene have crocodilian genitalia. + Genes/Icons/Genitalia_croc_icon + +
  • + CrocodilianPenis +
  • +
    + 807 +
    + + + rjw_genes_racoon_genitalia + + Carriers of this gene have racoon genitalia. + Genes/Icons/Genitalia_racoon_icon + +
  • + RaccoonPenis +
  • +
    + 807 +
    + + + rjw_genes_reptilian_genitalia + + Carriers of this gene have reptilian genitalia. + Genes/Icons/Genitalia_hemi_icon + +
  • + HemiPenis +
  • +
    + 807 +
    + + + + + + + rjw_genes_Ghost_genitalia + + Carriers of this gene have ghost genitalia. + Genes/Icons/Genitalia_ghost_icon + +
  • + GhostPenis + GhostVagina +
  • +
    + 807 +
    + + + rjw_genes_Golem_genitalia + + Carriers of this gene have rocky golem genitalia. + Genes/Icons/penis_rock_icon + +
  • + GolemPenis +
  • +
    + 807 +
    + + + rjw_genes_Marine_genitalia + + Carriers of this gene have marine mammal like genitalia. + Genes/Icons/Genitalia_marine_icon + +
  • + MarinePenis +
  • +
    + 807 +
    + + + rjw_genes_Necro_genitalia + + Carriers of this gene have necrotic undead genitalia. + Genes/Icons/Genitalia_necro_icon + +
  • + NecroPenis +
  • +
    + 807 +
    + + + rjw_genes_Needle_genitalia + + Carriers of this gene have very thin genitalia. + Genes/Icons/Genitalia_thin_icon + +
  • + NeedlePenis + NarrowVagina +
  • +
    + 807 +
    + + + rjw_genes_Orc_genitalia + + Carriers of this gene have orc genitalia. + Genes/Icons/Genitalia_orc_icon + +
  • + OrcPenis +
  • +
    + 807 +
    + + + rjw_genes_Pig_genitalia + + Carriers of this gene have screw genitalia. + Genes/Icons/Genitalia_screw_icon + +
  • + PigPenis +
  • +
    +
    + + + rjw_genes_Tentacle_genitalia + + Carriers of this gene have alien genitalia. + Genes/Icons/Genitalia_alien_icon + +
  • + TentaclePenis +
  • +
    + 807 +
    + + + + + rjw_genes_ovipositor_genitalia Carriers of this gene have ovipositors similar to insects. Genes/Icons/Ovipositor_Genitalia - RJW_Genes.Gene_OvipositorGenitalia + +
  • + OvipositorM + OvipositorF + InsectAnus +
  • +
    808 diff --git a/Common/Defs/GeneDefs/GeneDefs_Hive.xml b/Common/Defs/GeneDefs/GeneDefs_Hive.xml deleted file mode 100644 index e4a747d..0000000 --- a/Common/Defs/GeneDefs/GeneDefs_Hive.xml +++ /dev/null @@ -1,214 +0,0 @@ - - - - - rjw_genes_hive - - -
  • - Genes/Icons/RJW_Genes_Endogene_Background - Genes/Icons/RJW_Genes_Xenogene_Background -
  • -
    -
    - - - rjw_genes_queen - - queen - This gene represents the royal caste amongst its xenotype. Children of a queen are usually born as sterile workers, unless the father was a drone. Having multiple (adult) queens leads to intense rivalry and can throw the whole colony into chaos! - Genes/Icons/Queen - 1 - - - 0.5 - 0.25 - - - - -
  • - - 0.7 - - - -0.5 - -
  • -
  • - - 0.4 - 0.2 - -
  • -
    - - -
  • rjw_genes_hive_caste
  • -
  • rjw_genes_swearing_loyalty
  • -
    - - 7 - -3 -
    - - - rjw_genes_drone - - drone - This gene represents the drone caste amongst its xenotype. Drones are highly specialised experts that ensure the hives functioning. Other than that, drones are the only xenotypes capable of producing fertile offspring with a queen. - Genes/Icons/Drone - 2 - - -
  • rjw_genes_hive_caste
  • -
    - - -
  • - - 0.9 - - - -0.1 - -
  • -
    - - 4 - -2 -
    - - - - rjw_genes_worker - - worker - This gene marks the lowest caste of a hive, the workers. Usually sterile, they are despised by higher castes and only live to serve with labour. - Genes/Icons/Worker - 3 - - -
  • rjw_genes_hive_caste
  • -
    - - -
  • - - 0.7 - - - -0.5 - -
  • -
  • - - 0.7 - - - -0.5 - -
  • -
  • - - 1.2 - 1.2 - -
  • -
    - - 1 - 0 -
    - - - rjw_genes_zealous_loyalty - - loyalty - Carriers of this gene are genetically wired to worship carriers of the 'Queen'-gene. They receive a massive relation-ship bonus towards the queen and a slight mood bonus. Having multiple queens in the colony causes severe distress. - Genes/Icons/Loyalty - 10 - - -
  • rjw_genes_swearing_loyalty
  • -
    - - 1 - -1 - - -
  • - Genes/Icons/RJW_Genes_Endogene_Background - Genes/Icons/RJW_Genes_Xenogene_Background -
  • -
    -
    - - - rjw_genes_cocoonweaver - - cocooner - Carriers of this gene can produce a cocoon to prepare helpless (or willing) victims for breeding. - Genes/Icons/Cocoon - 11 - -
  • rjw_genes_ability_cocoonweaver
  • -
    - - rjw_genes_ability_cocoonweaver - - 1 - -1 -
    - - - rjw_genes_spawn_spelopede - - spelopede - Carriers of this gene can generate tame spelopedes. Higher psychic-sensitivity will spawn more spelopedes. - Genes/Icons/Spelopede_Dispenser - 12 - -
  • rjw_genes_ability_spawn_spelopede
  • -
    - - rjw_genes_ability_spawn_spelopede - - 1 - -1 -
    - - - - rjw_genes_insectincubator - - RJW_Genes.Gene_InsectIncubator - Pawns with this gene are able to hold more insect eggs. - Genes/Icons/Egg - 52 - 1 - -1 - - - - rjw_genes_insectbreeder - - Pawns with this gene are able to fertilize eggs with any fertile penis. - Genes/Icons/Insect_Breeder - 53 - 1 - -1 - - - - rjw_genes_fervent_ovipositor - - RJW_Genes.Gene_FerventOvipositor - Pawns that have a female (egg producing) ovipositor produce eggs at drastically increased speed. - Genes/Icons/Fervent_Ovipositor - 55 - 1 - -1 - - -
    \ No newline at end of file diff --git a/Common/Defs/GeneDefs/GeneDefs_Reproduction.xml b/Common/Defs/GeneDefs/GeneDefs_Reproduction.xml index 12eafe5..3dbc43e 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Reproduction.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Reproduction.xml @@ -14,6 +14,7 @@ + false
  • Genes/Icons/RJW_Genes_Endogene_Background @@ -36,6 +37,54 @@
  • + false + +
  • + Genes/Icons/RJW_Genes_Endogene_Background + Genes/Icons/RJW_Genes_Xenogene_Background +
  • +
    +
    + + + + + rjw_genes_masochist + + Reproduction + Xenotypes with this Gene are Masochists. + Genes/Icons/Rape + 1 + 2 + +
  • + Masochist +
  • +
    + + false
  • Genes/Icons/RJW_Genes_Endogene_Background @@ -61,6 +110,7 @@
  • rjw_genes_sexual_orientation
  • + false
  • Genes/Icons/RJW_Genes_Endogene_Background @@ -86,6 +136,7 @@
  • rjw_genes_sexual_orientation
  • + false
  • Genes/Icons/RJW_Genes_Endogene_Background @@ -107,6 +158,7 @@ -1 2 + false
  • rjw_genes_sexual_orientation
  • @@ -118,5 +170,17 @@
    + + + LitteredBirths + + Reproduction + Female carriers of this gene birth litters instead of just one baby, with a chance of having two to four babies per pregnancy. + Genes/Icons/Gene_LitteredBirths + 110 + 1.10 + -2 + 1 + \ No newline at end of file diff --git a/Common/Defs/GeneDefs/GeneDefs_SexSpecial.xml b/Common/Defs/GeneDefs/GeneDefs_SexSpecial.xml index c3c042f..6cd34be 100644 --- a/Common/Defs/GeneDefs/GeneDefs_SexSpecial.xml +++ b/Common/Defs/GeneDefs/GeneDefs_SexSpecial.xml @@ -109,4 +109,21 @@ + + rjw_genes_cocoonweaver + + cocooner + Carriers of this gene can produce a cocoon to prepare helpless (or willing) victims for breeding. + Genes/Icons/Cocoon + 11 + +
  • rjw_genes_ability_cocoonweaver
  • +
    + + rjw_genes_ability_cocoonweaver + + 1 + -1 +
    + \ No newline at end of file diff --git a/Common/Defs/GeneDefs/Xenotype_Hive.xml b/Common/Defs/GeneDefs/Xenotype_Hive.xml deleted file mode 100644 index bca30ab..0000000 --- a/Common/Defs/GeneDefs/Xenotype_Hive.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - rjw_genes_halamyr_queen_xenotype - - Genes/Icons/Xenotypes/Xenotype-Queen - false - false - - The Halamyr are a race of insect-xenotypes living in a caste-system. On top of the caste, the queens are the centerpiece of any hive. They are the only Halamyr that can produce drones, or mass-produce workers. A hive can virtually not live without a queen - without their royalty the drones and workers are irritated and receive sever penalties. Queens are very fragile and need to be kept safe and in best conditions. - The fragile queens of the Halamyr are the center of the hives reproduction. Multiple queens, or and absence of a queen, can cause to fall the best hive into disarray real quick. - - -
  • AG_LargerBodySize
  • -
  • AG_InsectBlood
  • -
  • AG_InsectJellyProduction
  • -
  • AG_SurvivalInstinct_Low
  • -
  • WoundHealing_Slow
  • -
  • PsychicAbility_Extreme
  • -
  • MoveSpeed_Slow
  • -
  • FireTerror
  • -
  • MeleeDamage_Weak
  • -
  • Sleepy
  • -
  • Delicate
  • -
  • rjw_genes_hypersexual
  • -
  • rjw_genes_bisexual
  • -
  • Libido_High
  • -
  • Beauty_Beautiful
  • -
  • AG_OutwardsAntennas
  • -
  • Skin_DeepRed
  • -
  • Learning_Fast
  • -
  • rjw_genes_fervent_ovipositor
  • -
  • AptitudeTerrible_Shooting
  • -
  • AptitudeTerrible_Melee
  • -
  • AptitudeRemarkable_Social
  • -
  • AptitudeRemarkable_Sex
  • -
  • rjw_genes_female_only
  • -
  • rjw_genes_ovipositor_genitalia
  • -
  • rjw_genes_aphrodisiac_pheromones
  • -
  • rjw_genes_queen
  • -
  • rjw_genes_cocoonweaver
  • -
  • rjw_genes_spawn_spelopede
  • -
    -
    - - - rjw_genes_halamyr_hiveguard_xenotype - - Genes/Icons/Xenotypes/Xenotype-Guard - - 1.5 - false - - The Halamyr hiveguards are the bastion to protect the hive. Next to the walls, these meele specialists form the ultimate guard for the queen, for which they'd give their lifes. Their tuned bodies come with a price, crippling them for social interactions and increased hunger. - Frontline of the Halamyr, guards of the hive, specialised in meele combat. Heavily handicapped without a queen. - - -
  • AG_InsectBlood
  • -
  • AG_EfficientMandibles
  • -
  • Immunity_Strong
  • -
  • WoundHealing_Fast
  • -
  • MoveSpeed_Quick
  • -
  • FireTerror
  • -
  • MeleeDamage_Strong
  • -
  • KillThirst
  • -
  • LowSleep
  • -
  • AG_WaspWings
  • -
  • Hair_ShortOnly
  • -
  • AG_DownwardsAntennas
  • -
  • Hair_DarkBlack
  • -
  • Skin_DeepRed
  • -
  • AG_FeraliskEyes
  • -
  • AptitudeTerrible_Shooting
  • -
  • AptitudeRemarkable_Melee
  • -
  • AptitudePoor_Construction
  • -
  • AptitudePoor_Cooking
  • -
  • AptitudePoor_Plants
  • -
  • AptitudePoor_Crafting
  • -
  • AptitudeTerrible_Artistic
  • -
  • AptitudeTerrible_Medicine
  • -
  • AptitudePoor_Social
  • -
  • rjw_genes_male_only
  • -
  • rjw_genes_ovipositor_genitalia
  • -
  • rjw_genes_drone
  • -
  • rjw_genes_zealous_loyalty
  • -
    -
    - - - rjw_genes_halamyr_breeder_xenotype - - Genes/Icons/Xenotypes/Xenotype-Breeder - false - false - 0.8 - - The Halamyr breeders are the backbone of the hive. Their special genes allow them to carry more eggs and hatch them faster, enabling a steady output of hivelings. To support their position in the hive, breeders spend most of their life in the queens cocoon, a task which they gladly accept. - Made for incubating Halamyr eggs, breeders spend most of their life in the queens cocoon. - - -
  • AG_Spinnerets
  • -
  • AG_InsectBlood
  • -
  • AG_InsectJellyProduction
  • -
  • AG_FormicAntennas
  • -
  • Fertile
  • -
  • AG_FastGestation
  • -
  • FireTerror
  • -
  • VerySleepy
  • -
  • rjw_genes_bisexual
  • -
  • Skin_DeepRed
  • -
  • AptitudeStrong_Social
  • -
  • rjw_genes_drone
  • -
  • rjw_genes_female_only
  • -
  • rjw_genes_zealous_loyalty
  • -
  • rjw_genes_insectincubator
  • -
  • rjw_genes_zoophile
  • -
  • rjw_genes_no_vagina
  • -
    -
    - -
    \ No newline at end of file diff --git a/Common/Defs/HediffDefs/Bioscaffold.xml b/Common/Defs/HediffDefs/Bioscaffold.xml new file mode 100644 index 0000000..0b94e23 --- /dev/null +++ b/Common/Defs/HediffDefs/Bioscaffold.xml @@ -0,0 +1,21 @@ + + + + + Bioscaffold + HediffWithComps + + This woman has an bioscaffold mesh within her womb, providing an enriching environment for an unborn baby to grow more quickly. + + Bioscaffold + + 0.001 + false + + + \ No newline at end of file diff --git a/Common/Defs/HediffDefs/LimbicStimulator.xml b/Common/Defs/HediffDefs/LimbicStimulator.xml new file mode 100644 index 0000000..e3073fd --- /dev/null +++ b/Common/Defs/HediffDefs/LimbicStimulator.xml @@ -0,0 +1,23 @@ + + + + LimbicStimulator + HediffWithComps + + limbic stimulator + An installed limbic stimulator. + + Scrambler + + (1.0, 0.6, 0.7) + +
  • + 0 + + -1.0 + 6.0 + +
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/HediffDefs/OvaryAgitator.xml b/Common/Defs/HediffDefs/OvaryAgitator.xml new file mode 100644 index 0000000..916b122 --- /dev/null +++ b/Common/Defs/HediffDefs/OvaryAgitator.xml @@ -0,0 +1,119 @@ + + + + + OvaryAgitator + + An installed ovary agitator. + + OvaryAgitator + + HediffWithComps + 0.0001 + +
  • + +
  • + RJW_Fertility + 0.50 +
  • + + +
  • + 0.1 + +
  • + RJW_Fertility + 0.22 +
  • + + +
  • + 0.2 + +
  • + RJW_Fertility + 0 +
  • + + +
  • + 0.3 + +
  • + RJW_Fertility + -0.17 +
  • + + +
  • + 0.4 + +
  • + RJW_Fertility + -0.32 +
  • + + +
  • + 0.5 + +
  • + RJW_Fertility + -0.48 +
  • + + +
  • + 0.6 + +
  • + RJW_Fertility + -0.54 +
  • + + +
  • + 0.7 + +
  • + RJW_Fertility + -0.63 +
  • + + +
  • + 0.8 + +
  • + RJW_Fertility + -0.69 +
  • + + +
  • + 0.9 + +
  • + RJW_Fertility + -0.75 +
  • + + +
  • + 1 + +
  • + RJW_Fertility + -100 +
  • + + +
    + +
  • + 0.0045 +
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/HediffDefs/Scrambler.xml b/Common/Defs/HediffDefs/Scrambler.xml new file mode 100644 index 0000000..5db5c4a --- /dev/null +++ b/Common/Defs/HediffDefs/Scrambler.xml @@ -0,0 +1,32 @@ + + + + Scrambler + + scrambler + An installed scrambler. + + Scrambler + + (0.9, 0.5, 1.0) + +
  • + 0 + + 0.40 + 3.0 + + +
  • + Consciousness + 0.6 +
  • +
  • + Talking + 0.2 +
  • + + +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/HiveOffspringChanceDef/HiveOffspringChanceDefs.xml b/Common/Defs/HiveOffspringChanceDef/HiveOffspringChanceDefs.xml deleted file mode 100644 index 884bd6a..0000000 --- a/Common/Defs/HiveOffspringChanceDef/HiveOffspringChanceDefs.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - rjw_genes_default_hive_offspring_chances - default - - 0.02 - 0.48 - 0.5 - - - - - rjw_genes_test_queen_offspring_chances - rjw_genes_test_queen_xenotype - - 0.02 - 0.28 - 0.7 - - - - \ No newline at end of file diff --git a/Common/Defs/LetterDefs/AnotherBaby.xml b/Common/Defs/LetterDefs/AnotherBaby.xml new file mode 100644 index 0000000..d8f7c17 --- /dev/null +++ b/Common/Defs/LetterDefs/AnotherBaby.xml @@ -0,0 +1,11 @@ + + + + AnotherBaby + (120, 176, 216) + (106, 179, 231) + 40 + LetterArrive_Good + MajorThreat + + \ No newline at end of file diff --git a/Common/Defs/QueenWorkerMappingDefs/QueenWorkerMappingDefs_base.xml b/Common/Defs/QueenWorkerMappingDefs/QueenWorkerMappingDefs_base.xml deleted file mode 100644 index 1ccfebd..0000000 --- a/Common/Defs/QueenWorkerMappingDefs/QueenWorkerMappingDefs_base.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - rjw_genes_default_worker_genes - default - -
  • StrongStomach
  • -
  • AG_FasterAging
  • -
  • PsychicAbility_Dull
  • -
  • FireTerror
  • -
  • Sterile
  • -
  • AptitudeTerrible_Intellectual
  • -
  • rjw_genes_featureless_chest
  • -
  • rjw_genes_worker
  • -
  • rjw_genes_zealous_loyalty
  • -
    -
    - - - rjw_genes_halamyr_queen_worker_mapping - rjw_genes_halamyr_queen_xenotype - -
  • AG_SmallerBodySize
  • -
  • StrongStomach
  • -
  • AG_EfficientMandibles
  • -
  • AG_FasterAging
  • -
  • PsychicAbility_Dull
  • -
  • FireTerror
  • -
  • Sterile
  • -
  • AG_FormicAntennas
  • -
  • Skin_DeepRed
  • -
  • AptitudeTerrible_Intellectual
  • -
  • rjw_genes_featureless_chest
  • -
  • rjw_genes_worker
  • -
  • rjw_genes_zealous_loyalty
  • -
    -
    - -
    \ No newline at end of file diff --git a/Common/Defs/RecipeDefs/Bioscaffold.xml b/Common/Defs/RecipeDefs/Bioscaffold.xml new file mode 100644 index 0000000..624f0cb --- /dev/null +++ b/Common/Defs/RecipeDefs/Bioscaffold.xml @@ -0,0 +1,33 @@ + + + + + InstallBioscaffold + + Install a bioscaffold. + + Bioscaffold + Bioscaffold + + Installing bioscaffold. + +
  • + + +
  • Bioscaffold
  • + + + 1 + +
    + + +
  • Bioscaffold
  • +
    +
    + +
  • Torso
  • +
    + Bioscaffold +
    +
    \ No newline at end of file diff --git a/Common/Defs/RecipeDefs/LimbicStimulator.xml b/Common/Defs/RecipeDefs/LimbicStimulator.xml new file mode 100644 index 0000000..b824041 --- /dev/null +++ b/Common/Defs/RecipeDefs/LimbicStimulator.xml @@ -0,0 +1,33 @@ + + + + + InstallLimbicStimulator + + Install a limbic stimulator. + + LimbicStimulator + LimbicStimulator + + Installing limbic stimulator. + +
  • + + +
  • LimbicStimulator
  • + + + 1 + +
    + + +
  • LimbicStimulator
  • +
    +
    + +
  • Brain
  • +
    + LimbicStimulator +
    +
    \ No newline at end of file diff --git a/Common/Defs/RecipeDefs/OvaryAgitator.xml b/Common/Defs/RecipeDefs/OvaryAgitator.xml new file mode 100644 index 0000000..2d2523f --- /dev/null +++ b/Common/Defs/RecipeDefs/OvaryAgitator.xml @@ -0,0 +1,35 @@ + + + + + InstallOvaryAgitator + + Install an ovary agitator. + + OvaryAgitator + OvaryAgitator + + Recipe_InstallImplant + Installing ovary agitator. + true + +
  • + + +
  • OvaryAgitator
  • + + + 1 + +
    + + +
  • OvaryAgitator
  • +
    +
    + +
  • Torso
  • +
    + OvaryAgitator +
    +
    \ No newline at end of file diff --git a/Common/Defs/RecipeDefs/Scrambler.xml b/Common/Defs/RecipeDefs/Scrambler.xml new file mode 100644 index 0000000..5479d91 --- /dev/null +++ b/Common/Defs/RecipeDefs/Scrambler.xml @@ -0,0 +1,35 @@ + + + + + InstallScrambler + + Install a scrambler. + + Scrambler + Scrambler + + Recipe_InstallImplant + Installing scrambler. + true + +
  • + + +
  • Scrambler
  • + + + 1 + +
    + + +
  • Scrambler
  • +
    +
    + +
  • Brain
  • +
    + Scrambler +
    +
    \ No newline at end of file diff --git a/Common/Defs/Scenarios/Halamyr_Hive.xml b/Common/Defs/Scenarios/Halamyr_Hive.xml deleted file mode 100644 index 1673a15..0000000 --- a/Common/Defs/Scenarios/Halamyr_Hive.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - rjw_genes_scenario_halamyr_hive - - A young queen set out to build a new hive. After a long path, a suitable place is found to generate new offspring. DEVNOTE: Try to choose a high-food biome to keep up with the Hive! - - A Halamyr queen set out to build a new hive. - - PlayerFaction - PlayerTribe - - - - - -
  • - ConfigurePawnsXenotypes - 4 - Start with a set of Halamyr Xenotypes and one other colonist of any age. - - -
  • - rjw_genes_halamyr_queen_xenotype - 1 - non-baby halamyr queen - true - Adult -
  • - -
  • - rjw_genes_halamyr_hiveguard_xenotype - 1 - non-baby halamyr hiveguard - true - Adult -
  • - -
  • - rjw_genes_halamyr_breeder_xenotype - 1 - adulthalamyr breeder - true - Adult -
  • - -
  • - Baseliner - 2 -
  • - - - - -
  • - PlayerPawnsArriveMethod - Standing -
  • - - -
  • - ForcedHediff - false - PlayerStarter - 0.5 - Malnutrition - 0.1~0.2 -
  • -
  • - SetNeedLevel - false - PlayerStarter - 1.0 - Food - 0.3~0.8 -
  • - - -
  • - StartingThing_Defined - Silver - 300 -
  • -
  • - StartingThing_Defined - Pemmican - 350 -
  • -
  • - StartingThing_Defined - InsectJelly - 300 -
  • -
  • - StartingThing_Defined - MedicineHerbal - 30 -
  • -
  • - StartingThing_Defined - MeleeWeapon_Club - WoodLog -
  • - -
  • - StartingAnimal - Spelopede - 2 -
  • -
  • - StartingAnimal - Megascarab - 3 - 1.0 -
  • - -
  • - StartingAnimal - Megaspider - 1 -
  • - - -
  • - ScatterThingsNearPlayerStart - WoodLog - 500 -
  • -
  • - ScatterThingsNearPlayerStart - Jade - 100 -
  • - -
  • - ScatterThingsNearPlayerStart - Pemmican - 150 -
  • -
  • - ScatterThingsNearPlayerStart - Steel - 200 -
  • - - -
  • - GameStartDialog - After a long journey, this is it: \n\nThis is the right place to start the new hive. Spin in your breeders, build your defenses and start mating.\n\nMake this a place worthy for a queen. - GameStartSting -
  • - -
    -
    -
    - -
    \ No newline at end of file diff --git a/Common/Defs/ThingDefs/Bioscaffold.xml b/Common/Defs/ThingDefs/Bioscaffold.xml new file mode 100644 index 0000000..4d585ba --- /dev/null +++ b/Common/Defs/ThingDefs/Bioscaffold.xml @@ -0,0 +1,53 @@ + + + + + Bioscaffold + + A single-use nanite-constructed lattice of organic mesh material meant to be installed inside a woman's womb prior to pregnancy. It provides an enriching environment for an unborn baby to grow more quickly. + + InstallBioscaffold + + Spacer + Rare + true + 25 + false + + 30 + 350 + 0.15 + 1.3 + 6 + 800 + + +
  • + 5 + true +
  • +
    + + 5 + 10 + 1 + 1 + + + DrugSynthesisSpeed + Intellectual + +
  • DrugLab
  • +
    + + 6 + 4 + + FertilityProcedures + 4 +
    + +
  • ExoticMisc
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/ThingDefs/LimbicStimulator.xml b/Common/Defs/ThingDefs/LimbicStimulator.xml new file mode 100644 index 0000000..a4e6aab --- /dev/null +++ b/Common/Defs/ThingDefs/LimbicStimulator.xml @@ -0,0 +1,20 @@ + + + + + LimbicStimulator + + A perpetual slow-release chemical stimulation implant that is embedded deep within the reward center of the brain, greatly increasing the need for lovin'. The need is said to become so strong that it can drive people to force themselves onto others, even if they wouldn't otherwise. Post-lovin' clarity will leave the implanted in a state of bliss, but they may also feel a sense of regret if they steal lovin' if they normally wouldn't - at least until they become used to doing it. + + InstallLimbicStimulator + + + 30 + 4 + 1 + + + BrainWiring + + + \ No newline at end of file diff --git a/Common/Defs/ThingDefs/OvaryAgitator.xml b/Common/Defs/ThingDefs/OvaryAgitator.xml new file mode 100644 index 0000000..256f69c --- /dev/null +++ b/Common/Defs/ThingDefs/OvaryAgitator.xml @@ -0,0 +1,20 @@ + + + + + OvaryAgitator + + A crude slaver implant used to increase the number of eggs released during ovulation, increasing the likelihood of having multiple children per pregnancy. Their use is largely limited to rimworlds lacking in cloning infrastructure as most civilized and unified worlds have outlawed them.\n\nWhile it provides an initial boost in fertility, the implant will slowly deplete the victims's ovaries over several years until they're infertile. Allies of implanted victims will be angered. + + InstallOvaryAgitator + + + 10 + 1 + 6 + + + FertilityProcedures + + + \ No newline at end of file diff --git a/Common/Defs/ThingDefs/Scrambler.xml b/Common/Defs/ThingDefs/Scrambler.xml new file mode 100644 index 0000000..0b13726 --- /dev/null +++ b/Common/Defs/ThingDefs/Scrambler.xml @@ -0,0 +1,21 @@ + + + + + Scrambler + + A slaver implant, made from a modified mindscrew, that can inject disorienting mind imagery directly into the visual cortex of the brain through a complex network of nanoelectrodes. Victims of scrambler implantation tend to socially withdraw to minimize additional stimulation. As a consequence of their confusion, they also become physically meek, making them easy to impose upon. Allies of implanted victims will be angered. + InstallScrambler + + 50 + + + 1 + 1 + 1 + + + BrainWiring + + + \ No newline at end of file diff --git a/Common/Defs/ThoughtDefs/Thoughts_Hive.xml b/Common/Defs/ThoughtDefs/Thoughts_Hive.xml deleted file mode 100644 index 8a232b3..0000000 --- a/Common/Defs/ThoughtDefs/Thoughts_Hive.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - rjw_genes_rival_queen_mood - RJW_Genes.Thoughtworker_RivalQueen_Mood - false - -
  • - - There is another queen nearby! - -70 -
  • -
    -
    - - - - rjw_genes_rival_queen_social - Thought_SituationalSocial - RJW_Genes.Thoughtworker_RivalQueen_Social - -
  • - - {0} threatens my dominion. {0} must be perished. - -130 -
  • -
    -
    - - - rjw_genes_queen_despises_workers_social - Thought_SituationalSocial - RJW_Genes.ThoughtWorker_WorkerDespised_Social - -
  • - - those workers are not even worth a glance. - -20 -
  • -
    -
    - - - - rjw_genes_multiple_queens_mood - RJW_Genes.Thoughtworker_MultipleQueens_Mood - false - -
  • - - I have too many queens around me! - -30 -
  • -
    -
    - - - - rjw_genes_queen_loyalty_social - Thought_SituationalSocial - RJW_Genes.Thoughtworker_QueenPresent_Social - -
  • - - {0} is my queen. My one and only reason to live. - +80 -
  • -
    -
    - - - - rjw_genes_no_queen_mood - RJW_Genes.Thoughtworker_QueenAbsent_Mood - false - -
  • - - We do not have a queen! How are we suppossed to face the cruelties of the world without a shepherd? - -20 -
  • -
    -
    - - - - rjw_genes_queen_present_mood - RJW_Genes.Thoughtworker_QueenPresent_Mood - false - -
  • - - Our queen is so wonderful. - +10 -
  • -
    -
    - -
    diff --git a/Common/Defs/ThoughtDefs/Thoughts_Memories.xml b/Common/Defs/ThoughtDefs/Thoughts_Memories.xml new file mode 100644 index 0000000..5b9bc5c --- /dev/null +++ b/Common/Defs/ThoughtDefs/Thoughts_Memories.xml @@ -0,0 +1,18 @@ + + + + + RegretsStealingLovin + Thought_Memory + 1.5 + 3 + 0.4 + +
  • + + I don't remember how or why, but I violated someone. It felt good in the moment, but it felt so wrong afterward. My cravings from my implant are just too strong! + -5 +
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Languages/English/Keyed/Dialog_StatsReport.xml b/Common/Languages/English/Keyed/Dialog_StatsReport.xml deleted file mode 100644 index 53837f8..0000000 --- a/Common/Languages/English/Keyed/Dialog_StatsReport.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - queen in proximity - queen absent - multiple queens present - - \ No newline at end of file diff --git a/Common/Languages/English/Keyed/Hive.xml b/Common/Languages/English/Keyed/Hive.xml deleted file mode 100644 index 60cff64..0000000 --- a/Common/Languages/English/Keyed/Hive.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - New Queen - A new Queen was born! Make sure to adress inheritance before the new queen reaches adolesence. - - \ No newline at end of file diff --git a/Common/Patches/Genes/Patch_Highmates.xml b/Common/Patches/Genes/Patch_Highmates.xml new file mode 100644 index 0000000..47cd747 --- /dev/null +++ b/Common/Patches/Genes/Patch_Highmates.xml @@ -0,0 +1,20 @@ + + + + +
  • Vanilla Races Expanded - Highmate
  • +
    + + /Defs/AbilityDef[defName="VRE_InitiateLovin"]/comps + + +
  • + RJW_Genes.CompAbilityEffect_Seduce + Caster +
  • +
    +
    +
    +
    +
    + diff --git a/Common/Patches/Xenotypes/GenitaliaUpdate.xml b/Common/Patches/Xenotypes/GenitaliaUpdate.xml index fd6e360..e6a9681 100644 --- a/Common/Patches/Xenotypes/GenitaliaUpdate.xml +++ b/Common/Patches/Xenotypes/GenitaliaUpdate.xml @@ -17,13 +17,6 @@ - - Defs/XenotypeDef[defName="Waster"]/genes - -
  • rjw_genes_insectbreeder
  • -
    -
    - Defs/XenotypeDef[defName="Yttakin"]/genes diff --git a/Common/Textures/Genes/Icons/Big_Breasts.dds b/Common/Textures/Genes/Icons/Big_Breasts.dds new file mode 100644 index 0000000..8f1c0f1 Binary files /dev/null and b/Common/Textures/Genes/Icons/Big_Breasts.dds differ diff --git a/Common/Textures/Genes/Icons/Big_Male_Genitalia.dds b/Common/Textures/Genes/Icons/Big_Male_Genitalia.dds new file mode 100644 index 0000000..30b1cbc Binary files /dev/null and b/Common/Textures/Genes/Icons/Big_Male_Genitalia.dds differ diff --git a/Common/Textures/Genes/Icons/Cocoon.dds b/Common/Textures/Genes/Icons/Cocoon.dds new file mode 100644 index 0000000..23d11dc Binary files /dev/null and b/Common/Textures/Genes/Icons/Cocoon.dds differ diff --git a/Common/Textures/Genes/Icons/Cum-Base.dds b/Common/Textures/Genes/Icons/Cum-Base.dds new file mode 100644 index 0000000..bf47dab Binary files /dev/null and b/Common/Textures/Genes/Icons/Cum-Base.dds differ diff --git a/Common/Textures/Genes/Icons/Cumflation.dds b/Common/Textures/Genes/Icons/Cumflation.dds new file mode 100644 index 0000000..01c2ff3 Binary files /dev/null and b/Common/Textures/Genes/Icons/Cumflation.dds differ diff --git a/Common/Textures/Genes/Icons/Cumflation_Immunity.dds b/Common/Textures/Genes/Icons/Cumflation_Immunity.dds new file mode 100644 index 0000000..c587855 Binary files /dev/null and b/Common/Textures/Genes/Icons/Cumflation_Immunity.dds differ diff --git a/Common/Textures/Genes/Icons/Drone.dds b/Common/Textures/Genes/Icons/Drone.dds new file mode 100644 index 0000000..ee130a6 Binary files /dev/null and b/Common/Textures/Genes/Icons/Drone.dds differ diff --git a/Common/Textures/Genes/Icons/Egg.dds b/Common/Textures/Genes/Icons/Egg.dds new file mode 100644 index 0000000..0b2b723 Binary files /dev/null and b/Common/Textures/Genes/Icons/Egg.dds differ diff --git a/Common/Textures/Genes/Icons/Elasticity.dds b/Common/Textures/Genes/Icons/Elasticity.dds new file mode 100644 index 0000000..e0f35a1 Binary files /dev/null and b/Common/Textures/Genes/Icons/Elasticity.dds differ diff --git a/Common/Textures/Genes/Icons/Empty.dds b/Common/Textures/Genes/Icons/Empty.dds new file mode 100644 index 0000000..7f12134 Binary files /dev/null and b/Common/Textures/Genes/Icons/Empty.dds differ diff --git a/Common/Textures/Genes/Icons/Extra_Anus.dds b/Common/Textures/Genes/Icons/Extra_Anus.dds new file mode 100644 index 0000000..c5cb1ac Binary files /dev/null and b/Common/Textures/Genes/Icons/Extra_Anus.dds differ diff --git a/Common/Textures/Genes/Icons/Extra_Breasts.dds b/Common/Textures/Genes/Icons/Extra_Breasts.dds new file mode 100644 index 0000000..dc51d0f Binary files /dev/null and b/Common/Textures/Genes/Icons/Extra_Breasts.dds differ diff --git a/Common/Textures/Genes/Icons/Extra_Vagina.dds b/Common/Textures/Genes/Icons/Extra_Vagina.dds new file mode 100644 index 0000000..846c8f5 Binary files /dev/null and b/Common/Textures/Genes/Icons/Extra_Vagina.dds differ diff --git a/Common/Textures/Genes/Icons/Female_Only.dds b/Common/Textures/Genes/Icons/Female_Only.dds new file mode 100644 index 0000000..c1d1fd1 Binary files /dev/null and b/Common/Textures/Genes/Icons/Female_Only.dds differ diff --git a/Common/Textures/Genes/Icons/Fertile_anus.dds b/Common/Textures/Genes/Icons/Fertile_anus.dds new file mode 100644 index 0000000..bd3dccc Binary files /dev/null and b/Common/Textures/Genes/Icons/Fertile_anus.dds differ diff --git a/Common/Textures/Genes/Icons/Fertile_anus.png b/Common/Textures/Genes/Icons/Fertile_anus.png new file mode 100644 index 0000000..6a62da8 Binary files /dev/null and b/Common/Textures/Genes/Icons/Fertile_anus.png differ diff --git a/Common/Textures/Genes/Icons/FertilinAlt.dds b/Common/Textures/Genes/Icons/FertilinAlt.dds new file mode 100644 index 0000000..acb64e0 Binary files /dev/null and b/Common/Textures/Genes/Icons/FertilinAlt.dds differ diff --git a/Common/Textures/Genes/Icons/FertilinDrainAlt.dds b/Common/Textures/Genes/Icons/FertilinDrainAlt.dds new file mode 100644 index 0000000..b078bb5 Binary files /dev/null and b/Common/Textures/Genes/Icons/FertilinDrainAlt.dds differ diff --git a/Common/Textures/Genes/Icons/Fervent_Ovipositor.dds b/Common/Textures/Genes/Icons/Fervent_Ovipositor.dds new file mode 100644 index 0000000..784801e Binary files /dev/null and b/Common/Textures/Genes/Icons/Fervent_Ovipositor.dds differ diff --git a/Common/Textures/Genes/Icons/Futa.dds b/Common/Textures/Genes/Icons/Futa.dds new file mode 100644 index 0000000..dfd7fcb Binary files /dev/null and b/Common/Textures/Genes/Icons/Futa.dds differ diff --git a/Common/Textures/Genes/Icons/Gene_LitteredBirths.dds b/Common/Textures/Genes/Icons/Gene_LitteredBirths.dds new file mode 100644 index 0000000..ebf7069 Binary files /dev/null and b/Common/Textures/Genes/Icons/Gene_LitteredBirths.dds differ diff --git a/Common/Textures/Genes/Icons/Gene_LitteredBirths.png b/Common/Textures/Genes/Icons/Gene_LitteredBirths.png new file mode 100644 index 0000000..5b5a09e Binary files /dev/null and b/Common/Textures/Genes/Icons/Gene_LitteredBirths.png differ diff --git a/Common/Textures/Genes/Icons/Generous_Donor.dds b/Common/Textures/Genes/Icons/Generous_Donor.dds new file mode 100644 index 0000000..b6a8cde Binary files /dev/null and b/Common/Textures/Genes/Icons/Generous_Donor.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Canine.dds b/Common/Textures/Genes/Icons/Genitalia_Canine.dds new file mode 100644 index 0000000..deef5dd Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_Canine.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Demon.dds b/Common/Textures/Genes/Icons/Genitalia_Demon.dds new file mode 100644 index 0000000..1745c32 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_Demon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Draconic.dds b/Common/Textures/Genes/Icons/Genitalia_Draconic.dds new file mode 100644 index 0000000..abefb5e Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_Draconic.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Draconic.png b/Common/Textures/Genes/Icons/Genitalia_Draconic.png index cb763d6..7717d23 100644 Binary files a/Common/Textures/Genes/Icons/Genitalia_Draconic.png and b/Common/Textures/Genes/Icons/Genitalia_Draconic.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Equine.dds b/Common/Textures/Genes/Icons/Genitalia_Equine.dds new file mode 100644 index 0000000..a41f863 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_Equine.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Feline.dds b/Common/Textures/Genes/Icons/Genitalia_Feline.dds new file mode 100644 index 0000000..b2bf6e8 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_Feline.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_Feline.png b/Common/Textures/Genes/Icons/Genitalia_Feline.png index c03cc27..8f5b4d7 100644 Binary files a/Common/Textures/Genes/Icons/Genitalia_Feline.png and b/Common/Textures/Genes/Icons/Genitalia_Feline.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_alien_icon.dds b/Common/Textures/Genes/Icons/Genitalia_alien_icon.dds new file mode 100644 index 0000000..c04c5a0 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_alien_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_alien_icon.png b/Common/Textures/Genes/Icons/Genitalia_alien_icon.png new file mode 100644 index 0000000..633ed83 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_alien_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_croc_icon.dds b/Common/Textures/Genes/Icons/Genitalia_croc_icon.dds new file mode 100644 index 0000000..feb17c9 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_croc_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_croc_icon.png b/Common/Textures/Genes/Icons/Genitalia_croc_icon.png new file mode 100644 index 0000000..569c1e7 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_croc_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_ghost_icon.dds b/Common/Textures/Genes/Icons/Genitalia_ghost_icon.dds new file mode 100644 index 0000000..2f95e85 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_ghost_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_ghost_icon.png b/Common/Textures/Genes/Icons/Genitalia_ghost_icon.png new file mode 100644 index 0000000..7c7ca9d Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_ghost_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_hemi_icon.dds b/Common/Textures/Genes/Icons/Genitalia_hemi_icon.dds new file mode 100644 index 0000000..3ac1a44 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_hemi_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_hemi_icon.png b/Common/Textures/Genes/Icons/Genitalia_hemi_icon.png new file mode 100644 index 0000000..e59cfec Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_hemi_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_human.dds b/Common/Textures/Genes/Icons/Genitalia_human.dds new file mode 100644 index 0000000..f0a502c Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_human.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_human.png b/Common/Textures/Genes/Icons/Genitalia_human.png new file mode 100644 index 0000000..c16c4ea Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_human.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_marine_icon.dds b/Common/Textures/Genes/Icons/Genitalia_marine_icon.dds new file mode 100644 index 0000000..a0ecbba Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_marine_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_marine_icon.png b/Common/Textures/Genes/Icons/Genitalia_marine_icon.png new file mode 100644 index 0000000..28dc8a3 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_marine_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_necro_icon.dds b/Common/Textures/Genes/Icons/Genitalia_necro_icon.dds new file mode 100644 index 0000000..f9709d8 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_necro_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_necro_icon.png b/Common/Textures/Genes/Icons/Genitalia_necro_icon.png new file mode 100644 index 0000000..378d181 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_necro_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_orc_icon.dds b/Common/Textures/Genes/Icons/Genitalia_orc_icon.dds new file mode 100644 index 0000000..4c6f3ab Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_orc_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_orc_icon.png b/Common/Textures/Genes/Icons/Genitalia_orc_icon.png new file mode 100644 index 0000000..c615f70 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_orc_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_racoon_icon.dds b/Common/Textures/Genes/Icons/Genitalia_racoon_icon.dds new file mode 100644 index 0000000..2ea8f28 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_racoon_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_racoon_icon.png b/Common/Textures/Genes/Icons/Genitalia_racoon_icon.png new file mode 100644 index 0000000..13c0a5a Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_racoon_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_screw_icon.dds b/Common/Textures/Genes/Icons/Genitalia_screw_icon.dds new file mode 100644 index 0000000..d9c0e92 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_screw_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_screw_icon.png b/Common/Textures/Genes/Icons/Genitalia_screw_icon.png new file mode 100644 index 0000000..c50c114 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_screw_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.dds b/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.dds new file mode 100644 index 0000000..1840c61 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.png b/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.png new file mode 100644 index 0000000..41e8331 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_tentacle_icon.png differ diff --git a/Common/Textures/Genes/Icons/Genitalia_thin_icon.dds b/Common/Textures/Genes/Icons/Genitalia_thin_icon.dds new file mode 100644 index 0000000..a45f899 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_thin_icon.dds differ diff --git a/Common/Textures/Genes/Icons/Genitalia_thin_icon.png b/Common/Textures/Genes/Icons/Genitalia_thin_icon.png new file mode 100644 index 0000000..2517a47 Binary files /dev/null and b/Common/Textures/Genes/Icons/Genitalia_thin_icon.png differ diff --git a/Common/Textures/Genes/Icons/Healpussy.dds b/Common/Textures/Genes/Icons/Healpussy.dds new file mode 100644 index 0000000..aa1ec00 Binary files /dev/null and b/Common/Textures/Genes/Icons/Healpussy.dds differ diff --git a/Common/Textures/Genes/Icons/Hypersexual.dds b/Common/Textures/Genes/Icons/Hypersexual.dds new file mode 100644 index 0000000..b36397a Binary files /dev/null and b/Common/Textures/Genes/Icons/Hypersexual.dds differ diff --git a/Common/Textures/Genes/Icons/Insect_Breeder.dds b/Common/Textures/Genes/Icons/Insect_Breeder.dds new file mode 100644 index 0000000..85c94eb Binary files /dev/null and b/Common/Textures/Genes/Icons/Insect_Breeder.dds differ diff --git a/Common/Textures/Genes/Icons/Loose_Anus.dds b/Common/Textures/Genes/Icons/Loose_Anus.dds new file mode 100644 index 0000000..d078f04 Binary files /dev/null and b/Common/Textures/Genes/Icons/Loose_Anus.dds differ diff --git a/Common/Textures/Genes/Icons/Loose_Vagina.dds b/Common/Textures/Genes/Icons/Loose_Vagina.dds new file mode 100644 index 0000000..714af26 Binary files /dev/null and b/Common/Textures/Genes/Icons/Loose_Vagina.dds differ diff --git a/Common/Textures/Genes/Icons/Loyalty.dds b/Common/Textures/Genes/Icons/Loyalty.dds new file mode 100644 index 0000000..1ef4268 Binary files /dev/null and b/Common/Textures/Genes/Icons/Loyalty.dds differ diff --git a/Common/Textures/Genes/Icons/Male_Only.dds b/Common/Textures/Genes/Icons/Male_Only.dds new file mode 100644 index 0000000..8387f22 Binary files /dev/null and b/Common/Textures/Genes/Icons/Male_Only.dds differ diff --git a/Common/Textures/Genes/Icons/Much_Cum.dds b/Common/Textures/Genes/Icons/Much_Cum.dds new file mode 100644 index 0000000..c7974f4 Binary files /dev/null and b/Common/Textures/Genes/Icons/Much_Cum.dds differ diff --git a/Common/Textures/Genes/Icons/Necrophile.dds b/Common/Textures/Genes/Icons/Necrophile.dds new file mode 100644 index 0000000..0239a1e Binary files /dev/null and b/Common/Textures/Genes/Icons/Necrophile.dds differ diff --git a/Common/Textures/Genes/Icons/No_Anus.dds b/Common/Textures/Genes/Icons/No_Anus.dds new file mode 100644 index 0000000..c829f90 Binary files /dev/null and b/Common/Textures/Genes/Icons/No_Anus.dds differ diff --git a/Common/Textures/Genes/Icons/No_Breasts.dds b/Common/Textures/Genes/Icons/No_Breasts.dds new file mode 100644 index 0000000..c4b6ad7 Binary files /dev/null and b/Common/Textures/Genes/Icons/No_Breasts.dds differ diff --git a/Common/Textures/Genes/Icons/No_Cum.dds b/Common/Textures/Genes/Icons/No_Cum.dds new file mode 100644 index 0000000..f21f6bb Binary files /dev/null and b/Common/Textures/Genes/Icons/No_Cum.dds differ diff --git a/Common/Textures/Genes/Icons/No_Male_Genitalia.dds b/Common/Textures/Genes/Icons/No_Male_Genitalia.dds new file mode 100644 index 0000000..8beee67 Binary files /dev/null and b/Common/Textures/Genes/Icons/No_Male_Genitalia.dds differ diff --git a/Common/Textures/Genes/Icons/No_Vagina.dds b/Common/Textures/Genes/Icons/No_Vagina.dds new file mode 100644 index 0000000..4ff0383 Binary files /dev/null and b/Common/Textures/Genes/Icons/No_Vagina.dds differ diff --git a/Common/Textures/Genes/Icons/Ovipositor_Genitalia.dds b/Common/Textures/Genes/Icons/Ovipositor_Genitalia.dds new file mode 100644 index 0000000..7e3a1af Binary files /dev/null and b/Common/Textures/Genes/Icons/Ovipositor_Genitalia.dds differ diff --git a/Common/Textures/Genes/Icons/Paralysing_Kiss.dds b/Common/Textures/Genes/Icons/Paralysing_Kiss.dds new file mode 100644 index 0000000..7ec2664 Binary files /dev/null and b/Common/Textures/Genes/Icons/Paralysing_Kiss.dds differ diff --git a/Common/Textures/Genes/Icons/Pheromone.dds b/Common/Textures/Genes/Icons/Pheromone.dds new file mode 100644 index 0000000..06738ed Binary files /dev/null and b/Common/Textures/Genes/Icons/Pheromone.dds differ diff --git a/Common/Textures/Genes/Icons/Pheromones.dds b/Common/Textures/Genes/Icons/Pheromones.dds new file mode 100644 index 0000000..a2f0394 Binary files /dev/null and b/Common/Textures/Genes/Icons/Pheromones.dds differ diff --git a/Common/Textures/Genes/Icons/Placeholder.dds b/Common/Textures/Genes/Icons/Placeholder.dds new file mode 100644 index 0000000..ce2c267 Binary files /dev/null and b/Common/Textures/Genes/Icons/Placeholder.dds differ diff --git a/Common/Textures/Genes/Icons/Queen.dds b/Common/Textures/Genes/Icons/Queen.dds new file mode 100644 index 0000000..ee24210 Binary files /dev/null and b/Common/Textures/Genes/Icons/Queen.dds differ diff --git a/Common/Textures/Genes/Icons/RJW-Genes_Rodent_Genitalia (Not in use now).dds b/Common/Textures/Genes/Icons/RJW-Genes_Rodent_Genitalia (Not in use now).dds new file mode 100644 index 0000000..d554df2 Binary files /dev/null and b/Common/Textures/Genes/Icons/RJW-Genes_Rodent_Genitalia (Not in use now).dds differ diff --git a/Common/Textures/Genes/Icons/RJW_Genes_Endogene_Background.dds b/Common/Textures/Genes/Icons/RJW_Genes_Endogene_Background.dds new file mode 100644 index 0000000..833af52 Binary files /dev/null and b/Common/Textures/Genes/Icons/RJW_Genes_Endogene_Background.dds differ diff --git a/Common/Textures/Genes/Icons/RJW_Genes_Xenogene_Background.dds b/Common/Textures/Genes/Icons/RJW_Genes_Xenogene_Background.dds new file mode 100644 index 0000000..091b63a Binary files /dev/null and b/Common/Textures/Genes/Icons/RJW_Genes_Xenogene_Background.dds differ diff --git a/Common/Textures/Genes/Icons/Rape.dds b/Common/Textures/Genes/Icons/Rape.dds new file mode 100644 index 0000000..fca75d7 Binary files /dev/null and b/Common/Textures/Genes/Icons/Rape.dds differ diff --git a/Common/Textures/Genes/Icons/Slime_Genitalia.dds b/Common/Textures/Genes/Icons/Slime_Genitalia.dds new file mode 100644 index 0000000..e473210 Binary files /dev/null and b/Common/Textures/Genes/Icons/Slime_Genitalia.dds differ diff --git a/Common/Textures/Genes/Icons/Small_Breasts.dds b/Common/Textures/Genes/Icons/Small_Breasts.dds new file mode 100644 index 0000000..fdbf4ed Binary files /dev/null and b/Common/Textures/Genes/Icons/Small_Breasts.dds differ diff --git a/Common/Textures/Genes/Icons/Small_Male_Genitalia.dds b/Common/Textures/Genes/Icons/Small_Male_Genitalia.dds new file mode 100644 index 0000000..a9f85fe Binary files /dev/null and b/Common/Textures/Genes/Icons/Small_Male_Genitalia.dds differ diff --git a/Common/Textures/Genes/Icons/Spelopede_Dispenser.dds b/Common/Textures/Genes/Icons/Spelopede_Dispenser.dds new file mode 100644 index 0000000..68d12db Binary files /dev/null and b/Common/Textures/Genes/Icons/Spelopede_Dispenser.dds differ diff --git a/Common/Textures/Genes/Icons/Succubus_Tail.dds b/Common/Textures/Genes/Icons/Succubus_Tail.dds new file mode 100644 index 0000000..068be01 Binary files /dev/null and b/Common/Textures/Genes/Icons/Succubus_Tail.dds differ diff --git a/Common/Textures/Genes/Icons/Succubus_Wings.dds b/Common/Textures/Genes/Icons/Succubus_Wings.dds new file mode 100644 index 0000000..94bbe7e Binary files /dev/null and b/Common/Textures/Genes/Icons/Succubus_Wings.dds differ diff --git a/Common/Textures/Genes/Icons/Tight_Anus.dds b/Common/Textures/Genes/Icons/Tight_Anus.dds new file mode 100644 index 0000000..ae0f265 Binary files /dev/null and b/Common/Textures/Genes/Icons/Tight_Anus.dds differ diff --git a/Common/Textures/Genes/Icons/Tight_Vagina.dds b/Common/Textures/Genes/Icons/Tight_Vagina.dds new file mode 100644 index 0000000..b94f43b Binary files /dev/null and b/Common/Textures/Genes/Icons/Tight_Vagina.dds differ diff --git a/Common/Textures/Genes/Icons/Vaginal_cum_absorption.dds b/Common/Textures/Genes/Icons/Vaginal_cum_absorption.dds new file mode 100644 index 0000000..2cff048 Binary files /dev/null and b/Common/Textures/Genes/Icons/Vaginal_cum_absorption.dds differ diff --git a/Common/Textures/Genes/Icons/Very_Much_Cum.dds b/Common/Textures/Genes/Icons/Very_Much_Cum.dds new file mode 100644 index 0000000..76694ce Binary files /dev/null and b/Common/Textures/Genes/Icons/Very_Much_Cum.dds differ diff --git a/Common/Textures/Genes/Icons/Vitality_Drainer.dds b/Common/Textures/Genes/Icons/Vitality_Drainer.dds new file mode 100644 index 0000000..9f4c08f Binary files /dev/null and b/Common/Textures/Genes/Icons/Vitality_Drainer.dds differ diff --git a/Common/Textures/Genes/Icons/Worker.dds b/Common/Textures/Genes/Icons/Worker.dds new file mode 100644 index 0000000..3bcf5b0 Binary files /dev/null and b/Common/Textures/Genes/Icons/Worker.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Breeder.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Breeder.dds new file mode 100644 index 0000000..f993b7e Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Breeder.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Cumazon.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Cumazon.dds new file mode 100644 index 0000000..49bb674 Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Cumazon.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Guard.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Guard.dds new file mode 100644 index 0000000..f0136b2 Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Guard.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Incubus.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Incubus.dds new file mode 100644 index 0000000..29f22ed Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Incubus.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Queen.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Queen.dds new file mode 100644 index 0000000..d02af1d Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Queen.dds differ diff --git a/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Succubus.dds b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Succubus.dds new file mode 100644 index 0000000..abb08a2 Binary files /dev/null and b/Common/Textures/Genes/Icons/Xenotypes/Xenotype-Succubus.dds differ diff --git a/Common/Textures/Genes/Icons/Zoophile.dds b/Common/Textures/Genes/Icons/Zoophile.dds new file mode 100644 index 0000000..e7baa19 Binary files /dev/null and b/Common/Textures/Genes/Icons/Zoophile.dds differ diff --git a/Common/Textures/Genes/Icons/cockeater.dds b/Common/Textures/Genes/Icons/cockeater.dds new file mode 100644 index 0000000..31ca306 Binary files /dev/null and b/Common/Textures/Genes/Icons/cockeater.dds differ diff --git a/Common/Textures/Genes/Icons/cumeater.dds b/Common/Textures/Genes/Icons/cumeater.dds new file mode 100644 index 0000000..d7f870e Binary files /dev/null and b/Common/Textures/Genes/Icons/cumeater.dds differ diff --git a/Common/Textures/Genes/Icons/extra_male.dds b/Common/Textures/Genes/Icons/extra_male.dds new file mode 100644 index 0000000..ada5226 Binary files /dev/null and b/Common/Textures/Genes/Icons/extra_male.dds differ diff --git a/Common/Textures/Genes/Icons/penis_rock_icon.dds b/Common/Textures/Genes/Icons/penis_rock_icon.dds new file mode 100644 index 0000000..22f3f5b Binary files /dev/null and b/Common/Textures/Genes/Icons/penis_rock_icon.dds differ diff --git a/Common/Textures/Genes/Icons/penis_rock_icon.png b/Common/Textures/Genes/Icons/penis_rock_icon.png new file mode 100644 index 0000000..c1c1324 Binary files /dev/null and b/Common/Textures/Genes/Icons/penis_rock_icon.png differ diff --git a/Common/Textures/Genes/Icons/rjw_genes_lips.dds b/Common/Textures/Genes/Icons/rjw_genes_lips.dds new file mode 100644 index 0000000..120d09a Binary files /dev/null and b/Common/Textures/Genes/Icons/rjw_genes_lips.dds differ diff --git a/Common/Textures/Genes/Icons/rjw_naked_prowess.dds b/Common/Textures/Genes/Icons/rjw_naked_prowess.dds new file mode 100644 index 0000000..5e11870 Binary files /dev/null and b/Common/Textures/Genes/Icons/rjw_naked_prowess.dds differ diff --git a/Common/Textures/Genes/Icons/seduce.dds b/Common/Textures/Genes/Icons/seduce.dds new file mode 100644 index 0000000..9875559 Binary files /dev/null and b/Common/Textures/Genes/Icons/seduce.dds differ diff --git a/Common/Textures/Genes/Icons/vagina_base.dds b/Common/Textures/Genes/Icons/vagina_base.dds new file mode 100644 index 0000000..f9a2ee2 Binary files /dev/null and b/Common/Textures/Genes/Icons/vagina_base.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_east.png deleted file mode 100644 index dc01479..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.dds new file mode 100644 index 0000000..bf8cc19 Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.png new file mode 100644 index 0000000..ef191bf Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_east.png differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_north.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_north.dds new file mode 100644 index 0000000..0f1967e Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_north.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_north.png similarity index 100% rename from Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_north.png rename to Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_north.png diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_south.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_south.dds new file mode 100644 index 0000000..021f6ad Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_south.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_south.png similarity index 100% rename from Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail/RJW_Genes_Succubus_Tail_south.png rename to Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Tail_south.png diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_east.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_east.dds new file mode 100644 index 0000000..7b0c750 Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_east.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_east.png similarity index 100% rename from Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_east.png rename to Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_east.png diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_north.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_north.dds new file mode 100644 index 0000000..9bd784f Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_north.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_north.png similarity index 100% rename from Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_north.png rename to Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_north.png diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_south.dds b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_south.dds new file mode 100644 index 0000000..1128e9e Binary files /dev/null and b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_south.dds differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_south.png similarity index 100% rename from Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings/RJW_Genes_Succubus_Wings_south.png rename to Common/Textures/Things/Pawn/Humanlike/BodyAttachments/RJW_Genes_Succubus_Wings_south.png diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_east.png deleted file mode 100644 index 7f51811..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_north.png deleted file mode 100644 index 25c4097..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_north.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_south.png deleted file mode 100644 index 60aae1e..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L1_south.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_east.png deleted file mode 100644 index f3be513..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_north.png deleted file mode 100644 index 7a54823..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_north.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_south.png deleted file mode 100644 index 91b5641..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_L2_south.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_east.png deleted file mode 100644 index e08f0b3..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_north.png deleted file mode 100644 index 60aae1e..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_north.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_south.png deleted file mode 100644 index 0c9df93..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R1_south.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_east.png deleted file mode 100644 index ea33158..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_north.png deleted file mode 100644 index 30e0e28..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_north.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_south.png deleted file mode 100644 index a9f56d7..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Tail_R2_south.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_east.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_east.png deleted file mode 100644 index 71e3f53..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_east.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_north.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_north.png deleted file mode 100644 index ac55d17..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_north.png and /dev/null differ diff --git a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_south.png b/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_south.png deleted file mode 100644 index ac55d17..0000000 Binary files a/Common/Textures/Things/Pawn/Humanlike/BodyAttachments/deprecated_rjw_genes_succubus/Succubus_Wings_south.png and /dev/null differ diff --git a/LoadFolders.xml b/LoadFolders.xml new file mode 100644 index 0000000..d708230 --- /dev/null +++ b/LoadFolders.xml @@ -0,0 +1,9 @@ + + + +
  • /
  • +
  • Common
  • + +
  • Mods/NotRaceSupport
  • +
    +
    \ No newline at end of file diff --git a/Mods/NotRaceSupport/Defs/HediffDefs/Hediffs_PrivateParts/Hediffs_PrivateParts_Added.xml b/Mods/NotRaceSupport/Defs/HediffDefs/Hediffs_PrivateParts/Hediffs_PrivateParts_Added.xml new file mode 100644 index 0000000..647b7a2 --- /dev/null +++ b/Mods/NotRaceSupport/Defs/HediffDefs/Hediffs_PrivateParts/Hediffs_PrivateParts_Added.xml @@ -0,0 +1,152 @@ + + + + NeedlePenis + + a needle penis + A long thin needle penis + NeedlePenis + NeedlePenis + +
  • + +
  • Thin
  • +
  • Long
  • + + +
    +
    + + PigPenis + + a screw penis + A large screw penis. + PigPenis + PigPenis + +
  • + +
  • Flared
  • +
  • Long
  • +
  • Girthy
  • + + +
    +
    + + MarinePenis + + a marine penis + A penis similar to those of marine mammals. + MarinePenis + MarinePenis + +
  • + +
  • Sheathed
  • +
  • Long
  • + + +
    +
    + + TentaclePenis + + an alien penis + A alien penis featuring multiples tentacles. + TentaclePenis + TentaclePenis + +
  • + +
  • Multiple
  • +
  • Sheathed
  • +
  • Long
  • + + +
    +
    + + GolemPenis + + an golem penis + A large rocky golem penis. + GolemPenis + GolemPenis + +
  • + +
  • Long
  • +
  • Girthy
  • +
  • Barbed
  • + + +
    +
    + + OrcPenis + + an orc penis + A large orc penis. + OrcPenis + OrcPenis + +
  • + +
  • Long
  • +
  • Girthy
  • + + +
    +
    + + GhostPenis + + an ghost penis + A evanescent ghost penis, you can barely feel it. + GhostPenis + GhostPenis + +
  • + +
  • Thin
  • +
  • Sheathed
  • + + +
    +
    + + NecroPenis + + an undead penis + A rotten, reanimated penis. + NecroPenis + NecroPenis + +
  • + +
  • Long
  • +
  • Girthy
  • + + +
    +
    + + GhostVagina + + a ghost vagina + A evanescent ghost vagina, you can barely feel it. + GhostVagina + GhostVagina + +
  • + +
  • Tight
  • +
  • Deep
  • + + +
    +
    + + +
    \ No newline at end of file diff --git a/Mods/NotRaceSupport/Defs/ThingDefs/Items_BodyParts/Items_BodyParts_Added.xml b/Mods/NotRaceSupport/Defs/ThingDefs/Items_BodyParts/Items_BodyParts_Added.xml new file mode 100644 index 0000000..9608642 --- /dev/null +++ b/Mods/NotRaceSupport/Defs/ThingDefs/Items_BodyParts/Items_BodyParts_Added.xml @@ -0,0 +1,96 @@ + + + + + NeedlePenis + + A long thin needle penis + + 250 + 0.40 + + + + + PigPenis + + A large screw penis. + + 250 + 0.40 + + + + + MarinePenis + + A penis similar to those of marine mammals. + + 250 + 0.40 + + + + + TentaclePenis + + A alien penis featuring multiples tentacles. + + 250 + 0.40 + + + + + GolemPenis + + A large rocky golem penis. + + 250 + 0.40 + + + + + OrcPenis + + A large orc penis. + + 250 + 0.40 + + + + + GhostPenis + + A evanescent ghost penis, you can barely feel it. + + 250 + 0.40 + + + + + NecroPenis + + A rotten, reanimated penis. + + 250 + 0.40 + + + + + GhostVagina + + GhostVagina + + 250 + 0.40 + + + + + + diff --git a/README.md b/README.md index 6c427df..9ea66bc 100644 --- a/README.md +++ b/README.md @@ -6,42 +6,26 @@ This mod adds genes related and based on RJW to Rimworld. - Different Genitalia Types - Genitalia Size Scaling -- Extra Genitalia (and a Futa Attempt) -- Most RJW Traits, Cumflation Immunity, Elasticity +- Extra Genitalia, Male Pregnancy, Futas, Femboys +- Most RJW Traits - Cum-Amount Changes, Transfer Nutrition Boosts -- Mech Breeding / Insect Breeding Additions & Orgasmic Mytosis +- Sexual Vampires that need Cum, Cocks or some other sources. +- Mech Breeding Additions & Orgasmic Mytosis - Human-Animal Gene Inheritance merged from [Shabakur](https://github.com/Shabakur/RJW_Animal_Gene_Inheritance) -- Succubi, Incubi & Cumazones that utilize Fertilin, similar to Hemogen -- Insect-Caste Mechanics, with Queens, Drones and Workers and a conditional reproduction - Patches for some popular / common Xenotypes from other Mods. -See [planned things](TODOS.md) and feel free to contribute. -With the Human-Animal-Gene Inheritance we have a lot of XML that you can contribute! -We have a [template](./Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml) and you can add animals and/or genes from mods there (Racegroups are base-rjw). -If you want to make your own Hive-Xenotypes, please see the required XMLs at [Changelog - 1.2](./CHANGELOG.md). - -## Bugs? - -I never wrote a bug in my life but if you found one please open an issue or find me somewhere on the RJW Discord. - -Please consider looking at [the known bugs](./KNOWN_BUGS.md) - -## Genes vs. Races - -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. - -Some HAR races change sex-ages and behave unfriendly with this mod. -You can make reports about that, but I might not fix it. - -## 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. 4. Alpha Genes "Female / Male Only" Genes might overwrite later Genitalia-Changes and should be avoided in combination with RJW-Genes features. 5. rjw.sexperience.cumgenes removes fertilin-gain from Cum item - I hope I addressed this by adding a load order but keep me posted (Issue #41) -6. [Consistent Gene Inheritance](https://steamcommunity.com/sharedfiles/filedetails/?id=2881479142&searchtext=Consistent+Gene+Inheritance) alters inheritance - it messes a bit with the Insect-Caste Logic. Your game will not crash, but the insect xenotypes will be a bit messed up. \ No newline at end of file +6. [Consistent Gene Inheritance](https://steamcommunity.com/sharedfiles/filedetails/?id=2881479142&searchtext=Consistent+Gene+Inheritance) alters inheritance - it messes a bit with the Insect-Caste Logic. Your game will not crash, but the insect xenotypes will be a bit messed up. + +## Structure + +- Toplevel: By Function (i.E. "Genes", "Animal Inheritance", "Utility") +- Then: By Domain, following the Gene-Categories ("Cosmetic","Special", "Damage",...) +- Last: By Type of Action (Def, Patch, etc.) + +So if you want to change / add a gene about shrinking cocks you were to go: `Genes -> GenitaliaSize -> Defs`. \ No newline at end of file diff --git a/Source/Common/Helpers/LaborState.cs b/Source/Common/Helpers/LaborState.cs new file mode 100644 index 0000000..8a0e59d --- /dev/null +++ b/Source/Common/Helpers/LaborState.cs @@ -0,0 +1,24 @@ + +using Verse; + + +namespace RJW_Genes +{ + class LaborState + { + public Pawn pawn; + public int birthTotal = 0; + public int birthCount = 1; + public bool hasOvaryAgitator = false; + public bool hasBioscaffold = false; + + public LaborState(Pawn pawn, int birthTotal) + { + this.pawn = pawn; + this.birthTotal = birthTotal; + this.birthCount = 0; + this.hasOvaryAgitator = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); + this.hasBioscaffold = pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); + } + } +} diff --git a/Source/Common/Helpers/MapUtility.cs b/Source/Common/Helpers/MapUtility.cs new file mode 100644 index 0000000..79e45a6 --- /dev/null +++ b/Source/Common/Helpers/MapUtility.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Verse; + +namespace RJW_Genes +{ + public class MapUtility + { + /// + /// Checks if the pawn is on the players home map. + /// + /// Reason is that drones should only be punished for absence of queen if they are on the map and there is no queen. + /// If they are on a mission, transport-pod etc. they should not get boni or mali. + /// + /// The pawn for which to check map-presence. + /// True if the pawn is on the home-map, False otherwise. + public static bool PawnIsOnHomeMap(Pawn pawn) + { + if (Find.Maps.NullOrEmpty() || !Find.Maps.Where(mapCandidate => mapCandidate.IsPlayerHome).Any()) + { + return false; + } + Map homeMap = Find.Maps.Where(mapCandidate => mapCandidate.IsPlayerHome).First(); + return + homeMap != null && pawn != null + && pawn.Spawned + && pawn.Map == homeMap; + } + + } +} diff --git a/Source/Common/patches/PatchGetParents.cs b/Source/Common/patches/PatchGetParents.cs new file mode 100644 index 0000000..9038d17 --- /dev/null +++ b/Source/Common/patches/PatchGetParents.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; +using rjw; + +namespace RJW_Genes +{ + [HarmonyPatch(typeof(ParentRelationUtility))] + public class PatchGetParents + { + // Token: 0x0600000F RID: 15 + [HarmonyPostfix] + [HarmonyPatch("GetFather")] + private static void FatherPostfix(ref Pawn __result, Pawn pawn) + { + if (__result == null && pawn.RaceProps.IsFlesh && pawn.relations != null) + { + List directRelations = pawn.relations.DirectRelations; + bool flag = false; + for (int i = 0; i < directRelations.Count; i++) + { + DirectPawnRelation directPawnRelation = directRelations[i]; + if (directPawnRelation.def == PawnRelationDefOf.Parent) + { + if (flag) + { + __result = directPawnRelation.otherPawn; + return; + } + flag = true; + } + } + } + } + + // Token: 0x06000010 RID: 16 + [HarmonyPostfix] + [HarmonyPatch("GetMother")] + private static void MotherPostfix(ref Pawn __result, Pawn pawn) + { + if (__result == null && pawn.RaceProps.IsFlesh && pawn.relations != null) + { + List directRelations = pawn.relations.DirectRelations; + for (int i = 0; i < directRelations.Count; i++) + { + DirectPawnRelation directPawnRelation = directRelations[i]; + if (directPawnRelation.def == PawnRelationDefOf.Parent) + { + __result = directPawnRelation.otherPawn; + return; + } + } + } + } + + // Token: 0x0600001F RID: 31 + [HarmonyPostfix] + [HarmonyPatch("HasSameFather")] + private static void HasSameFatherPostfix(ref bool __result, Pawn pawn, Pawn other) + { + if (!__result && pawn.RaceProps.IsFlesh && pawn.relations != null) + { + Pawn parent = pawn.GetFather(); + Pawn parent2 = other.GetMother(); + Pawn parent3 = other.GetFather(); + Pawn parent4 = pawn.GetMother(); + if (parent != null && parent2 != null && parent == parent2) + { + __result = true; + return; + } + if (parent3 != null && parent4 != null && parent3 == parent4) + { + __result = true; + return; + } + if (parent != null && parent3 != null && parent == parent3) + { + __result = true; + return; + } + if (parent2 != null && parent4 != null && parent2 == parent4) + { + __result = true; + return; + } + } + } + + // Token: 0x06000020 RID: 32 + [HarmonyPostfix] + [HarmonyPatch("HasSameMother")] + private static void HasSameMotherPostfix(ref bool __result, Pawn pawn, Pawn other) + { + if (!__result && pawn.RaceProps.IsFlesh && pawn.relations != null) + { + Pawn parent = pawn.GetFather(); + Pawn parent2 = other.GetMother(); + Pawn parent3 = other.GetFather(); + Pawn parent4 = pawn.GetMother(); + if (parent != null && parent2 != null && parent == parent2) + { + __result = true; + return; + } + if (parent3 != null && parent4 != null && parent3 == parent4) + { + __result = true; + return; + } + if (parent != null && parent3 != null && parent == parent3) + { + __result = true; + return; + } + if (parent2 != null && parent4 != null && parent2 == parent4) + { + __result = true; + return; + } + } + } + } +} diff --git a/Source/Common/patches/PatchImplants.cs b/Source/Common/patches/PatchImplants.cs new file mode 100644 index 0000000..037e081 --- /dev/null +++ b/Source/Common/patches/PatchImplants.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; +using rjw; + + +namespace RJW_Genes +{ + + public class PatchImplants + { + public static readonly ThoughtDef regretsStealingLovin = DefDatabase.GetNamed("RegretsStealingLovin"); + public static readonly ThoughtDef stoleSomeLovin = DefDatabase.GetNamed("StoleSomeLovin"); + public static readonly ThoughtDef bloodlustStoleSomeLovin = DefDatabase.GetNamed("BloodlustStoleSomeLovin"); + public static readonly TraitDef rapist = DefDatabase.GetNamed("Rapist"); + + static Dictionary laborStateMap = new Dictionary(); + static public void would_rape_PostFix(ref bool __result, Pawn rapist) + { + if (rapist.health.hediffSet.HasHediff(HediffDef.Named("LimbicStimulator"))) + { + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("Found LimbicStimulator hediff during xxx.would_rape check"); + ModLog.Message("Pawn: " + rapist.NameShortColored + " (" + rapist.ThingID + ")"); + ModLog.Message("__result (Before roll): " + __result); + } + __result = Rand.Chance(0.95f); + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("__result (After roll): " + __result); + } + } + } + + static public void is_rapist_PostFix(ref bool __result, Pawn pawn) + { + if (pawn.health.hediffSet.HasHediff(HediffDef.Named("LimbicStimulator"))) + { + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("Found LimbicStimulator hediff during xxx.is_rapist check for " + pawn.NameShortColored + " (" + pawn.ThingID + ")" + " with __result = " + __result + " - forcing to true"); + __result = true; + } + } + } + + static public void think_about_sex_Rapist_PostFix(ref ThoughtDef __result, Pawn pawn) + { + if (RJW_Genes_Settings.regretStealingLovinThoughtDisabled) return; + + if (pawn.health.hediffSet.HasHediff(HediffDef.Named("LimbicStimulator")) && (__result == stoleSomeLovin || __result == bloodlustStoleSomeLovin) && !pawn.story.traits.HasTrait(rapist)) + { + __result = regretsStealingLovin; + } + } + + + public static void MultiplyPregnancy(ref float __result, Pawn pawn) + { + if (pawn != null && pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold"))) + { + __result *= 2f; + } + } + } +} diff --git a/Source/Common/patches/PatchPregnancyHelper.cs b/Source/Common/patches/PatchPregnancyHelper.cs new file mode 100644 index 0000000..30aa788 --- /dev/null +++ b/Source/Common/patches/PatchPregnancyHelper.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; +using rjw; +using RJW_Genes; +using rjw.Modules.Interactions.Enums; + +namespace RJW_Genes +{ + [HarmonyPatch(typeof(PregnancyHelper))] + public class PatchPregnancyHelper + { + public static HediffDef vasectomydef = DefDatabase.GetNamed("Vasectomy", true); + // Token: 0x0600000F RID: 15 + [HarmonyPostfix] + [HarmonyPatch("impregnate")] + private static void ImpregnatePostfix(ref SexProps props) + { + + if (RJWSettings.DevMode) rjw.ModLog.Message("Rimjobworld::impregnate(" + props.sexType + "):: " + xxx.get_pawnname(props.pawn) + " + " + xxx.get_pawnname(props.partner) + ":"); + + //"mech" pregnancy + if (props.sexType == xxx.rjwSextype.MechImplant) + { + return; + } + + Pawn giver = props.pawn; // orgasmer + Pawn receiver = props.partner; + Hediff vasectomy; + receiver.health.hediffSet.TryGetHediff(vasectomydef, out vasectomy); + + + + List pawnparts = giver.GetGenitalsList(); + List partnerparts = receiver.GetGenitalsList(); + var interaction = rjw.Modules.Interactions.Helpers.InteractionHelper.GetWithExtension(props.dictionaryKey); + if (receiver.genes == null) + { + return; + } + + if (!(props.sexType == xxx.rjwSextype.Anal && receiver.genes.HasActiveGene(GeneDefOf.rjw_genes_fertile_anus))) + return; + + //"normal" and "beastial" pregnancy + if (RJWSettings.DevMode) ModLog.Message(" 'normal' pregnancy checks"); + + //interaction stuff if for handling futa/see who penetrates who in interaction + if (!props.isReceiver && + interaction.DominantHasTag(GenitalTag.CanPenetrate) && + interaction.SubmissiveHasFamily(GenitalFamily.Anus)) + { + if (RJWSettings.DevMode) ModLog.Message(" impregnate - by initiator"); + } + else if (props.isReceiver && props.isRevese && + interaction.DominantHasFamily(GenitalFamily.Anus) && + interaction.SubmissiveHasTag(GenitalTag.CanPenetrate)) + { + if (RJWSettings.DevMode) ModLog.Message(" impregnate - by receiver (reverse)"); + } + else + { + if (RJWSettings.DevMode) ModLog.Message(" no valid interaction tags/family"); + return; + } + + if (!rjw.Modules.Interactions.Helpers.PartHelper.FindParts(giver, GenitalTag.CanFertilize).Any()) + { + if (RJWSettings.DevMode) ModLog.Message(xxx.get_pawnname(giver) + " has no parts to Fertilize with"); + return; + } + if (vasectomy != null) + { + if (RJWSettings.DevMode) ModLog.Message("vasectomy check"); + receiver.health.RemoveHediff(vasectomy); + } + if (CanImpregnate2(giver, receiver, props.sexType)) + { + + PregnancyHelper.DoImpregnate(giver, receiver); + + } + if (vasectomy != null) + { + if (RJWSettings.DevMode) ModLog.Message("vasectomy check"); + receiver.health.AddHediff(vasectomy); + } + } + + private static bool CanImpregnate2(Pawn fucker, Pawn fucked, xxx.rjwSextype sexType) + { + + if (fucker == null || fucked == null) + { + return false; + + } + if (RJWSettings.DevMode) + { + rjw.ModLog.Message(string.Concat(new string[] + { + "Rimjobworld::CanImpregnate checks (", + sexType.ToString(), + "):: ", + xxx.get_pawnname(fucker), + " + ", + xxx.get_pawnname(fucked), + ":" + })); + } + if (sexType == xxx.rjwSextype.MechImplant && !RJWPregnancySettings.mechanoid_pregnancy_enabled) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" mechanoid 'pregnancy' disabled"); + } + return false; + + } + if (sexType != xxx.rjwSextype.Vaginal && sexType != xxx.rjwSextype.DoublePenetration && !(sexType == xxx.rjwSextype.Anal && fucked.genes.HasActiveGene(GeneDefOf.rjw_genes_fertile_anus))) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" sextype cannot result in pregnancy"); + } + return false; + + } + if (AndroidsCompatibility.IsAndroid(fucker) && AndroidsCompatibility.IsAndroid(fucked)) + { + if (RJWSettings.DevMode) + { + ModLog.Message(xxx.get_pawnname(fucked) + " androids cant breed/reproduce androids"); + } + return false; + + } + if ((fucker.IsUnsexyRobot() || fucked.IsUnsexyRobot()) && sexType != xxx.rjwSextype.MechImplant) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" unsexy robot cant be pregnant"); + } + return false; + + } + if (!fucker.RaceHasPregnancy()) + { + if (RJWSettings.DevMode) + { + ModLog.Message(xxx.get_pawnname(fucked) + " filtered race that cant be pregnant"); + } + return false; + + } + if (!fucked.RaceHasPregnancy()) + { + if (RJWSettings.DevMode) + { + ModLog.Message(xxx.get_pawnname(fucker) + " filtered race that cant impregnate"); + } + return false; + + } + if (fucked.IsPregnant(false)) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" already pregnant."); + } + return false; + + } + List source = new List(); + fucked.health.hediffSet.GetHediffs(ref source, null); + if (source.Count > 1) + { + if (RJWSettings.DevMode) + { + ModLog.Message(xxx.get_pawnname(fucked) + " cant get pregnant while eggs inside"); + } + return false; + + } + List genitalsList = fucker.GetGenitalsList(); + List genitalsList2 = fucked.GetGenitalsList(); + if (!Genital_Helper.has_penis_fertile(fucker, genitalsList) && !Genital_Helper.has_penis_fertile(fucked, genitalsList2)) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" missing genitals for impregnation"+ Genital_Helper.has_penis_fertile(fucker, genitalsList)+" "+ Genital_Helper.has_anus(fucked, genitalsList2)+" "+ Genital_Helper.has_penis_fertile(fucked, genitalsList2)+" "+ Genital_Helper.has_anus(fucker, genitalsList)); + } + return false; + } + if (fucker.health.capacities.GetLevel(xxx.reproduction) <= 0f || fucked.health.capacities.GetLevel(xxx.reproduction) <= 0f) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" one (or both) pawn(s) infertile"); + } + return false; + + } + if (xxx.is_human(fucked) && xxx.is_human(fucker) && (RJWPregnancySettings.humanlike_impregnation_chance == 0 || !RJWPregnancySettings.humanlike_pregnancy_enabled)) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" human pregnancy chance set to 0% or pregnancy disabled."); + } + return false; + + } + if (((xxx.is_animal(fucker) && xxx.is_human(fucked)) || (xxx.is_human(fucker) && xxx.is_animal(fucked))) && !RJWPregnancySettings.bestial_pregnancy_enabled) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" bestiality pregnancy chance set to 0% or pregnancy disabled."); + } + return false; + + } + if (xxx.is_animal(fucked) && xxx.is_animal(fucker) && (RJWPregnancySettings.animal_impregnation_chance == 0 || !RJWPregnancySettings.animal_pregnancy_enabled)) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" animal-animal pregnancy chance set to 0% or pregnancy disabled."); + } + return false; + + } + if (fucker.def.defName != fucked.def.defName && RJWPregnancySettings.interspecies_impregnation_modifier <= 0f && !RJWPregnancySettings.complex_interspecies) + { + if (RJWSettings.DevMode) + { + ModLog.Message(" interspecies pregnancy disabled."); + } + return false; + + } + if (fucked.RaceProps.gestationPeriodDays <= 0f && fucked.TryGetComp() == null) + { + if (RJWSettings.DevMode) + { + ModLog.Message(xxx.get_pawnname(fucked) + " mother.RaceProps.gestationPeriodDays is " + fucked.RaceProps.gestationPeriodDays.ToString() + " cant impregnate"); + } + return false; + } + + return true; + } + + } +} diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs index f016e97..ef269cf 100644 --- a/Source/GeneDefOf.cs +++ b/Source/GeneDefOf.cs @@ -21,9 +21,22 @@ namespace RJW_Genes public static readonly GeneDef rjw_genes_ovipositor_genitalia; public static readonly GeneDef rjw_genes_feline_genitalia; public static readonly GeneDef rjw_genes_canine_genitalia; + public static readonly GeneDef rjw_genes_demonicT_genitalia; + public static readonly GeneDef rjw_genes_crocodilian_genitalia; + public static readonly GeneDef rjw_genes_racoon_genitalia; + public static readonly GeneDef rjw_genes_reptilian_genitalia; + public static readonly GeneDef rjw_genes_Ghost_genitalia; + public static readonly GeneDef rjw_genes_Golem_genitalia; + public static readonly GeneDef rjw_genes_Marine_genitalia; + public static readonly GeneDef rjw_genes_Necro_genitalia; + public static readonly GeneDef rjw_genes_Needle_genitalia; + public static readonly GeneDef rjw_genes_Orc_genitalia; + public static readonly GeneDef rjw_genes_Pig_genitalia; + public static readonly GeneDef rjw_genes_Tentacle_genitalia; + public static readonly GeneDef rjw_genes_human_genitalia; - // Extra Genitalia - public static readonly GeneDef rjw_genes_extra_penis; + // Extra Genitalia + public static readonly GeneDef rjw_genes_extra_penis; public static readonly GeneDef rjw_genes_no_penis; public static readonly GeneDef rjw_genes_extra_vagina; public static readonly GeneDef rjw_genes_no_vagina; @@ -32,7 +45,9 @@ namespace RJW_Genes public static readonly GeneDef rjw_genes_extra_anus; public static readonly GeneDef rjw_genes_no_anus; public static readonly GeneDef rjw_genes_futa; - public static readonly GeneDef rjw_genes_featureless_chest; + public static readonly GeneDef rjw_genes_femboy; + public static readonly GeneDef rjw_genes_featureless_chest; + public static readonly GeneDef rjw_genes_udder; // Genitalia Sizes public static readonly GeneDef rjw_genes_big_male_genitalia; @@ -52,27 +67,27 @@ namespace RJW_Genes // Breeding public static readonly GeneDef rjw_genes_mechbreeder; - public static readonly GeneDef rjw_genes_insectincubator; - public static readonly GeneDef rjw_genes_insectbreeder; public static readonly GeneDef rjw_genes_zoophile; - - // Cum - public static readonly GeneDef rjw_genes_no_cum; + public static readonly GeneDef rjw_genes_fertile_anus; + // Cum + public static readonly GeneDef rjw_genes_no_cum; public static readonly GeneDef rjw_genes_much_cum; public static readonly GeneDef rjw_genes_very_much_cum; [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_likes_cumflation; [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_cumflation_immunity; - [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_generous_donor; - - // Reproduction - public static readonly GeneDef rjw_genes_hypersexual; + [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_generous_donor; + + + // Reproduction + public static readonly GeneDef rjw_genes_hypersexual; public static readonly GeneDef rjw_genes_rapist; public static readonly GeneDef rjw_genes_homosexual; public static readonly GeneDef rjw_genes_bisexual; public static readonly GeneDef rjw_genes_no_sex_need; + public static readonly GeneDef LitteredBirths; - // Damage & Side Effects - [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_elasticity; + // Damage & Side Effects + [MayRequire("LustLicentia.RJWLabs")] public static readonly GeneDef rjw_genes_elasticity; public static readonly GeneDef rjw_genes_unbreakable; // Special @@ -83,36 +98,33 @@ namespace RJW_Genes public static readonly GeneDef rjw_genes_sexual_mytosis; public static readonly GeneDef rjw_genes_hormonal_saliva; - // LifeForce - public static readonly GeneDef rjw_genes_lifeforce; - public static readonly GeneDef rjw_genes_pussyhealing; - public static readonly GeneDef rjw_genes_lifeforce_drain; - public static readonly GeneDef rjw_genes_cum_eater; - public static readonly GeneDef rjw_genes_fertilin_absorber; - public static readonly GeneDef rjw_genes_drainer; - public static readonly GeneDef rjw_genes_seduce; - public static readonly GeneDef rjw_genes_paralysingkiss; - public static readonly GeneDef rjw_genes_cockeater; - public static readonly GeneDef rjw_genes_lifeforce_empath; - // Cosmetic public static readonly GeneDef rjw_genes_succubus_tail; - public static readonly GeneDef rjw_genes_succubus_wings; + public static readonly GeneDef rjw_genes_succubus_wings; - // Hive - public static readonly GeneDef rjw_genes_queen; - public static readonly GeneDef rjw_genes_drone; - public static readonly GeneDef rjw_genes_worker; - public static readonly GeneDef rjw_genes_zealous_loyalty; - public static readonly GeneDef rjw_genes_cocoonweaver; - public static readonly GeneDef rjw_genes_spawn_spelopede; + //life force + public static readonly GeneDef rjw_genes_lifeforce; + public static readonly GeneDef rjw_genes_pussyhealing; + public static readonly GeneDef rjw_genes_lifeforce_drain; + public static readonly GeneDef rjw_genes_cum_eater; + public static readonly GeneDef rjw_genes_fertilin_absorber; + public static readonly GeneDef rjw_genes_drainer; + public static readonly GeneDef rjw_genes_seduce; + public static readonly GeneDef rjw_genes_paralysingkiss; + public static readonly GeneDef rjw_genes_cockeater; + public static readonly GeneDef rjw_genes_lifeforce_empath; + + //Other Defs + public static readonly XenotypeDef rjw_genes_succubus; + public static readonly DutyDef rjw_genes_flirt; + public static readonly MentalBreakDef rjw_genes_lifeforce_randomrape; + [MayRequire("resplice.xotr.charmweavers")] public static GeneDef RS_LoveFeed = DefDatabase.GetNamed("RS_LoveFeed", false); + [MayRequire("resplice.xotr.charmweavers")] public static GeneDef RS_MultiPregnancy = DefDatabase.GetNamed("RS_MultiPregnancy", false); + [MayRequire("redmattis.bigsmall.core")] public static GeneDef VU_VampireLover = DefDatabase.GetNamed("VU_VampireLover", false); + [MayRequire("vanillaracesexpanded.highmate")] public static GeneDef VRE_LovinDependency = DefDatabase.GetNamed("VRE_LovinDependency", false); - //Other Defs - public static readonly XenotypeDef rjw_genes_succubus; - public static readonly DutyDef rjw_genes_flirt; - public static readonly MentalBreakDef rjw_genes_lifeforce_randomrape; - } + } } diff --git a/Source/Genes/Hive/Genes/Gene_FerventOvipositor.cs b/Source/Genes/Breeding/Gene_FerventOvipositor.cs similarity index 93% rename from Source/Genes/Hive/Genes/Gene_FerventOvipositor.cs rename to Source/Genes/Breeding/Gene_FerventOvipositor.cs index 353148a..3d8f612 100644 --- a/Source/Genes/Hive/Genes/Gene_FerventOvipositor.cs +++ b/Source/Genes/Breeding/Gene_FerventOvipositor.cs @@ -27,7 +27,7 @@ namespace RJW_Genes if (pawn == null) return; - Hediff_PartBaseNatural OvipositorF = (Hediff_PartBaseNatural) pawn.health.hediffSet.GetFirstHediffOfDef(rjw.Genital_Helper.ovipositorF); + Hediff_PartBaseNatural OvipositorF = (Hediff_PartBaseNatural)pawn.health.hediffSet.GetFirstHediffOfDef(rjw.Genital_Helper.ovipositorF); if (OvipositorF == null) return; @@ -39,4 +39,4 @@ namespace RJW_Genes } -} +} \ No newline at end of file diff --git a/Source/Genes/Hive/Genes/Gene_InsectIncubator.cs b/Source/Genes/Breeding/Gene_InsectIncubator.cs similarity index 93% rename from Source/Genes/Hive/Genes/Gene_InsectIncubator.cs rename to Source/Genes/Breeding/Gene_InsectIncubator.cs index 5173dd0..ce53827 100644 --- a/Source/Genes/Hive/Genes/Gene_InsectIncubator.cs +++ b/Source/Genes/Breeding/Gene_InsectIncubator.cs @@ -15,13 +15,10 @@ namespace RJW_Genes /// 1. Is it fertilized ? => tick it down "extra". /// 2. Is it not fertilized? => fertilize it with the Incubator as parent /// - /// To save performance, this gene fires (default) every 0.5h, which also means a slight delay until fertilization happens. - /// - /// Important: The other half of the behavior for the gene (more egg-capacity) is in `Patch_InsectINcubator_PregnancyHelper`. + /// To save performance, this gene fires (default) every 0.5h, which also means a slight delay until fertilization happens. /// public class Gene_InsectIncubator : Gene { - const int TICK_INTERVAL = 60000 / 48; // 60k = 1 day, we want 0.5h which is 1/48th of 1 day. public override void Tick() @@ -43,7 +40,8 @@ namespace RJW_Genes if (egg.implanter == null || egg.implanter == pawn) continue; - if (!egg.fertilized && egg.implanter != null) { + if (!egg.fertilized && egg.implanter != null) + { egg.Fertilize(pawn); // DevNote Issue 38: Sometimes Eggs are not fertilized here, because the normal Fertilize Function is called which has an upper Limit on Gestation. // I will not do anything about it here, maybe upstream, but I print here. diff --git a/Source/Genes/Cum/Patch_Cumflation.cs b/Source/Genes/Cum/Patch_Cumflation.cs index 9e26a26..a1f54a7 100644 --- a/Source/Genes/Cum/Patch_Cumflation.cs +++ b/Source/Genes/Cum/Patch_Cumflation.cs @@ -9,7 +9,6 @@ using HarmonyLib; using rjw; using RimWorld; using Verse; -using LicentiaLabs; namespace RJW_Genes { diff --git a/Source/Genes/Cum/Patch_TransferNutrition.cs b/Source/Genes/Cum/Patch_TransferNutrition.cs index cf8d92d..1f3f0bb 100644 --- a/Source/Genes/Cum/Patch_TransferNutrition.cs +++ b/Source/Genes/Cum/Patch_TransferNutrition.cs @@ -9,7 +9,7 @@ using HarmonyLib; using rjw; using RimWorld; using Verse; -using LicentiaLabs; + namespace RJW_Genes { @@ -29,13 +29,17 @@ namespace RJW_Genes // I could have done some transpiler stuff, but that is scary and might need to be adjusted quite a lot // Hence, I simply re-book the nutrition back to the giver in the Postfix. That should be robust and easy. - if (GeneUtility.IsGenerousDonor(giver)) { + /* + TODO: Move this back in, once Licentia is 1.5 compatible. It should not drastically change. + if (GeneUtility.IsGenerousDonor(giver)) + { float donatedNutrition = CumflationHelper.CalculateNutritionAmount(giver, cumAmount); // TODO: In theory, there could be something weird happening if the donor has food less than X and the "IgnoreThermodynamics" is set on. // Then it can happen that the donor ends up with more food than he had before cumshot, but I think that is somewhat funny given that you have ignore Thermodynamics on. Need_Food inflatorFood = giver.needs.TryGetNeed(); inflatorFood.CurLevel += donatedNutrition; } + */ } } } \ No newline at end of file diff --git a/Source/Genes/Damage/Gene_Elasticity.cs b/Source/Genes/Damage/Gene_Elasticity.cs index 5d92b51..5d26c07 100644 --- a/Source/Genes/Damage/Gene_Elasticity.cs +++ b/Source/Genes/Damage/Gene_Elasticity.cs @@ -1,6 +1,9 @@ -using LicentiaLabs; +//using LicentiaLabs; using Verse; + +// TODO: Re-Introduce this once Licentia is 1.5 +// It should be rather simple namespace RJW_Genes { /// @@ -12,12 +15,13 @@ namespace RJW_Genes { private const int RESET_INTERVAL = 60000; // 60k should be 1 day + /* public override void PostAdd() { base.PostAdd(); // Doing it like this will add the hediff with a severity of ~0.5, but it will decay. // Hence we check with the Ticks to update. - this.pawn.health.AddHediff(Licentia.HediffDefs.Elasticised); + this.pawn.health.AddHediff(Licentia.HediffDefs.Elasticised); ResetSeverity(); } @@ -47,5 +51,6 @@ namespace RJW_Genes candidate.Severity = severity; } } + */ } -} +} \ No newline at end of file diff --git a/Source/Genes/ExtraGenitalia/Gene_Femboy.cs b/Source/Genes/ExtraGenitalia/Gene_Femboy.cs new file mode 100644 index 0000000..6641025 --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_Femboy.cs @@ -0,0 +1,63 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_Femboy : RJW_Gene + { + // Token: 0x06000335 RID: 821 RVA: 0x0000401D File Offset: 0x0000221D + public override void PostMake() + { + base.PostMake(); + if (GenderUtility.IsMale(this.pawn) && this.additional_genital == null) + { + this.CreateAndAddVagina(); + } + } + + // Token: 0x06000336 RID: 822 RVA: 0x00004040 File Offset: 0x00002240 + public override void PostAdd() + { + base.PostAdd(); + if (this.pawn.gender == Gender.Male && this.additional_genital == null) + { + this.CreateAndAddVagina(); + } + } + + // Token: 0x06000337 RID: 823 RVA: 0x0000EE4C File Offset: 0x0000D04C + internal void CreateAndAddVagina() + { + if (this.pawn.gender != Gender.Female) + { + GenderHelper.ChangeSex(this.pawn, delegate () + { + this.pawn.gender = Gender.Female; + GenitaliaChanger.RemoveAllGenitalia(this.pawn); + Sexualizer.sexualize_pawn(this.pawn); + }); + GenderUtility.AdjustBodyToTargetGender(this.pawn, Gender.Female); + } + BodyPartRecord bodyPartRecord = Genital_Helper.get_genitalsBPR(this.pawn); + Hediff hediff = Genital_Helper.get_AllPartsHediffList(this.pawn).FindLast((Hediff x) => Genital_Helper.is_vagina(x)); + if (hediff != null) + { + this.pawn.health.RemoveHediff(hediff); + } + HediffDef penisForGene = GenitaliaUtility.GetPenisForGene(GenitaliaUtility.GetGenitaliaTypeGeneForPawn(this.pawn)); + BodyPartRecord part = Genital_Helper.get_genitalsBPR(this.pawn); + this.additional_genital = HediffMaker.MakeHediff(penisForGene, this.pawn, null); + CompHediffBodyPart compHediffBodyPart = this.additional_genital.TryGetComp(); + if (compHediffBodyPart != null) + { + compHediffBodyPart.initComp(this.pawn, false); + compHediffBodyPart.updatesize(0f); + } + this.pawn.health.AddHediff(this.additional_genital, part, null, null); + } + + // Token: 0x040001B0 RID: 432 + internal Hediff additional_genital; + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_UdderBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_UdderBreasts.cs index e098a8c..87f2a20 100644 --- a/Source/Genes/ExtraGenitalia/Gene_UdderBreasts.cs +++ b/Source/Genes/ExtraGenitalia/Gene_UdderBreasts.cs @@ -14,21 +14,12 @@ namespace RJW_Genes public class Gene_UdderBreasts : RJW_Gene { - Hediff removed_breasts; Hediff added_udders; public override void PostMake() { base.PostMake(); - // Breasts are replaced for female,trap and futa pawns - if ( removed_breasts == null - && (GenderUtility.IsFemale(pawn) || GenderHelper.GetSex(pawn) == GenderHelper.Sex.futa || GenderHelper.GetSex(pawn) == GenderHelper.Sex.trap) - ) - { - RemoveButStoreBreasts(); - AddUdders(); - } } @@ -36,42 +27,31 @@ namespace RJW_Genes { base.PostAdd(); - // Breasts are replaced for female,trap and futa pawns - if (removed_breasts == null - && (GenderUtility.IsFemale(pawn) || GenderHelper.GetSex(pawn) == GenderHelper.Sex.futa || GenderHelper.GetSex(pawn) == GenderHelper.Sex.trap) - ) - { - RemoveButStoreBreasts(); - AddUdders(); - } + AddUdders(); + } public override void PostRemove() { base.PostRemove(); - // Re-Add the old breasts - if (removed_breasts != null) - pawn.health.AddHediff(removed_breasts); + if (added_udders != null) pawn.health.RemoveHediff(added_udders); } - 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 AddUdders() { + CompHediffBodyPart CompHediff = null; BodyPartRecord bpr = Genital_Helper.get_uddersBPR(pawn); added_udders = pawn.health.AddHediff(Genital_Helper.udder_breasts, bpr); + added_udders.TryGetComp(); + if (CompHediff != null) + { + CompHediff.initComp(pawn); + CompHediff.updatesize(); + } + } } diff --git a/Source/Genes/Gender/GenderUtility.cs b/Source/Genes/Gender/GenderUtility.cs index 700f3c9..88aa063 100644 --- a/Source/Genes/Gender/GenderUtility.cs +++ b/Source/Genes/Gender/GenderUtility.cs @@ -69,7 +69,6 @@ namespace RJW_Genes } // Force Redraw at the spot - pawn.Drawer.renderer.graphics.SetAllGraphicsDirty(); } // Fetch these once at load time because they don't change inside RJW diff --git a/Source/Genes/Gender/Gene_GenderFluid.cs b/Source/Genes/Gender/Gene_GenderFluid.cs index 1ffdf20..bdd5c00 100644 --- a/Source/Genes/Gender/Gene_GenderFluid.cs +++ b/Source/Genes/Gender/Gene_GenderFluid.cs @@ -138,7 +138,6 @@ namespace RJW_Genes SwitchBreasts(); - RemoveLicentiaVaginaHediffs(); } @@ -199,38 +198,7 @@ namespace RJW_Genes /// Checks the pawn if it has any of the vagina-related hediffs (e.g. stretched) and removes them. /// Anal Soreness, Stretching etc. remains. /// - private void RemoveLicentiaVaginaHediffs() - { - try - { - if (ModsConfig.IsActive("LustLicentia.RJWLabs")){ - Hediff cumflation = pawn.health.hediffSet.GetFirstHediffOfDef(LicentiaLabs.Licentia.HediffDefs.Cumflation); - if (cumflation != null) - pawn.health.RemoveHediff(cumflation); - - Hediff stretched = pawn.health.hediffSet.GetFirstHediffOfDef(LicentiaLabs.Licentia.HediffDefs.Stretched); - if (stretched != null && stretched.Part != Genital_Helper.get_anusBPR(pawn)) - pawn.health.RemoveHediff(stretched); - - Hediff torn = pawn.health.hediffSet.GetFirstHediffOfDef(LicentiaLabs.Licentia.HediffDefs.StretchTear); - if (torn != null && torn.Part != Genital_Helper.get_anusBPR(pawn)) - pawn.health.RemoveHediff(torn); - - Hediff prolapsed = pawn.health.hediffSet.GetFirstHediffOfDef(LicentiaLabs.Licentia.HediffDefs.Prolapse); - if (prolapsed != null && prolapsed.Part != Genital_Helper.get_anusBPR(pawn)) - pawn.health.RemoveHediff(prolapsed); - - Hediff extremeProlapsed = pawn.health.hediffSet.GetFirstHediffOfDef(LicentiaLabs.Licentia.HediffDefs.ExtremeProlapse); - if (extremeProlapsed != null && extremeProlapsed.Part != Genital_Helper.get_anusBPR(pawn)) - pawn.health.RemoveHediff(extremeProlapsed); - }; - } - //TODO: Don't make this an "catch all" Exception! - catch (Exception ex) - { - // To be expected for people without Licentia Labs, do nothing. - } - } + /// @@ -252,8 +220,6 @@ namespace RJW_Genes || (pawn.jobs.curDriver is JobDriver_SexQuick) || (pawn.jobs.curDriver is JobDriver_SexBaseRecieverQuickie) - || (pawn.jobs.curDriver is JobDriver_SexOnSpot) - || (pawn.jobs.curDriver is JobDriver_SexOnSpotReciever) || (pawn.jobs.curDriver is JobDriver_Knotted) || (pawn.jobs.curDriver is JobDriver_Mate) diff --git a/Source/Genes/GeneUtility.cs b/Source/Genes/GeneUtility.cs index c46e6e1..f0892af 100644 --- a/Source/Genes/GeneUtility.cs +++ b/Source/Genes/GeneUtility.cs @@ -6,7 +6,7 @@ namespace RJW_Genes { public class GeneUtility { - + //Split function so I can offsetlifeforce from gene without needing to look for the gene agian (for the constant drain tick) public static Gene_LifeForce GetLifeForceGene(Pawn pawn) { @@ -16,8 +16,9 @@ namespace RJW_Genes } public static void OffsetLifeForce(IGeneResourceDrain drain, float offset) - { - if (drain.Resource != null && drain.Resource.Active) { + { + if (drain.Resource != null && drain.Resource.Active) + { float old_value = drain.Resource.Value; drain.Resource.Value += offset; PostOffSetLifeForce(drain, old_value); @@ -49,7 +50,7 @@ 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) @@ -75,15 +76,7 @@ namespace RJW_Genes return false; } - public static float MaxEggSizeMul(Pawn pawn) - { - float MaxEggSize = 1; - if (IsInsectIncubator(pawn)) - { - MaxEggSize *= 2; - } - return MaxEggSize; - } + public static List GetGenitaliaResizingGenes(Pawn pawn) { var ResizingGenes = new List(); @@ -112,15 +105,13 @@ namespace RJW_Genes { return false; } - return pawn.genes.HasGene(genedef); + return pawn.genes.HasActiveGene(genedef); } public static bool HasLifeForce(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_lifeforce); } public static bool IsMechbreeder(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_mechbreeder); } - public static bool IsInsectIncubator(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_insectincubator); } public static bool IsYouthFountain(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_youth_fountain); } public static bool IsAgeDrainer(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_sex_age_drain); } - public static bool IsInsectBreeder(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_insectbreeder); } public static bool IsElastic(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_elasticity); } public static bool IsCumflationImmune(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_cumflation_immunity); } public static bool IsGenerousDonor(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_generous_donor); } diff --git a/Source/Genes/Genitalia/Defs/GenitaliaTypeExtension.cs b/Source/Genes/Genitalia/Defs/GenitaliaTypeExtension.cs new file mode 100644 index 0000000..fce2ded --- /dev/null +++ b/Source/Genes/Genitalia/Defs/GenitaliaTypeExtension.cs @@ -0,0 +1,15 @@ +using Verse; +using RimWorld; +using rjw; + +namespace RJW_Genes +{ + public class GenitaliaTypeExtension : DefModExtension + { + public HediffDef_PartBase penis; + + public HediffDef_PartBase vagina; + + public HediffDef_PartBase anus; + } +} diff --git a/Source/Genes/Genitalia/Gene_CanineGenitalia.cs b/Source/Genes/Genitalia/Gene_CanineGenitalia.cs deleted file mode 100644 index 01f0015..0000000 --- a/Source/Genes/Genitalia/Gene_CanineGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_CanineGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.canine_penis,Genital_Helper.canine_vagina,Genital_Helper.generic_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.canine_penis, Genital_Helper.canine_vagina, Genital_Helper.generic_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs b/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs deleted file mode 100644 index cc0cc29..0000000 --- a/Source/Genes/Genitalia/Gene_DemonicGenitalia.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Verse; -using RimWorld; -using rjw; - -namespace RJW_Genes -{ - public class Gene_DemonicGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.demon_penis,Genital_Helper.demon_vagina,Genital_Helper.demon_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.demon_penis, Genital_Helper.demon_vagina, Genital_Helper.demon_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_DragonGenitalia.cs b/Source/Genes/Genitalia/Gene_DragonGenitalia.cs deleted file mode 100644 index 34d24f6..0000000 --- a/Source/Genes/Genitalia/Gene_DragonGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_DragonGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.dragon_penis,Genital_Helper.dragon_vagina,Genital_Helper.generic_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.dragon_penis, Genital_Helper.dragon_vagina, Genital_Helper.generic_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_EquineGenitalia.cs b/Source/Genes/Genitalia/Gene_EquineGenitalia.cs deleted file mode 100644 index 74b8b2f..0000000 --- a/Source/Genes/Genitalia/Gene_EquineGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_EquineGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.equine_penis,Genital_Helper.equine_vagina,Genital_Helper.generic_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.equine_penis, Genital_Helper.equine_vagina, Genital_Helper.generic_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_FelineGenitalia.cs b/Source/Genes/Genitalia/Gene_FelineGenitalia.cs deleted file mode 100644 index 2fe4882..0000000 --- a/Source/Genes/Genitalia/Gene_FelineGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_FelineGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.feline_penis,Genital_Helper.feline_vagina,Genital_Helper.generic_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.feline_penis, Genital_Helper.feline_vagina, Genital_Helper.generic_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_GenitaliaType.cs b/Source/Genes/Genitalia/Gene_GenitaliaType.cs new file mode 100644 index 0000000..7ffda55 --- /dev/null +++ b/Source/Genes/Genitalia/Gene_GenitaliaType.cs @@ -0,0 +1,34 @@ +using rjw; + +namespace RJW_Genes +{ + // bleh plural attributive noun in keeping with naming convention + public class Gene_GenitaliaType : RJW_Gene + { + public override void PostMake() + { + base.PostMake(); + + } + + public override void PostAdd() + { + base.PostAdd(); + Apply(); + } + + protected virtual void Apply() + { + if (this.Active) + { + GenitaliaTypeExtension genitals = def.GetModExtension(); + if (genitals == null && RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Error($"Gene {def} failed to change genitals - Need a modExtension with Class=\"{typeof(GenitaliaTypeExtension).FullName}\"."); + return; + } + GenitaliaChanger.ChangeGenitalia(pawn, genitals.penis, genitals.vagina, genitals.anus); + } + } + } +} \ No newline at end of file diff --git a/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs b/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs deleted file mode 100644 index b7a1141..0000000 --- a/Source/Genes/Genitalia/Gene_OvipositorGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_OvipositorGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.ovipositorM,Genital_Helper.ovipositorF,Genital_Helper.insect_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.ovipositorM, Genital_Helper.ovipositorF, Genital_Helper.insect_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs b/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs deleted file mode 100644 index 5671f1f..0000000 --- a/Source/Genes/Genitalia/Gene_SlimeGenitalia.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Verse; -using rjw; - -namespace RJW_Genes -{ - public class Gene_SlimeGenitalia : RJW_Gene - { - public override void PostMake() - { - base.PostMake(); - - GenitaliaChanger.ChangeGenitalia(this.pawn,Genital_Helper.slime_penis,Genital_Helper.slime_vagina,Genital_Helper.slime_anus); - } - - public override void PostAdd() - { - base.PostAdd(); - GenitaliaChanger.ChangeGenitalia(this.pawn, Genital_Helper.slime_penis, Genital_Helper.slime_vagina, Genital_Helper.slime_anus); - } - } - -} diff --git a/Source/Genes/Genitalia/GenitaliaChanger.cs b/Source/Genes/Genitalia/GenitaliaChanger.cs index 48ddc4d..86d112b 100644 --- a/Source/Genes/Genitalia/GenitaliaChanger.cs +++ b/Source/Genes/Genitalia/GenitaliaChanger.cs @@ -16,7 +16,7 @@ namespace RJW_Genes /// the new type of penis /// the new type of vagina /// the new type of anus - public static void ChangeGenitalia(Pawn pawn, HediffDef penisReplacement, HediffDef vaginaReplacement, HediffDef anusReplacement) + public static void ChangeGenitalia(Pawn pawn, HediffDef penisReplacement = null, HediffDef vaginaReplacement = null, HediffDef anusReplacement = null) { var oldParts = Genital_Helper.get_AllPartsHediffList(pawn); BodyPartRecord correctBPR; @@ -34,13 +34,13 @@ namespace RJW_Genes replacementGenital = null; CompHediff = null; - if (Genital_Helper.is_penis(existingGenital)) + if (Genital_Helper.is_penis(existingGenital) && penisReplacement != null && existingGenital.def != penisReplacement) replacementGenital = HediffMaker.MakeHediff(penisReplacement, pawn, correctBPR); - if (Genital_Helper.is_vagina(existingGenital)) + if (Genital_Helper.is_vagina(existingGenital) && vaginaReplacement != null && existingGenital.def != vaginaReplacement) replacementGenital = HediffMaker.MakeHediff(vaginaReplacement, pawn, correctBPR); - if (IsAnus(existingGenital)) + if (IsAnus(existingGenital) && anusReplacement != null && existingGenital.def != anusReplacement) { correctBPR = Genital_Helper.get_anusBPR(pawn); replacementGenital = HediffMaker.MakeHediff(anusReplacement, pawn, correctBPR); diff --git a/Source/Genes/Genitalia/GenitaliaUtility.cs b/Source/Genes/Genitalia/GenitaliaUtility.cs index c762071..a56d9ae 100644 --- a/Source/Genes/Genitalia/GenitaliaUtility.cs +++ b/Source/Genes/Genitalia/GenitaliaUtility.cs @@ -19,7 +19,7 @@ namespace RJW_Genes foreach (var gene in pawn.genes.GenesListForReading) { - if (gene.def.defName.Contains("rjw_genes") && gene.def.defName.EndsWith("_genitalia")) + if (gene is Gene_GenitaliaType) if (!gene.Overridden) return gene.def; } @@ -29,60 +29,19 @@ namespace RJW_Genes public static HediffDef GetPenisForGene(GeneDef gene) { - if (gene == null) - return Genital_Helper.average_penis; - - switch (gene.defName) - { - case "rjw_genes_equine_genitalia": return Genital_Helper.equine_penis; - case "rjw_genes_canine_genitalia": return Genital_Helper.canine_penis; - case "rjw_genes_feline_genitalia": return Genital_Helper.feline_penis; - case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_penis; - case "rjw_genes_dragon_genitalia": return Genital_Helper.dragon_penis; - case "rjw_genes_slime_genitalia": return Genital_Helper.slime_penis; - case "rjw_genes_ovipositor_genitalia": return Genital_Helper.ovipositorM; - - default: return Genital_Helper.average_penis; - } + return gene?.GetModExtension()?.penis ?? Genital_Helper.average_penis; } public static HediffDef GetVaginaForGene(GeneDef gene) { - if (gene == null) - return Genital_Helper.average_vagina; - - switch (gene.defName) - { - case "rjw_genes_equine_genitalia": return Genital_Helper.equine_vagina; - case "rjw_genes_canine_genitalia": return Genital_Helper.canine_vagina; - case "rjw_genes_feline_genitalia": return Genital_Helper.feline_vagina; - case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_vagina; - case "rjw_genes_dragon_genitalia": return Genital_Helper.dragon_vagina; - case "rjw_genes_slime_genitalia": return Genital_Helper.slime_vagina; - case "rjw_genes_ovipositor_genitalia": return Genital_Helper.ovipositorF; - - default: return Genital_Helper.average_vagina; - } + return gene?.GetModExtension()?.vagina ?? Genital_Helper.average_vagina; } public static HediffDef GetAnusForGene(GeneDef gene) { - if (gene == null) - return Genital_Helper.average_anus; - switch (gene.defName) - { - //TODO: Do I want the default to be generic or average for feline,equine and canine? - case "rjw_genes_equine_genitalia": return Genital_Helper.average_anus; - case "rjw_genes_canine_genitalia": return Genital_Helper.average_anus; - case "rjw_genes_feline_genitalia": return Genital_Helper.average_anus; - case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_anus; - case "rjw_genes_dragon_genitalia": return Genital_Helper.average_anus; - case "rjw_genes_slime_genitalia": return Genital_Helper.slime_anus; - case "rjw_genes_ovipositor_genitalia": return Genital_Helper.insect_anus; - - default: return Genital_Helper.generic_anus; - } + //TODO: Do I want the default to be generic or average for feline,equine and canine? + return gene?.GetModExtension()?.anus ?? Genital_Helper.average_anus; } public static HediffDef GetBreastsForGene(GeneDef gene) @@ -102,7 +61,7 @@ namespace RJW_Genes case "rjw_genes_udder_breasts": return Genital_Helper.udder_breasts; case "rjw_genes_ovipositor_genitalia": return Genital_Helper.average_breasts; - default: return Genital_Helper.generic_breasts; + default: return Genital_Helper.average_breasts; } } diff --git a/Source/Genes/GenitaliaSize/Gene_EvergrowingGenitalia.cs b/Source/Genes/GenitaliaSize/Gene_EvergrowingGenitalia.cs index cbb37a9..552ac20 100644 --- a/Source/Genes/GenitaliaSize/Gene_EvergrowingGenitalia.cs +++ b/Source/Genes/GenitaliaSize/Gene_EvergrowingGenitalia.cs @@ -1,5 +1,4 @@ using Verse; -using Verse; using RimWorld; using rjw; using System.Collections.Generic; @@ -10,22 +9,15 @@ namespace RJW_Genes public class Gene_EvergrowingGenitalia : RJW_Gene { - /// - /// The age (in years) at which the Pawns Genes will take effect, resizing their genitalia. - /// - public const int RESIZING_AGE = 20; - - //public const int GROWTH_INTERVAL = 1000; // Test value for Quick Trials - public const int GROWTH_INTERVAL_FALLBACK = 60000; // 60k == 1 day public override void Tick() { base.Tick(); - int interval = ModExtensionHelper.GetTickIntervalFromModExtension(GeneDefOf.rjw_genes_evergrowth, GROWTH_INTERVAL_FALLBACK); + int interval = ModExtensionHelper.GetTickIntervalFromModExtension(GeneDefOf.rjw_genes_evergrowth, RJW_Genes_Settings.rjw_genes_evergrowth_ticks); if (pawn.IsHashIntervalTick(interval) && this.pawn.Map != null - && pawn.ageTracker.AgeBiologicalYears >= RESIZING_AGE) + && pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age) { GrowPenisses(); GrowVaginas(); diff --git a/Source/Genes/GenitaliaSize/Gene_GenitaliaResizingGene.cs b/Source/Genes/GenitaliaSize/Gene_GenitaliaResizingGene.cs index 1a9cc73..adae607 100644 --- a/Source/Genes/GenitaliaSize/Gene_GenitaliaResizingGene.cs +++ b/Source/Genes/GenitaliaSize/Gene_GenitaliaResizingGene.cs @@ -17,10 +17,7 @@ namespace RJW_Genes public abstract class Gene_GenitaliaResizingGene : RJW_Gene { - /// - /// The age (in years) at which the Pawns Genes will take effect, resizing their genitalia. - /// - public const int RESIZING_AGE = 20; + /// /// Whether or not the gene was already applied. @@ -33,7 +30,7 @@ namespace RJW_Genes public override void PostMake() { base.PostMake(); - if (pawn.ageTracker.AgeBiologicalYears >= RESIZING_AGE) + if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age) { Resize(); ResizingWasApplied = true; @@ -43,7 +40,7 @@ namespace RJW_Genes public override void PostAdd() { base.PostAdd(); - if (pawn.ageTracker.AgeBiologicalYears >= RESIZING_AGE) + if (pawn.ageTracker.AgeBiologicalYears >= RJW_Genes_Settings.rjw_genes_resizing_age) { Resize(); ResizingWasApplied = true; diff --git a/Source/Genes/GenitaliaSize/Patch_ResizingOnAdulthood.cs b/Source/Genes/GenitaliaSize/Patch_ResizingOnAdulthood.cs index 4fa1904..448c873 100644 --- a/Source/Genes/GenitaliaSize/Patch_ResizingOnAdulthood.cs +++ b/Source/Genes/GenitaliaSize/Patch_ResizingOnAdulthood.cs @@ -16,7 +16,7 @@ namespace RJW_Genes static void Postfix(Pawn ___pawn, int birthdayAge) { - if (birthdayAge >= Gene_GenitaliaResizingGene.RESIZING_AGE) + if (birthdayAge >= RJW_Genes_Settings.rjw_genes_resizing_age) { foreach(Gene_GenitaliaResizingGene gene in GeneUtility.GetGenitaliaResizingGenes(___pawn)) { diff --git a/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs b/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs deleted file mode 100644 index af362aa..0000000 --- a/Source/Genes/Hive/Abilities/CompAbilityEffect_CocoonWeaver.cs +++ /dev/null @@ -1,81 +0,0 @@ -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/CompAbilityEffect_SpawnSpelopede.cs b/Source/Genes/Hive/Abilities/CompAbilityEffect_SpawnSpelopede.cs deleted file mode 100644 index 4932949..0000000 --- a/Source/Genes/Hive/Abilities/CompAbilityEffect_SpawnSpelopede.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Verse; -using RimWorld; -using rjw; -using RimWorld.Planet; -using System; - -namespace RJW_Genes -{ - /// - /// Spawns tame spelopedes at the caster. - /// - /// TODO: Play some sound? I think this can be done with some CompProperties. - /// - public class CompAbilityEffect_SpawnSpelopede : CompAbilityEffect - { - public CompProperties_AbilitySpawnSpelopede Props => (CompProperties_AbilitySpawnSpelopede) this.props; - - public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) - { - base.Apply(target, dest); - - - int spelopedesToSpawn = CalculateSpelopedeAmount(); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Using Spelopede Spawn, spawning {spelopedesToSpawn}"); - - for (int i = 0; i < spelopedesToSpawn; i++) { - var request = new PawnGenerationRequest( - this.Props.pawnKindDef, - faction: this.parent.pawn.Faction, - forceGenerateNewPawn: true, - fixedBiologicalAge: 0.0f, - fixedChronologicalAge: 0.0f, - canGeneratePawnRelations: false, - colonistRelationChanceFactor: 0.0f - ); - - - Pawn insect = PawnGenerator.GeneratePawn(request); - PawnUtility.TrySpawnHatchedOrBornPawn(insect, this.parent.pawn); - - if (Props.tamed) - { - insect.training.Train(TrainableDefOf.Tameness, this.parent.pawn, true); - insect.training.Train(TrainableDefOf.Obedience, this.parent.pawn, true); - insect.training.Train(TrainableDefOf.Release, this.parent.pawn, true); - - // I could do bonding here, but I think it's nicer if the queen is not "bonded" to their offspring. - } - } - - MakeDirt(1); - - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message("Finished Spelopede Spawn"); - - } - - private int CalculateSpelopedeAmount() - { - Pawn caster = this.parent.pawn; - float spelopedes = Props.sensitivityMultiplier * caster.psychicEntropy.PsychicSensitivity; - return (spelopedes > 1.49f) ? (int)Math.Round(spelopedes) : 1; - } - - private void MakeDirt(int multiplier = 1) - { - Pawn caster = this.parent.pawn; - - FilthMaker.TryMakeFilth(caster.Position, caster.Map, ThingDefOf.Filth_AmnioticFluid, caster.LabelIndefinite(), count: Rand.Range(5,5*multiplier)); - } - - public override bool Valid(LocalTargetInfo target, bool throwMessages = false) - { - if (!target.Cell.Filled(this.parent.pawn.Map) && (target.Cell.GetEdifice(this.parent.pawn.Map) == null)) - return true; - if (throwMessages) - Messages.Message((string)("CannotUseAbility".Translate((NamedArgument)this.parent.def.label) + ": " + "AbilityOccupiedCells".Translate()), (LookTargets)target.ToTargetInfo(this.parent.pawn.Map), MessageTypeDefOf.RejectInput, false); - return false; - } - } -} diff --git a/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs b/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs deleted file mode 100644 index e73d22d..0000000 --- a/Source/Genes/Hive/Abilities/CompProperties_AbilityCocoonWeaver.cs +++ /dev/null @@ -1,18 +0,0 @@ -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/Hive/Abilities/CompProperties_AbilitySpawnSpelopede.cs b/Source/Genes/Hive/Abilities/CompProperties_AbilitySpawnSpelopede.cs deleted file mode 100644 index 1bf71df..0000000 --- a/Source/Genes/Hive/Abilities/CompProperties_AbilitySpawnSpelopede.cs +++ /dev/null @@ -1,21 +0,0 @@ -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_AbilitySpawnSpelopede : CompProperties_AbilityEffect - { - public PawnKindDef pawnKindDef; - public float sensitivityMultiplier; - public bool tamed; - public CompProperties_AbilitySpawnSpelopede() - { - this.compClass = typeof(CompAbilityEffect_SpawnSpelopede); - } - } -} diff --git a/Source/Genes/Hive/Defs/HiveOffspringChanceDef.cs b/Source/Genes/Hive/Defs/HiveOffspringChanceDef.cs deleted file mode 100644 index 77a4c28..0000000 --- a/Source/Genes/Hive/Defs/HiveOffspringChanceDef.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - public class HiveOffspringChanceDef : Def - { - - public string queenXenotype; - - // Chance of the below should be 1 when summed up! - // Otherwise the roll-logic fails. - - public double queenChance; - public double droneChance; - public double workerChance; - - } -} diff --git a/Source/Genes/Hive/Defs/QueenWorkerMappingDef.cs b/Source/Genes/Hive/Defs/QueenWorkerMappingDef.cs deleted file mode 100644 index b825c7c..0000000 --- a/Source/Genes/Hive/Defs/QueenWorkerMappingDef.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - /// - /// This def covers the birth of workers for each queen-xenotype. - /// - /// It is used when a baby is born to a pawn with the queen-xenotype; - /// There is a random check for the type of the baby, and if the baby is born to be a worker, - /// additional genes are looked up here. - /// - public class QueenWorkerMappingDef : Def - { - public string queenXenotype; - public List workerGenes; - } -} diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs deleted file mode 100644 index 22f0ba1..0000000 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using RimWorld; -using Verse; - -namespace RJW_Genes -{ - - /// - /// Checks if there are multiple queens on the map. - /// - public class ConditionalStatAffecter_MultipleQueens : ConditionalStatAffecter - { - public override string Label => (string)"StatsReport_MultipleQueens".Translate(); - - public override bool Applies(StatRequest req) - { - if (req.Pawn == null || !req.Pawn.Spawned) - return false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(req.Pawn)) - return false; - - if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty)) - { - return HiveUtility.QueensOnMap() >= 2; - } - - return false; - } - } -} diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs deleted file mode 100644 index 9a468df..0000000 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using RimWorld; -using Verse; - -namespace RJW_Genes -{ - - /// - /// Checks if there is no queen on the map. - /// - public class ConditionalStatAffecter_QueenAbsent : ConditionalStatAffecter - { - public override string Label => (string)"StatsReport_QueenAbsent".Translate(); - - public override bool Applies(StatRequest req) - { - if (req.Pawn == null || !req.Pawn.Spawned) - return false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(req.Pawn)) - return false; - - if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty)) - { - return HiveUtility.QueensOnMap() == 0; - } - - return false; - } - } -} diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs deleted file mode 100644 index e604b54..0000000 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using RimWorld; -using Verse; - -namespace RJW_Genes -{ - - /// - /// Checks if there is (exactly) one queen nearby. - /// If the pawn is a queen itself, it's checked if there are OTHER queens nearby. - /// While this is used for mostly positive things for workers and drones, for queens it checks if there is a rival nearby. - /// - public class ConditionalStatAffecter_QueenCloseBy : ConditionalStatAffecter - { - - const float EFFECT_DISTANCE = 10.0f; - - public override string Label => (string)"StatsReport_QueenCloseBy".Translate(); - - public override bool Applies(StatRequest req) - { - if (req.Pawn == null || !req.Pawn.Spawned) - return false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(req.Pawn)) - return false; - - // Case A: Check for Loyal Pawns if their One Queen is nearby - if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) - { - Pawn queen = HiveUtility.GetQueensOnMap()[0]; - - return req.Pawn.Position.DistanceTo(queen.Position) <= EFFECT_DISTANCE; - } - - // Case A: Check for Queen if another Queen is nearby - if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() >= 2) - { - foreach (Pawn queen in HiveUtility.GetQueensOnMap()) - { - if (queen != req.Pawn && req.Pawn.Position.DistanceTo(queen.Position) <= EFFECT_DISTANCE) - return true; - } - } - - - return false; - } - } -} diff --git a/Source/Genes/Hive/Helpers/HiveBirthLogic.cs b/Source/Genes/Hive/Helpers/HiveBirthLogic.cs deleted file mode 100644 index a706ea7..0000000 --- a/Source/Genes/Hive/Helpers/HiveBirthLogic.cs +++ /dev/null @@ -1,202 +0,0 @@ -using RimWorld; -using rjw; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Emit; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - /// - /// DevNote: Issue #37 came along because I checked for getMother() and getFather(), but it can happen that a pawn has two mothers. - /// They are called Mother if they have a ParentRelation and are female. - /// New behaviour iterates over all parents and returns the first queen/drone or null. - /// - public class HiveBirthLogic - { - /// - /// Central function for the Hive-Birth logic used in Patches. - /// *Only* run this, if the pawn has a queen parent (either as mother/father, or as implanter in case of egg-logic). - /// Covers the following behavior: - /// 1. look up the Defs for the mother and HiveOffspringChances (or defaults) - /// 2. If there is no drone involved, default to worker - /// 3. Roll a random dice - /// 3.1 Make a queen - /// 3.2 Make a drone - /// 3.3 Make a worker - /// - /// The pawn born, that maybe becomes a hive-xenotype. - /// whether there was a drone parent involved - public static void ManageHiveBirth(Pawn pawn, bool hasDroneParent = false, Either fallbackQueenDef = null, Either fallbackDroneDef = null) - { - Either queenDef = TryFindParentQueenXenotype(pawn); - if (queenDef == null) queenDef = fallbackQueenDef; - HiveOffspringChanceDef hiveOffspringChanceDef = HiveUtility.LookupHiveInheritanceChances(queenDef); - - // Case 1: Mother is Queen, Father is something else. Produce Worker. - if (!hasDroneParent) - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} was born as a worker, as it did not have Drone Father ({100}% chance)"); - MakeWorker(pawn, queenDef); - } - // Case 2: Mother is Queen, Father is drone. Apply xenotype as per chance. - else - { - double roll = (new Random()).NextDouble(); - // Case 2.a: New Queen born - if (roll < hiveOffspringChanceDef.queenChance) - { - MakeQueen(pawn, queenDef); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Queen Chance: {hiveOffspringChanceDef.queenChance * 100}% chance,rolled { roll}"); - } - // Case 2.b: New Drone born - else if (roll < hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) - { - var droneDef = TryFindParentDroneXenotype(pawn); - MakeDrone(pawn,droneDef); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Drone Chance ({(hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) * 100}% chance,rolled {roll}))"); - } - // Case 2.c: Worker - else - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a worker ({(hiveOffspringChanceDef.workerChance) * 100}% chance,rolled {roll}))"); - MakeWorker(pawn, queenDef); - } - } - } - - private static void MakeQueen(Pawn pawnToBeQueen, Either queenDef) { - if (queenDef == null && pawnToBeQueen == null) - return; - if (queenDef.isLeft) { - var xenotype = queenDef.left; - pawnToBeQueen.genes.SetXenotype(xenotype); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeQueen} born as a new queen with Xenotype {xenotype.defName}"); - } else { - var customXenotype = queenDef.right; - - foreach (var gene in customXenotype.genes) - pawnToBeQueen.genes.AddGene(gene, true); - - pawnToBeQueen.genes.xenotypeName = customXenotype.name; - pawnToBeQueen.genes.iconDef = customXenotype.iconDef; - - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeQueen} born as a new queen with custom Xenotype {customXenotype.name}"); - } - - MakeQueenBornLetter(pawnToBeQueen); - } - - - private static void MakeDrone(Pawn pawnToBeDrone, Either droneDef) - { - if (droneDef == null && pawnToBeDrone == null) - return; - if (droneDef.isLeft) - { - var xenotype = droneDef.left; - pawnToBeDrone.genes.SetXenotype(xenotype); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeDrone} born as a new drone with Xenotype {xenotype.defName}"); - } - else - { - var customXenotype = droneDef.right; - - foreach (var gene in customXenotype.genes) - pawnToBeDrone.genes.AddGene(gene, true); - - pawnToBeDrone.genes.xenotypeName = customXenotype.name; - pawnToBeDrone.genes.iconDef = customXenotype.iconDef; - - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawnToBeDrone} born as a new drone with custom Xenotype {customXenotype.name}"); - } - } - - /// - /// Turns a given pawn into a worker, by looking up the relevant genes as per queen. - /// - /// If the queen xenotype has no mapping, the "rjw_genes_default_worker_xenotype" are used instead. - /// The genes are added as endogenes, so the worker can still become a xenotype. - /// - /// The pawn for which the genes are added. - /// The xenotype of the queen, used for lookup. - private static void MakeWorker(Pawn pawnTobeWorker, Either queenDef) - { - if (pawnTobeWorker == null) - return; - - var mappings = HiveUtility.GetQueenWorkerMappings(); - String queenDefName = HiveUtility.GetXenotypeDefName(queenDef); - if (queenDef == null || mappings.NullOrEmpty()) - return; - - var genes = mappings.TryGetValue(queenDefName, HiveUtility.LookupDefaultWorkerGenes()); - if (genes == null) - return; - - foreach (var gene in genes) - pawnTobeWorker.genes.AddGene(gene, false); - - pawnTobeWorker.genes.xenotypeName = "Worker"; - } - - /// - /// Looks up if there is a Xenotype with Drone-Gene for the pawns parents. - /// This is to account that maybe father or mother are the drone (instead of hardcoding things for father). - /// If both are drones, the mothers is returned. - /// - /// The pawn for whichs parent the xenotypes is looked up. - /// The Drone-Xenotype of a parent or null. If both are drones, mothers are preferred. - public static Either TryFindParentDroneXenotype(Pawn pawn) - { - if (pawn == null) - return null; - - List parentRelations = pawn.relations.DirectRelations.FindAll(rel => rel.def.Equals(PawnRelationDefOf.Parent)); - foreach (DirectPawnRelation parent in parentRelations) - { - var xenotype = HiveUtility.TryGetDroneXenotype(parent.otherPawn); - if (xenotype != null) return xenotype; - } - - return null; - } - - public static void MakeQueenBornLetter(Pawn bornQueen) - { - if (bornQueen == null) return; - - var letter = LetterMaker.MakeLetter( - "rjw_genes_queenbirth_letter_label".Translate(), - string.Format("rjw_genes_queenbirth_letter_description".Translate(), xxx.get_pawnname(bornQueen)), - LetterDefOf.NeutralEvent, bornQueen); - Find.LetterStack.ReceiveLetter(letter); - } - - /// - /// Looks up if there is a Xenotype with Queen-Gene for the pawns parents. - /// This is to account that maybe father or mother are the queen (instead of hardcoding things for father). - /// If both are queens, the first is returned. - /// - /// The pawn for whichs parent the xenotypes is looked up. - /// The Queen-Xenotype of a parent or null. If both are queens, mothers are preferred. - public static Either TryFindParentQueenXenotype(Pawn pawn) - { - if (pawn == null) - return null; - - List parentRelations = pawn.relations.DirectRelations.FindAll(rel => rel.def.Equals(PawnRelationDefOf.Parent)); - foreach (var parent in parentRelations) - { - var xenotype = HiveUtility.TryGetQueenXenotype(parent.otherPawn); - if (xenotype != null) return xenotype; - } - - return null; - } - } -} diff --git a/Source/Genes/Hive/Helpers/HiveUtility.cs b/Source/Genes/Hive/Helpers/HiveUtility.cs deleted file mode 100644 index 089be9c..0000000 --- a/Source/Genes/Hive/Helpers/HiveUtility.cs +++ /dev/null @@ -1,274 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - internal class HiveUtility - { - - /// - /// Checks for existance of the RJW-Gene `queen`, if the pawn is spawned and if the pawn has reached adulthood. - /// Despite the naming, a Queen can also be male. - /// - /// The pawn that could be an Adult Queen - /// Whether the pawn is an adult queen. - public static bool IsAdultQueen(Pawn pawn) - { - - if (pawn == null || !pawn.Spawned) - return false; - - if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_queen)) - { - return pawn.ageTracker.Adult; - } - - return false; - } - - public static int QueensOnMap() => GetQueensOnMap().Count; - - /// - /// Checks for all pawns on the Players Home Map if they are an adult queen. - /// Adultness is determined by Base-Game Logic, Queen is determined by the rjw_genes_queen GeneDefOf (Not Xenotype). - /// - /// A list of queens on the players HomeMap - public static List GetQueensOnMap() - { - Map map = Find.Maps.Where(mapCandidate => mapCandidate.IsPlayerHome).First(); - - if (map != null) - { - List playersPawns = map.mapPawns.SpawnedPawnsInFaction(Faction.OfPlayer); - return playersPawns.FindAll(pawn => pawn.Spawned && IsAdultQueen(pawn)); - } - // Fallback: Something is wrong with Map - return new List(); - } - - /// - /// Checks if the pawn is on the players home map. - /// - /// Reason is that drones should only be punished for absence of queen if they are on the map and there is no queen. - /// If they are on a mission, transport-pod etc. they should not get boni or mali. - /// - /// The pawn for which to check map-presence. - /// True if the pawn is on the home-map, False otherwise. - public static bool PawnIsOnHomeMap(Pawn pawn) - { - if (Find.Maps.NullOrEmpty() || !Find.Maps.Where(mapCandidate => mapCandidate.IsPlayerHome).Any()) { - return false; - } - Map homeMap = Find.Maps.Where(mapCandidate => mapCandidate.IsPlayerHome).First(); - return - homeMap != null && pawn != null - && pawn.Spawned - && pawn.Map == homeMap; - } - - /// - /// Returns the Xenotype of a pawn if the pawn has a xenotype with the queen gene. - /// Null otherwise. - /// - /// - /// A xenotype with a queen gene, or null. - public static Either TryGetQueenXenotype(Pawn pawn) - { - if (pawn == null) - return null; - - if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_queen)) - { - var potentialXenotype = pawn.genes.Xenotype; - if (potentialXenotype != null && potentialXenotype.genes.Contains(GeneDefOf.rjw_genes_queen)) - { - return new Either(potentialXenotype); - } - - var potentialCustomXenotype = pawn.genes.CustomXenotype; - if (potentialCustomXenotype != null && potentialCustomXenotype.genes.Contains(GeneDefOf.rjw_genes_queen)) - { - return new Either(potentialCustomXenotype); - } - - } - - return null; - } - - - /// - /// Returns the Xenotype of a pawn if the pawn has a xenotype with the drone gene. - /// Null otherwise. - /// - /// - /// A xenotype with a drone gene, or null. - public static Either TryGetDroneXenotype(Pawn pawn) - { - if (pawn == null) - return null; - - if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_drone)) - { - var potentialXenotype = pawn.genes.Xenotype; - if (potentialXenotype != null && potentialXenotype.genes.Contains(GeneDefOf.rjw_genes_drone)) - { - return new Either(potentialXenotype); - } - - var potentialCustomXenotype = pawn.genes.CustomXenotype; - if (potentialCustomXenotype != null && potentialCustomXenotype.genes.Contains(GeneDefOf.rjw_genes_drone)) - { - return new Either(potentialCustomXenotype); - } - } - - return null; - } - - /// - /// Looks up the Queen-WorkerMappings and returns a cleaned / updated dictionary. - /// - /// This method takes care of genes maybe not existing (from other mods) or misspellings etc. - /// Prints a bigger piece of information when debug printing is enabled. - /// - /// A mapping which Queen-Xenotypes should produce which worker genes. - public static Dictionary> GetQueenWorkerMappings() - { - IEnumerable mappingDefs = DefDatabase.AllDefs; - - Dictionary> results = new Dictionary>(); - - // Dev-Note: I first a nice lambda here, but I used nesting in favour of logging. - foreach (QueenWorkerMappingDef mappingDef in mappingDefs) - { - // Option A) This is the default worker genes, expected, just ignore. - if (mappingDef.defName == "rjw_genes_default_worker_genes") - { - // Do nothing, there is no lookup but this entry is fine and should not log a warning. - continue; - } - // Option B) The Xenotype is a "static" Xenotype, from a mod or something. - XenotypeDef queenDef = DefDatabase.GetNamed(mappingDef.queenXenotype); - string defName = null; - if (queenDef != null) - { - defName = queenDef.defName; - } - else if (Current.Game != null && Current.Game.customXenotypeDatabase != null) - { - // Option C) The Xenotype is a Custom Xenotype, created by the player - CustomXenotype customQueenDef = Current.Game.customXenotypeDatabase.customXenotypes.Find(f => f.name == mappingDef.defName); - defName = customQueenDef?.name; - } - if (defName != null) - { - List workerGenes = new List(); - foreach (string geneName in mappingDef.workerGenes) - { - GeneDef workerGene = DefDatabase.GetNamed(geneName); - if (workerGene != null) - workerGenes.Add(workerGene); - else if(RJW_Genes_Settings.rjw_genes_detailed_debug) - ModLog.Warning($"Could not look up Gene {geneName} for {mappingDef.queenXenotype}."); - } - results.Add(defName, workerGenes); - continue; - } - - // Option D) Fallback, unknown - if (RJW_Genes_Settings.rjw_genes_detailed_debug) - ModLog.Warning($"Did not find a matching xenotype for {mappingDef.queenXenotype}! Defaulting to rjw_genes_default_worker_genes."); - - } - - return results; - } - - /// - /// Looks up the default genes for any queen offspring that has no other definition for it. - /// This is done by looking for the mapping with *exactly* defName rjw_genes_default_worker_genes. - /// - /// The idea is that players can edit the default types, but that this is a protected keyword. - /// - /// A list of genes for workers that do not have specific mappings defined. - public static List LookupDefaultWorkerGenes() - { - IEnumerable mappingDefs = DefDatabase.AllDefs; - - List workerGenes = new List(); - - var defaultMapping = mappingDefs.First(m => m.defName == "rjw_genes_default_worker_genes"); - if (defaultMapping == null) - { - ModLog.Error("Did not find default worker genes for queen-offspring! Please make sure you did not rename the 'rjw_genes_default_worker_genes'."); - return workerGenes; - } - - foreach (string geneName in defaultMapping.workerGenes) - { - GeneDef workerGene = DefDatabase.GetNamed(geneName); - if (workerGene != null) - workerGenes.Add(workerGene); - else if (RJW_Genes_Settings.rjw_genes_detailed_debug) - ModLog.Warning($"Could not look up gene {geneName} for rjw_genes_default_worker_genes."); - } - - return workerGenes; - } - - public static IEnumerable getQueenXenotypes() - { - return DefDatabase.AllDefs.Where(type => type.genes.Contains(GeneDefOf.rjw_genes_queen)); - } - - public static IEnumerable getDroneXenotypes() - { - return DefDatabase.AllDefs.Where(type => type.genes.Contains(GeneDefOf.rjw_genes_drone)); - } - - - public static String GetXenotypeDefName(Either def) - { - if (def == null) - return null; - else if (def.isLeft) - return def.left.defName; - else - return def.right.name; - } - - public static HiveOffspringChanceDef LookupDefaultHiveInheritanceChances() - { - IEnumerable offspringChanceDefs = DefDatabase.AllDefs; - - List workerGenes = new List(); - - var defaultChance = offspringChanceDefs.First(m => m.defName == "rjw_genes_default_hive_offspring_chances"); - - if (defaultChance == null) - ModLog.Warning("Did not find `rjw_genes_default_hive_offspring_chances`. Someone likely changed the defname!"); - - return defaultChance; - } - - public static HiveOffspringChanceDef LookupHiveInheritanceChances(Either queenDef) - { - if (queenDef == null) - return LookupDefaultHiveInheritanceChances(); - - String queenDefName = queenDef.isLeft ? queenDef.left.defName : queenDef.right.name; - - IEnumerable offspringChanceDefs = DefDatabase.AllDefs; - - return offspringChanceDefs.FirstOrFallback(t => t.queenXenotype == queenDefName, LookupDefaultHiveInheritanceChances()); - } - - - } -} diff --git a/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs b/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs deleted file mode 100644 index 7bdf206..0000000 --- a/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs +++ /dev/null @@ -1,53 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - /// - /// Patches the method `ApplyBirthOutcome` from `PregnancyUtility`. - /// - /// The 'ApplyBirthOutcome' returns the finished baby, for which we alter the pawn according to our xenotypes. - /// - - [HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))] - public class Patch_BirthOutcome_SetHiveGenes - { - - - [HarmonyPostfix] - static void HandleHiveBasedInheritance(ref Thing __result) - { - - // Check: Was the born thing a pawn? - if (__result == null || !(__result is Pawn)) - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message("There was a birth of something non-human - not entering logic for queen-drone-xenotype inheritance."); - return; - } - - Pawn pawn = (Pawn)__result; - - // Important: Not all pawns have mother/father. Some Pawns are born in Growth-Vats or born from mod. - bool hasQueenParent = HiveBirthLogic.TryFindParentQueenXenotype(pawn) != null; - bool hasDroneParent = HiveBirthLogic.TryFindParentDroneXenotype(pawn) != null; - - if (hasQueenParent) - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"PostFix PregnancyUtility::ApplyBirthOutcome - Checking Hive Inheritance because {pawn} has a queen parent."); - - HiveBirthLogic.ManageHiveBirth(pawn, hasDroneParent); - } - else - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Ignoring Postfix PregnancyUtility::ApplyBirthOutcome - No Quene Parent - Doing Nothing"); - } - } - - } -} diff --git a/Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs b/Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs deleted file mode 100644 index 6184b4a..0000000 --- a/Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using HarmonyLib; -using Verse; -using rjw; - -namespace RJW_Genes -{ - /// - /// This Class patches the AfterSexUtility to also fertilize eggs if Pawn A has "InsectBreeder" and Pawn B has Insect Eggs. - /// Patched Class is https://gitgud.io/Ed86/rjw/-/blob/master/1.4/Source/Common/Helpers/SexUtility.cs - /// - /// Normal Egg-Pregnancy logic is in https://gitgud.io/Ed86/rjw/-/blob/master/1.4/Source/Modules/Pregnancy/Pregnancy_Helper.cs - /// Gene: rjw_genes_insectbreeder - /// - [HarmonyPatch(typeof(SexUtility), "Aftersex")] - static class Patch_InsectBreeder_EggFertilization - { - public static void Postfix(SexProps props) - { - // Only Fertilize on vaginal / anal sex - if (!(props.sexType == xxx.rjwSextype.Vaginal || props.sexType == xxx.rjwSextype.Anal)) - { - return; - } - - - if (canDoEggFertilization(props.pawn, props.partner)) - { - // Pawn has gene and Partner has eggs - if (props.pawn.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(props.partner).NullOrEmpty()) - { - Pawn eggHolder = props.partner; - Pawn impregnator = props.pawn; - - foreach (Hediff_InsectEgg egg in getEggsforPawn(eggHolder)) - { - if (!egg.fertilized) - egg.Fertilize(impregnator); - } - } - - // Partner has gene and Pawn has eggs - if (props.partner.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(props.pawn).NullOrEmpty()) - { - Pawn eggHolder = props.pawn; - Pawn impregnator = props.partner; - - foreach (Hediff_InsectEgg egg in getEggsforPawn(eggHolder)) - { - if (!egg.fertilized) - egg.Fertilize(impregnator); - } - } - - - } - } - - - private static bool canDoEggFertilization(Pawn a, Pawn b) - { - - // No Partner / Other Errors - if (a != null || b != null) - return false; - // None of the pawns has the relevant gene - if (!a.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !b.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder)) - return false; - // None of the pawns has eggs - if (getEggsforPawn(a).NullOrEmpty() && getEggsforPawn(b).NullOrEmpty()) - return false; - - // A has gene and B has eggs - if (a.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(b).NullOrEmpty()) - { - return true; - } - // B has gene and A has eggs - if (b.genes.GenesListForReading.Any(x => x.def == GeneDefOf.rjw_genes_insectbreeder) && !getEggsforPawn(a).NullOrEmpty()) - { - return true; - } - // Any other case: Do nothing - return false; - } - - private static List getEggsforPawn(Pawn pawn) - { - List eggs = new List(); - pawn.health.hediffSet.GetHediffs(ref eggs); - foreach (var egg in eggs) - egg.Fertilize(pawn); - - return eggs; - } - } -} diff --git a/Source/Genes/Hive/Patches/Patch_InsectEggs_BirthBaby_SetHiveGenes.cs b/Source/Genes/Hive/Patches/Patch_InsectEggs_BirthBaby_SetHiveGenes.cs deleted file mode 100644 index 5c5e98d..0000000 --- a/Source/Genes/Hive/Patches/Patch_InsectEggs_BirthBaby_SetHiveGenes.cs +++ /dev/null @@ -1,112 +0,0 @@ -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 -{ - /// - /// Patches the method `ProcessHumanLikeInsectEgg` from `Hediff_InsectEgg`. - /// - /// The 'ProcessHumanLikeInsectEgg' returns the finished baby, for which we alter the pawn according to our xenotypes. - /// Note: This covers Insect-Egg Pregnancies only, and there is a (very similar) class `Patch_BirthOutCome_SetHiveGenes.cs` that handles normal pregnancies - /// - - [HarmonyPatch(typeof(Hediff_InsectEgg), "ProcessHumanLikeInsectEgg")] - public class Patch_InsectEgg_BirthBaby_SetHiveGenes - { - - - [HarmonyPostfix] - static void HandleHiveBasedInheritance(ref Thing __result, ref Hediff_InsectEgg __instance) - { - // Check: Was the born thing a pawn? - if (__result == null || !(__result is Pawn)) - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message("There was a birth of something non-human - not entering logic for queen-drone-xenotype inheritance."); - return; - } - - Pawn pawn = (Pawn)__result; - - Either queenDef = HiveBirthLogic.TryFindParentQueenXenotype(pawn) ?? TryFindParentQueenXenotypeFromEgg(__instance); - Either droneDef = HiveBirthLogic.TryFindParentDroneXenotype(pawn) ?? TryFindParentDroneXenotypeFromEgg(__instance); - - bool hasQueenParent = queenDef != null; - bool hasDroneParent = droneDef != null; - - if (hasQueenParent) - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"PostFix Hediff_InsectEgg::ProcessHumanLikeInsectEgg - Checking Hive Inheritance because {pawn} has a queen parent."); - HiveBirthLogic.ManageHiveBirth(pawn, hasDroneParent, fallbackQueenDef: queenDef, fallbackDroneDef: droneDef); - } else - { - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Ignoring Postfix Hediff_InsectEgg::ProcessHumanLikeInsectEgg - No Queen Parent - No Action."); - - // Extra Debug for #56 - if (RJW_Genes_Settings.rjw_genes_detailed_debug) - { - ModLog.Message($"Implanter was: ({__instance.implanter.genes.xenotypeName}|{__instance.implanter.genes.Xenotype}), Fertilizer was: ({__instance.father.genes.xenotypeName}|{__instance.father.genes.Xenotype})"); - ModLog.Message($"Implanter Xenotype From helper: {HiveUtility.TryGetQueenXenotype(__instance.implanter)} and has Queen {__instance.implanter.genes.HasGene(GeneDefOf.rjw_genes_queen)}"); - ModLog.Message($"Father Xenotype From helper: {HiveUtility.TryGetDroneXenotype(__instance.implanter)} and has Drone {__instance.father.genes.HasGene(GeneDefOf.rjw_genes_drone)}"); - CustomXenotype custom = __instance.implanter.genes.CustomXenotype; - } - } - } - - /// - /// Tries to retrieve a queen-xenotype-def from a given egg. - /// Checking priority goes: Implanter > Fertilizer > Null Otherwise. - /// - /// This is meant to be a fallback to the parent-relations which were not present in RJW 5.3.1. - /// Some comments and thoughts are captured in Issue #37. - /// - /// An Egg for which queens are looked up for - /// The relevant xenotypedef of a queen, or null. - public static Either TryFindParentQueenXenotypeFromEgg(Hediff_InsectEgg egg) - { - Either queenDef = null; - if (egg == null) - return null; - - if (egg.implanter != null) - queenDef = HiveUtility.TryGetQueenXenotype(egg.implanter); - - if (queenDef == null && egg.father != null) - queenDef = HiveUtility.TryGetQueenXenotype(egg.implanter); - - return queenDef; - } - - - - /// - /// Tries to retrieve a drone-xenotype-def from a given egg. - /// Checking priority goes: Implanter > Fertilizer > Null Otherwise. - /// - /// This is meant to be a fallback to the parent-relations which were not present in RJW 5.3.1. - /// Some comments and thoughts are captured in Issue #37. - /// - /// An Egg for which drones are looked up for - /// The relevant xenotypedef of a drone, or null. - public static Either TryFindParentDroneXenotypeFromEgg(Hediff_InsectEgg egg) - { - Either droneDef = null; - if (egg == null) - return null; - - if (egg.implanter != null) - droneDef = HiveUtility.TryGetQueenXenotype(egg.implanter); - - if (droneDef == null && egg.father != null) - droneDef = HiveUtility.TryGetQueenXenotype(egg.implanter); - - return droneDef; - } - } -} diff --git a/Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs b/Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs deleted file mode 100644 index fc3e530..0000000 --- a/Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection.Emit; -using System.Reflection; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using HarmonyLib; -using Verse; -using RimWorld; -using rjw; - -namespace RJW_Genes -{ - /// - /// This Class patches the RJW-DoEgg to allow up to MaxEggSizeMul times the original amount of eggs. - /// This harmony patch was kindly provided by 'shabalox' https://github.com/Shabalox/RJW_Genes_Addons/ - /// - /// For Gene: rjw_genes_insectincubator - /// - [HarmonyPatch(typeof(PregnancyHelper), "DoEgg")] - static class Patch_InsectIncubator_PregnancyHelper - { - [HarmonyTranspiler] - public static IEnumerable Transpiler(IEnumerable instructions, ILGenerator il) - { - //MethodInfo isinsectincubator = AccessTools.Method(typeof(GeneUtility), "IsInsectIncubator"); - MethodInfo maxeggsizemul = AccessTools.Method(typeof(GeneUtility), "MaxEggSizeMul"); - FieldInfo partner = AccessTools.Field(typeof(SexProps), "partner"); - - Label skiplabel = il.DefineLabel(); - bool finished = false; - foreach (CodeInstruction codeInstruction in instructions) - { - if (!finished) - { - if (codeInstruction.opcode == OpCodes.Ldc_R4 && codeInstruction.operand.ToString() == "0") - { - yield return new CodeInstruction(OpCodes.Ldarg_0, null); - yield return new CodeInstruction(OpCodes.Ldfld, partner); - //yield return new CodeInstruction(OpCodes.Call, isinsectincubator); - yield return new CodeInstruction(OpCodes.Callvirt, maxeggsizemul); - //yield return new CodeInstruction(OpCodes.Brfalse_S, skiplabel); - yield return new CodeInstruction(OpCodes.Ldloc_0, null); - //yield return new CodeInstruction(OpCodes.Ldc_R4, 2f); - yield return new CodeInstruction(OpCodes.Mul, null); - yield return new CodeInstruction(OpCodes.Stloc_0, null); - //codeInstruction.labels.Add(skiplabel); - finished = true; - } - } - yield return codeInstruction; - } - } - } -} diff --git a/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs b/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs deleted file mode 100644 index e4e7792..0000000 --- a/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs +++ /dev/null @@ -1,43 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - public class ThoughtWorker_QueenPresent_Social : ThoughtWorker - { - protected override ThoughtState CurrentSocialStateInternal(Pawn p, Pawn other) - { - // p is the pawn `thinking`, and other is the pawn being thought about. - // here: p = loyal pawn, other = potential queen - - if (!p.RaceProps.Humanlike) - return (ThoughtState) false; - - if (!other.RaceProps.Humanlike) - return (ThoughtState) false; - - if (!RelationsUtility.PawnsKnowEachOther(p, other)) - return (ThoughtState) false; - - // Only check if they are spawned - if (!p.Spawned || !other.Spawned) - return (ThoughtState)false; - - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) - { - return (ThoughtState) HiveUtility.IsAdultQueen(other); - } - - return (ThoughtState)false; - } - } -} diff --git a/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs b/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs deleted file mode 100644 index 24b1b79..0000000 --- a/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs +++ /dev/null @@ -1,39 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - public class ThoughtWorker_RivalQueen_Social : ThoughtWorker - { - protected override ThoughtState CurrentSocialStateInternal(Pawn p, Pawn other) - { - if (!p.RaceProps.Humanlike) - return (ThoughtState)false; - if (!other.RaceProps.Humanlike) - return (ThoughtState)false; - - if (!RelationsUtility.PawnsKnowEachOther(p, other)) - return (ThoughtState)false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - // Only check if they are spawned - if (!p.Spawned || !other.Spawned) - { - return (ThoughtState)false; - } - - if(HiveUtility.IsAdultQueen(p) && HiveUtility.IsAdultQueen(other)) - { - return (ThoughtState)true; - } - return (ThoughtState)false; - } - } -} diff --git a/Source/Genes/Hive/Thoughts/ThoughtWorker_WorkerDespised_Social.cs b/Source/Genes/Hive/Thoughts/ThoughtWorker_WorkerDespised_Social.cs deleted file mode 100644 index 8a9ad53..0000000 --- a/Source/Genes/Hive/Thoughts/ThoughtWorker_WorkerDespised_Social.cs +++ /dev/null @@ -1,39 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; - -namespace RJW_Genes -{ - public class ThoughtWorker_WorkerDespised_Social : ThoughtWorker - { - protected override ThoughtState CurrentSocialStateInternal(Pawn p, Pawn other) - { - // p is the pawn `thinking`, and other is the pawn being thought about. - // here: p = queen, other = potential worker - - if (!p.RaceProps.Humanlike) - return (ThoughtState) false; - - if (!other.RaceProps.Humanlike) - return (ThoughtState) false; - - if (!RelationsUtility.PawnsKnowEachOther(p, other)) - return (ThoughtState) false; - - // Only check if they are spawned - if (!p.Spawned || !other.Spawned) - return (ThoughtState)false; - - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen) && GeneUtility.HasGeneNullCheck(other, GeneDefOf.rjw_genes_worker)) - { - return (ThoughtState)true; - } - - return (ThoughtState)false; - } - } -} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs deleted file mode 100644 index 3265a00..0000000 --- a/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs +++ /dev/null @@ -1,36 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Verse; - -namespace RJW_Genes -{ - public class Thoughtworker_MultipleQueens_Mood : ThoughtWorker - { - - protected override ThoughtState CurrentStateInternal(Pawn p) - { - // Error Handling and Check for Pawn being on Map - if (p == null || !p.Spawned) - return (ThoughtState) false; - // Queens cannot have loyalty thoughts - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) - return (ThoughtState)false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() >= 2) - { - return (ThoughtState)true; - } - - return (ThoughtState) false; - } - - } -} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs deleted file mode 100644 index 502b013..0000000 --- a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs +++ /dev/null @@ -1,36 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Verse; - -namespace RJW_Genes -{ - public class Thoughtworker_QueenAbsent_Mood : ThoughtWorker - { - - protected override ThoughtState CurrentStateInternal(Pawn p) - { - // Error Handling and Check for Pawn being on Map - if (p == null || !p.Spawned) - return (ThoughtState) false; - // Queens cannot have loyalty thoughts - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) - return (ThoughtState)false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 0) - { - return (ThoughtState)true; - } - - return (ThoughtState) false; - } - - } -} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs deleted file mode 100644 index e6003be..0000000 --- a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs +++ /dev/null @@ -1,36 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Verse; - -namespace RJW_Genes -{ - public class Thoughtworker_QueenPresent_Mood : ThoughtWorker - { - - protected override ThoughtState CurrentStateInternal(Pawn p) - { - // Error Handling and Check for Pawn being on Map - if (p == null || !p.Spawned) - return (ThoughtState) false; - // Queens cannot have loyalty thoughts - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) - return (ThoughtState)false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) - { - return (ThoughtState)true; - } - - return (ThoughtState) false; - } - - } -} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs deleted file mode 100644 index fbcdb2b..0000000 --- a/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs +++ /dev/null @@ -1,32 +0,0 @@ -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Verse; - -namespace RJW_Genes -{ - public class Thoughtworker_RivalQueen_Mood : ThoughtWorker - { - - protected override ThoughtState CurrentStateInternal(Pawn p) - { - if (p == null || !p.Spawned) - return (ThoughtState) false; - // If the pawn is not on Map (e.g. caravan), no mali - if (!HiveUtility.PawnIsOnHomeMap(p)) - return (ThoughtState)false; - - if (HiveUtility.IsAdultQueen(p) && HiveUtility.QueensOnMap() >= 2) - { - return (ThoughtState) true; - } - - return (ThoughtState) false; - } - - } -} diff --git a/Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusDreamVisit.cs b/Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusVisit.cs similarity index 92% rename from Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusDreamVisit.cs rename to Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusVisit.cs index 7948e37..22808f8 100644 --- a/Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusDreamVisit.cs +++ b/Source/Genes/Life_Force/Events/SuccubusVisit/IncidentWorker_SuccubusVisit.cs @@ -37,14 +37,14 @@ namespace RJW_Genes } } return false; - + } protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; - List < Pawn > victims = ValidVictims(map).ToList(); - if(victims.NullOrEmpty()) + List victims = ValidVictims(map).ToList(); + if (victims.NullOrEmpty()) { return false; } @@ -94,7 +94,7 @@ namespace RJW_Genes if (RJWSettings.rape_enabled) { //follow rjw rules - if (SexAppraiser.would_fuck(sexdemon,victim) > 0f) + if (SexAppraiser.would_fuck(sexdemon, victim) > 0f) { sexdemon.pather.StopDead(); sexdemon.jobs.StopAll(); @@ -104,8 +104,7 @@ namespace RJW_Genes } } - Find.LetterStack.ReceiveLetter("rjw_genes_sexdemon_visit_incident_label".Translate(), "rjw_genes_sexdemon_visit_incident_description".Translate(), LetterDefOf.PositiveEvent, new_sexdemons, null, null, null, null); - //base.SendStandardLetter(baseLetterLabel, baseLetterText, this.def.letterDef, parms, succubus, Array.Empty()); + Find.LetterStack.ReceiveLetter("rjw_genes_sexdemon_visit_incident_label".Translate(), "rjw_genes_sexdemon_visit_incident_description".Translate(), RimWorld.LetterDefOf.PositiveEvent, new_sexdemons, null, null, null, null); return true; } @@ -132,4 +131,4 @@ namespace RJW_Genes return new LordJob_SuccubusVisit(target); } } -} +} \ No newline at end of file diff --git a/Source/Genes/Life_Force/Events/SuccubusVisit/LordJob_SuccubusVisit.cs b/Source/Genes/Life_Force/Events/SuccubusVisit/LordJob_SuccubusVisit.cs index 7f3c32b..887a324 100644 --- a/Source/Genes/Life_Force/Events/SuccubusVisit/LordJob_SuccubusVisit.cs +++ b/Source/Genes/Life_Force/Events/SuccubusVisit/LordJob_SuccubusVisit.cs @@ -9,7 +9,7 @@ namespace RJW_Genes //Based on LordJob_VisitColony public class LordJob_SuccubusVisit : LordJob { - public LordJob_SuccubusVisit(){} + public LordJob_SuccubusVisit() { } public LordJob_SuccubusVisit(Pawn target) { this.target = target; @@ -82,10 +82,10 @@ namespace RJW_Genes { foreach (Pawn pawn in this.lord.ownedPawns) { - if(colonyJoiners.Contains(pawn)) + if (colonyJoiners.Contains(pawn)) { RecruitUtility.Recruit(pawn, Faction.OfPlayer); - Find.LetterStack.ReceiveLetter("rjw_genes_succubus_joins_letter_label".Translate(), string.Format("rjw_genes_succubus_joins_letter_description".Translate(), xxx.get_pawnname(pawn)), LetterDefOf.PositiveEvent, pawn, null, null, null, null); + Find.LetterStack.ReceiveLetter("rjw_genes_succubus_joins_letter_label".Translate(), string.Format("rjw_genes_succubus_joins_letter_description".Translate(), xxx.get_pawnname(pawn)), RimWorld.LetterDefOf.PositiveEvent, pawn, null, null, null, null); } else { @@ -99,4 +99,4 @@ namespace RJW_Genes private int? durationTicks; public List colonyJoiners = new List(); } -} +} \ No newline at end of file diff --git a/Source/Genes/Life_Force/HediffComp_SeverityFromFertilin.cs b/Source/Genes/Life_Force/HediffComp_SeverityFromFertilin.cs index 4b8b3a7..eda55b2 100644 --- a/Source/Genes/Life_Force/HediffComp_SeverityFromFertilin.cs +++ b/Source/Genes/Life_Force/HediffComp_SeverityFromFertilin.cs @@ -46,8 +46,8 @@ namespace RJW_Genes { if (cachedLifeForceGene.Resource.Value <= cachedLifeForceGene.Resource.MinLevelForAlert && this.Pawn.IsHashIntervalTick(2500) && Rand.Chance(0.03f)) //~50% chance each day for mental break { - if (this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_cum_eater) - || this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_fertilin_absorber) || this.Pawn.genes.HasGene(GeneDefOf.rjw_genes_drainer)) + if (this.Pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater) + || this.Pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_fertilin_absorber) || this.Pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_drainer)) { //TODO: use mentalstatedef instead of mentalbreakdef MentalBreakDef randomrape = GeneDefOf.rjw_genes_lifeforce_randomrape; diff --git a/Source/Genes/Life_Force/IngestionOutcomeDoer_LifeForceOffset.cs b/Source/Genes/Life_Force/IngestionOutcomeDoer_LifeForceOffset.cs index a853abe..feae482 100644 --- a/Source/Genes/Life_Force/IngestionOutcomeDoer_LifeForceOffset.cs +++ b/Source/Genes/Life_Force/IngestionOutcomeDoer_LifeForceOffset.cs @@ -11,11 +11,11 @@ namespace RJW_Genes public const float DEFAULT_FERTILIN_PER_UNIT = 1f; public float FertilinPerUnit = 1f; - protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested) + protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested, int ingestedCount) { if (GeneUtility.HasLifeForce(pawn) && GeneUtility.IsCumEater(pawn)) { - float num = ingested.stackCount * this.FertilinPerUnit / 100; + float num = ingestedCount * this.FertilinPerUnit / 100; GeneUtility.OffsetLifeForce(GeneUtility.GetLifeForceGene(pawn), num); } } diff --git a/Source/Genes/Life_Force/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs new file mode 100644 index 0000000..67fafae --- /dev/null +++ b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; +using rjw.Modules.Interactions; +using rjw.Modules.Interactions.Internals.Implementation; +using rjw.Modules.Interactions.Objects; +using rjw; +using rjw.Modules.Interactions.Enums; + +//Modefied code based of RJW-AI code at https://gitgud.io/Ed86/rjw-ia/-/tree/master/ +namespace RJW_Genes +{ + [StaticConstructorOnStartup] + public class DomSuccubusTailCustomRequirementHandler : ICustomRequirementHandler + { + public string HandlerKey + { + get + { + return "DomSuccubusTailCustomRequirementHandler"; + } + } + + + static DomSuccubusTailCustomRequirementHandler() + { + Register(); + } + public static void Register() + { + InteractionRequirementService.CustomRequirementHandlers.Add(new DomSuccubusTailCustomRequirementHandler()); + if (Prefs.DevMode) + { + Log.Message("DomSuccubusTailCustomRequirementHandler registered: "); + } + } + + public bool FufillRequirements(InteractionWithExtension interaction, InteractionPawn dominant, InteractionPawn submissive) + { + if (GeneUtility.HasGeneNullCheck(dominant.Pawn, GeneDefOf.rjw_genes_succubus_tail)) + { + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/Source/Genes/Life_Force/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs new file mode 100644 index 0000000..371f06d --- /dev/null +++ b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using rjw; +using rjw.Modules.Interactions.Contexts; +using rjw.Modules.Interactions.Enums; +using rjw.Modules.Interactions.Rules.PartKindUsageRules; +using rjw.Modules.Shared; +using Verse; + +namespace RJW_Genes.Interactions +{ + //Summary// + //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> ModifiersForDominant(InteractionContext context) + { + Pawn pawn = context.Internals.Dominant.Pawn; + Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); + if (gene != null) + { + float weight = 2f; + if (gene.Value < gene.MinLevelForAlert) + { + weight *= 10; + } + else if (gene.Value < gene.targetValue) + { + weight *= 2.5f; + } + if (pawn.genes.HasGene(GeneDefOf.rjw_genes_cum_eater)) + { + yield return new Weighted(weight, LewdablePartKind.Mouth); + yield return new Weighted(weight, LewdablePartKind.Beak); + } + + if (pawn.genes.HasGene(GeneDefOf.rjw_genes_fertilin_absorber)) + { + yield return new Weighted(weight, LewdablePartKind.Vagina); + yield return new Weighted(weight, LewdablePartKind.Anus); + } + } + yield break; + } + + public IEnumerable> ModifiersForSubmissive(InteractionContext context) + { + Pawn pawn = context.Internals.Dominant.Pawn; + Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); + if (gene != null) + { + float weight = 2f; + if (gene.Value < gene.MinLevelForAlert) + { + weight *= 10; + } + else if (gene.Value < gene.targetValue) + { + weight *= 2.5f; + } + yield return new Weighted(weight, LewdablePartKind.Mouth); + yield return new Weighted(weight, LewdablePartKind.Beak); + + if (pawn.genes.HasGene(GeneDefOf.rjw_genes_fertilin_absorber)) + { + yield return new Weighted(weight, LewdablePartKind.Vagina); + yield return new Weighted(weight, LewdablePartKind.Anus); + } + } + yield break; + } + } +} \ No newline at end of file diff --git a/Source/Genes/Life_Force/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs new file mode 100644 index 0000000..04d7657 --- /dev/null +++ b/Source/Genes/Life_Force/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs @@ -0,0 +1,43 @@ +using Verse; +using rjw.Modules.Interactions; +using rjw.Modules.Interactions.Internals.Implementation; +using rjw.Modules.Interactions.Objects; + +//Modified code based of RJW-AI code at https://gitgud.io/Ed86/rjw-ia/-/tree/master/ +namespace RJW_Genes +{ + [StaticConstructorOnStartup] + public class SubSuccubusTailCustomRequirementHandler : ICustomRequirementHandler + { + public string HandlerKey + { + get + { + return "SubSuccubusTailCustomRequirementHandler"; + } + } + + static SubSuccubusTailCustomRequirementHandler() + { + Register(); + } + public static void Register() + { + InteractionRequirementService.CustomRequirementHandlers.Add(new SubSuccubusTailCustomRequirementHandler()); + if (Prefs.DevMode) + { + Log.Message("SubSuccubusTailCustomRequirementHandler registered: "); + } + } + + public bool FufillRequirements(InteractionWithExtension interaction, InteractionPawn dominant, InteractionPawn submissive) + { + if (GeneUtility.HasGeneNullCheck(submissive.Pawn, GeneDefOf.rjw_genes_succubus_tail)) + { + return true; + } + return false; + } + } +} + diff --git a/Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpotReceiver.cs b/Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpotReceiver.cs index 135b231..82967d6 100644 --- a/Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpotReceiver.cs +++ b/Source/Genes/Life_Force/JobDrivers/JobDriver_SexOnSpotReceiver.cs @@ -64,10 +64,7 @@ namespace RJW_Genes }); toil.AddFinishAction(delegate { - if (xxx.is_human(this.pawn)) - { - this.pawn.Drawer.renderer.graphics.ResolveApparelGraphics(); - } + GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(this.pawn); Hediff submitting = this.pawn.health.hediffSet.GetFirstHediffOfDef(xxx.submitting); if (submitting != null) diff --git a/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs b/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs index fdd7279..f6b26e4 100644 --- a/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs +++ b/Source/Genes/Life_Force/JobGivers/JobGiver_GetLifeForce.cs @@ -27,7 +27,7 @@ namespace RJW_Genes } - if (ModsConfig.IsActive("rjw.sexperience") && gene_lifeforce.StoredCumAllowed && genes.HasGene(GeneDefOf.rjw_genes_cum_eater)) + if (ModsConfig.IsActive("rjw.sexperience") && gene_lifeforce.StoredCumAllowed && genes.HasActiveGene(GeneDefOf.rjw_genes_cum_eater)) { Thing gatheredCum = this.GetStoredCum(pawn); if (gatheredCum == null) diff --git a/Source/Genes/Life_Force/JobGivers/JobGiver_TryQuickieWith.cs b/Source/Genes/Life_Force/JobGivers/JobGiver_TryQuickieWith.cs index 22fcb01..6c17b75 100644 --- a/Source/Genes/Life_Force/JobGivers/JobGiver_TryQuickieWith.cs +++ b/Source/Genes/Life_Force/JobGivers/JobGiver_TryQuickieWith.cs @@ -31,20 +31,7 @@ namespace RJW_Genes { Job newJob =JobMaker.MakeJob(xxx.quick_sex, target); - //Pawn joins faction when lordJob ends instead of leaving - //in the future determine the chance of this another way - if (Rand.Chance(JoinChance(pawn, target))) - { - Lord lord = pawn.GetLord(); - LordJob_SuccubusVisit lordJob = lord == null? null : lord.LordJob as LordJob_SuccubusVisit; - if (lordJob != null) - { - if (!lordJob.colonyJoiners.Contains(pawn)) - { - lordJob.colonyJoiners.Add(pawn); - } - } - } + return newJob; } else diff --git a/Source/Genes/Life_Force/Patches/Patch_SatisfyPersonal_LifeForceGain.cs b/Source/Genes/Life_Force/Patches/Patch_SatisfyPersonal_LifeForceGain.cs index 6ea0a62..4388cf0 100644 --- a/Source/Genes/Life_Force/Patches/Patch_SatisfyPersonal_LifeForceGain.cs +++ b/Source/Genes/Life_Force/Patches/Patch_SatisfyPersonal_LifeForceGain.cs @@ -25,6 +25,12 @@ namespace RJW_Genes { return; } + // Exit if the pawn has ONLY an archotech penis, and no other penises. Issue #72 + if (props.pawn.health.hediffSet.hediffs.Any(x => x.def == rjw.Genital_Helper.archotech_penis) + && !(Genital_Helper.has_multipenis(props.pawn))) + { + return; + } //Summary// //We use the positions of the pawn (dom or sub) and based on that which interactions will transfer fertilin diff --git a/Source/Genes/Life_Force/Patches/Patch_Vanilla_Inheritance_Fertilin.cs b/Source/Genes/Life_Force/Patches/Patch_Vanilla_Inheritance_Fertilin.cs index b4b327c..3d1f684 100644 --- a/Source/Genes/Life_Force/Patches/Patch_Vanilla_Inheritance_Fertilin.cs +++ b/Source/Genes/Life_Force/Patches/Patch_Vanilla_Inheritance_Fertilin.cs @@ -39,10 +39,10 @@ namespace RJW_Genes List absorption_genes_parents = new List(); foreach (GeneDef geneDef in FertilinSourceGenes) { - if(mother.genes != null && mother.genes.HasGene(geneDef)) + if(mother.genes != null && mother.genes.HasActiveGene(geneDef)) absorption_genes_parents.Add(geneDef); - if (father.genes != null && father.genes.HasGene(geneDef)) + if (father.genes != null && father.genes.HasActiveGene(geneDef)) absorption_genes_parents.Add(geneDef); } // Parents had Genes - Pick a random one of them diff --git a/Source/Genes/Life_Force/UI/GeneGizmo_ResourceLifeForce.cs b/Source/Genes/Life_Force/UI/GeneGizmo_ResourceLifeForce.cs index f2b0055..edd2e5f 100644 --- a/Source/Genes/Life_Force/UI/GeneGizmo_ResourceLifeForce.cs +++ b/Source/Genes/Life_Force/UI/GeneGizmo_ResourceLifeForce.cs @@ -13,7 +13,7 @@ namespace RJW_Genes { public GeneGizmo_ResourceLifeForce(Gene_Resource gene, List drainGenes, Color barColor, Color barhighlightColor) : base(gene, drainGenes, barColor, barhighlightColor) { - this.draggableBar = true; + } public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth, GizmoRenderParms parms) diff --git a/Source/Genes/Patches/LustFeeding.cs b/Source/Genes/Patches/LustFeeding.cs new file mode 100644 index 0000000..e227d2a --- /dev/null +++ b/Source/Genes/Patches/LustFeeding.cs @@ -0,0 +1,149 @@ +using RimWorld; +using rjw; +using Verse; +using System; +using RimWorld.Planet; + + + +namespace RJWLoveFeeding +{ + static class LustFeeding + { + //[HarmonyPostfix] + static Def LoveFeed = DefDatabase.GetNamed("RS_LoveFeed", false); + static Def VampireLover = DefDatabase.GetNamed("VU_VampireLover", false); + static Def LovinDependency = DefDatabase.GetNamed("VRE_LovinDependency", false); + static NeedDef VRE_Lovin = DefDatabase.GetNamed("VRE_Lovin", false); + public static void Postfix(SexProps props) + { + try + { + LustFeeding.RJWLustFeeding(props); + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + + public static void RJWLustFeeding(SexProps props) + { + if((props.pawn != null) && (props.partner != null) && !xxx.is_animal(props.pawn) && !xxx.is_animal(props.partner)) + { + //ModLog.Message($" Patch Worked"); + if(!props.pawn.IsCaravanMember() && !props.partner.IsCaravanMember()) + { + FillNeed(props.pawn); + FillNeed(props.partner); + + RJWTryTakeBlood(props.pawn, props.partner); + RJWTryTakeBlood(props.partner, props.pawn); + } + + } + + } + + public static void FillNeed(Pawn pawn) + { + Pawn_GeneTracker genes; + if (LovinDependency != null) + { + genes = pawn.genes; + + if (genes == null) + { + return; + } + if (pawn.genes.HasActiveGene(RJW_Genes.GeneDefOf.VRE_LovinDependency)) + { + if (VRE_Lovin != null) + { + Pawn_NeedsTracker needs = pawn.needs; + ((needs != null) ? needs.TryGetNeed(VRE_Lovin) : null).CurLevel = 1f; + } + } + } + } + + + public static bool RJWTryTakeBlood(Pawn pawn, Pawn bloodBag) + { + + + Pawn_GeneTracker genes = bloodBag.genes; + if ((genes.GetFirstGeneOfType() != null)) + { + return false; + } + + genes = pawn.genes; + + if (genes == null) + { + return false; + } + + bool isLoveFeeder = false; + + if(LoveFeed != null) + { + if (RJWSettings.DevMode) RJW_Genes.ModLog.Message("LoveFeed checks"); + if (genes.HasActiveGene(RJW_Genes.GeneDefOf.RS_LoveFeed)) + { + + isLoveFeeder = true; + } + } + if (VampireLover != null) + { + if (RJWSettings.DevMode) RJW_Genes.ModLog.Message("LoveFeed checks"); + if (genes.HasActiveGene(RJW_Genes.GeneDefOf.VU_VampireLover)) + { + isLoveFeeder = true; + } + } + + + if (isLoveFeeder && (genes.GetFirstGeneOfType() != null)) + { + ModLog.Message($" Lovefeeder just finished loving: {xxx.get_pawnname(pawn)}"); + + Gene_Hemogen gene_Hemogen = genes.GetFirstGeneOfType(); + if (gene_Hemogen != null) + { + if (gene_Hemogen.Value < gene_Hemogen.targetValue) + { + Hediff bloodBagBloodLoss = bloodBag.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.BloodLoss, false); + if (bloodBagBloodLoss != null) + { + float afterBite = bloodBagBloodLoss.Severity + 0.25f; + if ((afterBite > HediffDefOf.BloodLoss.lethalSeverity) || (afterBite > 0.49f)) + { + //ModLog.Message($"{xxx.get_pawnname(pawn)} would have killed someone. {afterBite} > {HediffDefOf.BloodLoss.lethalSeverity}"); + return false; + } + + } + SanguophageUtility.DoBite(pawn, bloodBag, 0.2f, 0.1f, 0.2f, 1f, IntRange.one, ThoughtDefOf.FedOn, ThoughtDefOf.FedOn_Social); + ModLog.Message($"{xxx.get_pawnname(pawn)} snacked on {xxx.get_pawnname(bloodBag)}"); + return true; + + } + else + { + ModLog.Message($"{xxx.get_pawnname(pawn)} not hungry. {gene_Hemogen.Value} > {gene_Hemogen.targetValue}"); + } + } + + + + } + return false; ; + } + + } + + +} diff --git a/Source/Genes/Patches/MultiplePregnancies.cs b/Source/Genes/Patches/MultiplePregnancies.cs new file mode 100644 index 0000000..a0f5080 --- /dev/null +++ b/Source/Genes/Patches/MultiplePregnancies.cs @@ -0,0 +1,84 @@ +using RimWorld; +using rjw; +using Verse; +using System.Linq; +using System.Collections.Generic; +using System; +using HarmonyLib; +using RJWLoveFeeding; + + +namespace RJWLoveFeeding +{ + [HarmonyPatch(typeof(PawnExtensions), "IsPregnant", new Type[] +{ + typeof(Pawn), typeof(bool) + })] + class MultiplePregnancies + { + static Def MultiPregnancy = DefDatabase.GetNamed("RS_MultiPregnancy", false); + [HarmonyPostfix] + public static void Postfix(ref bool __result, Pawn pawn, bool mustBeVisible) + { + + //Log.Message(xxx.get_pawnname(pawn) + " is in patch" + __result); + bool isPregnant = __result; + if (MultiPregnancy != null) + { + if (RJWSettings.DevMode) RJW_Genes.ModLog.Message("multipreg checks"); + if (isPregnant) + { + try + { + isPregnant = MultiplePregnancies.RJWMultiplePregnancy(isPregnant, pawn); + //Log.Message(xxx.get_pawnname(pawn) + " is " + isPregnant); + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + __result = isPregnant; + } + + } + + + + public static bool RJWMultiplePregnancy(bool isPregnant, Pawn fucked) + { + + if ((fucked != null) && !xxx.is_animal(fucked)) + { + + + List set = fucked.health.hediffSet.hediffs; + + //Taking all hediffs that prevent pregnancy but are are not of the type used for pregnancies itself + List setNoPreggo = set.FindAll(o => (o.def.preventsPregnancy) && !(o is HediffWithParents)); + + if (setNoPreggo.NullOrEmpty()) + { + //Log.Message("No other hediffs preventing pregnancy"); + Pawn_GeneTracker genes = fucked.genes; + if (genes.HasActiveGene(RJW_Genes.GeneDefOf.RS_MultiPregnancy)) + { + Log.Message(xxx.get_pawnname(fucked) + " has multipregnancy gene"); + + return false; + } + else + { + //Log.Message(xxx.get_pawnname(fucked) + " has NOT multipreg gene"); + } + } + else + { + Log.Message(setNoPreggo.First().def.defName + ": This prevents pregnancy"); + } + } + + return isPregnant; + } + } +} diff --git a/Source/Genes/Patches/PatchLitteredBirth.cs b/Source/Genes/Patches/PatchLitteredBirth.cs new file mode 100644 index 0000000..8528d0f --- /dev/null +++ b/Source/Genes/Patches/PatchLitteredBirth.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using HarmonyLib; +using RimWorld; +using Verse; +using rjw; + +namespace RJW_Genes +{ + + public class PatchLitteredBirth + { + + static Dictionary laborStateMap = new Dictionary(); + public static void Hediff_Labor_PostRemovedPostFix(ref Hediff_Labor __instance) + { + bool randomTwinsRoll; + int totalBirths; + bool laborStateIsNull = !laborStateMap.ContainsKey(__instance.pawn.ThingID); + bool hasLitteredBirthsGene = __instance.pawn.genes.HasActiveGene(GeneDefOf.LitteredBirths); + + // we'll never do additional processing if this is the guaranteed last birth (eg birth #4) + if (!laborStateIsNull && laborStateMap.TryGetValue(__instance.pawn.ThingID).birthCount == 4) + { + return; + } + + // For now, littered birth overrides ovary agitator and twin calculations, so if a LaborState already exists + // with littered births gene, move on + if (!laborStateIsNull && hasLitteredBirthsGene) + { + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("Found active LaborState and LitteredBirths gene - skipping additional Hediff_Labor_PostRemovedPostFix work"); + ModLog.Message("Pawn: " + __instance.pawn.NameShortColored + " (" + __instance.pawn.ThingID + ")"); + ModLog.Message("birthCount: " + laborStateMap.TryGetValue(__instance.pawn.ThingID).birthCount); + } + + return; + } + + // Make a new LaborState for the null case with littered births + if (laborStateIsNull && hasLitteredBirthsGene) + { + ModLog.Message("Found littered births gene"); + int litteredBirthsTotalRoll = Rand.RangeInclusive(2, 4); + laborStateMap.SetOrAdd(__instance.pawn.ThingID, new LaborState(__instance.pawn, litteredBirthsTotalRoll)); + return; + } + + // Finally, regardless of littered births gene, we only want new state creation on + // pawns that don't already have state, so return if state is !null (STATE SHOULD ALWAYS BE CLEANED IN LABORPUSHING POSTFIX) + if (!laborStateIsNull) + { + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Warning("Labor state for pawn " + __instance.pawn.NameShortColored + " (" + __instance.pawn.ThingID + ") is not null despite all checks passing for determining first instance of Hediff_Labor - this warning should never occur, and may indicate a bug in Hediff_LaborPushing of lingering labor state from a previous pregnancy"); + } + return; + } + + // For everything else, we do random twin and OvaryAgitator handling + // ------- + // If we fail a base chance twins roll, return without any additional processing and proceed with vanilla childbirth + // Notes on rolls: + // -> Chance without OvaryAgitator to have twins: 1% + // -> Chance with OvaryAgitator to have twins: Guaranteed + // ---> Chance with OvaryAgitator to have triplets (MUST HAVE SUCCEEDED TWINS ROLL): 50% + // ---> Chance with OvaryAgitator to have quadruplets (MUST HAVE SUCCEEDED TRIPLETS ROLL): 10% + // -> Chance with Littered Births gene: random between 2 and 4 (inclusive) + randomTwinsRoll = Rand.Chance(0.01f); + bool hasAgitator = __instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); + if (!randomTwinsRoll && !hasAgitator) + { + // We failed rolls, and we don't have an agitator - no additional processing, do vanilla single baby birth + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("Inside Hediff_Labor_PostRemovedPostFix random twins check fail"); + ModLog.Message("Pawn: " + __instance.pawn.NameShortColored); + ModLog.Message("Random twins roll outcome: " + randomTwinsRoll); + ModLog.Message("Has OvaryAgitator: " + hasAgitator); + } + return; + } + + // Beyond this point, we can assume the pawn has an agitator + totalBirths = 2; + bool agitatorTriplets = Rand.Chance(0.5f); + bool agitatorQuadruplets = Rand.Chance(0.1f); + if (hasAgitator) + { + if (agitatorTriplets) totalBirths = 3; + if (agitatorTriplets && agitatorQuadruplets) totalBirths = 4; + } + + // Set new LaborState + laborStateMap.Add(__instance.pawn.ThingID, new LaborState(__instance.pawn, totalBirths)); + } + + public static void Hediff_LaborPushing_PostRemovedPostFix(ref Hediff_LaborPushing __instance) + { + bool hasAgitator = __instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("OvaryAgitator")); + bool hasLitteredBirthsGene = __instance.pawn.genes.HasActiveGene(GeneDefOf.LitteredBirths); + bool laborStateIsNull = !laborStateMap.ContainsKey(__instance.pawn.ThingID); + LaborState currentLaborState; + laborStateMap.TryGetValue(__instance.pawn.ThingID, out currentLaborState); + + if (laborStateIsNull) + { + if (__instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold"))) + { + __instance.pawn.health.RemoveHediff(__instance.pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.Bioscaffold)); + } + return; + } + + if (currentLaborState.birthTotal == currentLaborState.birthCount) + { + laborStateMap.Remove(__instance.pawn.ThingID); + if (__instance.pawn.health.hediffSet.HasHediff(HediffDef.Named("Bioscaffold"))) + { + + __instance.pawn.health.RemoveHediff(__instance.pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.Bioscaffold)); + } + return; + } + + ((Hediff_Labor)__instance.pawn.health.AddHediff(RimWorld.HediffDefOf.PregnancyLabor)).SetParents(__instance.pawn, __instance.Father, PregnancyUtility.GetInheritedGeneSet(__instance.Father, __instance.pawn)); + currentLaborState.birthCount++; + + if (!hasAgitator && !hasLitteredBirthsGene) + { + if (RJW_Genes_Settings.rjw_genes_detailed_debug) + { + ModLog.Message("Pawn " + __instance.pawn.NameShortColored + " (" + __instance.pawn.ThingID + ") is having random twins"); + } + Find.LetterStack.ReceiveLetter("Twins!", __instance.pawn.NameShortColored + " is still in labor and is having twins!\n\nBe sure to gather your doctor and additional friends and family to ensure the other baby is also born healthy!", LetterDefOf.AnotherBaby, __instance.pawn); + return; + } + + Find.LetterStack.ReceiveLetter("Another baby!", __instance.pawn.NameShortColored + " is still in labor and is having another baby!\n\nBe sure to gather your doctor and additional friends and family to ensure the next baby is also born healthy!", LetterDefOf.AnotherBaby, __instance.pawn); + } + } +} diff --git a/Source/Genes/Special/Abilities/CompAbilityEffect_CocoonWeaver.cs b/Source/Genes/Special/Abilities/CompAbilityEffect_CocoonWeaver.cs new file mode 100644 index 0000000..a3af363 --- /dev/null +++ b/Source/Genes/Special/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); + } + + } +} \ No newline at end of file diff --git a/Source/Genes/Special/Abilities/CompProperties_AbilityCocoonWeaver.cs b/Source/Genes/Special/Abilities/CompProperties_AbilityCocoonWeaver.cs new file mode 100644 index 0000000..caa63b6 --- /dev/null +++ b/Source/Genes/Special/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); + } + } +} \ No newline at end of file diff --git a/Source/Genes/Special/Patches/Patch_OrgasmMytosis.cs b/Source/Genes/Special/Patches/Patch_OrgasmMytosis.cs index 8c5b6e9..709d05b 100644 --- a/Source/Genes/Special/Patches/Patch_OrgasmMytosis.cs +++ b/Source/Genes/Special/Patches/Patch_OrgasmMytosis.cs @@ -116,7 +116,6 @@ namespace RJW_Genes copy.ideo = toMultiply.ideo; copy.records = new Pawn_RecordsTracker(copy); - copy.outfits = toMultiply.outfits; copy.relations = toMultiply.relations; copy.skills = CopySkillTracker(copy,toMultiply.skills); @@ -143,7 +142,7 @@ namespace RJW_Genes copy.style = CopyStyleTracker(copy, toMultiply.style); copy.story = CopyStoryTracker(copy, toMultiply.story); - copy.Draw(); + return copy; } diff --git a/Source/Genes/Special/Patches/Patch_OrgasmRush.cs b/Source/Genes/Special/Patches/Patch_OrgasmRush.cs index eaf6216..d6df246 100644 --- a/Source/Genes/Special/Patches/Patch_OrgasmRush.cs +++ b/Source/Genes/Special/Patches/Patch_OrgasmRush.cs @@ -27,7 +27,7 @@ namespace RJW_Genes if (props.pawn.IsAnimal() || props.partner.IsAnimal()) return; - if (props.pawn.genes != null && props.pawn.genes.HasGene(GeneDefOf.rjw_genes_orgasm_rush)) + if (props.pawn.genes != null && props.pawn.genes.HasActiveGene(GeneDefOf.rjw_genes_orgasm_rush)) { // Pump up Wake-Ness diff --git a/Source/Genes/Special/Thoughts/ThoughtWorker_Aphrodisiac_Pheromones_Social.cs b/Source/Genes/Special/Thoughts/ThoughtWorker_Aphrodisiac_Pheromones_Social.cs index ee2c4f0..b236fc9 100644 --- a/Source/Genes/Special/Thoughts/ThoughtWorker_Aphrodisiac_Pheromones_Social.cs +++ b/Source/Genes/Special/Thoughts/ThoughtWorker_Aphrodisiac_Pheromones_Social.cs @@ -33,16 +33,15 @@ namespace RJW_Genes 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 (!HiveUtility.PawnIsOnHomeMap(pawn)) + if (!MapUtility.PawnIsOnHomeMap(pawn)) return (ThoughtState)false; - - // Do nothing for pawns that also have pheromones if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_aphrodisiac_pheromones)) - return (ThoughtState)false; // Actual Logic: diff --git a/Source/HarmonyInit.cs b/Source/HarmonyInit.cs index b0f8295..c2cba10 100644 --- a/Source/HarmonyInit.cs +++ b/Source/HarmonyInit.cs @@ -1,6 +1,9 @@ using Verse; using HarmonyLib; using System; +using rjw; +using RJWLoveFeeding; +using RimWorld; namespace RJW_Genes { @@ -10,32 +13,42 @@ namespace RJW_Genes static HarmonyInit() { Harmony harmony = new Harmony("rjw_genes"); - harmony.PatchAll(); + var original = typeof(Hediff_Pregnant).GetMethod("Tick"); + harmony.Unpatch(original, HarmonyPatchType.Prefix, "rjw"); + + harmony.PatchAll(); + if (ModsConfig.BiotechActive) + { + harmony.Patch(typeof(SexUtility).GetMethod("ProcessSex"), new HarmonyMethod(typeof(LustFeeding), "Postfix", null)); + } + // Non-rapist would_rape bypass for limbic stimulator + harmony.Patch(AccessTools.Method(typeof(SexAppraiser), nameof(SexAppraiser.would_rape)), + postfix: new HarmonyMethod(typeof(PatchImplants), nameof(PatchImplants.would_rape_PostFix))); + + // Non-rapist is_rapist bypass for limbic stimulator + harmony.Patch(AccessTools.Method(typeof(xxx), nameof(xxx.is_rapist)), + postfix: new HarmonyMethod(typeof(PatchImplants), nameof(PatchImplants.is_rapist_PostFix))); + + // Non-Rapist trait rape thoughts + harmony.Patch(AccessTools.Method(typeof(AfterSexUtility), nameof(AfterSexUtility.think_about_sex_Rapist)), + postfix: new HarmonyMethod(typeof(PatchImplants), nameof(PatchImplants.think_about_sex_Rapist_PostFix))); + + // Bioscaffold double gestation speed tick + harmony.Patch(AccessTools.Method(typeof(PawnUtility), nameof(PawnUtility.BodyResourceGrowthSpeed)), + postfix: new HarmonyMethod(typeof(PatchImplants), nameof(PatchImplants.MultiplyPregnancy))); + + // Hediff_Labor state capture + harmony.Patch(AccessTools.Method(typeof(Hediff_Labor), nameof(Hediff_Labor.PostRemoved)), + postfix: new HarmonyMethod(typeof(PatchLitteredBirth), nameof(PatchLitteredBirth.Hediff_Labor_PostRemovedPostFix))); + + // OvaryAgitator/Gene_LitteredBirths multibirth logic + harmony.Patch(AccessTools.Method(typeof(Hediff_LaborPushing), nameof(Hediff_LaborPushing.PostRemoved)), + postfix: new HarmonyMethod(typeof(PatchLitteredBirth), nameof(PatchLitteredBirth.Hediff_LaborPushing_PostRemovedPostFix))); // Patch Licentia, if Licentia exists // Logic & Explanation taken from https://rimworldwiki.com/wiki/Modding_Tutorials/Compatibility_with_DLLs // Adjusted to use ModsConfig (which makes it work, the example above does not run out of the box) - try - { - ((Action)(() => - { - if (ModsConfig.IsActive("LustLicentia.RJWLabs")) - { - // Gene: Cumflation Immunity [Prefix Patch] - harmony.Patch(AccessTools.Method(typeof(LicentiaLabs.CumflationHelper), nameof(LicentiaLabs.CumflationHelper.Cumflation)), - prefix: new HarmonyMethod(typeof(Patch_Cumflation), nameof(Patch_Cumflation.Prefix))); - // Gene: Generous Donor [Postfix Patch] - harmony.Patch(AccessTools.Method(typeof(LicentiaLabs.CumflationHelper), nameof(LicentiaLabs.CumflationHelper.TransferNutrition)), - postfix: new HarmonyMethod(typeof(Patch_TransferNutrition), nameof(Patch_TransferNutrition.Postfix))); - // Gene: CumEater [Postfix Patch] - harmony.Patch(AccessTools.Method(typeof(rjw.JobDriver_Sex), nameof(rjw.JobDriver_Sex.ChangePsyfocus)), - postfix: new HarmonyMethod(typeof(Patch_SexTicks_ChangePsyfocus), nameof(Patch_SexTicks_ChangePsyfocus.Postfix))); - } - }))(); - } - catch (TypeLoadException ex) { - // To be expected for people without Licentia Labs - } + } } } \ No newline at end of file diff --git a/Source/HediffDefOf.cs b/Source/HediffDefOf.cs index 30e34df..2ff339c 100644 --- a/Source/HediffDefOf.cs +++ b/Source/HediffDefOf.cs @@ -16,10 +16,24 @@ namespace RJW_Genes public static readonly HediffDef rjw_genes_succubus_drained; public static readonly HediffDef rjw_genes_orgasm_rush_hediff; public static readonly HediffDef rjw_genes_fertilin_craving; - public static readonly HediffDef rjw_genes_evergrowth_sideeffect; - public static readonly HediffDef rjw_genes_orgasmic_mytosis_hediff; public static readonly HediffDef rjw_genes_mytosis_shock_hediff; + + public static readonly HediffDef OvaryAgitator; + public static readonly HediffDef Bioscaffold; + + public static HediffDef NeedlePenis = HediffDef.Named("NeedlePenis"); + public static HediffDef PigPenis = HediffDef.Named("PigPenis"); + public static HediffDef MarinePenis = HediffDef.Named("MarinePenis"); + public static HediffDef TentaclePenis = HediffDef.Named("TentaclePenis"); + public static HediffDef GolemPenis = HediffDef.Named("GolemPenis"); + public static HediffDef OrcPenis = HediffDef.Named("OrcPenis"); + public static HediffDef GhostPenis = HediffDef.Named("GhostPenis"); + public static HediffDef NecroPenis = HediffDef.Named("NecroPenis"); + public static HediffDef GhostVagina = HediffDef.Named("GhostVagina"); + public static HediffDef Vagina = HediffDef.Named("Vagina"); + public static HediffDef Penis = HediffDef.Named("Penis"); + public static HediffDef Anus = HediffDef.Named("Anus"); } } diff --git a/Source/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs b/Source/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs deleted file mode 100644 index cfa3ebf..0000000 --- a/Source/Interactions/SuccubusTailjob/DomSuccubusTailCustomRequirementHandler.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Verse; -using RimWorld; -using rjw.Modules.Interactions; -using rjw.Modules.Interactions.Internals.Implementation; -using rjw.Modules.Interactions.Objects; -using rjw; -using rjw.Modules.Interactions.Enums; - -//Modefied code based of RJW-AI code at https://gitgud.io/Ed86/rjw-ia/-/tree/master/ -namespace RJW_Genes -{ - [StaticConstructorOnStartup] - public class DomSuccubusTailCustomRequirementHandler : ICustomRequirementHandler - { - public string HandlerKey - { - get - { - return "DomSuccubusTailCustomRequirementHandler"; - } - } - - - static DomSuccubusTailCustomRequirementHandler() - { - Register(); - } - public static void Register() - { - InteractionRequirementService.CustomRequirementHandlers.Add(new DomSuccubusTailCustomRequirementHandler()); - if (Prefs.DevMode) - { - Log.Message("DomSuccubusTailCustomRequirementHandler registered: "); - } - } - - public bool FufillRequirements(InteractionWithExtension interaction, InteractionPawn dominant, InteractionPawn submissive) - { - if (GeneUtility.HasGeneNullCheck(dominant.Pawn, GeneDefOf.rjw_genes_succubus_tail)) - { - return true; - } - return false; - } - //public static readonly StringListDef filter = DefDatabase.GetNamed("DomSuccubusTailFilter"); - } -} diff --git a/Source/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs b/Source/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs deleted file mode 100644 index 8e993aa..0000000 --- a/Source/Interactions/SuccubusTailjob/GenesPartKindUsageRule.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using rjw; -using rjw.Modules.Interactions.Contexts; -using rjw.Modules.Interactions.Enums; -using rjw.Modules.Interactions.Rules.PartKindUsageRules; -using rjw.Modules.Shared; -using Verse; - -namespace RJW_Genes.Interactions -{ - //Summary// - //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> ModifiersForDominant(InteractionContext context) - { - Pawn pawn = context.Internals.Dominant.Pawn; - Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); - if (gene != null) - { - float weight = 2f; - if (gene.Value < gene.MinLevelForAlert) - { - weight *= 10; - } - else if (gene.Value < gene.targetValue) - { - weight *= 2.5f; - } - if (pawn.genes.HasGene(GeneDefOf.rjw_genes_cum_eater)) - { - yield return new Weighted(weight, LewdablePartKind.Mouth); - yield return new Weighted(weight, LewdablePartKind.Beak); - } - - if (pawn.genes.HasGene(GeneDefOf.rjw_genes_fertilin_absorber)) - { - yield return new Weighted(weight, LewdablePartKind.Vagina); - yield return new Weighted(weight, LewdablePartKind.Anus); - } - } - yield break; - } - - public IEnumerable> ModifiersForSubmissive(InteractionContext context) - { - Pawn pawn = context.Internals.Dominant.Pawn; - Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType(); - if (gene != null) - { - float weight = 2f; - if (gene.Value < gene.MinLevelForAlert) - { - weight *= 10; - } - else if (gene.Value < gene.targetValue) - { - weight *= 2.5f; - } - yield return new Weighted(weight, LewdablePartKind.Mouth); - yield return new Weighted(weight, LewdablePartKind.Beak); - - if (pawn.genes.HasGene(GeneDefOf.rjw_genes_fertilin_absorber)) - { - yield return new Weighted(weight, LewdablePartKind.Vagina); - yield return new Weighted(weight, LewdablePartKind.Anus); - } - } - yield break; - } - } -} diff --git a/Source/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs b/Source/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs deleted file mode 100644 index 9bd8289..0000000 --- a/Source/Interactions/SuccubusTailjob/SubSuccubusTailCustomRequirementHandler.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Verse; -using rjw.Modules.Interactions; -using rjw.Modules.Interactions.Internals.Implementation; -using rjw.Modules.Interactions.Objects; - -//Modified code based of RJW-AI code at https://gitgud.io/Ed86/rjw-ia/-/tree/master/ -namespace RJW_Genes -{ - [StaticConstructorOnStartup] - public class SubSuccubusTailCustomRequirementHandler : ICustomRequirementHandler - { - public string HandlerKey - { - get - { - return "SubSuccubusTailCustomRequirementHandler"; - } - } - - static SubSuccubusTailCustomRequirementHandler() - { - Register(); - } - public static void Register() - { - InteractionRequirementService.CustomRequirementHandlers.Add(new SubSuccubusTailCustomRequirementHandler()); - if (Prefs.DevMode) - { - Log.Message("SubSuccubusTailCustomRequirementHandler registered: "); - } - } - - public bool FufillRequirements(InteractionWithExtension interaction, InteractionPawn dominant, InteractionPawn submissive) - { - if (GeneUtility.HasGeneNullCheck(submissive.Pawn, GeneDefOf.rjw_genes_succubus_tail)) - { - return true; - } - return false; - } - //public static readonly StringListDef filter = DefDatabase.GetNamed("SubSuccubusTailFilter"); - } -} - diff --git a/Source/LetterDefOf.cs b/Source/LetterDefOf.cs new file mode 100644 index 0000000..996b619 --- /dev/null +++ b/Source/LetterDefOf.cs @@ -0,0 +1,11 @@ +using Verse; +using RimWorld; + +namespace RJW_Genes +{ + [DefOf] + public static class LetterDefOf + { + public static LetterDef AnotherBaby; + } +} diff --git a/Source/RJW.dll b/Source/RJW.dll new file mode 100644 index 0000000..c07fda1 Binary files /dev/null and b/Source/RJW.dll differ diff --git a/Source/RJWSexperience.dll b/Source/RJWSexperience.dll new file mode 100644 index 0000000..533e46c Binary files /dev/null and b/Source/RJWSexperience.dll differ diff --git a/Source/RJW_Genes.cs b/Source/RJW_Genes.cs index 44cf60d..f1c5d2e 100644 --- a/Source/RJW_Genes.cs +++ b/Source/RJW_Genes.cs @@ -11,16 +11,7 @@ namespace RJW_Genes static RJW_Genes() { ModLog.Message("RJW-Genes loaded"); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) - { - ModLog.Message($"{HiveUtility.getQueenXenotypes().EnumerableCount()} Queen-Xenotypes ({string.Join(",", HiveUtility.getQueenXenotypes().Select(t => t.defName))})"); - ModLog.Message($"{HiveUtility.getDroneXenotypes().EnumerableCount()} Drone-Xenotypes ({string.Join(",", HiveUtility.getDroneXenotypes().Select(t => t.defName))})"); - ModLog.Message($"Found {HiveUtility.GetQueenWorkerMappings().Count} Queen-Worker Mappings ({string.Join(",", HiveUtility.GetQueenWorkerMappings().Keys.Select(t => t))} + Default) "); - IEnumerable offspringChanceDefs = DefDatabase.AllDefs; - IEnumerable faultOffspringDefs = offspringChanceDefs.Where(t => t.queenChance + t.workerChance + t.workerChance > 1.02 || t.queenChance + t.workerChance + t.workerChance < 0.98 ); - ModLog.Message($"Found {offspringChanceDefs.Count()} OffspringChanceDefs, of which {faultOffspringDefs.Count()} had faulty chances ({string.Join(",", faultOffspringDefs.Select(t => t.defName))})"); - } } } } diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index 7dbbdb0..757086f 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -26,8 +26,25 @@ - - + + + + + + + + + + + + + + + + + + + @@ -42,29 +59,36 @@ + + + + + + + + + + + + + + + - - - - - - - - @@ -91,93 +115,71 @@ - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - + - - + + - + + + + + + + - - + + + + + + + + - - - - - - - - - - - - - - @@ -187,6 +189,8 @@ + + @@ -199,18 +203,13 @@ ..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll False - - False - ..\..\licentia-labs\Assemblies\LicentiaLabs.dll - False - False - ..\..\rjw\1.4\Assemblies\RJW.dll + ..\..\rjw\1.5\Assemblies\RJW.dll False - ..\..\RJW-Sexperience-1.1.4.0\1.4\Assemblies\RJWSexperience.dll + ..\..\rjw-sexperience\1.5\Assemblies\RJWSexperience.dll False diff --git a/Source/Rjw-Genes.csproj.user b/Source/Rjw-Genes.csproj.user deleted file mode 100644 index 6e4223f..0000000 --- a/Source/Rjw-Genes.csproj.user +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Source/Settings/RJW_Genes_Settings.cs b/Source/Settings/RJW_Genes_Settings.cs index f6e2f83..4180532 100644 --- a/Source/Settings/RJW_Genes_Settings.cs +++ b/Source/Settings/RJW_Genes_Settings.cs @@ -1,6 +1,7 @@ using System; using Verse; using UnityEngine; +using RimWorld; namespace RJW_Genes { @@ -11,14 +12,25 @@ namespace RJW_Genes //Copied from RJW settings mostly Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f); Rect rect = new Rect(0f, 0f, inRect.width - 16f, inRect.height + 300f); - //Widgets.BeginScrollView(outRect, ref RJWSettings.scrollPosition, rect, true); + Listing_Standard listing_Standard = new Listing_Standard(); listing_Standard.maxOneColumn = true; listing_Standard.ColumnWidth = rect.width / 2.05f; listing_Standard.Begin(rect); - listing_Standard.Gap(24f); + listing_Standard.Gap(24f); + // Genitalia Resizing Age + listing_Standard.Label("Genitalia resizing age" + ": " + + Math.Round((double)(RJW_Genes_Settings.rjw_genes_resizing_age), 0).ToString() , -1f, "years."); + RJW_Genes_Settings.rjw_genes_resizing_age = listing_Standard.Slider(RJW_Genes_Settings.rjw_genes_resizing_age, 18f, 100f); + listing_Standard.Gap(4f); + // Evergrowth Speed + listing_Standard.Label("number of ticks between genitalia evergrowth updates (60000 ticks are 1 day)" + ": " + + Math.Round((double)(RJW_Genes_Settings.rjw_genes_evergrowth_ticks), 0).ToString() , -1f, "ticks."); + RJW_Genes_Settings.rjw_genes_evergrowth_ticks = (int) listing_Standard.Slider(RJW_Genes_Settings.rjw_genes_evergrowth_ticks, 600, 60000); + listing_Standard.Gap(4f); + // Fertilin Gain From Animals listing_Standard.Label("Fertilin-Gain from Animals" + ": " + - Math.Round((double)(RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor * 100f), 0).ToString() + "%", -1f, "of fertilin gained (compared to human-baseline)."); + Math.Round((double)(RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor * 100f), 0).ToString() + "", -1f, "of fertilin gained (compared to human-baseline)."); RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor = listing_Standard.Slider(RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor, 0f, 3f); listing_Standard.Gap(5f); @@ -33,9 +45,14 @@ namespace RJW_Genes listing_Standard.CheckboxLabeled(" Succubi", ref rjw_genes_sexdemon_visit_succubi, "Allow incubi to spawn through this even", 0f, 1f); listing_Standard.Gap(3f); listing_Standard.CheckboxLabeled(" Incubi", ref rjw_genes_sexdemon_visit_incubi, "Allow incubi to spawn through this even", 0f, 1f); - } + listing_Standard.Gap(4f); + + + listing_Standard.Gap(4f); + listing_Standard.CheckboxLabeled("Regret Stealing Love", ref regretStealingLovinThoughtDisabled, "If off, pawns will not get bad thoughts for seduction."); + listing_Standard.Gap(5f); listing_Standard.CheckboxLabeled("generous-donor cheatmode", ref rjw_genes_generous_donor_cheatmode, "When enabled, pawns with the 'generous donor' are not drained and not fertilin exhausted. Hence they can fuel succubi and incubi non-stop. This makes them drastically easier to keep, and you should not do it.", 0f, 1f); @@ -47,21 +64,24 @@ namespace RJW_Genes public override void ExposeData() { base.ExposeData(); + Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_evergrowth_ticks, "rjw_genes_evergrowth_ticks", RJW_Genes_Settings.rjw_genes_evergrowth_ticks, true); + Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_resizing_age, "rjw_genes_resizing_age", RJW_Genes_Settings.rjw_genes_resizing_age, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor, "rjw_genes_fertilin_from_animals_factor", RJW_Genes_Settings.rjw_genes_fertilin_from_animals_factor, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_detailed_debug, "rjw_genes_detailed_debug", RJW_Genes_Settings.rjw_genes_detailed_debug, true); - + Scribe_Values.Look(ref regretStealingLovinThoughtDisabled, "regretStealingLovinThoughtDisabled", regretStealingLovinThoughtDisabled, true); + Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_generous_donor_cheatmode, "rjw_genes_generous_donor_cheatmode", RJW_Genes_Settings.rjw_genes_generous_donor_cheatmode, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_sexdemon_visit, "rjw_genes_sexdemon_visit", RJW_Genes_Settings.rjw_genes_sexdemon_visit, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_sexdemon_join_size_matters, "rjw_genes_sexdemon_join_size_matters", RJW_Genes_Settings.rjw_genes_sexdemon_join_size_matters, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_sexdemon_visit_groups, "rjw_genes_sexdemon_groups", RJW_Genes_Settings.rjw_genes_sexdemon_visit_groups, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_sexdemon_visit_succubi, "rjw_genes_sexdemon_succubi", RJW_Genes_Settings.rjw_genes_sexdemon_visit_succubi, true); Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_sexdemon_visit_incubi, "rjw_genes_sexdemon_incubi", RJW_Genes_Settings.rjw_genes_sexdemon_visit_incubi, true); - - Scribe_Values.Look(ref RJW_Genes_Settings.rjw_genes_generous_donor_cheatmode, "rjw_genes_generous_donor_cheatmode", RJW_Genes_Settings.rjw_genes_generous_donor_cheatmode, true); } public static bool rjw_genes_detailed_debug = false; public static float rjw_genes_fertilin_from_animals_factor = 0.1f; - + public static float rjw_genes_resizing_age = 20; + public static int rjw_genes_evergrowth_ticks = 60000; + public static bool regretStealingLovinThoughtDisabled = false; public static bool rjw_genes_sexdemon_visit = true; public static bool rjw_genes_sexdemon_join_size_matters = true; @@ -69,6 +89,9 @@ namespace RJW_Genes public static bool rjw_genes_sexdemon_visit_succubi = true; public static bool rjw_genes_sexdemon_visit_incubi = true; + + + public static bool rjw_genes_generous_donor_cheatmode = false; } } diff --git a/Source/ThoughtDefOf.cs b/Source/ThoughtDefOf.cs index 387aeca..f884d4a 100644 --- a/Source/ThoughtDefOf.cs +++ b/Source/ThoughtDefOf.cs @@ -8,7 +8,7 @@ using Verse; namespace RJW_Genes { [DefOf] - public static class ThoughtDefOf + public static class ThoughtDefOf { public static readonly ThoughtDef rjw_genes_cock_eaten; public static readonly ThoughtDef rjw_genes_seduced;