mirror of
https://gitgud.io/lutepickle/rjw_menstruation.git
synced 2024-08-14 22:46:52 +00:00
Add the ApplyBirthOutcome transpiler
This commit is contained in:
parent
7bf9f80742
commit
e42bbdb3d4
3 changed files with 51 additions and 4 deletions
|
@ -55,6 +55,7 @@ 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;
|
||||
|
@ -89,6 +90,7 @@ namespace RJW_Menstruation
|
|||
EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup;
|
||||
EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup;
|
||||
EnzygoticTwinsChanceAdjust = EnzygoticTwinsChanceAdjustDefault;
|
||||
EnableBiotechTwins = false;
|
||||
EnableEnzygoticTwins = true;
|
||||
EnableHeteroOvularTwins = true;
|
||||
PregnancySource = PregnancyType.MultiplePregnancy;
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
using RimWorld;
|
||||
using RimWorld.BaseGen;
|
||||
using HarmonyLib;
|
||||
using Mono.Cecil.Cil;
|
||||
using RimWorld;
|
||||
using rjw;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Reflection.Emit;
|
||||
using Verse;
|
||||
|
||||
namespace RJW_Menstruation
|
||||
|
@ -93,7 +95,7 @@ namespace RJW_Menstruation
|
|||
{
|
||||
Pawn baby = PawnGenerator.GeneratePawn(request);
|
||||
if (baby == null) break;
|
||||
PregnancyCommon.SetupBabyXenotype(mother, father, baby);
|
||||
PregnancyCommon.SetupBabyXenotype(mother, father, baby); // Probably redundant with Biotech post-birth xenotyping
|
||||
if (division > 1)
|
||||
{
|
||||
if (i == 0)
|
||||
|
@ -136,4 +138,47 @@ 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<Hediff_LaborPushing>()?.TryGetComp<HediffComp_PregeneratedBabies>();
|
||||
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<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,7 +111,7 @@ namespace RJW_Menstruation
|
|||
}
|
||||
|
||||
[HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))]
|
||||
public class ApplyBirthOutcome_Patch
|
||||
public class ApplyBirthOutcome_Breast_Patch
|
||||
{
|
||||
public static void PostFix(Thing birtherThing)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue