diff --git a/DivaBot/TypeFace_API.jar b/DivaBot/TypeFace_API.jar index 86dfba1..113bb90 100644 Binary files a/DivaBot/TypeFace_API.jar and b/DivaBot/TypeFace_API.jar differ diff --git a/DivaBot/finish.png b/DivaBot/finish.png new file mode 100644 index 0000000..bbb543a Binary files /dev/null and b/DivaBot/finish.png differ diff --git a/DivaBot/src/sig/Calibrator.java b/DivaBot/src/sig/Calibrator.java new file mode 100644 index 0000000..559cc6e --- /dev/null +++ b/DivaBot/src/sig/Calibrator.java @@ -0,0 +1,112 @@ +package sig; + +import java.awt.Color; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; + +public class Calibrator{ + Calibrator(JPanel p) throws IOException, InterruptedException { + boolean failed=false; + int x = Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x); + int y = Math.min(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y); + int width = (Math.max(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x)-Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x)); + int height = (Math.max(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y)-Math.min(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y)); + + if (MyRobot.STARTDRAG.x>MyRobot.ENDDRAG.x) { + int xTemp=MyRobot.STARTDRAG.x; + MyRobot.STARTDRAG.x=MyRobot.ENDDRAG.x; + MyRobot.ENDDRAG.x=xTemp; + } + if (MyRobot.STARTDRAG.y>MyRobot.ENDDRAG.y) { + int yTemp=MyRobot.STARTDRAG.y; + MyRobot.STARTDRAG.y=MyRobot.ENDDRAG.y; + MyRobot.ENDDRAG.y=yTemp; + } + + /*Rectangle currentPointer = new Rectangle( + x,y, + (int)Math.floor(x+width*0.03984375d), + (int)Math.floor(y+height*0.30833333333333333333333333333333d)); + calibrationline=currentPointer;*/ + failed=CalibrationStage1(p); + if (failed) {return;} + failed=CalibrationStage2(p); + if (failed) {return;} + p.setVisible(true); + MyRobot.CALIBRATIONSTATUS="First calibration set done: X"+(x-MyRobot.STARTDRAG.x)+" Y"+(y-MyRobot.STARTDRAG.y); +// failed=CalibrationStage3(p); +// if (failed) {return;} +// failed=CalibrationStage4(p); +// if (failed) {return;} + //MyRobot.CALIBRATIONSTATUS="First calibration set done: X"+(x-MyRobot.STARTDRAG.x)+" Y"+(y-MyRobot.STARTDRAG.y); + } + + private boolean CalibrationStage1(JPanel p) throws IOException, InterruptedException { + boolean calibrated=false; + int MAXTRIES=10000; + MyRobot.CALIBRATIONSTATUS="Calibration Stage 1..."; + p.repaint(); + //ImageIO.write(MYROBOT.getSizedCapture(new Rectangle(x,y,width,height)),"png",new File("capture.png")); + BufferedImage currentScreen = MyRobot.MYROBOT.getSizedCapture(new Rectangle(0,0,MyRobot.screenSize.width,MyRobot.screenSize.height)); + ImageIO.write(currentScreen.getSubimage(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.x-MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.y-MyRobot.STARTDRAG.y),"png",new File("capture.png")); + while (!calibrated&&MAXTRIES>0) { + //Try moving left until the difference is too high or the colors are not right anymore. + MyRobot.STARTDRAG.x-=1; + //BufferedImage pixel = MYROBOT.getSizedCapture(new Rectangle(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,1,1)); + currentScreen = currentScreen.getSubimage(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,1,1); + ImageIO.write(currentScreen,"png",new File("capture_"+System.nanoTime()+".png")); + Color col = new Color(currentScreen.getRGB(0, 0)); + System.out.println("Checking "+col); + if (!(col.getRed()>=5&&col.getRed()<=40&& + col.getGreen()>=170&&col.getGreen()<=210&& + col.getBlue()>=205&&col.getBlue()<=250)) { + //This is the max X. Calibration on this side good. + MyRobot.STARTDRAG.x++; + System.out.println("End at "+MyRobot.STARTDRAG.x); + return false; + } + MAXTRIES--; + } + MyRobot.CALIBRATIONSTATUS="Calibration failed! Try making the capture region larger and defining it more accurately."; + p.repaint(); + return true; + } + + private boolean CalibrationStage2(JPanel p) throws IOException { + boolean calibrated=false; + int MAXTRIES=10000; + MyRobot.CALIBRATIONSTATUS="Calibration Stage 2..."; + p.repaint(); + //ImageIO.write(MYROBOT.getSizedCapture(new Rectangle(x,y,width,height)),"png",new File("capture.png")); + //BufferedImage currentScreen = MYROBOT.getSizedCapture(new Rectangle(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,MyRobot.ENDDRAG,height)); + BufferedImage currentScreen = MyRobot.MYROBOT.getSizedCapture(new Rectangle(0,0,MyRobot.screenSize.width,MyRobot.screenSize.height)); + ImageIO.write(currentScreen.getSubimage(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.x-MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.y-MyRobot.STARTDRAG.y),"png",new File("capture_2.png")); + while (!calibrated&&MAXTRIES>0) { + //Try moving left until the difference is too high or the colors are not right anymore. + MyRobot.STARTDRAG.y-=1; + p.repaint(); + //currentScreen.setRGB(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y, new Color(0,0,0).getRGB()); + currentScreen = currentScreen.getSubimage(MyRobot.STARTDRAG.x,MyRobot.STARTDRAG.y,1,1); + ImageIO.write(currentScreen,"png",new File("capture_2_"+System.nanoTime()+".png")); + Color col = new Color(currentScreen.getRGB(0, 0)); + System.out.println("Checking "+col); + if (!(col.getRed()>=5&&col.getRed()<=40&& + col.getGreen()>=170&&col.getGreen()<=210&& + col.getBlue()>=205&&col.getBlue()<=250)) { + //This is the max Y. Calibration on this side good. + MyRobot.STARTDRAG.y++; + System.out.println("End at "+MyRobot.STARTDRAG.y); + return false; + } + MAXTRIES--; + } + MyRobot.CALIBRATIONSTATUS="Calibration failed! Try making the capture region larger and defining it more accurately."; + p.repaint(); + return true; + } +} diff --git a/DivaBot/src/sig/CustomRobot.java b/DivaBot/src/sig/CustomRobot.java index cebe0d0..6243208 100644 --- a/DivaBot/src/sig/CustomRobot.java +++ b/DivaBot/src/sig/CustomRobot.java @@ -25,6 +25,10 @@ public class CustomRobot extends Robot{ super(screen); } + public synchronized BufferedImage getSizedCapture(Rectangle r) { + return super.createScreenCapture(r); + } + public void refreshScreen() { currentScreen = super.createScreenCapture(new Rectangle(418+18,204+83,912-18,586-83)); } diff --git a/DivaBot/src/sig/MyRobot.java b/DivaBot/src/sig/MyRobot.java index c281657..1e6c0ab 100644 --- a/DivaBot/src/sig/MyRobot.java +++ b/DivaBot/src/sig/MyRobot.java @@ -1,7 +1,11 @@ package sig; import java.awt.Color; +import java.awt.Cursor; +import java.awt.Dimension; import java.awt.Font; import java.awt.FontFormatException; +import java.awt.FontMetrics; +import java.awt.Graphics; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Image; @@ -9,6 +13,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; +import java.awt.Window; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; @@ -16,6 +21,7 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.io.BufferedReader; @@ -41,6 +47,9 @@ import java.util.List; import java.util.Scanner; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import javax.imageio.IIOImage; import javax.imageio.ImageIO; @@ -58,6 +67,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; @@ -111,6 +121,9 @@ public class MyRobot{ static SongData selectedSong = null; static String difficulty = "H"; //H=Hard EX=Extreme EXEX=Extra Extreme static boolean recordedResults=false; + static boolean CALIBRATION = true; + static Point STARTDRAG = null; + static Point ENDDRAG = null; int lastcool,lastfine,lastsafe,lastsad,lastworst,lastcombo,lastscore; float lastpercent; @@ -128,6 +141,16 @@ public class MyRobot{ boolean overlayHidden=false; static boolean onSongSelect=false; + static BufferedImage finishbutton = null; + static Dimension screenSize = new Dimension(0,0); + static boolean dragging = false; + static String CALIBRATIONSTATUS = ""; + static boolean calibrating=true; + static Rectangle calibrationline = null; + static boolean repaintCalled = false; + public static Overlay OVERLAY; + + public static ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); public static void main(String[] args) throws JSONException, IOException, FontFormatException { @@ -136,6 +159,7 @@ public class MyRobot{ for (String key : JSONObject.getNames(obj)) { SONGNAMES[Integer.parseInt(key)-1] = new SongInfo(obj.getJSONObject(key)); } + finishbutton = ImageIO.read(new File("finish.png")); new MyRobot().go(); } @@ -442,15 +466,27 @@ public class MyRobot{ //System.out.println(title.getText()); } }); - - RunTests(); - f.setVisible(true); - f.setSize(1362, 1036); - f.add(p); + JFrame.setDefaultLookAndFeelDecorated(true); + f.setUndecorated(true); + OVERLAY = new Overlay(); + OVERLAY.setBounds(f.getGraphicsConfiguration().getBounds()); + OVERLAY.setOpaque(false); + f.addMouseListener(OVERLAY); + f.addMouseMotionListener(OVERLAY); + screenSize=new Dimension(f.getGraphicsConfiguration().getBounds().width,f.getGraphicsConfiguration().getBounds().height); + f.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); + //f.add(p); + //System.out.println(f.getGraphicsConfiguration().getBounds().width+"/"+f.getGraphicsConfiguration().getBounds().height); + f.setSize(f.getGraphicsConfiguration().getBounds().width,f.getGraphicsConfiguration().getBounds().height); + f.add(OVERLAY); + f.setBackground(new Color(0,0,0,0)); + f.setVisible(true); f.setTitle("DivaBot"); title = new JTextField(); title.setSize(200,100); title.setText((currentSong>=SONGNAMES.length)?"DONE!":SONGNAMES[currentSong].name); + + SongData s = SongData.getByTitle(SONGNAMES[currentSong].name); BotMain(); diff --git a/DivaBot/src/sig/Overlay.java b/DivaBot/src/sig/Overlay.java new file mode 100644 index 0000000..5f46923 --- /dev/null +++ b/DivaBot/src/sig/Overlay.java @@ -0,0 +1,83 @@ +package sig; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; + +import javax.swing.JPanel; + +public class Overlay extends JPanel implements MouseMotionListener,MouseListener{ + + Overlay() { + Thread t = new Thread() { + public void run() { + while (true) { + repaint(); + try { + Thread.sleep(1000/60); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }; + t.start(); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + g.setColor(new Color(0,0,0,1)); + g.fillRect(0, 0, MyRobot.screenSize.width, MyRobot.screenSize.height); + g.setColor(new Color(0,255,255,96)); + if (MyRobot.STARTDRAG!=null&&MyRobot.ENDDRAG!=null) { + g.fillRect(0,0,Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x),MyRobot.screenSize.height); + g.fillRect(Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x),0,MyRobot.screenSize.width,Math.min(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y)); + g.fillRect(Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x), Math.max(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y), Math.max(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x)-Math.min(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x), MyRobot.screenSize.height-Math.max(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y)); + g.fillRect(Math.max(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x), Math.min(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y), MyRobot.screenSize.width-Math.max(MyRobot.STARTDRAG.x,MyRobot.ENDDRAG.x), MyRobot.screenSize.height-Math.min(MyRobot.STARTDRAG.y,MyRobot.ENDDRAG.y)); + } + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + MyRobot.STARTDRAG=e.getLocationOnScreen(); + } + + @Override + public void mouseReleased(MouseEvent e) { + MyRobot.ENDDRAG=e.getLocationOnScreen(); + if (MyRobot.STARTDRAG.x>MyRobot.ENDDRAG.x) { + var xTemp = MyRobot.STARTDRAG.x; + MyRobot.STARTDRAG.x=MyRobot.ENDDRAG.x; + MyRobot.ENDDRAG.x=xTemp; + } + if (MyRobot.STARTDRAG.y>MyRobot.ENDDRAG.y) { + var xTemp = MyRobot.STARTDRAG.y; + MyRobot.STARTDRAG.y=MyRobot.ENDDRAG.y; + MyRobot.ENDDRAG.y=xTemp; + } + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + MyRobot.ENDDRAG=e.getLocationOnScreen(); + } + + @Override + public void mouseMoved(MouseEvent e) { + } +}