From 2b5220764340530b964c66144e64084cff997110 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 11 Jul 2020 13:44:57 +0900 Subject: [PATCH] Complete implementation of Project Diva auto-record bot. --- DivaBot/bin/.gitignore | 2 + DivaBot/src/MyRobot.java | 138 ++++++++++++++++++++++++--- DivaBot/src/Result.java | 17 ++++ DivaBot/src/TypeFace.java | 22 +++-- DivaBot/src/sig/utils/FileUtils.java | 36 ++++++- 5 files changed, 193 insertions(+), 22 deletions(-) create mode 100644 DivaBot/src/Result.java diff --git a/DivaBot/bin/.gitignore b/DivaBot/bin/.gitignore index 202061f..b835d09 100644 --- a/DivaBot/bin/.gitignore +++ b/DivaBot/bin/.gitignore @@ -9,3 +9,5 @@ /TypeFace$Pixel.class /TypeFace.class /sig/ +/Results.class +/Result.class diff --git a/DivaBot/src/MyRobot.java b/DivaBot/src/MyRobot.java index 1caad89..1226133 100644 --- a/DivaBot/src/MyRobot.java +++ b/DivaBot/src/MyRobot.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Timer; import java.util.TimerTask; @@ -29,6 +30,9 @@ import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; +import sig.utils.FileUtils; +import sig.utils.SoundUtils; + public class MyRobot{ Robot MYROBOT; @@ -50,6 +54,7 @@ public class MyRobot{ Color PIX_CLOSE_ACTIVE_ON_MOUSE; HashMap KEYMAP; ArrayList randKeys; + List results = new ArrayList(); GraphicsEnvironment grEnv; GraphicsDevice grDevice; JPanel drawPanel; @@ -66,8 +71,12 @@ public class MyRobot{ int lastcool,lastfine,lastsafe,lastsad,lastworst; float lastpercent; + long lastSongSelectTime = System.currentTimeMillis(); static TypeFace typeface1,typeface2; + + boolean eyeTrackingSceneOn=true; + boolean recordingResults=false; public static void main(String[] args) { new MyRobot().go(); @@ -76,9 +85,9 @@ public class MyRobot{ void BotMain() { Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask() { - @Override public void run() { + if (isOnSongSelect()) { GetCurrentSong(); GetCurrentDifficulty(); @@ -86,35 +95,74 @@ public class MyRobot{ if (selectedSong!=null && difficulty!=null) { System.out.println("On Song Select Screen: Current Song-"+selectedSong.title+" Diff:"+difficulty); } + lastSongSelectTime = System.currentTimeMillis(); } else { + selectedSong=new SongData("test",new Color[] {}); + difficulty="EXEX"; if ((selectedSong!=null && difficulty!=null) /*|| true*/) { //Look for the results screen. //602,217 254,254,254 //602,260 16,222,202 //901,460 220-255,220-255,160-220 - if (OnResultsScreen() && !recordedResults) { + + if (OnResultsScreen() && !recordedResults && !recordingResults && results.size()==0) { + lastSongSelectTime=System.currentTimeMillis(); + //1885,761 + if (eyeTrackingSceneOn) { + eyeTrackingSceneOn=false; + gotoxy(800,64); + click(); + gotoxy(1870,761); + click(); + } //System.out.println(typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,451,115,26)))); //System.out.println(typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,484,115,26)))); //System.out.println(typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,518,115,26)))); //System.out.println(typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,553,115,26)))); //System.out.println(typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,583,115,26)))); //System.out.println(typeface2.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1428,361,128,30)))); - int cool = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,451,115,26))); - int fine = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,484,115,26))); - int safe = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,518,115,26))); - int sad = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,553,115,26))); - int worst = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,583,115,26))); + File tmp = new File("tmp"); + if (tmp.exists()) { + FileUtils.deleteFile(tmp); + } else { + tmp.mkdir(); + } + int cool = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,451,115,26)),new File(tmp,"cool")); + int fine = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,484,115,26)),new File(tmp,"fine")); + int safe = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,518,115,26)),new File(tmp,"safe")); + int sad = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,553,115,26)),new File(tmp,"sad")); + int worst = typeface1.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1235,583,115,26)),new File(tmp,"worst")); /*try { ImageIO.write(MYROBOT.createScreenCapture(new Rectangle(1235,583,115,26)),"png",new File("worst.png")); } catch (IOException e) { e.printStackTrace(); }*/ - float percent = (float)typeface2.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1428,361,128,30)))/100f; + float percent = (float)typeface2.extractNumbersFromImage(MYROBOT.createScreenCapture(new Rectangle(1428,361,128,30)),new File(tmp,"percent"))/100f; if (cool==-1 || fine==-1 || safe==-1 || sad==-1 || worst==-1 || percent==-0.01f) { System.out.println("Waiting for results to populate..."); } else if (cool!=lastcool || lastfine!=fine || lastsafe!=safe || lastsad!=sad || lastworst!=worst || lastpercent!=percent){ System.out.println("Results for "+selectedSong.title+" "+difficulty+": "+cool+"/"+fine+"/"+safe+"/"+sad+"/"+worst+" "+percent+"%"); + File songFolder = new File(selectedSong.title+"/"+difficulty); + if (!songFolder.exists()) { + songFolder.mkdirs(); + } + File[] songFolderFiles = songFolder.listFiles(); + int playId = songFolderFiles.length; + File playFolder = new File(selectedSong.title+"/"+difficulty+"/"+playId); + playFolder.mkdir(); + try { + FileUtils.copyFileDir(new File(tmp,"cool"), new File(playFolder,"cool")); + FileUtils.copyFileDir(new File(tmp,"fine"), new File(playFolder,"fine")); + FileUtils.copyFileDir(new File(tmp,"safe"), new File(playFolder,"safe")); + FileUtils.copyFileDir(new File(tmp,"sad"), new File(playFolder,"sad")); + FileUtils.copyFileDir(new File(tmp,"worst"), new File(playFolder,"worst")); + FileUtils.copyFileDir(new File(tmp,"percent"), new File(playFolder,"percent")); + //FileUtils.deleteFile(tmp); + ImageIO.write(MYROBOT.createScreenCapture(new Rectangle(418,204,1227,690)),"png",new File(playFolder,selectedSong.title+"_"+difficulty+"play_"+cool+"_"+fine+"_"+safe+"_"+sad+"_"+worst+"_"+percent+".png")); + } catch (IOException e) { + e.printStackTrace(); + } recordedResults=true; lastcool=cool; lastfine=fine; @@ -122,8 +170,72 @@ public class MyRobot{ lastsad=sad; lastworst=worst; lastpercent=percent; + results.add(new Result(selectedSong.title,difficulty,cool,fine,safe,sad,worst,percent)); + SoundUtils.playSound("collect_item.wav"); + if (!eyeTrackingSceneOn) { + eyeTrackingSceneOn=true; + gotoxy(800,64); + click(); + gotoxy(1870,761); + click(); + } + } + } else { + if (results.size()>0 && System.currentTimeMillis()-5000>lastSongSelectTime) { + recordingResults=true; + MYROBOT.setAutoDelay(0); + MYROBOT.keyPress(KeyEvent.VK_ALT); + MYROBOT.keyPress(KeyEvent.VK_TAB); + MYROBOT.keyRelease(KeyEvent.VK_ALT); + MYROBOT.setAutoDelay(250); + MYROBOT.keyRelease(KeyEvent.VK_TAB); + sleep(2000); + boolean first=true; + for (Result r : results) { + if (!first) { + sleep(5000); + } else { + first=false; + } + type(r.songName); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Integer.toString(r.cool)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Integer.toString(r.fine)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Integer.toString(r.safe)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Integer.toString(r.sad)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Integer.toString(r.worst)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(r.difficulty); + MYROBOT.keyPress(KeyEvent.VK_TAB); + type(Float.toString(r.percent)); + MYROBOT.keyPress(KeyEvent.VK_TAB); + MYROBOT.keyRelease(KeyEvent.VK_TAB); + MYROBOT.setAutoDelay(0); + MYROBOT.keyPress(KeyEvent.VK_CONTROL); + MYROBOT.keyPress(KeyEvent.VK_ALT); + MYROBOT.keyPress(KeyEvent.VK_SHIFT); + MYROBOT.keyPress(KeyEvent.VK_1); + MYROBOT.keyRelease(KeyEvent.VK_1); + MYROBOT.keyRelease(KeyEvent.VK_CONTROL); + MYROBOT.keyRelease(KeyEvent.VK_ALT); + MYROBOT.keyRelease(KeyEvent.VK_SHIFT); + } + results.clear(); + sleep(1000); + MYROBOT.setAutoDelay(0); + MYROBOT.keyPress(KeyEvent.VK_ALT); + MYROBOT.keyPress(KeyEvent.VK_TAB); + MYROBOT.keyRelease(KeyEvent.VK_ALT); + MYROBOT.setAutoDelay(250); + MYROBOT.keyRelease(KeyEvent.VK_TAB); + recordingResults=false; + } } - } else + } else { if (!OnResultsScreen() && recordedResults) { recordedResults=false; } @@ -264,7 +376,7 @@ public class MyRobot{ p.getGraphics().drawImage(bufferedImage, 0, 0, f); } }); - f.setVisible(true); + //f.setVisible(true); f.setSize(400, 400); title = new JTextField(); title.setSize(200,100); @@ -554,7 +666,7 @@ public class MyRobot{ MYROBOT.setAutoDelay(TYPE_DELAY); char[] letter = letters.toCharArray(); for (int i = 0; i < letter.length; i++) { - System.out.print(letter[i]); + //System.out.print(letter[i]); try { if ((Character.isLowerCase(letter[i])) || (Character.isDigit(letter[i]))) { MYROBOT.keyPress(KEYMAP.get(letter[i])); @@ -1005,6 +1117,10 @@ public class MyRobot{ gotoxy(X - 150, Y); } + void pressKey(int keyCode) { + manuPress(keyCode); + } + void pressKey(String keyName) { keyName = keyName.toUpperCase(); if (keyName.equals("ESC")) { diff --git a/DivaBot/src/Result.java b/DivaBot/src/Result.java new file mode 100644 index 0000000..9087c2b --- /dev/null +++ b/DivaBot/src/Result.java @@ -0,0 +1,17 @@ + +public class Result { + String songName; + String difficulty; + int cool,fine,safe,sad,worst; + float percent; + public Result(String song,String diff,int cool,int fine,int safe,int sad,int worst,float percent) { + this.songName=song; + this.difficulty=diff; + this.cool=cool; + this.fine=fine; + this.safe=safe; + this.sad=sad; + this.worst=worst; + this.percent=percent; + } +} diff --git a/DivaBot/src/TypeFace.java b/DivaBot/src/TypeFace.java index 668b7fd..31f7593 100644 --- a/DivaBot/src/TypeFace.java +++ b/DivaBot/src/TypeFace.java @@ -38,7 +38,11 @@ public class TypeFace { } } - public int extractNumbersFromImage(BufferedImage img) { + public int extractNumbersFromImage(BufferedImage img,File saveLoc) { + if (!saveLoc.exists()) { + saveLoc.mkdirs(); + } + int midY = img.getHeight()/2; int X = 0; @@ -127,12 +131,7 @@ public class TypeFace { } else { numberImg = ImageUtils.toBufferedImage(numberImg.getScaledInstance(WIDTH, -1, Image.SCALE_FAST)); } - try { - ImageIO.write(numberImg,"png",new File("number_"+System.currentTimeMillis()+".png")); - } catch (IOException e) { - e.printStackTrace(); - } - System.out.println(numberImg.getWidth()+"x"+numberImg.getHeight()); + //System.out.println(numberImg.getWidth()+"x"+numberImg.getHeight()); int[] hits = new int[NUMBER_COUNT]; double highestRatio = 0; int highest = 0; @@ -154,7 +153,12 @@ public class TypeFace { } } } - System.out.println("Matches closest to "+((highest+1)%NUMBER_COUNT)+" with "+highestRatio); + try { + ImageIO.write(numberImg,"png",new File(saveLoc,((highest+1)%NUMBER_COUNT)+".png")); + } catch (IOException e) { + e.printStackTrace(); + } + //System.out.println("Matches closest to "+((highest+1)%NUMBER_COUNT)+" with "+highestRatio); extractedNumbers+=Integer.toString((highest+1)%NUMBER_COUNT); state=4; }break; @@ -179,7 +183,7 @@ public class TypeFace { } X++; } - System.out.println("Got "+extractedNumbers); + //System.out.println("Got "+extractedNumbers); if (extractedNumbers.length()==0) { return -1; } else { diff --git a/DivaBot/src/sig/utils/FileUtils.java b/DivaBot/src/sig/utils/FileUtils.java index ad6d4ed..6e186a1 100644 --- a/DivaBot/src/sig/utils/FileUtils.java +++ b/DivaBot/src/sig/utils/FileUtils.java @@ -298,13 +298,45 @@ public class FileUtils { } } - public static void deleteFile(String filename) { - File file = new File(filename); + public static void copyFileDir(File sourcedir, File destdir) throws IOException { + FileChannel sourceChannel = null; + FileChannel destChannel = null; + destdir.mkdirs(); + try { + for (String name : sourcedir.list()) { + File f = new File(sourcedir,name); + sourceChannel = new FileInputStream(f).getChannel(); + destChannel = new FileOutputStream(new File(destdir,name)).getChannel(); + destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); + sourceChannel.close(); + destChannel.close(); + } + } + finally{ + + } + } + + public static void deleteFile(File filename) { + File file = filename; if (file.exists()) { + //System.out.println("Trying to delete "+file); + if (file.isDirectory()) { + for (String name : file.list()) { + File f = new File(file,name); + deleteFile(f); + } + } file.delete(); + //System.out.println(file+" deleted"); } } + public static void deleteFile(String filename) { + File file = new File(filename); + deleteFile(file); + } + public static void downloadFileFromUrl(String url, String file,boolean bearer) throws IOException, JSONException { File filer = new File(file);