import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.awt.image.BufferedImage; public class ArcadeReader { /* * Important data we would like to know for all games: * Score * Rank (Probably implementation-specific) * Note accuracy [List] * Marvelous * Perfect * Great * Good * Bad * OK * Miss * Difficulty * Song Name / Title * Percentage (Can be EX Score, a percentage accuracy or survival percent) * Max Combo * Other (Not used by the auto detecter, used for storing misc. data.) * * Notes about Readers: * Love Live * - Does not use: Marvelous, OK * Project Diva * - Does not use: Marvelous, OK * - Fail condition is MISSxTAKE * DDR * - Does not use: Max Combo (Cannot calculate in combo carryover mode), Bad * - Fail condition is E rank. * Pop'n Music * - Does not use: Marvelous, Bad, OK * - Stores number of bars filled in Percentage. * - Fail condition is <17 in the meter (max is 24) * Sound Voltex * - Sound Voltex uses the note accuracy list slots as follows: * Early: * Error - Marvelous * Near - Perfect * Critical - Great * S-Critical - Good * Critical - Bad * Near - OK * Error - Miss * - Sound Voltex stores EX score in Percentage. * - Max Combo is Max Chain * - Sound Voltex will store additional data about accuracy of note types as such: * {"chip":{"scritical":0,"critical":0,"near":0,"error":0},"long":{"scritical":0,"error":0},"vol":{"scritical":0,"error":0},"gauge":,"gauge_pct":100} * //Also storing what type of clear gauge was met and the % of the gauge. * - Fail condition is <70% normal gauge. * IIDX * - Not going to support right now. * */ public static void retrieveData(BufferedImage img) { new LoveLiveReader().interpretBoxes(); } } class Box{ int x,y,w,h; boolean ja_required; final static int BOX_THRESHOLD=8; //How many pixels outside the specified region the score can be. Box(int x,int y,int w, int h) { this.x=x; this.y=y; this.w=w; this.h=h; } boolean insideBox(int x,int y) { return this.x-BOX_THRESHOLD<=x&&this.x+this.w+BOX_THRESHOLD>=x&&this.y-BOX_THRESHOLD<=y&&this.y+this.h+BOX_THRESHOLD>=y; } } class LoveLiveReader extends Reader{ LoveLiveReader(){ readRegions.add(new Box(10,10,24,24)); readRegions.add(new Box(10,40,24,24)); readRegions.add(new Box(10,70,24,24)); } void interpretBoxes(){ String dataString = readAllBoxes(); System.out.println(dataString); } } abstract class Reader{ int score; int rank; int[] notes = new int[7]; int difficulty; String title; int pct; int maxcombo; String other; List readRegions = new ArrayList<>(); String readAllBoxes() { try { Process p = Runtime.getRuntime().exec("cat testBoxes.txt"); InputStreamReader result = new InputStreamReader(p.getInputStream()); StringBuilder sb = new StringBuilder(); while (result.ready()) { sb.append((char)result.read()); } result.close(); return sb.toString(); } catch (IOException e) { e.printStackTrace(); } return ""; } }