Complete implementation of Project Diva auto-record bot.

secondmonitor
sigonasr2 5 years ago
parent feb8361c7a
commit 2b52207643
  1. 2
      DivaBot/bin/.gitignore
  2. 138
      DivaBot/src/MyRobot.java
  3. 17
      DivaBot/src/Result.java
  4. 22
      DivaBot/src/TypeFace.java
  5. 36
      DivaBot/src/sig/utils/FileUtils.java

@ -9,3 +9,5 @@
/TypeFace$Pixel.class
/TypeFace.class
/sig/
/Results.class
/Result.class

@ -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<Character, Integer> KEYMAP;
ArrayList<Integer> randKeys;
List<Result> results = new ArrayList<Result>();
GraphicsEnvironment grEnv;
GraphicsDevice grDevice;
JPanel drawPanel;
@ -66,9 +71,13 @@ 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
}
} 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 {
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")) {

@ -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;
}
}

@ -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 {

@ -298,11 +298,43 @@ 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);
}

Loading…
Cancel
Save