feat(score): support calculate pp
This commit is contained in:
@@ -105,3 +105,65 @@ def mods_to_int(mods: list[APIMod]) -> int:
|
||||
for mod in mods:
|
||||
sum_ |= API_MOD_TO_LEGACY.get(mod["acronym"], 0)
|
||||
return sum_
|
||||
|
||||
|
||||
NO_CHECK = "DO_NO_CHECK"
|
||||
|
||||
# FIXME: 这里为空表示了两种情况:mod 没有配置项;任何时候都可以获得 pp
|
||||
# 如果是后者,则 mod 更新的时候可能会误判。
|
||||
COMMON_CONFIG: dict[str, dict] = {
|
||||
"EZ": {"retries": 2},
|
||||
"NF": {},
|
||||
"HT": {"speed_change": 0.75, "adjust_pitch": NO_CHECK},
|
||||
"DC": {"speed_change": 0.75},
|
||||
"HR": {},
|
||||
"SD": {},
|
||||
"PF": {},
|
||||
"HD": {},
|
||||
"DT": {"speed_change": 1.5, "adjust_pitch": NO_CHECK},
|
||||
"NC": {"speed_change": 1.5},
|
||||
"FL": {"size_multiplier": 1.0, "combo_based_size": True},
|
||||
"AC": {},
|
||||
"MU": {},
|
||||
"TD": {},
|
||||
}
|
||||
|
||||
RANKED_MODS: dict[int, dict[str, dict]] = {
|
||||
0: COMMON_CONFIG,
|
||||
1: COMMON_CONFIG,
|
||||
2: COMMON_CONFIG,
|
||||
3: COMMON_CONFIG,
|
||||
}
|
||||
# osu
|
||||
RANKED_MODS[0]["HD"]["only_fade_approach_circles"] = False
|
||||
RANKED_MODS[0]["FL"]["follow_delay"] = 1.0
|
||||
RANKED_MODS[0]["BL"] = {}
|
||||
RANKED_MODS[0]["NS"] = {}
|
||||
RANKED_MODS[0]["SO"] = {}
|
||||
RANKED_MODS[0]["TC"] = {}
|
||||
# taiko
|
||||
del RANKED_MODS[1]["EZ"]["retries"]
|
||||
# catch
|
||||
RANKED_MODS[2]["NS"] = {}
|
||||
# mania
|
||||
del RANKED_MODS[3]["HR"]
|
||||
RANKED_MODS[3]["FL"]["combo_based_size"] = False
|
||||
RANKED_MODS[3]["MR"] = {}
|
||||
for i in range(4, 10):
|
||||
RANKED_MODS[3][f"{i}K"] = {}
|
||||
|
||||
|
||||
def mods_can_get_pp(ruleset_id: int, mods: list[APIMod]) -> bool:
|
||||
ranked_mods = RANKED_MODS[ruleset_id]
|
||||
for mod in mods:
|
||||
mod["settings"] = mod.get("settings", {})
|
||||
if (settings := ranked_mods.get(mod["acronym"])) is None:
|
||||
return False
|
||||
if settings == {}:
|
||||
continue
|
||||
for setting, value in mod["settings"].items():
|
||||
if (expected_value := settings.get(setting)) is None:
|
||||
return False
|
||||
if expected_value != NO_CHECK and value != expected_value:
|
||||
return False
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user