This commit is contained in:
2024-10-21 03:01:03 +01:00
parent a2bb7bd213
commit 0fa099883e

220
Rate_SDJE.py Normal file
View File

@@ -0,0 +1,220 @@
# -*- coding: utf-8 -*-
import json
import os
def calculate_multiplier(max_score):
if max_score >= 990000:
return 4
elif max_score >= 980000:
return 3.75
elif max_score >= 970000:
return 3.5
elif max_score >= 960000:
return 3.25
elif max_score >= 950000:
return 3
elif max_score >= 940000:
return 2.75
elif max_score >= 920000:
return 2.5
elif max_score >= 900000:
return 2
elif max_score >= 850000:
return 1.5
elif max_score >= 800000:
return 1
elif max_score >= 700000:
return 0.8
elif max_score >= 600000:
return 0.7
elif max_score >= 500000:
return 0.6
elif max_score >= 400000:
return 0.5
elif max_score >= 300000:
return 0.4
elif max_score >= 200000:
return 0.3
elif max_score >= 100000:
return 0.2
elif max_score >= 1:
return 0.1
else:
return 0
def grade_to_name(grade):
grade_names = {
1: "NORMAL",
2: "HARD",
3: "EXPERT",
4: "INFERNO"
}
return grade_names.get(grade, "Unknown Grade")
def get_music_name(levels_dict, music_id):
music_entry = levels_dict.get(music_id, {})
return music_entry.get("name", "Unknown")
print("")
print("//////////////////////////////////////////////////////////////////////")
print("")
print("华卡音舞 Ver.3 3.50.00")
print("全曲 Rate + Best 50 计算器")
print("版本号 V0.03")
print("由WOAOL项目组制作")
print("WACCA NEVER END")
print("")
print("//////////////////////////////////////////////////////////////////////")
print("")
if not os.path.isfile('Table_output.json'):
print("错误找不到Table_output.json。")
print("请将Rate_SDJE.py、Table_output.json、playLog.json这三个文件放在同一目录下。")
exit()
if not os.path.isfile('playLog.json'):
print("错误找不到playLog.json。")
print("请将Rate_SDJE.py、Table_output.json、playLog.json这三个文件放在同一目录下。")
exit()
with open('playLog.json', 'r', encoding='utf-8') as file:
play_logs = json.load(file)
with open('Table_output.json', 'r', encoding='utf-8') as file:
table_output = json.load(file)
levels_dict = {}
for entry in table_output:
music_id = entry["music_id"]
levels_dict[music_id] = {
"name": entry["music_name"],
"levels": {
1: entry["level_nm"],
2: entry["level_hd"],
3: entry["level_ex"],
4: entry["level_in"]
},
"start_time": entry["start_time"],
"start_inf": entry["start_inf"]
}
best_35 = []
best_15 = []
music_rates = {}
print("单曲 Rate 计算规则")
print("单曲难度所对应的定数,乘以分数所对应的系数。")
print("")
print("分数 系数")
print("990000~1000000 4.0")
print("980000~989999 3.75")
print("970000~979999 3.5")
print("960000~969999 3.25")
print("950000~959999 3.0")
print("940000~949999 2.75")
print("920000~939999 2.5")
print("900000~919999 2.0")
print("850000~899999 1.5")
print("800000~849999 1.0")
print("700000~799999 0.8")
print("600000~699999 0.7")
print("500000~599999 0.6")
print("400000~499999 0.5")
print("300000~399999 0.4")
print("200000~299999 0.3")
print("100000~199999 0.2")
print("1~99999 0.1")
print("0 0")
print("")
print("//////////////////////////////////////////////////////////////////////")
print("")
print("Best 50 计算规则")
print("2020年7月2日国服上线至2022年5月9日的所有曲目")
print("取单曲Rate最高的前35个相加得到Best 35。")
print("2022年5月10日起更新的所有曲目")
print("取单曲Rate最高的前15个相加得到Best 15。")
print("Best 35和Best 15相加后抹去小数作为玩家当前Rate。")
print("")
print("Rate 颜色")
print("2500以上 虹")
print("2200~2499 金")
print("1900~2199 银")
print("1600~1899 蓝")
print("1300~1599 紫")
print("1000~1299 红")
print("600~999 黄")
print("300~599 绀")
print("0~299 灰")
print("")
print("2022年6月3日前的曲目使用日服LilyR的定数。")
print("在Ver.2R 2.53.00中《Cauliflower》、《Purple Skies》")
print("更新时间为2022年5月13日因此在Ver.3被算入Best 15。")
print("《Let you DIVE!》、《HELL FLAME》、《BATTLE NO.1》")
print("INFERNO难度追加在2022年5月10日之后因此同样被算入Best 15。")
print("")
print("//////////////////////////////////////////////////////////////////////")
print("")
for log in play_logs:
music_id = log['music_id']
music_grade = log['music_grade']
max_score = log['max_score']
music_name = get_music_name(levels_dict, music_id)
level_data = levels_dict.get(music_id, {}).get("levels", {})
level = level_data.get(music_grade)
if level is None:
continue
multiplier = calculate_multiplier(max_score)
rate = round(multiplier * level, 1)
grade_name = grade_to_name(music_grade)
start_time = levels_dict[music_id]["start_time"]
start_inf = levels_dict[music_id]["start_inf"]
if music_name not in music_rates:
music_rates[music_name] = []
music_rates[music_name].append((grade_name, rate, max_score))
if (music_grade < 4 and start_time >= 2022051007) or (music_grade == 4 and start_inf >= 2022051007):
best_15.append((music_name, grade_name, rate, max_score))
else:
best_35.append((music_name, grade_name, rate, max_score))
for music_name, grades_rates in music_rates.items():
print(f"\n{music_name}")
for grade_name, rate, max_score in grades_rates:
if rate > 0:
print(f" 难度: {grade_name:<16} 分数: {max_score} Rate: {rate:.1f}")
best_35_sorted = sorted(best_35, key=lambda x: x[2], reverse=True)[:35]
best_15_sorted = sorted(best_15, key=lambda x: x[2], reverse=True)[:15]
best_35_total = sum(rate for _, _, rate, _ in best_35_sorted)
best_15_total = sum(rate for _, _, rate, _ in best_15_sorted)
best_50_total = best_35_total + best_15_total
print("\n")
print("//////////////////////////////////////////////////////////////////////")
print("")
print("\nBest 35:\n")
for music_name, grade_name, rate, max_score in best_35_sorted:
print(f"{music_name}\n 难度: {grade_name} 分数: {max_score} Rate: {rate:.1f}\n")
print("\n")
print("//////////////////////////////////////////////////////////////////////")
print("")
print("\nBest 15:\n")
for music_name, grade_name, rate, max_score in best_15_sorted:
print(f"{music_name}\n 难度: {grade_name} 分数: {max_score} Rate: {rate:.1f}\n")
print("\n")
print("//////////////////////////////////////////////////////////////////////")
print(f"\nBest 35 合计: {best_35_total:.1f}")
print(f"\nBest 15 合计: {best_15_total:.1f}")
print(f"\nBest 50 合计: {best_50_total:.1f}")
print("")
print("//////////////////////////////////////////////////////////////////////")
print("\n")