Spinner Test2
Improves Score accuracy (still mostly wrong) inital replay seek
This commit is contained in:
@@ -46,6 +46,10 @@ public class Slider implements HitObject {
|
||||
|
||||
/** Rate at which slider ticks are placed. */
|
||||
private static float sliderTickRate = 1.0f;
|
||||
|
||||
private static float followRadius;
|
||||
|
||||
private static float diameter;
|
||||
|
||||
/** The amount of time, in milliseconds, to fade in the slider. */
|
||||
private static final int FADE_IN_TIME = 375;
|
||||
@@ -97,6 +101,8 @@ public class Slider implements HitObject {
|
||||
|
||||
/** Container dimensions. */
|
||||
private static int containerWidth, containerHeight;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Initializes the Slider data type with images and dimensions.
|
||||
@@ -107,10 +113,13 @@ public class Slider implements HitObject {
|
||||
public static void init(GameContainer container, float circleSize, OsuFile osu) {
|
||||
containerWidth = container.getWidth();
|
||||
containerHeight = container.getHeight();
|
||||
|
||||
int diameter = (int) (104 - (circleSize * 8));
|
||||
diameter = (int) (diameter * OsuHitObject.getXMultiplier()); // convert from Osupixels (640x480)
|
||||
|
||||
|
||||
diameter = (108 - (circleSize * 8));
|
||||
diameter = (diameter * OsuHitObject.getXMultiplier()); // convert from Osupixels (640x480)
|
||||
int diameterInt = (int)diameter;
|
||||
|
||||
followRadius = diameter / 2 * 3f;
|
||||
|
||||
// slider ball
|
||||
if (GameImage.SLIDER_BALL.hasSkinImages() ||
|
||||
(!GameImage.SLIDER_BALL.hasSkinImage() && GameImage.SLIDER_BALL.getImages() != null))
|
||||
@@ -118,11 +127,11 @@ public class Slider implements HitObject {
|
||||
else
|
||||
sliderBallImages = new Image[]{ GameImage.SLIDER_BALL.getImage() };
|
||||
for (int i = 0; i < sliderBallImages.length; i++)
|
||||
sliderBallImages[i] = sliderBallImages[i].getScaledCopy(diameter * 118 / 128, diameter * 118 / 128);
|
||||
sliderBallImages[i] = sliderBallImages[i].getScaledCopy(diameterInt * 118 / 128, diameterInt * 118 / 128);
|
||||
|
||||
GameImage.SLIDER_FOLLOWCIRCLE.setImage(GameImage.SLIDER_FOLLOWCIRCLE.getImage().getScaledCopy(diameter * 259 / 128, diameter * 259 / 128));
|
||||
GameImage.REVERSEARROW.setImage(GameImage.REVERSEARROW.getImage().getScaledCopy(diameter, diameter));
|
||||
GameImage.SLIDER_TICK.setImage(GameImage.SLIDER_TICK.getImage().getScaledCopy(diameter / 4, diameter / 4));
|
||||
GameImage.SLIDER_FOLLOWCIRCLE.setImage(GameImage.SLIDER_FOLLOWCIRCLE.getImage().getScaledCopy(diameterInt * 259 / 128, diameterInt * 259 / 128));
|
||||
GameImage.REVERSEARROW.setImage(GameImage.REVERSEARROW.getImage().getScaledCopy(diameterInt, diameterInt));
|
||||
GameImage.SLIDER_TICK.setImage(GameImage.SLIDER_TICK.getImage().getScaledCopy(diameterInt / 4, diameterInt / 4));
|
||||
|
||||
sliderMultiplier = osu.sliderMultiplier;
|
||||
sliderTickRate = osu.sliderTickRate;
|
||||
@@ -266,6 +275,55 @@ public class Slider implements HitObject {
|
||||
* @return the hit result (GameData.HIT_* constants)
|
||||
*/
|
||||
private int hitResult() {
|
||||
/*
|
||||
time scoredelta score-hit-initial-tick= unaccounted
|
||||
(1/4 - 1) 396 - 300 - 30 46
|
||||
(1+1/4 - 2) 442 - 300 - 30 - 10
|
||||
(2+1/4 - 3) 488 - 300 - 30 - 2*10 896 (408)5x
|
||||
(3+1/4 - 4) 534 - 300 - 30 - 3*10
|
||||
(4+1/4 - 5) 580 - 300 - 30 - 4*10
|
||||
(5+1/4 - 6) 626 - 300 - 30 - 5*10
|
||||
(6+1/4 - 7) 672 - 300 - 30 - 6*10
|
||||
|
||||
difficultyMulti = 3 (+36 per combo)
|
||||
|
||||
score =
|
||||
(t)ticks(10) * nticks +
|
||||
(h)hitValue
|
||||
(c)combo (hitValue/25 * difficultyMultiplier*(combo-1))
|
||||
(i)initialHit (30) +
|
||||
(f)finalHit(30) +
|
||||
|
||||
s t h c i f
|
||||
626 - 10*5 - 300 - 276(-216 - 30 - 30) (all)(7x)
|
||||
240 - 10*5 - 100 - 90 (-60 <- 30>) (no final or initial)(6x)
|
||||
|
||||
218 - 10*4 - 100 - 78 (-36 - 30) (4 tick no initial)(5x)
|
||||
196 - 10*3 - 100 - 66 (-24 - 30 ) (3 tick no initial)(4x)
|
||||
112 - 10*2 - 50 - 42 (-12 - 30 ) (2 tick no initial)(3x)
|
||||
96 - 10 - 50 - 36 ( -6 - 30 ) (1 tick no initial)(2x)
|
||||
|
||||
206 - 10*4 - 100 - 66 (-36 - 30 ) (4 tick no initial)(4x)
|
||||
184 - 10*3 - 100 - 54 (-24 - 30 ) (3 tick no initial)(3x)
|
||||
90 - 10 - 50 - 30 ( - 30 ) (1 tick no initial)(0x)
|
||||
|
||||
194 - 10*4 - 100 - 54 (-24 - 30 ) (4 tick no initial)(3x)
|
||||
|
||||
170 - 10*4 - 100 - 30 ( - 30 ) (4 tick no final)(0x)
|
||||
160 - 10*3 - 100 - 30 ( - 30 ) (3 tick no final)(0x)
|
||||
100 - 10*2 - 50 - 30 ( - 30 ) (2 tick no final)(0x)
|
||||
|
||||
198 - 10*5 - 100 - 48 (-36 ) (no initial and final)(5x)
|
||||
110 - 50 - ( - 30 - 30 ) (final and initial no tick)(0x)
|
||||
80 - 50 - ( <- 30> ) (only final or initial)(0x)
|
||||
|
||||
140 - 10*4 - 100 - 0 (4 ticks only)(0x)
|
||||
80 - 10*3 - 50 - 0 (3 tick only)(0x)
|
||||
70 - 10*2 - 50 - 0 (2 tick only)(0x)
|
||||
60 - 10 - 50 - 0 (1 tick only)(0x)
|
||||
|
||||
|
||||
*/
|
||||
float tickRatio = (float) ticksHit / tickIntervals;
|
||||
|
||||
int result;
|
||||
@@ -277,7 +335,7 @@ public class Slider implements HitObject {
|
||||
result = GameData.HIT_50;
|
||||
else
|
||||
result = GameData.HIT_MISS;
|
||||
|
||||
|
||||
if (currentRepeats % 2 == 0) { // last circle
|
||||
float[] lastPos = curve.pointAt(1);
|
||||
data.hitResult(hitObject.getTime() + (int) sliderTimeTotal, result,
|
||||
@@ -296,8 +354,7 @@ public class Slider implements HitObject {
|
||||
return false;
|
||||
|
||||
double distance = Math.hypot(this.x - x, this.y - y);
|
||||
int circleRadius = GameImage.HITCIRCLE.getImage().getWidth() / 2;
|
||||
if (distance < circleRadius) {
|
||||
if (distance < diameter / 2) {
|
||||
int timeDiff = Math.abs(trackPosition - hitObject.getTime());
|
||||
int[] hitResultOffset = game.getHitResultOffsets();
|
||||
|
||||
@@ -353,26 +410,29 @@ public class Slider implements HitObject {
|
||||
}
|
||||
|
||||
// end of slider
|
||||
if (overlap || trackPosition > hitObject.getTime() + sliderTimeTotal) {
|
||||
if (trackPosition > hitObject.getTime() + sliderTimeTotal) {
|
||||
tickIntervals++;
|
||||
|
||||
// check if cursor pressed and within end circle
|
||||
if (keyPressed || GameMod.RELAX.isActive()) {
|
||||
float[] c = curve.pointAt(getT(trackPosition, false));
|
||||
double distance = Math.hypot(c[0] - mouseX, c[1] - mouseY);
|
||||
int followCircleRadius = GameImage.SLIDER_FOLLOWCIRCLE.getImage().getWidth() / 2;
|
||||
if (distance < followCircleRadius)
|
||||
if (distance < followRadius) //TODO IDK Magic numbers
|
||||
sliderClickedFinal = true;
|
||||
}
|
||||
|
||||
// final circle hit
|
||||
if (sliderClickedFinal)
|
||||
if (sliderClickedFinal){
|
||||
ticksHit++;
|
||||
data.sliderFinalResult(hitObject.getTime(), GameData.HIT_SLIDER30, this.x, this.y, hitObject, currentRepeats);
|
||||
}
|
||||
|
||||
// "auto" mod: always send a perfect hit result
|
||||
if (isAutoMod)
|
||||
ticksHit = tickIntervals;
|
||||
|
||||
//TODO missing the final shouldn't increment the combo
|
||||
|
||||
// calculate and send slider result
|
||||
hitResult();
|
||||
return true;
|
||||
@@ -405,8 +465,7 @@ public class Slider implements HitObject {
|
||||
// holding slider...
|
||||
float[] c = curve.pointAt(getT(trackPosition, false));
|
||||
double distance = Math.hypot(c[0] - mouseX, c[1] - mouseY);
|
||||
int followCircleRadius = GameImage.SLIDER_FOLLOWCIRCLE.getImage().getWidth() / 2;
|
||||
if (((keyPressed || GameMod.RELAX.isActive()) && distance < followCircleRadius) || isAutoMod) {
|
||||
if (((keyPressed || GameMod.RELAX.isActive()) && distance < followRadius) || isAutoMod) {
|
||||
// mouse pressed and within follow circle
|
||||
followCircleActive = true;
|
||||
data.changeHealth(delta * GameData.HP_DRAIN_MULTIPLIER);
|
||||
@@ -487,4 +546,16 @@ public class Slider implements HitObject {
|
||||
return (floor % 2 == 0) ? t - floor : floor + 1 - t;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
sliderClickedInitial = false;
|
||||
sliderClickedFinal = false;
|
||||
followCircleActive = false;
|
||||
currentRepeats = 0;
|
||||
tickIndex = 0;
|
||||
ticksHit = 0;
|
||||
tickIntervals = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user