// 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); }
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); }
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); }
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)); }
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); }