feat(story): 아스키나라 세계관 스토리 텍스트 적용
progress_service.dart: - 프롤로그: 코드의 신, 컴파일러 현자, 글리치 신 예언 - 버퍼 오버플로우로 마을 리셋, 널 왕국으로 여정 - 태스크: Data Market, Tech Shop, Debug Zone pq_logic.dart: - 시네마틱: Cache Zone, 디버깅 세션, 백도어 발견 - 퀘스트 동사: Patch, Locate, Transfer, Download, Stabilize - Loading → Compiling 변경
This commit is contained in:
@@ -37,48 +37,48 @@ class ProgressService {
|
|||||||
/// 새 게임 초기화 (원본 GoButtonClick, Main.pas:741-767)
|
/// 새 게임 초기화 (원본 GoButtonClick, Main.pas:741-767)
|
||||||
/// Prologue 태스크들을 큐에 추가하고 첫 태스크 시작
|
/// Prologue 태스크들을 큐에 추가하고 첫 태스크 시작
|
||||||
GameState initializeNewGame(GameState state) {
|
GameState initializeNewGame(GameState state) {
|
||||||
// 초기 큐 설정 (원본 753-757줄)
|
// 초기 큐 설정 - 아스키나라(ASCII-Nara) 세계관 프롤로그
|
||||||
final initialQueue = <QueueEntry>[
|
final initialQueue = <QueueEntry>[
|
||||||
const QueueEntry(
|
const QueueEntry(
|
||||||
kind: QueueKind.task,
|
kind: QueueKind.task,
|
||||||
durationMillis: 10 * 1000,
|
durationMillis: 10 * 1000,
|
||||||
caption: 'Experiencing an enigmatic and foreboding night vision',
|
caption: 'Receiving an ominous vision from the Code God',
|
||||||
taskType: TaskType.load,
|
taskType: TaskType.load,
|
||||||
),
|
),
|
||||||
const QueueEntry(
|
const QueueEntry(
|
||||||
kind: QueueKind.task,
|
kind: QueueKind.task,
|
||||||
durationMillis: 6 * 1000,
|
durationMillis: 6 * 1000,
|
||||||
caption:
|
caption:
|
||||||
"Much is revealed about that wise old bastard you'd "
|
'The old Compiler Sage reveals a prophecy: '
|
||||||
'underestimated',
|
'"The Glitch God has awakened"',
|
||||||
taskType: TaskType.load,
|
taskType: TaskType.load,
|
||||||
),
|
),
|
||||||
const QueueEntry(
|
const QueueEntry(
|
||||||
kind: QueueKind.task,
|
kind: QueueKind.task,
|
||||||
durationMillis: 6 * 1000,
|
durationMillis: 6 * 1000,
|
||||||
caption:
|
caption:
|
||||||
'A shocking series of events leaves you alone and bewildered, '
|
'A sudden Buffer Overflow resets your village, '
|
||||||
'but resolute',
|
'leaving you as the sole survivor',
|
||||||
taskType: TaskType.load,
|
taskType: TaskType.load,
|
||||||
),
|
),
|
||||||
const QueueEntry(
|
const QueueEntry(
|
||||||
kind: QueueKind.task,
|
kind: QueueKind.task,
|
||||||
durationMillis: 4 * 1000,
|
durationMillis: 4 * 1000,
|
||||||
caption:
|
caption:
|
||||||
'Drawing upon an unexpected reserve of determination, '
|
'With unexpected resolve, you embark on a perilous journey '
|
||||||
'you set out on a long and dangerous journey',
|
'to the Null Kingdom',
|
||||||
taskType: TaskType.load,
|
taskType: TaskType.load,
|
||||||
),
|
),
|
||||||
const QueueEntry(
|
const QueueEntry(
|
||||||
kind: QueueKind.plot,
|
kind: QueueKind.plot,
|
||||||
durationMillis: 2 * 1000,
|
durationMillis: 2 * 1000,
|
||||||
caption: 'Loading',
|
caption: 'Compiling',
|
||||||
taskType: TaskType.plot,
|
taskType: TaskType.plot,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
// 첫 번째 태스크 'Loading' 시작 (원본 752줄)
|
// 첫 번째 태스크 시작 (원본 752줄)
|
||||||
final taskResult = pq_logic.startTask(state.progress, 'Loading', 2 * 1000);
|
final taskResult = pq_logic.startTask(state.progress, 'Compiling', 2 * 1000);
|
||||||
|
|
||||||
// ExpBar 초기화 (원본 743-746줄)
|
// ExpBar 초기화 (원본 743-746줄)
|
||||||
final expBar = ProgressBarState(position: 0, max: pq_logic.levelUpTime(1));
|
final expBar = ProgressBarState(position: 0, max: pq_logic.levelUpTime(1));
|
||||||
@@ -89,7 +89,7 @@ class ProgressService {
|
|||||||
final progress = taskResult.progress.copyWith(
|
final progress = taskResult.progress.copyWith(
|
||||||
exp: expBar,
|
exp: expBar,
|
||||||
plot: plotBar,
|
plot: plotBar,
|
||||||
currentTask: const TaskInfo(caption: 'Loading...', type: TaskType.load),
|
currentTask: const TaskInfo(caption: 'Compiling...', type: TaskType.load),
|
||||||
plotStageCount: 1, // Prologue
|
plotStageCount: 1, // Prologue
|
||||||
questCount: 0,
|
questCount: 0,
|
||||||
plotHistory: const [HistoryEntry(caption: 'Prologue', isComplete: false)],
|
plotHistory: const [HistoryEntry(caption: 'Prologue', isComplete: false)],
|
||||||
@@ -295,7 +295,7 @@ class ProgressService {
|
|||||||
progress.encumbrance.max > 0) {
|
progress.encumbrance.max > 0) {
|
||||||
final taskResult = pq_logic.startTask(
|
final taskResult = pq_logic.startTask(
|
||||||
progress,
|
progress,
|
||||||
'Heading to market to sell loot',
|
'Heading to the Data Market to trade loot',
|
||||||
4 * 1000,
|
4 * 1000,
|
||||||
);
|
);
|
||||||
progress = taskResult.progress.copyWith(
|
progress = taskResult.progress.copyWith(
|
||||||
@@ -316,7 +316,7 @@ class ProgressService {
|
|||||||
if (gold > equipPrice) {
|
if (gold > equipPrice) {
|
||||||
final taskResult = pq_logic.startTask(
|
final taskResult = pq_logic.startTask(
|
||||||
progress,
|
progress,
|
||||||
'Negotiating purchase of better equipment',
|
'Upgrading hardware at the Tech Shop',
|
||||||
5 * 1000,
|
5 * 1000,
|
||||||
);
|
);
|
||||||
progress = taskResult.progress.copyWith(
|
progress = taskResult.progress.copyWith(
|
||||||
@@ -331,7 +331,7 @@ class ProgressService {
|
|||||||
// Gold가 부족하면 전장으로 이동 (원본 674-676줄)
|
// Gold가 부족하면 전장으로 이동 (원본 674-676줄)
|
||||||
final taskResult = pq_logic.startTask(
|
final taskResult = pq_logic.startTask(
|
||||||
progress,
|
progress,
|
||||||
'Heading to the killing fields',
|
'Entering the Debug Zone',
|
||||||
4 * 1000,
|
4 * 1000,
|
||||||
);
|
);
|
||||||
progress = taskResult.progress.copyWith(
|
progress = taskResult.progress.copyWith(
|
||||||
@@ -370,7 +370,7 @@ class ProgressService {
|
|||||||
|
|
||||||
final taskResult = pq_logic.startTask(
|
final taskResult = pq_logic.startTask(
|
||||||
progress,
|
progress,
|
||||||
'Executing ${monsterResult.displayName}',
|
'Debugging ${monsterResult.displayName}',
|
||||||
durationMillis,
|
durationMillis,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -498,7 +498,7 @@ QuestResult completeQuest(PqConfig config, DeterministicRandom rng, int level) {
|
|||||||
}
|
}
|
||||||
final name = best.split('|').first;
|
final name = best.split('|').first;
|
||||||
return QuestResult(
|
return QuestResult(
|
||||||
caption: 'Exterminate ${definite(name, 2)}',
|
caption: 'Patch ${definite(name, 2)}',
|
||||||
reward: reward,
|
reward: reward,
|
||||||
monsterName: best,
|
monsterName: best,
|
||||||
monsterLevel: bestLevel,
|
monsterLevel: bestLevel,
|
||||||
@@ -506,18 +506,18 @@ QuestResult completeQuest(PqConfig config, DeterministicRandom rng, int level) {
|
|||||||
);
|
);
|
||||||
case 1:
|
case 1:
|
||||||
final item = interestingItem(config, rng);
|
final item = interestingItem(config, rng);
|
||||||
return QuestResult(caption: 'Seek ${definite(item, 1)}', reward: reward);
|
return QuestResult(caption: 'Locate ${definite(item, 1)}', reward: reward);
|
||||||
case 2:
|
case 2:
|
||||||
final item = boringItem(config, rng);
|
final item = boringItem(config, rng);
|
||||||
return QuestResult(caption: 'Deliver this $item', reward: reward);
|
return QuestResult(caption: 'Transfer this $item', reward: reward);
|
||||||
case 3:
|
case 3:
|
||||||
final item = boringItem(config, rng);
|
final item = boringItem(config, rng);
|
||||||
return QuestResult(
|
return QuestResult(
|
||||||
caption: 'Fetch me ${indefinite(item, 1)}',
|
caption: 'Download ${indefinite(item, 1)}',
|
||||||
reward: reward,
|
reward: reward,
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
// Placate: 2번 시도하여 레벨에 가장 가까운 몬스터 선택
|
// Stabilize: 2번 시도하여 레벨에 가장 가까운 몬스터 선택
|
||||||
// 원본 Main.pas:971-984 (fQuest.Caption := '' 처리됨)
|
// 원본 Main.pas:971-984 (fQuest.Caption := '' 처리됨)
|
||||||
var best = '';
|
var best = '';
|
||||||
var bestLevel = 0;
|
var bestLevel = 0;
|
||||||
@@ -530,9 +530,9 @@ QuestResult completeQuest(PqConfig config, DeterministicRandom rng, int level) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final name = best.split('|').first;
|
final name = best.split('|').first;
|
||||||
// Placate는 fQuest.Caption := '' 로 비움 → monsterIndex 미저장
|
// Stabilize는 fQuest.Caption := '' 로 비움 → monsterIndex 미저장
|
||||||
return QuestResult(
|
return QuestResult(
|
||||||
caption: 'Placate ${definite(name, 2)}',
|
caption: 'Stabilize ${definite(name, 2)}',
|
||||||
reward: reward,
|
reward: reward,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -803,26 +803,26 @@ List<QueueEntry> interplotCinematic(
|
|||||||
|
|
||||||
switch (rng.nextInt(3)) {
|
switch (rng.nextInt(3)) {
|
||||||
case 0:
|
case 0:
|
||||||
// 시나리오 1: 우호적 오아시스
|
// 시나리오 1: 안전한 캐시 영역 도착
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
1,
|
1,
|
||||||
'Exhausted, you arrive at a friendly oasis in a hostile land',
|
'Exhausted, you reach a safe Cache Zone in the corrupted network',
|
||||||
);
|
);
|
||||||
q(QueueKind.task, 2, 'You greet old friends and meet new allies');
|
q(QueueKind.task, 2, 'You reconnect with old allies and fork new ones');
|
||||||
q(QueueKind.task, 2, 'You are privy to a council of powerful do-gooders');
|
q(QueueKind.task, 2, 'You attend a council of the Debugger Knights');
|
||||||
q(QueueKind.task, 1, 'There is much to be done. You are chosen!');
|
q(QueueKind.task, 1, 'Many bugs await. You are chosen to patch them!');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
// 시나리오 2: 강력한 적과의 전투
|
// 시나리오 2: 강력한 버그와의 전투
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
1,
|
1,
|
||||||
'Your quarry is in sight, but a mighty enemy bars your path!',
|
'Your target is in sight, but a critical bug blocks your path!',
|
||||||
);
|
);
|
||||||
final nemesis = namedMonster(config, rng, level + 3);
|
final nemesis = namedMonster(config, rng, level + 3);
|
||||||
q(QueueKind.task, 4, 'A desperate struggle commences with $nemesis');
|
q(QueueKind.task, 4, 'A desperate debugging session begins with $nemesis');
|
||||||
|
|
||||||
var s = rng.nextInt(3);
|
var s = rng.nextInt(3);
|
||||||
final combatRounds = rng.nextInt(1 + plotCount);
|
final combatRounds = rng.nextInt(1 + plotCount);
|
||||||
@@ -830,16 +830,16 @@ List<QueueEntry> interplotCinematic(
|
|||||||
s += 1 + rng.nextInt(2);
|
s += 1 + rng.nextInt(2);
|
||||||
switch (s % 3) {
|
switch (s % 3) {
|
||||||
case 0:
|
case 0:
|
||||||
q(QueueKind.task, 2, 'Locked in grim combat with $nemesis');
|
q(QueueKind.task, 2, 'Locked in intense debugging with $nemesis');
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
q(QueueKind.task, 2, '$nemesis seems to have the upper hand');
|
q(QueueKind.task, 2, '$nemesis corrupts your stack trace');
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
2,
|
2,
|
||||||
'You seem to gain the advantage over $nemesis',
|
'Your patch seems to be working against $nemesis',
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -848,45 +848,45 @@ List<QueueEntry> interplotCinematic(
|
|||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
3,
|
3,
|
||||||
'Victory! $nemesis is slain! Exhausted, you lose conciousness',
|
'Victory! $nemesis is patched! System reboots for recovery',
|
||||||
);
|
);
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
2,
|
2,
|
||||||
'You awake in a friendly place, but the road awaits',
|
'You wake up in a Safe Mode, but the kernel awaits',
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
// 시나리오 3: 배신 발견
|
// 시나리오 3: 내부자 위협 발견
|
||||||
final guy = impressiveGuy(config, rng);
|
final guy = impressiveGuy(config, rng);
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
2,
|
2,
|
||||||
"Oh sweet relief! You've reached the kind protection of $guy",
|
'What relief! You reach the secure server of $guy',
|
||||||
);
|
);
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
3,
|
3,
|
||||||
'There is rejoicing, and an unnerving encouter with $guy in private',
|
'There is celebration, and a suspicious private handshake with $guy',
|
||||||
);
|
);
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
2,
|
2,
|
||||||
'You forget your ${boringItem(config, rng)} and go back to get it',
|
'You forget your ${boringItem(config, rng)} and go back to retrieve it',
|
||||||
);
|
);
|
||||||
q(QueueKind.task, 2, "What's this!? You overhear something shocking!");
|
q(QueueKind.task, 2, 'What is this!? You intercept a corrupted packet!');
|
||||||
q(QueueKind.task, 2, 'Could $guy be a dirty double-dealer?');
|
q(QueueKind.task, 2, 'Could $guy be a backdoor for the Glitch God?');
|
||||||
q(
|
q(
|
||||||
QueueKind.task,
|
QueueKind.task,
|
||||||
3,
|
3,
|
||||||
'Who can possibly be trusted with this news!? -- Oh yes, of course',
|
'Who can be trusted with this intel!? -- The Binary Temple, of course',
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 마지막에 plot|2|Loading 추가
|
// 마지막에 plot 추가
|
||||||
q(QueueKind.plot, 2, 'Loading');
|
q(QueueKind.plot, 2, 'Compiling');
|
||||||
|
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user