78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
# 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,
|
|
)
|