1
Fork 0
arcaea-server/server/score.py
Lost-MSth 45f337b2cd [Enhance] Support skill_nami_sui
- For Arcaea 6.6.0
- New partners "Tairitsu & El Fail" and "Nami & Sui (Twilight)"
- Add support for the character skill `skill_nami_sui`.
2025-07-23 18:58:58 +07:00

177 lines
6.7 KiB
Python
Raw Permalink 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.

from random import randint
from time import time
from flask import Blueprint, request
from core.constant import Constant
from core.course import CoursePlay
from core.error import InputError
from core.rank import RankList
from core.score import UserPlay
from core.sql import Connect
from core.user import UserOnline
from .auth import auth_required
from .func import arc_try, success_return
bp = Blueprint('score', __name__, url_prefix='/score')
@bp.route('/token', methods=['GET']) # 成绩上传所需的token显然我不想验证
def score_token():
return success_return({'token': '1145141919810'})
@bp.route('/token/world', methods=['GET']) # 世界模式成绩上传所需的token
@auth_required(request)
@arc_try
def score_token_world(user_id):
d = request.args.get
stamina_multiply = d('stamina_multiply', 1, type=int)
fragment_multiply = d('fragment_multiply', 100, type=int)
prog_boost_multiply = d('prog_boost_multiply', 0, type=int)
beyond_boost_gauge_use = d('beyond_boost_gauge_use', 0, type=int)
skill_cytusii_flag = None
skill_chinatsu_flag = None
skill_id = d('skill_id')
if (skill_id == 'skill_ilith_ivy' or skill_id == 'skill_hikari_vanessa') and d('is_skill_sealed') == 'false':
# 处理 ivy 技能或者 vanessa 技能
# TODO: 需要重构整个 user_play世界模式 / 课题模式,所以现在临时 work 一下
skill_cytusii_flag = ''.join([str(randint(0, 2)) for _ in range(5)])
if skill_id == 'skill_chinatsu' and d('is_skill_sealed') == 'false':
skill_chinatsu_flag = ''.join([str(randint(0, 2)) for _ in range(7)])
skill_flag = skill_cytusii_flag or skill_chinatsu_flag
with Connect() as c:
x = UserPlay(c, UserOnline(c, user_id))
x.song.set_chart(d('song_id'), d('difficulty', type=int))
x.set_play_state_for_world(
stamina_multiply, fragment_multiply, prog_boost_multiply, beyond_boost_gauge_use, skill_cytusii_flag, skill_chinatsu_flag)
r = {
"stamina": x.user.stamina.stamina,
"max_stamina_ts": x.user.stamina.max_stamina_ts,
"token": x.song_token,
"play_parameters": {},
"beyond_boost_gauge": x.user.beyond_boost_gauge
}
if skill_flag and skill_id:
r['play_parameters'] = {
skill_id: list(
map(lambda x: Constant.WORLD_VALUE_NAME_ENUM[int(x)], skill_flag)),
}
if x.invasion_flag == 1:
r['play_parameters']['invasion_start'] = True
elif x.invasion_flag == 2:
r['play_parameters']['invasion_hard'] = True
return success_return(r)
@bp.route('/token/course', methods=['GET']) # 课题模式成绩上传所需的token
@auth_required(request)
@arc_try
def score_token_course(user_id):
with Connect() as c:
use_course_skip_purchase = request.args.get(
'use_course_skip_purchase', 'false') == 'true'
user = UserOnline(c, user_id)
user_play = UserPlay(c, user)
user_play.song_token = request.args.get('previous_token', None)
user_play.get_play_state()
status = 'created'
if user_play.course_play_state == -1:
# 没有token课题模式刚开始
course_play = CoursePlay(c, user, user_play)
course_play.course_id = request.args['course_id']
user_play.course_play = course_play
user_play.set_play_state_for_course(
use_course_skip_purchase)
elif 0 <= user_play.course_play_state <= 3:
# 验证token
user_play.update_token_for_course()
else:
# 课题模式已经结束
user_play.clear_play_state()
user.select_user_about_stamina()
status = 'cleared' if user_play.course_play_state == 4 else 'failed'
return success_return({
"stamina": user.stamina.stamina,
"max_stamina_ts": user.stamina.max_stamina_ts,
"token": user_play.song_token,
'status': status
})
@bp.route('/song', methods=['POST']) # 成绩上传
@auth_required(request)
@arc_try
def song_score_post(user_id):
with Connect() as c:
x = UserPlay(c, UserOnline(c, user_id))
x.nell_toggle = request.args.get("nell_toggle",type=bool)
x.song_token = request.form['song_token']
x.song_hash = request.form['song_hash']
x.song.set_chart(
request.form['song_id'], request.form['difficulty'])
x.set_score(request.form['score'], request.form['shiny_perfect_count'], request.form['perfect_count'], request.form['near_count'],
request.form['miss_count'], request.form['health'], request.form['modifier'], int(time() * 1000), request.form['clear_type'])
x.beyond_gauge = int(request.form['beyond_gauge'])
x.submission_hash = request.form['submission_hash']
if 'combo_interval_bonus' in request.form:
x.combo_interval_bonus = int(request.form['combo_interval_bonus'])
if 'hp_interval_bonus' in request.form:
x.hp_interval_bonus = int(request.form['hp_interval_bonus'])
# visible_map_count
if 'fever_bonus' in request.form:
x.fever_bonus = int(request.form['fever_bonus'])
x.highest_health = request.form.get("highest_health", type=int)
x.lowest_health = request.form.get("lowest_health", type=int)
if not x.is_valid:
raise InputError('Invalid score.', 107)
x.upload_score()
# room_code???
return success_return(x.to_dict())
@bp.route('/song', methods=['GET']) # TOP20
@auth_required(request)
@arc_try
def song_score_top(user_id):
with Connect() as c:
rank_list = RankList(c)
rank_list.song.set_chart(request.args.get(
'song_id'), request.args.get('difficulty'))
rank_list.select_top()
return success_return(rank_list.to_dict_list())
@bp.route('/song/me', methods=['GET']) # 我的排名默认最多20
@auth_required(request)
@arc_try
def song_score_me(user_id):
with Connect() as c:
rank_list = RankList(c)
rank_list.song.set_chart(request.args.get(
'song_id'), request.args.get('difficulty'))
rank_list.select_me(UserOnline(c, user_id))
return success_return(rank_list.to_dict_list())
@bp.route('/song/friend', methods=['GET']) # 好友排名默认最多50
@auth_required(request)
@arc_try
def song_score_friend(user_id):
with Connect() as c:
rank_list = RankList(c)
rank_list.song.set_chart(request.args.get(
'song_id'), request.args.get('difficulty'))
rank_list.select_friend(UserOnline(c, user_id))
return success_return(rank_list.to_dict_list())