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); } } }