Example #1
0
        // WARNING: DUPLICATE OF HBS CODE. THIS IS LIKELY TO BREAK IF HBS CHANGES THE SOURCE FUNCTIONS
        public static float GetAdjustedSpotterRange(AbstractActor source, ICombatant target)
        {
            float         targetVisibility = 1f;
            AbstractActor targetActor      = target as AbstractActor;

            if (targetActor != null)
            {
                EWState sourceState = source.GetEWState();
                targetVisibility = VisualLockHelper.GetTargetVisibility(targetActor, sourceState);
            }

            float spotterRange = VisualLockHelper.GetSpotterRange(source);

            float modifiedRange = spotterRange * targetVisibility;

            if (modifiedRange < Mod.Config.Vision.MinimumVisionRange())
            {
                modifiedRange = Mod.Config.Vision.MinimumVisionRange();
            }

            // Round up to the nearest full hex
            float normalizedRange = HexUtils.CountHexes(modifiedRange, true) * 30f;

            Mod.Log.Trace?.Write($" -- source:{CombatantUtils.Label(source)} adjusted spotterRange:{normalizedRange}m normalized from:{modifiedRange}m");
            return(normalizedRange);
        }
Example #2
0
        private static float GetVisualRange(float visionRange, AbstractActor source)
        {
            float visualRange;

            if (source.IsShutDown)
            {
                visualRange = visionRange * source.Combat.Constants.Visibility.ShutdownSpottingDistanceMultiplier;
            }
            else if (source.IsProne)
            {
                visualRange = visionRange * source.Combat.Constants.Visibility.ProneSpottingDistanceMultiplier;
            }
            else
            {
                float multipliers = VisualLockHelper.GetAllSpotterMultipliers(source);
                float absolutes   = VisualLockHelper.GetAllSpotterAbsolutes(source);

                visualRange = visionRange * multipliers + absolutes;
                //Mod.Log.Trace?.Write($" -- source:{CombatantUtils.Label(source)} has spotting " +
                //    $"multi:x{multipliers} absolutes:{absolutes} visionRange:{visionRange}");
            }

            if (visualRange < Mod.Config.Vision.MinimumVisionRange())
            {
                visualRange = Mod.Config.Vision.MinimumVisionRange();
            }

            // Round up to the nearest full hex
            float normalizedRange = HexUtils.CountHexes(visualRange, false) * 30f;

            //LowVisibility.Logger.Trace($" -- source:{CombatantUtils.Label(source)} visual range is:{normalizedRange}m normalized from:{visualRange}m");
            return(normalizedRange);
        }
Example #3
0
        public void DivVsIter()
        {
            List <float> ranges   = RangesInMeters();
            List <int>   divHexes = new List <int>();
            // Division
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();
            foreach (float range in ranges)
            {
                divHexes.Add(RangeToHexByDiv(range));
            }

            stopWatch.Stop();
            long divTime = stopWatch.ElapsedMilliseconds;

            Console.WriteLine($"Division time was:{divTime}ms");

            // Iteration
            List <int> iterHexes = new List <int>();

            stopWatch.Reset();
            stopWatch.Start();
            foreach (float range in ranges)
            {
                iterHexes.Add(HexUtils.CountHexes(range));
            }

            stopWatch.Stop();
            long iterTime = stopWatch.ElapsedMilliseconds;

            Console.WriteLine($"Iteration time was:{iterTime}ms");

            float[] rangeArr  = ranges.ToArray();
            int[]   divArray  = divHexes.ToArray();
            int[]   iterArray = iterHexes.ToArray();
            Console.WriteLine($"Testing array lengths");
            Assert.AreEqual(divArray.Length, iterArray.Length);

            Console.WriteLine($"Testing array values");
            for (int i = 0; i < divArray.Length; i++)
            {
                Console.WriteLine($"range:{rangeArr[i]} div:{divArray[i]} iter:{iterArray[i]}");
                Assert.AreEqual(divArray[i], iterArray[i]);
            }

            //Console.WriteLine($"Testing execution time");
            //Assert.AreEqual(divTime, iterTime);
        }
Example #4
0
        public void HexCounter()
        {
            Assert.AreEqual(0, HexUtils.CountHexes(0f, true));
            Assert.AreEqual(0, HexUtils.CountHexes(0f, false));

            Assert.AreEqual(1, HexUtils.CountHexes(1f, true));
            Assert.AreEqual(0, HexUtils.CountHexes(1f, false));

            Assert.AreEqual(1, HexUtils.CountHexes(29f, true));
            Assert.AreEqual(0, HexUtils.CountHexes(29f, false));

            Assert.AreEqual(1, HexUtils.CountHexes(30f, true));
            Assert.AreEqual(1, HexUtils.CountHexes(30f, false));

            Assert.AreEqual(2, HexUtils.CountHexes(31f, true));
            Assert.AreEqual(1, HexUtils.CountHexes(31f, false));
        }
Example #5
0
        public static MapConfig ParseCurrentMap()
        {
            Mod.Log.Info?.Write("MH:PCM Parsing current map.");

            MoodController moodController = ModState.GetMoodController();

            MoodSettings moodSettings = moodController?.CurrentMood;
            TagSet       moodTags     = moodSettings?.moodTags;

            if (moodTags == null || moodTags.IsEmpty)
            {
                return(new MapConfig {
                    spotterRange = Mod.Config.Vision.BaseRangeBright,
                    visualIDRange = Mod.Config.Vision.ScanRangeHexes
                });
            }

            Mod.Log.Debug?.Write($"  - Parsing current map for mod config");
            MapConfig mapConfig = new MapConfig();

            String allTags = String.Join(", ", moodTags.ToArray());

            Mod.Log.Debug?.Write($"  - All mood tags are: {allTags}");

            float baseVision  = Mod.Config.Vision.BaseRangeBright;
            float visionMulti = 1.0f;

            foreach (string tag in moodTags)
            {
                switch (tag)
                {
                case "mood_timeMorning":
                case "mood_timeNoon":
                case "mood_timeAfternoon":
                case "mood_timeDay":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    mapConfig.isDay  = true;
                    mapConfig.isDim  = false;
                    mapConfig.isDark = false;
                    break;

                case "mood_timeSunrise":
                case "mood_timeSunset":
                case "mood_timeTwilight":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (baseVision > Mod.Config.Vision.BaseRangeDim)
                    {
                        baseVision       = Mod.Config.Vision.BaseRangeDim;
                        mapConfig.isDay  = false;
                        mapConfig.isDim  = true;
                        mapConfig.isDark = false;
                    }
                    break;

                case "mood_timeNight":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (baseVision > Mod.Config.Vision.BaseRangeDark)
                    {
                        baseVision       = Mod.Config.Vision.BaseRangeDark;
                        mapConfig.isDay  = false;
                        mapConfig.isDim  = false;
                        mapConfig.isDark = true;
                    }
                    break;

                case "mood_weatherRain":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (visionMulti > Mod.Config.Vision.RangeMultiRainSnow)
                    {
                        visionMulti       = Mod.Config.Vision.RangeMultiRainSnow;
                        mapConfig.hasRain = true;
                    }
                    break;

                case "mood_weatherSnow":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (visionMulti > Mod.Config.Vision.RangeMultiRainSnow)
                    {
                        visionMulti       = Mod.Config.Vision.RangeMultiRainSnow;
                        mapConfig.hasSnow = true;
                    }
                    break;

                case "mood_fogLight":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (visionMulti > Mod.Config.Vision.RangeMultiLightFog)
                    {
                        visionMulti           = Mod.Config.Vision.RangeMultiLightFog;
                        mapConfig.hasLightFog = true;
                    }
                    break;

                case "mood_fogHeavy":
                    Mod.Log.Debug?.Write($"  - {tag}");
                    if (visionMulti > Mod.Config.Vision.RangeMultiHeavyFog)
                    {
                        visionMulti           = Mod.Config.Vision.RangeMultiHeavyFog;
                        mapConfig.hasHeavyFog = true;
                    }
                    break;

                default:
                    break;
                }
            }

            // Calculate normal vision range
            float visRange = (float)Math.Ceiling(baseVision * 30f * visionMulti);

            Mod.Log.Info?.Write($"  Calculating vision range as Math.Ceil(baseVision:{baseVision} * 30.0 * visionMulti:{visionMulti}) = visRange:{visRange}.");
            if (visRange < Mod.Config.Vision.MinimumVisionRange())
            {
                visRange = Mod.Config.Vision.MinimumVisionRange();
            }

            float roundedVisRange = HexUtils.CountHexes(visRange, false) * 30f;

            Mod.Log.Info?.Write($"MapHelper: Vision range for map will be ==> {roundedVisRange}m (normalized from {visRange}m)");
            mapConfig.spotterRange  = roundedVisRange;
            mapConfig.visualIDRange = Math.Min(roundedVisRange, Mod.Config.Vision.ScanRangeHexes * 30.0f);

            Mod.Log.Info?.Write($"Map vision range = visual:{roundedVisRange} / visualScan:{mapConfig.visualIDRange}");

            // Calculate night vision range
            if (mapConfig.isDark)
            {
                float nightVisRange = (float)Math.Ceiling(Mod.Config.Vision.BaseRangeBright * 30f * visionMulti);
                if (nightVisRange < Mod.Config.Vision.MinimumVisionRange())
                {
                    nightVisRange = Mod.Config.Vision.MinimumVisionRange();
                }

                float roundedNightVisRange = HexUtils.CountHexes(nightVisRange, false) * 30f;
                Mod.Log.Info?.Write($"MapHelper: Night vision range for map will be ==> {roundedNightVisRange}m (normalized from {nightVisRange}m)");
                mapConfig.nightVisionSpotterRange  = roundedNightVisRange;
                mapConfig.nightVisionVisualIDRange = Math.Min(roundedNightVisRange, Mod.Config.Vision.ScanRangeHexes * 30.0f);
            }

            return(mapConfig);
        }