diff --git a/res/slidergradient.png b/res/slidergradient.png index 1337613a..9e333c00 100644 Binary files a/res/slidergradient.png and b/res/slidergradient.png differ diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index dde6369e..ac18af23 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -746,6 +746,21 @@ public enum GameImage { break; } } + if (list.isEmpty()) { + // look for image without 0-1 etc + String name = getImageFileName(filename, dir, type, true); + if (name != null) { + try { + Image img = new Image(name); + if (suffix.equals(HD_SUFFIX)) + img = img.getScaledCopy(0.5f); + list.add(img); + } catch (SlickException e) { + ErrorHandler.error(String.format("Failed to set image '%s'.", name), null, false); + break; + } + } + } if (!list.isEmpty()) return list.toArray(new Image[list.size()]); } diff --git a/src/itdelatrisu/opsu/Options.java b/src/itdelatrisu/opsu/Options.java index 335a706e..66b50f03 100644 --- a/src/itdelatrisu/opsu/Options.java +++ b/src/itdelatrisu/opsu/Options.java @@ -433,6 +433,7 @@ public class Options { container.setMusicVolume(getMasterVolume() * getMusicVolume()); } }, + IGNORE_SAMPLE_VOLUME ("Ignore sample volume", "IgnoreBMSample", "Ignore hitsound volume set by beatmap", true), EFFECT_VOLUME ("Effect Volume", "VolumeEffect", "Volume of menu and game sounds.", 70, 0, 100), HITSOUND_VOLUME ("Hit Sound Volume", "VolumeHitSound", "Volume of hit sounds.", 30, 0, 100), MUSIC_OFFSET ("Music Offset", "Offset", "Adjust this value if hit objects are out of sync.", -75, -500, 500) { @@ -1164,6 +1165,12 @@ public class Options { */ public static float getHitSoundVolume() { return GameOption.HITSOUND_VOLUME.getIntegerValue() / 100f; } + /** + * Returns the default hit sound volume. + * @return the hit sound volume [0, 1] + */ + public static boolean ignoreBeatmapSampleVolume() { return GameOption.IGNORE_SAMPLE_VOLUME.bool; } + /** * Returns the music offset time. * @return the offset (in milliseconds) diff --git a/src/itdelatrisu/opsu/audio/SoundController.java b/src/itdelatrisu/opsu/audio/SoundController.java index 7f42f144..7d354d81 100644 --- a/src/itdelatrisu/opsu/audio/SoundController.java +++ b/src/itdelatrisu/opsu/audio/SoundController.java @@ -291,6 +291,10 @@ public class SoundController { if (hitSound < 0) return; + if (Options.ignoreBeatmapSampleVolume()) { + sampleVolumeMultiplier = 1f; + } + float volume = Options.getHitSoundVolume() * sampleVolumeMultiplier * Options.getMasterVolume(); if (volume == 0f) return; diff --git a/src/itdelatrisu/opsu/objects/Slider.java b/src/itdelatrisu/opsu/objects/Slider.java index d0dea977..4df9a60d 100644 --- a/src/itdelatrisu/opsu/objects/Slider.java +++ b/src/itdelatrisu/opsu/objects/Slider.java @@ -321,7 +321,11 @@ public class Slider extends GameObject { Image sliderBallFrame = sliderBallImages[(int) (t * sliderTime * 60 / 1000) % sliderBallImages.length]; float angle = (float) (Math.atan2(c2.y - c.y, c2.x - c.x) * 180 / Math.PI); sliderBallFrame.setRotation(angle); - sliderBallFrame.drawCentered(c.x, c.y); + if (Options.getSkin().isAllowSliderBallTint()) { + sliderBallFrame.drawCentered(c.x, c.y, color); + } else { + sliderBallFrame.drawCentered(c.x, c.y); + } // follow circle if (followCircleActive) { diff --git a/src/itdelatrisu/opsu/states/OptionsMenu.java b/src/itdelatrisu/opsu/states/OptionsMenu.java index 8e9818fd..c8333a52 100644 --- a/src/itdelatrisu/opsu/states/OptionsMenu.java +++ b/src/itdelatrisu/opsu/states/OptionsMenu.java @@ -70,6 +70,7 @@ public class OptionsMenu extends BasicGameState { GameOption.MUSIC_VOLUME, GameOption.EFFECT_VOLUME, GameOption.HITSOUND_VOLUME, + GameOption.IGNORE_SAMPLE_VOLUME, GameOption.MUSIC_OFFSET, GameOption.DISABLE_SOUNDS, GameOption.ENABLE_THEME_SONG