Compare commits
3 Commits
ae874c8cb4
...
816468e4e2
| Author | SHA1 | Date | |
|---|---|---|---|
| 816468e4e2 | |||
| 0fa099883e | |||
| a2bb7bd213 |
220
Rate_SDJE.py
Normal file
220
Rate_SDJE.py
Normal file
@@ -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")
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@@ -59,31 +58,52 @@ def get_music_name(levels_dict, music_id):
|
|||||||
return music_entry.get("name", "Unknown")
|
return music_entry.get("name", "Unknown")
|
||||||
|
|
||||||
|
|
||||||
print("")
|
def json_template(music, diff, rate, max, level, music_id):
|
||||||
print("//////////////////////////////////////////////////////////////////////")
|
template = {
|
||||||
print("")
|
'id': music_id,
|
||||||
print("华卡音舞 Ver.3 3.50.00")
|
'music': music,
|
||||||
print("全曲 Rate + Best 50 计算器")
|
'difficulty': diff,
|
||||||
print("版本号 V0.03(1)")
|
'rate': level,
|
||||||
print("由WOAOL项目组制作")
|
'max_score': max,
|
||||||
print("WACCA NEVER END")
|
'level': rate
|
||||||
print("请注意,该版本计算器不区分B15和B35,仅计算全曲的Best50成绩,并使用V4的14定数表")
|
}
|
||||||
print("该版本计算器为子版本,正常计算国服B50请不要用此计算器及其配套Table_output.json")
|
return template
|
||||||
print("")
|
|
||||||
print("//////////////////////////////////////////////////////////////////////")
|
|
||||||
print("")
|
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'):
|
if not os.path.isfile('Table_output_V4.json'):
|
||||||
print("错误:找不到Table_output.json。")
|
print("")
|
||||||
|
print("错误:找不到Table_output_V4.json。")
|
||||||
print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。")
|
print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。")
|
||||||
|
print("")
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
if not os.path.isfile('playLog.json'):
|
if not os.path.isfile('playlog_b50.json'):
|
||||||
print("错误:找不到playLog.json。")
|
print("")
|
||||||
print("请将Rate_SDJE.py、Table_output_V4.json、playLog.json这三个文件放在同一目录下。")
|
print("错误:找不到playlog_b50.json.json。")
|
||||||
|
print("请将Rate_SDJE.py、Table_output_V4.json、playlog_b50.json这三个文件放在同一目录下。")
|
||||||
|
print("")
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
with open('playLog.json', 'r', encoding='utf-8') as file:
|
with open('playlog_b50.json', 'r', encoding='utf-8') as file:
|
||||||
play_logs = json.load(file)
|
play_logs = json.load(file)
|
||||||
|
|
||||||
with open('Table_output_V4.json', 'r', encoding='utf-8') as file:
|
with open('Table_output_V4.json', 'r', encoding='utf-8') as file:
|
||||||
@@ -118,7 +138,7 @@ for log in play_logs:
|
|||||||
if level is None:
|
if level is None:
|
||||||
continue
|
continue
|
||||||
multiplier = calculate_multiplier(max_score)
|
multiplier = calculate_multiplier(max_score)
|
||||||
rate = round(multiplier * level, 1)
|
rate = multiplier * level
|
||||||
grade_name = grade_to_name(music_grade)
|
grade_name = grade_to_name(music_grade)
|
||||||
|
|
||||||
start_time = levels_dict[music_id]["start_time"]
|
start_time = levels_dict[music_id]["start_time"]
|
||||||
@@ -126,24 +146,52 @@ for log in play_logs:
|
|||||||
|
|
||||||
if music_name not in music_rates:
|
if music_name not in music_rates:
|
||||||
music_rates[music_name] = []
|
music_rates[music_name] = []
|
||||||
music_rates[music_name].append((grade_name, rate, max_score))
|
music_rates[music_name].append((grade_name, rate, max_score, music_id, music_grade))
|
||||||
|
|
||||||
best_50.append((music_name, grade_name, rate, max_score))
|
best_50.append((music_name, grade_name, rate, max_score, level, music_id))
|
||||||
|
|
||||||
# for music_name, grades_rates in music_rates.items():
|
# for music_name, grades_rates in music_rates.items():
|
||||||
# print(f"\n{music_name}")
|
# print(f"\n{music_name}")
|
||||||
# for grade_name, rate, max_score in grades_rates:
|
# for grade_name, rate, max_score, music_id, music_grade in grades_rates:
|
||||||
# if rate > 0:
|
# if rate > 0:
|
||||||
# print(f" 难度: {grade_name:<16} 分数: {max_score} Rate: {rate:.1f}")
|
# 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)[:50]
|
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_total = sum(rate for _, _, rate, _, _, _ in best_50_sorted)
|
||||||
|
|
||||||
print("\nBest 50:\n")
|
best_50_first_rate = best_50_sorted[0][2]
|
||||||
for music_name, grade_name, rate, max_score in best_50_sorted:
|
best_50_last_rate = best_50_sorted[49][2]
|
||||||
print(f"{music_name}\n 难度: {grade_name} 分数: {max_score} Rate: {rate:.1f}\n")
|
|
||||||
|
|
||||||
print("\n")
|
b50_json = []
|
||||||
|
alt15_json = []
|
||||||
|
|
||||||
print(f"\nBest 50 合计: {best_50_total:.1f}")
|
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}")
|
||||||
|
|||||||
1758
playLog.json
1758
playLog.json
File diff suppressed because it is too large
Load Diff
1402
temp/playLog.json
1402
temp/playLog.json
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user