package rabbitescape.engine.config; public class TapTimer { /** Tap or click time intervals in ms */ private static long intervals[] = new long[10]; // java inits array to zero. // Holst's Mars private static final float[] pattern = { 1.0f, 1.0f, 1.0f, 3.0f, 3.0f, 1.5f, 1.5f }; public static boolean matched = checkEnv(); private static long prevTime = 0; private static int nextI = 0; public static boolean checkEnv() { String tap = System.getenv("TAP"); if ( null != tap && tap.equals( "Mars" ) ) { System.out.println( "Mars" ); return true; } return false; } public static void newTap() { long now = System.currentTimeMillis(); intervals[nextI++] = now - prevTime ; nextI = nextI < intervals.length ? nextI : 0; prevTime = now; checkRhythm(); } private static void checkRhythm() { int refIntervalI = nextI - 1; refIntervalI = refIntervalI >= 0 ? refIntervalI : intervals.length - 1; float refInterval = intervals[refIntervalI]; int intervalI = nextI - 2; for ( int patternI = pattern.length - 2 ; patternI >= 0 ; patternI--, intervalI-- ) { intervalI = intervalI >= 0 ? intervalI : intervals.length - 1; float relativeInterval = intervals[intervalI] * pattern[pattern.length - 1] / refInterval ; if ( Math.abs( relativeInterval - pattern[patternI] ) > 0.3 ) { return; } } System.out.println("Mars"); matched = true; } }