mirror of
https://github.com/vegapnk/RJW-Genes.git
synced 2024-08-15 00:23:31 +00:00
Added animal inheritance to RJW-genes code
This commit is contained in:
parent
b5033deef6
commit
33a37f26de
17 changed files with 821 additions and 9 deletions
Binary file not shown.
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<RJW_BGS.RaceGeneDef ParentName="Slime_base">
|
||||
<defName>AA_Aerofleet</defName>
|
||||
<raceNames>
|
||||
<li>AA_Aerofleet</li>
|
||||
<li>AA_ColossalAerofleet</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>AG_BlueGelProduction</li>
|
||||
<li>AG_GasBags</li>
|
||||
<li>AG_AerofleetHead</li>
|
||||
<li>AG_SlimeBody</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
</Defs>
|
|
@ -0,0 +1,82 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<RJW_BGS.RaceGeneDef ParentName="Insect_base" Name="AA_lisks_base" Abstract="True">
|
||||
<defName>AA_lisks_base</defName>
|
||||
<!-- <raceNames>
|
||||
<li>AA_Animalisk</li>
|
||||
<li>AA_Blizzarisk</li>
|
||||
<li>AA_Cinderlisk</li>
|
||||
<li>AA_Dunealisk</li>
|
||||
<li>AA_Feralisk</li>
|
||||
<li>AA_Junglelisk</li>
|
||||
</raceNames> -->
|
||||
<genes>
|
||||
<li>AG_Spinnerets</li>
|
||||
<li>AG_EggLaying</li>
|
||||
<li>AG_FeraliskEyes</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef ParentName="AA_lisks_base">
|
||||
<defName>AA_Animalisk</defName>
|
||||
<raceNames>
|
||||
<li>AA_Animalisk</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>PsychicAbility_Enhanced</li>
|
||||
<li>PsychicAbility_Extreme</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.8</li>
|
||||
<li>0.2</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef ParentName="AA_lisks_base">
|
||||
<defName>AA_Blizzarisk</defName>
|
||||
<raceNames>
|
||||
<li>AA_Blizzarisk</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>MaxTemp_SmallDecrease</li>
|
||||
<li>MinTemp_SmallDecrease</li>
|
||||
<li>MinTemp_LargeDecrease</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.8</li>
|
||||
<li>0.8</li>
|
||||
<li>0.2</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef ParentName="AA_lisks_base">
|
||||
<defName>AA_Hotlisk</defName>
|
||||
<raceNames>
|
||||
<li>AA_Cinderlisk</li>
|
||||
<li>AA_Dunealisk</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>MinTemp_SmallIncrease</li>
|
||||
<li>MaxTemp_SmallIncrease</li>
|
||||
<li>MaxTemp_LargeIncrease</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.8</li>
|
||||
<li>0.8</li>
|
||||
<li>0.2</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef ParentName="AA_lisks_base">
|
||||
<defName>AA_Normallisk</defName>
|
||||
<raceNames>
|
||||
<li>AA_Feralisk</li>
|
||||
<li>AA_Junglelisk</li>
|
||||
</raceNames>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
</Defs>
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>AA_Wildpodgroup</defName>
|
||||
<raceNames>
|
||||
<li>AA_Wildpod</li>
|
||||
<li>AA_Wildpawn</li>
|
||||
<li>AA_Agaripawn</li>
|
||||
<li>AA_Agaripod</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>AG_FungalSkin</li>
|
||||
<li>MoveSpeed_Slow</li>
|
||||
<li>FireWeakness</li>
|
||||
<li>FireTerror</li>
|
||||
<li>Robust</li>
|
||||
<li>Unstoppable</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.15</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
</Defs>
|
122
Common/Defs/RaceGeneDefs/RaceGeneDefs.xml
Normal file
122
Common/Defs/RaceGeneDefs/RaceGeneDefs.xml
Normal file
|
@ -0,0 +1,122 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<RJW_BGS.RaceGeneDef Name = "Canine">
|
||||
<defName>Canine</defName>
|
||||
<raceGroup>Canine_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Ears_Floppy</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.9</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
<!-- You can use parents to have animals get specific genes in addition to the group.
|
||||
<RJW_BGS.RaceGeneDef ParentName = "Canine">
|
||||
<defName>Warg</defName>
|
||||
<raceNames>
|
||||
<li>Warg</li>
|
||||
</raceNames>
|
||||
<genes>
|
||||
<li>DarkVision</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.9</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
-->
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Insect</defName>
|
||||
<raceGroup>Insect_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Beauty_Ugly</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.5</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Feline</defName>
|
||||
<raceGroup>Feline_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Ears_Cat</li>
|
||||
<li>Sleepy</li>
|
||||
<li>DarkVision</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.9</li>
|
||||
<li>0.25</li>
|
||||
<li>0.25</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
<!--
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Equine</defName>
|
||||
<raceGroup>Equine_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Ears_Floppy</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>10</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
-->
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Dragon</defName>
|
||||
<raceGroup>Dragon_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Unstoppable</li>
|
||||
<li>Headbone_CenterHorn</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.25</li>
|
||||
<li>0.9</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Rodent</defName>
|
||||
<raceGroup>Rodent_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Fertile</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.25</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Racoon</defName>
|
||||
<raceGroup>Raccon_Group</raceGroup>
|
||||
<genes>
|
||||
<li>StrongStomach</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.5</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
<!--
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Needle</defName>
|
||||
<raceGroup>Needle_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Ears_Floppy</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>10</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
-->
|
||||
<!--
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Hemi</defName>
|
||||
<raceGroup>Hemi_Group</raceGroup>
|
||||
<genes>
|
||||
<li>Ears_Floppy</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>10</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
-->
|
||||
</Defs>
|
26
Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml
Normal file
26
Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<RJW_BGS.RaceGeneDef Name="Insect_base" Abstract="True">
|
||||
<defName>Insect_base</defName>
|
||||
<genes>
|
||||
<li>AG_InsectBlood</li>
|
||||
<li>rjw_genes_ovipositor_genitalia</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.5</li>
|
||||
<li>0.5</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
<RJW_BGS.RaceGeneDef Name="Slime_base" Abstract="True">
|
||||
<defName>Slime_base</defName>
|
||||
<genes>
|
||||
<li>AG_SlimeBlood</li>
|
||||
<li>rjw_genes_slime_genitalia</li>
|
||||
</genes>
|
||||
<genechances>
|
||||
<li>0.5</li>
|
||||
<li>0.5</li>
|
||||
</genechances>
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
</Defs>
|
38
Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml
Normal file
38
Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Defs>
|
||||
<!--
|
||||
<RJW_BGS.RaceGeneDef>
|
||||
<defName>Canine</defName>
|
||||
defName can be anything you want, as long as it is unique
|
||||
|
||||
<raceGroup>Canine_Group</raceGroup>
|
||||
RJW.Racegroupdef, all animals in the raceGroup will be part of this group, RJW race support uses this so those can be used to quickly add a group
|
||||
|
||||
<raceNames>
|
||||
<li> </li>
|
||||
</raceNames>
|
||||
For more direct control you can use raceNames directly. Use the defName of the animal. Can also use modded animals.
|
||||
|
||||
<pawnKindNames>
|
||||
<li> </li>
|
||||
</pawnKindNames>
|
||||
For even more direct control you can use pawnKindNames.
|
||||
|
||||
The RaceGeneDef for an animal will first be decided by if it is in the pawnkindNames, after that racenames and lastly racegroup,
|
||||
so if there is for a wolf a RaceGeneDef with the canine group and a second which has wolf under raceNames it will always use the second one to determine
|
||||
which genes can be inherited
|
||||
|
||||
<genes>
|
||||
<li>Ears_Floppy</li>
|
||||
</genes>
|
||||
The genes which may be inherited. Use the defName of the gene, you can also add modded genes.
|
||||
|
||||
<genechances>
|
||||
<li>0.9</li>
|
||||
</genechances>
|
||||
WIP, the chance of each gene to be inherited. Is in same order as genes, so for the second gene the chance to inherit is based on the second line in geweights.
|
||||
</RJW_BGS.RaceGeneDef>
|
||||
|
||||
|
||||
-->
|
||||
</Defs>
|
31
Source/Animal_Inheritance/First.cs
Normal file
31
Source/Animal_Inheritance/First.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using rjw;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
[StaticConstructorOnStartup]
|
||||
internal static class First
|
||||
{
|
||||
static First()
|
||||
{
|
||||
RJWcopy.Racegroupdictbuilder();
|
||||
//foreach (RaceGroupDef raceGroupDef2 in DefDatabase<RaceGroupDef>.AllDefs)
|
||||
//{
|
||||
//Log.Message("defName = " + raceGroupDef2.defName);
|
||||
// if (raceGroupDef2.raceNames != null)
|
||||
// {
|
||||
// foreach (string race in raceGroupDef2.raceNames)
|
||||
// {
|
||||
//Log.Message(race);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
21
Source/Animal_Inheritance/Harmony_Init.cs
Normal file
21
Source/Animal_Inheritance/Harmony_Init.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using Verse;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
[StaticConstructorOnStartup]
|
||||
internal static class HarmonyInit
|
||||
{
|
||||
// Token: 0x0600001F RID: 31 RVA: 0x000029A4 File Offset: 0x00000BA4
|
||||
static HarmonyInit()
|
||||
{
|
||||
Harmony harmony = new Harmony("RJW_BGS");
|
||||
harmony.PatchAll();
|
||||
}
|
||||
}
|
||||
}
|
134
Source/Animal_Inheritance/InheritanceUtility.cs
Normal file
134
Source/Animal_Inheritance/InheritanceUtility.cs
Normal file
|
@ -0,0 +1,134 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
public class InheritanceUtility
|
||||
{
|
||||
public static List<GeneDef> AnimalInheritedGenes(Pawn father, Pawn mother)
|
||||
{
|
||||
//One parent must be an animal and the other must be human, so only one needs to return
|
||||
List<GeneDef> genelist = new List<GeneDef>();
|
||||
if (father != null && !father.RaceProps.Humanlike)
|
||||
{
|
||||
return SelectGenes(father);
|
||||
}
|
||||
|
||||
if (mother != null && !mother.RaceProps.Humanlike)
|
||||
{
|
||||
return SelectGenes(mother);
|
||||
//PawnKindDef pawnKindDef = mother.kindDef;
|
||||
//RaceGeneDef raceGeneDef = RJWcopy.GetRaceGenDefInternal(pawnKindDef);
|
||||
//if (raceGeneDef != null)
|
||||
//{
|
||||
// GeneDef gene = null;
|
||||
//In case you hit a modded gene not currently active try again.
|
||||
// for (int i = 0; i < 50 || gene == null; i++)
|
||||
// {
|
||||
// if (raceGeneDef.genes.Any())
|
||||
// {
|
||||
// gene = DefDatabase<GeneDef>.GetNamed(raceGeneDef.genes.RandomElement());
|
||||
// }
|
||||
// }
|
||||
// if (gene != null)
|
||||
// {
|
||||
// genelist.Add(gene);
|
||||
//
|
||||
// }
|
||||
//
|
||||
// }
|
||||
}
|
||||
return genelist;
|
||||
}
|
||||
|
||||
public static List<GeneDef> SelectGenes(Pawn pawn)
|
||||
{
|
||||
List<GeneDef> genelist = new List<GeneDef>();
|
||||
PawnKindDef pawnKindDef = pawn.kindDef;
|
||||
RaceGeneDef raceGeneDef = RJWcopy.GetRaceGenDefInternal(pawnKindDef);
|
||||
if (raceGeneDef != null)
|
||||
{
|
||||
int num1 = raceGeneDef.genes.Count;
|
||||
int num2 = raceGeneDef.genechances.Count;
|
||||
if (num1 != num2)
|
||||
{
|
||||
Log.Error("The amount of genes and genechanches are different in " + raceGeneDef.defName + ". Can't select genes to inherit");
|
||||
return genelist;
|
||||
}
|
||||
for (int i = 0; i<num1; i++)
|
||||
{
|
||||
if (raceGeneDef.genechances[i] > Rand.Range(0.01f, 1f))
|
||||
{
|
||||
genelist.Add(DefDatabase<GeneDef>.GetNamed(raceGeneDef.genes[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
return genelist;
|
||||
}
|
||||
|
||||
public static void AddGenes(Pawn pawn, List<GeneDef> genes)
|
||||
{
|
||||
foreach (GeneDef gene in genes)
|
||||
{
|
||||
pawn.genes.AddGene(gene, false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void NewGenes(Pawn mother, Pawn dad, Pawn baby)
|
||||
{
|
||||
if (baby.RaceProps.Humanlike)
|
||||
{
|
||||
if (baby.genes == null)
|
||||
{
|
||||
baby.genes = new Pawn_GeneTracker(baby);
|
||||
}
|
||||
|
||||
//Remove the hair and skin genes pawns always start with, should get correct ones from human parent anyway.
|
||||
for (int i = baby.genes.Endogenes.Count - 1; i >= 0; i--)
|
||||
{
|
||||
baby.genes.RemoveGene(baby.genes.Endogenes[i]);
|
||||
}
|
||||
|
||||
List<GeneDef> genes = PregnancyUtility.GetInheritedGenes(dad, mother);
|
||||
List<GeneDef> beastgenes = InheritanceUtility.AnimalInheritedGenes(dad, mother);
|
||||
InheritanceUtility.AddGenes(baby, beastgenes);
|
||||
InheritanceUtility.AddGenes(baby, genes);
|
||||
if(baby.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin) == null)
|
||||
{
|
||||
AddSkinColor(mother, dad, baby);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddSkinColor(Pawn mother, Pawn father, Pawn baby)
|
||||
{
|
||||
if (mother != null && mother.genes != null)
|
||||
{
|
||||
GeneDef gene = mother.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin);
|
||||
if (gene != null)
|
||||
{
|
||||
baby.genes.AddGene(gene, false);
|
||||
}
|
||||
}
|
||||
else if (father != null && father.genes != null)
|
||||
{
|
||||
GeneDef gene = father.genes.GetFirstEndogeneByCategory(EndogeneCategory.Melanin);
|
||||
if (gene != null)
|
||||
{
|
||||
baby.genes.AddGene(gene, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Message("Could not find skincolor of " + baby.Name + "'s parents, giving random skincolor.");
|
||||
baby.genes.AddGene(PawnSkinColors.RandomSkinColorGene(baby), false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
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_BGS
|
||||
{
|
||||
[HarmonyPatch(typeof(Hediff_BasePregnancy), "Initialize")]
|
||||
public static class PatchRJWBestialityPregnancyUtility
|
||||
{
|
||||
[HarmonyPostfix]
|
||||
public static void AddGenes(Pawn mother, Pawn dad, ref Hediff_BasePregnancy __instance)
|
||||
{
|
||||
foreach (Pawn baby in __instance.babies)
|
||||
{
|
||||
if (baby.RaceProps.Humanlike)
|
||||
{
|
||||
if (baby.genes == null)
|
||||
{
|
||||
baby.genes = new Pawn_GeneTracker(baby);
|
||||
}
|
||||
|
||||
//Remove the hair and skin genes pawns always start with, should get correct ones from human parent anyway.
|
||||
for (int i = baby.genes.Endogenes.Count - 1; i >= 0; i--)
|
||||
{
|
||||
baby.genes.RemoveGene(baby.genes.Endogenes[i]);
|
||||
}
|
||||
|
||||
List<GeneDef> genes = PregnancyUtility.GetInheritedGenes(dad, mother);
|
||||
List<GeneDef> beastgenes = InheritanceUtility.AnimalInheritedGenes(dad, mother);
|
||||
InheritanceUtility.AddGenes(baby, beastgenes);
|
||||
InheritanceUtility.AddGenes(baby, genes);
|
||||
//foreach (GeneDef gene in genes)
|
||||
//{
|
||||
// baby.genes.AddGene(gene, false);
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
41
Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs
Normal file
41
Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs
Normal file
|
@ -0,0 +1,41 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using HarmonyLib;
|
||||
using rjw;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
[HarmonyPatch(typeof(Hediff_InsectEgg), "GiveBirth")]
|
||||
public static class PatchRJWHediffInsect_Egg
|
||||
{
|
||||
[HarmonyTranspiler]
|
||||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
|
||||
{
|
||||
MethodInfo newgenes = AccessTools.Method(typeof(InheritanceUtility), "NewGenes", null, null);
|
||||
FieldInfo implanter = AccessTools.Field(typeof(Hediff_InsectEgg), "implanter");
|
||||
FieldInfo father = AccessTools.Field(typeof(Hediff_InsectEgg), "father");
|
||||
|
||||
foreach (CodeInstruction instruction in instructions)
|
||||
{
|
||||
yield return instruction;
|
||||
if (instruction.opcode == OpCodes.Call && instruction.operand.ToString() == "Void BabyPostBirth(Verse.Pawn, Verse.Pawn, Verse.Pawn)")
|
||||
{
|
||||
yield return new CodeInstruction(OpCodes.Ldloc_0, null);
|
||||
yield return new CodeInstruction(OpCodes.Ldfld, implanter);
|
||||
yield return new CodeInstruction(OpCodes.Ldarg_0, null);
|
||||
yield return new CodeInstruction(OpCodes.Ldfld, father);
|
||||
yield return new CodeInstruction(OpCodes.Ldloc_1, null);
|
||||
yield return new CodeInstruction(OpCodes.Call, newgenes);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
35
Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs
Normal file
35
Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
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_BGS
|
||||
{
|
||||
[HarmonyPatch(typeof(PregnancyUtility), "GetInheritedGeneSet", new Type[]
|
||||
{
|
||||
typeof(Pawn),
|
||||
typeof(Pawn),
|
||||
//typeof(bool)
|
||||
}
|
||||
)]
|
||||
public static class PatchVanillaPregnancyUtility
|
||||
{
|
||||
[HarmonyPostfix]
|
||||
public static void AnimalInheritedGenes(Pawn father, Pawn mother, ref GeneSet __result)
|
||||
{
|
||||
List<GeneDef> genes = InheritanceUtility.AnimalInheritedGenes(father, mother);
|
||||
if (genes.Any())
|
||||
{
|
||||
foreach (GeneDef gene in genes)
|
||||
{
|
||||
__result.AddGene(gene);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
150
Source/Animal_Inheritance/RJWcopies.cs
Normal file
150
Source/Animal_Inheritance/RJWcopies.cs
Normal file
|
@ -0,0 +1,150 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using rjw;
|
||||
using Verse;
|
||||
using RimWorld;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
internal class RJWcopy
|
||||
{
|
||||
//Code copied from rjw, as their code was internal and I need the dictionary to know which genes to add to the pawn
|
||||
public static void Racegroupdictbuilder()
|
||||
{
|
||||
foreach (PawnKindDef pawnKindDef2 in from pawnKindDef in DefDatabase<PawnKindDef>.AllDefs
|
||||
where pawnKindDef.race.race != null
|
||||
select pawnKindDef)
|
||||
{
|
||||
RaceGroupDef raceGroupDef = null;
|
||||
bool temp = TryGetRaceGroupDef(pawnKindDef2, out raceGroupDef);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryGetRaceGroupDef(PawnKindDef pawnKindDef, out RaceGroupDef raceGroupDef)
|
||||
{
|
||||
|
||||
if (RaceGroupByPawnKind.TryGetValue(pawnKindDef, out raceGroupDef))
|
||||
{
|
||||
return raceGroupDef != null;
|
||||
}
|
||||
raceGroupDef = GetRaceGroupDefInternal(pawnKindDef);
|
||||
RaceGroupByPawnKind.Add(pawnKindDef, raceGroupDef);
|
||||
return raceGroupDef != null;
|
||||
}
|
||||
|
||||
//slightly modified code so it also works racegroupdefs
|
||||
public static RaceGroupDef GetRaceGroupDefInternal(PawnKindDef kindDef)
|
||||
{
|
||||
string raceName = kindDef.race.defName;
|
||||
string pawnKindName = kindDef.defName;
|
||||
IEnumerable<RaceGroupDef> allDefs = DefDatabase<RaceGroupDef>.AllDefs;
|
||||
List<RaceGroupDef> list = allDefs.Where(delegate (RaceGroupDef group)
|
||||
{
|
||||
List<string> pawnKindNames = group.pawnKindNames;
|
||||
return pawnKindNames != null && pawnKindNames.Contains(pawnKindName);
|
||||
}).ToList<RaceGroupDef>();
|
||||
List<RaceGroupDef> list2 = allDefs.Where(delegate (RaceGroupDef group)
|
||||
{
|
||||
List<string> raceNames = group.raceNames;
|
||||
return raceNames != null && raceNames.Contains(raceName);
|
||||
}).ToList<RaceGroupDef>();
|
||||
int num = list.Count<RaceGroupDef>() + list2.Count<RaceGroupDef>();
|
||||
if (num == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (num == 1)
|
||||
{
|
||||
return list.Concat(list2).Single<RaceGroupDef>();
|
||||
}
|
||||
RaceGroupDef result;
|
||||
if ((result = list.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null)
|
||||
{
|
||||
if ((result = list2.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null)
|
||||
{
|
||||
result = (list.FirstOrDefault<RaceGroupDef>() ?? list2.FirstOrDefault<RaceGroupDef>());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static RaceGeneDef GetRaceGenDefInternal(PawnKindDef kindDef)
|
||||
{
|
||||
if (kindDef == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
string raceName = kindDef.race.defName;
|
||||
string pawnKindName = kindDef.defName;
|
||||
RaceGroupDef raceGroupDef = GetRaceGroupDef(kindDef);
|
||||
//string raceGroupName = GetRaceGroupDef(kindDef).defName;
|
||||
IEnumerable<RaceGeneDef> allDefs = DefDatabase<RaceGeneDef>.AllDefs;
|
||||
Log.Message(allDefs.Count<RaceGeneDef>().ToString());
|
||||
List<RaceGeneDef> list = allDefs.Where(delegate (RaceGeneDef group)
|
||||
{
|
||||
List<string> pawnKindNames = group.pawnKindNames;
|
||||
return pawnKindNames != null && pawnKindNames.Contains(pawnKindName);
|
||||
}).ToList<RaceGeneDef>();
|
||||
List<RaceGeneDef> list2 = allDefs.Where(delegate (RaceGeneDef group)
|
||||
{
|
||||
List<string> raceNames = group.raceNames;
|
||||
return raceNames != null && raceNames.Contains(raceName);
|
||||
}).ToList<RaceGeneDef>();
|
||||
List<RaceGeneDef> list3 = new List<RaceGeneDef>();
|
||||
if (raceGroupDef != null)
|
||||
{
|
||||
Log.Message("found a raceGroupDef");
|
||||
Log.Message(raceGroupDef.defName);
|
||||
foreach (RaceGeneDef rgd in allDefs)
|
||||
{
|
||||
Log.Message(rgd.defName);
|
||||
}
|
||||
list3 = allDefs.Where(delegate (RaceGeneDef group)
|
||||
{
|
||||
String raceGroupDefName = group.raceGroup;
|
||||
return raceGroupDefName != null && raceGroupDefName == raceGroupDef.defName;
|
||||
}).ToList<RaceGeneDef>();
|
||||
}
|
||||
RaceGeneDef result = null;
|
||||
//First check if there is a matching pawnkinddef then race, then racegroup
|
||||
if (list.Any())
|
||||
{
|
||||
result = list.RandomElement();
|
||||
}
|
||||
else if (list2.Any() && result == null)
|
||||
{
|
||||
result = list2.RandomElement();
|
||||
}
|
||||
else if (list3.Any() && result == null)
|
||||
{
|
||||
result = list3.RandomElement();
|
||||
}
|
||||
else
|
||||
{
|
||||
result = null;
|
||||
}
|
||||
return result;
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static RaceGroupDef GetRaceGroupDef(PawnKindDef kindDef)
|
||||
{
|
||||
RaceGroupDef raceGroupDef = null;
|
||||
bool temp = TryGetRaceGroupDef(kindDef, out raceGroupDef);
|
||||
return raceGroupDef;
|
||||
}
|
||||
|
||||
private static bool IsThisMod(Def def)
|
||||
{
|
||||
return LoadedModManager.RunningMods.Single((ModContentPack pack) => pack.Name == "RimJobWorld").AllDefs.Contains(def);
|
||||
}
|
||||
|
||||
private static readonly IDictionary<PawnKindDef, RaceGroupDef> RaceGroupByPawnKind = new Dictionary<PawnKindDef, RaceGroupDef>();
|
||||
}
|
||||
|
||||
|
||||
}
|
20
Source/Animal_Inheritance/RaceGeneDef.cs
Normal file
20
Source/Animal_Inheritance/RaceGeneDef.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Verse;
|
||||
using rjw;
|
||||
|
||||
namespace RJW_BGS
|
||||
{
|
||||
public class RaceGeneDef : Def
|
||||
{
|
||||
public String raceGroup;
|
||||
public List<string> raceNames;
|
||||
public List<string> pawnKindNames;
|
||||
public List<string> genes;
|
||||
public List<float> genechances;
|
||||
public String hybridName;
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@
|
|||
<ProjectGuid>{D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Rjw-Genes</RootNamespace>
|
||||
<RootNamespace>RJW_Genes</RootNamespace>
|
||||
<AssemblyName>Rjw-Genes</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
|
@ -23,18 +23,19 @@
|
|||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="0Harmony">
|
||||
<HintPath>..\..\..\..\..\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll</HintPath>
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Assembly-CSharp">
|
||||
<HintPath>..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="LicentiaLabs">
|
||||
<HintPath>..\..\licentia-labs\Assemblies\LicentiaLabs.dll</HintPath>
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\licentia-labs-master\Assemblies\LicentiaLabs.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="RJW">
|
||||
<HintPath>..\..\rjw\1.4\Assemblies\RJW.dll</HintPath>
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\RJW\1.4\Assemblies\RJW.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
|
@ -43,18 +44,26 @@
|
|||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<None Include="..\About\**" />
|
||||
<None Include="..\Common\Defs\Genes\GeneCategories.xml" />
|
||||
<None Include="..\Common\Defs\Genes\GeneDefs_ExtraGenitaliaEndogenes.xml" />
|
||||
<None Include="..\Common\Defs\Genes\GeneDefs_GenitaliaTypeEndogenes.xml" />
|
||||
<None Include="..\Common\Languages\**" />
|
||||
<None Include="..\Common\Patches\**" />
|
||||
<Reference Include="UnityEngine">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Animal_Inheritance\First.cs" />
|
||||
<Compile Include="Animal_Inheritance\Harmony_Init.cs" />
|
||||
<Compile Include="Animal_Inheritance\InheritanceUtility.cs" />
|
||||
<Compile Include="Animal_Inheritance\PatchRJWBestialityPregnancyUtility.cs" />
|
||||
<Compile Include="Animal_Inheritance\PatchRJWHediffInsect_Egg.cs" />
|
||||
<Compile Include="Animal_Inheritance\PatchVanillaPregnancyUtility.cs" />
|
||||
<Compile Include="Animal_Inheritance\RaceGeneDef.cs" />
|
||||
<Compile Include="Animal_Inheritance\RJWcopies.cs" />
|
||||
<Compile Include="GeneDefOf.cs" />
|
||||
<Compile Include="Genes\Breeding\Gene_MechBreeder.cs" />
|
||||
<Compile Include="Genes\Breeding\PatchMechBirth.cs" />
|
||||
|
|
7
Source/Rjw-Genes.csproj.user
Normal file
7
Source/Rjw-Genes.csproj.user
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ReferencePath>
|
||||
</ReferencePath>
|
||||
</PropertyGroup>
|
||||
</Project>
|
Loading…
Reference in a new issue