public override string GetExplanation(StatRequest req, ToStringNumberSense numberSense) { if (!req.HasThing || !(req.Thing is Pawn)) return base.GetExplanation(req, numberSense); var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("StatsReport_BaseValue".Translate()); float statValueAbstract = stat.defaultBaseValue; stringBuilder.AppendLine(" " + stat.ValueToString(statValueAbstract, numberSense)); var pawn = req.Thing as Pawn; stringBuilder.AppendLine(); stringBuilder.AppendLine(string.Format("{0}: x{1} {2}", "StatsReport_CharacterQuality".Translate(), PriceUtility.PawnQualityPriceFactor(pawn).ToStringPercent(), -stat.defaultBaseValue)); return stringBuilder.ToString(); }
public override string GetExplanation(StatRequest req, ToStringNumberSense numberSense) { var stringBuilder = new StringBuilder(); stringBuilder.Append(base.GetExplanation(req, numberSense)); var pawn = req.Thing as Pawn; if (pawn == null || pawn.story == null) return stringBuilder.ToString(); var isAbrasive = pawn.story.traits.HasTrait(TraitDefOf.Abrasive); var abrasiveFactor = isAbrasive ? 0.5f : 1f; if (isAbrasive) { stringBuilder.AppendLine(); stringBuilder.AppendLine(string.Format(" {0}: x{1}", TraitDefOf.Abrasive.label.CapitalizeFirst(), abrasiveFactor.ToStringPercent())); } return stringBuilder.ToString(); }
public override string GetExplanation(StatRequest req, ToStringNumberSense numberSense) { if (!req.HasThing || !(req.Thing is Pawn)) return base.GetExplanation(req, numberSense); var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("StatsReport_BaseValue".Translate()); float statValueAbstract = stat.defaultBaseValue; stringBuilder.AppendLine(" " + stat.ValueToString(statValueAbstract, numberSense)); var pawn = req.Thing as Pawn; stringBuilder.AppendLine(); stringBuilder.AppendLine("StatsReport_Skills".Translate()); int level = pawn.skills.GetSkill(SkillDefOf.Social).level; stringBuilder.AppendLine(string.Format(" {0} ({1}): +{2}", SkillDefOf.Social.LabelCap, level, (level/8f).ToStringPercent())); return stringBuilder.ToString(); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { return(string.Empty); }
public override string GetExplanationFinalizePart(StatRequest req, ToStringNumberSense numberSense, float finalVal) { return("StatsReport_FinalValue".Translate() + ": " + GetFinalDisplayValue(req)); }
public override string GetExplanationFinalizePart(StatRequest req, ToStringNumberSense numberSense, float finalVal) { return(""); }
public static string ToStringByStyle(this float f, ToStringStyle style, ToStringNumberSense numberSense = ToStringNumberSense.Absolute) { if (style == ToStringStyle.Temperature && numberSense == ToStringNumberSense.Offset) { style = ToStringStyle.TemperatureOffset; } if (numberSense == ToStringNumberSense.Factor) { if (f >= 10f) { style = ToStringStyle.FloatMaxTwo; } else { style = ToStringStyle.PercentZero; } } string text; switch (style) { case ToStringStyle.Integer: text = Mathf.RoundToInt(f).ToString(); break; case ToStringStyle.FloatOne: text = f.ToString("F1"); break; case ToStringStyle.FloatTwo: text = f.ToString("F2"); break; case ToStringStyle.FloatThree: text = f.ToString("F3"); break; case ToStringStyle.FloatMaxOne: text = f.ToString("0.#"); break; case ToStringStyle.FloatMaxTwo: text = f.ToString("0.##"); break; case ToStringStyle.FloatMaxThree: text = f.ToString("0.###"); break; case ToStringStyle.FloatTwoOrThree: text = f.ToString((f != 0f && Mathf.Abs(f) < 0.01f) ? "F3" : "F2"); break; case ToStringStyle.PercentZero: text = f.ToStringPercent(); break; case ToStringStyle.PercentOne: text = f.ToStringPercent("F1"); break; case ToStringStyle.PercentTwo: text = f.ToStringPercent("F2"); break; case ToStringStyle.Temperature: text = f.ToStringTemperature("F1"); break; case ToStringStyle.TemperatureOffset: text = f.ToStringTemperatureOffset("F1"); break; case ToStringStyle.WorkAmount: text = f.ToStringWorkAmount(); break; default: Log.Error("Unknown ToStringStyle " + style, false); text = f.ToString(); break; } if (numberSense == ToStringNumberSense.Offset) { if (f >= 0f) { text = "+" + text; } } else if (numberSense == ToStringNumberSense.Factor) { text = "x" + text; } return(text); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { if (!(req.Def is ThingDef def)) { return(null); } /* Damage section */ CompEquippable equipComp = null; CompLootAffixableThing lootComp = null; if (req.HasThing) { var thing = (ThingWithComps)req.Thing; equipComp = thing.TryGetComp <CompEquippable>(); lootComp = thing.TryGetComp <CompLootAffixableThing>(); } Verb verb = equipComp?.AllVerbs.First(v => v.verbProps.isPrimary); VerbProperties verbProps = verb != null ? verb.verbProps : def.Verbs.First(vp => vp.isPrimary); Pawn attacker = req.HasThing ? GetCurrentWeaponUser(req.Thing) : null; var projProps = verbProps.defaultProjectile.projectile; var projModifier = (LootAffixModifier_VerbPropertiesChange_Def)lootComp?.AllModifiers.FirstOrFallback( lam => lam.AppliesTo == ModifierTarget.VerbProperties && lam is LootAffixModifier_VerbPropertiesChange_Def lamVPCD && lamVPCD.affectedField == "defaultProjectile" ); ThingDef modProjectile = projModifier != null ? (ThingDef)projModifier.resolvedDef : null; var modProjProps = modProjectile?.projectile; float chance = modProjProps != null ? 1f - projModifier.GetRealChance(lootComp.parent) : 1f; if (chance <= 0.05f) { chance = 1f; // already permanently set to "base" verbProps } string chanceStr = GenText.ToStringPercent(chance); float baseDamage = projProps.damageDef.harmsHealth == false ? 0f : req.HasThing ? projProps.GetDamageAmount(req.Thing) : req.StuffDef != null?projProps.GetDamageAmount(def.GetStatValueAbstract(StatDefOf.RangedWeapon_DamageMultiplier, req.StuffDef)) : projProps.GetDamageAmount(def.GetStatValueAbstract(StatDefOf.RangedWeapon_DamageMultiplier)) ; float damage = baseDamage * verbProps.burstShotCount * chance; string reportText = "Damage".Translate() + ":\n"; if (chance < 1f) { reportText += " " + "RimLoot_StatsReport_ProjectileWithChance".Translate( verbProps.defaultProjectile.Named("PROJECTILE"), chanceStr.Named("chance") ) + "\n"; reportText += string.Format(" {0}: {1} * {2} * {3} = {4}\n\n", "Damage".Translate(), baseDamage.ToStringDecimalIfSmall(), verbProps.burstShotCount, chanceStr, damage.ToStringDecimalIfSmall() ); float modChance = 1f - chance; string modChanceStr = GenText.ToStringPercent(modChance); float modBaseDamage = modProjProps.damageDef.harmsHealth == false ? 0f : modProjProps.GetDamageAmount(req.Thing) ; float modDamage = modBaseDamage * verbProps.burstShotCount * modChance; reportText += " " + "RimLoot_StatsReport_ProjectileWithChance".Translate( modProjectile.Named("PROJECTILE"), modChanceStr.Named("chance") ) + "\n"; reportText += string.Format(" {0}: {1} * {2} * {3} = {4}\n\n", "Damage".Translate(), modBaseDamage.ToStringDecimalIfSmall(), verbProps.burstShotCount, modChanceStr, modDamage.ToStringDecimalIfSmall() ); reportText += string.Format("{0}: {1}\n\n", "StatsReport_TotalValue".Translate(), (damage + modDamage).ToStringDecimalIfSmall()); } else { reportText += " " + "RimLoot_StatsReport_Projectile".Translate(verbProps.defaultProjectile.Named("PROJECTILE")) + "\n"; reportText += string.Format(" {0}: {1} * {2} = {3}\n\n", "Damage".Translate(), baseDamage.ToStringDecimalIfSmall(), verbProps.burstShotCount, damage.ToStringDecimalIfSmall() ); } /* Seconds per attack */ float secondsSpent = 0; float cooldown = req.HasThing ? req.Thing.GetStatValue(StatDefOf.RangedWeapon_Cooldown, true) : req.StuffDef != null?def.GetStatValueAbstract(StatDefOf.RangedWeapon_Cooldown, req.StuffDef) : def.GetStatValueAbstract(StatDefOf.RangedWeapon_Cooldown) ; float burstShotTime = ((verbProps.burstShotCount - 1) * verbProps.ticksBetweenBurstShots).TicksToSeconds(); if (verb != null) { secondsSpent = verbProps.AdjustedFullCycleTime(verb, attacker); } else { secondsSpent = verbProps.warmupTime + cooldown + burstShotTime; } reportText += GenText.ToTitleCaseSmart("SecondsPerAttackLower".Translate()) + ":\n"; reportText += string.Format(" {0}: {1}\n", "WarmupTime".Translate(), "PeriodSeconds".Translate(verbProps.warmupTime.ToStringDecimalIfSmall())); if (burstShotTime > 0) { reportText += string.Format(" {0}: {1}\n", "BurstShotFireRate".Translate(), "PeriodSeconds".Translate(burstShotTime.ToStringDecimalIfSmall())); } reportText += string.Format(" {0}: {1}\n", "CooldownTime".Translate(), "PeriodSeconds".Translate(cooldown.ToStringDecimalIfSmall())); reportText += string.Format("{0}: {1}\n\n", "StatsReport_TotalValue".Translate(), "PeriodSeconds".Translate(secondsSpent.ToStringDecimalIfSmall())); /* Average accuracy */ // Every integer range possible as an average float wpnAccuracy = 0; float pawnAccuracy = 0; for (int i = 3; i <= verbProps.range; i++) { wpnAccuracy += verbProps.GetHitChanceFactor(req.Thing, i); if (attacker != null) { pawnAccuracy += ShotReport.HitFactorFromShooter(attacker, i); } } if (verbProps.range >= 3) { wpnAccuracy /= verbProps.range - 2; if (attacker != null) { pawnAccuracy /= verbProps.range - 2; } } reportText += "AverageAccuracy".Translate() + ":\n"; reportText += string.Format(" {0}: {1}\n", "ShootReportWeapon".Translate(), wpnAccuracy.ToStringPercent("F1")); if (pawnAccuracy > 0) { reportText += string.Format(" {0}: {1}\n", "ShootReportShooterAbility".Translate(), pawnAccuracy.ToStringPercent("F1")); } return(reportText); }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { return(new SEB("StatsReport_RWHS", "TemperaturePerSecond").ValueNoFormat(GetValueUnfinalized(optionalReq).ToString("0.###")).ToString()); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { var pawn = (Pawn)req.Thing; return($"Health scale: {pawn.HealthScale} x {HealthScaleFactor}"); }
public virtual string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); float baseValueFor = GetBaseValueFor(req); if (baseValueFor != 0f) { stringBuilder.AppendLine("StatsReport_BaseValue".Translate() + ": " + stat.ValueToString(baseValueFor, numberSense)); } 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((string)(" " + skillNeed.skill.LabelCap + " (") + level + "): " + val.ToStringSign() + ValueToString(val, finalized: false)); } } } else if (stat.noSkillOffset != 0f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : " + stat.noSkillOffset.ToStringSign() + ValueToString(stat.noSkillOffset, finalized: false)); } if (stat.capacityOffsets != null) { stringBuilder.AppendLine("StatsReport_Health".CanTranslate() ? "StatsReport_Health".Translate() : "StatsReport_HealthFactors".Translate()); foreach (PawnCapacityOffset item in stat.capacityOffsets.OrderBy((PawnCapacityOffset hfa) => hfa.capacity.listOrder)) { 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 += ", " + "HealthFactorMaxImpact".Translate(item.max.ToStringPercent()); } stringBuilder.AppendLine(" " + text + ": " + offset.ToStringSign() + text2 + " (" + text3 + ")"); } } if ((int)pawn.RaceProps.intelligence >= 1) { if (pawn.story != null && pawn.story.traits != null) { List <Trait> list = pawn.story.traits.allTraits.Where((Trait tr) => tr.CurrentData.statOffsets != null && tr.CurrentData.statOffsets.Any((StatModifier se) => se.stat == stat)).ToList(); List <Trait> list2 = pawn.story.traits.allTraits.Where((Trait tr) => tr.CurrentData.statFactors != null && tr.CurrentData.statFactors.Any((StatModifier se) => se.stat == stat)).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); } } } 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 apparel = pawn.apparel.WornApparel[l]; if (GearAffectsStat(apparel.def, stat)) { stringBuilder.AppendLine(InfoTextLineFromGear(apparel, stat)); } } } if (pawn.equipment != null && pawn.equipment.Primary != null && GearAffectsStat(pawn.equipment.Primary.def, stat)) { stringBuilder.AppendLine(InfoTextLineFromGear(pawn.equipment.Primary, stat)); } } } 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) { continue; } float num = curStage.statOffsets.GetStatOffsetFromList(stat); if (num != 0f) { float val2 = num; if (curStage.statOffsetEffectMultiplier != null) { num *= pawn.GetStatValue(curStage.statOffsetEffectMultiplier); } if (!flag) { stringBuilder.AppendLine("StatsReport_RelevantHediffs".Translate()); flag = true; } stringBuilder.Append(" " + hediffs[m].LabelBaseCap + ": " + ValueToString(num, finalized: false, ToStringNumberSense.Offset)); if (curStage.statOffsetEffectMultiplier != null) { stringBuilder.Append(" (" + ValueToString(val2, finalized: false, ToStringNumberSense.Offset) + " x " + ValueToString(pawn.GetStatValue(curStage.statOffsetEffectMultiplier), finalized: true, curStage.statOffsetEffectMultiplier.toStringNumberSense) + " " + curStage.statOffsetEffectMultiplier.LabelCap + ")"); } stringBuilder.AppendLine(); } float num2 = curStage.statFactors.GetStatFactorFromList(stat); if (Math.Abs(num2 - 1f) > float.Epsilon) { float val3 = num2; if (curStage.statFactorEffectMultiplier != null) { num2 = ScaleFactor(num2, pawn.GetStatValue(curStage.statFactorEffectMultiplier)); } if (!flag) { stringBuilder.AppendLine("StatsReport_RelevantHediffs".Translate()); flag = true; } stringBuilder.Append(" " + hediffs[m].LabelBaseCap + ": " + ValueToString(num2, finalized: false, ToStringNumberSense.Factor)); if (curStage.statFactorEffectMultiplier != null) { stringBuilder.Append(" (" + ValueToString(val3, finalized: false, ToStringNumberSense.Factor) + " x " + ValueToString(pawn.GetStatValue(curStage.statFactorEffectMultiplier), finalized: false) + " " + curStage.statFactorEffectMultiplier.LabelCap + ")"); } 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)); } } 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)); } } float statOffsetFromList = req.StuffDef.stuffProps.statOffsets.GetStatOffsetFromList(stat); if (statOffsetFromList != 0f) { stringBuilder.AppendLine("StatsReport_Material".Translate() + " (" + req.StuffDef.LabelCap + "): " + statOffsetFromList.ToStringByStyle(stat.toStringStyle, ToStringNumberSense.Offset)); } } 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()); } } if (pawn != null) { if (pawn.skills != null) { if (stat.skillNeedFactors != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int num3 = 0; num3 < stat.skillNeedFactors.Count; num3++) { SkillNeed skillNeed2 = stat.skillNeedFactors[num3]; int level3 = pawn.skills.GetSkill(skillNeed2.skill).Level; stringBuilder.AppendLine((string)(" " + skillNeed2.skill.LabelCap + " (") + level3 + "): x" + skillNeed2.ValueFor(pawn).ToStringPercent()); } } } else if (stat.noSkillFactor != 1f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : x" + stat.noSkillFactor.ToStringPercent()); } if (stat.capacityFactors != null) { stringBuilder.AppendLine("StatsReport_Health".CanTranslate() ? "StatsReport_Health".Translate() : "StatsReport_HealthFactors".Translate()); if (stat.capacityFactors != null) { foreach (PawnCapacityFactor item2 in stat.capacityFactors.OrderBy((PawnCapacityFactor hfa) => hfa.capacity.listOrder)) { string text4 = item2.capacity.GetLabelFor(pawn).CapitalizeFirst(); string text5 = item2.GetFactor(pawn.health.capacities.GetLevel(item2.capacity)).ToStringPercent(); string text6 = "HealthFactorPercentImpact".Translate(item2.weight.ToStringPercent()); if (item2.max < 999f) { text6 += ", " + "HealthFactorMaxImpact".Translate(item2.max.ToStringPercent()); } if (item2.allowedDefect != 0f) { text6 += ", " + "HealthFactorAllowedDefect".Translate((1f - item2.allowedDefect).ToStringPercent()); } stringBuilder.AppendLine(" " + text4 + ": x" + text5 + " (" + text6 + ")"); } } } if (pawn.Inspired) { float statOffsetFromList2 = pawn.InspirationDef.statOffsets.GetStatOffsetFromList(stat); if (statOffsetFromList2 != 0f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(pawn.Inspiration.def.LabelCap) + ": " + ValueToString(statOffsetFromList2, finalized: false, ToStringNumberSense.Offset)); } 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)); } } } return(stringBuilder.ToString()); }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq) { var list = (optionalReq.Def as AmmoDef)?.AmmoSetDefs; return(list.FirstOrDefault().LabelCap + (list.Count > 1 ? " (+" + (list.Count - 1) + " more..)" : "")); }
public string ValueToString(float val, ToStringNumberSense numberSense = ToStringNumberSense.Absolute, bool finalized = true) { return(Worker.ValueToString(val, finalized, numberSense)); }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { return(string.Format("{0} ( {1} x {2} / {3} )", value.ToStringByStyle(stat.toStringStyle, numberSense), GetMeleeDamage(optionalReq).ToString("0.##"), StatDefOf.MeleeHitChance.ValueToString(GetMeleeHitChance(optionalReq)), GetMeleeCooldown(optionalReq).ToString("0.##"))); }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq) { var ammoProps = (optionalReq.Def as ThingDef)?.GetCompProperties <CompProperties_AmmoUser>(); return(ammoProps.magazineSize + " / " + GenText.ToStringByStyle((ammoProps.reloadTime), ToStringStyle.FloatTwo) + " s"); }
public StatDrawEntry(StatCategoryDef category, StatDef stat, float value, StatRequest optionalReq, ToStringNumberSense numberSense = ToStringNumberSense.Undefined, int?overrideDisplayPriorityWithinCategory = null, bool forceUnfinalizedMode = false) { this.category = category; this.stat = stat; labelInt = null; this.value = value; valueStringInt = null; displayOrderWithinCategory = (overrideDisplayPriorityWithinCategory.HasValue ? overrideDisplayPriorityWithinCategory.Value : stat.displayPriorityInCategory); this.optionalReq = optionalReq; this.forceUnfinalizedMode = forceUnfinalizedMode; hasOptionalReq = true; if (numberSense == ToStringNumberSense.Undefined) { this.numberSense = stat.toStringNumberSense; } else { this.numberSense = numberSense; } }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { return(base.GetStatDrawEntryLabel(stat, value, numberSense, optionalReq, finalized)); }
public override string GetStatDrawEntryLabel(StatDef statDef, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { return($"x{GetValueUnfinalized(optionalReq).ToStringPercent()}"); }
public static string ToStringByStyle(this float f, ToStringStyle style, ToStringNumberSense numberSense = ToStringNumberSense.Absolute) { if (style == ToStringStyle.Temperature && numberSense == ToStringNumberSense.Offset) { style = ToStringStyle.TemperatureOffset; } if (numberSense == ToStringNumberSense.Factor) { style = (ToStringStyle)((!(f >= 10.0)) ? 4 : 3); } string text; switch (style) { case ToStringStyle.Integer: text = Mathf.RoundToInt(f).ToString(); break; case ToStringStyle.FloatOne: text = f.ToString("F1"); break; case ToStringStyle.FloatTwo: text = f.ToString("F2"); break; case ToStringStyle.FloatMaxTwo: text = f.ToString("0.##"); break; case ToStringStyle.PercentZero: text = f.ToStringPercent(); break; case ToStringStyle.PercentOne: text = f.ToStringPercent("F1"); break; case ToStringStyle.PercentTwo: text = f.ToStringPercent("F2"); break; case ToStringStyle.Temperature: text = f.ToStringTemperature("F1"); break; case ToStringStyle.TemperatureOffset: text = f.ToStringTemperatureOffset("F1"); break; case ToStringStyle.WorkAmount: text = f.ToStringWorkAmount(); break; default: Log.Error("Unknown ToStringStyle " + style); text = f.ToString(); break; } switch (numberSense) { case ToStringNumberSense.Offset: if (f >= 0.0) { text = "+" + text; } break; case ToStringNumberSense.Factor: text = "x" + text; break; } return(text); }
public virtual string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq) { return(stat.ValueToString(value, numberSense)); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { string s = ""; if (!req.HasThing) { return(s); } CompDTemperature comp = req.Thing.TryGetComp <CompDTemperature>(); if (comp != null) { double interval = 2500; double ambient = comp.AmbientTemperature; double shift = ambient - comp.curTemp; double changeMag = Math.Abs(interval * shift / comp.PropsTemp.diffusionTime); double minStepScaled = CompDTemperature.minStep * interval; double step = (Math.Abs(shift) < minStepScaled || changeMag > CompDTemperature.minStep) ? changeMag : minStepScaled; if (step == minStepScaled) { s += "Currently coming to equilibrium at " + GenText.ToStringTemperatureOffset((float)ambient); } else { double result = Math.Sign(shift) * step * ThermodynamicsSettings.diffusionModifier; s += "Currently diffusing at a rate of " + GenText.ToStringTemperatureOffset((float)result) + " per hour."; s += HoursToAmbient(comp); CompDTemperatureIngestible comp2 = comp as CompDTemperatureIngestible; if (comp2 != null) { s += "\n"; if (comp2.PropsTemp.roomTemperature) { if (comp2.curTemp > comp2.PropsTemp.tempLevels.goodTemp && comp2.curTemp < comp2.PropsTemp.tempLevels.okTemp) { if (ambient < comp2.PropsTemp.tempLevels.goodTemp) { s += HoursInIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else if (ambient > comp2.PropsTemp.tempLevels.okTemp) { s += HoursInIdeal(comp2, comp2.PropsTemp.tempLevels.okTemp); } else { s += InIdealRange(); } } else if (comp2.curTemp < comp2.PropsTemp.tempLevels.goodTemp && ambient > comp2.PropsTemp.tempLevels.goodTemp) { s += HoursToIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else if (comp2.curTemp > comp2.PropsTemp.tempLevels.okTemp && ambient < comp2.PropsTemp.tempLevels.okTemp) { s += HoursToIdeal(comp2, comp2.PropsTemp.tempLevels.okTemp); } else { s += WillNeverReach(); } } else if (comp2.PropsTemp.likesHeat) { if (comp2.curTemp > comp2.PropsTemp.tempLevels.goodTemp) { if (ambient < comp2.PropsTemp.tempLevels.goodTemp) { s += HoursInIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else { s += InIdealRange(); } } else if (ambient > comp2.PropsTemp.tempLevels.goodTemp) { s += HoursToIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else { s += WillNeverReach(); } } else { if (comp2.curTemp < 0f && !comp2.PropsTemp.okFrozen) { if (comp2.AmbientTemperature > 0f) { s += HoursToIdeal(comp2, 0); } else if (comp2.AmbientTemperature <= 0f) { s += WillNeverReach(); } } else if (comp2.curTemp < comp2.PropsTemp.tempLevels.goodTemp) { if (ambient > comp2.PropsTemp.tempLevels.goodTemp) { s += HoursInIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else { s += InIdealRange(); } } else if (ambient < comp2.PropsTemp.tempLevels.goodTemp) { s += HoursToIdeal(comp2, comp2.PropsTemp.tempLevels.goodTemp); } else { s += WillNeverReach(); } } } } } return(s); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { return($"{"StatsReport_BaseValue".Translate()}: {GetBaseEstimatedLifespan(req.Thing, req.BuildableDef, req.StuffDef, false).ToString("F1")}"); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { float wildness = ((ThingDef)req.Def).race.wildness; return("Wildness".Translate() + " " + wildness.ToStringPercent() + ": " + ValueFromReq(req).ToString("F0")); }
public StatDrawEntry(StatCategoryDef category, StatDef stat, float value, StatRequest optionalReq, ToStringNumberSense numberSense = ToStringNumberSense.Undefined) { this.category = category; this.stat = stat; this.labelInt = null; this.value = value; this.valueStringInt = null; this.displayOrderWithinCategory = 0; this.optionalReq = optionalReq; this.hasOptionalReq = true; if (numberSense == ToStringNumberSense.Undefined) { this.numberSense = stat.toStringNumberSense; } else { this.numberSense = numberSense; } }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { RangedWeaponStats weaponStats = GetTurretStats(optionalReq); (float, int)optimalRange = new[] {
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq, bool finalized = true) { return(GetFinalDisplayValue(optionalReq)); }
public static void GetExplanationUnfinalized(StatWorker __instance, StatRequest req, ToStringNumberSense numberSense, ref string __result) { if (__instance != null) { StatDef value = Traverse.Create(__instance).Field("stat").GetValue <StatDef>(); if (req != null && req.Thing != null && req.Def != null && (req.Def == YautjaDefOf.RRY_Gun_Hunting_Bow || req.Def == YautjaDefOf.RRY_Gun_Compound_Bow) && value == StatDefOf.RangedWeapon_DamageMultiplier) { DamageArmorCategoryDef CategoryOfDamage = ((ThingDef)req.Def).Verbs[0].defaultProjectile.projectile.damageDef.armorCategory; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(__instance.GetExplanationUnfinalized(req, numberSense)); stringBuilder.AppendLine(); ThingDef def = (ThingDef)req.Def; if (req.StuffDef != null) { StatDef statDef = null; if (CategoryOfDamage != null) { statDef = CategoryOfDamage.multStat; } if (statDef != null) { stringBuilder.AppendLine(req.StuffDef.LabelCap + ": x" + req.StuffDef.GetStatValueAbstract(statDef, null).ToStringPercent()); } } __result = stringBuilder.ToString(); } } return; }
public static void Patch_StatWorker_GetExplanationUnfinalized(StatWorker __instance, ref string __result, ref StatRequest req, ToStringNumberSense numberSense, StatDef ___stat) { //StatDef stat = (StatDef)AccessTools.Field(typeof(StatWorker), "stat").GetValue(__instance); if (req.Thing is ThingWithComps thing && thing.TryGetComp <SocketComp>() is SocketComp socketable) { StringBuilder builder = new StringBuilder(__result); bool statChanged = false; foreach (RuneComp rune in socketable.SocketedRunes) { if (rune.RuneProps.statOffsets.FirstOrDefault(mod => mod.stat == ___stat) is StatModifier statModifer) { if (!statChanged) { builder.AppendLine(); builder.AppendLine(); builder.AppendLine("Runes"); } builder.AppendLine(" " + rune.parent.LabelCapNoCount + ": " + statModifer.value.ToStringByStyle(statModifer.stat.ToStringStyleUnfinalized, ToStringNumberSense.Offset)); statChanged = true; } } if (statChanged) { __result = builder.ToString().TrimEndNewlines(); } } }
private static void ModifyStatModifier(ref List <StatModifier> modifierList, StatDef stat, ToStringNumberSense mode, float offset = 0, float factor = 1) { if (modifierList.FirstOrDefault(s => s.stat == stat) is StatModifier meleeCooldownFactor) { meleeCooldownFactor.value = (meleeCooldownFactor.value + offset) * factor; } else { modifierList.Add(new StatModifier() { stat = stat, value = ((mode == ToStringNumberSense.Factor ? 1 : 0) + offset) * factor }); } }
public virtual string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); float baseValueFor = this.GetBaseValueFor(req.Def); if (baseValueFor != 0f) { stringBuilder.AppendLine("StatsReport_BaseValue".Translate() + ": " + this.stat.ValueToString(baseValueFor, numberSense)); stringBuilder.AppendLine(); } Pawn pawn = req.Thing as Pawn; if (pawn != null) { if (pawn.skills != null) { if (this.stat.skillNeedOffsets != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int i = 0; i < this.stat.skillNeedOffsets.Count; i++) { SkillNeed skillNeed = this.stat.skillNeedOffsets[i]; int level = pawn.skills.GetSkill(skillNeed.skill).Level; float val = skillNeed.ValueFor(pawn); stringBuilder.AppendLine(string.Concat(new object[] { " ", skillNeed.skill.LabelCap, " (", level, "): ", val.ToStringSign(), this.ValueToString(val, false, ToStringNumberSense.Absolute) })); } stringBuilder.AppendLine(); } } else if (this.stat.noSkillOffset != 0f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(string.Concat(new string[] { " ", "default".Translate().CapitalizeFirst(), " : ", this.stat.noSkillOffset.ToStringSign(), this.ValueToString(this.stat.noSkillOffset, false, ToStringNumberSense.Absolute) })); stringBuilder.AppendLine(); } if (this.stat.capacityOffsets != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); foreach (PawnCapacityOffset pawnCapacityOffset in from hfa in this.stat.capacityOffsets orderby hfa.capacity.listOrder select hfa) { string text = pawnCapacityOffset.capacity.GetLabelFor(pawn).CapitalizeFirst(); float level2 = pawn.health.capacities.GetLevel(pawnCapacityOffset.capacity); float offset = pawnCapacityOffset.GetOffset(pawn.health.capacities.GetLevel(pawnCapacityOffset.capacity)); string text2 = this.ValueToString(offset, false, ToStringNumberSense.Absolute); string text3 = Mathf.Min(level2, pawnCapacityOffset.max).ToStringPercent() + ", " + "HealthOffsetScale".Translate(new object[] { pawnCapacityOffset.scale.ToString() + "x" }); if (pawnCapacityOffset.max < 999f) { text3 = text3 + ", " + "HealthFactorMaxImpact".Translate(new object[] { pawnCapacityOffset.max.ToStringPercent() }); } stringBuilder.AppendLine(string.Concat(new string[] { " ", text, ": ", offset.ToStringSign(), text2, " (", text3, ")" })); } stringBuilder.AppendLine(); } if (pawn.RaceProps.intelligence >= Intelligence.ToolUser) { 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 == this.stat) select tr).ToList <Trait>(); List <Trait> list2 = (from tr in pawn.story.traits.allTraits where tr.CurrentData.statFactors != null && tr.CurrentData.statFactors.Any((StatModifier se) => se.stat == this.stat) select tr).ToList <Trait>(); 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 == this.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 == this.stat).ToStringAsFactor; stringBuilder.AppendLine(" " + trait2.LabelCap + ": " + toStringAsFactor); } stringBuilder.AppendLine(); } } if (StatWorker.RelevantGear(pawn, this.stat).Any <Thing>()) { 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(StatWorker.InfoTextLineFromGear(gear, this.stat)); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { stringBuilder.AppendLine(StatWorker.InfoTextLineFromGear(pawn.equipment.Primary, this.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(this.stat); if (statOffsetFromList != 0f) { if (!flag) { stringBuilder.AppendLine("StatsReport_RelevantHediffs".Translate()); flag = true; } stringBuilder.AppendLine(" " + hediffs[m].LabelBase.CapitalizeFirst() + ": " + this.ValueToString(statOffsetFromList, false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } } } float statFactorFromList = pawn.ageTracker.CurLifeStage.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList != 1f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_LifeStage".Translate(), " (", pawn.ageTracker.CurLifeStage.label, "): ", statFactorFromList.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor) })); stringBuilder.AppendLine(); } } if (req.StuffDef != null) { if (baseValueFor > 0f || this.stat.applyFactorsIfNegative) { float statFactorFromList2 = req.StuffDef.stuffProps.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList2 != 1f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_Material".Translate(), " (", req.StuffDef.LabelCap, "): ", statFactorFromList2.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor) })); stringBuilder.AppendLine(); } } float statOffsetFromList2 = req.StuffDef.stuffProps.statOffsets.GetStatOffsetFromList(this.stat); if (statOffsetFromList2 != 0f) { stringBuilder.AppendLine(string.Concat(new string[] { "StatsReport_Material".Translate(), " (", req.StuffDef.LabelCap, "): ", statOffsetFromList2.ToStringByStyle(this.stat.toStringStyle, ToStringNumberSense.Offset) })); stringBuilder.AppendLine(); } } CompAffectedByFacilities compAffectedByFacilities = req.Thing.TryGetComp <CompAffectedByFacilities>(); if (compAffectedByFacilities != null) { compAffectedByFacilities.GetStatsExplanation(this.stat, stringBuilder); } if (this.stat.statFactors != null) { stringBuilder.AppendLine("StatsReport_OtherStats".Translate()); for (int n = 0; n < this.stat.statFactors.Count; n++) { StatDef statDef = this.stat.statFactors[n]; stringBuilder.AppendLine(" " + statDef.LabelCap + ": x" + statDef.Worker.GetValue(req, true).ToStringPercent()); } stringBuilder.AppendLine(); } if (pawn != null) { if (pawn.skills != null) { if (this.stat.skillNeedFactors != null) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); for (int num = 0; num < this.stat.skillNeedFactors.Count; num++) { SkillNeed skillNeed2 = this.stat.skillNeedFactors[num]; int level3 = pawn.skills.GetSkill(skillNeed2.skill).Level; stringBuilder.AppendLine(string.Concat(new object[] { " ", skillNeed2.skill.LabelCap, " (", level3, "): x", skillNeed2.ValueFor(pawn).ToStringPercent() })); } stringBuilder.AppendLine(); } } else if (this.stat.noSkillFactor != 1f) { stringBuilder.AppendLine("StatsReport_Skills".Translate()); stringBuilder.AppendLine(" " + "default".Translate().CapitalizeFirst() + " : x" + this.stat.noSkillFactor.ToStringPercent()); stringBuilder.AppendLine(); } if (this.stat.capacityFactors != null) { stringBuilder.AppendLine((!"StatsReport_Health".CanTranslate()) ? "StatsReport_HealthFactors".Translate() : "StatsReport_Health".Translate()); if (this.stat.capacityFactors != null) { foreach (PawnCapacityFactor pawnCapacityFactor in from hfa in this.stat.capacityFactors orderby hfa.capacity.listOrder select hfa) { string text4 = pawnCapacityFactor.capacity.GetLabelFor(pawn).CapitalizeFirst(); float factor = pawnCapacityFactor.GetFactor(pawn.health.capacities.GetLevel(pawnCapacityFactor.capacity)); string text5 = factor.ToStringPercent(); string text6 = "HealthFactorPercentImpact".Translate(new object[] { pawnCapacityFactor.weight.ToStringPercent() }); if (pawnCapacityFactor.max < 999f) { text6 = text6 + ", " + "HealthFactorMaxImpact".Translate(new object[] { pawnCapacityFactor.max.ToStringPercent() }); } if (pawnCapacityFactor.allowedDefect != 0f) { text6 = text6 + ", " + "HealthFactorAllowedDefect".Translate(new object[] { (1f - pawnCapacityFactor.allowedDefect).ToStringPercent() }); } stringBuilder.AppendLine(string.Concat(new string[] { " ", text4, ": x", text5, " (", text6, ")" })); } } stringBuilder.AppendLine(); } if (pawn.Inspired) { float statOffsetFromList3 = pawn.InspirationDef.statOffsets.GetStatOffsetFromList(this.stat); if (statOffsetFromList3 != 0f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(new object[] { pawn.Inspiration.def.LabelCap }) + ": " + this.ValueToString(statOffsetFromList3, false, ToStringNumberSense.Offset)); stringBuilder.AppendLine(); } float statFactorFromList3 = pawn.InspirationDef.statFactors.GetStatFactorFromList(this.stat); if (statFactorFromList3 != 1f) { stringBuilder.AppendLine("StatsReport_Inspiration".Translate(new object[] { pawn.Inspiration.def.LabelCap }) + ": " + statFactorFromList3.ToStringByStyle(ToStringStyle.PercentZero, ToStringNumberSense.Factor)); stringBuilder.AppendLine(); } } } return(stringBuilder.ToString().TrimEndNewlines()); }
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest optionalReq) { return((optionalReq.Def as ThingDef)?.GetCompProperties <CompProperties_AmmoUser>().ammoSet.LabelCap); }
public string ValueToString(float val, ToStringNumberSense numberSense = ToStringNumberSense.Absolute) { return(this.Worker.ValueToString(val, true, numberSense)); }
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense) { return(Building_DoorExpanded.DoorOpenTimeExplanation(req, DoorPowerOn(req), stat)); }