Files
Useful_tools/Rate_onlyBest50.py

198 lines
5.9 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.

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")
def json_template(music, diff, rate, max, level, music_id):
template = {
'id': music_id,
'music': music,
'difficulty': diff,
'rate': level,
'max_score': max,
'level': rate
}
return template
def output_json_template(b50, alt15, total):
template = {
'b50_total': total,
'b50': b50,
'alt15': alt15
}
return template
# print("//////////////////////////////////////////////////////////////////////")
# print("华卡音舞 Ver.3 3.50.00")
# print("全曲 Rate + Best 50 计算器")
# print("版本号 V0.05(1)")
# print("由WOAOL项目组制作")
# print("WACCA NEVER END")
# print("请注意该版本计算器不区分B15和B35仅计算全曲的Best50成绩并使用V4的14定数表")
# print("该版本计算器为子版本正常计算国服B50请不要用此计算器及其配套Table_output.json")
# print("//////////////////////////////////////////////////////////////////////")
if not os.path.isfile('Table_output_V4.json'):
print("")
print("错误找不到Table_output_V4.json。")
print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。")
print("")
exit()
if not os.path.isfile('playlog_b50.json'):
print("")
print("错误找不到playlog_b50.json.json。")
print("请将Rate_SDJE.py、Table_output_V4.json、playlog_b50.json这三个文件放在同一目录下。")
print("")
exit()
with open('playlog_b50.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 = multiplier * level
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, music_id, music_grade))
best_50.append((music_name, grade_name, rate, max_score, level, music_id))
# for music_name, grades_rates in music_rates.items():
# print(f"\n{music_name}")
# for grade_name, rate, max_score, music_id, music_grade in grades_rates:
# if rate > 0:
# level = levels_dict[music_id]["levels"][music_grade]
# print(f" 难度: {grade_name} 定数: {level:.1f} 分数: {max_score} Rate: {rate:.3f}")
best_50_sorted = sorted(best_50, key=lambda x: x[2], reverse=True)[0:50]
best_50_alternate = sorted(best_50, key=lambda x: x[2], reverse=True)[50:65]
best_50_total = sum(rate for _, _, rate, _, _, _ in best_50_sorted)
best_50_first_rate = best_50_sorted[0][2]
best_50_last_rate = best_50_sorted[49][2]
b50_json = []
alt15_json = []
for music_name, grade_name, rate, max_score, level, music_id in best_50_sorted:
# print(f"{music_name}\n 难度: {grade_name} 定数: {level:.1f} 分数: {max_score} Rate: {rate:.3f}\n")
lv = f'{level:.1f}'
lv = float(lv)
rt = f'{rate:.3f}'
rt = float(rt)
b50_json.append(json_template(music_name, grade_name, lv, max_score, rt, music_id))
for music_name, grade_name, rate, max_score, level, music_id in best_50_alternate:
# print(f"{music_name}\n 难度: {grade_name} 定数: {level:.1f} 分数: {max_score} Rate: {rate:.3f}\n")
lv = f'{level:.1f}'
lv = float(lv)
rt = f'{rate:.3f}'
rt = float(rt)
alt15_json.append(json_template(music_name, grade_name, lv, max_score, rt, music_id))
total = f'{best_50_total:.3f}'
total = float(total)
data = output_json_template(b50_json, alt15_json, total)
with open('b50_result.json', 'w+', encoding='utf-8') as json_file:
json.dump(data, json_file, ensure_ascii=False, indent=2)
print('Done')
# print(f"\nBest 35 单曲最高: {best_50_first_rate:.3f}")
# print(f"\nBest 35 单曲最低: {best_50_last_rate:.3f}")
#
# print(f"\nBest 50 合计: {best_50_total:.3f}")