Made sliders very slightly easier.

Sliders no longer need to be held to the end, but near it (within a 300-hit offset) for perfect hit.

Also made a slight improvement to SongMenu.setFocus().

Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
Jeffrey Han 2015-02-21 17:12:18 -05:00
parent 00b98e07d6
commit 163e72d423
2 changed files with 31 additions and 23 deletions

View File

@ -70,8 +70,8 @@ public class Slider implements HitObject {
/** The time duration of the slider including repeats, in milliseconds. */
private float sliderTimeTotal = 0f;
/** Whether or not the result of the initial hit circle has been processed. */
private boolean sliderClicked = false;
/** Whether or not the result of the initial/final hit circles have been processed. */
private boolean sliderClickedInitial = false, sliderClickedFinal = false;
/** Whether or not to show the follow circle. */
private boolean followCircleActive = false;
@ -180,7 +180,7 @@ public class Slider implements HitObject {
// start circle
hitCircle.drawCentered(x, y, color);
hitCircleOverlay.drawCentered(x, y, Utils.COLOR_WHITE_FADE);
if (sliderClicked)
if (sliderClickedInitial)
; // don't draw current combo number if already clicked
else
data.drawSymbolNumber(hitObject.getComboNumber(), x, y,
@ -266,7 +266,7 @@ public class Slider implements HitObject {
@Override
public boolean mousePressed(int x, int y) {
if (sliderClicked) // first circle already processed
if (sliderClickedInitial) // first circle already processed
return false;
double distance = Math.hypot(hitObject.getX() - x, hitObject.getY() - y);
@ -286,7 +286,7 @@ public class Slider implements HitObject {
if (result > -1) {
data.addHitError(hitObject.getTime(), x,y,trackPosition - hitObject.getTime());
sliderClicked = true;
sliderClickedInitial = true;
data.sliderTickResult(hitObject.getTime(), result,
hitObject.getX(), hitObject.getY(), hitObject.getHitSoundType());
return true;
@ -323,12 +323,12 @@ public class Slider implements HitObject {
int lastIndex = hitObject.getSliderX().length - 1;
boolean isAutoMod = GameMod.AUTO.isActive();
if (!sliderClicked) {
if (!sliderClickedInitial) {
int time = hitObject.getTime();
// start circle time passed
if (trackPosition > time + hitResultOffset[GameData.HIT_50]) {
sliderClicked = true;
sliderClickedInitial = true;
if (isAutoMod) { // "auto" mod: catch any missed notes due to lag
ticksHit++;
data.sliderTickResult(time, GameData.HIT_SLIDER30,
@ -342,7 +342,7 @@ public class Slider implements HitObject {
else if (isAutoMod) {
if (Math.abs(trackPosition - time) < hitResultOffset[GameData.HIT_300]) {
ticksHit++;
sliderClicked = true;
sliderClickedInitial = true;
data.sliderTickResult(time, GameData.HIT_SLIDER30,
hitObject.getX(), hitObject.getY(), hitSound);
}
@ -353,19 +353,23 @@ public class Slider implements HitObject {
if (overlap || trackPosition > hitObject.getTime() + sliderTimeTotal) {
tickIntervals++;
// "auto" mod: send a perfect hit result
if (isAutoMod)
ticksHit++;
// check if cursor pressed and within end circle
else if (Utils.isGameKeyPressed()) {
if (Utils.isGameKeyPressed()) {
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)
ticksHit++;
sliderClickedFinal = true;
}
// final circle hit
if (sliderClickedFinal)
ticksHit++;
// "auto" mod: always send a perfect hit result
if (isAutoMod)
ticksHit = tickIntervals;
// calculate and send slider result
hitResult();
return true;
@ -421,6 +425,10 @@ public class Slider implements HitObject {
data.sliderTickResult(trackPosition, GameData.HIT_SLIDER10,
c[0], c[1], (byte) -1);
}
// held near end of slider
if (!sliderClickedFinal && trackPosition > hitObject.getTime() + sliderTimeTotal - hitResultOffset[GameData.HIT_300])
sliderClickedFinal = true;
} else {
followCircleActive = false;

View File

@ -1106,11 +1106,11 @@ public class SongMenu extends BasicGameState {
/**
* Sets a new focus node.
* @param node the base node; it will be expanded if it isn't already
* @param pos the OsuFile element to focus; if out of bounds, it will be randomly chosen
* @param flag if true, startNode will be set to the first node in the group
* @param osuFileIndex the OsuFile element to focus; if out of bounds, it will be randomly chosen
* @param changeStartNode if true, startNode will be set to the first node in the group
* @return the old focus node
*/
public OsuGroupNode setFocus(OsuGroupNode node, int pos, boolean flag) {
public OsuGroupNode setFocus(OsuGroupNode node, int osuFileIndex, boolean changeStartNode) {
if (node == null)
return null;
@ -1126,18 +1126,18 @@ public class SongMenu extends BasicGameState {
// if start node was previously expanded, move it
if (startNode != null && startNode.index == expandedIndex)
startNode = node;
startNode = OsuGroupList.get().getBaseNode(startNode.index);
}
// check pos bounds
// check osuFileIndex bounds
int length = node.osuFiles.size();
if (pos < 0 || pos > length - 1) // set a random pos
pos = (int) (Math.random() * length);
if (osuFileIndex < 0 || osuFileIndex > length - 1) // set a random index
osuFileIndex = (int) (Math.random() * length);
// change the focus node
if (flag || (startNode.index == 0 && startNode.osuFileIndex == -1 && startNode.prev == null))
if (changeStartNode || (startNode.index == 0 && startNode.osuFileIndex == -1 && startNode.prev == null))
startNode = node;
focusNode = OsuGroupList.get().getNode(node, pos);
focusNode = OsuGroupList.get().getNode(node, osuFileIndex);
OsuFile osu = focusNode.osuFiles.get(focusNode.osuFileIndex);
MusicController.play(osu, true);
Utils.loadGlyphs(osu);