From 7063f409b1c9b64c8c78cdca2cb1781a9082e65e Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Sun, 23 Nov 2025 03:01:21 +0000 Subject: [PATCH] chore(mods): update default ranked mods Make AL & SG ranked https://osu.ppy.sh/home/changelog/tachyon/2025.1121.0 --- app/calculators/performance/rosu.py | 24 ++++++++++++++++++++++-- app/models/mods.py | 24 +++--------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/app/calculators/performance/rosu.py b/app/calculators/performance/rosu.py index f54fe63..9f02d86 100644 --- a/app/calculators/performance/rosu.py +++ b/app/calculators/performance/rosu.py @@ -3,7 +3,7 @@ from copy import deepcopy from typing import TYPE_CHECKING, ClassVar from app.calculator import clamp -from app.models.mods import APIMod, parse_enum_to_str +from app.models.mods import APIMod from app.models.performance import ( DifficultyAttributes, ManiaPerformanceAttributes, @@ -47,6 +47,26 @@ DIFFICULTY_CLASS = { GameMode.TAIKO: TaikoDifficultyAttributes, } +_enum_to_str = { + 0: { + "MR": {"reflection"}, + "AC": {"accuracy_judge_mode"}, + "BR": {"direction"}, + "AD": {"style"}, + }, + 1: {"AC": {"accuracy_judge_mode"}}, + 2: {"AC": {"accuracy_judge_mode"}}, + 3: {"AC": {"accuracy_judge_mode"}}, +} + + +def _parse_enum_to_str(ruleset_id: int, mods: list[APIMod]): + for mod in mods: + if mod["acronym"] in _enum_to_str.get(ruleset_id, {}): + for setting in mod.get("settings", {}): + if setting in _enum_to_str[ruleset_id][mod["acronym"]]: + mod["settings"][setting] = str(mod["settings"][setting]) # pyright: ignore[reportTypedDictNotRequiredAccess] + class RosuPerformanceCalculator(BasePerformanceCalculator): SUPPORT_MODES: ClassVar[set[GameMode]] = { @@ -125,7 +145,7 @@ class RosuPerformanceCalculator(BasePerformanceCalculator): try: map = rosu.Beatmap(content=beatmap_raw) mods = deepcopy(score.mods.copy()) - parse_enum_to_str(int(score.gamemode), mods) + _parse_enum_to_str(int(score.gamemode), mods) map.convert(self._to_rosu_mode(score.gamemode), mods) # pyright: ignore[reportArgumentType] perf = rosu.Performance( mods=mods, diff --git a/app/models/mods.py b/app/models/mods.py index 38e84c0..804ab8d 100644 --- a/app/models/mods.py +++ b/app/models/mods.py @@ -147,6 +147,8 @@ DEFAULT_RANKED_MODS = { "NS": {"hidden_combo_count": {"check": False, "type": "number"}}, "SO": {}, "TC": {}, + "AL": {}, + "SG": {}, }, 1: { "EZ": {}, @@ -171,6 +173,7 @@ DEFAULT_RANKED_MODS = { "mute_combo_count": {"check": False, "type": "number"}, "affects_hit_sounds": {"check": False, "type": "boolean"}, }, + "SG": {}, }, 2: { "EZ": {"retries": {"type": "number", "eq": 2}}, @@ -349,27 +352,6 @@ def mods_can_get_pp(ruleset_id: int, mods: list[APIMod]) -> bool: return _mods_can_get_pp(ruleset_id, mods, RANKED_MODS) -ENUM_TO_STR = { - 0: { - "MR": {"reflection"}, - "AC": {"accuracy_judge_mode"}, - "BR": {"direction"}, - "AD": {"style"}, - }, - 1: {"AC": {"accuracy_judge_mode"}}, - 2: {"AC": {"accuracy_judge_mode"}}, - 3: {"AC": {"accuracy_judge_mode"}}, -} - - -def parse_enum_to_str(ruleset_id: int, mods: list[APIMod]): - for mod in mods: - if mod["acronym"] in ENUM_TO_STR.get(ruleset_id, {}): - for setting in mod.get("settings", {}): - if setting in ENUM_TO_STR[ruleset_id][mod["acronym"]]: - mod["settings"][setting] = str(mod["settings"][setting]) # pyright: ignore[reportTypedDictNotRequiredAccess] - - def mod_to_save(mods: list[APIMod]) -> list[str]: s = list({mod["acronym"] for mod in mods}) s.sort()