From 180404cee1de9404f480af8dc4e0da200fe02c8f Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 20 Nov 2022 17:56:21 +0500 Subject: [PATCH 01/19] Removed Incestuos_IncestOnly conflict with Zoophile --- 1.4/Defs/PreceptDefs/Precepts_Incest.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index df0e490..ddcc32a 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -320,9 +320,6 @@ High 0 1000 - -
  • Zoophile
  • -
  • RSI_NonIncestuosMarriage From 3bedfec30e811b51f591b63f892adab6a8dd03d2 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 20 Nov 2022 18:47:55 +0500 Subject: [PATCH 02/19] Patched manual romance to respect incestuous precepts --- Languages/English/Keyed/RJW_Sexperience.xml | 2 + Source/IdeologyAddon/BloodRelationDegree.cs | 9 ++ Source/IdeologyAddon/DebugAction.cs | 17 +++ Source/IdeologyAddon/IdeologyAddon.csproj | 5 +- .../IdeologyAddon/Patches/Rimworld_Patch.cs | 52 +++++++++ Source/IdeologyAddon/RelationHelpers.cs | 47 ++++++++ .../RomanceChanceFactorHelpers.cs | 108 ++++++++++++++++++ Source/IdeologyAddon/VariousDefOf.cs | 24 ++-- 8 files changed, 254 insertions(+), 10 deletions(-) create mode 100644 Source/IdeologyAddon/BloodRelationDegree.cs create mode 100644 Source/IdeologyAddon/RelationHelpers.cs create mode 100644 Source/IdeologyAddon/RomanceChanceFactorHelpers.cs diff --git a/Languages/English/Keyed/RJW_Sexperience.xml b/Languages/English/Keyed/RJW_Sexperience.xml index 9550b00..92fe2bc 100644 --- a/Languages/English/Keyed/RJW_Sexperience.xml +++ b/Languages/English/Keyed/RJW_Sexperience.xml @@ -9,4 +9,6 @@ not animal capable of sex is required + + forbidden by ideology \ No newline at end of file diff --git a/Source/IdeologyAddon/BloodRelationDegree.cs b/Source/IdeologyAddon/BloodRelationDegree.cs new file mode 100644 index 0000000..e23f9ee --- /dev/null +++ b/Source/IdeologyAddon/BloodRelationDegree.cs @@ -0,0 +1,9 @@ +namespace RJWSexperience.Ideology +{ + public enum BloodRelationDegree + { + CloseRelative, + FarRelative, + NotRelated + } +} diff --git a/Source/IdeologyAddon/DebugAction.cs b/Source/IdeologyAddon/DebugAction.cs index 9655f50..91f5b20 100644 --- a/Source/IdeologyAddon/DebugAction.cs +++ b/Source/IdeologyAddon/DebugAction.cs @@ -1,5 +1,7 @@ using rjw; using RJWSexperience.Ideology.HistoryEvents; +using RJWSexperience.Ideology.Patches; +using System.Collections.Generic; using System.Linq; using Verse; @@ -16,5 +18,20 @@ namespace RJWSexperience.Ideology RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(hero, p); RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(p, hero); } + + [DebugAction("RJW Sexperience Ideology", "Manual romance check", false, true, actionType = DebugActionType.Action, allowedGameStates = AllowedGameStates.PlayingOnMap)] + public static void DisplayDebugTable() + { + IEnumerable pawns = Find.CurrentMap.mapPawns.AllPawnsSpawned.Where(pawn => pawn.IsColonist); + + IEnumerable> columns = pawns + .Select(pawn => new TableDataGetter(pawn.Name.ToStringShort, (Pawn p) => Rimworld_Patch_IncestuousManualRomance.RsiIncestuous(p, pawn))); + + var name = new TableDataGetter("Name", (Pawn pawn) => pawn.Name.ToStringShort); + + TableDataGetter[] getters = (new List>() { name }).Concat(columns).ToArray(); + + DebugTables.MakeTablesDialog(pawns, getters); + } } } diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index 651dd5b..e2571af 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -42,6 +42,7 @@ + @@ -59,6 +60,8 @@ + + @@ -94,7 +97,7 @@ - 1.4.3537 + 1.4.3542 2.2.2 diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index e50098e..9243d70 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -4,6 +4,7 @@ using rjw; using RJWSexperience.Ideology.HistoryEvents; using RJWSexperience.Ideology.Precepts; using System.Collections.Generic; +using System.Linq; using Verse; namespace RJWSexperience.Ideology.Patches @@ -53,4 +54,55 @@ namespace RJWSexperience.Ideology.Patches } } } + + 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; + } + } } diff --git a/Source/IdeologyAddon/RelationHelpers.cs b/Source/IdeologyAddon/RelationHelpers.cs new file mode 100644 index 0000000..2a5fe77 --- /dev/null +++ b/Source/IdeologyAddon/RelationHelpers.cs @@ -0,0 +1,47 @@ +using RimWorld; +using System.Linq; +using Verse; + +namespace RJWSexperience.Ideology +{ + public static class RelationHelpers + { + /// + /// Get degree of blood relation between two pawns + /// + public static BloodRelationDegree GetBloodRelationDegree(Pawn pawn, Pawn partner) + { + PawnRelationDef closestBloodRelation = pawn + .GetRelations(partner) + ?.Where(def => def.familyByBloodRelation) + ?.OrderByDescending(def => def.importance) + ?.FirstOrFallback(); + + if (closestBloodRelation == null) + { + return BloodRelationDegree.NotRelated; + } + + return GetBloodRelationDegree(closestBloodRelation); + } + + /// + /// Get degree of blood relation for a relationDef + /// + public static BloodRelationDegree GetBloodRelationDegree(PawnRelationDef relationDef) + { + if (!relationDef.familyByBloodRelation) + { + return BloodRelationDegree.NotRelated; + } + else if (relationDef.importance <= PawnRelationDefOf.Cousin.importance) + { + return BloodRelationDegree.FarRelative; + } + else + { + return BloodRelationDegree.CloseRelative; + } + } + } +} diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs new file mode 100644 index 0000000..f2831ee --- /dev/null +++ b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs @@ -0,0 +1,108 @@ +using RimWorld; +using System.Collections.Generic; +using System.Linq; +using Verse; + +namespace RJWSexperience.Ideology +{ + public static class RomanceChanceFactorHelpers + { + /// + /// Default value for parent relation + /// + private const float parentRomanceChanceFactor = 0.03f; + + /// + /// Get ideology adjusted romanceChanceFactor + /// + public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner) + { + IEnumerable relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation); + PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); + float romanceChanceFactor = 1f; + + if (!relations.Any()) + { + if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) + { + return parentRomanceChanceFactor; + } + else + { + return romanceChanceFactor; + } + } + + foreach (PawnRelationDef relationDef in relations) + { + romanceChanceFactor *= GetRomanceChanceFactor(relationDef, incestuousPrecept); + } + + return romanceChanceFactor; + } + + /// + /// Get ideology adjusted romanceChanceFactor for the relation + /// + public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept) + { + if (incestuousPrecept == null || incestuousPrecept == VariousDefOf.Incestuos_Disapproved) // Default game setup + { + return relationDef.romanceChanceFactor; + } + + if (incestuousPrecept == VariousDefOf.Incestuos_Free) + { + return 1f; + } + else if (incestuousPrecept == VariousDefOf.Incestuos_Disapproved_CloseOnly) + { + if (relationDef.familyByBloodRelation && relationDef.importance > PawnRelationDefOf.Cousin.importance) + { + return relationDef.romanceChanceFactor; + } + else + { + return 1f; + } + } + else if (incestuousPrecept == VariousDefOf.Incestuos_Forbidden) + { + if (relationDef.familyByBloodRelation) + { + return parentRomanceChanceFactor; + } + } + else if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) + { + if (!relationDef.familyByBloodRelation) + { + return parentRomanceChanceFactor; + } + else + { + return 1f; + } + } + + return relationDef.romanceChanceFactor; + } + + [DebugAction("RJW Sexperience Ideology", "Show romanceChanceFactors", false, true, actionType = DebugActionType.Action, allowedGameStates = AllowedGameStates.Entry)] + public static void DisplayDebugTable() + { + IEnumerable incestuousPrecepts = DefDatabase + .AllDefsListForReading + .Where(def => def.issue == VariousDefOf.Incestuos); + + IEnumerable> preceptGetters = incestuousPrecepts + .Select(precept => new TableDataGetter(precept.defName,(PawnRelationDef rel) => GetRomanceChanceFactor(rel, precept))); + + var relName = new TableDataGetter("Relation Def", (PawnRelationDef rel) => rel.defName); + + TableDataGetter[] getters = (new List>() { relName }).Concat(preceptGetters).ToArray(); + + DebugTables.MakeTablesDialog(DefDatabase.AllDefsListForReading, getters); + } + } +} \ No newline at end of file diff --git a/Source/IdeologyAddon/VariousDefOf.cs b/Source/IdeologyAddon/VariousDefOf.cs index fb926ce..996a479 100644 --- a/Source/IdeologyAddon/VariousDefOf.cs +++ b/Source/IdeologyAddon/VariousDefOf.cs @@ -13,15 +13,21 @@ namespace RJWSexperience.Ideology public static readonly JobDef GettinDrugSex; public static readonly JobDef DrugMasturbate; - [MayRequireIdeology] public static readonly MemeDef Zoophile; - [MayRequireIdeology] public static readonly MemeDef Rapist; - [MayRequireIdeology] public static readonly MemeDef Necrophile; - [MayRequireIdeology] public static readonly PreceptDef Bestiality_OnlyVenerated; - [MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysFather; - [MayRequireIdeology] public static readonly PreceptDef BabyFaction_AlwaysColony; - [MayRequireIdeology] public static readonly PreceptDef Submissive_Male; - [MayRequireIdeology] public static readonly PreceptDef Submissive_Female; - [MayRequireIdeology] public static readonly PreceptDef ProselyzingByOrgasm; + public static readonly MemeDef Zoophile; + public static readonly MemeDef Rapist; + public static readonly MemeDef Necrophile; + public static readonly IssueDef Incestuos; + public static readonly PreceptDef Incestuos_Free; + public static readonly PreceptDef Incestuos_Disapproved_CloseOnly; + public static readonly PreceptDef Incestuos_Disapproved; + public static readonly PreceptDef Incestuos_Forbidden; + public static readonly PreceptDef Incestuos_IncestOnly; + public static readonly PreceptDef Bestiality_OnlyVenerated; + public static readonly PreceptDef BabyFaction_AlwaysFather; + public static readonly PreceptDef BabyFaction_AlwaysColony; + public static readonly PreceptDef Submissive_Male; + public static readonly PreceptDef Submissive_Female; + public static readonly PreceptDef ProselyzingByOrgasm; [MayRequireBiotech] public static readonly HediffDef PregnantHuman; } } From 765e6c0778545537d44d59a4b56c4116a3a08b61 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 20 Nov 2022 18:55:13 +0500 Subject: [PATCH 03/19] Moved PreceptDefs into a separate class --- Source/IdeologyAddon/IdeoUtility.cs | 4 ++-- Source/IdeologyAddon/IdeologyAddon.csproj | 1 + .../IdeologyAddon/Patches/RJW_Patch_Ideo.cs | 6 +++--- .../IdeologyAddon/Patches/Rimworld_Patch.cs | 10 +++++----- Source/IdeologyAddon/Rituals/RitualRoles.cs | 2 +- .../RomanceChanceFactorHelpers.cs | 12 +++++------ Source/IdeologyAddon/RsiHistoryEventDefOf.cs | 18 ++++++++--------- Source/IdeologyAddon/RsiPreceptDefOf.cs | 20 +++++++++++++++++++ Source/IdeologyAddon/VariousDefOf.cs | 11 ---------- 9 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 Source/IdeologyAddon/RsiPreceptDefOf.cs diff --git a/Source/IdeologyAddon/IdeoUtility.cs b/Source/IdeologyAddon/IdeoUtility.cs index 4b44cce..206b8eb 100644 --- a/Source/IdeologyAddon/IdeoUtility.cs +++ b/Source/IdeologyAddon/IdeoUtility.cs @@ -12,9 +12,9 @@ namespace RJWSexperience.Ideology if (ideo == null) return false; - if (ideo.HasPrecept(VariousDefOf.Submissive_Female) && pawn.gender == Gender.Female) + if (ideo.HasPrecept(RsiPreceptDefOf.Submissive_Female) && pawn.gender == Gender.Female) return true; - else if (ideo.HasPrecept(VariousDefOf.Submissive_Male) && pawn.gender == Gender.Male) + else if (ideo.HasPrecept(RsiPreceptDefOf.Submissive_Male) && pawn.gender == Gender.Male) return true; return false; diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index e2571af..0636e40 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -63,6 +63,7 @@ + diff --git a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs index f387f14..e52b361 100644 --- a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs +++ b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs @@ -213,14 +213,14 @@ namespace RJWSexperience.Ideology.Patches Ideo mainideo = playerfaction.ideos.PrimaryIdeo; if (mainideo != null) { - if (mainideo.HasPrecept(VariousDefOf.BabyFaction_AlwaysFather)) + if (mainideo.HasPrecept(RsiPreceptDefOf.BabyFaction_AlwaysFather)) { Pawn parent = baby.GetFather() ?? baby.GetMother(); ideo = parent.Ideo; return parent.Faction; } - else if (mainideo.HasPrecept(VariousDefOf.BabyFaction_AlwaysColony)) + else if (mainideo.HasPrecept(RsiPreceptDefOf.BabyFaction_AlwaysColony)) { ideo = mainideo; return playerfaction; @@ -241,7 +241,7 @@ namespace RJWSexperience.Ideology.Patches if (props.pawn?.Ideo == null || !props.hasPartner()) return; - if (props.partner.Ideo?.HasPrecept(VariousDefOf.ProselyzingByOrgasm) == true) + if (props.partner.Ideo?.HasPrecept(RsiPreceptDefOf.ProselyzingByOrgasm) == true) { // Pawn is the one having the orgasm // Partner is "giving" the orgasm, hence the pawn will be converted towards the partners ideology diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index 9243d70..55f3ba6 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -83,20 +83,20 @@ namespace RJWSexperience.Ideology.Patches BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(one, two); if (incestuousPrecept == null || - incestuousPrecept == VariousDefOf.Incestuos_Disapproved || - incestuousPrecept == VariousDefOf.Incestuos_Forbidden) + incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved || + incestuousPrecept == RsiPreceptDefOf.Incestuos_Forbidden) { return relationDegree < BloodRelationDegree.NotRelated; } - else if (incestuousPrecept == VariousDefOf.Incestuos_Free) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free) { return false; } - else if (incestuousPrecept == VariousDefOf.Incestuos_Disapproved_CloseOnly) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly) { return relationDegree == BloodRelationDegree.CloseRelative; } - else if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) { return relationDegree == BloodRelationDegree.NotRelated; } diff --git a/Source/IdeologyAddon/Rituals/RitualRoles.cs b/Source/IdeologyAddon/Rituals/RitualRoles.cs index 0d26048..691bb28 100644 --- a/Source/IdeologyAddon/Rituals/RitualRoles.cs +++ b/Source/IdeologyAddon/Rituals/RitualRoles.cs @@ -92,7 +92,7 @@ namespace RJWSexperience.Ideology public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept) { - if (precept != null && precept.ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) + if (precept != null && precept.ideo.HasPrecept(RsiPreceptDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) { return false; } diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs index f2831ee..298916c 100644 --- a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs +++ b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs @@ -23,7 +23,7 @@ namespace RJWSexperience.Ideology if (!relations.Any()) { - if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) + if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) { return parentRomanceChanceFactor; } @@ -46,16 +46,16 @@ namespace RJWSexperience.Ideology /// public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept) { - if (incestuousPrecept == null || incestuousPrecept == VariousDefOf.Incestuos_Disapproved) // Default game setup + if (incestuousPrecept == null || incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved) // Default game setup { return relationDef.romanceChanceFactor; } - if (incestuousPrecept == VariousDefOf.Incestuos_Free) + if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free) { return 1f; } - else if (incestuousPrecept == VariousDefOf.Incestuos_Disapproved_CloseOnly) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly) { if (relationDef.familyByBloodRelation && relationDef.importance > PawnRelationDefOf.Cousin.importance) { @@ -66,14 +66,14 @@ namespace RJWSexperience.Ideology return 1f; } } - else if (incestuousPrecept == VariousDefOf.Incestuos_Forbidden) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Forbidden) { if (relationDef.familyByBloodRelation) { return parentRomanceChanceFactor; } } - else if (incestuousPrecept == VariousDefOf.Incestuos_IncestOnly) + else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) { if (!relationDef.familyByBloodRelation) { diff --git a/Source/IdeologyAddon/RsiHistoryEventDefOf.cs b/Source/IdeologyAddon/RsiHistoryEventDefOf.cs index 0155d66..4cb9bc7 100644 --- a/Source/IdeologyAddon/RsiHistoryEventDefOf.cs +++ b/Source/IdeologyAddon/RsiHistoryEventDefOf.cs @@ -5,14 +5,14 @@ namespace RJWSexperience.Ideology [DefOf] public static class RsiHistoryEventDefOf { - [MayRequireIdeology] public static readonly HistoryEventDef RSI_SexWithAnimal; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_Raped; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_NonIncestuosMarriage; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_NonIncestuosSex; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_SexWithCorpse; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_VirginTaken; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_VirginStolen; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_TookVirgin; - [MayRequireIdeology] public static readonly HistoryEventDef RSI_Masturbated; + public static readonly HistoryEventDef RSI_SexWithAnimal; + public static readonly HistoryEventDef RSI_Raped; + public static readonly HistoryEventDef RSI_NonIncestuosMarriage; + public static readonly HistoryEventDef RSI_NonIncestuosSex; + public static readonly HistoryEventDef RSI_SexWithCorpse; + public static readonly HistoryEventDef RSI_VirginTaken; + public static readonly HistoryEventDef RSI_VirginStolen; + public static readonly HistoryEventDef RSI_TookVirgin; + public static readonly HistoryEventDef RSI_Masturbated; } } diff --git a/Source/IdeologyAddon/RsiPreceptDefOf.cs b/Source/IdeologyAddon/RsiPreceptDefOf.cs new file mode 100644 index 0000000..977954a --- /dev/null +++ b/Source/IdeologyAddon/RsiPreceptDefOf.cs @@ -0,0 +1,20 @@ +using RimWorld; + +namespace RJWSexperience.Ideology +{ + [DefOf] + public static class RsiPreceptDefOf + { + public static readonly PreceptDef Incestuos_Free; + public static readonly PreceptDef Incestuos_Disapproved_CloseOnly; + public static readonly PreceptDef Incestuos_Disapproved; + public static readonly PreceptDef Incestuos_Forbidden; + public static readonly PreceptDef Incestuos_IncestOnly; + public static readonly PreceptDef Bestiality_OnlyVenerated; + public static readonly PreceptDef BabyFaction_AlwaysFather; + public static readonly PreceptDef BabyFaction_AlwaysColony; + public static readonly PreceptDef Submissive_Male; + public static readonly PreceptDef Submissive_Female; + public static readonly PreceptDef ProselyzingByOrgasm; + } +} \ No newline at end of file diff --git a/Source/IdeologyAddon/VariousDefOf.cs b/Source/IdeologyAddon/VariousDefOf.cs index 996a479..19a104d 100644 --- a/Source/IdeologyAddon/VariousDefOf.cs +++ b/Source/IdeologyAddon/VariousDefOf.cs @@ -17,17 +17,6 @@ namespace RJWSexperience.Ideology public static readonly MemeDef Rapist; public static readonly MemeDef Necrophile; public static readonly IssueDef Incestuos; - public static readonly PreceptDef Incestuos_Free; - public static readonly PreceptDef Incestuos_Disapproved_CloseOnly; - public static readonly PreceptDef Incestuos_Disapproved; - public static readonly PreceptDef Incestuos_Forbidden; - public static readonly PreceptDef Incestuos_IncestOnly; - public static readonly PreceptDef Bestiality_OnlyVenerated; - public static readonly PreceptDef BabyFaction_AlwaysFather; - public static readonly PreceptDef BabyFaction_AlwaysColony; - public static readonly PreceptDef Submissive_Male; - public static readonly PreceptDef Submissive_Female; - public static readonly PreceptDef ProselyzingByOrgasm; [MayRequireBiotech] public static readonly HediffDef PregnantHuman; } } From 7d6f0d043ce9da407c2e51e72512f14fb93c7017 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Mon, 21 Nov 2022 22:40:44 +0500 Subject: [PATCH 04/19] Added isBloodRelated filter attribute --- 1.4/Defs/PreceptDefs/Precepts_Incest.xml | 95 +------------------ .../{ => Filters}/RelationFilter.cs | 21 ++-- .../{ => Filters}/SinglePawnFilter.cs | 13 ++- Source/IdeologyAddon/Filters/TwoPawnFilter.cs | 34 +++++++ .../HistoryEvents/TwoPawnEventRule.cs | 10 +- Source/IdeologyAddon/IdeologyAddon.csproj | 6 +- .../Precepts/DefExtension_ModifyPreference.cs | 25 +++-- Source/IdeologyAddon/TwoPawnFilter.cs | 30 ------ 8 files changed, 92 insertions(+), 142 deletions(-) rename Source/IdeologyAddon/{ => Filters}/RelationFilter.cs (73%) rename Source/IdeologyAddon/{ => Filters}/SinglePawnFilter.cs (50%) create mode 100644 Source/IdeologyAddon/Filters/TwoPawnFilter.cs delete mode 100644 Source/IdeologyAddon/TwoPawnFilter.cs diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index ddcc32a..97d5d0d 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -44,24 +44,7 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • -
  • GreatGrandparent
  • -
  • GreatGrandchild
  • -
  • GranduncleOrGrandaunt
  • -
  • GrandnephewOrGrandniece
  • -
  • CousinOnceRemoved
  • -
  • SecondCousin
  • -
  • Cousin
  • -
  • Kin
  • - + true RSI_IncestuosMarriage @@ -107,24 +90,7 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • -
  • GreatGrandparent
  • -
  • GreatGrandchild
  • -
  • GranduncleOrGrandaunt
  • -
  • GrandnephewOrGrandniece
  • -
  • CousinOnceRemoved
  • -
  • SecondCousin
  • -
  • Cousin
  • -
  • Kin
  • - + true RSI_IncestuosSex @@ -223,24 +189,7 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • -
  • GreatGrandparent
  • -
  • GreatGrandchild
  • -
  • GranduncleOrGrandaunt
  • -
  • GrandnephewOrGrandniece
  • -
  • CousinOnceRemoved
  • -
  • SecondCousin
  • -
  • Cousin
  • -
  • Kin
  • - + true
  • Spouse
  • @@ -282,24 +231,7 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • -
  • GreatGrandparent
  • -
  • GreatGrandchild
  • -
  • GranduncleOrGrandaunt
  • -
  • GrandnephewOrGrandniece
  • -
  • CousinOnceRemoved
  • -
  • SecondCousin
  • -
  • Cousin
  • -
  • Kin
  • - + true
  • Spouse
  • @@ -336,24 +268,7 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • -
  • GreatGrandparent
  • -
  • GreatGrandchild
  • -
  • GranduncleOrGrandaunt
  • -
  • GrandnephewOrGrandniece
  • -
  • CousinOnceRemoved
  • -
  • SecondCousin
  • -
  • Cousin
  • -
  • Kin
  • - + true 2.0 diff --git a/Source/IdeologyAddon/RelationFilter.cs b/Source/IdeologyAddon/Filters/RelationFilter.cs similarity index 73% rename from Source/IdeologyAddon/RelationFilter.cs rename to Source/IdeologyAddon/Filters/RelationFilter.cs index cff5738..32fa1ed 100644 --- a/Source/IdeologyAddon/RelationFilter.cs +++ b/Source/IdeologyAddon/Filters/RelationFilter.cs @@ -1,27 +1,33 @@ using RimWorld; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; using Verse; -namespace RJWSexperience.Ideology +namespace RJWSexperience.Ideology.Filters { + /// + /// Filter to describe how one pawn sees another + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] public class RelationFilter { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public bool? isVeneratedAnimal; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public bool? isAlien; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] + public bool? isBloodRelated; public List hasOneOfRelations; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public List hasNoneOfRelations; private bool initialized = false; private HashSet hasOneOfRelationsHashed; private HashSet hasNoneOfRelationsHashed; + /// + /// Check if the pair of pawns fits filter conditions + /// public bool Applies(Pawn pawn, Pawn partner) { + // Fail if any single condition fails if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner)) return false; @@ -39,11 +45,14 @@ namespace RJWSexperience.Ideology if (!initialized) Initialize(); - if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null) + if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && isBloodRelated == null) return true; IEnumerable relations = pawn.GetRelations(partner); + if (isBloodRelated != null && isBloodRelated != relations.Any(def => def.familyByBloodRelation)) + return false; + if (hasOneOfRelationsHashed != null) { if (relations.EnumerableNullOrEmpty()) diff --git a/Source/IdeologyAddon/SinglePawnFilter.cs b/Source/IdeologyAddon/Filters/SinglePawnFilter.cs similarity index 50% rename from Source/IdeologyAddon/SinglePawnFilter.cs rename to Source/IdeologyAddon/Filters/SinglePawnFilter.cs index daa240f..40e7a0a 100644 --- a/Source/IdeologyAddon/SinglePawnFilter.cs +++ b/Source/IdeologyAddon/Filters/SinglePawnFilter.cs @@ -2,19 +2,24 @@ using System.Diagnostics.CodeAnalysis; using Verse; -namespace RJWSexperience.Ideology +namespace RJWSexperience.Ideology.Filters { + /// + /// Filter to describe one pawn + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] public class SinglePawnFilter { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public bool? isAnimal; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public bool? isSlave; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public bool? isPrisoner; + /// + /// Check if pawn fits filter conditions + /// public bool Applies(Pawn pawn) { + // Fail if any single condition fails if (isAnimal != null && isAnimal != pawn.IsAnimal()) return false; diff --git a/Source/IdeologyAddon/Filters/TwoPawnFilter.cs b/Source/IdeologyAddon/Filters/TwoPawnFilter.cs new file mode 100644 index 0000000..c0580b0 --- /dev/null +++ b/Source/IdeologyAddon/Filters/TwoPawnFilter.cs @@ -0,0 +1,34 @@ +using System.Diagnostics.CodeAnalysis; +using Verse; + +namespace RJWSexperience.Ideology.Filters +{ + /// + /// Filter to describe two pawns and relations between them + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] + public class TwoPawnFilter + { + public SinglePawnFilter doer; + public SinglePawnFilter partner; + public RelationFilter relations; + + /// + /// Check if the pair of pawns fits filter conditions + /// + public bool Applies(Pawn pawn, Pawn partner) + { + // Fail if any single condition fails + if (doer?.Applies(pawn) == false) + return false; + + if (this.partner?.Applies(partner) == false) + return false; + + if (relations?.Applies(pawn, partner) == false) + return false; + + return true; + } + } +} diff --git a/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs b/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs index dc61b89..9c9e3f1 100644 --- a/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs +++ b/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs @@ -1,16 +1,22 @@ using RimWorld; +using RJWSexperience.Ideology.Filters; using System.Diagnostics.CodeAnalysis; using Verse; namespace RJWSexperience.Ideology.HistoryEvents { + /// + /// Type to associate single HistoryEventDef with a TwoPawnFilter + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] public class TwoPawnEventRule { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public HistoryEventDef historyEventDef; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public TwoPawnFilter filter; + /// + /// Check if the pair of pawns fits filter conditions + /// public bool Applies(Pawn pawn, Pawn partner) => filter?.Applies(pawn, partner) == true; } } diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index 0636e40..d23b8ae 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -59,13 +59,13 @@ - + - - + + diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs index 698bda1..19689bb 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs @@ -1,30 +1,41 @@ -using System.Collections.Generic; +using RJWSexperience.Ideology.Filters; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; using Verse; namespace RJWSexperience.Ideology.Precepts { + /// + /// Def extension to enable changing SexAppraiser results based on filters + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] public class DefExtension_ModifyPreference : DefModExtension { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public List rules; + /// + /// Apply SexAppraiser modifiers from rules with a satisfied filter + /// public void Apply(Pawn pawn, Pawn partner, ref float preference) { - foreach (Rule rule in rules) + foreach (Rule rule in rules.Where(rule => rule.Applies(pawn, partner))) { - if (rule.Applies(pawn, partner)) - preference *= rule.multiplier; + preference *= rule.multiplier; } } + /// + /// Type to associate SexAppraiser result modifier with a TwoPawnFilter + /// public class Rule { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public float multiplier = 1f; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] public TwoPawnFilter filter; + /// + /// Check if the pair of pawns fits filter conditions + /// public bool Applies(Pawn pawn, Pawn partner) { if (filter == null) diff --git a/Source/IdeologyAddon/TwoPawnFilter.cs b/Source/IdeologyAddon/TwoPawnFilter.cs deleted file mode 100644 index 7c49f92..0000000 --- a/Source/IdeologyAddon/TwoPawnFilter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using rjw; -using System.Diagnostics.CodeAnalysis; -using Verse; - -namespace RJWSexperience.Ideology -{ - public class TwoPawnFilter - { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] - public SinglePawnFilter doer; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] - public SinglePawnFilter partner; - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] - public RelationFilter relations; - - public bool Applies(Pawn pawn, Pawn partner) - { - if (doer?.Applies(pawn) == false) - return false; - - if (this.partner?.Applies(partner) == false) - return false; - - if (relations?.Applies(pawn, partner) == false) - return false; - - return true; - } - } -} From bcc9feb61a05bde76ba68e2ddbdf1b5709a02805 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Mon, 21 Nov 2022 22:47:52 +0500 Subject: [PATCH 05/19] Changed Incestuos_IncestOnly would_fuck multiplier for blood related pawns: 2.0 -> 1.0 Changed Incestuos_IncestOnly would_fuck multiplier for non-blood related pawns: 1.0 -> 0.1 --- 1.4/Defs/PreceptDefs/Precepts_Incest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index 97d5d0d..3a36a95 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -268,10 +268,10 @@
  • - true + false - 2.0 + 0.1
  • From d33fa5e3eac2646a712dd98ff74e06f8da6b3e3e Mon Sep 17 00:00:00 2001 From: amevarashi Date: Wed, 23 Nov 2022 19:42:47 +0500 Subject: [PATCH 06/19] Moved manual romance rules into XML --- 1.4/Defs/PreceptDefs/Precepts_Incest.xml | 21 +++++++++++++++++++ Source/IdeologyAddon/IdeologyAddon.csproj | 3 ++- .../IdeologyAddon/Patches/Rimworld_Patch.cs | 20 +++--------------- .../Precepts/DefExtension_Incest.cs | 16 ++++++++++++++ 4 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 Source/IdeologyAddon/Precepts/DefExtension_Incest.cs diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index 3a36a95..23f82de 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -111,6 +111,15 @@ 60 1000 100 + +
  • + +
  • CloseRelative
  • +
  • FarRelative
  • +
  • NotRelated
  • + + +
    @@ -157,6 +166,12 @@ +
  • + +
  • FarRelative
  • +
  • NotRelated
  • + +
    @@ -275,6 +290,12 @@ +
  • + +
  • CloseRelative
  • +
  • FarRelative
  • + + diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index d23b8ae..63f6689 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -53,6 +53,7 @@ + @@ -98,7 +99,7 @@ - 1.4.3542 + 1.4.3555 2.2.2 diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index 55f3ba6..de49fe7 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -80,29 +80,15 @@ namespace RJWSexperience.Ideology.Patches public static bool RsiIncestuous(Pawn one, Pawn two) { PreceptDef incestuousPrecept = one.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); + var allowManualRomanceOnlyFor = incestuousPrecept?.GetModExtension()?.allowManualRomanceOnlyFor; BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(one, two); - if (incestuousPrecept == null || - incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved || - incestuousPrecept == RsiPreceptDefOf.Incestuos_Forbidden) + if (allowManualRomanceOnlyFor == null) { return relationDegree < BloodRelationDegree.NotRelated; } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free) - { - return false; - } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly) - { - return relationDegree == BloodRelationDegree.CloseRelative; - } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) - { - return relationDegree == BloodRelationDegree.NotRelated; - } - // Modded incestuous precept? - return true; + return !allowManualRomanceOnlyFor.Contains(relationDegree); } } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs b/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs new file mode 100644 index 0000000..f4e474d --- /dev/null +++ b/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs @@ -0,0 +1,16 @@ +using RJWSexperience.Ideology.Filters; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using Verse; + +namespace RJWSexperience.Ideology.Precepts +{ + /// + /// Special Def extension for the Incestuous issue precepts + /// + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Def loader")] + public class DefExtension_Incest : DefModExtension + { + public List allowManualRomanceOnlyFor; + } +} From 355d409eb689fe20d91ec705b8c64a27a0168127 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Wed, 23 Nov 2022 20:12:13 +0500 Subject: [PATCH 07/19] Removed "not obedient" social thought for raping a slave --- 1.4/Defs/PreceptDefs/Precepts_Submissive.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1.4/Defs/PreceptDefs/Precepts_Submissive.xml b/1.4/Defs/PreceptDefs/Precepts_Submissive.xml index e69c135..aa7ae4d 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Submissive.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Submissive.xml @@ -76,11 +76,11 @@ BeenRaped_NotSubmissive Female -
  • + @@ -140,11 +140,11 @@ BeenRaped_NotSubmissive Male
  • -
  • + From 785eac31de0b07cd63c886e86f89f8ff31053217 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Thu, 24 Nov 2022 23:10:03 +0500 Subject: [PATCH 08/19] Patched SecondaryRomanceChanceFactor for incest precept --- .../IdeologyAddon/Patches/Rimworld_Patch.cs | 91 ++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index de49fe7..9a54dd4 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -5,6 +5,8 @@ using RJWSexperience.Ideology.HistoryEvents; using RJWSexperience.Ideology.Precepts; using System.Collections.Generic; using System.Linq; +using System.Reflection; +using System.Reflection.Emit; using Verse; namespace RJWSexperience.Ideology.Patches @@ -55,6 +57,7 @@ namespace RJWSexperience.Ideology.Patches } } + [HarmonyPatch(typeof(RelationsUtility), "Incestuous")] public static class Rimworld_Patch_IncestuousManualRomance { /// @@ -64,7 +67,6 @@ namespace RJWSexperience.Ideology.Patches /// 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); @@ -91,4 +93,91 @@ namespace RJWSexperience.Ideology.Patches return !allowManualRomanceOnlyFor.Contains(relationDegree); } } + + [HarmonyPatch(typeof(Pawn_RelationsTracker), nameof(Pawn_RelationsTracker.SecondaryRomanceChanceFactor))] + public static class Rimworld_Patch_SecondaryRomanceChanceFactor + { + /// + /// + /// Replace + /// float num = 1f; + /// foreach (PawnRelationDef pawnRelationDef in this.pawn.GetRelations(otherPawn)) + /// { + /// num *= pawnRelationDef.romanceChanceFactor; + /// } + /// + /// with + /// + /// float num = 1f; + /// num = RomanceChanceFactorHelpers.GetRomanceChanceFactor(this.pawn, otherPawn) + /// + /// + /// Original method body + /// Modified method body + public static IEnumerable Transpiler(IEnumerable instructions) + { + MethodInfo getRelationsInfo = AccessTools.Method( + typeof(PawnRelationUtility), + nameof(PawnRelationUtility.GetRelations), + new[] { typeof(Pawn), typeof(Pawn) }); + MethodInfo helperInfo = AccessTools.Method( + typeof(RomanceChanceFactorHelpers), + nameof(RomanceChanceFactorHelpers.GetRomanceChanceFactor), + new[] { typeof(Pawn), typeof(Pawn) }); + bool skipping = false; + bool yieldNext = false; + bool finished = false; + + // Original IL looks something like this: + // Load this.pawn + // Load otherPawn + // Call GetRelations + // Start loop + // ... + // Mul num and romanceChanceFactor + // Store result + // ... + // Endfinaly + + // Idea is to substitute GetRelations call with a method with the same signature, + // store results in the same place original loop does and remove everything else until Endfinaly + + foreach (CodeInstruction instruction in instructions) + { + if (finished) + { + yield return instruction; + continue; + } + + if (skipping) + { + if (yieldNext) + { + yield return instruction; + yieldNext = false; + } + else if (instruction.opcode == OpCodes.Mul) + { + yieldNext = true; + } + else if (instruction.opcode == OpCodes.Endfinally) + { + finished = true; + } + + continue; + } + + if (instruction.Calls(getRelationsInfo)) + { + yield return new CodeInstruction(OpCodes.Call, helperInfo); + skipping = true; + continue; + } + + yield return instruction; + } + } + } } From 7107947cacdba4ac1750c706a9ec09c25b1ce15e Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 19 Feb 2023 16:09:10 +0500 Subject: [PATCH 09/19] Bestiality_Acceptable nullifies RJW bestiality thoughts --- 1.4/Patches/RJW_ThoughtDefs.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/1.4/Patches/RJW_ThoughtDefs.xml b/1.4/Patches/RJW_ThoughtDefs.xml index e2e3f6e..30a1b66 100644 --- a/1.4/Patches/RJW_ThoughtDefs.xml +++ b/1.4/Patches/RJW_ThoughtDefs.xml @@ -8,6 +8,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • @@ -19,6 +20,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • @@ -30,6 +32,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • @@ -41,6 +44,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • @@ -52,6 +56,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • @@ -63,6 +68,7 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • +
  • Bestiality_Acceptable
  • From 7e30ebe68eb39264d1683eaa57632a604748d737 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sat, 22 Apr 2023 15:08:57 +0500 Subject: [PATCH 10/19] Optimized incest checks --- Source/IdeologyAddon/RelationHelpers.cs | 5 +++++ Source/IdeologyAddon/RomanceChanceFactorHelpers.cs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Source/IdeologyAddon/RelationHelpers.cs b/Source/IdeologyAddon/RelationHelpers.cs index 2a5fe77..1033307 100644 --- a/Source/IdeologyAddon/RelationHelpers.cs +++ b/Source/IdeologyAddon/RelationHelpers.cs @@ -11,6 +11,11 @@ namespace RJWSexperience.Ideology ///
    public static BloodRelationDegree GetBloodRelationDegree(Pawn pawn, Pawn partner) { + if (!pawn.relations.FamilyByBlood.Contains(partner)) + { + return BloodRelationDegree.NotRelated; + } + PawnRelationDef closestBloodRelation = pawn .GetRelations(partner) ?.Where(def => def.familyByBloodRelation) diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs index 298916c..9a834b2 100644 --- a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs +++ b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs @@ -17,11 +17,10 @@ namespace RJWSexperience.Ideology /// public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner) { - IEnumerable relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation); PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); float romanceChanceFactor = 1f; - if (!relations.Any()) + if (!pawn.relations.FamilyByBlood.Contains(partner)) { if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) { @@ -33,6 +32,7 @@ namespace RJWSexperience.Ideology } } + IEnumerable relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation); foreach (PawnRelationDef relationDef in relations) { romanceChanceFactor *= GetRomanceChanceFactor(relationDef, incestuousPrecept); From be1e5c5d5df1d9cea92bbd6641deeade5efa14a1 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 23 Apr 2023 15:38:38 +0500 Subject: [PATCH 11/19] Replaced manual sexperience patch with the Prepare method --- Source/IdeologyAddon/Harmony.cs | 19 ++++--------------- .../Patches/Sexperience_Patch.cs | 6 +++++- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/Source/IdeologyAddon/Harmony.cs b/Source/IdeologyAddon/Harmony.cs index 08a78d0..d756855 100644 --- a/Source/IdeologyAddon/Harmony.cs +++ b/Source/IdeologyAddon/Harmony.cs @@ -1,25 +1,14 @@ -using HarmonyLib; -using RJWSexperience.Ideology.Patches; -using System.Reflection; +using System.Reflection; using Verse; namespace RJWSexperience.Ideology { [StaticConstructorOnStartup] - internal static class First + internal static class Harmony { - static First() + static Harmony() { - var harmony = new Harmony("RJW_Sexperience.Ideology"); - harmony.PatchAll(Assembly.GetExecutingAssembly()); - - if (ModLister.HasActiveModWithName("RJW Sexperience")) - { - harmony.Patch(AccessTools.Method("RJWSexperience.RJWUtility:ThrowVirginHistoryEvent"), - prefix: null, - postfix: new HarmonyMethod(typeof(Sexperience_Patch_ThrowVirginHistoryEvent), nameof(Sexperience_Patch_ThrowVirginHistoryEvent.Postfix)) - ); - } + new HarmonyLib.Harmony("RJW_Sexperience.Ideology").PatchAll(Assembly.GetExecutingAssembly()); } } } diff --git a/Source/IdeologyAddon/Patches/Sexperience_Patch.cs b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs index 6951eea..1be61cd 100644 --- a/Source/IdeologyAddon/Patches/Sexperience_Patch.cs +++ b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs @@ -1,11 +1,15 @@ -using rjw; +using HarmonyLib; +using rjw; using RJWSexperience.Ideology.HistoryEvents; using Verse; namespace RJWSexperience.Ideology.Patches { + [HarmonyPatch("RJWSexperience.RJWUtility", "ThrowVirginHistoryEvent")] public static class Sexperience_Patch_ThrowVirginHistoryEvent { + public static bool Prepare() => ModsConfig.IsActive("rjw.sexperience"); + public static void Postfix(Pawn exVirgin, Pawn partner, SexProps props, int degree) { const int femaleAfterSurgery = 1; From f7206347da813223dbc8fafc9495de92a96ba66c Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 23 Apr 2023 16:16:28 +0500 Subject: [PATCH 12/19] Moved precepts romanceChanceFactor to DefExtention --- 1.4/Defs/PreceptDefs/Precepts_Incest.xml | 111 ++++++++++++------ .../IdeologyAddon/Filters/RelationFilter.cs | 21 ++-- .../Precepts/DefExtension_Incest.cs | 61 +++++++++- .../RomanceChanceFactorHelpers.cs | 45 ++----- Source/IdeologyAddon/RsiPreceptDefOf.cs | 4 - 5 files changed, 159 insertions(+), 83 deletions(-) diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index 23f82de..54c079a 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -27,16 +27,9 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • - + +
  • CloseRelative
  • +
    RSI_CloseRelativeMarriage @@ -44,7 +37,9 @@
  • - true + +
  • FarRelative
  • + RSI_IncestuosMarriage @@ -73,16 +68,9 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • - + +
  • CloseRelative
  • +
    RSI_CloseRelativeSex @@ -90,7 +78,9 @@
  • - true + +
  • FarRelative
  • + RSI_IncestuosSex @@ -118,6 +108,20 @@
  • FarRelative
  • NotRelated
  • + +
  • + CloseRelative + 1 +
  • +
  • + FarRelative + 1 +
  • +
  • + NotRelated + 1 +
  • +
    @@ -147,16 +151,9 @@
  • - -
  • Parent
  • -
  • Child
  • -
  • Sibling
  • -
  • HalfSibling
  • -
  • Grandparent
  • -
  • Grandchild
  • -
  • NephewOrNiece
  • -
  • UncleOrAunt
  • - + +
  • CloseRelative
  • +
  • Spouse
  • @@ -171,6 +168,16 @@
  • FarRelative
  • NotRelated
  • + +
  • + FarRelative + 1 +
  • +
  • + NotRelated + 1 +
  • +
    @@ -204,7 +211,10 @@
  • - true + +
  • CloseRelative
  • +
  • FarRelative
  • +
  • Spouse
  • @@ -246,7 +256,10 @@
  • - true + +
  • CloseRelative
  • +
  • FarRelative
  • +
  • Spouse
  • @@ -256,6 +269,18 @@ +
  • + +
  • + CloseRelative + 0.03 +
  • +
  • + FarRelative + 0.03 +
  • + + @@ -283,7 +308,9 @@
  • - false + +
  • NotRelated
  • + 0.1 @@ -295,6 +322,20 @@
  • CloseRelative
  • FarRelative
  • + +
  • + CloseRelative + 1 +
  • +
  • + FarRelative + 1 +
  • +
  • + NotRelated + 0.03 +
  • +
    diff --git a/Source/IdeologyAddon/Filters/RelationFilter.cs b/Source/IdeologyAddon/Filters/RelationFilter.cs index 32fa1ed..732ed7e 100644 --- a/Source/IdeologyAddon/Filters/RelationFilter.cs +++ b/Source/IdeologyAddon/Filters/RelationFilter.cs @@ -1,7 +1,6 @@ using RimWorld; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; using Verse; namespace RJWSexperience.Ideology.Filters @@ -13,14 +12,14 @@ namespace RJWSexperience.Ideology.Filters public class RelationFilter { public bool? isVeneratedAnimal; - public bool? isAlien; - public bool? isBloodRelated; public List hasOneOfRelations; public List hasNoneOfRelations; + public List hasOneOfRelationDegrees; private bool initialized = false; private HashSet hasOneOfRelationsHashed; private HashSet hasNoneOfRelationsHashed; + private HashSet hasOneOfRelationDegreesHashed; /// /// Check if the pair of pawns fits filter conditions @@ -31,9 +30,6 @@ namespace RJWSexperience.Ideology.Filters if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner)) return false; - //if (isAlien != null && isAlien != partner) - // return false; - if (!CheckRelations(pawn, partner)) return false; @@ -45,13 +41,15 @@ namespace RJWSexperience.Ideology.Filters if (!initialized) Initialize(); - if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && isBloodRelated == null) + if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && hasOneOfRelationDegreesHashed == null) return true; - IEnumerable relations = pawn.GetRelations(partner); - - if (isBloodRelated != null && isBloodRelated != relations.Any(def => def.familyByBloodRelation)) + if (hasOneOfRelationDegreesHashed != null && !hasOneOfRelationDegreesHashed.Contains(RelationHelpers.GetBloodRelationDegree(pawn, partner))) + { return false; + } + + IEnumerable relations = pawn.GetRelations(partner); if (hasOneOfRelationsHashed != null) { @@ -78,6 +76,9 @@ namespace RJWSexperience.Ideology.Filters if (!hasOneOfRelations.NullOrEmpty()) hasOneOfRelationsHashed = new HashSet(hasOneOfRelations); + if (!hasOneOfRelationDegrees.NullOrEmpty()) + hasOneOfRelationDegreesHashed = new HashSet(hasOneOfRelationDegrees); + initialized = true; } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs b/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs index f4e474d..caf0ed0 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs @@ -1,5 +1,4 @@ -using RJWSexperience.Ideology.Filters; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Verse; @@ -12,5 +11,63 @@ namespace RJWSexperience.Ideology.Precepts public class DefExtension_Incest : DefModExtension { public List allowManualRomanceOnlyFor; + public List bloodRelationDegreeRomanceFactors; + + private Dictionary _relationDegreeFactorsDict; + + public bool TryGetRomanceChanceFactor(BloodRelationDegree relationDegree, out float romanceChanceFactor) + { + if (bloodRelationDegreeRomanceFactors.NullOrEmpty()) + { + romanceChanceFactor = 1f; + return false; + } + + if (_relationDegreeFactorsDict == null) + { + _relationDegreeFactorsDict = new Dictionary(); + foreach (BloodRelationDegreeFactor relationDegreeFactor in bloodRelationDegreeRomanceFactors) + { + _relationDegreeFactorsDict.Add((BloodRelationDegree)relationDegreeFactor.bloodRelationDegree, relationDegreeFactor.romanceChanceFactor); + } + } + + return _relationDegreeFactorsDict.TryGetValue(relationDegree, out romanceChanceFactor); + } + + public override IEnumerable ConfigErrors() + { + foreach (string error in base.ConfigErrors()) + { + yield return error; + } + + foreach (BloodRelationDegreeFactor factor in bloodRelationDegreeRomanceFactors) + { + foreach(string error in factor.ConfigErrors()) + { + yield return error; + } + } + } + + public class BloodRelationDegreeFactor + { + public BloodRelationDegree? bloodRelationDegree; + public float romanceChanceFactor; + + public IEnumerable ConfigErrors() + { + if (bloodRelationDegree == null) + { + yield return " is empty"; + } + + if (romanceChanceFactor == 0f) + { + yield return " should be > 0"; + } + } + } } } diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs index 9a834b2..bae549e 100644 --- a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs +++ b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs @@ -1,4 +1,5 @@ using RimWorld; +using RJWSexperience.Ideology.Precepts; using System.Collections.Generic; using System.Linq; using Verse; @@ -17,12 +18,11 @@ namespace RJWSexperience.Ideology /// public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner) { - PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); float romanceChanceFactor = 1f; if (!pawn.relations.FamilyByBlood.Contains(partner)) { - if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) + if (pawn.Ideo?.HasPrecept(RsiPreceptDefOf.Incestuos_IncestOnly) == true) { return parentRomanceChanceFactor; } @@ -32,6 +32,7 @@ namespace RJWSexperience.Ideology } } + PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); IEnumerable relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation); foreach (PawnRelationDef relationDef in relations) { @@ -46,43 +47,23 @@ namespace RJWSexperience.Ideology /// public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept) { - if (incestuousPrecept == null || incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved) // Default game setup + if (incestuousPrecept == null) { return relationDef.romanceChanceFactor; } - if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free) + var incestDefExt = incestuousPrecept.GetModExtension(); + + if (incestDefExt == null) { - return 1f; + return relationDef.romanceChanceFactor; } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly) + + BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(relationDef); + + if (incestDefExt.TryGetRomanceChanceFactor(relationDegree, out var romanceChanceOverride)) { - if (relationDef.familyByBloodRelation && relationDef.importance > PawnRelationDefOf.Cousin.importance) - { - return relationDef.romanceChanceFactor; - } - else - { - return 1f; - } - } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Forbidden) - { - if (relationDef.familyByBloodRelation) - { - return parentRomanceChanceFactor; - } - } - else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly) - { - if (!relationDef.familyByBloodRelation) - { - return parentRomanceChanceFactor; - } - else - { - return 1f; - } + return romanceChanceOverride; } return relationDef.romanceChanceFactor; diff --git a/Source/IdeologyAddon/RsiPreceptDefOf.cs b/Source/IdeologyAddon/RsiPreceptDefOf.cs index 977954a..1638e76 100644 --- a/Source/IdeologyAddon/RsiPreceptDefOf.cs +++ b/Source/IdeologyAddon/RsiPreceptDefOf.cs @@ -5,10 +5,6 @@ namespace RJWSexperience.Ideology [DefOf] public static class RsiPreceptDefOf { - public static readonly PreceptDef Incestuos_Free; - public static readonly PreceptDef Incestuos_Disapproved_CloseOnly; - public static readonly PreceptDef Incestuos_Disapproved; - public static readonly PreceptDef Incestuos_Forbidden; public static readonly PreceptDef Incestuos_IncestOnly; public static readonly PreceptDef Bestiality_OnlyVenerated; public static readonly PreceptDef BabyFaction_AlwaysFather; From 032b031123e3ee533d09643d38c7505543a144e7 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 23 Apr 2023 16:41:27 +0500 Subject: [PATCH 13/19] Change VariousDefOf to RsiDefOf --- Source/IdeologyAddon/DebugAction.cs | 4 +- Source/IdeologyAddon/IdeoUtility.cs | 6 +- Source/IdeologyAddon/IdeologyAddon.csproj | 4 +- .../Patches/RJW_Patch_ChancePerHour.cs | 8 +-- .../IdeologyAddon/Patches/RJW_Patch_Ideo.cs | 18 ++--- .../IdeologyAddon/Patches/Rimworld_Patch.cs | 6 +- .../Patches/Sexperience_Patch.cs | 6 +- .../Rituals/JobGiver_DrugOrgy.cs | 6 +- .../Rituals/JobGiver_GangbangConsensual.cs | 6 +- .../Rituals/JobGiver_GangbangVictim.cs | 2 +- Source/IdeologyAddon/Rituals/RitualRoles.cs | 2 +- .../RomanceChanceFactorHelpers.cs | 6 +- Source/IdeologyAddon/RsiDefOf.cs | 65 +++++++++++++++++++ Source/IdeologyAddon/RsiHistoryEventDefOf.cs | 18 ----- Source/IdeologyAddon/RsiPreceptDefOf.cs | 16 ----- Source/IdeologyAddon/VariousDefOf.cs | 22 ------- 16 files changed, 101 insertions(+), 94 deletions(-) create mode 100644 Source/IdeologyAddon/RsiDefOf.cs delete mode 100644 Source/IdeologyAddon/RsiHistoryEventDefOf.cs delete mode 100644 Source/IdeologyAddon/RsiPreceptDefOf.cs delete mode 100644 Source/IdeologyAddon/VariousDefOf.cs diff --git a/Source/IdeologyAddon/DebugAction.cs b/Source/IdeologyAddon/DebugAction.cs index 91f5b20..f80e708 100644 --- a/Source/IdeologyAddon/DebugAction.cs +++ b/Source/IdeologyAddon/DebugAction.cs @@ -15,8 +15,8 @@ namespace RJWSexperience.Ideology Pawn hero = p.Map.PlayerPawnsForStoryteller.First(x => x.IsDesignatedHero()); if (hero == null) return; - RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(hero, p); - RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(p, hero); + RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(hero, p); + RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(p, hero); } [DebugAction("RJW Sexperience Ideology", "Manual romance check", false, true, actionType = DebugActionType.Action, allowedGameStates = AllowedGameStates.PlayingOnMap)] diff --git a/Source/IdeologyAddon/IdeoUtility.cs b/Source/IdeologyAddon/IdeoUtility.cs index 206b8eb..05ffd75 100644 --- a/Source/IdeologyAddon/IdeoUtility.cs +++ b/Source/IdeologyAddon/IdeoUtility.cs @@ -12,9 +12,9 @@ namespace RJWSexperience.Ideology if (ideo == null) return false; - if (ideo.HasPrecept(RsiPreceptDefOf.Submissive_Female) && pawn.gender == Gender.Female) + if (ideo.HasPrecept(RsiDefOf.Precept.Submissive_Female) && pawn.gender == Gender.Female) return true; - else if (ideo.HasPrecept(RsiPreceptDefOf.Submissive_Male) && pawn.gender == Gender.Male) + else if (ideo.HasPrecept(RsiDefOf.Precept.Submissive_Male) && pawn.gender == Gender.Male) return true; return false; @@ -89,7 +89,7 @@ namespace RJWSexperience.Ideology Hediff pregnancy = PregnancyHelper.GetPregnancy(pawn); // Currently RJW does not check Biotech pregnancy - if (pregnancy == null && VariousDefOf.PregnantHuman != null) + if (pregnancy == null && RsiDefOf.Hediff.PregnantHuman != null) { pregnancy = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.PregnantHuman); } diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index 63f6689..9f06941 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -63,8 +63,6 @@ - - @@ -95,7 +93,7 @@ - +
    diff --git a/Source/IdeologyAddon/Patches/RJW_Patch_ChancePerHour.cs b/Source/IdeologyAddon/Patches/RJW_Patch_ChancePerHour.cs index 2a22c2c..18d8550 100644 --- a/Source/IdeologyAddon/Patches/RJW_Patch_ChancePerHour.cs +++ b/Source/IdeologyAddon/Patches/RJW_Patch_ChancePerHour.cs @@ -15,7 +15,7 @@ namespace RJWSexperience.Ideology.Patches if (__result < 0f || pawn.Ideo == null) // ideo is null if don't have dlc return; - if (!RsiHistoryEventDefOf.RSI_SexWithAnimal.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiDefOf.HistoryEvent.RSI_SexWithAnimal.CreateEvent(pawn).DoerWillingToDo()) { __result = -2f; return; @@ -32,7 +32,7 @@ namespace RJWSexperience.Ideology.Patches if (__result < 0f || pawn.Ideo == null) // ideo is null if don't have dlc return; - if (!RsiHistoryEventDefOf.RSI_Raped.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiDefOf.HistoryEvent.RSI_Raped.CreateEvent(pawn).DoerWillingToDo()) { __result = -2f; return; @@ -48,7 +48,7 @@ namespace RJWSexperience.Ideology.Patches if (__result < 0f || pawn.Ideo == null) // ideo is null if don't have dlc return; - if (!RsiHistoryEventDefOf.RSI_SexWithCorpse.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiDefOf.HistoryEvent.RSI_SexWithCorpse.CreateEvent(pawn).DoerWillingToDo()) { __result = -2f; return; @@ -65,7 +65,7 @@ namespace RJWSexperience.Ideology.Patches if (__result < 0f || p.Ideo == null) // ideo is null if don't have dlc return; - if (!RsiHistoryEventDefOf.RSI_Masturbated.CreateEvent(p).DoerWillingToDo()) + if (!RsiDefOf.HistoryEvent.RSI_Masturbated.CreateEvent(p).DoerWillingToDo()) { __result = -2f; return; diff --git a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs index e52b361..239ce81 100644 --- a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs +++ b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs @@ -19,7 +19,7 @@ namespace RJWSexperience.Ideology.Patches Ideo ideo = pawn.Ideo; if (ideo != null && !pawn.IsSubmissive()) { - __result = __result || ideo.HasMeme(VariousDefOf.Rapist); + __result = __result || ideo.HasMeme(RsiDefOf.Meme.Rapist); } } } @@ -32,7 +32,7 @@ namespace RJWSexperience.Ideology.Patches Ideo ideo = pawn.Ideo; if (ideo != null) { - __result = __result || ideo.HasMeme(VariousDefOf.Zoophile); + __result = __result || ideo.HasMeme(RsiDefOf.Meme.Zoophile); } } } @@ -45,7 +45,7 @@ namespace RJWSexperience.Ideology.Patches Ideo ideo = pawn.Ideo; if (ideo != null) { - __result = __result || ideo.HasMeme(VariousDefOf.Necrophile); + __result = __result || ideo.HasMeme(RsiDefOf.Meme.Necrophile); } } } @@ -85,10 +85,10 @@ namespace RJWSexperience.Ideology.Patches private static void AfterSexHuman(Pawn human, Pawn partner) { - RsiHistoryEventDefOf.RSI_NonIncestuosSex.RecordEventWithPartner(human, partner); + RsiDefOf.HistoryEvent.RSI_NonIncestuosSex.RecordEventWithPartner(human, partner); if (partner.IsAnimal()) - RsiHistoryEventDefOf.RSI_SexWithAnimal.RecordEventWithPartner(human, partner); + RsiDefOf.HistoryEvent.RSI_SexWithAnimal.RecordEventWithPartner(human, partner); } } @@ -148,7 +148,7 @@ namespace RJWSexperience.Ideology.Patches public static void Postfix(Pawn pawn, ref bool __result) { Ideo ideo = pawn.Ideo; - if (ideo?.HasMeme(VariousDefOf.Zoophile) == true) + if (ideo?.HasMeme(RsiDefOf.Meme.Zoophile) == true) { SaveStorage.DataStore.GetPawnData(pawn).CanDesignateBreeding = true; __result = true; @@ -213,14 +213,14 @@ namespace RJWSexperience.Ideology.Patches Ideo mainideo = playerfaction.ideos.PrimaryIdeo; if (mainideo != null) { - if (mainideo.HasPrecept(RsiPreceptDefOf.BabyFaction_AlwaysFather)) + if (mainideo.HasPrecept(RsiDefOf.Precept.BabyFaction_AlwaysFather)) { Pawn parent = baby.GetFather() ?? baby.GetMother(); ideo = parent.Ideo; return parent.Faction; } - else if (mainideo.HasPrecept(RsiPreceptDefOf.BabyFaction_AlwaysColony)) + else if (mainideo.HasPrecept(RsiDefOf.Precept.BabyFaction_AlwaysColony)) { ideo = mainideo; return playerfaction; @@ -241,7 +241,7 @@ namespace RJWSexperience.Ideology.Patches if (props.pawn?.Ideo == null || !props.hasPartner()) return; - if (props.partner.Ideo?.HasPrecept(RsiPreceptDefOf.ProselyzingByOrgasm) == true) + if (props.partner.Ideo?.HasPrecept(RsiDefOf.Precept.ProselyzingByOrgasm) == true) { // Pawn is the one having the orgasm // Partner is "giving" the orgasm, hence the pawn will be converted towards the partners ideology diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index 9a54dd4..5bd03b3 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -16,8 +16,8 @@ namespace RJWSexperience.Ideology.Patches { public static void Postfix(Pawn firstPawn, Pawn secondPawn) { - RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(firstPawn, secondPawn); - RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(secondPawn, firstPawn); + RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(firstPawn, secondPawn); + RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(secondPawn, firstPawn); } } @@ -81,7 +81,7 @@ namespace RJWSexperience.Ideology.Patches /// 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); + PreceptDef incestuousPrecept = one.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == RsiDefOf.Issue.Incestuos); var allowManualRomanceOnlyFor = incestuousPrecept?.GetModExtension()?.allowManualRomanceOnlyFor; BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(one, two); diff --git a/Source/IdeologyAddon/Patches/Sexperience_Patch.cs b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs index 1be61cd..4f7471e 100644 --- a/Source/IdeologyAddon/Patches/Sexperience_Patch.cs +++ b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs @@ -15,11 +15,11 @@ namespace RJWSexperience.Ideology.Patches const int femaleAfterSurgery = 1; if (props.isRape && exVirgin == props.partner) - RsiHistoryEventDefOf.RSI_VirginStolen.RecordEventWithPartner(exVirgin, partner); + RsiDefOf.HistoryEvent.RSI_VirginStolen.RecordEventWithPartner(exVirgin, partner); else if (degree != femaleAfterSurgery) - RsiHistoryEventDefOf.RSI_VirginTaken.RecordEventWithPartner(exVirgin, partner); + RsiDefOf.HistoryEvent.RSI_VirginTaken.RecordEventWithPartner(exVirgin, partner); - RsiHistoryEventDefOf.RSI_TookVirgin.RecordEventWithPartner(partner, exVirgin); + RsiDefOf.HistoryEvent.RSI_TookVirgin.RecordEventWithPartner(partner, exVirgin); } } } diff --git a/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs index a7eacb0..ce0251d 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs @@ -32,9 +32,9 @@ namespace RJWSexperience.Ideology Pawn target = FindPartner(pawn, duty); - if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None,1)) return JobMaker.MakeJob(VariousDefOf.DrugMasturbate); + if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None,1)) return JobMaker.MakeJob(RsiDefOf.Job.DrugMasturbate); - return JobMaker.MakeJob(VariousDefOf.DrugSex, target); + return JobMaker.MakeJob(RsiDefOf.Job.DrugSex, target); } protected Pawn FindPartner(Pawn pawn, PawnDuty duty) @@ -65,7 +65,7 @@ namespace RJWSexperience.Ideology protected override IEnumerable MakeNewToils() { setup_ticks(); - var PartnerJob = VariousDefOf.GettinDrugSex; + var PartnerJob = RsiDefOf.Job.GettinDrugSex; this.FailOnDespawnedNullOrForbidden(iTarget); this.FailOn(() => !Partner.health.capacities.CanBeAwake); diff --git a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs index dc6dc15..48b4353 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs @@ -34,7 +34,7 @@ namespace RJWSexperience.Ideology if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; - return JobMaker.MakeJob(VariousDefOf.Gangbang, target); + return JobMaker.MakeJob(RsiDefOf.Job.Gangbang, target); } } @@ -65,7 +65,7 @@ namespace RJWSexperience.Ideology var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped; if (dri == null) { - Job gettin_loved = JobMaker.MakeJob(VariousDefOf.GettinGangbang, pawn, Bed); + Job gettin_loved = JobMaker.MakeJob(RsiDefOf.Job.GettinGangbang, pawn, Bed); Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced); } }; @@ -75,7 +75,7 @@ namespace RJWSexperience.Ideology SexToil.defaultCompleteMode = ToilCompleteMode.Never; SexToil.defaultDuration = duration; SexToil.handlingFacing = true; - SexToil.FailOn(() => Partner.CurJob.def != VariousDefOf.GettinGangbang); + SexToil.FailOn(() => Partner.CurJob.def != RsiDefOf.Job.GettinGangbang); SexToil.initAction = delegate { Start(); diff --git a/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs b/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs index ce2ec72..bc4bfdf 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs @@ -35,7 +35,7 @@ namespace RJWSexperience.Ideology if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; - return JobMaker.MakeJob(VariousDefOf.RapeVictim, target); + return JobMaker.MakeJob(RsiDefOf.Job.RapeVictim, target); } } diff --git a/Source/IdeologyAddon/Rituals/RitualRoles.cs b/Source/IdeologyAddon/Rituals/RitualRoles.cs index 691bb28..699f2d1 100644 --- a/Source/IdeologyAddon/Rituals/RitualRoles.cs +++ b/Source/IdeologyAddon/Rituals/RitualRoles.cs @@ -92,7 +92,7 @@ namespace RJWSexperience.Ideology public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept) { - if (precept != null && precept.ideo.HasPrecept(RsiPreceptDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) + if (precept != null && precept.ideo.HasPrecept(RsiDefOf.Precept.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) { return false; } diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs index bae549e..6d970f3 100644 --- a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs +++ b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs @@ -22,7 +22,7 @@ namespace RJWSexperience.Ideology if (!pawn.relations.FamilyByBlood.Contains(partner)) { - if (pawn.Ideo?.HasPrecept(RsiPreceptDefOf.Incestuos_IncestOnly) == true) + if (pawn.Ideo?.HasPrecept(RsiDefOf.Precept.Incestuos_IncestOnly) == true) { return parentRomanceChanceFactor; } @@ -32,7 +32,7 @@ namespace RJWSexperience.Ideology } } - PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos); + PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == RsiDefOf.Issue.Incestuos); IEnumerable relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation); foreach (PawnRelationDef relationDef in relations) { @@ -74,7 +74,7 @@ namespace RJWSexperience.Ideology { IEnumerable incestuousPrecepts = DefDatabase .AllDefsListForReading - .Where(def => def.issue == VariousDefOf.Incestuos); + .Where(def => def.issue == RsiDefOf.Issue.Incestuos); IEnumerable> preceptGetters = incestuousPrecepts .Select(precept => new TableDataGetter(precept.defName,(PawnRelationDef rel) => GetRomanceChanceFactor(rel, precept))); diff --git a/Source/IdeologyAddon/RsiDefOf.cs b/Source/IdeologyAddon/RsiDefOf.cs new file mode 100644 index 0000000..d5b0cfa --- /dev/null +++ b/Source/IdeologyAddon/RsiDefOf.cs @@ -0,0 +1,65 @@ +using RimWorld; +using Verse; + +namespace RJWSexperience.Ideology +{ + public static class RsiDefOf + { + [DefOf] + public static class Job + { + public static readonly JobDef RapeVictim; + public static readonly JobDef Gangbang; + public static readonly JobDef GettinGangbang; + public static readonly JobDef DrugSex; + public static readonly JobDef GettinDrugSex; + public static readonly JobDef DrugMasturbate; + } + + [DefOf] + public static class Meme + { + public static readonly MemeDef Zoophile; + public static readonly MemeDef Rapist; + public static readonly MemeDef Necrophile; + } + + [DefOf] + public static class Issue + { + public static readonly IssueDef Incestuos; + } + + [DefOf] + public static class Precept + { + public static readonly PreceptDef Incestuos_IncestOnly; + public static readonly PreceptDef Bestiality_OnlyVenerated; + public static readonly PreceptDef BabyFaction_AlwaysFather; + public static readonly PreceptDef BabyFaction_AlwaysColony; + public static readonly PreceptDef Submissive_Male; + public static readonly PreceptDef Submissive_Female; + public static readonly PreceptDef ProselyzingByOrgasm; + } + + [DefOf] + public static class HistoryEvent + { + public static readonly HistoryEventDef RSI_SexWithAnimal; + public static readonly HistoryEventDef RSI_Raped; + public static readonly HistoryEventDef RSI_NonIncestuosMarriage; + public static readonly HistoryEventDef RSI_NonIncestuosSex; + public static readonly HistoryEventDef RSI_SexWithCorpse; + public static readonly HistoryEventDef RSI_VirginTaken; + public static readonly HistoryEventDef RSI_VirginStolen; + public static readonly HistoryEventDef RSI_TookVirgin; + public static readonly HistoryEventDef RSI_Masturbated; + } + + [DefOf] + public static class Hediff + { + [MayRequireBiotech] public static readonly HediffDef PregnantHuman; + } + } +} diff --git a/Source/IdeologyAddon/RsiHistoryEventDefOf.cs b/Source/IdeologyAddon/RsiHistoryEventDefOf.cs deleted file mode 100644 index 4cb9bc7..0000000 --- a/Source/IdeologyAddon/RsiHistoryEventDefOf.cs +++ /dev/null @@ -1,18 +0,0 @@ -using RimWorld; - -namespace RJWSexperience.Ideology -{ - [DefOf] - public static class RsiHistoryEventDefOf - { - public static readonly HistoryEventDef RSI_SexWithAnimal; - public static readonly HistoryEventDef RSI_Raped; - public static readonly HistoryEventDef RSI_NonIncestuosMarriage; - public static readonly HistoryEventDef RSI_NonIncestuosSex; - public static readonly HistoryEventDef RSI_SexWithCorpse; - public static readonly HistoryEventDef RSI_VirginTaken; - public static readonly HistoryEventDef RSI_VirginStolen; - public static readonly HistoryEventDef RSI_TookVirgin; - public static readonly HistoryEventDef RSI_Masturbated; - } -} diff --git a/Source/IdeologyAddon/RsiPreceptDefOf.cs b/Source/IdeologyAddon/RsiPreceptDefOf.cs deleted file mode 100644 index 1638e76..0000000 --- a/Source/IdeologyAddon/RsiPreceptDefOf.cs +++ /dev/null @@ -1,16 +0,0 @@ -using RimWorld; - -namespace RJWSexperience.Ideology -{ - [DefOf] - public static class RsiPreceptDefOf - { - public static readonly PreceptDef Incestuos_IncestOnly; - public static readonly PreceptDef Bestiality_OnlyVenerated; - public static readonly PreceptDef BabyFaction_AlwaysFather; - public static readonly PreceptDef BabyFaction_AlwaysColony; - public static readonly PreceptDef Submissive_Male; - public static readonly PreceptDef Submissive_Female; - public static readonly PreceptDef ProselyzingByOrgasm; - } -} \ No newline at end of file diff --git a/Source/IdeologyAddon/VariousDefOf.cs b/Source/IdeologyAddon/VariousDefOf.cs deleted file mode 100644 index 19a104d..0000000 --- a/Source/IdeologyAddon/VariousDefOf.cs +++ /dev/null @@ -1,22 +0,0 @@ -using RimWorld; -using Verse; - -namespace RJWSexperience.Ideology -{ - [DefOf] - public static class VariousDefOf - { - public static readonly JobDef RapeVictim; - public static readonly JobDef Gangbang; - public static readonly JobDef GettinGangbang; - public static readonly JobDef DrugSex; - public static readonly JobDef GettinDrugSex; - public static readonly JobDef DrugMasturbate; - - public static readonly MemeDef Zoophile; - public static readonly MemeDef Rapist; - public static readonly MemeDef Necrophile; - public static readonly IssueDef Incestuos; - [MayRequireBiotech] public static readonly HediffDef PregnantHuman; - } -} From 670584500b87e43fdcd6bcbf179bd9ecb547f315 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 23 Apr 2023 17:15:07 +0500 Subject: [PATCH 14/19] Fix IDE messages --- Source/IdeologyAddon/DebugAction.cs | 4 +- .../IdeologyAddon/Patches/RJW_Patch_Ideo.cs | 6 +- .../Rituals/JobGiver_DrugOrgy.cs | 156 ++++++++-------- .../Rituals/JobGiver_GangbangConsensual.cs | 113 ++++++------ .../Rituals/JobGiver_GangbangVictim.cs | 83 ++++----- .../IdeologyAddon/Rituals/LordJob_Rituals.cs | 17 +- Source/IdeologyAddon/Rituals/RitualRoles.cs | 171 +++++++++--------- 7 files changed, 262 insertions(+), 288 deletions(-) diff --git a/Source/IdeologyAddon/DebugAction.cs b/Source/IdeologyAddon/DebugAction.cs index f80e708..55838d7 100644 --- a/Source/IdeologyAddon/DebugAction.cs +++ b/Source/IdeologyAddon/DebugAction.cs @@ -7,10 +7,10 @@ using Verse; namespace RJWSexperience.Ideology { - internal class DebugAction + internal static class DebugAction { [DebugAction("RJW Sexperience Ideology", "Test marriage event", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)] - private static void GenerateMarriageEvent(Pawn p) + public static void GenerateMarriageEvent(Pawn p) { Pawn hero = p.Map.PlayerPawnsForStoryteller.First(x => x.IsDesignatedHero()); if (hero == null) diff --git a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs index 239ce81..4a06922 100644 --- a/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs +++ b/Source/IdeologyAddon/Patches/RJW_Patch_Ideo.cs @@ -113,11 +113,13 @@ namespace RJWSexperience.Ideology.Patches public static float PreceptSextype(Pawn pawn, Pawn partner, float score, List historyEventDefs) { - foreach(HistoryEventDef eventDef in historyEventDefs) + for (int i = 0; i < historyEventDefs.Count; i++) { + HistoryEventDef eventDef = historyEventDefs[i]; + if (eventDef.CreateEventWithPartner(pawn, partner).DoerWillingToDo()) { - float mult = 8.0f * Math.Max(0.3f, 1 / Math.Max(0.01f, pawn.GetStatValue(xxx.sex_drive_stat))); + float mult = 8.0f * Math.Max(0.3f, 1 / Math.Max(0.01f, pawn.GetStatValue(xxx.sex_drive_stat, cacheStaleAfterTicks: 60))); return score * mult; } } diff --git a/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs index ce0251d..82a541e 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs @@ -1,56 +1,47 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using RimWorld; using rjw; +using System; +using System.Collections.Generic; using Verse; using Verse.AI; -using RimWorld; - namespace RJWSexperience.Ideology { - public class JobGiver_DrugOrgy : ThinkNode_JobGiver - { - protected override Job TryGiveJob(Pawn pawn) - { - if (pawn.Drafted) return null; - DutyDef dutyDef = null; - PawnDuty duty = null; - if (pawn.mindState != null) - { - duty = pawn.mindState.duty; - dutyDef = duty.def; - } - else return null; + public class JobGiver_DrugOrgy : ThinkNode_JobGiver + { + protected override Job TryGiveJob(Pawn pawn) + { + if (pawn.Drafted || pawn.mindState == null) + { + return null; + } - if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; - } - - Pawn target = FindPartner(pawn, duty); + PawnDuty duty = pawn.mindState.duty; - if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None,1)) return JobMaker.MakeJob(RsiDefOf.Job.DrugMasturbate); + if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; + } - return JobMaker.MakeJob(RsiDefOf.Job.DrugSex, target); - } + Pawn target = FindPartner(pawn, duty); - protected Pawn FindPartner(Pawn pawn, PawnDuty duty) - { - if (duty != null) - { - List pawns = pawn.Map.mapPawns.AllPawnsSpawned.FindAll(x => x.mindState?.duty?.def == duty.def); - return pawns.RandomElementByWeightWithDefault(x => SexAppraiser.would_fuck(pawn,x), 0.1f); - } - - + if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None, 1)) + return JobMaker.MakeJob(RsiDefOf.Job.DrugMasturbate); - return null; - } + return JobMaker.MakeJob(RsiDefOf.Job.DrugSex, target); + } - } + protected Pawn FindPartner(Pawn pawn, PawnDuty duty) + { + if (duty != null) + { + List pawns = pawn.Map.mapPawns.AllPawnsSpawned.FindAll(x => x.mindState?.duty?.def == duty.def); + return pawns.RandomElementByWeightWithDefault(x => SexAppraiser.would_fuck(pawn, x), 0.1f); + } + + return null; + } + } /// /// copied from rjw @@ -73,47 +64,52 @@ namespace RJWSexperience.Ideology this.FailOn(() => Partner == null); yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell); - Toil WaitForPartner = new Toil(); - WaitForPartner.defaultCompleteMode = ToilCompleteMode.Delay; - WaitForPartner.initAction = delegate + Toil WaitForPartner = new Toil { - ticksLeftThisToil = 5000; - }; - WaitForPartner.tickAction = delegate - { - pawn.GainComfortFromCellIfPossible(); - if (pawn.Position.DistanceTo(Partner.Position) <= 1f) + defaultCompleteMode = ToilCompleteMode.Delay, + initAction = delegate { - ReadyForNextToil(); + ticksLeftThisToil = 5000; + }, + tickAction = delegate + { + pawn.GainComfortFromCellIfPossible(); + if (pawn.Position.DistanceTo(Partner.Position) <= 1f) + { + ReadyForNextToil(); + } } }; yield return WaitForPartner; - Toil StartPartnerJob = new Toil(); - StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; - StartPartnerJob.socialMode = RandomSocialMode.Off; - StartPartnerJob.initAction = delegate + Toil StartPartnerJob = new Toil { - var dri = Partner.jobs.curDriver as JobDriver_DrugSexReceiver; - if (dri == null) - { - Job gettingQuickie = JobMaker.MakeJob(PartnerJob, pawn, Partner); - Partner.jobs.StartJob(gettingQuickie, JobCondition.InterruptForced); + defaultCompleteMode = ToilCompleteMode.Instant, + socialMode = RandomSocialMode.Off, + initAction = delegate + { + if (!(Partner.jobs.curDriver is JobDriver_DrugSexReceiver)) + { + Job gettingQuickie = JobMaker.MakeJob(PartnerJob, pawn, Partner); + Partner.jobs.StartJob(gettingQuickie, JobCondition.InterruptForced); + } } }; yield return StartPartnerJob; - Toil SexToil = new Toil(); - SexToil.defaultCompleteMode = ToilCompleteMode.Never; - SexToil.socialMode = RandomSocialMode.Off; - SexToil.defaultDuration = duration; - SexToil.handlingFacing = true; + Toil SexToil = new Toil + { + defaultCompleteMode = ToilCompleteMode.Never, + socialMode = RandomSocialMode.Off, + defaultDuration = duration, + handlingFacing = true + }; SexToil.FailOn(() => Partner.CurJob.def != PartnerJob); SexToil.initAction = delegate { Partner.pather.StopDead(); Partner.jobs.curDriver.asleep = false; - + Start(); Sexprops.usedCondom = CondomUtility.TryUseCondom(pawn) || CondomUtility.TryUseCondom(Partner); }; @@ -147,8 +143,7 @@ namespace RJWSexperience.Ideology /// copied from rjw /// public class JobDriver_DrugSexReceiver : JobDriver_SexBaseRecieverLoved - { - + { protected override IEnumerable MakeNewToils() { setup_ticks(); @@ -168,23 +163,25 @@ namespace RJWSexperience.Ideology yield return Toils_Reserve.Reserve(iTarget, 1, 0); - var get_loved = MakeSexToil(); - get_loved.handlingFacing = false; - yield return get_loved; + var get_loved = MakeSexToil(); + get_loved.handlingFacing = false; + yield return get_loved; } protected Toil MakeSexToil() { - Toil get_loved = new Toil(); - get_loved.defaultCompleteMode = ToilCompleteMode.Never; - get_loved.socialMode = RandomSocialMode.Off; - get_loved.handlingFacing = true; - get_loved.tickAction = delegate + Toil get_loved = new Toil { + defaultCompleteMode = ToilCompleteMode.Never, + socialMode = RandomSocialMode.Off, + handlingFacing = true, + tickAction = delegate + { + } }; get_loved.AddEndCondition(new Func(() => { - if (parteners.Count <= 0) + if (parteners.Count == 0) { return JobCondition.Succeeded; } @@ -204,8 +201,7 @@ namespace RJWSexperience.Ideology /// copied from rjw /// public class JobDriver_DrugMasturabate : JobDriver_Masturbate - { - + { protected override IEnumerable MakeNewToils() { setup_ticks(); @@ -252,6 +248,4 @@ namespace RJWSexperience.Ideology }; } } - - } diff --git a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs index 48b4353..eae27e5 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs @@ -1,43 +1,36 @@ -using System; +using RimWorld; +using rjw; +using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Verse; using Verse.AI; -using Verse.AI.Group; -using RimWorld; -using rjw; namespace RJWSexperience.Ideology { - public class JobGiver_GangbangConsensual : ThinkNode_JobGiver - { - protected override Job TryGiveJob(Pawn pawn) - { - if (pawn.Drafted) return null; - DutyDef dutyDef = null; - PawnDuty duty = null; - if (pawn.mindState != null) - { - duty = pawn.mindState.duty; - dutyDef = duty.def; - } - else return null; + public class JobGiver_GangbangConsensual : ThinkNode_JobGiver + { + protected override Job TryGiveJob(Pawn pawn) + { + if (pawn.Drafted || pawn.mindState == null) + { + return null; + } - if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; - } + PawnDuty duty = pawn.mindState.duty; - Pawn target = duty.focusSecond.Pawn; + if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; + } - if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; + Pawn target = duty.focusSecond.Pawn; - return JobMaker.MakeJob(RsiDefOf.Job.Gangbang, target); - } - } + if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) + return null; + return JobMaker.MakeJob(RsiDefOf.Job.Gangbang, target); + } + } public class JobDriver_Gangbang : JobDriver_SexBaseInitiator { @@ -56,25 +49,27 @@ namespace RJWSexperience.Ideology this.FailOn(() => Partner.Drafted); yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell); - Toil StartPartnerJob = new Toil(); - StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; - StartPartnerJob.socialMode = RandomSocialMode.Off; - StartPartnerJob.initAction = delegate + Toil StartPartnerJob = new Toil { - - var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped; - if (dri == null) - { - Job gettin_loved = JobMaker.MakeJob(RsiDefOf.Job.GettinGangbang, pawn, Bed); - Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced); + defaultCompleteMode = ToilCompleteMode.Instant, + socialMode = RandomSocialMode.Off, + initAction = delegate + { + if (!(Partner.jobs.curDriver is JobDriver_SexBaseRecieverRaped)) + { + Job gettin_loved = JobMaker.MakeJob(RsiDefOf.Job.GettinGangbang, pawn, Bed); + Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced); + } } }; yield return StartPartnerJob; - Toil SexToil = new Toil(); - SexToil.defaultCompleteMode = ToilCompleteMode.Never; - SexToil.defaultDuration = duration; - SexToil.handlingFacing = true; + Toil SexToil = new Toil + { + defaultCompleteMode = ToilCompleteMode.Never, + defaultDuration = duration, + handlingFacing = true + }; SexToil.FailOn(() => Partner.CurJob.def != RsiDefOf.Job.GettinGangbang); SexToil.initAction = delegate { @@ -108,28 +103,30 @@ namespace RJWSexperience.Ideology } public class JobDriver_GangbangReceiver : JobDriver_SexBaseRecieverLoved - { + { protected override IEnumerable MakeNewToils() { setup_ticks(); parteners.Add(Partner);// add job starter, so this wont fail, before Initiator starts his job - Toil get_banged = new Toil(); - get_banged.defaultCompleteMode = ToilCompleteMode.Never; - get_banged.handlingFacing = true; - get_banged.initAction = delegate + Toil get_banged = new Toil { - pawn.pather.StopDead(); - pawn.jobs.curDriver.asleep = false; - }; - get_banged.tickAction = delegate - { - if ((parteners.Count > 0) && pawn.IsHashIntervalTick(ticks_between_hearts / parteners.Count) && pawn.IsHashIntervalTick(ticks_between_hearts)) - ThrowMetaIconF(pawn.Position, pawn.Map, FleckDefOf.Heart); + defaultCompleteMode = ToilCompleteMode.Never, + handlingFacing = true, + initAction = delegate + { + pawn.pather.StopDead(); + pawn.jobs.curDriver.asleep = false; + }, + tickAction = delegate + { + if ((parteners.Count > 0) && pawn.IsHashIntervalTick(ticks_between_hearts / parteners.Count) && pawn.IsHashIntervalTick(ticks_between_hearts)) + ThrowMetaIconF(pawn.Position, pawn.Map, FleckDefOf.Heart); + } }; get_banged.AddEndCondition(new Func(() => { - if (parteners.Count <= 0) + if (parteners.Count == 0) { return JobCondition.Succeeded; } @@ -148,12 +145,12 @@ namespace RJWSexperience.Ideology Partner.jobs.jobQueue.EnqueueFirst(tobed); } else if (pawn.HostileTo(Partner)) + { pawn.health.AddHediff(xxx.submitting); + } }); get_banged.socialMode = RandomSocialMode.Off; yield return get_banged; - } } - } diff --git a/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs b/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs index bc4bfdf..092b00b 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs @@ -1,56 +1,46 @@ -using System; +using RimWorld; +using rjw; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Verse; using Verse.AI; -using Verse.AI.Group; -using RimWorld; -using rjw; - namespace RJWSexperience.Ideology { - public class JobGiver_GangbangVictim : ThinkNode_JobGiver - { - protected override Job TryGiveJob(Pawn pawn) - { - if (pawn.Drafted) return null; - DutyDef dutyDef = null; - PawnDuty duty = null; - if (pawn.mindState != null) - { - duty = pawn.mindState.duty; - dutyDef = duty.def; - } - else return null; + public class JobGiver_GangbangVictim : ThinkNode_JobGiver + { + protected override Job TryGiveJob(Pawn pawn) + { + if (pawn.Drafted || pawn.mindState == null) + { + return null; + } - if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; + PawnDuty duty = pawn.mindState.duty; + + if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; } Pawn target = duty.focusSecond.Pawn; - if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; - - return JobMaker.MakeJob(RsiDefOf.Job.RapeVictim, target); - } - } + if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; + return JobMaker.MakeJob(RsiDefOf.Job.RapeVictim, target); + } + } /// /// copied from rjw /// public class JobDriver_RapeVictim : JobDriver_Rape { - public override bool TryMakePreToilReservations(bool errorOnFailed) - { + public override bool TryMakePreToilReservations(bool errorOnFailed) + { return true; - } + } - protected override IEnumerable MakeNewToils() + protected override IEnumerable MakeNewToils() { if (RJWSettings.DebugRape) ModLog.Message("" + this.GetType().ToString() + "::MakeNewToils() called"); setup_ticks(); @@ -64,25 +54,28 @@ namespace RJWSexperience.Ideology SexUtility.RapeTargetAlert(pawn, Partner); - Toil StartPartnerJob = new Toil(); - StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; - StartPartnerJob.socialMode = RandomSocialMode.Off; - StartPartnerJob.initAction = delegate + Toil StartPartnerJob = new Toil { - var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped; - if (dri == null) + defaultCompleteMode = ToilCompleteMode.Instant, + socialMode = RandomSocialMode.Off, + initAction = delegate { - Job gettin_raped = JobMaker.MakeJob(PartnerJob, pawn); + if (!(Partner.jobs.curDriver is JobDriver_SexBaseRecieverRaped)) + { + Job gettin_raped = JobMaker.MakeJob(PartnerJob, pawn); - Partner.jobs.StartJob(gettin_raped, JobCondition.InterruptForced, null, false, true, null); + Partner.jobs.StartJob(gettin_raped, JobCondition.InterruptForced, null, false, true, null); + } } }; yield return StartPartnerJob; - Toil SexToil = new Toil(); - SexToil.defaultCompleteMode = ToilCompleteMode.Never; - SexToil.defaultDuration = duration; - SexToil.handlingFacing = true; + Toil SexToil = new Toil + { + defaultCompleteMode = ToilCompleteMode.Never, + defaultDuration = duration, + handlingFacing = true + }; SexToil.FailOn(() => Partner.CurJob.def != PartnerJob); SexToil.initAction = delegate { diff --git a/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs b/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs index e976d61..b496689 100644 --- a/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs +++ b/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs @@ -1,21 +1,15 @@ -using System; +using RimWorld; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Verse; -using Verse.AI; -using RimWorld; - namespace RJWSexperience.Ideology { - public class LordJob_Ritual_Gangbang : LordJob_Ritual - { + public class LordJob_Ritual_Gangbang : LordJob_Ritual + { public LordJob_Ritual_Gangbang() { } - public LordJob_Ritual_Gangbang(string targetID ,TargetInfo selectedTarget, Precept_Ritual ritual, RitualObligation obligation, List allStages, RitualRoleAssignments assignments, Pawn organizer = null) : base(selectedTarget, ritual, obligation, allStages, assignments, organizer) - { + public LordJob_Ritual_Gangbang(string targetID, TargetInfo selectedTarget, Precept_Ritual ritual, RitualObligation obligation, List allStages, RitualRoleAssignments assignments, Pawn organizer = null) : base(selectedTarget, ritual, obligation, allStages, assignments, organizer) + { foreach (RitualRole ritualRole in assignments.AllRolesForReading) { if (ritualRole != null && ritualRole.id.Contains(targetID)) @@ -25,6 +19,5 @@ namespace RJWSexperience.Ideology } } } - } } diff --git a/Source/IdeologyAddon/Rituals/RitualRoles.cs b/Source/IdeologyAddon/Rituals/RitualRoles.cs index 699f2d1..e7fb7fc 100644 --- a/Source/IdeologyAddon/Rituals/RitualRoles.cs +++ b/Source/IdeologyAddon/Rituals/RitualRoles.cs @@ -1,106 +1,101 @@ using RimWorld; -using Verse; using rjw; +using Verse; namespace RJWSexperience.Ideology { - public class RitualRole_RapeVictim : RitualRole - { - public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) - { - reason = null; - return false; - } - - public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) - { - reason = null; - if (CanBeVictim(p)) return true; - if (!skipReason) - { - reason = Keyed.RSVictimCondition; - } - return false; - } + public class RitualRole_RapeVictim : RitualRole + { + public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) + { + reason = null; + return false; + } - public static bool CanBeVictim(Pawn pawn) - { - if (pawn.IsPrisonerOfColony || pawn.IsSlaveOfColony) return true; - if (pawn.IsSubmissive()) return true; - if (pawn.IsDesignatedComfort() || (pawn.guilt != null && pawn.guilt.IsGuilty) || (pawn.apparel != null && pawn.apparel.PsychologicallyNude)) return true; - return false; - } - } + public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) + { + reason = null; + if (CanBeVictim(p)) return true; + if (!skipReason) + { + reason = Keyed.RSVictimCondition; + } + return false; + } - public class RitualRole_HumanBreedee : RitualRole - { - public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) - { - reason = null; - return false; - } + public static bool CanBeVictim(Pawn pawn) + { + if (pawn.IsPrisonerOfColony || pawn.IsSlaveOfColony) return true; + if (pawn.IsSubmissive()) return true; + if (pawn.IsDesignatedComfort() || (pawn.guilt != null && pawn.guilt.IsGuilty) || (pawn.apparel != null && pawn.apparel.PsychologicallyNude)) return true; + return false; + } + } - public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) - { - - reason = null; - if (!xxx.is_human(p)) - { - reason = Keyed.RSNotHuman; - return false; - } - if (CanBeBreedee(p)) return true; - if (!skipReason) - { - reason = Keyed.RSShouldCanFuck; - } - return false; - } + public class RitualRole_HumanBreedee : RitualRole + { + public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) + { + reason = null; + return false; + } - public static bool CanBeBreedee(Pawn pawn) - { - if (xxx.can_be_fucked(pawn)) return true; - return false; - } - } + public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) + { + reason = null; + if (!xxx.is_human(p)) + { + reason = Keyed.RSNotHuman; + return false; + } + if (CanBeBreedee(p)) return true; + if (!skipReason) + { + reason = Keyed.RSShouldCanFuck; + } + return false; + } - public class RitualRole_AnimalBreeder : RitualRole - { - public override bool Animal => true; + public static bool CanBeBreedee(Pawn pawn) => xxx.can_be_fucked(pawn); + } - public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) - { - reason = null; - return false; - } + public class RitualRole_AnimalBreeder : RitualRole + { + public override bool Animal => true; - public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) - { - reason = null; - if (!p.IsAnimal()) - { - reason = Keyed.RSNotAnimal; - return false; - } - if (CanBeBreeder(p, assignments?.Ritual)) return true; - if (!skipReason) - { - reason = Keyed.RSBreederCondition; - } - return false; - } + public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false) + { + reason = null; + return false; + } - public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept) - { + public override bool AppliesToPawn(Pawn p, out string reason, TargetInfo selectedTarget, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false) + { + reason = null; + if (!p.IsAnimal()) + { + reason = Keyed.RSNotAnimal; + return false; + } + if (CanBeBreeder(p, assignments?.Ritual)) return true; + if (!skipReason) + { + reason = Keyed.RSBreederCondition; + } + return false; + } + + public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept) + { if (precept != null && precept.ideo.HasPrecept(RsiDefOf.Precept.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) { return false; } - if (!xxx.can_rape(animal)) return false; - return true; - } - - } - - + if (!xxx.can_rape(animal)) + { + return false; + } + return true; + } + } } From 77dd1a23d62bf9804650beeb8b52c78184ac9b37 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Mon, 24 Apr 2023 10:59:04 +0500 Subject: [PATCH 15/19] Swapped baseMoodEffect of holy and elevated pregnancy precepts --- 1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml b/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml index 7e5b69f..bdd6015 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml @@ -100,14 +100,14 @@ - Pregnancy_Respected_Pregnant + Pregnancy_Respected_Pregnant RJWSexperience.Ideology.PreceptWorkers.ThoughtWorker_Precept_Pregnant Thought_Situational
  • I am pregnant. This makes me a pillar of society. - 5 + 10
  • @@ -120,19 +120,19 @@
  • I am soon making our colony stronger. - 10 + 5
  • - Pregnancy_Respected_Pregnant_Social + Pregnancy_Respected_Pregnant_Social RJWSexperience.Ideology.PreceptWorkers.ThoughtWorker_Precept_Pregnant_Social Thought_SituationalSocial
  • - 10 + 20
  • @@ -144,7 +144,7 @@
  • - 20 + 10
  • From e622b7a3916099017ac270b9c989861dd2e4a2b3 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 25 Jun 2023 18:54:32 +0500 Subject: [PATCH 16/19] Added settings for romance patches Added in-game explanation for DefExtension_ModifyMtb effect --- Languages/English/Keyed/RJW_Sexperience.xml | 12 +- Source/IdeologyAddon/IdeologyAddon.csproj | 5 +- Source/IdeologyAddon/Keyed.cs | 6 + .../IdeologyAddon/Patches/Rimworld_Patch.cs | 124 +++++++++++++----- .../DefExtension_ModifyBestialityMtb.cs | 1 + .../Precepts/DefExtension_ModifyFappinMtb.cs | 1 + .../Precepts/DefExtension_ModifyMtb.cs | 23 +++- .../Precepts/DefExtension_ModifyNecroMtb.cs | 1 + .../Precepts/DefExtension_ModifyRapeCPMtb.cs | 1 + .../Precepts/IPreceptTipPostfix.cs | 7 + Source/IdeologyAddon/RsiMod.cs | 26 ++++ Source/IdeologyAddon/RsiSettings.cs | 17 +++ 12 files changed, 189 insertions(+), 35 deletions(-) create mode 100644 Source/IdeologyAddon/Precepts/IPreceptTipPostfix.cs create mode 100644 Source/IdeologyAddon/RsiMod.cs create mode 100644 Source/IdeologyAddon/RsiSettings.cs diff --git a/Languages/English/Keyed/RJW_Sexperience.xml b/Languages/English/Keyed/RJW_Sexperience.xml index 92fe2bc..83d2026 100644 --- a/Languages/English/Keyed/RJW_Sexperience.xml +++ b/Languages/English/Keyed/RJW_Sexperience.xml @@ -9,6 +9,16 @@ not animal capable of sex is required + Enable romance patch for incest precepts* + Patch for incest precepts to affect RomanceChanceFactor. May conflict with romance mods./n/n* Requires a game restart to apply changes + Enable manual romance patch for incest precepts* + Patch for incest precepts to affect manual romance options./n/n* Requires a game restart to apply changes + + Time between bestiality attempts x{0} + Time between masturbation attempts x{0} + Time between necrophilia attempts x{0} + Time between rape attempts x{0} + - forbidden by ideology + \ No newline at end of file diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index 9f06941..f791556 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -54,6 +54,7 @@ + @@ -87,6 +88,8 @@ + + @@ -97,7 +100,7 @@
    - 1.4.3555 + 1.4.3704 2.2.2 diff --git a/Source/IdeologyAddon/Keyed.cs b/Source/IdeologyAddon/Keyed.cs index 8a98c01..4083479 100644 --- a/Source/IdeologyAddon/Keyed.cs +++ b/Source/IdeologyAddon/Keyed.cs @@ -4,11 +4,17 @@ namespace RJWSexperience.Ideology { public static class Keyed { + public static readonly string ModTitle = "RSI_Mod_Title".Translate(); public static readonly string MemeStatFactor = "MemeStatFactor".Translate(); public static readonly string RSVictimCondition = "RSVictimCondition".Translate(); public static readonly string RSBreederCondition = "RSBreederCondition".Translate(); public static readonly string RSNotHuman = "RSNotHuman".Translate(); public static readonly string RSNotAnimal = "RSNotAnimal".Translate(); public static readonly string RSShouldCanFuck = "RSShouldCanFuck".Translate(); + + public static readonly string PatchRomanceChanceFactor = "RSI_PatchRomanceChanceFactor".Translate(); + public static readonly string PatchRomanceChanceFactorTip = "RSI_PatchRomanceChanceFactorTip".Translate(); + public static readonly string PatchIncestuousManualRomance = "RSI_PatchIncestuousManualRomance".Translate(); + public static readonly string PatchIncestuousManualRomanceTip = "RSI_PatchIncestuousManualRomanceTip".Translate(); } } diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index 5bd03b3..8d4498a 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Emit; +using System.Text; using Verse; namespace RJWSexperience.Ideology.Patches @@ -60,6 +61,8 @@ namespace RJWSexperience.Ideology.Patches [HarmonyPatch(typeof(RelationsUtility), "Incestuous")] public static class Rimworld_Patch_IncestuousManualRomance { + public static bool Prepare() => RsiMod.Prefs.patchIncestuousManualRomance; + /// /// Override incestuous check in the manual romance /// @@ -97,6 +100,8 @@ namespace RJWSexperience.Ideology.Patches [HarmonyPatch(typeof(Pawn_RelationsTracker), nameof(Pawn_RelationsTracker.SecondaryRomanceChanceFactor))] public static class Rimworld_Patch_SecondaryRomanceChanceFactor { + public static bool Prepare() => RsiMod.Prefs.patchRomanceChanceFactor; + /// /// /// Replace @@ -124,9 +129,6 @@ namespace RJWSexperience.Ideology.Patches typeof(RomanceChanceFactorHelpers), nameof(RomanceChanceFactorHelpers.GetRomanceChanceFactor), new[] { typeof(Pawn), typeof(Pawn) }); - bool skipping = false; - bool yieldNext = false; - bool finished = false; // Original IL looks something like this: // Load this.pawn @@ -142,41 +144,103 @@ namespace RJWSexperience.Ideology.Patches // Idea is to substitute GetRelations call with a method with the same signature, // store results in the same place original loop does and remove everything else until Endfinaly - foreach (CodeInstruction instruction in instructions) + IEnumerator enumerator = instructions.GetEnumerator(); + bool endOfInstructions = enumerator.MoveNext(); + + // Find and replace GetRelations + while (!endOfInstructions) { - if (finished) - { - yield return instruction; - continue; - } - - if (skipping) - { - if (yieldNext) - { - yield return instruction; - yieldNext = false; - } - else if (instruction.opcode == OpCodes.Mul) - { - yieldNext = true; - } - else if (instruction.opcode == OpCodes.Endfinally) - { - finished = true; - } - - continue; - } + var instruction = enumerator.Current; if (instruction.Calls(getRelationsInfo)) { yield return new CodeInstruction(OpCodes.Call, helperInfo); - skipping = true; - continue; + enumerator.MoveNext(); // skip original method call + break; } yield return instruction; + endOfInstructions = enumerator.MoveNext(); + } + + if (endOfInstructions) + { + Log.Error("[RSI] Failed to transpile Pawn_RelationsTracker.SecondaryRomanceChanceFactor: PawnRelationUtility.GetRelations call not found"); + yield break; + } + + // Skip everything until Mul + while (!endOfInstructions) + { + if (enumerator.Current.opcode == OpCodes.Mul) + { + enumerator.MoveNext(); // skip Mul + yield return enumerator.Current; // return next op, it should be "store result" + break; + } + + endOfInstructions = enumerator.MoveNext(); + } + + if (endOfInstructions) + { + Log.Error("[RSI] Failed to transpile Pawn_RelationsTracker.SecondaryRomanceChanceFactor: Mul not found. This error means half of SecondaryRomanceChanceFactor was erased. Very not good"); + yield break; + } + + // Skip the rest of the loop + while (!endOfInstructions) + { + if (enumerator.Current.opcode == OpCodes.Endfinally) + { + // Endfinally will be skipped by the next MoveNext() + break; + } + + endOfInstructions = enumerator.MoveNext(); + } + + if (endOfInstructions) + { + Log.Error("[RSI] Failed to transpile Pawn_RelationsTracker.SecondaryRomanceChanceFactor: Endfinally not found. This error means half of SecondaryRomanceChanceFactor was erased. Very not good"); + yield break; + } + + // Return the rest of the method + while (enumerator.MoveNext()) + { + yield return enumerator.Current; + } + } + + [HarmonyPatch(typeof(Precept), nameof(Precept.GetTip))] + public static class Rimworld_Patch_PreceptTip + { + public static void Postfix(ref string __result, Precept __instance) + { + if (__instance.def.modExtensions.NullOrEmpty()) + { + return; + } + + bool tipChanged = false; + StringBuilder tipBuilder = new StringBuilder(__result); + tipBuilder.AppendLine(); + tipBuilder.AppendInNewLine((Keyed.ModTitle + ":").Colorize(ColoredText.TipSectionTitleColor)); + + for (int i = 0; i < __instance.def.modExtensions.Count; i++) + { + if (__instance.def.modExtensions[i] is IPreceptTipPostfix tipPostfix) + { + tipBuilder.AppendInNewLine(" - " + tipPostfix.GetTip()); + tipChanged = true; + } + } + + if (tipChanged) + { + __result = tipBuilder.ToString(); + } } } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs index 1d97595..111ee69 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs @@ -2,5 +2,6 @@ { public class DefExtension_ModifyBestialityMtb : DefExtension_ModifyMtb { + protected override string TipTemplateKey => "RSI_PreceptTipModifyBestialityMtb"; } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs index 8596b28..f01c4ed 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs @@ -2,5 +2,6 @@ { public class DefExtension_ModifyFappinMtb : DefExtension_ModifyMtb { + protected override string TipTemplateKey => "RSI_PreceptTipModifyFappinMtb"; } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs index e1553f3..361ceb1 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs @@ -1,11 +1,28 @@ -using System.Diagnostics.CodeAnalysis; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Verse; namespace RJWSexperience.Ideology.Precepts { - public abstract class DefExtension_ModifyMtb : DefModExtension + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field values are loaded from XML")] + public abstract class DefExtension_ModifyMtb : DefModExtension, IPreceptTipPostfix { - [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] + protected abstract string TipTemplateKey { get; } + public float multiplier = 1f; + + public string GetTip() => TipTemplateKey.Translate(multiplier.ToString()); + + public override IEnumerable ConfigErrors() + { + if (multiplier == 1f) + { + yield return "There is no point if is 1"; + } + else if (multiplier <= 0f) + { + yield return " must be > 0"; + } + } } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs index 3e544f7..ce35b27 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs @@ -2,5 +2,6 @@ { public class DefExtension_ModifyNecroMtb : DefExtension_ModifyMtb { + protected override string TipTemplateKey => "RSI_PreceptTipModifyNecroMtb"; } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs index e83be70..ff09728 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs @@ -2,5 +2,6 @@ { public class DefExtension_ModifyRapeCPMtb : DefExtension_ModifyMtb { + protected override string TipTemplateKey => "RSI_PreceptTipModifyRapeCPMtb"; } } diff --git a/Source/IdeologyAddon/Precepts/IPreceptTipPostfix.cs b/Source/IdeologyAddon/Precepts/IPreceptTipPostfix.cs new file mode 100644 index 0000000..85411fb --- /dev/null +++ b/Source/IdeologyAddon/Precepts/IPreceptTipPostfix.cs @@ -0,0 +1,7 @@ +namespace RJWSexperience.Ideology.Precepts +{ + public interface IPreceptTipPostfix + { + string GetTip(); + } +} diff --git a/Source/IdeologyAddon/RsiMod.cs b/Source/IdeologyAddon/RsiMod.cs new file mode 100644 index 0000000..66dab60 --- /dev/null +++ b/Source/IdeologyAddon/RsiMod.cs @@ -0,0 +1,26 @@ +using UnityEngine; +using Verse; + +namespace RJWSexperience.Ideology +{ + public class RsiMod : Mod + { + public static RsiSettings Prefs { get; private set; } + + public RsiMod(ModContentPack content) : base(content) + { + Prefs = GetSettings(); + } + + public override string SettingsCategory() => Keyed.ModTitle; + + public override void DoSettingsWindowContents(Rect inRect) + { + Listing_Standard listmain = new Listing_Standard(); + listmain.Begin(inRect); + listmain.CheckboxLabeled(Keyed.PatchRomanceChanceFactor, ref Prefs.patchRomanceChanceFactor, Keyed.PatchRomanceChanceFactorTip); + listmain.CheckboxLabeled(Keyed.PatchIncestuousManualRomance, ref Prefs.patchIncestuousManualRomance, Keyed.PatchIncestuousManualRomanceTip); + listmain.End(); + } + } +} diff --git a/Source/IdeologyAddon/RsiSettings.cs b/Source/IdeologyAddon/RsiSettings.cs new file mode 100644 index 0000000..215b625 --- /dev/null +++ b/Source/IdeologyAddon/RsiSettings.cs @@ -0,0 +1,17 @@ +using Verse; + +namespace RJWSexperience.Ideology +{ + public class RsiSettings : ModSettings + { + public bool patchRomanceChanceFactor; + public bool patchIncestuousManualRomance; + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref patchRomanceChanceFactor, "patchSecondaryRomanceChanceFactor", true); + Scribe_Values.Look(ref patchIncestuousManualRomance, "patchIncestuousManualRomance", true); + } + } +} From a19953c6884bf9a8c42931f4c8f375ad76416874 Mon Sep 17 00:00:00 2001 From: amevarashi Date: Sun, 25 Jun 2023 19:12:12 +0500 Subject: [PATCH 17/19] 1.0.2.0 --- 1.4/Assemblies/RJWSexperience.Ideology.dll | Bin 52224 -> 67584 bytes About/Manifest.xml | 2 +- CHANGELOG.md | 10 ++++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/1.4/Assemblies/RJWSexperience.Ideology.dll b/1.4/Assemblies/RJWSexperience.Ideology.dll index ab82b7accd647192ebff73664d5f4a3d2e4f586c..a63afc4417549704e8297b128d9be55eceadb2bf 100644 GIT binary patch literal 67584 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®# z|7dg)#=R^2+B*rS52}!etMIR(RUzM2;nZ*yy?}q`!h_Gt_*nQnkIxI(X5r)?Xs3gA zI%ubZRt;J;Xw{%qgH{dNe9-2DHXpS4pv?!3f1YjuXbV7F0NMi3>Tq7G4zxO)%&G&e z4zvJh0nh@V1wadc)`(x=ZUn87((rj6pBM03TPgUwj87sy&*Sp~PA8?{^D;h(_&kr# z3pk^cg3rtNB;xZtJ}=;m7{8740y^-!>RiqS#OYwbWSl8sI7VQlz?lN81l9wZQ8Ed(dlu8o4!wRe-tFs-2F##%hh%;CSjeWEjeOu%}q9^&Bz^|GvYYeUoXO z_GhfES4yp3BGX^!PwTAbU4gp*7ZJmtz+9SXFqbLGR240U@rH<7!RZ`m_L^^I-$0q> zsN9V>74xQVGi94IhdxR9<_FpPLBFi%J1R9(JwJk;?)@ES!)=mS| z=rkJaK2ys!wUQ>l;)=_)VWvOxCaq4mp9madHl#nURhk8*&uG8WKl8Q$ZYX*~n`!1{ zzoTi|2%IdaG(*XsYYnux@Eh%*)T%PM7d7TzD}KEHz zZu<2`LHtJ8xwtSxZ^chX=ISk|yO~xA%r@&XPSn?#cV;fpz1l5(S^?7%R_RxoKleTd z8oEpCpA5NH*R=i_H|uMq)+GYD)>i!*@z_n`J+H=Zo3A$$`uwWjNuCV9@qkD^Ch$4H z+1ge>4R40nCvS?(X1XM<5Z_<^zfs=W3-0!tBj}3ds445G$So@11MJf&4yQB znRPp$HRvAW1+yyi5o4G6q;soLDlt$gaKE`C_jco;$?v5%)4looj9<-n^1e0pn-knW zi2N_0>~yA^o9VC4;pQ;3HO8#e%E~p`Z$4c#(ad&yk9Rd*V^6PEeZToi=82};c%^)< zx!;_I(K%>-hNt$G+VA*z8n^N6(9_N9rQOYRUcWjs-{E&-hh~16-Kv*5_7~NgyXmGO zXQA$vfzN2e9FJwL!td*h&01@YaTJwb1p05*<)&sV=)D2fewz2FIn$Au_mo-X*qZ;m zS>t#xU!!`*rs2%>;oa6U$1mN+z~;M$AWlqI>WgNp%u&>v{cuA`nUyJZv!igNwORW$=|pQY^&eJ9UTd*? zCd%)ZS6P`>;s6I_>ka8=So!+x1+|deR@`8HqMcc^%*r+w40@8D)~rEc>s{#)Q`TD9 z)ly=>-myZs78m9(Z@<-K{-cA{-8gsN^9|Oo=uPSH1R9=uO#5^ zQTn18U${3IRo2@*HW;61Z8)8rua##fIW_J29;r^v_#nB5vmUKy1AgNFRj;vlMCz@F zdlxxttnb}}o%I&S{A!)w^ewY~%pB!hE!JMCUzAZuSL!P=ra4Qk-v`ZcZgOZPRnUAO zXQ6YmoR(^}e)cYNt`qse+M-^UqxFXL_0GW>&yLO5som~eZ7qjaS6gd_--Gg@ArCm$ zSqICvI>#f=pW&DyepqMy;ok*%rE`~aig@5kYf;7Do!47@cIGyHDPrjpx!0Z}n&(Jc zbHoF;Sq>&;r6ciT)~c*eRm zIb0=^Tu)o?WK4(T9f=OQ-sqops_Qg~fzxF4Pm@S^!8(vt+2)`%+PmNNtF_kocbDdzo`IR@ zTvgtRe4gVjq$+E<^Jma61jTD!+1J8v5Z~N4&b`{|likgoZ+7q3!|itdGtY8wrpFQ0 znbr>jv)q}^aK9mdmjGrvmv$fF_8M;?p7WhI4?n}b+Td7f5UU!*+YQpk7U|>l=3lbM zx*9ajDlO9AW#*54&vBPpd&<|j*I^Y-#&^9q5>{!vx@{+(P1}iQ)>@&gGp`>0qWco< zo}v!{-}LQtuN8QutR|c3G6J(~Cr_jnoo*Nk5ie|5iRtmsaj7i6t}SKw;~ z)<@4ZV&_c~U3ZF|4`|-hVRQ}b9Ot=H?7T)>mwKXSzwy0)j%TLxOPt`VbdJcZ0;K^b z`*s;K04trxXSRBVStH^*Ksm?Xs@FJwElqT7vNn{S=UL_)FyJCjy)&ubGg_;2Y3Wta zv!mBC$3bIPk6TbKLmv3m=qS0*Q{}v;c(Z4<^WB0cJnNj-4SN>acn-Qvexv2aTCdTS z&hIi_v95PogWmDn=6u%sk>@e=VlzF5UQDK~(u)T1$(z!<4}`m2xVweB$(iU`9Je2u zn*?4E$FY5N+-B#k*_=a?vE$lI^OA3id)j$L`772pqJj4_565L{x1~NC$LsjExYwLt zyWWf2Z@Td7F#FB>O1_AD*BR`+H||G~f7hAU`%v5`&W?=uc&rP^|NG6YeV);3w8sR_ zLjK?7-io;x}6fWe>$)Nxvk&0LY%<%<~Ek3!mm0gH>Z#`AqA2b6KI4unGN5 zrcK7WWl5KOv#iHMj8OgkkuJ z@0x_$pkZOc(^kWP>8{(1EeSQC*MdIA_3N-kln+$YBs?H_z(p>4EWw3+>(hYA^yh?l zd|&&egcO;LdJ0 z((#!)({7~OGPBa9^>opeaU=abbAAt&>=3w7;1*Tx%`#gAQXej72^=kOzQ7KF8wG9= zNPR_8;AnyK1$HQy&D@OwcM7B&kry~x;Cz8Q1yVoejutpyV28ks0=Ed(C zI|ObNxJ6)Ap2!I75V%p`7J)kj(g2p}5V%nw;UBz3-vy2qIA36gz>Na82+YbC{Q~C; z>=3w7Q3^z}z%2rI3M9Yi7dTqreE*F!s>entZ&8#&sVi`!z%2rI3Zx>@AaK6G4uKm5 zZV|XsAPp2rf%64+2;3-ei@==%*W+6=&ua<#TK#+7VRRTD7&n<7$E}WJYrJ)Z^`SN2 zdA75|`M7hR^N`c!8sxgb^|)(`YrE@^D<9{x$GER?-|c?H{hd3(v%s^y)|6csZ@w?*p#{U%mulOMeXC<^JT%2%a!gUF^ zB;1vdiRVu}@RYANo|PjB;a~r7;$Qc4(eZdDGYLW2HF}=WwUsiA@#$4dr=w zQgb@;c{R?=&&R*pxB$;=>Zm844E4s7puTwWlZ_`a{qST5j|k}vSGN?RM?L9)vE_uG zOnDgp+7r>()U3ncSruICSg^G$4_tk4A>jX)^6)ZlMd^txKUr3CRC=sTXIaO${%~3x zCnX(#bKpUpPJ;h*oL7tkTnOK3_#Nd0l+S_xbbLPyzrlv@g>?hm0x#-#UXc!nvqgZf z!k0R|4sYsMx%&eC0FUZ;%hM0=H+WU2By9koSIY6N<07q*>0mo{?04ufOfG27r0q1JR1D>Ld0j$-=0S2@QfJ?L!0GDc&fMM-Kz&33v zMt?h6tfC!gu?oMQTm<+9TCAeoXt9dELW@n=YB~;*)ieT<^Jz3B=hIk7&ZqH^oKF)WIiDs$az6f@i88<`kX%4@kX%3uA-RAS zLvjI~3CRW20LcaTC6+S4CP>!N*^sQGRgkQs4t*Hlxsa@*wUDf%^Y!6?7eX>Xmq0Q= zmq9W>S3xpB*FZ8r*FrKt*FiEsH$bwH?uBF{-3Q4=dO)8J_z)x;=@Cda(xduJz{eoj zgl}r(1O6G3O|%U$ zJ0zFU4oI$`A0WAceuU%-`Wccd=od(?px+?5g8mK375FC35Guhp^5!9$*V3i53D2j; zYg4pp?ICTqR;G{D@6n&tKiBu_ImTdPhEZkI7%L5@nQSgI512WQxsJt-yByCu_Bo!j za1ZIc)%lL|W2f$#L@&g=O_03U*vC& zoLcSLMsK_y;NPb)FuM(!i!6CEX89@jRAHXuJA`y9GURELgm_J&Gq5wS#%Dfx;kj;z zqHa`+=jC;jgVFDYtdNJCkVlL0smJF`e3szTfal#y@y*Fbe1drL+l0?D?c&kAt)Zx0Q3Rv}x|;1j@i4uf>QwhW&T@au&>Lca}Beg|eo01@>#eWE{4f9N&1 z256iSq@~6(d_v&YXs^=+T9I`ZuJ_~fJN~(9w?5hVJl%j#H`nu2=-N$-@oB`T1)sA) zy8)js@j1o)q<*IR6McmKqJteY6D zT`nqZa$}&mrX?`7rn$MkW>H|mia=vaRMV*1>gw_Jp{9nK)^QCrp^#KzGfLSEn=?MJ zVELjsH47TV0^zU)vjbnp@y2@eSIBFPrPcTPN4I zEbhu2*BpRLkHI{=qfkGlsi~pWR@{YMC#{caR2R0Ty7WH}KiFL~NKAmJ1`UN{44Pf9 z%bZxtG5e^N2xn9UBJ2pSgK~J+K$_EB(->;1Z@|dF zTZhXCY2xz6+WDn4ZFxfjM=6Sx6B?HY>tVaM%%D#tO9mG*)(%u44rvk5w5fJZe+IS%eU<^Gv9+aba-O5Df2; zLjlsbVB^C2MH8BvgUulxj6o!xA4KEpYdKBTG`G&@Hf?8cvC|nxQCU)5c4RxHOsr=k za9tc|XbLn(tODWa-8fQ98C5p6%nj6{N{kJ_4v(;s>cK}6OPLr@A;dWh#vDZoq{BUO z6seNxAxCQf#6V-+^o5m;p_b<5;=T~Ka}?pDkV>k{kEZk}#G{Z(s)rt}@==IKA(d8F z99bEpQNxZTGbvcN9P0+P)HEZ`@cUzP7B>f1P7SowRAQ}~NOJ?tp+NDNN}4tKRB~SfpIgije#hwsA*UpsII2^Q1yzMMVM|h ztG;DsWMBP4m)VW9yXq z1++AT?B9Tb%JfsP6imjCrE&1^bxw2Z3H2+aXfF&*MF*?LEpO)HZ1lH<3&=7P&T0uX zhA=&<;f(r)t*ReWTaL<{Sku&0-*^n>v_Nfh@EE*fkjG;6tgmUPZ)s(L5u<8j91Y(! zvc{&x^$qnkwKTgm)Dl=)JTBPK5KsYGd_n*#Vtp;ab#Nr8fjZm6;{%~u>G71B1%ZZ% z!Db;ug%&Oh1zMsq@Jchb9aC!>u>+|?2n1^CD(hfQLv?k1V?A3KB{l~e0^qST$3qOR z3^qw&OkEv~U0&Z%hab7C9ve_1d_6hXyo86Nx%%W9B>KkcIT)rnL1tl~7@5&r9}1!; zinz4CamwH25GQ*G9?p%SPlM*pY7s_lO=IOonDR0ot_jK`G9fT`5zb zju2Plo29>4A;x0;!d|65fc|r2iJq4F#%ioaKx87!4m2#B6AUhy8dw^HLly^@FIwDE zjj@$gQOTUx7+e`ThJcI(X2`6-vgP$yC=ZM3x<)TKR964)wFt}57N14%+ut+alsJM}COvik|I{+OuIM_HT z(15VUW@2Gz)ROAzu{E_z5UmsInLMk0DIyhx35|8c8%|otJ9V{bC+ww=9tfFnF)r)` zqzjbTx`{PQ>l<3fw#q#LEoCxqJa`@;(KOZ}>XBDvRJ-IGY@RXGBtDS9A|lm?k;ew> zS~-iU9WSq&aE#3V*+_zDWOkr=MSX36JFt>FVCU)1tvTj3Qm?&_B+25(Vm5J#KNhoo zX%m8l?;VKqLP!<6bV;R9b}%+{EZEdpoZd7Js|L5f7%qk+z9HLOgLx4OCHDL$amF~mgB}LLjQl-JKNZ}t~0-%8S!OA z(PMIC#r9TqCYu;=8i^~(^2SPK#}X;YOeIkkDLZWCGDC7mjXmVhb7v$mwSgHbi<*Fi z?V|OE#UjN9ZGg>(7V82=yMPyH78}3?x@`s2X#F8T^C4I)P@@gnd@$N{`};rV+&g!M zq%2u#cY`ip=AQSL=REJ{oI7W>wf@}vR*TTpy9`7oBs;Npp<>g|r~_^lgFi|#rhyWC zwhng&1EWY!G+em)LU|DsBWhFvld0C$R$%3&s!#TF@L~9BWu>|Dl0@@Tt?m;qtsz^> z2ml{F0b*S(pJ@1)8a0rdxCWPY)6MynN)%B5BIaO!Dt@}WqLeM_Us}_5lgh3|()wL= zrFQLPb6!F9@=_(LD14?=S!KN$UgLDVwlZF>RwtLBUY~ohx!S0#lxNo0$}fNiDqn6W zrm`Vr8j2v}Z`Dk00_;R_L7sj)PBl?2!3sXs%M0bT#+()!@+z$;*(N@Nd7JPDn^!vr>8NNZkO zwRiw$3=`y6L&X5mTB%;<5&=}*(L)ILa3j_go3IJNX+9t&6*gaJJW+(2n9 zDtm1+HIa#WbJ>dv?7&8PiX9>1I)$u^*`v5+{94YPgOP*GL_z-$3cT1SAAj!f++1WO zrq;mD3Pr_nWYL;>Mcu^{4c^^5-z4iyvyzG#ke7wfof1?I*xX4w5k=*d`RckMOec9# ztQ;`eNY0fO(5zDpohz*eaecB20ef6X?peZahkDts{-IURmp|;h}BKNV&W2dGglE z7wXW_LSt*jcx`RHUO{KtE^B42w7TBO2rNW>($74abt9e2_?m`iFE+~rUaighfbl3X z&R9x!Nj=tY*?5rgR-^HrBoHiJ!jKdu=b5opfDicE(4g?aM`X#AL-?xoKN&@g0yeC% zNPJeO>SxP5t(D1Wx~gy`JkOwvT&q;8)3UwVoRED&Xhv3+$y?+o?c;72nmCNr;w>AGbjOyi0|uZOR4}vKV7Lu4L_`@ zC8Z@pbXQEfR$4ql6IZG6rSy#@S=JbYw&>P&FD584#l98wK(;DpOY3E9M$*h~KUuy~ zx>}JHxg_Hm(@}GYRa*A~>Mo{>i9lst>4~G5tXiG0U@8+JDM9G49sN87%bC)$glps( zj0?v7oFB;CnbPX=JpVld3kZ?qYE8TmmLvgPbn+yM6MV5M?Z33Zry(Eao#cCTx(0TZ zWXQ(J3^#Y{ORK6C90Y;IjRnrF91L$OF&Uj~`Vc_I)c3EXhr~i)GCD0jsw%;P zagj(^fLnIbAQo$L)!J3XSfaBv9x~=70iy|2auPhtI#FMiHXX?J#439w$Ty#)Kyc=m zF+v-SE1-9&$^)6hX9t2Pe~pusI%#yslyTNHE?~D&5K5VnSA5b;d&6ir#IE|UxtS&O3(-{1z)~_kqya3=??X?)EcV;hh-t^d^Aozeyu?j;pt7L~#==gV5 zFtj2ZIDzh7sxryMFb*k|Eh#CzDyfwe4gsu(5DHX0_cxIe<;BU>)f(s+XI`AfLJtK? zegvK!d(EhNdm@|@hT>bp_!M1xA5ctxsl09qHW0M?KuIOyuy2yy3{eyHex zD}i#o`RV%#LlHYNw^B&$ur=xQoy2a~b~UlnY+MtM46A@SEt37 z^%WKY$z5IlHbj4NeX71(idOKEG*`mJobexbvc^zLt6DN60W+DQJP^nSPvF6+10)~A z7`q~)8kx7+3n9S=!miclO;x3lNesj~_LQ83tEo6PMwNtH4 zPuH4wi=?K7<)50bR+fE2trJ{I`oXcljXgxz2_q!0 zi}?+#^Oz@~pdi(!=B0Z1QLvi0$mhtIFV~slI|5;9XVe_z0MomLFb##~EJLvz?l9-Jk<*)}emL18veRf)P;&FZ(2nmryhi9$;c+>+TF+ zQN+3;N}F{&7aUQEbA&8ut02jkKzFC+$t+XDUE(vo5)DXfz4+-ZCsqw6L z64+>{P5=DeLYqnd_=S`M;693dqH(Wxw#ii8SP4f z%%op*r3vl360|W8b)|SKus6-08%k0GB-C7zX5+%$RBd#%ccxj6x>F|VrE75!+s~>8 z%JW(*#>BQhfPf*fWfuwu)*oUT12lw%)WG}cJ*=D;OYc*~iHsne1Mz%;BTJqS$(oWc zaJ_*u7x)S@CZl-E4^KrBRE~B!*!eLvD-OrziKK0u=D}(PXF7TNlRw%Xj4Q5%4#fBj z*Fha~9q>lAiX-HC{IZrK}iWW+2=`FLWF0j*-r$MRc!yF+< zGg58nDF>d&cAA8rIYP}J)>70GCU?+aYC=6T7}GI7 zFXy(AW9<2|U*Vzc zoLUHn9Yk722a$_J4$OTAyVI;w@`G+D4S~I45+L5d&3&KVb>rARw-IUo3efq@cj(l| zwR6=CuEa)^E@FocFom^7k!@tzz`{QC1lzfFHeYmJPCM2Vp)CAn@eD?$)|8ZKwgotj zVNUOe?JVOL_({y04LrL2i5elILfiP}to9*;g?Xwt&RknWOO@A(p+uD=3~?vnY3=`3 zH4|6T$MNTm&doLGN~f0Cb|Vm#QMcw~s?bcgz2-d>VV`bp0>_j%br6j;uW~UC^o{t? zpLq(H`~pX2@kP|C5jF^0wd|xzk4bPOl3#x{GJXcvTq$wNF?i}yWqMddDo1=h745|( z!>*n~G5!EdEXE>fQ=JG(j~Ra&*SaPIxW(pD-r|G^I`);|`IJ8<5TBnjHC^72#7qJj zDI>=(E6AZ42zF~euo4GkU_>~r{h4E^2du4@*66)_9WR9stXW`3!hopJ&b@vU!Tqqw z&^K7#FiS7>iEm|3N!AWT=jFStYH|*9yJG>NY0ueUGdtPmQ}eGPEk(1dqT}`WoKVow zBG>R9c;TiD4LOTEJY~v*)dpK1o~Xrm|1$fawQIsWE3_tTk$c_)16YJu7u!lWdC1%e zyj?1P&-Oxslih|v${WivUc%U9OK#4*MN#=W8$V*g-R^JK zLuj>VNbUwV7gLRA-C?bD5ZCmsAf@OvZ15=LH+U3^U~k@9CaCr}l?RU^2m9Q1B;$A` zq|FKq14m5k&dsqG&bkBq~1G%%!lpZyDLXU4fmk#1e{d|BSHPJw^`)_hDY zfhC7V(99HnP{8R2AZXW-HSNtT_voDO3#5j76|k9%u4dk4yy1p4{L13_GG7a7qneq2W!@o zI^Yn(3P7?;VQ7{_@B{nQ*xce^ueJijZ{;2!R7paoR7vJ>cahtpV|G@why>sbXPT}yjF9GY1cTbXY=A1jmVA`R6QvugFLFl*83C;S=~eJg<*^l~jz_5;Iq9mkTpa+qzjC=LqOA zS=xzR(<0Z*M|-g>$Fg=UIs(=UHgt0i%#_7V#HsWt@uovX3ePafm6ehP{8$+-=Kig)Fv%1%{TP6KkLBEFP>^_O|bX~Op zfLzjx#QZw>aI9`5`_kAJmFsRYpazZ$d1{pu$S96pzfME76ZLv&-Oc0EOwb~n-!}jF z!g`SMoH&l8K8t^o$ap#tTjR>w49JGQUFIyaLqgU$$G6*8CjTw;Zh8`U3(b1x*B}0QaEq2}|$y*(} zq5Po$IjLG^n2j^bW&DCM1#4HyqF5PalpP7sQ`bQ%nZ-$#PKbsW07-a7>@n-UlhQd< z-mT}HGSw{zP8}W%I*&yDsi3^<eO*syOg9z3*CVM6} zG&*VKO$p{loQf(CZ@R@vsvL*KqT(<_gHJMv;aG^`NZePFkW!zLv@ZD_*MwZ+V9d0~ zaeV3mPMmHhI!Yb{aT;Us8%8LQhBeb=*r*~X7fCpZ6NU4WkvX}2ar%%!OnI+6cH+S& zhr`Zq51)c3gF3QE>#qqkcH|MDT_R3DBmET)*d^@r`nw+ zg>Q;-r}bCS|!e$_K>)vcxWsnmJWu@|_d zy+SXm&OO{oJwaSOlo*%$ywaz+0bZkQl~%{C{Apqf+y!^Xl&=|GARUQK$%~ZrtqKa` zq^JjlyJqzD&stM3TXXKj*7}p7AIw?CrxEKmx_WQ&$R6~SG7#e#4Maq@j zHOeUGu;mCY!jycsOrEX)EvLl5uc={Fk84(<+H&oLK{!}bvOV-7HL@!j#ofwT9rEGSCgD0tc`o~ z8~SH-oiTHYKmjOQjQ_UnrBNvhWMYy66$UZb>Tat+AVs9j}bPr5JD*FpaMN@*0r z^;LME#-Lts$c9m5e(lrSTA-&Yzrr>5<>S__=!4z1Kw;0(vRW-tW`#Zk6Zh0{>vh4( zi=(cRzFkRSq#$(&{69{8kK-#~+X}o^eK)D?Vc@y)GI6zp=aaggBNhpl41PtP!hPSP z=(j@|#MBZWrHyx4THb7B}!&7S4=QbnA$sl87Aqujc{-5GxJk%mKfuEd%48aHBL`|V=kU@?^ufP9*@06 zW+2YzaiK{JY;Mo~WuE*wL+$MbKE^a89%7%)qo%ANr=~Y4EZGh^f@7d7Df!m zBZL-1yk0UvTvzEr05LRiOVQ4nQIG0%c=BPi>7C1{u6SkgI z1=}Uk+9k$Et#*kKFeU@UVO!FT!viiex^XPeBhRxRxVJV{=T8_&m^Uvnc3_ykTAQPTeZz&; z&45{(q%b!>hG zcyyyYx>3nyM>ke@D`KJb-9qaZB<~t1%yLg;?e`Y_!o=AOzpd)ty_hS&1|-?aWgIeR;Xe4f}z@XHRfON(cT;?_JRG3k%e`T z`|L1i1>OmvHr^TZC^;J*aE=^rcBJLqa2_|>`k6|7e;A%X7)m9wZ|gipTOZo^f1uL; zR3Go^;}7%3Uy?cVwn(+ipK^c1NBax$6hHi2v9Hj6k(9#5zYeqdu&{CK;laKT`x(!l zGyPBW2fBMe{;UW?9Buu$(E3TC^;09M)}IwxAHxMgfdpMY@f6qkL@8=(uTv}5W_CdA zH48@+uv(uyLnP#5>FE>7B__y}JhT^a>fp$hP;#DO>4GSV8p5MRypzr)WP)c}j)Vp!arn`SXQ_mm=Lq;YiFlMr& z?VqdB_96Rx(moH^=a&E}%UOB=QXlav)HL~aqb!JzgjH)wXx*r2IJA|OelQ|FKq=mR zDJgOTE{GI?=5MTIbG$ircz9TN*=pykqoXSGrikuF8z=z>ds5;}%81933Ff}Zh=Da} z*5z;HEOGS4=AOYmD=OS(PKM%4E&sW}{zCg1$m?~4zR`HQBw4HZJ|oOVbl&)FmeNv6 z2JL*jIwcqta#tdF2z(J?pm7ZiQs?!|Xl~S#&S-8oDS~M>yL-@+PivEvZvU7cz-j_{r#v@8=FN+B~#T5JeZ-{C%S5FA5tO zgj93jkcd97Wf330@t&>8d#F!HGfLmMgp>#GfV2j(k+EelhJNFRs_-LQ8cL#YAvD@Q zmsX&q8NKl*c@Nh-!ADrP_P^O@T5J0QW0>s^=-~q0h5TTpU)P%1-;j16FMkYd=6WP$360Efe*dl}3pSM9b2}=n0*##4YG-MTO$o?LzS z?=0E;2|leKK=3eIb$8Z^zm*&8%jOELx5R)8?Z3Z!uwT))^EueGF}wCZ9HK~}{b8=q zekdp>D{5dxEw(=dY~Oi+Rl`EDC#`%a4Ii9Xfw55Q7Ob4EN53;V%52&n5zarxhyEEo zZQmkQ?R>!)*LS|KU&%!Ivtj+q;lTm5G?Ith{7C8U1zx3$Q z|Ge3!7uE7zvV3Iq@tc42^W*t$=Q6ME9r}-7JicoH^7Mn2(a=5!<-IXr38s3#O{Vdc zSVnL9(r_FK!Cv4c$}&bn1Fip|kN*-%x8Ju?#vS6M58}XtO8z%>dO=CT-s}S*;O(S1 zSv;WqO*JJIe>0neG{pAhJt5;AWMZ6kGy7mjjrHz0XH%`U-esN#_&>z|aka9hkL$#q z=YN9#vr71mKHlb|^_J!hrP^42U&*&LJaL3uihZQ^jgpn_`JU28NDu5#(P9_|TqO=o zNcD!9A{Yy^&}IgnmMgp|iCTCw2UkEwnm{4|Q-_ii7ex_e%7ch36!lptjakz$8I++t z%G{%}(YMt}r6ti0_Jk40yI!b$w6_Q|dsH>Z`U!e08X3xvHSrN;Sb&cnQkf^nwp5iU zw7;A$_Jh!e!BncvW*;g_=Ns{TgZUqmjMgfRi4X`{c*ABal?fAnGKY-dF(OTZ2@WE& zq{-wQ?f`~4Okt9lBZip>`faa9jtqxqb_9ekw12D6euux2Li@M#68EZVB-z{@TCy4% zT6PEqf;1nY8^8{8GwTEiw3);B0fske=7%Gr?H^IsfHjh(Hy@HlWs4sk5U^#i8i-5Q zr-)L+lc|t1nj0A&N`z2$7(>X*BkJrXUFAlGZHP^USzYB5-s4cWEu_?4d8HL*homEy ztQzpjn`*t^6cZ5$AQf&%hi%7Yza`}^Q%TdO|8COW&WK;a39~6s64jsY8#uw>*Y5wTZXAUns z^~}Mi4$mJxc=X7T#e?%tmr4f@9eVoMQu(V33#G#g&JAbW;Nh`D`gQJH#_b%a3vsaIfeRb>zgUvsbWQG@a=_tTMs#Q#KidMQkmT`}8-lE94fcTtNF`mZW z8BU87SHjt@BAfdh%L+ePH+^Z*A6`qn8AvaiI#7%cp@hqj2a53s504!kd*9h4CvlzS8}6WqUWb`$oo{y7MMD)M>X4w>AaKIhAqG ze|l4JkoZX2)>hzmlNmSh>8+>nbIY|4JEibb^a`#Qz=|`P+v(xC?Hi;a2bmxPp?vae!o4$S@ zpHSt?Qr+d9W*2UwjrCliN-mXz3o&WR{>qjY%e%7~4*%?M^(LItjK+E)h-BJ2&7;mu z@%86-*BDpIc=ZLB%eQTBDdS3a*PcIQ`IQ~7JZ|lV1z*d!dEFQ4ToK;sz~g};!|8}r z(+b88-I*-SG0PWtr#Ghqsu}lpZr7o3e*D6H>g=_Qd*ybW**hWbQ(vDpG5=1O`_vhv zKdy;!TKHaC+|9+raL(Gz+@B`*q~D6l_ch&@aXv_+tLaylyVm!iH$k9tuJm32k&Dl3 zO9;LY+O->i_tGkA+n;7!>+h*OsQu1gn3I03j;^?JU^(3Wy_ezi+ih7aHrL#7MB$2H zdI0{|G*>XB?B7fO)w}6cCvbmhI&*I0$&5Q2@FsbW!@Z1usPiT{9La9h8y_Aj_tnn% zzt{5L4p+Cro4gJb<8N8$NRgx7y8Lu0GXK@DmY!aC`qvL1d+KQU&@;z=S=;8T0yFNL zLKH1!*G-=AI`DfznqS$fXj!Z959eOlspFt>-Al)g@8sj`Jk#=*eY)?Z+)K;5buq@j zuhGrjSDydiG#4(SrFE_)^2#h;Dd@h2s@kJ-5e-)n9yZ6zHuuM%PUqgpxEk6hH$bY3 zV>?`MxX+G)LFNka2G&y?4DxV5f^I_jxQM>30OObB|8};H z<6AKu@3;);7;KsQJc0qPe{qe?u;2Zo{{Q~ALh_U;@OzJC-0%IlQaV2)ouGv-PESm~ z@o&FXYyRm!`^N9qf8|i-pZ^ndP^|v1U7p5PSST0uN{Z-mJdYypv>^74mk*|Vh6iJx zVW@LCj+-m=a&7+A%dCW~-W`p}wZ(aN87npZxvFq6j&(n;q{=zR<;(g6uPNbzk^csv za@k(csXBlD1a0(Axx2Byiv2%;K*ko~5ool#GkMpY&W~pmp#nBYG{ ztGc0an$xj50YAyvS)Byd&zG#0KiRI6@aZG>R>1v!-yhRxhA}m0L+5Unw`u8jt;`|j z?SGGQb`}`$&B}s@?uo6~5pJE@g|FGqucq>Jhh&u-4ax1dP-cSf6U`+3>C`Q68L@Hb zHb%IaM%muGa3?sktGg=53&z2&Z_0Wumn&(C%64E!){_L1m3O3#$GulruJf z>fB$am2^9P^>iIW_u}ey8;WA~^DUdpROmyir&|LtCMc$Z_4w!PuHoI!>A0=W1=`ms zY2Dgubgkj-*5#?S~5 zlO}j?tx9dRSgm+zE8be`rIl($MFhpFt+v{#1+})cwtcPkVq5X|J!hV0FA!|s|LyaS z?s?{%IWu$S%$YN1W}aP^oO?YviAcxiv(Jcrh$sKe68QOG0NJ@?cIVQ=Sua-n(6RW% zislWGczIXMY>$OH%UeUysM%e+M9=oPCYj7^YC&aPg=eQ_@XqtwmZDF8~8t-20)(l)sh>S z{FM`}t&PQFt-zFQ=o=5zKFLmkS?G0bEZkv&k!2;wEIN2T$s&naL~}AJM6aU%{Kv9s zfRgQPV>(p96iKsETQHf!-9o_(weD+#sfTA+q=FVvg?7mC(s zMO9j&7No>vrc*(kM(d@IbnA`Ar-7P zVog8_3j?PEEqocRX@MEc^8+Tw&tPhyITMcwQn!P8ts#m%$F-b^oWLxA0ko&bev?Uq z`RK7MM+P4hrpG2{(hR1}&!oATc0nc$Hm*Yq^wCKeS~gF=c1aczf!UBDh*4m~>oj3{ zUfrAvn4M37d3d^yI*?+v78x(69`IUYSFGyPr~`FEKEIa8K{Yk7jBK!IiD8UkL~{A5 z6<47wn)h0iV5t#+Ra6JX44B6-7b07k1(yw$D2|#uRhPo}yxNEtspK zmH;6jiFE){{ZR)ypGUPoD=1o`O(07hfNtD+=DL6pV2d1$Q$2o2s@% z6o_d8Sa?!6H%8bBO zV9YhltMM?u2#{S}o9_sG2`Qf^IL?!}1}UfcWx(L@T*G5ti&T!5xDJmj^LjvVZ^xtN zz}vZyy$D{f%q#-o%_>J8#~%~u^bqAj1o$uyL4*HK_yx`B4g^pWWGqbjh2r6bMS-ud zEZP0Fu*bj+NLTd-kxcgxvaVs2$qSvt526;Yq4&WT>4vj!IX~Dj>A^D$_Ds42Jc+M@ z-Nc;t8b^&6Q6zpN6K+z3pD^L;NRNH-;K4HjIu@3y!ec$rufPOP1jm)~MC_s7S9CZP zUUUoUbizcFzxd6lva+o28~iBhyM-UceYf(XAC64LUT}7Zy?(fkXClK>?i*mBfY2LvURV~XZGk3kRG%>Ekom}oN0QNs8_LOPvbcp$Nhc#9H(~J^l z@+YMW_&?Fnx6pRgf;4+Kzs(d&l)!h=k-O6n<-yS>_Lx;aw){e&?fPt2mvntYyE?HG zXoa%HFSMbqz%Br*L-!zw;8tPgy~zx*7Yc0qmkSz;_9Mi^&o>^NK&IuSiYLA1FTY7?@ z(POI!xKGF3lr)O6m1W)!K&dXV0eC4wby(a#P~A+ z@bBd)S)k`T1ABq{^`kEM0ASAoYY8GYM>k0M_X0ZgY}>!P=q&V$|Kj_=S*e-N;Stym z(070dMSainqqy${erUyG5r8~t!Uuc%UKC0KzSP_I5~qv%Ud97!cI-BoPakVQ3%tUl zG-a|b;p|udKPp46rO%%tY5oi#yLvJ7`6^OA!;^Ro&&nF#gnXy!cvdwcXcW`~KR+(V zYyJW>r4dULt6AZ%gIaU1Qg~rZ zy|A&U>LNfV2c-s&TCTgst@mTH>BxeQanK6Z8U8exmo*;Ed;_90udE1CN(=mwdkj~H zHOw1?b@0=ClZnH%#9K@prk>{8jEH?ej$Z?*QgS>Xa_}Nhlco1#p0NbZz`6{y)QMv&ZH*HMyV;+RpTtIcIUbRhmpe}Zd!-ojG5_qXK<`D@ecC)r+{L< z%Z=nIiYB{Q*-I7$-s8$;+h}(}*5y;6CkO0om?Q8TDT>7VNc0Q`9VZ>wuk<@naqM>3 zE6zBujvImBf+6rb0M@ro6aPaUjw)SWYLz{Al{(`%8)b&EPnG?4jRA8VII~J&<`Gm4 zoBur?##FbK7!LueEIjZBP^abyzsfnUN)<-GKCoocXeR2+RzLoiX1qn&)%BYBN3`TNv9@~?e+Doy%+)^6HAR>@ zL4=f&NSuyp&-J>CS7*Cb3G+knPI<~udgFTePYXJoyy}XmN(IIi*d|XDSHrf8bNhhIo zIArWM|IO7IHKY4ag=T`qTFQy{e~K*S!>z$GkAfl*RJK~HqbS2`SPj$h{EVMGKGmon zJ`4LCSfXyip1s9uyw#Y-j2or{1m{VbQDuN^6xIEtt zsHBfcDx>N&EzpnYWtW>~p#dC&S+R(du7?~jGRT2--dj^2+r{%zgi1h9SPWSp(+6

    rkCp1Qp;+V+H#FCn1{2EMxOd{$KFcXYz9VPywf2EOt_i_Ds0iYOiLNAU%B#n$!{_ zkPK|a2nAtFjA)5cCS3)At)!jHbgKa88q=Rc4MqYj=w=!6va3sA8Y7cjR`Ex`1o|k@ zYksXFi?XEaFcR8O#nYO~EPf8}!_$ff7i0)9#uC667>(vUmb7eg#pW1LY&l*(Rt~s$ zOcLJHhpF<5%4cbG7gZjx)9+I--+@skx}qOmOvm(O(bVB&(5I|h(PX`F5oQI!auhe!LR`%Oa{6)gtdL-3iExj<@fhkN8mcUdb&65D8mZ}5mntZ2h87phF2~{}m zIT?98j=Z+Phto*3mnsD#!F>0c2=}o24xZ`m$J%5?FXgz)LE*|8H%{_~X%r2+9(LhMdd^m{aSkv$X=Aha}8{sZVWvaBuA%hhz+jE4zvzimQ5=zhF2$$j_G7WLr(AWOtGL$J zKRiY0hl|rOQamB6)~kCsH5Dao=b)23T72YFR_CIZ(2vnPh9=e)b)9D<&S2pXHB|@M zC{Mi=JkI5b>5xY5&J=^&JPic7RI9l-emc@Vm0`|6I;Xk}TdFgVD$qTC-JFS3U=|uS z&qNAYv+$^S6Z6J-v}jb)73#4H&AR7`ozAJ*VDsQUU=EjOL@J5TMQX4E?y5>n1`*ku z2kMzCKKtx5d+s$-px2&zE~-U8RD6F4Zpm=J34j?4M^=riC5eHx#B}t1D&iI0Wdv?w zRVrKmJIZ2x@;eiYP)bWQ08VwfFu21UQd?{`i;E?;+MBCe+fccvOq>nY>AO*0ODsk* z=*!jRZsxRa3vCH#iKUz|CRYzEV{AEqmPlp@KAFvkNqV3WFx%bJh2G$NbfhIf{|b;oEWZx7xDpggXpuIt3WUTtT;4EOV%;4gnBHt^>`ZVF^lyWIM=G-Jbs>~iF@rk9r>x~@*AvaG&1Cq*YNphvz+ZT zF#`q7^HG(zdK5$&ZVoj7f`YRh&8U^;wPS?wqaw5N-Bj~*YK}UC ze!FH||8dR7Rr^gnILfZJFr8mjo6awFVyHGitiD;So8;&TX?BXVLQBjA#%m7_B=kTI znr3BVqr?kK8SME1j2(>9A4hbAy8>q)mS!DS2EAMh-*sU9Ra2Rp%613fX{&2m+y-A7 zq2`ha25t??Q8*rfK$Qi0A7}XW03x4ib0cUu)g!aa4kQv-8n7{v782Zm`0FeaRkAzu zW(AEbZqoavmcjJ{h;0RQDvE>b%7)LUz-4^ZL3Ebp6rUF8L__f?fSRw{kT;I|S7G%p z!7}K5m*An9Ba;0amtei2D+s?-R|*5A$y}F+j#ah*9hVvsT!Dm8RS=d*spbvIR8CRE z>0)ud8Eb@>#0@+UXKG`nr;>q9%vT%Vjs6Z`(#tMa#%i=PfEO{mRk*@nTyypY- zKOS{a<3V#65OvqncQJ};9#yzxh{8Ep>hdVdoxl#n+jj{-mbyX8LPZ!mOCl_=)f1S6 zKBd*o6m&^Z%sws+3Yaa*9jxap)&7Xg_BC~R1$IOaX;tD>_Zujs%9Li7;rDA2tcj}9 zct0Au*hVoH9N(RSXJvBS#vGkmf^`<`GQ?A}wIZob^HvuW$-O@xzw*$^?Y~Uwry)z4 zft<}+R|c|#o0YRBCq0aIa54e=UETg4lx-{hz2<$O@o3a z^@n}8)i0$#?srOmT!+%%UbM>kbLi4XwfhYl4A(AdBwB=Tm&JJE8aR83m&F0jV&KZIaP<4%eMfkc;=RNXkbja(@j| z**NSq1kMo)hRQu^yv$Qw7LqX;^jA(m|7j*Yb4h7NGw=^ApZEt(Se|J_ANydO{IIM? zjh}Hf-vmV#lqC7pB$=HPJdV^@GDM9zSX8*iEVW2w*%iN*tU*?)ELFpZA!^_qi1L?y zT~*@O(-tkiuDqz<((h5@=gF>*VpXLwev#2;ivGGymvt;fe^e`a0P7lPRPf0e*_<#h$~xX zmJ_UbZkgPPJUCBlCFHa5qRD<(dK`)!Gi7xjKdUDV%{gX9{V=SaEC1+0X1 ztaX_l6*j5Foq#K(#G%+YaGR2F^fBJIgb-mdTLTLV{MgAKb~~j@ubs_AxVH)6u1KQa>&X` z=|=U%9Lc5k>TNtwBZpH z`mpC7JTh#bTTtV}dQFXwv@CP)PiU3LhgI9hK*r}|P?Pfwfyp{9jX{-nOBX0yCWZ=K zEQ$&?5P8Y|D~AwYSTRMid}>*?UNqGbSd!uWm_uq*F$5eqzaO1h?!Ss5l10*E2yP=4 zLqJ0LORqmIhDg?s5>~|!{a3;Yg5KDbeByN#(pCi=RH!&AJwD)S()yLwSTa6HwltRG zGAlk{qG$rd4<4|ZYeSB_$ePxsTu=624WZ310;EkoaNCn_ zJ(8Gw9OrNx08arM;(YWJfe+6;doOtq!r|C}9>V7Xd}IzvRq?;Uc=|SQtqBFWXdjEI z6j_U=`xEXk}=YWTd}t6kf_ zlERMS&LQ$(l^iwxozY5?{ArSW8ze}QkJ@DAfwKBUrV*JkB|`w!!e@4w3^ybNOEU|K z8{&*KHzcU-gC-~KNBJN&uaplGV-X)jay+9kA12cGyF`w4zM)6cHz3tZcI^1~EJ}>u^R=}=GmE+g|Ycgz~ z%OM_zbI^V6`8w##v=E;w@p%xRBJW#|AqmGV zJbWBgE8D@F2u9U9EwKdz{-%{m;gTeW9fo}cvl+S8LAbrASnAZ|Y+94EX?|xg75{Kv zf{Vz}uF9i1O=sb14jspz51-8^)z;Nct(#hpFq6Lph8aP@X*hrGC;B>`chw`^)E$dN z+aWE{40zk`L4o5|Hqi%Q&I4`S!j%p4@ccLMX6Sd^oDLJqru<QNAu z$$ti2pF44!fmZ_=-YoE7&U0f6s1=K`K_BPbPzspKaF4*jVVtfPc$UC<;TMjN&0?vHOLn(uP=ist8`I$33jNy;V7wTTh zb1~eX&+vx&g?bV7RqU@Z=oVjlu|e6;fR{ch;@r2vW6+{(raxP;q0%5tYMznJ>8-iX zjV+=tdiK|N>B&;&cR?O6MT@wt;gY^e((NOd@}igF1rr$lK`YB?Cw^nsOCM%4&Kbp=zsP6!W8rBQeg0a~Pe{#^a$oWk(T$V$*W}XX!adN;x%&Q^BB~n6@R<^Z z=hrg)SslaYD;YLr-7=zxv=OBfkXy#^X&=MY<(xap%kWo0u5(H49zB=N1T3OUP!A-p zW7!@PNmh%N#@4We!zVF)s>nYe@DIb8@)O}H%we8WglDZO~@*?!(0&-U}rGPdNaG1j^CM-Nlp^)b)x3a)Kf zA;Z%|+HaL|x*KvDR0?}2qL0RNUm`hTQKHYk)iKZQSxmV_G=F~p67#}K>!p=pGMYzFC&m|jfwU7D zMx@0?;dycxx8kkmn$Hl)9%O`31D?r5i^wJRq_?A>-R4^v8tfSxGM! zc%9U6P-JKWrHICf6-|-8pDR6DD&u~&jOLY6YO##YHza+j$g@~--}JDYSB~P=2Zd4w z`!VQJ^tXs^5X*c6^Q(xy4?FkLxx$&4$oxyCp3d={es>(he|Z=_D)TNNwcR5;<m6qx%D4QkK$E4nu{=x3~H}pZ6_*OOXf)SFu7$+@e8Nh&-60*pCSsuu8OFk zaDNSZ=Lxa^t5qnET&4Hb&WHcz|MKWp6Yi@GA>|aTJ@3BSPNa1jfMb84hB=)G^agR2 zy33<5k8p;|8Oy?doY(JXEDzu4;5sjtyb%`GE!arB!OeLqitel3fj33`f|V8ASGx;X zfncwI^A%uY1p7_?eYI~PT`Ab!T2*eMU_S@O$p`&O|k zH%qYVf%%a)N3c)P!f;@$jXatJ$rx)8>>tQuY^h*huTa=>!Nx)_6)3kt zFhj7hbdF#bqn1yxhMq6jT(82`3YI@gVQqqi(WB{(@e~n#URuZctfWrK^JeiFRZ>i_ zSB5b*5pNE%)HTRkf|n9|1)GJ|8B0hln`Bfb(STsrOuls7e41`y%XNhfN?!R$g>4h; zu@Z${D%hnp3cF0ON3#`nxnSRRDeMZt91|6GrC@pE6?U~??-eTSOM>+mDC`=+?#)x! zmj(Np#d)1zlSZh#?Sd5r74{Xu)_E0ngJ8EzQzt&+m`*ne_C;VX zI!>b@+9lYc;hZ-Mw=F!jFIsu`3pUou z`>tSLpYX_p5Y58gk~tTSV{A5kU$9}mM<&dNjXxxs__&y{dGv^2hsH8CADFWukM2NN z$Jk@!#4LUWbACQ{t&a=FH$C(5eTKb)eHVUYKHknen1(eXicFPjqF<%extiWhtL0pJ zKMlK({*+eBI{I5$Eo}%bQ<6o<(3aXwZw}o&fzx zfp_I|-)|`2=Up|BRnFQTra$j3!uKU!0{?Y6&!X(ls$WOC-gp)fM&J0iPC!45I&Z0e z86$gFS&qh>zX9d1`WB4NQ1$!<_1xq*0?iE5|AZF%s9qnM^P>~A_;=LbH~wFr+sePB zmCvLVJ^R>x-Q!I4D+|XOW3^mBTiWzo)}G3JSz|pY4YS_t{`$+g*Kbf!b~jAbrTD0m1gt@AaA4+4N~zo{wC-F~tuFEva0P?IVw1d+C+&XJ_Y7iD0Vr z94Z%VkZ#7kQ4U^T<8p(v&B55I7S^UQw#dSM1gpxS$1Kd_LhCH-bm+Q-Obh$AU>93h)UgV6e%Zp7 zqqimWs9?5a`vg;cD50NNoT|M;7N*+!qlKyV{%K*VJ$E%rJxCu(3&Sj|4kK1VXIfaN zV2dn_=W7Y=6-;Tjgk}d*eIG#$f+>BDpv8hIsY~hnG|p0L%fLF4*q8KD+A7#S`r*hc zvdidk!S>Rt`j@ju(l3*o4yvGclGvB@3i?AD=UB>;y}&+-OuRjNBFz&_=`28t)A9ne zAuVqbb*1G^qHEIfs_3hN?e+Y{RqU#wTNJ0~UUv|Y`A)0co#XDwuA;5Ate1WCE7ybB z)$|j=RO@wgSTI#f9UW1eQcE3uV3p%q>gevtsaopks9>s=X~fs#+`_-J_hnBbpM`al zy_S7C@vmbM-AK{m-HthQguoL*C$o@<8( zX*s=amE+cz<8(sF!mY2Q5}fIA>#kA1&pw~d7EHB%AvFuOkG>uJDEmVCx`h?x{WH6T z4hl9%Z;x{NLNpG?(e|ubM?t}Eq&M<*JJ!)w3;SqPmammw7VHMfuFdncQDCZS{S^NQ zUpxKK!g8y2J2uci1lvbB6RHfvS|_Dih)|wjgS5iIc_k{3M%Iq;MQE8|s@z4?l2+~_ zilvpih%T`>TPL4qTtq)g(&-@mWR~nQ`V&^g z4%#W0(qISOE!d6JTwCSqp!d_TD2>O7Dr=tex@cV*7Nea>Y>Ka&UQNR`le}sv<)-+y zQt%YJmK(K;=`ubR#R@yK{`$=rG z?*a&*VI% z-Mi=#!S>PbM$~)mqDRv5zC%w4cA2cq-=UW?@?Out4rO4!%fS9eVdR*+%l92>J~P$& zJ#>BsW(ub4hgY=7J-j93_(r0OT50QH|;ZL>x5S3>UYn#^<2Q&cjSTR80a6R!TArjZu*a7_@{?s<}z zwZ3{F`)PVwVUBSD<~(5K-CaEs*sE6F@UegPJx#^)Rh?_bu0-A#!B`d-u<2GFxAzRq zurO}#8Tz-vq`hZIU!ZE?_MV|^g=KMj&rqS2$L&2s=U5oG_YAcNruzO2wF`DB9YWuq zp|4ulHyuvjUiwxV=d*Obl@~wuSW~VtJPSWMQu(f_PS4|I(#23Q@wd zw0a>+eJPzQ*xMF%6XHm4E>d}~O5T8l{adh)EUW-~6>v5vPCmPPmhuHt8hn<5f~gVP zM|Bp)8r(iN6mB*4j zN6%RpOZFVSB$#UNIXYtHu`TVV4=jw^+fUwQsrL3$zQUxv{WQYL-1N50-N)rdj-K^xCidl7lh6$!5d!B-VDal@-HVb3P zUZ9SZTyBtRpqCfuD!~qCjjt|ty+GG1OyqolZnE-N&KGE>mG?@;KYcIIyB5ZBzCeEv zOtt<3c~(i^#h)FdSr*2vAEdj_Nwt2E_6nw2KS&1^CaoW&pILd_`aycr%H!4#(wNn% z1#bNyO%zP+i_xCKWTpHGHDzGu33e&{g`7D*Au}!SCE8-;4RbhiUPAQ_`d}o(*GHw` zU1hlM$2k&HJ}<3u9rUTeoRf7f^}C7u3$8a6;nteAj^JC~81~)<#V6$DxoKX7U8i01 zE%i)MHE>&Y`sI91b3G0kiQOiCYZPTOYvy0Da**Qud>&QL&`_gcsNX5l>X4IV{t^0O zx6Y+b%;WWG$emo4m&dZ@<>}B^UY?7_OJ6=1sdBmg-%aFP=5dKO47w`FI#Hae@Bja- ztxz;@RgiV^C$ScW8r>tKqa;`GuhMHyv;DA6>STPCjVYcp^EA}cj1wY;T&LpSJL&V% zT!TiR&y!xy&nvmMWhF`yPG4Ed>C>=7chdWLY@g}1v9&wtXFjGcAJ6>%9L@ZHgKaxA zIMYiVpZ*2rk%k|n<{H-4^5`p_D0#k@l*dU-(dj%dbKWc(YfNg-0o&kuI2T zraS3$vHW8xI!=JOwsiVY883T8xa^In)1LK8s~1bVYK%UglB!3|JN#A!$~rAy!81`& zK0nvyzfiPvT@K5mprRa4Pv=o`rc=_TD#r*qsNA;%Z!;{x+Oh<`X9+!l&r`T-!(A$9 zOF>%-+EUOOL2Cr95wu3o8bNCUtqHUy(3(JN0<9UeX3&~JYX+?uv{j(30&Nv&t3X=? z+G_mv(Q43E<4ew~L0b*l8qn5&wg$8{psfKdi}(c959q=#WpKIz&`b4zdAL(!I9p(Y zz(#><1cn4g0EgpSNzBSo?4+wjs*?mhCGZvJ%lUig4d<2kIlRMkO2tcnKdO9{4m*ES z_6EK&;T``ra?kSp7WZMlAOA7VsJX3A0Q2aG^Ml&YkRDg;a(w8l@%bE|I6wCI9cvul z$S!yI^()41LT+E-Bu9nbk~7mWNpGDr-!YFW^MbUCUX}WH48H)B8z)W23I4RosAIa` zR^R7XOixvQ-7#B_*58Tr6=T2aXw+XCzT2^jnxyPk#&8Y&9)??UUU00@`Szf}@pAra zj*vb-?={C^?exOkpd9x6(lJ7tR`zSa)=BRc8TykyFrlYMbTBGCHpo6ySKdZb%JD~p- zCsH43Zx#=t)WO2bv?JQon(L6h7rNb{{|cucjgHqn4mzSy?Ty;)((W$WH|kdH6@8WA z0MB(J2emhJ=Y%`7^J!M_L6mKth;h*$D||$I%;_k5LOY^A8GHuxQ}zAYVQp~<>!h^e z585aCvhoi#hwH~<|E6WRzJoFHyDqNh+)A9_jd1;N*cQlqR`6N6UEe?KUs{FhrW$fi zay?%*%(;uMDjeZFtko5ccGkOI%?~;s6WJKHIS)G)7hLY_h6Uc_yhN<=6UUD{_c$9} zzaM`;a?dRLKKMU&v&=2VZt$>euW_AQxW~zQd(HWj^ZS+WIU_E=`-t;0jONX_LoX}- zr}G*~PuF`UN4}vp3VYhzRac$+3`T^(NlXlWmj@C)f>u*SpnDR6I71sl}jjVV5Y~rW-8?N8_ zHP_Wzaeaa77W8Ph^A@rHTV!4|iVU+gK7~E(x~rzl)u?gVM(t4bpw_4@^9^dRxSU2g z=yy%L$N7ru*1!a$e?6Ju(Y!%zw$yOgaZBY9=lL>fcgd*jqF;`k=Q`qg$Y^kV=z6@U zz;&05)Gl(PkCU7q2iaQ8Nh@5RxTe?h%zC)!9GAmzd4u$c^yRSjXJfbHu%oZ&d{?jY zuVw38N2o8j-gQ_T@O8R+wI37&saLzRpc|6Ut-9FN=(=*^7r;|J>KfNBxns;SZqB(0 zvxi6O2(=d6=emzBEdDWSdpUov%WwRpQ*j4ro;|R_1?KVEtzFGSc zpiv&A4>fN6LyhkMPm+GUDgAm=`m)Kmbkt#^*Z5uaZw-fYOXS?y~B9JH_3gw@m;;vz00^3b8457TLVZ- zj371YJN0RxmxA(`b8YE-_hZhE(zDznjJL{GxHlQAMy+-~Xq-|p-+jQfb>fBYr;Nu( z#QYOHz09l~mr zhn0oLWs`I3_@~^j7$b0#e85;l6gU-XlvpugE-^Wb3+WFSRV$T~! z^MuhJhx^`f<2+gJ{>cGPL{`ilPCgagA?c4r{(p=7{}!2NNWc7Uww7J=sCTXBab=~> zPrd6syPO~9b$V`>vJVQ}j*QJuA2zkWQgGVZ|XS+m`1N@it^mpW&=OG?hk zYH;6Q5YCD?R>DJW*KZi{EWG8V0xRGl8{KT@BbpDy$Up)3(fqfkOZ2@8w}y%TgFqNljG9A|X7xwZJs>#;et zcrR@tU>Vf`j-zFO)wCLLDs2QjUEo}SXA8ZFHi3SgP+A3Uq^m)R(?fs>+LLo9-GG{% zj&A@uv^xPS1kM&15;&mUOEZQIO8Rzzd$ccs^C?LmlJsFolauKVC)ZOh=~)8T3LFr) zQ{Wzfhn)A)7lt|YZ06Uw>@0z61r7+jQ)k(p(X$=T`QHURHQ(vVc6=*;9H75oE?|Gb zTGzew{IFJ}Un#g0a6;iuQ1bHbbQL(hQ1}esgyDx>EY-V64=W}^wonEGo6F663tH4VI-YM`If$s`*W(&W-R)Loa+?m6z%*wr&j^qvGGS5Kn9{~4& zGQ&^9m_oytveQ2fz1Zomc3kJ*;So4X;97wL0{d_V`%nCPU#*Tk4!`!AHrM&K^FsYA`XPOi>k8LS*S8QqjWnhj zXBh3qQ^uc-e;T9QGu`d(XQ|iylKTwL`JQc_k35sJwq*5XU6FNn*5g@EXT6>EUe>>} za=q2wdhco8S>C1IQtXqA@;)SJjhBYj{uA ziF1c0^h3j2vTnfD=z~UW=!FI!nFDwydZN*{(HD)LL~k@iW5WTTLyt7<%|`&f4Si_1 zzZnI11n=f*^at$9HSD6t0e(c4fKJCmK$l|@;4nuupx;pgSmKxrSn8;U{w@Y(30(rp z66zPqfMY7s+Z-nYUgkIj@Cv*;x|F^M&ZTq>IG573;9N@AgL5f2Yv2(vQK}NPEE9NKb>ak@kYKiGBjkCVCm1P4rW6Hqoo#Y{L8UCj-6? z&L;XLIGgEha5mE+a5mFB;B3b4a7+b!ADqqj&dMo(zX#_keAlD~P}e2{8d^P|N1F=h z)lLTVX{P|@YSW?j5^%1@cM&E7j@HfqEC=Umym@vq;CSs!zzN`7Lsj5hLqTw^p*nD` zp()^8LnncA4NU{*8afr6b+F3w@GshY1@Dx8K&u?rIp%5iXycscIj?ix?);0>t54H? zt{JXJU9Y-y!)KggTx+~x+~U5&eYU5`bFt?E&&!@SJj=860X`W@|GN+8PdMmJ{xy4F z5Yz$cjpcv9$r=CMEl)nl(-Z;l?8%(WEc+-1xMze5N`c zrZtX)z6H-dd=5KaavgRoG7dXJ#+!5pK6m5u06q_c_9{N(+=m_4ySLMg?(4LN>1+60 zr};gH9d~%P)7_rew7Zf1m*>}b{!u$S>qGf$%KD@B1EhbD<#xV+Cx8A3+63>1_-v=M z@CL>2xZ^XHgf@nkhPO1Ek&gJxbuBIRbu?q<^p=*o79@_%6ym~gcT>34jJ7Q>TYIF8 zMUIAJq3-aKP%IV+wTI_#4oADWM#-Jo+R`#F67T8=_0H`G#p8;IcIxeRn!;OI2$8|2 zWeCQ^W2=$U#}cOqC-;G7EQmzgmWN{9kWFNv87m-rtWBglC(^wkGjnb%j4qrY^EhoB zqo6ivab{E=$1%6mEB1_jTC~i5f;jV3Xy!QShvGh7hI(4i6K!1!$JEo&5n9&~MzUdk zw5Jopqp;<%a9gAm9Zk#WHe`V%TDHVOU7YM}X@NpR9UZ+x zh*H-wWr!YHw9Fn3K?G^88C@S~pC5~vvG`0VbBgN75X^NgQ;+F4TP_nLGf!?ADsw6| zM7vjoTZbrDhZmQQv-J9*h(qwzwVXUu;US1akm_2d4OMsu;t-^|mQ#i*JOptFQhm#* z#}@`^=JeyqOfuVgI>IxlI}~dVcQ?$V<_$4(%aU++r~!^(0j&zh;^Era4YcB{b6S>% zx?4B2;NMG)Zd{6g618RShETLMygVFRWcI{bR)o63bC<(?f|Vlimd&AdSQM>@boYch zmi2VEnw{afW@lH+yij+D;A_CQJhUZhqsep|=PwGyI?ZVB;>bGcjALGRAfe{)VodV0 z%yq=`ke|)5-i49PlC-8gQ_-82xjivXHlcIfoR}A0KYwd?I2we1TyThHe zbIp#9aBDXNj@K>>!`DSxS#|Tbc7Ymhv(!2-9B-8#FAl8>cPubtLP#>LUmp*5CwZWi z7##SLP!ztr4dWdSwKcRsoQ{^3NHoF{CW$e#BaA#&<~*=Lm1dVDX1BG`oSsNW8@|Wf zGAFE9_<4>Q+sMNaYdI$rYYRtPnlVhxCTC%w7+D^R#7*=>5j!K%*_+#!hE+bgCdmz< z__Ant+4>dXj*xVo-4|FuUy8EFXW-xMZCMv?S>MyT5o}@hG|Qq3LXi$&OGBN2+=tm6 z9c*RsrY=B>HqVsgilzp!;5LG#%!^46;LzuU;$f^SkuZA1wj%X(N1`q8n?S^#o5CII zn@w}$l5nSqE^aV;+BbB!V6@u8aL0=0?5MdVegX#3E^K~9cvDY=OJv$UW{xL0uuPxpp~_NY*fpM0!d?o`_l6LS$3kM-+SuHB7gm;tc9 zb*c!Iv?LVo?uo6#8UqVR8g$FDXh-iVHc-isF2zFYndyZ3Tx@Pe_SxZHK+EtV7js$- z)^alrV>F|S!W}GZCoBtz`O!AwrJvSwjH1F7+gZSEZ7?z3=pv>!Qk@K}o@6MsA=(PF zm!X9>u~}Mu+JHunfPJ9d&<@K-x z&h1Ji;Y>H6GjKy;%#0B1D;`z|VkNe#jxa(l&TR{?55WjBXe&a|HnX$IY{hI9rg$ou zbkJh+%j3PR8(<*qhzqd1FYQ5%;%dY3NPASxu9i75=qwzjxuNKsu#G6=SpgT&vZ$vM zITlk}xE(1Tk}W(W*0Nwnhr}}plN7pyb@Z6=WJVJ@2?r8`+o2`lc$}XIN#L$p!)pCOxI2d5d9U1t7a3@pJVk&Cj*w&15d`0mM=9W1<>p01Eu8PDXoL(4; zL@_uJrh7rm?3^3!=xA6E>s7fcdZOKt&Tw;YS9lQyjrqgfj4`i8IoA}w51l4gS*!;a z+f-RWGBn&8B3;n6-I}$%8KO?+UE=6k`C( zVkg4Ep;8%4i7T{;>~pA-0piYZtQ#G*R-Ck1&2AB9zpkfUQjxek*deozR5@I`8RcHv zy|;S;AKT63b2ea#q*gtokC|>zKPDaOgQsLGVjJS=&hE-Cmo`|nYTTewm?IkDZp}4g zU0{}&CanYWVmt>Js4o_3!_0_nOl37oytp6+>wyzU z%TTf+B#g9S^-mQ@23{$WE$#v+fyV?Ea(t%RI`p6e8QIc|vZ~|DaHtcDbY+%M+LmfK zs@SSL-|>Z)#}E>?b|0TH*X-(zMXy`z2kO6(Xl?-3hp>fm(5dM?BYyCu@m(Zo?cE1cs$1b>L$&SAr94a3hW!IEy5 z5RJB^yl|S+J8oTqlGv@Lb3=l(no>#j$PLkucz*oDoE$r#WjXz5SrLw7r3R*AGfPI> zmty`!c&S0~!QLqyZBX$r=WrMkUcYQTsVGUM7a%y_sFJHfv547&@QZm?#3PHa%SJdT z9#;|P^>p{DloeEgQPnCT3$iGRWtg8T;@}kgJt7oN$+F&zm6s9r%>0DB3nH<2w-RdE zdZr}>qzw|#G0hfK)(ktU<_xt-kfD?MjvY@Xrg>sUl{Tfw;!tlGn+?!pmp3Q8A+$Nd z+mH3U>%yLc#g=%OlgFrpHe{-Zu<%Evj5RV`#!?zDRfJ84>Km)AIn++pRC!!b&v67qCO)B5|Hctb}&rrMt~+=`c4lhLB*f z*)F^6aQEz3JI9FDe3~6?gDzS(C=w^EUAr6G;WIXI!_2uOUe#?KW^*zWXnv_XOe*yyEIw}r{F`?Kxs#B;nw zMa?H*#DF3yj>6?gKz#x(#JB$)qg4wJ>ukiWp$_yfxlOVtk>e<7F-x*klG#cia<)>| z3~MNS9GKt)hv%Hy*xS=2EiZE- z%7jsK(hl>iDM~T%6Sh|EQ6`*bhC2wyEuk2mtS!Xyi+LkJ-5B}!;_&)z%mRe85lD>r z*Ne%v6rrOK_#}vJL^7oTSp~5is0|y(eybu_89Mm{K(>$k6f5Nf%o4@BaJa&ov|4*D zuWe&yoFOdZ$;+E-9Js{z>{TR0Sk-CGLA7sEO;`$LXCVg)7B%H`I6O`fGgX>V#fdsW zJ=nfO`PcyRv|Jg-v6>*5opBD`<8ynk_H;t`W<1={doiZ*oZe-z_E5aj>JNz%;lUAO zm+c*<7feMZXJh9cgH9BNy~qaM0AjU?9;*;m2WGDsTPFb@0)yGudqh!L12#x890Br~ zPdbj^y~85#sfl8u@K!64@)7LzhB|0mAjfjN(}r(K#+AGjX5jYdb5H^UNHOxtl)_T& zDGjyo@I#@zAxBXRXT~;{a~GIB(KcECtifKkt|QW}2xcmYC5!j%^Q_>N+U!K^qAj%$ z6+5taZJLx8f>U^;c>gb3U=FJ6`O<=AA2G$UbsWy9_Aq2P#^j83;TZZE#l{*t3E6L@ z@4a~O#JNc%zQM`^j^Ss&Y7uy%S;>q_d5|nRpVC-Ko}*YEMLOQZTS+FTbqVJ>$upDW zdKF%89ci*Xr4BgB>}r8fa^}O%hK*VwpyH$?g|BE*^CX?34kuzM5=(+rM%920HT7WM z6~iuT{#M>WvsU99BVBMNIE_S@B@Zcti4GruRS6+Hmh3RDnLvpn5aSysB-1)5cyhlj znAwf3tfUs=jGK=MXUDBLR;cT_YDsl*W%EoPw+;?Bn$3A8k5jWr*uBbm5|WFsRAPsO zlqeVW$EPN2heE({Dz;|5f=8IBw#5z6^{6G(8EOwpamm*e z#5v)gcax1eE+1+a#!R3*ZzHW3;dplpJ2XDw1u52ztXO!HZC;Bb(M^12f$5NboE1y= z%W7@3Oh#mcb;K~=V33Hgs10Khx6XHF)AvX6I$16RfctGOQ<)#AjG!Ap3F*hB?(K!tZ<@fbHIT_)fBg3Qc27!UM*v`M^Ok{V+*pdJ;eEWOa{GWkwk78Bp5m`&>1u~ybJ;# zzs55tYBzH%%{tk)IW0|ab(x$v3+d>#xkS>1J>hsJWnL__#b%K^fS6_bDhxz`J>)jk zvI%?JVlijz5=9rVWb6dGai*pY>|(tCN}cuFL>}qa@Yrf5haV!oih=n3pf)I(RLFDM3^Weie!aPJ4!8&!cu=R=y zhReGp@TX!T)XL|0=$zcNz&h=vA3PEwr7_#_C%E}^A-x_xr9)lE=TK`;Ol|sP9N1n^ zP^^g$;uqkW&14D>#j^Ek5XnTy6vf^@h7DDuy8(U&k>|4Y^W&`{+={ege95{@OWQ>= z^|+3ya|9TJWpVIZ?cwA?$pe|3r5pP-eh;7vZU#CD zW1Vi{7!yS^Lu$2Cv@RA}=9$rMp7EB4HPu=jm+OA}T@#w!ipwSJ2F;E*j?r;Zg!?y{ z&B?)n#K+zt4{>`;b2s1s&vs*RUU^dpRyv8XjFX+Pol#pRSIXd_z?F!gam?N#``UPTD^7&@SoOFP zU_JgAzz(X^Q3PHy=-v{>iw!v0ilNsqnY5SYI5d~=gy&I@XdbU)5vEcn9^7&pA3e%d z5QW#Thr&teo$n=C|6<0LBSdA^X)dSKX)dSYFd!AnBgva7yvKowhaBu48x1ukSQs=%Gus*e{cJOIQg@(cf68!;ZA93|ue|LEWUP zuz18Nv~=Kz$387$H;ng;OGbXm>CFkU)6OXQ&`~a{dy{2gEO52Z7|uGy zo{|WTl@!%JCdLb1e4vPVhnFUJdSh2_r{+gDM`C7FsC@L)hD8AHBZ6lL>q5ZEFEAzJ z64K4%>erB5Uq{S;H}6{)ZaUMNMa&F>^{wORIW&i{B){ z!7NNp9GUn}SQqq*<$Fo`i@MfZbBZI)za`)1!~1^f=q=qF${IBn=Um;?DsV^>WP7&u zZ7bslge=SC_X+GICzaae$Y~B1^{reQJ>!F+ zHegD%Ds8Wi$%`DkuN2vu#1Mfqx^?STT8G1nmues>=?3{#J}GZw2IBKyJ$rlUi8H5K{Zv z%y(x~FVbZ$xbr1Ku>3y1Fk~&hWUZhlI@n+l>9|d7hkI{`%b}BEM;pAq0KbY? zQh4gsdvyykA1cr8aS;H(fAuTy+kEFx3%+*}#&4Q; z0mkqz1cWI{t$?-EfNxEO$)pZ^+VQ(0G)9#uKS2p%p-V|5Wf2861%R!1 za!DGu0(7pIDG~6^1wD#>aqAIDQzi4v0e2YxagTAZay-{?=2{9mf@1vZ2%TspN>rSp z&IZmcgwQwER1^N&0RA4}cn??j7XZUIckvHoavzlpEVIa(vl$dyPJBJdeHxW>54W6$ zZwEDDG%f(n+TuFf@kESc3qi+Gq!Lsw zIk@u_Y2u)9zcxtUms@-^Vg>L`Xp2V$FTmk@OG?w^V##zw+omLO9^jeag2CG?u^hR(j z#b*m-Fj2Y#G6rZ8+N!}v$;?u)UZc<$%fPMRfWeZ&G5J5&)ryun@E_X-O`0L~wxR}{ zV?ydMq??JFxz=)EooIvYnx@W>R$GOi?USu{C{ETrYpM<-Jp<*{Xm&#Hov>VPyGL4K zE@k8Gz_})zGN7!ouX3bAqQ7!Hd6ZR)JbO|$5VkbTG@e5tXeCTEaA&F^?goocjvqnz zzb?!=RI56sCKM}=#o&qFiIg(7a&(R-J{woJP|dWw4UmJ)T;a(eqR;9*r5^{jLc z&%Z#+U#YoJU}Q-_oBS6|KMMxe}jM3$)V-uk~4psBbUYF5B?<` zK>s#ZVYv(R{B1e;+p?1X8|3hB8=i|tE}mI#ZMc76(4lFDdU8YgE4^-q$e%xOc`p9d zKc%h9^H=7t%+7ScyI$nLqdz{#{HILE67lQb@K%xEKk%692iMFh+_r=VYug&ukzEGGJT~{Zavx;B)j#lB{ULDw;Drhz*oZLJorMg26mV%`3L^W zT)jS+71FRIAj6OEgMZ)+k-d+(2N_(>V0*5ZWwO8ck~7zg|2cODz+k1_y*G-=_58v4 zpyY3}3%rrP?OVle-RkCF@%#iD_>})&X_xzJIcAc7;BfxHZ}JC@hz$<>F@NC0{FQbw zF@Bilz^BSY2R>yA*Hu7Vi`1zZJTEm&Bv#hIr#xQ^@cmX#`jC1&`P&}U#Ata;U9j=N z8QhgeJUlzm2G6f;kKsA29F`PD6@tSw)V%W*<~f|l%s8J9#D{wYy$p2h}2OcEOI4)ULg$5iV)G-jW5!iIZ63 z?_saE5v~9URpOl&Br3HMNEpOJ9*SD2eJ&ACma0k-LZaeFtppN(-*@iJ{@8JxvdcpR zW6#c=nS0MY_uO;Oxij~>chELaJg?-Urde9i?K{l+Xwal<@8hiYXS4@tC5TEbhmiG- zgI3ijKq?NM4n+v5iO3zt9LVbXV8GOB&}toM7BHkPm(9licp+j441|R;!#t7RjRjFhb4?Ts27AH zHWof`9Fz}E#g^>;&M0$idv(-5Wx^wMbsb&@1lOh5>!P@*GRgLfHm%Egvi@9uJjRIB z9Tba)hvPk-M(c(gUBic-qi+K5TFLL62-yv5We&CpPKN$w09qqz5BCgpsaNa_oQ|6~ zraY>D(qS)%`jBoW^$9TJC!CZR9kKTxAfA;XuTD3o=w{(Y1=sc%E7Q1IL4BoahVe}aNo zH7b|}Wfbg9P)v(C(rHm3of5Xv5EuFexcCU{h)AH((1X4K9VmJcno$iMn2==shbdP| zP(?6~O4C=ps*v;_+H3C6ex#Se$c(RIuA54wqDt8V@tEyp(Ai-R2SpfxU;Fp7p=78?Z((mD;Aw+=P1 z(ALFC(H@{9RH9=>H^%f+jqKnYkFp1SSI1AEgNjC1O{Ban;;-!-K_63poGEaNodtL} z_!S|sgE*+T9ri=@4FKuJ=N9cnX-U@75kz|=}E=;PVwOo9%s>emuU{j>gteTg{e7aCK8L3S+ z=-a#k_kbfpBvCaXx(tS4BZH9Kcg=lMN3btw0m0*nD}vSO=yBy@kMtZz2X#w+w{f0| zS&g1_ggkR)#>9sT{wv9hs8LufOqIVfQqt$h>w?T7+DB5EEZHMn<0{xX?Tu8^W?Kep6qN&wa*80_gp5Oz5DNmn}^&=urWCsdWvzq3^BJERAk;Qi0}Xq_2C zm>vcf15{!s?DPoY58Y6;u`fpf4y=^{GsGDzozqGFs~;s-4xv3TnJKmTX-l06^rnH4 z?u7sT=CnpU{i;RNM>10BX25LxiLzc(KFOHSR zK9fB$ny+LgPCTfzmHN7+7O5tz$Tl2Hu)s!I+?rhPIFx&obKtW+6~ z3oMoa#I&P7I-%UxoGYv@bk*V?o(DYQ`U~FxzzuW2FvV4U%TjAVCj)S?x-zm4$e_DV z2XV;-s~)M^%a;0fBl9*;^nNgq?y{0-gQ+d|VCEEQRM_?aJEHmF2H40Rw}nf)%E0N!WaL zySlQh-U7ej_8!B2c-DUWO-nqb0AssW0B9dr6SL%9r6MzsndV=QfyVA4w-fuHJ+nkG z_>@zvT?BmDqBy3%=Q`s}V_!s!750UKZ6%sV=sd>wFW{Gm3SvH<2EyS2j^}`DklP@F9&cqBWtPg9p7!Hvj93Bb?SfEM-#^*7tPBg;|2Kk8%;g(iRwSc?C4qV55 zqEZ5UjKuh9>P7j6Z7Ey-%+N7Mx-3V_?Hpe>qw?nW$40d_zv3XBQ(z|d5K#(B`V1}e?8 zSs)r$1Gobkup-8D*MVVO|gX&Qt zsrG9=zUATLF9#lT!0#x01Di5!(lND1xCJpt*MN=*C9Kr*QkJKKJXm`yOIUwAGt&M~ z%k-qw&n)O)K{<(Wy3ryjepr-zHIZbk^^%u*X-~Vmc6Qgzgru2535j;P3@uv~oXbJ! ZLVfD!_%2>#g1`s4j;Q=U@dGM>e*-IElav4e diff --git a/About/Manifest.xml b/About/Manifest.xml index bac3aa3..0fb5067 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJWSexperienceIdeology - 1.0.1.2 + 1.0.2.0

  • RimJobWorld >= 5.3.0
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index f9784d2..e78e5d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## Version 1.0.2.0 +* Removed Incestuos_IncestOnly conflict with Zoophile +* Patched manual romance to respect incestuous precepts +* Patched SecondaryRomanceChanceFactor for incest precept +* Added settings to disable ether of patches if needed +* Changed Incestuos_IncestOnly would_fuck multiplier for blood related pawns: 2.0 -> 1.0 +* Changed Incestuos_IncestOnly would_fuck multiplier for non-blood related pawns: 1.0 -> 0.1 +* Removed "not obedient" social thought for raping a slave +* Bestiality_Acceptable now nullifies RJW bestiality thoughts +* Fixed swapped baseMoodEffect of holy and elevated pregnancy precepts ## Version 1.0.1.2 * Removed 100% certainty spam for sex proselyzing * Maybe removed sex proselyzing error with bestiality From 83ffa00fb64724e3a81dfd98748b7c4db105f60e Mon Sep 17 00:00:00 2001 From: amevarashi Date: Wed, 28 Jun 2023 20:02:42 +0500 Subject: [PATCH 18/19] Fixed SecondaryRomanceChanceFactor transpiler --- Source/IdeologyAddon/Patches/Rimworld_Patch.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs index 8d4498a..1cbf453 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -1,4 +1,5 @@ using HarmonyLib; +using Mono.Cecil.Cil; using RimWorld; using rjw; using RJWSexperience.Ideology.HistoryEvents; @@ -145,7 +146,7 @@ namespace RJWSexperience.Ideology.Patches // store results in the same place original loop does and remove everything else until Endfinaly IEnumerator enumerator = instructions.GetEnumerator(); - bool endOfInstructions = enumerator.MoveNext(); + bool endOfInstructions = !enumerator.MoveNext(); // Find and replace GetRelations while (!endOfInstructions) @@ -160,7 +161,7 @@ namespace RJWSexperience.Ideology.Patches } yield return instruction; - endOfInstructions = enumerator.MoveNext(); + endOfInstructions = !enumerator.MoveNext(); } if (endOfInstructions) @@ -179,7 +180,7 @@ namespace RJWSexperience.Ideology.Patches break; } - endOfInstructions = enumerator.MoveNext(); + endOfInstructions = !enumerator.MoveNext(); } if (endOfInstructions) @@ -197,7 +198,7 @@ namespace RJWSexperience.Ideology.Patches break; } - endOfInstructions = enumerator.MoveNext(); + endOfInstructions = !enumerator.MoveNext(); } if (endOfInstructions) @@ -211,6 +212,8 @@ namespace RJWSexperience.Ideology.Patches { yield return enumerator.Current; } + + if (Prefs.DevMode) Log.Message("[RSI] Successfully transpiled Pawn_RelationsTracker.SecondaryRomanceChanceFactor"); } [HarmonyPatch(typeof(Precept), nameof(Precept.GetTip))] From a722673244737b9f4c310b294248c397dec2ab3c Mon Sep 17 00:00:00 2001 From: amevarashi Date: Wed, 28 Jun 2023 20:04:08 +0500 Subject: [PATCH 19/19] 1.0.2.1 --- 1.4/Assemblies/RJWSexperience.Ideology.dll | Bin 67584 -> 67584 bytes About/Manifest.xml | 2 +- CHANGELOG.md | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/1.4/Assemblies/RJWSexperience.Ideology.dll b/1.4/Assemblies/RJWSexperience.Ideology.dll index a63afc4417549704e8297b128d9be55eceadb2bf..88b1f5a49f9dcce2e12c60505ed14e67d423d26d 100644 GIT binary patch delta 14986 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 delta 14809 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 diff --git a/About/Manifest.xml b/About/Manifest.xml index 0fb5067..c6907d3 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJWSexperienceIdeology - 1.0.2.0 + 1.0.2.1
  • RimJobWorld >= 5.3.0
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index e78e5d2..97418aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## Version 1.0.2.1 +* Fixed SecondaryRomanceChanceFactor patch ## Version 1.0.2.0 * Removed Incestuos_IncestOnly conflict with Zoophile * Patched manual romance to respect incestuous precepts