From 33a37f26de1b4e4b2ab9ab8d00a14926ef98670d Mon Sep 17 00:00:00 2001 From: Shabakur Date: Thu, 1 Dec 2022 15:29:26 +0100 Subject: [PATCH] Added animal inheritance to RJW-genes code --- Common/Assemblies/Rjw-Genes.dll | Bin 31232 -> 39424 bytes .../Alpha Animals/RaceGeneDefs_Aerofleet.xml | 22 +++ .../Alpha Animals/RaceGeneDefs_Lisks.xml | 82 ++++++++++ .../RaceGeneDefs_Wildpodgroup.xml | 28 ++++ Common/Defs/RaceGeneDefs/RaceGeneDefs.xml | 122 ++++++++++++++ .../Defs/RaceGeneDefs/RaceGeneDefs_Base.xml | 26 +++ .../RaceGeneDefs/RaceGeneDefs_template.xml | 38 +++++ Source/Animal_Inheritance/First.cs | 31 ++++ Source/Animal_Inheritance/Harmony_Init.cs | 21 +++ .../Animal_Inheritance/InheritanceUtility.cs | 134 ++++++++++++++++ .../PatchRJWBestialityPregnancyUtility.cs | 46 ++++++ .../PatchRJWHediffInsect_Egg.cs | 41 +++++ .../PatchVanillaPregnancyUtility.cs | 35 ++++ Source/Animal_Inheritance/RJWcopies.cs | 150 ++++++++++++++++++ Source/Animal_Inheritance/RaceGeneDef.cs | 20 +++ Source/Rjw-Genes.csproj | 27 ++-- Source/Rjw-Genes.csproj.user | 7 + 17 files changed, 821 insertions(+), 9 deletions(-) create mode 100644 Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Aerofleet.xml create mode 100644 Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Lisks.xml create mode 100644 Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Wildpodgroup.xml create mode 100644 Common/Defs/RaceGeneDefs/RaceGeneDefs.xml create mode 100644 Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml create mode 100644 Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml create mode 100644 Source/Animal_Inheritance/First.cs create mode 100644 Source/Animal_Inheritance/Harmony_Init.cs create mode 100644 Source/Animal_Inheritance/InheritanceUtility.cs create mode 100644 Source/Animal_Inheritance/PatchRJWBestialityPregnancyUtility.cs create mode 100644 Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs create mode 100644 Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs create mode 100644 Source/Animal_Inheritance/RJWcopies.cs create mode 100644 Source/Animal_Inheritance/RaceGeneDef.cs create mode 100644 Source/Rjw-Genes.csproj.user diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index e5045f94ffcde54e24d22112144fb92b3cb26184..8a6459ba2c708f90d56a62a30f37e37ac33942f6 100644 GIT binary patch literal 39424 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 w4Db1bKmkT>O8>rN4UezZZf31hG`|JOBUy diff --git a/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Aerofleet.xml b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Aerofleet.xml new file mode 100644 index 0000000..bf2cfee --- /dev/null +++ b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Aerofleet.xml @@ -0,0 +1,22 @@ + + + + AA_Aerofleet + +
  • AA_Aerofleet
  • +
  • AA_ColossalAerofleet
  • +
    + +
  • AG_BlueGelProduction
  • +
  • AG_GasBags
  • +
  • AG_AerofleetHead
  • +
  • AG_SlimeBody
  • +
    + +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Lisks.xml b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Lisks.xml new file mode 100644 index 0000000..1fd246a --- /dev/null +++ b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Lisks.xml @@ -0,0 +1,82 @@ + + + + AA_lisks_base + + +
  • AG_Spinnerets
  • +
  • AG_EggLaying
  • +
  • AG_FeraliskEyes
  • +
    + +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
    +
    + + + AA_Animalisk + +
  • AA_Animalisk
  • +
    + +
  • PsychicAbility_Enhanced
  • +
  • PsychicAbility_Extreme
  • +
    + +
  • 0.8
  • +
  • 0.2
  • +
    +
    + + + AA_Blizzarisk + +
  • AA_Blizzarisk
  • +
    + +
  • MaxTemp_SmallDecrease
  • +
  • MinTemp_SmallDecrease
  • +
  • MinTemp_LargeDecrease
  • +
    + +
  • 0.8
  • +
  • 0.8
  • +
  • 0.2
  • +
    +
    + + + AA_Hotlisk + +
  • AA_Cinderlisk
  • +
  • AA_Dunealisk
  • +
    + +
  • MinTemp_SmallIncrease
  • +
  • MaxTemp_SmallIncrease
  • +
  • MaxTemp_LargeIncrease
  • +
    + +
  • 0.8
  • +
  • 0.8
  • +
  • 0.2
  • +
    +
    + + + AA_Normallisk + +
  • AA_Feralisk
  • +
  • AA_Junglelisk
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Wildpodgroup.xml b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Wildpodgroup.xml new file mode 100644 index 0000000..bb752f9 --- /dev/null +++ b/Common/Defs/RaceGeneDefs/Alpha Animals/RaceGeneDefs_Wildpodgroup.xml @@ -0,0 +1,28 @@ + + + + AA_Wildpodgroup + +
  • AA_Wildpod
  • +
  • AA_Wildpawn
  • +
  • AA_Agaripawn
  • +
  • AA_Agaripod
  • +
    + +
  • AG_FungalSkin
  • +
  • MoveSpeed_Slow
  • +
  • FireWeakness
  • +
  • FireTerror
  • +
  • Robust
  • +
  • Unstoppable
  • +
    + +
  • 0.15
  • +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
  • 0.25
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/RaceGeneDefs/RaceGeneDefs.xml b/Common/Defs/RaceGeneDefs/RaceGeneDefs.xml new file mode 100644 index 0000000..e137b8c --- /dev/null +++ b/Common/Defs/RaceGeneDefs/RaceGeneDefs.xml @@ -0,0 +1,122 @@ + + + + Canine + Canine_Group + +
  • Ears_Floppy
  • +
    + +
  • 0.9
  • +
    +
    + + + Insect + Insect_Group + +
  • Beauty_Ugly
  • +
    + +
  • 0.5
  • +
    +
    + + + Feline + Feline_Group + +
  • Ears_Cat
  • +
  • Sleepy
  • +
  • DarkVision
  • +
    + +
  • 0.9
  • +
  • 0.25
  • +
  • 0.25
  • +
    +
    + + + Dragon + Dragon_Group + +
  • Unstoppable
  • +
  • Headbone_CenterHorn
  • +
    + +
  • 0.25
  • +
  • 0.9
  • +
    +
    + + + Rodent + Rodent_Group + +
  • Fertile
  • +
    + +
  • 0.25
  • +
    +
    + + + Racoon + Raccon_Group + +
  • StrongStomach
  • +
    + +
  • 0.5
  • +
    +
    + + +
    \ No newline at end of file diff --git a/Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml b/Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml new file mode 100644 index 0000000..f2e40b4 --- /dev/null +++ b/Common/Defs/RaceGeneDefs/RaceGeneDefs_Base.xml @@ -0,0 +1,26 @@ + + + + Insect_base + +
  • AG_InsectBlood
  • +
  • rjw_genes_ovipositor_genitalia
  • +
    + +
  • 0.5
  • +
  • 0.5
  • +
    +
    + + + Slime_base + +
  • AG_SlimeBlood
  • +
  • rjw_genes_slime_genitalia
  • +
    + +
  • 0.5
  • +
  • 0.5
  • +
    +
    +
    \ No newline at end of file diff --git a/Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml b/Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml new file mode 100644 index 0000000..bce3870 --- /dev/null +++ b/Common/Defs/RaceGeneDefs/RaceGeneDefs_template.xml @@ -0,0 +1,38 @@ + + + + \ No newline at end of file diff --git a/Source/Animal_Inheritance/First.cs b/Source/Animal_Inheritance/First.cs new file mode 100644 index 0000000..74eeb6c --- /dev/null +++ b/Source/Animal_Inheritance/First.cs @@ -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.AllDefs) + //{ + //Log.Message("defName = " + raceGroupDef2.defName); + // if (raceGroupDef2.raceNames != null) + // { + // foreach (string race in raceGroupDef2.raceNames) + // { + //Log.Message(race); + // } + // } + //} + } + } +} diff --git a/Source/Animal_Inheritance/Harmony_Init.cs b/Source/Animal_Inheritance/Harmony_Init.cs new file mode 100644 index 0000000..1852e9b --- /dev/null +++ b/Source/Animal_Inheritance/Harmony_Init.cs @@ -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(); + } + } +} diff --git a/Source/Animal_Inheritance/InheritanceUtility.cs b/Source/Animal_Inheritance/InheritanceUtility.cs new file mode 100644 index 0000000..57d0205 --- /dev/null +++ b/Source/Animal_Inheritance/InheritanceUtility.cs @@ -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 AnimalInheritedGenes(Pawn father, Pawn mother) + { + //One parent must be an animal and the other must be human, so only one needs to return + List genelist = new List(); + 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.GetNamed(raceGeneDef.genes.RandomElement()); + // } + // } + // if (gene != null) + // { + // genelist.Add(gene); +// + // } + // + // } + } + return genelist; + } + + public static List SelectGenes(Pawn pawn) + { + List genelist = new List(); + 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 Rand.Range(0.01f, 1f)) + { + genelist.Add(DefDatabase.GetNamed(raceGeneDef.genes[i])); + } + } + } + return genelist; + } + + public static void AddGenes(Pawn pawn, List 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 genes = PregnancyUtility.GetInheritedGenes(dad, mother); + List 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); + } + } + + } +} diff --git a/Source/Animal_Inheritance/PatchRJWBestialityPregnancyUtility.cs b/Source/Animal_Inheritance/PatchRJWBestialityPregnancyUtility.cs new file mode 100644 index 0000000..5224c4f --- /dev/null +++ b/Source/Animal_Inheritance/PatchRJWBestialityPregnancyUtility.cs @@ -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 genes = PregnancyUtility.GetInheritedGenes(dad, mother); + List beastgenes = InheritanceUtility.AnimalInheritedGenes(dad, mother); + InheritanceUtility.AddGenes(baby, beastgenes); + InheritanceUtility.AddGenes(baby, genes); + //foreach (GeneDef gene in genes) + //{ + // baby.genes.AddGene(gene, false); + //} + } + } + } + } +} diff --git a/Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs b/Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs new file mode 100644 index 0000000..d52f62d --- /dev/null +++ b/Source/Animal_Inheritance/PatchRJWHediffInsect_Egg.cs @@ -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 Transpiler(IEnumerable 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); + } + + } + } + } +} diff --git a/Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs b/Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs new file mode 100644 index 0000000..0f5cc90 --- /dev/null +++ b/Source/Animal_Inheritance/PatchVanillaPregnancyUtility.cs @@ -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 genes = InheritanceUtility.AnimalInheritedGenes(father, mother); + if (genes.Any()) + { + foreach (GeneDef gene in genes) + { + __result.AddGene(gene); + } + } + } + } +} diff --git a/Source/Animal_Inheritance/RJWcopies.cs b/Source/Animal_Inheritance/RJWcopies.cs new file mode 100644 index 0000000..594b922 --- /dev/null +++ b/Source/Animal_Inheritance/RJWcopies.cs @@ -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.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 allDefs = DefDatabase.AllDefs; + List list = allDefs.Where(delegate (RaceGroupDef group) + { + List pawnKindNames = group.pawnKindNames; + return pawnKindNames != null && pawnKindNames.Contains(pawnKindName); + }).ToList(); + List list2 = allDefs.Where(delegate (RaceGroupDef group) + { + List raceNames = group.raceNames; + return raceNames != null && raceNames.Contains(raceName); + }).ToList(); + int num = list.Count() + list2.Count(); + if (num == 0) + { + return null; + } + if (num == 1) + { + return list.Concat(list2).Single(); + } + RaceGroupDef result; + if ((result = list.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null) + { + if ((result = list2.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null) + { + result = (list.FirstOrDefault() ?? list2.FirstOrDefault()); + } + } + 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 allDefs = DefDatabase.AllDefs; + Log.Message(allDefs.Count().ToString()); + List list = allDefs.Where(delegate (RaceGeneDef group) + { + List pawnKindNames = group.pawnKindNames; + return pawnKindNames != null && pawnKindNames.Contains(pawnKindName); + }).ToList(); + List list2 = allDefs.Where(delegate (RaceGeneDef group) + { + List raceNames = group.raceNames; + return raceNames != null && raceNames.Contains(raceName); + }).ToList(); + List list3 = new List(); + 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 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 RaceGroupByPawnKind = new Dictionary(); + } + + +} diff --git a/Source/Animal_Inheritance/RaceGeneDef.cs b/Source/Animal_Inheritance/RaceGeneDef.cs new file mode 100644 index 0000000..0b14e2a --- /dev/null +++ b/Source/Animal_Inheritance/RaceGeneDef.cs @@ -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 raceNames; + public List pawnKindNames; + public List genes; + public List genechances; + public String hybridName; + } +} diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index 67da2c6..e570152 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -7,7 +7,7 @@ {D7D21B4A-1DA7-41D8-B202-C58CA8FA62AA} Library Properties - Rjw-Genes + RJW_Genes Rjw-Genes v4.8 512 @@ -23,18 +23,19 @@ - ..\..\..\..\..\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\workshop\content\294100\2009463077\Current\Assemblies\0Harmony.dll + False - ..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll False - ..\..\licentia-labs\Assemblies\LicentiaLabs.dll + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\licentia-labs-master\Assemblies\LicentiaLabs.dll False - ..\..\rjw\1.4\Assemblies\RJW.dll + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\RJW\1.4\Assemblies\RJW.dll False @@ -43,18 +44,26 @@ - - ..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll - False - + + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.dll + False + + + + + + + + + diff --git a/Source/Rjw-Genes.csproj.user b/Source/Rjw-Genes.csproj.user new file mode 100644 index 0000000..6e4223f --- /dev/null +++ b/Source/Rjw-Genes.csproj.user @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file