diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index e5045f9..8a6459b 100644 Binary files a/Common/Assemblies/Rjw-Genes.dll and b/Common/Assemblies/Rjw-Genes.dll differ 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