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