package org.open2jam.game.judgment;
import org.open2jam.render.entities.NoteEntity;
import org.open2jam.game.TimingData;
/**
* Judge hits by distance.
* @author dtinth
*/
public class BeatJudgment extends AbstractJudgmentStrategy {
private static final double BAD_THRESHOULD = 0.8;
private static final double GOOD_THRESHOULD = 0.5;
private static final double COOL_THRESHOULD = 0.2;
private double calculateHit(NoteEntity note) {
double noteTime = note.getTimeToJudge();
double hitTime = note.getTimeToJudge() - note.getHitTime();
double noteBeat = timing.getBeat(noteTime);
double hitBeat = timing.getBeat(hitTime);
return (noteBeat - hitBeat) / 0.664;
}
@Override
public boolean accept(NoteEntity note) {
return calculateHit(note) <= BAD_THRESHOULD;
}
@Override
public boolean missed(NoteEntity note) {
return calculateHit(note) < -BAD_THRESHOULD;
}
@Override
public JudgmentResult judge(NoteEntity note) {
double hit = Math.abs(calculateHit(note));
if (hit <= COOL_THRESHOULD) return JudgmentResult.COOL;
if (hit <= GOOD_THRESHOULD) return JudgmentResult.GOOD;
if (hit <= BAD_THRESHOULD) return JudgmentResult.BAD;
return JudgmentResult.MISS;
}
}