using RimWorld; using rjw; using System; using System.Collections.Generic; using Verse; namespace RJWSexperience.Ideology { [StaticConstructorOnStartup] public static class IdeoUtility { public static bool IsSubmissive(this Pawn pawn) { Ideo ideo = pawn.Ideo; if (ideo == null) return false; if (ideo.HasPrecept(VariousDefOf.Submissive_Female) && pawn.gender == Gender.Female) return true; else if (ideo.HasPrecept(VariousDefOf.Submissive_Male) && pawn.gender == Gender.Male) return true; return false; } public static bool ContainAll(string str, string[] tags) { if (tags.NullOrEmpty()) return true; string lstr = str.ToLower(); for (int i = 0; i < tags.Length; i++) { if (!lstr.Contains('[' + tags[i].ToLower() + ']')) return false; } return true; } public static bool IsIncest(Pawn pawn, Pawn partner) { IEnumerable relations = pawn.GetRelations(partner); if (relations.EnumerableNullOrEmpty()) return false; bool wide = pawn.Ideo?.HasPrecept(VariousDefOf.Incestuos_Disapproved_CloseOnly) == true; foreach (PawnRelationDef relation in relations) { if (wide) { if (relation.incestOpinionOffset < 0) return true; } else if (relation.familyByBloodRelation) { return true; } } return false; } public static float GetPreceptsMtbMultiplier(Ideo ideo) where T : Precepts.DefExtension_ModifyMtb { float finalMultiplier = 1f; for (int i = 0; i < ideo.PreceptsListForReading.Count; i++) { T defExtension = ideo.PreceptsListForReading[i].def.GetModExtension(); if (defExtension == null) continue; if (defExtension.disable) return -1f; finalMultiplier *= defExtension.multiplier; } return finalMultiplier; } public static HistoryEventDef GetSextypeEventDef(xxx.rjwSextype sextype) { if (historyEventBySextype.TryGetValue(sextype, out HistoryEventDef historyEventDef)) return historyEventDef; return null; } public static HistoryEventDef GetSextypeEventDef(string sextype) { if (!Enum.TryParse(sextype, out xxx.rjwSextype rjwSextype)) return null; return GetSextypeEventDef(rjwSextype); } private static readonly Dictionary historyEventBySextype = BuildHistoryEventBySextype(); private static Dictionary BuildHistoryEventBySextype() { Dictionary dictionary = new Dictionary(); foreach (HistoryEventDef historyEventDef in DefDatabase.AllDefsListForReading) { HistoryEventDefExtension_AssociatedSextypes associatedSextypes = historyEventDef.GetModExtension(); if (associatedSextypes == null) continue; foreach (xxx.rjwSextype sextype in associatedSextypes.sextypes) { if (!dictionary.TryAdd(sextype, historyEventDef)) Log.Error($"[Sexperience.Ideology] Error in HistoryEventDef {historyEventDef.defName}: {sextype} sextype is already associated with {dictionary[sextype].defName} HistoryEventDef"); } } return dictionary; } } }