refactor(util): pq_logic.dart 모듈 분할
- pq_random.dart: 랜덤/확률 함수 (61줄) - pq_string.dart: 문자열 유틸리티 (55줄) - pq_item.dart: 아이템/장비 생성 (327줄) - pq_monster.dart: 몬스터 생성 (283줄) - pq_quest.dart: 퀘스트/Act/시네마틱 (283줄) - pq_task.dart: 태스크/큐 (97줄) - pq_stat.dart: 스탯 관련 (64줄) - 원본은 re-export 허브로 유지 (역호환성)
This commit is contained in:
97
lib/src/core/util/pq_task.dart
Normal file
97
lib/src/core/util/pq_task.dart
Normal file
@@ -0,0 +1,97 @@
|
||||
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<QueueEntry>.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,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user