# -*- 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(1)") print("由WOAOL项目组制作") print("WACCA NEVER END") print("请注意,该版本计算器不区分B15和B35,仅计算全曲的Best50成绩,并使用V4的14定数表") print("该版本计算器为子版本,正常计算国服B50请不要用此计算器及其配套Table_output.json") print("") print("//////////////////////////////////////////////////////////////////////") print("") if not os.path.isfile('Table_output_V4.json'): print("错误:找不到Table_output.json。") print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。") exit() if not os.path.isfile('playLog.json'): print("错误:找不到playLog.json。") print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。") exit() with open('playLog.json', 'r', encoding='utf-8') as file: play_logs = json.load(file) with open('Table_output_V4.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_50 = [] music_rates = {} 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)) best_50.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_50_sorted = sorted(best_50, key=lambda x: x[2], reverse=True)[:50] best_50_total = sum(rate for _, _, rate, _ in best_50_sorted) print("\nBest 50:\n") for music_name, grade_name, rate, max_score in best_50_sorted: print(f"{music_name}\n 难度: {grade_name} 分数: {max_score} Rate: {rate:.1f}\n") print("\n") print(f"\nBest 50 合计: {best_50_total:.1f}")