abstract sclass DynVisualBot > DynPrintLogAndEnabled { transient Map protos = syncCIMap(); ISegmenter segmenter; transient autoDispose new ScreenShooter shooter; transient ReliableSingleThread rstSegment = dm_rst(module(), r segment); transient ReliableSingleThread rstAOA = dm_rst(module(), r aoa); transient ImageInfo info, latestWithAOA; transient ImageSurface isThings; transient double requiredImageSimilarity = 95; sclass Segment extends BWImageAndRect { *() {} *(Rect r) { super(r); } } sclass ImageInfo extends ImageWithProtos {} visual jvsplit( jCenteredSection("Things found on screen", jscroll_center(isThings = jDoubleBufferedImageSurface())), super); start-thread { dm_watchFieldAndNow enabled(r { set(shooter, +enabled) }); if (empty(protos)) putAll(protos, mapValues loadBWImage(imageSnippetIDsForNames(llQuoted("Open", "Open discord")))); print("Have " + n2(protos, "proto")); if (segmenter == null) setField(segmenter := segmenterFromAGIBlue("Find things on discordapp.com #1")); print("Have segmenter: " + segmenter); shooter.onNewImage.add(rstSegment); shooter.start(enter := f enter); } void segment { BufferedImage img = shooter.latestImage; if (!enabled || img == null || segmenter == null) ret; // man weiß ja nie... this.info = (ImageInfo) imageWithProtos_segment(segmenter, img, iwpClass := ImageInfo.class, segmentClass := Segment.class); rstAOA.trigger(); } void aoa { ImageInfo info = this.info; if (info == null) ret; imageWithProtos_doAllOnAll(info, protos, minScore := requiredImageSimilarity, +isThings); latestWithAOA = info; } }