private void SetLightModifier(LightModifiersBase modifier, float?zeroVal, float?fullVal) { if (zeroVal.HasValue) { modifier.Offsets[0] = SettingsHelpers.MultiPercentToMod(zeroVal.Value, true); } if (fullVal.HasValue) { modifier.Offsets[1] = SettingsHelpers.MultiPercentToMod(fullVal.Value, false); } }
public LightModifiersBase( bool isPhotosensitiveLm, bool isNightVisionLm ) { if (isPhotosensitiveLm) { PSLightModifiers = this; } else if (isNightVisionLm) { NVLightModifiers = this; } }
/// <summary> /// For the pawn's stat inspect tab. Cleaned up a bit, still about as elegant as a panda doing the can-can /// </summary> /// <param name="glow"></param> /// <param name="usedApparelSetting">if apparel had an effect</param> /// <param name="comp"></param> /// <param name="needsFinalValue">if final value is added externally or we need to add it</param> /// <returns></returns> private static string BasicExplanation(float glow, out bool usedApparelSetting, Comp_NightVision comp, bool needsFinalValue = false) { var nvsum = 0f; var pssum = 0f; var sum = 0f; float[] caps = LightModifiersBase.GetCapsAtGlow(glow: glow); var foundSomething = false; float effect; var basevalue = 0f; bool lowLight = glow.GlowIsDarkness(); usedApparelSetting = false; var explanation = new StringBuilder(); StringBuilder nvexplanation = new StringBuilder().AppendFormat( format: Str.ExpIntro, "", Str.MaxAtGlow(glow: glow), caps[2], Str.NightVision ).AppendLine(); StringBuilder psexplanation = new StringBuilder().AppendFormat( format: Str.ExpIntro, "", Str.MaxAtGlow(glow: glow), caps[3], Str.Photosens ).AppendLine(); explanation.AppendLine(); if (lowLight) { basevalue = Constants.DEFAULT_FULL_LIGHT_MULTIPLIER + (Constants.DEFAULT_ZERO_LIGHT_MULTIPLIER - Constants.DEFAULT_FULL_LIGHT_MULTIPLIER) * (0.3f - glow) / 0.3f; if (comp.ApparelGrantsNV) { foundSomething = true; } } else { basevalue = Constants.DEFAULT_FULL_LIGHT_MULTIPLIER; if (glow.GlowIsBright() && comp.ApparelNullsPS) { foundSomething = true; } } explanation.AppendFormat(format: " " + Str.MultiplierLine, arg0: "StatsReport_BaseValue".Translate(), arg1: basevalue).AppendLine() .AppendLine(); string StringToAppend; if (comp.NaturalLightModifiers.HasAnyModifier() && comp.NumberOfRemainingEyes > 0) { effect = comp.NaturalLightModifiers.GetEffectAtGlow(glow: glow); if (effect.IsNonTrivial()) { foundSomething = true; var NumToAdd = (float)Math.Round( value: effect * comp.NumberOfRemainingEyes, digits: Constants.NUMBER_OF_DIGITS, mode: Constants.ROUNDING ); StringToAppend = string.Format( format: " " + Str.ModifierLine, arg0: $"{comp.ParentPawn.def.LabelCap} {comp.RaceSightParts.First().LabelShort} x{comp.NumberOfRemainingEyes}", arg1: effect * comp.NumberOfRemainingEyes ); switch (comp.NaturalLightModifiers.Setting) { case VisionType.NVNightVision: nvsum += NumToAdd; nvexplanation.AppendLine(value: StringToAppend); break; case VisionType.NVPhotosensitivity: pssum += NumToAdd; psexplanation.AppendLine(value: StringToAppend); break; case VisionType.NVCustom: sum += NumToAdd; explanation.AppendLine(value: StringToAppend); break; } } } foreach (List <HediffDef> value in comp.PawnsNVHediffs.Values) { if (value.NullOrEmpty()) { continue; } var hediffLightMods = Settings.Store.HediffLightMods; foreach (HediffDef hediffDef in value) { if (hediffLightMods.TryGetValue(key: hediffDef, value: out Hediff_LightModifiers hediffSetting)) { effect = hediffSetting.GetEffectAtGlow(glow: glow, numOfEyesNormalisedFor: comp.EyeCount); if (effect.IsNonTrivial()) { foundSomething = true; effect = (float)Math.Round( value: effect, digits: Constants.NUMBER_OF_DIGITS, mode: Constants.ROUNDING ); StringToAppend = string.Format(format: " " + Str.ModifierLine, arg0: hediffDef.LabelCap, arg1: effect); switch (hediffSetting.IntSetting) { case VisionType.NVNightVision: nvsum += effect; nvexplanation.AppendLine(value: StringToAppend); break; case VisionType.NVPhotosensitivity: pssum += effect; psexplanation.AppendLine(value: StringToAppend); break; case VisionType.NVCustom: sum += effect; explanation.AppendLine(value: StringToAppend); break; } } } } } void AppendPreSumIfNeeded(ref bool needed) { if (!needed) { return; } explanation.AppendFormat( format: Str.MultiplierLine, arg0: "NVTotal".Translate() + " " + "NVMultiplier".Translate(), arg1: sum + basevalue ); explanation.AppendLine(); needed = false; } if (foundSomething) { if (nvsum.IsNonTrivial()) { explanation.Append(value: nvexplanation); explanation.AppendLine(); } if (pssum.IsNonTrivial()) { explanation.Append(value: psexplanation); explanation.AppendLine(); } sum += pssum + nvsum; explanation.AppendFormat(format: Str.ModifierLine, arg0: "NVTotal".Translate() + " " + "NVModifier".Translate(), arg1: sum); explanation.AppendLine(); var needed = true; if (!comp.CanCheat) { if (sum - Constants.NV_EPSILON > caps[0] || sum + Constants.NV_EPSILON < caps[1]) { AppendPreSumIfNeeded(needed: ref needed); explanation.AppendFormat( format: Str.Maxline, arg0: "NVTotal".Translate() + " ", arg1: "max".Translate(), arg2: sum > caps[0] ? caps[0] : caps[1] ); explanation.AppendLine(); } if (lowLight && comp.ApparelGrantsNV && sum + Constants.NV_EPSILON < caps[2]) { AppendPreSumIfNeeded(needed: ref needed); explanation.Append(value: "NVGearPresent".Translate(arg1: $"{basevalue + caps[2]:0%}")); usedApparelSetting = true; sum = caps[2]; } else if (comp.ApparelNullsPS && sum + Constants.NV_EPSILON < 0) { AppendPreSumIfNeeded(needed: ref needed); explanation.Append(value: "PSGearPresent".Translate(arg1: $"{Constants.DEFAULT_FULL_LIGHT_MULTIPLIER:0%}")); usedApparelSetting = true; sum = 0; } } explanation.AppendLine(); if (needsFinalValue) { sum += basevalue; explanation.AppendFormat( format: Str.MultiplierLine, arg0: "NVStatReport_FinalMulti".Translate(), arg1: sum > caps[0] + basevalue ? caps[0] + basevalue : sum < caps[1] + basevalue ? caps[1] + basevalue : sum ); } return(explanation.ToString()); } //Fallback if (needsFinalValue) { return(comp.FactorFromGlow(glow: glow).ToStringPercent()); } return(string.Empty); }