Skip to content
Snippets Groups Projects
Commit f7206347 authored by amevarashi's avatar amevarashi
Browse files

Moved precepts romanceChanceFactor to DefExtention

parent be1e5c5d
No related branches found
No related tags found
No related merge requests found
......@@ -27,16 +27,9 @@
<li>
<filter>
<relations>
<hasOneOfRelations>
<li>Parent</li>
<li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
<hasOneOfRelationDegrees>
<li>CloseRelative</li>
</hasOneOfRelationDegrees>
</relations>
</filter>
<historyEventDef>RSI_CloseRelativeMarriage</historyEventDef>
......@@ -44,7 +37,9 @@
<li>
<filter>
<relations>
<isBloodRelated>true</isBloodRelated>
<hasOneOfRelationDegrees>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
</relations>
</filter>
<historyEventDef>RSI_IncestuosMarriage</historyEventDef>
......@@ -73,16 +68,9 @@
<li>
<filter>
<relations>
<hasOneOfRelations>
<li>Parent</li>
<li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
<hasOneOfRelationDegrees>
<li>CloseRelative</li>
</hasOneOfRelationDegrees>
</relations>
</filter>
<historyEventDef>RSI_CloseRelativeSex</historyEventDef>
......@@ -90,7 +78,9 @@
<li>
<filter>
<relations>
<isBloodRelated>true</isBloodRelated>
<hasOneOfRelationDegrees>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
</relations>
</filter>
<historyEventDef>RSI_IncestuosSex</historyEventDef>
......@@ -118,6 +108,20 @@
<li>FarRelative</li>
<li>NotRelated</li>
</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>
</modExtensions>
</PreceptDef>
......@@ -147,16 +151,9 @@
<li>
<filter>
<relations>
<hasOneOfRelations>
<li>Parent</li>
<li>Child</li>
<li>Sibling</li>
<li>HalfSibling</li>
<li>Grandparent</li>
<li>Grandchild</li>
<li>NephewOrNiece</li>
<li>UncleOrAunt</li>
</hasOneOfRelations>
<hasOneOfRelationDegrees>
<li>CloseRelative</li>
</hasOneOfRelationDegrees>
<hasNoneOfRelations>
<li>Spouse</li>
</hasNoneOfRelations>
......@@ -171,6 +168,16 @@
<li>FarRelative</li>
<li>NotRelated</li>
</allowManualRomanceOnlyFor>
<bloodRelationDegreeRomanceFactors>
<li>
<bloodRelationDegree>FarRelative</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
<li>
<bloodRelationDegree>NotRelated</bloodRelationDegree>
<romanceChanceFactor>1</romanceChanceFactor>
</li>
</bloodRelationDegreeRomanceFactors>
</li>
</modExtensions>
</PreceptDef>
......@@ -204,7 +211,10 @@
<li>
<filter>
<relations>
<isBloodRelated>true</isBloodRelated>
<hasOneOfRelationDegrees>
<li>CloseRelative</li>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
<hasNoneOfRelations>
<li>Spouse</li>
</hasNoneOfRelations>
......@@ -246,7 +256,10 @@
<li>
<filter>
<relations>
<isBloodRelated>true</isBloodRelated>
<hasOneOfRelationDegrees>
<li>CloseRelative</li>
<li>FarRelative</li>
</hasOneOfRelationDegrees>
<hasNoneOfRelations>
<li>Spouse</li>
</hasNoneOfRelations>
......@@ -256,6 +269,18 @@
</li>
</rules>
</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>
</PreceptDef>
......@@ -283,7 +308,9 @@
<li>
<filter>
<relations>
<isBloodRelated>false</isBloodRelated>
<hasOneOfRelationDegrees>
<li>NotRelated</li>
</hasOneOfRelationDegrees>
</relations>
</filter>
<multiplier>0.1</multiplier>
......@@ -295,6 +322,20 @@
<li>CloseRelative</li>
<li>FarRelative</li>
</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>
</modExtensions>
</PreceptDef>
......
using RimWorld;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Verse;
namespace RJWSexperience.Ideology.Filters
......@@ -13,14 +12,14 @@ namespace RJWSexperience.Ideology.Filters
public class RelationFilter
{
public bool? isVeneratedAnimal;
public bool? isAlien;
public bool? isBloodRelated;
public List<PawnRelationDef> hasOneOfRelations;
public List<PawnRelationDef> hasNoneOfRelations;
public List<BloodRelationDegree> hasOneOfRelationDegrees;
private bool initialized = false;
private HashSet<PawnRelationDef> hasOneOfRelationsHashed;
private HashSet<PawnRelationDef> hasNoneOfRelationsHashed;
private HashSet<BloodRelationDegree> hasOneOfRelationDegreesHashed;
/// <summary>
/// Check if the pair of pawns fits filter conditions
......@@ -31,9 +30,6 @@ namespace RJWSexperience.Ideology.Filters
if (isVeneratedAnimal != null && isVeneratedAnimal != pawn.Ideo.IsVeneratedAnimal(partner))
return false;
//if (isAlien != null && isAlien != partner)
// return false;
if (!CheckRelations(pawn, partner))
return false;
......@@ -45,13 +41,15 @@ namespace RJWSexperience.Ideology.Filters
if (!initialized)
Initialize();
if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && isBloodRelated == null)
if (hasNoneOfRelationsHashed == null && hasOneOfRelationsHashed == null && hasOneOfRelationDegreesHashed == null)
return true;
IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner);
if (isBloodRelated != null && isBloodRelated != relations.Any(def => def.familyByBloodRelation))
if (hasOneOfRelationDegreesHashed != null && !hasOneOfRelationDegreesHashed.Contains(RelationHelpers.GetBloodRelationDegree(pawn, partner)))
{
return false;
}
IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner);
if (hasOneOfRelationsHashed != null)
{
......@@ -78,6 +76,9 @@ namespace RJWSexperience.Ideology.Filters
if (!hasOneOfRelations.NullOrEmpty())
hasOneOfRelationsHashed = new HashSet<PawnRelationDef>(hasOneOfRelations);
if (!hasOneOfRelationDegrees.NullOrEmpty())
hasOneOfRelationDegreesHashed = new HashSet<BloodRelationDegree>(hasOneOfRelationDegrees);
initialized = true;
}
}
......
using RJWSexperience.Ideology.Filters;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Verse;
......@@ -12,5 +11,63 @@ namespace RJWSexperience.Ideology.Precepts
public class DefExtension_Incest : DefModExtension
{
public List<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";
}
}
}
}
}
using RimWorld;
using RJWSexperience.Ideology.Precepts;
using System.Collections.Generic;
using System.Linq;
using Verse;
......@@ -17,12 +18,11 @@ namespace RJWSexperience.Ideology
/// </summary>
public static float GetRomanceChanceFactor(Pawn pawn, Pawn partner)
{
PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos);
float romanceChanceFactor = 1f;
if (!pawn.relations.FamilyByBlood.Contains(partner))
{
if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly)
if (pawn.Ideo?.HasPrecept(RsiPreceptDefOf.Incestuos_IncestOnly) == true)
{
return parentRomanceChanceFactor;
}
......@@ -32,6 +32,7 @@ namespace RJWSexperience.Ideology
}
}
PreceptDef incestuousPrecept = pawn.Ideo?.PreceptsListForReading.Select(precept => precept.def).FirstOrFallback(def => def.issue == VariousDefOf.Incestuos);
IEnumerable<PawnRelationDef> relations = pawn.GetRelations(partner).Where(def => def.familyByBloodRelation);
foreach (PawnRelationDef relationDef in relations)
{
......@@ -46,43 +47,23 @@ namespace RJWSexperience.Ideology
/// </summary>
public static float GetRomanceChanceFactor(PawnRelationDef relationDef, PreceptDef incestuousPrecept)
{
if (incestuousPrecept == null || incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved) // Default game setup
if (incestuousPrecept == null)
{
return relationDef.romanceChanceFactor;
}
if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Free)
{
return 1f;
}
else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Disapproved_CloseOnly)
{
if (relationDef.familyByBloodRelation && relationDef.importance > PawnRelationDefOf.Cousin.importance)
{
return relationDef.romanceChanceFactor;
}
else
{
return 1f;
}
}
else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_Forbidden)
var incestDefExt = incestuousPrecept.GetModExtension<DefExtension_Incest>();
if (incestDefExt == null)
{
if (relationDef.familyByBloodRelation)
{
return parentRomanceChanceFactor;
}
return relationDef.romanceChanceFactor;
}
else if (incestuousPrecept == RsiPreceptDefOf.Incestuos_IncestOnly)
BloodRelationDegree relationDegree = RelationHelpers.GetBloodRelationDegree(relationDef);
if (incestDefExt.TryGetRomanceChanceFactor(relationDegree, out var romanceChanceOverride))
{
if (!relationDef.familyByBloodRelation)
{
return parentRomanceChanceFactor;
}
else
{
return 1f;
}
return romanceChanceOverride;
}
return relationDef.romanceChanceFactor;
......
......@@ -5,10 +5,6 @@ namespace RJWSexperience.Ideology
[DefOf]
public static class RsiPreceptDefOf
{
public static readonly PreceptDef Incestuos_Free;
public static readonly PreceptDef Incestuos_Disapproved_CloseOnly;
public static readonly PreceptDef Incestuos_Disapproved;
public static readonly PreceptDef Incestuos_Forbidden;
public static readonly PreceptDef Incestuos_IncestOnly;
public static readonly PreceptDef Bestiality_OnlyVenerated;
public static readonly PreceptDef BabyFaction_AlwaysFather;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment