mirror of
https://gitgud.io/amevarashi/rjw-sexperience-ideology.git
synced 2024-08-15 00:43:19 +00:00
Fixed: Pawns raping despite Rape-Abhorrent precept
This commit is contained in:
parent
472933e192
commit
71df71a0eb
2 changed files with 47 additions and 0 deletions
|
@ -2,6 +2,7 @@
|
||||||
using Verse;
|
using Verse;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
namespace RJWSexperience.Ideology.HistoryEvents
|
namespace RJWSexperience.Ideology.HistoryEvents
|
||||||
{
|
{
|
||||||
|
@ -27,6 +28,7 @@ namespace RJWSexperience.Ideology.HistoryEvents
|
||||||
//Log.Message($"[RSI] Recorded event {historyEvent.def.ToStringWithPartner(pawn, partner)}");
|
//Log.Message($"[RSI] Recorded event {historyEvent.def.ToStringWithPartner(pawn, partner)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public static HistoryEvent CreateEvent(this HistoryEventDef def, Pawn pawn)
|
public static HistoryEvent CreateEvent(this HistoryEventDef def, Pawn pawn)
|
||||||
{
|
{
|
||||||
return new HistoryEvent(def, pawn.Named(HistoryEventArgsNames.Doer));
|
return new HistoryEvent(def, pawn.Named(HistoryEventArgsNames.Doer));
|
||||||
|
|
|
@ -7,10 +7,55 @@ using RJWSexperience.Ideology.HistoryEvents;
|
||||||
using RJWSexperience.Ideology.Precepts;
|
using RJWSexperience.Ideology.Precepts;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection.Emit;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
namespace RJWSexperience.Ideology.Patches
|
namespace RJWSexperience.Ideology.Patches
|
||||||
{
|
{
|
||||||
|
[HarmonyPatch(typeof(xxx), nameof(xxx.can_rape))]
|
||||||
|
public static class RJW_Patch_CannotRapeBecauseIdeo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Injects IdeoCanRape call into is_human block of xxx.can_rape
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="instructions">Original method instructions</param>
|
||||||
|
/// <returns>Modified method instructions</returns>
|
||||||
|
[HarmonyTranspiler]
|
||||||
|
public static IEnumerable<CodeInstruction> AddIdeoCheck(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||||
|
{
|
||||||
|
using IEnumerator<CodeInstruction> enumerator = instructions.GetEnumerator();
|
||||||
|
|
||||||
|
System.Reflection.FieldInfo wildMode = AccessTools.Field(typeof(RJWSettings), nameof(RJWSettings.WildMode));
|
||||||
|
Label labelWildMode = generator.DefineLabel();
|
||||||
|
bool done = false;
|
||||||
|
|
||||||
|
while (enumerator.MoveNext())
|
||||||
|
{
|
||||||
|
if (!done && enumerator.Current.LoadsField(wildMode))
|
||||||
|
{
|
||||||
|
// Found RJWSettings.WildMode check, insert before
|
||||||
|
// Need to move labels to our instruction because previous check jumps to one of them, skipping our call
|
||||||
|
var existingLabels = enumerator.Current.labels;
|
||||||
|
enumerator.Current.labels = new List<Label>() { labelWildMode };
|
||||||
|
// Load the first argument - Pawn
|
||||||
|
yield return new CodeInstruction(OpCodes.Ldarg_0) { labels = existingLabels };
|
||||||
|
// Call the check. Consumes pawn and pushes bool
|
||||||
|
yield return CodeInstruction.Call(typeof(RJW_Patch_CannotRapeBecauseIdeo), nameof(IdeoCanRape));;
|
||||||
|
// If bool is true, jump to the next check
|
||||||
|
yield return new CodeInstruction(OpCodes.Brtrue_S, labelWildMode);
|
||||||
|
// The bool was false, push false and exit the method
|
||||||
|
yield return new CodeInstruction(OpCodes.Ldc_I4_0);
|
||||||
|
yield return new CodeInstruction(OpCodes.Ret);
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return enumerator.Current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IdeoCanRape(Pawn pawn) => RsiDefOf.HistoryEvent.RSI_Raped.CreateEvent(pawn).DoerWillingToDo();
|
||||||
|
}
|
||||||
|
|
||||||
[HarmonyPatch(typeof(xxx), nameof(xxx.is_rapist))]
|
[HarmonyPatch(typeof(xxx), nameof(xxx.is_rapist))]
|
||||||
public static class RJW_Patch_is_rapist
|
public static class RJW_Patch_is_rapist
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue