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:
JiWoong Sul
2026-01-15 17:05:46 +09:00
parent 133d516b94
commit 23f15f41d3
8 changed files with 1188 additions and 1102 deletions

View 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,
);
}