Compare commits

..

No commits in common. "f7206347da813223dbc8fafc9495de92a96ba66c" and "7107947cacdba4ac1750c706a9ec09c25b1ce15e" have entirely different histories.

8 changed files with 101 additions and 175 deletions

View file

@ -27,9 +27,16 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <hasOneOfRelations>
<li>CloseRelative</li> <li>Parent</li>
</hasOneOfRelationDegrees> <li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
</relations> </relations>
</filter> </filter>
<historyEventDef>RSI_CloseRelativeMarriage</historyEventDef> <historyEventDef>RSI_CloseRelativeMarriage</historyEventDef>
@ -37,9 +44,7 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <isBloodRelated>true</isBloodRelated>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
</relations> </relations>
</filter> </filter>
<historyEventDef>RSI_IncestuosMarriage</historyEventDef> <historyEventDef>RSI_IncestuosMarriage</historyEventDef>
@ -68,9 +73,16 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <hasOneOfRelations>
<li>CloseRelative</li> <li>Parent</li>
</hasOneOfRelationDegrees> <li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
</relations> </relations>
</filter> </filter>
<historyEventDef>RSI_CloseRelativeSex</historyEventDef> <historyEventDef>RSI_CloseRelativeSex</historyEventDef>
@ -78,9 +90,7 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <isBloodRelated>true</isBloodRelated>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
</relations> </relations>
</filter> </filter>
<historyEventDef>RSI_IncestuosSex</historyEventDef> <historyEventDef>RSI_IncestuosSex</historyEventDef>
@ -108,20 +118,6 @@
<li>FarRelative</li> <li>FarRelative</li>
<li>NotRelated</li> <li>NotRelated</li>
</allowManualRomanceOnlyFor> </allowManualRomanceOnlyFor>
<bloodRelationDegreeRomanceFactors>
<li>
<bloodRelationDegree>CloseRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>FarRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>NotRelated</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
</bloodRelationDegreeRomanceFactors>
</li> </li>
</modExtensions> </modExtensions>
</PreceptDef> </PreceptDef>
@ -151,9 +147,16 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <hasOneOfRelations>
<li>CloseRelative</li> <li>Parent</li>
</hasOneOfRelationDegrees> <li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
<hasNoneOfRelations> <hasNoneOfRelations>
<li>Spouse</li> <li>Spouse</li>
</hasNoneOfRelations> </hasNoneOfRelations>
@ -168,16 +171,6 @@
<li>FarRelative</li> <li>FarRelative</li>
<li>NotRelated</li> <li>NotRelated</li>
</allowManualRomanceOnlyFor> </allowManualRomanceOnlyFor>
<bloodRelationDegreeRomanceFactors>
<li>
<bloodRelationDegree>FarRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>NotRelated</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
</bloodRelationDegreeRomanceFactors>
</li> </li>
</modExtensions> </modExtensions>
</PreceptDef> </PreceptDef>
@ -211,10 +204,7 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <isBloodRelated>true</isBloodRelated>
<li>CloseRelative</li>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
<hasNoneOfRelations> <hasNoneOfRelations>
<li>Spouse</li> <li>Spouse</li>
</hasNoneOfRelations> </hasNoneOfRelations>
@ -256,10 +246,7 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <isBloodRelated>true</isBloodRelated>
<li>CloseRelative</li>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
<hasNoneOfRelations> <hasNoneOfRelations>
<li>Spouse</li> <li>Spouse</li>
</hasNoneOfRelations> </hasNoneOfRelations>
@ -269,18 +256,6 @@
</li> </li>
</rules> </rules>
</li> </li>
<li Class="RJWSexperience.Ideology.Precepts.DefExtension_Incest">
<bloodRelationDegreeRomanceFactors>
<li>
<bloodRelationDegree>CloseRelative</bloodRelationDegree>
<romanceChanceFactor>0.03</romanceChanceFactor> <!-- same as vanilla "parent" -->
</li>
<li>
<bloodRelationDegree>FarRelative</bloodRelationDegree>
<romanceChanceFactor>0.03</romanceChanceFactor>
</li>
</bloodRelationDegreeRomanceFactors>
</li>
</modExtensions> </modExtensions>
</PreceptDef> </PreceptDef>
@ -308,9 +283,7 @@
<li> <li>
<filter> <filter>
<relations> <relations>
<hasOneOfRelationDegrees> <isBloodRelated>false</isBloodRelated>
<li>NotRelated</li>
</hasOneOfRelationDegrees>
</relations> </relations>
</filter> </filter>
<multiplier>0.1</multiplier> <multiplier>0.1</multiplier>
@ -322,20 +295,6 @@
<li>CloseRelative</li> <li>CloseRelative</li>
<li>FarRelative</li> <li>FarRelative</li>
</allowManualRomanceOnlyFor> </allowManualRomanceOnlyFor>
<bloodRelationDegreeRomanceFactors>
<li>
<bloodRelationDegree>CloseRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>FarRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>NotRelated</bloodRelationDegree>
<romanceChanceFactor>0.03</romanceChanceFactor>
</li>
</bloodRelationDegreeRomanceFactors>
</li> </li>
</modExtensions> </modExtensions>
</PreceptDef> </PreceptDef>

View file

@ -1,6 +1,7 @@
using RimWorld; using RimWorld;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Verse; using Verse;
namespace RJWSexperience.Ideology.Filters namespace RJWSexperience.Ideology.Filters
@ -12,14 +13,14 @@ namespace RJWSexperience.Ideology.Filters
public class RelationFilter public class RelationFilter
{ {
public bool? isVeneratedAnimal; public bool? isVeneratedAnimal;
public bool? isAlien;
public bool? isBloodRelated;
public List<PawnRelationDef> hasOneOfRelations; public List<PawnRelationDef> hasOneOfRelations;
public List<PawnRelationDef> hasNoneOfRelations; public List<PawnRelationDef> hasNoneOfRelations;
public List<BloodRelationDegree> hasOneOfRelationDegrees;
private bool initialized = false; private bool initialized = false;
private HashSet<PawnRelationDef> hasOneOfRelationsHashed; private HashSet<PawnRelationDef> hasOneOfRelationsHashed;
private HashSet<PawnRelationDef> hasNoneOfRelationsHashed; private HashSet<PawnRelationDef> hasNoneOfRelationsHashed;
private HashSet<BloodRelationDegree> hasOneOfRelationDegreesHashed;
/// <summary> /// <summary>
/// Check if the pair of pawns fits filter conditions /// Check if the pair of pawns fits filter conditions
@ -30,6 +31,9 @@ namespace RJWSexperience.Ideology.Filters
if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner)) if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner))
return false; return false;
//if (isAlien != null && isAlien != partner)
// return false;
if (!CheckRelations(pawn, partner)) if (!CheckRelations(pawn, partner))
return false; return false;
@ -41,16 +45,14 @@ namespace RJWSexperience.Ideology.Filters
if (!initialized) if (!initialized)
Initialize(); Initialize();
if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && hasOneOfRelationDegreesHashed == null) if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && isBloodRelated == null)
return true; return true;
if (hasOneOfRelationDegreesHashed != null && !hasOneOfRelationDegreesHashed.Contains(RelationHelpers.GetBloodRelationDegree(pawn, partner)))
{
return false;
}
IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner); IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner);
if (isBloodRelated != null && isBloodRelated != relations.Any(def => def.familyByBloodRelation))
return false;
if (hasOneOfRelationsHashed != null) if (hasOneOfRelationsHashed != null)
{ {
if (relations.EnumerableNullOrEmpty()) if (relations.EnumerableNullOrEmpty())
@ -76,9 +78,6 @@ namespace RJWSexperience.Ideology.Filters
if (!hasOneOfRelations.NullOrEmpty()) if (!hasOneOfRelations.NullOrEmpty())
hasOneOfRelationsHashed = new HashSet<PawnRelationDef>(hasOneOfRelations); hasOneOfRelationsHashed = new HashSet<PawnRelationDef>(hasOneOfRelations);
if (!hasOneOfRelationDegrees.NullOrEmpty())
hasOneOfRelationDegreesHashed = new HashSet<BloodRelationDegree>(hasOneOfRelationDegrees);
initialized = true; initialized = true;
} }
} }

View file

@ -1,14 +1,25 @@
using System.Reflection; using HarmonyLib;
using RJWSexperience.Ideology.Patches;
using System.Reflection;
using Verse; using Verse;
namespace RJWSexperience.Ideology namespace RJWSexperience.Ideology
{ {
[StaticConstructorOnStartup] [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))
);
}
} }
} }
} }

View file

@ -1,15 +1,11 @@
using HarmonyLib; using rjw;
using rjw;
using RJWSexperience.Ideology.HistoryEvents; using RJWSexperience.Ideology.HistoryEvents;
using Verse; using Verse;
namespace RJWSexperience.Ideology.Patches namespace RJWSexperience.Ideology.Patches
{ {
[HarmonyPatch("RJWSexperience.RJWUtility", "ThrowVirginHistoryEvent")]
public static class Sexperience_Patch_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) public static void Postfix(Pawn exVirgin, Pawn partner, SexProps props, int degree)
{ {
const int femaleAfterSurgery = 1; const int femaleAfterSurgery = 1;

View file

@ -1,4 +1,5 @@
using System.Collections.Generic; using RJWSexperience.Ideology.Filters;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Verse; using Verse;
@ -11,63 +12,5 @@ namespace RJWSexperience.Ideology.Precepts
public class DefExtension_Incest : DefModExtension public class DefExtension_Incest : DefModExtension
{ {
public List<BloodRelationDegree> allowManualRomanceOnlyFor; public List<BloodRelationDegree> allowManualRomanceOnlyFor;
public List<BloodRelationDegreeFactor> bloodRelationDegreeRomanceFactors;
private Dictionary<BloodRelationDegree, float> _relationDegreeFactorsDict;
public bool TryGetRomanceChanceFactor(BloodRelationDegree relationDegree, out float romanceChanceFactor)
{
if (bloodRelationDegreeRomanceFactors.NullOrEmpty())
{
romanceChanceFactor = 1f;
return false;
}
if (_relationDegreeFactorsDict == null)
{
_relationDegreeFactorsDict = new Dictionary<BloodRelationDegree, float>();
foreach (BloodRelationDegreeFactor relationDegreeFactor in bloodRelationDegreeRomanceFactors)
{
_relationDegreeFactorsDict.Add((BloodRelationDegree)relationDegreeFactor.bloodRelationDegree, relationDegreeFactor.romanceChanceFactor);
}
}
return _relationDegreeFactorsDict.TryGetValue(relationDegree, out romanceChanceFactor);
}
public override IEnumerable<string> 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<string> ConfigErrors()
{
if (bloodRelationDegree == null)
{
yield return "<bloodRelationDegree> is empty";
}
if (romanceChanceFactor == 0f)
{
yield return "<romanceChanceFactor> should be > 0";
}
}
}
} }
} }

View file

@ -11,11 +11,6 @@ namespace RJWSexperience.Ideology
/// </summary> /// </summary>
public static BloodRelationDegree GetBloodRelationDegree(Pawn pawn, Pawn partner) public static BloodRelationDegree GetBloodRelationDegree(Pawn pawn, Pawn partner)
{ {
if (!pawn.relations.FamilyByBlood.Contains(partner))
{
return BloodRelationDegree.NotRelated;
}
PawnRelationDef closestBloodRelation = pawn PawnRelationDef closestBloodRelation = pawn
.GetRelations(partner) .GetRelations(partner)
?.Where(def => def.familyByBloodRelation) ?.Where(def => def.familyByBloodRelation)

View file

@ -1,5 +1,4 @@
using RimWorld; using RimWorld;
using RJWSexperience.Ideology.Precepts;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Verse; using Verse;
@ -18,11 +17,13 @@ namespace RJWSexperience.Ideology
/// </summary> /// </summary>
public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner) public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner)
{ {
IEnumerable<PawnRelationDef> 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; float romanceChanceFactor = 1f;
if (!pawn.relations.FamilyByBlood.Contains(partner)) if (!relations.Any())
{ {
if (pawn.Ideo?.HasPrecept(RsiPreceptDefOf.Incestuos_IncestOnly) == true) if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly)
{ {
return parentRomanceChanceFactor; return parentRomanceChanceFactor;
} }
@ -32,8 +33,6 @@ namespace RJWSexperience.Ideology
} }
} }
PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos);
IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation);
foreach (PawnRelationDef relationDef in relations) foreach (PawnRelationDef relationDef in relations)
{ {
romanceChanceFactor *= GetRomanceChanceFactor(relationDef, incestuousPrecept); romanceChanceFactor *= GetRomanceChanceFactor(relationDef, incestuousPrecept);
@ -47,23 +46,43 @@ namespace RJWSexperience.Ideology
/// </summary> /// </summary>
public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept) public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept)
{ {
if (incestuousPrecept == null) if (incestuousPrecept == null || incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved) // Default game setup
{ {
return relationDef.romanceChanceFactor; return relationDef.romanceChanceFactor;
} }
var incestDefExt = incestuousPrecept.GetModExtension<DefExtension_Incest>(); if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free)
if (incestDefExt == null)
{ {
return relationDef.romanceChanceFactor; return 1f;
} }
else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly)
BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(relationDef);
if (incestDefExt.TryGetRomanceChanceFactor(relationDegree, out var romanceChanceOverride))
{ {
return 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 relationDef.romanceChanceFactor; return relationDef.romanceChanceFactor;

View file

@ -5,6 +5,10 @@ namespace RJWSexperience.Ideology
[DefOf] [DefOf]
public static class RsiPreceptDefOf 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 Incestuos_IncestOnly;
public static readonly PreceptDef Bestiality_OnlyVenerated; public static readonly PreceptDef Bestiality_OnlyVenerated;
public static readonly PreceptDef BabyFaction_AlwaysFather; public static readonly PreceptDef BabyFaction_AlwaysFather;