diff --git a/src/ru/nsu/ccfit/zuev/osu/game/GameScene.java b/src/ru/nsu/ccfit/zuev/osu/game/GameScene.java index 56e1eaaf8..c5a01c003 100644 --- a/src/ru/nsu/ccfit/zuev/osu/game/GameScene.java +++ b/src/ru/nsu/ccfit/zuev/osu/game/GameScene.java @@ -821,6 +821,9 @@ public void onUpdate(final float pSecondsElapsed) { stat.setMaxObjectsCount(lastTrack.getTotalHitObjectCount()); stat.setMaxHighestCombo(lastTrack.getMaxCombo()); + stat.setBeatmapCS(beatmapData.difficulty.cs); + stat.setBeatmapOD(beatmapData.difficulty.od); + stat.setCustomAR(ModMenu.getInstance().getCustomAR()); stat.setCustomOD(ModMenu.getInstance().getCustomOD()); stat.setCustomCS(ModMenu.getInstance().getCustomCS()); diff --git a/src/ru/nsu/ccfit/zuev/osu/menu/ModMenu.java b/src/ru/nsu/ccfit/zuev/osu/menu/ModMenu.java index e6596f5e0..8a8d4434c 100644 --- a/src/ru/nsu/ccfit/zuev/osu/menu/ModMenu.java +++ b/src/ru/nsu/ccfit/zuev/osu/menu/ModMenu.java @@ -390,6 +390,15 @@ private void changeMultiplierText() { if (changeSpeed != 1.0f){ mult *= StatisticV2.getSpeedChangeScoreMultiplier(getSpeed(), mod); } + if (selectedTrack != null) { + if (isCustomCS()) { + mult *= StatisticV2.getCustomCSScoreMultiplier(selectedTrack.getCircleSize(), customCS); + } + + if (isCustomOD()) { + mult *= StatisticV2.getCustomODScoreMultiplier(selectedTrack.getOverallDifficulty(), customOD); + } + } multiplierText.setText(StringTable.format(R.string.menu_mod_multiplier, mult)); diff --git a/src/ru/nsu/ccfit/zuev/osu/scoring/StatisticV2.java b/src/ru/nsu/ccfit/zuev/osu/scoring/StatisticV2.java index 37f87a111..2742492b1 100644 --- a/src/ru/nsu/ccfit/zuev/osu/scoring/StatisticV2.java +++ b/src/ru/nsu/ccfit/zuev/osu/scoring/StatisticV2.java @@ -58,6 +58,9 @@ public class StatisticV2 implements Serializable { private double negativeHitOffsetSum; private double unstableRate; + private Float beatmapCS; + private Float beatmapOD; + private Float customAR; private Float customOD; private Float customCS; @@ -733,6 +736,14 @@ public void setCustomCS(@Nullable Float customCS) { this.customCS = customCS; } + public void setBeatmapCS(float beatmapCS) { + this.beatmapCS = beatmapCS; + } + + public void setBeatmapOD(float beatmapOD) { + this.beatmapOD = beatmapOD; + } + public void setFLFollowDelay(float delay) { flFollowDelay = delay; @@ -772,15 +783,15 @@ public void addHitOffset(double accuracy) { ); } } - + public double getNegativeHitError() { return negativeTotalOffsetSum == 0 ? 0 : negativeHitOffsetSum / negativeTotalOffsetSum; } - + public double getPositiveHitError() { return positiveTotalOffsetSum == 0 ? 0 : positiveHitOffsetSum / positiveTotalOffsetSum; } - + public float getSpeed(){ float speed = changeSpeed; if (mod.contains(GameMod.MOD_DOUBLETIME) || mod.contains(GameMod.MOD_NIGHTCORE)){ @@ -909,9 +920,12 @@ private void computeModScoreMultiplier() { modScoreMultiplier *= m.scoreMultiplier; } - if (isLegacySC) { - // The legacy SC mod has a 1.06 multiplier. - modScoreMultiplier *= 1.06f; + if (isCustomCS() && beatmapCS != null) { + modScoreMultiplier *= getCustomCSScoreMultiplier(beatmapCS, customCS); + } + + if (isCustomOD() && beatmapOD != null) { + modScoreMultiplier *= getCustomODScoreMultiplier(beatmapOD, customOD); } if (changeSpeed != 1f) { @@ -919,6 +933,32 @@ private void computeModScoreMultiplier() { } } + public static float getCustomCSScoreMultiplier(float beatmapCS, float customCS) { + float multiplier = 1; + float diff = Math.abs(beatmapCS - customCS); + + if (customCS >= beatmapCS) { + multiplier += 0.0075f * (float) Math.pow(diff, 1.5); + } else { + multiplier -= 0.01f * (float) Math.pow(diff, 1.5); + } + + return multiplier; + } + + public static float getCustomODScoreMultiplier(float beatmapOD, float customOD) { + float multiplier = 1; + float diff = Math.abs(beatmapOD - customOD); + + if (customOD >= beatmapOD) { + multiplier += 0.005f * (float) Math.pow(diff, 1.3); + } else { + multiplier -= 0.005f * (float) Math.pow(diff, 1.35); + } + + return multiplier; + } + /** * Determines if the score has the old SC mod enabled, this will be replaced with a custom CS when replaying. */