Skip to content

Commit

Permalink
Merge pull request #407 from Rian8337/beatmap-pp-leaderboard
Browse files Browse the repository at this point in the history
Add pp for global beatmap leaderboard in song selection
  • Loading branch information
Rian8337 committed Sep 7, 2024
2 parents cf300cf + fc46208 commit d06aabf
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 31 deletions.
11 changes: 11 additions & 0 deletions res/values/options.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@
<item>1</item>
<item>2</item>
</string-array>
<string-array name="global_beatmap_leaderboard_scoring_mode_names">
<item>Score</item>
<item>Performance Points</item>
</string-array>
<string-array name="global_beatmap_leaderboard_scoring_mode_values">
<item>0</item>
<item>1</item>
</string-array>
<string-array name="placeholder_array">
<item>placeholder</item>
</string-array>
Expand Down Expand Up @@ -207,6 +215,9 @@
<string name="opt_loadavatar_title">Load Avatar</string>
<string name="opt_loadavatar_summary">Load avatar in online leaderboard</string>

<string name="opt_global_beatmap_leaderboard_scoring_mode_title">Global beatmap leaderboard scoring mode</string>
<string name="opt_global_beatmap_leaderboard_scoring_mode_summary">Choose the scoring mode for global beatmap leaderboards</string>


<string name="opt_error_meter_display_title">Hit error meter</string>
<string name="opt_error_meter_display_summary">Display hit error meter</string>
Expand Down
1 change: 1 addition & 0 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
<string name="favorite_manage">Manage Beatmap folder</string>

<string name="menu_score" formatted="false">Score: %s (%dx)</string>
<string name="menu_performance" formatted="false">Performance: %spp (%dx)</string>
<string name="menu_creator">Creator: %s</string>
<string name="menu_mod_back">Back</string>
<string name="menu_mod_title">Mod selection</string>
Expand Down
11 changes: 10 additions & 1 deletion res/xml/settings_general.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,16 @@
android:key="loadAvatar"
android:summary="@string/opt_loadavatar_summary"
android:title="@string/opt_loadavatar_title"
app:layout="@layout/settings_preference_checkbox_bottom" />
app:layout="@layout/settings_preference_checkbox" />

<com.reco1l.osu.ui.SelectPreference
android:defaultValue="0"
android:entries="@array/global_beatmap_leaderboard_scoring_mode_names"
android:entryValues="@array/global_beatmap_leaderboard_scoring_mode_values"
android:key="beatmapLeaderboardScoringMode"
android:summary="@string/opt_global_beatmap_leaderboard_scoring_mode_summary"
android:title="@string/opt_global_beatmap_leaderboard_scoring_mode_title"
app:layout="@layout/settings_preference_bottom" />

</PreferenceCategory>

Expand Down
8 changes: 8 additions & 0 deletions src/ru/nsu/ccfit/zuev/osu/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.anddev.andengine.util.Debug;

import ru.nsu.ccfit.zuev.osu.helper.FileUtils;
import ru.nsu.ccfit.zuev.osu.scoring.BeatmapLeaderboardScoringMode;

public class Config {
private static String corePath,
Expand Down Expand Up @@ -97,6 +98,8 @@ public class Config {

private static DifficultyAlgorithm difficultyAlgorithm;

private static BeatmapLeaderboardScoringMode beatmapLeaderboardScoringMode;

private static Map<String, String> skins;

private static RGBColor[] comboColors;
Expand Down Expand Up @@ -251,6 +254,7 @@ public static void loadOnlineConfig(final Context context) {
onlinePassword = prefs.getString("onlinePassword", null);
stayOnline = prefs.getBoolean("stayOnline", false);
loadAvatar = prefs.getBoolean("loadAvatar",false);
beatmapLeaderboardScoringMode = BeatmapLeaderboardScoringMode.parse(Integer.parseInt(prefs.getString("beatmapLeaderboardScoringMode", "0")));
}

public static void setSize() {
Expand Down Expand Up @@ -520,6 +524,10 @@ public static void setStayOnline(boolean stayOnline) {
Config.stayOnline = stayOnline;
}

public static BeatmapLeaderboardScoringMode getBeatmapLeaderboardScoringMode() {
return beatmapLeaderboardScoringMode;
}

public static boolean getLoadAvatar() {
return loadAvatar;
}
Expand Down
52 changes: 33 additions & 19 deletions src/ru/nsu/ccfit/zuev/osu/menu/ScoreBoard.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import ru.nsu.ccfit.zuev.osu.game.GameHelper;
import ru.nsu.ccfit.zuev.osu.helper.StringTable;
import ru.nsu.ccfit.zuev.osu.online.OnlineManager;
import ru.nsu.ccfit.zuev.osu.scoring.BeatmapLeaderboardScoringMode;
import ru.nsu.ccfit.zuev.osuplus.R;

import java.io.File;
Expand Down Expand Up @@ -190,6 +191,12 @@ private String formatScore(StringBuilder sb, int score) {
return sb.toString();
}

private String formatPP(StringBuilder sb, int pp) {
sb.setLength(0);
sb.append(pp);
return sb.toString();
}

private void initFromOnline(BeatmapInfo beatmapInfo) {
loadingText.setText("Loading scores...");

Expand Down Expand Up @@ -218,62 +225,69 @@ public void run() {

loadingText.setText(OnlineManager.getInstance().getFailMessage());

boolean isPPScoringMode = Config.getBeatmapLeaderboardScoringMode() == BeatmapLeaderboardScoringMode.PP;
var username = OnlineManager.getInstance().getUsername();
var items = new ArrayList<ScoreBoardItem>(scores.size());
var sb = new StringBuilder();

int nextTotalScore = 0;
float nextTotal = 0;

for (int i = 0; i < scores.size() && isActive(); ++i) {

var data = scores.get(i).split("\\s+");

if (data.length < 8 || data.length > 9) {
if (data.length < 9 || data.length > 10) {
continue;
}

var isInLeaderboard = data.length == 8;
var isPersonalBest = data.length == 9 || data[1].equals(username);
var isInLeaderboard = data.length == 9;
var isPersonalBest = data.length == 10 || data[1].equals(username);

var scoreID = Integer.parseInt(data[0]);
var playerName = isPersonalBest ? username : data[1];
var currentTotalScore = Integer.parseInt(data[2]);
var combo = Integer.parseInt(data[3]);
var mark = data[4];
var mods = data[5];
var accuracy = GameHelper.Round(Float.parseFloat(data[6]) * 100, 2);
var avatarURL = data[7];
var beatmapRank = isPersonalBest && !isInLeaderboard ? Integer.parseInt(data[8]) : (i + 1);
var score = Integer.parseInt(data[2]);
var pp = Float.parseFloat(data[3]);
var combo = Integer.parseInt(data[4]);
var mark = data[5];
var mods = data[6];
var accuracy = Float.parseFloat(data[7]);
var avatarURL = data[8];
var beatmapRank = isPersonalBest && !isInLeaderboard ? Integer.parseInt(data[9]) : (i + 1);

sb.setLength(0);
var totalScore = formatScore(sb, currentTotalScore);
var scoreStr = isPPScoringMode ?
// For display purposes, we round the pp.
formatPP(sb, Math.round(pp)) :
formatScore(sb, score);

sb.setLength(0);
var titleStr = sb.append('#').append(beatmapRank).append(' ').append(playerName)
.append('\n')
.append(StringTable.format(R.string.menu_score, totalScore, combo))
.append(StringTable.format(
isPPScoringMode ? R.string.menu_performance : R.string.menu_score, scoreStr, combo))
.toString();

if (i < scores.size() - 1) {
String[] nextData = scores.get(i + 1).split("\\s+");

if (nextData.length == 8 || nextData.length == 9) {
nextTotalScore = Integer.parseInt(nextData[2]);
if (nextData.length == 9 || nextData.length == 10) {
nextTotal = isPPScoringMode ? Float.parseFloat(nextData[3]) : Integer.parseInt(nextData[2]);
}
} else {
nextTotalScore = 0;
nextTotal = 0;
}

sb.setLength(0);
var modString = convertModString(sb, mods);
var diffTotalScore = currentTotalScore - nextTotalScore;
var currentTotal = isPPScoringMode ? pp : score;
var diffTotal = Math.round(currentTotal) - Math.round(nextTotal);

sb.setLength(0);
var accStr = sb.append(modString)
.append('\n')
.append(StringTable.format("%.2f", GameHelper.Round(accuracy * 100, 2))).append('%')
.append('\n')
.append(nextTotalScore == 0 ? "-" : ((diffTotalScore != 0 ? "+" : "") + diffTotalScore))
.append(nextTotal == 0 ? "-" : ((diffTotal != 0 ? "+" : "") + diffTotal))
.toString();

if (!isActive()) {
Expand All @@ -288,7 +302,7 @@ public void run() {
attachChild(new ScoreItem(avatarExecutor, titleStr, accStr, mark, true, scoreID, avatarURL, playerName, false));

var item = new ScoreBoardItem();
item.set(beatmapRank, playerName, combo, currentTotalScore, scoreID);
item.set(beatmapRank, playerName, combo, score, scoreID);
items.add(item);
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/ru/nsu/ccfit/zuev/osu/online/OnlineManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import ru.nsu.ccfit.zuev.osu.*;
import ru.nsu.ccfit.zuev.osu.helper.MD5Calculator;
import ru.nsu.ccfit.zuev.osu.online.PostBuilder.RequestException;
import ru.nsu.ccfit.zuev.osu.scoring.BeatmapLeaderboardScoringMode;

public class OnlineManager {
public static final String hostname = "osudroid.moe";
Expand Down Expand Up @@ -293,6 +294,12 @@ public ArrayList<String> getTop(final File beatmapFile, final String hash) throw
post.addParam("hash", hash);
post.addParam("uid", String.valueOf(userId));

if (Config.getBeatmapLeaderboardScoringMode() == BeatmapLeaderboardScoringMode.PP) {
post.addParam("type", "pp");
} else {
post.addParam("type", "score");
}

ArrayList<String> response = sendRequest(post, endpoint + "getrank.php");

if (response == null) {
Expand Down
11 changes: 0 additions & 11 deletions src/ru/nsu/ccfit/zuev/osu/online/OnlineScoring.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,17 +186,6 @@ public void sendRecord(final StatisticV2 record, final SendingPanel panel, final
});
}

public ArrayList<String> getTop(final File beatmapFile, final String hash) {
synchronized (onlineMutex) {
try {
return OnlineManager.getInstance().getTop(beatmapFile, hash);
} catch (OnlineManager.OnlineManagerException e) {
Debug.e("Cannot load scores " + e.getMessage());
return new ArrayList<>();
}
}
}

public void loadAvatar(final boolean both) {
if (!OnlineManager.getInstance().isStayOnline()) return;
final String avatarUrl = OnlineManager.getInstance().getAvatarURL();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.nsu.ccfit.zuev.osu.scoring;

/**
* Represents the scoring mode used in online beatmap leaderboard.
*/
public enum BeatmapLeaderboardScoringMode {
SCORE,
PP;

/**
* Parses an integer value to a {@link BeatmapLeaderboardScoringMode}.
*
* @param value The integer value to parse.
* @return The parsed {@link BeatmapLeaderboardScoringMode}.
*/
public static BeatmapLeaderboardScoringMode parse(int value) {
return value == 1 ? PP : SCORE;
}
}

0 comments on commit d06aabf

Please sign in to comment.