using HarmonyLib; using RimWorld; using rjw; using RJWSexperience.Ideology.HistoryEvents; using RJWSexperience.Ideology.Precepts; using System.Collections.Generic; using System.Linq; using Verse; namespace RJWSexperience.Ideology.Patches { [HarmonyPatch(typeof(MarriageCeremonyUtility), nameof(MarriageCeremonyUtility.Married))] public static class Rimworld_Patch_Marriage { public static void Postfix(Pawn firstPawn, Pawn secondPawn) { RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(firstPawn, secondPawn); RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(secondPawn, firstPawn); } } [HarmonyPatch(typeof(RitualOutcomeEffectWorker_FromQuality), "GiveMemoryToPawn")] public static class Rimworld_Patch_RitualOutcome_DontGiveMemoryToAnimals { public static bool Prefix(Pawn pawn) { return !pawn.IsAnimal(); } } [HarmonyPatch(typeof(IdeoFoundation), nameof(IdeoFoundation.CanAdd))] public static class Rimworld_Patch_IdeoFoundation { public static void Postfix(PreceptDef precept, ref IdeoFoundation __instance, ref AcceptanceReport __result) { DefExtension_MultipleMemesRequired extension = precept.GetModExtension(); if (extension == null) return; if (extension.requiredAllMemes.NullOrEmpty()) return; for (int i = 0; i < extension.requiredAllMemes.Count; i++) { if (!__instance.ideo.memes.Contains(extension.requiredAllMemes[i])) { List report = new List(); foreach (MemeDef meme in extension.requiredAllMemes) report.Add(meme.LabelCap); __result = new AcceptanceReport("RequiresMeme".Translate() + ": " + report.ToCommaList()); return; } } } } public static class Rimworld_Patch_IncestuousManualRomance { /// /// Override incestuous check in the manual romance /// /// Pawn to try do romance /// Target for romance /// Result of the original method /// Run original method implementation [HarmonyPatch(typeof(RelationsUtility), "Incestuous")] public static bool Prefix(Pawn one, Pawn two, ref bool __result) { __result = RsiIncestuous(one, two); return false; } /// /// Check if Ideology allows romance attempt /// /// Pawn to try do romance /// Target for romance /// Forbid romance option public static bool RsiIncestuous(Pawn one, Pawn two) { PreceptDef incestuousPrecept = one.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(one, two); if (incestuousPrecept == null || incestuousPrecept == VariousDefOf.Incestuos_Disapproved || incestuousPrecept == VariousDefOf.Incestuos_Forbidden) { return relationDegree < BloodRelationDegree.NotRelated; } else if (incestuousPrecept == VariousDefOf.Incestuos_Free) { return false; } else if (incestuousPrecept == VariousDefOf.Incestuos_Disapproved_CloseOnly) { return relationDegree == BloodRelationDegree.CloseRelative; } else if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) { return relationDegree == BloodRelationDegree.NotRelated; } // Modded incestuous precept? return true; } } }