Music Shake 첫 박 시각 · 카운트다운 · 옛 일시 정지 판 정리

This commit is contained in:
Sn-Kinos
2026-10-06 12:23:47 +09:00
parent 4e8d989f29
commit 14fef64999
24 changed files with 300 additions and 34 deletions
@@ -850,12 +850,19 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
return;
}
if (!mounted) return;
// 운영값(첫 박 · 판 길이)이 바뀐 뒤의 옛 일시 정지는 박 위치가 맞지 않는다 — 버리고 새 판으로 시작한다.
// 목록 · 상세가 이미 시작하기로 보이는 경우(staleShake)도 같은 안내를 한 번 한다.
if (detail.card.staleShake || (resume != null && !resume.fitsShake(setup))) {
resume = null;
_toast(context.l10n.questShakeRestart);
}
final judge = ShakeJudge(
bpm: setup.bpm,
segments: setup.segments,
firstBeat: setup.firstBeat,
windows: setup.windows,
hits: resume?.hits ?? const [],
position: resume?.position ?? Duration.zero,
position: resume?.position ?? setup.startAt,
);
QuestSession snapshot(QuestStage state) => QuestSession(
state: state,
@@ -863,6 +870,7 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
total: setup.segments,
position: judge.position,
hits: judge.hits,
firstBeat: setup.firstBeat,
);
setState(() => _stage = QuestStage.inProgress);
// 진행 중 앱이 꺼져도 다음에 일시 정지(멈춘 자리)로 보이게 시작 시점을 남긴다.
@@ -900,6 +908,7 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
state: QuestStage.completed,
progress: setup.segments,
total: setup.segments,
firstBeat: setup.firstBeat,
judgement: run.judgement(),
),
);