public void Start(Hero hero, GameMode mode) { GameState = new CurrentGameState {Me = {HeroData = hero}, GameMode = mode}; var thread = new Thread(o => { MainBotLoop(); }); thread.Start(); }
public static bool UpdateHeroMounted(CurrentGameState state) { if (ShouldBringToFront) ControlInput.BringHeroesToFront(); Bitmap src; Bitmap sourceImage; Bitmap croppedImage; try { src = GrabScreenGDI(gameScreen); sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.Cropper.Rectangle = new Rectangle(0, 700, 70, 250); croppedImage = Tools.Cropper.Apply(sourceImage); var patternFinder = new ExhaustiveTemplateMatching(0.9f); var matches1 = patternFinder.ProcessImage(croppedImage, templateMounted); if (matches1.Length > 0) { state.Me.IsMounted = true; } state.Me.IsMounted = false; src.Dispose(); sourceImage.Dispose(); croppedImage.Dispose(); } catch (Exception e) { } finally { } return false; }
public static void UpdateMinimap(CurrentGameState state) { TickNow(); // if (heroPoints[0].Count == 0) return; var src = GrabScreenGDI(state.GameMode.MinimapRectangle); //var thresholded = ThresholdCropBitmap(src, new Rectangle(1450, 775, 450, 350), 200); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); src.Dispose(); Tools.ColorFilter.Red = new IntRange(180, 255); Tools.ColorFilter.Green = new IntRange(180, 255); Tools.ColorFilter.Blue = new IntRange(180, 255); Tools.ColorFilter.ApplyInPlace(sourceImage); var grayScale = Grayscale.CommonAlgorithms.BT709.Apply(sourceImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); var thresholded = Tools.GSToRgb.Apply(grayScale); var bc = new BlobCounter(); bc.ProcessImage(thresholded); var blobs = bc.GetObjectsInformation().ToList(); var debugPoints = new List<System.Drawing.Point>(); try { blobs = blobs.Where(o => o.Rectangle.Width > 3 && o.Rectangle.Width < 7 && o.Rectangle.Height > 3 && o.Rectangle.Height < 7).ToList(); Point? cam = null; Point[] cams = {new Point()}; for (var j = 0; j < blobs.Count; j++) { cam = FindCamera(blobs[j].CenterOfGravity, blobs); if (cam != null) { break; } } if (cam.HasValue) state.Me.HeroMinimapPosition = new System.Drawing.Point((int) (cam.Value.X + state.GameMode.MinimapRectangle.X), (int) (cam.Value.Y + state.GameMode.MinimapRectangle.Y)); } catch (Exception e) { } src.Dispose(); sourceImage.Dispose(); MainWindow.DebugReaderStats("Minimap:" + TickNow()); //DebugFountainShenaningans(state, debugPoints); }
// beta public static void UpdateHeroes(CurrentGameState state) { TickNow(); heroPoints[0].Clear(); heroPoints[1].Clear(); heroPoints[2].Clear(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(new Rectangle(0, 78, 1024, 550)); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); var grayScale = Grayscale.CommonAlgorithms.BT709.Apply(sourceImage); Tools.Thresholder.ThresholdValue = 128; Tools.Thresholder.ApplyInPlace(grayScale); var thresholded = Tools.GSToRgb.Apply(grayScale); var bc = new BlobCounter(); bc.ProcessImage(thresholded); var blobs = bc.GetObjectsInformation().ToList(); try { blobs = blobs.Where( o => o.Rectangle.Width > 80 && o.Rectangle.Width < 90 && o.Rectangle.Height < 20 && o.Rectangle.Height > 10).ToList(); var i = 0; Bitmap bitmap = null; foreach (var blob in blobs) { Tools.Cropper.Rectangle = new Rectangle(blob.Rectangle.X + 1, blob.Rectangle.Y + 3, blob.Rectangle.Width - 1, 4 ); var cropped = Tools.Cropper.Apply(src); var imstat = new ImageStatistics(cropped); //Console.WriteLine("R {0} G {1}", imstat.RedWithoutBlack.Median, imstat.GreenWithoutBlack.Median); if (Math.Abs(imstat.RedWithoutBlack.Median - imstat.GreenWithoutBlack.Median) < 4) { state.Me.HeroScreenPosition = new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 150); //state.Me.HeroHP = (float) (matches1.Length/120.0*100.0); heroPoints[0].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 150), 0)); } else if (imstat.RedWithoutBlack.Median > imstat.GreenWithoutBlack.Median) { heroPoints[1].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 150), 0)); } else { heroPoints[2].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 150), 0)); } } state.FriendlyHeroes = heroPoints[2].ToArray(); state.EnemyHeroes = heroPoints[1].ToArray(); } catch (Exception e) { } MainWindow.DebugReaderStats("Heroes:" + TickNow()); //DebugPlotVectorOnMap(state, null); }
public static void UpdateHeroHP(CurrentGameState state) { TickNow(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(new Rectangle(160, 695, 155, 1)); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.ColorFilter.Red = new IntRange(50, 255); Tools.ColorFilter.Green = new IntRange(50, 255); Tools.ColorFilter.Blue = new IntRange(0, 50); Tools.ColorFilter.ApplyInPlace(sourceImage); var grayScale = Grayscale.CommonAlgorithms.BT709.Apply(sourceImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); state.Me.HeroHP = Tools.FindHorizontalLineLength(grayScale)/145f*100f; src.Dispose(); MainWindow.DebugReaderStats("HeroHP:" + TickNow()); }
public static void UpdateEverythingOptimized(CurrentGameState state) { Bitmap src; Bitmap sourceImage; Bitmap croppedImage; Bitmap grayScale; Bitmap thresholded; ControlInput.SendKey(Keys.Space); ShouldBringToFront = false; while (true) { #region HPCheck try { ControlInput.BringHeroesToFront(); src = GrabScreenGDI(gameScreen); sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.Cropper.Rectangle = new Rectangle(200, 970, 265, 30); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.ColorFilter.Red = new IntRange(50, 255); Tools.ColorFilter.Green = new IntRange(50, 255); Tools.ColorFilter.Blue = new IntRange(0, 50); Tools.ColorFilter.ApplyInPlace(croppedImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); var bc = new BlobCounter(); bc.ProcessImage(thresholded); var blobs = bc.GetObjectsInformation().ToList(); state.Me.HeroHP = 0; try { blobs = blobs.Where(o => o.Rectangle.Width > 1 && o.Rectangle.Height > 5) .OrderBy(o => o.Rectangle.Width) .ToList(); var i = 0; foreach (var blob in blobs) { state.Me.HeroHP = (blob.Rectangle.Width/220f*100f); } } catch (Exception e) { } #endregion if (state.Me.HeroHP <= 0) break; #region UnitCheck var unitPoints = new List<System.Drawing.Point>(); try { if (ShouldBringToFront) ControlInput.BringHeroesToFront(); Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.HSLFiltering.Hue = new IntRange(0, 3); Tools.HSLFiltering.Saturation = new Range(0.8f, 1); Tools.HSLFiltering.Luminance = new Range(0, 0.4f); Tools.HSLFiltering.ApplyInPlace(croppedImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); Tools.HLengthSmoothing.MaxGapSize = 2; Tools.VLengthSmoothing.MaxGapSize = 2; Tools.HLengthSmoothing.ApplyInPlace(grayScale); Tools.VLengthSmoothing.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); bc.ProcessImage(thresholded); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 8 && o.Rectangle.Width < 50 && o.Rectangle.Height >= 2 && o.Rectangle.Height < 4) .ToList(); var i = 0; foreach (var blob in blobs) { unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X), (int) (100 + blob.CenterOfGravity.Y))); } } catch (Exception e) { } state.EnemyCreepsNearby = unitPoints.ToArray(); unitPoints.Clear(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); try { Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.HSLFiltering.Hue = new IntRange(113, 122); Tools.HSLFiltering.Saturation = new Range(0.8f, 1); Tools.HSLFiltering.Luminance = new Range(0, 0.4f); Tools.HSLFiltering.ApplyInPlace(croppedImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); Tools.HLengthSmoothing.MaxGapSize = 2; Tools.VLengthSmoothing.MaxGapSize = 2; Tools.HLengthSmoothing.ApplyInPlace(grayScale); Tools.VLengthSmoothing.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); bc = new BlobCounter(); bc.ProcessImage(thresholded); //thresholded.Save("./images/unitdebug.png"); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 8 && o.Rectangle.Width < 50 && o.Rectangle.Height >= 2 && o.Rectangle.Height < 4) .ToList(); var i = 0; foreach (var blob in blobs) { unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X - 12), (int) (100 + blob.CenterOfGravity.Y))); } } catch (Exception e) { } state.FriendlyCreepsNearby = unitPoints.ToArray(); #endregion #region TowerCheck unitPoints = new List<System.Drawing.Point>(); try { //TickNow("unitSearchStart", dt); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 540); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.HSLFiltering.Hue = new IntRange(36, 40); Tools.HSLFiltering.Saturation = new Range(0.3f, 0.5f); Tools.HSLFiltering.Luminance = new Range(0.3f, 0.55f); Tools.HSLFiltering.ApplyInPlace(croppedImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); Tools.HLengthSmoothing.MaxGapSize = 6; Tools.HLengthSmoothing.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); bc.ProcessImage(thresholded); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 20 && o.Rectangle.Width < 180 && o.Rectangle.Height > 6 && o.Rectangle.Height < 16) .ToList(); var i = 0; foreach (var blob in blobs) { var rc = new Rectangle(blob.Rectangle.X, blob.Rectangle.Y + 80, blob.Rectangle.Width, blob.Rectangle.Height + 20); Tools.Cropper.Rectangle = rc; var cut = Tools.Cropper.Apply(sourceImage); var res = Tools.TemplateMatcher.ProcessImage(cut, templateTower); foreach (var r in res) { unitPoints.Add(new System.Drawing.Point(rc.X - 12, 100 + rc.Y + 350)); } } } catch (Exception e) { } state.TowersFound = unitPoints.ToArray(); #endregion #region Hero Check heroPoints[0].Clear(); heroPoints[1].Clear(); try { heroPoints[2].Clear(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740); croppedImage = Tools.Cropper.Apply(sourceImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 128; Tools.Thresholder.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); Tools.TemplateMatcher.SimilarityThreshold = 0.9f; bc.ProcessImage(thresholded); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => o.Rectangle.Width > 115 && o.Rectangle.Width < 130 && o.Rectangle.Height < 20 && o.Rectangle.Height > 10).ToList(); var i = 0; foreach (var blob in blobs) { var rect = blob.Rectangle; rect.Offset(0, 100); Tools.Cropper.Rectangle = blob.Rectangle; var matches1 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage), templateMe); if (matches1.Length > 1) { state.Me.HeroScreenPosition = new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 250); //state.Me.HeroHP = (float) (matches1.Length/120.0*100.0); heroPoints[0].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 200), matches1.Length)); continue; } var matches2 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage), templateEnemy); if (matches2.Length > 1) { heroPoints[1].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 200), matches2.Length)); continue; } var matches3 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage), templateFriend); if (matches3.Length > 1) { heroPoints[2].Add( new OnScreenHero( new System.Drawing.Point((int) blob.CenterOfGravity.X, (int) blob.CenterOfGravity.Y + 200), matches3.Length)); } } state.FriendlyHeroes = heroPoints[2].ToArray(); state.EnemyHeroes = heroPoints[1].ToArray(); } catch (Exception e) { } #endregion #region UpdateMinimap var debugPoints = new List<System.Drawing.Point>(); try { Tools.Cropper.Rectangle = state.GameMode.MinimapRectangle; Tools.ColorFilter.Red = new IntRange(180, 255); Tools.ColorFilter.Green = new IntRange(180, 255); Tools.ColorFilter.Blue = new IntRange(180, 255); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.ColorFilter.ApplyInPlace(croppedImage); croppedImage.Save("./debug/hsl.png"); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage); Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); thresholded = Tools.GSToRgb.Apply(grayScale); bc.ProcessImage(thresholded); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where(o => o.Rectangle.Width > 4 && o.Rectangle.Width < 11 && o.Rectangle.Height > 4 && o.Rectangle.Height < 11).ToList(); Point? cam = null; Point[] cams = {new Point()}; for (var j = 0; j < blobs.Count; j++) { cam = FindCamera(blobs[j].CenterOfGravity, blobs); if (cam != null) { break; } } foreach (var c in cams) { debugPoints.Add(new System.Drawing.Point((int) c.X, (int) c.Y)); } if (cam.HasValue) state.Me.HeroMinimapPosition = new System.Drawing.Point( (int) (cam.Value.X + state.GameMode.MinimapRectangle.X), (int) (cam.Value.Y + state.GameMode.MinimapRectangle.Y)); } catch (Exception e) { } #endregion if (!state.IsPlayerSafe) break; #region Check Mounted if (ShouldBringToFront) ControlInput.BringHeroesToFront(); try { Tools.Cropper.Rectangle = new Rectangle(0, 700, 70, 250); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.TemplateMatcher.SimilarityThreshold = 0.9f; var matches1 = Tools.TemplateMatcher.ProcessImage(croppedImage, templateMounted); if (matches1.Length > 0) { state.Me.IsMounted = true; } state.Me.IsMounted = false; } catch (Exception e) { } #endregion #region Has talents? var canLevel = false; try { if (ShouldBringToFront) ControlInput.BringHeroesToFront(); Tools.Cropper.Rectangle = new Rectangle(70, 1020, 105, 30); croppedImage = Tools.Cropper.Apply(sourceImage); Tools.TemplateMatcher.SimilarityThreshold = 0.9f; var matches1 = Tools.TemplateMatcher.ProcessImage(croppedImage, templateHasTalents); if (matches1.Length > 0) { canLevel = true; } } catch (Exception e) { } state.Me.CanLevelTalents = canLevel; #endregion if (!state.Me.CanLevelTalents) break; #region Talent Scan /* try { Tools.Cropper.Rectangle = new Rectangle(48, 800, 390, 70); croppedImage = Tools.Cropper.Apply(sourceImage); state.Me.CharacterLevel = 1; var patternFinder = new ExhaustiveTemplateMatching(0.9f); var matches = patternFinder.ProcessImage(croppedImage, templateTalents4); if (matches.Length == 1) { state.Me.CharacterLevel = 4; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents7); if (matches.Length == 1) { state.Me.CharacterLevel = 7; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents10); if (matches.Length == 1) { state.Me.CharacterLevel = 10; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents13); if (matches.Length == 1) { state.Me.CharacterLevel = 13; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents16); if (matches.Length == 1) { state.Me.CharacterLevel = 16; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents20); if (matches.Length == 1) { state.Me.CharacterLevel = 20; } } catch (Exception e) { } */ #endregion } catch (Exception e) { } break; } #region Dispose EVERYTHING #endregion }
public static void UpdateHasTalents(CurrentGameState state) { if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(gameScreen); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.Cropper.Rectangle = new Rectangle(70, 1020, 105, 30); var croppedImage = Tools.Cropper.Apply(sourceImage); var patternFinder = new ExhaustiveTemplateMatching(0.9f); var canLevel = false; try { var matches1 = patternFinder.ProcessImage(croppedImage, templateHasTalents); if (matches1.Length > 0) { canLevel = true; } } catch (Exception e) { } state.Me.CanLevelTalents = canLevel; }
public static void UpdateCurrentTalentLevel(CurrentGameState state) { /* if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(gameScreen); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.Cropper.Rectangle = new Rectangle(48, 800, 390, 70); var croppedImage = Tools.Cropper.Apply(sourceImage); state.Me.CharacterLevel = 1; var patternFinder = new ExhaustiveTemplateMatching(0.9f); try { var matches = patternFinder.ProcessImage(croppedImage, templateTalents4); if (matches.Length == 1) { state.Me.CharacterLevel = 4; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents7); if (matches.Length == 1) { state.Me.CharacterLevel = 7; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents10); if (matches.Length == 1) { state.Me.CharacterLevel = 10; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents13); if (matches.Length == 1) { state.Me.CharacterLevel = 13; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents16); if (matches.Length == 1) { state.Me.CharacterLevel = 16; return; } matches = patternFinder.ProcessImage(croppedImage, templateTalents20); if (matches.Length == 1) { state.Me.CharacterLevel = 20; } } catch (Exception e) { } } public static void UpdateCamps(CurrentGameState state) { var src = GrabScreenGDI(gameScreen); //var thresholded = ThresholdCropBitmap(src, new Rectangle(1450, 775, 450, 350), 200); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); src.Dispose(); Tools.Cropper.Rectangle = state.GameMode.MinimapRectangle; Tools.HSLFiltering.Hue = new IntRange(30, 63); Tools.HSLFiltering.Luminance = new Range(0, 1); Tools.HSLFiltering.Saturation = new Range(0.9f, 1); var croppedImage = Tools.Cropper.Apply(sourceImage); Tools.HSLFiltering.ApplyInPlace(croppedImage); try { var matches = Tools.TemplateMatcher.ProcessImage(croppedImage, templateCampSmall); var bigmatches = Tools.TemplateMatcher.ProcessImage(croppedImage, templateCampBig); if (matches.Length > 0) { } } catch (Exception e) { } * */ }
public static void DetectSide(CurrentGameState state) { while (state.CurrentSide == CurrentGameState.FriendlySide.Undecided) { if (FindOnScreen("./images/ingame_blackheart_red_crown.png", 0.91f, false, new Rectangle(730, 540, 150, 300)) != null) { state.CurrentSide = CurrentGameState.FriendlySide.Right; } else if (FindOnScreen("./images/ingame_blackheart_red_crown.png", 0.91f, false, new Rectangle(880, 540, 150, 300)) != null) { state.CurrentSide = CurrentGameState.FriendlySide.Left; } } }
public static void DebugPlotVectorOnMap(CurrentGameState state, System.Drawing.Point[] points = null) { if (state.FriendlyHeroes == null) return; var src = GrabScreenGDI(gameScreen); //var thresholded = ThresholdCropBitmap(src, new Rectangle(1450, 775, 450, 350), 200); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); src.Dispose(); var gc = Graphics.FromImage(sourceImage); var greenBrush = new SolidBrush(Color.Lime); var redBrush = new SolidBrush(Color.Red); var font = new Font(SystemFonts.DefaultFont.FontFamily, 50); foreach (var point in state.TowersFound) { gc.DrawString("T", font, redBrush, point.X, point.Y); } foreach (var point in state.EnemyHeroes) { gc.DrawString("H", font, redBrush, point.Position.X, point.Position.Y); } foreach (var point in state.FriendlyHeroes) gc.DrawString("H", font, greenBrush, point.Position.X, point.Position.Y); foreach (var point in state.EnemyCreepsNearby) gc.DrawString("C", font, redBrush, point.X, point.Y); foreach (var point in state.FriendlyCreepsNearby) gc.DrawString("C", font, greenBrush, point.X, point.Y); try { var pp = new System.Drawing.Point(); foreach (var p in points) { gc.DrawEllipse(new Pen(Color.Magenta), p.X - 4, p.Y - 4, 8, 8); if (!pp.IsEmpty) gc.DrawLine(new Pen(Color.Lime), pp, p); pp = p; } } catch (Exception e) { } gc.Dispose(); sourceImage.Save("./debug/ss.png"); sourceImage.Dispose(); }
public static void UpdateUnits(CurrentGameState state) { TickNow(); var unitPoints = new List<System.Drawing.Point>(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(new Rectangle(0, 100, 1024, 400)); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); if (false) { Tools.HSLFiltering.Hue = new IntRange(358, 5); Tools.HSLFiltering.Saturation = new Range(0.3f, 1); Tools.HSLFiltering.Luminance = new Range(0, 0.4f); Tools.HSLFiltering.ApplyInPlace(sourceImage); } Tools.ColorFilter.Red = new IntRange(140, 180); Tools.ColorFilter.Green = new IntRange(0, 50); Tools.ColorFilter.Blue = new IntRange(0, 50); Tools.ColorFilter.ApplyInPlace(sourceImage); var grayScale = Grayscale.CommonAlgorithms.BT709.Apply(sourceImage); /*Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); Tools.HLengthSmoothing.MaxGapSize = 2; Tools.VLengthSmoothing.MaxGapSize = 2; Tools.HLengthSmoothing.ApplyInPlace(grayScale); Tools.VLengthSmoothing.ApplyInPlace(grayScale);*/ var thresholded = Tools.GSToRgb.Apply(grayScale); var bc = new BlobCounter(); bc.ProcessImage(thresholded); var blobs = bc.GetObjectsInformation().ToList(); var gc = Graphics.FromImage(sourceImage); try { blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 4 && o.Rectangle.Width < 35 && o.Rectangle.Height == 1).ToList(); var i = 0; foreach (var blob in blobs) { unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X), (int) (100 + blob.CenterOfGravity.Y))); //gc.DrawEllipse(new Pen(Color.White), blob.Rectangle.X - 4, blob.Rectangle.Y - 4, 8, 8 ); } } catch (Exception e) { } //gc.Flush(); state.EnemyCreepsNearby = unitPoints.ToArray(); //sourceImage.Save("./debug/go.png"); unitPoints.Clear(); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); try { sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); if (false) { Tools.HSLFiltering.Hue = new IntRange(112, 128); Tools.HSLFiltering.Saturation = new Range(0.8f, 1); Tools.HSLFiltering.Luminance = new Range(0, 0.4f); Tools.HSLFiltering.ApplyInPlace(sourceImage); } Tools.ColorFilter.Red = new IntRange(0, 50); Tools.ColorFilter.Green = new IntRange(120, 160); Tools.ColorFilter.Blue = new IntRange(0, 50); Tools.ColorFilter.ApplyInPlace(sourceImage); grayScale = Grayscale.CommonAlgorithms.BT709.Apply(sourceImage); /*Tools.Thresholder.ThresholdValue = 1; Tools.Thresholder.ApplyInPlace(grayScale); Tools.HLengthSmoothing.MaxGapSize = 2; Tools.VLengthSmoothing.MaxGapSize = 2; Tools.HLengthSmoothing.ApplyInPlace(grayScale); Tools.VLengthSmoothing.ApplyInPlace(grayScale);*/ thresholded = Tools.GSToRgb.Apply(grayScale); bc = new BlobCounter(); bc.ProcessImage(thresholded); //thresholded.Save("./images/unitdebug.png"); blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 4 && o.Rectangle.Width < 35 && o.Rectangle.Height >= 2 && o.Rectangle.Height < 4).ToList(); var i = 0; foreach (var blob in blobs) { unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X - 12), (int) (100 + blob.CenterOfGravity.Y))); } } catch (Exception e) { } state.FriendlyCreepsNearby = unitPoints.ToArray(); MainWindow.DebugReaderStats("Units:" + TickNow()); }
public static void UpdateTowers(CurrentGameState state) { TickNow(); var unitPoints = new List<System.Drawing.Point>(); try { //TickNow("unitSearchStart", dt); if (ShouldBringToFront) ControlInput.BringHeroesToFront(); var src = GrabScreenGDI(new Rectangle(0, 100, 1024, 450)); var sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb); Tools.ColorFilter.Red = new IntRange(100, 255); Tools.ColorFilter.Green = new IntRange(0, 10); Tools.ColorFilter.Blue = new IntRange(0, 10); var filtered = Tools.ColorFilter.Apply(sourceImage); var grayScale = Grayscale.CommonAlgorithms.BT709.Apply(filtered); var bc = new BlobCounter(); bc.ProcessImage(filtered); var blobs = bc.GetObjectsInformation().ToList(); blobs = blobs.Where( o => !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) && o.Rectangle.Width > 10 && o.Rectangle.Width < 100 && o.Rectangle.Height >= 3 && o.Rectangle.Height <= 5).ToList(); var i = 0; var gc = Graphics.FromImage(sourceImage); foreach (var blob in blobs) { var rc = new Rectangle(blob.Rectangle.X, blob.Rectangle.Y, 100, 20); Tools.Cropper.Rectangle = rc; var cut = Tools.Cropper.Apply(sourceImage); var res = Tools.TemplateMatcher.ProcessImage(cut, templateTower); foreach (var r in res) { gc.DrawRectangle(new Pen(Color.Magenta), rc.X, rc.Y, 100, 20); unitPoints.Add(new System.Drawing.Point(rc.X - 12, 100 + rc.Y + 350)); } } sourceImage.Save("./debug/towaz.png"); } catch (Exception e) { } state.TowersFound = unitPoints.ToArray(); if (state.TowersFound.Length > 0) Console.WriteLine("TOWERS " + state.TowersFound.Length); MainWindow.DebugReaderStats("Towers:" + TickNow()); }