diff --git a/1.4/Assemblies/RJWSexperience.dll b/1.4/Assemblies/RJWSexperience.dll index 938c28f..abb50e2 100644 Binary files a/1.4/Assemblies/RJWSexperience.dll and b/1.4/Assemblies/RJWSexperience.dll differ diff --git a/About/Manifest.xml b/About/Manifest.xml index ddfe10f..9a7693d 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJWSexperience - 1.4.1.0 + 1.4.1.3
  • RimJobWorld >= 5.3.0
  • diff --git a/CHANGELOG.md b/CHANGELOG.md index 4215777..76883ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,16 @@ +### 1.4.1.3 +* Prisoners use buckets to clean themselves + +### 1.4.1.2 +* Fixed IsVirgin check for pawns with children + +### 1.4.1.1 +* Fixed exception when pawn uses a bucket +* Marked Sex History button shrinkable and lowered its UI order + ### 1.4.1.0 - * Changed to a new versioning system. Now the first two digits are a Rimworld version, followed by the major and minor version of the mod. - ##### by Luciferus666 - * Added sex skill icons for VRE - Android and VRE - Genie - ##### by yiyuandian - * Added ChineseSimplified Translation \ No newline at end of file diff --git a/Mod Compatibility/RJW Cum/Assemblies/RJWSexperienceCum.dll b/Mod Compatibility/RJW Cum/Assemblies/RJWSexperienceCum.dll index 318e183..3a6db3d 100644 Binary files a/Mod Compatibility/RJW Cum/Assemblies/RJWSexperienceCum.dll and b/Mod Compatibility/RJW Cum/Assemblies/RJWSexperienceCum.dll differ diff --git a/Mod Compatibility/RJW Cum/Defs/ThinkTreeDefs/ThinkTree_CleanSelfWithBucket.xml b/Mod Compatibility/RJW Cum/Defs/ThinkTreeDefs/ThinkTree_CleanSelfWithBucket.xml new file mode 100644 index 0000000..80377be --- /dev/null +++ b/Mod Compatibility/RJW Cum/Defs/ThinkTreeDefs/ThinkTree_CleanSelfWithBucket.xml @@ -0,0 +1,19 @@ + + + + + CleanSelfWithBucket + Humanlike_PostDuty + 100 + + +
  • + true + +
  • + +
  • +
    +
    +
    +
    \ No newline at end of file diff --git a/Source/RJWSexperience/Cum/CumUtility.cs b/Source/RJWSexperience/Cum/CumUtility.cs index e3be0e9..1735a09 100644 --- a/Source/RJWSexperience/Cum/CumUtility.cs +++ b/Source/RJWSexperience/Cum/CumUtility.cs @@ -145,14 +145,15 @@ namespace RJWSexperience.Cum if (!sexFillsCumbuckets) return; - IEnumerable buckets = props.pawn.GetAdjacentBuildings(); + // Enumerable throws System.InvalidOperationException: Collection was modified; enumeration operation may not execute. + List buckets = props.pawn.GetAdjacentBuildings().ToList(); - if (buckets?.EnumerableCount() > 0) + if (buckets?.Count > 0) { - var initialCum = CumUtility.GetCumVolume(props.pawn); + var initialCum = GetCumVolume(props.pawn); foreach (Building_CumBucket bucket in buckets) { - bucket.AddCum(initialCum / buckets.EnumerableCount()); + bucket.AddCum(initialCum / buckets.Count); } } } diff --git a/Source/RJWSexperience/ExtensionMethods/PawnExtensions.cs b/Source/RJWSexperience/ExtensionMethods/PawnExtensions.cs index aa40cfc..f0cc1b7 100644 --- a/Source/RJWSexperience/ExtensionMethods/PawnExtensions.cs +++ b/Source/RJWSexperience/ExtensionMethods/PawnExtensions.cs @@ -54,8 +54,8 @@ namespace RJWSexperience /// public static bool IsVirgin(this Pawn pawn) { - return pawn.records.GetValue(RsDefOf.Record.VaginalSexCount) == 0 || - pawn.relations?.ChildrenCount > 0; // Male is a virgins unless he stick into vagina? Not sure it should work this way + return pawn.records.GetValue(RsDefOf.Record.VaginalSexCount) == 0 && + (pawn.relations?.ChildrenCount ?? 0) < 1; // Male is a virgins unless he stick into vagina? Not sure it should work this way } /// diff --git a/Source/RJWSexperience/RJWSexperience.csproj b/Source/RJWSexperience/RJWSexperience.csproj index 2aef4a8..1dade10 100644 --- a/Source/RJWSexperience/RJWSexperience.csproj +++ b/Source/RJWSexperience/RJWSexperience.csproj @@ -1,116 +1,31 @@ - - - + - Debug - AnyCPU {9C728E06-573B-4B04-A07F-ACBF60CB424D} - Library - Properties + net472 RJWSexperience RJWSexperience - v4.7.2 - 512 - true - - - true - full - false - ..\..\Assemblies\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true ..\..\1.4\Assemblies\ - TRACE - prompt - 4 - - - true + false + amevarashi + True + False + + + + 1.4.* + + + 2.* + runtime + compile; build; native; contentfiles; analyzers; buildtransitive + + + ..\..\..\rjw\1.4\Assemblies\RJW.dll False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.4.3641 - - - 2.2.2 - runtime - compile; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/Source/RJWSexperience/RJWUtility.cs b/Source/RJWSexperience/RJWUtility.cs index d980f0c..52f158e 100644 --- a/Source/RJWSexperience/RJWUtility.cs +++ b/Source/RJWSexperience/RJWUtility.cs @@ -3,6 +3,7 @@ using rjw; using rjw.Modules.Interactions.Enums; using rjw.Modules.Interactions.Helpers; using rjw.Modules.Interactions.Objects; +using RJWSexperience.Logs; using System.Collections.Generic; using Verse; using Verse.AI; @@ -11,6 +12,7 @@ namespace RJWSexperience { public static class RJWUtility { + private static readonly rjw.Modules.Shared.Logs.ILog s_log = LogManager.GetLogger("RJWUtility"); /// /// For ideo patch /// @@ -155,21 +157,28 @@ namespace RJWSexperience public static Building_CumBucket FindClosestBucket(this Pawn pawn) { List buckets = pawn.Map.listerBuildings.allBuildingsColonist.FindAll(x => x is Building_CumBucket bucket && bucket.StoredStackCount < RsDefOf.Thing.GatheredCum.stackLimit); - if (buckets.NullOrEmpty()) + if (buckets.Count == 0) + { + s_log.Message("FindClosestBucket: No buckets on the map or buckets are full"); return null; + } Dictionary targets = new Dictionary(); for (int i = 0; i < buckets.Count; i++) { - if (pawn.CanReach(buckets[i], PathEndMode.ClosestTouch, Danger.None)) + if (pawn.CanReach(buckets[i], PathEndMode.ClosestTouch, Danger.Some)) { targets.Add(buckets[i], pawn.Position.DistanceTo(buckets[i].Position)); } } - if (!targets.NullOrEmpty()) + if (targets.Count > 0) { return (Building_CumBucket)targets.MinBy(x => x.Value).Key; } + else + { + s_log.Message("FindClosestBucket: No reachable buckets"); + } return null; } } diff --git a/Source/RJWSexperience/SexHistory/SexHistoryComp.cs b/Source/RJWSexperience/SexHistory/SexHistoryComp.cs index a78a904..5d5c893 100644 --- a/Source/RJWSexperience/SexHistory/SexHistoryComp.cs +++ b/Source/RJWSexperience/SexHistory/SexHistoryComp.cs @@ -429,6 +429,8 @@ namespace RJWSexperience.SexHistory icon = HistoryUtility.HistoryIcon, defaultIconColor = HistoryUtility.HistoryColor, hotKey = RsDefOf.KeyBinding.OpenSexStatistics, + shrinkable = true, + Order = 5, action = () => UI.SexStatusWindow.ToggleWindow(this) }; } diff --git a/Source/RJWSexperience/SexHistory/UI/BarInfo.cs b/Source/RJWSexperience/SexHistory/UI/BarInfo.cs index b03341b..67cf348 100644 --- a/Source/RJWSexperience/SexHistory/UI/BarInfo.cs +++ b/Source/RJWSexperience/SexHistory/UI/BarInfo.cs @@ -3,33 +3,49 @@ using Verse; namespace RJWSexperience.SexHistory.UI { - public readonly struct BarInfo + public class BarInfo { - public readonly string label; - public readonly float fillPercent; - public readonly Texture2D fillTexture; - public readonly TipSignal tooltip; - public readonly string labelRight; - public readonly Texture2D border; + private string _label; + private float _fillPercent; + private string _labelRight; - public BarInfo(string label, float fillPercent, Texture2D fillTexture, TipSignal tooltip, string labelRight = "", Texture2D border = null) + public string Label { - this.label = label.CapitalizeFirst(); - this.fillPercent = Mathf.Clamp01(fillPercent); - this.fillTexture = fillTexture; - this.tooltip = tooltip; - this.labelRight = labelRight.CapitalizeFirst(); - this.border = border; + get => _label; + set => _label = value.CapitalizeFirst(); + } + public float FillPercent + { + get => _fillPercent; + set => _fillPercent = Mathf.Clamp01(value); + } + public Texture2D FillTexture { get; set; } + public TipSignal Tooltip { get; set; } + public string LabelRight + { + get => _labelRight; + set => _labelRight = value.CapitalizeFirst(); + } + public Texture2D Border { get; set; } + + public BarInfo() + { + _label = ""; + _fillPercent = 0f; + FillTexture = Texture2D.grayTexture; + Tooltip = default; + _labelRight = ""; + Border = null; } - public BarInfo(string label, float fillPercent, Texture2D fillTexture, string labelRight = "") + public BarInfo(Texture2D fillTexture) { - this.label = label.CapitalizeFirst(); - this.fillPercent = Mathf.Clamp01(fillPercent); - this.fillTexture = fillTexture; - this.tooltip = default; - this.labelRight = labelRight.CapitalizeFirst(); - this.border = null; + _label = ""; + _fillPercent = 0f; + FillTexture = fillTexture; + Tooltip = default; + _labelRight = ""; + Border = null; } } } diff --git a/Source/RJWSexperience/SexHistory/UI/InfoCard.cs b/Source/RJWSexperience/SexHistory/UI/InfoCard.cs index 108305e..1755891 100644 --- a/Source/RJWSexperience/SexHistory/UI/InfoCard.cs +++ b/Source/RJWSexperience/SexHistory/UI/InfoCard.cs @@ -1,86 +1,93 @@ using RimWorld; using rjw; -using System; using UnityEngine; using Verse; namespace RJWSexperience.SexHistory.UI { - public readonly struct InfoCard + public class InfoCard { - public readonly SexPartnerHistoryRecord partnerRecord; - public readonly string label; - public readonly string lastSexTime; - public readonly string name; - public readonly string sexCount; - public readonly string orgasms; - public readonly string relations; - public readonly BarInfo bestSextype; - public readonly PartnerPortraitInfo portraitInfo; - public readonly TipSignal tooltip; + private readonly Pawn _pawn; + private readonly string _tooltipLabel; - public InfoCard(Pawn pawn, SexPartnerHistoryRecord partnerRecord, string label, string tooltipLabel, int lastSexTimeTicks) + public string Label { get; } + public string LastSexTime { get; set; } + public string Name { get; private set; } + public string SexCount { get; private set; } + public string Orgasms { get; private set; } + public string Relations { get; private set; } + public BarInfo BestSextype { get; } + public SexPartnerHistoryRecord PartnerRecord { get; private set; } + public PartnerPortraitInfo PortraitInfo { get; } + public TipSignal Tooltip { get; private set; } + + public InfoCard(Pawn pawn, string label, string tooltipLabel) { - this.partnerRecord = partnerRecord; - this.label = label; + Label = label; + _pawn = pawn; + _tooltipLabel = tooltipLabel; + BestSextype = new BarInfo(); + PortraitInfo = new PartnerPortraitInfo(_pawn); + } - lastSexTime = UIUtility.GetSexDays(lastSexTimeTicks); - portraitInfo = new PartnerPortraitInfo(pawn, partnerRecord); + public void UpdatePartnerRecord(SexPartnerHistoryRecord partnerRecord) + { + PartnerRecord = partnerRecord; + PortraitInfo.UpdatePartnerRecord(partnerRecord); - if (partnerRecord != null) + if (partnerRecord == null) { - name = partnerRecord.Partner?.Name?.ToStringFull ?? partnerRecord.Label.CapitalizeFirst(); - sexCount = Keyed.RS_Sex_Count + partnerRecord.TotalSexCount; + Name = Keyed.Unknown; + SexCount = Keyed.RS_Sex_Count + "?"; + Orgasms = Keyed.RS_Orgasms + "?"; + Relations = string.Empty; + Tooltip = default; - if (partnerRecord.Raped > 0) - { - sexCount += " " + Keyed.RS_Raped + partnerRecord.Raped; - } - if (partnerRecord.RapedMe > 0) - { - sexCount += " " + Keyed.RS_RapedMe + partnerRecord.RapedMe; - } - - orgasms = Keyed.RS_Orgasms + partnerRecord.OrgasmCount; - relations = pawn.GetRelationsString(partnerRecord.Partner); - tooltip = new TipSignal(() => - { - string completeTip = tooltipLabel; - - if (partnerRecord.Incest) - { - completeTip += " - " + Keyed.Incest; - } - if (partnerRecord.IamFirst) - { - completeTip += "\n" + Keyed.RS_LostVirgin(partnerRecord.Label, pawn.LabelShort); - } - if (partnerRecord.BestSexTickAbs != 0) - { - completeTip += "\n" + Keyed.RS_HadBestSexDaysAgo(partnerRecord.BestSexElapsedTicks.ToStringTicksToDays() + " " + Keyed.RS_Ago); - } - return completeTip; - }, tooltipLabel.GetHashCode()); - - float relativeBestSatisfaction = partnerRecord.BestSatisfaction / UIUtility.BASESAT; - bestSextype = new BarInfo( - label: Keyed.RS_Best_Sextype + ": " + Keyed.Sextype[(int)partnerRecord.BestSextype], - fillPercent: relativeBestSatisfaction / 2, - fillTexture: HistoryUtility.SextypeColor[(int)partnerRecord.BestSextype], - labelRight: relativeBestSatisfaction.ToStringPercent()); + BestSextype.Label = Keyed.RS_Best_Sextype + ": " + Keyed.Sextype[(int)xxx.rjwSextype.None]; + BestSextype.FillPercent = 0f; + BestSextype.FillTexture = Texture2D.linearGrayTexture; + BestSextype.LabelRight = ""; + return; } - else + + Name = partnerRecord.Partner?.Name?.ToStringFull ?? partnerRecord.Label.CapitalizeFirst(); + SexCount = Keyed.RS_Sex_Count + partnerRecord.TotalSexCount; + + if (partnerRecord.Raped > 0) { - name = Keyed.Unknown; - sexCount = Keyed.RS_Sex_Count + "?"; - orgasms = Keyed.RS_Orgasms + "?"; - relations = string.Empty; - tooltip = default; - bestSextype = new BarInfo( - label: String.Format(Keyed.RS_Best_Sextype + ": {0}", Keyed.Sextype[(int)xxx.rjwSextype.None]), - fillPercent: 0f, - fillTexture: Texture2D.linearGrayTexture); + SexCount += " " + Keyed.RS_Raped + partnerRecord.Raped; } + if (partnerRecord.RapedMe > 0) + { + SexCount += " " + Keyed.RS_RapedMe + partnerRecord.RapedMe; + } + + Orgasms = Keyed.RS_Orgasms + partnerRecord.OrgasmCount; + Relations = _pawn.GetRelationsString(partnerRecord.Partner); + Tooltip = new TipSignal(() => + { + string completeTip = _tooltipLabel; + + if (partnerRecord.Incest) + { + completeTip += " - " + Keyed.Incest; + } + if (partnerRecord.IamFirst) + { + completeTip += "\n" + Keyed.RS_LostVirgin(partnerRecord.Label, _pawn.LabelShort); + } + if (partnerRecord.BestSexTickAbs != 0) + { + completeTip += "\n" + Keyed.RS_HadBestSexDaysAgo(partnerRecord.BestSexElapsedTicks.ToStringTicksToDays() + " " + Keyed.RS_Ago); + } + return completeTip; + }, _tooltipLabel.GetHashCode()); + + float relativeBestSatisfaction = partnerRecord.BestSatisfaction / UIUtility.BASESAT; + BestSextype.Label = Keyed.RS_Best_Sextype + ": " + Keyed.Sextype[(int)partnerRecord.BestSextype]; + BestSextype.FillPercent = relativeBestSatisfaction / 2; + BestSextype.FillTexture = HistoryUtility.SextypeColor[(int)partnerRecord.BestSextype]; + BestSextype.LabelRight = relativeBestSatisfaction.ToStringPercent(); } } } diff --git a/Source/RJWSexperience/SexHistory/UI/PartnerPortraitInfo.cs b/Source/RJWSexperience/SexHistory/UI/PartnerPortraitInfo.cs index 2de32de..e604cc4 100644 --- a/Source/RJWSexperience/SexHistory/UI/PartnerPortraitInfo.cs +++ b/Source/RJWSexperience/SexHistory/UI/PartnerPortraitInfo.cs @@ -5,29 +5,43 @@ using Verse; namespace RJWSexperience.SexHistory.UI { - public readonly struct PartnerPortraitInfo + public class PartnerPortraitInfo { - public readonly SexPartnerHistoryRecord partnerRecord; - public readonly bool lover; - public readonly Func portraitGetter; + private readonly Pawn _pawn; + + public SexPartnerHistoryRecord PartnerRecord { get; private set; } + public bool Lover { get; private set; } + public Func PortraitGetter { get; private set; } + + public PartnerPortraitInfo(Pawn pawn) + { + _pawn = pawn; + } public PartnerPortraitInfo(Pawn pawn, SexPartnerHistoryRecord partnerRecord) { - this.partnerRecord = partnerRecord; - lover = false; + _pawn = pawn; + UpdatePartnerRecord(partnerRecord); + } + + public void UpdatePartnerRecord(SexPartnerHistoryRecord partnerRecord) + { + PartnerRecord = partnerRecord; if (partnerRecord?.Partner != null) { - portraitGetter = (size) => PortraitsCache.Get(partnerRecord.Partner, size, Rot4.South, default, 1, true, true, false, false); - lover = LovePartnerRelationUtility.LovePartnerRelationExists(pawn, partnerRecord.Partner); + PortraitGetter = (size) => PortraitsCache.Get(partnerRecord.Partner, size, Rot4.South, default, 1, true, true, false, false); + Lover = LovePartnerRelationUtility.LovePartnerRelationExists(_pawn, partnerRecord.Partner); } else if (partnerRecord?.Race?.uiIcon != null) { - portraitGetter = (_) => partnerRecord.Race.uiIcon; + PortraitGetter = (_) => partnerRecord.Race.uiIcon; + Lover = false; } else { - portraitGetter = (_) => HistoryUtility.UnknownPawn; + PortraitGetter = (_) => HistoryUtility.UnknownPawn; + Lover = false; } } } diff --git a/Source/RJWSexperience/SexHistory/UI/PreferedRaceCard.cs b/Source/RJWSexperience/SexHistory/UI/PreferedRaceCard.cs index 65d9e74..c9dffb7 100644 --- a/Source/RJWSexperience/SexHistory/UI/PreferedRaceCard.cs +++ b/Source/RJWSexperience/SexHistory/UI/PreferedRaceCard.cs @@ -3,53 +3,58 @@ using UnityEngine; namespace RJWSexperience.SexHistory.UI { - public readonly struct PreferedRaceCard + public class PreferedRaceCard { - public readonly string preferRaceLabel; - public readonly string preferRaceTypeLabel; - public readonly string sexCount; - public readonly BarInfo? barInfo; - public readonly Func portraitGetter; + private readonly SexHistoryComp _sexHistory; + + public string PreferRaceLabel { get; private set; } + public string PreferRaceTypeLabel { get; private set; } + public string SexCount { get; private set; } + public BarInfo BarInfo { get; } = new BarInfo(Texture2D.linearGrayTexture); + public Func PortraitGetter { get; private set; } public PreferedRaceCard(SexHistoryComp sexHistory) { - if (sexHistory.PreferRace == null) + _sexHistory = sexHistory; + } + + public void Update() + { + if (_sexHistory.PreferRace == null) { - preferRaceLabel = Keyed.None; - preferRaceTypeLabel = null; - sexCount = null; - barInfo = null; - portraitGetter = (_) => HistoryUtility.UnknownPawn; + PreferRaceLabel = Keyed.None; + PreferRaceTypeLabel = null; + SexCount = null; + BarInfo.Label = null; + BarInfo.FillPercent = 0f; + PortraitGetter = (_) => HistoryUtility.UnknownPawn; return; } - preferRaceLabel = sexHistory.PreferRace.LabelCap; - sexCount = Keyed.RS_Sex_Count + sexHistory.PreferRaceSexCount; - portraitGetter = (size) => UIUtility.GetRaceIcon(sexHistory.PreferRacePawn, size); + PreferRaceLabel = _sexHistory.PreferRace.LabelCap; + SexCount = Keyed.RS_Sex_Count + _sexHistory.PreferRaceSexCount; + PortraitGetter = (size) => UIUtility.GetRaceIcon(_sexHistory.PreferRacePawn, size); - if (sexHistory.PreferRace != sexHistory.ParentPawn.def) + if (_sexHistory.PreferRace != _sexHistory.ParentPawn.def) { - if (sexHistory.PreferRace.race.Animal != sexHistory.ParentPawn.def.race.Animal) + if (_sexHistory.PreferRace.race.Animal != _sexHistory.ParentPawn.def.race.Animal) { - preferRaceTypeLabel = Keyed.RS_Bestiality; - barInfo = new BarInfo( - label: Keyed.RS_SexInfo(Keyed.RS_Bestiality, sexHistory.BestialityCount), - fillPercent: sexHistory.BestialityCount / 100f, - fillTexture: Texture2D.linearGrayTexture); + PreferRaceTypeLabel = Keyed.RS_Bestiality; + BarInfo.Label = Keyed.RS_SexInfo(Keyed.RS_Bestiality, _sexHistory.BestialityCount); + BarInfo.FillPercent = _sexHistory.BestialityCount / 100f; } else { - preferRaceTypeLabel = Keyed.RS_Interspecies; - barInfo = new BarInfo( - label: Keyed.RS_SexInfo(Keyed.RS_Interspecies, sexHistory.InterspeciesCount), - fillPercent: sexHistory.InterspeciesCount / 100f, - fillTexture: Texture2D.linearGrayTexture); + PreferRaceTypeLabel = Keyed.RS_Interspecies; + BarInfo.Label = Keyed.RS_SexInfo(Keyed.RS_Interspecies, _sexHistory.InterspeciesCount); + BarInfo.FillPercent = _sexHistory.InterspeciesCount / 100f; } } else { - preferRaceTypeLabel = null; - barInfo = null; + PreferRaceTypeLabel = null; + BarInfo.Label = null; + BarInfo.FillPercent = 0f; } } } diff --git a/Source/RJWSexperience/SexHistory/UI/SexStatusViewModel.cs b/Source/RJWSexperience/SexHistory/UI/SexStatusViewModel.cs index e7b3538..e2b0079 100644 --- a/Source/RJWSexperience/SexHistory/UI/SexStatusViewModel.cs +++ b/Source/RJWSexperience/SexHistory/UI/SexStatusViewModel.cs @@ -1,6 +1,5 @@ using RimWorld; using rjw; -using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -49,27 +48,43 @@ namespace RJWSexperience.SexHistory.UI { AgeAndTitle = Pawn.ageTracker.AgeBiologicalYears + ", " + Pawn.def.label; } + + for (int i = 0; i < Sextype.Length; i++) + { + int sexIndex = Sextype[i]; + SexTypes.Add(new BarInfo(HistoryUtility.SextypeColor[sexIndex])); + } + + InfoCards.Add(new InfoCard(Pawn, Keyed.RS_Recent_Sex_Partner, Keyed.RS_Recent_Sex_Partner_ToolTip)); + InfoCards.Add(new InfoCard(Pawn, Keyed.RS_First_Sex_Partner, Keyed.RS_First_Sex_Partner_ToolTip)); + InfoCards.Add(new InfoCard(Pawn, Keyed.RS_Most_Sex_Partner, Keyed.RS_Most_Sex_Partner_ToolTip)); + InfoCards.Add(new InfoCard(Pawn, Keyed.RS_Best_Sex_Partner, Keyed.RS_Best_Sex_Partner_ToolTip)); + + SelectedPartnerCard = new InfoCard(Pawn, Keyed.RS_Selected_Partner, Keyed.RS_Selected_Partner); + PreferedRaceCard = new PreferedRaceCard(_history); } public Pawn Pawn => _history.ParentPawn; public string Name { get; } public string AgeAndTitle { get; } public List InfoCards { get; } = new List(); - public InfoCard SelectedPartnerCard { get; private set; } - public PreferedRaceCard PreferedRaceCard { get; private set; } + public InfoCard SelectedPartnerCard { get; } + public PreferedRaceCard PreferedRaceCard { get; } public List SexTypes { get; } = new List(); - public BarInfo TotalSex { get; private set; } - public BarInfo Lust { get; private set; } - public BarInfo BestSextype { get; private set; } - public BarInfo RecentSextype { get; private set; } - public BarInfo Necro { get; private set; } - public BarInfo Incest { get; private set; } - public BarInfo ConsumedCum { get; private set; } - public BarInfo? CumHediff { get; private set; } - public BarInfo BeenRaped { get; private set; } - public BarInfo Raped { get; private set; } - public BarInfo SexSatisfaction { get; private set; } - public BarInfo SexSkill { get; private set; } + public BarInfo PartnerCount { get; } = new BarInfo(HistoryUtility.Partners); + public BarInfo VirginsTaken { get; } = new BarInfo(HistoryUtility.Partners); + public BarInfo TotalSex { get; } = new BarInfo(HistoryUtility.TotalSex); + public BarInfo Lust { get; } = new BarInfo(HistoryUtility.Slaanesh); + public BarInfo BestSextype { get; } = new BarInfo(); + public BarInfo RecentSextype { get; } = new BarInfo(); + public BarInfo Necro { get; } = new BarInfo(HistoryUtility.Nurgle); + public BarInfo Incest { get; } = new BarInfo(HistoryUtility.Nurgle); + public BarInfo ConsumedCum { get; } = new BarInfo(Texture2D.linearGrayTexture); + public BarInfo CumHediff { get; } = new BarInfo(Texture2D.linearGrayTexture); + public BarInfo BeenRaped { get; } = new BarInfo(Texture2D.grayTexture); + public BarInfo Raped { get; } = new BarInfo(HistoryUtility.Khorne); + public BarInfo SexSatisfaction { get; } = new BarInfo(HistoryUtility.Satisfaction); + public BarInfo SexSkill { get; } = new BarInfo(HistoryUtility.Tzeentch); public string VirginLabel { get; private set; } public string SexualityLabel { get; private set; } public string QuirksLabel { get; private set; } @@ -88,7 +103,7 @@ namespace RJWSexperience.SexHistory.UI UpdateBars(); UpdateQuirks(); UpdateVirginAndSexuality(); - PreferedRaceCard = new PreferedRaceCard(_history); + PreferedRaceCard.Update(); int tickRateMultiplier = (int)Find.TickManager.TickRateMultiplier; if (tickRateMultiplier == 0) // Paused @@ -102,35 +117,21 @@ namespace RJWSexperience.SexHistory.UI private void UpdateInfoCards() { - InfoCards.Clear(); + InfoCard recentSexPartner = InfoCards[0]; + recentSexPartner.LastSexTime = UIUtility.GetSexDays(_history.RecentSexTickAbs); + recentSexPartner.UpdatePartnerRecord(_history.RecentPartnerRecord); - InfoCards.Add(new InfoCard( - pawn: Pawn, - partnerRecord: _history.RecentPartnerRecord, - label: Keyed.RS_Recent_Sex_Partner, - tooltipLabel: Keyed.RS_Recent_Sex_Partner_ToolTip, - lastSexTimeTicks: _history.RecentSexTickAbs)); + InfoCard firstSexPartner = InfoCards[1]; + firstSexPartner.LastSexTime = UIUtility.GetSexDays(_history.FirstSexTickAbs); + firstSexPartner.UpdatePartnerRecord(_history.FirstPartnerRecord); - InfoCards.Add(new InfoCard( - pawn: Pawn, - partnerRecord: _history.FirstPartnerRecord, - label: Keyed.RS_First_Sex_Partner, - tooltipLabel: Keyed.RS_First_Sex_Partner_ToolTip, - lastSexTimeTicks: _history.FirstSexTickAbs)); + InfoCard mostSexPartner = InfoCards[2]; + mostSexPartner.LastSexTime = UIUtility.GetSexDays(_history.MostSexTickAbs); + mostSexPartner.UpdatePartnerRecord(_history.MostPartnerRecord); - InfoCards.Add(new InfoCard( - pawn: Pawn, - partnerRecord: _history.MostPartnerRecord, - label: Keyed.RS_Most_Sex_Partner, - tooltipLabel: Keyed.RS_Most_Sex_Partner_ToolTip, - lastSexTimeTicks: _history.MostSexTickAbs)); - - InfoCards.Add(new InfoCard( - pawn: Pawn, - partnerRecord: _history.BestSexPartnerRecord, - label: Keyed.RS_Best_Sex_Partner, - tooltipLabel: Keyed.RS_Best_Sex_Partner_ToolTip, - lastSexTimeTicks: _history.BestSexTickAbs)); + InfoCard bestSexPartner = InfoCards[3]; + bestSexPartner.LastSexTime = UIUtility.GetSexDays(_history.BestSexTickAbs); + bestSexPartner.UpdatePartnerRecord(_history.BestSexPartnerRecord); if (SelectedPartner != null) { @@ -146,124 +147,102 @@ namespace RJWSexperience.SexHistory.UI maxSatisfaction = UIUtility.BASESAT; } - SexTypes.Clear(); - for (int i = 0; i < Sextype.Length; i++) { int sexIndex = Sextype[i]; float AverageSatisfaction = _history.GetAVGSat(sexIndex); float relativeSat = AverageSatisfaction / maxSatisfaction; float satisfactionRelativeToBase = AverageSatisfaction / UIUtility.BASESAT; - SexTypes.Add(new BarInfo( - label: Keyed.RS_SexInfo(Keyed.Sextype[sexIndex], _history.GetSexCount(sexIndex)), - fillPercent: relativeSat, - fillTexture: HistoryUtility.SextypeColor[sexIndex], - tooltip: Keyed.RS_LastSex + ": " + UIUtility.GetSexDays(_history.GetSextypeRecentTickAbs(sexIndex), true), - labelRight: Keyed.RS_SatAVG(satisfactionRelativeToBase))); + + BarInfo sexTypeBar = SexTypes[i]; + sexTypeBar.Label = Keyed.RS_SexInfo(Keyed.Sextype[sexIndex], _history.GetSexCount(sexIndex)); + sexTypeBar.FillPercent = relativeSat; + sexTypeBar.Tooltip = Keyed.RS_LastSex + ": " + UIUtility.GetSexDays(_history.GetSextypeRecentTickAbs(sexIndex), true); + sexTypeBar.LabelRight = Keyed.RS_SatAVG(satisfactionRelativeToBase); } - SexTypes.Add(new BarInfo( - label: String.Format(Keyed.RS_Sex_Partners + ": {0} ({1})", _history.PartnerCount, Pawn.records.GetValue(RsDefOf.Record.SexPartnerCount)), - fillPercent: _history.PartnerCount / 50, - fillTexture: HistoryUtility.Partners)); + PartnerCount.Label = string.Format(Keyed.RS_Sex_Partners + ": {0} ({1})", _history.PartnerCount, Pawn.records.GetValue(RsDefOf.Record.SexPartnerCount)); + PartnerCount.FillPercent = _history.PartnerCount / 50f; - SexTypes.Add(new BarInfo( - label: String.Format(Keyed.RS_VirginsTaken + ": {0:0}", _history.VirginsTaken), - fillPercent: _history.VirginsTaken / 100, - fillTexture: HistoryUtility.Partners)); + VirginsTaken.Label = string.Format(Keyed.RS_VirginsTaken + ": {0:0}", _history.VirginsTaken); + VirginsTaken.FillPercent = _history.VirginsTaken / 100f; - TotalSex = new BarInfo( - label: String.Format(Keyed.RS_TotalSexHad + ": {0:0} ({1:0})", _history.TotalSexHad, Pawn.records.GetValue(xxx.CountOfSex)), - fillPercent: _history.TotalSexHad / 100, - fillTexture: HistoryUtility.TotalSex, - labelRight: Keyed.RS_SatAVG(_history.AVGSat)); + TotalSex.Label = string.Format(Keyed.RS_TotalSexHad + ": {0:0} ({1:0})", _history.TotalSexHad, Pawn.records.GetValue(xxx.CountOfSex)); + TotalSex.FillPercent = _history.TotalSexHad / 100f; + TotalSex.LabelRight = Keyed.RS_SatAVG(_history.AVGSat); float lust = Pawn.records.GetValue(RsDefOf.Record.Lust); float sexDrive = GetStatValue(xxx.sex_drive_stat); float lustLimit = SexperienceMod.Settings.LustLimit * 3f; - Lust = new BarInfo( - label: String.Format(Keyed.Lust + ": {0:0.00}", lust), - fillPercent: Mathf.Clamp01(lust.Normalization(-lustLimit, lustLimit)), - fillTexture: HistoryUtility.Slaanesh, - tooltip: GetStatTooltip(xxx.sex_drive_stat, sexDrive), - labelRight: xxx.sex_drive_stat.LabelCap + ": " + sexDrive.ToStringPercent()); + Lust.Label = string.Format(Keyed.Lust + ": {0:0.00}", lust); + Lust.FillPercent = lust.Normalization(-lustLimit, lustLimit); + Lust.Tooltip = GetStatTooltip(xxx.sex_drive_stat, sexDrive); + Lust.LabelRight = xxx.sex_drive_stat.LabelCap + ": " + sexDrive.ToStringPercent(); float bestSextypeRelativeSatisfaction = _history.GetBestSextype(out xxx.rjwSextype bestSextype) / UIUtility.BASESAT; - BestSextype = new BarInfo( - label: String.Format(Keyed.RS_Best_Sextype + ": {0}", Keyed.Sextype[(int)bestSextype]), - fillPercent: bestSextypeRelativeSatisfaction / 2, - fillTexture: HistoryUtility.SextypeColor[(int)bestSextype], - labelRight: Keyed.RS_SatAVG(bestSextypeRelativeSatisfaction)); + BestSextype.Label = string.Format(Keyed.RS_Best_Sextype + ": {0}", Keyed.Sextype[(int)bestSextype]); + BestSextype.FillPercent = bestSextypeRelativeSatisfaction / 2; + BestSextype.FillTexture = HistoryUtility.SextypeColor[(int)bestSextype]; + BestSextype.LabelRight = Keyed.RS_SatAVG(bestSextypeRelativeSatisfaction); float recentSextypeRelativeSatisfaction = _history.GetRecentSextype(out xxx.rjwSextype recentSextype) / UIUtility.BASESAT; - RecentSextype = new BarInfo( - label: String.Format(Keyed.RS_Recent_Sextype + ": {0}", Keyed.Sextype[(int)recentSextype]), - fillPercent: recentSextypeRelativeSatisfaction / 2, - fillTexture: HistoryUtility.SextypeColor[(int)recentSextype], - labelRight: recentSextypeRelativeSatisfaction.ToStringPercent()); + RecentSextype.Label = string.Format(Keyed.RS_Recent_Sextype + ": {0}", Keyed.Sextype[(int)recentSextype]); + RecentSextype.FillPercent = recentSextypeRelativeSatisfaction / 2; + RecentSextype.FillTexture = HistoryUtility.SextypeColor[(int)recentSextype]; + RecentSextype.LabelRight = recentSextypeRelativeSatisfaction.ToStringPercent(); - Necro = new BarInfo( - label: String.Format(Keyed.RS_Necrophile + ": {0}", _history.CorpseFuckCount), - fillPercent: _history.CorpseFuckCount / 50, - fillTexture: HistoryUtility.Nurgle); + Necro.Label = string.Format(Keyed.RS_Necrophile + ": {0}", _history.CorpseFuckCount); + Necro.FillPercent = _history.CorpseFuckCount / 50f; - Incest = new BarInfo( - label: String.Format(Keyed.Incest + ": {0}", _history.IncestuousCount), - fillPercent: _history.IncestuousCount / 50, - fillTexture: HistoryUtility.Nurgle); + Incest.Label = string.Format(Keyed.Incest + ": {0}", _history.IncestuousCount); + Incest.FillPercent = _history.IncestuousCount / 50f; float amountofEatenCum = Pawn.records.GetValue(RsDefOf.Record.AmountofEatenCum); - ConsumedCum = new BarInfo( - label: String.Format(Keyed.RS_Cum_Swallowed + ": {0} mL, {1} " + Keyed.RS_NumofTimes, amountofEatenCum, Pawn.records.GetValue(RsDefOf.Record.NumofEatenCum)), - fillPercent: amountofEatenCum / 1000, - fillTexture: Texture2D.linearGrayTexture); + ConsumedCum.Label = string.Format(Keyed.RS_Cum_Swallowed + ": {0} mL, {1} " + Keyed.RS_NumofTimes, amountofEatenCum, Pawn.records.GetValue(RsDefOf.Record.NumofEatenCum)); + ConsumedCum.FillPercent = amountofEatenCum / 1000; Hediff cumHediff = Pawn.health.hediffSet.GetFirstHediffOfDef(RsDefOf.Hediff.CumAddiction) ?? Pawn.health.hediffSet.GetFirstHediffOfDef(RsDefOf.Hediff.CumTolerance); if (cumHediff != null) { - CumHediff = new BarInfo( - label: $"{cumHediff.Label}: {cumHediff.Severity.ToStringPercent()}", - fillPercent: cumHediff.Severity, - fillTexture: Texture2D.linearGrayTexture, - tooltip: new TipSignal(() => cumHediff.GetTooltip(Pawn, false), cumHediff.Label.GetHashCode())); + CumHediff.Label = $"{cumHediff.Label}: {cumHediff.Severity.ToStringPercent()}"; + CumHediff.FillPercent = cumHediff.Severity; + CumHediff.Tooltip = new TipSignal(() => cumHediff.GetTooltip(Pawn, false), cumHediff.Label.GetHashCode()); + } + else + { + CumHediff.Label = ""; + CumHediff.FillPercent = 0f; + CumHediff.Tooltip = default; } float vulnerability = GetStatValue(xxx.vulnerability_stat); string vulnerabilityLabel = xxx.vulnerability_stat.LabelCap + ": " + vulnerability.ToStringPercent(); TipSignal vulnerabilityTip = GetStatTooltip(xxx.vulnerability_stat, vulnerability); - Raped = new BarInfo( - label: String.Format(Keyed.RS_RapedSomeone + ": {0}", _history.RapedCount), - fillPercent: _history.RapedCount / 50, - fillTexture: HistoryUtility.Khorne, - tooltip: vulnerabilityTip, - labelRight: vulnerabilityLabel); + Raped.Label = string.Format(Keyed.RS_RapedSomeone + ": {0}", _history.RapedCount); + Raped.FillPercent = _history.RapedCount / 50f; + Raped.Tooltip = vulnerabilityTip; + Raped.LabelRight = vulnerabilityLabel; - BeenRaped = new BarInfo( - label: String.Format(Keyed.RS_BeenRaped + ": {0}", _history.BeenRapedCount), - fillPercent: _history.BeenRapedCount / 50, - fillTexture: Texture2D.grayTexture, - tooltip: vulnerabilityTip, - labelRight: vulnerabilityLabel); + BeenRaped.Label = string.Format(Keyed.RS_BeenRaped + ": {0}", _history.BeenRapedCount); + BeenRaped.FillPercent = _history.BeenRapedCount / 50f; + BeenRaped.Tooltip = vulnerabilityTip; + BeenRaped.LabelRight = vulnerabilityLabel; float sexSatisfaction = GetStatValue(xxx.sex_satisfaction); - SexSatisfaction = new BarInfo( - label: xxx.sex_satisfaction.LabelCap + ": " + sexSatisfaction.ToStringPercent(), - fillPercent: sexSatisfaction / 2, - fillTexture: HistoryUtility.Satisfaction, - tooltip: GetStatTooltip(xxx.sex_satisfaction, sexSatisfaction)); + SexSatisfaction.Label = xxx.sex_satisfaction.LabelCap + ": " + sexSatisfaction.ToStringPercent(); + SexSatisfaction.FillPercent = sexSatisfaction / 2; + SexSatisfaction.Tooltip = GetStatTooltip(xxx.sex_satisfaction, sexSatisfaction); SkillRecord skill = Pawn.skills?.GetSkill(RsDefOf.Skill.Sex); float sexSkillLevel = skill?.Level ?? 0f; float sexStat = Pawn.GetSexStat(); - SexSkill = new BarInfo( - label: $"{Keyed.RS_SexSkill}: {sexSkillLevel}, {skill?.xpSinceLastLevel / skill?.XpRequiredForLevelUp:P2}", - fillPercent: sexSkillLevel / 20, - fillTexture: HistoryUtility.Tzeentch, - tooltip: GetStatTooltip(RsDefOf.Stat.SexAbility, sexStat), - labelRight: RsDefOf.Stat.SexAbility.LabelCap + ": " + sexStat.ToStringPercent(), - border: HistoryUtility.GetPassionBG(skill?.passion)); + SexSkill.Label = $"{Keyed.RS_SexSkill}: {sexSkillLevel}, {skill?.xpSinceLastLevel / skill?.XpRequiredForLevelUp:P2}"; + SexSkill.FillPercent = sexSkillLevel / 20; + SexSkill.Tooltip = GetStatTooltip(RsDefOf.Stat.SexAbility, sexStat); + SexSkill.LabelRight = RsDefOf.Stat.SexAbility.LabelCap + ": " + sexStat.ToStringPercent(); + SexSkill.Border = HistoryUtility.GetPassionBG(skill?.passion); } private void UpdateQuirks() @@ -325,13 +304,13 @@ namespace RJWSexperience.SexHistory.UI Partners = partners; break; case PartnerOrderMode.Recent: - Partners = partners.OrderBy(x => x.partnerRecord.RecentSexTickAbs); + Partners = partners.OrderBy(x => x.PartnerRecord.RecentSexTickAbs); break; case PartnerOrderMode.Most: - Partners = partners.OrderBy(x => x.partnerRecord.TotalSexCount); + Partners = partners.OrderBy(x => x.PartnerRecord.TotalSexCount); break; case PartnerOrderMode.Name: - Partners = partners.OrderBy(x => x.partnerRecord.Label); + Partners = partners.OrderBy(x => x.PartnerRecord.Label); break; } } @@ -344,18 +323,16 @@ namespace RJWSexperience.SexHistory.UI private void UpdateSelectedPartnerCard() { + SelectedPartnerCard.UpdatePartnerRecord(SelectedPartner); + if (SelectedPartner == null) { - SelectedPartnerCard = default; - return; + SelectedPartnerCard.LastSexTime = null; + } + else + { + SelectedPartnerCard.LastSexTime = UIUtility.GetSexDays(SelectedPartner.RecentSexTickAbs); } - - SelectedPartnerCard = new InfoCard( - pawn: Pawn, - partnerRecord: SelectedPartner, - label: Keyed.RS_Selected_Partner, - tooltipLabel: Keyed.RS_Selected_Partner, - lastSexTimeTicks: SelectedPartner.RecentSexTickAbs); } private float GetStatValue(StatDef statDef) => Pawn.Dead ? 0f : Pawn.GetStatValue(statDef); diff --git a/Source/RJWSexperience/SexHistory/UI/SexStatusWindow.cs b/Source/RJWSexperience/SexHistory/UI/SexStatusWindow.cs index f684891..9d46d66 100644 --- a/Source/RJWSexperience/SexHistory/UI/SexStatusWindow.cs +++ b/Source/RJWSexperience/SexHistory/UI/SexStatusWindow.cs @@ -17,9 +17,6 @@ namespace RJWSexperience.SexHistory.UI public const float BASESAT = UIUtility.BASESAT; public const float ICONSIZE = UIUtility.ICONSIZE; - private static GUIStyle fontStyleCenter; - private static GUIStyle fontStyleRight; - private static GUIStyle fontStyleLeft; private static GUIStyle boxStyle; private static GUIStyle buttonStyle; @@ -32,17 +29,13 @@ namespace RJWSexperience.SexHistory.UI private static void InitStyles() { - if (fontStyleCenter != null) + if (boxStyle != null) { return; } - GUIStyleState fontStyleState = new GUIStyleState() { textColor = Color.white }; GUIStyleState boxStyleState = GUI.skin.textArea.normal; GUIStyleState buttonStyleState = GUI.skin.button.normal; - fontStyleCenter = new GUIStyle() { alignment = TextAnchor.MiddleCenter, normal = fontStyleState }; - fontStyleRight = new GUIStyle() { alignment = TextAnchor.MiddleRight, normal = fontStyleState }; - fontStyleLeft = new GUIStyle() { alignment = TextAnchor.MiddleLeft, normal = fontStyleState }; boxStyle = new GUIStyle(GUI.skin.textArea) { hover = boxStyleState, onHover = boxStyleState, onNormal = boxStyleState }; buttonStyle = new GUIStyle(GUI.skin.button) { hover = buttonStyleState, onHover = buttonStyleState, onNormal = buttonStyleState }; } @@ -161,13 +154,13 @@ namespace RJWSexperience.SexHistory.UI Rect sexinfoRect2 = new Rect(rect.x + portraitRect.width, rect.y + (FONTHEIGHT * 2), rect.width - portraitRect.width, FONTHEIGHT); Rect bestsexRect = new Rect(rect.x + 2f, rect.y + (FONTHEIGHT * 3), rect.width - 4f, FONTHEIGHT - 2f); - if (context.partnerRecord != null) + if (context.PartnerRecord != null) { - DrawPartnerPortrait(portraitRect, context.portraitInfo); + DrawPartnerPortrait(portraitRect, context.PortraitInfo); Widgets.DrawHighlightIfMouseover(portraitRect); if (Widgets.ButtonInvisible(portraitRect)) { - SexHistoryComp partnerHistory = context.partnerRecord.Partner?.TryGetComp(); + SexHistoryComp partnerHistory = context.PartnerRecord.Partner?.TryGetComp(); if (partnerHistory != null) { ChangePawn(partnerHistory); @@ -179,24 +172,29 @@ namespace RJWSexperience.SexHistory.UI } } - GUI.Label(sexinfoRect2, context.relations + " ", fontStyleRight); - TooltipHandler.TipRegion(rect, context.tooltip); + Text.Anchor = TextAnchor.MiddleRight; + Widgets.Label(sexinfoRect2, context.Relations + " "); + GenUI.ResetLabelAlign(); + TooltipHandler.TipRegion(rect, context.Tooltip); } else { Widgets.DrawTextureFitted(portraitRect, HistoryUtility.UnknownPawn, 1.0f); } - Widgets.Label(nameRect, context.name); - Widgets.Label(sexinfoRect, context.sexCount); - Widgets.Label(sexinfoRect2, context.orgasms); - UIUtility.FillableBarLabeled(bestsexRect, context.bestSextype); + Widgets.Label(nameRect, context.Name); + Widgets.Label(sexinfoRect, context.SexCount); + Widgets.Label(sexinfoRect2, context.Orgasms); + UIUtility.FillableBarLabeled(bestsexRect, context.BestSextype); } protected void DrawSexInfoCard(Rect rect, InfoCard context) { rect.SplitHorizontally(FONTHEIGHT, out Rect labelRect, out Rect infoRect); - GUI.Label(labelRect, context.label, fontStyleLeft); - GUI.Label(labelRect, context.lastSexTime, fontStyleRight); + Text.Anchor = TextAnchor.MiddleLeft; + Widgets.Label(labelRect, context.Label); + Text.Anchor = TextAnchor.MiddleRight; + Widgets.Label(labelRect, context.LastSexTime); + GenUI.ResetLabelAlign(); DrawInfoWithPortrait(infoRect, context); } @@ -211,7 +209,9 @@ namespace RJWSexperience.SexHistory.UI { DrawSexInfoCard(listmain.GetRect(CARDHEIGHT), infoCard); } - GUI.Label(listmain.GetRect(FONTHEIGHT), Keyed.RS_PreferRace, fontStyleLeft); + Text.Anchor = TextAnchor.MiddleLeft; + listmain.Label(Keyed.RS_PreferRace); + GenUI.ResetLabelAlign(); DrawPreferRace(listmain.GetRect(66f + 15f), _context.PreferedRaceCard); listmain.End(); } @@ -225,22 +225,27 @@ namespace RJWSexperience.SexHistory.UI Rect infoRect2 = new Rect(infoRect.x, infoRect.y + FONTHEIGHT, infoRect.width, FONTHEIGHT); Rect infoRect3 = new Rect(infoRect.x, infoRect.y + (FONTHEIGHT * 2), infoRect.width - 2f, FONTHEIGHT); - Widgets.DrawTextureFitted(portraitRect, preferedRaceCard.portraitGetter(portraitRect.size), 1.0f); - GUI.Label(infoRect1, preferedRaceCard.preferRaceLabel, fontStyleLeft); + Widgets.DrawTextureFitted(portraitRect, preferedRaceCard.PortraitGetter(portraitRect.size), 1.0f); - if (preferedRaceCard.preferRaceTypeLabel != null) + Text.Anchor = TextAnchor.MiddleLeft; + Widgets.Label(infoRect1, preferedRaceCard.PreferRaceLabel); + + if (preferedRaceCard.SexCount != null) { - GUI.Label(infoRect1, preferedRaceCard.preferRaceTypeLabel + " ", fontStyleRight); + Widgets.Label(infoRect2, preferedRaceCard.SexCount); } - if (preferedRaceCard.sexCount != null) + GenUI.ResetLabelAlign(); + + if (preferedRaceCard.PreferRaceTypeLabel != null) { - GUI.Label(infoRect2, preferedRaceCard.sexCount, fontStyleLeft); + Text.Anchor = TextAnchor.MiddleRight; + Widgets.Label(infoRect1, preferedRaceCard.PreferRaceTypeLabel + " "); } - if (preferedRaceCard.barInfo != null) + if (preferedRaceCard.BarInfo.Label != null) { - UIUtility.FillableBarLabeled(infoRect3, (BarInfo)preferedRaceCard.barInfo); + UIUtility.FillableBarLabeled(infoRect3, preferedRaceCard.BarInfo); } } @@ -280,8 +285,10 @@ namespace RJWSexperience.SexHistory.UI } GUI.Box(nameRect, "", boxStyle); - GUI.Label(nameRect.TopHalf(), _context.Name, fontStyleCenter); - GUI.Label(nameRect.BottomHalf(), _context.AgeAndTitle, fontStyleCenter); + Text.Anchor = TextAnchor.MiddleCenter; + Widgets.Label(nameRect.TopHalf(), _context.Name); + Widgets.Label(nameRect.BottomHalf(), _context.AgeAndTitle); + GenUI.ResetLabelAlign(); Listing_Standard listmain = new Listing_Standard(); listmain.Begin(infoRect); @@ -292,7 +299,9 @@ namespace RJWSexperience.SexHistory.UI GUI.color = Color.red; GUI.Box(tmp, "", boxStyle); GUI.color = Color.white; - GUI.Label(tmp, _context.VirginLabel, fontStyleCenter); + Text.Anchor = TextAnchor.MiddleCenter; + Widgets.Label(tmp, _context.VirginLabel); + GenUI.ResetLabelAlign(); listmain.Gap(1f); } else @@ -304,7 +313,7 @@ namespace RJWSexperience.SexHistory.UI listmain.FillableBarLabeled(_context.BestSextype); listmain.FillableBarLabeled(_context.RecentSextype); - if (_context.Incest.fillPercent < _context.Necro.fillPercent) + if (_context.Incest.FillPercent < _context.Necro.FillPercent) { listmain.FillableBarLabeled(_context.Necro); } @@ -315,16 +324,16 @@ namespace RJWSexperience.SexHistory.UI listmain.FillableBarLabeled(_context.ConsumedCum); - if (_context.CumHediff != null) + if (_context.CumHediff.Label != "") { - listmain.FillableBarLabeled((BarInfo)_context.CumHediff); + listmain.FillableBarLabeled(_context.CumHediff); } else { listmain.Gap(FONTHEIGHT + 1f); } - if (_context.Raped.fillPercent < _context.BeenRaped.fillPercent) + if (_context.Raped.FillPercent < _context.BeenRaped.FillPercent) { listmain.FillableBarLabeled(_context.BeenRaped); } @@ -382,7 +391,9 @@ namespace RJWSexperience.SexHistory.UI listmain.Begin(rect); //Sex statistics - GUI.Label(listmain.GetRect(FONTHEIGHT), " " + Keyed.RS_Statistics, fontStyleLeft); + Text.Anchor = TextAnchor.MiddleLeft; + listmain.Label(" " + Keyed.RS_Statistics); + GenUI.ResetLabelAlign(); listmain.Gap(1f); for (int i = 0; i < _context.SexTypes.Count; i++) @@ -390,10 +401,15 @@ namespace RJWSexperience.SexHistory.UI listmain.FillableBarLabeled(_context.SexTypes[i]); } + listmain.FillableBarLabeled(_context.PartnerCount); + listmain.FillableBarLabeled(_context.VirginsTaken); + //Partner list Rect listLabelRect = listmain.GetRect(FONTHEIGHT); Rect sortbtnRect = new Rect(listLabelRect.xMax - 80f, listLabelRect.y, 80f, listLabelRect.height); - GUI.Label(listLabelRect, " " + Keyed.RS_PartnerList, fontStyleLeft); + Text.Anchor = TextAnchor.MiddleLeft; + Widgets.Label(listLabelRect, " " + Keyed.RS_PartnerList); + GenUI.ResetLabelAlign(); if (Widgets.ButtonText(sortbtnRect, orderMode.Translate())) { SoundDefOf.Click.PlayOneShotOnCamera(); @@ -429,13 +445,17 @@ namespace RJWSexperience.SexHistory.UI DrawPartnerPortrait(pawnRect, partner); Widgets.DrawHighlightIfMouseover(pawnRect); - GUI.Label(labelRect, partner.partnerRecord.Label, fontStyleCenter); + + Text.Anchor = TextAnchor.MiddleCenter; + Widgets.Label(labelRect, partner.PartnerRecord.Label); + GenUI.ResetLabelAlign(); + if (Widgets.ButtonInvisible(pawnRect)) { - _context.SetSelectedPartner(partner.partnerRecord); + _context.SetSelectedPartner(partner.PartnerRecord); SoundDefOf.Click.PlayOneShotOnCamera(); } - if (partner.partnerRecord == _context.SelectedPartner) + if (partner.PartnerRecord == _context.SelectedPartner) { Widgets.DrawHighlightSelected(pawnRect); } @@ -447,22 +467,22 @@ namespace RJWSexperience.SexHistory.UI protected void DrawPartnerPortrait(Rect rect, PartnerPortraitInfo context) { Rect iconRect = new Rect(rect.x + (rect.width * 3 / 4), rect.y, rect.width / 4, rect.height / 4); - Texture img = context.portraitGetter(rect.size); + Texture img = context.PortraitGetter(rect.size); - if (context.partnerRecord.IamFirst) + if (context.PartnerRecord.IamFirst) { GUI.color = HistoryUtility.HistoryColor; Widgets.DrawTextureFitted(rect, HistoryUtility.FirstOverlay, 1.0f); GUI.color = Color.white; } - if (context.partnerRecord.Incest) + if (context.PartnerRecord.Incest) { Widgets.DrawTextureFitted(iconRect, HistoryUtility.Incest, 1.0f); iconRect.x -= iconRect.width; } Widgets.DrawTextureFitted(rect, img, 1.0f); - if (context.lover) + if (context.Lover) { Widgets.DrawTextureFitted(iconRect, HistoryUtility.Heart, 1.0f); } diff --git a/Source/RJWSexperience/SexHistory/UI/UIUtility.cs b/Source/RJWSexperience/SexHistory/UI/UIUtility.cs index 29721d4..cbfc5fb 100644 --- a/Source/RJWSexperience/SexHistory/UI/UIUtility.cs +++ b/Source/RJWSexperience/SexHistory/UI/UIUtility.cs @@ -52,22 +52,22 @@ namespace RJWSexperience.SexHistory.UI public static void FillableBarLabeled(Rect rect, BarInfo context) { - Widgets.FillableBar(rect, context.fillPercent, context.fillTexture, null, true); + Widgets.FillableBar(rect, context.FillPercent, context.FillTexture, null, true); Rect labelRect = rect.ContractedBy(4f, 0f); Text.Anchor = TextAnchor.MiddleLeft; - Widgets.Label(labelRect, context.label); - if (context.labelRight != "") + Widgets.Label(labelRect, context.Label); + if (context.LabelRight != "") { Text.Anchor = TextAnchor.MiddleRight; - Widgets.Label(labelRect, context.labelRight); + Widgets.Label(labelRect, context.LabelRight); } GenUI.ResetLabelAlign(); Widgets.DrawHighlightIfMouseover(rect); - TooltipHandler.TipRegion(rect, context.tooltip); + TooltipHandler.TipRegion(rect, context.Tooltip); - if (context.border != null) + if (context.Border != null) { - rect.DrawBorder(context.border, 2f); + rect.DrawBorder(context.Border, 2f); } } diff --git a/Source/RJWSexperienceCum/JobGiver_CleanSelfWithBucket.cs b/Source/RJWSexperienceCum/JobGiver_CleanSelfWithBucket.cs new file mode 100644 index 0000000..8dadb92 --- /dev/null +++ b/Source/RJWSexperienceCum/JobGiver_CleanSelfWithBucket.cs @@ -0,0 +1,27 @@ +using RJWSexperience; +using Verse; +using Verse.AI; + +namespace RJWSexperienceCum +{ + public class JobGiver_CleanSelfWithBucket : ThinkNode_JobGiver + { + protected override Job TryGiveJob(Pawn pawn) + { + if (HediffDefOf.Hediff_CumController == null || !pawn.health.hediffSet.HasHediff(HediffDefOf.Hediff_CumController)) + { + // Nothing to clean + return null; + } + + Building_CumBucket bucket = pawn.FindClosestBucket(); + + if (bucket == null) + { + return null; + } + + return JobMaker.MakeJob(JobDefOf.CleanSelfwithBucket, pawn, bucket); + } + } +} diff --git a/Source/RJWSexperienceCum/RJWSexperienceCum.csproj b/Source/RJWSexperienceCum/RJWSexperienceCum.csproj index bdb12b3..b7c7ac7 100644 --- a/Source/RJWSexperienceCum/RJWSexperienceCum.csproj +++ b/Source/RJWSexperienceCum/RJWSexperienceCum.csproj @@ -1,55 +1,29 @@ - - - + - Debug - AnyCPU {73CB4597-22BD-4A3E-A3CE-6D65DD080F65} - Library - Properties + net472 RJWSexperienceCum RJWSexperienceCum - v4.7.2 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true ..\..\Mod Compatibility\RJW Cum\Assemblies\ - TRACE - prompt - 4 + false + amevarashi + True + False - - - - - - - - - - - - - - - + - 1.4.3641 + 1.4.* + + + + ..\..\..\rjw\1.4\Assemblies\RJW.dll + False + + + {9c728e06-573b-4b04-a07f-acbf60cb424d} @@ -57,5 +31,4 @@ False - \ No newline at end of file