- 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 허브로 유지 (역호환성)
98 lines
2.8 KiB
Dart
98 lines
2.8 KiB
Dart
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,
|
|
);
|
|
}
|