From 7f0e79c49c77472d433682f61c1824bf6bea5eee Mon Sep 17 00:00:00 2001 From: Jia_RG Date: Wed, 2 Apr 2025 06:36:26 +0800 Subject: [PATCH 1/2] Some experience improvements and bug fixes. Pawn traits now support rendering using Trait Rarity Colors Mod. Text content is displayed in the center. Add missing translation information. Animal tab add ManageAutoSlaughter button. Fix FloatMenuOption duplicate issue. --- Languages/ChineseSimplified/Keyed/Keys.xml | 6 +++- Numbers/MainTabWindow_Numbers.cs | 10 ++++++ Numbers/Numbers.cs | 2 +- Numbers/OptionsMaker.cs | 32 +++++++++++++------ .../PawnColumnWorkers/PawnColumnWorker_Age.cs | 4 +++ .../PawnColumnWorker_AnimalEggProgress.cs | 4 ++- .../PawnColumnWorker_AnimalFilthRate.cs | 3 ++ .../PawnColumnWorker_AnimalMilkFullness.cs | 4 ++- .../PawnColumnWorker_AnimalWildness.cs | 3 ++ .../PawnColumnWorker_AnimalWoolGrowth.cs | 4 ++- .../PawnColumnWorker_Backstory.cs | 3 ++ .../PawnColumnWorker_Bleedrate.cs | 2 ++ .../PawnColumnWorker_Capacity.cs | 2 ++ .../PawnColumnWorker_Faction.cs | 2 ++ .../PawnColumnWorker_FoodConsumption.cs | 3 ++ .../PawnColumnWorker_Genes.cs | 3 ++ .../PawnColumnWorker_GenesRegrowTime.cs | 3 ++ .../PawnColumnWorker_Inspiration.cs | 2 ++ .../PawnColumnWorker_JobCurrent.cs | 2 ++ .../PawnColumnWorker_JobQueued.cs | 2 ++ .../PawnColumnWorker_LeatherType.cs | 3 ++ .../PawnColumnWorker_Meditation.cs | 2 ++ .../PawnColumnWorker_MentalState.cs | 2 ++ .../PawnColumnWorker_Pain.cs | 2 ++ .../PawnColumnWorker_PrisonerResistance.cs | 2 ++ .../PawnColumnWorker_PsylinkLevel.cs | 3 ++ .../PawnColumnWorker_Race.cs | 2 ++ .../PawnColumnWorker_Record.cs | 2 ++ .../PawnColumnWorker_Stat.cs | 2 ++ .../PawnColumnWorker_TameChance.cs | 3 ++ .../PawnColumnWorker_Trait.cs | 24 ++++++++++---- .../PawnColumnWorker_Will.cs | 3 ++ 32 files changed, 125 insertions(+), 21 deletions(-) diff --git a/Languages/ChineseSimplified/Keyed/Keys.xml b/Languages/ChineseSimplified/Keyed/Keys.xml index 351e4f7..474d6b3 100644 --- a/Languages/ChineseSimplified/Keyed/Keys.xml +++ b/Languages/ChineseSimplified/Keyed/Keys.xml @@ -30,5 +30,9 @@ 载入布局存档 没有布局存档 保存当前布局 - + + 捕食者 + 怀孕 + 性别 + \ No newline at end of file diff --git a/Numbers/MainTabWindow_Numbers.cs b/Numbers/MainTabWindow_Numbers.cs index d8f3a83..99e4db7 100644 --- a/Numbers/MainTabWindow_Numbers.cs +++ b/Numbers/MainTabWindow_Numbers.cs @@ -177,6 +177,16 @@ public override void DoWindowContents(Rect rect) //other btn DoButton("MiscRecordsCategory".Translate(), optionsMaker.OtherOptionsMaker(), ref x); + + //ManageAutoSlaughter btn + if (new[] { NumbersDefOf.Numbers_Animals }.Contains(PawnTableDef)) + { + if (Widgets.ButtonText(new Rect(x, 0f, buttonWidth, buttonHeight), "ManageAutoSlaughter".Translate())) + { + Find.WindowStack.Add(new Dialog_AutoSlaughter(Find.CurrentMap)); + x += buttonWidth + buttonGap; + } + } //presets button float startPositionOfPresetsButton = Mathf.Max(rect.xMax - buttonWidth - Margin, x); diff --git a/Numbers/Numbers.cs b/Numbers/Numbers.cs index 8ebd90c..91b468d 100644 --- a/Numbers/Numbers.cs +++ b/Numbers/Numbers.cs @@ -70,7 +70,7 @@ private static void Columndefs() } var pred = DefDatabase.GetNamed("Predator"); pred.sortable = true; - pred.headerTip = "Predator"; + pred.headerTip = "Predator".Translate(); } private static bool RightClickToRemoveHeader(PawnColumnWorker __instance, Rect headerRect, PawnTable table) diff --git a/Numbers/OptionsMaker.cs b/Numbers/OptionsMaker.cs index 496a249..4241785 100644 --- a/Numbers/OptionsMaker.cs +++ b/Numbers/OptionsMaker.cs @@ -63,14 +63,14 @@ public List PresetOptionsMaker() list.Insert(6 + savedLayouts.Count, new FloatMenuOption("Numbers_Presets.Load".Translate("Numbers_Presets.Psycasting".Translate()), () => ChangeMainTableTo(StaticConstructorOnGameStart.psycastingPreset))); } - return list; + return list.Distinct(new FloatMenuOptionComparer()).ToList(); } private IEnumerable General() { yield return new FloatMenuOption("Race".Translate(), () => AddPawnColumnAtBestPositionAndRefresh(DefDatabase.GetNamedSilentFail("Numbers_Race"))); yield return new FloatMenuOption("Faction".Translate(), () => AddPawnColumnAtBestPositionAndRefresh(DefDatabase.GetNamedSilentFail("Numbers_Faction"))); - yield return new FloatMenuOption("Gender", () => AddPawnColumnAtBestPositionAndRefresh(DefDatabase.GetNamedSilentFail("Gender"))); + yield return new FloatMenuOption("Gender".Translate(), () => AddPawnColumnAtBestPositionAndRefresh(DefDatabase.GetNamedSilentFail("Gender"))); } public List FloatMenuOptionsFor(IEnumerable pcdList) @@ -121,7 +121,6 @@ public List OtherOptionsMaker() if (PawnTable == NumbersDefOf.Numbers_WildAnimals) { - list.RemoveAll(x => x.Label == "Gender"); //duplicate list.AddRange(FloatMenuOptionsFor(PawnColumnOptionDefOf.WildAnimals.options .Concat(DefDatabase.GetNamed("Wildlife").columns) .Where(x => pcdValidator(x)))); @@ -133,7 +132,9 @@ public List OtherOptionsMaker() list.AddRange(FloatMenuOptionsFor(PawnColumnOptionDefOf.DeadThings.options)); } - return [.. list.OrderBy(x => x.Label)]; + return list.Distinct(new FloatMenuOptionComparer()) + .OrderBy(x => x.Label) + .ToList(); } public List OptionsMakerForGenericDef(IEnumerable listOfDefs) where T : Def @@ -151,7 +152,7 @@ void Action() list.Add(new FloatMenuOption(label, Action)); } - return list; + return list.Distinct(new FloatMenuOptionComparer()).ToList(); } public List PawnSelector() @@ -255,15 +256,15 @@ private static string GetBestLabelForPawnColumn(PawnColumnDef pcd) return string.Empty; if (pcd.workType != null) - return pcd.workType.labelShort; + return pcd.workType.labelShort.Translate(); if (!pcd.LabelCap.NullOrEmpty()) - return pcd.LabelCap; + return pcd.LabelCap.ToString().Translate(); if (!pcd.headerTip.NullOrEmpty()) - return pcd.headerTip; + return pcd.headerTip.Translate(); - return pcd.defName; + return pcd.defName.Translate(); } private void AddPawnColumnAtBestPositionAndRefresh(PawnColumnDef pcd) @@ -300,5 +301,18 @@ private void AddPawnColumnAtBestPositionAndRefresh(PawnColumnDef pcd) } }; //basically all that are already present, don't have an interactable header, and uh + + private class FloatMenuOptionComparer : IEqualityComparer + { + public bool Equals(FloatMenuOption x, FloatMenuOption y) + { + return x?.Label == y?.Label; + } + + public int GetHashCode(FloatMenuOption obj) + { + return obj.Label.GetHashCode(); + } + } } } diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Age.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Age.cs index a8f13cb..e9bb5d0 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Age.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Age.cs @@ -3,9 +3,13 @@ using System; using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_Age : PawnColumnWorker_Text { + + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => Math.Round(pawn.ageTracker.AgeBiologicalYearsFloat, 2).ToString("0.00"); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalEggProgress.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalEggProgress.cs index 13b2c29..0f656d6 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalEggProgress.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalEggProgress.cs @@ -1,12 +1,14 @@ namespace Numbers { - using System.Linq; + using UnityEngine; using HarmonyLib; using RimWorld; using Verse; public class PawnColumnWorker_AnimalEggProgress : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { if (pawn.ageTracker.CurLifeStage.reproductive) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalFilthRate.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalFilthRate.cs index dddcaab..250e894 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalFilthRate.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalFilthRate.cs @@ -2,9 +2,12 @@ { using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_AnimalFilthRate : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { return GetScoreFor(pawn).ToString("F2"); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalMilkFullness.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalMilkFullness.cs index e89a34b..c9ac209 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalMilkFullness.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalMilkFullness.cs @@ -1,11 +1,13 @@ namespace Numbers { - using System.Linq; + using UnityEngine; using RimWorld; using Verse; public class PawnColumnWorker_AnimalMilkFullness : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { if (pawn.ageTracker.CurLifeStage.milkable) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWildness.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWildness.cs index e14db1b..547a85c 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWildness.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWildness.cs @@ -2,9 +2,12 @@ { using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_AnimalWildness : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + public override int Compare(Pawn a, Pawn b) => (a.AnimalOrWildMan() || b.AnimalOrWildMan()) ? GetValue(a).CompareTo(GetValue(b)) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWoolGrowth.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWoolGrowth.cs index 1bef1ac..2659fab 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWoolGrowth.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_AnimalWoolGrowth.cs @@ -1,11 +1,13 @@ namespace Numbers { - using System.Linq; + using UnityEngine; using RimWorld; using Verse; public class PawnColumnWorker_AnimalWoolGrowth : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { if (pawn.ageTracker.CurLifeStage.shearable) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Backstory.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Backstory.cs index 0746c92..3b471c0 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Backstory.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Backstory.cs @@ -2,9 +2,12 @@ { using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_Backstory : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.story.TitleShortCap; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Bleedrate.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Bleedrate.cs index f053391..1e881e6 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Bleedrate.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Bleedrate.cs @@ -10,6 +10,8 @@ public class PawnColumnWorker_Bleedrate : PawnColumnWorker_Text private static readonly Color SeverePainColor = new(0.9f, 0.5f, 0f); + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + public override int Compare(Pawn a, Pawn b) => a.health.hediffSet.BleedRateTotal.CompareTo(b.health.hediffSet.BleedRateTotal); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Capacity.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Capacity.cs index d03c9fc..fc1e9af 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Capacity.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Capacity.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_Capacity : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.health.capacities.GetLevel(def.Ext().capacity).ToStringPercent(); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Faction.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Faction.cs index 890a3ff..23f709e 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Faction.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Faction.cs @@ -6,6 +6,8 @@ class PawnColumnWorker_Faction : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.Faction?.Name; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_FoodConsumption.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_FoodConsumption.cs index 08a70db..d667b79 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_FoodConsumption.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_FoodConsumption.cs @@ -1,10 +1,13 @@ using RimWorld; +using UnityEngine; using Verse; namespace Numbers { public class PawnColumnWorker_FoodConsumption : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => (pawn?.needs?.food?.FoodFallPerTickAssumingCategory(HungerCategory.Fed) * 60000f ?? 0).ToString("0.##"); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Genes.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Genes.cs index 2d5acf6..1558116 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Genes.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Genes.cs @@ -3,10 +3,13 @@ using System.Linq; using RimWorld; using Verse; + using UnityEngine; //todo: probably better with icons to hover over for a tooltip or smth public class PawnColumnWorker_Endogenes : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { return pawn.genes?.Endogenes?.Select(gene => gene.Label).ToCommaList(); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_GenesRegrowTime.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_GenesRegrowTime.cs index be131b8..bb788d1 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_GenesRegrowTime.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_GenesRegrowTime.cs @@ -2,10 +2,13 @@ { using RimWorld; using Verse; + using UnityEngine; //todo: probably better with icons to hover over for a tooltip or smth public class PawnColumnWorker_GenesRegrowTime : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + private int GetTicksRemaining(Pawn pawn) { var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.XenogermReplicating); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Inspiration.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Inspiration.cs index 6d4b30c..3bd7f31 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Inspiration.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Inspiration.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_Inspiration : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.InspirationDef?.LabelCap; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_JobCurrent.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_JobCurrent.cs index 4ef8fd6..db25c20 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_JobCurrent.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_JobCurrent.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_JobCurrent : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { if (!Numbers_Settings.showMoreInfoThanVanilla && !(pawn.Faction == Faction.OfPlayer || pawn.HostFaction == Faction.OfPlayer) && !pawn.InMentalState) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_JobQueued.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_JobQueued.cs index e78a995..d77795b 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_JobQueued.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_JobQueued.cs @@ -7,6 +7,8 @@ public class PawnColumnWorker_JobQueued : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { if (pawn.jobs?.jobQueue.Any() ?? false) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_LeatherType.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_LeatherType.cs index bcc263f..49dd486 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_LeatherType.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_LeatherType.cs @@ -1,10 +1,13 @@ using RimWorld; +using UnityEngine; using Verse; namespace Numbers { public class PawnColumnWorker_LeatherType : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { return pawn.RaceProps?.leatherDef?.LabelCap; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Meditation.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Meditation.cs index 7acb205..9f187a7 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Meditation.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Meditation.cs @@ -6,6 +6,8 @@ namespace Numbers { public class PawnColumnWorker_Meditation : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { return MeditationUtility.FocusTypesAvailableForPawnString(pawn); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_MentalState.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_MentalState.cs index 42b944c..cbcd11e 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_MentalState.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_MentalState.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_MentalState : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.MentalState?.InspectLine ?? string.Empty; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Pain.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Pain.cs index 4febc32..87e40e3 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Pain.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Pain.cs @@ -8,6 +8,8 @@ public class PawnColumnWorker_Pain : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.health.hediffSet.PainTotal.ToStringPercent(); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_PrisonerResistance.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_PrisonerResistance.cs index 6c18847..d416542 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_PrisonerResistance.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_PrisonerResistance.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_PrisonerResistance : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { return pawn.guest.Resistance.ToString("F1"); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_PsylinkLevel.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_PsylinkLevel.cs index e77f607..3bfc4ed 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_PsylinkLevel.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_PsylinkLevel.cs @@ -2,9 +2,12 @@ { using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_PsylinkLevel : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => (pawn.psychicEntropy?.Psylink?.level ?? 0).ToString(); diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Race.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Race.cs index 5144809..4d28aad 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Race.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Race.cs @@ -11,6 +11,8 @@ public class PawnColumnWorker_Race : PawnColumnWorker_Text { private readonly Dictionary widthsTables = WorldComponent_Numbers.PrimaryFilter.Keys.ToDictionary(x => x, x => 0f); + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { string text = pawn.kindDef.race.LabelCap.Resolve() ?? string.Empty; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Record.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Record.cs index 192c5a8..5f8f698 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Record.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Record.cs @@ -6,6 +6,8 @@ public class PawnColumnWorker_Record : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { RecordDef recordDef = def.Ext().record; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Stat.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Stat.cs index 36cd51e..c28fbb6 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Stat.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Stat.cs @@ -9,6 +9,8 @@ public class PawnColumnWorker_Stat : PawnColumnWorker_Text public const int minWidthBasedOnNarrowestColumnThatColumnBeingMass = 69; public const int maxWidthBasedOnColumnsWithALongAssNameLikeThisInt = 150; public const int margin = 5; + + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; protected override string GetTextFor(Pawn pawn) { diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_TameChance.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_TameChance.cs index ef681bc..ad6a3db 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_TameChance.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_TameChance.cs @@ -3,9 +3,12 @@ using System; using RimWorld; using Verse; + using UnityEngine; public class PawnColumnWorker_TameChance : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + public override int Compare(Pawn a, Pawn b) => GetValue(a).CompareTo(GetValue(b)); protected override string GetTextFor(Pawn pawn) => pawn.AnimalOrWildMan() ? GetValue(pawn).ToStringPercent() : string.Empty; diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Trait.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Trait.cs index 50e5464..ad3fb38 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Trait.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Trait.cs @@ -1,14 +1,24 @@ -namespace Numbers -{ - using System.Linq; - using RimWorld; - using Verse; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +namespace Numbers +{ public class PawnColumnWorker_Trait : PawnColumnWorker_Text { + private readonly bool _traitRarityColorsModIsActive = ModsConfig.IsActive("carnysenpai.traitraritycolors"); + + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) { - return pawn.story?.traits?.allTraits.Select(x => x.Label).ToCommaList(); + return pawn.story?.traits?.allTraits.Select(GetLabel).ToCommaList(); + } + + private string GetLabel(Trait trait) + { + return _traitRarityColorsModIsActive ? trait.CurrentData.label.CapitalizeFirst() : trait.Label; } } -} +} \ No newline at end of file diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Will.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Will.cs index e8aa89b..9323821 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Will.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Will.cs @@ -1,10 +1,13 @@ using RimWorld; using Verse; +using UnityEngine; namespace Numbers { public class PawnColumnWorker_Will : PawnColumnWorker_Text { + protected override TextAnchor Anchor => TextAnchor.MiddleCenter; + protected override string GetTextFor(Pawn pawn) => pawn.guest.will.ToString("F1"); From 983ef04cb6da330e9e2136677243e634d57d6ec9 Mon Sep 17 00:00:00 2001 From: Jia_RG Date: Mon, 12 May 2025 18:12:17 +0800 Subject: [PATCH 2/2] Fix red error: Tried to create a texture from a different thread. --- Numbers/PawnColumnWorkers/PawnColumnWorker_Entropy.cs | 5 +---- Numbers/PawnColumnWorkers/PawnColumnWorker_Skill.cs | 9 ++------- Numbers/StaticConstructorOnGameStart.cs | 7 ++++++- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Entropy.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Entropy.cs index 0cfceb6..49b6f66 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Entropy.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Entropy.cs @@ -4,11 +4,8 @@ using UnityEngine; using Verse; - [StaticConstructorOnStartup] public class PawnColumnWorker_Entropy : PawnColumnWorker { - private static readonly Texture2D EntropyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.46f, 0.34f, 0.35f)); - //mostly from PawnColumnWorker_Need public override void DoCell(Rect rect, Pawn pawn, PawnTable table) @@ -30,7 +27,7 @@ public override void DoCell(Rect rect, Pawn pawn, PawnTable table) Rect rect3 = new(rect.x, rect.y + rect.height / 2f, rect.width, rect.height / 2f); rect3 = new Rect(rect3.x + barWidth, rect3.y, rect3.width - barWidth * 2f, rect3.height - barHeight); - Widgets.FillableBar(rect3, curEntropyLevel, EntropyBarTex); + Widgets.FillableBar(rect3, curEntropyLevel, StaticConstructorOnGameStart.EntropyBarTex); Text.Font = GameFont.Small; } diff --git a/Numbers/PawnColumnWorkers/PawnColumnWorker_Skill.cs b/Numbers/PawnColumnWorkers/PawnColumnWorker_Skill.cs index da9abc6..a1b0819 100644 --- a/Numbers/PawnColumnWorkers/PawnColumnWorker_Skill.cs +++ b/Numbers/PawnColumnWorkers/PawnColumnWorker_Skill.cs @@ -5,15 +5,10 @@ using UnityEngine; using Verse; - [StaticConstructorOnStartup] //mostly from Koisama public class PawnColumnWorker_Skill : PawnColumnWorker { - private static readonly Texture2D passionMinorIcon = ContentFinder.Get("UI/Icons/PassionMinor"); - private static readonly Texture2D passionMajorIcon = ContentFinder.Get("UI/Icons/PassionMajor"); - private static readonly Texture2D SkillBarFillTex = SolidColorMaterials.NewSolidColorTexture(new Color(1f, 1f, 1f, 0.25f)); - private static readonly Texture2D SkillBarBgTex = SolidColorMaterials.NewSolidColorTexture(new Color(1f, 1f, 1f, 0.07f)); private static readonly Color DisabledSkillColor = new(1f, 1f, 1f, 0.5f); private static readonly MethodInfo mGetSkillDescription = typeof(SkillUI).GetMethod("GetSkillDescription", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, [typeof(SkillRecord)], null); @@ -34,13 +29,13 @@ public override void DoCell(Rect rect, Pawn pawn, PawnTable table) Rect position = new(3f, 3f, 24f, 24f); if (skill.passion > Passion.None) { - Texture2D image = (skill.passion != Passion.Major) ? passionMinorIcon : passionMajorIcon; + Texture2D image = (skill.passion != Passion.Major) ? StaticConstructorOnGameStart.PassionMinorIcon : StaticConstructorOnGameStart.PassionMajorIcon; GUI.DrawTexture(position, image); } if (!skill.TotallyDisabled) { Rect rect3 = new(position.xMax, 0f, rect.width - position.xMax, rect.height); - Widgets.FillableBar(rect3, skill.Level / 20f, SkillBarFillTex, SkillBarBgTex, false); + Widgets.FillableBar(rect3, skill.Level / 20f, StaticConstructorOnGameStart.SkillBarFillTex, StaticConstructorOnGameStart.SkillBarBgTex, false); } Rect rect4 = new(position.xMax + 4f, 0f, 999f, rect.height); rect4.yMin += 3f; diff --git a/Numbers/StaticConstructorOnGameStart.cs b/Numbers/StaticConstructorOnGameStart.cs index d2be6f7..fc88ce3 100644 --- a/Numbers/StaticConstructorOnGameStart.cs +++ b/Numbers/StaticConstructorOnGameStart.cs @@ -24,7 +24,12 @@ static class StaticConstructorOnGameStart SortingDescendingIcon = ContentFinder.Get("UI/Icons/SortingDescending"), BarInstantMarkerTex = ContentFinder.Get("UI/Misc/BarInstantMarker"), Drop = ContentFinder.Get("UI/Buttons/Drop"), - UnwaveringlyLoyal = ContentFinder.Get("UI/Icons/UnwaveringlyLoyal"); + UnwaveringlyLoyal = ContentFinder.Get("UI/Icons/UnwaveringlyLoyal"), + PassionMinorIcon = ContentFinder.Get("UI/Icons/PassionMinor"), + PassionMajorIcon = ContentFinder.Get("UI/Icons/PassionMajor"), + SkillBarFillTex = SolidColorMaterials.NewSolidColorTexture(new Color(1f, 1f, 1f, 0.25f)), + SkillBarBgTex = SolidColorMaterials.NewSolidColorTexture(new Color(1f, 1f, 1f, 0.07f)), + EntropyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.46f, 0.34f, 0.35f)); public static List combatPreset = [], workTabPlusPreset = [],