maimai_py.enums

  1from enum import Enum, IntEnum
  2from typing import Union
  3
  4from maimai_ffi.model import region_map
  5
  6
  7class Version(IntEnum):
  8    MAIMAI = 10000
  9    MAIMAI_PLUS = 11000
 10    MAIMAI_GREEN = 12000
 11    MAIMAI_GREEN_PLUS = 13000
 12    MAIMAI_ORANGE = 14000
 13    MAIMAI_ORANGE_PLUS = 15000
 14    MAIMAI_PINK = 16000
 15    MAIMAI_PINK_PLUS = 17000
 16    MAIMAI_MURASAKI = 18000
 17    MAIMAI_MURASAKI_PLUS = 18500
 18    MAIMAI_MILK = 19000
 19    MAIMAI_MILK_PLUS = 19500
 20    MAIMAI_FINALE = 19900
 21    MAIMAI_DX = 20000  # 舞萌DX
 22    MAIMAI_DX_SPLASH = 21000  # 舞萌DX 2021
 23    MAIMAI_DX_UNIVERSE = 22000  # 舞萌DX 2022
 24    MAIMAI_DX_FESTIVAL = 23000  # 舞萌DX 2023
 25    MAIMAI_DX_BUDDIES = 24000  # 舞萌DX 2024
 26    MAIMAI_DX_PRISM = 25000  # 舞萌DX 2025
 27    MAIMAI_DX_FUTURE = 30000  # 舞萌DX 2077
 28
 29
 30class Genre(Enum):
 31    POPSアニメ = "POPSアニメ"
 32    niconicoボーカロイド = "niconicoボーカロイド"
 33    東方Project = "東方Project"
 34    ゲームバラエティ = "ゲームバラエティ"
 35    maimai = "maimai"
 36    オンゲキCHUNITHM = "オンゲキCHUNITHM"
 37    宴会場 = "宴会場"
 38
 39
 40region_map: tuple[str, ...] = region_map
 41
 42all_versions = list(Version.__members__.values())
 43"""@private"""
 44
 45current_version = all_versions[-2]
 46"""@private"""
 47
 48plate_to_version: dict[str, Version] = {
 49    "初": Version.MAIMAI,
 50    "真": Version.MAIMAI_PLUS,
 51    "超": Version.MAIMAI_GREEN,
 52    "檄": Version.MAIMAI_GREEN_PLUS,
 53    "橙": Version.MAIMAI_ORANGE,
 54    "晓": Version.MAIMAI_ORANGE_PLUS,
 55    "桃": Version.MAIMAI_PINK,
 56    "樱": Version.MAIMAI_PINK_PLUS,
 57    "紫": Version.MAIMAI_MURASAKI,
 58    "堇": Version.MAIMAI_MURASAKI_PLUS,
 59    "白": Version.MAIMAI_MILK,
 60    "雪": Version.MAIMAI_MILK_PLUS,
 61    "辉": Version.MAIMAI_FINALE,
 62    "熊": Version.MAIMAI_DX,
 63    "华": Version.MAIMAI_DX,
 64    "爽": Version.MAIMAI_DX_SPLASH,
 65    "煌": Version.MAIMAI_DX_SPLASH,
 66    "星": Version.MAIMAI_DX_UNIVERSE,
 67    "宙": Version.MAIMAI_DX_UNIVERSE,
 68    "祭": Version.MAIMAI_DX_FESTIVAL,
 69    "祝": Version.MAIMAI_DX_FESTIVAL,
 70    "双": Version.MAIMAI_DX_BUDDIES,
 71    "宴": Version.MAIMAI_DX_BUDDIES,
 72    "镜": Version.MAIMAI_DX_PRISM,
 73    "未": Version.MAIMAI_DX_FUTURE,
 74}
 75"""@private"""
 76
 77
 78divingfish_to_version: dict[str, Version] = {
 79    "maimai": Version.MAIMAI,
 80    "maimai PLUS": Version.MAIMAI_PLUS,
 81    "maimai GreeN": Version.MAIMAI_GREEN,
 82    "maimai GreeN PLUS": Version.MAIMAI_GREEN_PLUS,
 83    "maimai ORANGE": Version.MAIMAI_ORANGE,
 84    "maimai ORANGE PLUS": Version.MAIMAI_ORANGE_PLUS,
 85    "maimai PiNK": Version.MAIMAI_PINK,
 86    "maimai PiNK PLUS": Version.MAIMAI_PINK_PLUS,
 87    "maimai MURASAKi": Version.MAIMAI_MURASAKI,
 88    "maimai MURASAKi PLUS": Version.MAIMAI_MURASAKI_PLUS,
 89    "maimai MiLK": Version.MAIMAI_MILK,
 90    "MiLK PLUS": Version.MAIMAI_MILK_PLUS,
 91    "maimai FiNALE": Version.MAIMAI_FINALE,
 92    "maimai でらっくす": Version.MAIMAI_DX,
 93    "maimai でらっくす PLUS": Version.MAIMAI_DX,
 94    "maimai でらっくす Splash": Version.MAIMAI_DX_SPLASH,
 95    "maimai でらっくす Splash PLUS": Version.MAIMAI_DX_SPLASH,
 96    "maimai でらっくす UNiVERSE": Version.MAIMAI_DX_UNIVERSE,
 97    "maimai でらっくす UNiVERSE PLUS": Version.MAIMAI_DX_UNIVERSE,
 98    "maimai でらっくす FESTiVAL": Version.MAIMAI_DX_FESTIVAL,
 99    "maimai でらっくす FESTiVAL PLUS": Version.MAIMAI_DX_FESTIVAL,
100    "maimai でらっくす BUDDiES": Version.MAIMAI_DX_BUDDIES,
101    "maimai でらっくす BUDDiES PLUS": Version.MAIMAI_DX_BUDDIES,
102    "maimai でらっくす PRiSM": Version.MAIMAI_DX_PRISM,
103}
104"""@private"""
105
106name_to_genre: dict[str, Genre] = {
107    "POPSアニメ": Genre.POPSアニメ,
108    "流行&动漫": Genre.POPSアニメ,
109    "niconicoボーカロイド": Genre.niconicoボーカロイド,
110    "niconico & VOCALOID": Genre.niconicoボーカロイド,
111    "東方Project": Genre.東方Project,
112    "东方Project": Genre.東方Project,
113    "ゲームバラエティ": Genre.ゲームバラエティ,
114    "其他游戏": Genre.ゲームバラエティ,
115    "maimai": Genre.maimai,
116    "舞萌": Genre.maimai,
117    "オンゲキCHUNITHM": Genre.オンゲキCHUNITHM,
118    "音击&中二节奏": Genre.オンゲキCHUNITHM,
119    "宴会場": Genre.宴会場,
120}
121"""@private"""
122
123plate_aliases: dict[str, str] = {
124    "暁": "晓",
125    "櫻": "樱",
126    "菫": "堇",
127    "輝": "辉",
128    "華": "华",
129    "極": "极",
130}
131"""@private"""
132
133
134class LevelIndex(Enum):
135    BASIC = 0
136    ADVANCED = 1
137    EXPERT = 2
138    MASTER = 3
139    ReMASTER = 4
140
141
142class FCType(Enum):
143    APP = 0
144    AP = 1
145    FCP = 2
146    FC = 3
147
148
149class FSType(Enum):
150    SYNC = 0
151    FS = 1
152    FSP = 2
153    FSD = 3
154    FSDP = 4
155
156
157class RateType(Enum):
158    SSSP = 0
159    SSS = 1
160    SSP = 2
161    SS = 3
162    SP = 4
163    S = 5
164    AAA = 6
165    AA = 7
166    A = 8
167    BBB = 9
168    BB = 10
169    B = 11
170    C = 12
171    D = 13
172
173    @staticmethod
174    def _from_achievement(achievement: float) -> "RateType":
175        if achievement >= 100.5:
176            return RateType.SSSP
177        if achievement >= 100:
178            return RateType.SSS
179        if achievement >= 99.5:
180            return RateType.SSP
181        if achievement >= 99:
182            return RateType.SS
183        if achievement >= 98:
184            return RateType.SP
185        if achievement >= 97:
186            return RateType.S
187        if achievement >= 94:
188            return RateType.AAA
189        if achievement >= 90:
190            return RateType.AA
191        if achievement >= 80:
192            return RateType.A
193        if achievement >= 75:
194            return RateType.BBB
195        if achievement >= 70:
196            return RateType.BB
197        if achievement >= 60:
198            return RateType.B
199        if achievement >= 50:
200            return RateType.C
201        return RateType.D
202
203
204class SongType(Enum):
205    STANDARD = "standard"
206    DX = "dx"
207    UTAGE = "utage"
208
209    @staticmethod
210    def _from_id(id: Union[int, str]) -> "SongType":
211        id = int(id)
212        return SongType.UTAGE if id > 100000 else SongType.DX if id > 10000 else SongType.STANDARD
213
214    def _to_id(self, id: Union[int, str]) -> int:
215        id = int(id)
216        return id if self == SongType.STANDARD else id + 10000 if self == SongType.DX else id + 100000
217
218    def _to_abbr(self) -> str:
219        return "SD" if self == SongType.STANDARD else "DX" if self else "UTAGE"
class Version(enum.IntEnum):
 8class Version(IntEnum):
 9    MAIMAI = 10000
10    MAIMAI_PLUS = 11000
11    MAIMAI_GREEN = 12000
12    MAIMAI_GREEN_PLUS = 13000
13    MAIMAI_ORANGE = 14000
14    MAIMAI_ORANGE_PLUS = 15000
15    MAIMAI_PINK = 16000
16    MAIMAI_PINK_PLUS = 17000
17    MAIMAI_MURASAKI = 18000
18    MAIMAI_MURASAKI_PLUS = 18500
19    MAIMAI_MILK = 19000
20    MAIMAI_MILK_PLUS = 19500
21    MAIMAI_FINALE = 19900
22    MAIMAI_DX = 20000  # 舞萌DX
23    MAIMAI_DX_SPLASH = 21000  # 舞萌DX 2021
24    MAIMAI_DX_UNIVERSE = 22000  # 舞萌DX 2022
25    MAIMAI_DX_FESTIVAL = 23000  # 舞萌DX 2023
26    MAIMAI_DX_BUDDIES = 24000  # 舞萌DX 2024
27    MAIMAI_DX_PRISM = 25000  # 舞萌DX 2025
28    MAIMAI_DX_FUTURE = 30000  # 舞萌DX 2077
MAIMAI = <Version.MAIMAI: 10000>
MAIMAI_PLUS = <Version.MAIMAI_PLUS: 11000>
MAIMAI_GREEN = <Version.MAIMAI_GREEN: 12000>
MAIMAI_GREEN_PLUS = <Version.MAIMAI_GREEN_PLUS: 13000>
MAIMAI_ORANGE = <Version.MAIMAI_ORANGE: 14000>
MAIMAI_ORANGE_PLUS = <Version.MAIMAI_ORANGE_PLUS: 15000>
MAIMAI_PINK = <Version.MAIMAI_PINK: 16000>
MAIMAI_PINK_PLUS = <Version.MAIMAI_PINK_PLUS: 17000>
MAIMAI_MURASAKI = <Version.MAIMAI_MURASAKI: 18000>
MAIMAI_MURASAKI_PLUS = <Version.MAIMAI_MURASAKI_PLUS: 18500>
MAIMAI_MILK = <Version.MAIMAI_MILK: 19000>
MAIMAI_MILK_PLUS = <Version.MAIMAI_MILK_PLUS: 19500>
MAIMAI_FINALE = <Version.MAIMAI_FINALE: 19900>
MAIMAI_DX = <Version.MAIMAI_DX: 20000>
MAIMAI_DX_SPLASH = <Version.MAIMAI_DX_SPLASH: 21000>
MAIMAI_DX_UNIVERSE = <Version.MAIMAI_DX_UNIVERSE: 22000>
MAIMAI_DX_FESTIVAL = <Version.MAIMAI_DX_FESTIVAL: 23000>
MAIMAI_DX_BUDDIES = <Version.MAIMAI_DX_BUDDIES: 24000>
MAIMAI_DX_PRISM = <Version.MAIMAI_DX_PRISM: 25000>
MAIMAI_DX_FUTURE = <Version.MAIMAI_DX_FUTURE: 30000>
class Genre(enum.Enum):
31class Genre(Enum):
32    POPSアニメ = "POPSアニメ"
33    niconicoボーカロイド = "niconicoボーカロイド"
34    東方Project = "東方Project"
35    ゲームバラエティ = "ゲームバラエティ"
36    maimai = "maimai"
37    オンゲキCHUNITHM = "オンゲキCHUNITHM"
38    宴会場 = "宴会場"
POPSアニメ = <Genre.POPSアニメ: 'POPSアニメ'>
niconicoボーカロイド = <Genre.niconicoボーカロイド: 'niconicoボーカロイド'>
東方Project = <Genre.東方Project: '東方Project'>
ゲームバラエティ = <Genre.ゲームバラエティ: 'ゲームバラエティ'>
maimai = <Genre.maimai: 'maimai'>
オンゲキCHUNITHM = <Genre.オンゲキCHUNITHM: 'オンゲキCHUNITHM'>
宴会場 = <Genre.宴会場: '宴会場'>
region_map: tuple[str, ...] = ('北京市', '重庆市', '上海市', '天津市', '安徽省', '福建省', '甘肃省', '广东省', '贵州省', '海南省', '河北省', '黑龙江省', '河南省', '湖北省', '湖南省', '江苏省', '江西省', '吉林省', '辽宁省', '青海省', '陕西省', '山东省', '山西省', '四川省', '台湾省', '云南省', '浙江省', '广西壮族自治区', '内蒙古自治区', '宁夏回族自治区', '新疆维吾尔自治区', '西藏自治区')
class LevelIndex(enum.Enum):
135class LevelIndex(Enum):
136    BASIC = 0
137    ADVANCED = 1
138    EXPERT = 2
139    MASTER = 3
140    ReMASTER = 4
BASIC = <LevelIndex.BASIC: 0>
ADVANCED = <LevelIndex.ADVANCED: 1>
EXPERT = <LevelIndex.EXPERT: 2>
MASTER = <LevelIndex.MASTER: 3>
ReMASTER = <LevelIndex.ReMASTER: 4>
class FCType(enum.Enum):
143class FCType(Enum):
144    APP = 0
145    AP = 1
146    FCP = 2
147    FC = 3
APP = <FCType.APP: 0>
AP = <FCType.AP: 1>
FCP = <FCType.FCP: 2>
FC = <FCType.FC: 3>
class FSType(enum.Enum):
150class FSType(Enum):
151    SYNC = 0
152    FS = 1
153    FSP = 2
154    FSD = 3
155    FSDP = 4
SYNC = <FSType.SYNC: 0>
FS = <FSType.FS: 1>
FSP = <FSType.FSP: 2>
FSD = <FSType.FSD: 3>
FSDP = <FSType.FSDP: 4>
class RateType(enum.Enum):
158class RateType(Enum):
159    SSSP = 0
160    SSS = 1
161    SSP = 2
162    SS = 3
163    SP = 4
164    S = 5
165    AAA = 6
166    AA = 7
167    A = 8
168    BBB = 9
169    BB = 10
170    B = 11
171    C = 12
172    D = 13
173
174    @staticmethod
175    def _from_achievement(achievement: float) -> "RateType":
176        if achievement >= 100.5:
177            return RateType.SSSP
178        if achievement >= 100:
179            return RateType.SSS
180        if achievement >= 99.5:
181            return RateType.SSP
182        if achievement >= 99:
183            return RateType.SS
184        if achievement >= 98:
185            return RateType.SP
186        if achievement >= 97:
187            return RateType.S
188        if achievement >= 94:
189            return RateType.AAA
190        if achievement >= 90:
191            return RateType.AA
192        if achievement >= 80:
193            return RateType.A
194        if achievement >= 75:
195            return RateType.BBB
196        if achievement >= 70:
197            return RateType.BB
198        if achievement >= 60:
199            return RateType.B
200        if achievement >= 50:
201            return RateType.C
202        return RateType.D
SSSP = <RateType.SSSP: 0>
SSS = <RateType.SSS: 1>
SSP = <RateType.SSP: 2>
SS = <RateType.SS: 3>
SP = <RateType.SP: 4>
S = <RateType.S: 5>
AAA = <RateType.AAA: 6>
AA = <RateType.AA: 7>
A = <RateType.A: 8>
BBB = <RateType.BBB: 9>
BB = <RateType.BB: 10>
B = <RateType.B: 11>
C = <RateType.C: 12>
D = <RateType.D: 13>
class SongType(enum.Enum):
205class SongType(Enum):
206    STANDARD = "standard"
207    DX = "dx"
208    UTAGE = "utage"
209
210    @staticmethod
211    def _from_id(id: Union[int, str]) -> "SongType":
212        id = int(id)
213        return SongType.UTAGE if id > 100000 else SongType.DX if id > 10000 else SongType.STANDARD
214
215    def _to_id(self, id: Union[int, str]) -> int:
216        id = int(id)
217        return id if self == SongType.STANDARD else id + 10000 if self == SongType.DX else id + 100000
218
219    def _to_abbr(self) -> str:
220        return "SD" if self == SongType.STANDARD else "DX" if self else "UTAGE"
STANDARD = <SongType.STANDARD: 'standard'>
DX = <SongType.DX: 'dx'>
UTAGE = <SongType.UTAGE: 'utage'>