package readers; import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Path; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import java.awt.Color; public abstract class Reader{ final static int REGION_PADDING = 32; final static boolean NUMBER = true; int score; int rank; int[] notes = new int[7]; int difficulty; String title=""; double pct; int maxcombo; String other=""; String[] sig_data; public Path result_screenshot; List readRegions = new ArrayList<>(); int sig_data_size = 0; final int TRANSPARENT = new Color(0,0,0,0).getRGB(); protected void addRegion(Box box) { addRegion(box,false); } protected void addRegion(Box box,boolean isNumb) { readRegions.add(box); if (isNumb) { box.setNumber(true); sig_data_size++; } } protected void init() { sig_data = new String[readRegions.size()]; } String parseOutCommas(String str) { StringBuilder sb = new StringBuilder(); boolean insideStr = false; char escapeChar = '\''; for (int i=0;i=spacing&&midpoint<=spacing+readRegions.get(j).h+REGION_PADDING /*&&accuracy[j]accuracy[j]) { accuracy[j]=Double.parseDouble(en_data[i+9]); } break; } spacing+=readRegions.get(j).h+REGION_PADDING; } } for (int i=0;i=spacing&&midpoint<=spacing+readRegions.get(j).h+REGION_PADDING &&accuracy[j]=0&&newY>=0&&newXfarthestRight?X:farthestRight; } void seekThreshold(int[]arr,int i,int threshold,Color FINALCOLOR,int width) { seekThreshold(arr,i,threshold,FINALCOLOR,width,0); } int seekThreshold(int[]arr,int i,int threshold,Color FINALCOLOR,int width,int farthestRight) { arr[i]=FINALCOLOR.getRGB(); int X = i%width; for (int x=-1;x<=1;x++) { for (int y=-1;y<=1;y++) { int newX=(i+x+y*width)%width; int newY=(i+x+y*width)/width; if (newX>=0&&newY>=0&&newX<=width&&newY<=arr.length/width) { Color col = new Color(arr[i+x+y*width]); if (!col.equals(Color.MAGENTA)&&colorIsBright(col, threshold)) { farthestRight=seekThreshold(arr,i+x+y*width,threshold,FINALCOLOR,width,farthestRight); } } } } return X>farthestRight?X:farthestRight; } void process(int[]arr,int width,int a,int b,int c,int d,int e,int f,int g,int h,int ii,int j,int k,int l) { final ColorRange TARGETCOLOR = new ColorRange(a,b,c,d,e,f); final ColorRange SEEKINGCOLOR = new ColorRange(g,h,ii,j,k,l); final Color FINALCOLOR = Color.MAGENTA; for (int i=0;ibrightnessThreshold; } void processBrightness(int[]arr,int width,int threshold1,int threshold2) { final Color FINALCOLOR = Color.MAGENTA; for (int i=0;i0) { try { return Integer.parseInt(numb); } catch (NumberFormatException e) { return 0; } } else { return 0; } } @Override public String toString() { return "{\"game\":\""+getClass().getSimpleName()+"\",\"difficulty\":" + difficulty + ", \"maxcombo\":" + maxcombo + ", \"notes\":" + Arrays.toString(notes) + ", \"other\":" + other + ", \"pct\":" + pct + ", \"rank\":" + rank + ", \"score\":" + score + ", \"title\":\"" + title.replaceAll(Pattern.quote("\n"),"\\\\n") + "\"}"; } public String toStringWithScreenshot() { return "{\"game\":\""+getClass().getSimpleName()+"\",\"difficulty\":" + difficulty + ", \"maxcombo\":" + maxcombo + ", \"notes\":" + Arrays.toString(notes) + ", \"other\":" + other + ", \"pct\":" + pct + ", \"rank\":" + rank + ", \"score\":" + score + ", \"title\":\"" + title.replaceAll(Pattern.quote("\n"),"\\\\n") + "\", \"screenshot\":\""+result_screenshot+"\", \"date\":"+ZonedDateTime.now().toEpochSecond()+"}"; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public int[] getNotes() { return notes; } public void setNotes(int[] notes) { this.notes = notes; } public int getDifficulty() { return difficulty; } public void setDifficulty(int difficulty) { this.difficulty = difficulty; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPct() { return pct; } public void setPct(double pct) { this.pct = pct; } public int getMaxcombo() { return maxcombo; } public void setMaxcombo(int maxcombo) { this.maxcombo = maxcombo; } public String getOther() { return other; } public void setOther(String other) { this.other = other; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + difficulty; result = prime * result + maxcombo; result = prime * result + Arrays.hashCode(notes); result = prime * result + Arrays.deepHashCode(number_alternatives); result = prime * result + ((other == null) ? 0 : other.hashCode()); long temp; temp = Double.doubleToLongBits(pct); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + rank; result = prime * result + score; result = prime * result + ((title == null) ? 0 : title.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) { System.out.println("Null"); return false; } Reader other = (Reader) obj; if (difficulty != other.difficulty) return false; if (maxcombo != other.maxcombo) return false; if (!Arrays.equals(notes, other.notes)) return false; if (this.other == null) { if (other.other != null) return false; } else if (this.other.length()>0 && other.other.length()>0 && !this.other.equals(other.other)) { return false; } if (Double.compare(pct,other.pct)!=0) { System.out.println("Doubles don't match!"); return false; } if (rank != other.rank) return false; if (score != other.score) return false; return true; } public boolean isReasonableData() { for (int i=0;i