diff --git a/CHANGELOG.md b/CHANGELOG.md index 89390cf..495d954 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,15 @@ # 1.2 -**Changes:** +Changes: - Cocoon Weaver Gene -- Spawn Spelopede Gene (Can be changed to spawn Megascarabs or other insects via xml) -- Queens & Caste Logic (see below) -- Addition to InsectIncubator: Now fertilizes eggs once placed inside a host, and breeds out eggs twice as fast. +- Spawn Spelopede Gene (Can re changed to spawn Megascarabs or other insects) -**Internal:** +Internal: - Renamed Abilities to have _ability_ in their name, to not exactly match the gene-defnames. -- Moved Insect-Incubator & Insect-Breeder to Hive Category and Folders -**Fixes:** +Fixes: - Cockeater Ability has now Icon of Cockeater Gene - Cockeater now leaves a bite wound! @@ -30,12 +27,11 @@ In general, the logic is the following: - The assignemnt is done by xenotypes for queen and drones. The baby will get all xenogenes of their parents xenotypes. - For workers, every queen can have a set of genes for their workers defined in [a special def](./Common/Defs/QueenWorkerMappingDefs/QueenWorkerMappingDefs_base.xml). These will be added as endogenes, so that pawns can still become xenotypes. - There is a default set for worker genes, making mentally dumb, sterile and servile pawns. -- Chances for Offsprings (Drone, Queen, Worker) is defined in an [XML-Def](./Common/Defs/HiveOffspringChanceDef/HiveOffspringChanceDefs.xml) I am not sure if I want to have a specific mapping defining that Queen can only mate with certain Drones, let me know how you feel about it. *Queens can be male*. I just used the female-term, but implementation is gender-neutral. -**ToDo:** +ToDo: - Icons: Cocoon, Spelopede Spawn - Sound: Spelopede Spawn diff --git a/Common/Defs/GeneDefs/GeneDefs_Breeding.xml b/Common/Defs/GeneDefs/GeneDefs_Breeding.xml index 7482459..a2d7d7e 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Breeding.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Breeding.xml @@ -13,6 +13,27 @@ -1 + + rjw_genes_insectincubator + + Pawns with this gene are able to hold more insect eggs. + Genes/Icons/More_Egg_Space + 52 + rjw_genes_breeding + 1 + -1 + + + + rjw_genes_insectbreeder + + Pawns with this gene are able to fertilize eggs with any fertile penis. + World/WorldObjects/Expanding/Insects + 53 + rjw_genes_breeding + 1 + -1 + rjw_genes_zoophile diff --git a/Common/Defs/GeneDefs/GeneDefs_Hive.xml b/Common/Defs/GeneDefs/GeneDefs_Hive.xml index 84b15ff..897851f 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Hive.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Hive.xml @@ -165,29 +165,4 @@ 1 -1 - - - - rjw_genes_insectincubator - - RJW_Genes.Gene_InsectIncubator - Pawns with this gene are able to host more insect eggs, hatch them faster and fertilize any inserted egg. - Genes/Icons/More_Egg_Space - 52 - rjw_genes_hive - 1 - -1 - - - - rjw_genes_insectbreeder - - Pawns with this gene are able to fertilize eggs with any fertile penis. - World/WorldObjects/Expanding/Insects - 53 - rjw_genes_hive - 1 - -1 - - \ 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/Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs b/Source/Genes/Breeding/PatchPregnancyHelper.cs similarity index 95% rename from Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs rename to Source/Genes/Breeding/PatchPregnancyHelper.cs index fc3e530..81a0ad4 100644 --- a/Source/Genes/Hive/Patches/Patch_InsectIncubator_PregnancyHelper.cs +++ b/Source/Genes/Breeding/PatchPregnancyHelper.cs @@ -15,11 +15,9 @@ 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 + static class PatchPregnancyHelper { [HarmonyTranspiler] public static IEnumerable Transpiler(IEnumerable instructions, ILGenerator il) diff --git a/Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs b/Source/Genes/Breeding/Patch_EggFertilization.cs similarity index 97% rename from Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs rename to Source/Genes/Breeding/Patch_EggFertilization.cs index 6184b4a..d2f2dcf 100644 --- a/Source/Genes/Hive/Patches/Patch_InsectBreeder_EggFertilization.cs +++ b/Source/Genes/Breeding/Patch_EggFertilization.cs @@ -12,10 +12,9 @@ namespace RJW_Genes /// 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 + static class Patch_EggFertilization { public static void Postfix(SexProps props) { 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/Genes/Gene_InsectIncubator.cs b/Source/Genes/Hive/Genes/Gene_InsectIncubator.cs deleted file mode 100644 index d102a8a..0000000 --- a/Source/Genes/Hive/Genes/Gene_InsectIncubator.cs +++ /dev/null @@ -1,53 +0,0 @@ -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 -{ - - /// - /// This Gene checks for all parasitic Insect-Eggs in a Pawn: - /// 1. Is it fertilized ? => tick it down "extra". - /// 2. Is it not fertilized? => fertilize it with the Incubator as parent - /// - /// Important: The other half of the behavior for the gene (more egg-capacity) is in `Patch_InsectINcubator_PregnancyHelper`. - /// - 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() - { - base.Tick(); - - // Don't check too often, only in the HashTickInterval to safe some computing power - if (this.pawn.IsHashIntervalTick(TICK_INTERVAL) && this.pawn.Map != null) - { - List eggs = new List(); - pawn.health.hediffSet.GetHediffs(ref eggs); - - foreach (Hediff_InsectEgg egg in eggs) - { - // The implanter check checks if the egg is still in an ovipositor. - if (egg.implanter == null || egg.implanter == pawn) - continue; - - if (!egg.fertilized && egg.implanter != null) { - egg.Fertilize(pawn); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Gene_InsectIncubator: fertilized egg {egg} in {pawn}"); - } - else if (egg.fertilized) - { - egg.lastTick += TICK_INTERVAL; - } - } - } - } - } -} diff --git a/Source/Genes/Hive/Helpers/HiveUtility.cs b/Source/Genes/Hive/Helpers/HiveUtility.cs index db65fb6..945db92 100644 --- a/Source/Genes/Hive/Helpers/HiveUtility.cs +++ b/Source/Genes/Hive/Helpers/HiveUtility.cs @@ -128,6 +128,8 @@ namespace RJW_Genes Dictionary> dict = new Dictionary>(); IEnumerable mappingDefs = DefDatabase.AllDefs; + if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"Found {mappingDefs.Count()} Queen-Worker mappings in defs"); + // Dev-Note: I first a nice lambda here, but I used nesting in favour of logging. foreach (QueenWorkerMappingDef mappingDef in mappingDefs) { @@ -202,27 +204,5 @@ namespace RJW_Genes return DefDatabase.AllDefs.Where(type => type.genes.Contains(GeneDefOf.rjw_genes_drone)); } - - 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(XenotypeDef queenDef) - { - IEnumerable offspringChanceDefs = DefDatabase.AllDefs; - - return offspringChanceDefs.FirstOrFallback(t => t.queenXenotype == queenDef.defName, LookupDefaultHiveInheritanceChances()); - } - } } diff --git a/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs b/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs index c075cc8..c640118 100644 --- a/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs +++ b/Source/Genes/Hive/Patches/Patch_BirthOutcome_SetHiveGenes.cs @@ -18,6 +18,9 @@ namespace RJW_Genes [HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))] public class Patch_BirthOutcome_SetHiveGenes { + const double QUEEN_CHANCE = 0.01f; + const double DRONE_CHANCE = 0.49f; + const double WORKER_CHANCE = 1 - QUEEN_CHANCE - DRONE_CHANCE; [HarmonyPostfix] @@ -42,8 +45,6 @@ namespace RJW_Genes if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"PostFix PregnancyUtility::ApplyBirthOutcome - Checking Hive Inheritance because {pawn} has a queen parent."); XenotypeDef queenDef = TryFindParentQueenXenotype(pawn); - HiveOffspringChanceDef hiveOffspringChanceDef = HiveUtility.LookupHiveInheritanceChances(queenDef); - // Case 1: Mother is Queen, Father is something else. Produce Worker. if (!hasDroneParent) { @@ -55,22 +56,22 @@ namespace RJW_Genes { double roll = (new Random()).NextDouble(); // Case 2.a: New Queen born - if (roll < hiveOffspringChanceDef.queenChance) + if (roll < QUEEN_CHANCE) { pawn.genes.SetXenotype(queenDef); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new queen with xenotype {queenDef.defName} ({hiveOffspringChanceDef.queenChance * 100}% chance,rolled {roll})"); + if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new queen with xenotype {queenDef.defName} ({QUEEN_CHANCE*100}% chance,rolled {roll})"); // TODO: Make a letter ? } // Case 2.b: New Drone born - else if (roll < hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) + else if (roll < DRONE_CHANCE + QUEEN_CHANCE) { XenotypeDef droneDef = TryFindParentDroneXenotype(pawn); pawn.genes.SetXenotype(droneDef); - if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new drone with xenotype {droneDef.defName} ({(hiveOffspringChanceDef.droneChance + hiveOffspringChanceDef.queenChance) * 100}% chance,rolled {roll}))"); + if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a new drone with xenotype {droneDef.defName} ({(DRONE_CHANCE + QUEEN_CHANCE) * 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}))"); + if (RJW_Genes_Settings.rjw_genes_detailed_debug) ModLog.Message($"{pawn} born as a worker ({(WORKER_CHANCE) * 100}% chance,rolled {roll}))"); MakeWorker(pawn, queenDef); } } diff --git a/Source/RJW_Genes.cs b/Source/RJW_Genes.cs index db4ffbf..e25feef 100644 --- a/Source/RJW_Genes.cs +++ b/Source/RJW_Genes.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using Verse; namespace RJW_Genes @@ -15,11 +14,6 @@ namespace RJW_Genes 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.defName))} + 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 6c1da44..68a3e34 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -43,10 +43,8 @@ - - - - + +