diff --git a/1.4/Assemblies/RJWSexperience.Ideology.dll b/1.4/Assemblies/RJWSexperience.Ideology.dll index 88b1f5a..ab82b7a 100644 Binary files a/1.4/Assemblies/RJWSexperience.Ideology.dll and b/1.4/Assemblies/RJWSexperience.Ideology.dll differ diff --git a/1.4/Defs/PreceptDefs/Precepts_Incest.xml b/1.4/Defs/PreceptDefs/Precepts_Incest.xml index 54c079a..df0e490 100644 --- a/1.4/Defs/PreceptDefs/Precepts_Incest.xml +++ b/1.4/Defs/PreceptDefs/Precepts_Incest.xml @@ -27,9 +27,16 @@
  • - -
  • CloseRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
    RSI_CloseRelativeMarriage @@ -37,9 +44,24 @@
  • - -
  • FarRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • GreatGrandparent
  • +
  • GreatGrandchild
  • +
  • GranduncleOrGrandaunt
  • +
  • GrandnephewOrGrandniece
  • +
  • CousinOnceRemoved
  • +
  • SecondCousin
  • +
  • Cousin
  • +
  • Kin
  • +
    RSI_IncestuosMarriage @@ -68,9 +90,16 @@
  • - -
  • CloseRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
    RSI_CloseRelativeSex @@ -78,9 +107,24 @@
  • - -
  • FarRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • GreatGrandparent
  • +
  • GreatGrandchild
  • +
  • GranduncleOrGrandaunt
  • +
  • GrandnephewOrGrandniece
  • +
  • CousinOnceRemoved
  • +
  • SecondCousin
  • +
  • Cousin
  • +
  • Kin
  • +
    RSI_IncestuosSex @@ -101,29 +145,6 @@ 60 1000 100 - -
  • - -
  • CloseRelative
  • -
  • FarRelative
  • -
  • NotRelated
  • - - -
  • - CloseRelative - 1 -
  • -
  • - FarRelative - 1 -
  • -
  • - NotRelated - 1 -
  • -
    - -
    @@ -151,9 +172,16 @@
  • - -
  • CloseRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • Spouse
  • @@ -163,22 +191,6 @@ -
  • - -
  • FarRelative
  • -
  • NotRelated
  • - - -
  • - FarRelative - 1 -
  • -
  • - NotRelated - 1 -
  • -
    -
    @@ -211,10 +223,24 @@
  • - -
  • CloseRelative
  • -
  • FarRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • GreatGrandparent
  • +
  • GreatGrandchild
  • +
  • GranduncleOrGrandaunt
  • +
  • GrandnephewOrGrandniece
  • +
  • CousinOnceRemoved
  • +
  • SecondCousin
  • +
  • Cousin
  • +
  • Kin
  • +
  • Spouse
  • @@ -256,10 +282,24 @@
  • - -
  • CloseRelative
  • -
  • FarRelative
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • GreatGrandparent
  • +
  • GreatGrandchild
  • +
  • GranduncleOrGrandaunt
  • +
  • GrandnephewOrGrandniece
  • +
  • CousinOnceRemoved
  • +
  • SecondCousin
  • +
  • Cousin
  • +
  • Kin
  • +
  • Spouse
  • @@ -269,18 +309,6 @@ -
  • - -
  • - CloseRelative - 0.03 -
  • -
  • - FarRelative - 0.03 -
  • - - @@ -292,6 +320,9 @@ High 0 1000 + +
  • Zoophile
  • +
  • RSI_NonIncestuosMarriage @@ -308,35 +339,30 @@
  • - -
  • NotRelated
  • - + +
  • Parent
  • +
  • Child
  • +
  • Sibling
  • +
  • HalfSibling
  • +
  • Grandparent
  • +
  • Grandchild
  • +
  • NephewOrNiece
  • +
  • UncleOrAunt
  • +
  • GreatGrandparent
  • +
  • GreatGrandchild
  • +
  • GranduncleOrGrandaunt
  • +
  • GrandnephewOrGrandniece
  • +
  • CousinOnceRemoved
  • +
  • SecondCousin
  • +
  • Cousin
  • +
  • Kin
  • +
    - 0.1 + 2.0 -
  • - -
  • CloseRelative
  • -
  • FarRelative
  • - - -
  • - CloseRelative - 1 -
  • -
  • - FarRelative - 1 -
  • -
  • - NotRelated - 0.03 -
  • -
    - diff --git a/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml b/1.4/Defs/PreceptDefs/Precepts_Pregnancy.xml index bdd6015..7e5b69f 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. - 10 + 5
  • @@ -120,19 +120,19 @@
  • I am soon making our colony stronger. - 5 + 10
  • - Pregnancy_Respected_Pregnant_Social + Pregnancy_Respected_Pregnant_Social RJWSexperience.Ideology.PreceptWorkers.ThoughtWorker_Precept_Pregnant_Social Thought_SituationalSocial
  • - 20 + 10
  • @@ -144,7 +144,7 @@
  • - 10 + 20
  • diff --git a/1.4/Defs/PreceptDefs/Precepts_Submissive.xml b/1.4/Defs/PreceptDefs/Precepts_Submissive.xml index aa7ae4d..e69c135 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 - + diff --git a/1.4/Patches/RJW_ThoughtDefs.xml b/1.4/Patches/RJW_ThoughtDefs.xml index 30a1b66..e2e3f6e 100644 --- a/1.4/Patches/RJW_ThoughtDefs.xml +++ b/1.4/Patches/RJW_ThoughtDefs.xml @@ -8,7 +8,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • @@ -20,7 +19,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • @@ -32,7 +30,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • @@ -44,7 +41,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • @@ -56,7 +52,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • @@ -68,7 +63,6 @@
  • Bestiality_OnlyVenerated
  • Bestiality_BondOnly
  • Bestiality_Honorable
  • -
  • Bestiality_Acceptable
  • diff --git a/About/Manifest.xml b/About/Manifest.xml index c6907d3..bac3aa3 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJWSexperienceIdeology - 1.0.2.1 + 1.0.1.2
  • RimJobWorld >= 5.3.0
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index 97418aa..f9784d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,3 @@ -## 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 -* 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 diff --git a/Languages/English/Keyed/RJW_Sexperience.xml b/Languages/English/Keyed/RJW_Sexperience.xml index 83d2026..9550b00 100644 --- a/Languages/English/Keyed/RJW_Sexperience.xml +++ b/Languages/English/Keyed/RJW_Sexperience.xml @@ -9,16 +9,4 @@ 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} - - - \ No newline at end of file diff --git a/Source/IdeologyAddon/BloodRelationDegree.cs b/Source/IdeologyAddon/BloodRelationDegree.cs deleted file mode 100644 index e23f9ee..0000000 --- a/Source/IdeologyAddon/BloodRelationDegree.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace RJWSexperience.Ideology -{ - public enum BloodRelationDegree - { - CloseRelative, - FarRelative, - NotRelated - } -} diff --git a/Source/IdeologyAddon/DebugAction.cs b/Source/IdeologyAddon/DebugAction.cs index 55838d7..9655f50 100644 --- a/Source/IdeologyAddon/DebugAction.cs +++ b/Source/IdeologyAddon/DebugAction.cs @@ -1,37 +1,20 @@ using rjw; using RJWSexperience.Ideology.HistoryEvents; -using RJWSexperience.Ideology.Patches; -using System.Collections.Generic; using System.Linq; using Verse; namespace RJWSexperience.Ideology { - internal static class DebugAction + internal class DebugAction { [DebugAction("RJW Sexperience Ideology", "Test marriage event", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)] - public static void GenerateMarriageEvent(Pawn p) + private static void GenerateMarriageEvent(Pawn p) { Pawn hero = p.Map.PlayerPawnsForStoryteller.First(x => x.IsDesignatedHero()); if (hero == null) return; - 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)] - 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); + RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(hero, p); + RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(p, hero); } } } diff --git a/Source/IdeologyAddon/Filters/TwoPawnFilter.cs b/Source/IdeologyAddon/Filters/TwoPawnFilter.cs deleted file mode 100644 index c0580b0..0000000 --- a/Source/IdeologyAddon/Filters/TwoPawnFilter.cs +++ /dev/null @@ -1,34 +0,0 @@ -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/Harmony.cs b/Source/IdeologyAddon/Harmony.cs index d756855..08a78d0 100644 --- a/Source/IdeologyAddon/Harmony.cs +++ b/Source/IdeologyAddon/Harmony.cs @@ -1,14 +1,25 @@ -using System.Reflection; +using HarmonyLib; +using RJWSexperience.Ideology.Patches; +using System.Reflection; using Verse; namespace RJWSexperience.Ideology { [StaticConstructorOnStartup] - internal static class Harmony + internal static class First { - static Harmony() + static First() { - new HarmonyLib.Harmony("RJW_Sexperience.Ideology").PatchAll(Assembly.GetExecutingAssembly()); + 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)) + ); + } } } } diff --git a/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs b/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs index 9c9e3f1..dc61b89 100644 --- a/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs +++ b/Source/IdeologyAddon/HistoryEvents/TwoPawnEventRule.cs @@ -1,22 +1,16 @@ 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/IdeoUtility.cs b/Source/IdeologyAddon/IdeoUtility.cs index 05ffd75..4b44cce 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(RsiDefOf.Precept.Submissive_Female) && pawn.gender == Gender.Female) + if (ideo.HasPrecept(VariousDefOf.Submissive_Female) && pawn.gender == Gender.Female) return true; - else if (ideo.HasPrecept(RsiDefOf.Precept.Submissive_Male) && pawn.gender == Gender.Male) + else if (ideo.HasPrecept(VariousDefOf.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 && RsiDefOf.Hediff.PregnantHuman != null) + if (pregnancy == null && VariousDefOf.PregnantHuman != null) { pregnancy = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.PregnantHuman); } diff --git a/Source/IdeologyAddon/IdeologyAddon.csproj b/Source/IdeologyAddon/IdeologyAddon.csproj index f791556..651dd5b 100644 --- a/Source/IdeologyAddon/IdeologyAddon.csproj +++ b/Source/IdeologyAddon/IdeologyAddon.csproj @@ -42,7 +42,6 @@ - @@ -53,19 +52,16 @@ - - - - - - - + + + + @@ -88,19 +84,17 @@ - - - + - 1.4.3704 + 1.4.3537 2.2.2 diff --git a/Source/IdeologyAddon/Keyed.cs b/Source/IdeologyAddon/Keyed.cs index 4083479..8a98c01 100644 --- a/Source/IdeologyAddon/Keyed.cs +++ b/Source/IdeologyAddon/Keyed.cs @@ -4,17 +4,11 @@ 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/RJW_Patch_ChancePerHour.cs b/Source/IdeologyAddon/Patches/RJW_Patch_ChancePerHour.cs index 18d8550..2a22c2c 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 (!RsiDefOf.HistoryEvent.RSI_SexWithAnimal.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiHistoryEventDefOf.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 (!RsiDefOf.HistoryEvent.RSI_Raped.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiHistoryEventDefOf.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 (!RsiDefOf.HistoryEvent.RSI_SexWithCorpse.CreateEvent(pawn).DoerWillingToDo()) + if (!RsiHistoryEventDefOf.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 (!RsiDefOf.HistoryEvent.RSI_Masturbated.CreateEvent(p).DoerWillingToDo()) + if (!RsiHistoryEventDefOf.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 4a06922..f387f14 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(RsiDefOf.Meme.Rapist); + __result = __result || ideo.HasMeme(VariousDefOf.Rapist); } } } @@ -32,7 +32,7 @@ namespace RJWSexperience.Ideology.Patches Ideo ideo = pawn.Ideo; if (ideo != null) { - __result = __result || ideo.HasMeme(RsiDefOf.Meme.Zoophile); + __result = __result || ideo.HasMeme(VariousDefOf.Zoophile); } } } @@ -45,7 +45,7 @@ namespace RJWSexperience.Ideology.Patches Ideo ideo = pawn.Ideo; if (ideo != null) { - __result = __result || ideo.HasMeme(RsiDefOf.Meme.Necrophile); + __result = __result || ideo.HasMeme(VariousDefOf.Necrophile); } } } @@ -85,10 +85,10 @@ namespace RJWSexperience.Ideology.Patches private static void AfterSexHuman(Pawn human, Pawn partner) { - RsiDefOf.HistoryEvent.RSI_NonIncestuosSex.RecordEventWithPartner(human, partner); + RsiHistoryEventDefOf.RSI_NonIncestuosSex.RecordEventWithPartner(human, partner); if (partner.IsAnimal()) - RsiDefOf.HistoryEvent.RSI_SexWithAnimal.RecordEventWithPartner(human, partner); + RsiHistoryEventDefOf.RSI_SexWithAnimal.RecordEventWithPartner(human, partner); } } @@ -113,13 +113,11 @@ namespace RJWSexperience.Ideology.Patches public static float PreceptSextype(Pawn pawn, Pawn partner, float score, List historyEventDefs) { - for (int i = 0; i < historyEventDefs.Count; i++) + foreach(HistoryEventDef eventDef in historyEventDefs) { - 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, cacheStaleAfterTicks: 60))); + float mult = 8.0f * Math.Max(0.3f, 1 / Math.Max(0.01f, pawn.GetStatValue(xxx.sex_drive_stat))); return score * mult; } } @@ -150,7 +148,7 @@ namespace RJWSexperience.Ideology.Patches public static void Postfix(Pawn pawn, ref bool __result) { Ideo ideo = pawn.Ideo; - if (ideo?.HasMeme(RsiDefOf.Meme.Zoophile) == true) + if (ideo?.HasMeme(VariousDefOf.Zoophile) == true) { SaveStorage.DataStore.GetPawnData(pawn).CanDesignateBreeding = true; __result = true; @@ -215,14 +213,14 @@ namespace RJWSexperience.Ideology.Patches Ideo mainideo = playerfaction.ideos.PrimaryIdeo; if (mainideo != null) { - if (mainideo.HasPrecept(RsiDefOf.Precept.BabyFaction_AlwaysFather)) + if (mainideo.HasPrecept(VariousDefOf.BabyFaction_AlwaysFather)) { Pawn parent = baby.GetFather() ?? baby.GetMother(); ideo = parent.Ideo; return parent.Faction; } - else if (mainideo.HasPrecept(RsiDefOf.Precept.BabyFaction_AlwaysColony)) + else if (mainideo.HasPrecept(VariousDefOf.BabyFaction_AlwaysColony)) { ideo = mainideo; return playerfaction; @@ -243,7 +241,7 @@ namespace RJWSexperience.Ideology.Patches if (props.pawn?.Ideo == null || !props.hasPartner()) return; - if (props.partner.Ideo?.HasPrecept(RsiDefOf.Precept.ProselyzingByOrgasm) == true) + if (props.partner.Ideo?.HasPrecept(VariousDefOf.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 1cbf453..e50098e 100644 --- a/Source/IdeologyAddon/Patches/Rimworld_Patch.cs +++ b/Source/IdeologyAddon/Patches/Rimworld_Patch.cs @@ -1,14 +1,9 @@ using HarmonyLib; -using Mono.Cecil.Cil; using RimWorld; using rjw; using RJWSexperience.Ideology.HistoryEvents; using RJWSexperience.Ideology.Precepts; using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Reflection.Emit; -using System.Text; using Verse; namespace RJWSexperience.Ideology.Patches @@ -18,8 +13,8 @@ namespace RJWSexperience.Ideology.Patches { public static void Postfix(Pawn firstPawn, Pawn secondPawn) { - RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(firstPawn, secondPawn); - RsiDefOf.HistoryEvent.RSI_NonIncestuosMarriage.RecordEventWithPartner(secondPawn, firstPawn); + RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(firstPawn, secondPawn); + RsiHistoryEventDefOf.RSI_NonIncestuosMarriage.RecordEventWithPartner(secondPawn, firstPawn); } } @@ -58,193 +53,4 @@ 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 - /// - /// Pawn to try do romance - /// Target for romance - /// Result of the original method - /// Run original method implementation - 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 == RsiDefOf.Issue.Incestuos); - var allowManualRomanceOnlyFor = incestuousPrecept?.GetModExtension()?.allowManualRomanceOnlyFor; - BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(one, two); - - if (allowManualRomanceOnlyFor == null) - { - return relationDegree < BloodRelationDegree.NotRelated; - } - - return !allowManualRomanceOnlyFor.Contains(relationDegree); - } - } - - [HarmonyPatch(typeof(Pawn_RelationsTracker), nameof(Pawn_RelationsTracker.SecondaryRomanceChanceFactor))] - public static class Rimworld_Patch_SecondaryRomanceChanceFactor - { - public static bool Prepare() => RsiMod.Prefs.patchRomanceChanceFactor; - - /// - /// - /// 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) }); - - // 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 - - IEnumerator enumerator = instructions.GetEnumerator(); - bool endOfInstructions = !enumerator.MoveNext(); - - // Find and replace GetRelations - while (!endOfInstructions) - { - var instruction = enumerator.Current; - - if (instruction.Calls(getRelationsInfo)) - { - yield return new CodeInstruction(OpCodes.Call, helperInfo); - 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; - } - - if (Prefs.DevMode) Log.Message("[RSI] Successfully transpiled Pawn_RelationsTracker.SecondaryRomanceChanceFactor"); - } - - [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/Patches/Sexperience_Patch.cs b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs index 4f7471e..6951eea 100644 --- a/Source/IdeologyAddon/Patches/Sexperience_Patch.cs +++ b/Source/IdeologyAddon/Patches/Sexperience_Patch.cs @@ -1,25 +1,21 @@ -using HarmonyLib; -using rjw; +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; if (props.isRape && exVirgin == props.partner) - RsiDefOf.HistoryEvent.RSI_VirginStolen.RecordEventWithPartner(exVirgin, partner); + RsiHistoryEventDefOf.RSI_VirginStolen.RecordEventWithPartner(exVirgin, partner); else if (degree != femaleAfterSurgery) - RsiDefOf.HistoryEvent.RSI_VirginTaken.RecordEventWithPartner(exVirgin, partner); + RsiHistoryEventDefOf.RSI_VirginTaken.RecordEventWithPartner(exVirgin, partner); - RsiDefOf.HistoryEvent.RSI_TookVirgin.RecordEventWithPartner(partner, exVirgin); + RsiHistoryEventDefOf.RSI_TookVirgin.RecordEventWithPartner(partner, exVirgin); } } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs b/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs deleted file mode 100644 index caf0ed0..0000000 --- a/Source/IdeologyAddon/Precepts/DefExtension_Incest.cs +++ /dev/null @@ -1,73 +0,0 @@ -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; - 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/Precepts/DefExtension_ModifyBestialityMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs index 111ee69..1d97595 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyBestialityMtb.cs @@ -2,6 +2,5 @@ { 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 f01c4ed..8596b28 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyFappinMtb.cs @@ -2,6 +2,5 @@ { 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 361ceb1..e1553f3 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyMtb.cs @@ -1,28 +1,11 @@ -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using Verse; namespace RJWSexperience.Ideology.Precepts { - [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 + public abstract class DefExtension_ModifyMtb : DefModExtension { - protected abstract string TipTemplateKey { get; } - + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] 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 ce35b27..3e544f7 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyNecroMtb.cs @@ -2,6 +2,5 @@ { public class DefExtension_ModifyNecroMtb : DefExtension_ModifyMtb { - protected override string TipTemplateKey => "RSI_PreceptTipModifyNecroMtb"; } } diff --git a/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs index 19689bb..698bda1 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyPreference.cs @@ -1,41 +1,30 @@ -using RJWSexperience.Ideology.Filters; -using System.Collections.Generic; +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.Where(rule => rule.Applies(pawn, partner))) + foreach (Rule rule in rules) { - preference *= rule.multiplier; + if (rule.Applies(pawn, partner)) + 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/Precepts/DefExtension_ModifyRapeCPMtb.cs b/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs index ff09728..e83be70 100644 --- a/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs +++ b/Source/IdeologyAddon/Precepts/DefExtension_ModifyRapeCPMtb.cs @@ -2,6 +2,5 @@ { 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 deleted file mode 100644 index 85411fb..0000000 --- a/Source/IdeologyAddon/Precepts/IPreceptTipPostfix.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RJWSexperience.Ideology.Precepts -{ - public interface IPreceptTipPostfix - { - string GetTip(); - } -} diff --git a/Source/IdeologyAddon/Filters/RelationFilter.cs b/Source/IdeologyAddon/RelationFilter.cs similarity index 64% rename from Source/IdeologyAddon/Filters/RelationFilter.cs rename to Source/IdeologyAddon/RelationFilter.cs index 732ed7e..cff5738 100644 --- a/Source/IdeologyAddon/Filters/RelationFilter.cs +++ b/Source/IdeologyAddon/RelationFilter.cs @@ -3,33 +3,31 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Verse; -namespace RJWSexperience.Ideology.Filters +namespace RJWSexperience.Ideology { - /// - /// 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 List hasOneOfRelations; + [SuppressMessage("Minor Code Smell", "S1104:Fields should not have public accessibility", Justification = "Field value loaded from XML")] 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 - /// public bool Applies(Pawn pawn, Pawn partner) { - // Fail if any single condition fails if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner)) return false; + //if (isAlien != null && isAlien != partner) + // return false; + if (!CheckRelations(pawn, partner)) return false; @@ -41,14 +39,9 @@ namespace RJWSexperience.Ideology.Filters if (!initialized) Initialize(); - if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && hasOneOfRelationDegreesHashed == null) + if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null) return true; - if (hasOneOfRelationDegreesHashed != null && !hasOneOfRelationDegreesHashed.Contains(RelationHelpers.GetBloodRelationDegree(pawn, partner))) - { - return false; - } - IEnumerable relations = pawn.GetRelations(partner); if (hasOneOfRelationsHashed != null) @@ -76,9 +69,6 @@ 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/RelationHelpers.cs b/Source/IdeologyAddon/RelationHelpers.cs deleted file mode 100644 index 1033307..0000000 --- a/Source/IdeologyAddon/RelationHelpers.cs +++ /dev/null @@ -1,52 +0,0 @@ -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) - { - if (!pawn.relations.FamilyByBlood.Contains(partner)) - { - return BloodRelationDegree.NotRelated; - } - - 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/Rituals/JobGiver_DrugOrgy.cs b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs index 82a541e..a7eacb0 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_DrugOrgy.cs @@ -1,47 +1,56 @@ -using RimWorld; -using rjw; -using System; +using System; using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using rjw; 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 || pawn.mindState == null) - { - return null; - } + 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; - PawnDuty duty = pawn.mindState.duty; + if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; + } + + Pawn target = FindPartner(pawn, duty); - if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; - } + if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None,1)) return JobMaker.MakeJob(VariousDefOf.DrugMasturbate); - Pawn target = FindPartner(pawn, duty); + return JobMaker.MakeJob(VariousDefOf.DrugSex, target); + } - if (target == null || !pawn.CanReserveAndReach(target, PathEndMode.ClosestTouch, Danger.None, 1)) - return JobMaker.MakeJob(RsiDefOf.Job.DrugMasturbate); + 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 JobMaker.MakeJob(RsiDefOf.Job.DrugSex, target); - } + return null; + } - 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 @@ -56,7 +65,7 @@ namespace RJWSexperience.Ideology protected override IEnumerable MakeNewToils() { setup_ticks(); - var PartnerJob = RsiDefOf.Job.GettinDrugSex; + var PartnerJob = VariousDefOf.GettinDrugSex; this.FailOnDespawnedNullOrForbidden(iTarget); this.FailOn(() => !Partner.health.capacities.CanBeAwake); @@ -64,52 +73,47 @@ namespace RJWSexperience.Ideology this.FailOn(() => Partner == null); yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell); - Toil WaitForPartner = new Toil + Toil WaitForPartner = new Toil(); + WaitForPartner.defaultCompleteMode = ToilCompleteMode.Delay; + WaitForPartner.initAction = delegate { - defaultCompleteMode = ToilCompleteMode.Delay, - initAction = delegate + ticksLeftThisToil = 5000; + }; + WaitForPartner.tickAction = delegate + { + pawn.GainComfortFromCellIfPossible(); + if (pawn.Position.DistanceTo(Partner.Position) <= 1f) { - ticksLeftThisToil = 5000; - }, - tickAction = delegate - { - pawn.GainComfortFromCellIfPossible(); - if (pawn.Position.DistanceTo(Partner.Position) <= 1f) - { - ReadyForNextToil(); - } + ReadyForNextToil(); } }; yield return WaitForPartner; - Toil StartPartnerJob = new Toil + Toil StartPartnerJob = new Toil(); + StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; + StartPartnerJob.socialMode = RandomSocialMode.Off; + StartPartnerJob.initAction = delegate { - 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); - } + var dri = Partner.jobs.curDriver as JobDriver_DrugSexReceiver; + if (dri == null) + { + Job gettingQuickie = JobMaker.MakeJob(PartnerJob, pawn, Partner); + Partner.jobs.StartJob(gettingQuickie, JobCondition.InterruptForced); } }; yield return StartPartnerJob; - Toil SexToil = new Toil - { - defaultCompleteMode = ToilCompleteMode.Never, - socialMode = RandomSocialMode.Off, - defaultDuration = duration, - handlingFacing = true - }; + Toil SexToil = new Toil(); + SexToil.defaultCompleteMode = ToilCompleteMode.Never; + SexToil.socialMode = RandomSocialMode.Off; + SexToil.defaultDuration = duration; + SexToil.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); }; @@ -143,7 +147,8 @@ namespace RJWSexperience.Ideology /// copied from rjw /// public class JobDriver_DrugSexReceiver : JobDriver_SexBaseRecieverLoved - { + { + protected override IEnumerable MakeNewToils() { setup_ticks(); @@ -163,25 +168,23 @@ 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 + Toil get_loved = new Toil(); + get_loved.defaultCompleteMode = ToilCompleteMode.Never; + get_loved.socialMode = RandomSocialMode.Off; + get_loved.handlingFacing = true; + get_loved.tickAction = delegate { - 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; } @@ -201,7 +204,8 @@ namespace RJWSexperience.Ideology /// copied from rjw /// public class JobDriver_DrugMasturabate : JobDriver_Masturbate - { + { + protected override IEnumerable MakeNewToils() { setup_ticks(); @@ -248,4 +252,6 @@ namespace RJWSexperience.Ideology }; } } + + } diff --git a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs index eae27e5..dc6dc15 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangConsensual.cs @@ -1,36 +1,43 @@ -using RimWorld; -using rjw; -using System; +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 || pawn.mindState == null) - { - return null; - } + 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; - PawnDuty duty = pawn.mindState.duty; + if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; + } - if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; - } + Pawn target = duty.focusSecond.Pawn; - Pawn target = duty.focusSecond.Pawn; + if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; - if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) - return null; + return JobMaker.MakeJob(VariousDefOf.Gangbang, target); + } + } - return JobMaker.MakeJob(RsiDefOf.Job.Gangbang, target); - } - } public class JobDriver_Gangbang : JobDriver_SexBaseInitiator { @@ -49,28 +56,26 @@ namespace RJWSexperience.Ideology this.FailOn(() => Partner.Drafted); yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell); - Toil StartPartnerJob = new Toil + Toil StartPartnerJob = new Toil(); + StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; + StartPartnerJob.socialMode = RandomSocialMode.Off; + StartPartnerJob.initAction = delegate { - 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); - } + + var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped; + if (dri == null) + { + Job gettin_loved = JobMaker.MakeJob(VariousDefOf.GettinGangbang, pawn, Bed); + Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced); } }; yield return StartPartnerJob; - Toil SexToil = new Toil - { - defaultCompleteMode = ToilCompleteMode.Never, - defaultDuration = duration, - handlingFacing = true - }; - SexToil.FailOn(() => Partner.CurJob.def != RsiDefOf.Job.GettinGangbang); + Toil SexToil = new Toil(); + SexToil.defaultCompleteMode = ToilCompleteMode.Never; + SexToil.defaultDuration = duration; + SexToil.handlingFacing = true; + SexToil.FailOn(() => Partner.CurJob.def != VariousDefOf.GettinGangbang); SexToil.initAction = delegate { Start(); @@ -103,30 +108,28 @@ 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 + Toil get_banged = new Toil(); + get_banged.defaultCompleteMode = ToilCompleteMode.Never; + get_banged.handlingFacing = true; + get_banged.initAction = delegate { - 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); - } + 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); }; get_banged.AddEndCondition(new Func(() => { - if (parteners.Count == 0) + if (parteners.Count <= 0) { return JobCondition.Succeeded; } @@ -145,12 +148,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 092b00b..ce2ec72 100644 --- a/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs +++ b/Source/IdeologyAddon/Rituals/JobGiver_GangbangVictim.cs @@ -1,46 +1,56 @@ -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_GangbangVictim : ThinkNode_JobGiver - { - protected override Job TryGiveJob(Pawn pawn) - { - if (pawn.Drafted || pawn.mindState == null) - { - return null; - } + 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; - PawnDuty duty = pawn.mindState.duty; - - if (duty.def == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) - { - return null; + if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_do_loving(pawn)) + { + return null; } Pawn target = duty.focusSecond.Pawn; - if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; + if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null; + + return JobMaker.MakeJob(VariousDefOf.RapeVictim, target); + } + } - 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(); @@ -54,28 +64,25 @@ namespace RJWSexperience.Ideology SexUtility.RapeTargetAlert(pawn, Partner); - Toil StartPartnerJob = new Toil + Toil StartPartnerJob = new Toil(); + StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; + StartPartnerJob.socialMode = RandomSocialMode.Off; + StartPartnerJob.initAction = delegate { - defaultCompleteMode = ToilCompleteMode.Instant, - socialMode = RandomSocialMode.Off, - initAction = delegate + var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped; + if (dri == null) { - if (!(Partner.jobs.curDriver is JobDriver_SexBaseRecieverRaped)) - { - Job gettin_raped = JobMaker.MakeJob(PartnerJob, pawn); + 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 - { - defaultCompleteMode = ToilCompleteMode.Never, - defaultDuration = duration, - handlingFacing = true - }; + Toil SexToil = new Toil(); + SexToil.defaultCompleteMode = ToilCompleteMode.Never; + SexToil.defaultDuration = duration; + SexToil.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 b496689..e976d61 100644 --- a/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs +++ b/Source/IdeologyAddon/Rituals/LordJob_Rituals.cs @@ -1,15 +1,21 @@ -using RimWorld; +using System; 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)) @@ -19,5 +25,6 @@ namespace RJWSexperience.Ideology } } } + } } diff --git a/Source/IdeologyAddon/Rituals/RitualRoles.cs b/Source/IdeologyAddon/Rituals/RitualRoles.cs index e7fb7fc..0d26048 100644 --- a/Source/IdeologyAddon/Rituals/RitualRoles.cs +++ b/Source/IdeologyAddon/Rituals/RitualRoles.cs @@ -1,101 +1,106 @@ using RimWorld; -using rjw; using Verse; +using rjw; 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 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 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 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 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 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 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 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 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 static bool CanBeBreedee(Pawn pawn) + { + if (xxx.can_be_fucked(pawn)) return true; + return false; + } + } - public static bool CanBeBreedee(Pawn pawn) => xxx.can_be_fucked(pawn); - } + public class RitualRole_AnimalBreeder : RitualRole + { + public override bool Animal => true; - public class RitualRole_AnimalBreeder : RitualRole - { - public override bool Animal => true; + 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 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 (!p.IsAnimal()) + { + reason = Keyed.RSNotAnimal; + return false; + } + if (CanBeBreeder(p, assignments?.Ritual)) return true; + if (!skipReason) + { + reason = Keyed.RSBreederCondition; + } + 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 (!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)) + public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept) + { + if (precept != null && precept.ideo.HasPrecept(VariousDefOf.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; + } + + } + + } diff --git a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs b/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs deleted file mode 100644 index 6d970f3..0000000 --- a/Source/IdeologyAddon/RomanceChanceFactorHelpers.cs +++ /dev/null @@ -1,89 +0,0 @@ -using RimWorld; -using RJWSexperience.Ideology.Precepts; -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) - { - float romanceChanceFactor = 1f; - - if (!pawn.relations.FamilyByBlood.Contains(partner)) - { - if (pawn.Ideo?.HasPrecept(RsiDefOf.Precept.Incestuos_IncestOnly) == true) - { - return parentRomanceChanceFactor; - } - else - { - return romanceChanceFactor; - } - } - - 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) - { - romanceChanceFactor *= GetRomanceChanceFactor(relationDef, incestuousPrecept); - } - - return romanceChanceFactor; - } - - /// - /// Get ideology adjusted romanceChanceFactor for the relation - /// - public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept) - { - if (incestuousPrecept == null) - { - return relationDef.romanceChanceFactor; - } - - var incestDefExt = incestuousPrecept.GetModExtension(); - - if (incestDefExt == null) - { - return relationDef.romanceChanceFactor; - } - - BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(relationDef); - - if (incestDefExt.TryGetRomanceChanceFactor(relationDegree, out var romanceChanceOverride)) - { - return romanceChanceOverride; - } - - 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 == RsiDefOf.Issue.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/RsiDefOf.cs b/Source/IdeologyAddon/RsiDefOf.cs deleted file mode 100644 index d5b0cfa..0000000 --- a/Source/IdeologyAddon/RsiDefOf.cs +++ /dev/null @@ -1,65 +0,0 @@ -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 new file mode 100644 index 0000000..0155d66 --- /dev/null +++ b/Source/IdeologyAddon/RsiHistoryEventDefOf.cs @@ -0,0 +1,18 @@ +using RimWorld; + +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; + } +} diff --git a/Source/IdeologyAddon/RsiMod.cs b/Source/IdeologyAddon/RsiMod.cs deleted file mode 100644 index 66dab60..0000000 --- a/Source/IdeologyAddon/RsiMod.cs +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 215b625..0000000 --- a/Source/IdeologyAddon/RsiSettings.cs +++ /dev/null @@ -1,17 +0,0 @@ -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); - } - } -} diff --git a/Source/IdeologyAddon/Filters/SinglePawnFilter.cs b/Source/IdeologyAddon/SinglePawnFilter.cs similarity index 50% rename from Source/IdeologyAddon/Filters/SinglePawnFilter.cs rename to Source/IdeologyAddon/SinglePawnFilter.cs index 40e7a0a..daa240f 100644 --- a/Source/IdeologyAddon/Filters/SinglePawnFilter.cs +++ b/Source/IdeologyAddon/SinglePawnFilter.cs @@ -2,24 +2,19 @@ using System.Diagnostics.CodeAnalysis; using Verse; -namespace RJWSexperience.Ideology.Filters +namespace RJWSexperience.Ideology { - /// - /// 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/TwoPawnFilter.cs b/Source/IdeologyAddon/TwoPawnFilter.cs new file mode 100644 index 0000000..7c49f92 --- /dev/null +++ b/Source/IdeologyAddon/TwoPawnFilter.cs @@ -0,0 +1,30 @@ +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; + } + } +} diff --git a/Source/IdeologyAddon/VariousDefOf.cs b/Source/IdeologyAddon/VariousDefOf.cs new file mode 100644 index 0000000..fb926ce --- /dev/null +++ b/Source/IdeologyAddon/VariousDefOf.cs @@ -0,0 +1,27 @@ +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; + + [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; + [MayRequireBiotech] public static readonly HediffDef PregnantHuman; + } +}