public virtual string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); float baseValueFor = GetBaseValueFor(req.Def); if (baseValueFor != 0f) { stringBuilder.AppendLine("StatsReport_BaseValue".Translate() + ": " + stat.ValueToString(baseValueFor, numberSense)); stringBuilder.AppendLine(); } Pawn pawn = req.Thing as Pawn; if (pawn != null) { if (pawn.skills != null) { if (stat.skillNeedOffsets != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int i = 0; i < stat.skillNeedOffsets.Count; i++) { SkillNeed skillNeed = stat.skillNeedOffsets[i]; int level = pawn.skills.GetSkill(skillNeed.skill).Level; float val = skillNeed.ValueFor(pawn); stringBuilder.AppendLine(" " + skillNeed.skill.LabelCap + " (" + level + "): " + val.ToStringSign() + ValueToString(val, finalized: false)); } stringBuilder.AppendLine(); } } else if (stat.noSkillOffset != 0f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : " + stat.noSkillOffset.ToStringSign() + ValueToString(stat.noSkillOffset, finalized: false)); stringBuilder.AppendLine(); } if (stat.capacityOffsets != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); foreach (PawnCapacityOffset item in from hfa in stat.capacityOffsets orderby hfa.capacity.listOrder select hfa) { string text = item.capacity.GetLabelFor(pawn).CapitalizeFirst(); float level2 = pawn.health.capacities.GetLevel(item.capacity); float offset = item.GetOffset(pawn.health.capacities.GetLevel(item.capacity)); string text2 = ValueToString(offset, finalized: false); string text3 = Mathf.Min(level2, item.max).ToStringPercent() + ", " + "HealthOffsetScale".Translate(item.scale.ToString() + "x"); if (item.max < 999f) { text3 = text3 + ", " + "HealthFactorMaxImpact".Translate(item.max.ToStringPercent()); } stringBuilder.AppendLine(" " + text + ": " + offset.ToStringSign() + text2 + " (" + text3 + ")"); } stringBuilder.AppendLine(); } if ((int)pawn.RaceProps.intelligence >= 1) { if (pawn.story != null && pawn.story.traits != null) { List <Trait> list = (from tr in pawn.story.traits.allTraits where tr.CurrentData.statOffsets != null && tr.CurrentData.statOffsets.Any((StatModifier se) => se.stat == stat) select tr).ToList(); List <Trait> list2 = (from tr in pawn.story.traits.allTraits where tr.CurrentData.statFactors != null && tr.CurrentData.statFactors.Any((StatModifier se) => se.stat == stat) select tr).ToList(); if (list.Count > 0 || list2.Count > 0) { stringBuilder.AppendLine("StatsReport_RelevantTraits".Translate()); for (int j = 0; j < list.Count; j++) { Trait trait = list[j]; string valueToStringAsOffset = trait.CurrentData.statOffsets.First((StatModifier se) => se.stat == stat).ValueToStringAsOffset; stringBuilder.AppendLine(" " + trait.LabelCap + ": " + valueToStringAsOffset); } for (int k = 0; k < list2.Count; k++) { Trait trait2 = list2[k]; string toStringAsFactor = trait2.CurrentData.statFactors.First((StatModifier se) => se.stat == stat).ToStringAsFactor; stringBuilder.AppendLine(" " + trait2.LabelCap + ": " + toStringAsFactor); } stringBuilder.AppendLine(); } } if (RelevantGear(pawn, stat).Any()) { stringBuilder.AppendLine("StatsReport_RelevantGear".Translate()); if (pawn.apparel != null) { for (int l = 0; l < pawn.apparel.WornApparel.Count; l++) { Apparel gear = pawn.apparel.WornApparel[l]; stringBuilder.AppendLine(InfoTextLineFromGear(gear, stat)); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { stringBuilder.AppendLine(InfoTextLineFromGear(pawn.equipment.Primary, stat)); } stringBuilder.AppendLine(); } } bool flag = false; List <Hediff> hediffs = pawn.health.hediffSet.hediffs; for (int m = 0; m < hediffs.Count; m++) { HediffStage curStage = hediffs[m].CurStage; if (curStage != null) { float statOffsetFromList = curStage.statOffsets.GetStatOffsetFromList(stat); if (statOffsetFromList != 0f) { if (!flag) { stringBuilder.AppendLine("StatsReport_RelevantHediffs".Translate()); flag = true; } stringBuilder.AppendLine(" " + hediffs[m].LabelBase.CapitalizeFirst() + ": " + ValueToString(statOffsetFromList, finalized: false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } } } float statFactorFromList = pawn.ageTracker.CurLifeStage.statFactors.GetStatFactorFromList(stat); if (statFactorFromList != 1f) { stringBuilder.AppendLine("StatsReport_LifeStage".Translate() + " (" + pawn.ageTracker.CurLifeStage.label + "): " + statFactorFromList.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor)); stringBuilder.AppendLine(); } } if (req.StuffDef != null) { if (baseValueFor > 0f || stat.applyFactorsIfNegative) { float statFactorFromList2 = req.StuffDef.stuffProps.statFactors.GetStatFactorFromList(stat); if (statFactorFromList2 != 1f) { stringBuilder.AppendLine("StatsReport_Material".Translate() + " (" + req.StuffDef.LabelCap + "): " + statFactorFromList2.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor)); stringBuilder.AppendLine(); } } float statOffsetFromList2 = req.StuffDef.stuffProps.statOffsets.GetStatOffsetFromList(stat); if (statOffsetFromList2 != 0f) { stringBuilder.AppendLine("StatsReport_Material".Translate() + " (" + req.StuffDef.LabelCap + "): " + statOffsetFromList2.ToStringByStyle(stat.toStringStyle, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } } req.Thing.TryGetComp <CompAffectedByFacilities>()?.GetStatsExplanation(stat, stringBuilder); if (stat.statFactors != null) { stringBuilder.AppendLine("StatsReport_OtherStats".Translate()); for (int n = 0; n < stat.statFactors.Count; n++) { StatDef statDef = stat.statFactors[n]; stringBuilder.AppendLine(" " + statDef.LabelCap + ": x" + statDef.Worker.GetValue(req).ToStringPercent()); } stringBuilder.AppendLine(); } if (pawn != null) { if (pawn.skills != null) { if (stat.skillNeedFactors != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int num = 0; num < stat.skillNeedFactors.Count; num++) { SkillNeed skillNeed2 = stat.skillNeedFactors[num]; int level3 = pawn.skills.GetSkill(skillNeed2.skill).Level; stringBuilder.AppendLine(" " + skillNeed2.skill.LabelCap + " (" + level3 + "): x" + skillNeed2.ValueFor(pawn).ToStringPercent()); } stringBuilder.AppendLine(); } } else if (stat.noSkillFactor != 1f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : x" + stat.noSkillFactor.ToStringPercent()); stringBuilder.AppendLine(); } if (stat.capacityFactors != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); if (stat.capacityFactors != null) { foreach (PawnCapacityFactor item2 in from hfa in stat.capacityFactors orderby hfa.capacity.listOrder select hfa) { string text4 = item2.capacity.GetLabelFor(pawn).CapitalizeFirst(); float factor = item2.GetFactor(pawn.health.capacities.GetLevel(item2.capacity)); string text5 = factor.ToStringPercent(); string text6 = "HealthFactorPercentImpact".Translate(item2.weight.ToStringPercent()); if (item2.max < 999f) { text6 = text6 + ", " + "HealthFactorMaxImpact".Translate(item2.max.ToStringPercent()); } if (item2.allowedDefect != 0f) { text6 = text6 + ", " + "HealthFactorAllowedDefect".Translate((1f - item2.allowedDefect).ToStringPercent()); } stringBuilder.AppendLine(" " + text4 + ": x" + text5 + " (" + text6 + ")"); } } stringBuilder.AppendLine(); } if (pawn.Inspired) { float statOffsetFromList3 = pawn.InspirationDef.statOffsets.GetStatOffsetFromList(stat); if (statOffsetFromList3 != 0f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(pawn.Inspiration.def.LabelCap) + ": " + ValueToString(statOffsetFromList3, finalized: false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } float statFactorFromList3 = pawn.InspirationDef.statFactors.GetStatFactorFromList(stat); if (statFactorFromList3 != 1f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(pawn.Inspiration.def.LabelCap) + ": " + statFactorFromList3.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor)); stringBuilder.AppendLine(); } } } return(stringBuilder.ToString().TrimEndNewlines()); }
public static void DrawCharacterCard(Rect rect, Pawn pawn, Action randomizeCallback = null, Rect creationRect = default(Rect)) { bool flag = randomizeCallback != null; GUI.BeginGroup((!flag) ? rect : creationRect); Rect rect2 = new Rect(0f, 0f, 300f, 30f); NameTriple nameTriple = pawn.Name as NameTriple; if (flag && nameTriple != null) { Rect rect3 = new Rect(rect2); rect3.width *= 0.333f; Rect rect4 = new Rect(rect2); rect4.width *= 0.333f; rect4.x += rect4.width; Rect rect5 = new Rect(rect2); rect5.width *= 0.333f; rect5.x += rect4.width * 2f; string first = nameTriple.First; string nick = nameTriple.Nick; string last = nameTriple.Last; CharacterCardUtility.DoNameInputRect(rect3, ref first, 12); if (nameTriple.Nick == nameTriple.First || nameTriple.Nick == nameTriple.Last) { GUI.color = new Color(1f, 1f, 1f, 0.5f); } CharacterCardUtility.DoNameInputRect(rect4, ref nick, 16); GUI.color = Color.white; CharacterCardUtility.DoNameInputRect(rect5, ref last, 12); if (nameTriple.First != first || nameTriple.Nick != nick || nameTriple.Last != last) { pawn.Name = new NameTriple(first, nick, last); } TooltipHandler.TipRegion(rect3, "FirstNameDesc".Translate()); TooltipHandler.TipRegion(rect4, "ShortIdentifierDesc".Translate()); TooltipHandler.TipRegion(rect5, "LastNameDesc".Translate()); } else { rect2.width = 999f; Text.Font = GameFont.Medium; Widgets.Label(rect2, pawn.Name.ToStringFull); Text.Font = GameFont.Small; } if (randomizeCallback != null) { Rect rect6 = new Rect(creationRect.width - 24f - 100f, 0f, 100f, rect2.height); if (Widgets.ButtonText(rect6, "Randomize".Translate(), true, false, true)) { SoundDefOf.Tick_Tiny.PlayOneShotOnCamera(null); randomizeCallback(); } UIHighlighter.HighlightOpportunity(rect6, "RandomizePawn"); } if (flag) { Widgets.InfoCardButton(creationRect.width - 24f, 0f, pawn); } else if (!pawn.health.Dead) { float num = CharacterCardUtility.PawnCardSize.x - 85f; if ((pawn.Faction == Faction.OfPlayer || pawn.IsPrisonerOfColony) && pawn.Spawned) { Rect rect7 = new Rect(num, 0f, 30f, 30f); TooltipHandler.TipRegion(rect7, PawnBanishUtility.GetBanishButtonTip(pawn)); if (Widgets.ButtonImage(rect7, TexButton.Banish)) { if (pawn.Downed) { Messages.Message("MessageCantBanishDownedPawn".Translate(new object[] { pawn.LabelShort }).AdjustedFor(pawn, "PAWN"), pawn, MessageTypeDefOf.RejectInput, false); } else { PawnBanishUtility.ShowBanishPawnConfirmationDialog(pawn); } } num -= 40f; } if (pawn.IsColonist) { Rect rect8 = new Rect(num, 0f, 30f, 30f); TooltipHandler.TipRegion(rect8, "RenameColonist".Translate()); if (Widgets.ButtonImage(rect8, TexButton.Rename)) { Find.WindowStack.Add(new Dialog_NamePawn(pawn)); } num -= 40f; } } string label = pawn.MainDesc(true); Rect rect9 = new Rect(0f, 45f, rect.width, 60f); Widgets.Label(rect9, label); TooltipHandler.TipRegion(rect9, () => pawn.ageTracker.AgeTooltipString, 6873641); Rect position = new Rect(0f, 100f, 250f, 450f); Rect position2 = new Rect(position.xMax, 100f, 258f, 450f); GUI.BeginGroup(position); float num2 = 0f; Text.Font = GameFont.Medium; Widgets.Label(new Rect(0f, 0f, 200f, 30f), "Backstory".Translate()); num2 += 30f; Text.Font = GameFont.Small; IEnumerator enumerator = Enum.GetValues(typeof(BackstorySlot)).GetEnumerator(); try { while (enumerator.MoveNext()) { object obj = enumerator.Current; BackstorySlot backstorySlot = (BackstorySlot)obj; Backstory backstory = pawn.story.GetBackstory(backstorySlot); if (backstory != null) { Rect rect10 = new Rect(0f, num2, position.width, 24f); if (Mouse.IsOver(rect10)) { Widgets.DrawHighlight(rect10); } TooltipHandler.TipRegion(rect10, backstory.FullDescriptionFor(pawn)); Text.Anchor = TextAnchor.MiddleLeft; string str = (backstorySlot != BackstorySlot.Adulthood) ? "Childhood".Translate() : "Adulthood".Translate(); Widgets.Label(rect10, str + ":"); Text.Anchor = TextAnchor.UpperLeft; Rect rect11 = new Rect(rect10); rect11.x += 90f; rect11.width -= 90f; string label2 = backstory.TitleCapFor(pawn.gender); Widgets.Label(rect11, label2); num2 += rect10.height + 2f; } } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } if (pawn.story != null && pawn.story.title != null) { Rect rect12 = new Rect(0f, num2, position.width, 24f); Text.Anchor = TextAnchor.MiddleLeft; Widgets.Label(rect12, "Current".Translate() + ":"); Text.Anchor = TextAnchor.UpperLeft; Rect rect13 = new Rect(rect12); rect13.x += 90f; rect13.width -= 90f; Widgets.Label(rect13, pawn.story.title); num2 += rect12.height + 2f; } num2 += 25f; Text.Font = GameFont.Medium; Widgets.Label(new Rect(0f, num2, 200f, 30f), "IncapableOf".Translate()); num2 += 30f; Text.Font = GameFont.Small; StringBuilder stringBuilder = new StringBuilder(); WorkTags combinedDisabledWorkTags = pawn.story.CombinedDisabledWorkTags; if (combinedDisabledWorkTags == WorkTags.None) { stringBuilder.Append("(" + "NoneLower".Translate() + "), "); } else { List <WorkTags> list = CharacterCardUtility.WorkTagsFrom(combinedDisabledWorkTags).ToList <WorkTags>(); bool flag2 = true; foreach (WorkTags tags in list) { if (flag2) { stringBuilder.Append(tags.LabelTranslated().CapitalizeFirst()); } else { stringBuilder.Append(tags.LabelTranslated()); } stringBuilder.Append(", "); flag2 = false; } } string text = stringBuilder.ToString(); text = text.Substring(0, text.Length - 2); Rect rect14 = new Rect(0f, num2, position.width, 999f); Widgets.Label(rect14, text); num2 += 100f; Text.Font = GameFont.Medium; Widgets.Label(new Rect(0f, num2, 200f, 30f), "Traits".Translate()); num2 += 30f; Text.Font = GameFont.Small; for (int i = 0; i < pawn.story.traits.allTraits.Count; i++) { Trait trait = pawn.story.traits.allTraits[i]; Rect rect15 = new Rect(0f, num2, position.width, 24f); if (Mouse.IsOver(rect15)) { Widgets.DrawHighlight(rect15); } Widgets.Label(rect15, trait.LabelCap); num2 += rect15.height + 2f; Trait trLocal = trait; TipSignal tip = new TipSignal(() => trLocal.TipString(pawn), (int)num2 * 37); TooltipHandler.TipRegion(rect15, tip); } GUI.EndGroup(); GUI.BeginGroup(position2); Text.Font = GameFont.Medium; Widgets.Label(new Rect(0f, 0f, 200f, 30f), "Skills".Translate()); SkillUI.SkillDrawMode mode; if (Current.ProgramState == ProgramState.Playing) { mode = SkillUI.SkillDrawMode.Gameplay; } else { mode = SkillUI.SkillDrawMode.Menu; } SkillUI.DrawSkillsOf(pawn, new Vector2(0f, 35f), mode); GUI.EndGroup(); GUI.EndGroup(); }
private bool <GetExplanationUnfinalized> m__2(Trait tr) { return(tr.CurrentData.statFactors != null && tr.CurrentData.statFactors.Any((StatModifier se) => se.stat == this.stat)); }
public virtual bool InspirationCanOccur(Pawn pawn) { if (!def.allowedOnAnimals && pawn.RaceProps.Animal) { return(false); } if (!def.allowedOnNonColonists && !pawn.IsColonist) { return(false); } if (!def.allowedOnDownedPawns && pawn.Downed) { return(false); } if (def.requiredNonDisabledStats != null) { for (int i = 0; i < def.requiredNonDisabledStats.Count; i++) { if (def.requiredNonDisabledStats[i].Worker.IsDisabledFor(pawn)) { return(false); } } } if (def.requiredSkills != null) { for (int j = 0; j < def.requiredSkills.Count; j++) { if (!def.requiredSkills[j].PawnSatisfies(pawn)) { return(false); } } } if (!def.requiredAnySkill.NullOrEmpty()) { bool flag = false; for (int k = 0; k < def.requiredAnySkill.Count; k++) { if (def.requiredAnySkill[k].PawnSatisfies(pawn)) { flag = true; break; } } if (!flag) { return(false); } } if (def.requiredNonDisabledWorkTypes != null) { for (int l = 0; l < def.requiredNonDisabledWorkTypes.Count; l++) { if (pawn.WorkTypeIsDisabled(def.requiredNonDisabledWorkTypes[l])) { return(false); } } } if (!def.requiredAnyNonDisabledWorkType.NullOrEmpty()) { bool flag2 = false; for (int m = 0; m < def.requiredAnyNonDisabledWorkType.Count; m++) { if (!pawn.WorkTypeIsDisabled(def.requiredAnyNonDisabledWorkType[m])) { flag2 = true; break; } } if (!flag2) { return(false); } } if (def.requiredCapacities != null) { for (int n = 0; n < def.requiredCapacities.Count; n++) { if (!pawn.health.capacities.CapableOf(def.requiredCapacities[n])) { return(false); } } } if (pawn.story != null) { for (int num = 0; num < pawn.story.traits.allTraits.Count; num++) { Trait trait = pawn.story.traits.allTraits[num]; if (trait.CurrentData.disallowedInspirations != null && trait.CurrentData.disallowedInspirations.Contains(def)) { return(false); } } } return(true); }
public bool ConflictsWith(Trait other) { return(ConflictsWith(other.def)); }
public string EnablingThingsExplanation(Pawn pawn) { List <string> reasons = new List <string>(); if (requiresRoyalTitle && pawn.royalty != null && pawn.royalty.AllTitlesInEffectForReading.Count > 0) { RoyalTitle royalTitle = pawn.royalty.AllTitlesInEffectForReading.MaxBy((RoyalTitle t) => t.def.seniority); reasons.Add("MeditationFocusEnabledByTitle".Translate(royalTitle.def.GetLabelCapFor(pawn).Named("TITLE"), royalTitle.faction.Named("FACTION")).Resolve()); } if (pawn.story != null) { Backstory adulthood = pawn.story.adulthood; Backstory childhood = pawn.story.childhood; if (!requiresRoyalTitle && requiredBackstoriesAny.Count == 0) { for (int i = 0; i < incompatibleBackstoriesAny.Count; i++) { BackstoryCategoryAndSlot backstoryCategoryAndSlot = incompatibleBackstoriesAny[i]; Backstory backstory2 = ((backstoryCategoryAndSlot.slot == BackstorySlot.Adulthood) ? adulthood : childhood); if (!backstory2.spawnCategories.Contains(backstoryCategoryAndSlot.categoryName)) { AddBackstoryReason(backstoryCategoryAndSlot.slot, backstory2); } } for (int j = 0; j < DefDatabase <TraitDef> .AllDefsListForReading.Count; j++) { TraitDef traitDef = DefDatabase <TraitDef> .AllDefsListForReading[j]; List <MeditationFocusDef> disallowedMeditationFocusTypes = traitDef.degreeDatas[0].disallowedMeditationFocusTypes; if (disallowedMeditationFocusTypes != null && disallowedMeditationFocusTypes.Contains(this)) { reasons.Add("MeditationFocusDisabledByTrait".Translate() + ": " + traitDef.degreeDatas[0].GetLabelCapFor(pawn) + "."); } } } for (int k = 0; k < requiredBackstoriesAny.Count; k++) { BackstoryCategoryAndSlot backstoryCategoryAndSlot2 = requiredBackstoriesAny[k]; Backstory backstory3 = ((backstoryCategoryAndSlot2.slot == BackstorySlot.Adulthood) ? adulthood : childhood); if (backstory3.spawnCategories.Contains(backstoryCategoryAndSlot2.categoryName)) { AddBackstoryReason(backstoryCategoryAndSlot2.slot, backstory3); } } for (int l = 0; l < pawn.story.traits.allTraits.Count; l++) { Trait trait = pawn.story.traits.allTraits[l]; List <MeditationFocusDef> allowedMeditationFocusTypes = trait.CurrentData.allowedMeditationFocusTypes; if (allowedMeditationFocusTypes != null && allowedMeditationFocusTypes.Contains(this)) { reasons.Add("MeditationFocusEnabledByTrait".Translate() + ": " + trait.LabelCap + "."); } } } return(reasons.ToLineList(" - ", capitalizeItems: true)); void AddBackstoryReason(BackstorySlot slot, Backstory backstory) { if (slot == BackstorySlot.Adulthood) { reasons.Add("MeditationFocusEnabledByAdulthood".Translate() + ": " + backstory.title.CapitalizeFirst() + "."); } else { reasons.Add("MeditationFocusEnabledByChildhood".Translate() + ": " + backstory.title.CapitalizeFirst() + "."); } } }