diff --git a/1.4/Assemblies/RJW_Menstruation.dll b/1.4/Assemblies/RJW_Menstruation.dll index 7842531..852e240 100644 Binary files a/1.4/Assemblies/RJW_Menstruation.dll and b/1.4/Assemblies/RJW_Menstruation.dll differ diff --git a/1.4/Languages/English/Keyed/RJW_Menstruation.xml b/1.4/Languages/English/Keyed/RJW_Menstruation.xml index 3df2d06..f28203c 100644 --- a/1.4/Languages/English/Keyed/RJW_Menstruation.xml +++ b/1.4/Languages/English/Keyed/RJW_Menstruation.xml @@ -124,8 +124,6 @@ Use basic RJW pregnancy Use menstruation multiple pregnancy Use Biotech pregnancy - (EXPERIMENTAL) Enable multiple babies/twins in a single Biotech pregnancy. - Enabling this option will allow identical and hetero ovular twins with Biotech. Also allows the hybrid system, but two humanlikes cannot produce an animal. Show womb status when drafted Draw womb icon for drafted pawns Reset to default diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs index 3d2f167..6a843bb 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Configurations.cs @@ -55,7 +55,6 @@ namespace RJW_Menstruation public static float EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup; public static float EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup; public static PregnancyType PregnancySource = PregnancyType.MultiplePregnancy; - public static bool EnableBiotechTwins = false; public static bool EnableHeteroOvularTwins = true; public static bool EnableEnzygoticTwins = true; public static float EnzygoticTwinsChance = EnzygoticTwinsChanceDefault; @@ -90,7 +89,6 @@ namespace RJW_Menstruation EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup; EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup; EnzygoticTwinsChanceAdjust = EnzygoticTwinsChanceAdjustDefault; - EnableBiotechTwins = false; EnableEnzygoticTwins = true; EnableHeteroOvularTwins = true; PregnancySource = PregnancyType.MultiplePregnancy; @@ -202,7 +200,6 @@ namespace RJW_Menstruation Scribe_Values.Look(ref EstrusAttractivenessToHookup, "EstrusAttractivenessToHookup", EstrusAttractivenessToHookup, true); Scribe_Values.Look(ref EstrusRelationshipToHookup, "EstrusRelationshipToHookup", EstrusRelationshipToHookup, true); Scribe_Values.Look(ref PregnancySource, "PregnancySource", PregnancySource, true); - Scribe_Values.Look(ref EnableBiotechTwins, "EnableBiotechTwins", EnableBiotechTwins, false); // Don't force save this, for now Scribe_Values.Look(ref EnableHeteroOvularTwins, "EnableHeteroOvularTwins", EnableHeteroOvularTwins, true); Scribe_Values.Look(ref EnableEnzygoticTwins, "EnableEnzygoticTwins", EnableEnzygoticTwins, true); Scribe_Values.Look(ref EnzygoticTwinsChance, "EnzygoticTwinsChance", EnzygoticTwinsChance, true); @@ -274,12 +271,11 @@ namespace RJW_Menstruation public override void DoSettingsWindowContents(Rect inRect) { Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f); - float mainRectHeight = 30f + + float mainRectHeight = -3f + (Configurations.EnableWombIcon || Configurations.EnableButtonInHT ? 400f : 0f) + (Configurations.EstrusOverridesHookupSettings ? 144f : 0f) + + // TODO: Also for modified Biotech pregnancies (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy ? (Configurations.EnableEnzygoticTwins ? 175f : 75f) : 0f) + - (Configurations.PregnancySource == Configurations.PregnancyType.Biotech ? 75f : 0f) + - (Configurations.PregnancySource == Configurations.PregnancyType.Biotech ? (Configurations.EnableBiotechTwins ? 175f : 75f) : 0f) + (Configurations.EnableBirthVaginaMorph ? 48f : 0f); Rect mainRect = new Rect(0f, 0f, inRect.width - 30f, Math.Max(inRect.height + mainRectHeight, 1f)); int Adjust; @@ -438,11 +434,9 @@ namespace RJW_Menstruation if (listmain.RadioButton(Translations.Option_PregnancyFromMultiplePregnancy_Label, Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy)) Configurations.PregnancySource = Configurations.PregnancyType.MultiplePregnancy; if (ModsConfig.BiotechActive && listmain.RadioButton(Translations.Option_PregnancyFromBiotech_Label, Configurations.PregnancySource == Configurations.PregnancyType.Biotech)) - Configurations.PregnancySource = Configurations.PregnancyType.Biotech; - if (Configurations.PregnancySource == Configurations.PregnancyType.Biotech) - listmain.CheckboxLabeled(Translations.Option_EnableBiotechTwins_Label, ref Configurations.EnableBiotechTwins, Translations.Option_EnableBiotechTwins_Desc); - if (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy || - (Configurations.PregnancySource == Configurations.PregnancyType.Biotech && Configurations.EnableBiotechTwins)) + Configurations.PregnancySource = Configurations.PregnancyType.Biotech; + // TODO: Also for modified Biotech pregnancy + if (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy) { float sectionheight = 75f; if (Configurations.EnableEnzygoticTwins) sectionheight += 100; diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs index cf59be0..256a67f 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs @@ -1297,19 +1297,8 @@ namespace RJW_Menstruation if (Configurations.Debug) Log.Message($"Implanting fertilized egg of {Pawn} into {parent}, father {egg.fertilizer}"); if (pregnancy != null) { - if (Configurations.PregnancySource == Configurations.PregnancyType.Biotech && Configurations.EnableBiotechTwins && Configurations.EnableHeteroOvularTwins) - { - if (Configurations.Debug) Log.Message($"Adding to existing Biotech pregnancy {pregnancy}"); - HediffComp_PregeneratedBabies comp = pregnancy.TryGetComp(); - if (comp == null) Log.Warning($"Trying to add Biotech egg to {Pawn}'s pregnancy without a pregenerated baby comp: {pregnancy}"); - else - { - comp.AddNewBaby(Pawn, egg.fertilizer); - pregnant = true; - deadeggs.Add(egg); - } - } - else if (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy && Configurations.EnableHeteroOvularTwins) + // TODO: Modified Biotech pregnancy + if (Configurations.PregnancySource == Configurations.PregnancyType.MultiplePregnancy && Configurations.EnableHeteroOvularTwins) { if (pregnancy is Hediff_MultiplePregnancy h) { @@ -1351,12 +1340,8 @@ namespace RJW_Menstruation case Configurations.PregnancyType.Biotech: if (Configurations.Debug) Log.Message($"Creating new biotech pregnancy"); pregnancy = HediffMaker.MakeHediff(HediffDefOf.PregnantHuman, Pawn); - if(Configurations.EnableBiotechTwins) - pregnancy.TryGetComp().AddNewBaby(Pawn, egg.fertilizer); ((Hediff_Pregnant)pregnancy).SetParents(Pawn, egg.fertilizer, PregnancyUtility.GetInheritedGeneSet(egg.fertilizer, Pawn)); Pawn.health.AddHediff(pregnancy); - pregnant = true; - deadeggs.Add(egg); break; } if (pregnancy is Hediff_BasePregnancy rjw_preg) @@ -1376,9 +1361,7 @@ namespace RJW_Menstruation } } - if (pregnant && - (Configurations.PregnancySource != Configurations.PregnancyType.MultiplePregnancy || !Configurations.EnableHeteroOvularTwins) && - (Configurations.PregnancySource != Configurations.PregnancyType.Biotech || !Configurations.EnableBiotechTwins || !Configurations.EnableHeteroOvularTwins)) + if (pregnant && (Configurations.PregnancySource != Configurations.PregnancyType.MultiplePregnancy || !Configurations.EnableHeteroOvularTwins)) { eggs.Clear(); return true; diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PregeneratedBabies.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PregeneratedBabies.cs index 53171f8..8831540 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PregeneratedBabies.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_PregeneratedBabies.cs @@ -1,12 +1,10 @@ -using HarmonyLib; -using Mono.Cecil.Cil; -using RimWorld; +using RimWorld; +using RimWorld.BaseGen; using rjw; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Reflection.Emit; using Verse; namespace RJW_Menstruation @@ -95,7 +93,7 @@ namespace RJW_Menstruation { Pawn baby = PawnGenerator.GeneratePawn(request); if (baby == null) break; - PregnancyCommon.SetupBabyXenotype(mother, father, baby); // Probably redundant with Biotech post-birth xenotyping + PregnancyCommon.SetupBabyXenotype(mother, father, baby); if (division > 1) { if (i == 0) @@ -138,131 +136,4 @@ namespace RJW_Menstruation } } } - - [HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))] - public static class ApplyBirthOutcome_PregeneratedBabies_Patch - { - private static Pawn GetPregeneratedBaby(PawnGenerationRequest request, Thing birtherThing) - { - // Don't test for the config set here. We can do it at the functions that call ApplyBirthOutcome - // Easier to work out twins that way - - // From e.g. a vat - if (!(birtherThing is Pawn mother) || !xxx.is_human(mother)) - return PawnGenerator.GeneratePawn(request); - - // No babies found. Could be an unmodified pregnancy - HediffComp_PregeneratedBabies comp = mother.health.hediffSet.GetFirstHediff()?.TryGetComp(); - if (comp == null || !comp.HasBaby) - return PawnGenerator.GeneratePawn(request); - - Pawn baby = comp.PopBaby(); - if (baby == null) return PawnGenerator.GeneratePawn(request); // Shouldn't happen - if (request.ForceDead) baby.Kill(null, null); - return baby; - } - - private static readonly MethodInfo ApplyBirthOutcome = typeof(PregnancyUtility).GetMethod(nameof(PregnancyUtility.ApplyBirthOutcome)); - private static readonly int birtherThing = ApplyBirthOutcome.GetParameters().FirstIndexOf(parameter => parameter.Name == "birtherThing" && parameter.ParameterType == typeof(Thing)); - private static readonly MethodInfo GeneratePawn = typeof(PawnGenerator).GetMethod(nameof(PawnGenerator.GeneratePawn), new Type[] {typeof (PawnGenerationRequest)}); - - public static IEnumerable Transpiler(IEnumerable instructions) - { - if (birtherThing < 0) throw new InvalidOperationException("Could not locate index of birtherThing"); - if (GeneratePawn == null || GeneratePawn.ReturnType != typeof(Pawn)) throw new InvalidOperationException("GeneratePawn not found"); - foreach (CodeInstruction instruction in instructions) - { - if (instruction.Calls(GeneratePawn)) - { - yield return new CodeInstruction(OpCodes.Ldarg, birtherThing); - yield return CodeInstruction.Call(typeof(ApplyBirthOutcome_PregeneratedBabies_Patch), nameof(GetPregeneratedBaby)); - } - else yield return instruction; - } - } - } - - [HarmonyPatch(typeof(Hediff_LaborPushing), nameof(Hediff_LaborPushing.PreRemoved))] - public static class Hediff_LaborPushing_PreRemoved_Patch - { - private static Thing ApplyBirthLoop(OutcomeChance outcome, float quality, Precept_Ritual ritual, List genes, Pawn geneticMother, Thing birtherThing, Pawn father, Pawn doctor, LordJob_Ritual lordJobRitual, RitualRoleAssignments assignments) - { - if (birtherThing is Pawn mother) - { - HediffComp_PregeneratedBabies comp = mother.health.hediffSet.GetFirstHediff().TryGetComp(); - if (comp?.HasBaby ?? false) - { - OutcomeChance thisOutcome = outcome; - Precept_Ritual precept_Ritual = (Precept_Ritual)comp.Pawn.Ideo.GetPrecept(PreceptDefOf.ChildBirth); - float birthQuality = PregnancyUtility.GetBirthQualityFor(mother); - - do - { - PregnancyUtility.ApplyBirthOutcome(thisOutcome, quality, ritual, genes, geneticMother, birtherThing, father, doctor, lordJobRitual, assignments); - // No more babies if mom dies halfway through. Unrealistic maybe, but saves a lot of headache in ApplyBirthOutcome - if (mother.health.Dead) break; - thisOutcome = ((RitualOutcomeEffectWorker_ChildBirth)precept_Ritual.outcomeEffect).GetOutcome(birthQuality, null); - } while (comp.HasBaby); - - // PreRemoved doesn't use the return value - return null; - } - } - - return PregnancyUtility.ApplyBirthOutcome(outcome, quality, ritual, genes, geneticMother, birtherThing, father, doctor, lordJobRitual, assignments); - } - - private static readonly MethodInfo ApplyBirthOutcome = typeof(PregnancyUtility).GetMethod(nameof(PregnancyUtility.ApplyBirthOutcome), - new Type[] {typeof(OutcomeChance), typeof(float), typeof(Precept_Ritual), typeof(List), typeof(Pawn), typeof(Thing), typeof(Pawn), typeof(Pawn), typeof(LordJob_Ritual), typeof(RitualRoleAssignments)}); - public static IEnumerable Transpiler(IEnumerable instructions) - { - if (ApplyBirthOutcome == null || ApplyBirthOutcome.ReturnType != typeof(Thing)) throw new InvalidOperationException("ApplyBirthOutcome not found"); - foreach (CodeInstruction instruction in instructions) - { - if (instruction.Calls(ApplyBirthOutcome)) - yield return CodeInstruction.Call(typeof(Hediff_LaborPushing_PreRemoved_Patch), nameof(Hediff_LaborPushing_PreRemoved_Patch.ApplyBirthLoop)); - else yield return instruction; - } - } - } - - // Much the same as the other one - [HarmonyPatch(typeof(RitualOutcomeEffectWorker_ChildBirth), nameof (RitualOutcomeEffectWorker_ChildBirth.Apply))] - public static class Ritual_ChildBirth_Apply_Patch - { - private static Thing ApplyBirthLoop(OutcomeChance outcome, float quality, Precept_Ritual ritual, List genes, Pawn geneticMother, Thing birtherThing, Pawn father, Pawn doctor, LordJob_Ritual lordJobRitual, RitualRoleAssignments assignments) - { - if (birtherThing is Pawn mother) - { - HediffComp_PregeneratedBabies comp = mother.health.hediffSet.GetFirstHediff().TryGetComp(); - if (comp?.HasBaby ?? false) - { - // Don't reroll the outcome every time, I think - // This is all one ritual, so every baby has the same ritual outcome - // I don't think this will add the ritual memory every time? - // Though even if it does, that's probably okay. More babies more memories after all - do - { - PregnancyUtility.ApplyBirthOutcome(outcome, quality, ritual, genes, geneticMother, birtherThing, father, doctor, lordJobRitual, assignments); - if (mother.health.Dead) break; - } while (comp.HasBaby); - - return null; - } - } - return PregnancyUtility.ApplyBirthOutcome(outcome, quality, ritual, genes, geneticMother, birtherThing, father, doctor, lordJobRitual, assignments); - } - private static readonly MethodInfo ApplyBirthOutcome = typeof(PregnancyUtility).GetMethod(nameof(PregnancyUtility.ApplyBirthOutcome), - new Type[] { typeof(OutcomeChance), typeof(float), typeof(Precept_Ritual), typeof(List), typeof(Pawn), typeof(Thing), typeof(Pawn), typeof(Pawn), typeof(LordJob_Ritual), typeof(RitualRoleAssignments) }); - public static IEnumerable Transpiler(IEnumerable instructions) - { - if (ApplyBirthOutcome == null || ApplyBirthOutcome.ReturnType != typeof(Thing)) throw new InvalidOperationException("ApplyBirthOutcome not found"); - foreach (var instruction in instructions) - { - if (instruction.Calls(ApplyBirthOutcome)) - yield return CodeInstruction.Call(typeof(Ritual_ChildBirth_Apply_Patch), nameof(Ritual_ChildBirth_Apply_Patch.ApplyBirthLoop)); - else yield return instruction; - } - } - } } diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs index 40a157f..956f02f 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/HediffComps/MenstruationUtility.cs @@ -115,10 +115,7 @@ namespace RJW_Menstruation if (hediff is Hediff_MechanoidPregnancy) return ContentFinder.Get(("Womb/Mechanoid_Fluid"), true); - ThingDef babydef = comp.Pawn.def; - HediffComp_PregeneratedBabies babiescomp = hediff?.TryGetComp(); - if (babiescomp?.HasBaby ?? false) - babydef = babiescomp.babies.First().def; + ThingDef babydef = comp.Pawn.def; // TODO: Pregenerated babies float gestationProgress = comp.StageProgress; int babycount = hediff is Hediff_BasePregnancy preg ? preg.babies.Count : 1; diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs index c60d3b4..7d9de72 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Patch/Biotech_Patch.cs @@ -111,7 +111,7 @@ namespace RJW_Menstruation } [HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))] - public class ApplyBirthOutcome_Breast_Patch + public class ApplyBirthOutcome_Patch { public static void PostFix(Thing birtherThing) { diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs index 7b0862d..8534281 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Translations.cs @@ -125,8 +125,6 @@ namespace RJW_Menstruation public static readonly string Option_PregnancyFromBaseRJW_Label = "Option_PregnancyFromBaseRJW_Label".Translate(); public static readonly string Option_PregnancyFromMultiplePregnancy_Label = "Option_PregnancyFromMultiplePregnancy_Label".Translate(); public static readonly string Option_PregnancyFromBiotech_Label = "Option_PregnancyFromBiotech_Label".Translate(); - public static readonly string Option_EnableBiotechTwins_Label = "Option_EnableBiotechTwins_Label".Translate(); - public static readonly string Option_EnableBiotechTwins_Desc = "Option_EnableBiotechTwins_Desc".Translate(); public static readonly string Option_EnableDraftedIcon_Label = "Option_EnableDraftedIcon_Label".Translate(); public static readonly string Option_EnableDraftedIcon_Desc = "Option_EnableDraftedIcon_Desc".Translate(); diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs index 82b3ced..36e026b 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/UI/Dialog_WombStatus.cs @@ -221,36 +221,19 @@ namespace RJW_Menstruation { if (p is Hediff_Pregnant hp && hp.Severity < 0.2f) cum = comp.GetCumIcon(); else cum = ContentFinder.Get("Womb/Empty", true); - HediffComp_PregeneratedBabies babiescomp = p.TryGetComp(); + // TODO: Pregenerated babies (base on multiplepregnancy) if (Utility.ShowFetusInfo()) { - string feinfo = PregnancyCommon.GetBabyInfo(babiescomp?.babies); - string fainfo = PregnancyCommon.GetFatherInfo(babiescomp?.babies, babiescomp.Pawn, true) + " "; // Keep all parents known, for now - - if (feinfo == "Null") feinfo = "1 " + p.Mother.def.label + " " + Translations.Dialog_WombInfo02; - if (fainfo == "Null") - { - string father = p.Father?.LabelShort ?? Translations.Dialog_FatherUnknown; - fainfo = Translations.Dialog_WombInfo03 + ": " + father + " "; - } - - if (feinfo.Length + fainfo.Length > 45) - { - preginfoheight = fontheight + 2; - buttonstyle.alignment = TextAnchor.UpperLeft; - fontstyleright.alignment = TextAnchor.LowerRight; - } - else - { - preginfoheight = fontheight; - buttonstyle.alignment = TextAnchor.MiddleLeft; - - } - + preginfoheight = fontheight; Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight); fontstyleright.normal.textColor = Color.white; - GUI.Box(preginfo, feinfo, buttonstyle); - GUI.Label(preginfo, fainfo, fontstyleright); + fontstyleright.alignment = TextAnchor.MiddleRight; + buttonstyle.alignment = TextAnchor.MiddleLeft; + + string father = p.Father?.LabelShort ?? Translations.Dialog_FatherUnknown; + + GUI.Box(preginfo, "1 " + p.Mother.def.label + " " + Translations.Dialog_WombInfo02, buttonstyle); + GUI.Label(preginfo, Translations.Dialog_WombInfo03 + ": " + father + " ", fontstyleright); } } else cum = ContentFinder.Get(("Womb/Empty"), true); diff --git a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs index 29ffb97..73cdf7e 100644 --- a/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs +++ b/1.4/source/RJW_Menstruation/RJW_Menstruation/Utility.cs @@ -188,8 +188,8 @@ namespace RJW_Menstruation return null; } } - HediffComp_PregeneratedBabies babiescomp = comp.Pregnancy.TryGetComp(); - return babiescomp?.babies?.FirstOrDefault(); + // TODO: Biotech pregenerated babies + return null; } public static void DrawBreastIcon(this Pawn pawn, Rect rect) diff --git a/changelogs.txt b/changelogs.txt index 263dbc4..2beba13 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -1,7 +1,6 @@ Version 1.0.8.6 - Updated Traditional Chinese translation by Hydrogen. - Added several menstruation-related genes. - - Added experimental support for twins and hybrids with Biotech pregnancies, disabled by default. Version 1.0.8.5 - Added biosculpter recipe to restore 1 year's worth of eggs, with icon by DestinyPlayer.