private static SensorScanType CalculateSensorInfoLevel(AbstractActor source, ICombatant target) { Mod.Log.Trace?.Write($"Calculating SensorInfo from source: ({CombatantUtils.Label(source)}) to target: ({CombatantUtils.Label(target)})"); if (source.StatCollection.ContainsStatistic(ModStats.DisableSensors)) { return(SensorScanType.NoInfo); } // Determine modified check against target EWState sourceState = source.GetEWState(); int positiveMods = 0; int negativeMods = 0; int ecmNegativeMods = 0; positiveMods += sourceState.GetCurrentEWCheck(); Mod.Log.Trace?.Write($" == detailsLevel from EW check = {positiveMods}"); // --- Source: Advanced Sensors if (sourceState.AdvancedSensorsMod() > 0) { Mod.Log.Trace?.Write($" == source has advanced sensors, detailsLevel = {positiveMods} + {sourceState.AdvancedSensorsMod()}"); positiveMods += sourceState.AdvancedSensorsMod(); } // --- Source: ECM Jamming if (sourceState.GetRawECMJammed() > 0) { Mod.Log.Trace?.Write($" == source is jammed by ECM, detailsLevel = {ecmNegativeMods} - {sourceState.GetRawECMJammed()}"); ecmNegativeMods -= sourceState.GetRawECMJammed(); } // --- Target: Stealth, Narc, Tag AbstractActor targetActor = target as AbstractActor; if (targetActor != null) { EWState targetState = targetActor.GetEWState(); // ECM Shield reduces sensor info if (targetState.ECMDetailsMod(sourceState) > 0) { Mod.Log.Trace?.Write($" == target is shielded by ECM, detailsLevel = {ecmNegativeMods} - {targetState.ECMDetailsMod(sourceState)}"); ecmNegativeMods -= targetState.ECMDetailsMod(sourceState); } // Stealth reduces sensor info if (targetState.HasStealth()) { Mod.Log.Trace?.Write($" == target has stealth, detailsLevel = {negativeMods} - {targetState.StealthDetailsMod()}"); negativeMods -= targetState.StealthDetailsMod(); } // A Narc effect increases sensor info // TODO: Narc should effect buildings if (targetState.IsNarced(sourceState)) { Mod.Log.Trace?.Write($" == target is NARC'd, detailsLevel = {positiveMods} + {targetState.NarcDetailsMod(sourceState)}"); positiveMods += targetState.NarcDetailsMod(sourceState); } // A TAG effect increases sensor info // TODO: TAG should effect buildings if (targetState.IsTagged(sourceState)) { Mod.Log.Trace?.Write($" == target is tagged, detailsLevel = {positiveMods} + {targetState.TagDetailsMod(sourceState)}"); positiveMods += targetState.TagDetailsMod(sourceState); } // Active Probe ping acts as sensors boost as well if (targetState.PingedByProbeMod() != 0) { Mod.Log.Trace?.Write($" == target is pinged by probe, detailsLevel = {positiveMods} + {targetState.PingedByProbeMod()}"); positiveMods += targetState.PingedByProbeMod(); } } if (ecmNegativeMods < Mod.Config.Sensors.MaxECMDetailsPenalty) { Mod.Log.Trace?.Write($" == negatives exceed cap, setting negative penalty to Sensors.MaxECMDetailsPenalty: {Mod.Config.Sensors.MaxECMDetailsPenalty }"); ecmNegativeMods = Mod.Config.Sensors.MaxECMDetailsPenalty; } int detailLevel = positiveMods + negativeMods + ecmNegativeMods; Mod.Log.Trace?.Write($" == detailsTotal: {detailLevel} = positiveMods: {positiveMods} + negativeMods: {negativeMods}"); SensorScanType sensorInfo = SensorScanTypeHelper.DetectionLevelForCheck(detailLevel); Mod.Log.Trace?.Write($" == Calculated sensorInfo as: ({sensorInfo})"); return(sensorInfo); }
private static string BuildToolTip(AbstractActor actor) { //Mod.Log.Debug?.Write($"EW State for actor:{CombatantUtils.Label(actor)} = {ewState}"); List <string> details = new List <string>(); // Visuals check float visualLockRange = VisualLockHelper.GetVisualLockRange(actor); float visualScanRange = VisualLockHelper.GetVisualScanRange(actor); details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_VISUALS], new object[] { visualLockRange, visualScanRange, ModState.GetMapConfig().UILabel() }) .ToString() ); // Sensors check EWState ewState = new EWState(actor); int totalDetails = ewState.GetCurrentEWCheck() + ewState.AdvancedSensorsMod(); SensorScanType checkLevel = SensorScanTypeHelper.DetectionLevelForCheck(totalDetails); float rawRangeMulti = SensorLockHelper.GetAllSensorRangeMultipliers(actor); float rangeMulti = rawRangeMulti + ewState.GetSensorsRangeMulti(); float sensorsRange = SensorLockHelper.GetSensorsRange(actor); string sensorColor = ewState.GetCurrentEWCheck() >= 0 ? "00FF00" : "FF0000"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_SENSORS], new object[] { sensorColor, sensorsRange, sensorColor, rangeMulti, checkLevel.Label() }) .ToString() ); // Details //{ LT_PANEL_DETAILS, " Total: <color=#{0}>{1:+0;-#}</color><size=90%> Roll: <color=#{2}>{3:+0;-#}</color> Tactics: <color=#00FF00>{4:+0;-#}</color> AdvSen: <color=#{5}>{6:+0;-#}</color>\n" string totalColor = totalDetails >= 0 ? "00FF00" : "FF0000"; string checkColor = ewState.GetRawCheck() >= 0 ? "00FF00" : "FF0000"; string advSenColor = ewState.AdvancedSensorsMod() >= 0 ? "00FF00" : "FF0000"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_DETAILS], new object[] { totalColor, totalDetails, checkColor, ewState.GetRawCheck(), ewState.GetRawTactics(), advSenColor, ewState.AdvancedSensorsMod() }) .ToString() ); // Heat Vision if (ewState.GetRawHeatVision() != null) { // { LT_PANEL_HEAT, "<b>Thermals</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color> / {2} heat Range:{3}m\n" }, HeatVision heatVis = ewState.GetRawHeatVision(); // Positive is bad, negative is good string modColor = heatVis.AttackMod >= 0 ? "FF0000" : "00FF00"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_HEAT], new object[] { modColor, heatVis.AttackMod, heatVis.HeatDivisor, heatVis.MaximumRange }) .ToString() ); } // Zoom Vision if (ewState.GetRawZoomVision() != null) { // { LT_PANEL_ZOOM, "<b>Zoom</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color? Cap:<color=#{2}>{3:+0;-#}</color> Range:{4}m\n" }, ZoomVision zoomVis = ewState.GetRawZoomVision(); // Positive is bad, negative is good string modColor = zoomVis.AttackMod >= 0 ? "FF0000" : "00FF00"; string capColor = zoomVis.AttackCap >= 0 ? "FF0000" : "00FF00"; details.Add( new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_ZOOM], new object[] { modColor, zoomVis.AttackMod, capColor, zoomVis.AttackCap, zoomVis.MaximumRange }) .ToString() ); } string tooltipText = String.Join("", details.ToArray()); return(tooltipText); }