diff --git a/src/arcaea_offline/database.py b/src/arcaea_offline/database.py index aeb24c1..282f98f 100644 --- a/src/arcaea_offline/database.py +++ b/src/arcaea_offline/database.py @@ -73,7 +73,7 @@ class Database(metaclass=Singleton): stmt = select(Property.value).where(Property.key == "version") result = session.execute(stmt).fetchone() if not checkfirst or not result: - session.add(Property(key="version", value="3")) + session.add(Property(key="version", value="4")) session.commit() def check_init(self) -> bool: @@ -191,7 +191,7 @@ class Database(metaclass=Singleton): stmt = ( select(func.count()) .select_from(ChartInfo) - .where((ChartInfo.constant != None) & (ChartInfo.note != None)) + .where((ChartInfo.constant != None) & (ChartInfo.notes != None)) ) with self.sessionmaker() as session: result = session.scalar(stmt) diff --git a/src/arcaea_offline/external/arcaea/st3.py b/src/arcaea_offline/external/arcaea/st3.py index 5dc7e28..b7ff3d1 100644 --- a/src/arcaea_offline/external/arcaea/st3.py +++ b/src/arcaea_offline/external/arcaea/st3.py @@ -12,8 +12,6 @@ logger = logging.getLogger(__name__) class St3ScoreParser(ArcaeaParser): - CLEAR_TYPES_MAP = {0: -1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1} - def __init__(self, filepath): super().__init__(filepath) @@ -22,14 +20,22 @@ class St3ScoreParser(ArcaeaParser): with sqlite3.connect(self.filepath) as st3_conn: cursor = st3_conn.cursor() db_scores = cursor.execute( - "SELECT songId, songDifficulty, score, perfectCount, nearCount, missCount, date FROM scores" + "SELECT songId, songDifficulty, score, perfectCount, nearCount, missCount, date, modifier FROM scores" ).fetchall() - for song_id, rating_class, score, pure, far, lost, date in db_scores: - db_clear_type = cursor.execute( + for ( + song_id, + rating_class, + score, + pure, + far, + lost, + date, + modifier, + ) in db_scores: + clear_type = cursor.execute( "SELECT clearType FROM cleartypes WHERE songId = ? AND songDifficulty = ?", (song_id, rating_class), ).fetchone()[0] - r10_clear_type = self.CLEAR_TYPES_MAP[db_clear_type] date_str = str(date) date = None if len(date_str) < 7 else int(date_str.ljust(10, "0")) @@ -43,7 +49,9 @@ class St3ScoreParser(ArcaeaParser): far=far, lost=lost, date=date, - r10_clear_type=r10_clear_type, + modifier=modifier, + clear_type=clear_type, + comment="Imported from st3", ) ) diff --git a/src/arcaea_offline/external/arcsong/arcsong_db.py b/src/arcaea_offline/external/arcsong/arcsong_db.py index 1d33df9..0f1427d 100644 --- a/src/arcaea_offline/external/arcsong/arcsong_db.py +++ b/src/arcaea_offline/external/arcsong/arcsong_db.py @@ -22,7 +22,7 @@ class ArcsongDbParser: song_id=result[0], rating_class=result[1], constant=result[2], - note=result[3] or None, + notes=result[3] or None, ) results.append(chart) diff --git a/src/arcaea_offline/external/arcsong/arcsong_json.py b/src/arcaea_offline/external/arcsong/arcsong_json.py index 61d941d..4f2f389 100644 --- a/src/arcaea_offline/external/arcsong/arcsong_json.py +++ b/src/arcaea_offline/external/arcsong/arcsong_json.py @@ -108,7 +108,7 @@ class ArcSongJsonBuilder: "version": difficulty.version or song.version or "", "difficulty": difficulty.rating * 2 + int(difficulty.rating_plus), "rating": chart_info.constant or 0 if chart_info else 0, - "note": chart_info.note or 0 if chart_info else 0, + "note": chart_info.notes or 0 if chart_info else 0, "chart_designer": difficulty.chart_designer or "", "jacket_designer": difficulty.jacket_desginer or "", "jacket_override": difficulty.jacket_override, diff --git a/src/arcaea_offline/models/scores.py b/src/arcaea_offline/models/scores.py index 28f34b4..249f8f0 100644 --- a/src/arcaea_offline/models/scores.py +++ b/src/arcaea_offline/models/scores.py @@ -33,8 +33,11 @@ class Score(ScoresBase): lost: Mapped[Optional[int]] date: Mapped[Optional[int]] max_recall: Mapped[Optional[int]] - r10_clear_type: Mapped[Optional[int]] = mapped_column( - comment="0: LOST, 1: COMPLETE, 2: HARD_LOST" + modifier: Mapped[Optional[int]] = mapped_column( + comment="0: NORMAL, 1: EASY, 2: HARD" + ) + clear_type: Mapped[Optional[int]] = mapped_column( + comment="0: TRACK LOST, 1: NORMAL CLEAR, 2: FULL RECALL, 3: PURE MEMORY, 4: EASY CLEAR, 5: HARD CLEAR" ) comment: Mapped[Optional[str]] = mapped_column(TEXT()) @@ -61,7 +64,8 @@ class ScoreCalculated(ScoresViewBase): lost: Mapped[Optional[int]] date: Mapped[Optional[int]] max_recall: Mapped[Optional[int]] - r10_clear_type: Mapped[Optional[int]] + modifier: Mapped[Optional[int]] + clear_type: Mapped[Optional[int]] potential: Mapped[float] comment: Mapped[Optional[str]] @@ -76,15 +80,16 @@ class ScoreCalculated(ScoresViewBase): ( Score.score - func.floor( - (Score.pure * 10000000.0 / ChartInfo.note) - + (Score.far * 0.5 * 10000000.0 / ChartInfo.note) + (Score.pure * 10000000.0 / ChartInfo.notes) + + (Score.far * 0.5 * 10000000.0 / ChartInfo.notes) ) ).label("shiny_pure"), Score.far, Score.lost, Score.date, Score.max_recall, - Score.r10_clear_type, + Score.modifier, + Score.clear_type, case( (Score.score >= 10000000, ChartInfo.constant / 10.0 + 2), ( @@ -127,7 +132,8 @@ class ScoreBest(ScoresViewBase): lost: Mapped[Optional[int]] date: Mapped[Optional[int]] max_recall: Mapped[Optional[int]] - r10_clear_type: Mapped[Optional[int]] + modifier: Mapped[Optional[int]] + clear_type: Mapped[Optional[int]] potential: Mapped[float] comment: Mapped[Optional[str]] diff --git a/src/arcaea_offline/models/songs.py b/src/arcaea_offline/models/songs.py index a5356fe..65c5ba8 100644 --- a/src/arcaea_offline/models/songs.py +++ b/src/arcaea_offline/models/songs.py @@ -156,7 +156,7 @@ class ChartInfo(SongsBase): constant: Mapped[int] = mapped_column( comment="real_constant * 10. For example, Crimson Throne [FTR] is 10.4, then store 104 here." ) - note: Mapped[Optional[int]] + notes: Mapped[Optional[int]] class SongsViewBase(DeclarativeBase, ReprHelper): @@ -193,7 +193,7 @@ class Chart(SongsViewBase): jacket_override: Mapped[bool] jacket_night: Mapped[Optional[str]] constant: Mapped[int] - note: Mapped[Optional[int]] + notes: Mapped[Optional[int]] __table__ = create_view( name=__tablename__, @@ -225,7 +225,7 @@ class Chart(SongsViewBase): Difficulty.jacket_override, Difficulty.jacket_night, ChartInfo.constant, - ChartInfo.note, + ChartInfo.notes, ) .select_from(Difficulty) .join(