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 EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup;
|
||||||
public static float EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup;
|
public static float EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup;
|
||||||
public static PregnancyType PregnancySource = PregnancyType.MultiplePregnancy;
|
public static PregnancyType PregnancySource = PregnancyType.MultiplePregnancy;
|
||||||
|
public static bool EnableBiotechTwins = false;
|
||||||
public static bool EnableHeteroOvularTwins = true;
|
public static bool EnableHeteroOvularTwins = true;
|
||||||
public static bool EnableEnzygoticTwins = true;
|
public static bool EnableEnzygoticTwins = true;
|
||||||
public static float EnzygoticTwinsChance = EnzygoticTwinsChanceDefault;
|
public static float EnzygoticTwinsChance = EnzygoticTwinsChanceDefault;
|
||||||
|
@ -89,6 +90,7 @@ namespace RJW_Menstruation
|
||||||
EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup;
|
EstrusAttractivenessToHookup = RJWHookupSettings.MinimumAttractivenessToHookup;
|
||||||
EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup;
|
EstrusRelationshipToHookup = RJWHookupSettings.MinimumRelationshipToHookup;
|
||||||
EnzygoticTwinsChanceAdjust = EnzygoticTwinsChanceAdjustDefault;
|
EnzygoticTwinsChanceAdjust = EnzygoticTwinsChanceAdjustDefault;
|
||||||
|
EnableBiotechTwins = false;
|
||||||
EnableEnzygoticTwins = true;
|
EnableEnzygoticTwins = true;
|
||||||
EnableHeteroOvularTwins = true;
|
EnableHeteroOvularTwins = true;
|
||||||
PregnancySource = PregnancyType.MultiplePregnancy;
|
PregnancySource = PregnancyType.MultiplePregnancy;
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
using RimWorld;
|
using HarmonyLib;
|
||||||
using RimWorld.BaseGen;
|
using Mono.Cecil.Cil;
|
||||||
|
using RimWorld;
|
||||||
using rjw;
|
using rjw;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Reflection.Emit;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJW_Menstruation
|
namespace RJW_Menstruation
|
||||||
|
@ -93,7 +95,7 @@ namespace RJW_Menstruation
|
||||||
{
|
{
|
||||||
Pawn baby = PawnGenerator.GeneratePawn(request);
|
Pawn baby = PawnGenerator.GeneratePawn(request);
|
||||||
if (baby == null) break;
|
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 (division > 1)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
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))]
|
[HarmonyPatch(typeof(PregnancyUtility), nameof(PregnancyUtility.ApplyBirthOutcome))]
|
||||||
public class ApplyBirthOutcome_Patch
|
public class ApplyBirthOutcome_Breast_Patch
|
||||||
{
|
{
|
||||||
public static void PostFix(Thing birtherThing)
|
public static void PostFix(Thing birtherThing)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue