2019-12-08 22:43:49 +01:00
|
|
|
# vim: set fileencoding=utf-8
|
2021-09-07 19:57:31 +02:00
|
|
|
from typing import Any, Dict, Iterator, List, Tuple
|
2019-12-08 22:43:49 +01:00
|
|
|
|
2022-08-13 19:17:51 +02:00
|
|
|
from flask_caching import Cache
|
2019-12-08 22:43:49 +01:00
|
|
|
|
|
|
|
from bemani.backend.reflec import ReflecBeatFactory, ReflecBeatBase
|
2021-08-20 06:43:13 +02:00
|
|
|
from bemani.common import GameConstants, Profile, ValidatedDict
|
2021-09-07 04:48:33 +02:00
|
|
|
from bemani.data import Attempt, Data, Config, Score, Song, UserID
|
2019-12-08 22:43:49 +01:00
|
|
|
from bemani.frontend.base import FrontendBase
|
|
|
|
|
|
|
|
|
|
|
|
class ReflecBeatFrontend(FrontendBase):
|
|
|
|
|
2021-09-07 19:57:31 +02:00
|
|
|
game: GameConstants = GameConstants.REFLEC_BEAT
|
2019-12-08 22:43:49 +01:00
|
|
|
|
2021-09-07 19:57:31 +02:00
|
|
|
version: int = 0 # We use a virtual version for ReflecBeat to tie charts together
|
2019-12-08 22:43:49 +01:00
|
|
|
|
2021-09-07 19:57:31 +02:00
|
|
|
valid_charts: List[int] = [
|
2019-12-08 22:43:49 +01:00
|
|
|
ReflecBeatBase.CHART_TYPE_BASIC,
|
|
|
|
ReflecBeatBase.CHART_TYPE_MEDIUM,
|
|
|
|
ReflecBeatBase.CHART_TYPE_HARD,
|
|
|
|
ReflecBeatBase.CHART_TYPE_SPECIAL,
|
|
|
|
]
|
|
|
|
|
2021-09-07 19:57:31 +02:00
|
|
|
valid_rival_types: List[str] = [
|
2022-10-15 20:56:30 +02:00
|
|
|
"rival",
|
2019-12-08 22:43:49 +01:00
|
|
|
]
|
|
|
|
|
2021-09-07 04:48:33 +02:00
|
|
|
def __init__(self, data: Data, config: Config, cache: Cache) -> None:
|
2019-12-08 22:43:49 +01:00
|
|
|
super().__init__(data, config, cache)
|
|
|
|
|
2021-08-19 21:21:22 +02:00
|
|
|
def all_games(self) -> Iterator[Tuple[GameConstants, int, str]]:
|
2019-12-08 22:43:49 +01:00
|
|
|
yield from ReflecBeatFactory.all_games()
|
|
|
|
|
|
|
|
def format_score(self, userid: UserID, score: Score) -> Dict[str, Any]:
|
|
|
|
formatted_score = super().format_score(userid, score)
|
2022-10-15 20:56:30 +02:00
|
|
|
formatted_score["combo"] = score.data.get_int("combo", -1)
|
|
|
|
formatted_score["achievement_rate"] = score.data.get_int("achievement_rate", -1)
|
|
|
|
formatted_score["miss_count"] = score.data.get_int("miss_count", -1)
|
|
|
|
formatted_score["clear_type"] = {
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_NO_PLAY: "NO PLAY",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_FAILED: "FAILED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_CLEARED: "CLEARED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_HARD_CLEARED: "HARD CLEARED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_S_HARD_CLEARED: "S-HARD CLEARED",
|
|
|
|
}.get(score.data.get_int("clear_type"), "FAILED")
|
|
|
|
formatted_score["combo_type"] = {
|
|
|
|
ReflecBeatBase.COMBO_TYPE_NONE: "",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_ALMOST_COMBO: "ALMOST FULL COMBO",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_FULL_COMBO: "FULL COMBO",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_FULL_COMBO_ALL_JUST: "FULL COMBO + ALL JUST",
|
|
|
|
}.get(score.data.get_int("combo_type"), "")
|
|
|
|
formatted_score["medal"] = score.data.get_int(
|
|
|
|
"combo_type"
|
|
|
|
) * 1000 + score.data.get_int("clear_type")
|
2019-12-08 22:43:49 +01:00
|
|
|
return formatted_score
|
|
|
|
|
|
|
|
def format_attempt(self, userid: UserID, attempt: Attempt) -> Dict[str, Any]:
|
|
|
|
formatted_attempt = super().format_attempt(userid, attempt)
|
2022-10-15 20:56:30 +02:00
|
|
|
formatted_attempt["combo"] = attempt.data.get_int("combo", -1)
|
|
|
|
formatted_attempt["achievement_rate"] = attempt.data.get_int(
|
|
|
|
"achievement_rate", -1
|
|
|
|
)
|
|
|
|
formatted_attempt["miss_count"] = attempt.data.get_int("miss_count", -1)
|
|
|
|
formatted_attempt["clear_type"] = {
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_NO_PLAY: "NO PLAY",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_FAILED: "FAILED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_CLEARED: "CLEARED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_HARD_CLEARED: "HARD CLEARED",
|
|
|
|
ReflecBeatBase.CLEAR_TYPE_S_HARD_CLEARED: "S-HARD CLEARED",
|
|
|
|
}.get(attempt.data.get_int("clear_type"), "FAILED")
|
|
|
|
formatted_attempt["combo_type"] = {
|
|
|
|
ReflecBeatBase.COMBO_TYPE_NONE: "",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_ALMOST_COMBO: "ALMOST FULL COMBO",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_FULL_COMBO: "FULL COMBO",
|
|
|
|
ReflecBeatBase.COMBO_TYPE_FULL_COMBO_ALL_JUST: "FULL COMBO + ALL JUST",
|
|
|
|
}.get(attempt.data.get_int("combo_type"), "")
|
|
|
|
formatted_attempt["medal"] = attempt.data.get_int(
|
|
|
|
"combo_type"
|
|
|
|
) * 1000 + attempt.data.get_int("clear_type")
|
2019-12-08 22:43:49 +01:00
|
|
|
return formatted_attempt
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
def format_profile(
|
|
|
|
self, profile: Profile, playstats: ValidatedDict
|
|
|
|
) -> Dict[str, Any]:
|
2019-12-08 22:43:49 +01:00
|
|
|
formatted_profile = super().format_profile(profile, playstats)
|
2022-10-15 20:56:30 +02:00
|
|
|
formatted_profile["plays"] = playstats.get_int("total_plays")
|
2019-12-08 22:43:49 +01:00
|
|
|
return formatted_profile
|
|
|
|
|
|
|
|
def format_song(self, song: Song) -> Dict[str, Any]:
|
|
|
|
difficulties = [0, 0, 0, 0]
|
2022-10-15 20:56:30 +02:00
|
|
|
difficulties[song.chart] = song.data.get_int("difficulty", 16)
|
2019-12-08 22:43:49 +01:00
|
|
|
|
|
|
|
formatted_song = super().format_song(song)
|
2022-10-15 20:56:30 +02:00
|
|
|
formatted_song["difficulties"] = difficulties
|
|
|
|
formatted_song["category"] = song.data.get_int("folder", 1)
|
2019-12-08 22:43:49 +01:00
|
|
|
return formatted_song
|
|
|
|
|
|
|
|
def merge_song(self, existing: Dict[str, Any], new: Song) -> Dict[str, Any]:
|
|
|
|
new_song = super().merge_song(existing, new)
|
2022-10-15 20:56:30 +02:00
|
|
|
if existing["difficulties"][new.chart] == 0:
|
|
|
|
new_song["difficulties"][new.chart] = new.data.get_int("difficulty", 16)
|
|
|
|
if existing["category"] == 0:
|
|
|
|
new_song["category"] = new.data.get_int("folder", 1)
|
2019-12-08 22:43:49 +01:00
|
|
|
return new_song
|