mirror of
https://github.com/amevarashi/RJW-Sexperience.git
synced 2024-08-14 23:54:08 +00:00
Refactor
This commit is contained in:
parent
50f8a6d02c
commit
05e490ed3b
5 changed files with 541 additions and 674 deletions
|
@ -1,4 +1,5 @@
|
||||||
using RimWorld;
|
using RimWorld;
|
||||||
|
using rjw;
|
||||||
using RJWSexperience.ExtensionMethods;
|
using RJWSexperience.ExtensionMethods;
|
||||||
using Verse;
|
using Verse;
|
||||||
|
|
||||||
|
@ -11,8 +12,8 @@ namespace RJWSexperience
|
||||||
{
|
{
|
||||||
Trait virgin = p.story?.traits?.GetTrait(VariousDefOf.Virgin);
|
Trait virgin = p.story?.traits?.GetTrait(VariousDefOf.Virgin);
|
||||||
if (virgin != null) p.story.traits.RemoveTrait(virgin);
|
if (virgin != null) p.story.traits.RemoveTrait(virgin);
|
||||||
p.ResetRecord(true);
|
ResetRecord(p, true);
|
||||||
p.ResetRecord(false);
|
ResetRecord(p, false);
|
||||||
p.AddVirginTrait();
|
p.AddVirginTrait();
|
||||||
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Records resetted!");
|
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Records resetted!");
|
||||||
}
|
}
|
||||||
|
@ -20,7 +21,7 @@ namespace RJWSexperience
|
||||||
[DebugAction("RJW Sexperience", "Reset pawn's record(virgin)", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)]
|
[DebugAction("RJW Sexperience", "Reset pawn's record(virgin)", false, false, actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap)]
|
||||||
private static void ResetRecordsZero(Pawn p)
|
private static void ResetRecordsZero(Pawn p)
|
||||||
{
|
{
|
||||||
p.ResetRecord(true);
|
ResetRecord(p, true);
|
||||||
p.AddVirginTrait();
|
p.AddVirginTrait();
|
||||||
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Records resetted!\nVirginified!");
|
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Records resetted!\nVirginified!");
|
||||||
}
|
}
|
||||||
|
@ -55,5 +56,52 @@ namespace RJWSexperience
|
||||||
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Lust: " + p.records.GetValue(VariousDefOf.Lust));
|
MoteMaker.ThrowText(p.TrueCenter(), p.Map, "Lust: " + p.records.GetValue(VariousDefOf.Lust));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ResetRecord(Pawn pawn, bool allzero)
|
||||||
|
{
|
||||||
|
if (!allzero)
|
||||||
|
{
|
||||||
|
if (Configurations.EnableRecordRandomizer && pawn != null && xxx.is_human(pawn))
|
||||||
|
{
|
||||||
|
RecordRandomizer.Randomize(pawn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pawn.records.SetTo(VariousDefOf.Lust, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.NumofEatenCum, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.AmountofEatenCum, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.VaginalSexCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.AnalSexCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.OralSexCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.BlowjobCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.CunnilingusCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.GenitalCaressCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.HandjobCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.FingeringCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.FootjobCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.MiscSexualBehaviorCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.SexPartnerCount, 0);
|
||||||
|
pawn.records.SetTo(VariousDefOf.OrgasmCount, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBeenRapedByAnimals, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBeenRapedByHumanlikes, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBeenRapedByInsects, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBeenRapedByOthers, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBirthAnimal, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBirthEgg, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfBirthHuman, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfFappin, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfRapedAnimals, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfRapedHumanlikes, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfRapedInsects, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfRapedOthers, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSex, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSexWithAnimals, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSexWithCorpse, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSexWithHumanlikes, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSexWithInsects, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfSexWithOthers, 0);
|
||||||
|
pawn.records.SetTo(xxx.CountOfWhore, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,53 +194,5 @@ namespace RJWSexperience.ExtensionMethods
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ResetRecord(this Pawn pawn, bool allzero)
|
|
||||||
{
|
|
||||||
if (!allzero)
|
|
||||||
{
|
|
||||||
if (Configurations.EnableRecordRandomizer && pawn != null && xxx.is_human(pawn))
|
|
||||||
{
|
|
||||||
RecordRandomizer.Randomize(pawn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pawn.records.SetTo(VariousDefOf.Lust, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.NumofEatenCum, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.AmountofEatenCum, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.VaginalSexCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.AnalSexCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.OralSexCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.BlowjobCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.CunnilingusCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.GenitalCaressCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.HandjobCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.FingeringCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.FootjobCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.MiscSexualBehaviorCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.SexPartnerCount, 0);
|
|
||||||
pawn.records.SetTo(VariousDefOf.OrgasmCount, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBeenRapedByAnimals, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBeenRapedByHumanlikes, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBeenRapedByInsects, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBeenRapedByOthers, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBirthAnimal, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBirthEgg, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfBirthHuman, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfFappin, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfRapedAnimals, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfRapedHumanlikes, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfRapedInsects, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfRapedOthers, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSex, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSexWithAnimals, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSexWithCorpse, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSexWithHumanlikes, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSexWithInsects, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfSexWithOthers, 0);
|
|
||||||
pawn.records.SetTo(xxx.CountOfWhore, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@
|
||||||
<Compile Include="SexHistory\RecordRandomizer.cs" />
|
<Compile Include="SexHistory\RecordRandomizer.cs" />
|
||||||
<Compile Include="RJWUtility.cs" />
|
<Compile Include="RJWUtility.cs" />
|
||||||
<Compile Include="SexHistory\HistoryUtility.cs" />
|
<Compile Include="SexHistory\HistoryUtility.cs" />
|
||||||
|
<Compile Include="SexHistory\SexPartnerHistory.cs" />
|
||||||
<Compile Include="SexHistory\SexHistory.cs" />
|
<Compile Include="SexHistory\SexHistory.cs" />
|
||||||
<Compile Include="PawnRelationWorkers.cs" />
|
<Compile Include="PawnRelationWorkers.cs" />
|
||||||
<Compile Include="Keyed.cs" />
|
<Compile Include="Keyed.cs" />
|
||||||
|
|
|
@ -11,567 +11,6 @@ using RJWSexperience.ExtensionMethods;
|
||||||
|
|
||||||
namespace RJWSexperience
|
namespace RJWSexperience
|
||||||
{
|
{
|
||||||
public class SexPartnerHistory : ThingComp
|
|
||||||
{
|
|
||||||
public SexPartnerHistory() { }
|
|
||||||
public const int ARRLEN = 20;
|
|
||||||
|
|
||||||
//protected List<SexHistory> histories = new List<SexHistory>();
|
|
||||||
protected Dictionary<string, SexHistory> histories = new Dictionary<string, SexHistory>();
|
|
||||||
protected string first = "";
|
|
||||||
protected bool dirty = true;
|
|
||||||
protected xxx.rjwSextype recentsex = xxx.rjwSextype.None;
|
|
||||||
protected float recentsat = 0;
|
|
||||||
protected string recentpartner = "";
|
|
||||||
protected int[] sextypecount = new int[ARRLEN];
|
|
||||||
protected float[] sextypesat = new float[ARRLEN];
|
|
||||||
protected int[] sextyperecenttickabs = new int[ARRLEN];
|
|
||||||
protected int virginstaken = 0;
|
|
||||||
protected int incestuous = 0;
|
|
||||||
protected int bestiality = 0;
|
|
||||||
protected int corpsefuck = 0;
|
|
||||||
protected int interspecies = 0;
|
|
||||||
protected int firstsextickabs = 0;
|
|
||||||
|
|
||||||
protected string mostpartnercache = "";
|
|
||||||
protected xxx.rjwSextype mostsextypecache = xxx.rjwSextype.None;
|
|
||||||
protected xxx.rjwSextype mostsatsextypecache = xxx.rjwSextype.None;
|
|
||||||
protected xxx.rjwSextype bestsextypecache = xxx.rjwSextype.None;
|
|
||||||
protected float bestsextypesatcache = 0;
|
|
||||||
protected string bestpartnercache = "";
|
|
||||||
protected int totalsexcache = 0;
|
|
||||||
protected int totalrapedcache = 0;
|
|
||||||
protected int totalbeenrapedcache = 0;
|
|
||||||
protected ThingDef preferracecache = null;
|
|
||||||
protected int preferracesexcountcache = 0;
|
|
||||||
protected Pawn preferracepawncache = null;
|
|
||||||
protected float avtsatcache = 0;
|
|
||||||
protected int recentsextickabscache = 0;
|
|
||||||
protected int mostsextickabscache = 0;
|
|
||||||
protected int bestsextickabscache = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public SexHistory GetFirstPartnerHistory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return histories.TryGetValue(first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public SexHistory GetMostPartnerHistory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return histories.TryGetValue(mostpartnercache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public xxx.rjwSextype MostSextype
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return mostsextypecache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public xxx.rjwSextype MostSatisfiedSex
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return mostsatsextypecache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public SexHistory GetRecentPartnersHistory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return histories.TryGetValue(recentpartner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public SexHistory GetBestSexPartnerHistory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
SexHistory history = histories.TryGetValue(bestpartnercache);
|
|
||||||
return history;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public float TotalSexHad
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return totalsexcache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int VirginsTaken
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return virginstaken;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public List<SexHistory> PartnerList
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
List<SexHistory> res = null;
|
|
||||||
Update();
|
|
||||||
if (!histories.NullOrEmpty())
|
|
||||||
{
|
|
||||||
res = histories.Values.ToList();
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int PartnerCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (histories == null) histories = new Dictionary<string, SexHistory>();
|
|
||||||
return histories.Count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int IncestuousCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return incestuous;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int RapedCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return totalrapedcache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int BeenRapedCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return totalbeenrapedcache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public ThingDef PreferRace
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return preferracecache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int PreferRaceSexCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
return preferracesexcountcache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int BestialityCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return bestiality;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int CorpseFuckCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return corpsefuck;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int InterspeciesCount
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return interspecies;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public float AVGSat
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
if (totalsexcache == 0) return 0;
|
|
||||||
return sextypesat.Sum() / totalsexcache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int RecentSexElapsedTicks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GenTicks.TicksAbs - recentsextickabscache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string RecentSexDays
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (recentsextickabscache != 0) return GenDate.ToStringTicksToDays(RecentSexElapsedTicks) + " " + Keyed.RS_Ago;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int FirstSexElapsedTicks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GenTicks.TicksAbs - firstsextickabs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string FirstSexDays
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (firstsextickabs != 0) return GenDate.ToStringTicksToDays(FirstSexElapsedTicks) + " " + Keyed.RS_Ago;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int MostSexElapsedTicks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GenTicks.TicksAbs - mostsextickabscache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string MostSexDays
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (mostsextickabscache != 0) return GenDate.ToStringTicksToDays(MostSexElapsedTicks) + " " + Keyed.RS_Ago;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int BestSexElapsedTicks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GenTicks.TicksAbs - bestsextickabscache;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string BestSexDays
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (bestsextickabscache != 0) return GenDate.ToStringTicksToDays(BestSexElapsedTicks) + " " + Keyed.RS_Ago;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Texture GetPreferRaceIcon(Vector2 size)
|
|
||||||
{
|
|
||||||
Update();
|
|
||||||
if (preferracepawncache != null) return PortraitsCache.Get(preferracepawncache, size, Rot4.South, default, 1, true, true, false, false);
|
|
||||||
else return HistoryUtility.UnknownPawn;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetBestSextype(out xxx.rjwSextype sextype)
|
|
||||||
{
|
|
||||||
if (dirty) Update();
|
|
||||||
sextype = bestsextypecache;
|
|
||||||
return bestsextypesatcache;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetRecentSextype(out xxx.rjwSextype sextype)
|
|
||||||
{
|
|
||||||
if (dirty) Update();
|
|
||||||
sextype = recentsex;
|
|
||||||
return recentsat;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SextypeRecentDays(int sextype)
|
|
||||||
{
|
|
||||||
int index = (int)sextype;
|
|
||||||
if (sextyperecenttickabs[index] != 0) return GenDate.ToStringTicksToDays(GenTicks.TicksAbs - sextyperecenttickabs[index]) + " " + Keyed.RS_Ago;
|
|
||||||
return Keyed.Unknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SexHistory this[Pawn pawn]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return histories.TryGetValue(pawn.ThingID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetAVGSat(xxx.rjwSextype sextype)
|
|
||||||
{
|
|
||||||
int index = (int)sextype;
|
|
||||||
return GetAVGSat(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetAVGSat(int index)
|
|
||||||
{
|
|
||||||
float res = sextypesat[index] / sextypecount[index];
|
|
||||||
return float.IsNaN(res) ? 0f : res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetSexCount(int index)
|
|
||||||
{
|
|
||||||
return sextypecount[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override void PostExposeData()
|
|
||||||
{
|
|
||||||
List<int> sextypecountsave;
|
|
||||||
List<float> sextypesatsave;
|
|
||||||
List<int> sextyperecenttickabssave;
|
|
||||||
|
|
||||||
if (Scribe.mode == LoadSaveMode.Saving)
|
|
||||||
{
|
|
||||||
sextypecountsave = sextypecount.ToList();
|
|
||||||
sextypesatsave = sextypesat.ToList();
|
|
||||||
sextyperecenttickabssave = sextyperecenttickabs.ToList();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sextypecountsave = new List<int>();
|
|
||||||
sextypesatsave = new List<float>();
|
|
||||||
sextyperecenttickabssave = new List<int>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Scribe_Collections.Look(ref histories, "histories", LookMode.Value, LookMode.Deep);
|
|
||||||
Scribe_Values.Look(ref first, "first", "", true);
|
|
||||||
Scribe_Values.Look(ref recentsex, "recentsex", recentsex, true);
|
|
||||||
Scribe_Values.Look(ref recentsat, "recentsat", recentsat, true);
|
|
||||||
Scribe_Values.Look(ref recentpartner, "recentpartner", recentpartner, true);
|
|
||||||
Scribe_Values.Look(ref virginstaken, "virginstaken", virginstaken, true);
|
|
||||||
Scribe_Values.Look(ref incestuous, "incestous", incestuous, true);
|
|
||||||
Scribe_Values.Look(ref bestiality, "bestiality", bestiality, true);
|
|
||||||
Scribe_Values.Look(ref corpsefuck, "corpsefuck", corpsefuck, true);
|
|
||||||
Scribe_Values.Look(ref interspecies, "interspecies", interspecies, true);
|
|
||||||
Scribe_Values.Look(ref firstsextickabs, "firstsextickabs", firstsextickabs, true);
|
|
||||||
Scribe_Collections.Look(ref sextypecountsave, "sextypecountsave", LookMode.Value);
|
|
||||||
Scribe_Collections.Look(ref sextypesatsave, "sextypesatsave", LookMode.Value);
|
|
||||||
Scribe_Collections.Look(ref sextyperecenttickabssave, "sextyperecenttickabssave", LookMode.Value);
|
|
||||||
//Scribe_Values.Look(ref sextypecount, "sextypecount", new int[ARRLEN], true); // not work
|
|
||||||
//Scribe_Values.Look(ref sextypesat, "sextypesat", new float[ARRLEN], true);
|
|
||||||
if (histories == null) histories = new Dictionary<string, SexHistory>();
|
|
||||||
|
|
||||||
if (Scribe.mode == LoadSaveMode.LoadingVars)
|
|
||||||
{
|
|
||||||
sextypecount = sextypecountsave?.ToArray() ?? new int[ARRLEN];
|
|
||||||
sextypesat = sextypesatsave?.ToArray() ?? new float[ARRLEN];
|
|
||||||
sextyperecenttickabs = sextyperecenttickabssave?.ToArray() ?? new int[ARRLEN];
|
|
||||||
|
|
||||||
foreach (KeyValuePair<string,SexHistory> element in histories)
|
|
||||||
{
|
|
||||||
element.Value.parent = this;
|
|
||||||
element.Value.partnerID = element.Key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
base.PostExposeData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecordHistory(Pawn partner, SexProps props)
|
|
||||||
{
|
|
||||||
Pawn pawn = parent as Pawn;
|
|
||||||
TryAddHistory(partner);
|
|
||||||
RecordFirst(partner, props);
|
|
||||||
recentpartner = partner.ThingID;
|
|
||||||
SexHistory history = histories[partner.ThingID];
|
|
||||||
history?.RecordSex(props);
|
|
||||||
recentsex = props.sexType;
|
|
||||||
sextypecount[(int)props.sexType]++;
|
|
||||||
sextyperecenttickabs[(int)props.sexType] = GenTicks.TicksAbs;
|
|
||||||
if (partner.IsIncest(pawn)) incestuous++;
|
|
||||||
if (partner.Dead) corpsefuck++;
|
|
||||||
if (props.IsBestiality()) bestiality++;
|
|
||||||
else if (pawn.def != partner.def) interspecies++;
|
|
||||||
dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecordSatisfactionHistory(Pawn partner, SexProps props, float satisfaction)
|
|
||||||
{
|
|
||||||
TryAddHistory(partner);
|
|
||||||
RecordFirst(partner, props);
|
|
||||||
SexHistory history = histories[partner.ThingID];
|
|
||||||
history?.RecordSatisfaction(props, satisfaction);
|
|
||||||
recentsat = satisfaction;
|
|
||||||
sextypesat[(int)props.sexType] += satisfaction;
|
|
||||||
dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected bool TryAddHistory(Pawn partner)
|
|
||||||
{
|
|
||||||
if (!histories.ContainsKey(partner.ThingID))
|
|
||||||
{
|
|
||||||
SexHistory newhistory = new SexHistory(partner,partner.IsIncest(parent as Pawn));
|
|
||||||
histories.Add(partner.ThingID, newhistory);
|
|
||||||
Pawn pawn = parent as Pawn;
|
|
||||||
if (pawn != null)
|
|
||||||
{
|
|
||||||
pawn.records.AddTo(VariousDefOf.SexPartnerCount, 1);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecordFirst(Pawn partner, SexProps props)
|
|
||||||
{
|
|
||||||
if (VirginCheck() && props.sexType == xxx.rjwSextype.Vaginal)
|
|
||||||
{
|
|
||||||
TryAddHistory(partner);
|
|
||||||
first = partner.ThingID;
|
|
||||||
SexPartnerHistory history = partner.GetPartnerHistory();
|
|
||||||
firstsextickabs = GenTicks.TicksAbs;
|
|
||||||
if (history != null)
|
|
||||||
{
|
|
||||||
history.TakeSomeonesVirgin(parent as Pawn);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void TakeSomeonesVirgin(Pawn partner)
|
|
||||||
{
|
|
||||||
TryAddHistory(partner);
|
|
||||||
SexHistory history = histories[partner.ThingID];
|
|
||||||
if (history != null) history.TookVirgin();
|
|
||||||
virginstaken++;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void Update()
|
|
||||||
{
|
|
||||||
if (dirty)
|
|
||||||
{
|
|
||||||
UpdateStatistics();
|
|
||||||
UpdateBestSex();
|
|
||||||
dirty = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void UpdateStatistics()
|
|
||||||
{
|
|
||||||
int max = 0;
|
|
||||||
float maxsat = 0;
|
|
||||||
float maxf = 0;
|
|
||||||
int maxindex = 0;
|
|
||||||
string mostID = Keyed.Unknown;
|
|
||||||
string bestID = Keyed.Unknown;
|
|
||||||
|
|
||||||
totalsexcache = 0;
|
|
||||||
totalrapedcache = 0;
|
|
||||||
totalbeenrapedcache = 0;
|
|
||||||
Dictionary<ThingDef, int> racetotalsat = new Dictionary<ThingDef, int>();
|
|
||||||
List<Pawn> allpartners = new List<Pawn>();
|
|
||||||
|
|
||||||
foreach (KeyValuePair<string,SexHistory> element in histories)
|
|
||||||
{
|
|
||||||
SexHistory h = element.Value;
|
|
||||||
|
|
||||||
//find most sex partner
|
|
||||||
if (max < h.TotalSexCount)
|
|
||||||
{
|
|
||||||
max = h.TotalSexCount;
|
|
||||||
mostID = element.Key;
|
|
||||||
}
|
|
||||||
if (maxsat < h.BestSatisfaction)
|
|
||||||
{
|
|
||||||
maxsat = h.BestSatisfaction;
|
|
||||||
bestID = element.Key;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h.Partner != null)
|
|
||||||
{
|
|
||||||
Pawn partner = h.Partner;
|
|
||||||
allpartners.Add(partner);
|
|
||||||
if (racetotalsat.ContainsKey(h.Race))
|
|
||||||
{
|
|
||||||
racetotalsat[h.Race] += h.TotalSexCount - h.RapedMe;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
racetotalsat.Add(h.Race, h.TotalSexCount - h.RapedMe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
totalsexcache += h.TotalSexCount;
|
|
||||||
totalrapedcache += h.Raped;
|
|
||||||
totalbeenrapedcache += h.RapedMe;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!racetotalsat.NullOrEmpty())
|
|
||||||
{
|
|
||||||
KeyValuePair<ThingDef, int> prefer = racetotalsat.MaxBy(x => x.Value);
|
|
||||||
preferracecache = prefer.Key;
|
|
||||||
preferracesexcountcache = prefer.Value;
|
|
||||||
preferracepawncache = allpartners.FirstOrDefault(x => x.def == preferracecache);
|
|
||||||
}
|
|
||||||
|
|
||||||
max = 0;
|
|
||||||
for (int i=0; i < sextypecount.Length; i++)
|
|
||||||
{
|
|
||||||
float avgsat = sextypesat[i] / sextypecount[i];
|
|
||||||
if (maxf < avgsat)
|
|
||||||
{
|
|
||||||
maxf = avgsat;
|
|
||||||
maxindex = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mostsatsextypecache = (xxx.rjwSextype)maxindex;
|
|
||||||
mostsextypecache = (xxx.rjwSextype)sextypecount.FirstIndexOf(x => x == sextypecount.Max());
|
|
||||||
mostpartnercache = mostID;
|
|
||||||
bestpartnercache = bestID;
|
|
||||||
|
|
||||||
recentsextickabscache = histories.TryGetValue(recentpartner)?.RecentSexTickAbs ?? 0;
|
|
||||||
mostsextickabscache = histories.TryGetValue(mostpartnercache)?.RecentSexTickAbs ?? 0;
|
|
||||||
bestsextickabscache = histories.TryGetValue(bestpartnercache)?.BestSexTickAbs ?? 0;
|
|
||||||
|
|
||||||
racetotalsat.Clear();
|
|
||||||
allpartners.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void UpdateBestSex()
|
|
||||||
{
|
|
||||||
int bestindex = 0;
|
|
||||||
float bestsat = 0;
|
|
||||||
float avgsat;
|
|
||||||
for(int i=0; i< sextypecount.Length; i++)
|
|
||||||
{
|
|
||||||
avgsat = sextypesat[i] / sextypecount[i];
|
|
||||||
if (bestsat < avgsat)
|
|
||||||
{
|
|
||||||
bestindex = i;
|
|
||||||
bestsat = avgsat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bestsextypecache = (xxx.rjwSextype)bestindex;
|
|
||||||
bestsextypesatcache = bestsat;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected bool VirginCheck()
|
|
||||||
{
|
|
||||||
if (histories.TryGetValue(first) != null) return false;
|
|
||||||
|
|
||||||
Pawn pawn = parent as Pawn;
|
|
||||||
if (pawn != null)
|
|
||||||
{
|
|
||||||
if (pawn.IsVirgin()) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class SexHistory : IExposable
|
public class SexHistory : IExposable
|
||||||
{
|
{
|
||||||
public SexPartnerHistory parent;
|
public SexPartnerHistory parent;
|
||||||
|
@ -592,7 +31,6 @@ namespace RJWSexperience
|
||||||
protected bool cannotLoadPawnData = false;
|
protected bool cannotLoadPawnData = false;
|
||||||
protected ThingDef race;
|
protected ThingDef race;
|
||||||
|
|
||||||
|
|
||||||
public string Label
|
public string Label
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -648,62 +86,14 @@ namespace RJWSexperience
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public int OrgasmCount
|
public int OrgasmCount => orgasms;
|
||||||
{
|
public bool IamFirst => itookvirgin;
|
||||||
get
|
public bool Incest => incest;
|
||||||
{
|
public int Raped => raped;
|
||||||
return orgasms;
|
public int RapedMe => rapedme;
|
||||||
}
|
public int RecentSexTickAbs => recentsextickabs;
|
||||||
}
|
public int BestSexTickAbs => bestsextickabs;
|
||||||
public bool IamFirst
|
public int BestSexElapsedTicks => GenTicks.TicksAbs - bestsextickabs;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return itookvirgin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public bool Incest
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return incest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int Raped
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return raped;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int RapedMe
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return rapedme;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int RecentSexTickAbs
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return recentsextickabs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int BestSexTickAbs
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return bestsextickabs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int BestSexElapsedTicks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return GenTicks.TicksAbs - bestsextickabs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public string BestSexDays
|
public string BestSexDays
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -735,10 +125,8 @@ namespace RJWSexperience
|
||||||
this.race = pawn.def;
|
this.race = pawn.def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ExposeData()
|
public void ExposeData()
|
||||||
{
|
{
|
||||||
//Scribe_References.Look(ref partner, "partner", true);
|
|
||||||
Scribe_Values.Look(ref namecache, "namecache", namecache, true);
|
Scribe_Values.Look(ref namecache, "namecache", namecache, true);
|
||||||
Scribe_Values.Look(ref totalsexhad, "totalsexhad", totalsexhad, true);
|
Scribe_Values.Look(ref totalsexhad, "totalsexhad", totalsexhad, true);
|
||||||
Scribe_Values.Look(ref raped, "raped", raped, true);
|
Scribe_Values.Look(ref raped, "raped", raped, true);
|
||||||
|
@ -786,7 +174,7 @@ namespace RJWSexperience
|
||||||
itookvirgin = true;
|
itookvirgin = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadPartnerPawn(string partnerID)
|
protected void LoadPartnerPawn(string partnerID)
|
||||||
{
|
{
|
||||||
foreach (Map map in Find.Maps)
|
foreach (Map map in Find.Maps)
|
||||||
{
|
{
|
||||||
|
|
478
RJWSexperience/RJWSexperience/SexHistory/SexPartnerHistory.cs
Normal file
478
RJWSexperience/RJWSexperience/SexHistory/SexPartnerHistory.cs
Normal file
|
@ -0,0 +1,478 @@
|
||||||
|
using RimWorld;
|
||||||
|
using rjw;
|
||||||
|
using RJWSexperience.ExtensionMethods;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using Verse;
|
||||||
|
|
||||||
|
namespace RJWSexperience
|
||||||
|
{
|
||||||
|
public class SexPartnerHistory : ThingComp
|
||||||
|
{
|
||||||
|
public SexPartnerHistory() { }
|
||||||
|
public const int ARRLEN = 20;
|
||||||
|
|
||||||
|
protected Dictionary<string, SexHistory> histories = new Dictionary<string, SexHistory>();
|
||||||
|
protected string first = "";
|
||||||
|
protected bool dirty = true;
|
||||||
|
protected xxx.rjwSextype recentsex = xxx.rjwSextype.None;
|
||||||
|
protected float recentsat = 0;
|
||||||
|
protected string recentpartner = "";
|
||||||
|
protected int[] sextypecount = new int[ARRLEN];
|
||||||
|
protected float[] sextypesat = new float[ARRLEN];
|
||||||
|
protected int[] sextyperecenttickabs = new int[ARRLEN];
|
||||||
|
protected int virginstaken = 0;
|
||||||
|
protected int incestuous = 0;
|
||||||
|
protected int bestiality = 0;
|
||||||
|
protected int corpsefuck = 0;
|
||||||
|
protected int interspecies = 0;
|
||||||
|
protected int firstsextickabs = 0;
|
||||||
|
|
||||||
|
protected string mostpartnercache = "";
|
||||||
|
protected xxx.rjwSextype mostsextypecache = xxx.rjwSextype.None;
|
||||||
|
protected xxx.rjwSextype mostsatsextypecache = xxx.rjwSextype.None;
|
||||||
|
protected xxx.rjwSextype bestsextypecache = xxx.rjwSextype.None;
|
||||||
|
protected float bestsextypesatcache = 0;
|
||||||
|
protected string bestpartnercache = "";
|
||||||
|
protected int totalsexcache = 0;
|
||||||
|
protected int totalrapedcache = 0;
|
||||||
|
protected int totalbeenrapedcache = 0;
|
||||||
|
protected ThingDef preferracecache = null;
|
||||||
|
protected int preferracesexcountcache = 0;
|
||||||
|
protected Pawn preferracepawncache = null;
|
||||||
|
protected float avtsatcache = 0;
|
||||||
|
protected int recentsextickabscache = 0;
|
||||||
|
protected int mostsextickabscache = 0;
|
||||||
|
protected int bestsextickabscache = 0;
|
||||||
|
|
||||||
|
public SexHistory GetFirstPartnerHistory
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return histories.TryGetValue(first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public SexHistory GetMostPartnerHistory
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return histories.TryGetValue(mostpartnercache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public xxx.rjwSextype MostSextype
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return mostsextypecache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public xxx.rjwSextype MostSatisfiedSex
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return mostsatsextypecache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public SexHistory GetRecentPartnersHistory => histories.TryGetValue(recentpartner);
|
||||||
|
public SexHistory GetBestSexPartnerHistory
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return histories.TryGetValue(bestpartnercache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public float TotalSexHad
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return totalsexcache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int VirginsTaken => virginstaken;
|
||||||
|
public List<SexHistory> PartnerList
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<SexHistory> res = null;
|
||||||
|
Update();
|
||||||
|
if (!histories.NullOrEmpty())
|
||||||
|
{
|
||||||
|
res = histories.Values.ToList();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int PartnerCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (histories == null) histories = new Dictionary<string, SexHistory>();
|
||||||
|
return histories.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int IncestuousCount => incestuous;
|
||||||
|
public int RapedCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return totalrapedcache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int BeenRapedCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return totalbeenrapedcache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public ThingDef PreferRace
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return preferracecache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int PreferRaceSexCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return preferracesexcountcache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int BestialityCount => bestiality;
|
||||||
|
public int CorpseFuckCount => corpsefuck;
|
||||||
|
public int InterspeciesCount => interspecies;
|
||||||
|
public float AVGSat
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
if (totalsexcache == 0) return 0;
|
||||||
|
return sextypesat.Sum() / totalsexcache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int RecentSexElapsedTicks => GenTicks.TicksAbs - recentsextickabscache;
|
||||||
|
public string RecentSexDays
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (recentsextickabscache != 0) return GenDate.ToStringTicksToDays(RecentSexElapsedTicks) + " " + Keyed.RS_Ago;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int FirstSexElapsedTicks => GenTicks.TicksAbs - firstsextickabs;
|
||||||
|
public string FirstSexDays
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (firstsextickabs != 0) return GenDate.ToStringTicksToDays(FirstSexElapsedTicks) + " " + Keyed.RS_Ago;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int MostSexElapsedTicks => GenTicks.TicksAbs - mostsextickabscache;
|
||||||
|
public string MostSexDays
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (mostsextickabscache != 0) return GenDate.ToStringTicksToDays(MostSexElapsedTicks) + " " + Keyed.RS_Ago;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int BestSexElapsedTicks => GenTicks.TicksAbs - bestsextickabscache;
|
||||||
|
public string BestSexDays
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (bestsextickabscache != 0) return GenDate.ToStringTicksToDays(BestSexElapsedTicks) + " " + Keyed.RS_Ago;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Texture GetPreferRaceIcon(Vector2 size)
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
if (preferracepawncache != null) return PortraitsCache.Get(preferracepawncache, size, Rot4.South, default, 1, true, true, false, false);
|
||||||
|
else return HistoryUtility.UnknownPawn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetBestSextype(out xxx.rjwSextype sextype)
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
sextype = bestsextypecache;
|
||||||
|
return bestsextypesatcache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetRecentSextype(out xxx.rjwSextype sextype)
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
sextype = recentsex;
|
||||||
|
return recentsat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SextypeRecentDays(int sextype)
|
||||||
|
{
|
||||||
|
int index = sextype;
|
||||||
|
if (sextyperecenttickabs[index] != 0) return GenDate.ToStringTicksToDays(GenTicks.TicksAbs - sextyperecenttickabs[index]) + " " + Keyed.RS_Ago;
|
||||||
|
return Keyed.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetAVGSat(int index)
|
||||||
|
{
|
||||||
|
float res = sextypesat[index] / sextypecount[index];
|
||||||
|
return float.IsNaN(res) ? 0f : res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetSexCount(int index)
|
||||||
|
{
|
||||||
|
return sextypecount[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void PostExposeData()
|
||||||
|
{
|
||||||
|
List<int> sextypecountsave;
|
||||||
|
List<float> sextypesatsave;
|
||||||
|
List<int> sextyperecenttickabssave;
|
||||||
|
|
||||||
|
if (Scribe.mode == LoadSaveMode.Saving)
|
||||||
|
{
|
||||||
|
sextypecountsave = sextypecount.ToList();
|
||||||
|
sextypesatsave = sextypesat.ToList();
|
||||||
|
sextyperecenttickabssave = sextyperecenttickabs.ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sextypecountsave = new List<int>();
|
||||||
|
sextypesatsave = new List<float>();
|
||||||
|
sextyperecenttickabssave = new List<int>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Scribe_Collections.Look(ref histories, "histories", LookMode.Value, LookMode.Deep);
|
||||||
|
Scribe_Values.Look(ref first, "first", "", true);
|
||||||
|
Scribe_Values.Look(ref recentsex, "recentsex", recentsex, true);
|
||||||
|
Scribe_Values.Look(ref recentsat, "recentsat", recentsat, true);
|
||||||
|
Scribe_Values.Look(ref recentpartner, "recentpartner", recentpartner, true);
|
||||||
|
Scribe_Values.Look(ref virginstaken, "virginstaken", virginstaken, true);
|
||||||
|
Scribe_Values.Look(ref incestuous, "incestous", incestuous, true);
|
||||||
|
Scribe_Values.Look(ref bestiality, "bestiality", bestiality, true);
|
||||||
|
Scribe_Values.Look(ref corpsefuck, "corpsefuck", corpsefuck, true);
|
||||||
|
Scribe_Values.Look(ref interspecies, "interspecies", interspecies, true);
|
||||||
|
Scribe_Values.Look(ref firstsextickabs, "firstsextickabs", firstsextickabs, true);
|
||||||
|
Scribe_Collections.Look(ref sextypecountsave, "sextypecountsave", LookMode.Value);
|
||||||
|
Scribe_Collections.Look(ref sextypesatsave, "sextypesatsave", LookMode.Value);
|
||||||
|
Scribe_Collections.Look(ref sextyperecenttickabssave, "sextyperecenttickabssave", LookMode.Value);
|
||||||
|
|
||||||
|
if (histories == null) histories = new Dictionary<string, SexHistory>();
|
||||||
|
|
||||||
|
if (Scribe.mode == LoadSaveMode.LoadingVars)
|
||||||
|
{
|
||||||
|
sextypecount = sextypecountsave?.ToArray() ?? new int[ARRLEN];
|
||||||
|
sextypesat = sextypesatsave?.ToArray() ?? new float[ARRLEN];
|
||||||
|
sextyperecenttickabs = sextyperecenttickabssave?.ToArray() ?? new int[ARRLEN];
|
||||||
|
|
||||||
|
foreach (KeyValuePair<string, SexHistory> element in histories)
|
||||||
|
{
|
||||||
|
element.Value.parent = this;
|
||||||
|
element.Value.partnerID = element.Key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
base.PostExposeData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecordHistory(Pawn partner, SexProps props)
|
||||||
|
{
|
||||||
|
Pawn pawn = parent as Pawn;
|
||||||
|
TryAddHistory(partner);
|
||||||
|
RecordFirst(partner, props);
|
||||||
|
recentpartner = partner.ThingID;
|
||||||
|
SexHistory history = histories[partner.ThingID];
|
||||||
|
history?.RecordSex(props);
|
||||||
|
recentsex = props.sexType;
|
||||||
|
sextypecount[(int)props.sexType]++;
|
||||||
|
sextyperecenttickabs[(int)props.sexType] = GenTicks.TicksAbs;
|
||||||
|
if (partner.IsIncest(pawn)) incestuous++;
|
||||||
|
if (partner.Dead) corpsefuck++;
|
||||||
|
if (props.IsBestiality()) bestiality++;
|
||||||
|
else if (pawn.def != partner.def) interspecies++;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecordSatisfactionHistory(Pawn partner, SexProps props, float satisfaction)
|
||||||
|
{
|
||||||
|
TryAddHistory(partner);
|
||||||
|
RecordFirst(partner, props);
|
||||||
|
SexHistory history = histories[partner.ThingID];
|
||||||
|
history?.RecordSatisfaction(props, satisfaction);
|
||||||
|
recentsat = satisfaction;
|
||||||
|
sextypesat[(int)props.sexType] += satisfaction;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool TryAddHistory(Pawn partner)
|
||||||
|
{
|
||||||
|
if (!histories.ContainsKey(partner.ThingID))
|
||||||
|
{
|
||||||
|
SexHistory newhistory = new SexHistory(partner, partner.IsIncest(parent as Pawn));
|
||||||
|
histories.Add(partner.ThingID, newhistory);
|
||||||
|
Pawn pawn = parent as Pawn;
|
||||||
|
if (pawn != null)
|
||||||
|
{
|
||||||
|
pawn.records.AddTo(VariousDefOf.SexPartnerCount, 1);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecordFirst(Pawn partner, SexProps props)
|
||||||
|
{
|
||||||
|
if (VirginCheck() && props.sexType == xxx.rjwSextype.Vaginal)
|
||||||
|
{
|
||||||
|
TryAddHistory(partner);
|
||||||
|
first = partner.ThingID;
|
||||||
|
SexPartnerHistory history = partner.GetPartnerHistory();
|
||||||
|
firstsextickabs = GenTicks.TicksAbs;
|
||||||
|
if (history != null)
|
||||||
|
{
|
||||||
|
history.TakeSomeonesVirgin(parent as Pawn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void TakeSomeonesVirgin(Pawn partner)
|
||||||
|
{
|
||||||
|
TryAddHistory(partner);
|
||||||
|
SexHistory history = histories[partner.ThingID];
|
||||||
|
if (history != null) history.TookVirgin();
|
||||||
|
virginstaken++;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Update()
|
||||||
|
{
|
||||||
|
if (dirty)
|
||||||
|
{
|
||||||
|
UpdateStatistics();
|
||||||
|
UpdateBestSex();
|
||||||
|
dirty = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UpdateStatistics()
|
||||||
|
{
|
||||||
|
int max = 0;
|
||||||
|
float maxsat = 0;
|
||||||
|
float maxf = 0;
|
||||||
|
int maxindex = 0;
|
||||||
|
string mostID = Keyed.Unknown;
|
||||||
|
string bestID = Keyed.Unknown;
|
||||||
|
|
||||||
|
totalsexcache = 0;
|
||||||
|
totalrapedcache = 0;
|
||||||
|
totalbeenrapedcache = 0;
|
||||||
|
Dictionary<ThingDef, int> racetotalsat = new Dictionary<ThingDef, int>();
|
||||||
|
List<Pawn> allpartners = new List<Pawn>();
|
||||||
|
|
||||||
|
foreach (KeyValuePair<string, SexHistory> element in histories)
|
||||||
|
{
|
||||||
|
SexHistory h = element.Value;
|
||||||
|
|
||||||
|
//find most sex partner
|
||||||
|
if (max < h.TotalSexCount)
|
||||||
|
{
|
||||||
|
max = h.TotalSexCount;
|
||||||
|
mostID = element.Key;
|
||||||
|
}
|
||||||
|
if (maxsat < h.BestSatisfaction)
|
||||||
|
{
|
||||||
|
maxsat = h.BestSatisfaction;
|
||||||
|
bestID = element.Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h.Partner != null)
|
||||||
|
{
|
||||||
|
Pawn partner = h.Partner;
|
||||||
|
allpartners.Add(partner);
|
||||||
|
if (racetotalsat.ContainsKey(h.Race))
|
||||||
|
{
|
||||||
|
racetotalsat[h.Race] += h.TotalSexCount - h.RapedMe;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
racetotalsat.Add(h.Race, h.TotalSexCount - h.RapedMe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
totalsexcache += h.TotalSexCount;
|
||||||
|
totalrapedcache += h.Raped;
|
||||||
|
totalbeenrapedcache += h.RapedMe;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!racetotalsat.NullOrEmpty())
|
||||||
|
{
|
||||||
|
KeyValuePair<ThingDef, int> prefer = racetotalsat.MaxBy(x => x.Value);
|
||||||
|
preferracecache = prefer.Key;
|
||||||
|
preferracesexcountcache = prefer.Value;
|
||||||
|
preferracepawncache = allpartners.FirstOrDefault(x => x.def == preferracecache);
|
||||||
|
}
|
||||||
|
|
||||||
|
max = 0;
|
||||||
|
for (int i = 0; i < sextypecount.Length; i++)
|
||||||
|
{
|
||||||
|
float avgsat = sextypesat[i] / sextypecount[i];
|
||||||
|
if (maxf < avgsat)
|
||||||
|
{
|
||||||
|
maxf = avgsat;
|
||||||
|
maxindex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mostsatsextypecache = (xxx.rjwSextype)maxindex;
|
||||||
|
mostsextypecache = (xxx.rjwSextype)sextypecount.FirstIndexOf(x => x == sextypecount.Max());
|
||||||
|
mostpartnercache = mostID;
|
||||||
|
bestpartnercache = bestID;
|
||||||
|
|
||||||
|
recentsextickabscache = histories.TryGetValue(recentpartner)?.RecentSexTickAbs ?? 0;
|
||||||
|
mostsextickabscache = histories.TryGetValue(mostpartnercache)?.RecentSexTickAbs ?? 0;
|
||||||
|
bestsextickabscache = histories.TryGetValue(bestpartnercache)?.BestSexTickAbs ?? 0;
|
||||||
|
|
||||||
|
racetotalsat.Clear();
|
||||||
|
allpartners.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void UpdateBestSex()
|
||||||
|
{
|
||||||
|
int bestindex = 0;
|
||||||
|
float bestsat = 0;
|
||||||
|
float avgsat;
|
||||||
|
for (int i = 0; i < sextypecount.Length; i++)
|
||||||
|
{
|
||||||
|
avgsat = sextypesat[i] / sextypecount[i];
|
||||||
|
if (bestsat < avgsat)
|
||||||
|
{
|
||||||
|
bestindex = i;
|
||||||
|
bestsat = avgsat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bestsextypecache = (xxx.rjwSextype)bestindex;
|
||||||
|
bestsextypesatcache = bestsat;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected bool VirginCheck()
|
||||||
|
{
|
||||||
|
if (histories.TryGetValue(first) != null) return false;
|
||||||
|
|
||||||
|
Pawn pawn = parent as Pawn;
|
||||||
|
return pawn?.IsVirgin() == true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue