示例#1
0
        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);
        }