Display time since achieving recent scores.
- Added history icon by Google: https://www.iconfinder.com/icons/326655/ - Draw history icon and elapsed time next to score buttons if they were achieved within 24 hours. Conforming to osu! behavior, the elapsed time is not updated in real-time. Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
0165abde56
commit
f0858f657b
BIN
res/history.png
Normal file
BIN
res/history.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -465,6 +465,12 @@ public enum GameImage {
|
|||
return img.getScaledCopy((h * 0.15f) / img.getHeight());
|
||||
}
|
||||
},
|
||||
HISTORY ("history", "png", false, false) {
|
||||
@Override
|
||||
protected Image process_sub(Image img, int w, int h) {
|
||||
return img.getScaledCopy((h * 0.0278f) / img.getHeight());
|
||||
}
|
||||
},
|
||||
REPOSITORY ("repo", "png", false, false) {
|
||||
@Override
|
||||
protected Image process_sub(Image img, int w, int h) {
|
||||
|
|
|
@ -59,6 +59,9 @@ public class ScoreData implements Comparable<ScoreData> {
|
|||
/** Game mod bitmask. */
|
||||
public int mods;
|
||||
|
||||
/** Time since the score was achieved. */
|
||||
private String timeSince;
|
||||
|
||||
/** The grade. */
|
||||
private Grade grade;
|
||||
|
||||
|
@ -191,6 +194,26 @@ public class ScoreData implements Comparable<ScoreData> {
|
|||
return grade;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time since achieving the score, or null if over 24 hours.
|
||||
* This value will not change after the first call.
|
||||
* @return a string: {number}{s|m|h}
|
||||
*/
|
||||
public String getTimeSince() {
|
||||
if (timeSince == null) {
|
||||
long seconds = (System.currentTimeMillis() / 1000L) - timestamp;
|
||||
if (seconds < 60)
|
||||
timeSince = String.format("%ds", seconds);
|
||||
else if (seconds < 3600)
|
||||
timeSince = String.format("%dm", seconds / 60L);
|
||||
else if (seconds < 86400)
|
||||
timeSince = String.format("%dh", seconds / 3600L);
|
||||
else
|
||||
timeSince = "";
|
||||
}
|
||||
return (timeSince.isEmpty()) ? null : timeSince;
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the score data as a rectangular button.
|
||||
* @param g the graphics context
|
||||
|
@ -201,8 +224,10 @@ public class ScoreData implements Comparable<ScoreData> {
|
|||
*/
|
||||
public void draw(Graphics g, int index, int rank, long prevScore, boolean focus) {
|
||||
Image img = getGrade().getMenuImage();
|
||||
float textX = baseX + buttonWidth * 0.24f;
|
||||
float edgeX = baseX + buttonWidth * 0.98f;
|
||||
float y = baseY + index * (buttonOffset);
|
||||
float textX = baseX + buttonWidth * 0.24f, edgeX = baseX + buttonWidth * 0.98f;
|
||||
float midY = y + buttonHeight / 2f;
|
||||
float marginY = Utils.FONT_DEFAULT.getLineHeight() * 0.01f;
|
||||
|
||||
// rectangle outline
|
||||
|
@ -219,7 +244,7 @@ public class ScoreData implements Comparable<ScoreData> {
|
|||
}
|
||||
|
||||
// grade image
|
||||
img.drawCentered(baseX + buttonWidth * 0.15f, y + buttonHeight / 2f);
|
||||
img.drawCentered(baseX + buttonWidth * 0.15f, midY);
|
||||
|
||||
// score
|
||||
float textOffset = (buttonHeight - Utils.FONT_MEDIUM.getLineHeight() - Utils.FONT_SMALL.getLineHeight()) / 2f;
|
||||
|
@ -269,6 +294,17 @@ public class ScoreData implements Comparable<ScoreData> {
|
|||
y + marginY + Utils.FONT_DEFAULT.getLineHeight() * 2,
|
||||
diff, Color.white
|
||||
);
|
||||
|
||||
// time since
|
||||
if (getTimeSince() != null) {
|
||||
Image clock = GameImage.HISTORY.getImage();
|
||||
clock.drawCentered(baseX + buttonWidth * 1.02f + clock.getWidth() / 2f, midY);
|
||||
Utils.FONT_DEFAULT.drawString(
|
||||
baseX + buttonWidth * 1.03f + clock.getWidth(),
|
||||
midY - Utils.FONT_DEFAULT.getLineHeight() / 2f,
|
||||
getTimeSince(), Color.white
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -280,7 +280,7 @@ public class SongMenu extends BasicGameState {
|
|||
for (int i = 0; i < MAX_SONG_BUTTONS && node != null; i++, node = node.next) {
|
||||
// draw the node
|
||||
float offset = (i == hoverIndex) ? hoverOffset : 0f;
|
||||
ScoreData[] scores = getScoreDataForNode(node);
|
||||
ScoreData[] scores = getScoreDataForNode(node, false);
|
||||
node.draw(
|
||||
buttonX - offset, buttonY + (i*buttonOffset),
|
||||
(scores == null) ? Grade.NULL : scores[0].getGrade(),
|
||||
|
@ -797,7 +797,7 @@ public class SongMenu extends BasicGameState {
|
|||
// reload scores
|
||||
if (focusNode != null) {
|
||||
scoreMap = ScoreDB.getMapSetScores(focusNode.osuFiles.get(focusNode.osuFileIndex));
|
||||
focusScores = getScoreDataForNode(focusNode);
|
||||
focusScores = getScoreDataForNode(focusNode, true);
|
||||
}
|
||||
|
||||
resetGame = false;
|
||||
|
@ -892,7 +892,7 @@ public class SongMenu extends BasicGameState {
|
|||
|
||||
// load scores
|
||||
scoreMap = ScoreDB.getMapSetScores(osu);
|
||||
focusScores = getScoreDataForNode(focusNode);
|
||||
focusScores = getScoreDataForNode(focusNode, true);
|
||||
startScore = 0;
|
||||
|
||||
// check startNode bounds
|
||||
|
@ -936,9 +936,10 @@ public class SongMenu extends BasicGameState {
|
|||
* Returns all the score data for an OsuGroupNode from scoreMap.
|
||||
* If no score data is available for the node, return null.
|
||||
* @param node the OsuGroupNode
|
||||
* @param setTimeSince whether or not to set the "time since" field for the scores
|
||||
* @return the ScoreData array
|
||||
*/
|
||||
private ScoreData[] getScoreDataForNode(OsuGroupNode node) {
|
||||
private ScoreData[] getScoreDataForNode(OsuGroupNode node, boolean setTimeSince) {
|
||||
if (scoreMap == null || scoreMap.isEmpty() || node.osuFileIndex == -1) // node not expanded
|
||||
return null;
|
||||
|
||||
|
@ -950,9 +951,13 @@ public class SongMenu extends BasicGameState {
|
|||
ScoreData s = scores[0];
|
||||
if (osu.beatmapID == s.MID && osu.beatmapSetID == s.MSID &&
|
||||
osu.title.equals(s.title) && osu.artist.equals(s.artist) &&
|
||||
osu.creator.equals(s.creator))
|
||||
osu.creator.equals(s.creator)) {
|
||||
if (setTimeSince) {
|
||||
for (int i = 0; i < scores.length; i++)
|
||||
scores[i].getTimeSince();
|
||||
}
|
||||
return scores;
|
||||
else
|
||||
} else
|
||||
return null; // incorrect map
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user