Files
Useful_tools/Rate_SDJE.py
2024-10-21 03:01:03 +01:00

221 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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")