import 'dart:collection'; import 'package:asciineverdie/src/core/model/game_state.dart'; /// 태스크/큐/진행 관련 함수들 /// 원본 Main.pas의 태스크 처리 로직을 포팅 /// 레벨업에 필요한 시간 (초) int levelUpTimeSeconds(int level) { // Act 진행과 레벨업 동기화 (10시간 완주 목표) if (level <= 20) { // Act I: 레벨 1-20, 2시간 (7200초) → 평균 360초/레벨 return 300 + (level * 6); } else if (level <= 40) { // Act II: 레벨 21-40, 3시간 (10800초) → 평균 540초/레벨 return 400 + ((level - 20) * 10); } else if (level <= 60) { // Act III: 레벨 41-60, 3시간 (10800초) → 평균 540초/레벨 return 400 + ((level - 40) * 10); } else if (level <= 80) { // Act IV: 레벨 61-80, 1.5시간 (5400초) → 평균 270초/레벨 return 200 + ((level - 60) * 5); } else { // Act V: 레벨 81-100, 30분 (1800초) → 평균 90초/레벨 return 60 + ((level - 80) * 3); } } /// levelUpTimeSeconds의 별칭 (호환성 유지) int levelUpTime(int level) => levelUpTimeSeconds(level); /// 태스크 결과 class TaskResult { const TaskResult({ required this.caption, required this.durationMillis, required this.progress, }); final String caption; final int durationMillis; final ProgressState progress; } /// 태스크 시작: 태스크 바 리셋 및 캡션 설정 TaskResult startTask( ProgressState progress, String caption, int durationMillis, ) { final updated = progress.copyWith( task: ProgressBarState(position: 0, max: durationMillis), ); return TaskResult( caption: '$caption...', durationMillis: durationMillis, progress: updated, ); } /// 큐 처리 결과 class DequeueResult { const DequeueResult({ required this.progress, required this.queue, required this.caption, required this.taskType, required this.kind, }); final ProgressState progress; final QueueState queue; final String caption; final TaskType taskType; final QueueKind kind; } /// 큐에서 다음 태스크 꺼내기 /// 현재 태스크가 완료되면 큐에서 다음 태스크를 가져옴 DequeueResult? dequeue(ProgressState progress, QueueState queue) { // 태스크 바가 완료되지 않으면 null 반환 if (progress.task.position < progress.task.max) return null; if (queue.entries.isEmpty) return null; final entries = Queue.from(queue.entries); if (entries.isEmpty) return null; final next = entries.removeFirst(); final taskResult = startTask(progress, next.caption, next.durationMillis); return DequeueResult( progress: taskResult.progress, queue: QueueState(entries: entries.toList()), caption: taskResult.caption, taskType: next.taskType, kind: next.kind, ); }