# vim: set fileencoding=utf-8 from typing import Tuple from typing_extensions import Final from bemani.backend.iidx.base import IIDXBase from bemani.common import ValidatedDict from bemani.data import UserID class IIDXCourse(IIDXBase): COURSE_TYPE_SECRET: Final[str] = "secret_course" COURSE_TYPE_INTERNET_RANKING: Final[str] = "ir_course" COURSE_TYPE_CLASSIC: Final[str] = "classic_course" def id_and_chart_from_courseid(self, courseid: int) -> Tuple[int, int]: return (int(courseid / 6), courseid % 6) def update_course( self, userid: UserID, coursetype: str, courseid: int, chart: int, clear_status: int, pgreats: int, greats: int, ) -> None: # Range check course type if coursetype not in [ self.COURSE_TYPE_SECRET, self.COURSE_TYPE_INTERNET_RANKING, self.COURSE_TYPE_CLASSIC, ]: raise Exception(f"Invalid course type value {coursetype}") # Range check medals if clear_status not in [ self.CLEAR_STATUS_NO_PLAY, self.CLEAR_STATUS_FAILED, self.CLEAR_STATUS_ASSIST_CLEAR, self.CLEAR_STATUS_EASY_CLEAR, self.CLEAR_STATUS_CLEAR, self.CLEAR_STATUS_HARD_CLEAR, self.CLEAR_STATUS_EX_HARD_CLEAR, self.CLEAR_STATUS_FULL_COMBO, ]: raise Exception(f"Invalid clear status value {clear_status}") # Update achievement to track course statistics course_score = self.data.local.user.get_achievement( self.game, self.version, userid, courseid * 6 + chart, coursetype, ) if course_score is None: course_score = ValidatedDict() course_score.replace_int( "clear_status", max(clear_status, course_score.get_int("clear_status")) ) old_ex_score = (course_score.get_int("pgnum") * 2) + course_score.get_int( "gnum" ) if old_ex_score < ((pgreats * 2) + greats): course_score.replace_int("pgnum", pgreats) course_score.replace_int("gnum", greats) self.data.local.user.put_achievement( self.game, self.version, userid, courseid * 6 + chart, coursetype, course_score, )