From 0fa099883e225d5a73801608d296e908fa134e26 Mon Sep 17 00:00:00 2001 From: HereXianggeGe <2250120966@qq.com> Date: Mon, 21 Oct 2024 03:01:03 +0100 Subject: [PATCH] added --- Rate_SDJE.py | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 Rate_SDJE.py diff --git a/Rate_SDJE.py b/Rate_SDJE.py new file mode 100644 index 0000000..3bd88db --- /dev/null +++ b/Rate_SDJE.py @@ -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")