diff --git a/src/itdelatrisu/opsu/GameData.java b/src/itdelatrisu/opsu/GameData.java index 0d05bbdd..f4387987 100644 --- a/src/itdelatrisu/opsu/GameData.java +++ b/src/itdelatrisu/opsu/GameData.java @@ -1031,9 +1031,10 @@ public class GameData { * @param result the hit result (HIT_* constants) * @param x the x coordinate * @param y the y coordinate - * @param hitSound the object's hit sound + * @param hitObject the hit object + * @param repeat the current repeat number */ - public void sliderTickResult(int time, int result, float x, float y, OsuHitObject hitObject, int repeats) { + public void sliderTickResult(int time, int result, float x, float y, OsuHitObject hitObject, int repeat) { int hitValue = 0; switch (result) { case HIT_SLIDER30: @@ -1041,9 +1042,9 @@ public class GameData { incrementComboStreak(); changeHealth(1f); SoundController.playHitSound( - hitObject.getEdgeHitSoundType(repeats), - hitObject.getSampleSet(repeats), - hitObject.getAdditionSampleSet(repeats)); + hitObject.getEdgeHitSoundType(repeat), + hitObject.getSampleSet(repeat), + hitObject.getAdditionSampleSet(repeat)); break; case HIT_SLIDER10: hitValue = 10; @@ -1075,11 +1076,11 @@ public class GameData { * @param y the y coordinate * @param color the combo color * @param end true if this is the last hit object in the combo - * @param hitSound the object's hit sound - * @param isSpinner whether the hit object was a spinner + * @param hitObject the hit object + * @param repeat the current repeat number (for sliders, or 0 otherwise) */ public void hitResult(int time, int result, float x, float y, Color color, - boolean end, OsuHitObject hitObject, int repeats, boolean isSpinner) { + boolean end, OsuHitObject hitObject, int repeat) { int hitValue = 0; boolean perfectHit = false; switch (result) { @@ -1108,10 +1109,9 @@ public class GameData { } if (hitValue > 0) { SoundController.playHitSound( - hitObject.getEdgeHitSoundType(repeats), - hitObject.getSampleSet(repeats), - hitObject.getAdditionSampleSet(repeats)); - + hitObject.getEdgeHitSoundType(repeat), + hitObject.getSampleSet(repeat), + hitObject.getAdditionSampleSet(repeat)); /** * [SCORE FORMULA] * Score = Hit Value + Hit Value * (Combo * Difficulty * Mod) / 25 @@ -1149,7 +1149,7 @@ public class GameData { if (perfectHit && !Options.isPerfectHitBurstEnabled()) ; // hide perfect hit results else - hitResultList.add(new OsuHitObjectResult(time, result, x, y, color, isSpinner)); + hitResultList.add(new OsuHitObjectResult(time, result, x, y, color, hitObject.isSpinner())); } /** diff --git a/src/itdelatrisu/opsu/OsuHitObject.java b/src/itdelatrisu/opsu/OsuHitObject.java index e3e31fd9..d540d7c6 100644 --- a/src/itdelatrisu/opsu/OsuHitObject.java +++ b/src/itdelatrisu/opsu/OsuHitObject.java @@ -73,7 +73,7 @@ public class OsuHitObject { /** Hit sound addition (sampleSet, AdditionSampleSet, ?, ...). */ private byte[] addition; - + /** Slider curve type (SLIDER_* constant). */ private char sliderType; @@ -88,16 +88,12 @@ public class OsuHitObject { /** Spinner end time (in ms). */ private int endTime; - - /** Edge Hit sound type (SOUND_* bitmask). */ - private byte[] edgeHitSound; - - /** Edge Hit sound addition (sampleSet, AdditionSampleSet). */ - private byte[][] edgeAddition; - // additional v10+ parameters not implemented... - // addition -> sampl:add:cust:vol:hitsound - // edge_hitsound, edge_addition (sliders only) + /** Slider edge hit sound type (SOUND_* bitmask). */ + private byte[] edgeHitSound; + + /** Slider edge hit sound addition (sampleSet, AdditionSampleSet). */ + private byte[][] edgeAddition; /** Current index in combo color array. */ private int comboIndex; @@ -152,7 +148,7 @@ public class OsuHitObject { * x,y,time,type,hitSound,endTime,addition * 256,192,654,12,0,4029,0:0:0:0: * - * NOTE: 'addition' is optional, and defaults to "0:0:0:0:". + * NOTE: 'addition' -> sampl:add:cust:vol:hitsound (optional, defaults to "0:0:0:0:") */ String tokens[] = line.split(","); @@ -167,7 +163,7 @@ public class OsuHitObject { if ((type & OsuHitObject.TYPE_CIRCLE) > 0) { if (tokens.length > 5) { String[] additionTokens = tokens[5].split(":"); - addition = new byte[additionTokens.length]; + this.addition = new byte[additionTokens.length]; for (int j = 0; j < additionTokens.length; j++) this.addition[j] = Byte.parseByte(additionTokens[j]); } @@ -187,9 +183,8 @@ public class OsuHitObject { if (tokens.length > 8) { String[] edgeHitSoundTokens = tokens[8].split("\\|"); this.edgeHitSound = new byte[edgeHitSoundTokens.length]; - for (int j = 0; j < edgeHitSoundTokens.length; j++) { + for (int j = 0; j < edgeHitSoundTokens.length; j++) edgeHitSound[j] = Byte.parseByte(edgeHitSoundTokens[j]); - } } if (tokens.length > 9) { String[] edgeAdditionTokens = tokens[9].split("\\|"); @@ -206,7 +201,7 @@ public class OsuHitObject { if (index != -1) tokens[5] = tokens[5].substring(0, index); this.endTime = Integer.parseInt(tokens[5]); - /* 'addition' not implemented. */ + /* TODO: 'addition' not implemented. */ } } @@ -239,15 +234,16 @@ public class OsuHitObject { * @return the sound type (SOUND_* bitmask) */ public byte getHitSoundType() { return hitSound; } - + /** * Returns the edge hit sound type. * @return the sound type (SOUND_* bitmask) */ - public byte getEdgeHitSoundType(int i) { - if(edgeHitSound != null) - return edgeHitSound[i]; - else return hitSound; + public byte getEdgeHitSoundType(int i) { + if (edgeHitSound != null) + return edgeHitSound[i]; + else + return hitSound; } /** @@ -338,24 +334,28 @@ public class OsuHitObject { * Returns the number of extra skips on the combo colors. */ public int getComboSkip() { return (type >> TYPE_NEWCOMBO); } - + /** - * Returns the Sample Set at i. + * Returns the sample set at the given index. + * @param index the index (for sliders, ignored otherwise) + * @return the sample set, or 0 if none available */ - public byte getSampleSet(int i) { + public byte getSampleSet(int index) { if (edgeAddition != null) - return edgeAddition[i][0]; + return edgeAddition[index][0]; if (addition != null) return addition[0]; return 0; } /** - * Returns the Addition Sample Set at i. + * Returns the 'addition' sample set at the given index. + * @param index the index (for sliders, ignored otherwise) + * @return the sample set, or 0 if none available */ - public byte getAdditionSampleSet(int i) { + public byte getAdditionSampleSet(int index) { if (edgeAddition != null) - return edgeAddition[i][1]; + return edgeAddition[index][1]; if (addition != null) return addition[1]; return 0; diff --git a/src/itdelatrisu/opsu/OsuParser.java b/src/itdelatrisu/opsu/OsuParser.java index 3e1c450a..e0a85f43 100644 --- a/src/itdelatrisu/opsu/OsuParser.java +++ b/src/itdelatrisu/opsu/OsuParser.java @@ -565,7 +565,7 @@ public class OsuParser { // - new combo: get next combo index, reset combo number // - else: maintain combo index, increase combo number if (hitObject.isNewCombo() || first) { - int skip = (hitObject.isSpinner()?0:1) + hitObject.getComboSkip(); + int skip = (hitObject.isSpinner() ? 0 : 1) + hitObject.getComboSkip(); for (int i = 0; i < skip; i++) { comboIndex = (comboIndex + 1) % osu.combo.length; comboNumber = 1; diff --git a/src/itdelatrisu/opsu/audio/HitSound.java b/src/itdelatrisu/opsu/audio/HitSound.java index e451547e..ab2457d5 100644 --- a/src/itdelatrisu/opsu/audio/HitSound.java +++ b/src/itdelatrisu/opsu/audio/HitSound.java @@ -75,7 +75,7 @@ public enum HitSound implements SoundController.SoundComponent { /** Current default sample set. */ private static SampleSet currentDefaultSampleSet = SampleSet.NORMAL; - + /** The file name. */ private String filename; @@ -130,7 +130,7 @@ public enum HitSound implements SoundController.SoundComponent { /** * Sets the default sample set to use when playing hit sounds. - * @param sampleSet the sample set (0:auto, 1:normal, 2:soft, 3:drum) + * @param sampleType the sample set (0:auto, 1:normal, 2:soft, 3:drum) */ public static void setDefaultSampleSet(byte sampleType) { currentDefaultSampleSet = SampleSet.NORMAL; @@ -141,6 +141,7 @@ public enum HitSound implements SoundController.SoundComponent { } } } + /** * Sets the sample set to use when playing hit sounds. * @param sampleType the sample set (0:auto, 1:normal, 2:soft, 3:drum) @@ -154,6 +155,4 @@ public enum HitSound implements SoundController.SoundComponent { } } } - - } diff --git a/src/itdelatrisu/opsu/audio/SoundController.java b/src/itdelatrisu/opsu/audio/SoundController.java index 9401f084..d4dcb2f4 100644 --- a/src/itdelatrisu/opsu/audio/SoundController.java +++ b/src/itdelatrisu/opsu/audio/SoundController.java @@ -96,9 +96,9 @@ public class SoundController { audioIn = decodedAudioIn; } DataLine.Info info = new DataLine.Info(Clip.class, format); - if(AudioSystem.isLineSupported(info)){ + if (AudioSystem.isLineSupported(info)) { return new MultiClip(ref, audioIn); - }else{ + } else { // try to find closest matching line Clip clip = AudioSystem.getClip(); AudioFormat[] formats = ((DataLine.Info) clip.getLineInfo()).getFormats(); @@ -251,6 +251,8 @@ public class SoundController { /** * Plays hit sound(s) using an OsuHitObject bitmask. * @param hitSound the hit sound (bitmask) + * @param sampleSet the sample set + * @param additionSampleSet the 'addition' sample set */ public static void playHitSound(byte hitSound, byte sampleSet, byte additionSampleSet) { if (hitSound < 0) @@ -263,7 +265,7 @@ public class SoundController { // play all sounds HitSound.setSampleSet(sampleSet); playClip(HitSound.NORMAL.getClip(), volume); - + HitSound.setSampleSet(additionSampleSet); if ((hitSound & OsuHitObject.SOUND_WHISTLE) > 0) playClip(HitSound.WHISTLE.getClip(), volume); diff --git a/src/itdelatrisu/opsu/objects/Circle.java b/src/itdelatrisu/opsu/objects/Circle.java index ed8dd179..fb8533a4 100644 --- a/src/itdelatrisu/opsu/objects/Circle.java +++ b/src/itdelatrisu/opsu/objects/Circle.java @@ -141,7 +141,7 @@ public class Circle implements HitObject { data.hitResult( hitObject.getTime(), result, hitObject.getX(), hitObject.getY(), - color, comboEnd, hitObject, 0, false + color, comboEnd, hitObject, 0 ); return true; } @@ -160,17 +160,17 @@ public class Circle implements HitObject { if (overlap || trackPosition > time + hitResultOffset[GameData.HIT_50]) { if (isAutoMod) // "auto" mod: catch any missed notes due to lag - data.hitResult(time, GameData.HIT_300, x, y, color, comboEnd, hitObject, 0, false); + data.hitResult(time, GameData.HIT_300, x, y, color, comboEnd, hitObject, 0); else // no more points can be scored, so send a miss - data.hitResult(time, GameData.HIT_MISS, x, y, null, comboEnd, hitObject, 0, false); + data.hitResult(time, GameData.HIT_MISS, x, y, null, comboEnd, hitObject, 0); return true; } // "auto" mod: send a perfect hit result else if (isAutoMod) { if (Math.abs(trackPosition - time) < hitResultOffset[GameData.HIT_300]) { - data.hitResult(time, GameData.HIT_300, x, y, color, comboEnd, hitObject, 0, false); + data.hitResult(time, GameData.HIT_300, x, y, color, comboEnd, hitObject, 0); return true; } } diff --git a/src/itdelatrisu/opsu/objects/Slider.java b/src/itdelatrisu/opsu/objects/Slider.java index 6a233058..c80d6862 100644 --- a/src/itdelatrisu/opsu/objects/Slider.java +++ b/src/itdelatrisu/opsu/objects/Slider.java @@ -253,14 +253,10 @@ public class Slider implements HitObject { if (currentRepeats % 2 == 0) { // last circle float[] lastPos = curve.pointAt(1); data.hitResult(hitObject.getTime() + (int) sliderTimeTotal, result, - lastPos[0],lastPos[1], color, comboEnd, - hitObject, currentRepeats+1 - , false); + lastPos[0], lastPos[1], color, comboEnd, hitObject, currentRepeats + 1); } else { // first circle data.hitResult(hitObject.getTime() + (int) sliderTimeTotal, result, - hitObject.getX(), hitObject.getY(), color, comboEnd, - hitObject, currentRepeats+1 - , false); + hitObject.getX(), hitObject.getY(), color, comboEnd, hitObject, currentRepeats + 1); } return result; @@ -290,9 +286,7 @@ public class Slider implements HitObject { data.addHitError(hitObject.getTime(), x,y,trackPosition - hitObject.getTime()); sliderClickedInitial = true; data.sliderTickResult(hitObject.getTime(), result, - hitObject.getX(), hitObject.getY(), - hitObject, currentRepeats - ); + hitObject.getX(), hitObject.getY(), hitObject, currentRepeats); return true; } } diff --git a/src/itdelatrisu/opsu/objects/Spinner.java b/src/itdelatrisu/opsu/objects/Spinner.java index 64c7ebd8..a5605ab9 100644 --- a/src/itdelatrisu/opsu/objects/Spinner.java +++ b/src/itdelatrisu/opsu/objects/Spinner.java @@ -164,7 +164,7 @@ public class Spinner implements HitObject { result = GameData.HIT_MISS; data.hitResult(hitObject.getEndTime(), result, width / 2, height / 2, - Color.transparent, true, hitObject, 0, true); + Color.transparent, true, hitObject, 0); return result; }