Mod difficulty multipliers are now reflected in displayed song info.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
2efb18e225
commit
07075c094b
|
@ -176,6 +176,9 @@ public enum GameMod {
|
||||||
/** The last calculated track speed multiplier, or -1f if it must be recalculated. */
|
/** The last calculated track speed multiplier, or -1f if it must be recalculated. */
|
||||||
private static float speedMultiplier = -1f;
|
private static float speedMultiplier = -1f;
|
||||||
|
|
||||||
|
/** The last calculated difficulty multiplier, or -1f if it must be recalculated. */
|
||||||
|
private static float difficultyMultiplier = -1f;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the game mods.
|
* Initializes the game mods.
|
||||||
* @param width the container width
|
* @param width the container width
|
||||||
|
@ -201,7 +204,7 @@ public enum GameMod {
|
||||||
mod.active = false;
|
mod.active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
scoreMultiplier = speedMultiplier = -1f;
|
scoreMultiplier = speedMultiplier = difficultyMultiplier = -1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -224,16 +227,31 @@ public enum GameMod {
|
||||||
*/
|
*/
|
||||||
public static float getSpeedMultiplier() {
|
public static float getSpeedMultiplier() {
|
||||||
if (speedMultiplier < 0f) {
|
if (speedMultiplier < 0f) {
|
||||||
float multiplier = 1f;
|
|
||||||
if (DOUBLE_TIME.isActive())
|
if (DOUBLE_TIME.isActive())
|
||||||
multiplier = 1.5f;
|
speedMultiplier = 1.5f;
|
||||||
else if (HALF_TIME.isActive())
|
else if (HALF_TIME.isActive())
|
||||||
multiplier = 0.75f;
|
speedMultiplier = 0.75f;
|
||||||
speedMultiplier = multiplier;
|
else
|
||||||
|
speedMultiplier = 1f;
|
||||||
}
|
}
|
||||||
return speedMultiplier;
|
return speedMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current difficulty multiplier from all active mods.
|
||||||
|
*/
|
||||||
|
public static float getDifficultyMultiplier() {
|
||||||
|
if (difficultyMultiplier < 0f) {
|
||||||
|
if (HARD_ROCK.isActive())
|
||||||
|
difficultyMultiplier = 1.4f;
|
||||||
|
else if (EASY.isActive())
|
||||||
|
difficultyMultiplier = 0.5f;
|
||||||
|
else
|
||||||
|
difficultyMultiplier = 1f;
|
||||||
|
}
|
||||||
|
return difficultyMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current game mod state (bitwise OR of active mods).
|
* Returns the current game mod state (bitwise OR of active mods).
|
||||||
*/
|
*/
|
||||||
|
@ -251,7 +269,7 @@ public enum GameMod {
|
||||||
* @param state the state (bitwise OR of active mods)
|
* @param state the state (bitwise OR of active mods)
|
||||||
*/
|
*/
|
||||||
public static void loadModState(int state) {
|
public static void loadModState(int state) {
|
||||||
scoreMultiplier = speedMultiplier = -1f;
|
scoreMultiplier = speedMultiplier = difficultyMultiplier = -1f;
|
||||||
for (GameMod mod : GameMod.values())
|
for (GameMod mod : GameMod.values())
|
||||||
mod.active = ((state & mod.getBit()) > 0);
|
mod.active = ((state & mod.getBit()) > 0);
|
||||||
}
|
}
|
||||||
|
@ -371,7 +389,7 @@ public enum GameMod {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
active = !active;
|
active = !active;
|
||||||
scoreMultiplier = speedMultiplier = -1f;
|
scoreMultiplier = speedMultiplier = difficultyMultiplier = -1f;
|
||||||
|
|
||||||
if (checkInverse) {
|
if (checkInverse) {
|
||||||
if (AUTO.isActive()) {
|
if (AUTO.isActive()) {
|
||||||
|
|
|
@ -122,10 +122,10 @@ public class OsuGroupNode {
|
||||||
long endTime = (long) (osu.endTime / speedModifier);
|
long endTime = (long) (osu.endTime / speedModifier);
|
||||||
int bpmMin = (int) (osu.bpmMin * speedModifier);
|
int bpmMin = (int) (osu.bpmMin * speedModifier);
|
||||||
int bpmMax = (int) (osu.bpmMax * speedModifier);
|
int bpmMax = (int) (osu.bpmMax * speedModifier);
|
||||||
|
float multiplier = GameMod.getDifficultyMultiplier();
|
||||||
String[] info = new String[5];
|
String[] info = new String[5];
|
||||||
info[0] = osu.toString();
|
info[0] = osu.toString();
|
||||||
info[1] = String.format("Mapped by %s",
|
info[1] = String.format("Mapped by %s", osu.creator);
|
||||||
osu.creator);
|
|
||||||
info[2] = String.format("Length: %d:%02d BPM: %s Objects: %d",
|
info[2] = String.format("Length: %d:%02d BPM: %s Objects: %d",
|
||||||
TimeUnit.MILLISECONDS.toMinutes(endTime),
|
TimeUnit.MILLISECONDS.toMinutes(endTime),
|
||||||
TimeUnit.MILLISECONDS.toSeconds(endTime) -
|
TimeUnit.MILLISECONDS.toSeconds(endTime) -
|
||||||
|
@ -135,7 +135,10 @@ public class OsuGroupNode {
|
||||||
info[3] = String.format("Circles: %d Sliders: %d Spinners: %d",
|
info[3] = String.format("Circles: %d Sliders: %d Spinners: %d",
|
||||||
osu.hitObjectCircle, osu.hitObjectSlider, osu.hitObjectSpinner);
|
osu.hitObjectCircle, osu.hitObjectSlider, osu.hitObjectSpinner);
|
||||||
info[4] = String.format("CS:%.1f HP:%.1f AR:%.1f OD:%.1f",
|
info[4] = String.format("CS:%.1f HP:%.1f AR:%.1f OD:%.1f",
|
||||||
osu.circleSize, osu.HPDrainRate, osu.approachRate, osu.overallDifficulty);
|
Math.min(osu.circleSize * multiplier, 10f),
|
||||||
|
Math.min(osu.HPDrainRate * multiplier, 10f),
|
||||||
|
Math.min(osu.approachRate * multiplier, 10f),
|
||||||
|
Math.min(osu.overallDifficulty * multiplier, 10f));
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1358,26 +1358,11 @@ public class Game extends BasicGameState {
|
||||||
*/
|
*/
|
||||||
private void setMapModifiers() {
|
private void setMapModifiers() {
|
||||||
// map-based properties, re-initialized each game
|
// map-based properties, re-initialized each game
|
||||||
float circleSize = osu.circleSize;
|
float multiplier = GameMod.getDifficultyMultiplier();
|
||||||
float approachRate = osu.approachRate;
|
float circleSize = Math.min(osu.circleSize * multiplier, 10f);
|
||||||
float overallDifficulty = osu.overallDifficulty;
|
float approachRate = Math.min(osu.approachRate * multiplier, 10f);
|
||||||
float HPDrainRate = osu.HPDrainRate;
|
float overallDifficulty = Math.min(osu.overallDifficulty * multiplier, 10f);
|
||||||
|
float HPDrainRate = Math.min(osu.HPDrainRate * multiplier, 10f);
|
||||||
// "Hard Rock" modifiers
|
|
||||||
if (GameMod.HARD_ROCK.isActive()) {
|
|
||||||
circleSize = Math.min(circleSize * 1.4f, 10);
|
|
||||||
approachRate = Math.min(approachRate * 1.4f, 10);
|
|
||||||
overallDifficulty = Math.min(overallDifficulty * 1.4f, 10);
|
|
||||||
HPDrainRate = Math.min(HPDrainRate * 1.4f, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// "Easy" modifiers
|
|
||||||
else if (GameMod.EASY.isActive()) {
|
|
||||||
circleSize /= 2f;
|
|
||||||
approachRate /= 2f;
|
|
||||||
overallDifficulty /= 2f;
|
|
||||||
HPDrainRate /= 2f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fixed difficulty overrides
|
// fixed difficulty overrides
|
||||||
if (Options.getFixedCS() > 0f)
|
if (Options.getFixedCS() > 0f)
|
||||||
|
|
|
@ -356,7 +356,10 @@ public class SongMenu extends BasicGameState {
|
||||||
headerTextY += Utils.FONT_BOLD.getLineHeight() - 4;
|
headerTextY += Utils.FONT_BOLD.getLineHeight() - 4;
|
||||||
Utils.FONT_DEFAULT.drawString(marginX, headerTextY, songInfo[3], Color.white);
|
Utils.FONT_DEFAULT.drawString(marginX, headerTextY, songInfo[3], Color.white);
|
||||||
headerTextY += Utils.FONT_DEFAULT.getLineHeight() - 4;
|
headerTextY += Utils.FONT_DEFAULT.getLineHeight() - 4;
|
||||||
Utils.FONT_SMALL.drawString(marginX, headerTextY, songInfo[4], Color.white);
|
float multiplier = GameMod.getDifficultyMultiplier();
|
||||||
|
Color color4 = (multiplier == 1f) ? Color.white :
|
||||||
|
(multiplier > 1f) ? Utils.COLOR_RED_HIGHLIGHT : Utils.COLOR_BLUE_HIGHLIGHT;
|
||||||
|
Utils.FONT_SMALL.drawString(marginX, headerTextY, songInfo[4], color4);
|
||||||
}
|
}
|
||||||
|
|
||||||
// score buttons
|
// score buttons
|
||||||
|
|
Loading…
Reference in New Issue
Block a user